File: system_profile.proto

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (1271 lines) | stat: -rw-r--r-- 51,450 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.metrics";

option java_outer_classname = "SystemProfileProtos";

package metrics;

import "extension_install.proto";

// Stores information about the user's brower and system configuration.
// Almost all the fields should be populated on every upload. (The only
// exception is some fields in the stability section that are only uploaded
// once per browsing session, usually shortly after startup.)
// Next tag: 46
message SystemProfileProto {
  // The time when the client was compiled/linked, in seconds since the epoch.
  optional int64 build_timestamp = 1;

  // A version number string for the application.
  // Most commonly this is the browser version number found in a user agent
  // string, and is typically a 4-tuple of numbers separated by periods.  In
  // cases where the user agent version might be ambiguous (example: Linux 64-
  // bit build, rather than 32-bit build, or a Windows version used in some
  // special context, such as ChromeFrame running in IE), then this may include
  // some additional postfix to provide clarification not available in the UA
  // string.
  //
  // An example of a browser version 4-tuple is "5.0.322.0".  Currently used
  // postfixes are:
  //
  //   "-64": a 64-bit build
  //   "-F": Chrome is running under control of ChromeFrame
  //   "-devel": this is not an official build of Chrome
  //
  // A full version number string could look similar to:
  // "5.0.322.0-F-devel".
  //
  // This value, when available, is more trustworthy than the UA string
  // associated with the request; and including the postfix, may be more
  // specific.
  optional string app_version = 2;

  // The application can create logs about previous versions. In particular the
  // initial stability log refers to the previous run, which can be an older
  // version. This field is set by the client when the log being written has an
  // app_version that's different than the version of the app writing the log.
  // Note that the version uploading the log may also be different.
  optional string log_written_by_app_version = 40;

  // The brand code or distribution tag assigned to a partner, if available.
  // Windows, Mac, iOS, and CrOS clients may have a brand code.
  optional string brand_code = 12;

  // The possible channels for an installation, from least to most stable.
  enum Channel {
    CHANNEL_UNKNOWN = 0;  // Unknown channel -- perhaps an unofficial build?
    CHANNEL_CANARY = 1;
    CHANNEL_DEV = 2;
    CHANNEL_BETA = 3;
    CHANNEL_STABLE = 4;
  }
  optional Channel channel = 10;

  // True for a client following updates on the extended stable channel;
  // see go/chrome-extended-dd.
  optional bool is_extended_stable_channel = 36 [default = false];

  // True if Chrome build is instrumented (e.g. built with ASAN instrumentation
  // or with DCHECKs enabled).
  // This field was renamed from |is_asan_build| to reflect its actual meaning.
  optional bool is_instrumented_build = 20 [default = false];

  // For Chrome, the date the user enabled UMA, in seconds since the epoch.
  // If the user has toggled the UMA enabled state multiple times, this will
  // be the most recent date on which UMA was enabled.
  // For privacy, this is rounded to the nearest hour (M30+).
  // For WebView, the field stores the date "January 1st, 2014 00:00:00 UTC"
  // if the user opted into metrics collection before WebView started tracking
  // this information. Otherwise, the field value should correctly reflect the
  // first startup for this app after the user opted into metrics collection.
  optional int64 uma_enabled_date = 3;

  // The time when the client was installed, in seconds since the epoch.
  // For privacy, this is rounded to the nearest hour.
  optional int64 install_date = 16;

  // A message about the cloned install detection that helps improve data
  // quality by identifying potential VMs and bots. This message will be
  // set in every record after the client has ever been reset due to cloned
  // install detection. However, the `cloned_from_client_id`
  // field will only be set in the resetting session because this is not
  // persisted in the local prefs.
  // Next tag: 5
  message ClonedInstallInfo {
    // The latest timestamp we reset a cloned client’s client id, in seconds
    // since the epoch. For privacy, this is rounded to the nearest hour.
    optional int64 last_timestamp = 1;

    // The client_id that this client is cloned from. This field is tied to the
    // cloned install detector only; any other way of resetting client_id
    // doesn't touch this field. This field is only reported in the
    // resetting session.
    optional fixed64 cloned_from_client_id = 2;

    // The first timestamp when we reset a cloned client’s client id, in seconds
    // since the epoch. For privacy, this is rounded to the nearest hour.
    optional int64 first_timestamp = 3;

    // The number of times this client has been reset due to cloned install.
    // Increment by one per reset happens.
    optional int32 count = 4;
  }
  optional ClonedInstallInfo cloned_install_info = 39;

  // The non-identifying low entropy source value. This value seeds the
  // pseudorandom generator which picks experimental groups. Clients only report
  // the value that they used for picking experimental groups on startup which
  // means this value won't be changed within the session even even if the low
  // entropy source is reset (e.g. via the UMA checkbox) because group
  // assignments won't be changed until restart.
  optional int32 low_entropy_source = 31;

  // The old low entropy value. This value is thought to be biased in the wild,
  // and is no longer used for experiments requiring low entropy. Clients which
  // already have an "old" value continue incorporating it into the high entropy
  // source, to avoid changing those group assignments. New clients only have
  // the new source.
  optional int32 old_low_entropy_source = 32;

  // A pseudo low entropy value. The actual low_entropy_source value is used for
  // assignment to experiment arms, and this use may cause drift over time (for
  // example, if a bad experiment arm drives away some users permanently.) This
  // pseudo low entropy value is generated identically to low_entropy_source,
  // but it is generated with a different randomization seed and is not used for
  // experiment randomization. Consequently, it can be used in statistical
  // validation to answer the question of how our data would be distributed if
  // we didn't have to worry about low entropy source drift.
  optional int32 pseudo_low_entropy_source = 37;

  // The user's selected application locale, i.e. the user interface language.
  // The locale includes a language code and, possibly, also a country code,
  // e.g. "en-US".
  optional string application_locale = 4;

  // Hashes of command line keys used in the browser session when the MetricsLog
  // is created. This takes into account the command line switches that were
  // used when launching the session, as well as any modifications made to them,
  // for example via CommandLine::AppendSwitch and CommandLine::RemoveSwitch.
  // Values are the lower 32-bit of SHA1 hash in little-endian.
  repeated fixed32 command_line_key_hash = 38 [packed = true];

  // Information on the user's operating system.
  // Next tag: 11
  message OS {
    // The user's operating system. This should be one of:
    // - 'Android'
    // - 'Windows NT'
    // - 'CrOS' (as of 07/2020)
    // - 'Lacros'  (the Lacros browser runs on Chrome OS, but reports a special
    //              OS name to differentiate itself from the built-in ash
    //              browser + window manager binary.)
    // - 'Linux' (includes ChromeOS prior to 07/2020)
    // - 'iOS' (iOS versions >= 9)
    // - 'iPhone OS' (iOS versions <= 8)
    // - 'iPadOS'
    // - 'Mac OS X'
    optional string name = 1;

    // The version of the OS.  The meaning of this field is OS-dependent.
    optional string version = 2;

    // The fingerprint of the build.  This field is used only on Android.
    optional string build_fingerprint = 3;

    // Whether the version of iOS appears to be "jailbroken". This field is
    // used only on iOS. Chrome for iOS detects whether device contains a
    // DynamicLibraries/ directory. It's a necessary but insufficient indicator
    // of whether the operating system has been jailbroken.
    // Deprecated 01/2023. This was never set.
    optional bool DEPRECATED_is_jailbroken = 4 [deprecated = true];

    // The build number for the OS version. The same OS version may have a
    // different build number. The meaning of this field is OS-dependent.
    optional string build_number = 5;

    // The version of the kernel. Linux based operating systems, such as
    // ChromeOS and Android, have a kernel version that the OS release version
    // was built with that differs from the version field above.
    optional string kernel_version = 6;

    // Information on ChromeOS ARC runtime. This is collected to ease analysis
    // on ARC-specific metrics, since this info varies by different boards /
    // build configs / releases.
    // Next tag: 2
    message Arc {
      // Android release number from build.prop "ro.build.version.release", e.g.
      // "7.1.1" for N and "9" for P.
      optional string release = 1;
    }
    // Available since M76. This field is reported if current build supports
    // ARC, regardless of whether ARC is enabled or not. Check "Arc.State"
    // histogram to determine if ARC is enabled for current report.
    // Logged on ChromeOS only.
    optional Arc arc = 7;

    // Data related to system-level dark mode configuration. This is currently
    // only uploaded on Android. "*_APP" variants are included to reflect when
    // the user overrides the system configuration within the browser
    enum DarkModeState {
      UNKNOWN = 0;

      // Both the system and the browser are in dark mode.
      DARK_MODE_SYSTEM = 1;

      // The browser is in dark mode, but the state of the system either cannot
      // be determined or has been overridden by the user.
      DARK_MODE_APP = 2;

      // Both the system and the browser are in light mode.
      LIGHT_MODE_SYSTEM = 3;

      // The browser is in light mode, but the state of the system either cannot
      // be determined or has been overridden by the user.
      LIGHT_MODE_APP = 4;
    }
    optional DarkModeState dark_mode_state = 8 [default = UNKNOWN];

    // The value returned by the "XDG_SESSION_TYPE" environment variable, as
    // translated to a base::nix::SessionType, this field is only set on Linux.
    // Some features are enabled/disabled depending on this value.
    enum XdgSessionType {
      UNSET = 0;
      OTHER_SESSION_TYPE = 1;
      UNSPECIFIED = 2;
      TTY = 3;
      X11 = 4;
      WAYLAND = 5;
      MIR = 6;
    }
    optional XdgSessionType xdg_session_type = 9;

    // The value returned by the "XDG_CURRENT_DESKTOP" environment variable, as
    // translated to a base::nix::DesktopEnvironment. Note that all KDE values
    // from that enum are bucketed together. This field is only set on Linux.
    // Some bugs reproduce only in particular desktop environments.
    enum XdgCurrentDesktop {
      OTHER = 0;
      CINNAMON = 1;
      DEEPIN = 2;
      GNOME = 3;
      KDE = 4;
      PANTHEON = 5;
      UKUI = 6;
      UNITY = 7;
      XFCE = 8;
      LXQT = 9;
    }
    optional XdgCurrentDesktop xdg_current_desktop = 10;
  }
  optional OS os = 5;

  // Information on the user's hardware.
  // Next tag: 28
  message Hardware {
    // OS CPU architecture. Common options are: x86, x86_64, arm64, armv7,
    // armv7l, armv8l and aarch64.
    // Note: On Windows, this is not the true OS CPU architecture in the case
    // of running under emulation (e.g. on Windows on ARM, which would report
    // either x86 or x86_64, depending on the bitness of the exe being run).
    // Started being correctly recorded on iOS in M90: crrev/c/2723012.
    optional string cpu_architecture = 1;

    // Browser process CPU architecture. Will be different from
    // `cpu_architecture` in the case where Chromium runs non-natively (e.g.
    // macOS Rosetta or Arm Windows). One of four values: x86, x86_64, ARM,
    // ARM_64. Added in M90.
    optional string app_cpu_architecture = 21;

    // The amount of RAM present on the system, in megabytes.
    optional int64 system_ram_mb = 2;

    // The base memory address that chrome.dll was loaded at.
    // (Logged only on Windows.)
    optional int64 dll_base = 3;

    // The hardware_class describes the current machine model, e.g. "MacPro1,1"
    // on Mac, "iPhone9,3" on iOS or "Nexus 5" on Android. Implemented on OS X,
    // iOS, Android, Chrome OS.
    //
    // The iOS device hardware class was added in Chrome M60 release. Prior
    // to that, device hardware class was incorrectly recorded in
    // cpu_architecture field.
    //
    // For Chrome OS, prior to M69, this field had the value that is
    // currently in |full_hardware_class| field. In M69+, this contains the
    // board name only. E.G. "CELES", "VEYRON_MINNIE".

    optional string hardware_class = 4;

    // This field is only sent on Chrome OS. The full hardware class is a unique
    // string associated with each Chrome OS device product revision generally
    // assigned at hardware qualification time. The hardware class effectively
    // identifies the configured system components such as CPU, WiFi adapter,
    // etc.
    //
    // An example of such a hardware class is "IEC MARIO PONY 6101".  An
    // internal database associates this hardware class with the qualified
    // device specifications including OEM information, schematics, hardware
    // qualification reports, test device tags, etc.
    optional string full_hardware_class = 18;

    // This field is only sent on Chrome OS devices with cellular support.
    // This represents the variant of cellular modem present on the device.
    optional string cellular_device_variant = 24;

    // The number of physical screens.
    optional int32 screen_count = 5;

    // The screen dimensions of the primary screen, in pixels.
    optional int32 primary_screen_width = 6;
    optional int32 primary_screen_height = 7;

    // The device scale factor of the primary screen.
    optional float primary_screen_scale_factor = 12;

    // Max DPI for any attached screen. (Windows only)
    optional float max_dpi_x = 9;
    optional float max_dpi_y = 10;

    // The form factor of the device. Added in M101, foldable added in M120.
    // Android devices can be phone, tablet, TV, automotive or foldable. iOS
    // devices can be phone or tablet. For Windows, Mac, ChromeOS, Lacros, and
    // Linux, the desktop form factor is always used.
    enum FormFactor {
      FORM_FACTOR_UNKNOWN = 0;
      FORM_FACTOR_DESKTOP = 1;
      FORM_FACTOR_PHONE = 2;
      FORM_FACTOR_TABLET = 3;
      FORM_FACTOR_TV = 4;
      FORM_FACTOR_MEET_DEVICE = 5;
      FORM_FACTOR_AUTOMOTIVE = 6;
      FORM_FACTOR_FOLDABLE = 7;
    }
    optional FormFactor form_factor = 22;

    // Information on the CPU obtained by CPUID.
    message CPU {
      // A 12 character string naming the vendor, e.g. "GenuineIntel".
      optional string vendor_name = 1;

      // The signature reported by CPUID (from EAX).
      optional uint32 signature = 2;

      // Number of logical processors/cores on the current machine, which
      // includes hyperthreaded cores.
      optional uint32 num_cores = 3;

      // Whether the CPU is running in a hypervisor.
      optional bool is_hypervisor = 4;
    }
    optional CPU cpu = 13;

    // Type of BIOS (can change at each boot).
    enum BiosType {
      BIOS_TYPE_UNKNOWN = 0;
      // Legacy BIOS or UEFI with CSM mode.
      BIOS_TYPE_LEGACY = 1;
      // BIOS is UEFI and booted into UEFI mode.
      BIOS_TYPE_UEFI = 2;
    }
    // Motherboard information.
    message Motherboard {
      // Manufacturer for the motherboard.
      optional string manufacturer = 1;
      // Model for the motherboard.
      optional string model = 2;
      // Manufacturer for the BIOS.
      optional string bios_manufacturer = 3;
      // Version of the BIOS currently installed.
      optional string bios_version = 4;
      // What mode of BIOS is booted.
      optional BiosType bios_type = 5;
    }
    optional Motherboard motherboard = 25;

    // Information on the GPU
    message Graphics {
      // The GPU manufacturer's vendor id.
      optional uint32 vendor_id = 1;

      // The GPU manufacturer's device id for the chip set.
      optional uint32 device_id = 2;

      // The driver version on the GPU.
      optional string driver_version = 3;

      // The GL_VENDOR string. An example of a gl_vendor string is
      // "Imagination Technologies". "" if we are not using OpenGL.
      optional string gl_vendor = 6;

      // The GL_RENDERER string. An example of a gl_renderer string is
      // "PowerVR SGX 540". "" if we are not using OpenGL.
      optional string gl_renderer = 7;
    }
    optional Graphics gpu = 8;

    // Whether the internal display produces touch events. Omitted if unknown.
    // Logged on ChromeOS only.
    optional bool internal_display_supports_touch = 14;

    // Internal storage device information on ChromeOS. Added in M94.
    // Next tag: 9
    message InternalStorageDevice {
      // Id of the storage device manufacturer.
      // Can be vendor_id (for NVMe, 32bit), manfid (for eMMC, 16bit, since
      // M113), oemid (for eMMC, 16bit, before M113), JEDEC manfid (for UFS,
      // 16bit) etc. depending on the device type.
      optional uint32 vendor_id = 1;

      // Id of the storage device product.
      // Can be product_id (for NVMe, 32bit), PNM (for eMMC, 48bit), hashed
      // model name (for UFS, 32bit) etc. depending on the device type.
      optional uint64 product_id = 2;

      // Revision of the storage device product.
      // Can be PCIe rev (for NVMe, 8bit), PRV(for eMMC, 8bit) etc. depending on
      // the device type.
      optional uint32 revision = 3;

      // Storage Device model. Comes from /sys/block/<device>/device/model.
      optional string model = 4;

      // Storage Device capacity in MB.
      optional uint32 size_mb = 5;

      // 8 byte FW revision of a storage device. Usually a string, but may
      // contain non-printable characters.
      optional uint64 firmware_version = 6;

      // Type of the storage device interface.
      // TYPE_UNKNOWN signifies an error on population side.
      enum Type {
        TYPE_UNKNOWN = 0;
        TYPE_EMMC = 1;
        TYPE_NVME = 2;
        TYPE_UFS = 3;
        TYPE_SD_EXPRESS_INTERNAL = 4;
      }
      optional Type type = 7;

      // Purpose defines how the OS uses the device.
      // PURPOSE_UNKNOWN signifies an error on population side.
      enum Purpose {
        PURPOSE_UNKNOWN = 0;
        PURPOSE_BOOT = 1;
        PURPOSE_SWAP = 2;
        PURPOSE_BOOT_SWAP = 3;
      }
      optional Purpose purpose = 8;
    }
    // List of internal storage devices on a Chrome OS device.
    repeated InternalStorageDevice internal_storage_devices = 20;

    // Drive messages are currently logged on Windows 7+, iOS, and Android.
    message Drive {
      // Whether this drive incurs a time penalty when randomly accessed. This
      // should be true for spinning disks but false for SSDs or other
      // flash-based drives.
      optional bool has_seek_penalty = 1;
    }
    // The drive that the application executable was loaded from.
    optional Drive app_drive = 16;
    // The drive that the current user data directory was loaded from.
    optional Drive user_data_drive = 17;

    // Type of TPM on the device. This field is only filled in on ChromeOS
    // devices (both CrOS and LaCrOS platforms). This includes Chromebooks with
    // TPM1.2 or GSC (cr50 and ti50), flex devices (ChromeOS installed on
    // devices with other OS) which has TPM type "runtime selection", and lastly
    // generic TPM2 devices that use TPM2 chips that aren't manufactured by
    // Google.
    enum TpmType {
      TPM_TYPE_UNKNOWN = 0;
      TPM_TYPE_1 = 1;
      TPM_TYPE_CR50 = 2;
      TPM_TYPE_TI50 = 3;
      TPM_TYPE_RUNTIME_SELECTION = 4;
      TPM_TYPE_GENERIC_2 = 5;
    }
    optional TpmType tpm_type = 23;

    // Firmware version of the TPM on the device. This field is only filled in
    // on ChromeOS devices (both CrOS and LaCrOS platforms).
    optional uint64 tpm_firmware_version = 26;

    // RW Firmware version of the TPM on the device. This field is only filled
    // in on ChromeOS devices.
    optional string tpm_rw_firmware_version = 27;
  }
  optional Hardware hardware = 6;

  // Information about the network connection.
  // Next tag: 9
  message Network {
    // Set to true if connection_type changed during the lifetime of the log.
    optional bool connection_type_is_ambiguous = 1;

    // Derived from net::NetworkChangeNotifier::ConnectionType translated
    // through NetworkMetricsProvider::GetConnectionType.
    enum ConnectionType {
      CONNECTION_UNKNOWN = 0;
      CONNECTION_ETHERNET = 1;
      CONNECTION_WIFI = 2;
      CONNECTION_2G = 3;
      CONNECTION_3G = 4;
      CONNECTION_4G = 5;
      CONNECTION_BLUETOOTH = 6;
      CONNECTION_NONE = 7;
      // As an alternative to connection_type_is_ambiguous above,
      // CONNECTION_AMBIGUOUS can be used for connection_type instead. This is
      // to be used in logs processing as a more convenient way to manage the
      // ambiguous case when breaking down stats by connection_type.
      CONNECTION_AMBIGUOUS = 8;
      CONNECTION_5G = 9;
    }
    // The connection type according to NetworkChangeNotifier.
    optional ConnectionType connection_type = 2;

    // Set to true if wifi_phy_layer_protocol changed during the lifetime of the
    // log.
    optional bool wifi_phy_layer_protocol_is_ambiguous = 3;

    // See net::WifiPHYLayerProtocol.
    enum WifiPHYLayerProtocol {
      WIFI_PHY_LAYER_PROTOCOL_NONE = 0;
      WIFI_PHY_LAYER_PROTOCOL_ANCIENT = 1;
      WIFI_PHY_LAYER_PROTOCOL_A = 2;
      WIFI_PHY_LAYER_PROTOCOL_B = 3;
      WIFI_PHY_LAYER_PROTOCOL_G = 4;
      WIFI_PHY_LAYER_PROTOCOL_N = 5;
      WIFI_PHY_LAYER_PROTOCOL_UNKNOWN = 6;
      WIFI_PHY_LAYER_PROTOCOL_AC = 7;
      WIFI_PHY_LAYER_PROTOCOL_AD = 8;
      WIFI_PHY_LAYER_PROTOCOL_AX = 9;
    }
    // The physical layer mode of the associated wifi access point, if any.
    optional WifiPHYLayerProtocol wifi_phy_layer_protocol = 4;

    // Derived from net::NetworkQualityEstimator::EffectiveConnectionType
    // translated through NetworkMetricsProvider::GetConnectionType.
    enum EffectiveConnectionType {
      EFFECTIVE_CONNECTION_TYPE_UNKNOWN = 0;
      // Deprecated: Specifies that the connection_type changed during the
      // lifetime of the log.
      DEPRECATED_EFFECTIVE_CONNECTION_TYPE_AMBIGUOUS = 1 [deprecated = true];
      EFFECTIVE_CONNECTION_TYPE_OFFLINE = 2;
      EFFECTIVE_CONNECTION_TYPE_SLOW_2G = 3;
      EFFECTIVE_CONNECTION_TYPE_2G = 4;
      EFFECTIVE_CONNECTION_TYPE_3G = 5;
      EFFECTIVE_CONNECTION_TYPE_4G = 6;
    }

    // The minimum and maximum values of the effective connection type enum
    // during the lifetime of the log according to net::NetworkQualityEstimator.
    // EffectiveConnectionType is the connection type whose typical performance
    // is most similar to the measured performance of the network in use. In
    // many cases, the "effective" connection type and the actual type of
    // connection in use are the same, but often a network connection performs
    // significantly differently, usually worse, from its expected capabilities.
    optional EffectiveConnectionType min_effective_connection_type = 7;
    optional EffectiveConnectionType max_effective_connection_type = 8;
  }
  optional Network network = 13;

  // Information on the Google Update install that is managing this client.
  message GoogleUpdate {
    // Whether the Google Update install is system-level or user-level.
    optional bool is_system_install = 1;

    // The date at which Google Update last started performing an automatic
    // update check, in seconds since the Unix epoch.
    optional int64 last_automatic_start_timestamp = 2;

    // The date at which Google Update last successfully sent an update check
    // and received an intact response from the server, in seconds since the
    // Unix epoch. (The updates don't need to be successfully installed.)
    optional int64 last_update_check_timestamp = 3;

    // Describes a product being managed by Google Update. (This can also
    // describe Google Update itself.)
    message ProductInfo {
      // The current version of the product that is installed.
      optional string version = 1;

      // The date at which Google Update successfully updated this product,
      // stored in seconds since the Unix epoch.  This is updated when an update
      // is successfully applied, or if the server reports that no update
      // is available.
      optional int64 last_update_success_timestamp = 2;

      // The result reported by the product updater on its last run.
      enum InstallResult {
        INSTALL_RESULT_SUCCESS = 0;
        INSTALL_RESULT_FAILED_CUSTOM_ERROR = 1;
        INSTALL_RESULT_FAILED_MSI_ERROR = 2;
        INSTALL_RESULT_FAILED_SYSTEM_ERROR = 3;
        INSTALL_RESULT_EXIT_CODE = 4;
      }
      optional InstallResult last_result = 3;

      // The error code reported by the product updater on its last run.  This
      // will typically be a error code specific to the product installer.
      optional int32 last_error = 4;

      // The extra error code reported by the product updater on its last run.
      // This will typically be a Win32 error code.
      optional int32 last_extra_error = 5;
    }
    optional ProductInfo google_update_status = 4;
    optional ProductInfo client_status = 5;
  }
  optional GoogleUpdate google_update = 11;

  // Figures that can be used to generate application stability metrics.
  // All values are counts of events since the last time that these
  // values were reported.
  // Next tag: 32
  message Stability {
    // Total amount of time that the program was running, in seconds,
    // since the last time a log was recorded, as measured using a client-side
    // clock implemented via TimeTicks, which guarantees that it is monotonic
    // and does not jump if the user changes their clock.  The TimeTicks
    // implementation also makes the clock not count time the computer is
    // suspended.
    optional int64 incremental_uptime_sec = 1;

    // Total amount of time that the program was running, in seconds,
    // since startup, as measured using a client-side clock implemented
    // via TimeTicks, which guarantees that it is monotonic and does not
    // jump if the user changes their clock.  The TimeTicks implementation
    // also makes the clock not count time the computer is suspended.
    // This field was added for M-35.
    optional int64 uptime_sec = 23;

    // Logged on Android only as of late Q2 2022. Used by only Android WebView.
    // Other platforms should use Stability.Counts2.
    optional int32 page_load_count = 2;

    // Logged on Android only as of Q2 2022. Used by only Android WebView. Other
    // platforms should use Stability.Counts2.
    optional int32 renderer_launch_count = 26;

    // Number of times the browser has crashed while logged in as the "other
    // user" (guest) account.
    // Logged on ChromeOS only.
    optional int32 other_user_crash_count = 7;

    // Number of times the kernel has crashed.
    // Logged on ChromeOS only.
    optional int32 kernel_crash_count = 8;

    // Number of times the system has shut down uncleanly.
    // Logged on ChromeOS only.
    optional int32 unclean_system_shutdown_count = 9;

    // All the remaining fields in the Stability are recorded at most once per
    // client session.

    // The number of times the program was launched since the last time metrics
    // was uploaded. For the initial metrics upload (right after startup), this
    // will often be equal to 1. However, it is possible that Chrome was unable
    // to upload stability metrics for previous launches (e.g. due to crashing
    // early during startup), making this value greater than 1. For subsequent
    // metrics uploads, this value will be 0.
    //
    // Logged on Android only as of Q1 2022. Used by only Android WebView. Other
    // platforms should use Stability.Counts2.
    optional int32 launch_count = 15;
    // Android only. The number of times Chrome didn't exit cleanly and the GMS
    // Core version has changed from the last session. This is in addition to
    // |crash_count| in which we exclude unclean exits that are likely caused by
    // GMS Core updates.
    optional int32 crash_count_due_to_gms_core_update = 30;

    // Whether the metrics being reported are from a previous run picked up via
    // the left-over memory mapped files.
    optional bool from_previous_run = 29;
  }
  optional Stability stability = 8;

  // Description of a field trial or experiment that the user is currently
  // enrolled in.
  // All metrics reported in this upload can potentially be influenced by the
  // field trial.
  message FieldTrial {
    // The name of the field trial, as a 32-bit identifier.
    // Currently, the identifier is a hash of the field trial's name.
    optional fixed32 name_id = 1;

    // The user's group within the field trial, as a 32-bit identifier.
    // Currently, the identifier is a hash of the group's name.
    optional fixed32 group_id = 2;
  }
  repeated FieldTrial field_trial = 9;

  // Seed version from variations_seed.proto used to instantiate FieldTrials
  // for this session.
  optional string variations_seed_version = 28;

  // Whether the client_id in the log matches the client_id we used to assign
  // field trials.
  optional bool client_id_was_used_for_trial_assignment = 33;

  // The unhashed client_id for this report. This is a uuid in its canonical
  // textual representation in the form 8-4-4-4-12 for a total of 36 characters.
  // Used to simulate field trial assignments for the client.
  optional string client_uuid = 34;

  // Information about the A/V output device(s) (typically just a TV).
  // However, a configuration may have one or more intermediate A/V devices
  // between the source device and the TV (e.g. an A/V receiver, video
  // processor, etc.).
  message ExternalAudioVideoDevice {
    // The manufacturer name (possibly encoded as a 3-letter code, e.g. "YMH"
    // for Yamaha).
    optional string manufacturer_name = 1;

    // The model name (e.g. "RX-V1900"). Some devices may report generic names
    // like "receiver" or use the full manufacturer name (e.g "PHILIPS").
    optional string model_name = 2;

    // The product code (e.g. "0218").
    optional string product_code = 3;

    // The device types. A single device can have multiple types (e.g. a set-top
    // box could be both a tuner and a player).  The same type may even be
    // repeated (e.g a device that reports two tuners).
    enum AVDeviceType {
      AV_DEVICE_TYPE_UNKNOWN = 0;
      AV_DEVICE_TYPE_TV = 1;
      AV_DEVICE_TYPE_RECORDER = 2;
      AV_DEVICE_TYPE_TUNER = 3;
      AV_DEVICE_TYPE_PLAYER = 4;
      AV_DEVICE_TYPE_AUDIO_SYSTEM = 5;
    }
    repeated AVDeviceType av_device_type = 4;

    // The year of manufacture.
    optional int32 manufacture_year = 5;

    // The week of manufacture.
    // Note: per the Wikipedia EDID article, numbering for this field may not
    // be consistent between manufacturers.
    optional int32 manufacture_week = 6;

    // Selected horizontal resolution in pixels.
    optional int32 horizontal_resolution = 7;

    // Selected vertical resolution in pixels.
    optional int32 vertical_resolution = 8;

    // Audio capabilities of the device.
    // Ref: http://en.wikipedia.org/wiki/Extended_display_identification_data
    // Next tag: 7
    message AudioDescription {
      // Audio format
      enum AudioFormat {
        AUDIO_FORMAT_UNKNOWN = 0;
        AUDIO_FORMAT_LPCM = 1;
        AUDIO_FORMAT_AC_3 = 2;
        AUDIO_FORMAT_MPEG1 = 3;
        AUDIO_FORMAT_MP3 = 4;
        AUDIO_FORMAT_MPEG2 = 5;
        AUDIO_FORMAT_AAC = 6;
        AUDIO_FORMAT_DTS = 7;
        AUDIO_FORMAT_ATRAC = 8;
        AUDIO_FORMAT_ONE_BIT = 9;
        AUDIO_FORMAT_DD_PLUS = 10;
        AUDIO_FORMAT_DTS_HD = 11;
        AUDIO_FORMAT_MLP_DOLBY_TRUEHD = 12;
        AUDIO_FORMAT_DST_AUDIO = 13;
        AUDIO_FORMAT_MICROSOFT_WMA_PRO = 14;
      }
      optional AudioFormat audio_format = 1;

      // Number of channels (e.g. 1, 2, 8, etc.).
      optional int32 num_channels = 2;

      // Supported sample frequencies in Hz (e.g. 32000, 44100, etc.).
      // Multiple frequencies may be specified.
      repeated int32 sample_frequency_hz = 3;

      // Maximum bit rate in bits/s.
      optional int32 max_bit_rate_per_second = 4;

      // Bit depth (e.g. 16, 20, 24, etc.).
      optional int32 bit_depth = 5;

      // Output mode: analog vs digital.
      enum OutputMode {
        ANALOG = 0;
        DIGITAL = 1;
      }
      optional OutputMode output_mode = 6;
    }
    repeated AudioDescription audio_description = 9;

    // The position in AV setup.
    // A value of 0 means this device is the TV.
    // A value of 1 means this device is directly connected to one of
    // the TV's inputs.
    // Values > 1 indicate there are 1 or more devices between this device
    // and the TV.
    optional int32 position_in_setup = 10;

    // Whether this device is in the path to the TV.
    optional bool is_in_path_to_tv = 11;

    // The CEC version the device supports.
    // CEC stands for Consumer Electronics Control, a part of the HDMI
    // specification.  Not all HDMI devices support CEC.
    // Only devices that support CEC will report a value here.
    optional int32 cec_version = 12;

    // This message reports CEC commands seen by a device.
    // After each log is sent, this information is cleared and gathered again.
    // By collecting CEC status information by opcode we can determine
    // which CEC features can be supported.
    message CECCommand {
      // The CEC command opcode.  CEC supports up to 256 opcodes.
      // We add only one CECCommand message per unique opcode.  Only opcodes
      // seen by the device will be reported. The remainder of the message
      // accumulates status for this opcode (and device).
      optional int32 opcode = 1;

      // The total number of commands received from the external device.
      optional int32 num_received_direct = 2;

      // The number of commands received from the external device as part of a
      // broadcast message.
      optional int32 num_received_broadcast = 3;

      // The total number of commands sent to the external device.
      optional int32 num_sent_direct = 4;

      // The number of commands sent to the external device as part of a
      // broadcast message.
      optional int32 num_sent_broadcast = 5;

      // The number of aborted commands for unknown reasons.
      optional int32 num_aborted_unknown_reason = 6;

      // The number of aborted commands because of an unrecognized opcode.
      optional int32 num_aborted_unrecognized = 7;
    }
    repeated CECCommand cec_command = 13;

    // Selected Frame rate
    optional int32 frame_rate = 14;

    // Selected color encoding.
    enum ColorEncoding {
      COLOR_ENCODING_UNKNOWN = 0;
      COLOR_ENCODING_RGB = 1;
      COLOR_ENCODING_YUV444 = 2;
      COLOR_ENCODING_YUV422 = 3;
      COLOR_ENCODING_YUV420 = 4;
    }
    optional ColorEncoding color_encoding = 15;

    // Selected bit-depth.
    optional int32 bit_depth = 16;

    // Devices's max TMDS char rate.
    optional int32 tmds = 17;

    // HDR10 support.
    optional bool hdr10_support = 18;

    // Dolby vision support.
    optional bool dolby_vision_support = 19;

    // Supported EOTF's.
    // EOTF support according to the spec:
    //   eotf_support & 0x1 -> SDR supported
    //   (eotf_support > 1) & 0x1 -> traditional HDR supported
    //   (eotf_support > 2) & 0x1 -> ST2084 supported
    optional int32 eotf_support = 20;

    // Supports YUV.
    optional bool yuv_support = 21;

    // Supports YUV_420.
    optional bool yuv_420_support = 22;

    // The maximum HDCP version supported by the sink.
    optional int32 maximum_supported_hdcp_version = 23;

    // The current HDCP version negotiated with the sink.
    optional int32 current_hdcp_version = 24;
  }
  repeated ExternalAudioVideoDevice external_audio_video_device = 14;

  // Information about the current wireless access point. Collected directly
  // from the wireless access point via standard apis if the device is
  // connected to the Internet wirelessly. Introduced for Chrome on TV devices
  // but also can be collected by cast devices running Chrome OS and Android.
  // Not logged by Chrome browser platforms.
  message ExternalAccessPoint {
    // The manufacturer name, for example "ASUSTeK Computer Inc.".
    optional string manufacturer = 1;

    // The model name, for example "Wi-Fi Protected Setup Router".
    optional string model_name = 2;

    // The model number, for example "RT-N16".
    optional string model_number = 3;

    // The device name (sometime same as model_number), for example "RT-N16".
    optional string device_name = 4;

    // The organizationally unique identifier, for example "08:9E:08".
    // OUI is the highest three bytes of MAC address
    // Google's OUI (08:9E:08) is encoded as 0x00089E08
    // Never recorded server side, but some old clients may send values with
    // this tag.
    reserved 5;
  }
  optional ExternalAccessPoint external_access_point = 15;

  // Number of users currently signed into a multiprofile session.
  // A zero value indicates that the user count changed while the log is open.
  // Logged only on ChromeOS.
  optional uint32 multi_profile_user_count = 17;

  // Information about extensions that are installed, masked to provide better
  // privacy.  Only extensions from a single profile are reported; this will
  // generally be the profile used when the browser is started.  The profile
  // reported on will remain consistent at least until the browser is
  // relaunched (or the profile is deleted by the user).
  //
  // Each client first picks a value for client_key derived from its UMA
  // client_id:
  //   client_key = client_id % 4096
  // Then, each installed extension is mapped into a hash bucket according to
  //   bucket = CityHash64(StringPrintf("%d:%s",
  //                                    client_key, extension_id)) % 1024
  // The client reports the set of hash buckets occupied by all installed
  // extensions.  If multiple extensions map to the same bucket, that bucket is
  // still only reported once.
  repeated int32 occupied_extension_bucket = 18;

  // The state of loaded extensions for this system. The system can have either
  // no applicable extensions, extensions only from the webstore and verified by
  // the webstore, extensions only from the webstore but not verified, or
  // extensions not from the store. If there is a single off-store extension,
  // then HAS_OFFSTORE is reported. This should be kept in sync with the
  // corresponding enum in chrome/browser/metrics/extensions_metrics_provider.cc
  enum ExtensionsState {
    NO_EXTENSIONS = 0;
    NO_OFFSTORE_VERIFIED = 1;
    NO_OFFSTORE_UNVERIFIED = 2;
    HAS_OFFSTORE = 3;
  }
  optional ExtensionsState offstore_extensions_state = 19;

  // The nature of the choice the user was given concerning metrics recording.
  // Specifically, whether the enable metrics/crash reporting checkbox that was
  // shown on first run was checked or unchecked by default.
  // This state is recorded on first run, and uploaded in every UMA log.
  enum UmaDefaultState {
    // The enable checkbox was unchecked by default.
    OPT_IN = 0;
    // The enable checkbox was checked by default.
    OPT_OUT = 1;
    // Policy mandated that UMA be enabled, the user had no choice.
    POLICY_FORCED_ENABLED = 2;
    // The client has no record of which consent flow was used.
    OPT_UNKNOWN = 3;
  }
  optional UmaDefaultState uma_default_state = 22;

  enum AntiVirusState {
    // The security product software is turned on and protecting the user.
    STATE_ON = 0;
    // The security product software is turned off and protection is disabled.
    STATE_OFF = 1;
    // The security product software is in the snoozed state, temporarily off,
    // and not actively protecting the computer.
    STATE_SNOOZED = 2;
    // The security product software has expired and is no longer actively
    // protecting the computer.
    STATE_EXPIRED = 3;
  }

  // Information about installed antivirus products. Windows only. See
  // https://cs.chromium.org/chromium/src/chrome/browser/metrics/antivirus_metrics_provider_win.cc.
  //
  // Next Tag: 6
  message AntiVirusProduct {
    // The product name e.g. "System Center Endpoint Protection". This might not
    // be recorded, see ShouldReportFullNames() in
    // chrome/browser/metrics/antivirus_metrics_provider_win.cc.
    optional string product_name = 1;

    // The hash of the product name.
    optional fixed32 product_name_hash = 2;

    // The version of the product, as read from the file information. This might
    // not be recorded, see ShouldReportFullNames() in
    // chrome/browser/metrics/antivirus_metrics_provider_win.cc.
    optional string product_version = 3;

    // The hash of the product version. Might not be set if the product version
    // could not be obtained from the disk.
    optional fixed32 product_version_hash = 4;

    // The current state of the product.
    optional AntiVirusState product_state = 5;
  }
  repeated AntiVirusProduct antivirus_product = 23;

  enum ComponentId {
    // The client transmitted a component ID the server does not recognize.
    UNKNOWN = 1;

    // All the following are various components.
    FILE_TYPE_POLICIES = 2;
    ORIGIN_TRIALS = 3;
    PEPPER_FLASH = 4;
    PEPPER_FLASH_CHROMEOS = 5;
    PNACL = 6;
    RECOVERY = 7;
    SSL_ERROR_ASSISTANT = 8;
    STH_SET = 9;
    CRL_SET = 10;
    SUBRESOURCE_FILTER = 11;
    SW_REPORTER = 12;
    // Software Decryption CDM on all platforms of Chrome
    WIDEVINE_CDM = 13;
    EPSON_INKJET_PRINTER_ESCPR = 14;
    CROS_TERMINA = 15;
    STAR_CUPS_DRIVER = 16;
    SPEECH_SYNTHESIS_SV_SE = 17;
    OPTIMIZATION_HINTS = 18;
    DOWNLOADABLE_STRINGS = 19;
    VR_ASSETS = 20;
    RTANALYTICS_LIGHT = 21;
    RTANALYTICS_FULL = 22;
    CELLULAR = 23;
    DEMO_MODE_RESOURCES = 24;
    ON_DEVICE_HEAD_SUGGEST = 25;
    CROS_SMART_DIM = 26;
    ZXCVBN_DATA = 27;
    AUTOFILL_REGEX_CONSTANTS = 28;
    WEBVIEW_APPS_PACKAGE_NAMES_ALLOWLIST = 29;
    // Hardware Decryption CDM only for Chrome on Windows.
    MEDIA_FOUNDATION_WIDEVINE_CDM = 30;
    CROWD_DENY = 31;
    APP_PROVISIONING = 32;
    AUTOFILL_STATES = 33;
    CLIENT_SIDE_PHISHING = 34;
    COMMERCE_HEURISTICS = 35;
    CROW_DOMAIN_LIST = 36;
    DEMO_MODE_APP = 37;
    DESKTOP_SCREENSHOT_EDITOR = 38;
    DESKTOP_SHARING_HUB = 39;
    FIRST_PARTY_SETS = 40;
    HYPHENATION = 41;
    INTERVENTION_POLICY_DATABASE = 42;
    LACROS_DOGFOOD_BETA = 43;
    LACROS_DOGFOOD_CANARY = 44;
    LACROS_DOGFOOD_DEV = 45;
    LACROS_DOGFOOD_STABLE = 46;
    MEI_PRELOAD = 47;
    PKI_METADATA = 48;
    REAL_TIME_URL_CHECKS_ALLOWLIST = 49;
    RECOVERY_IMPROVED = 50;
    SAFETY_TIPS = 51;
    SCREEN_AI = 52;
    SMART_DIM = 53;
    SODA = 54;
    SODA_DE_DE = 55;
    SODA_EN_US = 56;
    SODA_ES_ES = 57;
    SODA_FR_FR = 58;
    SODA_IT_IT = 59;
    SODA_JA_JP = 60;
    THIRD_PARTY_MODULE_LIST = 61;
    TRUST_TOKEN_KEY_COMMITMENTS = 62;
    THIRD_PARTY_COOKIE_DEPRECATION_METADATA = 63;
  }

  // Information about what Chrome components are registered and at which
  // version.
  // Next Tag: 5
  message ChromeComponent {
    // Which component this information is for.
    optional ComponentId component_id = 1 [default = UNKNOWN];

    // Human-readable dotted-quad representation of the currently-installed
    // version of the component, e.g. "1.2.3.4".
    optional string version = 2;

    // The first 32 bits of the Omaha-style fingerprint of the installed
    // component, discarding any bits that describe the fingerprint format. In
    // practice this is the first 32 bits of the SHA256 hash of the package that
    // was installed as the component. It is a stronger version number that can
    // vary across platform, architecture, or branches of an A/B component test.
    optional fixed32 omaha_fingerprint = 3;

    // A hash of the cohort identifier of this component, excluding
    // non-assignment information. The hash function is Chromium's
    // PersistentHash.
    optional fixed32 cohort_hash = 4;
  }
  repeated ChromeComponent chrome_component = 24;

  // Information about the user's installed extensions. This will include
  // extensions from all fully-initialized profiles. If a single extension is
  // installed in multiple profiles, it will be recorded multiple times.
  repeated ExtensionInstallProto extension_install = 25;

  // Android-only.
  // For Chrome UMA records, this field contains the package name of the
  // version of Chrome that is running if it's different from
  // "com.android.chrome".  ("com.android.chrome" is the name of the Chrome
  // stable channel app package name.)
  // For WebView UMA records, under some conditions this field contains the
  // package name of the currently-running app.  See http://shortn/_5HRGU153JL
  // for details.
  optional string app_package_name = 26;

  // Indicates if the `app_package_name` should be filtered out on the
  // server-side. The client will use this to signal no further filtering is
  // required if filtering is enabled on the client-side. If the package name is
  // a system app and the server-side filtering is enabled, the client will use
  // this to indicate no filtering is required since system apps are not subject
  // to filtering. Only recorded on the Android WebView platform.
  enum AppPackageNameAllowlistFilter {
    // Indicates the package name filtering was not set.
    // This will be the case with data coming from old WebView versions.
    SERVER_SIDE_FILTER_UNSPECIFIED = 0;
    // Indicates the package name filtering should occur on the server-side
    SERVER_SIDE_FILTER_REQUIRED = 1;
    // Indicates the `app_package_name` does not need filtering since it is
    // a system app.
    NO_SERVER_SIDE_FILTER_REQUIRED_FOR_SYSTEM_APPS = 3;

    // Removed in cl/567086405:
    reserved 2;
    reserved "NO_SERVER_SIDE_FILTER_REQUIRED_DUE_TO_CLIENT_FILTERING";
  }

  optional AppPackageNameAllowlistFilter app_package_name_allowlist_filter = 42;

  enum ClientSideSamplingStatus {
    // Default value, no conclusion can be drawn.
    SAMPLING_UNKNOWN = 0;
    // Client-side sampling was applied.
    SAMPLING_APPLIED = 1;
    // Client-side sampling was not applied.
    SAMPLING_NOT_APPLIED = 2;
  }

  // Specifies whether sampling was applied on the client. Older clients will
  // not set this field, which will result in the default value of UNKNOWN.
  optional ClientSideSamplingStatus client_side_sampling_status = 43;

  enum MetricsFilteringStatus {
    // Not expected to be reported explicitly, used when the field was not set.
    METRICS_UNKNOWN = 0;
    // Client is reporting all recorded histograms and user actions.
    METRICS_ALL = 1;
    // Client is reporting only a chosen set of histogrms and user actions.
    // The semantics of METRICS_ONLY_CRITICAL may vary by platform and evolve
    // over time.
    METRICS_ONLY_CRITICAL = 2;
  }

  // Specifies whether metrics filtering was applied on the client. Metrics
  // filtering applies to both histograms and user actions. The chosen metrics
  // to filter may vary by platform and evolve over time. Older clients will not
  // set this field, which will result in the default value of METRICS_UNKNOWN.
  optional MetricsFilteringStatus metrics_filtering_status = 44;

  // The package which installed Chrome, as reported by
  // PackageManager.getInstallerPackageName().
  enum InstallerPackage {
    // This field was not set.
    INSTALLER_PACKAGE_UNKNOWN = 0;
    // The installer package name returned by Android was empty.
    INSTALLER_PACKAGE_NONE = 1;
    // 'com.android.vending'.
    INSTALLER_PACKAGE_GOOGLE_PLAY_STORE = 2;
    // Any other non-empty value.
    INSTALLER_PACKAGE_OTHER = 3;
  }

  // The package which installed Chrome, as reported by Android.
  optional InstallerPackage installer_package = 35;

  // Data related to the "Better Together" multi-device features. This is only
  // uploaded on Chrome OS.
  // Next Tag: 5
  message LinkedAndroidPhoneData {
    // The pii-free model name of the phone used for Better Together with this
    // device. Will not be set if Better Together is not set up. Hashed using
    // variations::HashName() to produce a 32-bit SHA1 hash.
    optional fixed32 phone_model_name_hash = 1;

    // True if SmartLock is enabled on this Chromebook.
    optional bool is_smartlock_enabled = 2;

    // True if Instant Tethering is enabled on this Chromebook.
    optional bool is_instant_tethering_enabled = 3;

    // True if Messages integration is enabled on this Chromebook.
    // Deprecated 10/23.
    optional bool is_messages_enabled = 4 [deprecated = true];
  }
  optional LinkedAndroidPhoneData linked_android_phone_data = 29;

  // Demo mode related dimension information.
  // Next Tag: 4
  message DemoModeDimensions {
    optional string country = 1;

    // Demo devices retailer id and store id, value is set during demo setup.
    // Next Tag: 3
    message Retailer {
      optional string retailer_id = 1;
      optional string store_id = 2;
    }
    optional Retailer retailer = 2;

    enum CustomizationFacet {
      UNDEFINED = 0;
      CLOUD_GAMING_DEVICE = 1;
      FEATURE_AWARE_DEVICE = 2;
    }
    repeated CustomizationFacet customization_facet = 3 [packed = true];
  }
  optional DemoModeDimensions demo_mode_dimensions = 41;

  // LTSChannel indicates whether ChromeOS is running an lts channel.
  // https://chromium.googlesource.com/chromiumos/docs/+/HEAD/releases.md#channels
  enum LTSChannel {
    // This field was not set.
    LTS_CHANNEL_UNKNOWN = 0;
    // ChromeOS is running stable-channel and not lts.
    LTS_CHANNEL_STABLE = 1;
    // ChromeOS is running ltc-channel.
    LTS_CHANNEL_LTC = 2;
    // ChromeOS is running lts-channel.
    LTS_CHANNEL_LTS = 3;
  }

  // Report whether ChromeOS is running ltc or lts channel.
  // Instead of extending the Channel enum, we report stable-channel and use
  // this separate field to filter out for ltc or lts. Most UMA users are not
  // aware of the existence of lts and we would lose monitoring for many Chrome
  // features.
  optional LTSChannel lts_channel = 45;
}