@fivenet-app/gen 2025.9.1 → 2026.4.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.
Files changed (134) hide show
  1. package/README.md +1 -1
  2. package/clients.ts +36 -0
  3. package/codegen/perms/perms.ts +186 -15
  4. package/codegen/sanitizer/sanitizer.ts +34 -1
  5. package/package.json +2 -2
  6. package/perms.ts +140 -8
  7. package/resources/accounts/accounts.ts +98 -31
  8. package/resources/accounts/{oauth2.ts → oauth2/oauth2.ts} +20 -20
  9. package/resources/audit/audit.ts +156 -38
  10. package/resources/calendar/{access.ts → access/access.ts} +30 -30
  11. package/resources/calendar/calendar.ts +17 -477
  12. package/resources/calendar/entries/entries.ts +474 -0
  13. package/resources/centrum/{access.ts → access/access.ts} +22 -22
  14. package/resources/centrum/{dispatchers.ts → dispatchers/dispatchers.ts} +14 -14
  15. package/resources/centrum/{dispatches.ts → dispatches/dispatches.ts} +151 -185
  16. package/resources/centrum/joblist.ts +136 -0
  17. package/resources/centrum/{settings.ts → settings/settings.ts} +70 -70
  18. package/resources/centrum/{units_access.ts → units/access/access.ts} +30 -30
  19. package/resources/centrum/{units.ts → units/units.ts} +131 -51
  20. package/resources/citizens/labels/labels.ts +526 -0
  21. package/resources/{users → citizens/licenses}/licenses.ts +17 -17
  22. package/resources/clientconfig/clientconfig.ts +126 -258
  23. package/resources/collab/collab.ts +4 -16
  24. package/resources/common/content/content.ts +108 -85
  25. package/resources/common/content/diff_activity.ts +267 -0
  26. package/resources/common/i18n.ts +2 -2
  27. package/resources/{common/cron → cron}/cron.ts +43 -43
  28. package/resources/documents/{access.ts → access/access.ts} +29 -52
  29. package/resources/documents/{activity.ts → activity/activity.ts} +171 -123
  30. package/resources/documents/approval/approval.ts +945 -0
  31. package/resources/documents/{category.ts → category/category.ts} +7 -7
  32. package/resources/documents/{comment.ts → comment/comment.ts} +10 -10
  33. package/resources/documents/data/data.ts +303 -0
  34. package/resources/documents/documents.ts +282 -667
  35. package/resources/{common/uuid.ts → documents/forms/forms.ts} +20 -20
  36. package/resources/documents/{pins.ts → pins/pins.ts} +5 -5
  37. package/resources/documents/references/references.ts +187 -0
  38. package/resources/documents/relations/relations.ts +184 -0
  39. package/resources/documents/{requests.ts → requests/requests.ts} +18 -18
  40. package/resources/documents/stamps/stamp.ts +355 -0
  41. package/resources/documents/{templates.ts → templates/templates.ts} +426 -84
  42. package/resources/documents/{workflow.ts → workflow/workflow.ts} +264 -26
  43. package/resources/file/filestore.ts +1 -1
  44. package/resources/{common/grpcws → grpcws}/grpcws.ts +52 -52
  45. package/resources/jobs/{activity.ts → colleagues/activity/activity.ts} +54 -54
  46. package/resources/jobs/{colleagues.ts → colleagues/colleagues.ts} +17 -28
  47. package/resources/jobs/{conduct.ts → conduct/conduct.ts} +70 -45
  48. package/resources/jobs/{labels.ts → labels/labels.ts} +34 -23
  49. package/resources/jobs/{job_props.ts → props/props.ts} +26 -38
  50. package/resources/jobs/{job_settings.ts → settings/settings.ts} +53 -53
  51. package/resources/jobs/{timeclock.ts → timeclock/timeclock.ts} +17 -17
  52. package/resources/livemap/{heatmap.ts → heatmap/heatmap.ts} +4 -4
  53. package/resources/livemap/{marker_marker.ts → markers/marker_marker.ts} +35 -35
  54. package/resources/livemap/{user_marker.ts → markers/user_marker.ts} +115 -36
  55. package/resources/mailer/{access.ts → access/access.ts} +67 -67
  56. package/resources/mailer/{email.ts → emails/email.ts} +19 -19
  57. package/resources/mailer/{events.ts → events/events.ts} +24 -24
  58. package/resources/mailer/{message.ts → messages/message.ts} +29 -29
  59. package/resources/mailer/{settings.ts → settings/settings.ts} +14 -13
  60. package/resources/mailer/{template.ts → templates/template.ts} +15 -15
  61. package/resources/mailer/{thread.ts → threads/thread.ts} +29 -29
  62. package/resources/notifications/{client_view.ts → clientview/clientview.ts} +22 -22
  63. package/resources/notifications/{events.ts → events/events.ts} +20 -20
  64. package/resources/notifications/notifications.ts +4 -4
  65. package/resources/permissions/{attributes.ts → attributes/attributes.ts} +42 -42
  66. package/resources/permissions/{events.ts → events/events.ts} +7 -7
  67. package/resources/permissions/{permissions.ts → permissions/permissions.ts} +30 -19
  68. package/resources/qualifications/{access.ts → access/access.ts} +19 -19
  69. package/resources/qualifications/{exam.ts → exam/exam.ts} +269 -141
  70. package/resources/qualifications/qualifications.ts +51 -179
  71. package/resources/settings/banner.ts +3 -3
  72. package/resources/settings/config.ts +527 -25
  73. package/resources/{documents/state.ts → settings/data.ts} +41 -20
  74. package/resources/settings/perms.ts +14 -14
  75. package/resources/stats/stats.ts +379 -0
  76. package/resources/sync/{activity.ts → activity/activity.ts} +104 -25
  77. package/resources/sync/{data.ts → data/data.ts} +405 -59
  78. package/resources/userinfo/{user_info.ts → userinfo.ts} +71 -93
  79. package/resources/users/{activity.ts → activity/activity.ts} +242 -101
  80. package/resources/users/{props.ts → props/props.ts} +91 -69
  81. package/resources/users/short/user.ts +184 -0
  82. package/resources/users/{users.ts → user.ts} +266 -195
  83. package/resources/vehicles/{activity.ts → activity/activity.ts} +20 -20
  84. package/resources/vehicles/{props.ts → props/props.ts} +28 -6
  85. package/resources/vehicles/vehicles.ts +20 -8
  86. package/resources/wiki/{access.ts → access/access.ts} +30 -30
  87. package/resources/wiki/{activity.ts → activity/activity.ts} +104 -70
  88. package/resources/wiki/page.ts +39 -15
  89. package/services/auth/auth.client.ts +23 -10
  90. package/services/auth/auth.ts +445 -262
  91. package/services/calendar/calendar.ts +56 -34
  92. package/services/centrum/centrum.ts +127 -127
  93. package/services/citizens/citizens.client.ts +0 -13
  94. package/services/citizens/citizens.ts +44 -134
  95. package/services/citizens/labels.client.ts +77 -0
  96. package/services/citizens/labels.ts +455 -0
  97. package/services/completor/completor.ts +36 -16
  98. package/services/documents/approval.client.ts +188 -0
  99. package/services/documents/approval.ts +1776 -0
  100. package/services/documents/documents.ts +164 -186
  101. package/services/documents/forms.client.ts +51 -0
  102. package/services/documents/forms.ts +232 -0
  103. package/services/documents/stamps.client.ts +77 -0
  104. package/services/documents/stamps.ts +481 -0
  105. package/services/documents/stats.client.ts +38 -0
  106. package/services/documents/stats.ts +245 -0
  107. package/services/jobs/conduct.client.ts +30 -3
  108. package/services/jobs/conduct.ts +159 -33
  109. package/services/jobs/jobs.ts +43 -43
  110. package/services/jobs/stats.client.ts +38 -0
  111. package/services/jobs/stats.ts +207 -0
  112. package/services/jobs/timeclock.ts +39 -39
  113. package/services/livemap/livemap.ts +18 -18
  114. package/services/mailer/mailer.ts +78 -78
  115. package/services/notifications/notifications.ts +35 -35
  116. package/services/qualifications/qualifications.ts +81 -46
  117. package/services/settings/accounts.client.ts +23 -10
  118. package/services/settings/accounts.ts +191 -30
  119. package/services/settings/cron.client.ts +13 -0
  120. package/services/settings/cron.ts +118 -5
  121. package/services/settings/laws.ts +1 -1
  122. package/services/settings/settings.ts +73 -52
  123. package/services/settings/system.client.ts +13 -0
  124. package/services/settings/system.ts +115 -15
  125. package/services/stats/stats.client.ts +7 -7
  126. package/services/stats/stats.ts +24 -24
  127. package/services/sync/sync.client.ts +271 -37
  128. package/services/sync/sync.ts +1525 -421
  129. package/services/vehicles/vehicles.ts +8 -8
  130. package/services/wiki/wiki.ts +8 -8
  131. package/svcs.ts +100 -6
  132. package/resources/centrum/attributes.ts +0 -183
  133. package/resources/documents/signoff.ts +0 -55
  134. package/resources/users/labels.ts +0 -160
@@ -1,5 +1,5 @@
1
1
  // @generated by protobuf-ts 2.11.1 with parameter force_server_none,long_type_number,optimize_speed,ts_nocheck
2
- // @generated from protobuf file "resources/qualifications/exam.proto" (package "resources.qualifications", syntax proto3)
2
+ // @generated from protobuf file "resources/qualifications/exam/exam.proto" (package "resources.qualifications.exam", syntax proto3)
3
3
  // tslint:disable
4
4
  // @ts-nocheck
5
5
  import type { BinaryWriteOptions } from "@protobuf-ts/runtime";
@@ -11,21 +11,41 @@ import { UnknownFieldHandler } from "@protobuf-ts/runtime";
11
11
  import type { PartialMessage } from "@protobuf-ts/runtime";
12
12
  import { reflectionMergePartial } from "@protobuf-ts/runtime";
13
13
  import { MessageType } from "@protobuf-ts/runtime";
14
- import { File } from "../file/file";
15
- import { Timestamp } from "../timestamp/timestamp";
16
- // Exam / Questions
17
-
14
+ import { File } from "../../file/file";
15
+ import { Timestamp } from "../../timestamp/timestamp";
16
+ import { Duration } from "../../../google/protobuf/duration";
18
17
  /**
19
- * @generated from protobuf message resources.qualifications.ExamQuestions
18
+ * @generated from protobuf message resources.qualifications.exam.QualificationExamSettings
19
+ */
20
+ export interface QualificationExamSettings {
21
+ /**
22
+ * @generated from protobuf field: google.protobuf.Duration time = 1
23
+ */
24
+ time?: Duration;
25
+ /**
26
+ * @generated from protobuf field: bool auto_grade = 2
27
+ */
28
+ autoGrade: boolean;
29
+ /**
30
+ * @generated from protobuf field: resources.qualifications.exam.AutoGradeMode auto_grade_mode = 3
31
+ */
32
+ autoGradeMode: AutoGradeMode;
33
+ /**
34
+ * @generated from protobuf field: int32 minimum_points = 4
35
+ */
36
+ minimumPoints: number;
37
+ }
38
+ /**
39
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestions
20
40
  */
21
41
  export interface ExamQuestions {
22
42
  /**
23
- * @generated from protobuf field: repeated resources.qualifications.ExamQuestion questions = 1
43
+ * @generated from protobuf field: repeated resources.qualifications.exam.ExamQuestion questions = 1
24
44
  */
25
45
  questions: ExamQuestion[];
26
46
  }
27
47
  /**
28
- * @generated from protobuf message resources.qualifications.ExamQuestion
48
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestion
29
49
  */
30
50
  export interface ExamQuestion {
31
51
  /**
@@ -53,11 +73,11 @@ export interface ExamQuestion {
53
73
  */
54
74
  description?: string;
55
75
  /**
56
- * @generated from protobuf field: resources.qualifications.ExamQuestionData data = 7
76
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionData data = 7
57
77
  */
58
78
  data?: ExamQuestionData;
59
79
  /**
60
- * @generated from protobuf field: optional resources.qualifications.ExamQuestionAnswerData answer = 8
80
+ * @generated from protobuf field: optional resources.qualifications.exam.ExamQuestionAnswerData answer = 8
61
81
  */
62
82
  answer?: ExamQuestionAnswerData;
63
83
  /**
@@ -70,7 +90,7 @@ export interface ExamQuestion {
70
90
  order: number;
71
91
  }
72
92
  /**
73
- * @generated from protobuf message resources.qualifications.ExamQuestionData
93
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionData
74
94
  */
75
95
  export interface ExamQuestionData {
76
96
  /**
@@ -79,37 +99,37 @@ export interface ExamQuestionData {
79
99
  data: {
80
100
  oneofKind: "separator";
81
101
  /**
82
- * @generated from protobuf field: resources.qualifications.ExamQuestionSeparator separator = 1
102
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionSeparator separator = 1
83
103
  */
84
104
  separator: ExamQuestionSeparator;
85
105
  } | {
86
106
  oneofKind: "image";
87
107
  /**
88
- * @generated from protobuf field: resources.qualifications.ExamQuestionImage image = 6
108
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionImage image = 6
89
109
  */
90
110
  image: ExamQuestionImage;
91
111
  } | {
92
112
  oneofKind: "yesno";
93
113
  /**
94
- * @generated from protobuf field: resources.qualifications.ExamQuestionYesNo yesno = 2
114
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionYesNo yesno = 2
95
115
  */
96
116
  yesno: ExamQuestionYesNo;
97
117
  } | {
98
118
  oneofKind: "freeText";
99
119
  /**
100
- * @generated from protobuf field: resources.qualifications.ExamQuestionText free_text = 3
120
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionText free_text = 3
101
121
  */
102
122
  freeText: ExamQuestionText;
103
123
  } | {
104
124
  oneofKind: "singleChoice";
105
125
  /**
106
- * @generated from protobuf field: resources.qualifications.ExamQuestionSingleChoice single_choice = 4
126
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionSingleChoice single_choice = 4
107
127
  */
108
128
  singleChoice: ExamQuestionSingleChoice;
109
129
  } | {
110
130
  oneofKind: "multipleChoice";
111
131
  /**
112
- * @generated from protobuf field: resources.qualifications.ExamQuestionMultipleChoice multiple_choice = 5
132
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestionMultipleChoice multiple_choice = 5
113
133
  */
114
134
  multipleChoice: ExamQuestionMultipleChoice;
115
135
  } | {
@@ -117,12 +137,12 @@ export interface ExamQuestionData {
117
137
  };
118
138
  }
119
139
  /**
120
- * @generated from protobuf message resources.qualifications.ExamQuestionSeparator
140
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionSeparator
121
141
  */
122
142
  export interface ExamQuestionSeparator {
123
143
  }
124
144
  /**
125
- * @generated from protobuf message resources.qualifications.ExamQuestionImage
145
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionImage
126
146
  */
127
147
  export interface ExamQuestionImage {
128
148
  /**
@@ -135,12 +155,12 @@ export interface ExamQuestionImage {
135
155
  alt?: string;
136
156
  }
137
157
  /**
138
- * @generated from protobuf message resources.qualifications.ExamQuestionYesNo
158
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionYesNo
139
159
  */
140
160
  export interface ExamQuestionYesNo {
141
161
  }
142
162
  /**
143
- * @generated from protobuf message resources.qualifications.ExamQuestionText
163
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionText
144
164
  */
145
165
  export interface ExamQuestionText {
146
166
  /**
@@ -153,7 +173,7 @@ export interface ExamQuestionText {
153
173
  maxLength: number;
154
174
  }
155
175
  /**
156
- * @generated from protobuf message resources.qualifications.ExamQuestionSingleChoice
176
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionSingleChoice
157
177
  */
158
178
  export interface ExamQuestionSingleChoice {
159
179
  /**
@@ -162,7 +182,7 @@ export interface ExamQuestionSingleChoice {
162
182
  choices: string[];
163
183
  }
164
184
  /**
165
- * @generated from protobuf message resources.qualifications.ExamQuestionMultipleChoice
185
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionMultipleChoice
166
186
  */
167
187
  export interface ExamQuestionMultipleChoice {
168
188
  /**
@@ -175,7 +195,7 @@ export interface ExamQuestionMultipleChoice {
175
195
  limit?: number;
176
196
  }
177
197
  /**
178
- * @generated from protobuf message resources.qualifications.ExamQuestionAnswerData
198
+ * @generated from protobuf message resources.qualifications.exam.ExamQuestionAnswerData
179
199
  */
180
200
  export interface ExamQuestionAnswerData {
181
201
  /**
@@ -188,25 +208,25 @@ export interface ExamQuestionAnswerData {
188
208
  answer: {
189
209
  oneofKind: "yesno";
190
210
  /**
191
- * @generated from protobuf field: resources.qualifications.ExamResponseYesNo yesno = 4
211
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseYesNo yesno = 4
192
212
  */
193
213
  yesno: ExamResponseYesNo;
194
214
  } | {
195
215
  oneofKind: "freeText";
196
216
  /**
197
- * @generated from protobuf field: resources.qualifications.ExamResponseText free_text = 5
217
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseText free_text = 5
198
218
  */
199
219
  freeText: ExamResponseText;
200
220
  } | {
201
221
  oneofKind: "singleChoice";
202
222
  /**
203
- * @generated from protobuf field: resources.qualifications.ExamResponseSingleChoice single_choice = 6
223
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseSingleChoice single_choice = 6
204
224
  */
205
225
  singleChoice: ExamResponseSingleChoice;
206
226
  } | {
207
227
  oneofKind: "multipleChoice";
208
228
  /**
209
- * @generated from protobuf field: resources.qualifications.ExamResponseMultipleChoice multiple_choice = 7
229
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice = 7
210
230
  */
211
231
  multipleChoice: ExamResponseMultipleChoice;
212
232
  } | {
@@ -216,7 +236,7 @@ export interface ExamQuestionAnswerData {
216
236
  // User Response
217
237
 
218
238
  /**
219
- * @generated from protobuf message resources.qualifications.ExamUser
239
+ * @generated from protobuf message resources.qualifications.exam.ExamUser
220
240
  */
221
241
  export interface ExamUser {
222
242
  /**
@@ -245,7 +265,7 @@ export interface ExamUser {
245
265
  endedAt?: Timestamp;
246
266
  }
247
267
  /**
248
- * @generated from protobuf message resources.qualifications.ExamResponses
268
+ * @generated from protobuf message resources.qualifications.exam.ExamResponses
249
269
  */
250
270
  export interface ExamResponses {
251
271
  /**
@@ -257,12 +277,12 @@ export interface ExamResponses {
257
277
  */
258
278
  userId: number;
259
279
  /**
260
- * @generated from protobuf field: repeated resources.qualifications.ExamResponse responses = 3
280
+ * @generated from protobuf field: repeated resources.qualifications.exam.ExamResponse responses = 3
261
281
  */
262
282
  responses: ExamResponse[];
263
283
  }
264
284
  /**
265
- * @generated from protobuf message resources.qualifications.ExamResponse
285
+ * @generated from protobuf message resources.qualifications.exam.ExamResponse
266
286
  */
267
287
  export interface ExamResponse {
268
288
  /**
@@ -274,16 +294,16 @@ export interface ExamResponse {
274
294
  */
275
295
  userId: number;
276
296
  /**
277
- * @generated from protobuf field: resources.qualifications.ExamQuestion question = 3
297
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestion question = 3
278
298
  */
279
299
  question?: ExamQuestion;
280
300
  /**
281
- * @generated from protobuf field: resources.qualifications.ExamResponseData response = 4
301
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseData response = 4
282
302
  */
283
303
  response?: ExamResponseData;
284
304
  }
285
305
  /**
286
- * @generated from protobuf message resources.qualifications.ExamResponseData
306
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseData
287
307
  */
288
308
  export interface ExamResponseData {
289
309
  /**
@@ -292,31 +312,31 @@ export interface ExamResponseData {
292
312
  response: {
293
313
  oneofKind: "separator";
294
314
  /**
295
- * @generated from protobuf field: resources.qualifications.ExamResponseSeparator separator = 3
315
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseSeparator separator = 3
296
316
  */
297
317
  separator: ExamResponseSeparator;
298
318
  } | {
299
319
  oneofKind: "yesno";
300
320
  /**
301
- * @generated from protobuf field: resources.qualifications.ExamResponseYesNo yesno = 4
321
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseYesNo yesno = 4
302
322
  */
303
323
  yesno: ExamResponseYesNo;
304
324
  } | {
305
325
  oneofKind: "freeText";
306
326
  /**
307
- * @generated from protobuf field: resources.qualifications.ExamResponseText free_text = 5
327
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseText free_text = 5
308
328
  */
309
329
  freeText: ExamResponseText;
310
330
  } | {
311
331
  oneofKind: "singleChoice";
312
332
  /**
313
- * @generated from protobuf field: resources.qualifications.ExamResponseSingleChoice single_choice = 6
333
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseSingleChoice single_choice = 6
314
334
  */
315
335
  singleChoice: ExamResponseSingleChoice;
316
336
  } | {
317
337
  oneofKind: "multipleChoice";
318
338
  /**
319
- * @generated from protobuf field: resources.qualifications.ExamResponseMultipleChoice multiple_choice = 7
339
+ * @generated from protobuf field: resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice = 7
320
340
  */
321
341
  multipleChoice: ExamResponseMultipleChoice;
322
342
  } | {
@@ -324,12 +344,12 @@ export interface ExamResponseData {
324
344
  };
325
345
  }
326
346
  /**
327
- * @generated from protobuf message resources.qualifications.ExamResponseSeparator
347
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseSeparator
328
348
  */
329
349
  export interface ExamResponseSeparator {
330
350
  }
331
351
  /**
332
- * @generated from protobuf message resources.qualifications.ExamResponseYesNo
352
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseYesNo
333
353
  */
334
354
  export interface ExamResponseYesNo {
335
355
  /**
@@ -338,7 +358,7 @@ export interface ExamResponseYesNo {
338
358
  value: boolean;
339
359
  }
340
360
  /**
341
- * @generated from protobuf message resources.qualifications.ExamResponseText
361
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseText
342
362
  */
343
363
  export interface ExamResponseText {
344
364
  /**
@@ -347,7 +367,7 @@ export interface ExamResponseText {
347
367
  text: string; // 0.5 Megabyte
348
368
  }
349
369
  /**
350
- * @generated from protobuf message resources.qualifications.ExamResponseSingleChoice
370
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseSingleChoice
351
371
  */
352
372
  export interface ExamResponseSingleChoice {
353
373
  /**
@@ -356,7 +376,7 @@ export interface ExamResponseSingleChoice {
356
376
  choice: string;
357
377
  }
358
378
  /**
359
- * @generated from protobuf message resources.qualifications.ExamResponseMultipleChoice
379
+ * @generated from protobuf message resources.qualifications.exam.ExamResponseMultipleChoice
360
380
  */
361
381
  export interface ExamResponseMultipleChoice {
362
382
  /**
@@ -365,16 +385,16 @@ export interface ExamResponseMultipleChoice {
365
385
  choices: string[];
366
386
  }
367
387
  /**
368
- * @generated from protobuf message resources.qualifications.ExamGrading
388
+ * @generated from protobuf message resources.qualifications.exam.ExamGrading
369
389
  */
370
390
  export interface ExamGrading {
371
391
  /**
372
- * @generated from protobuf field: repeated resources.qualifications.ExamGradingResponse responses = 1
392
+ * @generated from protobuf field: repeated resources.qualifications.exam.ExamGradingResponse responses = 1
373
393
  */
374
394
  responses: ExamGradingResponse[];
375
395
  }
376
396
  /**
377
- * @generated from protobuf message resources.qualifications.ExamGradingResponse
397
+ * @generated from protobuf message resources.qualifications.exam.ExamGradingResponse
378
398
  */
379
399
  export interface ExamGradingResponse {
380
400
  /**
@@ -390,10 +410,118 @@ export interface ExamGradingResponse {
390
410
  */
391
411
  checked?: boolean;
392
412
  }
413
+ /**
414
+ * @generated from protobuf enum resources.qualifications.exam.QualificationExamMode
415
+ */
416
+ export enum QualificationExamMode {
417
+ /**
418
+ * @generated from protobuf enum value: QUALIFICATION_EXAM_MODE_UNSPECIFIED = 0;
419
+ */
420
+ UNSPECIFIED = 0,
421
+ /**
422
+ * @generated from protobuf enum value: QUALIFICATION_EXAM_MODE_DISABLED = 1;
423
+ */
424
+ DISABLED = 1,
425
+ /**
426
+ * @generated from protobuf enum value: QUALIFICATION_EXAM_MODE_REQUEST_NEEDED = 2;
427
+ */
428
+ REQUEST_NEEDED = 2,
429
+ /**
430
+ * @generated from protobuf enum value: QUALIFICATION_EXAM_MODE_ENABLED = 3;
431
+ */
432
+ ENABLED = 3
433
+ }
434
+ /**
435
+ * @generated from protobuf enum resources.qualifications.exam.AutoGradeMode
436
+ */
437
+ export enum AutoGradeMode {
438
+ /**
439
+ * @generated from protobuf enum value: AUTO_GRADE_MODE_UNSPECIFIED = 0;
440
+ */
441
+ UNSPECIFIED = 0,
442
+ /**
443
+ * @generated from protobuf enum value: AUTO_GRADE_MODE_STRICT = 1;
444
+ */
445
+ STRICT = 1,
446
+ /**
447
+ * @generated from protobuf enum value: AUTO_GRADE_MODE_PARTIAL_CREDIT = 2;
448
+ */
449
+ PARTIAL_CREDIT = 2
450
+ }
451
+ // @generated message type with reflection information, may provide speed optimized methods
452
+ class QualificationExamSettings$Type extends MessageType<QualificationExamSettings> {
453
+ constructor() {
454
+ super("resources.qualifications.exam.QualificationExamSettings", [
455
+ { no: 1, name: "time", kind: "message", T: () => Duration, options: { "buf.validate.field": { required: true, duration: { lt: { seconds: "1036800" }, gte: { seconds: "300" } } } } },
456
+ { no: 2, name: "auto_grade", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
457
+ { no: 3, name: "auto_grade_mode", kind: "enum", T: () => ["resources.qualifications.exam.AutoGradeMode", AutoGradeMode, "AUTO_GRADE_MODE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
458
+ { no: 4, name: "minimum_points", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
459
+ ], { "codegen.dbscanner.dbscanner": { enabled: true } });
460
+ }
461
+ create(value?: PartialMessage<QualificationExamSettings>): QualificationExamSettings {
462
+ const message = globalThis.Object.create((this.messagePrototype!));
463
+ message.autoGrade = false;
464
+ message.autoGradeMode = 0;
465
+ message.minimumPoints = 0;
466
+ if (value !== undefined)
467
+ reflectionMergePartial<QualificationExamSettings>(this, message, value);
468
+ return message;
469
+ }
470
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QualificationExamSettings): QualificationExamSettings {
471
+ let message = target ?? this.create(), end = reader.pos + length;
472
+ while (reader.pos < end) {
473
+ let [fieldNo, wireType] = reader.tag();
474
+ switch (fieldNo) {
475
+ case /* google.protobuf.Duration time */ 1:
476
+ message.time = Duration.internalBinaryRead(reader, reader.uint32(), options, message.time);
477
+ break;
478
+ case /* bool auto_grade */ 2:
479
+ message.autoGrade = reader.bool();
480
+ break;
481
+ case /* resources.qualifications.exam.AutoGradeMode auto_grade_mode */ 3:
482
+ message.autoGradeMode = reader.int32();
483
+ break;
484
+ case /* int32 minimum_points */ 4:
485
+ message.minimumPoints = reader.int32();
486
+ break;
487
+ default:
488
+ let u = options.readUnknownField;
489
+ if (u === "throw")
490
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
491
+ let d = reader.skip(wireType);
492
+ if (u !== false)
493
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
494
+ }
495
+ }
496
+ return message;
497
+ }
498
+ internalBinaryWrite(message: QualificationExamSettings, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
499
+ /* google.protobuf.Duration time = 1; */
500
+ if (message.time)
501
+ Duration.internalBinaryWrite(message.time, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
502
+ /* bool auto_grade = 2; */
503
+ if (message.autoGrade !== false)
504
+ writer.tag(2, WireType.Varint).bool(message.autoGrade);
505
+ /* resources.qualifications.exam.AutoGradeMode auto_grade_mode = 3; */
506
+ if (message.autoGradeMode !== 0)
507
+ writer.tag(3, WireType.Varint).int32(message.autoGradeMode);
508
+ /* int32 minimum_points = 4; */
509
+ if (message.minimumPoints !== 0)
510
+ writer.tag(4, WireType.Varint).int32(message.minimumPoints);
511
+ let u = options.writeUnknownFields;
512
+ if (u !== false)
513
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
514
+ return writer;
515
+ }
516
+ }
517
+ /**
518
+ * @generated MessageType for protobuf message resources.qualifications.exam.QualificationExamSettings
519
+ */
520
+ export const QualificationExamSettings = new QualificationExamSettings$Type();
393
521
  // @generated message type with reflection information, may provide speed optimized methods
394
522
  class ExamQuestions$Type extends MessageType<ExamQuestions> {
395
523
  constructor() {
396
- super("resources.qualifications.ExamQuestions", [
524
+ super("resources.qualifications.exam.ExamQuestions", [
397
525
  { no: 1, name: "questions", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => ExamQuestion, options: { "buf.validate.field": { repeated: { maxItems: "100" } } } }
398
526
  ]);
399
527
  }
@@ -409,7 +537,7 @@ class ExamQuestions$Type extends MessageType<ExamQuestions> {
409
537
  while (reader.pos < end) {
410
538
  let [fieldNo, wireType] = reader.tag();
411
539
  switch (fieldNo) {
412
- case /* repeated resources.qualifications.ExamQuestion questions */ 1:
540
+ case /* repeated resources.qualifications.exam.ExamQuestion questions */ 1:
413
541
  message.questions.push(ExamQuestion.internalBinaryRead(reader, reader.uint32(), options));
414
542
  break;
415
543
  default:
@@ -424,7 +552,7 @@ class ExamQuestions$Type extends MessageType<ExamQuestions> {
424
552
  return message;
425
553
  }
426
554
  internalBinaryWrite(message: ExamQuestions, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
427
- /* repeated resources.qualifications.ExamQuestion questions = 1; */
555
+ /* repeated resources.qualifications.exam.ExamQuestion questions = 1; */
428
556
  for (let i = 0; i < message.questions.length; i++)
429
557
  ExamQuestion.internalBinaryWrite(message.questions[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
430
558
  let u = options.writeUnknownFields;
@@ -434,19 +562,19 @@ class ExamQuestions$Type extends MessageType<ExamQuestions> {
434
562
  }
435
563
  }
436
564
  /**
437
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestions
565
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestions
438
566
  */
439
567
  export const ExamQuestions = new ExamQuestions$Type();
440
568
  // @generated message type with reflection information, may provide speed optimized methods
441
569
  class ExamQuestion$Type extends MessageType<ExamQuestion> {
442
570
  constructor() {
443
- super("resources.qualifications.ExamQuestion", [
571
+ super("resources.qualifications.exam.ExamQuestion", [
444
572
  { no: 1, name: "id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
445
573
  { no: 2, name: "qualification_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
446
574
  { no: 3, name: "created_at", kind: "message", T: () => Timestamp },
447
575
  { no: 4, name: "updated_at", kind: "message", T: () => Timestamp },
448
- { no: 5, name: "title", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } },
449
- { no: 6, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "1024" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } },
576
+ { no: 5, name: "title", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
577
+ { no: 6, name: "description", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "1024" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
450
578
  { no: 7, name: "data", kind: "message", T: () => ExamQuestionData, options: { "buf.validate.field": { required: true } } },
451
579
  { no: 8, name: "answer", kind: "message", T: () => ExamQuestionAnswerData },
452
580
  { no: 9, name: "points", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { gte: 0 } } } },
@@ -486,10 +614,10 @@ class ExamQuestion$Type extends MessageType<ExamQuestion> {
486
614
  case /* optional string description */ 6:
487
615
  message.description = reader.string();
488
616
  break;
489
- case /* resources.qualifications.ExamQuestionData data */ 7:
617
+ case /* resources.qualifications.exam.ExamQuestionData data */ 7:
490
618
  message.data = ExamQuestionData.internalBinaryRead(reader, reader.uint32(), options, message.data);
491
619
  break;
492
- case /* optional resources.qualifications.ExamQuestionAnswerData answer */ 8:
620
+ case /* optional resources.qualifications.exam.ExamQuestionAnswerData answer */ 8:
493
621
  message.answer = ExamQuestionAnswerData.internalBinaryRead(reader, reader.uint32(), options, message.answer);
494
622
  break;
495
623
  case /* optional int32 points */ 9:
@@ -528,10 +656,10 @@ class ExamQuestion$Type extends MessageType<ExamQuestion> {
528
656
  /* optional string description = 6; */
529
657
  if (message.description !== undefined)
530
658
  writer.tag(6, WireType.LengthDelimited).string(message.description);
531
- /* resources.qualifications.ExamQuestionData data = 7; */
659
+ /* resources.qualifications.exam.ExamQuestionData data = 7; */
532
660
  if (message.data)
533
661
  ExamQuestionData.internalBinaryWrite(message.data, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
534
- /* optional resources.qualifications.ExamQuestionAnswerData answer = 8; */
662
+ /* optional resources.qualifications.exam.ExamQuestionAnswerData answer = 8; */
535
663
  if (message.answer)
536
664
  ExamQuestionAnswerData.internalBinaryWrite(message.answer, writer.tag(8, WireType.LengthDelimited).fork(), options).join();
537
665
  /* optional int32 points = 9; */
@@ -547,13 +675,13 @@ class ExamQuestion$Type extends MessageType<ExamQuestion> {
547
675
  }
548
676
  }
549
677
  /**
550
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestion
678
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestion
551
679
  */
552
680
  export const ExamQuestion = new ExamQuestion$Type();
553
681
  // @generated message type with reflection information, may provide speed optimized methods
554
682
  class ExamQuestionData$Type extends MessageType<ExamQuestionData> {
555
683
  constructor() {
556
- super("resources.qualifications.ExamQuestionData", [
684
+ super("resources.qualifications.exam.ExamQuestionData", [
557
685
  { no: 1, name: "separator", kind: "message", oneof: "data", T: () => ExamQuestionSeparator },
558
686
  { no: 6, name: "image", kind: "message", oneof: "data", T: () => ExamQuestionImage },
559
687
  { no: 2, name: "yesno", kind: "message", oneof: "data", T: () => ExamQuestionYesNo },
@@ -574,37 +702,37 @@ class ExamQuestionData$Type extends MessageType<ExamQuestionData> {
574
702
  while (reader.pos < end) {
575
703
  let [fieldNo, wireType] = reader.tag();
576
704
  switch (fieldNo) {
577
- case /* resources.qualifications.ExamQuestionSeparator separator */ 1:
705
+ case /* resources.qualifications.exam.ExamQuestionSeparator separator */ 1:
578
706
  message.data = {
579
707
  oneofKind: "separator",
580
708
  separator: ExamQuestionSeparator.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).separator)
581
709
  };
582
710
  break;
583
- case /* resources.qualifications.ExamQuestionImage image */ 6:
711
+ case /* resources.qualifications.exam.ExamQuestionImage image */ 6:
584
712
  message.data = {
585
713
  oneofKind: "image",
586
714
  image: ExamQuestionImage.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).image)
587
715
  };
588
716
  break;
589
- case /* resources.qualifications.ExamQuestionYesNo yesno */ 2:
717
+ case /* resources.qualifications.exam.ExamQuestionYesNo yesno */ 2:
590
718
  message.data = {
591
719
  oneofKind: "yesno",
592
720
  yesno: ExamQuestionYesNo.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).yesno)
593
721
  };
594
722
  break;
595
- case /* resources.qualifications.ExamQuestionText free_text */ 3:
723
+ case /* resources.qualifications.exam.ExamQuestionText free_text */ 3:
596
724
  message.data = {
597
725
  oneofKind: "freeText",
598
726
  freeText: ExamQuestionText.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).freeText)
599
727
  };
600
728
  break;
601
- case /* resources.qualifications.ExamQuestionSingleChoice single_choice */ 4:
729
+ case /* resources.qualifications.exam.ExamQuestionSingleChoice single_choice */ 4:
602
730
  message.data = {
603
731
  oneofKind: "singleChoice",
604
732
  singleChoice: ExamQuestionSingleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).singleChoice)
605
733
  };
606
734
  break;
607
- case /* resources.qualifications.ExamQuestionMultipleChoice multiple_choice */ 5:
735
+ case /* resources.qualifications.exam.ExamQuestionMultipleChoice multiple_choice */ 5:
608
736
  message.data = {
609
737
  oneofKind: "multipleChoice",
610
738
  multipleChoice: ExamQuestionMultipleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).multipleChoice)
@@ -622,22 +750,22 @@ class ExamQuestionData$Type extends MessageType<ExamQuestionData> {
622
750
  return message;
623
751
  }
624
752
  internalBinaryWrite(message: ExamQuestionData, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
625
- /* resources.qualifications.ExamQuestionSeparator separator = 1; */
753
+ /* resources.qualifications.exam.ExamQuestionSeparator separator = 1; */
626
754
  if (message.data.oneofKind === "separator")
627
755
  ExamQuestionSeparator.internalBinaryWrite(message.data.separator, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
628
- /* resources.qualifications.ExamQuestionYesNo yesno = 2; */
756
+ /* resources.qualifications.exam.ExamQuestionYesNo yesno = 2; */
629
757
  if (message.data.oneofKind === "yesno")
630
758
  ExamQuestionYesNo.internalBinaryWrite(message.data.yesno, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
631
- /* resources.qualifications.ExamQuestionText free_text = 3; */
759
+ /* resources.qualifications.exam.ExamQuestionText free_text = 3; */
632
760
  if (message.data.oneofKind === "freeText")
633
761
  ExamQuestionText.internalBinaryWrite(message.data.freeText, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
634
- /* resources.qualifications.ExamQuestionSingleChoice single_choice = 4; */
762
+ /* resources.qualifications.exam.ExamQuestionSingleChoice single_choice = 4; */
635
763
  if (message.data.oneofKind === "singleChoice")
636
764
  ExamQuestionSingleChoice.internalBinaryWrite(message.data.singleChoice, writer.tag(4, WireType.LengthDelimited).fork(), options).join();
637
- /* resources.qualifications.ExamQuestionMultipleChoice multiple_choice = 5; */
765
+ /* resources.qualifications.exam.ExamQuestionMultipleChoice multiple_choice = 5; */
638
766
  if (message.data.oneofKind === "multipleChoice")
639
767
  ExamQuestionMultipleChoice.internalBinaryWrite(message.data.multipleChoice, writer.tag(5, WireType.LengthDelimited).fork(), options).join();
640
- /* resources.qualifications.ExamQuestionImage image = 6; */
768
+ /* resources.qualifications.exam.ExamQuestionImage image = 6; */
641
769
  if (message.data.oneofKind === "image")
642
770
  ExamQuestionImage.internalBinaryWrite(message.data.image, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
643
771
  let u = options.writeUnknownFields;
@@ -647,13 +775,13 @@ class ExamQuestionData$Type extends MessageType<ExamQuestionData> {
647
775
  }
648
776
  }
649
777
  /**
650
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionData
778
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionData
651
779
  */
652
780
  export const ExamQuestionData = new ExamQuestionData$Type();
653
781
  // @generated message type with reflection information, may provide speed optimized methods
654
782
  class ExamQuestionSeparator$Type extends MessageType<ExamQuestionSeparator> {
655
783
  constructor() {
656
- super("resources.qualifications.ExamQuestionSeparator", []);
784
+ super("resources.qualifications.exam.ExamQuestionSeparator", []);
657
785
  }
658
786
  create(value?: PartialMessage<ExamQuestionSeparator>): ExamQuestionSeparator {
659
787
  const message = globalThis.Object.create((this.messagePrototype!));
@@ -685,13 +813,13 @@ class ExamQuestionSeparator$Type extends MessageType<ExamQuestionSeparator> {
685
813
  }
686
814
  }
687
815
  /**
688
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionSeparator
816
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionSeparator
689
817
  */
690
818
  export const ExamQuestionSeparator = new ExamQuestionSeparator$Type();
691
819
  // @generated message type with reflection information, may provide speed optimized methods
692
820
  class ExamQuestionImage$Type extends MessageType<ExamQuestionImage> {
693
821
  constructor() {
694
- super("resources.qualifications.ExamQuestionImage", [
822
+ super("resources.qualifications.exam.ExamQuestionImage", [
695
823
  { no: 1, name: "image", kind: "message", T: () => File },
696
824
  { no: 2, name: "alt", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "128" } } } }
697
825
  ]);
@@ -738,13 +866,13 @@ class ExamQuestionImage$Type extends MessageType<ExamQuestionImage> {
738
866
  }
739
867
  }
740
868
  /**
741
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionImage
869
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionImage
742
870
  */
743
871
  export const ExamQuestionImage = new ExamQuestionImage$Type();
744
872
  // @generated message type with reflection information, may provide speed optimized methods
745
873
  class ExamQuestionYesNo$Type extends MessageType<ExamQuestionYesNo> {
746
874
  constructor() {
747
- super("resources.qualifications.ExamQuestionYesNo", []);
875
+ super("resources.qualifications.exam.ExamQuestionYesNo", []);
748
876
  }
749
877
  create(value?: PartialMessage<ExamQuestionYesNo>): ExamQuestionYesNo {
750
878
  const message = globalThis.Object.create((this.messagePrototype!));
@@ -776,13 +904,13 @@ class ExamQuestionYesNo$Type extends MessageType<ExamQuestionYesNo> {
776
904
  }
777
905
  }
778
906
  /**
779
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionYesNo
907
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionYesNo
780
908
  */
781
909
  export const ExamQuestionYesNo = new ExamQuestionYesNo$Type();
782
910
  // @generated message type with reflection information, may provide speed optimized methods
783
911
  class ExamQuestionText$Type extends MessageType<ExamQuestionText> {
784
912
  constructor() {
785
- super("resources.qualifications.ExamQuestionText", [
913
+ super("resources.qualifications.exam.ExamQuestionText", [
786
914
  { no: 1, name: "min_length", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
787
915
  { no: 2, name: "max_length", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
788
916
  ]);
@@ -831,14 +959,14 @@ class ExamQuestionText$Type extends MessageType<ExamQuestionText> {
831
959
  }
832
960
  }
833
961
  /**
834
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionText
962
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionText
835
963
  */
836
964
  export const ExamQuestionText = new ExamQuestionText$Type();
837
965
  // @generated message type with reflection information, may provide speed optimized methods
838
966
  class ExamQuestionSingleChoice$Type extends MessageType<ExamQuestionSingleChoice> {
839
967
  constructor() {
840
- super("resources.qualifications.ExamQuestionSingleChoice", [
841
- { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } }
968
+ super("resources.qualifications.exam.ExamQuestionSingleChoice", [
969
+ { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } }
842
970
  ]);
843
971
  }
844
972
  create(value?: PartialMessage<ExamQuestionSingleChoice>): ExamQuestionSingleChoice {
@@ -878,14 +1006,14 @@ class ExamQuestionSingleChoice$Type extends MessageType<ExamQuestionSingleChoice
878
1006
  }
879
1007
  }
880
1008
  /**
881
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionSingleChoice
1009
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionSingleChoice
882
1010
  */
883
1011
  export const ExamQuestionSingleChoice = new ExamQuestionSingleChoice$Type();
884
1012
  // @generated message type with reflection information, may provide speed optimized methods
885
1013
  class ExamQuestionMultipleChoice$Type extends MessageType<ExamQuestionMultipleChoice> {
886
1014
  constructor() {
887
- super("resources.qualifications.ExamQuestionMultipleChoice", [
888
- { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } },
1015
+ super("resources.qualifications.exam.ExamQuestionMultipleChoice", [
1016
+ { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
889
1017
  { no: 2, name: "limit", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { lte: 10, gte: 0 } } } }
890
1018
  ]);
891
1019
  }
@@ -932,13 +1060,13 @@ class ExamQuestionMultipleChoice$Type extends MessageType<ExamQuestionMultipleCh
932
1060
  }
933
1061
  }
934
1062
  /**
935
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionMultipleChoice
1063
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionMultipleChoice
936
1064
  */
937
1065
  export const ExamQuestionMultipleChoice = new ExamQuestionMultipleChoice$Type();
938
1066
  // @generated message type with reflection information, may provide speed optimized methods
939
1067
  class ExamQuestionAnswerData$Type extends MessageType<ExamQuestionAnswerData> {
940
1068
  constructor() {
941
- super("resources.qualifications.ExamQuestionAnswerData", [
1069
+ super("resources.qualifications.exam.ExamQuestionAnswerData", [
942
1070
  { no: 1, name: "answer_key", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "1024" } } } },
943
1071
  { no: 4, name: "yesno", kind: "message", oneof: "answer", T: () => ExamResponseYesNo },
944
1072
  { no: 5, name: "free_text", kind: "message", oneof: "answer", T: () => ExamResponseText },
@@ -962,25 +1090,25 @@ class ExamQuestionAnswerData$Type extends MessageType<ExamQuestionAnswerData> {
962
1090
  case /* string answer_key */ 1:
963
1091
  message.answerKey = reader.string();
964
1092
  break;
965
- case /* resources.qualifications.ExamResponseYesNo yesno */ 4:
1093
+ case /* resources.qualifications.exam.ExamResponseYesNo yesno */ 4:
966
1094
  message.answer = {
967
1095
  oneofKind: "yesno",
968
1096
  yesno: ExamResponseYesNo.internalBinaryRead(reader, reader.uint32(), options, (message.answer as any).yesno)
969
1097
  };
970
1098
  break;
971
- case /* resources.qualifications.ExamResponseText free_text */ 5:
1099
+ case /* resources.qualifications.exam.ExamResponseText free_text */ 5:
972
1100
  message.answer = {
973
1101
  oneofKind: "freeText",
974
1102
  freeText: ExamResponseText.internalBinaryRead(reader, reader.uint32(), options, (message.answer as any).freeText)
975
1103
  };
976
1104
  break;
977
- case /* resources.qualifications.ExamResponseSingleChoice single_choice */ 6:
1105
+ case /* resources.qualifications.exam.ExamResponseSingleChoice single_choice */ 6:
978
1106
  message.answer = {
979
1107
  oneofKind: "singleChoice",
980
1108
  singleChoice: ExamResponseSingleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.answer as any).singleChoice)
981
1109
  };
982
1110
  break;
983
- case /* resources.qualifications.ExamResponseMultipleChoice multiple_choice */ 7:
1111
+ case /* resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice */ 7:
984
1112
  message.answer = {
985
1113
  oneofKind: "multipleChoice",
986
1114
  multipleChoice: ExamResponseMultipleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.answer as any).multipleChoice)
@@ -1001,16 +1129,16 @@ class ExamQuestionAnswerData$Type extends MessageType<ExamQuestionAnswerData> {
1001
1129
  /* string answer_key = 1; */
1002
1130
  if (message.answerKey !== "")
1003
1131
  writer.tag(1, WireType.LengthDelimited).string(message.answerKey);
1004
- /* resources.qualifications.ExamResponseYesNo yesno = 4; */
1132
+ /* resources.qualifications.exam.ExamResponseYesNo yesno = 4; */
1005
1133
  if (message.answer.oneofKind === "yesno")
1006
1134
  ExamResponseYesNo.internalBinaryWrite(message.answer.yesno, writer.tag(4, WireType.LengthDelimited).fork(), options).join();
1007
- /* resources.qualifications.ExamResponseText free_text = 5; */
1135
+ /* resources.qualifications.exam.ExamResponseText free_text = 5; */
1008
1136
  if (message.answer.oneofKind === "freeText")
1009
1137
  ExamResponseText.internalBinaryWrite(message.answer.freeText, writer.tag(5, WireType.LengthDelimited).fork(), options).join();
1010
- /* resources.qualifications.ExamResponseSingleChoice single_choice = 6; */
1138
+ /* resources.qualifications.exam.ExamResponseSingleChoice single_choice = 6; */
1011
1139
  if (message.answer.oneofKind === "singleChoice")
1012
1140
  ExamResponseSingleChoice.internalBinaryWrite(message.answer.singleChoice, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
1013
- /* resources.qualifications.ExamResponseMultipleChoice multiple_choice = 7; */
1141
+ /* resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice = 7; */
1014
1142
  if (message.answer.oneofKind === "multipleChoice")
1015
1143
  ExamResponseMultipleChoice.internalBinaryWrite(message.answer.multipleChoice, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
1016
1144
  let u = options.writeUnknownFields;
@@ -1020,13 +1148,13 @@ class ExamQuestionAnswerData$Type extends MessageType<ExamQuestionAnswerData> {
1020
1148
  }
1021
1149
  }
1022
1150
  /**
1023
- * @generated MessageType for protobuf message resources.qualifications.ExamQuestionAnswerData
1151
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamQuestionAnswerData
1024
1152
  */
1025
1153
  export const ExamQuestionAnswerData = new ExamQuestionAnswerData$Type();
1026
1154
  // @generated message type with reflection information, may provide speed optimized methods
1027
1155
  class ExamUser$Type extends MessageType<ExamUser> {
1028
1156
  constructor() {
1029
- super("resources.qualifications.ExamUser", [
1157
+ super("resources.qualifications.exam.ExamUser", [
1030
1158
  { no: 1, name: "qualification_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1031
1159
  { no: 2, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
1032
1160
  { no: 3, name: "created_at", kind: "message", T: () => Timestamp },
@@ -1103,13 +1231,13 @@ class ExamUser$Type extends MessageType<ExamUser> {
1103
1231
  }
1104
1232
  }
1105
1233
  /**
1106
- * @generated MessageType for protobuf message resources.qualifications.ExamUser
1234
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamUser
1107
1235
  */
1108
1236
  export const ExamUser = new ExamUser$Type();
1109
1237
  // @generated message type with reflection information, may provide speed optimized methods
1110
1238
  class ExamResponses$Type extends MessageType<ExamResponses> {
1111
1239
  constructor() {
1112
- super("resources.qualifications.ExamResponses", [
1240
+ super("resources.qualifications.exam.ExamResponses", [
1113
1241
  { no: 1, name: "qualification_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1114
1242
  { no: 2, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
1115
1243
  { no: 3, name: "responses", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => ExamResponse, options: { "buf.validate.field": { repeated: { maxItems: "100" } } } }
@@ -1135,7 +1263,7 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1135
1263
  case /* int32 user_id */ 2:
1136
1264
  message.userId = reader.int32();
1137
1265
  break;
1138
- case /* repeated resources.qualifications.ExamResponse responses */ 3:
1266
+ case /* repeated resources.qualifications.exam.ExamResponse responses */ 3:
1139
1267
  message.responses.push(ExamResponse.internalBinaryRead(reader, reader.uint32(), options));
1140
1268
  break;
1141
1269
  default:
@@ -1156,7 +1284,7 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1156
1284
  /* int32 user_id = 2; */
1157
1285
  if (message.userId !== 0)
1158
1286
  writer.tag(2, WireType.Varint).int32(message.userId);
1159
- /* repeated resources.qualifications.ExamResponse responses = 3; */
1287
+ /* repeated resources.qualifications.exam.ExamResponse responses = 3; */
1160
1288
  for (let i = 0; i < message.responses.length; i++)
1161
1289
  ExamResponse.internalBinaryWrite(message.responses[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1162
1290
  let u = options.writeUnknownFields;
@@ -1166,13 +1294,13 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1166
1294
  }
1167
1295
  }
1168
1296
  /**
1169
- * @generated MessageType for protobuf message resources.qualifications.ExamResponses
1297
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponses
1170
1298
  */
1171
1299
  export const ExamResponses = new ExamResponses$Type();
1172
1300
  // @generated message type with reflection information, may provide speed optimized methods
1173
1301
  class ExamResponse$Type extends MessageType<ExamResponse> {
1174
1302
  constructor() {
1175
- super("resources.qualifications.ExamResponse", [
1303
+ super("resources.qualifications.exam.ExamResponse", [
1176
1304
  { no: 1, name: "question_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1177
1305
  { no: 2, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
1178
1306
  { no: 3, name: "question", kind: "message", T: () => ExamQuestion },
@@ -1198,10 +1326,10 @@ class ExamResponse$Type extends MessageType<ExamResponse> {
1198
1326
  case /* int32 user_id */ 2:
1199
1327
  message.userId = reader.int32();
1200
1328
  break;
1201
- case /* resources.qualifications.ExamQuestion question */ 3:
1329
+ case /* resources.qualifications.exam.ExamQuestion question */ 3:
1202
1330
  message.question = ExamQuestion.internalBinaryRead(reader, reader.uint32(), options, message.question);
1203
1331
  break;
1204
- case /* resources.qualifications.ExamResponseData response */ 4:
1332
+ case /* resources.qualifications.exam.ExamResponseData response */ 4:
1205
1333
  message.response = ExamResponseData.internalBinaryRead(reader, reader.uint32(), options, message.response);
1206
1334
  break;
1207
1335
  default:
@@ -1222,10 +1350,10 @@ class ExamResponse$Type extends MessageType<ExamResponse> {
1222
1350
  /* int32 user_id = 2; */
1223
1351
  if (message.userId !== 0)
1224
1352
  writer.tag(2, WireType.Varint).int32(message.userId);
1225
- /* resources.qualifications.ExamQuestion question = 3; */
1353
+ /* resources.qualifications.exam.ExamQuestion question = 3; */
1226
1354
  if (message.question)
1227
1355
  ExamQuestion.internalBinaryWrite(message.question, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1228
- /* resources.qualifications.ExamResponseData response = 4; */
1356
+ /* resources.qualifications.exam.ExamResponseData response = 4; */
1229
1357
  if (message.response)
1230
1358
  ExamResponseData.internalBinaryWrite(message.response, writer.tag(4, WireType.LengthDelimited).fork(), options).join();
1231
1359
  let u = options.writeUnknownFields;
@@ -1235,13 +1363,13 @@ class ExamResponse$Type extends MessageType<ExamResponse> {
1235
1363
  }
1236
1364
  }
1237
1365
  /**
1238
- * @generated MessageType for protobuf message resources.qualifications.ExamResponse
1366
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponse
1239
1367
  */
1240
1368
  export const ExamResponse = new ExamResponse$Type();
1241
1369
  // @generated message type with reflection information, may provide speed optimized methods
1242
1370
  class ExamResponseData$Type extends MessageType<ExamResponseData> {
1243
1371
  constructor() {
1244
- super("resources.qualifications.ExamResponseData", [
1372
+ super("resources.qualifications.exam.ExamResponseData", [
1245
1373
  { no: 3, name: "separator", kind: "message", oneof: "response", T: () => ExamResponseSeparator },
1246
1374
  { no: 4, name: "yesno", kind: "message", oneof: "response", T: () => ExamResponseYesNo },
1247
1375
  { no: 5, name: "free_text", kind: "message", oneof: "response", T: () => ExamResponseText },
@@ -1261,31 +1389,31 @@ class ExamResponseData$Type extends MessageType<ExamResponseData> {
1261
1389
  while (reader.pos < end) {
1262
1390
  let [fieldNo, wireType] = reader.tag();
1263
1391
  switch (fieldNo) {
1264
- case /* resources.qualifications.ExamResponseSeparator separator */ 3:
1392
+ case /* resources.qualifications.exam.ExamResponseSeparator separator */ 3:
1265
1393
  message.response = {
1266
1394
  oneofKind: "separator",
1267
1395
  separator: ExamResponseSeparator.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).separator)
1268
1396
  };
1269
1397
  break;
1270
- case /* resources.qualifications.ExamResponseYesNo yesno */ 4:
1398
+ case /* resources.qualifications.exam.ExamResponseYesNo yesno */ 4:
1271
1399
  message.response = {
1272
1400
  oneofKind: "yesno",
1273
1401
  yesno: ExamResponseYesNo.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).yesno)
1274
1402
  };
1275
1403
  break;
1276
- case /* resources.qualifications.ExamResponseText free_text */ 5:
1404
+ case /* resources.qualifications.exam.ExamResponseText free_text */ 5:
1277
1405
  message.response = {
1278
1406
  oneofKind: "freeText",
1279
1407
  freeText: ExamResponseText.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).freeText)
1280
1408
  };
1281
1409
  break;
1282
- case /* resources.qualifications.ExamResponseSingleChoice single_choice */ 6:
1410
+ case /* resources.qualifications.exam.ExamResponseSingleChoice single_choice */ 6:
1283
1411
  message.response = {
1284
1412
  oneofKind: "singleChoice",
1285
1413
  singleChoice: ExamResponseSingleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).singleChoice)
1286
1414
  };
1287
1415
  break;
1288
- case /* resources.qualifications.ExamResponseMultipleChoice multiple_choice */ 7:
1416
+ case /* resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice */ 7:
1289
1417
  message.response = {
1290
1418
  oneofKind: "multipleChoice",
1291
1419
  multipleChoice: ExamResponseMultipleChoice.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).multipleChoice)
@@ -1303,19 +1431,19 @@ class ExamResponseData$Type extends MessageType<ExamResponseData> {
1303
1431
  return message;
1304
1432
  }
1305
1433
  internalBinaryWrite(message: ExamResponseData, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
1306
- /* resources.qualifications.ExamResponseSeparator separator = 3; */
1434
+ /* resources.qualifications.exam.ExamResponseSeparator separator = 3; */
1307
1435
  if (message.response.oneofKind === "separator")
1308
1436
  ExamResponseSeparator.internalBinaryWrite(message.response.separator, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1309
- /* resources.qualifications.ExamResponseYesNo yesno = 4; */
1437
+ /* resources.qualifications.exam.ExamResponseYesNo yesno = 4; */
1310
1438
  if (message.response.oneofKind === "yesno")
1311
1439
  ExamResponseYesNo.internalBinaryWrite(message.response.yesno, writer.tag(4, WireType.LengthDelimited).fork(), options).join();
1312
- /* resources.qualifications.ExamResponseText free_text = 5; */
1440
+ /* resources.qualifications.exam.ExamResponseText free_text = 5; */
1313
1441
  if (message.response.oneofKind === "freeText")
1314
1442
  ExamResponseText.internalBinaryWrite(message.response.freeText, writer.tag(5, WireType.LengthDelimited).fork(), options).join();
1315
- /* resources.qualifications.ExamResponseSingleChoice single_choice = 6; */
1443
+ /* resources.qualifications.exam.ExamResponseSingleChoice single_choice = 6; */
1316
1444
  if (message.response.oneofKind === "singleChoice")
1317
1445
  ExamResponseSingleChoice.internalBinaryWrite(message.response.singleChoice, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
1318
- /* resources.qualifications.ExamResponseMultipleChoice multiple_choice = 7; */
1446
+ /* resources.qualifications.exam.ExamResponseMultipleChoice multiple_choice = 7; */
1319
1447
  if (message.response.oneofKind === "multipleChoice")
1320
1448
  ExamResponseMultipleChoice.internalBinaryWrite(message.response.multipleChoice, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
1321
1449
  let u = options.writeUnknownFields;
@@ -1325,13 +1453,13 @@ class ExamResponseData$Type extends MessageType<ExamResponseData> {
1325
1453
  }
1326
1454
  }
1327
1455
  /**
1328
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseData
1456
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseData
1329
1457
  */
1330
1458
  export const ExamResponseData = new ExamResponseData$Type();
1331
1459
  // @generated message type with reflection information, may provide speed optimized methods
1332
1460
  class ExamResponseSeparator$Type extends MessageType<ExamResponseSeparator> {
1333
1461
  constructor() {
1334
- super("resources.qualifications.ExamResponseSeparator", []);
1462
+ super("resources.qualifications.exam.ExamResponseSeparator", []);
1335
1463
  }
1336
1464
  create(value?: PartialMessage<ExamResponseSeparator>): ExamResponseSeparator {
1337
1465
  const message = globalThis.Object.create((this.messagePrototype!));
@@ -1363,13 +1491,13 @@ class ExamResponseSeparator$Type extends MessageType<ExamResponseSeparator> {
1363
1491
  }
1364
1492
  }
1365
1493
  /**
1366
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseSeparator
1494
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseSeparator
1367
1495
  */
1368
1496
  export const ExamResponseSeparator = new ExamResponseSeparator$Type();
1369
1497
  // @generated message type with reflection information, may provide speed optimized methods
1370
1498
  class ExamResponseYesNo$Type extends MessageType<ExamResponseYesNo> {
1371
1499
  constructor() {
1372
- super("resources.qualifications.ExamResponseYesNo", [
1500
+ super("resources.qualifications.exam.ExamResponseYesNo", [
1373
1501
  { no: 1, name: "value", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1374
1502
  ]);
1375
1503
  }
@@ -1410,14 +1538,14 @@ class ExamResponseYesNo$Type extends MessageType<ExamResponseYesNo> {
1410
1538
  }
1411
1539
  }
1412
1540
  /**
1413
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseYesNo
1541
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseYesNo
1414
1542
  */
1415
1543
  export const ExamResponseYesNo = new ExamResponseYesNo$Type();
1416
1544
  // @generated message type with reflection information, may provide speed optimized methods
1417
1545
  class ExamResponseText$Type extends MessageType<ExamResponseText> {
1418
1546
  constructor() {
1419
- super("resources.qualifications.ExamResponseText", [
1420
- { no: 1, name: "text", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxBytes: "500000" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } }
1547
+ super("resources.qualifications.exam.ExamResponseText", [
1548
+ { no: 1, name: "text", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxBytes: "500000" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } }
1421
1549
  ]);
1422
1550
  }
1423
1551
  create(value?: PartialMessage<ExamResponseText>): ExamResponseText {
@@ -1457,14 +1585,14 @@ class ExamResponseText$Type extends MessageType<ExamResponseText> {
1457
1585
  }
1458
1586
  }
1459
1587
  /**
1460
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseText
1588
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseText
1461
1589
  */
1462
1590
  export const ExamResponseText = new ExamResponseText$Type();
1463
1591
  // @generated message type with reflection information, may provide speed optimized methods
1464
1592
  class ExamResponseSingleChoice$Type extends MessageType<ExamResponseSingleChoice> {
1465
1593
  constructor() {
1466
- super("resources.qualifications.ExamResponseSingleChoice", [
1467
- { no: 1, name: "choice", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } }
1594
+ super("resources.qualifications.exam.ExamResponseSingleChoice", [
1595
+ { no: 1, name: "choice", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } }
1468
1596
  ]);
1469
1597
  }
1470
1598
  create(value?: PartialMessage<ExamResponseSingleChoice>): ExamResponseSingleChoice {
@@ -1504,14 +1632,14 @@ class ExamResponseSingleChoice$Type extends MessageType<ExamResponseSingleChoice
1504
1632
  }
1505
1633
  }
1506
1634
  /**
1507
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseSingleChoice
1635
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseSingleChoice
1508
1636
  */
1509
1637
  export const ExamResponseSingleChoice = new ExamResponseSingleChoice$Type();
1510
1638
  // @generated message type with reflection information, may provide speed optimized methods
1511
1639
  class ExamResponseMultipleChoice$Type extends MessageType<ExamResponseMultipleChoice> {
1512
1640
  constructor() {
1513
- super("resources.qualifications.ExamResponseMultipleChoice", [
1514
- { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, method: "StripTags" } } }
1641
+ super("resources.qualifications.exam.ExamResponseMultipleChoice", [
1642
+ { no: 1, name: "choices", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } }
1515
1643
  ]);
1516
1644
  }
1517
1645
  create(value?: PartialMessage<ExamResponseMultipleChoice>): ExamResponseMultipleChoice {
@@ -1551,13 +1679,13 @@ class ExamResponseMultipleChoice$Type extends MessageType<ExamResponseMultipleCh
1551
1679
  }
1552
1680
  }
1553
1681
  /**
1554
- * @generated MessageType for protobuf message resources.qualifications.ExamResponseMultipleChoice
1682
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamResponseMultipleChoice
1555
1683
  */
1556
1684
  export const ExamResponseMultipleChoice = new ExamResponseMultipleChoice$Type();
1557
1685
  // @generated message type with reflection information, may provide speed optimized methods
1558
1686
  class ExamGrading$Type extends MessageType<ExamGrading> {
1559
1687
  constructor() {
1560
- super("resources.qualifications.ExamGrading", [
1688
+ super("resources.qualifications.exam.ExamGrading", [
1561
1689
  { no: 1, name: "responses", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => ExamGradingResponse, options: { "buf.validate.field": { repeated: { maxItems: "100" } } } }
1562
1690
  ], { "codegen.dbscanner.dbscanner": { enabled: true } });
1563
1691
  }
@@ -1573,7 +1701,7 @@ class ExamGrading$Type extends MessageType<ExamGrading> {
1573
1701
  while (reader.pos < end) {
1574
1702
  let [fieldNo, wireType] = reader.tag();
1575
1703
  switch (fieldNo) {
1576
- case /* repeated resources.qualifications.ExamGradingResponse responses */ 1:
1704
+ case /* repeated resources.qualifications.exam.ExamGradingResponse responses */ 1:
1577
1705
  message.responses.push(ExamGradingResponse.internalBinaryRead(reader, reader.uint32(), options));
1578
1706
  break;
1579
1707
  default:
@@ -1588,7 +1716,7 @@ class ExamGrading$Type extends MessageType<ExamGrading> {
1588
1716
  return message;
1589
1717
  }
1590
1718
  internalBinaryWrite(message: ExamGrading, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
1591
- /* repeated resources.qualifications.ExamGradingResponse responses = 1; */
1719
+ /* repeated resources.qualifications.exam.ExamGradingResponse responses = 1; */
1592
1720
  for (let i = 0; i < message.responses.length; i++)
1593
1721
  ExamGradingResponse.internalBinaryWrite(message.responses[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
1594
1722
  let u = options.writeUnknownFields;
@@ -1598,13 +1726,13 @@ class ExamGrading$Type extends MessageType<ExamGrading> {
1598
1726
  }
1599
1727
  }
1600
1728
  /**
1601
- * @generated MessageType for protobuf message resources.qualifications.ExamGrading
1729
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamGrading
1602
1730
  */
1603
1731
  export const ExamGrading = new ExamGrading$Type();
1604
1732
  // @generated message type with reflection information, may provide speed optimized methods
1605
1733
  class ExamGradingResponse$Type extends MessageType<ExamGradingResponse> {
1606
1734
  constructor() {
1607
- super("resources.qualifications.ExamGradingResponse", [
1735
+ super("resources.qualifications.exam.ExamGradingResponse", [
1608
1736
  { no: 1, name: "question_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1609
1737
  { no: 2, name: "points", kind: "scalar", T: 2 /*ScalarType.FLOAT*/, options: { "buf.validate.field": { float: { lte: 1000, gte: 0 } } } },
1610
1738
  { no: 3, name: "checked", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
@@ -1660,6 +1788,6 @@ class ExamGradingResponse$Type extends MessageType<ExamGradingResponse> {
1660
1788
  }
1661
1789
  }
1662
1790
  /**
1663
- * @generated MessageType for protobuf message resources.qualifications.ExamGradingResponse
1791
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamGradingResponse
1664
1792
  */
1665
1793
  export const ExamGradingResponse = new ExamGradingResponse$Type();