diff --git a/404.html b/404.html index 4c64c140..c1808024 100644 --- a/404.html +++ b/404.html @@ -5,13 +5,13 @@ Page Not Found | Documentation - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/assets/files/segmented_election.json-db7f1138d512dc0934fd809888df3f77.yaml b/assets/files/segmented_election.json-db7f1138d512dc0934fd809888df3f77.yaml deleted file mode 100644 index b2811897..00000000 --- a/assets/files/segmented_election.json-db7f1138d512dc0934fd809888df3f77.yaml +++ /dev/null @@ -1,142 +0,0 @@ -[ - { - "title": "Segmented election", - "description": "", - "authorities": [ - "trustee-a2" - ], - "director": "trustee-a1", - "presentation": { - "theme": "default", - "urls": [], - "theme_css": "" - }, - "layout": "simple", - "num_successful_logins_allowed": 0, - "tallyPipesConfig": "{\"version\":\"7.0.0-beta.1\",\"pipes\":[{\"type\":\"tally_pipes.pipes.results.do_tallies\",\"params\":{}},{\"type\":\"tally_pipes.pipes.sort.sort_non_iterative\",\"params\":{}}]}", - "census": { - "has_ballot_boxes": false, - "voters": [], - "auth_method": "email", - "census": "close", - "extra_fields": [ - { - "name": "province", - "type": "text", - "required": false, - "autofill": false, - "min": 2, - "max": 200, - "private": true, - "required_on_authentication": false, - "match_census_on_registration": false, - "fill_if_empty_on_registration": false, - "register-pipeline": [], - "must": false - }, - { - "name": "email", - "type": "email", - "required": true, - "unique": true, - "min": 4, - "max": 255, - "required_on_authentication": true, - "must": true - } - ], - "admin_fields": [], - "config": { - "subject": "Vote now with Sequent", - "msg": "Vote in __URL__ with code __CODE__", - "registration-action": { - "mode": "vote", - "mode-config": null - }, - "authentication-action": { - "mode": "vote", - "mode-config": null - }, - "allow_user_resend": false - }, - "support_otl_enabled": false, - "inside_authenticate_otl_period": false - }, - "questions": [ - { - "description": "", - "layout": "simultaneous-questions", - "max": 1, - "min": 0, - "num_winners": 1, - "title": "Test question", - "tally_type": "plurality-at-large", - "answer_total_votes_percentage": "over-total-valid-votes", - "answers": [ - { - "id": 0, - "category": "", - "details": "", - "sort_order": 0, - "urls": [], - "text": "Yes" - }, - { - "id": 1, - "category": "", - "details": "", - "sort_order": 1, - "urls": [], - "text": "No" - }, - { - "id": 2, - "category": "", - "details": "", - "sort_order": 2, - "urls": [], - "text": "Abstention" - } - ], - "extra_options": { - "shuffle_categories": false, - "shuffle_all_options": false, - "shuffle_category_list": [], - "show_points": false - } - } - ], - "extra_data": {}, - "id": null, - "ballotBoxesResultsConfig": "", - "virtual": false, - "tally_allowed": false, - "publicCandidates": true, - "segmentedMixing": true, - "virtualSubelections": [], - "mixingCategorySegmentation": { - "categoryName": "province", - "categories": [ - "Sevilla", - "Madrid" - ] - }, - "logo_url": "", - "stats": {}, - "tallyAllowed": true, - "auths": [ - "7xx-a1", - "7xx-a2" - ], - "auth": { - "authentication": "email", - "census": 2 - }, - "children_election_info": null, - "children_tally_status": [], - "parent_id": null, - "hide_default_login_lookup_field": false, - "allow_public_census_query": false, - "childrenElectionNames": {} - } -] \ No newline at end of file diff --git a/assets/images/segmented-results-dashboard-9f3f119a8c470bf080e0c3c45ae970f6.png b/assets/images/segmented-results-dashboard-9f3f119a8c470bf080e0c3c45ae970f6.png deleted file mode 100644 index 460850b1..00000000 Binary files a/assets/images/segmented-results-dashboard-9f3f119a8c470bf080e0c3c45ae970f6.png and /dev/null differ diff --git a/assets/js/01a21e46.6e0ca0a4.js b/assets/js/01a21e46.6e0ca0a4.js deleted file mode 100644 index 47c0d75a..00000000 --- a/assets/js/01a21e46.6e0ca0a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[734],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,l=e.originalType,s=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),u=p(n),k=i,c=u["".concat(s,".").concat(k)]||u[k]||m[k]||l;return n?a.createElement(c,o(o({ref:t},d),{},{components:n})):a.createElement(c,o({ref:t},d))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var l=n.length,o=new Array(l);o[0]=u;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:i,o[1]=r;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>r,toc:()=>p});var a=n(3117),i=(n(7294),n(3905));const l={sidebar_position:0,title:"Election Creation JSON"},o=void 0,r={unversionedId:"general/reference/election-creation-json",id:"general/reference/election-creation-json",title:"Election Creation JSON",description:"Election JSON settings",source:"@site/docs/general/reference/election-creation-json.md",sourceDirName:"general/reference",slug:"/general/reference/election-creation-json",permalink:"/documentation/docs/general/reference/election-creation-json",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/reference/election-creation-json.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0,title:"Election Creation JSON"},sidebar:"generalSidebar",previous:{title:"Reference",permalink:"/documentation/docs/general/reference/"},next:{title:"Ballot Encoding",permalink:"/documentation/docs/general/reference/ballot-encoding"}},s={},p=[{value:"Election JSON settings",id:"election-json-settings",level:2},{value:"Election object",id:"election-object",level:2},{value:"Election: id",id:"election-id",level:3},{value:"Election: title",id:"election-title",level:3},{value:"Election: title_i18n",id:"election-title_i18n",level:3},{value:"Election: description",id:"election-description",level:3},{value:"Election: description_i18n",id:"election-description_i18n",level:3},{value:"Election: virtual",id:"election-virtual",level:3},{value:"Election: virtualSubelections",id:"election-virtualsubelections",level:3},{value:"Election: parent_id",id:"election-parent_id",level:3},{value:"Election: children_election_info",id:"election-children_election_info",level:3},{value:"Election: director",id:"election-director",level:3},{value:"Election: authorities",id:"election-authorities",level:3},{value:"Election: questions",id:"election-questions",level:3},{value:"Election: presentation",id:"election-presentation",level:3},{value:"Election: scheduled_events",id:"election-scheduled_events",level:3},{value:"Election: layout",id:"election-layout",level:3},{value:"Election: support_otl_enabled",id:"election-support_otl_enabled",level:3},{value:"Election: inside_authenticate_otl_period",id:"election-inside_authenticate_otl_period",level:3},{value:"Election: num_successful_logins_allowed",id:"election-num_successful_logins_allowed",level:3},{value:"Election: tallyPipesConfig",id:"election-tallypipesconfig",level:3},{value:"Election: has_ballot_boxes",id:"election-has_ballot_boxes",level:3},{value:"Election: ballot_boxes",id:"election-ballot_boxes",level:3},{value:"Election: census",id:"election-census",level:3},{value:"Election: hide_default_login_lookup_field",id:"election-hide_default_login_lookup_field",level:3},{value:"Election: segmentedMixing",id:"election-segmentedmixing",level:3},{value:"Election: mixingCategorySegmentation",id:"election-mixingcategorysegmentation",level:3},{value:"Election: publicCandidates",id:"election-publiccandidates",level:3},{value:"Election: allow_public_census_query",id:"election-allow_public_census_query",level:3},{value:"Election: logo_url",id:"election-logo_url",level:3},{value:"Election: start_date",id:"election-start_date",level:3},{value:"Election: end_date",id:"election-end_date",level:3},{value:"Election Presentation Object",id:"election-presentation-object",level:2},{value:"Election Presentation: theme",id:"election-presentation-theme",level:3},{value:"Election Presentation: share_text",id:"election-presentation-share_text",level:3},{value:"Election Presentation: i18n_override",id:"election-presentation-i18n_override",level:3},{value:"Election Presentation: pdf_url",id:"election-presentation-pdf_url",level:3},{value:"Election Presentation: urls",id:"election-presentation-urls",level:3},{value:"Election Presentation: theme_css",id:"election-presentation-theme_css",level:3},{value:"Election Presentation: extra_options",id:"election-presentation-extra_options",level:3},{value:"Election Presentation: anchor_continue_btn_to_bottom",id:"election-presentation-anchor_continue_btn_to_bottom",level:3},{value:"Election Presentation: mandatory_acceptance_tos_html",id:"election-presentation-mandatory_acceptance_tos_html",level:3},{value:"Election Presentation: mandatory_acceptance_tos_html_i18n",id:"election-presentation-mandatory_acceptance_tos_html_i18n",level:3},{value:"Election Presentation: booth_log_out__countdown_seconds",id:"election-presentation-booth_log_out__countdown_seconds",level:3},{value:"Election Presentation: public_title",id:"election-presentation-public_title",level:3},{value:"Election Presentation: public_title_i18n",id:"election-presentation-public_title_i18n",level:3},{value:"Election Presentation: i18n_languages_conf",id:"election-presentation-i18n_languages_conf",level:3},{value:"Share Text Object",id:"share-text-object",level:2},{value:"Share Text: network",id:"share-text-network",level:3},{value:"Share Text: button_text",id:"share-text-button_text",level:3},{value:"Share Text: social_message",id:"share-text-social_message",level:3},{value:"Election Presentation Extra Options Object",id:"election-presentation-extra-options-object",level:2},{value:"Election Presentation Options: allow_voting_end_graceful_period",id:"election-presentation-options-allow_voting_end_graceful_period",level:3},{value:"Election Presentation Options: start_screen__skip",id:"election-presentation-options-start_screen__skip",level:3},{value:"Election Presentation Options: disable__demo_voting_booth",id:"election-presentation-options-disable__demo_voting_booth",level:3},{value:"Election Presentation Options: booth_log_out__disable",id:"election-presentation-options-booth_log_out__disable",level:3},{value:"Election Presentation Options: disable__election_chooser_screen",id:"election-presentation-options-disable__election_chooser_screen",level:3},{value:"Election Presentation Options: disable__public_home",id:"election-presentation-options-disable__public_home",level:3},{value:"Election Presentation Options: success_screen__hide_ballot_tracker",id:"election-presentation-options-success_screen__hide_ballot_tracker",level:3},{value:"Election Presentation Options: success_screen__hide_qr_code",id:"election-presentation-options-success_screen__hide_qr_code",level:3},{value:"Election Presentation Options: success_screen__hide_download_ballot_ticket",id:"election-presentation-options-success_screen__hide_download_ballot_ticket",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_url",id:"election-presentation-options-success_screen__ballot_ticket__logo_url",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_header",id:"election-presentation-options-success_screen__ballot_ticket__logo_header",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_subheader",id:"election-presentation-options-success_screen__ballot_ticket__logo_subheader",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__h3",id:"election-presentation-options-success_screen__ballot_ticket__h3",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__h4",id:"election-presentation-options-success_screen__ballot_ticket__h4",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__show_election_id",id:"election-presentation-options-success_screen__ballot_ticket__show_election_id",level:3},{value:"Election Presentation Options: success_screen__redirect__url",id:"election-presentation-options-success_screen__redirect__url",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login",id:"election-presentation-options-success_screen__redirect_to_login",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login__text",id:"election-presentation-options-success_screen__redirect_to_login__text",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login__auto_seconds",id:"election-presentation-options-success_screen__redirect_to_login__auto_seconds",level:3},{value:"Election Presentation Options: disable_voting_booth_audit_ballot",id:"election-presentation-options-disable_voting_booth_audit_ballot",level:3},{value:"Election Presentation Options: review_screen__split_cast_edit",id:"election-presentation-options-review_screen__split_cast_edit",level:3},{value:"Election Presentation Options: show_skip_question_button",id:"election-presentation-options-show_skip_question_button",level:3},{value:"Results Config Pipes",id:"results-config-pipes",level:2},{value:"Election results input",id:"election-results-input",level:3},{value:"Election results output",id:"election-results-output",level:3},{value:"Election results can have different questions",id:"election-results-can-have-different-questions",level:3},{value:"Pipe: do_tallies",id:"pipe-do_tallies",level:3},{value:"do_tallies: ignore_invalid_votes",id:"do_tallies-ignore_invalid_votes",level:4},{value:"do_tallies: print_as_csv",id:"do_tallies-print_as_csv",level:4},{value:"do_tallies: tallies_indexes",id:"do_tallies-tallies_indexes",level:4},{value:"do_tallies: question_indexes",id:"do_tallies-question_indexes",level:4},{value:"do_tallies: reuse_results",id:"do_tallies-reuse_results",level:4},{value:"do_tallies: allow_empty_tally",id:"do_tallies-allow_empty_tally",level:4},{value:"do_tallies: help",id:"do_tallies-help",level:4},{value:"Pipe: sort_non_iterative",id:"pipe-sort_non_iterative",level:3},{value:"sort_non_iterative: tallies_indexes",id:"sort_non_iterative-tallies_indexes",level:4},{value:"sort_non_iterative: question_indexes",id:"sort_non_iterative-question_indexes",level:4},{value:"sort_non_iterative: withdrawals",id:"sort_non_iterative-withdrawals",level:4},{value:"sort_non_iterative: ties_sorting",id:"sort_non_iterative-ties_sorting",level:4},{value:"sort_non_iterative: help",id:"sort_non_iterative-help",level:4},{value:"Pipe: configure_pdf",id:"pipe-configure_pdf",level:3},{value:"configure_pdf: title",id:"configure_pdf-title",level:4},{value:"configure_pdf: first_description_paragraph",id:"configure_pdf-first_description_paragraph",level:4},{value:"configure_pdf: last_description_paragraph",id:"configure_pdf-last_description_paragraph",level:4},{value:"configure_pdf: languages",id:"configure_pdf-languages",level:4},{value:"configure_pdf: timezone",id:"configure_pdf-timezone",level:4},{value:"configure_pdf: date_format",id:"configure_pdf-date_format",level:4},{value:"configure_pdf: hide_logo",id:"configure_pdf-hide_logo",level:4},{value:"configure_pdf: hide_dates",id:"configure_pdf-hide_dates",level:4},{value:"configure_pdf: theme_colors",id:"configure_pdf-theme_colors",level:4},{value:"Other pipes",id:"other-pipes",level:3},{value:"Census object",id:"census-object",level:2},{value:"Census: voters",id:"census-voters",level:3},{value:"Assigning children elections in parent election census",id:"assigning-children-elections-in-parent-election-census",level:4},{value:"Census: auth_method",id:"census-auth_method",level:3},{value:"Census: census",id:"census-census",level:3},{value:"Census: extra_fields",id:"census-extra_fields",level:3},{value:"Census: oidc_providers",id:"census-oidc_providers",level:3},{value:"Census: alternative_auth_methods",id:"census-alternative_auth_methods",level:3},{value:"Census: admin_fields",id:"census-admin_fields",level:3},{value:"Census: auth_method_config",id:"census-auth_method_config",level:3},{value:"Extra Field Object",id:"extra-field-object",level:2},{value:"Extra Field: name",id:"extra-field-name",level:3},{value:"Extra Field: name_i18n",id:"extra-field-name_i18n",level:3},{value:"Extra Field: type",id:"extra-field-type",level:3},{value:"Extra Field: required_on_authentication",id:"extra-field-required_on_authentication",level:3},{value:"Extra Field: source_claim",id:"extra-field-source_claim",level:3},{value:"Extra Field: match_against_census_on_otl_authentication",id:"extra-field-match_against_census_on_otl_authentication",level:3},{value:"Extra Field: required",id:"extra-field-required",level:3},{value:"Extra Field: required_when_registered",id:"extra-field-required_when_registered",level:3},{value:"Extra Field: private",id:"extra-field-private",level:3},{value:"Extra Field: css_classes",id:"extra-field-css_classes",level:3},{value:"Extra Field: unique",id:"extra-field-unique",level:3},{value:"Extra Field: match_census_on_registration",id:"extra-field-match_census_on_registration",level:3},{value:"Extra Field: fill_if_empty_on_registration",id:"extra-field-fill_if_empty_on_registration",level:3},{value:"Extra Field: userid_field",id:"extra-field-userid_field",level:3},{value:"Extra Field: help",id:"extra-field-help",level:3},{value:"Extra Field: help_i18n",id:"extra-field-help_i18n",level:3},{value:"Extra Field: regex",id:"extra-field-regex",level:3},{value:"Extra Field: min",id:"extra-field-min",level:3},{value:"Extra Field: max",id:"extra-field-max",level:3},{value:"Extra Field: autofill",id:"extra-field-autofill",level:3},{value:"Admin Field Object",id:"admin-field-object",level:2},{value:"Census Config Object",id:"census-config-object",level:2},{value:"Census Config: allow_user_resend",id:"census-config-allow_user_resend",level:3},{value:"Census Config: show_pdf",id:"census-config-show_pdf",level:3},{value:"Census Config: msg",id:"census-config-msg",level:3},{value:"Census Config: msg_i18n",id:"census-config-msg_i18n",level:3},{value:"Census Config: html_message",id:"census-config-html_message",level:3},{value:"Census Config: subject",id:"census-config-subject",level:3},{value:"Census Config: subject_i18n",id:"census-config-subject_i18n",level:3},{value:"Census Config: provider_ids",id:"census-config-provider_ids",level:3},{value:"Census Config: authentication-action",id:"census-config-authentication-action",level:3},{value:"Census Config: fixed-code",id:"census-config-fixed-code",level:3},{value:"Question Object",id:"question-object",level:2},{value:"Question: title",id:"question-title",level:3},{value:"Question: title_i18n",id:"question-title_i18n",level:3},{value:"Question: description",id:"question-description",level:3},{value:"Question: description_i18n",id:"question-description_i18n",level:3},{value:"Question: layout",id:"question-layout",level:3},{value:"Question: max",id:"question-max",level:3},{value:"Question: min",id:"question-min",level:3},{value:"Question: num_winners",id:"question-num_winners",level:3},{value:"Question: tally_type",id:"question-tally_type",level:3},{value:"Question: answer_total_votes_percentage",id:"question-answer_total_votes_percentage",level:3},{value:"Question: answers",id:"question-answers",level:3},{value:"Question: extra_options",id:"question-extra_options",level:3},{value:"Question Extra Object",id:"question-extra-object",level:2},{value:"Question Extra: invalid_vote_policy",id:"question-extra-invalid_vote_policy",level:3},{value:"Question Extra: enable_panachage",id:"question-extra-enable_panachage",level:3},{value:"Question Extra: cumulative_number_of_checkboxes",id:"question-extra-cumulative_number_of_checkboxes",level:3},{value:"Question Extra: enable_checkable_lists",id:"question-extra-enable_checkable_lists",level:3},{value:"Question Extra: show_points",id:"question-extra-show_points",level:3},{value:"Question Extra: review_screen__show_question_description",id:"question-extra-review_screen__show_question_description",level:3},{value:"Question Extra: allow_writeins",id:"question-extra-allow_writeins",level:3},{value:"Question Extra: write_in_config",id:"question-extra-write_in_config",level:3},{value:"Question Extra: answer_group_columns_size",id:"question-extra-answer_group_columns_size",level:3},{value:"Question Extra: answer_columns_size",id:"question-extra-answer_columns_size",level:3},{value:"Question Extra: show_filter_field",id:"question-extra-show_filter_field",level:3},{value:"WriteInConfig Object",id:"writeinconfig-object",level:2},{value:"WriteInConfig: fields",id:"writeinconfig-fields",level:3},{value:"WriteInConfig: template",id:"writeinconfig-template",level:3},{value:"WriteInConfig: review_screen_presentation",id:"writeinconfig-review_screen_presentation",level:3},{value:"WriteInField Object",id:"writeinfield-object",level:2},{value:"WriteInField: id",id:"writeinfield-id",level:3},{value:"WriteInField: placeholder",id:"writeinfield-placeholder",level:3},{value:"WriteInField: placeholder_i18n",id:"writeinfield-placeholder_i18n",level:3},{value:"WriteInField: label",id:"writeinfield-label",level:3},{value:"WriteInField: label_i18n",id:"writeinfield-label_i18n",level:3},{value:"WriteInField: help",id:"writeinfield-help",level:3},{value:"WriteInField: help_i18n",id:"writeinfield-help_i18n",level:3},{value:"WriteInField: min",id:"writeinfield-min",level:3},{value:"WriteInField: max",id:"writeinfield-max",level:3},{value:"Children Election Info Object",id:"children-election-info-object",level:2},{value:"Answer Object",id:"answer-object",level:2},{value:"Answer: id",id:"answer-id",level:3},{value:"Answer: sort_order",id:"answer-sort_order",level:3},{value:"Answer: category",id:"answer-category",level:3},{value:"Answer: text",id:"answer-text",level:3},{value:"Answer: text_i18n",id:"answer-text_i18n",level:3},{value:"Answer: details",id:"answer-details",level:3},{value:"Answer: details_i18n",id:"answer-details_i18n",level:3},{value:"Answer: urls",id:"answer-urls",level:3},{value:"Url Object",id:"url-object",level:2},{value:"URL",id:"url",level:3},{value:"Image URL",id:"image-url",level:3},{value:"Invalid Vote Flag",id:"invalid-vote-flag",level:3},{value:"Position Flag",id:"position-flag",level:3},{value:"Is Category List",id:"is-category-list",level:3},{value:"Is Write In",id:"is-write-in",level:3}],d={toc:p};function m(e){let{components:t,...l}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"election-json-settings"},"Election JSON settings"),(0,i.kt)("p",null,"In this section we will describe the different options that can be configured\nin the Edit JSON Dialog for Election Creation. You review an example of a\n",(0,i.kt)("a",{target:"_blank",href:n(8343).Z},"sample election JSON configuration here"),"."),(0,i.kt)("p",null,"As can be seen in the last screenshot, the JSON Format starts with a list. This\nis a list of ",(0,i.kt)("a",{parentName:"p",href:"#election-object"},"Elections"),". This means you can directly create\nmultiple elections at once like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="multiple_elections.json"',title:'"multiple_elections.json"'},"[\n {\n ...Election 1 configuration..\n },\n {\n ...Election 2 configuration..\n },\n {\n ...Election 3 configuration..\n },\n]\n")),(0,i.kt)("p",null,"Once you click on the ",(0,i.kt)("inlineCode",{parentName:"p"},"Finish edit")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit Election Json")," dialog, if you\nhave added multiple elections this will be reflected in the interface."),(0,i.kt)("h2",{id:"election-object"},"Election object"),(0,i.kt)("p",null,"Within the Election JSON settings that can be set using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit Election JSON"),"\ndialog, each election can have the following settings:"),(0,i.kt)("h3",{id:"election-id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"345"))),(0,i.kt)("p",null,"Election's unique id. It will automatically be assigned one if none is set. If\nthe election already exists and the user has permissions to edit it, the\nelection configuration will be updated if the election is registered but\nnot yet created (",(0,i.kt)("a",{parentName:"p",href:"#modifying-elections"},"details here"),")."),(0,i.kt)("h3",{id:"election-title"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"New election"'))),(0,i.kt)("p",null,"Election's title. It will appear in the admin election list, and as the\nelection title in the public election site and in the voting booth start screen."),(0,i.kt)("h3",{id:"election-title_i18n"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Nueva elecci\xf3n"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-description"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Long String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"This is the description of the election. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs."'))),(0,i.kt)("p",null,"Election's description. It will appear below the title in the public election\nsite and in the voting booth start screen. As shown in the example it allows\nfor some basic HTML."),(0,i.kt)("h3",{id:"election-description_i18n"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Esta es la descripci\xf3n de la elecci\xf3n. Puede agregar html simple como negrita o enlaces a sitios web.\\n\\n

Usted necesita usar dos elementos br para nuevos p\xe1rrafos."\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"description")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-virtual"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"virtual")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"virtual")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("admonition",{title:"Enabling Virtual Elections",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Virtual elections are not enabled by default because for security reasons\nvirtual elections should not be enabled in multi-tenant deployments, as\n",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," do not verify that the election creator has permissions for\naccessing the sub-elections."),(0,i.kt)("p",{parentName:"admonition"},"To allow virtual election you have to enable it in the\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"deployment configuration"),", which can be done by setting\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"config.ballot-box.virtualElectionsAllowed")," setting in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\ndeployment configuration file to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),". ")),(0,i.kt)("admonition",{title:"Virtual vs Parent elections",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"You will note that there are two different possible types of relations between\nelections:"),(0,i.kt)("ol",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ol"},"A ",(0,i.kt)("a",{parentName:"li",href:"#election-virtual"},"virtual election")," and its respective\n",(0,i.kt)("a",{parentName:"li",href:"#election-virtualSubelections"},"virtual subelections"),"."),(0,i.kt)("li",{parentName:"ol"},"A ",(0,i.kt)("a",{parentName:"li",href:"#election-parent_id"},"parent election")," and its respective\n",(0,i.kt)("a",{parentName:"li",href:"#election-children_election_info"},"children elections"),".")),(0,i.kt)("p",{parentName:"admonition"},"The first kind of relation (virtual elections and virtual subelections) is\nestablished in ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),", and its use is allows for electoral results\nconsolidation."),(0,i.kt)("p",{parentName:"admonition"},"The second kind of relation is established in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," and its use is more\nrelated to the authentication, authorization and presentation behaviour in the\nearlier stages of an election, for example during login."),(0,i.kt)("p",{parentName:"admonition"},"Both are closely related/coupled, because usually you want to do both or none.\nThe separation exists simply because ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," are\ndifferent modules that have separated databases.")),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", this is a virtual election, meaning it can have subelections\nin ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". This allows the election results to be calculated when\ncalling ",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"tally-pipes")," with the votes of all the\nsubelections, and thus allows you to do electoral results consolidation. Set the\n",(0,i.kt)("a",{parentName:"p",href:"#election-virtualSubelections"},"virtualSubelections setting")," to specify which\nare those subelections."),(0,i.kt)("h3",{id:"election-virtualsubelections"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"virtualSubelections")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"virtualSubelections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},"[\n 41004,\n 41005,\n 41006\n]\n")),(0,i.kt)("p",null,"List of ",(0,i.kt)("a",{parentName:"p",href:"#election-id"},"election ids")," that will be used for virtual subelections.\nSee the information in ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual setting")," for more details."),(0,i.kt)("h3",{id:"election-parent_id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"parent_id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"parent_id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer | null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"66341"))),(0,i.kt)("p",null,"Identification number of the parent election, or more specifically ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent"),",\nbecause this is an attribute set in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"parent_id")," is set in children\nelections. It can only be set to refer to a parent ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent"),"'s that exist, so\nyou will have to create the parent election first. If you are creating multiple\nelections in a single ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit JSON elections"),", then also place the parent first."),(0,i.kt)("p",null,"When a set of election have a parent-children relationship, they have the\nfollowing behaviour:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"In the Admin election list, the children elections are hidden by default and\nonly shown as a dropdown of the parent election."),(0,i.kt)("li",{parentName:"ol"},"In the Admin election dashboard, the parent election can manage the children\nelections. For example starting or stopping the parent election starts/stops\nthe children elections automatically. The parent election dashboard also allows\nto trigger the tally of specific subelections with a chooser widget, and also\nallows to switch to see the election results of specific children elections."),(0,i.kt)("li",{parentName:"ol"},"In the Admin election Census Data, you can assign to each voter a subset of\nthe children elections, to allow a specific subset of children elections. The\nCensus Data section also allows you to view in which children elections has any\nvoter voted."),(0,i.kt)("li",{parentName:"ol"},"In the parent election results public website, there's a chooser widget to\nchoose which children election results to visualize."),(0,i.kt)("li",{parentName:"ol"},"In the voting booth, after authentication the voter will vote without having\nto authenticate again in the assigned children election in their\n",(0,i.kt)("a",{parentName:"li",href:"#child-election-natural_order"},"natural order")," sequentially. If a voter does\nnot vote to all the children elections assigned to this voter, then he will be\nable to authenticate again and vote in the next unvoted children election.")),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"#election-children_election_info"},"children_election_info setting")," for\nmore details about how to set the list of children elections in a parent. Also\nread about the ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual election setting")," to learn about\nthe differences of virtual and parent elections."),(0,i.kt)("h3",{id:"election-children_election_info"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"children_election_info")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"children_election_info")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#children-election-info-object"},"Children Election Info")," | ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-parent_id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"parent_id"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-virtual"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"virtual"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#children-election-info-object"},"Children Election Info")))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "natural_order": [\n 41004,\n 41005,\n 41006\n ],\n "presentation": {\n "categories": [\n {\n "events": [\n {\n "event_id": 41004,\n "title": "Executive Board"\n }\n ],\n "id": 1,\n "title": "Board"\n },\n {\n "events": [\n {\n "event_id": 41005,\n "title": "Sector 1"\n },\n {\n "event_id": 41006,\n "title": "Sector 2"\n }\n ],\n "id": 2,\n "title": "Sectorial"\n }\n ]\n }\n}\n')),(0,i.kt)("p",null,"Describes the information related to the children elections. ",(0,i.kt)("inlineCode",{parentName:"p"},"null"),", which is\nthe default value, if this is not a parent election. See\n",(0,i.kt)("a",{parentName:"p",href:"#children-election-info-object"},"Children Election Info")," for details."),(0,i.kt)("h3",{id:"election-director"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"director")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"director")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"auth1"'))),(0,i.kt)("p",null,"The name of the election authority that will act as the director for this\nelection. Its eopackage needs to be installed in the backend server\n(",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/#connecting-web-servers-with-authorities"},"see details"),")."),(0,i.kt)("h3",{id:"election-authorities"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"authorities")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"authorities")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["auth2", "auth3"]'))),(0,i.kt)("p",null,"List of names of all the election authorities that should be included in this\nelection, excluding the director authority name. Its eopackages needs to be\ninstalled in the backend server\n(",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/#connecting-web-servers-with-authorities"},"see details"),")."),(0,i.kt)("h3",{id:"election-questions"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"questions")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"questions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#question-object"},"Question"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_total_votes_percentage": "over-total-valid-votes",\n "answers": [\n {\n "category": "",\n "details": "This is an option with an simple example description.",\n "id": 0,\n "sort_order": 0,\n "text": "Example option 1",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n },\n {\n "category": "",\n "details": "An option can contain a description. You can add simple html like bold or links to websites. You can also set an image url below, but be sure it\'s HTTPS or else it won\'t load.\\n\\n

You need to use two br element for new paragraphs.",\n "id": 1,\n "sort_order": 1,\n "text": "Example option 2",\n "urls": [\n {\n "title": "URL",\n "url": "https://sequentech.io"\n },\n {\n "title": "Image URL",\n "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/The_Fabs.JPG/220px-The_Fabs.JPG"\n }\n ]\n },\n {\n "category": "",\n "details": "",\n "id": 2,\n "sort_order": 2,\n "text": "Example option 3",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n }\n ],\n "description": "This is the description of this question. You can have multiple questions. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs.",\n "layout": "accordion",\n "max": 1,\n "min": 1,\n "num_winners": 1,\n "tally_type": "plurality-at-large",\n "title": "Test question title",\n "extra_options": {\n "shuffle_categories": true,\n "shuffle_all_options": true,\n "shuffle_category_list": [],\n "show_points": false\n },\n "active": true\n }\n]\n')),(0,i.kt)("p",null,"List of questions in the election. See ",(0,i.kt)("a",{parentName:"p",href:"#question-object"},"Question")," for more\ndetails."),(0,i.kt)("h3",{id:"election-presentation"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"presentation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#election-presentation-object"},"Election Presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "theme": "default",\n "share_text": [\n {\n "network": "Twitter",\n "button_text": "",\n "social_message": "I have just voted in election __URL__, you can too! #sequent"\n },\n {\n "network": "Facebook",\n "button_text": "",\n "social_message": "__URL__"\n }\n ],\n "urls": [],\n "theme_css": ""\n }\n')),(0,i.kt)("p",null,"Describes presentation options related to the whole election. See\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-object"},"Election Presentation")," for more details."),(0,i.kt)("h3",{id:"election-scheduled_events"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"scheduled_events")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"scheduled_events")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "start_voting": {\n "event_at": "2023-09-12T09:26:00+00:00"\n },\n "end_voting": null\n}\n')),(0,i.kt)("p",null,"Describes the configuration for automatic scheduled events of an election. It\ncan be null, or it can be a dictionary that follows the example shown above."),(0,i.kt)("p",null,"The only currently configurable schedulable events are the election voting\nperiod begining and end, configurable by the keys ",(0,i.kt)("inlineCode",{parentName:"p"},"start_voting")," and\n",(0,i.kt)("inlineCode",{parentName:"p"},"end_voting"),"."),(0,i.kt)("p",null,"You can configure any of those two to be either ",(0,i.kt)("inlineCode",{parentName:"p"},"null")," or to be a dictionary\nwith the key ",(0,i.kt)("inlineCode",{parentName:"p"},"event_at")," containing the date and time of the scheduled event. The\ngiven datetime should follow the string format shown in the example. "),(0,i.kt)("p",null,"You must use non-naive datetime when providing the event date time, specifying\nthe timezone (the ",(0,i.kt)("inlineCode",{parentName:"p"},"+00:00")," means UTC)."),(0,i.kt)("h3",{id:"election-layout"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"layout")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"layout")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"simple"'))),(0,i.kt)("p",null,"Specifies the election-wide layout. For now this settings remains unused and it\nmust always be set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"simple"'),"."),(0,i.kt)("h3",{id:"election-support_otl_enabled"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"support_otl_enabled")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"support_otl_enabled")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," False"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," to enable OTL support in this election."),(0,i.kt)("h3",{id:"election-inside_authenticate_otl_period"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"inside_authenticate_otl_period")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"inside_authenticate_otl_period")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," False"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," to enable OTL authentication period for voters, so that they can\nretrieve their authentication codes."),(0,i.kt)("h3",{id:"election-num_successful_logins_allowed"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"num_successful_logins_allowed")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"num_successful_logins_allowed")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"Specifies the number of votes that can be cast, because ",(0,i.kt)("em",{parentName:"p"},"successful logins")," is\na generic and fancy way to call 'votes cast' in a generic way within AuthApi.\nIf set to zero, no specific limitation in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," will happen regarding the\nauthentication process. If set to a number higher than zero, for example 1 or 3,\nthat will be the limit in the number of votes that can be cast."),(0,i.kt)("p",null,"Once the limitation is hit, the voter won't be able to authenticate again to\ncast a vote."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There might be other limitations on the number of votes that a voter can cast.\nFor example ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," has a deployment level configuration setting\nthat limits the number of votes that can be cast (this setting's path is\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.ballot-box.max_revotes")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," ansible configuration).\nThis ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," configuration setting will be applied independently of\n",(0,i.kt)("inlineCode",{parentName:"p"},"num_successful_logins_allowed"),".")),(0,i.kt)("h3",{id:"election-tallypipesconfig"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"tallyPipesConfig")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallyPipesConfig")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "version": "1.0",\n "pipes": [\n {\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {\n "ignore_invalid_votes": true\n }\n },\n {\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n }\n ]\n}\n')),(0,i.kt)("p",null,"Specifies how election results will be calculated. It contains in the ",(0,i.kt)("inlineCode",{parentName:"p"},"pipes"),"\nparameter a set of pipes to be applied, together with each pipe configuration,\nthat will be used during the calculation of election results. See\n",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"Results Config Pipes")," for more details."),(0,i.kt)("h3",{id:"election-has_ballot_boxes"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"has_ballot_boxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"has_ballot_boxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if this election will have paper ballot boxes. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the\nelection will show a new ",(0,i.kt)("inlineCode",{parentName:"p"},"Balot Boxes")," tab in the sidebar once created. In that\ntab a list of ballot boxes will be shown, and each ballot box will be able to\nhave a tally sheet attached. This can be used for hybrid elections with both\ndigital votes and paper ballots. "),(0,i.kt)("p",null,"A single election can have multiple ballot boxes assigned to it. Each ballot\nbox can be assigned via the ",(0,i.kt)("a",{parentName:"p",href:"#election-ballot_boxes"},(0,i.kt)("inlineCode",{parentName:"a"},"ballot_boxes"))," election\nobject property."),(0,i.kt)("p",null,"The way election results are calculated when there are ballot boxes is through\nmultiple steps:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"When a tally sheet is uploaded (to ",(0,i.kt)("inlineCode",{parentName:"li"},"iam"),"), ",(0,i.kt)("inlineCode",{parentName:"li"},"iam")," sends a callback to\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballot-box")," (the API call is to\n",(0,i.kt)("inlineCode",{parentName:"li"},"/api/election/:id/update-ballot-boxes-config"),") with the updated list of\ntally sheets related to that election."),(0,i.kt)("li",{parentName:"ol"},"That API call to ",(0,i.kt)("inlineCode",{parentName:"li"},"/api/election/:id/update-ballot-boxes-config")," of\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballot-box")," executes multiple steps:",(0,i.kt)("ol",{parentName:"li"},(0,i.kt)("li",{parentName:"ol"},"It sets the ",(0,i.kt)("inlineCode",{parentName:"li"},"ballotBoxesResultsConfig")," in the appropiate election and\nsaves it in the database."),(0,i.kt)("li",{parentName:"ol"},"It uses the ",(0,i.kt)("a",{parentName:"li",href:"#election-resultsconfig"},"tallyPipesConfig setting")," as a\ntemplate replacing any ocurrence of the text\n",(0,i.kt)("inlineCode",{parentName:"li"},"__ballotBoxesResultsConfig__")," with the content of\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballotBoxesResultsConfig")," which is the updated list of tally sheets. If\nballotBoxesResultsConfig is not set, then ",(0,i.kt)("inlineCode",{parentName:"li"},"__ballotBoxesResultsConfig__"),"\nwill be always replaced by ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")," (empty list)."),(0,i.kt)("li",{parentName:"ol"},"It re-calculates the election results running ",(0,i.kt)("inlineCode",{parentName:"li"},"tally-pipes")," with the\ncalculated ",(0,i.kt)("a",{parentName:"li",href:"#election-resultsconfig"},"tallyPipesConfig setting")," in the previous\nstep.")))),(0,i.kt)("p",null,"As a result, if you want the tally sheets to be reflected somehow in the\nelection results, you will need to use the appropiate\n",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"Results Config Pipes"),", for example ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/ballot_boxes.py#L278"},"tally_pipes.pipes.ballot_boxes.count_tally_sheets"),". See also ",(0,i.kt)("a",{parentName:"p",href:"#election-results-can-have-different-questions"},"Election results can have different questions")," section."),(0,i.kt)("h3",{id:"election-ballot_boxes"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"ballot_boxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ballot_boxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["Postal Ballots", "Onsite Paper Ballots"]'))),(0,i.kt)("p",null,"This configuration option is only used if\n",(0,i.kt)("a",{parentName:"p",href:"#election-has_ballot_boxes"},"has_ballot_boxes")," is set to true. It contains a\nlist of ballot boxes to be created."),(0,i.kt)("h3",{id:"election-census"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"census")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"census")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#census-object"},"Census"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "voters": [],\n "auth_method": "email",\n "census": "close",\n "extra_fields": [],\n "admin_fields": [],\n "config": {\n "allow_user_resend": true,\n "msg": "Vote in __URL__ with code __CODE__",\n "subject": "Vote now with Sequent",\n "authentication-action": {\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n },\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n }\n}\n')),(0,i.kt)("p",null,"Object that details the different options related to the census configuration.\nSee ",(0,i.kt)("a",{parentName:"p",href:"#census-object"},"Census")," for more details."),(0,i.kt)("h3",{id:"election-hide_default_login_lookup_field"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"hide_default_login_lookup_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_default_login_lookup_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if the census main lookup field is hidden. Only use this option if\nyou have setup some other(s) ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"census extra_field")," with the\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-required_on_authentication"},"required_on_authentication attribute"),"\nset to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", as it would be used to look up the voter in the database."),(0,i.kt)("h3",{id:"election-segmentedmixing"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"segmentedMixing")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"segmentedMixing")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-mixingCategorySegmentation"},(0,i.kt)("inlineCode",{parentName:"a"},"mixingCategorySegmentation")))))),(0,i.kt)("p",null,"When set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", enables segmented mixing in the election. In that case, it\nalso requires that ",(0,i.kt)("a",{parentName:"p",href:"#election-mixingCategorySegmentation"},(0,i.kt)("inlineCode",{parentName:"a"},"mixingCategorySegmentation"))," is configured properly. See the ",(0,i.kt)("a",{parentName:"p",href:"../guides/segmented-mixing/"},"Segmented Mixing Guide")," for more\ninformation."),(0,i.kt)("h3",{id:"election-mixingcategorysegmentation"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"mixingCategorySegmentation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"mixingCategorySegmentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "categoryName": "province",\n "categories": [\n "Sevilla",\n "Madrid"\n ]\n}\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-segmentedMixing"},(0,i.kt)("inlineCode",{parentName:"a"},"segmentedMixing")))))),(0,i.kt)("p",null,"When ",(0,i.kt)("a",{parentName:"p",href:"#election-segmentedMixing"},(0,i.kt)("inlineCode",{parentName:"a"},"segmentedMixing"))," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", this\nproperty is used to specify the name of the ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra field"),"\nused for segmentation, along with the possible values, in order, that this\nsegment can have. Note that this list of possible values is used for encoding."),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"../guides/segmented-mixing/"},"Segmented Mixing Guide")," for more\ninformation."),(0,i.kt)("h3",{id:"election-publiccandidates"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"publicCandidates")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Specifies if the candidates (i.e. list of answers in a question) are public or\nnot. When candidates are private, only properly authenticated and authorized\ncalls to the API (usually the endpoint is\n",(0,i.kt)("inlineCode",{parentName:"p"},"/elections/api/election/"),") will be able to retrieve the candidate\nlist, and all other request will return an empty list of answers for each\nquestion in the election."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Some important considerations:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", the demo voting booth will not work since\nthe demo voting booth always perform unauthenticated requests to retrieve the\nelection configuration. The demo voting-booth UI will just show an empty list\nof candidates."),(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", the election portal will show an empty\nlist of candidates , since it always performs unauthenticated requests to\nretrieve the election configuration."),(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", you won't be able to publish the election\nresults since that would publish the candidate names, so that action will be\ndisabled in the admin console and the ballot-box will not allow it."))),(0,i.kt)("h3",{id:"election-allow_public_census_query"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_public_census_query")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_public_census_query")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if voters at any time can access the website to consult if their\nvoter is part of the census. Disabled by default. If enabled, a link to this\npage will appear in the public election website. The public census query is\nimplemented in a very similar way to the login form, but without sending any\nOne Time Passwords and instead of authenticating the user to vote it shows the\nuser if he will be able to vote, even before or after the voting process starts."),(0,i.kt)("h3",{id:"election-logo_url"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"logo_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"logo_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://example.com/path/to/logo.png"'))),(0,i.kt)("p",null,"URL of the logo to be shown in public election site and voting booth in the\npage header."),(0,i.kt)("h3",{id:"election-start_date"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"start_date")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"start_date")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"UNUSED. This field is required but should really be an empty string as it is currently unused."),(0,i.kt)("h3",{id:"election-end_date"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"end_date")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"end_date")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"UNUSED. This field is required but should really be an empty string as it is currently unused."),(0,i.kt)("h2",{id:"election-presentation-object"},"Election Presentation Object"),(0,i.kt)("p",null,"This JSON object type describes presentation options related to the whole\nelection. It is used ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation"},"here")," and can have the following\nproperties:"),(0,i.kt)("h3",{id:"election-presentation-theme"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"theme")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"default"'))),(0,i.kt)("p",null,"Theme that will be used in the public election website and in the voting booth\nof this election. Existing themes exist in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/common-ui/tree/master/themes"},"themes directory")," of the common-ui repository. You can write\nyour own if need be, by following the same directory and file structure as any\nof those. The ",(0,i.kt)("inlineCode",{parentName:"p"},"default")," theme uses simple colors and not very specific, with\nthe idea of being able to be used in most cases. It is also the most widely used\nand thus battle-tested."),(0,i.kt)("h3",{id:"election-presentation-share_text"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"share_text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"share_text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#share-text-object"},"Share Text"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "network": "Twitter",\n "button_text": "",\n "social_message": "I have just voted in election __URL__, you can too! #sequent"\n },\n {\n "network": "Facebook",\n "button_text": "",\n "social_message": "__URL__"\n }\n]\n')),(0,i.kt)("p",null,"Describes a series of social network or other kind of links to be shown at the\ntop of the election public website and at the success screen of the voting\nbooth. See ",(0,i.kt)("a",{parentName:"p",href:"#share-text"},"Share Text")," for more details. It can be an empty list."),(0,i.kt)("h3",{id:"election-presentation-i18n_override"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"i18n_override")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"i18n_override")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map>")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "en": {\n "avRegistration.forgotPassword": "Did you forget your password, sir?",\n "avBooth.castTheBallot": "Cast thy ballot"\n }\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language\ncode. The provided translation will override the corresponding translation for\nthat language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this\nspecific election."),(0,i.kt)("h3",{id:"election-presentation-pdf_url"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"pdf_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"pdf_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "url": "https://file-examples.com/storage/fe783a5cbb6323602a28c66/2017/10/file-sample_150kB.pdf",\n "title": "Example PDF"\n}\n')),(0,i.kt)("p",null,"When the election ",(0,i.kt)("a",{parentName:"p",href:"#census-config-show_pdf"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf"))," flag is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),",\nthis the URL of the PDF document will be shown in the voting booth to the voter\nand the title of this document, which will also appear in the ",(0,i.kt)("inlineCode",{parentName:"p"},"Show PDF")," screen.\nSetting ",(0,i.kt)("inlineCode",{parentName:"p"},"pdf_url")," is mandatory if ",(0,i.kt)("a",{parentName:"p",href:"#census-config-show_pdf"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf"))," setting\nis enabled in an election."),(0,i.kt)("h3",{id:"election-presentation-urls"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"urls")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"urls")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]"))),(0,i.kt)("p",null,"DEPRECATED. Just leave it as an empty list."),(0,i.kt)("h3",{id:"election-presentation-theme_css"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"theme_css")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme_css")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"DEPRECATED. Just leave it as an empty string."),(0,i.kt)("h3",{id:"election-presentation-extra_options"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_options")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#election-presentation-extra-options-object"},"Election Presentation Extra Options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "start_screen__skip": true\n}\n')),(0,i.kt)("p",null,"A set of additional of election configuration options, currently used to modify\nthe voting booth presentation behaviour. This property is not required, but can\nbe useful. See more\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-extra-options-object"},"details about Election Presentation Extra Options here"),"."),(0,i.kt)("h3",{id:"election-presentation-anchor_continue_btn_to_bottom"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"anchor_continue_btn_to_bottom")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"anchor_continue_btn_to_bottom")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "anchor_continue_btn_to_bottom": true\n}\n')),(0,i.kt)("p",null,"When set to true, this forces the ",(0,i.kt)("inlineCode",{parentName:"p"},"Continue")," button at the botting of the screens\nin the ballot box to always be fixed to the absolute bottom of the web brower window."),(0,i.kt)("h3",{id:"election-presentation-mandatory_acceptance_tos_html"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"mandatory_acceptance_tos_html")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory_acceptance_tos_html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"I accept the Terms and conditions"'))),(0,i.kt)("p",null,"If set to some string, then the voting booth will show the given Basic HTML text\nwith a checkbox in that Start Screen of the Voting Booth, and the Start Voting\naction button below will be disabled until the voter clicks and marks the\ncheckbox for accepting these terms. "),(0,i.kt)("h3",{id:"election-presentation-mandatory_acceptance_tos_html_i18n"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"mandatory_acceptance_tos_html_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory_acceptance_tos_html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option>")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Acepto las Condiciones de Servicio""\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language, for\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"mandatory_acceptance_tos_html")," field."),(0,i.kt)("h3",{id:"election-presentation-booth_log_out__countdown_seconds"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"booth_log_out__countdown_seconds")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"booth_log_out__countdown_seconds")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-1"))),(0,i.kt)("p",null,"If set, then a progress bar will be shown in the background of the Logout button.\nThe progress bar is a countdown until the logout time, which happens when the\nsession expires. If the user hovers the mouse over the button, a tooltip will\nappear informing the user of the time they have left to cast their ballot."),(0,i.kt)("p",null,"The value set here is the seconds of anticipation for the countdown before the\nsession expires. If the value is negative, the countdown will start the moment\nthe user logs in."),(0,i.kt)("h3",{id:"election-presentation-public_title"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"public_title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"public_title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Approval of the accounts 2022"'))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\ninstead of showing the title of election in the voting booth, it will show this\nother title instead."),(0,i.kt)("h3",{id:"election-presentation-public_title_i18n"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"public_title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"public_title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Aprobaci\xf3n de las cuentas de 2022"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Election Presentation ",(0,i.kt)("inlineCode",{parentName:"p"},"public_title_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-presentation-i18n_languages_conf"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"i18n_languages_conf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"i18n_languages_conf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option[Object]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n // default language if anything else is equal\n "default_language": "en",\n // if set to `false`, we\'ll match browser settings with available \n // languages to decide which language to load by default. If set \n // to `true`, then we won\'t detect any browser language preferences\n // and we\'ll always load the previously defined `default_language`\n // by default.\n "force_default_language": false,\n // available languages for this election\n "available_languages": [\n "en",\n "es"\n ]\n}\n')),(0,i.kt)("p",null,"Allows the modification of the language behavior for any election. You can\nchange the default language, override if the default language should be\nautomatically loaded, and also change the list of available languages for this\nspecific election. Applies on the Voting Booth and also on the Election Portal."),(0,i.kt)("h2",{id:"share-text-object"},"Share Text Object"),(0,i.kt)("p",null,"Object describing a series of social network links or any other type of link\nto be shown at the top of the election public website and at the success screen\nof the voting booth. It is used ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-share_text"},"here")," and\nit can have the following properties:"),(0,i.kt)("h3",{id:"share-text-network"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"network")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"network")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Twitter"'))),(0,i.kt)("p",null,"Specifies the social network this link is for. Currently only ",(0,i.kt)("inlineCode",{parentName:"p"},'"Twitter"')," and\n",(0,i.kt)("inlineCode",{parentName:"p"},'"Facebook"')," special cases are detected. If you use any of those, then a given\nsocial network icon will be shown and the url will be set to share the\nspecified ",(0,i.kt)("a",{parentName:"p",href:"#share-text-social_message"},"social message"),"."),(0,i.kt)("h3",{id:"share-text-button_text"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"button_text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"button_text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"Specifies the text to show with this share link. It's usually set to an empty\nstring as the network icon is usually set."),(0,i.kt)("h3",{id:"share-text-social_message"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"social_message")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"social_message")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"I have just voted in election __URL__, you can too! #sequent"'))),(0,i.kt)("p",null,"When users click on the share link, it will try automatically default to share\nin Twitter/Facebook this message. It is a template string, where ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__")," will\nbe automatically replaced to a link to this election's public website."),(0,i.kt)("p",null,"Currently unused."),(0,i.kt)("h2",{id:"election-presentation-extra-options-object"},"Election Presentation Extra Options Object"),(0,i.kt)("p",null,"An object describing a set of additional of election configuration options,\ncurrently used to modify the voting booth presentation behaviour. It is used\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-extra_options"},"here")," and it can have the following\nproperties:"),(0,i.kt)("h3",{id:"election-presentation-options-allow_voting_end_graceful_period"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_voting_end_graceful_period")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_voting_end_graceful_period")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, the voters that are in the voting booth and whose voting session has\nnot expired and thus their credentials have not expired will be able to cast a\nvote even if the voting period has ended."),(0,i.kt)("h3",{id:"election-presentation-options-start_screen__skip"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"start_screen__skip")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"start_screen__skip")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nstart screen of the voting booth will not be shown."),(0,i.kt)("h3",{id:"election-presentation-options-disable__demo_voting_booth"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__demo_voting_booth")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__demo_voting_booth")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), this optional property will disable the\ndemo voting booth."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Disabling the demo voting booth does only disable the functionality,\nbut does not disable the public availability of the election information (such\nas candidate names) through the API."),(0,i.kt)("p",{parentName:"admonition"},"If the reason you want to disable the demo voting booth is to disable publishing\nthe candidates names, then you should use\n",(0,i.kt)("a",{parentName:"p",href:"#election-publiccandidates"},"publicCandidates: false")," instead.")),(0,i.kt)("h3",{id:"election-presentation-options-booth_log_out__disable"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"booth_log_out__disable")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"booth_log_out__disable")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), then:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Log out button won't show in the voting booth at the top."),(0,i.kt)("li",{parentName:"ol"},"After the voting session ends, the voter is NOT redirected to the login page.")),(0,i.kt)("h3",{id:"election-presentation-options-disable__election_chooser_screen"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__election_chooser_screen")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__election_chooser_screen")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), the voting booth of a parent election\nwill not show an election chooser where the voter gets to choose the next\nelection to vote. Instead, the voter will be shown one after the other the\nelections in which he can vote, not allowing to choose a specific election to\nvote each time. The voter can skip a specific election if\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-show_skip_question_button"},"show_skip_question_button"),"\nis enabled."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This option will never disable the election chooser screen in the voting booth,\nbecause in the demo voting booth there's no voter credentials to see which\nelections should be assigned to the specific voter.")),(0,i.kt)("h3",{id:"election-presentation-options-disable__public_home"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__public_home")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__public_home")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), this optional property will disable the\npublic home page for the election."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Disabling the public home page for the election does only disable the interface\nbut does not disable the public availability of the election information (such\nas candidate names) through the API."),(0,i.kt)("p",{parentName:"admonition"},"If the reason you want to disable the public home page for the election is to\ndisable publishing the candidates names, then you should use\n",(0,i.kt)("a",{parentName:"p",href:"#election-publiccandidates"},"publicCandidates: false")," instead.")),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_ballot_tracker"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_ballot_tracker")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_ballot_tracker")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the ballot tracker hash. This option does not hide\nthe QR code nor the link to download the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_qr_code"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_qr_code")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_qr_code")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the QR code that encodes a link to the ballot\ntracker URL. This option does not hide the ballot tracker hash nor the link\nto download the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_download_ballot_ticket"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_download_ballot_ticket")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_download_ballot_ticket")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the link to download the ballot ticket PDF. This\noption does not hide the ballot tracker hash nor the QR code to the ballot "),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_url"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://example.com/path/to/logo.png"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the heading logo that appears next\nin the PDF ballot ticket that the voter can download from the voting booth\nsuccess screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the election's\n",(0,i.kt)("inlineCode",{parentName:"p"},"logo_url")," property is tried to be used as the logo, and if not, the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.big_logo_url")," property in the deployment YAML\nis used to load the logo, or otherwise no logo is shown in the ballot ticket\nPDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_header"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_header")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_header")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Sequent"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the heading text that appears next\nto the header logo in the PDF ballot ticket that the voter can download from\nthe voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.name")," property in the deployment YAML appears\nin the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_subheader"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_subheader")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_subheader")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Subheader line"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the subheading text that appears next\nto the header logo in the PDF ballot ticket that the voter can download from the\nvoting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.subtitle")," property in the deployment YAML appears\nin the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__h3"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__h3")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__h3")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote receipt"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the title of the ballot ticket\nthat appears below the header logo in the PDF ballot ticket that the voter can\ndownload from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then an i18n string saying\n",(0,i.kt)("inlineCode",{parentName:"p"},"Vote receipt")," will appear in the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__h4"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__h4")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__h4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Your vote has been cast correctly. This document justifies its issuance."')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the text of the ballot ticket\nthat appears below the title of the PDF ballot ticket that the voter can\ndownload from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then an i18n string saying\n",(0,i.kt)("inlineCode",{parentName:"p"},"Your vote has been cast correctly. This document justifies its issuance."),"\nwill appear in the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__show_election_id"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__show_election_id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__show_election_id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4")))))),(0,i.kt)("p",null,"If set, this optional property will include the election id in the PDF ballot\nticket that the voter can download from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, thus the election id doesn't\nappear in the PDF ballot ticket."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect__url"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect__url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect__url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://myvotingplace.com"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nwhen the success screen is going to redirect to the login screen, it will\nredirect to this URL instead. This means that if there's an automatic\nredirect to login or a redirect to login button (using ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login"},"success_screen__redirect_to_login"),"), all this\nredirect links will go to this url instead."),(0,i.kt)("p",null,"This also is the URL to which the voting booth will redirect if the voter logs\nout."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe success screen will show a link to redirect to the voter login page. Use\ntogether with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text")),"\nbecause the link will have that text, so you need to set it."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login__text"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login__text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login__text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Go to login"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe redirect to login link in the success screen will have the text specified\nin this string. Use\ntogether with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login"},"success_screen__redirect_to_login"),"\nbecause the link will only appear if that option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login__auto_seconds"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login__auto_seconds")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login__auto_seconds")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"10"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nonce the ballot is cast and the success screen is shown, after the specified\nnumber of seconds the voter will be automatically redirected to the login page."),(0,i.kt)("h3",{id:"election-presentation-options-disable_voting_booth_audit_ballot"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable_voting_booth_audit_ballot")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable_voting_booth_audit_ballot")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe review ballot screen, shown before casting the vote, will not show the hash\nof the ballot nor the link to audit the ballot."),(0,i.kt)("h3",{id:"election-presentation-options-review_screen__split_cast_edit"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen__split_cast_edit")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen__split_cast_edit")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe review screen instead of showing below just the button for\n",(0,i.kt)("inlineCode",{parentName:"p"},"Cast your ballot")," it will also show a button to ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit ballot"),", showing both\nside by side (50% of horizontal space for each)."),(0,i.kt)("h3",{id:"election-presentation-options-show_skip_question_button"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_skip_question_button")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_skip_question_button")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nit will show ",(0,i.kt)("inlineCode",{parentName:"p"},"Skip question(s)")," link over the ",(0,i.kt)("inlineCode",{parentName:"p"},"Continue")," button to skip to the\nnext question. Only support for ",(0,i.kt)("inlineCode",{parentName:"p"},"simultaneous-questions")," layout."),(0,i.kt)("h2",{id:"results-config-pipes"},"Results Config Pipes"),(0,i.kt)("p",null,"A results config pipe is used to specify how election results will be calculated.\nResults configuration is set of pipes to be applied, together with each pipe\nconfiguration, that will be used during the calculation of election results. It\nis configured at the election level with the\n",(0,i.kt)("a",{parentName:"p",href:"#election-resultsconfig"},"tallyPipesConfig setting"),"."),(0,i.kt)("p",null,"Each pipe is a list of pipe objects with two items:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"The pipe import path (the ",(0,i.kt)("inlineCode",{parentName:"li"},'"type"')," key)"),(0,i.kt)("li",{parentName:"ol"},"An object with that specific pipe configuration (the ",(0,i.kt)("inlineCode",{parentName:"li"},'"params"')," key)")),(0,i.kt)("p",null,"For example, a config object could be:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n}\n')),(0,i.kt)("p",null,"And multiple pipes can be included in the top-level ",(0,i.kt)("inlineCode",{parentName:"p"},"tallyPipesConfig")," setting\nwith:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "version": "1.0",\n "pipes": [\n {\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {}\n },\n {\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n }\n ]\n}\n')),(0,i.kt)("p",null,"The pipes are interpreted and applied by\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-pipes"},"tally-pipes"),", which in turn is\ncalled by ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". There are multiple available pipes and we will\ndocument in this section most of them, what they do, what you can use them for\nand what are their configuration options."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There's a deployment level configuration setting that specifies a whitelist of\npipes that can be used. This setting's path is\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.tally_pipes.pipes_whitelist")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," ansible\nconfiguration). If you need to use a specific pipe, please ensure you\nhave whitelisted it in the deployment configuration.")),(0,i.kt)("h3",{id:"election-results-input"},"Election results input"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," is called with multiple input data:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The path to the list of votes to be decrypted."),(0,i.kt)("li",{parentName:"ul"},"The path to the election results configuration with all the pipes to be run."),(0,i.kt)("li",{parentName:"ul"},"The path to the election tally tarball. This tarball is generated by election\nauthorities and contains among other things a file with the list of questions,\nthe different options available for each question, the tally mechanism, etc."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("inlineCode",{parentName:"li"},"output directory")," where the election tally results in different formats\nshould be written in different files."),(0,i.kt)("li",{parentName:"ul"},"The election id."),(0,i.kt)("li",{parentName:"ul"},"The path to a file containing the whitelisted pipes.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," works by loading the election questions configuration, and\npassing it from pipe to pipe as the first argument of each pipe, called\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),". It also untars the election tally tarball in a temporal directory,\nwhich some pipes might use to output some temporal files too."),(0,i.kt)("p",null,"In virtual elections, ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," not only receives as an input the tarball\nof the ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual election"),", but also the tarball of all the\n",(0,i.kt)("a",{parentName:"p",href:"#election-virtualsubelections"},"virtual subelections"),". "),(0,i.kt)("p",null,"In that case, ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," will also load that election's question\nconfiguration in the ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," pipes argument and extract each tally tarball\nin a different temporal directory. This is what allows us to do\nresults consolidation from multiple elections into a single one. In virtual\nelections, the first element in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," is the configuration of the virtual\nelection and then follows in order the list of virtual subelections as per the\nconfiguration of the election in ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". Within each element in\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," there's an additional key ",(0,i.kt)("inlineCode",{parentName:"p"},"extract_dir")," that pipes can use to\naccess the details of the tally tarball of a specific subelection."),(0,i.kt)("h3",{id:"election-results-output"},"Election results output"),(0,i.kt)("p",null,"The output of ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," is usually directly to stdout in a specific\nformat. This is read by ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," and stored in the database as the\nelectoral results. But it also outputs the same electoral results in different\nformats in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"output directory"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"csv"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"json"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"pretty")," (plain\ntext) and ",(0,i.kt)("inlineCode",{parentName:"p"},"pdf"),". It will also save the ballots in JSON format in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"output directory"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"output directory")," is served with ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," as\na private directory where results can be accessed when the election results are\nnot public, and then as a public directory where anyone can access the election\nresults when the election status is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"publish results"),". The results in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"output directory")," will contain with the following files:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.json")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.pretty")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ballots.csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ballots.json"))),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," works so that the pipes execute sequentially and communicate\nwith one another mainly through passing information via the mutable ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),"\nargument and also writting information in the temporal tarball extraction\ndirectories. The final output is the results configuration (which is in\ndifferent formats and files). But one important feature is that it might contain\na list of questions different of that one of the election configuration question\nlist. This is because there are some pipes that can duplicate questions and\nconsolidate electoral results. "),(0,i.kt)("h3",{id:"election-results-can-have-different-questions"},"Election results can have different questions"),(0,i.kt)("p",null,"For example, it might make sense that if you have an election with ballot boxes\nenabled, you might have only one question in the digital election but that two\ndifferent ballot boxes, one ballot box for Mail-in ballots and another for\nOnsite paper ballots. You could have election results for this election to\ncontain four different tallied questions (even if the election had only one\nquestion):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A tally of the digital votes"),(0,i.kt)("li",{parentName:"ul"},"A tally of the mail-in votes (from the Mail-in ballots box)"),(0,i.kt)("li",{parentName:"ul"},"A tally of the paper ballots (from the Paper ballots box)"),(0,i.kt)("li",{parentName:"ul"},"Consolidated results of all the previous ones together")),(0,i.kt)("p",null,"To do that, you would also have to change the title of the duplicated questions\nso that you can easily see which question corresponds with which tally. There\nare pipes to do that."),(0,i.kt)("p",null,"What follows is a list of the results configuration pipes in no particular\norder:"),(0,i.kt)("h3",{id:"pipe-do_tallies"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"do_tallies")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py#L24"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.results.do_tallies"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {\n "question_indexes": [0]\n }\n}\n')),(0,i.kt)("p",null,"This pipe is used to run the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally")," algorithm of the election questions. It\nwill calculate the results using that ",(0,i.kt)("inlineCode",{parentName:"p"},"tally")," algorithm and set them in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"results")," key in the appropiate element inside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),", among other things.\n",(0,i.kt)("inlineCode",{parentName:"p"},"results")," is used later by ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," to output the electoral results in\nthe appropiate format. It also sets the ",(0,i.kt)("inlineCode",{parentName:"p"},"log")," key in the appropiate element\ninside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," if the tally algorithm generated any log output."),(0,i.kt)("p",null,"This pipe calls uses the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-methods"},"tally-methods"),"\nlibrary and calls to ",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally")," to do the results calculation\nof any question to be tallied."),(0,i.kt)("p",null,"Candidates marked as withdrawn (you can do that with the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," ) will not be counted\nduring the tally."),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"do_tallies-ignore_invalid_votes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"ignore_invalid_votes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ignore_invalid_votes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If this option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," as it is by default, having invalid votes will\nnot make the tally fail. If it is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", then the call to\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally")," will raise an exception and the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes"),"\nexecution will fail. "),(0,i.kt)("p",null,"If you are not expecting any invalid votes, setting ",(0,i.kt)("inlineCode",{parentName:"p"},"ignore_invalid_votes")," to\n",(0,i.kt)("inlineCode",{parentName:"p"},"false")," might be a way to ensure that you don't overlook any invalid vote."),(0,i.kt)("h4",{id:"do_tallies-print_as_csv"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"print_as_csv")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"print_as_csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If this option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false")," as it is by default, it will output to stdout\nthe ballots as they are read in CSV format. This option is currently unused most\nof the time as the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," already outputs the ballots in CSV and JSON\nformats (the ",(0,i.kt)("inlineCode",{parentName:"p"},"ballots.csv")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ballots.json")," files). By the way, those ballot\nfiles are generated by this pipe and using the same code as this setting uses."),(0,i.kt)("h4",{id:"do_tallies-tallies_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"tallies_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallies_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,4,6]"))),(0,i.kt)("p",null,"List of indexes in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," to tally or None if all of them should be\ntallied which is the default. Note that this is a filtering list. It will not\nerror if any index of this list is out of bounds. If this a virtual election\nand ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," received 2 tallies as input, if ",(0,i.kt)("inlineCode",{parentName:"p"},"tallies_indexes")," is\n",(0,i.kt)("inlineCode",{parentName:"p"},"[0,1,2,3]")," it will actually only tally the first two."),(0,i.kt)("h4",{id:"do_tallies-question_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"question_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2]"))),(0,i.kt)("p",null,"List of question to tally for each of the tallies being tallied or None if all\nof them should be tallied which is the default. Two notes:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"This is a filtering list. It will not error if any index of this list is out\nof bounds. If there is only a single question but ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," is set to\n",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,3,4]"),", this pipe will just tally the first question without any error."),(0,i.kt)("li",{parentName:"ul"},"This list of question indexes is applied to all elections. To apply different\n",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," for different elections you would have to have in your pipes\nconfiguration multiple calls to the ",(0,i.kt)("inlineCode",{parentName:"li"},"do_tallies")," with different settings. See\n",(0,i.kt)("a",{parentName:"li",href:"#do_tallies-reuse_results"},"reuse_results")," for some details on that.")),(0,i.kt)("h4",{id:"do_tallies-reuse_results"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"reuse_results")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"reuse_results")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"As mentioned before, this pipe heavy lifting is actually done by calling to\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally"),". This function call receives the question\nconfiguration as an object using the ",(0,i.kt)("inlineCode",{parentName:"p"},"question_json")," parameter. Usually this\nconfiguration is obtained by reading the question json file within the tally\ntarball temporal extraction directory. However, if ",(0,i.kt)("inlineCode",{parentName:"p"},"reuse_results")," is set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the ",(0,i.kt)("inlineCode",{parentName:"p"},"question_json")," parameter will be loaded with an object from\nthe given element inside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),":\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['results']['questions']"),"."),(0,i.kt)("p",null,"This can be useful in different circumstances. For example if for some reason\nlike the one mentioned in ",(0,i.kt)("a",{parentName:"p",href:"#do_tallies-question_indexes"},"question_indexes"),", you\nneed to execute multiple runs of this pipe within the same ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes"),"\nexecution."),(0,i.kt)("h4",{id:"do_tallies-allow_empty_tally"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"allow_empty_tally")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_empty_tally")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), the tally will not fail even if there\nis an empty list of ballots being tallied."),(0,i.kt)("h4",{id:"do_tallies-help"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Some explanation"'))),(0,i.kt)("p",null,"Most if not all of the pipes receive the ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," argument. This is a way for the\nwritter of the results configuration pipes to explain anything relating to this\nparticular pipe + pipe configuration pair, as usually configuration is in JSON\nformat which does not allow for comments."),(0,i.kt)("h3",{id:"pipe-sort_non_iterative"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort_non_iterative")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/sort.py#L35"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.sort.sort_non_iterative"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0, 1]\n }\n}\n')),(0,i.kt)("p",null,"Pipe used to sort the answers in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['results']['questions'][]['answers']"),"\nand assigning a ",(0,i.kt)("inlineCode",{parentName:"p"},"winner_position")," depending on the question's ",(0,i.kt)("inlineCode",{parentName:"p"},"num_winners"),"\nsetting. This sort is by answer points (the answer's ",(0,i.kt)("inlineCode",{parentName:"p"},"total_count")," property)\nand thus is only applied for questions whose ",(0,i.kt)("inlineCode",{parentName:"p"},"tally_type")," algorithm is\nnon-iterative, like ",(0,i.kt)("inlineCode",{parentName:"p"},"plurality-at-large")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"borda"),". The answer list will be\nreordered to ensure that winners always appears before other candidates, and\ncan also be used for tie resolution using the ",(0,i.kt)("inlineCode",{parentName:"p"},"ties_sorting")," argument."),(0,i.kt)("p",null,"A Single-Transferable Vote (STV) tally method uses an iterative process to\nobtain winners so results cannot be sorted by this pipe. This pipe uses a\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_type")," whitelist to ensure it is only applied for non-iterative tally\nmethods, simply skipping any other question with any other tally method."),(0,i.kt)("p",null,"This pipe also takes into account during sorting candidate withdrawals and can\napply specific withdrawls at this stage using the ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawals")," option, or\napply the ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawals")," of candidate options that were recorded as withdrawn by\na previous pipe (like the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe"),")."),(0,i.kt)("p",null,"This pipe can be used to apply candidate removals, which means that a candidate\noption will not appear in the election results. "),(0,i.kt)("admonition",{title:"Different forms of withdrawal",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Multiple withdrawal methods are available and it's your responsability to know\nthem and use them as required."),(0,i.kt)("p",{parentName:"admonition"},"When a candidate is withdrawed for example using the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe"),", if that withdrawal is\nmarked as such before executing the ",(0,i.kt)("a",{parentName:"p",href:"#pipe-do_tallies"},"do_tallies pipe"),", then\nthe candidate option will not be counted. If after ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," you execute\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," pipe, then it will also ensure it is not marked as a\nwinner. Note that the ordering of the pipes matter: if you apply the withdrawal\nwith ",(0,i.kt)("inlineCode",{parentName:"p"},"apply_modifications")," after having run ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," and having\n",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," as the last applied pipe (So the order of pipes is\n",(0,i.kt)("inlineCode",{parentName:"p"},"[do_tallies, apply_modifications, sort_non_iterative]"),"), the candidate will\nnot appear as a winner because ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," will detect that it's\nwithdrawed, but it will have the same number of points in the election results\nas it was not marked as withdrawed when the ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," was executed."),(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," can withdraw a\ncandidate but it can also directly be withdrawn by this ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative"),"\npipe, but then the points obtained will not change because the expected previous\ncall to the ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," pipe will not have been marked the candidate as\nwithdrawed. ")),(0,i.kt)("admonition",{title:"Candidate Withdrawal vs Removal",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There are important differences between candidate removal and withdrawal. The\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," can be used to mark a\ncandidate option as either withdrawed or Removed. When a candidate is marked as\nremoved, the ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," pipe will remove the candidate option from\nthe election results. "),(0,i.kt)("p",{parentName:"admonition"},"If you don't need to sort the results, candidate removal can be also applied\ndirectly with the ",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_removals"},"apply_removals pipe"),". And of course,\nremember that you can do both a withdrawal and removal, so that the candidate\noption is both not counted and removed from the election results.")),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"sort_non_iterative-tallies_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"tallies_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallies_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,4,6]"))),(0,i.kt)("p",null,"List of indexes in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," to which this pipe will be applied or None if\nthis pipe should be run for all the elections. Note that this is a filtering\nlist. It will not give any error if any index of this list is out of bounds.\nIf this a virtual election and ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," received 2 elections as input,\nif ",(0,i.kt)("inlineCode",{parentName:"p"},"tallies_indexes")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"[0,1,2,3]")," this pipe will just run for the first two."),(0,i.kt)("h4",{id:"sort_non_iterative-question_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"question_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2]"))),(0,i.kt)("p",null,"List of question indexes to which this pipe should be applied or None if this\npipe should be run for all the questions of all the elections to which this pipe\nis being run, which is the default. Two notes:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"This is a filtering list. It will not error if any index of this list is out\nof bounds. If there is only a single question but ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," is set to\n",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,3,4]"),", this pipe will just run for the first question without any error."),(0,i.kt)("li",{parentName:"ul"},"This list of question indexes is applied to all elections. To apply different\n",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," for different elections you would have to include in your\npipes configuration multiple calls to this pipe with different settings.")),(0,i.kt)("h4",{id:"sort_non_iterative-withdrawals"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"withdrawals")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"withdrawals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_id": 0,\n "answer_text": "John Doe for President",\n "question_index": 0\n }\n]\n')),(0,i.kt)("p",null,"List of Answers to withdraw. "),(0,i.kt)("p",null,"Note that other pipes might indicate also answers that need to be withdrawn,\nwith the same format as this list, in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['withdrawals']"),". Both lists are joined for this purpose."),(0,i.kt)("p",null,"Each ",(0,i.kt)("inlineCode",{parentName:"p"},"AnswerItem")," is an object that requires the following properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"question_index"),": The question index."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_id"),": The answer id."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_text"),": The answer text, for sanity checks.")),(0,i.kt)("p",null,"Withdrawed candidates will appear in the election results, but they will never\nappear as a winner. "),(0,i.kt)("h4",{id:"sort_non_iterative-ties_sorting"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"ties_sorting")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ties_sorting")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_id": 0,\n "answer_text": "John Doe for President",\n "question_index": 0,\n "tie_sort": 0\n },\n {\n "answer_id": 1,\n "answer_text": "Juanito for President",\n "question_index": 0,\n "tie_sort": 1\n }\n]\n')),(0,i.kt)("p",null,"When two candidate options are in a tie, you might need to apply an external\nprocedure to resolve this tie. Once this procedure has been applied, then you\ncan use this argument to specify how the tie should be resolved."),(0,i.kt)("p",null,"This argument receives a list of ",(0,i.kt)("inlineCode",{parentName:"p"},"TieAnswerItems"),". "),(0,i.kt)("p",null,"Each ",(0,i.kt)("inlineCode",{parentName:"p"},"TieAnswerItems")," is an object that requires the following properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"question_index"),": The question index."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_id"),": The answer id."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_text"),": The answer text, for sanity checks."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"tie_sort"),": Integer number used for resolving the tie during sorting. If there\nis a tie between two candidates, the candidate with the lowest ",(0,i.kt)("inlineCode",{parentName:"li"},"tie_sort")," number\nwins.")),(0,i.kt)("h4",{id:"sort_non_iterative-help"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Some explanation"'))),(0,i.kt)("p",null,"Most if not all of the pipes receive the ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," argument. This is a way for the\nwritter of the results configuration pipes to explain anything relating to this\nparticular pipe + pipe configuration pair, as usually configuration is in JSON\nformat which does not allow for comments."),(0,i.kt)("h3",{id:"pipe-configure_pdf"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"configure_pdf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pdf.py#L40"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.pdf.configure_pdf"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.pdf.configure_pdf",\n "params": {\n "languages": ["es"],\n "timezone": "Europe/Madrid"\n }\n}\n')),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"configure_pdf")," pipe is used to configure the PDF format election results.\nFor example, it can allow to change the language or the timezone of the date\nand times that appear in that document."),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"configure_pdf-title"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Board Election 2022"'))),(0,i.kt)("p",null,"Allows to override the election title, if set to some string."),(0,i.kt)("h4",{id:"configure_pdf-first_description_paragraph"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"first_description_paragraph")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"first_description_paragraph")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Lorem ipsum."'))),(0,i.kt)("p",null,"Allows to prepend a paragraph before showing the election description in the\nPDF results."),(0,i.kt)("h4",{id:"configure_pdf-last_description_paragraph"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"last_description_paragraph")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"last_description_paragraph")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Lorem ipsum."'))),(0,i.kt)("p",null,"Allows to append a paragraph after showing the election description in the\nPDF results."),(0,i.kt)("h4",{id:"configure_pdf-languages"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"languages")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"languages")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["en"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["es", "en"]'))),(0,i.kt)("p",null,"Allows to change the language of the PDF election results. It establishes which\ntranslation to be used, referred by the ISO-639-1 short-code of the language.\nAllowed short-codes are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"en")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"es"))),(0,i.kt)("p",null,"Note that this stablishes the translation to be used with a list, because it\nuses the first language in the list as the main translation but the following\nlanguages are for fallback in case a specific translation string is not found."),(0,i.kt)("h4",{id:"configure_pdf-timezone"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"timezone")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"timezone")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"UTC"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Europe/Madrid"'))),(0,i.kt)("p",null,"Changes the timezone of the date/times (such as Election Start/Stop Date) shown\nin the PDF election results. For a listing of valid timezone strings, please use\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"TZ database name")," of the\n",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones")," wikipedia page. "),(0,i.kt)("h4",{id:"configure_pdf-date_format"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"date_format")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"date_format")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"%Y-%m-%d %H:%M:%S %Z"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"%Y-%m-%d %H:%M:%S %Z"'))),(0,i.kt)("p",null,"Changes the format of the date/times (such as Election Start/Stop Date) shown\nin the PDF election results. You can find a\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes"},"listing of available datetime format codes"),"\nin official Python documentation."),(0,i.kt)("h4",{id:"configure_pdf-hide_logo"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"hide_logo")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_logo")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", Sequent logo will not appear in the PDF election results."),(0,i.kt)("h4",{id:"configure_pdf-hide_dates"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"hide_dates")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_dates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", start, end and tally dates will not appear in the PDF\nelection results."),(0,i.kt)("h4",{id:"configure_pdf-theme_colors"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"theme_colors")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme_colors")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Dict")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "Background": "white",\n "OnBackground": "black",\n "Primary": "#b6d7a8",\n "OnPrimary": "black",\n "OnGrey": "black",\n "Grey": "grey",\n "LightGrey": "#cccccc",\n "DarkGrey": "#efefef"\n}\n')),(0,i.kt)("p",null,"With this configuration setting you can change and tune the theme colors used in\nthe PDF election results. The example above represents the defaults. If there\nis any theme color name that you don't set, the default will be used."),(0,i.kt)("h3",{id:"other-pipes"},"Other pipes"),(0,i.kt)("p",null,"There are many other pipes but we have yet to document them. The easiest way\nright now to understand how they work is to just look at the code:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/duplicate_questions.py#L24"},"tally_pipes.pipes.duplicate_questions.duplicate_questions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/modifications.py"},"tally_pipes.pipes.modifications.apply_modifications")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.make_multipart")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.election_max_size_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.question_totals_with_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.reduce_answers_with_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.multipart_tally_plaintexts_append_joiner")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.data_list_reverse")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.multipart_tally_plaintexts_joiner")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.append_ballots")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.proportion_rounded")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.parity_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.reorder_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.podemos_parity_loreg_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.podemos_parity2_loreg_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/podemos.py"},"tally_pipes.pipes.podemos.podemos_proportion_rounded_and_duplicates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda4.py"},"tally_pipes.pipes.desborda4.podemos_desborda4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda3.py"},"tally_pipes.pipes.desborda3.podemos_desborda3")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda2.py"},"tally_pipes.pipes.desborda2.podemos_desborda2")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda.py"},"tally_pipes.pipes.desborda.podemos_desborda")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pretty_print.py"},"tally_pipes.pipes.pretty_print.pretty_print_stv_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pretty_print.py"},"tally_pipes.pipes.pretty_print.pretty_print_not_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py"},"tally_pipes.pipes.results.to_files")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py"},"tally_pipes.pipes.results.apply_removals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/stv_tiebreak.py"},"tally_pipes.pipes.stv_tiebreak.stv_first_round_tiebreak")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pdf.py"},"tally_pipes.pipes.pdf.configure_pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/withdraw_candidates.py"},"tally_pipes.pipes.withdraw_candidates.withdraw_candidates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/ballot_boxes.py#L278"},"tally_pipes.pipes.ballot_boxes.count_tally_sheets"))),(0,i.kt)("h2",{id:"census-object"},"Census object"),(0,i.kt)("p",null,"This JSON object type describes census configuration related to the election.\nIt is used by the ",(0,i.kt)("a",{parentName:"p",href:"#election-census"},"census property")," and can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"census-voters"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"voters")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"voters")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#voter-object"},"Voter"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "metadata": {\n "email": "john@example.com",\n "name": "John"\n }\n },\n {\n "metadata": {\n "email": "marta@example.com",\n "name": "Marta"\n }\n }\n]\n')),(0,i.kt)("p",null,"It's a list of voters to be imported. Each voter is an object with their\nproperties set within the ",(0,i.kt)("inlineCode",{parentName:"p"},"metadata")," field. Which voter properties are valid\ndepends on the ",(0,i.kt)("a",{parentName:"p",href:"#census-auth_method"},"authentication method")," used and the\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra fields")," defined."),(0,i.kt)("p",null,"If the census size if big, it's not advisable to import it using this field\nbecause it's currently not very fast. In that case it's best to use the\n",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters")," management command through the command line\nwhich can easily load 4,000 voters/second instead of maybe 6-10 voters/second\nhere."),(0,i.kt)("p",null,"You can also modify the census later when the election is created. If you use\nthe admin user interface, it will use the same backend as it used during\nelection creation here and thus the same speed recommendations apply."),(0,i.kt)("p",null,"Note that when loading voters using this API, voters are uniquely identified by\na different field depending on the ",(0,i.kt)("a",{parentName:"p",href:"#census-auth_method"},"authentication method"),",\nfor example the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," field if using the ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp")," authentication method.\nIf you re-upload a census, the voters that already exist (matching their unique\nid) won't be modified. "),(0,i.kt)("p",null,"However if you use ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters")," management command, this\nkind of detection won't be applied. If you need to update the census, it's best\nto first remove all the census with the ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_delete_voters")," command before\nexecuting ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters"),"."),(0,i.kt)("h4",{id:"assigning-children-elections-in-parent-election-census"},"Assigning children elections in parent election census"),(0,i.kt)("p",null,"If the election is a parent election, you usually set the census within the\nparent election and there assign to which children elections can that specific\nvoter vote. To do so, set the ",(0,i.kt)("inlineCode",{parentName:"p"},"children_event_id_list")," property within the\n",(0,i.kt)("inlineCode",{parentName:"p"},"metadata")," field of each voter. This list is simply a list of children election\nids in which the voter can vote. If we had a parent election with id ",(0,i.kt)("inlineCode",{parentName:"p"},"100")," and\ntwo children elections with ids ",(0,i.kt)("inlineCode",{parentName:"p"},"101")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"102"),", we could assign one voter to\neach children election with this example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "metadata": {\n "email": "john@example.com",\n "name": "John",\n "children_event_id_list": [101]\n }\n },\n {\n "metadata": {\n "email": "marta@example.com",\n "name": "Marta",\n "children_event_id_list": [102]\n }\n }\n]\n')),(0,i.kt)("h3",{id:"census-auth_method"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"auth_method")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"auth_method")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"sms-otp"))),(0,i.kt)("p",null,"This property specifies which is the main authentication method related to the\nelection. The list of currently available authentication methods is:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email"),": The user will be authenticate through a code sent via email.\nThe email is sent by the adminstrators to voters using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send authentication"),"\noption in the Election Dashboard or the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send auth codes")," to specific voters\noption in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"Census Data")," sidebar option. If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email-otp"),": The user will authenticate through an OTP (One Time Password)\nsent via email. This OTP is not sent to voters by administrators, but instead\nis requested by voters during the authentication process each time they execute\nit. If used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"email")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email-and-password"),": The voters will authenticate simply by the email\nand password. You can assign the ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," field of each voter appropiately.\nIf used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"password")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"sms"),": The user will be authenticate through a code sent via SMS.\nThe SMS is sent by the adminstrators to voters using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send authentication"),"\noption in the Election Dashboard or the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send auth codes")," to specific voters\noption in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"Census Data")," sidebar option. If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"sms-otp"),": The user will authenticate through an OTP (One Time Password)\nsent via SMS. This OTP is not sent to voters by administrators, but instead is\nrequested by voters during the authentication process each time they execute it.\nIf used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"openid-connect"),": The authentication will happen through a third-party\nopenid provider. This provider shall be configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration"),". If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"text")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"sub")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"user-and-password"),": The voters will authenticate simply by the username\nand password. You can assign the ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," field of each voter appropiately.\nThis is usually not recommended, as by default voters are assigned a random\nusername so it's difficult for them to know their username. The only usecase for\nthis is currently for the administrative ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent")," (usually with id ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),") used\nto authenticate in the administrative interface, and whose list of users is\ndirectly set within the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," using the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.upsert_file")," and the superadmin user\n(",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.admin_user"),"). If used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field"),"\nof type ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"smart-link"),": The voters will authenticate using a smart link that includes\na secure authentication token using a keyed\n",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/HMAC"},"HMAC"),". It's a straightforward way to\nimplement Single sign-on (SSO) and integrate with a third-party site or\nplataform. Read about how to use it in the\n",(0,i.kt)("a",{parentName:"p",href:"../guides/smart-link-auth"},"SmartLink Auth Guide"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"openid-connect"),": The voters will authenticate using a 3rd-party OpenID\nConnect (OIDC) provider. It's a straightforward way to implement Single\nsign-on (SSO) and integrate with a third-party site or plataform. Read about how\nto use it in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC Auth Guide"),"."))),(0,i.kt)("admonition",{title:"Alternative authentication methods",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If the authentication method is ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," but there's defined also an ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf"),"\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra field"),", then for those elements in census where\nboth fields are defined, the voter will receive the Authentication Code through\nboth SMS and email authentication, and the voter will be able to authenticate\nthrough the link and code sent by either of those.")),(0,i.kt)("h3",{id:"census-census"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"census")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"census")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"close"'))),(0,i.kt)("p",null,"Indicates if the census is either ",(0,i.kt)("inlineCode",{parentName:"p"},'"open"')," or ",(0,i.kt)("inlineCode",{parentName:"p"},'"close"'),". If census is ",(0,i.kt)("inlineCode",{parentName:"p"},'"open"'),",\nit means it is in open registration mode and voters can register themselves,\nfill the ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_fields")," required on registration to be\nable to vote later either at that moment if the election is open or later on."),(0,i.kt)("h3",{id:"census-extra_fields"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#extra-field-object"},"Extra Field"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "name": "email",\n "type": "email",\n "required": true,\n "min": 2,\n "max": 200,\n "required_on_authentication": true\n }\n]\n')),(0,i.kt)("p",null,"Defines authentication fields that the voters might fill or with some relation\nto voters. There are some ",(0,i.kt)("inlineCode",{parentName:"p"},"extra_fields")," required depending on the election's\n",(0,i.kt)("a",{parentName:"p",href:"#election-auth_method"},"auth_method"),". For example, if the authentication method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", the extra field named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required. "),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-object"},"Extra Field")," for more details about extra fields. "),(0,i.kt)("h3",{id:"census-oidc_providers"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"oidc_providers")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"oidc_providers")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List of objects"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "public_info": {\n "id": "google",\n "title": "Authenticate with Google",\n "description": "Authenticate with Google",\n "icon": "https://www.google.com/favicon.ico",\n "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",\n "client_id": ".apps.googleusercontent.com",\n "issuer": "https://accounts.google.com",\n "scope": "openid email",\n "token_endpoint": "https://oauth2.googleapis.com/token",\n "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",\n "logout_uri": "https://accounts.google.com/o/oauth2/v2/auth_logout"\n },\n "private_info": {\n "client_secret": ""\n }\n }\n]\n')),(0,i.kt)("p",null,"List of OpenID Connect (OIDC) providers available for OIDC authentication."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"census-alternative_auth_methods"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"alternative_auth_methods")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"alternative_auth_methods")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List of objects"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "id": "sms",\n "auth_method_name": "sms",\n "auth_method_config": {\n "allow_user_resend": false,\n "authentication-action": {\n "mode": "vote",\n "mode-config": null\n },\n "msg": "Enter in __URL__ and put this code __CODE__",\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n },\n "extra_fields": [\n {\n "max": 255,\n "min": 4,\n "name": "email",\n "type": "email",\n "unique": true,\n "required": true,\n "required_on_authentication": false\n },\n {\n "max": 255,\n "min": 4,\n "name": "tlf",\n "type": "tlf",\n "unique": true,\n "required": true,\n "required_on_authentication": true\n }\n ], \n "public_name": "Phone",\n "public_name_i18n": {"es": "Tel\xe9fono"},\n "icon": "fa fa-phone"\n }\n]\n')),(0,i.kt)("p",null,"Describes support for alternative authentication methods objects, but it's unset\nby default. Using this allows an election to let voters authenticate not only\nwith the default election authentication method, but with a list of different\nauth methods configured as described below."),(0,i.kt)("p",null,"Each alternative authentication method should be an object with the\nfollowing configuration keys:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"id"),": Unique string identifying this alternative auth method. It will be used\nin some authentication urls."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_name"),": Authentication method used in this alternative auth method\nmethod. Same format as ",(0,i.kt)("a",{parentName:"li",href:"#census-auth_method"},(0,i.kt)("inlineCode",{parentName:"a"},"auth_method")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_config"),": Object with the configuration of this alternative auth\nmethod method. Same format as\n",(0,i.kt)("a",{parentName:"li",href:"#census-auth_method_config"},(0,i.kt)("inlineCode",{parentName:"a"},"auth_method_config")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields"),": Extra fields configuration used in this alternative auth\nmethod method. It ",(0,i.kt)("strong",{parentName:"li"},"must")," have the same number and names as the main\n",(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields")," of this election, but the rest of the configuration of each\nfield can vary. Same format as ",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},(0,i.kt)("inlineCode",{parentName:"a"},"extra_fields")),". "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"public_name"),": String containing the visible default name shown in the login\ninterface for this authentication method."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"public_name_i18n"),": Object containing the translation strings for the\n",(0,i.kt)("inlineCode",{parentName:"li"},"public_name"),". Same format as\n",(0,i.kt)("a",{parentName:"li",href:"#election-title_i18n"},(0,i.kt)("inlineCode",{parentName:"a"},"title_i18n")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"icon"),": ",(0,i.kt)("a",{parentName:"li",href:"https://fontawesome.com/v4/icons/"},"Font Awesome icon")," classname to be shown on the tab to choose the\nalternative auth method. Example: ",(0,i.kt)("inlineCode",{parentName:"li"},"fa fa-phone"),".")),(0,i.kt)("h3",{id:"census-admin_fields"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"admin_fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"admin_fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#admin-field-object"},"Admin Field"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "name": "org_legal_name",\n "label": "Organization: Legal Name",\n "description": "Required. Please provide the name under which your organization is legally registered. It will be shown as part of the public information in a section inside the election public page.",\n "placeholder": "Example: Association of Surgeons of Great Britain",\n "min": 1,\n "max": 255,\n "value": "Example Organization Name",\n "required": true,\n "private": true,\n "type": "text"\n },\n {\n "name": "org_url",\n "label": "Organization: Website URL",\n "description": "Optional. Please provide the URL of your organization. It will be shown as part of the public information in a section inside the election public page.",\n "placeholder": "Example: https://example.com",\n "min": 5,\n "value": "https://example.com",\n "required": false,\n "private": true,\n "type": "text"\n }\n]\n')),(0,i.kt)("p",null,"Object that details the different options related to the election and required\nto be filled by election administrators for every election. What admin fields\nneed to be filled is configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," with the key\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.admin_fields"),". "),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#admin-field-object"},"Admin Field")," for more details."),(0,i.kt)("h3",{id:"census-auth_method_config"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"auth_method_config")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_config")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#auth-method-config-object"},"Auth Method Config"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "allow_user_resend": true,\n "msg": "Vote in __URL__ with code __CODE__",\n "subject": "Vote now with Sequent",\n "authentication-action": {\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n },\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n}\n')),(0,i.kt)("p",null,"Object that specifies various configuration authentication and authorization\noptions."),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#census-config-object"},"Census Config")," for more details."),(0,i.kt)("h2",{id:"extra-field-object"},"Extra Field Object"),(0,i.kt)("p",null,"Defines an authentication field that the voters might fill or with some relation\nto voters. Some extra fields are required depending on the election's\n",(0,i.kt)("a",{parentName:"p",href:"#election-auth_method"},"auth_method"),". For example, if the authentication method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", the extra field named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required. "),(0,i.kt)("p",null,"It is used by the Census' ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_fields property")," and can\nhave the following properties:"),(0,i.kt)("h3",{id:"extra-field-name"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"name")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"name")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"email"'))),(0,i.kt)("p",null,"The name property identifies the extra field. For most\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-type"},"extra field types")," the name set here is shown to voters\nas the field name in the user interface during the authentication process. It's\nalso used in API calls as the key to receive the authentication data or to store\nthe census data of a specific user."),(0,i.kt)("h3",{id:"extra-field-name_i18n"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"name_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"name_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "C\xf3digo"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the extra field ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"extra-field-type"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"type")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"text"'))),(0,i.kt)("p",null,"Defines the extra field type, which changes in appeareance and behaviour. There\nare the following available extra field types that you can use:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"text"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"int"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"bool"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"email"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"tlf"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"captcha"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"textarea"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"dni"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"dict"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"date"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"otp-code"'))),(0,i.kt)("h3",{id:"extra-field-required_on_authentication"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required_on_authentication")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required_on_authentication")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is required during authentication. If ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means\nthat during the authentication process this field needs to be provided by the\nvoter."),(0,i.kt)("h3",{id:"extra-field-source_claim"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"source_claim")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"source_claim")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"email"'))),(0,i.kt)("p",null,"OIDC claim name to compare with the extra field's data during authentication.\nUsed only in OpenID Connect authentication for the ",(0,i.kt)("inlineCode",{parentName:"p"},'"sub"')," named extra field."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"extra-field-match_against_census_on_otl_authentication"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"match_against_census_on_otl_authentication")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"match_against_census_on_otl_authentication")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is required during the OTL (One Time Link) authentication.\nIf ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means that during the OTL authentication process this field needs\nto be provided by the voter. Note that OTL only works if\n",(0,i.kt)("a",{parentName:"p",href:"#election-support_otl_enabled"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"support_otl_enabled"))," is set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," and and\n",(0,i.kt)("a",{parentName:"p",href:"#election-inside_authenticate_otl_period"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"inside_authenticate_otl_period")),"\nis also set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-required"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is always required. If ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means that during any\nprocess in which the voter needs to fill the extra fields, either during\nregistration or authentication, this field needs to be provided by the voter. "),(0,i.kt)("h3",{id:"extra-field-required_when_registered"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required_when_registered")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required_when_registered")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," this extra field will not appear to voters during\n",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"open registration"),". A better name for it might have been\n",(0,i.kt)("inlineCode",{parentName:"p"},"hidden_during_registration"),"."),(0,i.kt)("h3",{id:"extra-field-private"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"private")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"private")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Defines if this field is private. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the field will not\nappear to voters at any time but it will be appear in the census. This is useful\nif there's any field that you want to appear in the census to be able to search\nfor it or review that kind of user data in the administrative interface, but\nshould not be used for anything else."),(0,i.kt)("h3",{id:"extra-field-css_classes"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"css_classes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"css_classes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"user-id"'))),(0,i.kt)("p",null,"Defines the css class(es) to assign to the extra-field in the ui form. This can\nbe used in combination with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-theme_css"},"Election Presentation theme_css")," to change how an extra fields looks using CSS."),(0,i.kt)("h3",{id:"extra-field-unique"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"unique")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"unique")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), vote registration will fail if the\nvoter enters a value to this field that is repeated by any other element in the\ncensus. Note that this field uniquness is not verified during census import by\nadministrators. It only makes sense to set ",(0,i.kt)("inlineCode",{parentName:"p"},"unique")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," when setting the\nelection to have ",(0,i.kt)("inlineCode",{parentName:"p"},"open")," ",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"voter registration"),", because otherwise\nit will have no effect as there won't be any open voter registration process."),(0,i.kt)("h3",{id:"extra-field-match_census_on_registration"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"match_census_on_registration")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"match_census_on_registration")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"For ",(0,i.kt)("inlineCode",{parentName:"p"},"open")," ",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"voter registration"),", any previous element in the\ncensus would be matched using this field. This useful to be used together with\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-fill_if_empty_on_registration"},"fill_if_empty_on_registration"),",\nso that if you have a pre-registration census with only some fields already\nfilled in, you could fill the missing fields with\n",(0,i.kt)("inlineCode",{parentName:"p"},"fill_if_empty_on_registration")," if you first identify the element in census\nwith ",(0,i.kt)("inlineCode",{parentName:"p"},"match_census_on_registration")," set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-fill_if_empty_on_registration"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fill_if_empty_on_registration")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fill_if_empty_on_registration")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"It is used for pre-registration. If the pre-registered user on the census has\nthis field empty, then when the user will be able to set its value upon\nregistration."),(0,i.kt)("p",null,"This useful to be used together with\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-match_census_on_registration"},"match_census_on_registration"),", so\nthat if you have a pre-registration census with only some fields already filled\nin, you could fill the missing fields with ",(0,i.kt)("inlineCode",{parentName:"p"},"fill_if_empty_on_registration")," if\nyou first identify the element in census with ",(0,i.kt)("inlineCode",{parentName:"p"},"match_census_on_registration"),"\nset to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-userid_field"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"userid_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"userid_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"userid_field")," is used to generate the username, usedto generate the hmac\nauthentication token. If any field on the authevent is marked with\n",(0,i.kt)("inlineCode",{parentName:"p"},"userid_field")," as ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the username won't be generated randomly as it is done\nusually, but instead it will be generated by:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Concatenating all the data from the ",(0,i.kt)("inlineCode",{parentName:"li"},"userid_field"),"'s (in order of\nappeareance of the fields in ae.extra_fields)."),(0,i.kt)("li",{parentName:"ol"},"Adding the shared_secret (",(0,i.kt)("inlineCode",{parentName:"li"},"field1:field2:field3...:shared_secret"),")\nseparated with the colon character: ",(0,i.kt)("inlineCode",{parentName:"li"},":"),"."),(0,i.kt)("li",{parentName:"ol"},"The username will be the sha256 hash of the above\nNote that if a field is marked as userid_field, it should always have a valid\nconvertable-to-string value.")),(0,i.kt)("h3",{id:"extra-field-help"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Example: John Doe"'))),(0,i.kt)("p",null,"Help text that will appear below the input in the voter authentication or\nregistration form."),(0,i.kt)("h3",{id:"extra-field-help_i18n"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Ejemplo: Juan Garc\xeda"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the extra field ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"extra-field-regex"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"regex")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"regex")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"/\\d{9}[a-z]/"'))),(0,i.kt)("p",null,"Regular expression that will be checked against user input when sending the\nauthentication or registration form. This property only makes sense for extra\nfields whose input is a string like ",(0,i.kt)("inlineCode",{parentName:"p"},"textarea"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"text"),"."),(0,i.kt)("h3",{id:"extra-field-min"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"min")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1"))),(0,i.kt)("p",null,"This property can mean two different things:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"For extra fields whose value is a string, it's the minimum allowed length of\nsuch a string."),(0,i.kt)("li",{parentName:"ul"},"For extra fields of ",(0,i.kt)("inlineCode",{parentName:"li"},"int")," ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-type"},"type"),", it is the minimum\nallowed value.")),(0,i.kt)("h3",{id:"extra-field-max"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"max")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"55"))),(0,i.kt)("p",null,"This property can mean two different things:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"For extra fields whose value is a string, it's the maximum allowed length of\nsuch a string."),(0,i.kt)("li",{parentName:"ul"},"For extra fields of ",(0,i.kt)("inlineCode",{parentName:"li"},"int")," ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-type"},"type"),", it is the maximum\nallowed value.")),(0,i.kt)("h3",{id:"extra-field-autofill"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"autofill")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"autofill")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"When user is is activated by calling to ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s\n",(0,i.kt)("inlineCode",{parentName:"p"},"/api/auth-event/%d/census/activate/"),", this field will be copied from the admin\nuser to the activated user. This is useful for example if an admin user has an\nextra field specifying the precint assigned to it and we would like to set that\ninfo in a ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-private"},"private field")," of the activated user too."),(0,i.kt)("h2",{id:"admin-field-object"},"Admin Field Object"),(0,i.kt)("p",null,"Object that details the different options related to the election and required\nto be filled by election administrators for every election. What admin fields\nneed to be filled is configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," with the key\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.admin_fields"),". "),(0,i.kt)("p",null,"It is used by the Census' ",(0,i.kt)("a",{parentName:"p",href:"#census-admin_fields"},"admin_fields property")," and\nset by the election administrator during creator in the sidebar item\n",(0,i.kt)("inlineCode",{parentName:"p"},"Admin Fields"),"."),(0,i.kt)("p",null,"The properties of an ",(0,i.kt)("a",{parentName:"p",href:"#admin-field-object"},"Admin Field")," are the same as those\nof an ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-object"},"Extra Field")," but with some additional properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"description"),": Description of what the field should be used for"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"label"),": Label of the admin field, which will be shown to the election creator\ninstead of the name."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"value"),": Value set for this specific election."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"placeholder"),": placeholder to be shown for the admin field when empty.")),(0,i.kt)("h2",{id:"census-config-object"},"Census Config Object"),(0,i.kt)("p",null,"This JSON object type describes some census configuration parameters\nrelated to the election. It is used by the ",(0,i.kt)("a",{parentName:"p",href:"#census-config"},"config property")," of\nthe ",(0,i.kt)("a",{parentName:"p",href:"#census-object"},"census object")," and can have the following properties:"),(0,i.kt)("h3",{id:"census-config-allow_user_resend"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_user_resend")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_user_resend")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to true, allows the voter to request the authentication code to be\nresent. Usually, this makes sense only for authentication methods that use\nauthentication codes such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"sms")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", but not\nfor others such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email-and-password"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"user-and-password")," or\n",(0,i.kt)("inlineCode",{parentName:"p"},"openid-connect"),". However, it makes sense to enable it if you are using an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of ",(0,i.kt)("inlineCode",{parentName:"p"},"otp-code")," type in combination with any\nauthentication method."),(0,i.kt)("h3",{id:"census-config-show_pdf"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_pdf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", it will:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Allow voters to authenticate even if they cannot vote (but they will only be\nshown the button to start voting if the voting period is open)."),(0,i.kt)("li",{parentName:"ol"},"Show the ",(0,i.kt)("inlineCode",{parentName:"li"},"Show PDF")," screen in the voting booth, allowing to showing a PDF\ndocument after authentication in the voting booth.")),(0,i.kt)("p",null,"Use only together with the ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-pdf_url"},(0,i.kt)("inlineCode",{parentName:"a"},"pdf_url")),"\npresentation configuration. Also please note that you can toggle the ",(0,i.kt)("inlineCode",{parentName:"p"},"show_pdf"),"\nflag in any existing election with the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/master/iam/api/management/commands/show_pdf.py"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf")," admin command"),"."),(0,i.kt)("h3",{id:"census-config-msg"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"msg")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"msg")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," In applicable authentication methods"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote in __URL__ with code __CODE__"'))),(0,i.kt)("p",null,"This is the text body template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"sms")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),". In the first\ntwo this corresponds to the Plain Text body of the email message."),(0,i.kt)("p",null,"As mentioned earlier, this is a template. Each voter will receive a tailored\nmessage with the template variables substituted with their values. Variables\nare identified surrounded by two ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," characters and always in upper case.\nFor example the variable ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," would appear as ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__"),"."),(0,i.kt)("p",null,"The allowed template variables are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL__"),": This is the voter authentication URL specific for the voter but\nnot containing the voter authentication code, which the voter will have to fill\nout manually."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__"),": This is the voter authentication URL containing the\nboth the email/sms of the voter and the voter authentication code. If no other\n",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},"extra_field")," is required during authentication, entering",(0,i.kt)("br",{parentName:"li"}),"in the ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__")," URLs allows voters to authenticate without having to fill out\nany web form. It's easier, but also more risky because anyone with this link\ncould use it to authenticate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL___")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2___")," if you are using ",(0,i.kt)("a",{parentName:"li",href:"#census-alternative_auth_methods"},(0,i.kt)("inlineCode",{parentName:"a"},"alternative_auth_methods")),", with the ",(0,i.kt)("inlineCode",{parentName:"li"},"alt-auth-method-id"),(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__CODE__"),": This is the authentication code. Each time the authentication\ncodes are sent to a voter, a new code is generated and any old codes are\ndisabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__OTL__"),": Includes a One Time Link (OTL). This OTL accesses to an\nauthentication process that, once authenticated, shows the authentication code\nto voters. Only works if ",(0,i.kt)("a",{parentName:"li",href:"#support_otl_enabled"},(0,i.kt)("inlineCode",{parentName:"a"},"support_otl_enabled"))," is\nenabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"____"),": Each voter has some voter related information\nassociated to it. You can use those extra fields by the\n",(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"\nand uppercased ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-name"},"name")," property.")),(0,i.kt)("p",null,"The maximum length of the message text depends on the authentication method. By\ndefault the email text body can have up to ",(0,i.kt)("inlineCode",{parentName:"p"},"5,000")," characters, and SMS text\nbody can only have ",(0,i.kt)("inlineCode",{parentName:"p"},"200"),". To change this, you would need to change the code\nin the respective authentication method code.\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/e9e980f8afd07e32098c487b7a8c3a9b4c5d575a/iam/authmethods/m_email.py#L140"},"This is the relevant code"),"\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," authentication method:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="iam/authmethods/m_email.py" {20}',title:'"iam/authmethods/m_email.py"',"{20}":!0}," CONFIG_CONTRACT = [\n {\n 'check': 'isinstance',\n 'type': dict\n },\n {\n 'check': 'dict-keys-exist',\n 'keys': ['msg', 'subject', 'registration-action', 'authentication-action']\n },\n {\n 'check': 'index-check-list',\n 'index': 'msg',\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n")),(0,i.kt)("h3",{id:"census-config-msg_i18n"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"msg_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Vota en __URL__ con c\xf3digo __CODE__"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Census Config ",(0,i.kt)("inlineCode",{parentName:"p"},"msg")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"census-config-html_message"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"html_message")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"html_message")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote in __URL__ with code __CODE__"'))),(0,i.kt)("p",null,"This is the HTML body template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters through email, such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),". In these, it\ncorresponds to the HTML body of the email message. "),(0,i.kt)("p",null,"This field is optional, and when defined, the sent email will have a content\ntype ",(0,i.kt)("inlineCode",{parentName:"p"},"multipart/alternative"),", where the first part will contain the ",(0,i.kt)("inlineCode",{parentName:"p"},"msg")," field\nwith Content-Type ",(0,i.kt)("inlineCode",{parentName:"p"},"text/plain")," and the second part will contain the ",(0,i.kt)("inlineCode",{parentName:"p"},"html-message"),"\nwith Content-Type ",(0,i.kt)("inlineCode",{parentName:"p"},"text/html"),"."),(0,i.kt)("p",null,"Note that to enable using this feature, you need to change the configuration of\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"deployment-tool"),", by setting the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.field allow_html_emails")," to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," file."),(0,i.kt)("p",null,"As mentioned earlier, this is a template. Each voter will receive a tailored\nmessage with the template variables substituted with their values. Variables\nare identified surrounded by two ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," characters and always in upper case.\nFor example the variable ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," would appear as ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__"),"."),(0,i.kt)("p",null,"The allowed template variables are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL__"),": This is the voter authentication URL specific for the voter but\nnot containing the voter authentication code, which the voter will have to fill\nout manually."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__"),": This is the voter authentication URL containing the\nboth the email/sms of the voter and the voter authentication code. If no other\n",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},"extra_field")," is required during authentication, entering",(0,i.kt)("br",{parentName:"li"}),"in the ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__")," URLs allows voters to authenticate without having to fill out\nany web form. It's easier, but also more risky because anyone with this link\ncould use it to authenticate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__CODE__"),": This is the authentication code. Each time the authentication\ncodes are sent to a voter, a new code is generated and any old codes are\ndisabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"____"),": Each voter has some voter related information\nassociated to it. You can use those extra fields by the\n",(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"\nand uppercased ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-name"},"name")," property.")),(0,i.kt)("p",null,"The maximum length of the message text depends on the authentication method. By\ndefault the email HTML body can have up to ",(0,i.kt)("inlineCode",{parentName:"p"},"5,000")," characters. To change this, you\nwould need to change the code in the respective authentication method code.\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/e9e980f8afd07e32098c487b7a8c3a9b4c5d575a/iam/authmethods/m_email.py#L155"},"This is the relevant code"),"\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," authentication method:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="iam/authmethods/m_email.py" {35}',title:'"iam/authmethods/m_email.py"',"{35}":!0}," CONFIG_CONTRACT = [\n {\n 'check': 'isinstance',\n 'type': dict\n },\n {\n 'check': 'dict-keys-exist',\n 'keys': ['msg', 'subject', 'registration-action', 'authentication-action']\n },\n {\n 'check': 'index-check-list',\n 'index': 'msg',\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n {\n 'check': 'index-check-list',\n 'index': 'html_message',\n 'optional': True,\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n")),(0,i.kt)("h3",{id:"census-config-subject"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"subject")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"subject")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," In applicable authentication methods"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote now with Sequent"'))),(0,i.kt)("p",null,"This is the email subject template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),"."),(0,i.kt)("p",null,"The template works in the same manner as the\n",(0,i.kt)("a",{parentName:"p",href:"#census-config-subject"},(0,i.kt)("inlineCode",{parentName:"a"},"msg")," property"),", see that one for more details."),(0,i.kt)("h3",{id:"census-config-subject_i18n"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"subject_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"subject_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Vota en __URL__ con c\xf3digo __CODE__"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Census Config ",(0,i.kt)("inlineCode",{parentName:"p"},"subject")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"census-config-provider_ids"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"provider_ids")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"provider_ids")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List[String]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'["google"]\n')),(0,i.kt)("p",null,"If defined, it's a list of strings corresponding to the list of provider ids to make available for the user to authenticate, in order."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"census-config-authentication-action"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"authentication-action")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"authentication-action")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Object")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n}\n')),(0,i.kt)("p",null,"There are different modes for the authentication-action. The typical mode would\nbe to set the ",(0,i.kt)("inlineCode",{parentName:"p"},'"mode"')," to ",(0,i.kt)("inlineCode",{parentName:"p"},'"vote"'),", which means the voter will be redirected to\nthe authenticated voting booth to cast the voter's ballot."),(0,i.kt)("p",null,"But it's also possible to use the mode ",(0,i.kt)("inlineCode",{parentName:"p"},"go-to-url"),". This will redirect to the\nURL set in the ",(0,i.kt)("inlineCode",{parentName:"p"},'"mode-config"')," setting. The ",(0,i.kt)("inlineCode",{parentName:"p"},"mode-config.url")," is a string\nparameter that can be templated with the variables mentioned below (currently\nonly one), which will be ",(0,i.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI"},"URI encoded"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__VOTE_CHILDREN_INFO__")," will return information about the children elections\nin which the voter can vote. If it's not a parent-children election, then it\nwill just be an empty list ",(0,i.kt)("inlineCode",{parentName:"li"},"[]"),". If it's a parent-children election, it will\nbe something similar to the following:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "can-vote": true,\n "auth-event-id": 33,\n "num-successful-logins-allowed": 1,\n "num-successful-logins": 0\n },\n {\n "can-vote": true,\n "auth-event-id": 34,\n "num-successful-logins-allowed": 1,\n "num-successful-logins": 1\n }\n]\n')),(0,i.kt)("p",null,'In this context, successful logins equal to "cast votes".'),(0,i.kt)("p",null,"An example of an authentication-action object using the ",(0,i.kt)("inlineCode",{parentName:"p"},'"go-to-url"')," mode with\ntemplate would be:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "mode": "go-to-url",\n "mode-config": {\n "url": "https://example.com/path/to/somewhere/?children=__VOTE_CHILDREN_INFO__"\n }\n}\n')),(0,i.kt)("h3",{id:"census-config-fixed-code"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fixed-code")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fixed-code")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the authentication codes sent to users will be fixed, instead\nof generating a new code each time. When an authentication message is sent to\nan user, a new authentication code is created only if one doesn't exist yet for\nthe user, reusing it if one exists already."),(0,i.kt)("p",null,"In combination with the admin command ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters"),", it allows admins to\nset and fix the authentication codes to be sent to users."),(0,i.kt)("h2",{id:"question-object"},"Question Object"),(0,i.kt)("p",null,"This JSON object type describes a question (or ",(0,i.kt)("a",{parentName:"p",href:"https://pages.nist.gov/ElectionGlossary/#contest"},"contest")," in NIST terminology) in which a voter can vote. It is used inside the ",(0,i.kt)("a",{parentName:"p",href:"#election-questions"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"questions"))," property of\nthe ",(0,i.kt)("a",{parentName:"p",href:"#election-object"},"Election object")," and can have the following properties:"),(0,i.kt)("h3",{id:"question-title"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Do you approve the Annual Accounts of 2021?"'))),(0,i.kt)("p",null,"Title of the question. Will be shown in the voting booth and in the election\nresults."),(0,i.kt)("h3",{id:"question-title_i18n"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Nueva elecci\xf3n"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the question ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"question-description"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Long String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'"This is the description of the question. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs."\n')),(0,i.kt)("p",null,"Question description. It will appear below the title in the voting booth.\nAs shown in the example it allows for some basic HTML."),(0,i.kt)("h3",{id:"question-description_i18n"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Esta es la descripci\xf3n de la elecci\xf3n. Puede agregar html simple como negrita o enlaces a sitios web.\\n\\n

Usted necesita usar dos elementos br para nuevos p\xe1rrafos."\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"description")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"question-layout"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"layout")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"layout")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"accordion"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"simultaneous-questions"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"pcandidates-election"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"conditional-accordion"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"simultaneous-questions"'))),(0,i.kt)("p",null,"Indicates the layout to be applied in the voting booth for this question.\nDifferent layouts imply different presentation of the question. Note that not\nall the features are available for all the layouts. The layout that supports\nmore features and has been most used is the ",(0,i.kt)("inlineCode",{parentName:"p"},'"accordion"')," layout."),(0,i.kt)("h3",{id:"question-max"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"max")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1"))),(0,i.kt)("p",null,"Maximum number of answers that a voter can choose in the voting booth to\nconsider the vote valid. It must be greater or equal to\n",(0,i.kt)("a",{parentName:"p",href:"#question-min"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"min"))," and be greater than zero."),(0,i.kt)("h3",{id:"question-min"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"min")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"2"))),(0,i.kt)("p",null,"Minimum number of answers that a voter can choose in the voting booth to\nconsider the vote valid. It must be less or equal to\n",(0,i.kt)("a",{parentName:"p",href:"#question-max"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"max"))," and be greater or equal to zero."),(0,i.kt)("h3",{id:"question-num_winners"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"num_winners")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"num_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3"))),(0,i.kt)("p",null,"Number of winner answers to appoint in the electoral results."),(0,i.kt)("h3",{id:"question-tally_type"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"tally_type")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tally_type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"plurality-at-large"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"cumulative"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda-custom"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda-nauru"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda2"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda3"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"borda"'))),(0,i.kt)("p",null,"Indicates the name of the algorithm to apply to count the votes and calculate\nthe results of this question."),(0,i.kt)("h3",{id:"question-answer_total_votes_percentage"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_total_votes_percentage")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_total_votes_percentage")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-valid-votes"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-votes"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-votes"'))),(0,i.kt)("p",null,"Indicates if the percentages of votes shown in the election results should be\ncalculated over votes to options or over all votes."),(0,i.kt)("h3",{id:"question-answers"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answers")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answers")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#answer-object"},"Answer"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "category": "Liste 1: Die Linken",\n "details": "",\n "id": 0,\n "sort_order": 0,\n "text": "Liste 1: Die Linken",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n },\n {\n "title": "isCategoryList",\n "url": "true"\n }\n ]\n },\n {\n "category": "Liste 1: Die Linken",\n "details": "",\n "id": 1,\n "sort_order": 1,\n "text": "Schulze, Alexander",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n }\n]\n')),(0,i.kt)("p",null,"List of candidate ",(0,i.kt)("a",{parentName:"p",href:"#answer-object"},"answers")," in the question."),(0,i.kt)("h3",{id:"question-extra_options"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_options")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#question-extra-object"},"Question Extra")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"{}")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"{}"))),(0,i.kt)("p",null,"Set of ",(0,i.kt)("a",{parentName:"p",href:"#question-extra-object"},"extra options")," to configure this question."),(0,i.kt)("h2",{id:"question-extra-object"},"Question Extra Object"),(0,i.kt)("p",null,"An object describing a set of additional of question configuration options,\ncurrently used to modify the voting booth presentation behaviour. It is used\n",(0,i.kt)("a",{parentName:"p",href:"#question-extra_options"},"here")," and it can have the following\nproperties:"),(0,i.kt)("p",null,"TODO: there are many more options, not yet documented here."),(0,i.kt)("h3",{id:"question-extra-invalid_vote_policy"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"invalid_vote_policy")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"invalid_vote_policy")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allowed"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"warn"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"warn-invalid-implicit-and-explicit"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"not-allowed"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"warn"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"allowed"'))),(0,i.kt)("p",null,"Indicates whether an invalid vote should be allowed without warning, allowed\nbut warning the voter on implicitly invalid ballots, allowed but warning the\nvoter on both implicitly and explicitly invalid ballots, or not allowed."),(0,i.kt)("h3",{id:"question-extra-enable_panachage"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"enable_panachage")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"enable_panachage")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default), the voter will be able to choose answers from\nmultiple categories. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", the voter will only be allowed to choose\nanswers from a single category and any vote doing otherwise will be deemed\ninvalid."),(0,i.kt)("h3",{id:"question-extra-cumulative_number_of_checkboxes"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"cumulative_number_of_checkboxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"cumulative_number_of_checkboxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3"))),(0,i.kt)("p",null,"Specifies the number of checkboxes shown to the side of each question's answer,\nso that the voter can check each of them. Currently only used when voting method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"cummulative"),". By default, if unset, its value is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),". "),(0,i.kt)("h3",{id:"question-extra-enable_checkable_lists"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"enable_checkable_lists")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"enable_checkable_lists")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["disabled", "allow-selecting-candidates-and-lists", "allow-selecting-candidates", "allow-selecting-lists"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"disabled"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates-and-lists"'))),(0,i.kt)("p",null,"This setting configures if candidate options or lists of candidates can be\nselected by a voter in the voting booth:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates-and-lists"'),": Both candidates and lists of\ncandidates can be selected by a voter."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates"'),": Only candidates can be selected by a voter."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-lists"'),": Only lists of candidates can be selected by a\nvoter.")),(0,i.kt)("p",null,"An answer representing the checkable category can be added (a\n",(0,i.kt)("inlineCode",{parentName:"p"},"category answer"),"), and can be flagged as such by ",(0,i.kt)("a",{parentName:"p",href:"#is-category-list"},"setting an url to the\ncategory answer")," with title ",(0,i.kt)("inlineCode",{parentName:"p"},'"isCategoryList"')," and url set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"')," (string)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Currently it is required to include a category answer for each category of the\nquestion when ",(0,i.kt)("inlineCode",{parentName:"p"},"enable_checkable_lists")," is set to any option different from the\ndefault (",(0,i.kt)("inlineCode",{parentName:"p"},'"disabled"'),").")),(0,i.kt)("h3",{id:"question-extra-show_points"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_points")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_points")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicates whether to show the points for each candidate and default to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),".\nIf set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the review screen where the voter can review the ballot\nchoices before casting the vote will show the points assigned to each selected\ncandidate next to the selected candidate in questions where the tally mechanism\nallows us to do so. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"accordion")," question layout will also show the points assigned to each\ncandidate if this setting is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"question-extra-review_screen__show_question_description"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen__show_question_description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen__show_question_description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicate whether the question description should be shown in the review screen\nof the voting booth below the election title for this specific question.\nDefaults to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h3",{id:"question-extra-allow_writeins"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_writeins")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_writeins")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicate whether this question can include any write-ins. Needed to set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," if you are using ",(0,i.kt)("a",{parentName:"p",href:"../guides/write-ins/"},"write-ins")," in the\nquestion. Defaults to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h3",{id:"question-extra-write_in_config"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"write_in_config")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"write_in_config")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#writeinconfig-object"},"WriteInConfig")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "fields": [\n {\n "id": "first_name",\n "placeholder": "First Name",\n "placeholder_i18n": {\n "es": "Nombre"\n },\n "min": 2,\n "max": 10\n },\n {\n "id": "last_name",\n "placeholder": "Last surname",\n "placeholder_i18n": {\n "es": "Apellidos"\n },\n "max": 20,\n "min": 2\n }\n ],\n "template": "{first_name}; {last_name}"\n}\n')),(0,i.kt)("p",null,"Defines extra fields for write-in answers."),(0,i.kt)("h3",{id:"question-extra-answer_group_columns_size"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_group_columns_size")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_group_columns_size")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3, 4, 6, 12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"6")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#question-extra-answer_columns_size"},(0,i.kt)("inlineCode",{parentName:"a"},"answer_columns_size")))))),(0,i.kt)("p",null,"Specifies the relative width of each answer category in the ",(0,i.kt)("inlineCode",{parentName:"p"},"simulaneous-questions"),"\nlayout in the voting booth."),(0,i.kt)("p",null,"It uses ",(0,i.kt)("a",{parentName:"p",href:"https://getbootstrap.com/docs/3.3/css/#grid-options"},"bootstrap 12 columns system"),",\nmeaning the sizes need to be an integer from the allowed values (",(0,i.kt)("inlineCode",{parentName:"p"},"3, 4, 6, 12"),")."),(0,i.kt)("p",null,"For example, if it's set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", it means that each category will use the full\nwidth. But if it's set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6"),", then two categories will appear next to the other.\nNote that we are using ",(0,i.kt)("inlineCode",{parentName:"p"},"col-md-"),", so in small devices each category will\nneverless use the full width, equivalent to using the value ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),"."),(0,i.kt)("p",null,"All answers with no category set (category empty) are considered to be in the\nsame category with respect to this setting."),(0,i.kt)("h3",{id:"question-extra-answer_columns_size"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_columns_size")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_columns_size")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3, 4, 6, 12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#question-extra-answer_group_columns_size"},(0,i.kt)("inlineCode",{parentName:"a"},"answer_group_columns_size")))))),(0,i.kt)("p",null,"Specifies the relative width of each answer within each answer category in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"simulaneous-questions")," layout in the voting booth. "),(0,i.kt)("p",null,"It uses ",(0,i.kt)("a",{parentName:"p",href:"https://getbootstrap.com/docs/3.3/css/#grid-options"},"bootstrap 12 columns system"),",\nmeaning the sizes need to be an integer from the allowed values (",(0,i.kt)("inlineCode",{parentName:"p"},"3, 4, 6, 12"),")."),(0,i.kt)("p",null,"For example, if the ",(0,i.kt)("inlineCode",{parentName:"p"},"answer_group_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12")," and the\n",(0,i.kt)("inlineCode",{parentName:"p"},"answer_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6"),", then each category will use the full width\nand each answer will only use 50%, showing themselves in pairs."),(0,i.kt)("p",null,"However if ",(0,i.kt)("inlineCode",{parentName:"p"},"answer_group_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6")," and the\n",(0,i.kt)("inlineCode",{parentName:"p"},"answer_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", then it would be answer categories using\nhalf of the screen, appearing side by side in pairs. And within each category,\neach answer will use the full width of the category."),(0,i.kt)("h3",{id:"question-extra-show_filter_field"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_filter_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_filter_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", it adds a search/filter field to the left of the question title\nin the voting booth's candidates selection screen. By default, if unset, its\nvalue is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("p",null,"Voters will be able to filter candidates using the search field. The search string\ncan contain asterisks ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". An asterisk will match zero or more characters. The search\nwill only show options that partially match with the search string, either on the\ncategory, text or details of the option. The search ignores casing and tildes."),(0,i.kt)("p",null,"For example searching with the string ",(0,i.kt)("inlineCode",{parentName:"p"},"john*kennedy")," on the text\n",(0,i.kt)("inlineCode",{parentName:"p"},"Sir John F. Kennedy Jr")," will be a partial match, whereas if the search string\nwas ",(0,i.kt)("inlineCode",{parentName:"p"},"John Kennedy")," the search wouldn't match at all."),(0,i.kt)("p",null,"If there's a partial match with the category, all options within the category will\nbe shown. The results of the search will always be shown in one column, regardless of\nthe column configuration for the question."),(0,i.kt)("h2",{id:"writeinconfig-object"},"WriteInConfig Object"),(0,i.kt)("p",null,"The JSON object type describes the Write-In configuration in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#question-extra-object"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"a"},"extra_options"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"writeinconfig-fields"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#writeinfield-object"},"WriteInField"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "id": "first_name",\n "placeholder": "First Name",\n "placeholder_i18n": {\n "es": "Nombre"\n },\n "min": 2,\n "max": 10\n },\n {\n "id": "last_name",\n "placeholder": "Last surname",\n "placeholder_i18n": {\n "es": "Apellidos"\n },\n "max": 20,\n "min": 2\n }\n]\n')),(0,i.kt)("p",null,"The fields parameter is an array of objects defining each extra write-in field."),(0,i.kt)("h3",{id:"writeinconfig-template"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"template")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"template")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"{first_name} - {last_name}"'))),(0,i.kt)("p",null,"Template that defines how the Write-In fields will be encoded into a string.\nEach field value will be interpolated according to this template. Use ",(0,i.kt)("inlineCode",{parentName:"p"},"{"),"\nand ",(0,i.kt)("inlineCode",{parentName:"p"},"}")," between the id of the field to specify the position(s) where the field\nvalues will be interpolated."),(0,i.kt)("h3",{id:"writeinconfig-review_screen_presentation"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen_presentation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen_presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"string"'))),(0,i.kt)("p",null,"If this value is set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"string"'),", write-ins in the review screen\nwill be shown as the final string after encoding the write-in extra fields. Otherwise\nthe selected write-ins in the review screen will be shown just as in the voting step,\nexcept that they won't be editable."),(0,i.kt)("h2",{id:"writeinfield-object"},"WriteInField Object"),(0,i.kt)("p",null,"The JSON object type describes an extra field for the Write-Ins in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#writeinconfig-object"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"a"},"fields"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"writeinfield-id"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," id"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"first_name"'))),(0,i.kt)("p",null,"Defines the id of a WriteInField. This id has the same limitations of a javascript variable, for\nexample it can't start with numbers."),(0,i.kt)("h3",{id:"writeinfield-placeholder"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"placeholder")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," placeholder"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the placeholder text to be shown for the Write In extra field, in the input element."),(0,i.kt)("h3",{id:"writeinfield-placeholder_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"placeholder_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," placeholder_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"placeholder")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-label"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"label")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," label"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the label text to be shown for the Write In extra field, at the top left of the input element. This field accepts html input."),(0,i.kt)("h3",{id:"writeinfield-label_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"label_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," label_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"label")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-help"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," help"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the help text to be shown for the Write In extra field, after the input element. This field accepts html input."),(0,i.kt)("h3",{id:"writeinfield-help_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," help_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-min"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," min"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Positive Number"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," None"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"2"))),(0,i.kt)("p",null,"Defines the minimum number of characters for this field. "),(0,i.kt)("h3",{id:"writeinfield-max"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," max"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Number"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," None"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," 50")),(0,i.kt)("p",null,"Defines the maximum number of characters for this field. If negative, this check will not be active."),(0,i.kt)("h2",{id:"children-election-info-object"},"Children Election Info Object"),(0,i.kt)("p",null,"TODO "),(0,i.kt)("h2",{id:"answer-object"},"Answer Object"),(0,i.kt)("p",null,"The JSON object type describes an answer in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#question-answers"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"answers"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"answer-id"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"Anwer's id, it should be unique within the question."),(0,i.kt)("h3",{id:"answer-sort_order"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort_order")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"sort_order")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"This value will be used to sort the answers in the question.\nIf belongs to a category, it will be ordered within the category."),(0,i.kt)("h3",{id:"answer-category"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"category")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"category")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Independents"'))),(0,i.kt)("p",null,"Category the answer belongs to. If the question is not using categories\nor the answer doesn't belong to one, use the empty string ",(0,i.kt)("inlineCode",{parentName:"p"},'""'),"."),(0,i.kt)("h3",{id:"answer-text"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"John Ramirez"'))),(0,i.kt)("p",null,"The main text that will be shown for this voting option, for example the\ncandidate name."),(0,i.kt)("h3",{id:"answer-text_i18n"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"text_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"text_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Independientes"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Answer ",(0,i.kt)("inlineCode",{parentName:"p"},"text_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"answer-details"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"details")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"details")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"John Ramirez is an expert on the field with 20 years working for XYZ."'))),(0,i.kt)("p",null,"Some extra text describing the voting option, for example a description of the candidate.\nThis option is not required, in which case you should use the empty string ",(0,i.kt)("inlineCode",{parentName:"p"},'""'),"."),(0,i.kt)("h3",{id:"answer-details_i18n"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"details_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"details_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Independientes"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Answer ",(0,i.kt)("inlineCode",{parentName:"p"},"details_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"answer-urls"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"urls")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"urls")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#url-object"},"Url"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n]\n')),(0,i.kt)("p",null,"A list of URL objects. This is used to add tags to the Answer."),(0,i.kt)("h2",{id:"url-object"},"Url Object"),(0,i.kt)("p",null,"The URL Json object is used to complement the Answer description with different tags.\nEach URL object has two keys: ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"url"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," is the name of the tag\nand the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," is the value of the tag."),(0,i.kt)("p",null,"The possible url types are:"),(0,i.kt)("h3",{id:"url"},"URL"),(0,i.kt)("p",null,"This is used when you want to include a webpage associated with the Answer. This URL\nwill appear as part of the ballot in the voting booth. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title"),"value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"URL"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be the link to the webpage."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "URL",\n "url": "https://www.google.com"\n },\n')),(0,i.kt)("h3",{id:"image-url"},"Image URL"),(0,i.kt)("p",null,"Use this if you want to display an image with this Answer in the voting booth. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"Image URL"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be the link to the image."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "Image URL",\n "url": "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png"\n },\n')),(0,i.kt)("h3",{id:"invalid-vote-flag"},"Invalid Vote Flag"),(0,i.kt)("p",null,"Use this if you want to add an explicit voting option for an invalid vote in the voting booth."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"invalidVoteFlag"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "invalidVoteFlag",\n "url": "true"\n },\n')),(0,i.kt)("h3",{id:"position-flag"},"Position Flag"),(0,i.kt)("p",null,"This flag can be used for ",(0,i.kt)("a",{parentName:"p",href:"#invalid-vote-flag"},"explicit invalid Answers")," to position the answer either at the top or the bottom of the answers."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"positionFlag"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be either ",(0,i.kt)("inlineCode",{parentName:"p"},'"top"')," or ",(0,i.kt)("inlineCode",{parentName:"p"},'"bottom"'),". If this tag is not included,\nthe default position of the explicit invalid answer will be at the bottom of the answers in the ballot."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "positionFlag",\n "url": "bottom"\n },\n')),(0,i.kt)("h3",{id:"is-category-list"},"Is Category List"),(0,i.kt)("p",null,"When the question uses ",(0,i.kt)("a",{parentName:"p",href:"#question-extra-enable_checkable_lists"},"category lists"),", this option is used to mark an answer as a category list."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"isCategoryList"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "isCategoryList",\n "url": "true"\n },\n')),(0,i.kt)("h3",{id:"is-write-in"},"Is Write In"),(0,i.kt)("p",null,"When the question uses ",(0,i.kt)("a",{parentName:"p",href:"../guides/write-ins/"},"write-in candidates"),", this option is used to mark an answer as a write-in candidate."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"isWriteIn"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "isWriteIn",\n "url": "true"\n },\n')))}m.isMDXComponent=!0},8343:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/sample_config-87b36523fae895e421ea3d0e4b3072dc.yml"}}]); \ No newline at end of file diff --git a/assets/js/01a21e46.7181cb25.js b/assets/js/01a21e46.7181cb25.js new file mode 100644 index 00000000..1258fe09 --- /dev/null +++ b/assets/js/01a21e46.7181cb25.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[734],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,l=e.originalType,s=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),m=p(n),k=i,c=m["".concat(s,".").concat(k)]||m[k]||u[k]||l;return n?a.createElement(c,o(o({ref:t},d),{},{components:n})):a.createElement(c,o({ref:t},d))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var l=n.length,o=new Array(l);o[0]=m;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:i,o[1]=r;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>p});var a=n(3117),i=(n(7294),n(3905));const l={sidebar_position:0,title:"Election Creation JSON"},o=void 0,r={unversionedId:"general/reference/election-creation-json",id:"general/reference/election-creation-json",title:"Election Creation JSON",description:"Election JSON settings",source:"@site/docs/general/reference/election-creation-json.md",sourceDirName:"general/reference",slug:"/general/reference/election-creation-json",permalink:"/documentation/docs/general/reference/election-creation-json",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/reference/election-creation-json.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0,title:"Election Creation JSON"},sidebar:"generalSidebar",previous:{title:"Reference",permalink:"/documentation/docs/general/reference/"},next:{title:"Ballot Encoding",permalink:"/documentation/docs/general/reference/ballot-encoding"}},s={},p=[{value:"Election JSON settings",id:"election-json-settings",level:2},{value:"Election object",id:"election-object",level:2},{value:"Election: id",id:"election-id",level:3},{value:"Election: title",id:"election-title",level:3},{value:"Election: weightedVotingField",id:"election-weightedvotingfield",level:3},{value:"Election: title_i18n",id:"election-title_i18n",level:3},{value:"Election: description",id:"election-description",level:3},{value:"Election: description_i18n",id:"election-description_i18n",level:3},{value:"Election: virtual",id:"election-virtual",level:3},{value:"Election: virtualSubelections",id:"election-virtualsubelections",level:3},{value:"Election: parent_id",id:"election-parent_id",level:3},{value:"Election: children_election_info",id:"election-children_election_info",level:3},{value:"Election: director",id:"election-director",level:3},{value:"Election: authorities",id:"election-authorities",level:3},{value:"Election: questions",id:"election-questions",level:3},{value:"Election: presentation",id:"election-presentation",level:3},{value:"Election: scheduled_events",id:"election-scheduled_events",level:3},{value:"Election: layout",id:"election-layout",level:3},{value:"Election: support_otl_enabled",id:"election-support_otl_enabled",level:3},{value:"Election: inside_authenticate_otl_period",id:"election-inside_authenticate_otl_period",level:3},{value:"Election: num_successful_logins_allowed",id:"election-num_successful_logins_allowed",level:3},{value:"Election: tallyPipesConfig",id:"election-tallypipesconfig",level:3},{value:"Election: has_ballot_boxes",id:"election-has_ballot_boxes",level:3},{value:"Election: ballot_boxes",id:"election-ballot_boxes",level:3},{value:"Election: census",id:"election-census",level:3},{value:"Election: hide_default_login_lookup_field",id:"election-hide_default_login_lookup_field",level:3},{value:"Election: publicCandidates",id:"election-publiccandidates",level:3},{value:"Election: allow_public_census_query",id:"election-allow_public_census_query",level:3},{value:"Election: logo_url",id:"election-logo_url",level:3},{value:"Election: start_date",id:"election-start_date",level:3},{value:"Election: end_date",id:"election-end_date",level:3},{value:"Election Presentation Object",id:"election-presentation-object",level:2},{value:"Election Presentation: theme",id:"election-presentation-theme",level:3},{value:"Election Presentation: share_text",id:"election-presentation-share_text",level:3},{value:"Election Presentation: i18n_override",id:"election-presentation-i18n_override",level:3},{value:"Election Presentation: pdf_url",id:"election-presentation-pdf_url",level:3},{value:"Election Presentation: urls",id:"election-presentation-urls",level:3},{value:"Election Presentation: theme_css",id:"election-presentation-theme_css",level:3},{value:"Election Presentation: extra_options",id:"election-presentation-extra_options",level:3},{value:"Election Presentation: anchor_continue_btn_to_bottom",id:"election-presentation-anchor_continue_btn_to_bottom",level:3},{value:"Election Presentation: mandatory_acceptance_tos_html",id:"election-presentation-mandatory_acceptance_tos_html",level:3},{value:"Election Presentation: mandatory_acceptance_tos_html_i18n",id:"election-presentation-mandatory_acceptance_tos_html_i18n",level:3},{value:"Election Presentation: booth_log_out__countdown_seconds",id:"election-presentation-booth_log_out__countdown_seconds",level:3},{value:"Election Presentation: public_title",id:"election-presentation-public_title",level:3},{value:"Election Presentation: public_title_i18n",id:"election-presentation-public_title_i18n",level:3},{value:"Election Presentation: i18n_languages_conf",id:"election-presentation-i18n_languages_conf",level:3},{value:"Share Text Object",id:"share-text-object",level:2},{value:"Share Text: network",id:"share-text-network",level:3},{value:"Share Text: button_text",id:"share-text-button_text",level:3},{value:"Share Text: social_message",id:"share-text-social_message",level:3},{value:"Election Presentation Extra Options Object",id:"election-presentation-extra-options-object",level:2},{value:"Election Presentation Options: allow_voting_end_graceful_period",id:"election-presentation-options-allow_voting_end_graceful_period",level:3},{value:"Election Presentation Options: start_screen__skip",id:"election-presentation-options-start_screen__skip",level:3},{value:"Election Presentation Options: disable__demo_voting_booth",id:"election-presentation-options-disable__demo_voting_booth",level:3},{value:"Election Presentation Options: booth_log_out__disable",id:"election-presentation-options-booth_log_out__disable",level:3},{value:"Election Presentation Options: disable__election_chooser_screen",id:"election-presentation-options-disable__election_chooser_screen",level:3},{value:"Election Presentation Options: disable__public_home",id:"election-presentation-options-disable__public_home",level:3},{value:"Election Presentation Options: success_screen__hide_ballot_tracker",id:"election-presentation-options-success_screen__hide_ballot_tracker",level:3},{value:"Election Presentation Options: success_screen__hide_qr_code",id:"election-presentation-options-success_screen__hide_qr_code",level:3},{value:"Election Presentation Options: success_screen__hide_download_ballot_ticket",id:"election-presentation-options-success_screen__hide_download_ballot_ticket",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_url",id:"election-presentation-options-success_screen__ballot_ticket__logo_url",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_header",id:"election-presentation-options-success_screen__ballot_ticket__logo_header",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__logo_subheader",id:"election-presentation-options-success_screen__ballot_ticket__logo_subheader",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__h3",id:"election-presentation-options-success_screen__ballot_ticket__h3",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__h4",id:"election-presentation-options-success_screen__ballot_ticket__h4",level:3},{value:"Election Presentation Options: success_screen__ballot_ticket__show_election_id",id:"election-presentation-options-success_screen__ballot_ticket__show_election_id",level:3},{value:"Election Presentation Options: success_screen__redirect__url",id:"election-presentation-options-success_screen__redirect__url",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login",id:"election-presentation-options-success_screen__redirect_to_login",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login__text",id:"election-presentation-options-success_screen__redirect_to_login__text",level:3},{value:"Election Presentation Options: success_screen__redirect_to_login__auto_seconds",id:"election-presentation-options-success_screen__redirect_to_login__auto_seconds",level:3},{value:"Election Presentation Options: disable_voting_booth_audit_ballot",id:"election-presentation-options-disable_voting_booth_audit_ballot",level:3},{value:"Election Presentation Options: review_screen__split_cast_edit",id:"election-presentation-options-review_screen__split_cast_edit",level:3},{value:"Election Presentation Options: show_skip_question_button",id:"election-presentation-options-show_skip_question_button",level:3},{value:"Results Config Pipes",id:"results-config-pipes",level:2},{value:"Election results input",id:"election-results-input",level:3},{value:"Election results output",id:"election-results-output",level:3},{value:"Election results can have different questions",id:"election-results-can-have-different-questions",level:3},{value:"Pipe: do_tallies",id:"pipe-do_tallies",level:3},{value:"do_tallies: ignore_invalid_votes",id:"do_tallies-ignore_invalid_votes",level:4},{value:"do_tallies: print_as_csv",id:"do_tallies-print_as_csv",level:4},{value:"do_tallies: tallies_indexes",id:"do_tallies-tallies_indexes",level:4},{value:"do_tallies: question_indexes",id:"do_tallies-question_indexes",level:4},{value:"do_tallies: reuse_results",id:"do_tallies-reuse_results",level:4},{value:"do_tallies: allow_empty_tally",id:"do_tallies-allow_empty_tally",level:4},{value:"do_tallies: help",id:"do_tallies-help",level:4},{value:"Pipe: sort_non_iterative",id:"pipe-sort_non_iterative",level:3},{value:"sort_non_iterative: tallies_indexes",id:"sort_non_iterative-tallies_indexes",level:4},{value:"sort_non_iterative: question_indexes",id:"sort_non_iterative-question_indexes",level:4},{value:"sort_non_iterative: withdrawals",id:"sort_non_iterative-withdrawals",level:4},{value:"sort_non_iterative: ties_sorting",id:"sort_non_iterative-ties_sorting",level:4},{value:"sort_non_iterative: help",id:"sort_non_iterative-help",level:4},{value:"Pipe: configure_pdf",id:"pipe-configure_pdf",level:3},{value:"configure_pdf: title",id:"configure_pdf-title",level:4},{value:"configure_pdf: first_description_paragraph",id:"configure_pdf-first_description_paragraph",level:4},{value:"configure_pdf: last_description_paragraph",id:"configure_pdf-last_description_paragraph",level:4},{value:"configure_pdf: languages",id:"configure_pdf-languages",level:4},{value:"configure_pdf: timezone",id:"configure_pdf-timezone",level:4},{value:"configure_pdf: date_format",id:"configure_pdf-date_format",level:4},{value:"configure_pdf: hide_logo",id:"configure_pdf-hide_logo",level:4},{value:"configure_pdf: hide_dates",id:"configure_pdf-hide_dates",level:4},{value:"configure_pdf: theme_colors",id:"configure_pdf-theme_colors",level:4},{value:"Other pipes",id:"other-pipes",level:3},{value:"Census object",id:"census-object",level:2},{value:"Census: voters",id:"census-voters",level:3},{value:"Assigning children elections in parent election census",id:"assigning-children-elections-in-parent-election-census",level:4},{value:"Census: auth_method",id:"census-auth_method",level:3},{value:"Census: census",id:"census-census",level:3},{value:"Census: extra_fields",id:"census-extra_fields",level:3},{value:"Census: oidc_providers",id:"census-oidc_providers",level:3},{value:"Census: alternative_auth_methods",id:"census-alternative_auth_methods",level:3},{value:"Census: admin_fields",id:"census-admin_fields",level:3},{value:"Census: auth_method_config",id:"census-auth_method_config",level:3},{value:"Extra Field Object",id:"extra-field-object",level:2},{value:"Extra Field: name",id:"extra-field-name",level:3},{value:"Extra Field: name_i18n",id:"extra-field-name_i18n",level:3},{value:"Extra Field: type",id:"extra-field-type",level:3},{value:"Extra Field: required_on_authentication",id:"extra-field-required_on_authentication",level:3},{value:"Extra Field: source_claim",id:"extra-field-source_claim",level:3},{value:"Extra Field: match_against_census_on_otl_authentication",id:"extra-field-match_against_census_on_otl_authentication",level:3},{value:"Extra Field: required",id:"extra-field-required",level:3},{value:"Extra Field: required_when_registered",id:"extra-field-required_when_registered",level:3},{value:"Extra Field: private",id:"extra-field-private",level:3},{value:"Extra Field: css_classes",id:"extra-field-css_classes",level:3},{value:"Extra Field: unique",id:"extra-field-unique",level:3},{value:"Extra Field: match_census_on_registration",id:"extra-field-match_census_on_registration",level:3},{value:"Extra Field: fill_if_empty_on_registration",id:"extra-field-fill_if_empty_on_registration",level:3},{value:"Extra Field: userid_field",id:"extra-field-userid_field",level:3},{value:"Extra Field: help",id:"extra-field-help",level:3},{value:"Extra Field: help_i18n",id:"extra-field-help_i18n",level:3},{value:"Extra Field: regex",id:"extra-field-regex",level:3},{value:"Extra Field: min",id:"extra-field-min",level:3},{value:"Extra Field: max",id:"extra-field-max",level:3},{value:"Extra Field: autofill",id:"extra-field-autofill",level:3},{value:"Admin Field Object",id:"admin-field-object",level:2},{value:"Census Config Object",id:"census-config-object",level:2},{value:"Census Config: allow_user_resend",id:"census-config-allow_user_resend",level:3},{value:"Census Config: show_pdf",id:"census-config-show_pdf",level:3},{value:"Census Config: msg",id:"census-config-msg",level:3},{value:"Census Config: msg_i18n",id:"census-config-msg_i18n",level:3},{value:"Census Config: html_message",id:"census-config-html_message",level:3},{value:"Census Config: subject",id:"census-config-subject",level:3},{value:"Census Config: subject_i18n",id:"census-config-subject_i18n",level:3},{value:"Census Config: provider_ids",id:"census-config-provider_ids",level:3},{value:"Census Config: authentication-action",id:"census-config-authentication-action",level:3},{value:"Census Config: fixed-code",id:"census-config-fixed-code",level:3},{value:"Question Object",id:"question-object",level:2},{value:"Question: title",id:"question-title",level:3},{value:"Question: title_i18n",id:"question-title_i18n",level:3},{value:"Question: description",id:"question-description",level:3},{value:"Question: description_i18n",id:"question-description_i18n",level:3},{value:"Question: layout",id:"question-layout",level:3},{value:"Question: max",id:"question-max",level:3},{value:"Question: min",id:"question-min",level:3},{value:"Question: num_winners",id:"question-num_winners",level:3},{value:"Question: tally_type",id:"question-tally_type",level:3},{value:"Question: answer_total_votes_percentage",id:"question-answer_total_votes_percentage",level:3},{value:"Question: answers",id:"question-answers",level:3},{value:"Question: extra_options",id:"question-extra_options",level:3},{value:"Question Extra Object",id:"question-extra-object",level:2},{value:"Question Extra: invalid_vote_policy",id:"question-extra-invalid_vote_policy",level:3},{value:"Question Extra: enable_panachage",id:"question-extra-enable_panachage",level:3},{value:"Question Extra: cumulative_number_of_checkboxes",id:"question-extra-cumulative_number_of_checkboxes",level:3},{value:"Question Extra: enable_checkable_lists",id:"question-extra-enable_checkable_lists",level:3},{value:"Question Extra: show_points",id:"question-extra-show_points",level:3},{value:"Question Extra: review_screen__show_question_description",id:"question-extra-review_screen__show_question_description",level:3},{value:"Question Extra: allow_writeins",id:"question-extra-allow_writeins",level:3},{value:"Question Extra: write_in_config",id:"question-extra-write_in_config",level:3},{value:"Question Extra: answer_group_columns_size",id:"question-extra-answer_group_columns_size",level:3},{value:"Question Extra: answer_columns_size",id:"question-extra-answer_columns_size",level:3},{value:"Question Extra: show_filter_field",id:"question-extra-show_filter_field",level:3},{value:"WriteInConfig Object",id:"writeinconfig-object",level:2},{value:"WriteInConfig: fields",id:"writeinconfig-fields",level:3},{value:"WriteInConfig: template",id:"writeinconfig-template",level:3},{value:"WriteInConfig: review_screen_presentation",id:"writeinconfig-review_screen_presentation",level:3},{value:"WriteInField Object",id:"writeinfield-object",level:2},{value:"WriteInField: id",id:"writeinfield-id",level:3},{value:"WriteInField: placeholder",id:"writeinfield-placeholder",level:3},{value:"WriteInField: placeholder_i18n",id:"writeinfield-placeholder_i18n",level:3},{value:"WriteInField: label",id:"writeinfield-label",level:3},{value:"WriteInField: label_i18n",id:"writeinfield-label_i18n",level:3},{value:"WriteInField: help",id:"writeinfield-help",level:3},{value:"WriteInField: help_i18n",id:"writeinfield-help_i18n",level:3},{value:"WriteInField: min",id:"writeinfield-min",level:3},{value:"WriteInField: max",id:"writeinfield-max",level:3},{value:"Children Election Info Object",id:"children-election-info-object",level:2},{value:"Answer Object",id:"answer-object",level:2},{value:"Answer: id",id:"answer-id",level:3},{value:"Answer: sort_order",id:"answer-sort_order",level:3},{value:"Answer: category",id:"answer-category",level:3},{value:"Answer: text",id:"answer-text",level:3},{value:"Answer: text_i18n",id:"answer-text_i18n",level:3},{value:"Answer: details",id:"answer-details",level:3},{value:"Answer: details_i18n",id:"answer-details_i18n",level:3},{value:"Answer: urls",id:"answer-urls",level:3},{value:"Url Object",id:"url-object",level:2},{value:"URL",id:"url",level:3},{value:"Image URL",id:"image-url",level:3},{value:"Invalid Vote Flag",id:"invalid-vote-flag",level:3},{value:"Position Flag",id:"position-flag",level:3},{value:"Is Category List",id:"is-category-list",level:3},{value:"Is Write In",id:"is-write-in",level:3}],d={toc:p};function u(e){let{components:t,...l}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"election-json-settings"},"Election JSON settings"),(0,i.kt)("p",null,"In this section we will describe the different options that can be configured\nin the Edit JSON Dialog for Election Creation. You review an example of a\n",(0,i.kt)("a",{target:"_blank",href:n(8343).Z},"sample election JSON configuration here"),"."),(0,i.kt)("p",null,"As can be seen in the last screenshot, the JSON Format starts with a list. This\nis a list of ",(0,i.kt)("a",{parentName:"p",href:"#election-object"},"Elections"),". This means you can directly create\nmultiple elections at once like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="multiple_elections.json"',title:'"multiple_elections.json"'},"[\n {\n ...Election 1 configuration..\n },\n {\n ...Election 2 configuration..\n },\n {\n ...Election 3 configuration..\n },\n]\n")),(0,i.kt)("p",null,"Once you click on the ",(0,i.kt)("inlineCode",{parentName:"p"},"Finish edit")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit Election Json")," dialog, if you\nhave added multiple elections this will be reflected in the interface."),(0,i.kt)("h2",{id:"election-object"},"Election object"),(0,i.kt)("p",null,"Within the Election JSON settings that can be set using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit Election JSON"),"\ndialog, each election can have the following settings:"),(0,i.kt)("h3",{id:"election-id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"345"))),(0,i.kt)("p",null,"Election's unique id. It will automatically be assigned one if none is set. If\nthe election already exists and the user has permissions to edit it, the\nelection configuration will be updated if the election is registered but\nnot yet created (",(0,i.kt)("a",{parentName:"p",href:"#modifying-elections"},"details here"),")."),(0,i.kt)("h3",{id:"election-title"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"New election"'))),(0,i.kt)("p",null,"Election's title. It will appear in the admin election list, and as the\nelection title in the public election site and in the voting booth start screen."),(0,i.kt)("h3",{id:"election-weightedvotingfield"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"weightedVotingField")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"weightedVotingField")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")," || ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"vote_weight"'))),(0,i.kt)("p",null,"Indicates the Election's vote-weight extra field name if set. This field needs\nto be of type ",(0,i.kt)("inlineCode",{parentName:"p"},"int")," to work. "),(0,i.kt)("h3",{id:"election-title_i18n"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Nueva elecci\xf3n"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-description"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Long String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"This is the description of the election. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs."'))),(0,i.kt)("p",null,"Election's description. It will appear below the title in the public election\nsite and in the voting booth start screen. As shown in the example it allows\nfor some basic HTML."),(0,i.kt)("h3",{id:"election-description_i18n"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Esta es la descripci\xf3n de la elecci\xf3n. Puede agregar html simple como negrita o enlaces a sitios web.\\n\\n

Usted necesita usar dos elementos br para nuevos p\xe1rrafos."\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"description")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-virtual"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"virtual")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"virtual")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("admonition",{title:"Enabling Virtual Elections",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Virtual elections are not enabled by default because for security reasons\nvirtual elections should not be enabled in multi-tenant deployments, as\n",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," do not verify that the election creator has permissions for\naccessing the sub-elections."),(0,i.kt)("p",{parentName:"admonition"},"To allow virtual election you have to enable it in the\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"deployment configuration"),", which can be done by setting\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"config.ballot-box.virtualElectionsAllowed")," setting in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\ndeployment configuration file to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),". ")),(0,i.kt)("admonition",{title:"Virtual vs Parent elections",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"You will note that there are two different possible types of relations between\nelections:"),(0,i.kt)("ol",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ol"},"A ",(0,i.kt)("a",{parentName:"li",href:"#election-virtual"},"virtual election")," and its respective\n",(0,i.kt)("a",{parentName:"li",href:"#election-virtualSubelections"},"virtual subelections"),"."),(0,i.kt)("li",{parentName:"ol"},"A ",(0,i.kt)("a",{parentName:"li",href:"#election-parent_id"},"parent election")," and its respective\n",(0,i.kt)("a",{parentName:"li",href:"#election-children_election_info"},"children elections"),".")),(0,i.kt)("p",{parentName:"admonition"},"The first kind of relation (virtual elections and virtual subelections) is\nestablished in ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),", and its use is allows for electoral results\nconsolidation."),(0,i.kt)("p",{parentName:"admonition"},"The second kind of relation is established in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," and its use is more\nrelated to the authentication, authorization and presentation behaviour in the\nearlier stages of an election, for example during login."),(0,i.kt)("p",{parentName:"admonition"},"Both are closely related/coupled, because usually you want to do both or none.\nThe separation exists simply because ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," are\ndifferent modules that have separated databases.")),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", this is a virtual election, meaning it can have subelections\nin ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". This allows the election results to be calculated when\ncalling ",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"tally-pipes")," with the votes of all the\nsubelections, and thus allows you to do electoral results consolidation. Set the\n",(0,i.kt)("a",{parentName:"p",href:"#election-virtualSubelections"},"virtualSubelections setting")," to specify which\nare those subelections."),(0,i.kt)("h3",{id:"election-virtualsubelections"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"virtualSubelections")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"virtualSubelections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},"[\n 41004,\n 41005,\n 41006\n]\n")),(0,i.kt)("p",null,"List of ",(0,i.kt)("a",{parentName:"p",href:"#election-id"},"election ids")," that will be used for virtual subelections.\nSee the information in ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual setting")," for more details."),(0,i.kt)("h3",{id:"election-parent_id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"parent_id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"parent_id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer | null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"66341"))),(0,i.kt)("p",null,"Identification number of the parent election, or more specifically ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent"),",\nbecause this is an attribute set in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"parent_id")," is set in children\nelections. It can only be set to refer to a parent ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent"),"'s that exist, so\nyou will have to create the parent election first. If you are creating multiple\nelections in a single ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit JSON elections"),", then also place the parent first."),(0,i.kt)("p",null,"When a set of election have a parent-children relationship, they have the\nfollowing behaviour:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"In the Admin election list, the children elections are hidden by default and\nonly shown as a dropdown of the parent election."),(0,i.kt)("li",{parentName:"ol"},"In the Admin election dashboard, the parent election can manage the children\nelections. For example starting or stopping the parent election starts/stops\nthe children elections automatically. The parent election dashboard also allows\nto trigger the tally of specific subelections with a chooser widget, and also\nallows to switch to see the election results of specific children elections."),(0,i.kt)("li",{parentName:"ol"},"In the Admin election Census Data, you can assign to each voter a subset of\nthe children elections, to allow a specific subset of children elections. The\nCensus Data section also allows you to view in which children elections has any\nvoter voted."),(0,i.kt)("li",{parentName:"ol"},"In the parent election results public website, there's a chooser widget to\nchoose which children election results to visualize."),(0,i.kt)("li",{parentName:"ol"},"In the voting booth, after authentication the voter will vote without having\nto authenticate again in the assigned children election in their\n",(0,i.kt)("a",{parentName:"li",href:"#child-election-natural_order"},"natural order")," sequentially. If a voter does\nnot vote to all the children elections assigned to this voter, then he will be\nable to authenticate again and vote in the next unvoted children election.")),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"#election-children_election_info"},"children_election_info setting")," for\nmore details about how to set the list of children elections in a parent. Also\nread about the ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual election setting")," to learn about\nthe differences of virtual and parent elections."),(0,i.kt)("h3",{id:"election-children_election_info"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"children_election_info")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"children_election_info")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#children-election-info-object"},"Children Election Info")," | ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-parent_id"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"parent_id"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-virtual"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"virtual"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#children-election-info-object"},"Children Election Info")))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "natural_order": [\n 41004,\n 41005,\n 41006\n ],\n "presentation": {\n "categories": [\n {\n "events": [\n {\n "event_id": 41004,\n "title": "Executive Board"\n }\n ],\n "id": 1,\n "title": "Board"\n },\n {\n "events": [\n {\n "event_id": 41005,\n "title": "Sector 1"\n },\n {\n "event_id": 41006,\n "title": "Sector 2"\n }\n ],\n "id": 2,\n "title": "Sectorial"\n }\n ]\n }\n}\n')),(0,i.kt)("p",null,"Describes the information related to the children elections. ",(0,i.kt)("inlineCode",{parentName:"p"},"null"),", which is\nthe default value, if this is not a parent election. See\n",(0,i.kt)("a",{parentName:"p",href:"#children-election-info-object"},"Children Election Info")," for details."),(0,i.kt)("h3",{id:"election-director"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"director")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"director")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"auth1"'))),(0,i.kt)("p",null,"The name of the election authority that will act as the director for this\nelection. Its eopackage needs to be installed in the backend server\n(",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/#connecting-web-servers-with-authorities"},"see details"),")."),(0,i.kt)("h3",{id:"election-authorities"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"authorities")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"authorities")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["auth2", "auth3"]'))),(0,i.kt)("p",null,"List of names of all the election authorities that should be included in this\nelection, excluding the director authority name. Its eopackages needs to be\ninstalled in the backend server\n(",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/#connecting-web-servers-with-authorities"},"see details"),")."),(0,i.kt)("h3",{id:"election-questions"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"questions")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"questions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#question-object"},"Question"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_total_votes_percentage": "over-total-valid-votes",\n "answers": [\n {\n "category": "",\n "details": "This is an option with an simple example description.",\n "id": 0,\n "sort_order": 0,\n "text": "Example option 1",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n },\n {\n "category": "",\n "details": "An option can contain a description. You can add simple html like bold or links to websites. You can also set an image url below, but be sure it\'s HTTPS or else it won\'t load.\\n\\n

You need to use two br element for new paragraphs.",\n "id": 1,\n "sort_order": 1,\n "text": "Example option 2",\n "urls": [\n {\n "title": "URL",\n "url": "https://sequentech.io"\n },\n {\n "title": "Image URL",\n "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/The_Fabs.JPG/220px-The_Fabs.JPG"\n }\n ]\n },\n {\n "category": "",\n "details": "",\n "id": 2,\n "sort_order": 2,\n "text": "Example option 3",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n }\n ],\n "description": "This is the description of this question. You can have multiple questions. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs.",\n "layout": "accordion",\n "max": 1,\n "min": 1,\n "num_winners": 1,\n "tally_type": "plurality-at-large",\n "title": "Test question title",\n "extra_options": {\n "shuffle_categories": true,\n "shuffle_all_options": true,\n "shuffle_category_list": [],\n "show_points": false\n },\n "active": true\n }\n]\n')),(0,i.kt)("p",null,"List of questions in the election. See ",(0,i.kt)("a",{parentName:"p",href:"#question-object"},"Question")," for more\ndetails."),(0,i.kt)("h3",{id:"election-presentation"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"presentation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#election-presentation-object"},"Election Presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "theme": "default",\n "share_text": [\n {\n "network": "Twitter",\n "button_text": "",\n "social_message": "I have just voted in election __URL__, you can too! #sequent"\n },\n {\n "network": "Facebook",\n "button_text": "",\n "social_message": "__URL__"\n }\n ],\n "urls": [],\n "theme_css": ""\n }\n')),(0,i.kt)("p",null,"Describes presentation options related to the whole election. See\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-object"},"Election Presentation")," for more details."),(0,i.kt)("h3",{id:"election-scheduled_events"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"scheduled_events")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"scheduled_events")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "start_voting": {\n "event_at": "2023-09-12T09:26:00+00:00"\n },\n "end_voting": null\n}\n')),(0,i.kt)("p",null,"Describes the configuration for automatic scheduled events of an election. It\ncan be null, or it can be a dictionary that follows the example shown above."),(0,i.kt)("p",null,"The only currently configurable schedulable events are the election voting\nperiod begining and end, configurable by the keys ",(0,i.kt)("inlineCode",{parentName:"p"},"start_voting")," and\n",(0,i.kt)("inlineCode",{parentName:"p"},"end_voting"),"."),(0,i.kt)("p",null,"You can configure any of those two to be either ",(0,i.kt)("inlineCode",{parentName:"p"},"null")," or to be a dictionary\nwith the key ",(0,i.kt)("inlineCode",{parentName:"p"},"event_at")," containing the date and time of the scheduled event. The\ngiven datetime should follow the string format shown in the example. "),(0,i.kt)("p",null,"You must use non-naive datetime when providing the event date time, specifying\nthe timezone (the ",(0,i.kt)("inlineCode",{parentName:"p"},"+00:00")," means UTC)."),(0,i.kt)("h3",{id:"election-layout"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"layout")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"layout")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"simple"'))),(0,i.kt)("p",null,"Specifies the election-wide layout. For now this settings remains unused and it\nmust always be set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"simple"'),"."),(0,i.kt)("h3",{id:"election-support_otl_enabled"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"support_otl_enabled")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"support_otl_enabled")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," False"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," to enable OTL support in this election."),(0,i.kt)("h3",{id:"election-inside_authenticate_otl_period"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"inside_authenticate_otl_period")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"inside_authenticate_otl_period")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," False"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," to enable OTL authentication period for voters, so that they can\nretrieve their authentication codes."),(0,i.kt)("h3",{id:"election-num_successful_logins_allowed"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"num_successful_logins_allowed")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"num_successful_logins_allowed")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"Specifies the number of votes that can be cast, because ",(0,i.kt)("em",{parentName:"p"},"successful logins")," is\na generic and fancy way to call 'votes cast' in a generic way within AuthApi.\nIf set to zero, no specific limitation in ",(0,i.kt)("inlineCode",{parentName:"p"},"iam")," will happen regarding the\nauthentication process. If set to a number higher than zero, for example 1 or 3,\nthat will be the limit in the number of votes that can be cast."),(0,i.kt)("p",null,"Once the limitation is hit, the voter won't be able to authenticate again to\ncast a vote."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There might be other limitations on the number of votes that a voter can cast.\nFor example ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," has a deployment level configuration setting\nthat limits the number of votes that can be cast (this setting's path is\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.ballot-box.max_revotes")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," ansible configuration).\nThis ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," configuration setting will be applied independently of\n",(0,i.kt)("inlineCode",{parentName:"p"},"num_successful_logins_allowed"),".")),(0,i.kt)("h3",{id:"election-tallypipesconfig"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"tallyPipesConfig")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallyPipesConfig")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "version": "1.0",\n "pipes": [\n {\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {\n "ignore_invalid_votes": true\n }\n },\n {\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n }\n ]\n}\n')),(0,i.kt)("p",null,"Specifies how election results will be calculated. It contains in the ",(0,i.kt)("inlineCode",{parentName:"p"},"pipes"),"\nparameter a set of pipes to be applied, together with each pipe configuration,\nthat will be used during the calculation of election results. See\n",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"Results Config Pipes")," for more details."),(0,i.kt)("h3",{id:"election-has_ballot_boxes"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"has_ballot_boxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"has_ballot_boxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if this election will have paper ballot boxes. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the\nelection will show a new ",(0,i.kt)("inlineCode",{parentName:"p"},"Balot Boxes")," tab in the sidebar once created. In that\ntab a list of ballot boxes will be shown, and each ballot box will be able to\nhave a tally sheet attached. This can be used for hybrid elections with both\ndigital votes and paper ballots. "),(0,i.kt)("p",null,"A single election can have multiple ballot boxes assigned to it. Each ballot\nbox can be assigned via the ",(0,i.kt)("a",{parentName:"p",href:"#election-ballot_boxes"},(0,i.kt)("inlineCode",{parentName:"a"},"ballot_boxes"))," election\nobject property."),(0,i.kt)("p",null,"The way election results are calculated when there are ballot boxes is through\nmultiple steps:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"When a tally sheet is uploaded (to ",(0,i.kt)("inlineCode",{parentName:"li"},"iam"),"), ",(0,i.kt)("inlineCode",{parentName:"li"},"iam")," sends a callback to\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballot-box")," (the API call is to\n",(0,i.kt)("inlineCode",{parentName:"li"},"/api/election/:id/update-ballot-boxes-config"),") with the updated list of\ntally sheets related to that election."),(0,i.kt)("li",{parentName:"ol"},"That API call to ",(0,i.kt)("inlineCode",{parentName:"li"},"/api/election/:id/update-ballot-boxes-config")," of\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballot-box")," executes multiple steps:",(0,i.kt)("ol",{parentName:"li"},(0,i.kt)("li",{parentName:"ol"},"It sets the ",(0,i.kt)("inlineCode",{parentName:"li"},"ballotBoxesResultsConfig")," in the appropiate election and\nsaves it in the database."),(0,i.kt)("li",{parentName:"ol"},"It uses the ",(0,i.kt)("a",{parentName:"li",href:"#election-resultsconfig"},"tallyPipesConfig setting")," as a\ntemplate replacing any ocurrence of the text\n",(0,i.kt)("inlineCode",{parentName:"li"},"__ballotBoxesResultsConfig__")," with the content of\n",(0,i.kt)("inlineCode",{parentName:"li"},"ballotBoxesResultsConfig")," which is the updated list of tally sheets. If\nballotBoxesResultsConfig is not set, then ",(0,i.kt)("inlineCode",{parentName:"li"},"__ballotBoxesResultsConfig__"),"\nwill be always replaced by ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")," (empty list)."),(0,i.kt)("li",{parentName:"ol"},"It re-calculates the election results running ",(0,i.kt)("inlineCode",{parentName:"li"},"tally-pipes")," with the\ncalculated ",(0,i.kt)("a",{parentName:"li",href:"#election-resultsconfig"},"tallyPipesConfig setting")," in the previous\nstep.")))),(0,i.kt)("p",null,"As a result, if you want the tally sheets to be reflected somehow in the\nelection results, you will need to use the appropiate\n",(0,i.kt)("a",{parentName:"p",href:"#results-config-pipes"},"Results Config Pipes"),", for example ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/ballot_boxes.py#L278"},"tally_pipes.pipes.ballot_boxes.count_tally_sheets"),". See also ",(0,i.kt)("a",{parentName:"p",href:"#election-results-can-have-different-questions"},"Election results can have different questions")," section."),(0,i.kt)("h3",{id:"election-ballot_boxes"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"ballot_boxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ballot_boxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["Postal Ballots", "Onsite Paper Ballots"]'))),(0,i.kt)("p",null,"This configuration option is only used if\n",(0,i.kt)("a",{parentName:"p",href:"#election-has_ballot_boxes"},"has_ballot_boxes")," is set to true. It contains a\nlist of ballot boxes to be created."),(0,i.kt)("h3",{id:"election-census"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"census")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"census")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#census-object"},"Census"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "voters": [],\n "auth_method": "email",\n "census": "close",\n "extra_fields": [],\n "admin_fields": [],\n "config": {\n "allow_user_resend": true,\n "msg": "Vote in __URL__ with code __CODE__",\n "subject": "Vote now with Sequent",\n "authentication-action": {\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n },\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n }\n}\n')),(0,i.kt)("p",null,"Object that details the different options related to the census configuration.\nSee ",(0,i.kt)("a",{parentName:"p",href:"#census-object"},"Census")," for more details."),(0,i.kt)("h3",{id:"election-hide_default_login_lookup_field"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"hide_default_login_lookup_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_default_login_lookup_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if the census main lookup field is hidden. Only use this option if\nyou have setup some other(s) ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"census extra_field")," with the\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-required_on_authentication"},"required_on_authentication attribute"),"\nset to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", as it would be used to look up the voter in the database."),(0,i.kt)("h3",{id:"election-publiccandidates"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"publicCandidates")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Specifies if the candidates (i.e. list of answers in a question) are public or\nnot. When candidates are private, only properly authenticated and authorized\ncalls to the API (usually the endpoint is\n",(0,i.kt)("inlineCode",{parentName:"p"},"/elections/api/election/"),") will be able to retrieve the candidate\nlist, and all other request will return an empty list of answers for each\nquestion in the election."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Some important considerations:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", the demo voting booth will not work since\nthe demo voting booth always perform unauthenticated requests to retrieve the\nelection configuration. The demo voting-booth UI will just show an empty list\nof candidates."),(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", the election portal will show an empty\nlist of candidates , since it always performs unauthenticated requests to\nretrieve the election configuration."),(0,i.kt)("li",{parentName:"ul"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"publicCandidates")," is ",(0,i.kt)("inlineCode",{parentName:"li"},"false"),", you won't be able to publish the election\nresults since that would publish the candidate names, so that action will be\ndisabled in the admin console and the ballot-box will not allow it."))),(0,i.kt)("h3",{id:"election-allow_public_census_query"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_public_census_query")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_public_census_query")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Specifies if voters at any time can access the website to consult if their\nvoter is part of the census. Disabled by default. If enabled, a link to this\npage will appear in the public election website. The public census query is\nimplemented in a very similar way to the login form, but without sending any\nOne Time Passwords and instead of authenticating the user to vote it shows the\nuser if he will be able to vote, even before or after the voting process starts."),(0,i.kt)("h3",{id:"election-logo_url"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"logo_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"logo_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://example.com/path/to/logo.png"'))),(0,i.kt)("p",null,"URL of the logo to be shown in public election site and voting booth in the\npage header."),(0,i.kt)("h3",{id:"election-start_date"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"start_date")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"start_date")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"UNUSED. This field is required but should really be an empty string as it is currently unused."),(0,i.kt)("h3",{id:"election-end_date"},"Election: ",(0,i.kt)("inlineCode",{parentName:"h3"},"end_date")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"end_date")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"UNUSED. This field is required but should really be an empty string as it is currently unused."),(0,i.kt)("h2",{id:"election-presentation-object"},"Election Presentation Object"),(0,i.kt)("p",null,"This JSON object type describes presentation options related to the whole\nelection. It is used ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation"},"here")," and can have the following\nproperties:"),(0,i.kt)("h3",{id:"election-presentation-theme"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"theme")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"default"'))),(0,i.kt)("p",null,"Theme that will be used in the public election website and in the voting booth\nof this election. Existing themes exist in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/common-ui/tree/master/themes"},"themes directory")," of the common-ui repository. You can write\nyour own if need be, by following the same directory and file structure as any\nof those. The ",(0,i.kt)("inlineCode",{parentName:"p"},"default")," theme uses simple colors and not very specific, with\nthe idea of being able to be used in most cases. It is also the most widely used\nand thus battle-tested."),(0,i.kt)("h3",{id:"election-presentation-share_text"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"share_text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"share_text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#share-text-object"},"Share Text"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "network": "Twitter",\n "button_text": "",\n "social_message": "I have just voted in election __URL__, you can too! #sequent"\n },\n {\n "network": "Facebook",\n "button_text": "",\n "social_message": "__URL__"\n }\n]\n')),(0,i.kt)("p",null,"Describes a series of social network or other kind of links to be shown at the\ntop of the election public website and at the success screen of the voting\nbooth. See ",(0,i.kt)("a",{parentName:"p",href:"#share-text"},"Share Text")," for more details. It can be an empty list."),(0,i.kt)("h3",{id:"election-presentation-i18n_override"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"i18n_override")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"i18n_override")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map>")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "en": {\n "avRegistration.forgotPassword": "Did you forget your password, sir?",\n "avBooth.castTheBallot": "Cast thy ballot"\n }\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language\ncode. The provided translation will override the corresponding translation for\nthat language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this\nspecific election."),(0,i.kt)("h3",{id:"election-presentation-pdf_url"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"pdf_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"pdf_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Object"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "url": "https://file-examples.com/storage/fe783a5cbb6323602a28c66/2017/10/file-sample_150kB.pdf",\n "title": "Example PDF"\n}\n')),(0,i.kt)("p",null,"When the election ",(0,i.kt)("a",{parentName:"p",href:"#census-config-show_pdf"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf"))," flag is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),",\nthis the URL of the PDF document will be shown in the voting booth to the voter\nand the title of this document, which will also appear in the ",(0,i.kt)("inlineCode",{parentName:"p"},"Show PDF")," screen.\nSetting ",(0,i.kt)("inlineCode",{parentName:"p"},"pdf_url")," is mandatory if ",(0,i.kt)("a",{parentName:"p",href:"#census-config-show_pdf"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf"))," setting\nis enabled in an election."),(0,i.kt)("h3",{id:"election-presentation-urls"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"urls")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"urls")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]"))),(0,i.kt)("p",null,"DEPRECATED. Just leave it as an empty list."),(0,i.kt)("h3",{id:"election-presentation-theme_css"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"theme_css")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme_css")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"DEPRECATED. Just leave it as an empty string."),(0,i.kt)("h3",{id:"election-presentation-extra_options"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_options")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#election-presentation-extra-options-object"},"Election Presentation Extra Options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "start_screen__skip": true\n}\n')),(0,i.kt)("p",null,"A set of additional of election configuration options, currently used to modify\nthe voting booth presentation behaviour. This property is not required, but can\nbe useful. See more\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-extra-options-object"},"details about Election Presentation Extra Options here"),"."),(0,i.kt)("h3",{id:"election-presentation-anchor_continue_btn_to_bottom"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"anchor_continue_btn_to_bottom")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"anchor_continue_btn_to_bottom")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "anchor_continue_btn_to_bottom": true\n}\n')),(0,i.kt)("p",null,"When set to true, this forces the ",(0,i.kt)("inlineCode",{parentName:"p"},"Continue")," button at the botting of the screens\nin the ballot box to always be fixed to the absolute bottom of the web brower window."),(0,i.kt)("h3",{id:"election-presentation-mandatory_acceptance_tos_html"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"mandatory_acceptance_tos_html")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory_acceptance_tos_html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"I accept the Terms and conditions"'))),(0,i.kt)("p",null,"If set to some string, then the voting booth will show the given Basic HTML text\nwith a checkbox in that Start Screen of the Voting Booth, and the Start Voting\naction button below will be disabled until the voter clicks and marks the\ncheckbox for accepting these terms. "),(0,i.kt)("h3",{id:"election-presentation-mandatory_acceptance_tos_html_i18n"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"mandatory_acceptance_tos_html_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"mandatory_acceptance_tos_html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option>")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Acepto las Condiciones de Servicio""\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language, for\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"mandatory_acceptance_tos_html")," field."),(0,i.kt)("h3",{id:"election-presentation-booth_log_out__countdown_seconds"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"booth_log_out__countdown_seconds")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"booth_log_out__countdown_seconds")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-1"))),(0,i.kt)("p",null,"If set, then a progress bar will be shown in the background of the Logout button.\nThe progress bar is a countdown until the logout time, which happens when the\nsession expires. If the user hovers the mouse over the button, a tooltip will\nappear informing the user of the time they have left to cast their ballot."),(0,i.kt)("p",null,"The value set here is the seconds of anticipation for the countdown before the\nsession expires. If the value is negative, the countdown will start the moment\nthe user logs in."),(0,i.kt)("h3",{id:"election-presentation-public_title"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"public_title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"public_title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Approval of the accounts 2022"'))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\ninstead of showing the title of election in the voting booth, it will show this\nother title instead."),(0,i.kt)("h3",{id:"election-presentation-public_title_i18n"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"public_title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"public_title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Aprobaci\xf3n de las cuentas de 2022"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Election Presentation ",(0,i.kt)("inlineCode",{parentName:"p"},"public_title_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"election-presentation-i18n_languages_conf"},"Election Presentation: ",(0,i.kt)("inlineCode",{parentName:"h3"},"i18n_languages_conf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"i18n_languages_conf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Option[Object]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n // default language if anything else is equal\n "default_language": "en",\n // if set to `false`, we\'ll match browser settings with available \n // languages to decide which language to load by default. If set \n // to `true`, then we won\'t detect any browser language preferences\n // and we\'ll always load the previously defined `default_language`\n // by default.\n "force_default_language": false,\n // available languages for this election\n "available_languages": [\n "en",\n "es"\n ]\n}\n')),(0,i.kt)("p",null,"Allows the modification of the language behavior for any election. You can\nchange the default language, override if the default language should be\nautomatically loaded, and also change the list of available languages for this\nspecific election. Applies on the Voting Booth and also on the Election Portal."),(0,i.kt)("h2",{id:"share-text-object"},"Share Text Object"),(0,i.kt)("p",null,"Object describing a series of social network links or any other type of link\nto be shown at the top of the election public website and at the success screen\nof the voting booth. It is used ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-share_text"},"here")," and\nit can have the following properties:"),(0,i.kt)("h3",{id:"share-text-network"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"network")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"network")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Twitter"'))),(0,i.kt)("p",null,"Specifies the social network this link is for. Currently only ",(0,i.kt)("inlineCode",{parentName:"p"},'"Twitter"')," and\n",(0,i.kt)("inlineCode",{parentName:"p"},'"Facebook"')," special cases are detected. If you use any of those, then a given\nsocial network icon will be shown and the url will be set to share the\nspecified ",(0,i.kt)("a",{parentName:"p",href:"#share-text-social_message"},"social message"),"."),(0,i.kt)("h3",{id:"share-text-button_text"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"button_text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"button_text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""'))),(0,i.kt)("p",null,"Specifies the text to show with this share link. It's usually set to an empty\nstring as the network icon is usually set."),(0,i.kt)("h3",{id:"share-text-social_message"},"Share Text: ",(0,i.kt)("inlineCode",{parentName:"h3"},"social_message")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"social_message")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"I have just voted in election __URL__, you can too! #sequent"'))),(0,i.kt)("p",null,"When users click on the share link, it will try automatically default to share\nin Twitter/Facebook this message. It is a template string, where ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__")," will\nbe automatically replaced to a link to this election's public website."),(0,i.kt)("p",null,"Currently unused."),(0,i.kt)("h2",{id:"election-presentation-extra-options-object"},"Election Presentation Extra Options Object"),(0,i.kt)("p",null,"An object describing a set of additional of election configuration options,\ncurrently used to modify the voting booth presentation behaviour. It is used\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-extra_options"},"here")," and it can have the following\nproperties:"),(0,i.kt)("h3",{id:"election-presentation-options-allow_voting_end_graceful_period"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_voting_end_graceful_period")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_voting_end_graceful_period")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, the voters that are in the voting booth and whose voting session has\nnot expired and thus their credentials have not expired will be able to cast a\nvote even if the voting period has ended."),(0,i.kt)("h3",{id:"election-presentation-options-start_screen__skip"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"start_screen__skip")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"start_screen__skip")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nstart screen of the voting booth will not be shown."),(0,i.kt)("h3",{id:"election-presentation-options-disable__demo_voting_booth"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__demo_voting_booth")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__demo_voting_booth")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), this optional property will disable the\ndemo voting booth."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Disabling the demo voting booth does only disable the functionality,\nbut does not disable the public availability of the election information (such\nas candidate names) through the API."),(0,i.kt)("p",{parentName:"admonition"},"If the reason you want to disable the demo voting booth is to disable publishing\nthe candidates names, then you should use\n",(0,i.kt)("a",{parentName:"p",href:"#election-publiccandidates"},"publicCandidates: false")," instead.")),(0,i.kt)("h3",{id:"election-presentation-options-booth_log_out__disable"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"booth_log_out__disable")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"booth_log_out__disable")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), then:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Log out button won't show in the voting booth at the top."),(0,i.kt)("li",{parentName:"ol"},"After the voting session ends, the voter is NOT redirected to the login page.")),(0,i.kt)("h3",{id:"election-presentation-options-disable__election_chooser_screen"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__election_chooser_screen")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__election_chooser_screen")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), the voting booth of a parent election\nwill not show an election chooser where the voter gets to choose the next\nelection to vote. Instead, the voter will be shown one after the other the\nelections in which he can vote, not allowing to choose a specific election to\nvote each time. The voter can skip a specific election if\n",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-show_skip_question_button"},"show_skip_question_button"),"\nis enabled."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This option will never disable the election chooser screen in the voting booth,\nbecause in the demo voting booth there's no voter credentials to see which\nelections should be assigned to the specific voter.")),(0,i.kt)("h3",{id:"election-presentation-options-disable__public_home"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable__public_home")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable__public_home")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), this optional property will disable the\npublic home page for the election."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Disabling the public home page for the election does only disable the interface\nbut does not disable the public availability of the election information (such\nas candidate names) through the API."),(0,i.kt)("p",{parentName:"admonition"},"If the reason you want to disable the public home page for the election is to\ndisable publishing the candidates names, then you should use\n",(0,i.kt)("a",{parentName:"p",href:"#election-publiccandidates"},"publicCandidates: false")," instead.")),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_ballot_tracker"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_ballot_tracker")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_ballot_tracker")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the ballot tracker hash. This option does not hide\nthe QR code nor the link to download the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_qr_code"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_qr_code")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_qr_code")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the QR code that encodes a link to the ballot\ntracker URL. This option does not hide the ballot tracker hash nor the link\nto download the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__hide_download_ballot_ticket"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__hide_download_ballot_ticket")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__hide_download_ballot_ticket")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour and the\nsuccess screen will not show the link to download the ballot ticket PDF. This\noption does not hide the ballot tracker hash nor the QR code to the ballot "),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_url"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://example.com/path/to/logo.png"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the heading logo that appears next\nin the PDF ballot ticket that the voter can download from the voting booth\nsuccess screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the election's\n",(0,i.kt)("inlineCode",{parentName:"p"},"logo_url")," property is tried to be used as the logo, and if not, the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.big_logo_url")," property in the deployment YAML\nis used to load the logo, or otherwise no logo is shown in the ballot ticket\nPDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_header"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_header")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_header")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Sequent"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the heading text that appears next\nto the header logo in the PDF ballot ticket that the voter can download from\nthe voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.name")," property in the deployment YAML appears\nin the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__logo_subheader"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__logo_subheader")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__logo_subheader")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Subheader line"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the subheading text that appears next\nto the header logo in the PDF ballot ticket that the voter can download from the\nvoting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.organization.subtitle")," property in the deployment YAML appears\nin the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__h3"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__h3")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__h3")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote receipt"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the title of the ballot ticket\nthat appears below the header logo in the PDF ballot ticket that the voter can\ndownload from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then an i18n string saying\n",(0,i.kt)("inlineCode",{parentName:"p"},"Vote receipt")," will appear in the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__h4"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__h4")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__h4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Your vote has been cast correctly. This document justifies its issuance."')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__show_election_id"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__show_election_id")))))),(0,i.kt)("p",null,"If set, this optional property will modify the text of the ballot ticket\nthat appears below the title of the PDF ballot ticket that the voter can\ndownload from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, then an i18n string saying\n",(0,i.kt)("inlineCode",{parentName:"p"},"Your vote has been cast correctly. This document justifies its issuance."),"\nwill appear in the same position in the ballot ticket PDF."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__ballot_ticket__show_election_id"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__ballot_ticket__show_election_id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__ballot_ticket__show_election_id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__hide_download_ballot_ticket"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__hide_download_ballot_ticket"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_header"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_header"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__logo_subheader"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__logo_subheader"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h3"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h3"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__ballot_ticket__h4"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__ballot_ticket__h4")))))),(0,i.kt)("p",null,"If set, this optional property will include the election id in the PDF ballot\nticket that the voter can download from the voting booth success screen."),(0,i.kt)("p",null,"By default, if this optional property is not set, thus the election id doesn't\nappear in the PDF ballot ticket."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect__url"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect__url")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect__url")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"https://myvotingplace.com"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nwhen the success screen is going to redirect to the login screen, it will\nredirect to this URL instead. This means that if there's an automatic\nredirect to login or a redirect to login button (using ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login"},"success_screen__redirect_to_login"),"), all this\nredirect links will go to this url instead."),(0,i.kt)("p",null,"This also is the URL to which the voting booth will redirect if the voter logs\nout."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe success screen will show a link to redirect to the voter login page. Use\ntogether with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text")),"\nbecause the link will have that text, so you need to set it."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login__text"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login__text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login__text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Go to login"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__auto_seconds"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__auto_seconds")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe redirect to login link in the success screen will have the text specified\nin this string. Use\ntogether with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-options-success_screen__redirect_to_login"},"success_screen__redirect_to_login"),"\nbecause the link will only appear if that option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"election-presentation-options-success_screen__redirect_to_login__auto_seconds"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"success_screen__redirect_to_login__auto_seconds")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"success_screen__redirect_to_login__auto_seconds")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"10"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect__url"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect__url"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#election-presentation-options-success_screen__redirect_to_login__text"},(0,i.kt)("inlineCode",{parentName:"a"},"success_screen__redirect_to_login__text")))))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nonce the ballot is cast and the success screen is shown, after the specified\nnumber of seconds the voter will be automatically redirected to the login page."),(0,i.kt)("h3",{id:"election-presentation-options-disable_voting_booth_audit_ballot"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"disable_voting_booth_audit_ballot")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"disable_voting_booth_audit_ballot")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe review ballot screen, shown before casting the vote, will not show the hash\nof the ballot nor the link to audit the ballot."),(0,i.kt)("h3",{id:"election-presentation-options-review_screen__split_cast_edit"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen__split_cast_edit")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen__split_cast_edit")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nthe review screen instead of showing below just the button for\n",(0,i.kt)("inlineCode",{parentName:"p"},"Cast your ballot")," it will also show a button to ",(0,i.kt)("inlineCode",{parentName:"p"},"Edit ballot"),", showing both\nside by side (50% of horizontal space for each)."),(0,i.kt)("h3",{id:"election-presentation-options-show_skip_question_button"},"Election Presentation Options: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_skip_question_button")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_skip_question_button")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set, this optional property will modify the voting booth behaviour so that\nit will show ",(0,i.kt)("inlineCode",{parentName:"p"},"Skip question(s)")," link over the ",(0,i.kt)("inlineCode",{parentName:"p"},"Continue")," button to skip to the\nnext question. Only support for ",(0,i.kt)("inlineCode",{parentName:"p"},"simultaneous-questions")," layout."),(0,i.kt)("h2",{id:"results-config-pipes"},"Results Config Pipes"),(0,i.kt)("p",null,"A results config pipe is used to specify how election results will be calculated.\nResults configuration is set of pipes to be applied, together with each pipe\nconfiguration, that will be used during the calculation of election results. It\nis configured at the election level with the\n",(0,i.kt)("a",{parentName:"p",href:"#election-resultsconfig"},"tallyPipesConfig setting"),"."),(0,i.kt)("p",null,"Each pipe is a list of pipe objects with two items:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"The pipe import path (the ",(0,i.kt)("inlineCode",{parentName:"li"},'"type"')," key)"),(0,i.kt)("li",{parentName:"ol"},"An object with that specific pipe configuration (the ",(0,i.kt)("inlineCode",{parentName:"li"},'"params"')," key)")),(0,i.kt)("p",null,"For example, a config object could be:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n}\n')),(0,i.kt)("p",null,"And multiple pipes can be included in the top-level ",(0,i.kt)("inlineCode",{parentName:"p"},"tallyPipesConfig")," setting\nwith:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "version": "1.0",\n "pipes": [\n {\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {}\n },\n {\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0]\n }\n }\n ]\n}\n')),(0,i.kt)("p",null,"The pipes are interpreted and applied by\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-pipes"},"tally-pipes"),", which in turn is\ncalled by ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". There are multiple available pipes and we will\ndocument in this section most of them, what they do, what you can use them for\nand what are their configuration options."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There's a deployment level configuration setting that specifies a whitelist of\npipes that can be used. This setting's path is\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.tally_pipes.pipes_whitelist")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," ansible\nconfiguration). If you need to use a specific pipe, please ensure you\nhave whitelisted it in the deployment configuration.")),(0,i.kt)("h3",{id:"election-results-input"},"Election results input"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," is called with multiple input data:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The path to the list of votes to be decrypted."),(0,i.kt)("li",{parentName:"ul"},"The path to the election results configuration with all the pipes to be run."),(0,i.kt)("li",{parentName:"ul"},"The path to the election tally tarball. This tarball is generated by election\nauthorities and contains among other things a file with the list of questions,\nthe different options available for each question, the tally mechanism, etc."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("inlineCode",{parentName:"li"},"output directory")," where the election tally results in different formats\nshould be written in different files."),(0,i.kt)("li",{parentName:"ul"},"The election id."),(0,i.kt)("li",{parentName:"ul"},"The path to a file containing the whitelisted pipes.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," works by loading the election questions configuration, and\npassing it from pipe to pipe as the first argument of each pipe, called\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),". It also untars the election tally tarball in a temporal directory,\nwhich some pipes might use to output some temporal files too."),(0,i.kt)("p",null,"In virtual elections, ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," not only receives as an input the tarball\nof the ",(0,i.kt)("a",{parentName:"p",href:"#election-virtual"},"virtual election"),", but also the tarball of all the\n",(0,i.kt)("a",{parentName:"p",href:"#election-virtualsubelections"},"virtual subelections"),". "),(0,i.kt)("p",null,"In that case, ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," will also load that election's question\nconfiguration in the ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," pipes argument and extract each tally tarball\nin a different temporal directory. This is what allows us to do\nresults consolidation from multiple elections into a single one. In virtual\nelections, the first element in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," is the configuration of the virtual\nelection and then follows in order the list of virtual subelections as per the\nconfiguration of the election in ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box"),". Within each element in\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," there's an additional key ",(0,i.kt)("inlineCode",{parentName:"p"},"extract_dir")," that pipes can use to\naccess the details of the tally tarball of a specific subelection."),(0,i.kt)("h3",{id:"election-results-output"},"Election results output"),(0,i.kt)("p",null,"The output of ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," is usually directly to stdout in a specific\nformat. This is read by ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," and stored in the database as the\nelectoral results. But it also outputs the same electoral results in different\nformats in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"output directory"),": ",(0,i.kt)("inlineCode",{parentName:"p"},"csv"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"json"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"pretty")," (plain\ntext) and ",(0,i.kt)("inlineCode",{parentName:"p"},"pdf"),". It will also save the ballots in JSON format in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"output directory"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"output directory")," is served with ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," as\na private directory where results can be accessed when the election results are\nnot public, and then as a public directory where anyone can access the election\nresults when the election status is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"publish results"),". The results in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"output directory")," will contain with the following files:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.json")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.pretty")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},".results.pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ballots.csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ballots.json"))),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," works so that the pipes execute sequentially and communicate\nwith one another mainly through passing information via the mutable ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),"\nargument and also writting information in the temporal tarball extraction\ndirectories. The final output is the results configuration (which is in\ndifferent formats and files). But one important feature is that it might contain\na list of questions different of that one of the election configuration question\nlist. This is because there are some pipes that can duplicate questions and\nconsolidate electoral results. "),(0,i.kt)("h3",{id:"election-results-can-have-different-questions"},"Election results can have different questions"),(0,i.kt)("p",null,"For example, it might make sense that if you have an election with ballot boxes\nenabled, you might have only one question in the digital election but that two\ndifferent ballot boxes, one ballot box for Mail-in ballots and another for\nOnsite paper ballots. You could have election results for this election to\ncontain four different tallied questions (even if the election had only one\nquestion):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A tally of the digital votes"),(0,i.kt)("li",{parentName:"ul"},"A tally of the mail-in votes (from the Mail-in ballots box)"),(0,i.kt)("li",{parentName:"ul"},"A tally of the paper ballots (from the Paper ballots box)"),(0,i.kt)("li",{parentName:"ul"},"Consolidated results of all the previous ones together")),(0,i.kt)("p",null,"To do that, you would also have to change the title of the duplicated questions\nso that you can easily see which question corresponds with which tally. There\nare pipes to do that."),(0,i.kt)("p",null,"What follows is a list of the results configuration pipes in no particular\norder:"),(0,i.kt)("h3",{id:"pipe-do_tallies"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"do_tallies")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py#L24"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.results.do_tallies"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.results.do_tallies",\n "params": {\n "question_indexes": [0]\n }\n}\n')),(0,i.kt)("p",null,"This pipe is used to run the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally")," algorithm of the election questions. It\nwill calculate the results using that ",(0,i.kt)("inlineCode",{parentName:"p"},"tally")," algorithm and set them in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"results")," key in the appropiate element inside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),", among other things.\n",(0,i.kt)("inlineCode",{parentName:"p"},"results")," is used later by ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," to output the electoral results in\nthe appropiate format. It also sets the ",(0,i.kt)("inlineCode",{parentName:"p"},"log")," key in the appropiate element\ninside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," if the tally algorithm generated any log output."),(0,i.kt)("p",null,"This pipe calls uses the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-methods"},"tally-methods"),"\nlibrary and calls to ",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally")," to do the results calculation\nof any question to be tallied."),(0,i.kt)("p",null,"Candidates marked as withdrawn (you can do that with the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," ) will not be counted\nduring the tally."),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"do_tallies-ignore_invalid_votes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"ignore_invalid_votes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ignore_invalid_votes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If this option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," as it is by default, having invalid votes will\nnot make the tally fail. If it is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", then the call to\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally")," will raise an exception and the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes"),"\nexecution will fail. "),(0,i.kt)("p",null,"If you are not expecting any invalid votes, setting ",(0,i.kt)("inlineCode",{parentName:"p"},"ignore_invalid_votes")," to\n",(0,i.kt)("inlineCode",{parentName:"p"},"false")," might be a way to ensure that you don't overlook any invalid vote."),(0,i.kt)("h4",{id:"do_tallies-print_as_csv"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"print_as_csv")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"print_as_csv")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If this option is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false")," as it is by default, it will output to stdout\nthe ballots as they are read in CSV format. This option is currently unused most\nof the time as the ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," already outputs the ballots in CSV and JSON\nformats (the ",(0,i.kt)("inlineCode",{parentName:"p"},"ballots.csv")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"ballots.json")," files). By the way, those ballot\nfiles are generated by this pipe and using the same code as this setting uses."),(0,i.kt)("h4",{id:"do_tallies-tallies_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"tallies_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallies_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,4,6]"))),(0,i.kt)("p",null,"List of indexes in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," to tally or None if all of them should be\ntallied which is the default. Note that this is a filtering list. It will not\nerror if any index of this list is out of bounds. If this a virtual election\nand ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," received 2 tallies as input, if ",(0,i.kt)("inlineCode",{parentName:"p"},"tallies_indexes")," is\n",(0,i.kt)("inlineCode",{parentName:"p"},"[0,1,2,3]")," it will actually only tally the first two."),(0,i.kt)("h4",{id:"do_tallies-question_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"question_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2]"))),(0,i.kt)("p",null,"List of question to tally for each of the tallies being tallied or None if all\nof them should be tallied which is the default. Two notes:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"This is a filtering list. It will not error if any index of this list is out\nof bounds. If there is only a single question but ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," is set to\n",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,3,4]"),", this pipe will just tally the first question without any error."),(0,i.kt)("li",{parentName:"ul"},"This list of question indexes is applied to all elections. To apply different\n",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," for different elections you would have to have in your pipes\nconfiguration multiple calls to the ",(0,i.kt)("inlineCode",{parentName:"li"},"do_tallies")," with different settings. See\n",(0,i.kt)("a",{parentName:"li",href:"#do_tallies-reuse_results"},"reuse_results")," for some details on that.")),(0,i.kt)("h4",{id:"do_tallies-reuse_results"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"reuse_results")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"reuse_results")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"As mentioned before, this pipe heavy lifting is actually done by calling to\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_methods.tally.do_tally"),". This function call receives the question\nconfiguration as an object using the ",(0,i.kt)("inlineCode",{parentName:"p"},"question_json")," parameter. Usually this\nconfiguration is obtained by reading the question json file within the tally\ntarball temporal extraction directory. However, if ",(0,i.kt)("inlineCode",{parentName:"p"},"reuse_results")," is set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the ",(0,i.kt)("inlineCode",{parentName:"p"},"question_json")," parameter will be loaded with an object from\nthe given element inside ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list"),":\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['results']['questions']"),"."),(0,i.kt)("p",null,"This can be useful in different circumstances. For example if for some reason\nlike the one mentioned in ",(0,i.kt)("a",{parentName:"p",href:"#do_tallies-question_indexes"},"question_indexes"),", you\nneed to execute multiple runs of this pipe within the same ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes"),"\nexecution."),(0,i.kt)("h4",{id:"do_tallies-allow_empty_tally"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"allow_empty_tally")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_empty_tally")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), the tally will not fail even if there\nis an empty list of ballots being tallied."),(0,i.kt)("h4",{id:"do_tallies-help"},(0,i.kt)("inlineCode",{parentName:"h4"},"do_tallies"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Some explanation"'))),(0,i.kt)("p",null,"Most if not all of the pipes receive the ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," argument. This is a way for the\nwritter of the results configuration pipes to explain anything relating to this\nparticular pipe + pipe configuration pair, as usually configuration is in JSON\nformat which does not allow for comments."),(0,i.kt)("h3",{id:"pipe-sort_non_iterative"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort_non_iterative")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/sort.py#L35"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.sort.sort_non_iterative"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.sort.sort_non_iterative",\n "params": {\n "question_indexes": [0, 1]\n }\n}\n')),(0,i.kt)("p",null,"Pipe used to sort the answers in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['results']['questions'][]['answers']"),"\nand assigning a ",(0,i.kt)("inlineCode",{parentName:"p"},"winner_position")," depending on the question's ",(0,i.kt)("inlineCode",{parentName:"p"},"num_winners"),"\nsetting. This sort is by answer points (the answer's ",(0,i.kt)("inlineCode",{parentName:"p"},"total_count")," property)\nand thus is only applied for questions whose ",(0,i.kt)("inlineCode",{parentName:"p"},"tally_type")," algorithm is\nnon-iterative, like ",(0,i.kt)("inlineCode",{parentName:"p"},"plurality-at-large")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"borda"),". The answer list will be\nreordered to ensure that winners always appears before other candidates, and\ncan also be used for tie resolution using the ",(0,i.kt)("inlineCode",{parentName:"p"},"ties_sorting")," argument."),(0,i.kt)("p",null,"A Single-Transferable Vote (STV) tally method uses an iterative process to\nobtain winners so results cannot be sorted by this pipe. This pipe uses a\n",(0,i.kt)("inlineCode",{parentName:"p"},"tally_type")," whitelist to ensure it is only applied for non-iterative tally\nmethods, simply skipping any other question with any other tally method."),(0,i.kt)("p",null,"This pipe also takes into account during sorting candidate withdrawals and can\napply specific withdrawls at this stage using the ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawals")," option, or\napply the ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawals")," of candidate options that were recorded as withdrawn by\na previous pipe (like the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe"),")."),(0,i.kt)("p",null,"This pipe can be used to apply candidate removals, which means that a candidate\noption will not appear in the election results. "),(0,i.kt)("admonition",{title:"Different forms of withdrawal",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Multiple withdrawal methods are available and it's your responsability to know\nthem and use them as required."),(0,i.kt)("p",{parentName:"admonition"},"When a candidate is withdrawed for example using the\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe"),", if that withdrawal is\nmarked as such before executing the ",(0,i.kt)("a",{parentName:"p",href:"#pipe-do_tallies"},"do_tallies pipe"),", then\nthe candidate option will not be counted. If after ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," you execute\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," pipe, then it will also ensure it is not marked as a\nwinner. Note that the ordering of the pipes matter: if you apply the withdrawal\nwith ",(0,i.kt)("inlineCode",{parentName:"p"},"apply_modifications")," after having run ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," and having\n",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," as the last applied pipe (So the order of pipes is\n",(0,i.kt)("inlineCode",{parentName:"p"},"[do_tallies, apply_modifications, sort_non_iterative]"),"), the candidate will\nnot appear as a winner because ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," will detect that it's\nwithdrawed, but it will have the same number of points in the election results\nas it was not marked as withdrawed when the ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," was executed."),(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," can withdraw a\ncandidate but it can also directly be withdrawn by this ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative"),"\npipe, but then the points obtained will not change because the expected previous\ncall to the ",(0,i.kt)("inlineCode",{parentName:"p"},"do_tallies")," pipe will not have been marked the candidate as\nwithdrawed. ")),(0,i.kt)("admonition",{title:"Candidate Withdrawal vs Removal",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"There are important differences between candidate removal and withdrawal. The\n",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_modifications"},"apply_modifications pipe")," can be used to mark a\ncandidate option as either withdrawed or Removed. When a candidate is marked as\nremoved, the ",(0,i.kt)("inlineCode",{parentName:"p"},"sort_non_iterative")," pipe will remove the candidate option from\nthe election results. "),(0,i.kt)("p",{parentName:"admonition"},"If you don't need to sort the results, candidate removal can be also applied\ndirectly with the ",(0,i.kt)("a",{parentName:"p",href:"#pipe-apply_removals"},"apply_removals pipe"),". And of course,\nremember that you can do both a withdrawal and removal, so that the candidate\noption is both not counted and removed from the election results.")),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"sort_non_iterative-tallies_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"tallies_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tallies_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,4,6]"))),(0,i.kt)("p",null,"List of indexes in ",(0,i.kt)("inlineCode",{parentName:"p"},"data_list")," to which this pipe will be applied or None if\nthis pipe should be run for all the elections. Note that this is a filtering\nlist. It will not give any error if any index of this list is out of bounds.\nIf this a virtual election and ",(0,i.kt)("inlineCode",{parentName:"p"},"tally-pipes")," received 2 elections as input,\nif ",(0,i.kt)("inlineCode",{parentName:"p"},"tallies_indexes")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"[0,1,2,3]")," this pipe will just run for the first two."),(0,i.kt)("h4",{id:"sort_non_iterative-question_indexes"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"question_indexes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List | None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2]"))),(0,i.kt)("p",null,"List of question indexes to which this pipe should be applied or None if this\npipe should be run for all the questions of all the elections to which this pipe\nis being run, which is the default. Two notes:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"This is a filtering list. It will not error if any index of this list is out\nof bounds. If there is only a single question but ",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," is set to\n",(0,i.kt)("inlineCode",{parentName:"li"},"[0,1,2,3,4]"),", this pipe will just run for the first question without any error."),(0,i.kt)("li",{parentName:"ul"},"This list of question indexes is applied to all elections. To apply different\n",(0,i.kt)("inlineCode",{parentName:"li"},"question_indexes")," for different elections you would have to include in your\npipes configuration multiple calls to this pipe with different settings.")),(0,i.kt)("h4",{id:"sort_non_iterative-withdrawals"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"withdrawals")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"withdrawals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_id": 0,\n "answer_text": "John Doe for President",\n "question_index": 0\n }\n]\n')),(0,i.kt)("p",null,"List of Answers to withdraw. "),(0,i.kt)("p",null,"Note that other pipes might indicate also answers that need to be withdrawn,\nwith the same format as this list, in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"data_list[]['withdrawals']"),". Both lists are joined for this purpose."),(0,i.kt)("p",null,"Each ",(0,i.kt)("inlineCode",{parentName:"p"},"AnswerItem")," is an object that requires the following properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"question_index"),": The question index."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_id"),": The answer id."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_text"),": The answer text, for sanity checks.")),(0,i.kt)("p",null,"Withdrawed candidates will appear in the election results, but they will never\nappear as a winner. "),(0,i.kt)("h4",{id:"sort_non_iterative-ties_sorting"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"ties_sorting")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"ties_sorting")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"[]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "answer_id": 0,\n "answer_text": "John Doe for President",\n "question_index": 0,\n "tie_sort": 0\n },\n {\n "answer_id": 1,\n "answer_text": "Juanito for President",\n "question_index": 0,\n "tie_sort": 1\n }\n]\n')),(0,i.kt)("p",null,"When two candidate options are in a tie, you might need to apply an external\nprocedure to resolve this tie. Once this procedure has been applied, then you\ncan use this argument to specify how the tie should be resolved."),(0,i.kt)("p",null,"This argument receives a list of ",(0,i.kt)("inlineCode",{parentName:"p"},"TieAnswerItems"),". "),(0,i.kt)("p",null,"Each ",(0,i.kt)("inlineCode",{parentName:"p"},"TieAnswerItems")," is an object that requires the following properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"question_index"),": The question index."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_id"),": The answer id."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"answer_text"),": The answer text, for sanity checks."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"tie_sort"),": Integer number used for resolving the tie during sorting. If there\nis a tie between two candidates, the candidate with the lowest ",(0,i.kt)("inlineCode",{parentName:"li"},"tie_sort")," number\nwins.")),(0,i.kt)("h4",{id:"sort_non_iterative-help"},(0,i.kt)("inlineCode",{parentName:"h4"},"sort_non_iterative"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'""')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Some explanation"'))),(0,i.kt)("p",null,"Most if not all of the pipes receive the ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," argument. This is a way for the\nwritter of the results configuration pipes to explain anything relating to this\nparticular pipe + pipe configuration pair, as usually configuration is in JSON\nformat which does not allow for comments."),(0,i.kt)("h3",{id:"pipe-configure_pdf"},"Pipe: ",(0,i.kt)("inlineCode",{parentName:"h3"},"configure_pdf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pipe path"),": ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pdf.py#L40"},(0,i.kt)("inlineCode",{parentName:"a"},"tally_pipes.pipes.pdf.configure_pdf"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example usage"),":")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "type": "tally_pipes.pipes.pdf.configure_pdf",\n "params": {\n "languages": ["es"],\n "timezone": "Europe/Madrid"\n }\n}\n')),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"configure_pdf")," pipe is used to configure the PDF format election results.\nFor example, it can allow to change the language or the timezone of the date\nand times that appear in that document."),(0,i.kt)("p",null,"The following configuration options can be set in the pipe configuration object:"),(0,i.kt)("h4",{id:"configure_pdf-title"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Board Election 2022"'))),(0,i.kt)("p",null,"Allows to override the election title, if set to some string."),(0,i.kt)("h4",{id:"configure_pdf-first_description_paragraph"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"first_description_paragraph")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"first_description_paragraph")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Lorem ipsum."'))),(0,i.kt)("p",null,"Allows to prepend a paragraph before showing the election description in the\nPDF results."),(0,i.kt)("h4",{id:"configure_pdf-last_description_paragraph"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"last_description_paragraph")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"last_description_paragraph")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Lorem ipsum."'))),(0,i.kt)("p",null,"Allows to append a paragraph after showing the election description in the\nPDF results."),(0,i.kt)("h4",{id:"configure_pdf-languages"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"languages")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"languages")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["en"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["es", "en"]'))),(0,i.kt)("p",null,"Allows to change the language of the PDF election results. It establishes which\ntranslation to be used, referred by the ISO-639-1 short-code of the language.\nAllowed short-codes are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"en")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"es"))),(0,i.kt)("p",null,"Note that this stablishes the translation to be used with a list, because it\nuses the first language in the list as the main translation but the following\nlanguages are for fallback in case a specific translation string is not found."),(0,i.kt)("h4",{id:"configure_pdf-timezone"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"timezone")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"timezone")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"UTC"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Europe/Madrid"'))),(0,i.kt)("p",null,"Changes the timezone of the date/times (such as Election Start/Stop Date) shown\nin the PDF election results. For a listing of valid timezone strings, please use\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"TZ database name")," of the\n",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"},"List of tz database time zones")," wikipedia page. "),(0,i.kt)("h4",{id:"configure_pdf-date_format"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"date_format")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"date_format")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"%Y-%m-%d %H:%M:%S %Z"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"%Y-%m-%d %H:%M:%S %Z"'))),(0,i.kt)("p",null,"Changes the format of the date/times (such as Election Start/Stop Date) shown\nin the PDF election results. You can find a\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes"},"listing of available datetime format codes"),"\nin official Python documentation."),(0,i.kt)("h4",{id:"configure_pdf-hide_logo"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"hide_logo")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_logo")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", Sequent logo will not appear in the PDF election results."),(0,i.kt)("h4",{id:"configure_pdf-hide_dates"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"hide_dates")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"hide_dates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", start, end and tally dates will not appear in the PDF\nelection results."),(0,i.kt)("h4",{id:"configure_pdf-theme_colors"},(0,i.kt)("inlineCode",{parentName:"h4"},"configure_pdf"),": ",(0,i.kt)("inlineCode",{parentName:"h4"},"theme_colors")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"theme_colors")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Dict")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "Background": "white",\n "OnBackground": "black",\n "Primary": "#b6d7a8",\n "OnPrimary": "black",\n "OnGrey": "black",\n "Grey": "grey",\n "LightGrey": "#cccccc",\n "DarkGrey": "#efefef"\n}\n')),(0,i.kt)("p",null,"With this configuration setting you can change and tune the theme colors used in\nthe PDF election results. The example above represents the defaults. If there\nis any theme color name that you don't set, the default will be used."),(0,i.kt)("h3",{id:"other-pipes"},"Other pipes"),(0,i.kt)("p",null,"There are many other pipes but we have yet to document them. The easiest way\nright now to understand how they work is to just look at the code:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/duplicate_questions.py#L24"},"tally_pipes.pipes.duplicate_questions.duplicate_questions")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/modifications.py"},"tally_pipes.pipes.modifications.apply_modifications")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.make_multipart")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.election_max_size_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.question_totals_with_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.reduce_answers_with_corrections")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.multipart_tally_plaintexts_append_joiner")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.data_list_reverse")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.multipart_tally_plaintexts_joiner")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/multipart.py"},"tally_pipes.pipes.multipart.append_ballots")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.proportion_rounded")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.parity_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.reorder_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.podemos_parity_loreg_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/parity.py"},"tally_pipes.pipes.parity.podemos_parity2_loreg_zip_non_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/podemos.py"},"tally_pipes.pipes.podemos.podemos_proportion_rounded_and_duplicates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda4.py"},"tally_pipes.pipes.desborda4.podemos_desborda4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda3.py"},"tally_pipes.pipes.desborda3.podemos_desborda3")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda2.py"},"tally_pipes.pipes.desborda2.podemos_desborda2")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/desborda.py"},"tally_pipes.pipes.desborda.podemos_desborda")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pretty_print.py"},"tally_pipes.pipes.pretty_print.pretty_print_stv_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pretty_print.py"},"tally_pipes.pipes.pretty_print.pretty_print_not_iterative")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py"},"tally_pipes.pipes.results.to_files")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/results.py"},"tally_pipes.pipes.results.apply_removals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/stv_tiebreak.py"},"tally_pipes.pipes.stv_tiebreak.stv_first_round_tiebreak")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/pdf.py"},"tally_pipes.pipes.pdf.configure_pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/withdraw_candidates.py"},"tally_pipes.pipes.withdraw_candidates.withdraw_candidates")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/sequentech/tally-pipes/blob/master/tally_pipes/pipes/ballot_boxes.py#L278"},"tally_pipes.pipes.ballot_boxes.count_tally_sheets"))),(0,i.kt)("h2",{id:"census-object"},"Census object"),(0,i.kt)("p",null,"This JSON object type describes census configuration related to the election.\nIt is used by the ",(0,i.kt)("a",{parentName:"p",href:"#election-census"},"census property")," and can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"census-voters"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"voters")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"voters")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#voter-object"},"Voter"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "metadata": {\n "email": "john@example.com",\n "name": "John"\n }\n },\n {\n "metadata": {\n "email": "marta@example.com",\n "name": "Marta"\n }\n }\n]\n')),(0,i.kt)("p",null,"It's a list of voters to be imported. Each voter is an object with their\nproperties set within the ",(0,i.kt)("inlineCode",{parentName:"p"},"metadata")," field. Which voter properties are valid\ndepends on the ",(0,i.kt)("a",{parentName:"p",href:"#census-auth_method"},"authentication method")," used and the\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra fields")," defined."),(0,i.kt)("p",null,"If the census size if big, it's not advisable to import it using this field\nbecause it's currently not very fast. In that case it's best to use the\n",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters")," management command through the command line\nwhich can easily load 4,000 voters/second instead of maybe 6-10 voters/second\nhere."),(0,i.kt)("p",null,"You can also modify the census later when the election is created. If you use\nthe admin user interface, it will use the same backend as it used during\nelection creation here and thus the same speed recommendations apply."),(0,i.kt)("p",null,"Note that when loading voters using this API, voters are uniquely identified by\na different field depending on the ",(0,i.kt)("a",{parentName:"p",href:"#census-auth_method"},"authentication method"),",\nfor example the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," field if using the ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp")," authentication method.\nIf you re-upload a census, the voters that already exist (matching their unique\nid) won't be modified. "),(0,i.kt)("p",null,"However if you use ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters")," management command, this\nkind of detection won't be applied. If you need to update the census, it's best\nto first remove all the census with the ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_delete_voters")," command before\nexecuting ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters"),"."),(0,i.kt)("h4",{id:"assigning-children-elections-in-parent-election-census"},"Assigning children elections in parent election census"),(0,i.kt)("p",null,"If the election is a parent election, you usually set the census within the\nparent election and there assign to which children elections can that specific\nvoter vote. To do so, set the ",(0,i.kt)("inlineCode",{parentName:"p"},"children_event_id_list")," property within the\n",(0,i.kt)("inlineCode",{parentName:"p"},"metadata")," field of each voter. This list is simply a list of children election\nids in which the voter can vote. If we had a parent election with id ",(0,i.kt)("inlineCode",{parentName:"p"},"100")," and\ntwo children elections with ids ",(0,i.kt)("inlineCode",{parentName:"p"},"101")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"102"),", we could assign one voter to\neach children election with this example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "metadata": {\n "email": "john@example.com",\n "name": "John",\n "children_event_id_list": [101]\n }\n },\n {\n "metadata": {\n "email": "marta@example.com",\n "name": "Marta",\n "children_event_id_list": [102]\n }\n }\n]\n')),(0,i.kt)("h3",{id:"census-auth_method"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"auth_method")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"auth_method")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"sms-otp"))),(0,i.kt)("p",null,"This property specifies which is the main authentication method related to the\nelection. The list of currently available authentication methods is:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email"),": The user will be authenticate through a code sent via email.\nThe email is sent by the adminstrators to voters using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send authentication"),"\noption in the Election Dashboard or the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send auth codes")," to specific voters\noption in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"Census Data")," sidebar option. If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email-otp"),": The user will authenticate through an OTP (One Time Password)\nsent via email. This OTP is not sent to voters by administrators, but instead\nis requested by voters during the authentication process each time they execute\nit. If used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"email")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"email-and-password"),": The voters will authenticate simply by the email\nand password. You can assign the ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," field of each voter appropiately.\nIf used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"password")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"sms"),": The user will be authenticate through a code sent via SMS.\nThe SMS is sent by the adminstrators to voters using the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send authentication"),"\noption in the Election Dashboard or the ",(0,i.kt)("inlineCode",{parentName:"p"},"Send auth codes")," to specific voters\noption in the election ",(0,i.kt)("inlineCode",{parentName:"p"},"Census Data")," sidebar option. If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"sms-otp"),": The user will authenticate through an OTP (One Time Password)\nsent via SMS. This OTP is not sent to voters by administrators, but instead is\nrequested by voters during the authentication process each time they execute it.\nIf used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and named\n",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"openid-connect"),": The authentication will happen through a third-party\nopenid provider. This provider shall be configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration"),". If used, an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of type ",(0,i.kt)("inlineCode",{parentName:"p"},"text")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"sub")," is\nrequired.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"user-and-password"),": The voters will authenticate simply by the username\nand password. You can assign the ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," field of each voter appropiately.\nThis is usually not recommended, as by default voters are assigned a random\nusername so it's difficult for them to know their username. The only usecase for\nthis is currently for the administrative ",(0,i.kt)("inlineCode",{parentName:"p"},"AuthEvent")," (usually with id ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),") used\nto authenticate in the administrative interface, and whose list of users is\ndirectly set within the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," using the\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.upsert_file")," and the superadmin user\n(",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.admin_user"),"). If used, an ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field"),"\nof type ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," and named ",(0,i.kt)("inlineCode",{parentName:"p"},"password")," is required.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"smart-link"),": The voters will authenticate using a smart link that includes\na secure authentication token using a keyed\n",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/HMAC"},"HMAC"),". It's a straightforward way to\nimplement Single sign-on (SSO) and integrate with a third-party site or\nplataform. Read about how to use it in the\n",(0,i.kt)("a",{parentName:"p",href:"../guides/smart-link-auth"},"SmartLink Auth Guide"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"openid-connect"),": The voters will authenticate using a 3rd-party OpenID\nConnect (OIDC) provider. It's a straightforward way to implement Single\nsign-on (SSO) and integrate with a third-party site or plataform. Read about how\nto use it in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC Auth Guide"),"."))),(0,i.kt)("admonition",{title:"Alternative authentication methods",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If the authentication method is ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," but there's defined also an ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf"),"\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra field"),", then for those elements in census where\nboth fields are defined, the voter will receive the Authentication Code through\nboth SMS and email authentication, and the voter will be able to authenticate\nthrough the link and code sent by either of those.")),(0,i.kt)("h3",{id:"census-census"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"census")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"census")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"close"'))),(0,i.kt)("p",null,"Indicates if the census is either ",(0,i.kt)("inlineCode",{parentName:"p"},'"open"')," or ",(0,i.kt)("inlineCode",{parentName:"p"},'"close"'),". If census is ",(0,i.kt)("inlineCode",{parentName:"p"},'"open"'),",\nit means it is in open registration mode and voters can register themselves,\nfill the ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_fields")," required on registration to be\nable to vote later either at that moment if the election is open or later on."),(0,i.kt)("h3",{id:"census-extra_fields"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#extra-field-object"},"Extra Field"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "name": "email",\n "type": "email",\n "required": true,\n "min": 2,\n "max": 200,\n "required_on_authentication": true\n }\n]\n')),(0,i.kt)("p",null,"Defines authentication fields that the voters might fill or with some relation\nto voters. There are some ",(0,i.kt)("inlineCode",{parentName:"p"},"extra_fields")," required depending on the election's\n",(0,i.kt)("a",{parentName:"p",href:"#election-auth_method"},"auth_method"),". For example, if the authentication method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", the extra field named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required. "),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-object"},"Extra Field")," for more details about extra fields. "),(0,i.kt)("h3",{id:"census-oidc_providers"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"oidc_providers")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"oidc_providers")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List of objects"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "public_info": {\n "id": "google",\n "title": "Authenticate with Google",\n "description": "Authenticate with Google",\n "icon": "https://www.google.com/favicon.ico",\n "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",\n "client_id": ".apps.googleusercontent.com",\n "issuer": "https://accounts.google.com",\n "scope": "openid email",\n "token_endpoint": "https://oauth2.googleapis.com/token",\n "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",\n "logout_uri": "https://accounts.google.com/o/oauth2/v2/auth_logout"\n },\n "private_info": {\n "client_secret": ""\n }\n }\n]\n')),(0,i.kt)("p",null,"List of OpenID Connect (OIDC) providers available for OIDC authentication."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"census-alternative_auth_methods"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"alternative_auth_methods")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"alternative_auth_methods")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List of objects"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"undefined")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "id": "sms",\n "auth_method_name": "sms",\n "auth_method_config": {\n "allow_user_resend": false,\n "authentication-action": {\n "mode": "vote",\n "mode-config": null\n },\n "msg": "Enter in __URL__ and put this code __CODE__",\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n },\n "extra_fields": [\n {\n "max": 255,\n "min": 4,\n "name": "email",\n "type": "email",\n "unique": true,\n "required": true,\n "required_on_authentication": false\n },\n {\n "max": 255,\n "min": 4,\n "name": "tlf",\n "type": "tlf",\n "unique": true,\n "required": true,\n "required_on_authentication": true\n }\n ], \n "public_name": "Phone",\n "public_name_i18n": {"es": "Tel\xe9fono"},\n "icon": "fa fa-phone"\n }\n]\n')),(0,i.kt)("p",null,"Describes support for alternative authentication methods objects, but it's unset\nby default. Using this allows an election to let voters authenticate not only\nwith the default election authentication method, but with a list of different\nauth methods configured as described below."),(0,i.kt)("p",null,"Each alternative authentication method should be an object with the\nfollowing configuration keys:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"id"),": Unique string identifying this alternative auth method. It will be used\nin some authentication urls."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_name"),": Authentication method used in this alternative auth method\nmethod. Same format as ",(0,i.kt)("a",{parentName:"li",href:"#census-auth_method"},(0,i.kt)("inlineCode",{parentName:"a"},"auth_method")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_config"),": Object with the configuration of this alternative auth\nmethod method. Same format as\n",(0,i.kt)("a",{parentName:"li",href:"#census-auth_method_config"},(0,i.kt)("inlineCode",{parentName:"a"},"auth_method_config")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields"),": Extra fields configuration used in this alternative auth\nmethod method. It ",(0,i.kt)("strong",{parentName:"li"},"must")," have the same number and names as the main\n",(0,i.kt)("inlineCode",{parentName:"li"},"extra_fields")," of this election, but the rest of the configuration of each\nfield can vary. Same format as ",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},(0,i.kt)("inlineCode",{parentName:"a"},"extra_fields")),". "),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"public_name"),": String containing the visible default name shown in the login\ninterface for this authentication method."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"public_name_i18n"),": Object containing the translation strings for the\n",(0,i.kt)("inlineCode",{parentName:"li"},"public_name"),". Same format as\n",(0,i.kt)("a",{parentName:"li",href:"#election-title_i18n"},(0,i.kt)("inlineCode",{parentName:"a"},"title_i18n")),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"icon"),": ",(0,i.kt)("a",{parentName:"li",href:"https://fontawesome.com/v4/icons/"},"Font Awesome icon")," classname to be shown on the tab to choose the\nalternative auth method. Example: ",(0,i.kt)("inlineCode",{parentName:"li"},"fa fa-phone"),".")),(0,i.kt)("h3",{id:"census-admin_fields"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"admin_fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"admin_fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#admin-field-object"},"Admin Field"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "name": "org_legal_name",\n "label": "Organization: Legal Name",\n "description": "Required. Please provide the name under which your organization is legally registered. It will be shown as part of the public information in a section inside the election public page.",\n "placeholder": "Example: Association of Surgeons of Great Britain",\n "min": 1,\n "max": 255,\n "value": "Example Organization Name",\n "required": true,\n "private": true,\n "type": "text"\n },\n {\n "name": "org_url",\n "label": "Organization: Website URL",\n "description": "Optional. Please provide the URL of your organization. It will be shown as part of the public information in a section inside the election public page.",\n "placeholder": "Example: https://example.com",\n "min": 5,\n "value": "https://example.com",\n "required": false,\n "private": true,\n "type": "text"\n }\n]\n')),(0,i.kt)("p",null,"Object that details the different options related to the election and required\nto be filled by election administrators for every election. What admin fields\nneed to be filled is configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," with the key\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.admin_fields"),". "),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#admin-field-object"},"Admin Field")," for more details."),(0,i.kt)("h3",{id:"census-auth_method_config"},"Census: ",(0,i.kt)("inlineCode",{parentName:"h3"},"auth_method_config")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"auth_method_config")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#auth-method-config-object"},"Auth Method Config"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "allow_user_resend": true,\n "msg": "Vote in __URL__ with code __CODE__",\n "subject": "Vote now with Sequent",\n "authentication-action": {\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n },\n "registration-action": {\n "mode": "vote",\n "mode-config": null\n }\n}\n')),(0,i.kt)("p",null,"Object that specifies various configuration authentication and authorization\noptions."),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#census-config-object"},"Census Config")," for more details."),(0,i.kt)("h2",{id:"extra-field-object"},"Extra Field Object"),(0,i.kt)("p",null,"Defines an authentication field that the voters might fill or with some relation\nto voters. Some extra fields are required depending on the election's\n",(0,i.kt)("a",{parentName:"p",href:"#election-auth_method"},"auth_method"),". For example, if the authentication method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", the extra field named ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," and of type ",(0,i.kt)("inlineCode",{parentName:"p"},"tlf")," is required. "),(0,i.kt)("p",null,"It is used by the Census' ",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_fields property")," and can\nhave the following properties:"),(0,i.kt)("h3",{id:"extra-field-name"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"name")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"name")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"email"'))),(0,i.kt)("p",null,"The name property identifies the extra field. For most\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-type"},"extra field types")," the name set here is shown to voters\nas the field name in the user interface during the authentication process. It's\nalso used in API calls as the key to receive the authentication data or to store\nthe census data of a specific user."),(0,i.kt)("h3",{id:"extra-field-name_i18n"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"name_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"name_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "C\xf3digo"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the extra field ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"extra-field-type"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"type")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"text"'))),(0,i.kt)("p",null,"Defines the extra field type, which changes in appeareance and behaviour. There\nare the following available extra field types that you can use:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"text"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"int"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"bool"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"email"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"tlf"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"captcha"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"textarea"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"dni"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"dict"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"date"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"otp-code"'))),(0,i.kt)("h3",{id:"extra-field-required_on_authentication"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required_on_authentication")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required_on_authentication")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is required during authentication. If ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means\nthat during the authentication process this field needs to be provided by the\nvoter."),(0,i.kt)("h3",{id:"extra-field-source_claim"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"source_claim")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"source_claim")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"null")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"email"'))),(0,i.kt)("p",null,"OIDC claim name to compare with the extra field's data during authentication.\nUsed only in OpenID Connect authentication for the ",(0,i.kt)("inlineCode",{parentName:"p"},'"sub"')," named extra field."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"extra-field-match_against_census_on_otl_authentication"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"match_against_census_on_otl_authentication")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"match_against_census_on_otl_authentication")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is required during the OTL (One Time Link) authentication.\nIf ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means that during the OTL authentication process this field needs\nto be provided by the voter. Note that OTL only works if\n",(0,i.kt)("a",{parentName:"p",href:"#election-support_otl_enabled"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"support_otl_enabled"))," is set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," and and\n",(0,i.kt)("a",{parentName:"p",href:"#election-inside_authenticate_otl_period"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"inside_authenticate_otl_period")),"\nis also set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-required"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"Defines if this field is always required. If ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," it means that during any\nprocess in which the voter needs to fill the extra fields, either during\nregistration or authentication, this field needs to be provided by the voter. "),(0,i.kt)("h3",{id:"extra-field-required_when_registered"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"required_when_registered")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"required_when_registered")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," this extra field will not appear to voters during\n",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"open registration"),". A better name for it might have been\n",(0,i.kt)("inlineCode",{parentName:"p"},"hidden_during_registration"),"."),(0,i.kt)("h3",{id:"extra-field-private"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"private")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"private")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Defines if this field is private. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the field will not\nappear to voters at any time but it will be appear in the census. This is useful\nif there's any field that you want to appear in the census to be able to search\nfor it or review that kind of user data in the administrative interface, but\nshould not be used for anything else."),(0,i.kt)("h3",{id:"extra-field-css_classes"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"css_classes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"css_classes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"None")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"user-id"'))),(0,i.kt)("p",null,"Defines the css class(es) to assign to the extra-field in the ui form. This can\nbe used in combination with ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-theme_css"},"Election Presentation theme_css")," to change how an extra fields looks using CSS."),(0,i.kt)("h3",{id:"extra-field-unique"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"unique")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"unique")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"), vote registration will fail if the\nvoter enters a value to this field that is repeated by any other element in the\ncensus. Note that this field uniquness is not verified during census import by\nadministrators. It only makes sense to set ",(0,i.kt)("inlineCode",{parentName:"p"},"unique")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," when setting the\nelection to have ",(0,i.kt)("inlineCode",{parentName:"p"},"open")," ",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"voter registration"),", because otherwise\nit will have no effect as there won't be any open voter registration process."),(0,i.kt)("h3",{id:"extra-field-match_census_on_registration"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"match_census_on_registration")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"match_census_on_registration")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"For ",(0,i.kt)("inlineCode",{parentName:"p"},"open")," ",(0,i.kt)("a",{parentName:"p",href:"#census-census"},"voter registration"),", any previous element in the\ncensus would be matched using this field. This useful to be used together with\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-fill_if_empty_on_registration"},"fill_if_empty_on_registration"),",\nso that if you have a pre-registration census with only some fields already\nfilled in, you could fill the missing fields with\n",(0,i.kt)("inlineCode",{parentName:"p"},"fill_if_empty_on_registration")," if you first identify the element in census\nwith ",(0,i.kt)("inlineCode",{parentName:"p"},"match_census_on_registration")," set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-fill_if_empty_on_registration"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fill_if_empty_on_registration")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fill_if_empty_on_registration")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"It is used for pre-registration. If the pre-registered user on the census has\nthis field empty, then when the user will be able to set its value upon\nregistration."),(0,i.kt)("p",null,"This useful to be used together with\n",(0,i.kt)("a",{parentName:"p",href:"#extra-field-match_census_on_registration"},"match_census_on_registration"),", so\nthat if you have a pre-registration census with only some fields already filled\nin, you could fill the missing fields with ",(0,i.kt)("inlineCode",{parentName:"p"},"fill_if_empty_on_registration")," if\nyou first identify the element in census with ",(0,i.kt)("inlineCode",{parentName:"p"},"match_census_on_registration"),"\nset to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"extra-field-userid_field"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"userid_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"userid_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"userid_field")," is used to generate the username, usedto generate the hmac\nauthentication token. If any field on the authevent is marked with\n",(0,i.kt)("inlineCode",{parentName:"p"},"userid_field")," as ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the username won't be generated randomly as it is done\nusually, but instead it will be generated by:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Concatenating all the data from the ",(0,i.kt)("inlineCode",{parentName:"li"},"userid_field"),"'s (in order of\nappeareance of the fields in ae.extra_fields)."),(0,i.kt)("li",{parentName:"ol"},"Adding the shared_secret (",(0,i.kt)("inlineCode",{parentName:"li"},"field1:field2:field3...:shared_secret"),")\nseparated with the colon character: ",(0,i.kt)("inlineCode",{parentName:"li"},":"),"."),(0,i.kt)("li",{parentName:"ol"},"The username will be the sha256 hash of the above\nNote that if a field is marked as userid_field, it should always have a valid\nconvertable-to-string value.")),(0,i.kt)("h3",{id:"extra-field-help"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Example: John Doe"'))),(0,i.kt)("p",null,"Help text that will appear below the input in the voter authentication or\nregistration form."),(0,i.kt)("h3",{id:"extra-field-help_i18n"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"help_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Ejemplo: Juan Garc\xeda"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the extra field ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"extra-field-regex"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"regex")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"regex")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"/\\d{9}[a-z]/"'))),(0,i.kt)("p",null,"Regular expression that will be checked against user input when sending the\nauthentication or registration form. This property only makes sense for extra\nfields whose input is a string like ",(0,i.kt)("inlineCode",{parentName:"p"},"textarea"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"text"),"."),(0,i.kt)("h3",{id:"extra-field-min"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"min")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1"))),(0,i.kt)("p",null,"This property can mean two different things:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"For extra fields whose value is a string, it's the minimum allowed length of\nsuch a string."),(0,i.kt)("li",{parentName:"ul"},"For extra fields of ",(0,i.kt)("inlineCode",{parentName:"li"},"int")," ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-type"},"type"),", it is the minimum\nallowed value.")),(0,i.kt)("h3",{id:"extra-field-max"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"max")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"55"))),(0,i.kt)("p",null,"This property can mean two different things:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"For extra fields whose value is a string, it's the maximum allowed length of\nsuch a string."),(0,i.kt)("li",{parentName:"ul"},"For extra fields of ",(0,i.kt)("inlineCode",{parentName:"li"},"int")," ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-type"},"type"),", it is the maximum\nallowed value.")),(0,i.kt)("h3",{id:"extra-field-autofill"},"Extra Field: ",(0,i.kt)("inlineCode",{parentName:"h3"},"autofill")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"autofill")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"When user is is activated by calling to ",(0,i.kt)("inlineCode",{parentName:"p"},"iam"),"'s\n",(0,i.kt)("inlineCode",{parentName:"p"},"/api/auth-event/%d/census/activate/"),", this field will be copied from the admin\nuser to the activated user. This is useful for example if an admin user has an\nextra field specifying the precint assigned to it and we would like to set that\ninfo in a ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-private"},"private field")," of the activated user too."),(0,i.kt)("h2",{id:"admin-field-object"},"Admin Field Object"),(0,i.kt)("p",null,"Object that details the different options related to the election and required\nto be filled by election administrators for every election. What admin fields\nneed to be filled is configured in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml"),"\n",(0,i.kt)("a",{parentName:"p",href:"../guides/deployment/"},"ansible deployment configuration")," with the key\n",(0,i.kt)("inlineCode",{parentName:"p"},"config.sequent_ui.admin_fields"),". "),(0,i.kt)("p",null,"It is used by the Census' ",(0,i.kt)("a",{parentName:"p",href:"#census-admin_fields"},"admin_fields property")," and\nset by the election administrator during creator in the sidebar item\n",(0,i.kt)("inlineCode",{parentName:"p"},"Admin Fields"),"."),(0,i.kt)("p",null,"The properties of an ",(0,i.kt)("a",{parentName:"p",href:"#admin-field-object"},"Admin Field")," are the same as those\nof an ",(0,i.kt)("a",{parentName:"p",href:"#extra-field-object"},"Extra Field")," but with some additional properties:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"description"),": Description of what the field should be used for"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"label"),": Label of the admin field, which will be shown to the election creator\ninstead of the name."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"value"),": Value set for this specific election."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"placeholder"),": placeholder to be shown for the admin field when empty.")),(0,i.kt)("h2",{id:"census-config-object"},"Census Config Object"),(0,i.kt)("p",null,"This JSON object type describes some census configuration parameters\nrelated to the election. It is used by the ",(0,i.kt)("a",{parentName:"p",href:"#census-config"},"config property")," of\nthe ",(0,i.kt)("a",{parentName:"p",href:"#census-object"},"census object")," and can have the following properties:"),(0,i.kt)("h3",{id:"census-config-allow_user_resend"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_user_resend")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_user_resend")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to true, allows the voter to request the authentication code to be\nresent. Usually, this makes sense only for authentication methods that use\nauthentication codes such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"sms")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),", but not\nfor others such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email-and-password"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"user-and-password")," or\n",(0,i.kt)("inlineCode",{parentName:"p"},"openid-connect"),". However, it makes sense to enable it if you are using an\n",(0,i.kt)("a",{parentName:"p",href:"#census-extra_fields"},"extra_field")," of ",(0,i.kt)("inlineCode",{parentName:"p"},"otp-code")," type in combination with any\nauthentication method."),(0,i.kt)("h3",{id:"census-config-show_pdf"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_pdf")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_pdf")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", it will:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Allow voters to authenticate even if they cannot vote (but they will only be\nshown the button to start voting if the voting period is open)."),(0,i.kt)("li",{parentName:"ol"},"Show the ",(0,i.kt)("inlineCode",{parentName:"li"},"Show PDF")," screen in the voting booth, allowing to showing a PDF\ndocument after authentication in the voting booth.")),(0,i.kt)("p",null,"Use only together with the ",(0,i.kt)("a",{parentName:"p",href:"#election-presentation-pdf_url"},(0,i.kt)("inlineCode",{parentName:"a"},"pdf_url")),"\npresentation configuration. Also please note that you can toggle the ",(0,i.kt)("inlineCode",{parentName:"p"},"show_pdf"),"\nflag in any existing election with the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/master/iam/api/management/commands/show_pdf.py"},(0,i.kt)("inlineCode",{parentName:"a"},"show_pdf")," admin command"),"."),(0,i.kt)("h3",{id:"census-config-msg"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"msg")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"msg")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," In applicable authentication methods"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote in __URL__ with code __CODE__"'))),(0,i.kt)("p",null,"This is the text body template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"sms")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"sms-otp"),". In the first\ntwo this corresponds to the Plain Text body of the email message."),(0,i.kt)("p",null,"As mentioned earlier, this is a template. Each voter will receive a tailored\nmessage with the template variables substituted with their values. Variables\nare identified surrounded by two ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," characters and always in upper case.\nFor example the variable ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," would appear as ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__"),"."),(0,i.kt)("p",null,"The allowed template variables are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL__"),": This is the voter authentication URL specific for the voter but\nnot containing the voter authentication code, which the voter will have to fill\nout manually."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__"),": This is the voter authentication URL containing the\nboth the email/sms of the voter and the voter authentication code. If no other\n",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},"extra_field")," is required during authentication, entering",(0,i.kt)("br",{parentName:"li"}),"in the ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__")," URLs allows voters to authenticate without having to fill out\nany web form. It's easier, but also more risky because anyone with this link\ncould use it to authenticate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL___")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2___")," if you are using ",(0,i.kt)("a",{parentName:"li",href:"#census-alternative_auth_methods"},(0,i.kt)("inlineCode",{parentName:"a"},"alternative_auth_methods")),", with the ",(0,i.kt)("inlineCode",{parentName:"li"},"alt-auth-method-id"),(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__CODE__"),": This is the authentication code. Each time the authentication\ncodes are sent to a voter, a new code is generated and any old codes are\ndisabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__OTL__"),": Includes a One Time Link (OTL). This OTL accesses to an\nauthentication process that, once authenticated, shows the authentication code\nto voters. Only works if ",(0,i.kt)("a",{parentName:"li",href:"#support_otl_enabled"},(0,i.kt)("inlineCode",{parentName:"a"},"support_otl_enabled"))," is\nenabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"____"),": Each voter has some voter related information\nassociated to it. You can use those extra fields by the\n",(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"\nand uppercased ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-name"},"name")," property.")),(0,i.kt)("p",null,"The maximum length of the message text depends on the authentication method. By\ndefault the email text body can have up to ",(0,i.kt)("inlineCode",{parentName:"p"},"5,000")," characters, and SMS text\nbody can only have ",(0,i.kt)("inlineCode",{parentName:"p"},"200"),". To change this, you would need to change the code\nin the respective authentication method code.\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/e9e980f8afd07e32098c487b7a8c3a9b4c5d575a/iam/authmethods/m_email.py#L140"},"This is the relevant code"),"\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," authentication method:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="iam/authmethods/m_email.py" {20}',title:'"iam/authmethods/m_email.py"',"{20}":!0}," CONFIG_CONTRACT = [\n {\n 'check': 'isinstance',\n 'type': dict\n },\n {\n 'check': 'dict-keys-exist',\n 'keys': ['msg', 'subject', 'registration-action', 'authentication-action']\n },\n {\n 'check': 'index-check-list',\n 'index': 'msg',\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n")),(0,i.kt)("h3",{id:"census-config-msg_i18n"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"msg_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Vota en __URL__ con c\xf3digo __CODE__"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Census Config ",(0,i.kt)("inlineCode",{parentName:"p"},"msg")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"census-config-html_message"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"html_message")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"html_message")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote in __URL__ with code __CODE__"'))),(0,i.kt)("p",null,"This is the HTML body template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters through email, such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),". In these, it\ncorresponds to the HTML body of the email message. "),(0,i.kt)("p",null,"This field is optional, and when defined, the sent email will have a content\ntype ",(0,i.kt)("inlineCode",{parentName:"p"},"multipart/alternative"),", where the first part will contain the ",(0,i.kt)("inlineCode",{parentName:"p"},"msg")," field\nwith Content-Type ",(0,i.kt)("inlineCode",{parentName:"p"},"text/plain")," and the second part will contain the ",(0,i.kt)("inlineCode",{parentName:"p"},"html-message"),"\nwith Content-Type ",(0,i.kt)("inlineCode",{parentName:"p"},"text/html"),"."),(0,i.kt)("p",null,"Note that to enable using this feature, you need to change the configuration of\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"deployment-tool"),", by setting the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.iam.field allow_html_emails")," to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," in the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," file."),(0,i.kt)("p",null,"As mentioned earlier, this is a template. Each voter will receive a tailored\nmessage with the template variables substituted with their values. Variables\nare identified surrounded by two ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," characters and always in upper case.\nFor example the variable ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," would appear as ",(0,i.kt)("inlineCode",{parentName:"p"},"__URL__"),"."),(0,i.kt)("p",null,"The allowed template variables are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL__"),": This is the voter authentication URL specific for the voter but\nnot containing the voter authentication code, which the voter will have to fill\nout manually."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__"),": This is the voter authentication URL containing the\nboth the email/sms of the voter and the voter authentication code. If no other\n",(0,i.kt)("a",{parentName:"li",href:"#census-extra_fields"},"extra_field")," is required during authentication, entering",(0,i.kt)("br",{parentName:"li"}),"in the ",(0,i.kt)("inlineCode",{parentName:"li"},"__URL2__")," URLs allows voters to authenticate without having to fill out\nany web form. It's easier, but also more risky because anyone with this link\ncould use it to authenticate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__CODE__"),": This is the authentication code. Each time the authentication\ncodes are sent to a voter, a new code is generated and any old codes are\ndisabled."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"____"),": Each voter has some voter related information\nassociated to it. You can use those extra fields by the\n",(0,i.kt)("a",{parentName:"li",href:"https://docs.djangoproject.com/en/3.1/ref/utils/#django.utils.text.slugify"},"sluggified"),"\nand uppercased ",(0,i.kt)("a",{parentName:"li",href:"#extra-field-name"},"name")," property.")),(0,i.kt)("p",null,"The maximum length of the message text depends on the authentication method. By\ndefault the email HTML body can have up to ",(0,i.kt)("inlineCode",{parentName:"p"},"5,000")," characters. To change this, you\nwould need to change the code in the respective authentication method code.\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/sequentech/iam/blob/e9e980f8afd07e32098c487b7a8c3a9b4c5d575a/iam/authmethods/m_email.py#L155"},"This is the relevant code"),"\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," authentication method:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python",metastring:'title="iam/authmethods/m_email.py" {35}',title:'"iam/authmethods/m_email.py"',"{35}":!0}," CONFIG_CONTRACT = [\n {\n 'check': 'isinstance',\n 'type': dict\n },\n {\n 'check': 'dict-keys-exist',\n 'keys': ['msg', 'subject', 'registration-action', 'authentication-action']\n },\n {\n 'check': 'index-check-list',\n 'index': 'msg',\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n {\n 'check': 'index-check-list',\n 'index': 'html_message',\n 'optional': True,\n 'check-list': [\n {\n 'check': 'isinstance',\n 'type': str\n },\n {\n 'check': 'length',\n 'range': [1, 5000]\n }\n ]\n },\n")),(0,i.kt)("h3",{id:"census-config-subject"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"subject")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"subject")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," In applicable authentication methods"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Vote now with Sequent"'))),(0,i.kt)("p",null,"This is the email subject template used for sending the authentication codes to\nvoters. It's only applicable to authentication methods that send authentication\ncodes to voters such as ",(0,i.kt)("inlineCode",{parentName:"p"},"email")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"email-otp"),"."),(0,i.kt)("p",null,"The template works in the same manner as the\n",(0,i.kt)("a",{parentName:"p",href:"#census-config-subject"},(0,i.kt)("inlineCode",{parentName:"a"},"msg")," property"),", see that one for more details."),(0,i.kt)("h3",{id:"census-config-subject_i18n"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"subject_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"subject_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Vota en __URL__ con c\xf3digo __CODE__"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Census Config ",(0,i.kt)("inlineCode",{parentName:"p"},"subject")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"census-config-provider_ids"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"provider_ids")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"provider_ids")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"List[String]")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'["google"]\n')),(0,i.kt)("p",null,"If defined, it's a list of strings corresponding to the list of provider ids to make available for the user to authenticate, in order."),(0,i.kt)("p",null,"More information in the ",(0,i.kt)("a",{parentName:"p",href:"../guides/openid-auth/"},"OIDC authentication guide"),"."),(0,i.kt)("h3",{id:"census-config-authentication-action"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"authentication-action")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"authentication-action")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Object")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "mode": "vote",\n "mode-config": {\n "url": ""\n }\n}\n')),(0,i.kt)("p",null,"There are different modes for the authentication-action. The typical mode would\nbe to set the ",(0,i.kt)("inlineCode",{parentName:"p"},'"mode"')," to ",(0,i.kt)("inlineCode",{parentName:"p"},'"vote"'),", which means the voter will be redirected to\nthe authenticated voting booth to cast the voter's ballot."),(0,i.kt)("p",null,"But it's also possible to use the mode ",(0,i.kt)("inlineCode",{parentName:"p"},"go-to-url"),". This will redirect to the\nURL set in the ",(0,i.kt)("inlineCode",{parentName:"p"},'"mode-config"')," setting. The ",(0,i.kt)("inlineCode",{parentName:"p"},"mode-config.url")," is a string\nparameter that can be templated with the variables mentioned below (currently\nonly one), which will be ",(0,i.kt)("a",{parentName:"p",href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI"},"URI encoded"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"__VOTE_CHILDREN_INFO__")," will return information about the children elections\nin which the voter can vote. If it's not a parent-children election, then it\nwill just be an empty list ",(0,i.kt)("inlineCode",{parentName:"li"},"[]"),". If it's a parent-children election, it will\nbe something similar to the following:")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "can-vote": true,\n "auth-event-id": 33,\n "num-successful-logins-allowed": 1,\n "num-successful-logins": 0\n },\n {\n "can-vote": true,\n "auth-event-id": 34,\n "num-successful-logins-allowed": 1,\n "num-successful-logins": 1\n }\n]\n')),(0,i.kt)("p",null,'In this context, successful logins equal to "cast votes".'),(0,i.kt)("p",null,"An example of an authentication-action object using the ",(0,i.kt)("inlineCode",{parentName:"p"},'"go-to-url"')," mode with\ntemplate would be:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "mode": "go-to-url",\n "mode-config": {\n "url": "https://example.com/path/to/somewhere/?children=__VOTE_CHILDREN_INFO__"\n }\n}\n')),(0,i.kt)("h3",{id:"census-config-fixed-code"},"Census Config: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fixed-code")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fixed-code")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", the authentication codes sent to users will be fixed, instead\nof generating a new code each time. When an authentication message is sent to\nan user, a new authentication code is created only if one doesn't exist yet for\nthe user, reusing it if one exists already."),(0,i.kt)("p",null,"In combination with the admin command ",(0,i.kt)("inlineCode",{parentName:"p"},"bulk_insert_voters"),", it allows admins to\nset and fix the authentication codes to be sent to users."),(0,i.kt)("h2",{id:"question-object"},"Question Object"),(0,i.kt)("p",null,"This JSON object type describes a question (or ",(0,i.kt)("a",{parentName:"p",href:"https://pages.nist.gov/ElectionGlossary/#contest"},"contest")," in NIST terminology) in which a voter can vote. It is used inside the ",(0,i.kt)("a",{parentName:"p",href:"#election-questions"},"Election: ",(0,i.kt)("inlineCode",{parentName:"a"},"questions"))," property of\nthe ",(0,i.kt)("a",{parentName:"p",href:"#election-object"},"Election object")," and can have the following properties:"),(0,i.kt)("h3",{id:"question-title"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Do you approve the Annual Accounts of 2021?"'))),(0,i.kt)("p",null,"Title of the question. Will be shown in the voting booth and in the election\nresults."),(0,i.kt)("h3",{id:"question-title_i18n"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"title_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"title_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Nueva elecci\xf3n"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the question ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"question-description"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Long String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'"This is the description of the question. You can add simple html like bold or links to websites.\\n\\n

You need to use two br element for new paragraphs."\n')),(0,i.kt)("p",null,"Question description. It will appear below the title in the voting booth.\nAs shown in the example it allows for some basic HTML."),(0,i.kt)("h3",{id:"question-description_i18n"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"description_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"description_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Esta es la descripci\xf3n de la elecci\xf3n. Puede agregar html simple como negrita o enlaces a sitios web.\\n\\n

Usted necesita usar dos elementos br para nuevos p\xe1rrafos."\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the election ",(0,i.kt)("inlineCode",{parentName:"p"},"description")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"question-layout"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"layout")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"layout")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"accordion"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"simultaneous-questions"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"pcandidates-election"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"conditional-accordion"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"simultaneous-questions"'))),(0,i.kt)("p",null,"Indicates the layout to be applied in the voting booth for this question.\nDifferent layouts imply different presentation of the question. Note that not\nall the features are available for all the layouts. The layout that supports\nmore features and has been most used is the ",(0,i.kt)("inlineCode",{parentName:"p"},'"accordion"')," layout."),(0,i.kt)("h3",{id:"question-max"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"max")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1"))),(0,i.kt)("p",null,"Maximum number of answers that a voter can choose in the voting booth to\nconsider the vote valid. It must be greater or equal to\n",(0,i.kt)("a",{parentName:"p",href:"#question-min"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"min"))," and be greater than zero."),(0,i.kt)("h3",{id:"question-min"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"min")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"2"))),(0,i.kt)("p",null,"Minimum number of answers that a voter can choose in the voting booth to\nconsider the vote valid. It must be less or equal to\n",(0,i.kt)("a",{parentName:"p",href:"#question-max"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"max"))," and be greater or equal to zero."),(0,i.kt)("h3",{id:"question-num_winners"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"num_winners")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"num_winners")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3"))),(0,i.kt)("p",null,"Number of winner answers to appoint in the electoral results."),(0,i.kt)("h3",{id:"question-tally_type"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"tally_type")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"tally_type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"plurality-at-large"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"cumulative"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda-custom"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"borda-nauru"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda2"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"desborda3"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"borda"'))),(0,i.kt)("p",null,"Indicates the name of the algorithm to apply to count the votes and calculate\nthe results of this question."),(0,i.kt)("h3",{id:"question-answer_total_votes_percentage"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_total_votes_percentage")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_total_votes_percentage")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),":",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-valid-votes"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-votes"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"over-total-votes"'))),(0,i.kt)("p",null,"Indicates if the percentages of votes shown in the election results should be\ncalculated over votes to options or over all votes."),(0,i.kt)("h3",{id:"question-answers"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answers")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answers")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#answer-object"},"Answer"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "category": "Liste 1: Die Linken",\n "details": "",\n "id": 0,\n "sort_order": 0,\n "text": "Liste 1: Die Linken",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n },\n {\n "title": "isCategoryList",\n "url": "true"\n }\n ]\n },\n {\n "category": "Liste 1: Die Linken",\n "details": "",\n "id": 1,\n "sort_order": 1,\n "text": "Schulze, Alexander",\n "urls": [\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n ]\n }\n]\n')),(0,i.kt)("p",null,"List of candidate ",(0,i.kt)("a",{parentName:"p",href:"#answer-object"},"answers")," in the question."),(0,i.kt)("h3",{id:"question-extra_options"},"Question: ",(0,i.kt)("inlineCode",{parentName:"h3"},"extra_options")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"extra_options")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#question-extra-object"},"Question Extra")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"{}")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"{}"))),(0,i.kt)("p",null,"Set of ",(0,i.kt)("a",{parentName:"p",href:"#question-extra-object"},"extra options")," to configure this question."),(0,i.kt)("h2",{id:"question-extra-object"},"Question Extra Object"),(0,i.kt)("p",null,"An object describing a set of additional of question configuration options,\ncurrently used to modify the voting booth presentation behaviour. It is used\n",(0,i.kt)("a",{parentName:"p",href:"#question-extra_options"},"here")," and it can have the following\nproperties:"),(0,i.kt)("p",null,"TODO: there are many more options, not yet documented here."),(0,i.kt)("h3",{id:"question-extra-invalid_vote_policy"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"invalid_vote_policy")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"invalid_vote_policy")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Short String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allowed"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"warn"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"warn-invalid-implicit-and-explicit"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"not-allowed"')))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"warn"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"allowed"'))),(0,i.kt)("p",null,"Indicates whether an invalid vote should be allowed without warning, allowed\nbut warning the voter on implicitly invalid ballots, allowed but warning the\nvoter on both implicitly and explicitly invalid ballots, or not allowed."),(0,i.kt)("h3",{id:"question-extra-enable_panachage"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"enable_panachage")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"enable_panachage")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," (the default), the voter will be able to choose answers from\nmultiple categories. If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),", the voter will only be allowed to choose\nanswers from a single category and any vote doing otherwise will be deemed\ninvalid."),(0,i.kt)("h3",{id:"question-extra-cumulative_number_of_checkboxes"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"cumulative_number_of_checkboxes")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"cumulative_number_of_checkboxes")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"1")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3"))),(0,i.kt)("p",null,"Specifies the number of checkboxes shown to the side of each question's answer,\nso that the voter can check each of them. Currently only used when voting method\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"cummulative"),". By default, if unset, its value is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),". "),(0,i.kt)("h3",{id:"question-extra-enable_checkable_lists"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"enable_checkable_lists")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"enable_checkable_lists")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'["disabled", "allow-selecting-candidates-and-lists", "allow-selecting-candidates", "allow-selecting-lists"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"disabled"')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates-and-lists"'))),(0,i.kt)("p",null,"This setting configures if candidate options or lists of candidates can be\nselected by a voter in the voting booth:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates-and-lists"'),": Both candidates and lists of\ncandidates can be selected by a voter."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-candidates"'),": Only candidates can be selected by a voter."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'"allow-selecting-lists"'),": Only lists of candidates can be selected by a\nvoter.")),(0,i.kt)("p",null,"An answer representing the checkable category can be added (a\n",(0,i.kt)("inlineCode",{parentName:"p"},"category answer"),"), and can be flagged as such by ",(0,i.kt)("a",{parentName:"p",href:"#is-category-list"},"setting an url to the\ncategory answer")," with title ",(0,i.kt)("inlineCode",{parentName:"p"},'"isCategoryList"')," and url set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"')," (string)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Currently it is required to include a category answer for each category of the\nquestion when ",(0,i.kt)("inlineCode",{parentName:"p"},"enable_checkable_lists")," is set to any option different from the\ndefault (",(0,i.kt)("inlineCode",{parentName:"p"},'"disabled"'),").")),(0,i.kt)("h3",{id:"question-extra-show_points"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_points")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_points")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicates whether to show the points for each candidate and default to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),".\nIf set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", then the review screen where the voter can review the ballot\nchoices before casting the vote will show the points assigned to each selected\ncandidate next to the selected candidate in questions where the tally mechanism\nallows us to do so. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"accordion")," question layout will also show the points assigned to each\ncandidate if this setting is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("h3",{id:"question-extra-review_screen__show_question_description"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen__show_question_description")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen__show_question_description")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicate whether the question description should be shown in the review screen\nof the voting booth below the election title for this specific question.\nDefaults to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h3",{id:"question-extra-allow_writeins"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"allow_writeins")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"allow_writeins")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"Indicate whether this question can include any write-ins. Needed to set to\n",(0,i.kt)("inlineCode",{parentName:"p"},"true")," if you are using ",(0,i.kt)("a",{parentName:"p",href:"../guides/write-ins/"},"write-ins")," in the\nquestion. Defaults to ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h3",{id:"question-extra-write_in_config"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"write_in_config")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"write_in_config")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("a",{parentName:"li",href:"#writeinconfig-object"},"WriteInConfig")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"-")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "fields": [\n {\n "id": "first_name",\n "placeholder": "First Name",\n "placeholder_i18n": {\n "es": "Nombre"\n },\n "min": 2,\n "max": 10\n },\n {\n "id": "last_name",\n "placeholder": "Last surname",\n "placeholder_i18n": {\n "es": "Apellidos"\n },\n "max": 20,\n "min": 2\n }\n ],\n "template": "{first_name}; {last_name}"\n}\n')),(0,i.kt)("p",null,"Defines extra fields for write-in answers."),(0,i.kt)("h3",{id:"question-extra-answer_group_columns_size"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_group_columns_size")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_group_columns_size")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3, 4, 6, 12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"6")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#question-extra-answer_columns_size"},(0,i.kt)("inlineCode",{parentName:"a"},"answer_columns_size")))))),(0,i.kt)("p",null,"Specifies the relative width of each answer category in the ",(0,i.kt)("inlineCode",{parentName:"p"},"simulaneous-questions"),"\nlayout in the voting booth."),(0,i.kt)("p",null,"It uses ",(0,i.kt)("a",{parentName:"p",href:"https://getbootstrap.com/docs/3.3/css/#grid-options"},"bootstrap 12 columns system"),",\nmeaning the sizes need to be an integer from the allowed values (",(0,i.kt)("inlineCode",{parentName:"p"},"3, 4, 6, 12"),")."),(0,i.kt)("p",null,"For example, if it's set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", it means that each category will use the full\nwidth. But if it's set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6"),", then two categories will appear next to the other.\nNote that we are using ",(0,i.kt)("inlineCode",{parentName:"p"},"col-md-"),", so in small devices each category will\nneverless use the full width, equivalent to using the value ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),"."),(0,i.kt)("p",null,"All answers with no category set (category empty) are considered to be in the\nsame category with respect to this setting."),(0,i.kt)("h3",{id:"question-extra-answer_columns_size"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"answer_columns_size")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"answer_columns_size")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Allowed values:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"3, 4, 6, 12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"12")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"4")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Related:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#question-extra-answer_group_columns_size"},(0,i.kt)("inlineCode",{parentName:"a"},"answer_group_columns_size")))))),(0,i.kt)("p",null,"Specifies the relative width of each answer within each answer category in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"simulaneous-questions")," layout in the voting booth. "),(0,i.kt)("p",null,"It uses ",(0,i.kt)("a",{parentName:"p",href:"https://getbootstrap.com/docs/3.3/css/#grid-options"},"bootstrap 12 columns system"),",\nmeaning the sizes need to be an integer from the allowed values (",(0,i.kt)("inlineCode",{parentName:"p"},"3, 4, 6, 12"),")."),(0,i.kt)("p",null,"For example, if the ",(0,i.kt)("inlineCode",{parentName:"p"},"answer_group_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12")," and the\n",(0,i.kt)("inlineCode",{parentName:"p"},"answer_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6"),", then each category will use the full width\nand each answer will only use 50%, showing themselves in pairs."),(0,i.kt)("p",null,"However if ",(0,i.kt)("inlineCode",{parentName:"p"},"answer_group_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"6")," and the\n",(0,i.kt)("inlineCode",{parentName:"p"},"answer_columns_size")," is set to ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", then it would be answer categories using\nhalf of the screen, appearing side by side in pairs. And within each category,\neach answer will use the full width of the category."),(0,i.kt)("h3",{id:"question-extra-show_filter_field"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"h3"},"show_filter_field")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"show_filter_field")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Boolean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"false")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"true"))),(0,i.kt)("p",null,"If set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", it adds a search/filter field to the left of the question title\nin the voting booth's candidates selection screen. By default, if unset, its\nvalue is ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("p",null,"Voters will be able to filter candidates using the search field. The search string\ncan contain asterisks ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". An asterisk will match zero or more characters. The search\nwill only show options that partially match with the search string, either on the\ncategory, text or details of the option. The search ignores casing and tildes."),(0,i.kt)("p",null,"For example searching with the string ",(0,i.kt)("inlineCode",{parentName:"p"},"john*kennedy")," on the text\n",(0,i.kt)("inlineCode",{parentName:"p"},"Sir John F. Kennedy Jr")," will be a partial match, whereas if the search string\nwas ",(0,i.kt)("inlineCode",{parentName:"p"},"John Kennedy")," the search wouldn't match at all."),(0,i.kt)("p",null,"If there's a partial match with the category, all options within the category will\nbe shown. The results of the search will always be shown in one column, regardless of\nthe column configuration for the question."),(0,i.kt)("h2",{id:"writeinconfig-object"},"WriteInConfig Object"),(0,i.kt)("p",null,"The JSON object type describes the Write-In configuration in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#question-extra-object"},"Question Extra: ",(0,i.kt)("inlineCode",{parentName:"a"},"extra_options"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"writeinconfig-fields"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"fields")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"fields")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#writeinfield-object"},"WriteInField"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "id": "first_name",\n "placeholder": "First Name",\n "placeholder_i18n": {\n "es": "Nombre"\n },\n "min": 2,\n "max": 10\n },\n {\n "id": "last_name",\n "placeholder": "Last surname",\n "placeholder_i18n": {\n "es": "Apellidos"\n },\n "max": 20,\n "min": 2\n }\n]\n')),(0,i.kt)("p",null,"The fields parameter is an array of objects defining each extra write-in field."),(0,i.kt)("h3",{id:"writeinconfig-template"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"template")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"template")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"{first_name} - {last_name}"'))),(0,i.kt)("p",null,"Template that defines how the Write-In fields will be encoded into a string.\nEach field value will be interpolated according to this template. Use ",(0,i.kt)("inlineCode",{parentName:"p"},"{"),"\nand ",(0,i.kt)("inlineCode",{parentName:"p"},"}")," between the id of the field to specify the position(s) where the field\nvalues will be interpolated."),(0,i.kt)("h3",{id:"writeinconfig-review_screen_presentation"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"h3"},"review_screen_presentation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"review_screen_presentation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"string"'))),(0,i.kt)("p",null,"If this value is set to ",(0,i.kt)("inlineCode",{parentName:"p"},'"string"'),", write-ins in the review screen\nwill be shown as the final string after encoding the write-in extra fields. Otherwise\nthe selected write-ins in the review screen will be shown just as in the voting step,\nexcept that they won't be editable."),(0,i.kt)("h2",{id:"writeinfield-object"},"WriteInField Object"),(0,i.kt)("p",null,"The JSON object type describes an extra field for the Write-Ins in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#writeinconfig-object"},"WriteInConfig: ",(0,i.kt)("inlineCode",{parentName:"a"},"fields"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"writeinfield-id"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," id"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"first_name"'))),(0,i.kt)("p",null,"Defines the id of a WriteInField. This id has the same limitations of a javascript variable, for\nexample it can't start with numbers."),(0,i.kt)("h3",{id:"writeinfield-placeholder"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"placeholder")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," placeholder"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the placeholder text to be shown for the Write In extra field, in the input element."),(0,i.kt)("h3",{id:"writeinfield-placeholder_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"placeholder_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," placeholder_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"placeholder")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-label"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"label")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," label"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the label text to be shown for the Write In extra field, at the top left of the input element. This field accepts html input."),(0,i.kt)("h3",{id:"writeinfield-label_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"label_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," label_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"label")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-help"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," help"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," String"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"First Name"'))),(0,i.kt)("p",null,"Defines the help text to be shown for the Write In extra field, after the input element. This field accepts html input."),(0,i.kt)("h3",{id:"writeinfield-help_i18n"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"help_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," help_i18n"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Map"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Apellidos"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the WriteInField ",(0,i.kt)("inlineCode",{parentName:"p"},"help")," for that language for this specific question."),(0,i.kt)("h3",{id:"writeinfield-min"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"min")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," min"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Positive Number"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," None"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"2"))),(0,i.kt)("p",null,"Defines the minimum number of characters for this field. "),(0,i.kt)("h3",{id:"writeinfield-max"},"WriteInField: ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property:")," max"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," Number"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," None"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," 50")),(0,i.kt)("p",null,"Defines the maximum number of characters for this field. If negative, this check will not be active."),(0,i.kt)("h2",{id:"children-election-info-object"},"Children Election Info Object"),(0,i.kt)("p",null,"TODO "),(0,i.kt)("h2",{id:"answer-object"},"Answer Object"),(0,i.kt)("p",null,"The JSON object type describes an answer in a question. It used inside the\n",(0,i.kt)("a",{parentName:"p",href:"#question-answers"},"Question: ",(0,i.kt)("inlineCode",{parentName:"a"},"answers"))," s property and it can have the\nfollowing properties:"),(0,i.kt)("h3",{id:"answer-id"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"id")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"id")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"Anwer's id, it should be unique within the question."),(0,i.kt)("h3",{id:"answer-sort_order"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort_order")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"sort_order")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Positive Integer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"0"))),(0,i.kt)("p",null,"This value will be used to sort the answers in the question.\nIf belongs to a category, it will be ordered within the category."),(0,i.kt)("h3",{id:"answer-category"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"category")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"category")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"Independents"'))),(0,i.kt)("p",null,"Category the answer belongs to. If the question is not using categories\nor the answer doesn't belong to one, use the empty string ",(0,i.kt)("inlineCode",{parentName:"p"},'""'),"."),(0,i.kt)("h3",{id:"answer-text"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"text")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," Yes"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"John Ramirez"'))),(0,i.kt)("p",null,"The main text that will be shown for this voting option, for example the\ncandidate name."),(0,i.kt)("h3",{id:"answer-text_i18n"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"text_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"text_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Independientes"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Answer ",(0,i.kt)("inlineCode",{parentName:"p"},"text_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"answer-details"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"details")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"details")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Text")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ",(0,i.kt)("inlineCode",{parentName:"li"},'"John Ramirez is an expert on the field with 20 years working for XYZ."'))),(0,i.kt)("p",null,"Some extra text describing the voting option, for example a description of the candidate.\nThis option is not required, in which case you should use the empty string ",(0,i.kt)("inlineCode",{parentName:"p"},'""'),"."),(0,i.kt)("h3",{id:"answer-details_i18n"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"details_i18n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"details_i18n")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," ",(0,i.kt)("inlineCode",{parentName:"li"},"Map")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "es": "Independientes"\n}\n')),(0,i.kt)("p",null,"If defined, it's a map of internationalization strings, grouped by language code. The provided translation will override the Answer ",(0,i.kt)("inlineCode",{parentName:"p"},"details_i18n")," for that language in the ",(0,i.kt)("inlineCode",{parentName:"p"},"election-portal")," and in the ",(0,i.kt)("inlineCode",{parentName:"p"},"voting-booth")," for this specific election."),(0,i.kt)("h3",{id:"answer-urls"},"Answer: ",(0,i.kt)("inlineCode",{parentName:"h3"},"urls")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Property name"),": ",(0,i.kt)("inlineCode",{parentName:"li"},"urls")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Type:")," List<",(0,i.kt)("a",{parentName:"li",href:"#url-object"},"Url"),">"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Required:")," No"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Default:")," -"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Example:")," ")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'[\n {\n "title": "URL",\n "url": ""\n },\n {\n "title": "Image URL",\n "url": ""\n }\n]\n')),(0,i.kt)("p",null,"A list of URL objects. This is used to add tags to the Answer."),(0,i.kt)("h2",{id:"url-object"},"Url Object"),(0,i.kt)("p",null,"The URL Json object is used to complement the Answer description with different tags.\nEach URL object has two keys: ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"url"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," is the name of the tag\nand the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," is the value of the tag."),(0,i.kt)("p",null,"The possible url types are:"),(0,i.kt)("h3",{id:"url"},"URL"),(0,i.kt)("p",null,"This is used when you want to include a webpage associated with the Answer. This URL\nwill appear as part of the ballot in the voting booth. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title"),"value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"URL"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be the link to the webpage."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "URL",\n "url": "https://www.google.com"\n },\n')),(0,i.kt)("h3",{id:"image-url"},"Image URL"),(0,i.kt)("p",null,"Use this if you want to display an image with this Answer in the voting booth. "),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"Image URL"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be the link to the image."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "Image URL",\n "url": "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png"\n },\n')),(0,i.kt)("h3",{id:"invalid-vote-flag"},"Invalid Vote Flag"),(0,i.kt)("p",null,"Use this if you want to add an explicit voting option for an invalid vote in the voting booth."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"invalidVoteFlag"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "invalidVoteFlag",\n "url": "true"\n },\n')),(0,i.kt)("h3",{id:"position-flag"},"Position Flag"),(0,i.kt)("p",null,"This flag can be used for ",(0,i.kt)("a",{parentName:"p",href:"#invalid-vote-flag"},"explicit invalid Answers")," to position the answer either at the top or the bottom of the answers."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"positionFlag"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be either ",(0,i.kt)("inlineCode",{parentName:"p"},'"top"')," or ",(0,i.kt)("inlineCode",{parentName:"p"},'"bottom"'),". If this tag is not included,\nthe default position of the explicit invalid answer will be at the bottom of the answers in the ballot."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "positionFlag",\n "url": "bottom"\n },\n')),(0,i.kt)("h3",{id:"is-category-list"},"Is Category List"),(0,i.kt)("p",null,"When the question uses ",(0,i.kt)("a",{parentName:"p",href:"#question-extra-enable_checkable_lists"},"category lists"),", this option is used to mark an answer as a category list."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"isCategoryList"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "isCategoryList",\n "url": "true"\n },\n')),(0,i.kt)("h3",{id:"is-write-in"},"Is Write In"),(0,i.kt)("p",null,"When the question uses ",(0,i.kt)("a",{parentName:"p",href:"../guides/write-ins/"},"write-in candidates"),", this option is used to mark an answer as a write-in candidate."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"title")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"isWriteIn"')," and the ",(0,i.kt)("inlineCode",{parentName:"p"},"url")," value should be ",(0,i.kt)("inlineCode",{parentName:"p"},'"true"'),"."),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},' {\n "title": "isWriteIn",\n "url": "true"\n },\n')))}u.isMDXComponent=!0},8343:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/files/sample_config-87b36523fae895e421ea3d0e4b3072dc.yml"}}]); \ No newline at end of file diff --git a/assets/js/53c38555.bf50a258.js b/assets/js/53c38555.bf50a258.js deleted file mode 100644 index 51d0ac36..00000000 --- a/assets/js/53c38555.bf50a258.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[507],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>g});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=i.createContext({}),d=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},m=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=d(n),g=a,u=p["".concat(s,".").concat(g)]||p[g]||c[g]||o;return n?i.createElement(u,r(r({ref:t},m),{},{components:n})):i.createElement(u,r({ref:t},m))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var d=2;d{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var i=n(3117),a=(n(7294),n(3905));const o={sidebar_position:8,title:"Segmented Mixing Guide"},r=void 0,l={unversionedId:"general/guides/segmented-mixing/segmented-mixing",id:"general/guides/segmented-mixing/segmented-mixing",title:"Segmented Mixing Guide",description:"Introduction and rationale",source:"@site/docs/general/guides/segmented-mixing/segmented-mixing.md",sourceDirName:"general/guides/segmented-mixing",slug:"/general/guides/segmented-mixing/",permalink:"/documentation/docs/general/guides/segmented-mixing/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/segmented-mixing/segmented-mixing.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,title:"Segmented Mixing Guide"},sidebar:"generalSidebar",previous:{title:"Electoral Board Ceremonies",permalink:"/documentation/docs/general/guides/electoral-board-ceremonies/"},next:{title:"Cron Tasks Guide",permalink:"/documentation/docs/general/guides/cron-tasks/"}},s={},d=[{value:"Introduction and rationale",id:"introduction-and-rationale",level:2},{value:"How does it work",id:"how-does-it-work",level:2},{value:"Implementation details",id:"implementation-details",level:2},{value:"Encoding and decoding segmentation",id:"encoding-and-decoding-segmentation",level:3},{value:"Categories encoding",id:"categories-encoding",level:3},{value:"Producing a segmented tally",id:"producing-a-segmented-tally",level:3},{value:"Risks and limitations",id:"risks-and-limitations",level:2},{value:"How to use it",id:"how-to-use-it",level:2}],m={toc:d};function c(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,i.Z)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"introduction-and-rationale"},"Introduction and rationale"),(0,a.kt)("p",null,"Segmented Mixing allows to speed up election creation and tallying for electoral\nprocesses where you need segmented votes during tallying but the questions being\nvoted are exactly the same in all these segments."),(0,a.kt)("p",null,"The alternative to segmented mixing is using\n",(0,a.kt)("a",{parentName:"p",href:"../parent-and-children-elections/"},"Parent-Children Elections")," with one child\nelection per segment. However, since you need one election per segment and\nelections are tallied sequentially and have a minimum tally (or key-creation)\ntime of around 30 seconds per question in each election, this can slow-down\nthe election creation and the tally time."),(0,a.kt)("p",null,"In contrast, with segmented mixing you only need one election. If you have 30\nsegments (for example provinces), one election with 2 questions and need a tally\nsegmented by province, then a segmented election creation and election tally\nwill take only ~1 minute instead of the 30 minutes it would take for each of\nthose processes with parent-children elections. "),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("a",{parentName:"p",href:"../parent-and-children-elections/"},"Parent-Children Elections")," election is a\nmore generic and powerful mechanism. Use Segmented mixing only when appropriate.")),(0,a.kt)("p",null,"Segmented mixing works by performing a single mix while allowing to\ngroup/segment the resulting anonymized ballots because they have been tagged\nbefore performing the tally."),(0,a.kt)("h2",{id:"how-does-it-work"},"How does it work"),(0,a.kt)("p",null,"Segmented mixing works works as follows:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Each voter has an attribute in the census marking its segmentation. This\ncould be the region of the voter, its category, or any other segmentation\nvariable."),(0,a.kt)("li",{parentName:"ol"},"Before sending the encrypted ballots to the mixnet for shuffling and\ndecryption, the ballots are tagged with a different tag per segment."),(0,a.kt)("li",{parentName:"ol"},"Once the votes are shuffled and decrypted by the mixnet, the raw encoded\nballots are decoded and converted into\n",(0,a.kt)("inlineCode",{parentName:"li"},"(encoded-ballot) -> (region, original-ballot)"),"."),(0,a.kt)("li",{parentName:"ol"},"The ballots are tallied grouped per segment and also showing a consolidated\nresult.")),(0,a.kt)("h2",{id:"implementation-details"},"Implementation details"),(0,a.kt)("p",null,"The encrypted ballots can be tagged by taking advantage of the homomorphic\nproperties of ElGamal encryption, by which we can multiply an encrypted ballot\nwith another encrypted text of a specific number different for each group (the\ntag) and obtain a verifiably encrypted text that contains the result of that\nmultiplication."),(0,a.kt)("p",null,"A encoded plaintext ballot is just an integer number. For example ",(0,a.kt)("inlineCode",{parentName:"p"},"2")," may encode\na vote for ",(0,a.kt)("inlineCode",{parentName:"p"},"Yes")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"4")," may be a vote for ",(0,a.kt)("inlineCode",{parentName:"p"},"No")," in a contest. Take a look at\n",(0,a.kt)("a",{parentName:"p",href:"/documentation/docs/general/reference/ballot-encoding"},"Ballot Encoding")," for more details of how\nwe encode a ballot into a positive integer within Sequent's Voting Platform."),(0,a.kt)("p",null,"ElGamal cryptosystem receives any integer number and produces a ciphertext.\nAn intermediate step before applying ElGamal encryption is to encode this\ninteger plaintext into a multiplicative subgroup ",(0,a.kt)("inlineCode",{parentName:"p"},"Gq")," using the set of quadratic\nresidues modulo ",(0,a.kt)("inlineCode",{parentName:"p"},"p"),". This is required to achieve semantic security. There is a\npost in Sequent's blog detailing this process of\n",(0,a.kt)("a",{parentName:"p",href:"https://sequentech.io/plaintext-encoding-in-elgamal/"},"Elgamal Plaintext encoding"),"."),(0,a.kt)("h3",{id:"encoding-and-decoding-segmentation"},"Encoding and decoding segmentation"),(0,a.kt)("p",null,"Segmentation is performed in the dumping of the ballot box to the mixnet. We\ntake each encrypted ballot ",(0,a.kt)("inlineCode",{parentName:"p"},"E(ballot)")," and multiply with an encrypted category\ntag ",(0,a.kt)("inlineCode",{parentName:"p"},"E(tag)")," resulting in an ciphertext ",(0,a.kt)("inlineCode",{parentName:"p"},"E(ballot * tag)"),". This means that when\ndecrypted, the decryption of such ciphertext will be ",(0,a.kt)("inlineCode",{parentName:"p"},"ballot * tag"),"."),(0,a.kt)("p",null,"For example, if ",(0,a.kt)("inlineCode",{parentName:"p"},"ballot = 4")," (a vote for ",(0,a.kt)("inlineCode",{parentName:"p"},"No"),") and ",(0,a.kt)("inlineCode",{parentName:"p"},"tag = 11")," (category\n",(0,a.kt)("inlineCode",{parentName:"p"},"Madrid"),"), then ",(0,a.kt)("inlineCode",{parentName:"p"},"ballot * tag = 4 * 11 = 44"),". The mixnet will receive ",(0,a.kt)("inlineCode",{parentName:"p"},"E(ballot*tag) = E(44)")," for this ballot instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"E(ballot) = E(4)"),", and the anonymized plaintext of the\nballot, which is part of the mixnet's output, will be ",(0,a.kt)("inlineCode",{parentName:"p"},"44")," instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,a.kt)("p",null,"Before the tally process can begin, we need to convert back this ",(0,a.kt)("inlineCode",{parentName:"p"},"44")," into ",(0,a.kt)("inlineCode",{parentName:"p"},"4"),",\nbecause otherwise this would be counted as an invalid ballot. At the same time,\nwe need to detect which category does this ballot belong to, to count it only\nfor that category."),(0,a.kt)("p",null,"Categories are encoded as prime numbers, like ",(0,a.kt)("inlineCode",{parentName:"p"},"11")," for ",(0,a.kt)("inlineCode",{parentName:"p"},"category = Madrid"),".\nThus, decoding segmentation is as simple as detecting by which category prime is\nthe segmentation-encoded ballot dividable by. ",(0,a.kt)("inlineCode",{parentName:"p"},"44")," is dividable by ",(0,a.kt)("inlineCode",{parentName:"p"},"11"),", so we\ndetect that it is inside the ",(0,a.kt)("inlineCode",{parentName:"p"},"Madrid")," category, and decoding the\nsegmentation-encoded ballot is as easy as performing ",(0,a.kt)("inlineCode",{parentName:"p"},"44 / 11 = 4"),". We have\nobtained back our ballot plaintext."),(0,a.kt)("h3",{id:"categories-encoding"},"Categories encoding"),(0,a.kt)("p",null,"As mentioned before, each category tag is encoded as a prime number: the\n",(0,a.kt)("strong",{parentName:"p"},"category prime"),". But it has some other constraints - it cannot be any prime\nnumber. For example, the number ",(0,a.kt)("inlineCode",{parentName:"p"},"3")," is prime, but maybe it also could encode a\nvalid ballot, and this could create ambiguous situations in which someone who\nvoted by encoding the ballot ",(0,a.kt)("inlineCode",{parentName:"p"},"3")," and whose category prime is ",(0,a.kt)("inlineCode",{parentName:"p"},"5"),", would be\ninstead assigned the category ",(0,a.kt)("inlineCode",{parentName:"p"},"3")," and the decoded ballot ",(0,a.kt)("inlineCode",{parentName:"p"},"5"),"."),(0,a.kt)("p",null,"For the reason above, a category prime needs to be always bigger than the\nhighest encodable ballot. Additionally, the category prime needs to comply with\nbeing an integer number of the multiplicative subgroup ",(0,a.kt)("inlineCode",{parentName:"p"},"Gq")," by ensuring the\nprime is a quadratic residue modulo ",(0,a.kt)("inlineCode",{parentName:"p"},"p"),", as mentioned earlier."),(0,a.kt)("p",null,"When creating an segmented election, an ordered list possible categories is set.\nAn algorithm calculates the ",(0,a.kt)("inlineCode",{parentName:"p"},"category primes"),", in the given order, assigning a\nprime number for each category tag by simply using the next available integer\nthat complies with the requirements mentioned:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"The number is higher than the maximum encodable ballot."),(0,a.kt)("li",{parentName:"ol"},"The number is not in use by any previously calculated category prime."),(0,a.kt)("li",{parentName:"ol"},"The number is prime."),(0,a.kt)("li",{parentName:"ol"},"The number is a quadratic residue modulo ",(0,a.kt)("inlineCode",{parentName:"li"},"p"),".")),(0,a.kt)("h3",{id:"producing-a-segmented-tally"},"Producing a segmented tally"),(0,a.kt)("p",null,"During tallying, the segmentation-encoded plaintext ballots are decoded as\ndescribed in the previous section. However, The whole purpose of the\nsegmentation is to produce segmented election results."),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/sequentech/tally-pipes/"},"software module doing the tally"),"\ndetects when an election is segmented, and for each question it duplicates the\nquestion one time per ",(0,a.kt)("a",{parentName:"p",href:"/documentation/docs/general/reference/election-creation-json#election-mixingCategorySegmentation"},"segment"),", and also produce a question with the\naggregated results of all the posible segments."),(0,a.kt)("p",null,"This works in a similar manner to the ",(0,a.kt)("a",{parentName:"p",href:"../parent-and-children-elections/#university-elections-example"},"University elections example")," of the Parent and\nChildren Elections Guide, but in an automatic manner. For example if we have\nonly one question ",(0,a.kt)("inlineCode",{parentName:"p"},"Question 1: What's your favorite color?"),", and we have two\nsegments ",(0,a.kt)("inlineCode",{parentName:"p"},"Madrid")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"Sevilla"),", the election results will contain the following\nthree questions:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Question 1: ",(0,a.kt)("inlineCode",{parentName:"li"},"What's your favorite color?"),", containing the results for all\nsegments."),(0,a.kt)("li",{parentName:"ol"},"Question 2: ",(0,a.kt)("inlineCode",{parentName:"li"},"What's your favorite color? - Madrid"),", containing the results\nfor ",(0,a.kt)("inlineCode",{parentName:"li"},"Madrid")," segment of voters."),(0,a.kt)("li",{parentName:"ol"},"Question 3: ",(0,a.kt)("inlineCode",{parentName:"li"},"What's your favorite color? - Sevilla"),", containing the results\nfor ",(0,a.kt)("inlineCode",{parentName:"li"},"Sevilla")," segment of voters.")),(0,a.kt)("h2",{id:"risks-and-limitations"},"Risks and limitations"),(0,a.kt)("p",null,"Segmentation mixing is an advanced feature and has some known risks and\nlimitations. Most importantly, a malicious voter could be able to craft a vote\nin such a manner that this vote will be included in the wrong segmentation\ncategory. However, it's guaranteed by the way segmentation is implemented that\nin this scenario the ballot would always be deemed invalid."),(0,a.kt)("p",null,"Please take the mentioned risks into account before using this feature."),(0,a.kt)("h2",{id:"how-to-use-it"},"How to use it"),(0,a.kt)("p",null,"You need to create an election with:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"../../reference/election-creation-json#election-segmentedmixing"},(0,a.kt)("inlineCode",{parentName:"a"},"election.segmentedMixing"))," set to ",(0,a.kt)("inlineCode",{parentName:"li"},"true")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"../../reference/election-creation-json#election-mixingCategorySegmentation"},(0,a.kt)("inlineCode",{parentName:"a"},"election.mixingCategorySegmentation")),"\nproperly configured (see the documentation)."),(0,a.kt)("li",{parentName:"ul"},"Have an extra field in the census matching the\n",(0,a.kt)("inlineCode",{parentName:"li"},"election.mixingcategorySegmentation.categoryName"),".")),(0,a.kt)("p",null,"You can find an example election in\n",(0,a.kt)("a",{target:"_blank",href:n(971).Z},"segmented_election.json"),". Here are the\nhighlights:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-json",metastring:'title="segmented_election.json fragment"',title:'"segmented_election.json','fragment"':!0},'{\n "title": "Segmented election",\n "segmentedMixing": true,\n "mixingCategorySegmentation": {\n "categoryName": "province",\n "categories": [\n "Sevilla",\n "Madrid"\n ]\n },\n "census": {\n "auth_method": "email",\n "extra_fields": [\n {\n "must": true,\n "name": "province",\n "type": "text",\n "required": true,\n "private": true,\n "min": 1,\n "max": 255,\n "required_on_authentication": false\n }\n ],\n\n... rest of the configution ....\n')),(0,a.kt)("p",null,"Once created the election, it works exactly as a non-segmented election for\nvoters and administrators, except on the election results. Here is how the\nelectoral results look in the dashboard will look like the following:"),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Election Results in Admin Dashboard",src:n(738).Z,width:"2872",height:"1586"})))}c.isMDXComponent=!0},971:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/files/segmented_election.json-db7f1138d512dc0934fd809888df3f77.yaml"},738:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/segmented-results-dashboard-9f3f119a8c470bf080e0c3c45ae970f6.png"}}]); \ No newline at end of file diff --git a/assets/js/87f5572b.2efb811c.js b/assets/js/87f5572b.2efb811c.js deleted file mode 100644 index 59948809..00000000 --- a/assets/js/87f5572b.2efb811c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[311],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(3117),r=(n(7294),n(3905));const a={sidebar_position:9,title:"Cron Tasks Guide"},i=void 0,l={unversionedId:"general/guides/cron-tasks/cron-tasks",id:"general/guides/cron-tasks/cron-tasks",title:"Cron Tasks Guide",description:"Using config.yml from deployment-tool, you can configure the system to schedule jobs using Cron. This can be useful to perform election tasks such as:",source:"@site/docs/general/guides/cron-tasks/cron-tasks.md",sourceDirName:"general/guides/cron-tasks",slug:"/general/guides/cron-tasks/",permalink:"/documentation/docs/general/guides/cron-tasks/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/cron-tasks/cron-tasks.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"Cron Tasks Guide"},sidebar:"generalSidebar",previous:{title:"Segmented Mixing Guide",permalink:"/documentation/docs/general/guides/segmented-mixing/"},next:{title:"Scheduled Events Guide",permalink:"/documentation/docs/general/guides/scheduled-events/"}},s={},c=[],u={toc:c};function d(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Using ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," from ",(0,r.kt)("inlineCode",{parentName:"p"},"deployment-tool"),", you can configure the system to schedule jobs using ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Cron"},"Cron"),". This can be useful to perform election tasks such as:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Starting/Stopping an election at a certain time."),(0,r.kt)("li",{parentName:"ul"},"Tallying an election at a certain time."),(0,r.kt)("li",{parentName:"ul"},"For elections with progressive tallies, updating the result with certain frequency.")),(0,r.kt)("h1",{id:"schedule-starting-an-election"},"Schedule starting an election"),(0,r.kt)("p",null,"In this example we schedule a server to start an election (with id ",(0,r.kt)("inlineCode",{parentName:"p"},"4"),") at a specific time by\nusing the ",(0,r.kt)("inlineCode",{parentName:"p"},"admin.py")," tool from the ",(0,r.kt)("inlineCode",{parentName:"p"},"ballot-box")," project. Edit the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.crontab_tasks")," variable\nin the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file of the web server with this configuration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"}," crontab_tasks:\n - name: start-election\n # job is the command to be run. The command should not contain line\n # breaks.\n job: 'bash -c \"source /home/ballotbox/tenv/bin/activate; /home/ballotbox/ballot-box/admin/admin.py auth_start 4 >> /home/ballotbox/crontab.log 2>&1\"'\n # The specific user whose crontab should be modified.\n user: 'ballotbox'\n # minute when the job should run ( 0-59, *, */2, etc )\n minute: 0\n # hour when the job should run ( 0-23, *, */2, etc )\n hour: 15\n # Day of the month the job should run ( 1-31, *, */2, etc )\n day: '17'\n # day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )\n weekday: '*'\n # Month of the year the job should run ( 1-12, *, */2, etc )\n month: '9'\n")),(0,r.kt)("p",null,"Ensure that the line ",(0,r.kt)("inlineCode",{parentName:"p"},"- import_tasks: crontab.yml")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"playbook.yml")," file is uncommented.\nThen deploy the configuration with ansible:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"}," date; time unbuffer ansible-playbook -i inventory playbook.yml -vvvv 2>&1 | tee log.txt; date\n")),(0,r.kt)("h1",{id:"tally-an-election-every-5-minutes"},"Tally an election every 5 minutes"),(0,r.kt)("p",null,"In this example the web server will be tallying an election every 5 minutes,\nto update the results as new votes are cast."),(0,r.kt)("p",null,"First you need to enable progressive tallying. This means you'll be able to perform multiple tallies\nfor the same election. Every time a new tally is performed, the data from the previous tally will be\nerased. Progressive tallying is required for certain types of elections, but be aware of its security\nimplications."),(0,r.kt)("p",null,"The first step is to set the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.enable_multiple_tallies")," variable in the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file\nto ",(0,r.kt)("inlineCode",{parentName:"p"},"True")," and deploy this configuration in the master web server and all authorities."),(0,r.kt)("p",null,"Then you also need to add a cron task to the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file in the master web server. In this case\nthe election id is ",(0,r.kt)("inlineCode",{parentName:"p"},"34562754")," and it has two children elections ",(0,r.kt)("inlineCode",{parentName:"p"},"34562755,34562756"),". The task will run\nevery 5 minutes and you can read the log at ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/ballotbox/crontab.log"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"}," crontab_tasks:\n - name: progressive-tally\n # job is the command to be run. The command should not contain line\n # breaks.\n job: 'bash -c \"source /home/ballotbox/tenv/bin/activate; /home/ballotbox/ballot-box/admin/admin.py --children-election-ids 34562755,34562756 --force-tally force-all --mode active trigger_tally 34562754 >> /home/ballotbox/crontab.log 2>&1\"'\n # The specific user whose crontab should be modified.\n user: 'ballotbox'\n # minute when the job should run ( 0-59, *, */2, etc )\n minute: '*/5' \n # hour when the job should run ( 0-23, *, */2, etc )\n hour: '*'\n # Day of the month the job should run ( 1-31, *, */2, etc )\n day: '*'\n # day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )\n weekday: '*'\n # Month of the year the job should run ( 1-12, *, */2, etc )\n month: '*'\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/87f5572b.9171e880.js b/assets/js/87f5572b.9171e880.js new file mode 100644 index 00000000..81d9d44a --- /dev/null +++ b/assets/js/87f5572b.9171e880.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[311],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=o.createContext({}),c=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(3117),r=(n(7294),n(3905));const a={sidebar_position:9,title:"Cron Tasks Guide"},i=void 0,l={unversionedId:"general/guides/cron-tasks/cron-tasks",id:"general/guides/cron-tasks/cron-tasks",title:"Cron Tasks Guide",description:"Using config.yml from deployment-tool, you can configure the system to schedule jobs using Cron. This can be useful to perform election tasks such as:",source:"@site/docs/general/guides/cron-tasks/cron-tasks.md",sourceDirName:"general/guides/cron-tasks",slug:"/general/guides/cron-tasks/",permalink:"/documentation/docs/general/guides/cron-tasks/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/cron-tasks/cron-tasks.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"Cron Tasks Guide"},sidebar:"generalSidebar",previous:{title:"Electoral Board Ceremonies",permalink:"/documentation/docs/general/guides/electoral-board-ceremonies/"},next:{title:"Scheduled Events Guide",permalink:"/documentation/docs/general/guides/scheduled-events/"}},s={},c=[],u={toc:c};function d(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Using ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," from ",(0,r.kt)("inlineCode",{parentName:"p"},"deployment-tool"),", you can configure the system to schedule jobs using ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Cron"},"Cron"),". This can be useful to perform election tasks such as:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Starting/Stopping an election at a certain time."),(0,r.kt)("li",{parentName:"ul"},"Tallying an election at a certain time."),(0,r.kt)("li",{parentName:"ul"},"For elections with progressive tallies, updating the result with certain frequency.")),(0,r.kt)("h1",{id:"schedule-starting-an-election"},"Schedule starting an election"),(0,r.kt)("p",null,"In this example we schedule a server to start an election (with id ",(0,r.kt)("inlineCode",{parentName:"p"},"4"),") at a specific time by\nusing the ",(0,r.kt)("inlineCode",{parentName:"p"},"admin.py")," tool from the ",(0,r.kt)("inlineCode",{parentName:"p"},"ballot-box")," project. Edit the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.crontab_tasks")," variable\nin the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file of the web server with this configuration:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"}," crontab_tasks:\n - name: start-election\n # job is the command to be run. The command should not contain line\n # breaks.\n job: 'bash -c \"source /home/ballotbox/tenv/bin/activate; /home/ballotbox/ballot-box/admin/admin.py auth_start 4 >> /home/ballotbox/crontab.log 2>&1\"'\n # The specific user whose crontab should be modified.\n user: 'ballotbox'\n # minute when the job should run ( 0-59, *, */2, etc )\n minute: 0\n # hour when the job should run ( 0-23, *, */2, etc )\n hour: 15\n # Day of the month the job should run ( 1-31, *, */2, etc )\n day: '17'\n # day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )\n weekday: '*'\n # Month of the year the job should run ( 1-12, *, */2, etc )\n month: '9'\n")),(0,r.kt)("p",null,"Ensure that the line ",(0,r.kt)("inlineCode",{parentName:"p"},"- import_tasks: crontab.yml")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"playbook.yml")," file is uncommented.\nThen deploy the configuration with ansible:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"}," date; time unbuffer ansible-playbook -i inventory playbook.yml -vvvv 2>&1 | tee log.txt; date\n")),(0,r.kt)("h1",{id:"tally-an-election-every-5-minutes"},"Tally an election every 5 minutes"),(0,r.kt)("p",null,"In this example the web server will be tallying an election every 5 minutes,\nto update the results as new votes are cast."),(0,r.kt)("p",null,"First you need to enable progressive tallying. This means you'll be able to perform multiple tallies\nfor the same election. Every time a new tally is performed, the data from the previous tally will be\nerased. Progressive tallying is required for certain types of elections, but be aware of its security\nimplications."),(0,r.kt)("p",null,"The first step is to set the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.enable_multiple_tallies")," variable in the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file\nto ",(0,r.kt)("inlineCode",{parentName:"p"},"True")," and deploy this configuration in the master web server and all authorities."),(0,r.kt)("p",null,"Then you also need to add a cron task to the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.yml")," file in the master web server. In this case\nthe election id is ",(0,r.kt)("inlineCode",{parentName:"p"},"34562754")," and it has two children elections ",(0,r.kt)("inlineCode",{parentName:"p"},"34562755,34562756"),". The task will run\nevery 5 minutes and you can read the log at ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/ballotbox/crontab.log"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"}," crontab_tasks:\n - name: progressive-tally\n # job is the command to be run. The command should not contain line\n # breaks.\n job: 'bash -c \"source /home/ballotbox/tenv/bin/activate; /home/ballotbox/ballot-box/admin/admin.py --children-election-ids 34562755,34562756 --force-tally force-all --mode active trigger_tally 34562754 >> /home/ballotbox/crontab.log 2>&1\"'\n # The specific user whose crontab should be modified.\n user: 'ballotbox'\n # minute when the job should run ( 0-59, *, */2, etc )\n minute: '*/5' \n # hour when the job should run ( 0-23, *, */2, etc )\n hour: '*'\n # Day of the month the job should run ( 1-31, *, */2, etc )\n day: '*'\n # day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )\n weekday: '*'\n # Month of the year the job should run ( 1-12, *, */2, etc )\n month: '*'\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/93188ff0.603972db.js b/assets/js/93188ff0.603972db.js deleted file mode 100644 index 539508ee..00000000 --- a/assets/js/93188ff0.603972db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[163],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>u});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},h=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),p=c(n),u=i,m=p["".concat(l,".").concat(u)]||p[u]||d[u]||a;return n?o.createElement(m,r(r({ref:t},h),{},{components:n})):o.createElement(m,r({ref:t},h))}));function u(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,r=new Array(a);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=n(3117),i=(n(7294),n(3905));const a={sidebar_position:7,title:"Electoral Board Ceremonies"},r=void 0,s={unversionedId:"general/guides/electoral-board-ceremonies/electoral-board-ceremonies",id:"general/guides/electoral-board-ceremonies/electoral-board-ceremonies",title:"Electoral Board Ceremonies",description:"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:",source:"@site/docs/general/guides/electoral-board-ceremonies/electoral-board-ceremonies.md",sourceDirName:"general/guides/electoral-board-ceremonies",slug:"/general/guides/electoral-board-ceremonies/",permalink:"/documentation/docs/general/guides/electoral-board-ceremonies/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/electoral-board-ceremonies/electoral-board-ceremonies.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,title:"Electoral Board Ceremonies"},sidebar:"generalSidebar",previous:{title:"SmartLink Auth Guide",permalink:"/documentation/docs/general/guides/smart-link-auth/"},next:{title:"Segmented Mixing Guide",permalink:"/documentation/docs/general/guides/segmented-mixing/"}},l={},c=[{value:"Election Authority Credentials",id:"election-authority-credentials",level:2},{value:"Election Creation Configuration",id:"election-creation-configuration",level:2},{value:"Dashboard",id:"dashboard",level:2},{value:"Keys Distribution Ceremony",id:"keys-distribution-ceremony",level:2},{value:"Opening Ceremony",id:"opening-ceremony",level:2}],h={toc:c};function d(e){let{components:t,...a}=e;return(0,i.kt)("wrapper",(0,o.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Keys Distribution Ceremony. In this ceremony the private keys for the election are retrieved and deleted from the trustees' servers and handed over to the custodians. This ceremony takes place before the voting period has started. This ensures no one can decrypt the ballots during the voting period."),(0,i.kt)("li",{parentName:"ul"},"Opening Ceremony. In this ceremony the private keys for the election are handed over from the custodians and restored to the trustees' servers. This ceremony takes place after the voting period has ended. Restoring the private keys in the trustees' servers is a necessary step before the tally process can be started.")),(0,i.kt)("p",null,"This is an advanced feature and it has to be manually enabled while creating the election. Also, this feature does not currently support ",(0,i.kt)("a",{parentName:"p",href:"../parent-and-children-elections/"},"parent/children elections"),"."),(0,i.kt)("p",null,"Any given election is comprised of multiple questions, and is configured to use multiple electoral authorities. Each electoral authority has their own share of the private key for each question. These private keys are files that are created and stored inside the servers of each electoral authority. These files, that hold the share of the private key for a given question in an election, are required to tally the election."),(0,i.kt)("p",null,"A custodian is a person whose job is to custody the private keys for an election for a given authority. During the Keys Distribution Ceremony the custodians will download a file that contains the share of the private keys for their electoral authority. That file is a compressed archive (with a ",(0,i.kt)("inlineCode",{parentName:"p"},".tar.gz")," extension), and inside the compressed file there is a number of files, each one containing a private key for each of the questions of the election. Each custodian will download a different compressed file, as the private keys for each authority for the election are different."),(0,i.kt)("p",null,"The next sections are a step by step guide to:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Election authority credentials"),(0,i.kt)("li",{parentName:"ul"},"Creating an election with the Electoral Board Ceremonies feature enabled."),(0,i.kt)("li",{parentName:"ul"},"Keys Distribution Ceremony."),(0,i.kt)("li",{parentName:"ul"},"Opening Ceremony.")),(0,i.kt)("h2",{id:"election-authority-credentials"},"Election Authority Credentials"),(0,i.kt)("p",null,"Note: this configuration needs to be done on the Sequent web servers. This is a one-off configuration, and it only needs to be done the first time Electoral Board Ceremonies are to be used in any election."),(0,i.kt)("p",null,"Before we can use the Electoral Board Ceremonies feature, we need to configure the web servers to create credentials for the election authorities. Specifically, we need to configure a user/password for each of the authorities."),(0,i.kt)("p",null,"In order to see which authorities are connected to the web server, login into the web server and run:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," eopeers --list\n")),(0,i.kt)("p",null,"This will show the list of all authorities connected to the web server, as well as possible slave servers. Each election uses a specific list of authorities, which can be a subset of that list, so we'll need to configure the user/password for at least the authorities the election is going to use."),(0,i.kt)("p",null,"To configure the user/password, login into the web server and change the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," file, which you'll find in a path similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"/root/prod-s1/config.yml"),". Find the YAML key ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot_box.trustee_users")," and fill it in with the user/password for all authorities you're going to use in the election:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"}," trustee_users:\n - authority_id: auth1\n username: usera1\n password: pass1234\n - authority_id: auth2\n username: usera2\n password: pass1234\n")),(0,i.kt)("p",null,"Now we need to provision the machine to apply the updated configuration. In this case we're only updating the ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," service so you can change the ",(0,i.kt)("inlineCode",{parentName:"p"},"playbook.yml")," file (located in a path similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"/root/prod-s1/playbook.yml"),") and comment out all playbooks except for the ballot-box. This will make the deployment faster. The playbook will look similar to this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"---\n- hosts: all\n\ntasks:\n - include_vars: config.yml\n - include_vars: repos.yml\n\n# - import_tasks: packages.yml\n# - import_tasks: system.yml\n# - import_tasks: hardening/main.yml\n# - import_tasks: sudoers/main.yml\n# - import_tasks: misc-tools/main.yml\n# #- import_tasks: eorchestra/main.yml\n - import_tasks: ballot-box/main.yml\n# - import_tasks: iam/main.yml\n# # - import_tasks: sentry/main.yml\n# - import_tasks: sequent-ui/main.yml\n# - import_tasks: oneserver/main.yml\n# - import_tasks: election-verifier/main.yml\n# #- import_tasks: halb/main.yml\n# - import_tasks: postgres_backups.yml\n# - import_tasks: crontab.yml\n")),(0,i.kt)("p",null,"Then provision the machine as explained ",(0,i.kt)("a",{parentName:"p",href:"../deployment"},"here"),". "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"}," date; time ansible-playbook -i inventory playbook.yml; date\n")),(0,i.kt)("h2",{id:"election-creation-configuration"},"Election Creation Configuration"),(0,i.kt)("p",null,'During the election creation process, in the last step, called "Create Election", click on the pencil as shown in this image:'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Create Election",src:n(1268).Z,width:"1788",height:"1124"})),(0,i.kt)("p",null,"This will open a modal with a text field and the JSON configuration of the election. We need to change the configuration to enable the Electoral Board Ceremonies. Add a key ",(0,i.kt)("inlineCode",{parentName:"p"},"election_board_ceremony")," with value ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," inside the ",(0,i.kt)("inlineCode",{parentName:"p"},"presentation")," section, as shown below, and then click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Finish edit"),":"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Edit JSON",src:n(8062).Z,width:"1694",height:"1476"})),(0,i.kt)("p",null,"Finally click on the green button at the bottom ",(0,i.kt)("inlineCode",{parentName:"p"},"Create the elections")," and wait for the election to be created."),(0,i.kt)("h2",{id:"dashboard"},"Dashboard"),(0,i.kt)("p",null,"Once the election is created, the ceremonies will be available in the Dashboard under the Actions dropdown:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Elections and Questions",src:n(1780).Z,width:"2246",height:"1246"})),(0,i.kt)("p",null,"The Keys Distribution Ceremony will be available after the election is created and before the voting period has started. The Opening Ceremony will be available after the voting period has ended and before the tally process has started. After completing a ceremony, it can't be repeated. If the ceremonies aren't available when they should this means the feature was not correctly enabled for the election (please review the previous step on Election Creation Configuration)."),(0,i.kt)("h2",{id:"keys-distribution-ceremony"},"Keys Distribution Ceremony"),(0,i.kt)("p",null,"In this ceremony, each election authority will download the share of the private keys for the election and the keys will be removed from the election authority servers. Note that this action can only be launched if the election is configured with the Electoral Board Ceremonies feature enabled, and that the election cannot be started before this ceremony is successfully completed. "),(0,i.kt)("p",null,"The ceremony will take place inside a modal, in a series of steps. If the modal is closed at any time, you can reopen it again and resume the ceremony. However,the ceremony can't be completed twice."),(0,i.kt)("p",null,"In order to start the ceremony, go to the election Dashboard and click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Launch key distribution ceremony")," under the ",(0,i.kt)("inlineCode",{parentName:"p"},"Actions")," button. This will launch a modal:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Intro modal",src:n(4160).Z,width:"1552",height:"1008"})),(0,i.kt)("p",null,"You can see at the top the number of steps required to complete the ceremony. In this ceremony each election authority will need to complete the following steps:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Login into the election authority account. The administrator of the Sequent servers must provide the user/password for the election authority.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Login",src:n(1874).Z,width:"1550",height:"1038"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Download the share of the private keys. In this screen you can download the keys as many times as you need.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Download",src:n(6738).Z,width:"1552",height:"924"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Secure at least two copies of the private keys. Once you've copied the keys into two different USB memory sticks, check the two checkboxes and click ",(0,i.kt)("inlineCode",{parentName:"li"},"Next step"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Secure",src:n(3916).Z,width:"1552",height:"1042"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Check the contents of the keys. Drag and drop the previously downloaded file to check its content.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Check",src:n(5862).Z,width:"1548",height:"1092"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Delete the share of the private keys from the election authority's server.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Delete",src:n(7726).Z,width:"1548",height:"970"})),(0,i.kt)("p",null,"After these steps are completed by all authorities, you'll see a final screen showing the success of the ceremony:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Completed",src:n(6422).Z,width:"1626",height:"852"})),(0,i.kt)("p",null,"Note that if the modal is closed too early, it can be launched again. If the share of the private keys for some of the election authorities have already been deleted, the modal will continue from that point with the next election authority."),(0,i.kt)("h2",{id:"opening-ceremony"},"Opening Ceremony"),(0,i.kt)("p",null,"In this ceremony, each election authority will upload their share of the private keys for the election and the keys will be restored to the election authority servers. Note that this action can only be launched if the election is configured with ",(0,i.kt)("inlineCode",{parentName:"p"},"election_board_ceremony")," set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", after the voting period is stopped, and that the tally cannot be started before this ceremony is successfully completed."),(0,i.kt)("p",null,"In order to start the ceremony, go to the election Dashboard and click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Launch opening ceremony")," under the ",(0,i.kt)("inlineCode",{parentName:"p"},"Actions")," button. This will launch a modal:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Intro modal",src:n(8086).Z,width:"1614",height:"908"})),(0,i.kt)("p",null,"At the top you can see the number of steps required to complete the ceremony. Each election authority will need to complete the following steps:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Login into the election authority account. The administrator of the Sequent servers must provide the user/password for the election authority.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Login",src:n(2597).Z,width:"1624",height:"994"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Check the contents of the keys. Drag and drop the previously downloaded file to check its content. You must use the file previously downloaded in the Keys Distribution Ceremony.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Upload",src:n(1819).Z,width:"1616",height:"1090"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Restore the share of the private keys to the election authority's server.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Restore",src:n(3659).Z,width:"1618",height:"892"})),(0,i.kt)("p",null,"After these steps are completed by all authorities, you'll see a final screen showing the success of the ceremony:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Completed",src:n(8937).Z,width:"1620",height:"800"})),(0,i.kt)("p",null,"Note that if the modal is closed too early, it can be launched again. If the share of the private keys for some of the election authorities have already been deleted, the modal will continue from that point with the next election authority."))}d.isMDXComponent=!0},1780:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/ceremonies_dashboard-09a10780403d7621bee330c1e6d98594.png"},1268:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/create_election-a24687c5bab1b74291620bcef84f57db.png"},8062:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/edit_json-15d11388d7db1df00055df43d53433cf.png"},4160:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-1-intro-ed26c6021805d48fb05a8cebb2aef833.png"},1874:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-2-login-1d07b37e3d92e0c2021c1a9f3b057e92.png"},6738:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-3-download-5c75847de6714e4f7898cc70e008e8a9.png"},3916:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-4-secure-b6678ff2b9e5088659f50acfd969e373.png"},5862:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-5-check-faec0a306c141163c6246d284011f4aa.png"},7726:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-6-delete-74ab1689da43650c5d68057e84eb4fcf.png"},6422:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-7-completed-33ea1673d35c6e8b54c39be74e8a5540.png"},8086:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-1-intro-d7ad068202e1c760a67c5cb0a096c391.png"},2597:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-2-login-2fd1f0bb1222865877d503ff9cb660e1.png"},1819:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-3-upload-00fe0e9cd34639ba7aa467425de955e2.png"},3659:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-4-restore-d81fb3351ebf6d206137d7fe5a440b8a.png"},8937:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-5-completed-b1dee6dbad7bc5390b0b9d07c53284d0.png"}}]); \ No newline at end of file diff --git a/assets/js/93188ff0.6cbde6fe.js b/assets/js/93188ff0.6cbde6fe.js new file mode 100644 index 00000000..28e08e0c --- /dev/null +++ b/assets/js/93188ff0.6cbde6fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[163],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>u});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},h=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),p=c(n),u=i,m=p["".concat(l,".").concat(u)]||p[u]||d[u]||a;return n?o.createElement(m,r(r({ref:t},h),{},{components:n})):o.createElement(m,r({ref:t},h))}));function u(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,r=new Array(a);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,r[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=n(3117),i=(n(7294),n(3905));const a={sidebar_position:7,title:"Electoral Board Ceremonies"},r=void 0,s={unversionedId:"general/guides/electoral-board-ceremonies/electoral-board-ceremonies",id:"general/guides/electoral-board-ceremonies/electoral-board-ceremonies",title:"Electoral Board Ceremonies",description:"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:",source:"@site/docs/general/guides/electoral-board-ceremonies/electoral-board-ceremonies.md",sourceDirName:"general/guides/electoral-board-ceremonies",slug:"/general/guides/electoral-board-ceremonies/",permalink:"/documentation/docs/general/guides/electoral-board-ceremonies/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/electoral-board-ceremonies/electoral-board-ceremonies.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,title:"Electoral Board Ceremonies"},sidebar:"generalSidebar",previous:{title:"SmartLink Auth Guide",permalink:"/documentation/docs/general/guides/smart-link-auth/"},next:{title:"Cron Tasks Guide",permalink:"/documentation/docs/general/guides/cron-tasks/"}},l={},c=[{value:"Election Authority Credentials",id:"election-authority-credentials",level:2},{value:"Election Creation Configuration",id:"election-creation-configuration",level:2},{value:"Dashboard",id:"dashboard",level:2},{value:"Keys Distribution Ceremony",id:"keys-distribution-ceremony",level:2},{value:"Opening Ceremony",id:"opening-ceremony",level:2}],h={toc:c};function d(e){let{components:t,...a}=e;return(0,i.kt)("wrapper",(0,o.Z)({},h,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Keys Distribution Ceremony. In this ceremony the private keys for the election are retrieved and deleted from the trustees' servers and handed over to the custodians. This ceremony takes place before the voting period has started. This ensures no one can decrypt the ballots during the voting period."),(0,i.kt)("li",{parentName:"ul"},"Opening Ceremony. In this ceremony the private keys for the election are handed over from the custodians and restored to the trustees' servers. This ceremony takes place after the voting period has ended. Restoring the private keys in the trustees' servers is a necessary step before the tally process can be started.")),(0,i.kt)("p",null,"This is an advanced feature and it has to be manually enabled while creating the election. Also, this feature does not currently support ",(0,i.kt)("a",{parentName:"p",href:"../parent-and-children-elections/"},"parent/children elections"),"."),(0,i.kt)("p",null,"Any given election is comprised of multiple questions, and is configured to use multiple electoral authorities. Each electoral authority has their own share of the private key for each question. These private keys are files that are created and stored inside the servers of each electoral authority. These files, that hold the share of the private key for a given question in an election, are required to tally the election."),(0,i.kt)("p",null,"A custodian is a person whose job is to custody the private keys for an election for a given authority. During the Keys Distribution Ceremony the custodians will download a file that contains the share of the private keys for their electoral authority. That file is a compressed archive (with a ",(0,i.kt)("inlineCode",{parentName:"p"},".tar.gz")," extension), and inside the compressed file there is a number of files, each one containing a private key for each of the questions of the election. Each custodian will download a different compressed file, as the private keys for each authority for the election are different."),(0,i.kt)("p",null,"The next sections are a step by step guide to:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Election authority credentials"),(0,i.kt)("li",{parentName:"ul"},"Creating an election with the Electoral Board Ceremonies feature enabled."),(0,i.kt)("li",{parentName:"ul"},"Keys Distribution Ceremony."),(0,i.kt)("li",{parentName:"ul"},"Opening Ceremony.")),(0,i.kt)("h2",{id:"election-authority-credentials"},"Election Authority Credentials"),(0,i.kt)("p",null,"Note: this configuration needs to be done on the Sequent web servers. This is a one-off configuration, and it only needs to be done the first time Electoral Board Ceremonies are to be used in any election."),(0,i.kt)("p",null,"Before we can use the Electoral Board Ceremonies feature, we need to configure the web servers to create credentials for the election authorities. Specifically, we need to configure a user/password for each of the authorities."),(0,i.kt)("p",null,"In order to see which authorities are connected to the web server, login into the web server and run:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"}," eopeers --list\n")),(0,i.kt)("p",null,"This will show the list of all authorities connected to the web server, as well as possible slave servers. Each election uses a specific list of authorities, which can be a subset of that list, so we'll need to configure the user/password for at least the authorities the election is going to use."),(0,i.kt)("p",null,"To configure the user/password, login into the web server and change the ",(0,i.kt)("inlineCode",{parentName:"p"},"config.yml")," file, which you'll find in a path similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"/root/prod-s1/config.yml"),". Find the YAML key ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot_box.trustee_users")," and fill it in with the user/password for all authorities you're going to use in the election:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"}," trustee_users:\n - authority_id: auth1\n username: usera1\n password: pass1234\n - authority_id: auth2\n username: usera2\n password: pass1234\n")),(0,i.kt)("p",null,"Now we need to provision the machine to apply the updated configuration. In this case we're only updating the ",(0,i.kt)("inlineCode",{parentName:"p"},"ballot-box")," service so you can change the ",(0,i.kt)("inlineCode",{parentName:"p"},"playbook.yml")," file (located in a path similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"/root/prod-s1/playbook.yml"),") and comment out all playbooks except for the ballot-box. This will make the deployment faster. The playbook will look similar to this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-yaml"},"---\n- hosts: all\n\ntasks:\n - include_vars: config.yml\n - include_vars: repos.yml\n\n# - import_tasks: packages.yml\n# - import_tasks: system.yml\n# - import_tasks: hardening/main.yml\n# - import_tasks: sudoers/main.yml\n# - import_tasks: misc-tools/main.yml\n# #- import_tasks: eorchestra/main.yml\n - import_tasks: ballot-box/main.yml\n# - import_tasks: iam/main.yml\n# # - import_tasks: sentry/main.yml\n# - import_tasks: sequent-ui/main.yml\n# - import_tasks: oneserver/main.yml\n# - import_tasks: election-verifier/main.yml\n# #- import_tasks: halb/main.yml\n# - import_tasks: postgres_backups.yml\n# - import_tasks: crontab.yml\n")),(0,i.kt)("p",null,"Then provision the machine as explained ",(0,i.kt)("a",{parentName:"p",href:"../deployment"},"here"),". "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"}," date; time ansible-playbook -i inventory playbook.yml; date\n")),(0,i.kt)("h2",{id:"election-creation-configuration"},"Election Creation Configuration"),(0,i.kt)("p",null,'During the election creation process, in the last step, called "Create Election", click on the pencil as shown in this image:'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Create Election",src:n(1268).Z,width:"1788",height:"1124"})),(0,i.kt)("p",null,"This will open a modal with a text field and the JSON configuration of the election. We need to change the configuration to enable the Electoral Board Ceremonies. Add a key ",(0,i.kt)("inlineCode",{parentName:"p"},"election_board_ceremony")," with value ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," inside the ",(0,i.kt)("inlineCode",{parentName:"p"},"presentation")," section, as shown below, and then click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Finish edit"),":"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Edit JSON",src:n(8062).Z,width:"1694",height:"1476"})),(0,i.kt)("p",null,"Finally click on the green button at the bottom ",(0,i.kt)("inlineCode",{parentName:"p"},"Create the elections")," and wait for the election to be created."),(0,i.kt)("h2",{id:"dashboard"},"Dashboard"),(0,i.kt)("p",null,"Once the election is created, the ceremonies will be available in the Dashboard under the Actions dropdown:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Elections and Questions",src:n(1780).Z,width:"2246",height:"1246"})),(0,i.kt)("p",null,"The Keys Distribution Ceremony will be available after the election is created and before the voting period has started. The Opening Ceremony will be available after the voting period has ended and before the tally process has started. After completing a ceremony, it can't be repeated. If the ceremonies aren't available when they should this means the feature was not correctly enabled for the election (please review the previous step on Election Creation Configuration)."),(0,i.kt)("h2",{id:"keys-distribution-ceremony"},"Keys Distribution Ceremony"),(0,i.kt)("p",null,"In this ceremony, each election authority will download the share of the private keys for the election and the keys will be removed from the election authority servers. Note that this action can only be launched if the election is configured with the Electoral Board Ceremonies feature enabled, and that the election cannot be started before this ceremony is successfully completed. "),(0,i.kt)("p",null,"The ceremony will take place inside a modal, in a series of steps. If the modal is closed at any time, you can reopen it again and resume the ceremony. However,the ceremony can't be completed twice."),(0,i.kt)("p",null,"In order to start the ceremony, go to the election Dashboard and click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Launch key distribution ceremony")," under the ",(0,i.kt)("inlineCode",{parentName:"p"},"Actions")," button. This will launch a modal:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Intro modal",src:n(4160).Z,width:"1552",height:"1008"})),(0,i.kt)("p",null,"You can see at the top the number of steps required to complete the ceremony. In this ceremony each election authority will need to complete the following steps:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Login into the election authority account. The administrator of the Sequent servers must provide the user/password for the election authority.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Login",src:n(1874).Z,width:"1550",height:"1038"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Download the share of the private keys. In this screen you can download the keys as many times as you need.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Download",src:n(6738).Z,width:"1552",height:"924"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Secure at least two copies of the private keys. Once you've copied the keys into two different USB memory sticks, check the two checkboxes and click ",(0,i.kt)("inlineCode",{parentName:"li"},"Next step"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Secure",src:n(3916).Z,width:"1552",height:"1042"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Check the contents of the keys. Drag and drop the previously downloaded file to check its content.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Check",src:n(5862).Z,width:"1548",height:"1092"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Delete the share of the private keys from the election authority's server.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Delete",src:n(7726).Z,width:"1548",height:"970"})),(0,i.kt)("p",null,"After these steps are completed by all authorities, you'll see a final screen showing the success of the ceremony:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Keys Distribution Ceremony Completed",src:n(6422).Z,width:"1626",height:"852"})),(0,i.kt)("p",null,"Note that if the modal is closed too early, it can be launched again. If the share of the private keys for some of the election authorities have already been deleted, the modal will continue from that point with the next election authority."),(0,i.kt)("h2",{id:"opening-ceremony"},"Opening Ceremony"),(0,i.kt)("p",null,"In this ceremony, each election authority will upload their share of the private keys for the election and the keys will be restored to the election authority servers. Note that this action can only be launched if the election is configured with ",(0,i.kt)("inlineCode",{parentName:"p"},"election_board_ceremony")," set to ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", after the voting period is stopped, and that the tally cannot be started before this ceremony is successfully completed."),(0,i.kt)("p",null,"In order to start the ceremony, go to the election Dashboard and click on ",(0,i.kt)("inlineCode",{parentName:"p"},"Launch opening ceremony")," under the ",(0,i.kt)("inlineCode",{parentName:"p"},"Actions")," button. This will launch a modal:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Intro modal",src:n(8086).Z,width:"1614",height:"908"})),(0,i.kt)("p",null,"At the top you can see the number of steps required to complete the ceremony. Each election authority will need to complete the following steps:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Login into the election authority account. The administrator of the Sequent servers must provide the user/password for the election authority.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Login",src:n(2597).Z,width:"1624",height:"994"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Check the contents of the keys. Drag and drop the previously downloaded file to check its content. You must use the file previously downloaded in the Keys Distribution Ceremony.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Upload",src:n(1819).Z,width:"1616",height:"1090"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Restore the share of the private keys to the election authority's server.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Restore",src:n(3659).Z,width:"1618",height:"892"})),(0,i.kt)("p",null,"After these steps are completed by all authorities, you'll see a final screen showing the success of the ceremony:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Opening Ceremony Completed",src:n(8937).Z,width:"1620",height:"800"})),(0,i.kt)("p",null,"Note that if the modal is closed too early, it can be launched again. If the share of the private keys for some of the election authorities have already been deleted, the modal will continue from that point with the next election authority."))}d.isMDXComponent=!0},1780:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/ceremonies_dashboard-09a10780403d7621bee330c1e6d98594.png"},1268:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/create_election-a24687c5bab1b74291620bcef84f57db.png"},8062:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/edit_json-15d11388d7db1df00055df43d53433cf.png"},4160:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-1-intro-ed26c6021805d48fb05a8cebb2aef833.png"},1874:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-2-login-1d07b37e3d92e0c2021c1a9f3b057e92.png"},6738:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-3-download-5c75847de6714e4f7898cc70e008e8a9.png"},3916:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-4-secure-b6678ff2b9e5088659f50acfd969e373.png"},5862:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-5-check-faec0a306c141163c6246d284011f4aa.png"},7726:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-6-delete-74ab1689da43650c5d68057e84eb4fcf.png"},6422:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/kdc-7-completed-33ea1673d35c6e8b54c39be74e8a5540.png"},8086:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-1-intro-d7ad068202e1c760a67c5cb0a096c391.png"},2597:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-2-login-2fd1f0bb1222865877d503ff9cb660e1.png"},1819:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-3-upload-00fe0e9cd34639ba7aa467425de955e2.png"},3659:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-4-restore-d81fb3351ebf6d206137d7fe5a440b8a.png"},8937:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/oc-5-completed-b1dee6dbad7bc5390b0b9d07c53284d0.png"}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.1b60b723.js b/assets/js/935f2afb.1b60b723.js deleted file mode 100644 index 02d74f56..00000000 --- a/assets/js/935f2afb.1b60b723.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"generalSidebar":[{"type":"link","label":"Overview","href":"/documentation/docs/general/","docId":"general/general"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deployment Guide","href":"/documentation/docs/general/guides/deployment/","docId":"general/guides/deployment/deployment"},{"type":"link","label":"Election Creation Guide","href":"/documentation/docs/general/guides/election-creation/","docId":"general/guides/election-creation/election-creation"},{"type":"link","label":"Parent and Children Elections Guide","href":"/documentation/docs/general/guides/parent-and-children-elections/","docId":"general/guides/parent-and-children-elections/parent-and-children-elections"},{"type":"link","label":"Write-ins Guide","href":"/documentation/docs/general/guides/write-ins/","docId":"general/guides/write-ins/write-ins"},{"type":"link","label":"Messaging Voters Guide","href":"/documentation/docs/general/guides/messaging-voters/","docId":"general/guides/messaging-voters/messaging-voters"},{"type":"link","label":"OpenId Connect Auth Guide","href":"/documentation/docs/general/guides/openid-auth/","docId":"general/guides/openid-auth/openid-auth"},{"type":"link","label":"SmartLink Auth Guide","href":"/documentation/docs/general/guides/smart-link-auth/","docId":"general/guides/smart-link-auth/smart-link-auth"},{"type":"link","label":"Electoral Board Ceremonies","href":"/documentation/docs/general/guides/electoral-board-ceremonies/","docId":"general/guides/electoral-board-ceremonies/electoral-board-ceremonies"},{"type":"link","label":"Segmented Mixing Guide","href":"/documentation/docs/general/guides/segmented-mixing/","docId":"general/guides/segmented-mixing/segmented-mixing"},{"type":"link","label":"Cron Tasks Guide","href":"/documentation/docs/general/guides/cron-tasks/","docId":"general/guides/cron-tasks/cron-tasks"},{"type":"link","label":"Scheduled Events Guide","href":"/documentation/docs/general/guides/scheduled-events/","docId":"general/guides/scheduled-events/scheduled-events"}],"href":"/documentation/docs/general/guides/"},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Browsers and Cookies","href":"/documentation/docs/general/concepts/browsers-and-cookies/","docId":"general/concepts/browsers-and-cookies/browsers-and-cookies"}],"href":"/documentation/docs/general/concepts/"},{"type":"category","label":"Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Election Creation JSON","href":"/documentation/docs/general/reference/election-creation-json","docId":"general/reference/election-creation-json"},{"type":"link","label":"Ballot Encoding","href":"/documentation/docs/general/reference/ballot-encoding","docId":"general/reference/ballot-encoding"},{"type":"link","label":"E2E Election Testing","href":"/documentation/docs/general/reference/testing/","docId":"general/reference/testing/testing"},{"type":"link","label":"Architecture Overview","href":"/documentation/docs/general/reference/arch-overview/","docId":"general/reference/arch-overview/arch-overview"},{"type":"link","label":"Cryptographic Protocol Overview","href":"/documentation/docs/general/reference/crypto-protocol/","docId":"general/reference/crypto-protocol/crypto-protocol"},{"type":"link","label":"Live Preview","href":"/documentation/docs/general/reference/live-preview","docId":"general/reference/live-preview"},{"type":"link","label":"User Permissions","href":"/documentation/docs/general/reference/user-permissions","docId":"general/reference/user-permissions"}],"href":"/documentation/docs/general/reference/"},{"type":"category","label":"Contribute","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contribution Guide","href":"/documentation/docs/general/contribute/contribute-guide","docId":"general/contribute/contribute-guide"},{"type":"link","label":"Release lifecycle and cadence","href":"/documentation/docs/general/contribute/release-lifecycle","docId":"general/contribute/release-lifecycle"},{"type":"link","label":"Release How-to","href":"/documentation/docs/general/contribute/release-howto","docId":"general/contribute/release-howto"},{"type":"link","label":"Translation Guide","href":"/documentation/docs/general/contribute/translation/","docId":"general/contribute/translation/translation"},{"type":"link","label":"Production Readiness Checklist","href":"/documentation/docs/general/contribute/production-readiness","docId":"general/contribute/production-readiness"},{"type":"link","label":"Accessibility Guide","href":"/documentation/docs/general/contribute/accessibility-guide","docId":"general/contribute/accessibility-guide"}],"href":"/documentation/docs/general/contribute/"}]},"docs":{"general/concepts/browsers-and-cookies/browsers-and-cookies":{"id":"general/concepts/browsers-and-cookies/browsers-and-cookies","title":"Supported Browsers and Cookies","description":"1. Supported browsers","sidebar":"generalSidebar"},"general/concepts/concepts":{"id":"general/concepts/concepts","title":"Concepts","description":"The following concept guides are available:","sidebar":"generalSidebar"},"general/contribute/accessibility-guide":{"id":"general/contribute/accessibility-guide","title":"Accessibility Guide","description":"In this guide we explain the checks we perform to ensure our software complies with standard","sidebar":"generalSidebar"},"general/contribute/contribute":{"id":"general/contribute/contribute","title":"Contribute","description":"We are glad you are interested in contributing to the Sequent Tech project. Our","sidebar":"generalSidebar"},"general/contribute/contribute-guide":{"id":"general/contribute/contribute-guide","title":"Contribution Guide","description":"Introduction","sidebar":"generalSidebar"},"general/contribute/production-readiness":{"id":"general/contribute/production-readiness","title":"Production Readiness Checklist","description":"Introduction","sidebar":"generalSidebar"},"general/contribute/release-howto":{"id":"general/contribute/release-howto","title":"Release How-to","description":"In this how-to we will explain how can a new release be published step by step.","sidebar":"generalSidebar"},"general/contribute/release-lifecycle":{"id":"general/contribute/release-lifecycle","title":"Release lifecycle and cadence","description":"New releases of Sequent Platform are published on a regular cadence. Support for","sidebar":"generalSidebar"},"general/contribute/translation/translation":{"id":"general/contribute/translation/translation","title":"Translation Guide","description":"This document describes how to translate the Sequent Tech project to a new","sidebar":"generalSidebar"},"general/general":{"id":"general/general","title":"Overview","description":"Sequent Voting Platform provides an open source and end-to-end verifiable voting platform that allows you to run secure online elections.","sidebar":"generalSidebar"},"general/guides/cron-tasks/cron-tasks":{"id":"general/guides/cron-tasks/cron-tasks","title":"Cron Tasks Guide","description":"Using config.yml from deployment-tool, you can configure the system to schedule jobs using Cron. This can be useful to perform election tasks such as:","sidebar":"generalSidebar"},"general/guides/deployment/deployment":{"id":"general/guides/deployment/deployment","title":"Deployment Guide","description":"This document describes the complete deployment of an Sequent Tech project","sidebar":"generalSidebar"},"general/guides/election-creation/election-creation":{"id":"general/guides/election-creation/election-creation","title":"Election Creation Guide","description":"In the Admin interface, given enough permissions you can create new","sidebar":"generalSidebar"},"general/guides/electoral-board-ceremonies/electoral-board-ceremonies":{"id":"general/guides/electoral-board-ceremonies/electoral-board-ceremonies","title":"Electoral Board Ceremonies","description":"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:","sidebar":"generalSidebar"},"general/guides/guides":{"id":"general/guides/guides","title":"Guides","description":"The following guides are available:","sidebar":"generalSidebar"},"general/guides/messaging-voters/messaging-voters":{"id":"general/guides/messaging-voters/messaging-voters","title":"Messaging Voters Guide","description":"You can send custom messages to voters at any time during the electoral process. These","sidebar":"generalSidebar"},"general/guides/openid-auth/openid-auth":{"id":"general/guides/openid-auth/openid-auth","title":"OpenId Connect Auth Guide","description":"Introduction","sidebar":"generalSidebar"},"general/guides/parent-and-children-elections/parent-and-children-elections":{"id":"general/guides/parent-and-children-elections/parent-and-children-elections","title":"Parent and Children Elections Guide","description":"In this document we will review how to create parent and children elections","sidebar":"generalSidebar"},"general/guides/scheduled-events/scheduled-events":{"id":"general/guides/scheduled-events/scheduled-events","title":"Scheduled Events Guide","description":"You can automate events such as the start and the stop date time of an election","sidebar":"generalSidebar"},"general/guides/segmented-mixing/segmented-mixing":{"id":"general/guides/segmented-mixing/segmented-mixing","title":"Segmented Mixing Guide","description":"Introduction and rationale","sidebar":"generalSidebar"},"general/guides/smart-link-auth/smart-link-auth":{"id":"general/guides/smart-link-auth/smart-link-auth","title":"SmartLink Auth Guide","description":"Introduction","sidebar":"generalSidebar"},"general/guides/write-ins/write-ins":{"id":"general/guides/write-ins/write-ins","title":"Write-ins Guide","description":"Introduction","sidebar":"generalSidebar"},"general/reference/arch-overview/arch-overview":{"id":"general/reference/arch-overview/arch-overview","title":"Architecture Overview","description":"Access the Architecture Overview here.","sidebar":"generalSidebar"},"general/reference/ballot-encoding":{"id":"general/reference/ballot-encoding","title":"Ballot Encoding","description":"Introduction","sidebar":"generalSidebar"},"general/reference/crypto-protocol/crypto-protocol":{"id":"general/reference/crypto-protocol/crypto-protocol","title":"Cryptographic Protocol Overview","description":"Access the Cryptographic Protocol Overview here.","sidebar":"generalSidebar"},"general/reference/election-creation-json":{"id":"general/reference/election-creation-json","title":"Election Creation JSON","description":"Election JSON settings","sidebar":"generalSidebar"},"general/reference/live-preview":{"id":"general/reference/live-preview","title":"Live Preview","description":"The Live Preview feature allows admin users to see the voting booth before","sidebar":"generalSidebar"},"general/reference/reference":{"id":"general/reference/reference","title":"Reference","description":"Reference guides contain technical reference for APIs and file formats of","sidebar":"generalSidebar"},"general/reference/testing/testing":{"id":"general/reference/testing/testing","title":"E2E Election Testing","description":"Sequent platform contains a set of E2E (End-to-End) Integration Tests that test","sidebar":"generalSidebar"},"general/reference/user-permissions":{"id":"general/reference/user-permissions","title":"User Permissions","description":"Users of the admin portal can have fine grained-permissions. Different actions and","sidebar":"generalSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.db6552d7.js b/assets/js/935f2afb.db6552d7.js new file mode 100644 index 00000000..f05fa4e4 --- /dev/null +++ b/assets/js/935f2afb.db6552d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"generalSidebar":[{"type":"link","label":"Overview","href":"/documentation/docs/general/","docId":"general/general"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deployment Guide","href":"/documentation/docs/general/guides/deployment/","docId":"general/guides/deployment/deployment"},{"type":"link","label":"Election Creation Guide","href":"/documentation/docs/general/guides/election-creation/","docId":"general/guides/election-creation/election-creation"},{"type":"link","label":"Parent and Children Elections Guide","href":"/documentation/docs/general/guides/parent-and-children-elections/","docId":"general/guides/parent-and-children-elections/parent-and-children-elections"},{"type":"link","label":"Write-ins Guide","href":"/documentation/docs/general/guides/write-ins/","docId":"general/guides/write-ins/write-ins"},{"type":"link","label":"Messaging Voters Guide","href":"/documentation/docs/general/guides/messaging-voters/","docId":"general/guides/messaging-voters/messaging-voters"},{"type":"link","label":"OpenId Connect Auth Guide","href":"/documentation/docs/general/guides/openid-auth/","docId":"general/guides/openid-auth/openid-auth"},{"type":"link","label":"SmartLink Auth Guide","href":"/documentation/docs/general/guides/smart-link-auth/","docId":"general/guides/smart-link-auth/smart-link-auth"},{"type":"link","label":"Electoral Board Ceremonies","href":"/documentation/docs/general/guides/electoral-board-ceremonies/","docId":"general/guides/electoral-board-ceremonies/electoral-board-ceremonies"},{"type":"link","label":"Cron Tasks Guide","href":"/documentation/docs/general/guides/cron-tasks/","docId":"general/guides/cron-tasks/cron-tasks"},{"type":"link","label":"Scheduled Events Guide","href":"/documentation/docs/general/guides/scheduled-events/","docId":"general/guides/scheduled-events/scheduled-events"}],"href":"/documentation/docs/general/guides/"},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Browsers and Cookies","href":"/documentation/docs/general/concepts/browsers-and-cookies/","docId":"general/concepts/browsers-and-cookies/browsers-and-cookies"}],"href":"/documentation/docs/general/concepts/"},{"type":"category","label":"Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Election Creation JSON","href":"/documentation/docs/general/reference/election-creation-json","docId":"general/reference/election-creation-json"},{"type":"link","label":"Ballot Encoding","href":"/documentation/docs/general/reference/ballot-encoding","docId":"general/reference/ballot-encoding"},{"type":"link","label":"E2E Election Testing","href":"/documentation/docs/general/reference/testing/","docId":"general/reference/testing/testing"},{"type":"link","label":"Architecture Overview","href":"/documentation/docs/general/reference/arch-overview/","docId":"general/reference/arch-overview/arch-overview"},{"type":"link","label":"Cryptographic Protocol Overview","href":"/documentation/docs/general/reference/crypto-protocol/","docId":"general/reference/crypto-protocol/crypto-protocol"},{"type":"link","label":"Live Preview","href":"/documentation/docs/general/reference/live-preview","docId":"general/reference/live-preview"},{"type":"link","label":"User Permissions","href":"/documentation/docs/general/reference/user-permissions","docId":"general/reference/user-permissions"}],"href":"/documentation/docs/general/reference/"},{"type":"category","label":"Contribute","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contribution Guide","href":"/documentation/docs/general/contribute/contribute-guide","docId":"general/contribute/contribute-guide"},{"type":"link","label":"Release lifecycle and cadence","href":"/documentation/docs/general/contribute/release-lifecycle","docId":"general/contribute/release-lifecycle"},{"type":"link","label":"Release How-to","href":"/documentation/docs/general/contribute/release-howto","docId":"general/contribute/release-howto"},{"type":"link","label":"Translation Guide","href":"/documentation/docs/general/contribute/translation/","docId":"general/contribute/translation/translation"},{"type":"link","label":"Production Readiness Checklist","href":"/documentation/docs/general/contribute/production-readiness","docId":"general/contribute/production-readiness"},{"type":"link","label":"Accessibility Guide","href":"/documentation/docs/general/contribute/accessibility-guide","docId":"general/contribute/accessibility-guide"}],"href":"/documentation/docs/general/contribute/"}]},"docs":{"general/concepts/browsers-and-cookies/browsers-and-cookies":{"id":"general/concepts/browsers-and-cookies/browsers-and-cookies","title":"Supported Browsers and Cookies","description":"1. Supported browsers","sidebar":"generalSidebar"},"general/concepts/concepts":{"id":"general/concepts/concepts","title":"Concepts","description":"The following concept guides are available:","sidebar":"generalSidebar"},"general/contribute/accessibility-guide":{"id":"general/contribute/accessibility-guide","title":"Accessibility Guide","description":"In this guide we explain the checks we perform to ensure our software complies with standard","sidebar":"generalSidebar"},"general/contribute/contribute":{"id":"general/contribute/contribute","title":"Contribute","description":"We are glad you are interested in contributing to the Sequent Tech project. Our","sidebar":"generalSidebar"},"general/contribute/contribute-guide":{"id":"general/contribute/contribute-guide","title":"Contribution Guide","description":"Introduction","sidebar":"generalSidebar"},"general/contribute/production-readiness":{"id":"general/contribute/production-readiness","title":"Production Readiness Checklist","description":"Introduction","sidebar":"generalSidebar"},"general/contribute/release-howto":{"id":"general/contribute/release-howto","title":"Release How-to","description":"In this how-to we will explain how can a new release be published step by step.","sidebar":"generalSidebar"},"general/contribute/release-lifecycle":{"id":"general/contribute/release-lifecycle","title":"Release lifecycle and cadence","description":"New releases of Sequent Platform are published on a regular cadence. Support for","sidebar":"generalSidebar"},"general/contribute/translation/translation":{"id":"general/contribute/translation/translation","title":"Translation Guide","description":"This document describes how to translate the Sequent Tech project to a new","sidebar":"generalSidebar"},"general/general":{"id":"general/general","title":"Overview","description":"Sequent Voting Platform provides an open source and end-to-end verifiable voting platform that allows you to run secure online elections.","sidebar":"generalSidebar"},"general/guides/cron-tasks/cron-tasks":{"id":"general/guides/cron-tasks/cron-tasks","title":"Cron Tasks Guide","description":"Using config.yml from deployment-tool, you can configure the system to schedule jobs using Cron. This can be useful to perform election tasks such as:","sidebar":"generalSidebar"},"general/guides/deployment/deployment":{"id":"general/guides/deployment/deployment","title":"Deployment Guide","description":"This document describes the complete deployment of an Sequent Tech project","sidebar":"generalSidebar"},"general/guides/election-creation/election-creation":{"id":"general/guides/election-creation/election-creation","title":"Election Creation Guide","description":"In the Admin interface, given enough permissions you can create new","sidebar":"generalSidebar"},"general/guides/electoral-board-ceremonies/electoral-board-ceremonies":{"id":"general/guides/electoral-board-ceremonies/electoral-board-ceremonies","title":"Electoral Board Ceremonies","description":"The objective of the Electoral Board Ceremonies is to ensure that the private keys of an electoral process are exclusively on the hands of their custodians while the voting is open. This is implemented in the following ceremonies:","sidebar":"generalSidebar"},"general/guides/guides":{"id":"general/guides/guides","title":"Guides","description":"The following guides are available:","sidebar":"generalSidebar"},"general/guides/messaging-voters/messaging-voters":{"id":"general/guides/messaging-voters/messaging-voters","title":"Messaging Voters Guide","description":"You can send custom messages to voters at any time during the electoral process. These","sidebar":"generalSidebar"},"general/guides/openid-auth/openid-auth":{"id":"general/guides/openid-auth/openid-auth","title":"OpenId Connect Auth Guide","description":"Introduction","sidebar":"generalSidebar"},"general/guides/parent-and-children-elections/parent-and-children-elections":{"id":"general/guides/parent-and-children-elections/parent-and-children-elections","title":"Parent and Children Elections Guide","description":"In this document we will review how to create parent and children elections","sidebar":"generalSidebar"},"general/guides/scheduled-events/scheduled-events":{"id":"general/guides/scheduled-events/scheduled-events","title":"Scheduled Events Guide","description":"You can automate events such as the start and the stop date time of an election","sidebar":"generalSidebar"},"general/guides/smart-link-auth/smart-link-auth":{"id":"general/guides/smart-link-auth/smart-link-auth","title":"SmartLink Auth Guide","description":"Introduction","sidebar":"generalSidebar"},"general/guides/write-ins/write-ins":{"id":"general/guides/write-ins/write-ins","title":"Write-ins Guide","description":"Introduction","sidebar":"generalSidebar"},"general/reference/arch-overview/arch-overview":{"id":"general/reference/arch-overview/arch-overview","title":"Architecture Overview","description":"Access the Architecture Overview here.","sidebar":"generalSidebar"},"general/reference/ballot-encoding":{"id":"general/reference/ballot-encoding","title":"Ballot Encoding","description":"Introduction","sidebar":"generalSidebar"},"general/reference/crypto-protocol/crypto-protocol":{"id":"general/reference/crypto-protocol/crypto-protocol","title":"Cryptographic Protocol Overview","description":"Access the Cryptographic Protocol Overview here.","sidebar":"generalSidebar"},"general/reference/election-creation-json":{"id":"general/reference/election-creation-json","title":"Election Creation JSON","description":"Election JSON settings","sidebar":"generalSidebar"},"general/reference/live-preview":{"id":"general/reference/live-preview","title":"Live Preview","description":"The Live Preview feature allows admin users to see the voting booth before","sidebar":"generalSidebar"},"general/reference/reference":{"id":"general/reference/reference","title":"Reference","description":"Reference guides contain technical reference for APIs and file formats of","sidebar":"generalSidebar"},"general/reference/testing/testing":{"id":"general/reference/testing/testing","title":"E2E Election Testing","description":"Sequent platform contains a set of E2E (End-to-End) Integration Tests that test","sidebar":"generalSidebar"},"general/reference/user-permissions":{"id":"general/reference/user-permissions","title":"User Permissions","description":"Users of the admin portal can have fine grained-permissions. Different actions and","sidebar":"generalSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/fabccbb4.26adbf49.js b/assets/js/fabccbb4.26adbf49.js deleted file mode 100644 index 6e1cdc63..00000000 --- a/assets/js/fabccbb4.26adbf49.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[167],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>m});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=r.createContext({}),c=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),p=c(n),m=i,g=p["".concat(u,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(g,l(l({ref:t},s),{},{components:n})):r.createElement(g,l({ref:t},s))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,l=new Array(a);l[0]=p;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:i,l[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=n(3117),i=(n(7294),n(3905));const a={sidebar_position:1,title:"Guides"},l=void 0,o={unversionedId:"general/guides/guides",id:"general/guides/guides",title:"Guides",description:"The following guides are available:",source:"@site/docs/general/guides/guides.md",sourceDirName:"general/guides",slug:"/general/guides/",permalink:"/documentation/docs/general/guides/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/guides.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Guides"},sidebar:"generalSidebar",previous:{title:"Overview",permalink:"/documentation/docs/general/"},next:{title:"Deployment Guide",permalink:"/documentation/docs/general/guides/deployment/"}},u={},c=[{value:"General guides",id:"general-guides",level:2},{value:"Election Configuration",id:"election-configuration",level:2},{value:"Authentication",id:"authentication",level:2}],s={toc:c};function d(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"The following guides are available:"),(0,i.kt)("h2",{id:"general-guides"},"General guides"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./deployment/"},"Deployment Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./messaging-voters/"},"Messaging Voters Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./electoral-board-ceremonies/"},"Electoral Board Ceremonies")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./cron-tasks/"},"Cron Tasks Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./scheduled-events/"},"Scheduled Events Guide"))),(0,i.kt)("h2",{id:"election-configuration"},"Election Configuration"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./election-creation/"},"Election Creation Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./parent-and-children-elections/"},"Parent and Children Elections Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./write-ins/"},"Write-ins Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./segmented-mixing/"},"Segmented Mixing Guide"))),(0,i.kt)("h2",{id:"authentication"},"Authentication"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./smart-link-auth/"},"SmartLink Auth Guide")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"./openid-auth"},"OpenID Connect Auth Guide"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fabccbb4.b023733c.js b/assets/js/fabccbb4.b023733c.js new file mode 100644 index 00000000..31d83876 --- /dev/null +++ b/assets/js/fabccbb4.b023733c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[167],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),p=s(r),m=a,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(f,l(l({ref:t},c),{},{components:r})):n.createElement(f,l({ref:t},c))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,l=new Array(i);l[0]=p;var o={};for(var u in t)hasOwnProperty.call(t,u)&&(o[u]=t[u]);o.originalType=e,o.mdxType="string"==typeof e?e:a,l[1]=o;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var n=r(3117),a=(r(7294),r(3905));const i={sidebar_position:1,title:"Guides"},l=void 0,o={unversionedId:"general/guides/guides",id:"general/guides/guides",title:"Guides",description:"The following guides are available:",source:"@site/docs/general/guides/guides.md",sourceDirName:"general/guides",slug:"/general/guides/",permalink:"/documentation/docs/general/guides/",draft:!1,editUrl:"https://github.com/sequentech/documentation/edit/master/docs/general/guides/guides.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,title:"Guides"},sidebar:"generalSidebar",previous:{title:"Overview",permalink:"/documentation/docs/general/"},next:{title:"Deployment Guide",permalink:"/documentation/docs/general/guides/deployment/"}},u={},s=[{value:"General guides",id:"general-guides",level:2},{value:"Election Configuration",id:"election-configuration",level:2}],c={toc:s};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The following guides are available:"),(0,a.kt)("h2",{id:"general-guides"},"General guides"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./deployment/"},"Deployment Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./messaging-voters/"},"Messaging Voters Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./electoral-board-ceremonies/"},"Electoral Board Ceremonies")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./cron-tasks/"},"Cron Tasks Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./scheduled-events/"},"Scheduled Events Guide"))),(0,a.kt)("h2",{id:"election-configuration"},"Election Configuration"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./election-creation/"},"Election Creation Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./parent-and-children-elections/"},"Parent and Children Elections Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./write-ins/"},"Write-ins Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./smart-link-auth/"},"SmartLink Auth Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./messaging-voters/"},"Messaging Voters Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./electoral-board-ceremonies/"},"Electoral Board Ceremonies")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./cron-tasks/"},"Cron Tasks Guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"./scheduled-events/"},"Scheduled Events Guide"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.47092304.js b/assets/js/main.47092304.js new file mode 100644 index 00000000..35872014 --- /dev/null +++ b/assets/js/main.47092304.js @@ -0,0 +1,2 @@ +/*! For license information please see main.47092304.js.LICENSE.txt */ +(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(3117),o=n(8356),i=n.n(o),l=n(6887);const s={"01a21e46":[()=>n.e(734).then(n.bind(n,1608)),"@site/docs/general/reference/election-creation-json.md",1608],"05c8f890":[()=>n.e(12).then(n.bind(n,4130)),"@site/docs/general/guides/parent-and-children-elections/parent-and-children-elections.md",4130],"0625183e":[()=>n.e(235).then(n.bind(n,4085)),"@site/docs/general/concepts/concepts.md",4085],"0b3ceb4d":[()=>n.e(71).then(n.t.bind(n,3769,19)),"/home/runner/work/documentation/documentation/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],17896441:[()=>Promise.all([n.e(532),n.e(918)]).then(n.bind(n,7565)),"@theme/DocItem",7565],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"23a11323":[()=>n.e(718).then(n.bind(n,6765)),"@site/docs/general/reference/user-permissions.md",6765],"2e1538af":[()=>n.e(936).then(n.bind(n,1667)),"@site/docs/general/contribute/translation/translation.md",1667],"2fd28e10":[()=>n.e(525).then(n.bind(n,5349)),"@site/docs/general/contribute/contribute-guide.md",5349],33620517:[()=>n.e(881).then(n.bind(n,8636)),"@site/docs/general/guides/openid-auth/openid-auth.md",8636],"3b08ac1e":[()=>n.e(275).then(n.bind(n,849)),"@site/docs/general/guides/smart-link-auth/smart-link-auth.md",849],"4d15e7b5":[()=>n.e(817).then(n.bind(n,2726)),"@site/docs/general/reference/live-preview.md",2726],"5cf8a89a":[()=>n.e(399).then(n.bind(n,8991)),"@site/docs/general/general.md",8991],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"634bfd16":[()=>n.e(242).then(n.bind(n,3457)),"@site/docs/general/contribute/release-howto.md",3457],"65652c81":[()=>n.e(78).then(n.bind(n,3250)),"@site/docs/general/contribute/accessibility-guide.md",3250],"69e529bf":[()=>n.e(998).then(n.bind(n,5605)),"@site/docs/general/contribute/release-lifecycle.md",5605],"6c2740d8":[()=>n.e(906).then(n.bind(n,6990)),"@site/docs/general/reference/testing/testing.md",6990],"6f4bb3a9":[()=>n.e(679).then(n.bind(n,5276)),"@site/docs/general/contribute/production-readiness.md",5276],"75b89fca":[()=>n.e(300).then(n.bind(n,727)),"@site/docs/general/reference/ballot-encoding.md",727],"76632ef8":[()=>n.e(74).then(n.bind(n,5998)),"@site/docs/general/concepts/browsers-and-cookies/browsers-and-cookies.md",5998],"8365fa17":[()=>n.e(101).then(n.bind(n,4356)),"@site/docs/general/reference/reference.md",4356],"8556e182":[()=>n.e(517).then(n.bind(n,6526)),"@site/docs/general/guides/deployment/deployment.md",6526],"87f5572b":[()=>n.e(311).then(n.bind(n,461)),"@site/docs/general/guides/cron-tasks/cron-tasks.md",461],"93188ff0":[()=>n.e(163).then(n.bind(n,7282)),"@site/docs/general/guides/electoral-board-ceremonies/electoral-board-ceremonies.md",7282],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],a193a73b:[()=>n.e(800).then(n.t.bind(n,5745,19)),"/home/runner/work/documentation/documentation/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a3b886f9:[()=>n.e(862).then(n.bind(n,173)),"@site/docs/general/reference/crypto-protocol/crypto-protocol.md",173],a3e0ebcb:[()=>n.e(947).then(n.bind(n,6848)),"@site/docs/general/contribute/contribute.md",6848],b4331617:[()=>n.e(278).then(n.bind(n,3669)),"@site/docs/general/guides/write-ins/write-ins.md",3669],c1452536:[()=>n.e(89).then(n.bind(n,9028)),"@site/docs/general/guides/scheduled-events/scheduled-events.md",9028],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(195)]).then(n.bind(n,5239)),"@site/src/pages/index.js",5239],d6a5b80c:[()=>n.e(732).then(n.bind(n,7901)),"@site/docs/general/guides/election-creation/election-creation.md",7901],eb8eacb1:[()=>n.e(721).then(n.bind(n,5838)),"@site/docs/general/guides/messaging-voters/messaging-voters.md",5838],fabccbb4:[()=>n.e(167).then(n.bind(n,6799)),"@site/docs/general/guides/guides.md",6799],ff9161bd:[()=>n.e(728).then(n.bind(n,8667)),"@site/docs/general/reference/arch-overview/arch-overview.md",8667]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[e+"-"+t],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/documentation/docs",component:f("/documentation/docs","9b4"),routes:[{path:"/documentation/docs/general/",component:f("/documentation/docs/general/","078"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/concepts/",component:f("/documentation/docs/general/concepts/","340"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/concepts/browsers-and-cookies/",component:f("/documentation/docs/general/concepts/browsers-and-cookies/","3e7"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/",component:f("/documentation/docs/general/contribute/","235"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/accessibility-guide",component:f("/documentation/docs/general/contribute/accessibility-guide","da2"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/contribute-guide",component:f("/documentation/docs/general/contribute/contribute-guide","b81"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/production-readiness",component:f("/documentation/docs/general/contribute/production-readiness","f3a"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/release-howto",component:f("/documentation/docs/general/contribute/release-howto","a78"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/release-lifecycle",component:f("/documentation/docs/general/contribute/release-lifecycle","dd4"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/contribute/translation/",component:f("/documentation/docs/general/contribute/translation/","905"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/",component:f("/documentation/docs/general/guides/","661"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/cron-tasks/",component:f("/documentation/docs/general/guides/cron-tasks/","d7a"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/deployment/",component:f("/documentation/docs/general/guides/deployment/","ce2"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/election-creation/",component:f("/documentation/docs/general/guides/election-creation/","a23"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/electoral-board-ceremonies/",component:f("/documentation/docs/general/guides/electoral-board-ceremonies/","35d"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/messaging-voters/",component:f("/documentation/docs/general/guides/messaging-voters/","75d"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/openid-auth/",component:f("/documentation/docs/general/guides/openid-auth/","1df"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/parent-and-children-elections/",component:f("/documentation/docs/general/guides/parent-and-children-elections/","cb6"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/scheduled-events/",component:f("/documentation/docs/general/guides/scheduled-events/","51c"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/smart-link-auth/",component:f("/documentation/docs/general/guides/smart-link-auth/","ae1"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/guides/write-ins/",component:f("/documentation/docs/general/guides/write-ins/","446"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/",component:f("/documentation/docs/general/reference/","984"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/arch-overview/",component:f("/documentation/docs/general/reference/arch-overview/","887"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/ballot-encoding",component:f("/documentation/docs/general/reference/ballot-encoding","5ae"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/crypto-protocol/",component:f("/documentation/docs/general/reference/crypto-protocol/","82c"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/election-creation-json",component:f("/documentation/docs/general/reference/election-creation-json","f6e"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/live-preview",component:f("/documentation/docs/general/reference/live-preview","cf8"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/testing/",component:f("/documentation/docs/general/reference/testing/","e9b"),exact:!0,sidebar:"generalSidebar"},{path:"/documentation/docs/general/reference/user-permissions",component:f("/documentation/docs/general/reference/user-permissions","d1d"),exact:!0,sidebar:"generalSidebar"}]},{path:"/documentation/",component:f("/documentation/","56d"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6775),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(3117),m=n(5742),g=n(2263),h=n(4996),b=n(6668),v=n(1944),y=n(4711),w=n(9727),k=n(3320),S=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,c.TH)();return e+(0,h.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(E,null),r.createElement(S.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const _=new Map;function T(e){if(_.has(e.pathname))return{...e,pathname:_.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return _.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const R=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=(0,d.f)(u.Z,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(R,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const D=O,I="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+I+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:I}))}function j(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function U(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,g.Z)(),o=(0,h.Z)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var $=n(4763);function q(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement($.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(C,null),r.createElement(j,null),r.createElement(D,{location:T(t)},e)))))}var H=n(6887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,a;if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Z=n(9670);const V=new Set,W=new Set,Y=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch(e){if(!(e=>!Y()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!W.has(e))(e)&&(W.add(e),P(e))},Q=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/documentation/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/documentation/docs","mainDocId":"general/general","docs":[{"id":"general/concepts/browsers-and-cookies/browsers-and-cookies","path":"/documentation/docs/general/concepts/browsers-and-cookies/","sidebar":"generalSidebar"},{"id":"general/concepts/concepts","path":"/documentation/docs/general/concepts/","sidebar":"generalSidebar"},{"id":"general/contribute/accessibility-guide","path":"/documentation/docs/general/contribute/accessibility-guide","sidebar":"generalSidebar"},{"id":"general/contribute/contribute","path":"/documentation/docs/general/contribute/","sidebar":"generalSidebar"},{"id":"general/contribute/contribute-guide","path":"/documentation/docs/general/contribute/contribute-guide","sidebar":"generalSidebar"},{"id":"general/contribute/production-readiness","path":"/documentation/docs/general/contribute/production-readiness","sidebar":"generalSidebar"},{"id":"general/contribute/release-howto","path":"/documentation/docs/general/contribute/release-howto","sidebar":"generalSidebar"},{"id":"general/contribute/release-lifecycle","path":"/documentation/docs/general/contribute/release-lifecycle","sidebar":"generalSidebar"},{"id":"general/contribute/translation/translation","path":"/documentation/docs/general/contribute/translation/","sidebar":"generalSidebar"},{"id":"general/general","path":"/documentation/docs/general/","sidebar":"generalSidebar"},{"id":"general/guides/cron-tasks/cron-tasks","path":"/documentation/docs/general/guides/cron-tasks/","sidebar":"generalSidebar"},{"id":"general/guides/deployment/deployment","path":"/documentation/docs/general/guides/deployment/","sidebar":"generalSidebar"},{"id":"general/guides/election-creation/election-creation","path":"/documentation/docs/general/guides/election-creation/","sidebar":"generalSidebar"},{"id":"general/guides/electoral-board-ceremonies/electoral-board-ceremonies","path":"/documentation/docs/general/guides/electoral-board-ceremonies/","sidebar":"generalSidebar"},{"id":"general/guides/guides","path":"/documentation/docs/general/guides/","sidebar":"generalSidebar"},{"id":"general/guides/messaging-voters/messaging-voters","path":"/documentation/docs/general/guides/messaging-voters/","sidebar":"generalSidebar"},{"id":"general/guides/openid-auth/openid-auth","path":"/documentation/docs/general/guides/openid-auth/","sidebar":"generalSidebar"},{"id":"general/guides/parent-and-children-elections/parent-and-children-elections","path":"/documentation/docs/general/guides/parent-and-children-elections/","sidebar":"generalSidebar"},{"id":"general/guides/scheduled-events/scheduled-events","path":"/documentation/docs/general/guides/scheduled-events/","sidebar":"generalSidebar"},{"id":"general/guides/smart-link-auth/smart-link-auth","path":"/documentation/docs/general/guides/smart-link-auth/","sidebar":"generalSidebar"},{"id":"general/guides/write-ins/write-ins","path":"/documentation/docs/general/guides/write-ins/","sidebar":"generalSidebar"},{"id":"general/reference/arch-overview/arch-overview","path":"/documentation/docs/general/reference/arch-overview/","sidebar":"generalSidebar"},{"id":"general/reference/ballot-encoding","path":"/documentation/docs/general/reference/ballot-encoding","sidebar":"generalSidebar"},{"id":"general/reference/crypto-protocol/crypto-protocol","path":"/documentation/docs/general/reference/crypto-protocol/","sidebar":"generalSidebar"},{"id":"general/reference/election-creation-json","path":"/documentation/docs/general/reference/election-creation-json","sidebar":"generalSidebar"},{"id":"general/reference/live-preview","path":"/documentation/docs/general/reference/live-preview","sidebar":"generalSidebar"},{"id":"general/reference/reference","path":"/documentation/docs/general/reference/","sidebar":"generalSidebar"},{"id":"general/reference/testing/testing","path":"/documentation/docs/general/reference/testing/","sidebar":"generalSidebar"},{"id":"general/reference/user-permissions","path":"/documentation/docs/general/reference/user-permissions","sidebar":"generalSidebar"}],"draftIds":[],"sidebars":{"generalSidebar":{"link":{"path":"/documentation/docs/general/","label":"general/general"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.1","siteVersion":"master","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.1"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),a=n(412),o=n(5742),i=n(2164);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:u)(e)}return null!=e?e:null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(3117),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){var n,f;let{isNavLink:p,to:m,href:g,activeClassName:h,isActive:b,"data-noBrokenLinkCheck":v,autoAddBaseUrl:y=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:S}}=(0,l.Z)(),{withBaseUrl:E}=(0,d.C)(),x=(0,a.useContext)(c),C=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>C.current));const _=m||g;const T=(0,s.Z)(_),L=null==_?void 0:_.replace("pathname://","");let A=void 0!==L?(N=L,y&&(e=>e.startsWith("/"))(N)?E(N):N):void 0;var N;A&&T&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:S}));const R=(0,a.useRef)(!1),P=p?o.OL:o.rU,O=u.Z.canUseIntersectionObserver,D=(0,a.useRef)();(0,a.useEffect)((()=>(!O&&T&&null!=A&&window.docusaurus.prefetch(A),()=>{O&&D.current&&D.current.disconnect()})),[D,A,O,T]);const I=null!=(n=null==(f=A)?void 0:f.startsWith("#"))&&n,M=!A||!T||I;return M||v||x.collectLink(A),M?a.createElement("a",(0,r.Z)({ref:C,href:A},_&&!T&&{target:"_blank",rel:"noopener noreferrer"},w)):a.createElement(P,(0,r.Z)({},w,{onMouseEnter:()=>{R.current||null==A||(window.docusaurus.preload(A),R.current=!0)},innerRef:e=>{C.current=e,O&&e&&T&&(D.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(D.current.unobserve(e),D.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),D.current.observe(e))},to:A},p&&{isActive:b,activeClassName:h}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){var t,n;let{id:r,message:a}=e;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?r+"."+a:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6775),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},2164:(e,t,n)=>{"use strict";n.d(t,{Z:()=>rt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(5281),s=n(9727),u=n(5999),c=n(6775),d=n(5936);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,c.k6)(),n=(0,r.useCallback)((e=>{var t;e.preventDefault();const n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+l.k.wrapper.main);n&&f(n)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p,onClick:t},r.createElement(u.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var g=n(6668),h=n(9689),b=n(3117);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",k="announcementBarClose_gvF7",S="announcementBarContent_xLdY";function E(){const{isActive:e,close:t}=(0,h.nT)(),{announcementBar:n}=(0,g.L)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:S,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",k),onClick:t,"aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2961),C=n(2466);var _=n(902),T=n(3102);const L=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,T.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,_.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(L.Provider,{value:n},t)}function N(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(L);if(!e)throw new _.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,T.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:N(o)})),[a,o,t])}function P(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var O=n(2949),D=n(2389);function I(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function M(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const F={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function B(e){let{className:t,value:n,onChange:o}=e;const i=(0,D.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(F.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",F.toggleButton,!i&&F.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(I,{className:(0,a.Z)(F.toggleIcon,F.lightToggleIcon)}),r.createElement(M,{className:(0,a.Z)(F.toggleIcon,F.darkToggleIcon)})))}const z=r.memo(B);function j(e){let{className:t}=e;const n=(0,g.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,O.I)();return n?null:r.createElement(z,{className:t,value:a,onChange:o})}var U=n(1327);function $(){return r.createElement(U.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function q(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function H(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement($,null),r.createElement(j,{className:"margin-right--md"}),r.createElement(q,null))}var G=n(9960),Z=n(4996),V=n(3919);function W(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var Y=n(9471);function K(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:u,...c}=e;const d=(0,Z.Z)(a),f=(0,Z.Z)(t),p=(0,Z.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,V.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(Y.Z,s&&{width:12,height:12}))};return o?r.createElement(G.Z,(0,b.Z)({href:u?p:o},c,g)):r.createElement(G.Z,(0,b.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?W(n,t.pathname):t.pathname.startsWith(f)},c,g))}function Q(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(K,(0,b.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(K,(0,b.Z)({className:(0,a.Z)("menu__link",t)},o)))}function J(e){var t;let{mobile:n=!1,position:a,...o}=e;const i=n?X:Q;return r.createElement(i,(0,b.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var ee=n(6043),te=n(8596),ne=n(2263);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!W(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ae(e){var t;let{items:n,position:o,className:i,onClick:l,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":c})},r.createElement(K,(0,b.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),null!=(t=s.children)?t:s.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function oe(e){var t;let{items:n,className:o,position:i,onClick:l,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ne.Z)(),{pathname:t}=(0,c.TH)();return t.replace(e,"/")}(),d=re(n,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ee.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(K,(0,b.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",o)},s,{onClick:e=>{e.preventDefault(),p()}}),null!=(t=s.children)?t:s.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const a=t?oe:ae;return r.createElement(a,n)}var le=n(4711);function se(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ue="iconLanguage_nlXk";const ce=()=>null,de="searchBox_ZlJk";function fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,de)},t)}var pe=n(143),me=n(2802);var ge=n(373);const he=e=>e.docs.find((t=>t.id===e.mainDocId));const be={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.Z)(),c=(0,le.l)(),d=[...n,...l.map((e=>{const n="pathname://"+c.createUrl({locale:e,fullyQualified:!1});return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],f=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,b.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ue}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(fe,{className:n},r.createElement(ce,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.vY)(t,a);return null===l?null:r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.oz)(t,a).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,me.lO)(a)[0],l=null!=t?t:i.label,s=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,b.Z)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,pe.Iw)(n),c=(0,pe.gB)(n),{savePreferredVersionName:d}=(0,ge.J)(n),f=[...o,...c.map((e=>{var t;const n=null!=(t=s.alternateDocVersions[e.name])?t:he(e);return{label:e.label,to:n.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,me.lO)(n)[0],m=t&&f.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,g=t&&f.length>1?void 0:he(p).path;return f.length<=1?r.createElement(J,(0,b.Z)({},l,{mobile:t,label:m,to:g,isActive:a?()=>!1:void 0})):r.createElement(ie,(0,b.Z)({},l,{mobile:t,label:m,to:g,items:f,isActive:a?()=>!1:void 0}))}};function ve(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=be[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function ye(){const e=(0,x.e)(),t=(0,g.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(ve,(0,b.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function we(e){return r.createElement("button",(0,b.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function ke(){const e=0===(0,g.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(we,{onClick:()=>t.hide()}),t.content)}function Se(){const e=(0,x.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(P,{header:r.createElement(H,null),primaryMenu:r.createElement(ye,null),secondaryMenu:r.createElement(ke,null)}):null}const Ee="navbarHideable_m1mJ",xe="navbarHidden_jGov";function Ce(e){return r.createElement("div",(0,b.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function _e(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,g.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,C.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ee,!s&&xe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ce,{onClick:i.toggle}),r.createElement(Se,null))}function Te(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Le(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(Te,null))}const Ae="colorModeToggle_DEke";function Ne(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(ve,(0,b.Z)({},e,{key:t})))))}function Re(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Pe(){const e=(0,x.e)(),t=(0,g.L)().navbar.items,[n,a]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Re,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Le,null),r.createElement($,null),r.createElement(Ne,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Ne,{items:a}),r.createElement(j,{className:Ae}),!o&&r.createElement(fe,null,r.createElement(ce,null)))})}function Oe(){return r.createElement(_e,null,r.createElement(Pe,null))}function De(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,Z.Z)(n),u=(0,Z.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(G.Z,(0,b.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:s},l),o,a&&!(0,V.Z)(a)&&r.createElement(Y.Z,null))}function Ie(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(De,{item:n}))}function Me(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ie,{key:t,item:e})))))}function Fe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Me,{key:t,column:e}))))}function Be(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ze(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(De,{item:t})}function je(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ze,{item:e}),t.length!==n+1&&r.createElement(Be,null))))))}function Ue(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Fe,{columns:t}):r.createElement(je,{links:t})}var $e=n(941);const qe="footerLogoLink_BH7S";function He(e){var t;let{logo:n}=e;const{withBaseUrl:o}=(0,Z.C)(),i={light:o(n.src),dark:o(null!=(t=n.srcDark)?t:n.src)};return r.createElement($e.Z,{className:(0,a.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function Ge(e){let{logo:t}=e;return t.href?r.createElement(G.Z,{href:t.href,className:qe,target:t.target},r.createElement(He,{logo:t})):r.createElement(He,{logo:t})}function Ze(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ve(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function We(){const{footer:e}=(0,g.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ve,{style:o,links:n&&n.length>0&&r.createElement(Ue,{links:n}),logo:a&&r.createElement(Ge,{logo:a}),copyright:t&&r.createElement(Ze,{copyright:t})})}const Ye=r.memo(We);var Ke=n(12);const Qe="docusaurus.tab.",Xe=r.createContext(void 0);const Je=(0,_.Qc)([O.S,h.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,Ke.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,Ke._)().forEach((t=>{if(t.startsWith(Qe)){const n=t.substring(Qe.length);e[n]=(0,Ke.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(Xe.Provider,{value:n},t)},C.OC,ge.L5,i.VC,function(e){let{children:t}=e;return r.createElement(T.n2,null,r.createElement(x.M,null,r.createElement(A,null,t)))}]);function et(e){let{children:t}=e;return r.createElement(Je,null,t)}function tt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const nt="mainWrapper_z2l0";function rt(e){const{children:t,noFooter:n,wrapperClassName:u,title:c,description:d}=e;return(0,s.t)(),r.createElement(et,null,r.createElement(i.d,{title:c,description:d}),r.createElement(m,null),r.createElement(E,null),r.createElement(Oe,null),r.createElement("div",{className:(0,a.Z)(l.k.wrapper.main,nt,u)},r.createElement(o.Z,{fallback:e=>r.createElement(tt,e)},t)),!n&&r.createElement(Ye,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(3117),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:u,logo:d}}=(0,s.L)(),{imageClassName:f,titleClassName:p,...m}=e,g=(0,i.Z)((null==d?void 0:d.href)||"/"),h=u?"":n,b=null!=(t=null==d?void 0:d.alt)?t:h;return a.createElement(o.Z,(0,r.Z)({to:g},m,(null==d?void 0:d.target)&&{target:d.target}),d&&a.createElement(c,{logo:d,alt:b,imageClassName:f}),null!=u&&a.createElement("b",{className:p},u))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(3117),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s["themedImage--"+e],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(3117),a=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(null!=t&&t),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function c(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){var t,n;const a=e.scrollHeight;return{transition:"height "+(null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a))+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:a+"px"}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return u(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,a.useRef)(null);return c({collapsibleRef:f,collapsed:n,animation:o}),a.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(f.current,n),null==i||i(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.W)("docusaurus.announcement.dismiss"),u=(0,o.W)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.W)(u),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{c.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function g(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},f=(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),p=(e,t)=>{(0,u.W)(c(e),{persistence:t}).del()};const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);const n=(0,a.zh)(e),[i,l]=v(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6775),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function u(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>m,cE:()=>d,hI:()=>y,lO:()=>h,vY:()=>v,oz:()=>b,s1:()=>g});var r=n(7294),a=n(6775),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t);function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>m(e,t))))(e.items,t))}function g(){var e;const t=(0,s.V)(),{pathname:n}=(0,a.TH)();if(!1===(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const a of t)if("category"===a.type&&((0,c.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,c.Mg)(a.href,n))return r.push(a),!0;return!1}(t.items),r.reverse()}function h(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function b(e,t){const n=h(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function v(e,t){const n=h(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+u(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function y(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a,o;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(a=r.split("\n")[1])||null==(o=a.match(/at (?:\w+\.)?(?\w+)/))?void 0:o.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return"docs-"+e+"-"+t}},12:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace("/"+o+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return""+(a?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>_,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(3117);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(2177);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;void 0===(a="function"==typeof(r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=a)},7410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);E+=S.value.length,S=S.next){var x=S.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,_=1;if(v){if(!(C=o(k,E,e,b))||C.index>=e.length)break;var T=C.index,L=C.index+C[0].length,A=E;for(A+=S.value.length;T>=A;)A+=(S=S.next).value.length;if(E=A-=S.value.length,S.value instanceof a)continue;for(var N=S;N!==t.tail&&(Ad.reach&&(d.reach=D);var I=S.prev;if(P&&(I=s(t,I,P),E+=P.length),u(t,I,_),S=s(t,I,new a(f,h?r.tokenize(R,h):R,y,R)),O&&s(t,S,O),_>1){var M={cause:f+","+m,reach:D};i(e,t,n,S.prev,E,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function i(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,i),t(s.optional,i),t(s.modify,i)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var g in f={},m){var h=s[g];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in c))for(var v in p(b))if(v in c){f[b]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n