browserscale-ts 1.7.0 → 1.8.0

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.
@@ -3799,20 +3799,20 @@ function serviceDesc(file, path, ...paths) {
3799
3799
  }
3800
3800
 
3801
3801
  // src/gen/wrc_pb.ts
3802
- var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIrsBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Ei4KBWVycm9yGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLldhaXRFcnJvckgAiAEBQggKBl9lcnJvciLsAQoTV2FpdENvbmRpdGlvblN0YXR1cxINCgVpbmRleBgBIAEoBRINCgVzdGF0ZRgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEAoIZnJhbWVfaWQYBCABKAkSEgoKaXNfdmlzaWJsZRgFIAEoCBIqCgZib3VuZHMYBiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdEgAiAEBEjQKCG9jY2x1ZGVyGAcgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gBiAEBQgkKB19ib3VuZHNCCwoJX29jY2x1ZGVyImQKCVdhaXRFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSOAoKY29uZGl0aW9ucxgDIAMoCzIkLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uU3RhdHVzIqYBCg1FbGVtZW50UmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoASLSAwoMT2NjbHVkZXJJbmZvEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCghmcmFtZV9pZBgCIAEoCRIQCgh0YWdfbmFtZRgDIAEoCRIPCgJpZBgEIAEoCUgAiAEBEhcKCmNsYXNzX25hbWUYBSABKAlIAYgBARIRCgR0ZXh0GAYgASgJSAKIAQESJQoGYm91bmRzGAcgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSGwoOcG9pbnRlcl9ldmVudHMYCCABKAlIA4gBARIXCgp2aXNpYmlsaXR5GAkgASgJSASIAQESFAoHb3BhY2l0eRgKIAEoAUgFiAEBEhQKB3pfaW5kZXgYCyABKAlIBogBARIlChhoaXR0YWJsZV93aGlsZV9pbnZpc2libGUYDCABKAhIB4gBARIVCghwb3NpdGlvbhgNIAEoCUgIiAEBQgUKA19pZEINCgtfY2xhc3NfbmFtZUIHCgVfdGV4dEIRCg9fcG9pbnRlcl9ldmVudHNCDQoLX3Zpc2liaWxpdHlCCgoIX29wYWNpdHlCCgoIX3pfaW5kZXhCGwoZX2hpdHRhYmxlX3doaWxlX2ludmlzaWJsZUILCglfcG9zaXRpb24ioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCIqChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkiKQoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIkkKFUxpc3RSZWFjdGlvbnNSZXNwb25zZRIwCglyZWFjdGlvbnMYASADKAsyHS5icm93c2Vyc2NhbGUudjEuUmVhY3Rpb25JbmZvIukBCgpFbGVtZW50UmVmEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCgh0YWdfbmFtZRgCIAEoCRIPCgJpZBgDIAEoCUgAiAEBEhEKBG5hbWUYBCABKAlIAYgBARIXCgpjbGFzc19uYW1lGAUgASgJSAKIAQESFwoKaW5wdXRfdHlwZRgGIAEoCUgDiAEBEhEKBHRleHQYByABKAlIBIgBARIQCghlZGl0YWJsZRgIIAEoCEIFCgNfaWRCBwoFX25hbWVCDQoLX2NsYXNzX25hbWVCDQoLX2lucHV0X3R5cGVCBwoFX3RleHQi7gIKCUZpbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSNQoLY2xpY2tfZXJyb3IYAyABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBEiQKF2ZvY3VzZWRfYmFja2VuZF9ub2RlX2lkGAQgASgFSAGIAQESOQoPZm9jdXNlZF9lbGVtZW50GAUgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkVsZW1lbnRSZWZIAogBARIcCg90YXJnZXRfZWRpdGFibGUYBiABKAhIA4gBARIgChN0YXJnZXRfdmFsdWVfbGVuZ3RoGAcgASgFSASIAQFCDgoMX2NsaWNrX2Vycm9yQhoKGF9mb2N1c2VkX2JhY2tlbmRfbm9kZV9pZEISChBfZm9jdXNlZF9lbGVtZW50QhIKEF90YXJnZXRfZWRpdGFibGVCFgoUX3RhcmdldF92YWx1ZV9sZW5ndGgiogEKCkZpbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5GaWxsRXJyb3JIAIgBAUIICgZfZXJyb3IiwgEKCkRyYWdSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDwoHc3RhcnRfeBgEIAEoARIPCgdzdGFydF95GAUgASgBEg0KBWVuZF94GAYgASgBEg0KBWVuZF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLkRyYWdFcnJvckgAiAEBQggKBl9lcnJvciJxCglEcmFnRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBAUIOCgxfY2xpY2tfZXJyb3IirgEKElNlbGVjdE9wdGlvblJlc3VsdBIWCg5zZWxlY3RlZF9pbmRleBgBIAEoBRIWCg5zZWxlY3RlZF92YWx1ZRgCIAEoCRIVCg1zZWxlY3RlZF90ZXh0GAMgASgJEg8KB3N1Y2Nlc3MYBCABKAgSNgoFZXJyb3IYBSABKAsyIi5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uRXJyb3JIAIgBAUIICgZfZXJyb3IiMgoRU2VsZWN0T3B0aW9uRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIsEBCgxTY3JvbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIwCgVlcnJvchgIIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxFcnJvckgAiAEBQggKBl9lcnJvciIsCgtTY3JvbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAki3QEKCk1vdmVSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLk1vdmVFcnJvckgAiAEBQggKBl9lcnJvciIqCglNb3ZlRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIuYBCg9TZXRQcm94eVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKCnByb3h5X2hvc3QYAyABKAlIAIgBARIXCgpwcm94eV9wb3J0GAQgASgFSAGIAQESGwoOcHJveHlfdXNlcm5hbWUYBSABKAlIAogBARIbCg5wcm94eV9wYXNzd29yZBgGIAEoCUgDiAEBQg0KC19wcm94eV9ob3N0Qg0KC19wcm94eV9wb3J0QhEKD19wcm94eV91c2VybmFtZUIRCg9fcHJveHlfcGFzc3dvcmQiNgoPR2V0UGFnZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSI8ChBHZXRQYWdlc1Jlc3BvbnNlEigKBXBhZ2VzGAEgAygLMhkuYnJvd3NlcnNjYWxlLnYxLlBhZ2VJbmZvIpoBCg9OYXZpZ2F0ZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDdXJsGAQgASgJEhUKCHJlZmVycmVyGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9yZWZlcnJlckIKCghfdGltZW91dCIxChBOYXZpZ2F0ZVJlc3BvbnNlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3VybBgCIAEoCSK2AQoPTG9hZEhUTUxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA3VybBgEIAEoCRIMCgRodG1sGAUgASgJEigKB2hlYWRlcnMYBiADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEhgKC3N0YXR1c19jb2RlGAcgASgFSACIAQFCDgoMX3N0YXR1c19jb2RlIn8KD0V2YWx1YXRlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRISCgpleHByZXNzaW9uGAQgASgJEhUKCGZyYW1lX2lkGAUgASgJSACIAQFCCwoJX2ZyYW1lX2lkInYKEEV2YWx1YXRlUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgCIAEoBRISCgppc192aXNpYmxlGAMgASgIEiUKBmJvdW5kcxgEIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0ImMKClJ1blJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCRIUCgdwYWdlX2lkGAQgASgJSACIAQFCCgoIX3BhZ2VfaWQiLgoLUnVuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkiwgEKEFdhaXRGb3JBbnlQYXJhbXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSMgoKY29uZGl0aW9ucxgEIAMoCzIeLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uEhUKCGZyYW1lX2lkGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9mcmFtZV9pZEIKCghfdGltZW91dCL1AgoTU2VsZWN0T3B0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhIKBWluZGV4GAggASgFSASIAQESEgoFdmFsdWUYCSABKAlIBYgBARIRCgR0ZXh0GAogASgJSAaIAQESGAoLZmlyZV9ldmVudHMYCyABKAhIB4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCAoGX2luZGV4QggKBl92YWx1ZUIHCgVfdGV4dEIOCgxfZmlyZV9ldmVudHMi7wEKD1Njcm9sbFRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZCKZAgoNTW92ZVRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEg4KAXgYCCABKAFIBIgBARIOCgF5GAkgASgBSAWIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgQKAl94QgQKAl95IoIDCgxDbGlja1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZidXR0b24YCCABKAlIBIgBARIYCgtjbGlja19jb3VudBgJIAEoBUgFiAEBEg4KAXgYCiABKAFIBogBARIOCgF5GAsgASgBSAeIAQESEwoGYWN0aW9uGAwgASgJSAiIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgQKAl94QgQKAl95QgkKB19hY3Rpb24igwMKC0RyYWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESFQoIb2Zmc2V0X3gYCCABKAFIBIgBARIVCghvZmZzZXRfeRgJIAEoAUgFiAEBEhcKCmFic29sdXRlX3gYCiABKAFIBogBARIXCgphYnNvbHV0ZV95GAsgASgBSAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgsKCV9vZmZzZXRfeEILCglfb2Zmc2V0X3lCDQoLX2Fic29sdXRlX3hCDQoLX2Fic29sdXRlX3ki7wIKC0ZpbGxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESDAoEdGV4dBgIIAEoCRIYCgtjbGVhcl9maXJzdBgJIAEoCEgEiAEBEhQKB3RpbWVvdXQYCiABKAFIBYgBARIYCgtzdGVhZHlfdGltZRgLIAEoAUgGiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIOCgxfY2xlYXJfZmlyc3RCCgoIX3RpbWVvdXRCDgoMX3N0ZWFkeV90aW1lIkwKE1NldEJsb2NrTGlzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJImEKFVNldFN0YXRpY1BhdGhzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEQoJYmxvYl9uYW1lGAQgASgJIogBChhXYWl0Rm9yQW55UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCJgChlXYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEg0KBWluZGV4GAEgASgFEjQKB3JlcXVlc3QYAiABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IokBChlXYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCRITCgthYm9ydF9mbGFncxgEIAMoBRIUCgd0aW1lb3V0GAUgASgBSACIAQFCCgoIX3RpbWVvdXQiYwoaV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USDQoFaW5kZXgYASABKAUSNgoIcmVzcG9uc2UYAiABKAsyJC5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXNwb25zZSLKAQoUTW9kaWZ5UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKC3VybF9wYXR0ZXJuGAMgASgJEjoKDW1vZGlmaWNhdGlvbnMYBCADKAsyIy5icm93c2Vyc2NhbGUudjEuSGVhZGVyTW9kaWZpY2F0aW9uEhEKBGJvZHkYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCBwoFX2JvZHlCCgoIX3RpbWVvdXQiTQoVTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEjQKB3JlcXVlc3QYASABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IoYBChpTdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSDgoGYm9kaWVzGAQgASgJEhUKDWJvZHlfcGF0dGVybnMYBSADKAlKBAgGEAdKBAgHEAgiQAoZU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiLQoaU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoCCJECh1TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiWwoUTmV0d29ya0V4Y2hhbmdlRXZlbnQSMgoIZXhjaGFuZ2UYASABKAsyIC5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlEg8KB2Ryb3BwZWQYAiABKAQitAUKD05ldHdvcmtFeGNoYW5nZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGNoYWluX2lkGAIgASgJEhYKDnJlZGlyZWN0X2luZGV4GAMgASgFEhAKCGZyYW1lX2lkGAQgASgJEhAKCGlzX29vcGlmGAUgASgIEhUKDXJlc291cmNlX3R5cGUYBiABKAkSDgoGbWV0aG9kGAcgASgJEgsKA3VybBgIIAEoCRIVCg1pbml0aWF0b3JfdXJsGAkgASgJEjAKD3JlcXVlc3RfaGVhZGVycxgKIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIAoYcmVxdWVzdF9oZWFkZXJzX2FyZV93aXJlGAsgASgIEhQKDHJlcXVlc3RfYm9keRgMIAEoDBIeChZyZXF1ZXN0X2JvZHlfdHJ1bmNhdGVkGA0gASgIEhQKDGhhc19yZXNwb25zZRgOIAEoCBITCgtzdGF0dXNfY29kZRgPIAEoBRITCgtzdGF0dXNfdGV4dBgQIAEoCRIRCgltaW1lX3R5cGUYESABKAkSEAoIcHJvdG9jb2wYEiABKAkSFgoOcmVtb3RlX2FkZHJlc3MYEyABKAkSEwoLc2VydmVkX2Zyb20YFCABKAkSMQoQcmVzcG9uc2VfaGVhZGVycxgVIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIQoZcmVzcG9uc2VfaGVhZGVyc19hcmVfd2lyZRgWIAEoCBIVCg1yZXNwb25zZV9ib2R5GBcgASgMEh8KF3Jlc3BvbnNlX2JvZHlfdHJ1bmNhdGVkGBggASgIEh4KFnJlc3BvbnNlX2JvZHlfY2FwdHVyZWQYGSABKAgSGwoTZW5jb2RlZF9kYXRhX2xlbmd0aBgaIAEoAxINCgVlcnJvchgbIAEoCSI4ChFHZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiQwoSR2V0Q29va2llc1Jlc3BvbnNlEi0KB2Nvb2tpZXMYASADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iZwoRU2V0Q29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEi0KB2Nvb2tpZXMYAyADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iOgoTQ2xlYXJDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiKQoLU3RvcmFnZUl0ZW0SCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlEKElN0b3JhZ2VPcmlnaW5FbnRyeRIOCgZvcmlnaW4YASABKAkSKwoFaXRlbXMYAiADKAsyHC5icm93c2Vyc2NhbGUudjEuU3RvcmFnZUl0ZW0iWAoRR2V0U3RvcmFnZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKBm9yaWdpbhgDIAEoCUgAiAEBQgkKB19vcmlnaW4iSgoSR2V0U3RvcmFnZVJlc3BvbnNlEjQKB3N0b3JhZ2UYASADKAsyIy5icm93c2Vyc2NhbGUudjEuU3RvcmFnZU9yaWdpbkVudHJ5IpgBChFTZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSNAoHc3RvcmFnZRgDIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSGAoLY2xlYXJfZmlyc3QYBCABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiWgoTQ2xlYXJTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiIsCgtEYnNjU2Vzc2lvbhIMCgRzaXRlGAEgASgJEg8KB3Nlc3Npb24YAiABKAki2AIKC0F1dGhTZXNzaW9uEhQKB2dhaWFfaWQYASABKAlIAIgBARISCgVlbWFpbBgCIAEoCUgBiAEBEhoKDXJlZnJlc2hfdG9rZW4YAyABKAlIAogBARIgChN3cmFwcGVkX2JpbmRpbmdfa2V5GAQgASgJSAOIAQESJAoXc2lnbmluX3Njb3BlZF9kZXZpY2VfaWQYBSABKAlIBIgBARIZCgxzeW5jX2NvbnNlbnQYBiABKAhIBYgBARIzCg1kYnNjX3Nlc3Npb25zGAcgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkRic2NTZXNzaW9uQgoKCF9nYWlhX2lkQggKBl9lbWFpbEIQCg5fcmVmcmVzaF90b2tlbkIWChRfd3JhcHBlZF9iaW5kaW5nX2tleUIaChhfc2lnbmluX3Njb3BlZF9kZXZpY2VfaWRCDwoNX3N5bmNfY29uc2VudCI8ChVHZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIlgKFkdldEF1dGhTZXNzaW9uUmVzcG9uc2USMgoHc2Vzc2lvbhgBIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbkgAiAEBQgoKCF9zZXNzaW9uImsKFVNldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHc2Vzc2lvbhgDIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbiKHAQoNR2V0RE9NUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCIdCg5HZXRET01SZXNwb25zZRILCgNkb20YASABKAkimQQKFUdldE9ic2VydmF0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIjChZtYXhfZWxlbWVudHNfcGVyX2ZyYW1lGAQgASgFSACIAQESHAoPbWF4X3RleHRfbGVuZ3RoGAUgASgFSAGIAQESEwoGZm9ybWF0GAYgASgJSAKIAQESHQoQbWF4X3RvdGFsX3Rva2VucxgHIAEoBUgDiAEBEhsKDmluY2x1ZGVfYm91bmRzGAggASgISASIAQESGgoNdmlld3BvcnRfb25seRgJIAEoCEgFiAEBEhwKD2JhY2tlbmRfbm9kZV9pZBgKIAEoBUgGiAEBEhUKCHNlbGVjdG9yGAsgASgJSAeIAQESGgoNanNfZXhwcmVzc2lvbhgMIAEoCUgIiAEBEhUKCGZyYW1lX2lkGA0gASgJSAmIAQFCGQoXX21heF9lbGVtZW50c19wZXJfZnJhbWVCEgoQX21heF90ZXh0X2xlbmd0aEIJCgdfZm9ybWF0QhMKEV9tYXhfdG90YWxfdG9rZW5zQhEKD19pbmNsdWRlX2JvdW5kc0IQCg5fdmlld3BvcnRfb25seUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQiRQoWR2V0T2JzZXJ2YXRpb25SZXNwb25zZRITCgtvYnNlcnZhdGlvbhgBIAEoCUoECAIQA1IQb2JzZXJ2YXRpb25fanNvbiJtChFHZXRET01IYXNoUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCIiChJHZXRET01IYXNoUmVzcG9uc2USDAoEaGFzaBgBIAEoCSKAAQoVU3RhcnREb21NaXJyb3JSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgVkZXB0aBgEIAEoBUgAiAEBEhMKBnBpZXJjZRgFIAEoCEgBiAEBQggKBl9kZXB0aEIJCgdfcGllcmNlSgQIAxAEIksKFlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USDAoEcm9vdBgBIAEoCRIQCghmcmFtZV9pZBgCIAEoCRILCgNzZXEYAyABKARKBAgEEAUiQQoUU3RvcERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJSgQIAxAEIpcBChVHZXREb21DaGlsZHJlblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCI3ChZHZXREb21DaGlsZHJlblJlc3BvbnNlEhAKCGNoaWxkcmVuGAEgASgJEgsKA3NlcRgCIAEoBCJ8ChhSZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChRSZXZlYWxEb21Ob2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIjIKFVJldmVhbERvbU5vZGVSZXNwb25zZRIMCgRwYXRoGAEgASgJEgsKA3NlcRgCIAEoBCJgChVHZXREb21SZXZpc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhUKCGZyYW1lX2lkGAMgASgJSACIAQFCCwoJX2ZyYW1lX2lkIioKFkdldERvbVJldmlzaW9uUmVzcG9uc2USEAoIcmV2aXNpb24YASABKAQiPQoWU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiOQoJRG9tVXBkYXRlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3NlcRgCIAEoBBINCgVlZGl0cxgDIAEoCSIhCglEb21SZXN5bmMSDgoGcmVhc29uGAIgASgJSgQIARACInsKCERvbUV2ZW50EiwKBnVwZGF0ZRgBIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Eb21VcGRhdGVIABIsCgZyZXN5bmMYAiABKAsyGi5icm93c2Vyc2NhbGUudjEuRG9tUmVzeW5jSABCBwoFZXZlbnRKBAgDEARKBAgEEAUiZgoYSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgkKAXgYBCABKAESCQoBeRgFIAEoASKpAQoZSW5zcGVjdEF0UG9zaXRpb25SZXNwb25zZRIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIZnJhbWVfaWQYAiABKAkSEAoIdGFnX25hbWUYAyABKAkSFAoMdGV4dF9jb250ZW50GAQgASgJEhIKCmlzX3Zpc2libGUYBSABKAgSJQoGYm91bmRzGAYgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QiiQEKFEhpZ2hsaWdodE5vZGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBRIVCghmcmFtZV9pZBgFIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJXChFJbnNlcnRUZXh0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIMCgR0ZXh0GAQgASgJInsKC1R5cGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgwKBHRleHQYBCABKAkSGAoLY2xlYXJfZmlyc3QYBSABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiugEKD1ByZXNzS2V5UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgNrZXkYBCABKAkSEQoEY29kZRgFIAEoCUgAiAEBEhYKCW1vZGlmaWVycxgGIAEoBUgBiAEBEhUKCGxvY2F0aW9uGAcgASgFSAKIAQFCBwoFX2NvZGVCDAoKX21vZGlmaWVyc0ILCglfbG9jYXRpb24ivAEKEVJlbGVhc2VLZXlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA2tleRgEIAEoCRIRCgRjb2RlGAUgASgJSACIAQESFgoJbW9kaWZpZXJzGAYgASgFSAGIAQESFQoIbG9jYXRpb24YByABKAVIAogBAUIHCgVfY29kZUIMCgpfbW9kaWZpZXJzQgsKCV9sb2NhdGlvbiJLChNHZXRTZWxlY3Rpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIiQKFEdldFNlbGVjdGlvblJlc3BvbnNlEgwKBHRleHQYASABKAkiiwEKEVNjcmVlbnNob3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhMKBmZvcm1hdBgEIAEoCUgAiAEBEhQKB3F1YWxpdHkYBSABKAVIAYgBAUIJCgdfZm9ybWF0QgoKCF9xdWFsaXR5IkgKElNjcmVlbnNob3RSZXNwb25zZRITCgtkYXRhX2Jhc2U2NBgBIAEoCRINCgV3aWR0aBgCIAEoBRIOCgZoZWlnaHQYAyABKAUikwMKEVJlYWRDYW52YXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGZm9ybWF0GAggASgJSASIAQESFAoHcXVhbGl0eRgJIAEoBUgFiAEBEg8KAnN4GAogASgFSAaIAQESDwoCc3kYCyABKAVIB4gBARIPCgJzdxgMIAEoBUgIiAEBEg8KAnNoGA0gASgFSAmIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19mb3JtYXRCCgoIX3F1YWxpdHlCBQoDX3N4QgUKA19zeUIFCgNfc3dCBQoDX3NoIpoBChJSZWFkQ2FudmFzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEwoLZGF0YV9iYXNlNjQYBCABKAkSDQoFd2lkdGgYBSABKAUSDgoGaGVpZ2h0GAYgASgFEhQKDG9yaWdpbl9jbGVhbhgHIAEoCCJkChNTb2x2ZUNhcHRjaGFSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgp0aW1lb3V0X21zGAMgASgFEhQKDHJldHJ5X2Ftb3VudBgEIAEoBSImChRTb2x2ZUNhcHRjaGFSZXNwb25zZRIOCgZyZXN1bHQYASABKAkiZQoJSWNlU2VydmVyEgwKBHVybHMYASADKAkSFQoIdXNlcm5hbWUYAiABKAlIAIgBARIXCgpjcmVkZW50aWFsGAMgASgJSAGIAQFCCwoJX3VzZXJuYW1lQg0KC19jcmVkZW50aWFsIj0KFkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkoKF0dldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEi8KC2ljZV9zZXJ2ZXJzGAEgAygLMhouYnJvd3NlcnNjYWxlLnYxLkljZVNlcnZlciJMChJTdGFydFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhEKCW9mZmVyX3NkcBgDIAEoCSJSChNTdGFydFN0cmVhbVJlc3BvbnNlEhIKCmFuc3dlcl9zZHAYASABKAkSJwoIdmlld3BvcnQYAiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdCI4ChFTdG9wU3RyZWFtUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiFAoSU3RvcFN0cmVhbVJlc3BvbnNlIkMKDlNjcmlwdExvZ0VudHJ5Eg0KBWxldmVsGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDIkcKEFJ1blNjcmlwdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCSKFAQoRUnVuU2NyaXB0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkSDgoGcnVuX2lkGAMgASgJEiwKA2xvZxgEIAMoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeRIRCgl0cnVuY2F0ZWQYBSABKAgiSQoSU3RhcnRTY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkiJQoTU3RhcnRTY3JpcHRSZXNwb25zZRIOCgZydW5faWQYASABKAkiSQoSU3RvcFNjcmlwdHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZydW5faWQYAyABKAkiJgoTU3RvcFNjcmlwdHNSZXNwb25zZRIPCgdzdG9wcGVkGAEgASgFIi8KCVNjcmlwdFJ1bhIOCgZydW5faWQYASABKAkSEgoKcnVubmluZ19tcxgCIAEoAyI8ChVMaXN0U2NyaXB0UnVuc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkIKFkxpc3RTY3JpcHRSdW5zUmVzcG9uc2USKAoEcnVucxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRSdW4iUAoZU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIkoKCVNjcmlwdExvZxIOCgZydW5faWQYASABKAkSLQoEbGluZRgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeSJSCg5TY3JpcHRGaW5pc2hlZBIOCgZydW5faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIOCgZyZXN1bHQYAyABKAkSDwoHc3RvcHBlZBgEIAEoCCKHAQoLU2NyaXB0RXZlbnQSKQoDbG9nGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLlNjcmlwdExvZ0gAEjMKCGZpbmlzaGVkGAIgASgLMh8uYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEZpbmlzaGVkSAASDwoHZHJvcHBlZBgDIAEoBEIHCgVldmVudDLLKAoHQnJvd3NlchJECghTZXRQcm94eRIgLmJyb3dzZXJzY2FsZS52MS5TZXRQcm94eVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTwoIR2V0UGFnZXMSIC5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkdldFBhZ2VzUmVzcG9uc2USTwoITmF2aWdhdGUSIC5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLk5hdmlnYXRlUmVzcG9uc2USRAoITG9hZEhUTUwSIC5icm93c2Vyc2NhbGUudjEuTG9hZEhUTUxSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ek8KCEV2YWx1YXRlEiAuYnJvd3NlcnNjYWxlLnYxLkV2YWx1YXRlUmVxdWVzdBohLmJyb3dzZXJzY2FsZS52MS5FdmFsdWF0ZVJlc3BvbnNlEkAKA1J1bhIbLmJyb3dzZXJzY2FsZS52MS5SdW5SZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLlJ1blJlc3BvbnNlEkwKCldhaXRGb3JBbnkSIS5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVBhcmFtcxobLmJyb3dzZXJzY2FsZS52MS5XYWl0UmVzdWx0ElkKDFNlbGVjdE9wdGlvbhIkLmJyb3dzZXJzY2FsZS52MS5TZWxlY3RPcHRpb25SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvblJlc3VsdBJLCghTY3JvbGxUbxIgLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxUb1JlcXVlc3QaHS5icm93c2Vyc2NhbGUudjEuU2Nyb2xsUmVzdWx0EkUKBk1vdmVUbxIeLmJyb3dzZXJzY2FsZS52MS5Nb3ZlVG9SZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLk1vdmVSZXN1bHQSRAoFQ2xpY2sSHS5icm93c2Vyc2NhbGUudjEuQ2xpY2tSZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLkNsaWNrUmVzdWx0EkEKBERyYWcSHC5icm93c2Vyc2NhbGUudjEuRHJhZ1JlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuRHJhZ1Jlc3VsdBJBCgRGaWxsEhwuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXN1bHQSWAoLQWRkUmVhY3Rpb24SIy5icm93c2Vyc2NhbGUudjEuQWRkUmVhY3Rpb25SZXF1ZXN0GiQuYnJvd3NlcnNjYWxlLnYxLkFkZFJlYWN0aW9uUmVzcG9uc2USYQoOUmVtb3ZlUmVhY3Rpb24SJi5icm93c2Vyc2NhbGUudjEuUmVtb3ZlUmVhY3Rpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLlJlbW92ZVJlYWN0aW9uUmVzcG9uc2USXgoNTGlzdFJlYWN0aW9ucxIlLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVxdWVzdBomLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVzcG9uc2USTAoMU2V0QmxvY2tMaXN0EiQuYnJvd3NlcnNjYWxlLnYxLlNldEJsb2NrTGlzdFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSUAoOU2V0U3RhdGljUGF0aHMSJi5icm93c2Vyc2NhbGUudjEuU2V0U3RhdGljUGF0aHNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmoKEVdhaXRGb3JBbnlSZXF1ZXN0EikuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVxdWVzdBoqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEm0KEldhaXRGb3JBbnlSZXNwb25zZRIqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlc3BvbnNlEl4KDU1vZGlmeVJlcXVlc3QSJS5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEloKE1N0YXJ0TmV0d29ya0NhcHR1cmUSKy5icm93c2Vyc2NhbGUudjEuU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSbQoSU3RvcE5ldHdvcmtDYXB0dXJlEiouYnJvd3NlcnNjYWxlLnYxLlN0b3BOZXR3b3JrQ2FwdHVyZVJlcXVlc3QaKy5icm93c2Vyc2NhbGUudjEuU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2UScQoWU3RyZWFtTmV0d29ya0V4Y2hhbmdlcxIuLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5OZXR3b3JrRXhjaGFuZ2VFdmVudDABElUKCkdldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1Jlc3BvbnNlEkgKClNldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuU2V0Q29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTAoMQ2xlYXJDb29raWVzEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyQ29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSVQoKR2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVzcG9uc2USSAoKU2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5TZXRTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJMCgxDbGVhclN0b3JhZ2USJC5icm93c2Vyc2NhbGUudjEuQ2xlYXJTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5HZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRBdXRoU2Vzc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXNwb25zZRJQCg5TZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5TZXRBdXRoU2Vzc2lvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSQoGR2V0RE9NEh4uYnJvd3NlcnNjYWxlLnYxLkdldERPTVJlcXVlc3QaHy5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVzcG9uc2USVQoKR2V0RE9NSGFzaBIiLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVzcG9uc2USYQoOR2V0T2JzZXJ2YXRpb24SJi5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldE9ic2VydmF0aW9uUmVzcG9uc2USagoRSW5zcGVjdEF0UG9zaXRpb24SKS5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLkluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USTgoNSGlnaGxpZ2h0Tm9kZRIlLmJyb3dzZXJzY2FsZS52MS5IaWdobGlnaHROb2RlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5TdGFydERvbU1pcnJvchImLmJyb3dzZXJzY2FsZS52MS5TdGFydERvbU1pcnJvclJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuU3RhcnREb21NaXJyb3JSZXNwb25zZRJOCg1TdG9wRG9tTWlycm9yEiUuYnJvd3NlcnNjYWxlLnYxLlN0b3BEb21NaXJyb3JSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmEKDkdldERvbUNoaWxkcmVuEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbUNoaWxkcmVuUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlc3BvbnNlElYKEVJlbGVhc2VEb21TdWJ0cmVlEikuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VEb21TdWJ0cmVlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJeCg1SZXZlYWxEb21Ob2RlEiUuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXNwb25zZRJhCg5HZXREb21SZXZpc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tUmV2aXNpb25SZXNwb25zZRJXCg9TdHJlYW1Eb21FdmVudHMSJy5icm93c2Vyc2NhbGUudjEuU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBoZLmJyb3dzZXJzY2FsZS52MS5Eb21FdmVudDABElUKClNjcmVlbnNob3QSIi5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlc3BvbnNlElUKClJlYWRDYW52YXMSIi5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1Jlc3BvbnNlEkgKCkluc2VydFRleHQSIi5icm93c2Vyc2NhbGUudjEuSW5zZXJ0VGV4dFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSPAoEVHlwZRIcLmJyb3dzZXJzY2FsZS52MS5UeXBlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJECghQcmVzc0tleRIgLmJyb3dzZXJzY2FsZS52MS5QcmVzc0tleVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSAoKUmVsZWFzZUtleRIiLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlS2V5UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJbCgxHZXRTZWxlY3Rpb24SJC5icm93c2Vyc2NhbGUudjEuR2V0U2VsZWN0aW9uUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5HZXRTZWxlY3Rpb25SZXNwb25zZRJbCgxTb2x2ZUNhcHRjaGESJC5icm93c2Vyc2NhbGUudjEuU29sdmVDYXB0Y2hhUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5Tb2x2ZUNhcHRjaGFSZXNwb25zZRJkCg9HZXRTdHJlYW1Db25maWcSJy5icm93c2Vyc2NhbGUudjEuR2V0U3RyZWFtQ29uZmlnUmVxdWVzdBooLmJyb3dzZXJzY2FsZS52MS5HZXRTdHJlYW1Db25maWdSZXNwb25zZRJYCgtTdGFydFN0cmVhbRIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFN0cmVhbVJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTdHJlYW1SZXNwb25zZRJVCgpTdG9wU3RyZWFtEiIuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXNwb25zZRJSCglSdW5TY3JpcHQSIS5icm93c2Vyc2NhbGUudjEuUnVuU2NyaXB0UmVxdWVzdBoiLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXNwb25zZRJYCgtTdGFydFNjcmlwdBIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTY3JpcHRSZXNwb25zZRJYCgtTdG9wU2NyaXB0cxIjLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1JlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RvcFNjcmlwdHNSZXNwb25zZRJhCg5MaXN0U2NyaXB0UnVucxImLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1JlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuTGlzdFNjcmlwdFJ1bnNSZXNwb25zZRJgChJTdHJlYW1TY3JpcHRFdmVudHMSKi5icm93c2Vyc2NhbGUudjEuU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRFdmVudDABQjNaMWdpdGh1Yi5jb20vYnJvd3NlcnNjYWxlL2Jyb3dzZXJzY2FsZS1nby9nZW5lcmF0ZWRiBnByb3RvMw", [file_google_protobuf_empty]);
3802
+ var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIswBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSLgoFZXJyb3IYBiABKAsyGi5icm93c2Vyc2NhbGUudjEuV2FpdEVycm9ySACIAQFCCAoGX2Vycm9yIuwBChNXYWl0Q29uZGl0aW9uU3RhdHVzEg0KBWluZGV4GAEgASgFEg0KBXN0YXRlGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEioKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0SACIAQESNAoIb2NjbHVkZXIYByABKAsyHS5icm93c2Vyc2NhbGUudjEuT2NjbHVkZXJJbmZvSAGIAQFCCQoHX2JvdW5kc0ILCglfb2NjbHVkZXIiZAoJV2FpdEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI4Cgpjb25kaXRpb25zGAMgAygLMiQuYnJvd3NlcnNjYWxlLnYxLldhaXRDb25kaXRpb25TdGF0dXMipgEKDUVsZW1lbnRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBItIDCgxPY2NsdWRlckluZm8SFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEg8KAmlkGAQgASgJSACIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgBiAEBEhEKBHRleHQYBiABKAlIAogBARIlCgZib3VuZHMYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIbCg5wb2ludGVyX2V2ZW50cxgIIAEoCUgDiAEBEhcKCnZpc2liaWxpdHkYCSABKAlIBIgBARIUCgdvcGFjaXR5GAogASgBSAWIAQESFAoHel9pbmRleBgLIAEoCUgGiAEBEiUKGGhpdHRhYmxlX3doaWxlX2ludmlzaWJsZRgMIAEoCEgHiAEBEhUKCHBvc2l0aW9uGA0gASgJSAiIAQFCBQoDX2lkQg0KC19jbGFzc19uYW1lQgcKBV90ZXh0QhEKD19wb2ludGVyX2V2ZW50c0INCgtfdmlzaWJpbGl0eUIKCghfb3BhY2l0eUIKCghfel9pbmRleEIbChlfaGl0dGFibGVfd2hpbGVfaW52aXNpYmxlQgsKCV9wb3NpdGlvbiItCgxDb21tYW5kRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIl0KDUNvbW1hbmRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIxCgVlcnJvchgCIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCJ4ChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkidwoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIpcBChVMaXN0UmVhY3Rpb25zUmVzcG9uc2USMAoJcmVhY3Rpb25zGAEgAygLMh0uYnJvd3NlcnNjYWxlLnYxLlJlYWN0aW9uSW5mbxIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLpAQoKRWxlbWVudFJlZhIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIdGFnX25hbWUYAiABKAkSDwoCaWQYAyABKAlIAIgBARIRCgRuYW1lGAQgASgJSAGIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgCiAEBEhcKCmlucHV0X3R5cGUYBiABKAlIA4gBARIRCgR0ZXh0GAcgASgJSASIAQESEAoIZWRpdGFibGUYCCABKAhCBQoDX2lkQgcKBV9uYW1lQg0KC19jbGFzc19uYW1lQg0KC19pbnB1dF90eXBlQgcKBV90ZXh0Iu4CCglGaWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBARIkChdmb2N1c2VkX2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgBiAEBEjkKD2ZvY3VzZWRfZWxlbWVudBgFIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5FbGVtZW50UmVmSAKIAQESHAoPdGFyZ2V0X2VkaXRhYmxlGAYgASgISAOIAQESIAoTdGFyZ2V0X3ZhbHVlX2xlbmd0aBgHIAEoBUgEiAEBQg4KDF9jbGlja19lcnJvckIaChhfZm9jdXNlZF9iYWNrZW5kX25vZGVfaWRCEgoQX2ZvY3VzZWRfZWxlbWVudEISChBfdGFyZ2V0X2VkaXRhYmxlQhYKFF90YXJnZXRfdmFsdWVfbGVuZ3RoIqIBCgpGaWxsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLgoFZXJyb3IYCCABKAsyGi5icm93c2Vyc2NhbGUudjEuRmlsbEVycm9ySACIAQFCCAoGX2Vycm9yIsIBCgpEcmFnUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg8KB3N0YXJ0X3gYBCABKAESDwoHc3RhcnRfeRgFIAEoARINCgVlbmRfeBgGIAEoARINCgVlbmRfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5EcmFnRXJyb3JIAIgBAUIICgZfZXJyb3IicQoJRHJhZ0Vycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI1CgtjbGlja19lcnJvchgDIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5DbGlja0Vycm9ySACIAQFCDgoMX2NsaWNrX2Vycm9yIq4BChJTZWxlY3RPcHRpb25SZXN1bHQSFgoOc2VsZWN0ZWRfaW5kZXgYASABKAUSFgoOc2VsZWN0ZWRfdmFsdWUYAiABKAkSFQoNc2VsZWN0ZWRfdGV4dBgDIAEoCRIPCgdzdWNjZXNzGAQgASgIEjYKBWVycm9yGAUgASgLMiIuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvbkVycm9ySACIAQFCCAoGX2Vycm9yIjIKEVNlbGVjdE9wdGlvbkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLBAQoMU2Nyb2xsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSMAoFZXJyb3IYCCABKAsyHC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsRXJyb3JIAIgBAUIICgZfZXJyb3IiLAoLU2Nyb2xsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIt0BCgpNb3ZlUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Nb3ZlRXJyb3JIAIgBAUIICgZfZXJyb3IiKgoJTW92ZUVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLmAQoPU2V0UHJveHlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCgpwcm94eV9ob3N0GAMgASgJSACIAQESFwoKcHJveHlfcG9ydBgEIAEoBUgBiAEBEhsKDnByb3h5X3VzZXJuYW1lGAUgASgJSAKIAQESGwoOcHJveHlfcGFzc3dvcmQYBiABKAlIA4gBAUINCgtfcHJveHlfaG9zdEINCgtfcHJveHlfcG9ydEIRCg9fcHJveHlfdXNlcm5hbWVCEQoPX3Byb3h5X3Bhc3N3b3JkIjYKD0dldFBhZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiigEKEEdldFBhZ2VzUmVzcG9uc2USKAoFcGFnZXMYASADKAsyGS5icm93c2Vyc2NhbGUudjEuUGFnZUluZm8SDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimgEKD05hdmlnYXRlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgN1cmwYBCABKAkSFQoIcmVmZXJyZXIYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCCwoJX3JlZmVycmVyQgoKCF90aW1lb3V0In8KEE5hdmlnYXRlUmVzcG9uc2USEAoIZnJhbWVfaWQYASABKAkSCwoDdXJsGAIgASgJEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIrYBCg9Mb2FkSFRNTFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDdXJsGAQgASgJEgwKBGh0bWwYBSABKAkSKAoHaGVhZGVycxgGIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISGAoLc3RhdHVzX2NvZGUYByABKAVIAIgBAUIOCgxfc3RhdHVzX2NvZGUifwoPRXZhbHVhdGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhIKCmV4cHJlc3Npb24YBCABKAkSFQoIZnJhbWVfaWQYBSABKAlIAIgBAUILCglfZnJhbWVfaWQixAEKEEV2YWx1YXRlUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgCIAEoBRISCgppc192aXNpYmxlGAMgASgIEiUKBmJvdW5kcxgEIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYBSABKAgSMQoFZXJyb3IYBiABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIsIBChBXYWl0Rm9yQW55UGFyYW1zEhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEjIKCmNvbmRpdGlvbnMYBCADKAsyHi5icm93c2Vyc2NhbGUudjEuV2FpdENvbmRpdGlvbhIVCghmcmFtZV9pZBgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUILCglfZnJhbWVfaWRCCgoIX3RpbWVvdXQi9QIKE1NlbGVjdE9wdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARISCgVpbmRleBgIIAEoBUgEiAEBEhIKBXZhbHVlGAkgASgJSAWIAQESEQoEdGV4dBgKIAEoCUgGiAEBEhgKC2ZpcmVfZXZlbnRzGAsgASgISAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQggKBl9pbmRleEIICgZfdmFsdWVCBwoFX3RleHRCDgoMX2ZpcmVfZXZlbnRzIu8BCg9TY3JvbGxUb1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQimQIKDU1vdmVUb1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARIOCgF4GAggASgBSASIAQESDgoBeRgJIAEoAUgFiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIECgJfeEIECgJfeSKCAwoMQ2xpY2tSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGYnV0dG9uGAggASgJSASIAQESGAoLY2xpY2tfY291bnQYCSABKAVIBYgBARIOCgF4GAogASgBSAaIAQESDgoBeRgLIAEoAUgHiAEBEhMKBmFjdGlvbhgMIAEoCUgIiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIJCgdfYnV0dG9uQg4KDF9jbGlja19jb3VudEIECgJfeEIECgJfeUIJCgdfYWN0aW9uIoMDCgtEcmFnUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhUKCG9mZnNldF94GAggASgBSASIAQESFQoIb2Zmc2V0X3kYCSABKAFIBYgBARIXCgphYnNvbHV0ZV94GAogASgBSAaIAQESFwoKYWJzb2x1dGVfeRgLIAEoAUgHiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEILCglfb2Zmc2V0X3hCCwoJX29mZnNldF95Qg0KC19hYnNvbHV0ZV94Qg0KC19hYnNvbHV0ZV95Iu8CCgtGaWxsUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEgwKBHRleHQYCCABKAkSGAoLY2xlYXJfZmlyc3QYCSABKAhIBIgBARIUCgd0aW1lb3V0GAogASgBSAWIAQESGAoLc3RlYWR5X3RpbWUYCyABKAFIBogBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCDgoMX2NsZWFyX2ZpcnN0QgoKCF90aW1lb3V0Qg4KDF9zdGVhZHlfdGltZSJMChNTZXRCbG9ja0xpc3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCSJhChVTZXRTdGF0aWNQYXRoc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhEKCWJsb2JfbmFtZRgEIAEoCSKIAQoYV2FpdEZvckFueVJlcXVlc3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCRITCgthYm9ydF9mbGFncxgEIAMoBRIUCgd0aW1lb3V0GAUgASgBSACIAQFCCgoIX3RpbWVvdXQirgEKGVdhaXRGb3JBbnlSZXF1ZXN0UmVzcG9uc2USDQoFaW5kZXgYASABKAUSNAoHcmVxdWVzdBgCIAEoCzIjLmJyb3dzZXJzY2FsZS52MS5JbnRlcmNlcHRlZFJlcXVlc3QSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiiQEKGVdhaXRGb3JBbnlSZXNwb25zZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCKxAQoaV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USDQoFaW5kZXgYASABKAUSNgoIcmVzcG9uc2UYAiABKAsyJC5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXNwb25zZRIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLKAQoUTW9kaWZ5UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKC3VybF9wYXR0ZXJuGAMgASgJEjoKDW1vZGlmaWNhdGlvbnMYBCADKAsyIy5icm93c2Vyc2NhbGUudjEuSGVhZGVyTW9kaWZpY2F0aW9uEhEKBGJvZHkYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCBwoFX2JvZHlCCgoIX3RpbWVvdXQimwEKFU1vZGlmeVJlcXVlc3RSZXNwb25zZRI0CgdyZXF1ZXN0GAEgASgLMiMuYnJvd3NlcnNjYWxlLnYxLkludGVyY2VwdGVkUmVxdWVzdBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKGAQoaU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEg4KBmJvZGllcxgEIAEoCRIVCg1ib2R5X3BhdHRlcm5zGAUgAygJSgQIBhAHSgQIBxAIIkAKGVN0b3BOZXR3b3JrQ2FwdHVyZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJInsKGlN0b3BOZXR3b3JrQ2FwdHVyZVJlc3BvbnNlEg8KB3N0b3BwZWQYASABKAgSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiRAodU3RyZWFtTmV0d29ya0V4Y2hhbmdlc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIlsKFE5ldHdvcmtFeGNoYW5nZUV2ZW50EjIKCGV4Y2hhbmdlGAEgASgLMiAuYnJvd3NlcnNjYWxlLnYxLk5ldHdvcmtFeGNoYW5nZRIPCgdkcm9wcGVkGAIgASgEIrQFCg9OZXR3b3JrRXhjaGFuZ2USEgoKcmVxdWVzdF9pZBgBIAEoCRIQCghjaGFpbl9pZBgCIAEoCRIWCg5yZWRpcmVjdF9pbmRleBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRIQCghpc19vb3BpZhgFIAEoCBIVCg1yZXNvdXJjZV90eXBlGAYgASgJEg4KBm1ldGhvZBgHIAEoCRILCgN1cmwYCCABKAkSFQoNaW5pdGlhdG9yX3VybBgJIAEoCRIwCg9yZXF1ZXN0X2hlYWRlcnMYCiADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEiAKGHJlcXVlc3RfaGVhZGVyc19hcmVfd2lyZRgLIAEoCBIUCgxyZXF1ZXN0X2JvZHkYDCABKAwSHgoWcmVxdWVzdF9ib2R5X3RydW5jYXRlZBgNIAEoCBIUCgxoYXNfcmVzcG9uc2UYDiABKAgSEwoLc3RhdHVzX2NvZGUYDyABKAUSEwoLc3RhdHVzX3RleHQYECABKAkSEQoJbWltZV90eXBlGBEgASgJEhAKCHByb3RvY29sGBIgASgJEhYKDnJlbW90ZV9hZGRyZXNzGBMgASgJEhMKC3NlcnZlZF9mcm9tGBQgASgJEjEKEHJlc3BvbnNlX2hlYWRlcnMYFSADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEiEKGXJlc3BvbnNlX2hlYWRlcnNfYXJlX3dpcmUYFiABKAgSFQoNcmVzcG9uc2VfYm9keRgXIAEoDBIfChdyZXNwb25zZV9ib2R5X3RydW5jYXRlZBgYIAEoCBIeChZyZXNwb25zZV9ib2R5X2NhcHR1cmVkGBkgASgIEhsKE2VuY29kZWRfZGF0YV9sZW5ndGgYGiABKAMSDQoFZXJyb3IYGyABKAkiOAoRR2V0Q29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIpEBChJHZXRDb29raWVzUmVzcG9uc2USLQoHY29va2llcxgBIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5Db29raWVQYXJhbRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJnChFTZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHY29va2llcxgDIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5Db29raWVQYXJhbSI6ChNDbGVhckNvb2tpZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSIpCgtTdG9yYWdlSXRlbRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkiUQoSU3RvcmFnZU9yaWdpbkVudHJ5Eg4KBm9yaWdpbhgBIAEoCRIrCgVpdGVtcxgCIAMoCzIcLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlSXRlbSJYChFHZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiKYAQoSR2V0U3RvcmFnZVJlc3BvbnNlEjQKB3N0b3JhZ2UYASADKAsyIy5icm93c2Vyc2NhbGUudjEuU3RvcmFnZU9yaWdpbkVudHJ5Eg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIpgBChFTZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSNAoHc3RvcmFnZRgDIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSGAoLY2xlYXJfZmlyc3QYBCABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiWgoTQ2xlYXJTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiIsCgtEYnNjU2Vzc2lvbhIMCgRzaXRlGAEgASgJEg8KB3Nlc3Npb24YAiABKAki2AIKC0F1dGhTZXNzaW9uEhQKB2dhaWFfaWQYASABKAlIAIgBARISCgVlbWFpbBgCIAEoCUgBiAEBEhoKDXJlZnJlc2hfdG9rZW4YAyABKAlIAogBARIgChN3cmFwcGVkX2JpbmRpbmdfa2V5GAQgASgJSAOIAQESJAoXc2lnbmluX3Njb3BlZF9kZXZpY2VfaWQYBSABKAlIBIgBARIZCgxzeW5jX2NvbnNlbnQYBiABKAhIBYgBARIzCg1kYnNjX3Nlc3Npb25zGAcgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkRic2NTZXNzaW9uQgoKCF9nYWlhX2lkQggKBl9lbWFpbEIQCg5fcmVmcmVzaF90b2tlbkIWChRfd3JhcHBlZF9iaW5kaW5nX2tleUIaChhfc2lnbmluX3Njb3BlZF9kZXZpY2VfaWRCDwoNX3N5bmNfY29uc2VudCI8ChVHZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIqYBChZHZXRBdXRoU2Vzc2lvblJlc3BvbnNlEjIKB3Nlc3Npb24YASABKAsyHC5icm93c2Vyc2NhbGUudjEuQXV0aFNlc3Npb25IAIgBARIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgBiAEBQgoKCF9zZXNzaW9uQggKBl9lcnJvciJrChVTZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEi0KB3Nlc3Npb24YAyABKAsyHC5icm93c2Vyc2NhbGUudjEuQXV0aFNlc3Npb24ihwEKDUdldERPTVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFQoIZnJhbWVfaWQYBCABKAlIAIgBARISCgVkZXB0aBgFIAEoBUgBiAEBQgsKCV9mcmFtZV9pZEIICgZfZGVwdGgiawoOR2V0RE9NUmVzcG9uc2USCwoDZG9tGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIpkEChVHZXRPYnNlcnZhdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSIwoWbWF4X2VsZW1lbnRzX3Blcl9mcmFtZRgEIAEoBUgAiAEBEhwKD21heF90ZXh0X2xlbmd0aBgFIAEoBUgBiAEBEhMKBmZvcm1hdBgGIAEoCUgCiAEBEh0KEG1heF90b3RhbF90b2tlbnMYByABKAVIA4gBARIbCg5pbmNsdWRlX2JvdW5kcxgIIAEoCEgEiAEBEhoKDXZpZXdwb3J0X29ubHkYCSABKAhIBYgBARIcCg9iYWNrZW5kX25vZGVfaWQYCiABKAVIBogBARIVCghzZWxlY3RvchgLIAEoCUgHiAEBEhoKDWpzX2V4cHJlc3Npb24YDCABKAlICIgBARIVCghmcmFtZV9pZBgNIAEoCUgJiAEBQhkKF19tYXhfZWxlbWVudHNfcGVyX2ZyYW1lQhIKEF9tYXhfdGV4dF9sZW5ndGhCCQoHX2Zvcm1hdEITChFfbWF4X3RvdGFsX3Rva2Vuc0IRCg9faW5jbHVkZV9ib3VuZHNCEAoOX3ZpZXdwb3J0X29ubHlCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkIpMBChZHZXRPYnNlcnZhdGlvblJlc3BvbnNlEhMKC29ic2VydmF0aW9uGAEgASgJEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9ySgQIAhADUhBvYnNlcnZhdGlvbl9qc29uIm0KEUdldERPTUhhc2hSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIiIKEkdldERPTUhhc2hSZXNwb25zZRIMCgRoYXNoGAEgASgJIoABChVTdGFydERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhIKBWRlcHRoGAQgASgFSACIAQESEwoGcGllcmNlGAUgASgISAGIAQFCCAoGX2RlcHRoQgkKB19waWVyY2VKBAgDEAQimQEKFlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USDAoEcm9vdBgBIAEoCRIQCghmcmFtZV9pZBgCIAEoCRILCgNzZXEYAyABKAQSDwoHc3VjY2VzcxgFIAEoCBIxCgVlcnJvchgGIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3JKBAgEEAUiQQoUU3RvcERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJSgQIAxAEIpcBChVHZXREb21DaGlsZHJlblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCKFAQoWR2V0RG9tQ2hpbGRyZW5SZXNwb25zZRIQCghjaGlsZHJlbhgBIAEoCRILCgNzZXEYAiABKAQSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IifAoYUmVsZWFzZURvbVN1YnRyZWVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSFQoIZnJhbWVfaWQYBCABKAlIAIgBAUILCglfZnJhbWVfaWQieAoUUmV2ZWFsRG9tTm9kZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCKAAQoVUmV2ZWFsRG9tTm9kZVJlc3BvbnNlEgwKBHBhdGgYASABKAkSCwoDc2VxGAIgASgEEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yImAKFUdldERvbVJldmlzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFQoIZnJhbWVfaWQYAyABKAlIAIgBAUILCglfZnJhbWVfaWQieAoWR2V0RG9tUmV2aXNpb25SZXNwb25zZRIQCghyZXZpc2lvbhgBIAEoBBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciI9ChZTdHJlYW1Eb21FdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSI5CglEb21VcGRhdGUSEAoIZnJhbWVfaWQYASABKAkSCwoDc2VxGAIgASgEEg0KBWVkaXRzGAMgASgJIiEKCURvbVJlc3luYxIOCgZyZWFzb24YAiABKAlKBAgBEAIiewoIRG9tRXZlbnQSLAoGdXBkYXRlGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLkRvbVVwZGF0ZUgAEiwKBnJlc3luYxgCIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Eb21SZXN5bmNIAEIHCgVldmVudEoECAMQBEoECAQQBSJmChhJbnNwZWN0QXRQb3NpdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCQoBeBgEIAEoARIJCgF5GAUgASgBIvcBChlJbnNwZWN0QXRQb3NpdGlvblJlc3BvbnNlEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCghmcmFtZV9pZBgCIAEoCRIQCgh0YWdfbmFtZRgDIAEoCRIUCgx0ZXh0X2NvbnRlbnQYBCABKAkSEgoKaXNfdmlzaWJsZRgFIAEoCBIlCgZib3VuZHMYBiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIPCgdzdWNjZXNzGAcgASgIEjEKBWVycm9yGAggASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKJAQoUSGlnaGxpZ2h0Tm9kZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAQgASgFEhUKCGZyYW1lX2lkGAUgASgJSACIAQFCCwoJX2ZyYW1lX2lkIlcKEUluc2VydFRleHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgwKBHRleHQYBCABKAkiewoLVHlwZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSDAoEdGV4dBgEIAEoCRIYCgtjbGVhcl9maXJzdBgFIAEoCEgAiAEBQg4KDF9jbGVhcl9maXJzdCK6AQoPUHJlc3NLZXlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA2tleRgEIAEoCRIRCgRjb2RlGAUgASgJSACIAQESFgoJbW9kaWZpZXJzGAYgASgFSAGIAQESFQoIbG9jYXRpb24YByABKAVIAogBAUIHCgVfY29kZUIMCgpfbW9kaWZpZXJzQgsKCV9sb2NhdGlvbiK8AQoRUmVsZWFzZUtleVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDa2V5GAQgASgJEhEKBGNvZGUYBSABKAlIAIgBARIWCgltb2RpZmllcnMYBiABKAVIAYgBARIVCghsb2NhdGlvbhgHIAEoBUgCiAEBQgcKBV9jb2RlQgwKCl9tb2RpZmllcnNCCwoJX2xvY2F0aW9uIksKE0dldFNlbGVjdGlvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkicgoUR2V0U2VsZWN0aW9uUmVzcG9uc2USDAoEdGV4dBgBIAEoCRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKLAQoRU2NyZWVuc2hvdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSEwoGZm9ybWF0GAQgASgJSACIAQESFAoHcXVhbGl0eRgFIAEoBUgBiAEBQgkKB19mb3JtYXRCCgoIX3F1YWxpdHkilgEKElNjcmVlbnNob3RSZXNwb25zZRITCgtkYXRhX2Jhc2U2NBgBIAEoCRINCgV3aWR0aBgCIAEoBRIOCgZoZWlnaHQYAyABKAUSDwoHc3VjY2VzcxgEIAEoCBIxCgVlcnJvchgFIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IikwMKEVJlYWRDYW52YXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGZm9ybWF0GAggASgJSASIAQESFAoHcXVhbGl0eRgJIAEoBUgFiAEBEg8KAnN4GAogASgFSAaIAQESDwoCc3kYCyABKAVIB4gBARIPCgJzdxgMIAEoBUgIiAEBEg8KAnNoGA0gASgFSAmIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19mb3JtYXRCCgoIX3F1YWxpdHlCBQoDX3N4QgUKA19zeUIFCgNfc3dCBQoDX3NoItcBChJSZWFkQ2FudmFzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEwoLZGF0YV9iYXNlNjQYBCABKAkSDQoFd2lkdGgYBSABKAUSDgoGaGVpZ2h0GAYgASgFEhQKDG9yaWdpbl9jbGVhbhgHIAEoCBIxCgVlcnJvchgIIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiZAoTU29sdmVDYXB0Y2hhUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEgoKdGltZW91dF9tcxgDIAEoBRIUCgxyZXRyeV9hbW91bnQYBCABKAUiJgoUU29sdmVDYXB0Y2hhUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJImUKCUljZVNlcnZlchIMCgR1cmxzGAEgAygJEhUKCHVzZXJuYW1lGAIgASgJSACIAQESFwoKY3JlZGVudGlhbBgDIAEoCUgBiAEBQgsKCV91c2VybmFtZUINCgtfY3JlZGVudGlhbCI9ChZHZXRTdHJlYW1Db25maWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJKChdHZXRTdHJlYW1Db25maWdSZXNwb25zZRIvCgtpY2Vfc2VydmVycxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5JY2VTZXJ2ZXIiTAoSU3RhcnRTdHJlYW1SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIRCglvZmZlcl9zZHAYAyABKAkioAEKE1N0YXJ0U3RyZWFtUmVzcG9uc2USEgoKYW5zd2VyX3NkcBgBIAEoCRInCgh2aWV3cG9ydBgCIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIjgKEVN0b3BTdHJlYW1SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJDCg5TY3JpcHRMb2dFbnRyeRINCgVsZXZlbBgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCXRpbWVzdGFtcBgDIAEoAyJHChBSdW5TY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkihQEKEVJ1blNjcmlwdFJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgSDgoGcmVzdWx0GAIgASgJEg4KBnJ1bl9pZBgDIAEoCRIsCgNsb2cYBCADKAsyHy5icm93c2Vyc2NhbGUudjEuU2NyaXB0TG9nRW50cnkSEQoJdHJ1bmNhdGVkGAUgASgIIkkKElN0YXJ0U2NyaXB0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGc291cmNlGAMgASgJIiUKE1N0YXJ0U2NyaXB0UmVzcG9uc2USDgoGcnVuX2lkGAEgASgJIkkKElN0b3BTY3JpcHRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIiYKE1N0b3BTY3JpcHRzUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoBSIvCglTY3JpcHRSdW4SDgoGcnVuX2lkGAEgASgJEhIKCnJ1bm5pbmdfbXMYAiABKAMiPAoVTGlzdFNjcmlwdFJ1bnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSJCChZMaXN0U2NyaXB0UnVuc1Jlc3BvbnNlEigKBHJ1bnMYASADKAsyGi5icm93c2Vyc2NhbGUudjEuU2NyaXB0UnVuIlAKGVN0cmVhbVNjcmlwdEV2ZW50c1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnJ1bl9pZBgDIAEoCSJKCglTY3JpcHRMb2cSDgoGcnVuX2lkGAEgASgJEi0KBGxpbmUYAiABKAsyHy5icm93c2Vyc2NhbGUudjEuU2NyaXB0TG9nRW50cnkiUgoOU2NyaXB0RmluaXNoZWQSDgoGcnVuX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSDgoGcmVzdWx0GAMgASgJEg8KB3N0b3BwZWQYBCABKAgihwEKC1NjcmlwdEV2ZW50EikKA2xvZxgBIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dIABIzCghmaW5pc2hlZBgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRGaW5pc2hlZEgAEg8KB2Ryb3BwZWQYAyABKARCBwoFZXZlbnQyjCkKB0Jyb3dzZXISTAoIU2V0UHJveHkSIC5icm93c2Vyc2NhbGUudjEuU2V0UHJveHlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTwoIR2V0UGFnZXMSIC5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkdldFBhZ2VzUmVzcG9uc2USTwoITmF2aWdhdGUSIC5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLk5hdmlnYXRlUmVzcG9uc2USTAoITG9hZEhUTUwSIC5icm93c2Vyc2NhbGUudjEuTG9hZEhUTUxSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTwoIRXZhbHVhdGUSIC5icm93c2Vyc2NhbGUudjEuRXZhbHVhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkV2YWx1YXRlUmVzcG9uc2USTAoKV2FpdEZvckFueRIhLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UGFyYW1zGhsuYnJvd3NlcnNjYWxlLnYxLldhaXRSZXN1bHQSWQoMU2VsZWN0T3B0aW9uEiQuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvblJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uUmVzdWx0EksKCFNjcm9sbFRvEiAuYnJvd3NlcnNjYWxlLnYxLlNjcm9sbFRvUmVxdWVzdBodLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxSZXN1bHQSRQoGTW92ZVRvEh4uYnJvd3NlcnNjYWxlLnYxLk1vdmVUb1JlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuTW92ZVJlc3VsdBJECgVDbGljaxIdLmJyb3dzZXJzY2FsZS52MS5DbGlja1JlcXVlc3QaHC5icm93c2Vyc2NhbGUudjEuQ2xpY2tSZXN1bHQSQQoERHJhZxIcLmJyb3dzZXJzY2FsZS52MS5EcmFnUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5EcmFnUmVzdWx0EkEKBEZpbGwSHC5icm93c2Vyc2NhbGUudjEuRmlsbFJlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuRmlsbFJlc3VsdBJYCgtBZGRSZWFjdGlvbhIjLmJyb3dzZXJzY2FsZS52MS5BZGRSZWFjdGlvblJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuQWRkUmVhY3Rpb25SZXNwb25zZRJhCg5SZW1vdmVSZWFjdGlvbhImLmJyb3dzZXJzY2FsZS52MS5SZW1vdmVSZWFjdGlvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRJeCg1MaXN0UmVhY3Rpb25zEiUuYnJvd3NlcnNjYWxlLnYxLkxpc3RSZWFjdGlvbnNSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLkxpc3RSZWFjdGlvbnNSZXNwb25zZRJUCgxTZXRCbG9ja0xpc3QSJC5icm93c2Vyc2NhbGUudjEuU2V0QmxvY2tMaXN0UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElgKDlNldFN0YXRpY1BhdGhzEiYuYnJvd3NlcnNjYWxlLnYxLlNldFN0YXRpY1BhdGhzUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmoKEVdhaXRGb3JBbnlSZXF1ZXN0EikuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVxdWVzdBoqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEm0KEldhaXRGb3JBbnlSZXNwb25zZRIqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlc3BvbnNlEl4KDU1vZGlmeVJlcXVlc3QSJS5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEmIKE1N0YXJ0TmV0d29ya0NhcHR1cmUSKy5icm93c2Vyc2NhbGUudjEuU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJtChJTdG9wTmV0d29ya0NhcHR1cmUSKi5icm93c2Vyc2NhbGUudjEuU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBorLmJyb3dzZXJzY2FsZS52MS5TdG9wTmV0d29ya0NhcHR1cmVSZXNwb25zZRJxChZTdHJlYW1OZXR3b3JrRXhjaGFuZ2VzEi4uYnJvd3NlcnNjYWxlLnYxLlN0cmVhbU5ldHdvcmtFeGNoYW5nZXNSZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLk5ldHdvcmtFeGNoYW5nZUV2ZW50MAESVQoKR2V0Q29va2llcxIiLmJyb3dzZXJzY2FsZS52MS5HZXRDb29raWVzUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRDb29raWVzUmVzcG9uc2USUAoKU2V0Q29va2llcxIiLmJyb3dzZXJzY2FsZS52MS5TZXRDb29raWVzUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElQKDENsZWFyQ29va2llcxIkLmJyb3dzZXJzY2FsZS52MS5DbGVhckNvb2tpZXNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVQoKR2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVzcG9uc2USUAoKU2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5TZXRTdG9yYWdlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElQKDENsZWFyU3RvcmFnZRIkLmJyb3dzZXJzY2FsZS52MS5DbGVhclN0b3JhZ2VSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSYQoOR2V0QXV0aFNlc3Npb24SJi5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldEF1dGhTZXNzaW9uUmVzcG9uc2USWAoOU2V0QXV0aFNlc3Npb24SJi5icm93c2Vyc2NhbGUudjEuU2V0QXV0aFNlc3Npb25SZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSSQoGR2V0RE9NEh4uYnJvd3NlcnNjYWxlLnYxLkdldERPTVJlcXVlc3QaHy5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVzcG9uc2USVQoKR2V0RE9NSGFzaBIiLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVzcG9uc2USYQoOR2V0T2JzZXJ2YXRpb24SJi5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldE9ic2VydmF0aW9uUmVzcG9uc2USagoRSW5zcGVjdEF0UG9zaXRpb24SKS5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLkluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USVgoNSGlnaGxpZ2h0Tm9kZRIlLmJyb3dzZXJzY2FsZS52MS5IaWdobGlnaHROb2RlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmEKDlN0YXJ0RG9tTWlycm9yEiYuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0RG9tTWlycm9yUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5TdGFydERvbU1pcnJvclJlc3BvbnNlElYKDVN0b3BEb21NaXJyb3ISJS5icm93c2Vyc2NhbGUudjEuU3RvcERvbU1pcnJvclJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJhCg5HZXREb21DaGlsZHJlbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tQ2hpbGRyZW5SZXNwb25zZRJeChFSZWxlYXNlRG9tU3VidHJlZRIpLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJeCg1SZXZlYWxEb21Ob2RlEiUuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXNwb25zZRJhCg5HZXREb21SZXZpc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tUmV2aXNpb25SZXNwb25zZRJXCg9TdHJlYW1Eb21FdmVudHMSJy5icm93c2Vyc2NhbGUudjEuU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBoZLmJyb3dzZXJzY2FsZS52MS5Eb21FdmVudDABElUKClNjcmVlbnNob3QSIi5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlc3BvbnNlElUKClJlYWRDYW52YXMSIi5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1Jlc3BvbnNlElAKCkluc2VydFRleHQSIi5icm93c2Vyc2NhbGUudjEuSW5zZXJ0VGV4dFJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJECgRUeXBlEhwuYnJvd3NlcnNjYWxlLnYxLlR5cGVSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSTAoIUHJlc3NLZXkSIC5icm93c2Vyc2NhbGUudjEuUHJlc3NLZXlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSUAoKUmVsZWFzZUtleRIiLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlS2V5UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElsKDEdldFNlbGVjdGlvbhIkLmJyb3dzZXJzY2FsZS52MS5HZXRTZWxlY3Rpb25SZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLkdldFNlbGVjdGlvblJlc3BvbnNlElsKDFNvbHZlQ2FwdGNoYRIkLmJyb3dzZXJzY2FsZS52MS5Tb2x2ZUNhcHRjaGFSZXF1ZXN0GiUuYnJvd3NlcnNjYWxlLnYxLlNvbHZlQ2FwdGNoYVJlc3BvbnNlEmQKD0dldFN0cmVhbUNvbmZpZxInLmJyb3dzZXJzY2FsZS52MS5HZXRTdHJlYW1Db25maWdSZXF1ZXN0GiguYnJvd3NlcnNjYWxlLnYxLkdldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlElgKC1N0YXJ0U3RyZWFtEiMuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U3RyZWFtUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdGFydFN0cmVhbVJlc3BvbnNlElAKClN0b3BTdHJlYW0SIi5icm93c2Vyc2NhbGUudjEuU3RvcFN0cmVhbVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJSCglSdW5TY3JpcHQSIS5icm93c2Vyc2NhbGUudjEuUnVuU2NyaXB0UmVxdWVzdBoiLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXNwb25zZRJYCgtTdGFydFNjcmlwdBIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTY3JpcHRSZXNwb25zZRJYCgtTdG9wU2NyaXB0cxIjLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1JlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RvcFNjcmlwdHNSZXNwb25zZRJhCg5MaXN0U2NyaXB0UnVucxImLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1JlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuTGlzdFNjcmlwdFJ1bnNSZXNwb25zZRJgChJTdHJlYW1TY3JpcHRFdmVudHMSKi5icm93c2Vyc2NhbGUudjEuU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRFdmVudDABQjNaMWdpdGh1Yi5jb20vYnJvd3NlcnNjYWxlL2Jyb3dzZXJzY2FsZS1nby9nZW5lcmF0ZWRiBnByb3RvMw", [file_google_protobuf_empty]);
3803
3803
  var HeaderSchema = /* @__PURE__ */ messageDesc(file_wrc, 3);
3804
3804
  var HeaderModificationSchema = /* @__PURE__ */ messageDesc(file_wrc, 6);
3805
3805
  var CookiePartitionKeySchema = /* @__PURE__ */ messageDesc(file_wrc, 7);
3806
3806
  var CookieParamSchema = /* @__PURE__ */ messageDesc(file_wrc, 8);
3807
3807
  var WaitConditionSchema = /* @__PURE__ */ messageDesc(file_wrc, 9);
3808
- var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 18);
3809
- var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 20);
3810
- var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 22);
3811
- var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 35);
3812
- var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 36);
3813
- var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 38);
3814
- var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 40);
3815
- var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 41);
3808
+ var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 20);
3809
+ var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 22);
3810
+ var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 24);
3811
+ var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 37);
3812
+ var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 38);
3813
+ var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 40);
3814
+ var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 42);
3815
+ var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 43);
3816
3816
  var WaitForAnyParamsSchema = /* @__PURE__ */ messageDesc(file_wrc, 45);
3817
3817
  var SelectOptionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 46);
3818
3818
  var ScrollToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 47);
@@ -3863,18 +3863,13 @@ var SolveCaptchaRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 114);
3863
3863
  var GetStreamConfigRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 117);
3864
3864
  var StartStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 119);
3865
3865
  var StopStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 121);
3866
- var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 124);
3867
- var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 126);
3868
- var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 128);
3869
- var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 131);
3870
- var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 133);
3866
+ var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 123);
3867
+ var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 125);
3868
+ var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 127);
3869
+ var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 130);
3870
+ var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 132);
3871
3871
  var Browser = /* @__PURE__ */ serviceDesc(file_wrc, 0);
3872
3872
 
3873
- // src/defaults.ts
3874
- var DefaultWaitTimeoutMs = 3e4;
3875
- var DefaultVisible = true;
3876
- var DefaultSteadyMs = 500;
3877
-
3878
3873
  // src/errors.ts
3879
3874
  var BrowserScaleError = class extends Error {
3880
3875
  constructor(message, cause) {
@@ -3883,6 +3878,19 @@ var BrowserScaleError = class extends Error {
3883
3878
  this.name = "BrowserScaleError";
3884
3879
  }
3885
3880
  };
3881
+ function throwCommandError(command, error) {
3882
+ if (error) {
3883
+ throw new CommandError({ command, code: error.code, message: error.message });
3884
+ }
3885
+ }
3886
+ var CommandError = class extends BrowserScaleError {
3887
+ constructor(init) {
3888
+ super(formatMessage(init.command, init.code, init.message));
3889
+ this.name = "CommandError";
3890
+ this.command = init.command;
3891
+ this.code = init.code;
3892
+ }
3893
+ };
3886
3894
  var ClickError = class extends BrowserScaleError {
3887
3895
  constructor(init) {
3888
3896
  super(formatMessage("click", init.code, init.message));
@@ -3982,9 +3990,9 @@ var Locator = class _Locator {
3982
3990
  * Enforces or disables the visibility check for this Locator's wait
3983
3991
  * condition.
3984
3992
  *
3985
- * Pass `false` to opt out of the default `DefaultVisible` (true). Has
3986
- * no effect when used as an action target — actions never check
3987
- * visibility before dispatching.
3993
+ * Visibility is required by default, so pass `false` to wait for DOM
3994
+ * presence alone. Has no effect when used as an action target — actions
3995
+ * never check visibility before dispatching.
3988
3996
  *
3989
3997
  * @param v - true to require visibility, false to skip the check
3990
3998
  *
@@ -4000,9 +4008,9 @@ var Locator = class _Locator {
4000
4008
  * Requires the element to keep a stable position and size for at least
4001
4009
  * `ms` milliseconds before the wait matches.
4002
4010
  *
4003
- * Pass 0 to disable the default `DefaultSteadyMs` (500). Has no effect
4004
- * for js() expressions that return a non-Element value, nor when used
4005
- * as an action target.
4011
+ * Settling defaults to 500ms, so pass 0 to match the instant the element
4012
+ * is found. Has no effect for js() expressions that return a non-Element
4013
+ * value, nor when used as an action target.
4006
4014
  *
4007
4015
  * @param ms - steady-state duration in milliseconds; 0 disables
4008
4016
  *
@@ -4065,19 +4073,11 @@ var Locator = class _Locator {
4065
4073
  // ── Constructors (top-level functions re-export these) ──────────────
4066
4074
  /** @internal */
4067
4075
  static _css(selector) {
4068
- return new _Locator({
4069
- selector,
4070
- visibleFlag: DefaultVisible,
4071
- steadyMs: DefaultSteadyMs
4072
- });
4076
+ return new _Locator({ selector });
4073
4077
  }
4074
4078
  /** @internal */
4075
4079
  static _js(expression) {
4076
- return new _Locator({
4077
- jsExpression: expression,
4078
- visibleFlag: DefaultVisible,
4079
- steadyMs: DefaultSteadyMs
4080
- });
4080
+ return new _Locator({ jsExpression: expression });
4081
4081
  }
4082
4082
  /** @internal */
4083
4083
  static _node(backendNodeId) {
@@ -4260,6 +4260,7 @@ function waitConditionStatusFromProto(c) {
4260
4260
  }
4261
4261
  function unwrapWait(r) {
4262
4262
  const res = {
4263
+ success: r.success,
4263
4264
  index: r.index,
4264
4265
  frameId: r.frameId,
4265
4266
  backendNodeId: r.backendNodeId,
@@ -4558,8 +4559,9 @@ var NetworkCapture = class {
4558
4559
  * {@link CloudBrowser.stopNetworkCapture} instead: stop awaits the reader,
4559
4560
  * which cannot finish while the handler it called is still running.
4560
4561
  *
4561
- * @throws UNKNOWN_ERROR - the capture could not be disarmed; the local reader
4562
- * is shut down regardless
4562
+ * Rejects only on a transport failure, and the local reader is shut down
4563
+ * regardless. Disarming a capture that is not running is a no-op rather than a
4564
+ * failure, so there are no error codes to branch on.
4563
4565
  */
4564
4566
  async stop() {
4565
4567
  if (this.stopped) return;
@@ -4680,7 +4682,8 @@ var ScriptRun = class {
4680
4682
  *
4681
4683
  * @returns how the script ended
4682
4684
  *
4683
- * @throws UNKNOWN_ERROR - the outcome could not be observed
4685
+ * Rejects only on a transport failure - the connection dying, or the run being
4686
+ * abandoned. A script that threw is a normal outcome and arrives in the result.
4684
4687
  */
4685
4688
  async wait() {
4686
4689
  await this.endedPromise;
@@ -4698,8 +4701,8 @@ var ScriptRun = class {
4698
4701
  * at its next operation in the page. Either way the handler sees a `finished`
4699
4702
  * with `stopped` set, unless the local reader is torn down first.
4700
4703
  *
4701
- * @throws UNKNOWN_ERROR - the run could not be cancelled server-side; the
4702
- * local reader is detached regardless
4704
+ * Rejects only on a transport failure, and the local reader is detached
4705
+ * regardless. Cancelling a run that has already finished is a no-op.
4703
4706
  */
4704
4707
  async stop() {
4705
4708
  if (this.detached) return;
@@ -4874,6 +4877,14 @@ var DomMirror = class {
4874
4877
  * boundary was crossed; it is a child list like any other.
4875
4878
  *
4876
4879
  * @param depth levels below the node, default 1
4880
+ *
4881
+ * @throws not_mirrored - the page has no mirror, or the node's frame is not
4882
+ * part of the one it has; after a resync, fetch the current tree before
4883
+ * addressing nodes again
4884
+ * @throws mirror_failed - the subtree could not be serialized, usually a
4885
+ * document that went away mid-read
4886
+ *
4887
+ * @see {@link CommandError} for reading the code off the rejection
4877
4888
  */
4878
4889
  async expand(node2, depth) {
4879
4890
  if (this.stopped) return;
@@ -4899,6 +4910,13 @@ var DomMirror = class {
4899
4910
  *
4900
4911
  * Skipping this is not an error, it is a slow leak: the browser's revealed
4901
4912
  * set only grows, and eventually it is no longer filtering anything.
4913
+ *
4914
+ * @throws not_mirrored - the page has no mirror, or the node's frame is not
4915
+ * part of the one it has; this is what collapsing a node from a tree that has
4916
+ * since been resynced looks like, so fetch the current tree and address the
4917
+ * node again
4918
+ *
4919
+ * @see {@link CommandError} for reading the code off the rejection
4902
4920
  */
4903
4921
  async collapse(node2) {
4904
4922
  if (this.stopped) return;
@@ -4925,6 +4943,13 @@ var DomMirror = class {
4925
4943
  *
4926
4944
  * @returns the ancestor chain, the main document first, or an empty array if
4927
4945
  * the node is not on the page
4946
+ *
4947
+ * @throws not_mirrored - the page has no mirror, or the given frame is not part
4948
+ * of the one it has
4949
+ * @throws mirror_failed - the path could not be serialized, usually a document
4950
+ * that went away mid-read
4951
+ *
4952
+ * @see {@link CommandError} for reading the code off the rejection
4928
4953
  */
4929
4954
  async reveal(backendNodeId, frameId) {
4930
4955
  if (this.stopped) return [];
@@ -4960,6 +4985,11 @@ var DomMirror = class {
4960
4985
  * Throws away the local copy of the whole page and fetches a fresh one.
4961
4986
  * Happens automatically whenever the browser says the copy is void, so you
4962
4987
  * rarely need to call it.
4988
+ *
4989
+ * @throws mirror_failed - the page could not be serialized, usually a document
4990
+ * that went away while the tree was being rebuilt. The mirror then ends
4991
+ *
4992
+ * @see {@link CommandError} for reading the code off the rejection
4963
4993
  */
4964
4994
  async resync(reason = "manual") {
4965
4995
  if (this.stopped) return;
@@ -5299,7 +5329,8 @@ var CloudBrowser = class {
5299
5329
  * {@link createWebSocketBrowser} the rental stays untouched; only the
5300
5330
  * transport is closed.
5301
5331
  *
5302
- * @throws UNKNOWN_ERROR - the stop API or the transport close failed
5332
+ * Rejects only when the stop API or the transport close fails. The session is
5333
+ * released either way; retrying a stop is safe.
5303
5334
  *
5304
5335
  * @example
5305
5336
  * await browser.stopBrowser();
@@ -5324,7 +5355,9 @@ var CloudBrowser = class {
5324
5355
  * @param proxyUsername - proxy auth user; empty for unauthenticated proxies
5325
5356
  * @param proxyPassword - proxy auth password; empty for unauthenticated proxies
5326
5357
  *
5327
- * @throws UNKNOWN_ERROR - the proxy could not be applied
5358
+ * Rejects only on a transport failure - a dead session, a page that is gone,
5359
+ * a broken connection. This call has no semantic failure of its own, so there
5360
+ * are no error codes to branch on.
5328
5361
  *
5329
5362
  * @example
5330
5363
  * await browser.setProxy("proxy.example.com", 8080, "user", "pass");
@@ -5340,7 +5373,8 @@ var CloudBrowser = class {
5340
5373
  if (proxyUsername) req.proxyUsername = proxyUsername;
5341
5374
  if (proxyPassword) req.proxyPassword = proxyPassword;
5342
5375
  }
5343
- await this.client.setProxy(req);
5376
+ const res = await this.client.setProxy(req);
5377
+ throwCommandError("setProxy", res.error);
5344
5378
  }
5345
5379
  /**
5346
5380
  * Returns all open pages (tabs and popups) for this session's browser
@@ -5352,7 +5386,9 @@ var CloudBrowser = class {
5352
5386
  *
5353
5387
  * @returns PageInfo[] for every page currently open in the context
5354
5388
  *
5355
- * @throws UNKNOWN_ERROR - the pages could not be enumerated
5389
+ * Rejects only on a transport failure - a dead session, a page that is gone,
5390
+ * a broken connection. This call has no semantic failure of its own, so there
5391
+ * are no error codes to branch on.
5356
5392
  *
5357
5393
  * @example
5358
5394
  * const pages = await browser.getPages();
@@ -5365,6 +5401,7 @@ var CloudBrowser = class {
5365
5401
  apiKey: this.apiKey
5366
5402
  })
5367
5403
  );
5404
+ throwCommandError("getPages", resp.error);
5368
5405
  return resp.pages.map(pageInfoFromProto);
5369
5406
  }
5370
5407
  // ──────────────────────────────────────────────────────────────────
@@ -5383,7 +5420,16 @@ var CloudBrowser = class {
5383
5420
  * @returns NavigateResult with the final resolved URL and the frameId
5384
5421
  * of the main frame after navigation
5385
5422
  *
5386
- * @throws UNKNOWN_ERROR - the navigation failed or timed out
5423
+ * @throws timeout - nothing committed before the deadline; the page may still
5424
+ * be loading, so a longer timeout can be the whole fix
5425
+ * @throws net_error - the URL never loaded: DNS, TLS, a refused connection, or
5426
+ * a proxy that could not reach it. The message carries the underlying net
5427
+ * error name, which is what separates a bad proxy from a bad host - worth
5428
+ * logging, since the two need different fixes
5429
+ * @throws crashed - the renderer died mid-navigation; the page is unusable and
5430
+ * has to be navigated again
5431
+ *
5432
+ * @see {@link CommandError} for reading the code off the rejection
5387
5433
  *
5388
5434
  * @example
5389
5435
  * await browser.navigate("https://example.com");
@@ -5396,6 +5442,7 @@ var CloudBrowser = class {
5396
5442
  });
5397
5443
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
5398
5444
  const resp = await this.client.navigate(req);
5445
+ throwCommandError("navigate", resp.error);
5399
5446
  return { frameId: resp.frameId, url: resp.url };
5400
5447
  }
5401
5448
  /**
@@ -5410,7 +5457,11 @@ var CloudBrowser = class {
5410
5457
  * @param html - response body to serve
5411
5458
  * @param opts - optional headers and statusCode (default 200)
5412
5459
  *
5413
- * @throws UNKNOWN_ERROR - the interceptor could not be installed
5460
+ * @throws timeout - the page never requested the URL, so the prepared
5461
+ * response had nobody to hand it to; usually the navigation was cancelled
5462
+ * or redirected away before reaching it
5463
+ *
5464
+ * @see {@link CommandError} for reading the code off the rejection
5414
5465
  *
5415
5466
  * @example
5416
5467
  * await browser.loadHTML("https://example.com", "<h1>hi</h1>");
@@ -5425,7 +5476,8 @@ var CloudBrowser = class {
5425
5476
  headers: headersToProto(opts?.headers)
5426
5477
  });
5427
5478
  if (opts?.statusCode) req.statusCode = opts.statusCode;
5428
- await this.client.loadHTML(req);
5479
+ const res = await this.client.loadHTML(req);
5480
+ throwCommandError("loadHTML", res.error);
5429
5481
  }
5430
5482
  // ──────────────────────────────────────────────────────────────────
5431
5483
  // Evaluation
@@ -5442,16 +5494,34 @@ var CloudBrowser = class {
5442
5494
  * The generic T is a TypeScript hint only — there is no runtime
5443
5495
  * validation that the JS expression actually returned that type.
5444
5496
  *
5497
+ * A falsy answer and a broken expression are different outcomes. Returning
5498
+ * null, false or undefined is a successful evaluation and resolves normally;
5499
+ * an expression that throws or will not compile rejects with a
5500
+ * {@link CommandError}, so a typo can never read as "the page says null".
5501
+ *
5445
5502
  * @param expression - JavaScript expression evaluated in the main frame
5446
5503
  *
5447
5504
  * @returns EvaluateResult with either value (non-Element) or element
5448
5505
  * metadata (Element)
5449
5506
  *
5450
- * @throws UNKNOWN_ERROR - the expression threw or could not be compiled
5507
+ * @throws {@link CommandError} - code `"threw"` (the expression raised; the
5508
+ * message carries the exception text), `"not_run"` (it could not be
5509
+ * compiled, or execution never started), `"aborted"` (the browser stopped
5510
+ * execution) or `"no_context"` (the frame had no live script context)
5451
5511
  *
5452
5512
  * @example
5453
5513
  * const res = await browser.evaluate<string>("document.title");
5454
5514
  * console.log(res.value);
5515
+ *
5516
+ * @example
5517
+ * // Telling a false answer from a broken expression.
5518
+ * try {
5519
+ * const res = await browser.evaluate<boolean>("window.__ready === true");
5520
+ * if (!res.value) { /* legitimately not ready yet *\/ }
5521
+ * } catch (e) {
5522
+ * if (e instanceof CommandError) throw new Error(`expression broken: ${e.message}`);
5523
+ * throw e;
5524
+ * }
5455
5525
  */
5456
5526
  async evaluate(expression) {
5457
5527
  return this._evaluate("", expression);
@@ -5483,6 +5553,13 @@ var CloudBrowser = class {
5483
5553
  });
5484
5554
  if (frameId) req.frameId = frameId;
5485
5555
  const resp = await this.client.evaluate(req);
5556
+ if (resp.error) {
5557
+ throw new CommandError({
5558
+ command: "evaluate",
5559
+ code: resp.error.code,
5560
+ message: resp.error.message
5561
+ });
5562
+ }
5486
5563
  let value = null;
5487
5564
  if (resp.result !== "") {
5488
5565
  try {
@@ -5492,6 +5569,7 @@ var CloudBrowser = class {
5492
5569
  }
5493
5570
  }
5494
5571
  return {
5572
+ success: resp.success,
5495
5573
  value,
5496
5574
  backendNodeId: resp.backendNodeId,
5497
5575
  isVisible: resp.isVisible,
@@ -5579,7 +5657,8 @@ var CloudBrowser = class {
5579
5657
  sessionId: this.sessionId,
5580
5658
  apiKey: this.apiKey,
5581
5659
  conditions: pbConds,
5582
- timeout: opts?.timeoutMs ?? DefaultWaitTimeoutMs
5660
+ // Left unset unless the caller passed one, so the API applies its default.
5661
+ timeout: opts?.timeoutMs
5583
5662
  });
5584
5663
  if (frameId) req.frameId = frameId;
5585
5664
  return unwrapWait(await this.client.waitForAny(req));
@@ -5893,7 +5972,9 @@ var CloudBrowser = class {
5893
5972
  * @returns DOMResult with the JSON string in `.dom` (the `.hash` field
5894
5973
  * is populated by {@link getDOMHash}, not by this call)
5895
5974
  *
5896
- * @throws UNKNOWN_ERROR - the DOM could not be retrieved
5975
+ * Rejects only on a transport failure - a dead session, a page that is gone,
5976
+ * a broken connection. This call has no semantic failure of its own, so there
5977
+ * are no error codes to branch on.
5897
5978
  *
5898
5979
  * @example
5899
5980
  * const { dom } = await browser.getDOM();
@@ -5906,6 +5987,7 @@ var CloudBrowser = class {
5906
5987
  if (frameId) req.frameId = frameId;
5907
5988
  if (opts?.depth !== void 0) req.depth = opts.depth;
5908
5989
  const resp = await this.client.getDOM(req);
5990
+ throwCommandError("getDOM", resp.error);
5909
5991
  return { hash: "", dom: resp.dom };
5910
5992
  }
5911
5993
  /**
@@ -5920,7 +6002,9 @@ var CloudBrowser = class {
5920
6002
  *
5921
6003
  * @returns 16-char hex string (the first 8 bytes of sha256 of the DOM JSON)
5922
6004
  *
5923
- * @throws UNKNOWN_ERROR - the hash could not be computed
6005
+ * Rejects only on a transport failure. The hash is computed from a serialized
6006
+ * tree, so there is no semantic failure of its own and no error codes to branch
6007
+ * on.
5924
6008
  *
5925
6009
  * @example
5926
6010
  * const hash = await browser.getDOMHash();
@@ -5968,7 +6052,11 @@ var CloudBrowser = class {
5968
6052
  *
5969
6053
  * @returns the observation in the requested format, ready to hand to a model
5970
6054
  *
5971
- * @throws UNKNOWN_ERROR - the observation could not be produced
6055
+ * @throws not_found - the requested scope root is not on the page, so there
6056
+ * was nothing to observe. Distinct from an observation that comes back
6057
+ * empty, which means the scope exists and holds nothing worth reporting
6058
+ *
6059
+ * @see {@link CommandError} for reading the code off the rejection
5972
6060
  *
5973
6061
  * @example
5974
6062
  * const obs = await browser.getObservation();
@@ -5992,6 +6080,7 @@ var CloudBrowser = class {
5992
6080
  if (opts?.jsExpression !== void 0) req.jsExpression = opts.jsExpression;
5993
6081
  if (opts?.frameId !== void 0) req.frameId = opts.frameId;
5994
6082
  const resp = await this.client.getObservation(req);
6083
+ throwCommandError("getObservation", resp.error);
5995
6084
  return resp.observation;
5996
6085
  }
5997
6086
  /**
@@ -6008,7 +6097,11 @@ var CloudBrowser = class {
6008
6097
  * @returns ScreenshotResult with the base64 image in `dataBase64` and the
6009
6098
  * physical pixel `width`/`height`
6010
6099
  *
6011
- * @throws UNKNOWN_ERROR - the screenshot could not be captured
6100
+ * @throws capture_failed - the page had no frame to copy. A page that has not
6101
+ * produced one yet, or is not being composited at the moment, has nothing to
6102
+ * hand over; retrying after it renders usually works
6103
+ *
6104
+ * @see {@link CommandError} for reading the code off the rejection
6012
6105
  *
6013
6106
  * @example
6014
6107
  * const shot = await browser.screenshot({ format: "png" });
@@ -6022,6 +6115,7 @@ var CloudBrowser = class {
6022
6115
  if (opts?.format !== void 0) req.format = opts.format;
6023
6116
  if (opts?.quality !== void 0) req.quality = opts.quality;
6024
6117
  const resp = await this.client.screenshot(req);
6118
+ throwCommandError("screenshot", resp.error);
6025
6119
  return {
6026
6120
  dataBase64: resp.dataBase64,
6027
6121
  width: resp.width,
@@ -6045,11 +6139,15 @@ var CloudBrowser = class {
6045
6139
  * canvas `width`/`height`, resolved `frameId`/`backendNodeId` and the
6046
6140
  * `originClean` flag
6047
6141
  *
6048
- * @throws INVALID_LOCATOR - target is empty, uses at(x,y), or has multiple targets
6049
- * @throws ELEMENT_NOT_FOUND - no element matched the locator
6050
- * @throws FRAME_NOT_FOUND - the requested frame does not exist
6051
- * @throws TIMEOUT - the operation exceeded the server-side timeout
6052
- * @throws PAGE_NOT_ALIVE - the page has been closed
6142
+ * @throws not_found - no element matched the locator
6143
+ * @throws not_element - the expression was truthy but did not yield an element
6144
+ * @throws not_readable - the target was found but is not a readable canvas
6145
+ *
6146
+ * A target that is empty, uses `at(x, y)` or names several things at once is
6147
+ * rejected before anything is sent. A closed page or a frame that is gone is a
6148
+ * transport failure rather than a code.
6149
+ *
6150
+ * @see {@link CommandError} for reading the code off the rejection
6053
6151
  *
6054
6152
  * @example
6055
6153
  * const res = await browser.readCanvas(css("#game canvas"));
@@ -6077,6 +6175,7 @@ var CloudBrowser = class {
6077
6175
  req.sh = opts.sh;
6078
6176
  }
6079
6177
  const resp = await this.client.readCanvas(req);
6178
+ throwCommandError("readCanvas", resp.error);
6080
6179
  return {
6081
6180
  success: resp.success,
6082
6181
  frameId: resp.frameId,
@@ -6100,7 +6199,9 @@ var CloudBrowser = class {
6100
6199
  *
6101
6200
  * @param patterns - URL wildcards to block; empty array clears the list
6102
6201
  *
6103
- * @throws UNKNOWN_ERROR - the blocklist could not be applied
6202
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6203
+ * a broken connection. This call has no semantic failure of its own, so there
6204
+ * are no error codes to branch on.
6104
6205
  *
6105
6206
  * @example
6106
6207
  * await browser.setBlockList([
@@ -6109,13 +6210,14 @@ var CloudBrowser = class {
6109
6210
  * ]);
6110
6211
  */
6111
6212
  async setBlockList(patterns) {
6112
- await this.client.setBlockList(
6213
+ const res = await this.client.setBlockList(
6113
6214
  create(SetBlockListRequestSchema, {
6114
6215
  sessionId: this.sessionId,
6115
6216
  apiKey: this.apiKey,
6116
6217
  patterns
6117
6218
  })
6118
6219
  );
6220
+ throwCommandError("setBlockList", res.error);
6119
6221
  }
6120
6222
  /**
6121
6223
  * Configures the session to serve cached static responses for requests
@@ -6129,13 +6231,15 @@ var CloudBrowser = class {
6129
6231
  * @param blobName - server-side identifier of the snapshot to serve from
6130
6232
  * @param patterns - URL wildcards to redirect to the cache; empty disables
6131
6233
  *
6132
- * @throws UNKNOWN_ERROR - the static paths could not be configured
6234
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6235
+ * a broken connection. This call has no semantic failure of its own, so there
6236
+ * are no error codes to branch on.
6133
6237
  *
6134
6238
  * @example
6135
6239
  * await browser.setStaticPaths("snap-2026-05", ["*.example.com/*"]);
6136
6240
  */
6137
6241
  async setStaticPaths(blobName, patterns) {
6138
- await this.client.setStaticPaths(
6242
+ const res = await this.client.setStaticPaths(
6139
6243
  create(SetStaticPathsRequestSchema, {
6140
6244
  sessionId: this.sessionId,
6141
6245
  apiKey: this.apiKey,
@@ -6143,6 +6247,7 @@ var CloudBrowser = class {
6143
6247
  patterns
6144
6248
  })
6145
6249
  );
6250
+ throwCommandError("setStaticPaths", res.error);
6146
6251
  }
6147
6252
  /**
6148
6253
  * Blocks until the next request whose URL matches one of the supplied
@@ -6159,7 +6264,12 @@ var CloudBrowser = class {
6159
6264
  * (the captured method/URL/headers/body; null if intercepted with
6160
6265
  * no body)
6161
6266
  *
6162
- * @throws UNKNOWN_ERROR - the wait timed out or no patterns were supplied
6267
+ * @throws timeout - no request matched any pattern before the deadline.
6268
+ * Nothing occurring is an answer, and it stays distinguishable from a
6269
+ * connection that died on the way. Supplying no patterns is a caller mistake
6270
+ * rather than an outcome, and rejects separately
6271
+ *
6272
+ * @see {@link CommandError} for reading the code off the rejection
6163
6273
  *
6164
6274
  * @example
6165
6275
  * const { index, request } = await browser.waitForAnyRequest(
@@ -6181,6 +6291,7 @@ var CloudBrowser = class {
6181
6291
  });
6182
6292
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6183
6293
  const resp = await this.client.waitForAnyRequest(req);
6294
+ throwCommandError("waitForAnyRequest", resp.error);
6184
6295
  return {
6185
6296
  index: resp.index,
6186
6297
  request: interceptedRequestFromProto(resp.request)
@@ -6199,6 +6310,13 @@ var CloudBrowser = class {
6199
6310
  * @returns object with `index` (matched pattern index) and `response`
6200
6311
  * (the captured status/headers/body; null if no body was returned)
6201
6312
  *
6313
+ * @throws timeout - no response matched any pattern before the deadline.
6314
+ * Nothing occurring is an answer, and it stays distinguishable from a
6315
+ * connection that died on the way. Supplying no patterns is a caller mistake
6316
+ * rather than an outcome, and rejects separately
6317
+ *
6318
+ * @see {@link CommandError} for reading the code off the rejection
6319
+ *
6202
6320
  * @example
6203
6321
  * const { index, response } = await browser.waitForAnyResponse(
6204
6322
  * [{ url: "*\/api/login" }],
@@ -6219,6 +6337,7 @@ var CloudBrowser = class {
6219
6337
  });
6220
6338
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6221
6339
  const resp = await this.client.waitForAnyResponse(req);
6340
+ throwCommandError("waitForAnyResponse", resp.error);
6222
6341
  return {
6223
6342
  index: resp.index,
6224
6343
  response: interceptedResponseFromProto(resp.response)
@@ -6240,7 +6359,10 @@ var CloudBrowser = class {
6240
6359
  * were actually sent on the wire after modifications were applied;
6241
6360
  * null when no request payload was reported
6242
6361
  *
6243
- * @throws UNKNOWN_ERROR - no matching request appeared within the timeout
6362
+ * @throws timeout - no matching request appeared before the deadline, so
6363
+ * nothing was modified
6364
+ *
6365
+ * @see {@link CommandError} for reading the code off the rejection
6244
6366
  *
6245
6367
  * @example
6246
6368
  * const req = await browser.modifyRequest("*\/api/me", {
@@ -6262,6 +6384,7 @@ var CloudBrowser = class {
6262
6384
  if (opts?.body) req.body = opts.body;
6263
6385
  if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
6264
6386
  const resp = await this.client.modifyRequest(req);
6387
+ throwCommandError("modifyRequest", resp.error);
6265
6388
  return interceptedRequestFromProto(resp.request);
6266
6389
  }
6267
6390
  // ──────────────────────────────────────────────────────────────────
@@ -6291,7 +6414,9 @@ var CloudBrowser = class {
6291
6414
  * @returns NetworkCapture handle for stopping the capture and inspecting how
6292
6415
  * it ended
6293
6416
  *
6294
- * @throws UNKNOWN_ERROR - the capture could not be started
6417
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6418
+ * a broken connection. This call has no semantic failure of its own, so there
6419
+ * are no error codes to branch on.
6295
6420
  *
6296
6421
  * @example
6297
6422
  * const capture = await browser.captureNetwork(
@@ -6325,10 +6450,12 @@ var CloudBrowser = class {
6325
6450
  *
6326
6451
  * @param opts - which requests to capture and whether to keep bodies
6327
6452
  *
6328
- * @throws UNKNOWN_ERROR - the capture could not be started
6453
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6454
+ * a broken connection. This call has no semantic failure of its own, so there
6455
+ * are no error codes to branch on.
6329
6456
  */
6330
6457
  async startNetworkCapture(opts) {
6331
- await this.client.startNetworkCapture(
6458
+ const res = await this.client.startNetworkCapture(
6332
6459
  create(StartNetworkCaptureRequestSchema, {
6333
6460
  sessionId: this.sessionId,
6334
6461
  apiKey: this.apiKey,
@@ -6337,13 +6464,15 @@ var CloudBrowser = class {
6337
6464
  bodyPatterns: opts.bodyPatterns ?? []
6338
6465
  })
6339
6466
  );
6467
+ throwCommandError("startNetworkCapture", res.error);
6340
6468
  }
6341
6469
  /**
6342
6470
  * Disarms the session's capture.
6343
6471
  *
6344
6472
  * @returns whether a capture was running
6345
6473
  *
6346
- * @throws UNKNOWN_ERROR - the capture could not be stopped
6474
+ * Rejects only on a transport failure. Stopping a capture that is not running
6475
+ * is a no-op rather than a failure, so there are no error codes to branch on.
6347
6476
  */
6348
6477
  async stopNetworkCapture() {
6349
6478
  const resp = await this.client.stopNetworkCapture(
@@ -6352,6 +6481,7 @@ var CloudBrowser = class {
6352
6481
  apiKey: this.apiKey
6353
6482
  })
6354
6483
  );
6484
+ throwCommandError("stopNetworkCapture", resp.error);
6355
6485
  return resp.stopped;
6356
6486
  }
6357
6487
  /**
@@ -6368,7 +6498,8 @@ var CloudBrowser = class {
6368
6498
  * @returns NetworkCapture attached to whatever capture is running; onExchange
6369
6499
  * simply never fires when none is
6370
6500
  *
6371
- * @throws UNKNOWN_ERROR - the subscription could not be opened
6501
+ * Rejects only on a transport failure: opening the subscription has no semantic
6502
+ * failure of its own.
6372
6503
  */
6373
6504
  async streamNetworkExchanges(onExchange) {
6374
6505
  return this.subscribeNetworkExchanges(onExchange);
@@ -6454,7 +6585,10 @@ var CloudBrowser = class {
6454
6585
  * @param onResync called when the copy had to be rebuilt, after the new tree
6455
6586
  * is in place. Rebuilding is automatic; this is for telling the user why
6456
6587
  * their expanded nodes collapsed.
6457
- * @throws UNKNOWN_ERROR - the mirror could not be started
6588
+ * @throws mirror_failed - the page could not be serialized, usually a document
6589
+ * that went away while the tree was being built. No mirror is left running
6590
+ *
6591
+ * @see {@link CommandError} for reading the code off the rejection
6458
6592
  */
6459
6593
  async mirrorDom(opts, onChange, onResync) {
6460
6594
  const abort = new AbortController();
@@ -6504,6 +6638,11 @@ var CloudBrowser = class {
6504
6638
  * Starts (or restarts) the page's mirror and returns the main document,
6505
6639
  * without subscribing to changes. {@link CloudBrowser.mirrorDom} is what you
6506
6640
  * normally want; this is the raw command.
6641
+ *
6642
+ * @throws mirror_failed - the page could not be serialized, usually a document
6643
+ * that went away while the tree was being built. No mirror is left running
6644
+ *
6645
+ * @see {@link CommandError} for reading the code off the rejection
6507
6646
  */
6508
6647
  async startDomMirror(opts = {}) {
6509
6648
  const req = create(StartDomMirrorRequestSchema, {
@@ -6513,6 +6652,7 @@ var CloudBrowser = class {
6513
6652
  if (opts.depth !== void 0) req.depth = opts.depth;
6514
6653
  if (opts.pierce !== void 0) req.pierce = opts.pierce;
6515
6654
  const resp = await this.client.startDomMirror(req);
6655
+ throwCommandError("startDomMirror", resp.error);
6516
6656
  return {
6517
6657
  root: resp.root,
6518
6658
  frameId: resp.frameId,
@@ -6521,12 +6661,13 @@ var CloudBrowser = class {
6521
6661
  }
6522
6662
  /** Stops the page's mirror, every frame of it. Idempotent. */
6523
6663
  async stopDomMirror() {
6524
- await this.client.stopDomMirror(
6664
+ const res = await this.client.stopDomMirror(
6525
6665
  create(StopDomMirrorRequestSchema, {
6526
6666
  sessionId: this.sessionId,
6527
6667
  apiKey: this.apiKey
6528
6668
  })
6529
6669
  );
6670
+ throwCommandError("stopDomMirror", res.error);
6530
6671
  }
6531
6672
  /**
6532
6673
  * Fetches a node's children and starts reporting changes inside them.
@@ -6534,6 +6675,17 @@ var CloudBrowser = class {
6534
6675
  *
6535
6676
  * On an `<iframe>` the one child is the document it hosts, and this call is
6536
6677
  * what starts mirroring that frame.
6678
+ *
6679
+ * An id that is simply unknown is not a failure: the call resolves with an
6680
+ * empty result.
6681
+ *
6682
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of the
6683
+ * one it has; start a mirror first, and after a resync fetch the current tree
6684
+ * before addressing nodes again
6685
+ * @throws mirror_failed - the subtree could not be serialized, usually a
6686
+ * document that went away mid-read
6687
+ *
6688
+ * @see {@link CommandError} for reading the code off the rejection
6537
6689
  */
6538
6690
  async getDomChildren(backendNodeId, frameId = "", depth) {
6539
6691
  const req = create(GetDomChildrenRequestSchema, {
@@ -6544,11 +6696,19 @@ var CloudBrowser = class {
6544
6696
  if (frameId) req.frameId = frameId;
6545
6697
  if (depth !== void 0) req.depth = depth;
6546
6698
  const resp = await this.client.getDomChildren(req);
6699
+ throwCommandError("getDomChildren", resp.error);
6547
6700
  return { children: resp.children, seq: Number(resp.seq) };
6548
6701
  }
6549
6702
  /**
6550
6703
  * Stops reporting changes inside a node, and inside any frame below it.
6551
6704
  * {@link DomMirror.collapse} calls this.
6705
+ *
6706
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of
6707
+ * the one it has; this is what replaying ids from a tree that has since
6708
+ * been resynced looks like, so fetch the current tree and address the node
6709
+ * again
6710
+ *
6711
+ * @see {@link CommandError} for reading the code off the rejection
6552
6712
  */
6553
6713
  async releaseDomSubtree(backendNodeId, frameId = "") {
6554
6714
  const req = create(ReleaseDomSubtreeRequestSchema, {
@@ -6557,13 +6717,24 @@ var CloudBrowser = class {
6557
6717
  backendNodeId
6558
6718
  });
6559
6719
  if (frameId) req.frameId = frameId;
6560
- await this.client.releaseDomSubtree(req);
6720
+ const res = await this.client.releaseDomSubtree(req);
6721
+ throwCommandError("releaseDomSubtree", res.error);
6561
6722
  }
6562
6723
  /**
6563
6724
  * Returns the chain from the main document down to a node, each ancestor
6564
6725
  * with its own children, crossing into frames where it has to and starting
6565
6726
  * the ones it passes through. {@link DomMirror.reveal} calls this and
6566
6727
  * splices it in.
6728
+ *
6729
+ * An id that is simply unknown is not a failure: the call resolves with an
6730
+ * empty result.
6731
+ *
6732
+ * @throws not_mirrored - the page has no mirror, or frameId is not part of the
6733
+ * one it has
6734
+ * @throws mirror_failed - the path could not be serialized, usually a document
6735
+ * that went away mid-read
6736
+ *
6737
+ * @see {@link CommandError} for reading the code off the rejection
6567
6738
  */
6568
6739
  async revealDomNode(backendNodeId, frameId = "") {
6569
6740
  const req = create(RevealDomNodeRequestSchema, {
@@ -6573,6 +6744,7 @@ var CloudBrowser = class {
6573
6744
  });
6574
6745
  if (frameId) req.frameId = frameId;
6575
6746
  const resp = await this.client.revealDomNode(req);
6747
+ throwCommandError("revealDomNode", resp.error);
6576
6748
  return { path: resp.path, seq: Number(resp.seq) };
6577
6749
  }
6578
6750
  /**
@@ -6584,6 +6756,10 @@ var CloudBrowser = class {
6584
6756
  * whole tree just to hash it. The two answer different questions: a hash
6585
6757
  * compares content, a revision only says whether this document moved since
6586
6758
  * you last asked.
6759
+ *
6760
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6761
+ * a broken connection. This call has no semantic failure of its own, so there
6762
+ * are no error codes to branch on.
6587
6763
  */
6588
6764
  async getDomRevision(frameId = "") {
6589
6765
  const req = create(GetDomRevisionRequestSchema, {
@@ -6592,6 +6768,7 @@ var CloudBrowser = class {
6592
6768
  });
6593
6769
  if (frameId) req.frameId = frameId;
6594
6770
  const resp = await this.client.getDomRevision(req);
6771
+ throwCommandError("getDomRevision", resp.error);
6595
6772
  return Number(resp.revision);
6596
6773
  }
6597
6774
  // ──────────────────────────────────────────────────────────────────
@@ -6602,7 +6779,9 @@ var CloudBrowser = class {
6602
6779
  *
6603
6780
  * @returns CookieParam[], one per cookie in the context
6604
6781
  *
6605
- * @throws UNKNOWN_ERROR - the cookies could not be read
6782
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6783
+ * a broken connection. This call has no semantic failure of its own, so there
6784
+ * are no error codes to branch on.
6606
6785
  *
6607
6786
  * @example
6608
6787
  * const cookies = await browser.getCookies();
@@ -6615,6 +6794,7 @@ var CloudBrowser = class {
6615
6794
  apiKey: this.apiKey
6616
6795
  })
6617
6796
  );
6797
+ throwCommandError("getCookies", resp.error);
6618
6798
  return resp.cookies.map(cookieParamFromProto);
6619
6799
  }
6620
6800
  /**
@@ -6625,7 +6805,9 @@ var CloudBrowser = class {
6625
6805
  *
6626
6806
  * @param cookies - cookies to write; empty array is a no-op
6627
6807
  *
6628
- * @throws UNKNOWN_ERROR - the cookies could not be written
6808
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6809
+ * a broken connection. This call has no semantic failure of its own, so there
6810
+ * are no error codes to branch on.
6629
6811
  *
6630
6812
  * @example
6631
6813
  * await browser.setCookies([
@@ -6633,29 +6815,33 @@ var CloudBrowser = class {
6633
6815
  * ]);
6634
6816
  */
6635
6817
  async setCookies(cookies) {
6636
- await this.client.setCookies(
6818
+ const res = await this.client.setCookies(
6637
6819
  create(SetCookiesRequestSchema, {
6638
6820
  sessionId: this.sessionId,
6639
6821
  apiKey: this.apiKey,
6640
6822
  cookies: cookieParamsToProto(cookies)
6641
6823
  })
6642
6824
  );
6825
+ throwCommandError("setCookies", res.error);
6643
6826
  }
6644
6827
  /**
6645
6828
  * Deletes every cookie in the browser context.
6646
6829
  *
6647
- * @throws UNKNOWN_ERROR - the cookies could not be cleared
6830
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6831
+ * a broken connection. This call has no semantic failure of its own, so there
6832
+ * are no error codes to branch on.
6648
6833
  *
6649
6834
  * @example
6650
6835
  * await browser.clearCookies();
6651
6836
  */
6652
6837
  async clearCookies() {
6653
- await this.client.clearCookies(
6838
+ const res = await this.client.clearCookies(
6654
6839
  create(ClearCookiesRequestSchema, {
6655
6840
  sessionId: this.sessionId,
6656
6841
  apiKey: this.apiKey
6657
6842
  })
6658
6843
  );
6844
+ throwCommandError("clearCookies", res.error);
6659
6845
  }
6660
6846
  // ──────────────────────────────────────────────────────────────────
6661
6847
  // Storage (localStorage)
@@ -6673,7 +6859,9 @@ var CloudBrowser = class {
6673
6859
  *
6674
6860
  * @returns StorageOriginEntry[], one per origin with localStorage data
6675
6861
  *
6676
- * @throws UNKNOWN_ERROR - the storage could not be read
6862
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6863
+ * a broken connection. This call has no semantic failure of its own, so there
6864
+ * are no error codes to branch on.
6677
6865
  *
6678
6866
  * @example
6679
6867
  * const storage = await browser.getStorage();
@@ -6688,6 +6876,7 @@ var CloudBrowser = class {
6688
6876
  });
6689
6877
  if (origin) req.origin = origin;
6690
6878
  const resp = await this.client.getStorage(req);
6879
+ throwCommandError("getStorage", resp.error);
6691
6880
  return resp.storage.map(storageEntryFromProto);
6692
6881
  }
6693
6882
  /**
@@ -6701,7 +6890,9 @@ var CloudBrowser = class {
6701
6890
  *
6702
6891
  * @param storage - entries to write, grouped by origin
6703
6892
  *
6704
- * @throws UNKNOWN_ERROR - the storage could not be written
6893
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6894
+ * a broken connection. This call has no semantic failure of its own, so there
6895
+ * are no error codes to branch on.
6705
6896
  *
6706
6897
  * @example
6707
6898
  * await browser.setStorage([
@@ -6715,13 +6906,14 @@ var CloudBrowser = class {
6715
6906
  * ]);
6716
6907
  */
6717
6908
  async setStorage(storage) {
6718
- await this.client.setStorage(
6909
+ const res = await this.client.setStorage(
6719
6910
  create(SetStorageRequestSchema, {
6720
6911
  sessionId: this.sessionId,
6721
6912
  apiKey: this.apiKey,
6722
6913
  storage: storageEntriesToProto(storage)
6723
6914
  })
6724
6915
  );
6916
+ throwCommandError("setStorage", res.error);
6725
6917
  }
6726
6918
  /**
6727
6919
  * Deletes localStorage in the browser context.
@@ -6729,7 +6921,9 @@ var CloudBrowser = class {
6729
6921
  * @param origin - if set, only this origin's storage is deleted
6730
6922
  * (e.g. "https://example.com"); omit to delete all origins
6731
6923
  *
6732
- * @throws UNKNOWN_ERROR - the storage could not be cleared
6924
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6925
+ * a broken connection. This call has no semantic failure of its own, so there
6926
+ * are no error codes to branch on.
6733
6927
  *
6734
6928
  * @example
6735
6929
  * // Wipe one origin.
@@ -6744,7 +6938,8 @@ var CloudBrowser = class {
6744
6938
  apiKey: this.apiKey
6745
6939
  });
6746
6940
  if (origin) req.origin = origin;
6747
- await this.client.clearStorage(req);
6941
+ const res = await this.client.clearStorage(req);
6942
+ throwCommandError("clearStorage", res.error);
6748
6943
  }
6749
6944
  // ──────────────────────────────────────────────────────────────────
6750
6945
  // Auth / DBSC (portable signed-in persona)
@@ -6759,7 +6954,9 @@ var CloudBrowser = class {
6759
6954
  *
6760
6955
  * @returns AuthSession, or undefined when there is nothing to export
6761
6956
  *
6762
- * @throws UNKNOWN_ERROR - the auth session could not be read
6957
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6958
+ * a broken connection. This call has no semantic failure of its own, so there
6959
+ * are no error codes to branch on.
6763
6960
  *
6764
6961
  * @example
6765
6962
  * const auth = await browser.getAuthSession();
@@ -6772,6 +6969,7 @@ var CloudBrowser = class {
6772
6969
  apiKey: this.apiKey
6773
6970
  })
6774
6971
  );
6972
+ throwCommandError("getAuthSession", resp.error);
6775
6973
  return resp.session ? authSessionFromProto(resp.session) : void 0;
6776
6974
  }
6777
6975
  /**
@@ -6783,20 +6981,23 @@ var CloudBrowser = class {
6783
6981
  *
6784
6982
  * @param session - session as returned by getAuthSession()
6785
6983
  *
6786
- * @throws UNKNOWN_ERROR - the auth session could not be written
6984
+ * Rejects only on a transport failure - a dead session, a page that is gone,
6985
+ * a broken connection. This call has no semantic failure of its own, so there
6986
+ * are no error codes to branch on.
6787
6987
  *
6788
6988
  * @example
6789
6989
  * await browser.setAuthSession(saved);
6790
6990
  * await browser.navigate("https://mail.google.com");
6791
6991
  */
6792
6992
  async setAuthSession(session) {
6793
- await this.client.setAuthSession(
6993
+ const res = await this.client.setAuthSession(
6794
6994
  create(SetAuthSessionRequestSchema, {
6795
6995
  sessionId: this.sessionId,
6796
6996
  apiKey: this.apiKey,
6797
6997
  session: authSessionToProto(session)
6798
6998
  })
6799
6999
  );
7000
+ throwCommandError("setAuthSession", res.error);
6800
7001
  }
6801
7002
  // ──────────────────────────────────────────────────────────────────
6802
7003
  // Devtools / live-UI helpers
@@ -6816,7 +7017,9 @@ var CloudBrowser = class {
6816
7017
  * @returns InspectResult with the resolved backendNodeId, frameId, tag
6817
7018
  * name, trimmed textContent, visibility and bounds
6818
7019
  *
6819
- * @throws UNKNOWN_ERROR - the hit-test failed
7020
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7021
+ * a broken connection. This call has no semantic failure of its own, so there
7022
+ * are no error codes to branch on.
6820
7023
  *
6821
7024
  * @example
6822
7025
  * const r = await browser.inspectAtPosition(200, 300);
@@ -6831,6 +7034,7 @@ var CloudBrowser = class {
6831
7034
  y
6832
7035
  })
6833
7036
  );
7037
+ throwCommandError("inspectAtPosition", resp.error);
6834
7038
  return {
6835
7039
  backendNodeId: resp.backendNodeId,
6836
7040
  frameId: resp.frameId,
@@ -6850,7 +7054,9 @@ var CloudBrowser = class {
6850
7054
  * @param frameId - id of the frame the node lives in; empty string
6851
7055
  * targets the main frame
6852
7056
  *
6853
- * @throws UNKNOWN_ERROR - the highlight could not be applied
7057
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7058
+ * a broken connection. This call has no semantic failure of its own, so there
7059
+ * are no error codes to branch on.
6854
7060
  *
6855
7061
  * @example
6856
7062
  * await browser.highlightNode(res.backendNodeId, res.frameId);
@@ -6862,7 +7068,8 @@ var CloudBrowser = class {
6862
7068
  backendNodeId
6863
7069
  });
6864
7070
  if (frameId) req.frameId = frameId;
6865
- await this.client.highlightNode(req);
7071
+ const res = await this.client.highlightNode(req);
7072
+ throwCommandError("highlight", res.error);
6866
7073
  }
6867
7074
  /**
6868
7075
  * Pastes text at the current caret using IME-style input.
@@ -6874,19 +7081,24 @@ var CloudBrowser = class {
6874
7081
  *
6875
7082
  * @param text - the text to insert at the caret
6876
7083
  *
6877
- * @throws UNKNOWN_ERROR - the text could not be inserted
7084
+ * @throws no_focus - nothing in the page holds focus, so there is no caret to
7085
+ * insert at; click the field first
7086
+ * @throws busy - another action is already running on this page
7087
+ *
7088
+ * @see {@link CommandError} for reading the code off the rejection
6878
7089
  *
6879
7090
  * @example
6880
7091
  * await browser.insertText("hello world");
6881
7092
  */
6882
7093
  async insertText(text) {
6883
- await this.client.insertText(
7094
+ const res = await this.client.insertText(
6884
7095
  create(InsertTextRequestSchema, {
6885
7096
  sessionId: this.sessionId,
6886
7097
  apiKey: this.apiKey,
6887
7098
  text
6888
7099
  })
6889
7100
  );
7101
+ throwCommandError("insertText", res.error);
6890
7102
  }
6891
7103
  /**
6892
7104
  * Types `text` into the currently focused element as a per-key stream of real
@@ -6908,7 +7120,10 @@ var CloudBrowser = class {
6908
7120
  * @param opts - optional: `clearFirst` clears the focused field (Ctrl+A,
6909
7121
  * Delete) before typing
6910
7122
  *
6911
- * @throws UNKNOWN_ERROR - the page/context was torn down mid-stream
7123
+ * `type` has no semantic failure of its own: the keys land wherever focus
7124
+ * happens to be, so there is no target it can miss. Only the page or context
7125
+ * being torn down mid-stream surfaces, and that is a transport failure rather
7126
+ * than a code.
6912
7127
  *
6913
7128
  * @example
6914
7129
  * // OTP field that auto-advances across boxes.
@@ -6922,7 +7137,7 @@ var CloudBrowser = class {
6922
7137
  text
6923
7138
  });
6924
7139
  if (opts?.clearFirst) req.clearFirst = true;
6925
- await this.client.type(req);
7140
+ throwCommandError("type", (await this.client.type(req)).error);
6926
7141
  }
6927
7142
  /**
6928
7143
  * Fires a single key-down event.
@@ -6937,7 +7152,11 @@ var CloudBrowser = class {
6937
7152
  * `modifiers` (bit-flag: Alt=1, Ctrl=2, Meta=4, Shift=8),
6938
7153
  * `location` (0=standard, 1=left, 2=right, 3=numpad)
6939
7154
  *
6940
- * @throws UNKNOWN_ERROR - the event could not be dispatched
7155
+ * @throws no_focus - nothing in the page holds focus, so the key has nowhere
7156
+ * to go; click the field first
7157
+ * @throws busy - another action is already running on this page
7158
+ *
7159
+ * @see {@link CommandError} for reading the code off the rejection
6941
7160
  *
6942
7161
  * @example
6943
7162
  * // Ctrl+A
@@ -6953,7 +7172,8 @@ var CloudBrowser = class {
6953
7172
  if (opts?.code) req.code = opts.code;
6954
7173
  if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
6955
7174
  if (opts?.location !== void 0) req.location = opts.location;
6956
- await this.client.pressKey(req);
7175
+ const res = await this.client.pressKey(req);
7176
+ throwCommandError("pressKey", res.error);
6957
7177
  }
6958
7178
  /**
6959
7179
  * Fires a single key-up event.
@@ -6976,7 +7196,8 @@ var CloudBrowser = class {
6976
7196
  if (opts?.code) req.code = opts.code;
6977
7197
  if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
6978
7198
  if (opts?.location !== void 0) req.location = opts.location;
6979
- await this.client.releaseKey(req);
7199
+ const res = await this.client.releaseKey(req);
7200
+ throwCommandError("releaseKey", res.error);
6980
7201
  }
6981
7202
  /**
6982
7203
  * Returns the current text selection.
@@ -6987,7 +7208,9 @@ var CloudBrowser = class {
6987
7208
  *
6988
7209
  * @returns the selected text, or `""` when nothing is selected
6989
7210
  *
6990
- * @throws UNKNOWN_ERROR - the selection could not be read
7211
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7212
+ * a broken connection. This call has no semantic failure of its own, so there
7213
+ * are no error codes to branch on.
6991
7214
  *
6992
7215
  * @example
6993
7216
  * const sel = await browser.getSelection();
@@ -7000,32 +7223,35 @@ var CloudBrowser = class {
7000
7223
  apiKey: this.apiKey
7001
7224
  })
7002
7225
  );
7226
+ throwCommandError("getSelection", resp.error);
7003
7227
  return resp.text;
7004
7228
  }
7005
7229
  // ──────────────────────────────────────────────────────────────────
7006
7230
  // Captcha solver
7007
7231
  // ──────────────────────────────────────────────────────────────────
7008
7232
  /**
7009
- * Detects and solves the first supported bot-challenge it finds
7010
- * anywhere on the page.
7011
- *
7012
- * Detection covers the common challenge types you run into in the
7013
- * wild. The challenge is completed in-page server-side (the resulting
7014
- * token / bypass cookies are wired into the page automatically), so
7015
- * callers can ignore the returned string.
7016
- *
7017
- * @param opts - optional `timeoutMs` (how long to wait for a captcha to
7018
- * appear; omit for server default 60s) and `retryAmount` (failures
7019
- * tolerated before giving up)
7020
- *
7021
- * @returns empty string on success — the solution is applied server-side
7022
- *
7023
- * @throws UNKNOWN_ERROR - no captcha appeared within timeoutMs, or the
7024
- * detected captcha could not be solved within retryAmount attempts
7025
- *
7026
- * @example
7027
- * await browser.solveCaptcha({ retryAmount: 2 });
7028
- */
7233
+ * Detects and solves the first supported bot-challenge it finds
7234
+ * anywhere on the page.
7235
+ *
7236
+ * Detection covers the common challenge types you run into in the
7237
+ * wild. The challenge is completed in-page server-side (the resulting
7238
+ * token / bypass cookies are wired into the page automatically), so
7239
+ * callers can ignore the returned string.
7240
+ *
7241
+ * @param opts - optional `timeoutMs` (how long to wait for a captcha to
7242
+ * appear; omit for server default 60s) and `retryAmount` (failures
7243
+ * tolerated before giving up)
7244
+ *
7245
+ * @returns empty string on success — the solution is applied server-side
7246
+ *
7247
+ * Rejects when no captcha appeared within imeoutMs, or when the one that did
7248
+ * could not be solved within
7249
+ etryAmount attempts. Neither carries a code:
7250
+ * solving runs outside the page, so there is no per-command code set here.
7251
+ *
7252
+ * @example
7253
+ * await browser.solveCaptcha({ retryAmount: 2 });
7254
+ */
7029
7255
  async solveCaptcha(opts) {
7030
7256
  const resp = await this.client.solveCaptcha(
7031
7257
  create(SolveCaptchaRequestSchema, {
@@ -7051,7 +7277,8 @@ var CloudBrowser = class {
7051
7277
  *
7052
7278
  * @returns the ICE servers for the client `RTCPeerConnection`
7053
7279
  *
7054
- * @throws UNKNOWN_ERROR - TURN is not configured on the server
7280
+ * Rejects when TURN is not configured on the server. That is a deployment
7281
+ * condition rather than a per-call outcome, so it carries no code.
7055
7282
  *
7056
7283
  * @example
7057
7284
  * const ice = await browser.getStreamConfig();
@@ -7080,8 +7307,16 @@ var CloudBrowser = class {
7080
7307
  * @returns the SDP answer to apply as the remote description, plus the
7081
7308
  * viewport to map input coordinates into
7082
7309
  *
7083
- * @throws UNKNOWN_ERROR - the offer was empty, TURN is unconfigured, or the
7084
- * browser could not negotiate the stream
7310
+ * @throws already_active - a stream is already running on this session; stop it
7311
+ * before starting another
7312
+ * @throws negotiation_failed - the browser could not agree on a connection. The
7313
+ * message carries the negotiator's own diagnostic, which is usually where the
7314
+ * actual cause is
7315
+ *
7316
+ * An empty offer or an unconfigured TURN setup is a caller mistake rather than
7317
+ * an outcome, and rejects separately.
7318
+ *
7319
+ * @see {@link CommandError} for reading the code off the rejection
7085
7320
  *
7086
7321
  * @example
7087
7322
  * const { answerSdp, viewport } = await browser.startStream(offer.sdp);
@@ -7095,6 +7330,7 @@ var CloudBrowser = class {
7095
7330
  offerSdp
7096
7331
  })
7097
7332
  );
7333
+ throwCommandError("startStream", resp.error);
7098
7334
  return {
7099
7335
  answerSdp: resp.answerSdp,
7100
7336
  viewport: resp.viewport ? { width: resp.viewport.width, height: resp.viewport.height } : null
@@ -7104,27 +7340,29 @@ var CloudBrowser = class {
7104
7340
  * Tears down the live video stream for the session's page. Safe to call even
7105
7341
  * if no stream is running.
7106
7342
  *
7107
- * @throws UNKNOWN_ERROR - the stream could not be stopped
7343
+ * Rejects only on a transport failure. Stopping a stream that is not running is
7344
+ * a no-op rather than a failure, so there are no error codes to branch on.
7108
7345
  *
7109
7346
  * @example
7110
7347
  * await browser.stopStream();
7111
7348
  */
7112
7349
  async stopStream() {
7113
- await this.client.stopStream(
7350
+ const res = await this.client.stopStream(
7114
7351
  create(StopStreamRequestSchema, {
7115
7352
  sessionId: this.sessionId,
7116
7353
  apiKey: this.apiKey
7117
7354
  })
7118
7355
  );
7356
+ throwCommandError("stopStream", res.error);
7119
7357
  }
7120
7358
  // ──────────────────────────────────────────────────────────────────
7121
7359
  // Reactions
7122
7360
  // ──────────────────────────────────────────────────────────────────
7123
7361
  /**
7124
- * Registers a one-shot "reaction": a background poller (one shared loop per
7125
- * page) watches for the `match` locator and, as soon as it matches, clicks it
7126
- * with the full smart-click machinery (scroll, human path, occlusion gate,
7127
- * evade) — then removes itself. The poller yields to any in-flight input
7362
+ * Registers a one-shot "reaction": the browser watches for the `match`
7363
+ * locator in the background and, as soon as it matches, clicks it the same
7364
+ * way {@link CloudBrowser.click} does (scroll, human path, occlusion check) —
7365
+ * then removes itself. The reaction yields to any in-flight input
7128
7366
  * action and only fires while the pointer is idle, so a reaction naturally
7129
7367
  * slots into the gaps of a retrying foreground action (e.g. it dismisses a
7130
7368
  * newsletter modal blocking a {@link CloudBrowser.click}, after which the
@@ -7173,6 +7411,7 @@ var CloudBrowser = class {
7173
7411
  if (opts?.clickCount) req.clickCount = opts.clickCount;
7174
7412
  if (opts?.intervalMs) req.interval = opts.intervalMs;
7175
7413
  const resp = await this.client.addReaction(req);
7414
+ throwCommandError("addReaction", resp.error);
7176
7415
  return resp.reactionId;
7177
7416
  }
7178
7417
  /**
@@ -7183,6 +7422,10 @@ var CloudBrowser = class {
7183
7422
  *
7184
7423
  * @returns true if a pending reaction with this id existed and was removed
7185
7424
  *
7425
+ * Removing an id that is not registered is a no-op rather than an error, so the
7426
+ * returned boolean - not a rejection - is what tells you whether anything was
7427
+ * there. Rejects only on a transport failure.
7428
+ *
7186
7429
  * @example
7187
7430
  * const removed = await browser.removeReaction(id);
7188
7431
  */
@@ -7194,6 +7437,7 @@ var CloudBrowser = class {
7194
7437
  reactionId
7195
7438
  })
7196
7439
  );
7440
+ throwCommandError("removeReaction", resp.error);
7197
7441
  return resp.removed;
7198
7442
  }
7199
7443
  /**
@@ -7202,6 +7446,10 @@ var CloudBrowser = class {
7202
7446
  *
7203
7447
  * @returns the pending reactions for the page
7204
7448
  *
7449
+ * Rejects only on a transport failure - a dead session, a page that is gone,
7450
+ * a broken connection. This call has no semantic failure of its own, so there
7451
+ * are no error codes to branch on.
7452
+ *
7205
7453
  * @example
7206
7454
  * const pending = await browser.listReactions();
7207
7455
  * for (const r of pending) console.log(r.reactionId, r.matchSelector);
@@ -7213,6 +7461,7 @@ var CloudBrowser = class {
7213
7461
  apiKey: this.apiKey
7214
7462
  })
7215
7463
  );
7464
+ throwCommandError("listReactions", resp.error);
7216
7465
  return resp.reactions.map((r) => ({
7217
7466
  reactionId: r.reactionId,
7218
7467
  matchSelector: r.matchSelector ?? "",
@@ -7227,39 +7476,44 @@ var CloudBrowser = class {
7227
7476
  // Scripts
7228
7477
  // ──────────────────────────────────────────────────────────────────
7229
7478
  /**
7230
- * Runs `source` in the session's browser and waits for it to finish.
7231
- *
7232
- * The script executes in a V8 isolate inside the browser process, not in the
7233
- * page, and reaches the same operations this SDK exposes through a `browser`
7234
- * object it is handed. The difference is cost: each call is a function call in
7235
- * the browser rather than a network round trip, so work that is chatty by
7236
- * nature — polling for a selector, walking a list, following pagination —
7237
- * runs in microseconds per step instead of tens of milliseconds.
7238
- *
7239
- * This waits for as long as the script runs, and cannot be bounded: the run
7240
- * id needed to cancel only arrives with the reply. Use
7241
- * {@link CloudBrowser.startScript} when the script may outlive the caller's
7242
- * patience, or {@link CloudBrowser.stopScripts} to abandon what this session
7243
- * is running.
7244
- *
7245
- * @param source - JavaScript to execute; its return value comes back as JSON
7246
- *
7247
- * @returns the return value and the script's whole console output. A script
7248
- * that threw is reported as `success: false`, not as a rejection
7249
- *
7250
- * @throws UNKNOWN_ERROR - the script could not be delivered to the browser
7251
- *
7252
- * @example
7253
- * const result = await browser.runScript(`
7254
- * await browser.navigate("https://example.com");
7255
- * const items = [];
7256
- * for (const el of await browser.getDOM().querySelectorAll("h1")) {
7257
- * items.push(el.textContent);
7258
- * }
7259
- * return items;
7260
- * `);
7261
- * console.log(result.success, result.result);
7262
- */
7479
+ * Runs `source` in the session's browser and waits for it to finish.
7480
+ *
7481
+ * The script runs beside the browser, in a V8 isolate of its own rather than
7482
+ * in the page, and reaches the document through the engine: a cross-origin
7483
+ * `<iframe>` is read as plain `contentDocument` with no frame ids anywhere,
7484
+ * values come back as live objects it can assign to rather than snapshots, an
7485
+ * element can be handed straight to `browser.click`, and the page sees nothing
7486
+ * injected. Steps cost microseconds rather than network round trips, so work
7487
+ * that is chatty by nature — polling for a selector, walking a list,
7488
+ * following pagination — is affordable there. A guide for it is still to come.
7489
+ *
7490
+ * This waits for as long as the script runs, and cannot be bounded: the run
7491
+ * id needed to cancel only arrives with the reply. Use
7492
+ * {@link CloudBrowser.startScript} when the script may outlive the caller's
7493
+ * patience, or {@link CloudBrowser.stopScripts} to abandon what this session
7494
+ * is running.
7495
+ *
7496
+ * @param source - JavaScript to execute; its return value comes back as JSON
7497
+ *
7498
+ * @returns the return value and the script's whole console output. A script
7499
+ * that threw is reported as `success: false`, not as a rejection
7500
+ *
7501
+ * Rejects only on a transport failure. A script that fails to compile or throws
7502
+ * is not a rejection: the returned result has success: false and
7503
+ esult holds
7504
+ * the message, so a broken script stays distinguishable from a broken connection.
7505
+ *
7506
+ * @example
7507
+ * const result = await browser.runScript(`
7508
+ * await browser.navigate("https://example.com");
7509
+ * const items = [];
7510
+ * for (const el of await browser.getDOM().querySelectorAll("h1")) {
7511
+ * items.push(el.textContent);
7512
+ * }
7513
+ * return items;
7514
+ * `);
7515
+ * console.log(result.success, result.result);
7516
+ */
7263
7517
  async runScript(source) {
7264
7518
  const resp = await this.client.runScript(
7265
7519
  create(RunScriptRequestSchema, {
@@ -7297,7 +7551,8 @@ var CloudBrowser = class {
7297
7551
  *
7298
7552
  * @returns ScriptRun handle for awaiting or cancelling the run
7299
7553
  *
7300
- * @throws UNKNOWN_ERROR - the run could not be started
7554
+ * Rejects only on a transport failure: a script that fails to compile or throws
7555
+ * surfaces on the run itself rather than here.
7301
7556
  *
7302
7557
  * @example
7303
7558
  * const run = await browser.startScript(source, (ev) => {
@@ -7376,7 +7631,8 @@ var CloudBrowser = class {
7376
7631
  *
7377
7632
  * @returns ScriptFollow handle for stopping the subscription
7378
7633
  *
7379
- * @throws UNKNOWN_ERROR - the subscription could not be opened
7634
+ * Rejects only on a transport failure: opening the subscription has no semantic
7635
+ * failure of its own.
7380
7636
  *
7381
7637
  * @example
7382
7638
  * const follow = await browser.followScript(runId, (ev) => {
@@ -7412,7 +7668,9 @@ var CloudBrowser = class {
7412
7668
  * @returns how many runs were cancelled; 0 when the id named nothing in
7413
7669
  * flight
7414
7670
  *
7415
- * @throws UNKNOWN_ERROR - the cancel could not be delivered
7671
+ * Rejects only on a transport failure. Cancelling runs that have already
7672
+ * finished, or none at all, is a no-op - read the returned count to learn how
7673
+ * many were actually stopped.
7416
7674
  *
7417
7675
  * @example
7418
7676
  * await browser.stopScripts(""); // abandon everything running
@@ -7437,7 +7695,9 @@ var CloudBrowser = class {
7437
7695
  *
7438
7696
  * @returns one entry per run still executing
7439
7697
  *
7440
- * @throws UNKNOWN_ERROR - the session could not be queried
7698
+ * Rejects only on a transport failure - a dead session, a broken connection.
7699
+ * This call has no semantic failure of its own, so there are no error codes to
7700
+ * branch on.
7441
7701
  *
7442
7702
  * @example
7443
7703
  * for (const run of await browser.listScriptRuns()) {
@@ -7773,6 +8033,11 @@ var BrowserConfig = class {
7773
8033
  }
7774
8034
  };
7775
8035
 
8036
+ // src/defaults.ts
8037
+ var DefaultWaitTimeoutMs = 3e4;
8038
+ var DefaultVisible = true;
8039
+ var DefaultSteadyMs = 500;
8040
+
7776
8041
  // src/browser.ts
7777
8042
  function createWebSocketBrowser(wsUrl, sessionId, apiKey, fingerprint = "") {
7778
8043
  const transport = new WebSocketTransport(wsUrl);