=== Test case: config_parser_SUITE:instrumentation/1 (click for source code)

=== Config value:

    [{watchdog,<0.73203.0>},
     {tc_logfile,"/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.25.23/lib.mongooseim.logs/run.2024-03-11_11.25.23/config_parser_suite.instrumentation.18051.html"},
     {tc_group_properties,[{name,instrumentation},parallel]},
     {tc_group_path,[]},
     {data_dir,"/home/circleci/project/_build/test/lib/mongooseim/test/config_parser_SUITE_data/"},
     {priv_dir,"/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.25.23/lib.mongooseim.logs/run.2024-03-11_11.25.23/log_private/"}]

=== Current directory is "/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.25.23"

=== Started at 2024-03-11 11:25:51


*** CT Error Notification 2024-03-11 11:25:51.580 ***🔗
mongoose_config_parser_toml:process failed on line 77
Reason: {{config_error,"Could not read the TOML configuration file",[...]},
 [{mongoose_config_parser_toml,...},{...}|...]}

Full error description and stacktrace



=== Ended at 2024-03-11 11:25:51
=== Location: [{mongoose_config_parser_toml,process,77},
              {config_parser_SUITE,parse,3050},
              {config_parser_SUITE,instrumentation,2931},
              {test_server,ts_tc,1793},
              {test_server,run_test_case_eval1,1302},
              {test_server,run_test_case_eval,1234}]
=== === Reason: {config_error,"Could not read the TOML configuration file",
                  [#{reason => unexpected_key,
                     text => "TOML configuration error: Malformed node",
                     stacktrace =>
                      [{mongoose_config_parser_toml,get_spec_for_key,2,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,116}]},
                       {mongoose_config_parser_toml,
                        '-parse_section/3-fun-1-',4,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,102}]},
                       {maps,map_1,3,[{file,"maps.erl"},{line,441}]},
                       {maps,map_1,3,[{file,"maps.erl"},{line,441}]},
                       {maps,map,2,[{file,"maps.erl"},{line,426}]},
                       {mongoose_config_parser_toml,parse_section,3,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,102}]},
                       {mongoose_config_parser_toml,handle_step,4,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,155}]},
                       {mongoose_config_parser_toml,try_step,5,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,264}]},
                       {lists,foldl,3,[{file,"lists.erl"},{line,1594}]},
                       {mongoose_config_parser_toml,process,1,
                        [{file,
                          "/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
                         {line,70}]},
                       {config_parser_SUITE,parse,1,
                        [{file,
                          "/home/circleci/project/test/config_parser_SUITE.erl"},
                         {line,3050}]},
                       {config_parser_SUITE,instrumentation,1,
                        [{file,
                          "/home/circleci/project/test/config_parser_SUITE.erl"},
                         {line,2931}]},
                       {test_server,ts_tc,3,
                        [{file,"test_server.erl"},{line,1793}]},
                       {test_server,run_test_case_eval1,6,
                        [{file,"test_server.erl"},{line,1302}]},
                       {test_server,run_test_case_eval,9,
                        [{file,"test_server.erl"},{line,1234}]}],
                     items =>
                      #{<<"access">> =>
                         {section,
                          #{default =>
                             {list,
                              {section,
                               #{<<"acl">> =>
                                  {option,atom,non_empty,undefined,default},
                                 <<"value">> =>
                                  {option,int_or_atom,any,undefined,default}},
                               any,all,any,map,undefined,#{},default,
                               when_present},
                              any,list,undefined,default}},
                          any,[],any,map,undefined,#{},host_config,
                          when_present},
                        <<"acl">> =>
                         {section,
                          #{default =>
                             {list,
                              {section,
                               #{<<"match">> =>
                                  {option,atom,
                                   {enum,
                                    [all,none,current_domain,
                                     any_hosted_domain]},
                                   undefined,default},
                                 <<"resource">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"resource_glob">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"resource_regexp">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"server">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"server_glob">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"server_regexp">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"user">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"user_glob">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default},
                                 <<"user_regexp">> =>
                                  {option,binary,any,
                                   fun mongoose_config_spec:process_acl_condition/1,
                                   default}},
                               any,[],any,map,undefined,
                               #{<<"match">> => current_domain},
                               default,when_present},
                              any,list,undefined,default}},
                          any,[],any,map,undefined,#{},host_config,
                          when_present},
                        <<"auth">> =>
                         {section,
                          #{<<"anonymous">> =>
                             {section,
                              #{<<"allow_multiple_connections">> =>
                                 {option,boolean,any,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,ejabberd_auth_anonymous},
                                  undefined,default},
                                <<"protocol">> =>
                                 {option,atom,
                                  {enum,[sasl_anon,login_anon,both]},
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"allow_multiple_connections">> => false,
                                <<"backend">> => mnesia,
                                <<"protocol">> => sasl_anon},
                              default,when_present},
                            <<"dummy">> =>
                             {section,
                              #{<<"base_time">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"variance">> =>
                                 {option,integer,positive,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"base_time">> => 50,<<"variance">> => 450},
                              default,when_present},
                            <<"external">> =>
                             {section,
                              #{<<"instances">> =>
                                 {option,integer,positive,undefined,default},
                                <<"program">> =>
                                 {option,string,non_empty,undefined,default}},
                              any,
                              [<<"program">>],
                              any,map,undefined,
                              #{<<"instances">> => 1},
                              default,when_present},
                            <<"http">> =>
                             {section,
                              #{<<"basic_auth">> =>
                                 {option,string,any,undefined,default}},
                              any,[],any,map,undefined,#{},default,
                              when_present},
                            <<"internal">> =>
                             {section,#{},any,[],any,map,undefined,#{},
                              default,when_present},
                            <<"jwt">> =>
                             {section,
                              #{<<"algorithm">> =>
                                 {option,binary,
                                  {enum,
                                   [<<"HS256">>,<<"RS256">>,<<"ES256">>,
                                    <<"HS386">>,<<"RS386">>,<<"ES386">>,
                                    <<"HS512">>,<<"RS512">>,<<"ES512">>]},
                                  undefined,default},
                                <<"secret">> =>
                                 {section,
                                  #{<<"env">> =>
                                     {option,string,non_empty,undefined,
                                      default},
                                    <<"file">> =>
                                     {option,string,filename,undefined,
                                      default},
                                    <<"value">> =>
                                     {option,binary,any,undefined,default}},
                                  any,[],any,list,
                                  fun ejabberd_auth_jwt:process_jwt_secret/1,
                                  #{},default,when_present},
                                <<"username_key">> =>
                                 {option,atom,non_empty,undefined,default}},
                              any,all,any,map,undefined,#{},default,
                              when_present},
                            <<"ldap">> =>
                             {section,
                              #{<<"base">> =>
                                 {option,binary,any,undefined,default},
                                <<"bind_pool_tag">> =>
                                 {option,atom,non_empty,undefined,default},
                                <<"deref">> =>
                                 {option,atom,
                                  {enum,[never,always,finding,searching]},
                                  undefined,default},
                                <<"dn_filter">> =>
                                 {section,
                                  #{<<"attributes">> =>
                                     {list,
                                      {option,binary,any,undefined,default},
                                      any,list,undefined,default},
                                    <<"filter">> =>
                                     {option,binary,ldap_filter,undefined,
                                      default}},
                                  any,
                                  [<<"filter">>],
                                  any,map,
                                  fun mongoose_ldap_config:process_dn_filter/1,
                                  #{<<"attributes">> => []},
                                  default,when_present},
                                <<"filter">> =>
                                 {option,binary,any,undefined,default},
                                <<"local_filter">> =>
                                 {section,
                                  #{<<"attribute">> =>
                                     {option,string,non_empty,undefined,
                                      default},
                                    <<"operation">> =>
                                     {option,atom,
                                      {enum,[equal,notequal]},
                                      undefined,default},
                                    <<"values">> =>
                                     {list,
                                      {option,string,any,undefined,default},
                                      non_empty,list,undefined,default}},
                                  any,all,any,map,
                                  fun mongoose_ldap_config:process_local_filter/1,
                                  #{},default,when_present},
                                <<"pool_tag">> =>
                                 {option,atom,pool_name,undefined,default},
                                <<"uids">> =>
                                 {list,
                                  {section,
                                   #{<<"attr">> =>
                                      {option,binary,any,undefined,default},
                                     <<"format">> =>
                                      {option,binary,any,undefined,default}},
                                   any,
                                   [<<"attr">>],
                                   any,map,
                                   fun mongoose_ldap_config:process_uids/1,
                                   #{},default,when_present},
                                  any,list,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"base">> => <<>>,
                                <<"bind_pool_tag">> => bind,
                                <<"deref">> => never,
                                <<"dn_filter">> => {undefined,[]},
                                <<"filter">> => <<>>,
                                <<"local_filter">> => undefined,
                                <<"pool_tag">> => default,
                                <<"uids">> => [{<<"uid">>,<<"%u">>}]},
                              default,when_present},
                            <<"max_users_per_domain">> =>
                             {option,int_or_infinity,positive,undefined,
                              default},
                            <<"methods">> =>
                             {list,
                              {option,atom,
                               {module,ejabberd_auth},
                               undefined,default},
                              any,list,undefined,default},
                            <<"password">> =>
                             {section,
                              #{<<"format">> =>
                                 {option,atom,
                                  {enum,[scram,plain]},
                                  undefined,default},
                                <<"hash">> =>
                                 {list,
                                  {option,atom,
                                   {enum,[sha,sha224,sha256,sha384,sha512]},
                                   undefined,default},
                                  unique_non_empty,list,undefined,default},
                                <<"scram_iterations">> =>
                                 {option,integer,positive,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"format">> => scram,
                                <<"scram_iterations">> => 10000},
                              default,always},
                            <<"pki">> =>
                             {section,#{},any,[],any,map,undefined,#{},
                              default,when_present},
                            <<"rdbms">> =>
                             {section,
                              #{<<"users_number_estimate">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"users_number_estimate">> => false},
                              default,when_present},
                            <<"sasl_external">> =>
                             {list,
                              {option,atom,any,
                               fun mongoose_config_spec:process_sasl_external/1,
                               default},
                              any,list,undefined,default},
                            <<"sasl_mechanisms">> =>
                             {list,
                              {option,atom,
                               {module,cyrsasl},
                               fun mongoose_config_spec:process_sasl_mechanism/1,
                               default},
                              any,list,undefined,default}},
                          any,[],any,map,
                          fun mongoose_config_spec:process_auth/1,
                          #{<<"max_users_per_domain">> => infinity,
                            <<"sasl_external">> => [standard],
                            <<"sasl_mechanisms">> =>
                             [cyrsasl_scram_sha512_plus,cyrsasl_scram_sha512,
                              cyrsasl_scram_sha384_plus,cyrsasl_scram_sha384,
                              cyrsasl_scram_sha256_plus,cyrsasl_scram_sha256,
                              cyrsasl_scram_sha224_plus,cyrsasl_scram_sha224,
                              cyrsasl_scram_sha1_plus,cyrsasl_scram_sha1,
                              cyrsasl_plain,cyrsasl_anonymous,cyrsasl_oauth]},
                          host_config,always},
                        <<"general">> =>
                         {section,
                          #{<<"all_metrics_are_global">> =>
                             {option,boolean,any,undefined,global_config},
                            <<"component_backend">> =>
                             {option,atom,
                              {module,mongoose_component},
                              undefined,global_config},
                            <<"default_server_domain">> =>
                             {option,binary,non_empty,
                              fun mongoose_config_spec:process_host/1,
                              global_config},
                            <<"domain_certfile">> =>
                             {list,
                              {section,
                               #{<<"certfile">> =>
                                  {option,string,filename,undefined,default},
                                 <<"domain">> =>
                                  {option,binary,non_empty,undefined,default}},
                               any,all,any,map,
                               fun mongoose_config_spec:process_domain_cert/1,
                               #{},default,when_present},
                              any,map,undefined,global_config},
                            <<"hide_service_name">> =>
                             {option,boolean,any,undefined,global_config},
                            <<"host_types">> =>
                             {list,
                              {option,binary,non_empty,undefined,default},
                              unique,list,undefined,global_config},
                            <<"hosts">> =>
                             {list,
                              {option,binary,non_empty,
                               fun mongoose_config_spec:process_host/1,
                               default},
                              unique,list,undefined,global_config},
                            <<"http_server_name">> =>
                             {option,string,any,undefined,global_config},
                            <<"language">> =>
                             {option,binary,non_empty,undefined,global_config},
                            <<"loglevel">> =>
                             {option,atom,loglevel,undefined,global_config},
                            <<"max_fsm_queue">> =>
                             {option,integer,positive,undefined,global_config},
                            <<"rdbms_server_type">> =>
                             {option,atom,
                              {enum,[mssql,pgsql]},
                              undefined,global_config},
                            <<"registration_timeout">> =>
                             {option,int_or_infinity,positive,undefined,
                              global_config},
                            <<"replaced_wait_timeout">> =>
                             {option,integer,positive,undefined,host_config},
                            <<"route_subdomains">> =>
                             {option,atom,{enum,[s2s]},undefined,host_config},
                            <<"routing_modules">> =>
                             {list,
                              {option,atom,module,undefined,default},
                              any,list,
                              fun xmpp_router:expand_routing_modules/1,
                              global_config},
                            <<"s2s_backend">> =>
                             {option,atom,
                              {module,mongoose_s2s},
                              undefined,global_config},
                            <<"sm_backend">> =>
                             {option,atom,
                              {module,ejabberd_sm},
                              undefined,global_config}},
                          any,
                          [<<"default_server_domain">>],
                          any,list,fun mongoose_config_spec:process_general/1,
                          #{<<"all_metrics_are_global">> => false,
                            <<"component_backend">> => mnesia,
                            <<"hide_service_name">> => false,
                            <<"host_types">> => [],<<"hosts">> => [],
                            <<"language">> => <<"en">>,
                            <<"loglevel">> => warning,
                            <<"rdbms_server_type">> => generic,
                            <<"registration_timeout">> => 600,
                            <<"replaced_wait_timeout">> => 2000,
                            <<"routing_modules">> =>
                             [{router_handler,
                               fun mongoose_router_global:filter/4,
                               fun mongoose_router_global:route/4},
                              {router_handler,
                               fun mongoose_router_localdomain:filter/4,
                               fun mongoose_router_localdomain:route/4},
                              {router_handler,
                               fun mongoose_router_external_localnode:filter/4,
                               fun mongoose_router_external_localnode:route/4},
                              {router_handler,
                               fun mongoose_router_external:filter/4,
                               fun mongoose_router_external:route/4},
                              {router_handler,
                               fun mongoose_router_dynamic_domains:filter/4,
                               fun mongoose_router_dynamic_domains:route/4},
                              {router_handler,fun ejabberd_s2s:filter/4,
                               fun ejabberd_s2s:route/4}],
                            <<"s2s_backend">> => mnesia,
                            <<"sm_backend">> => mnesia},
                          none,when_present},
                        <<"host_config">> =>
                         {list,
                          {section,
                           #{<<"access">> =>
                              {section,
                               #{default =>
                                  {list,
                                   {section,
                                    #{<<"acl">> =>
                                       {option,atom,non_empty,undefined,
                                        default},
                                      <<"value">> =>
                                       {option,int_or_atom,any,undefined,
                                        default}},
                                    any,all,any,map,undefined,#{},default,
                                    when_present},
                                   any,list,undefined,default}},
                               any,[],any,map,undefined,#{},host_config,
                               when_present},
                             <<"acl">> =>
                              {section,
                               #{default =>
                                  {list,
                                   {section,
                                    #{<<"match">> =>
                                       {option,atom,
                                        {enum,
                                         [all,none,current_domain,
                                          any_hosted_domain]},
                                        undefined,default},
                                      <<"resource">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"resource_glob">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"resource_regexp">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"server">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"server_glob">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"server_regexp">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"user">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"user_glob">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default},
                                      <<"user_regexp">> =>
                                       {option,binary,any,
                                        fun mongoose_config_spec:process_acl_condition/1,
                                        default}},
                                    any,[],any,map,undefined,
                                    #{<<"match">> => current_domain},
                                    default,when_present},
                                   any,list,undefined,default}},
                               any,[],any,map,undefined,#{},host_config,
                               when_present},
                             <<"auth">> =>
                              {section,
                               #{<<"anonymous">> =>
                                  {section,
                                   #{<<"allow_multiple_connections">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,ejabberd_auth_anonymous},
                                       undefined,default},
                                     <<"protocol">> =>
                                      {option,atom,
                                       {enum,[sasl_anon,login_anon,both]},
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"allow_multiple_connections">> => false,
                                     <<"backend">> => mnesia,
                                     <<"protocol">> => sasl_anon},
                                   default,when_present},
                                 <<"dummy">> =>
                                  {section,
                                   #{<<"base_time">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"variance">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"base_time">> => 50,
                                     <<"variance">> => 450},
                                   default,when_present},
                                 <<"external">> =>
                                  {section,
                                   #{<<"instances">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"program">> =>
                                      {option,string,non_empty,undefined,
                                       default}},
                                   any,
                                   [<<"program">>],
                                   any,map,undefined,
                                   #{<<"instances">> => 1},
                                   default,when_present},
                                 <<"http">> =>
                                  {section,
                                   #{<<"basic_auth">> =>
                                      {option,string,any,undefined,default}},
                                   any,[],any,map,undefined,#{},default,
                                   when_present},
                                 <<"internal">> =>
                                  {section,#{},any,[],any,map,undefined,#{},
                                   default,when_present},
                                 <<"jwt">> =>
                                  {section,
                                   #{<<"algorithm">> =>
                                      {option,binary,
                                       {enum,
                                        [<<"HS256">>,<<"RS256">>,<<"ES256">>,
                                         <<"HS386">>,<<"RS386">>,<<"ES386">>,
                                         <<"HS512">>,<<"RS512">>,<<"ES512">>]},
                                       undefined,default},
                                     <<"secret">> =>
                                      {section,
                                       #{<<"env">> =>
                                          {option,string,non_empty,undefined,
                                           default},
                                         <<"file">> =>
                                          {option,string,filename,undefined,
                                           default},
                                         <<"value">> =>
                                          {option,binary,any,undefined,
                                           default}},
                                       any,[],any,list,
                                       fun ejabberd_auth_jwt:process_jwt_secret/1,
                                       #{},default,when_present},
                                     <<"username_key">> =>
                                      {option,atom,non_empty,undefined,
                                       default}},
                                   any,all,any,map,undefined,#{},default,
                                   when_present},
                                 <<"ldap">> =>
                                  {section,
                                   #{<<"base">> =>
                                      {option,binary,any,undefined,default},
                                     <<"bind_pool_tag">> =>
                                      {option,atom,non_empty,undefined,
                                       default},
                                     <<"deref">> =>
                                      {option,atom,
                                       {enum,[never,always,finding,searching]},
                                       undefined,default},
                                     <<"dn_filter">> =>
                                      {section,
                                       #{<<"attributes">> =>
                                          {list,
                                           {option,binary,any,undefined,
                                            default},
                                           any,list,undefined,default},
                                         <<"filter">> =>
                                          {option,binary,ldap_filter,
                                           undefined,default}},
                                       any,
                                       [<<"filter">>],
                                       any,map,
                                       fun mongoose_ldap_config:process_dn_filter/1,
                                       #{<<"attributes">> => []},
                                       default,when_present},
                                     <<"filter">> =>
                                      {option,binary,any,undefined,default},
                                     <<"local_filter">> =>
                                      {section,
                                       #{<<"attribute">> =>
                                          {option,string,non_empty,undefined,
                                           default},
                                         <<"operation">> =>
                                          {option,atom,
                                           {enum,[equal,notequal]},
                                           undefined,default},
                                         <<"values">> =>
                                          {list,
                                           {option,string,any,undefined,
                                            default},
                                           non_empty,list,undefined,default}},
                                       any,all,any,map,
                                       fun mongoose_ldap_config:process_local_filter/1,
                                       #{},default,when_present},
                                     <<"pool_tag">> =>
                                      {option,atom,pool_name,undefined,
                                       default},
                                     <<"uids">> =>
                                      {list,
                                       {section,
                                        #{<<"attr">> =>
                                           {option,binary,any,undefined,
                                            default},
                                          <<"format">> =>
                                           {option,binary,any,undefined,
                                            default}},
                                        any,
                                        [<<"attr">>],
                                        any,map,
                                        fun mongoose_ldap_config:process_uids/1,
                                        #{},default,when_present},
                                       any,list,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"base">> => <<>>,
                                     <<"bind_pool_tag">> => bind,
                                     <<"deref">> => never,
                                     <<"dn_filter">> => {undefined,[]},
                                     <<"filter">> => <<>>,
                                     <<"local_filter">> => undefined,
                                     <<"pool_tag">> => default,
                                     <<"uids">> => [{<<"uid">>,<<"%u">>}]},
                                   default,when_present},
                                 <<"max_users_per_domain">> =>
                                  {option,int_or_infinity,positive,undefined,
                                   default},
                                 <<"methods">> =>
                                  {list,
                                   {option,atom,
                                    {module,ejabberd_auth},
                                    undefined,default},
                                   any,list,undefined,default},
                                 <<"password">> =>
                                  {section,
                                   #{<<"format">> =>
                                      {option,atom,
                                       {enum,[scram,plain]},
                                       undefined,default},
                                     <<"hash">> =>
                                      {list,
                                       {option,atom,
                                        {enum,
                                         [sha,sha224,sha256,sha384,sha512]},
                                        undefined,default},
                                       unique_non_empty,list,undefined,
                                       default},
                                     <<"scram_iterations">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"format">> => scram,
                                     <<"scram_iterations">> => 10000},
                                   default,always},
                                 <<"pki">> =>
                                  {section,#{},any,[],any,map,undefined,#{},
                                   default,when_present},
                                 <<"rdbms">> =>
                                  {section,
                                   #{<<"users_number_estimate">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"users_number_estimate">> => false},
                                   default,when_present},
                                 <<"sasl_external">> =>
                                  {list,
                                   {option,atom,any,
                                    fun mongoose_config_spec:process_sasl_external/1,
                                    default},
                                   any,list,undefined,default},
                                 <<"sasl_mechanisms">> =>
                                  {list,
                                   {option,atom,
                                    {module,cyrsasl},
                                    fun mongoose_config_spec:process_sasl_mechanism/1,
                                    default},
                                   any,list,undefined,default}},
                               any,[],any,map,
                               fun mongoose_config_spec:process_auth/1,
                               #{<<"max_users_per_domain">> => infinity,
                                 <<"sasl_external">> => [standard],
                                 <<"sasl_mechanisms">> =>
                                  [cyrsasl_scram_sha512_plus,
                                   cyrsasl_scram_sha512,
                                   cyrsasl_scram_sha384_plus,
                                   cyrsasl_scram_sha384,
                                   cyrsasl_scram_sha256_plus,
                                   cyrsasl_scram_sha256,
                                   cyrsasl_scram_sha224_plus,
                                   cyrsasl_scram_sha224,
                                   cyrsasl_scram_sha1_plus,cyrsasl_scram_sha1,
                                   cyrsasl_plain,cyrsasl_anonymous,
                                   cyrsasl_oauth]},
                               host_config,when_present},
                             <<"general">> =>
                              {section,
                               #{<<"all_metrics_are_global">> =>
                                  {option,boolean,any,undefined,global_config},
                                 <<"component_backend">> =>
                                  {option,atom,
                                   {module,mongoose_component},
                                   undefined,global_config},
                                 <<"default_server_domain">> =>
                                  {option,binary,non_empty,
                                   fun mongoose_config_spec:process_host/1,
                                   global_config},
                                 <<"domain_certfile">> =>
                                  {list,
                                   {section,
                                    #{<<"certfile">> =>
                                       {option,string,filename,undefined,
                                        default},
                                      <<"domain">> =>
                                       {option,binary,non_empty,undefined,
                                        default}},
                                    any,all,any,map,
                                    fun mongoose_config_spec:process_domain_cert/1,
                                    #{},default,when_present},
                                   any,map,undefined,global_config},
                                 <<"hide_service_name">> =>
                                  {option,boolean,any,undefined,global_config},
                                 <<"host_types">> =>
                                  {list,
                                   {option,binary,non_empty,undefined,default},
                                   unique,list,undefined,global_config},
                                 <<"hosts">> =>
                                  {list,
                                   {option,binary,non_empty,
                                    fun mongoose_config_spec:process_host/1,
                                    default},
                                   unique,list,undefined,global_config},
                                 <<"http_server_name">> =>
                                  {option,string,any,undefined,global_config},
                                 <<"language">> =>
                                  {option,binary,non_empty,undefined,
                                   global_config},
                                 <<"loglevel">> =>
                                  {option,atom,loglevel,undefined,
                                   global_config},
                                 <<"max_fsm_queue">> =>
                                  {option,integer,positive,undefined,
                                   global_config},
                                 <<"rdbms_server_type">> =>
                                  {option,atom,
                                   {enum,[mssql,pgsql]},
                                   undefined,global_config},
                                 <<"registration_timeout">> =>
                                  {option,int_or_infinity,positive,undefined,
                                   global_config},
                                 <<"replaced_wait_timeout">> =>
                                  {option,integer,positive,undefined,
                                   host_config},
                                 <<"route_subdomains">> =>
                                  {option,atom,
                                   {enum,[s2s]},
                                   undefined,host_config},
                                 <<"routing_modules">> =>
                                  {list,
                                   {option,atom,module,undefined,default},
                                   any,list,
                                   fun xmpp_router:expand_routing_modules/1,
                                   global_config},
                                 <<"s2s_backend">> =>
                                  {option,atom,
                                   {module,mongoose_s2s},
                                   undefined,global_config},
                                 <<"sm_backend">> =>
                                  {option,atom,
                                   {module,ejabberd_sm},
                                   undefined,global_config}},
                               any,[],any,list,undefined,#{},none,
                               when_present},
                             <<"host">> =>
                              {option,binary,non_empty,undefined,remove},
                             <<"host_type">> =>
                              {option,binary,non_empty,undefined,remove},
                             <<"modules">> =>
                              {section,
                               #{<<"mod_time">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => one_queue},
                                   default,when_present},
                                 <<"mod_keystore">> =>
                                  {section,
                                   #{<<"keys">> =>
                                      {list,
                                       {section,
                                        #{<<"name">> =>
                                           {option,atom,non_empty,undefined,
                                            default},
                                          <<"path">> =>
                                           {option,string,filename,undefined,
                                            default},
                                          <<"type">> =>
                                           {option,atom,
                                            {enum,[file,ram]},
                                            undefined,default}},
                                        any,
                                        [<<"name">>,<<"type">>],
                                        any,map,
                                        fun mod_keystore:process_key/1,#{},
                                        default,when_present},
                                       any,map,undefined,default},
                                     <<"ram_key_size">> =>
                                      {option,integer,non_negative,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"keys">> => #{},
                                     <<"ram_key_size">> => 2048},
                                   default,when_present},
                                 <<"mod_disco">> =>
                                  {section,
                                   #{<<"extra_domains">> =>
                                      {list,
                                       {option,binary,domain,undefined,
                                        default},
                                       any,list,undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"server_info">> =>
                                      {list,
                                       {section,
                                        #{<<"modules">> =>
                                           {list,
                                            {option,atom,module,undefined,
                                             default},
                                            any,list,undefined,default},
                                          <<"name">> =>
                                           {option,binary,non_empty,
                                            undefined,default},
                                          <<"urls">> =>
                                           {list,
                                            {option,binary,url,undefined,
                                             default},
                                            any,list,undefined,default}},
                                        any,
                                        [<<"name">>,<<"urls">>],
                                        any,map,undefined,#{},default,
                                        when_present},
                                       any,list,undefined,default},
                                     <<"users_can_see_hidden_services">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"extra_domains">> => [],
                                     <<"iqdisc">> => one_queue,
                                     <<"server_info">> => [],
                                     <<"users_can_see_hidden_services">> =>
                                      true},
                                   default,when_present},
                                 <<"mod_cache_users">> =>
                                  {section,
                                   #{<<"number_of_segments">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"strategy">> =>
                                      {option,atom,
                                       {enum,[fifo,lru]},
                                       undefined,default},
                                     <<"time_to_live">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default}},
                                   any,[],any,map,
                                   fun mongoose_user_cache:process_cache_config/1,
                                   #{<<"number_of_segments">> => 3,
                                     <<"strategy">> => fifo,
                                     <<"time_to_live">> => 480},
                                   default,when_present},
                                 <<"mod_auth_token">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_auth_token},
                                       undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"validity_period">> =>
                                      {section,
                                       #{<<"access">> =>
                                          {section,
                                           #{<<"unit">> =>
                                              {option,atom,
                                               {enum,
                                                [days,hours,minutes,seconds]},
                                               undefined,default},
                                             <<"value">> =>
                                              {option,integer,non_negative,
                                               undefined,default}},
                                           any,all,any,map,undefined,#{},
                                           default,when_present},
                                         <<"refresh">> =>
                                          {section,
                                           #{<<"unit">> =>
                                              {option,atom,
                                               {enum,
                                                [days,hours,minutes,seconds]},
                                               undefined,default},
                                             <<"value">> =>
                                              {option,integer,non_negative,
                                               undefined,default}},
                                           any,all,any,map,undefined,#{},
                                           default,when_present}},
                                       any,[],any,map,undefined,
                                       #{<<"access">> =>
                                          #{unit => hours,value => 1},
                                         <<"refresh">> =>
                                          #{unit => days,value => 25}},
                                       default,always}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => rdbms,
                                     <<"iqdisc">> => no_queue},
                                   default,when_present},
                                 <<"mod_csi">> =>
                                  {section,
                                   #{<<"buffer_max">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"buffer_max">> => 20},
                                   default,when_present},
                                 <<"mod_muc">> =>
                                  {section,
                                   #{<<"access">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"access_admin">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"access_create">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"access_persistent">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,mod_muc},
                                       undefined,default},
                                     <<"default_room">> =>
                                      {section,
                                       #{<<"affiliations">> =>
                                          {list,
                                           {section,
                                            #{<<"affiliation">> =>
                                               {option,atom,non_empty,
                                                undefined,default},
                                              <<"resource">> =>
                                               {option,binary,any,undefined,
                                                default},
                                              <<"server">> =>
                                               {option,binary,domain,
                                                undefined,default},
                                              <<"user">> =>
                                               {option,binary,non_empty,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_muc:process_room_affiliation/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"allow_change_subj">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_multiple_sessions">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_private_messages">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_query_users">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_user_invites">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_visitor_nickchange">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"allow_visitor_status">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"anonymous">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"description">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"logging">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"max_users">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"maygetmemberlist">> =>
                                          {list,
                                           {option,atom,non_empty,undefined,
                                            default},
                                           any,list,undefined,default},
                                         <<"members_by_default">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"members_only">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"moderated">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"password">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"password_protected">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"persistent">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"public">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"public_list">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"subject">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"subject_author">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"title">> =>
                                          {option,binary,any,undefined,
                                           default}},
                                       any,[],any,map,undefined,
                                       #{<<"affiliations">> => [],
                                         <<"allow_change_subj">> => true,
                                         <<"allow_multiple_sessions">> =>
                                          false,
                                         <<"allow_private_messages">> => true,
                                         <<"allow_query_users">> => true,
                                         <<"allow_user_invites">> => false,
                                         <<"allow_visitor_nickchange">> =>
                                          true,
                                         <<"allow_visitor_status">> => true,
                                         <<"anonymous">> => true,
                                         <<"description">> => <<>>,
                                         <<"logging">> => false,
                                         <<"max_users">> => 200,
                                         <<"maygetmemberlist">> => [],
                                         <<"members_by_default">> => true,
                                         <<"members_only">> => false,
                                         <<"moderated">> => true,
                                         <<"password">> => <<>>,
                                         <<"password_protected">> => false,
                                         <<"persistent">> => false,
                                         <<"public">> => true,
                                         <<"public_list">> => true,
                                         <<"subject">> => <<>>,
                                         <<"subject_author">> => <<>>,
                                         <<"title">> => <<>>},
                                       default,when_present},
                                     <<"hibernate_timeout">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"hibernated_room_check_interval">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"hibernated_room_timeout">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"history_size">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"host">> =>
                                      {option,string,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                     <<"http_auth_pool">> =>
                                      {option,atom,pool_name,undefined,
                                       default},
                                     <<"load_permanent_rooms_at_startup">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"max_room_desc">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"max_room_id">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"max_room_name">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"max_user_conferences">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"max_users">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"max_users_admin_threshold">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"min_message_interval">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"min_presence_interval">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"online_backend">> =>
                                      {option,atom,
                                       {module,mod_muc_online},
                                       undefined,default},
                                     <<"room_shaper">> =>
                                      {option,atom,shaper,undefined,default},
                                     <<"user_message_shaper">> =>
                                      {option,atom,shaper,undefined,default},
                                     <<"user_presence_shaper">> =>
                                      {option,atom,shaper,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"access">> => all,
                                     <<"access_admin">> => none,
                                     <<"access_create">> => all,
                                     <<"access_persistent">> => all,
                                     <<"backend">> => mnesia,
                                     <<"default_room">> =>
                                      #{public => true,description => <<>>,
                                        persistent => false,title => <<>>,
                                        password => <<>>,anonymous => true,
                                        subject => <<>>,
                                        allow_change_subj => true,
                                        allow_query_users => true,
                                        allow_private_messages => true,
                                        allow_visitor_status => true,
                                        allow_visitor_nickchange => true,
                                        public_list => true,moderated => true,
                                        members_by_default => true,
                                        members_only => false,
                                        allow_user_invites => false,
                                        allow_multiple_sessions => false,
                                        password_protected => false,
                                        max_users => 200,
                                        maygetmemberlist => [],
                                        logging => false,affiliations => [],
                                        subject_author => <<>>},
                                     <<"hibernate_timeout">> => 90000,
                                     <<"hibernated_room_check_interval">> =>
                                      infinity,
                                     <<"hibernated_room_timeout">> => infinity,
                                     <<"history_size">> => 20,
                                     <<"host">> => {prefix,<<"conference.">>},
                                     <<"http_auth_pool">> => none,
                                     <<"load_permanent_rooms_at_startup">> =>
                                      false,
                                     <<"max_room_desc">> => infinity,
                                     <<"max_room_id">> => infinity,
                                     <<"max_room_name">> => infinity,
                                     <<"max_user_conferences">> => 10,
                                     <<"max_users">> => 200,
                                     <<"max_users_admin_threshold">> => 5,
                                     <<"min_message_interval">> => 0,
                                     <<"min_presence_interval">> => 0,
                                     <<"online_backend">> => mnesia,
                                     <<"room_shaper">> => none,
                                     <<"user_message_shaper">> => none,
                                     <<"user_presence_shaper">> => none},
                                   default,when_present},
                                 <<"mod_muc_log">> =>
                                  {section,
                                   #{<<"access_log">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"css_file">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"dirname">> =>
                                      {option,atom,
                                       {enum,[room_jid,room_name]},
                                       undefined,default},
                                     <<"dirtype">> =>
                                      {option,atom,
                                       {enum,[subdirs,plain]},
                                       undefined,default},
                                     <<"file_format">> =>
                                      {option,atom,
                                       {enum,[html,plaintext]},
                                       undefined,default},
                                     <<"outdir">> =>
                                      {option,string,dirname,undefined,
                                       default},
                                     <<"spam_prevention">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"timezone">> =>
                                      {option,atom,
                                       {enum,[local,universal]},
                                       undefined,default},
                                     <<"top_link">> =>
                                      {section,
                                       #{<<"target">> =>
                                          {option,string,url,undefined,
                                           default},
                                         <<"text">> =>
                                          {option,string,non_empty,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_muc_log:process_top_link/1,#{},
                                       default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"access_log">> => muc_admin,
                                     <<"css_file">> => false,
                                     <<"dirname">> => room_jid,
                                     <<"dirtype">> => subdirs,
                                     <<"file_format">> => html,
                                     <<"outdir">> => "www/muc",
                                     <<"spam_prevention">> => true,
                                     <<"timezone">> => local,
                                     <<"top_link">> => {"/","Home"}},
                                   default,when_present},
                                 <<"mod_caps">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_caps},
                                       undefined,default},
                                     <<"cache_life_time">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"cache_size">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia,
                                     <<"cache_life_time">> => 86400,
                                     <<"cache_size">> => 1000},
                                   default,when_present},
                                 <<"mod_roster">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_roster},
                                       undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"store_current_id">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"versioning">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia,
                                     <<"iqdisc">> => one_queue,
                                     <<"store_current_id">> => false,
                                     <<"versioning">> => false},
                                   default,when_present},
                                 <<"mod_extdisco">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"service">> =>
                                      {list,
                                       {section,
                                        #{<<"host">> =>
                                           {option,binary,non_empty,
                                            undefined,default},
                                          <<"password">> =>
                                           {option,binary,non_empty,
                                            undefined,default},
                                          <<"port">> =>
                                           {option,integer,port,undefined,
                                            default},
                                          <<"transport">> =>
                                           {option,binary,
                                            {enum,[<<"udp">>,<<"tcp">>]},
                                            undefined,default},
                                          <<"type">> =>
                                           {option,atom,non_empty,undefined,
                                            default},
                                          <<"username">> =>
                                           {option,binary,non_empty,
                                            undefined,default}},
                                        any,
                                        [<<"type">>,<<"host">>],
                                        any,map,undefined,#{},default,
                                        when_present},
                                       any,list,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => no_queue,
                                     <<"service">> => []},
                                   default,when_present},
                                 <<"mod_offline_chatmarkers">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_offline_chatmarkers},
                                       undefined,default},
                                     <<"store_groupchat_messages">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => rdbms,
                                     <<"store_groupchat_messages">> => false},
                                   default,when_present},
                                 <<"mod_private">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_private},
                                       undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => rdbms,
                                     <<"iqdisc">> => one_queue},
                                   default,when_present},
                                 <<"mod_sic">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => one_queue},
                                   default,when_present},
                                 <<"mod_carboncopy">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => no_queue},
                                   default,when_present},
                                 default =>
                                  {section,#{},any,[],any,map,undefined,#{},
                                   default,when_present},
                                 <<"mod_smart_markers">> =>
                                  {section,
                                   #{<<"async_writer">> =>
                                      {section,
                                       #{<<"pool_size">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"pool_size">> => 8},
                                       default,always},
                                     <<"backend">> =>
                                      {option,atom,
                                       {enum,[rdbms,rdbms_async]},
                                       undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"keep_private">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => rdbms,
                                     <<"iqdisc">> => no_queue,
                                     <<"keep_private">> => false},
                                   default,when_present},
                                 <<"mod_global_distrib">> =>
                                  {section,
                                   #{<<"bounce">> =>
                                      {section,
                                       #{<<"enabled">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"max_retries">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"resend_after_ms">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"enabled">> => true,
                                         <<"max_retries">> => 4,
                                         <<"resend_after_ms">> => 200},
                                       default,always},
                                     <<"cache">> =>
                                      {section,
                                       #{<<"cache_missed">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"domain_lifetime_seconds">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"jid_lifetime_seconds">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"max_jids">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"cache_missed">> => true,
                                         <<"domain_lifetime_seconds">> => 600,
                                         <<"jid_lifetime_seconds">> => 5,
                                         <<"max_jids">> => 10000},
                                       default,always},
                                     <<"connections">> =>
                                      {section,
                                       #{<<"advertised_endpoints">> =>
                                          {list,
                                           {section,
                                            #{<<"host">> =>
                                               {option,string,
                                                network_address,undefined,
                                                default},
                                              <<"port">> =>
                                               {option,integer,port,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_global_distrib:process_endpoint/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"connections_per_endpoint">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"disabled_gc_interval">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"endpoint_refresh_interval">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"endpoint_refresh_interval_when_empty">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"endpoints">> =>
                                          {list,
                                           {section,
                                            #{<<"host">> =>
                                               {option,string,
                                                network_address,undefined,
                                                default},
                                              <<"port">> =>
                                               {option,integer,port,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_global_distrib:process_endpoint/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"tls">> =>
                                          {section,
                                           #{<<"cacertfile">> =>
                                              {option,string,filename,
                                               undefined,default},
                                             <<"certfile">> =>
                                              {option,string,filename,
                                               undefined,default},
                                             <<"ciphers">> =>
                                              {option,string,any,undefined,
                                               default},
                                             <<"dhfile">> =>
                                              {option,string,filename,
                                               undefined,default},
                                             <<"protocol_options">> =>
                                              {list,
                                               {option,string,non_empty,
                                                undefined,default},
                                               any,list,undefined,default},
                                             <<"verify_mode">> =>
                                              {option,atom,
                                               {enum,
                                                [peer,selfsigned_peer,none]},
                                               undefined,default}},
                                           any,[],any,map,
                                           #Fun<mongoose_config_utils.0.103156362>,
                                           #{<<"verify_mode">> => peer},
                                           default,when_present}},
                                       any,[],any,map,undefined,
                                       #{<<"connections_per_endpoint">> => 1,
                                         <<"disabled_gc_interval">> => 60,
                                         <<"endpoint_refresh_interval">> => 60,
                                         <<"endpoint_refresh_interval_when_empty">> =>
                                          3},
                                       default,always},
                                     <<"global_host">> =>
                                      {option,binary,domain,undefined,default},
                                     <<"hosts_refresh_interval">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"local_host">> =>
                                      {option,binary,domain,undefined,default},
                                     <<"message_ttl">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"redis">> =>
                                      {section,
                                       #{<<"expire_after">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"pool">> =>
                                          {option,atom,pool_name,undefined,
                                           default},
                                         <<"refresh_after">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"expire_after">> => 120,
                                         <<"pool">> => global_distrib,
                                         <<"refresh_after">> => 60},
                                       default,always}},
                                   any,
                                   [<<"global_host">>,<<"local_host">>],
                                   any,map,
                                   fun mod_global_distrib:process_opts/1,
                                   #{<<"hosts_refresh_interval">> => 3000,
                                     <<"message_ttl">> => 4},
                                   default,when_present},
                                 <<"mod_push_service_mongoosepush">> =>
                                  {section,
                                   #{<<"api_version">> =>
                                      {option,binary,
                                       {enum,[<<"v2">>,<<"v3">>]},
                                       undefined,default},
                                     <<"max_http_connections">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"pool_name">> =>
                                      {option,atom,pool_name,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"api_version">> => <<"v3">>,
                                     <<"max_http_connections">> => 100,
                                     <<"pool_name">> => undefined},
                                   default,when_present},
                                 <<"mod_bosh">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_bosh},
                                       undefined,default},
                                     <<"inactivity">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"max_pause">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"max_wait">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"server_acks">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia,
                                     <<"inactivity">> => 30,
                                     <<"max_pause">> => 120,
                                     <<"max_wait">> => infinity,
                                     <<"server_acks">> => false},
                                   default,when_present},
                                 <<"mod_stream_management">> =>
                                  {section,
                                   #{<<"ack">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"ack_freq">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,mod_stream_management},
                                       undefined,default},
                                     <<"buffer">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"buffer_max">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"resume_timeout">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"stale_h">> =>
                                      {section,
                                       #{<<"enabled">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"geriatric">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"repeat_after">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,undefined,
                                       #{<<"enabled">> => false,
                                         <<"geriatric">> => 3600,
                                         <<"repeat_after">> => 1800},
                                       default,always}},
                                   any,[],any,map,
                                   fun mod_stream_management:process_buffer_and_ack/1,
                                   #{<<"ack">> => true,<<"ack_freq">> => 1,
                                     <<"backend">> => mnesia,
                                     <<"buffer">> => true,
                                     <<"buffer_max">> => 100,
                                     <<"resume_timeout">> => 600},
                                   default,when_present},
                                 <<"mod_inbox">> =>
                                  {section,
                                   #{<<"aff_changes">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"async_writer">> =>
                                      {section,
                                       #{<<"pool_size">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"pool_size">> => 8},
                                       default,always},
                                     <<"backend">> =>
                                      {option,atom,
                                       {enum,[rdbms,rdbms_async]},
                                       undefined,default},
                                     <<"bin_clean_after">> =>
                                      {option,integer,non_negative,
                                       fun timer:hours/1,default},
                                     <<"bin_ttl">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"boxes">> =>
                                      {list,
                                       {option,binary,non_empty,undefined,
                                        default},
                                       unique,list,undefined,default},
                                     <<"delete_domain_limit">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"groupchat">> =>
                                      {list,
                                       {option,atom,
                                        {enum,[muc,muclight]},
                                        undefined,default},
                                       any,list,undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"max_result_limit">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"remove_on_kicked">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"reset_markers">> =>
                                      {list,
                                       {option,binary,
                                        {enum,
                                         [<<"received">>,<<"displayed">>,
                                          <<"acknowledged">>]},
                                        undefined,default},
                                       any,list,undefined,default}},
                                   any,[],any,map,
                                   fun mod_inbox:process_inbox_boxes/1,
                                   #{<<"aff_changes">> => true,
                                     <<"backend">> => rdbms,
                                     <<"bin_clean_after">> => 3600000,
                                     <<"bin_ttl">> => 30,<<"boxes">> => [],
                                     <<"delete_domain_limit">> => infinity,
                                     <<"groupchat">> => [muclight],
                                     <<"iqdisc">> => no_queue,
                                     <<"max_result_limit">> => infinity,
                                     <<"remove_on_kicked">> => true,
                                     <<"reset_markers">> => [<<"displayed">>]},
                                   default,when_present},
                                 <<"mod_last">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_last},
                                       undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia,
                                     <<"iqdisc">> => one_queue},
                                   default,when_present},
                                 <<"mod_event_pusher">> =>
                                  {section,
                                   #{<<"http">> =>
                                      {section,
                                       #{<<"handlers">> =>
                                          {list,
                                           {section,
                                            #{<<"callback_module">> =>
                                               {option,atom,module,undefined,
                                                default},
                                              <<"path">> =>
                                               {option,binary,any,
                                                fun mod_event_pusher_http:fix_path/1,
                                                default},
                                              <<"pool_name">> =>
                                               {option,atom,pool_name,
                                                undefined,default}},
                                            any,[],any,map,undefined,
                                            #{<<"callback_module">> =>
                                               mod_event_pusher_http_defaults,
                                              <<"path">> => <<>>,
                                              <<"pool_name">> => http_pool},
                                            default,when_present},
                                           unique,list,undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"handlers">> => []},
                                       default,when_present},
                                     <<"push">> =>
                                      {section,
                                       #{<<"backend">> =>
                                          {option,atom,
                                           {module,mod_event_pusher_push},
                                           undefined,default},
                                         <<"iqdisc">> =>
                                          {section,
                                           #{<<"type">> =>
                                              {option,atom,
                                               {enum,
                                                [no_queue,one_queue,parallel,
                                                 queues]},
                                               undefined,default},
                                             <<"workers">> =>
                                              {option,integer,positive,
                                               undefined,default}},
                                           any,
                                           [<<"type">>],
                                           any,map,
                                           fun mongoose_config_spec:process_iqdisc/1,
                                           #{},default,when_present},
                                         <<"plugin_module">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"virtual_pubsub_hosts">> =>
                                          {list,
                                           {option,string,subdomain_template,
                                            fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                            default},
                                           any,list,undefined,default},
                                         <<"wpool">> =>
                                          {section,
                                           #{<<"call_timeout">> =>
                                              {option,integer,positive,
                                               undefined,default},
                                             <<"strategy">> =>
                                              {option,atom,
                                               {enum,
                                                [best_worker,random_worker,
                                                 next_worker,available_worker,
                                                 next_available_worker]},
                                               undefined,default},
                                             <<"workers">> =>
                                              {option,integer,positive,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"call_timeout">> => 5000,
                                             <<"strategy">> =>
                                              available_worker,
                                             <<"workers">> => 10},
                                           default,always}},
                                       any,[],any,map,undefined,
                                       #{<<"backend">> => mnesia,
                                         <<"iqdisc">> => one_queue,
                                         <<"plugin_module">> =>
                                          mod_event_pusher_push_plugin_defaults,
                                         <<"virtual_pubsub_hosts">> => []},
                                       default,when_present},
                                     <<"rabbit">> =>
                                      {section,
                                       #{<<"chat_msg_exchange">> =>
                                          {section,
                                           #{<<"name">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"recv_topic">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"sent_topic">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"type">> =>
                                              {option,binary,non_empty,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"name">> => <<"chat_msg">>,
                                             <<"recv_topic">> =>
                                              <<"chat_msg_recv">>,
                                             <<"sent_topic">> =>
                                              <<"chat_msg_sent">>,
                                             <<"type">> => <<"topic">>},
                                           default,always},
                                         <<"groupchat_msg_exchange">> =>
                                          {section,
                                           #{<<"name">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"recv_topic">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"sent_topic">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"type">> =>
                                              {option,binary,non_empty,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"name">> => <<"groupchat_msg">>,
                                             <<"recv_topic">> =>
                                              <<"groupchat_msg_recv">>,
                                             <<"sent_topic">> =>
                                              <<"groupchat_msg_sent">>,
                                             <<"type">> => <<"topic">>},
                                           default,always},
                                         <<"presence_exchange">> =>
                                          {section,
                                           #{<<"name">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"type">> =>
                                              {option,binary,non_empty,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"name">> => <<"presence">>,
                                             <<"type">> => <<"topic">>},
                                           default,always}},
                                       any,[],any,map,undefined,#{},default,
                                       when_present},
                                     <<"sns">> =>
                                      {section,
                                       #{<<"access_key_id">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"account_id">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"muc_messages_topic">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"plugin_module">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"pm_messages_topic">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"pool_size">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"presence_updates_topic">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"publish_retry_count">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"publish_retry_time_ms">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"region">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"secret_access_key">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"sns_host">> =>
                                          {option,string,any,undefined,
                                           default}},
                                       any,
                                       [<<"sns_host">>,<<"region">>,
                                        <<"access_key_id">>,
                                        <<"secret_access_key">>,
                                        <<"account_id">>],
                                       any,map,undefined,
                                       #{<<"plugin_module">> =>
                                          mod_event_pusher_sns_defaults,
                                         <<"pool_size">> => 100,
                                         <<"publish_retry_count">> => 2,
                                         <<"publish_retry_time_ms">> => 50},
                                       default,when_present}},
                                   any,[],any,map,undefined,#{},default,
                                   when_present},
                                 <<"mod_register">> =>
                                  {section,
                                   #{<<"access">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"ip_access">> =>
                                      {list,
                                       {section,
                                        #{<<"address">> =>
                                           {option,string,ip_mask,undefined,
                                            default},
                                          <<"policy">> =>
                                           {option,atom,
                                            {enum,[allow,deny]},
                                            undefined,default}},
                                        any,all,any,map,
                                        fun mod_register:process_ip_access/1,
                                        #{},default,when_present},
                                       any,list,undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"password_strength">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"registration_watchers">> =>
                                      {list,
                                       {option,binary,jid,undefined,default},
                                       any,list,undefined,default},
                                     <<"welcome_message">> =>
                                      {section,
                                       #{<<"body">> =>
                                          {option,string,any,undefined,
                                           default},
                                         <<"subject">> =>
                                          {option,string,any,undefined,
                                           default}},
                                       any,[],any,map,
                                       fun mod_register:process_welcome_message/1,
                                       #{<<"body">> => [],<<"subject">> => []},
                                       default,when_present}},
                                   any,[],any,map,undefined,
                                   #{<<"access">> => all,
                                     <<"ip_access">> => [],
                                     <<"iqdisc">> => one_queue,
                                     <<"password_strength">> => 0,
                                     <<"registration_watchers">> => []},
                                   default,when_present},
                                 <<"mod_jingle_sip">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_jingle_sip},
                                       undefined,default},
                                     <<"listen_port">> =>
                                      {option,integer,port,undefined,default},
                                     <<"local_host">> =>
                                      {option,string,network_address,
                                       undefined,default},
                                     <<"proxy_host">> =>
                                      {option,string,network_address,
                                       undefined,default},
                                     <<"proxy_port">> =>
                                      {option,integer,port,undefined,default},
                                     <<"sdp_origin">> =>
                                      {option,string,ip_address,undefined,
                                       default},
                                     <<"transport">> =>
                                      {option,string,
                                       {enum,["udp","tcp"]},
                                       undefined,default},
                                     <<"username_to_phone">> =>
                                      {list,
                                       {section,
                                        #{<<"phone">> =>
                                           {option,binary,any,undefined,
                                            default},
                                          <<"username">> =>
                                           {option,binary,any,undefined,
                                            default}},
                                        any,all,any,map,
                                        #Fun<mod_jingle_sip.0.54879970>,#{},
                                        default,when_present},
                                       any,list,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia,
                                     <<"listen_port">> => 5600,
                                     <<"local_host">> => "localhost",
                                     <<"proxy_host">> => "localhost",
                                     <<"proxy_port">> => 5060,
                                     <<"sdp_origin">> => "127.0.0.1",
                                     <<"transport">> => "udp",
                                     <<"username_to_phone">> => []},
                                   default,when_present},
                                 <<"mod_muc_light">> =>
                                  {section,
                                   #{<<"all_can_configure">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"all_can_invite">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,mod_muc_light_db},
                                       undefined,default},
                                     <<"blocking">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"cache_affs">> =>
                                      {section,
                                       #{<<"module">> =>
                                          {option,atom,
                                           {enum,[internal,mod_cache_users]},
                                           undefined,default},
                                         <<"number_of_segments">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,[fifo,lru]},
                                           undefined,default},
                                         <<"time_to_live">> =>
                                          {option,int_or_infinity,positive,
                                           undefined,default}},
                                       any,[],any,map,
                                       fun mongoose_user_cache:process_cache_config/1,
                                       #{<<"module">> => internal,
                                         <<"number_of_segments">> => 3,
                                         <<"strategy">> => fifo,
                                         <<"time_to_live">> => 2},
                                       default,when_present},
                                     <<"config_schema">> =>
                                      {list,
                                       {section,
                                        #{<<"field">> =>
                                           {option,binary,non_empty,
                                            undefined,default},
                                          <<"float_value">> =>
                                           {option,float,any,undefined,
                                            default},
                                          <<"integer_value">> =>
                                           {option,integer,any,undefined,
                                            default},
                                          <<"internal_key">> =>
                                           {option,atom,non_empty,undefined,
                                            default},
                                          <<"string_value">> =>
                                           {option,binary,any,undefined,
                                            default}},
                                        any,
                                        [<<"field">>],
                                        any,map,undefined,#{},default,
                                        when_present},
                                       any,list,
                                       fun mod_muc_light:process_config_schema/1,
                                       default},
                                     <<"equal_occupants">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"host">> =>
                                      {option,string,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                     <<"legacy_mode">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"max_occupants">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"rooms_in_rosters">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"rooms_per_page">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"rooms_per_user">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"all_can_configure">> => false,
                                     <<"all_can_invite">> => false,
                                     <<"backend">> => mnesia,
                                     <<"blocking">> => true,
                                     <<"config_schema">> =>
                                      [{<<"roomname">>,<<"Untitled">>,
                                        roomname,binary},
                                       {<<"subject">>,<<>>,subject,binary}],
                                     <<"equal_occupants">> => false,
                                     <<"host">> => {prefix,<<"muclight.">>},
                                     <<"legacy_mode">> => false,
                                     <<"max_occupants">> => infinity,
                                     <<"rooms_in_rosters">> => false,
                                     <<"rooms_per_page">> => 10,
                                     <<"rooms_per_user">> => infinity},
                                   default,when_present},
                                 <<"mod_domain_isolation">> =>
                                  {section,#{},any,[],any,map,undefined,#{},
                                   default,when_present},
                                 <<"mod_shared_roster_ldap">> =>
                                  {section,
                                   #{<<"auth_check">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"base">> =>
                                      {option,binary,any,undefined,default},
                                     <<"deref">> =>
                                      {option,atom,
                                       {enum,[never,always,finding,searching]},
                                       undefined,default},
                                     <<"filter">> =>
                                      {option,binary,any,undefined,default},
                                     <<"gfilter">> =>
                                      {option,binary,any,undefined,default},
                                     <<"group_cache_size">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"group_cache_validity">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"groupattr">> =>
                                      {option,binary,any,undefined,default},
                                     <<"groupdesc">> =>
                                      {option,binary,any,undefined,default},
                                     <<"memberattr">> =>
                                      {option,binary,any,undefined,default},
                                     <<"memberattr_format">> =>
                                      {option,binary,any,undefined,default},
                                     <<"memberattr_format_re">> =>
                                      {option,binary,any,undefined,default},
                                     <<"pool_tag">> =>
                                      {option,atom,pool_name,undefined,
                                       default},
                                     <<"rfilter">> =>
                                      {option,binary,any,undefined,default},
                                     <<"ufilter">> =>
                                      {option,binary,any,undefined,default},
                                     <<"user_cache_size">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"user_cache_validity">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"userdesc">> =>
                                      {option,binary,any,undefined,default},
                                     <<"useruid">> =>
                                      {option,binary,any,undefined,default}},
                                   any,[],any,map,
                                   #Fun<mod_shared_roster_ldap.0.13941630>,
                                   #{<<"auth_check">> => true,
                                     <<"deref">> => never,
                                     <<"filter">> => <<>>,
                                     <<"gfilter">> => <<>>,
                                     <<"group_cache_size">> => 1000,
                                     <<"group_cache_validity">> => 300,
                                     <<"groupattr">> => <<"cn">>,
                                     <<"memberattr">> => <<"memberUid">>,
                                     <<"memberattr_format">> => <<"%u">>,
                                     <<"memberattr_format_re">> => <<>>,
                                     <<"pool_tag">> => default,
                                     <<"rfilter">> => <<>>,
                                     <<"ufilter">> => <<>>,
                                     <<"user_cache_size">> => 1000,
                                     <<"user_cache_validity">> => 300,
                                     <<"userdesc">> => <<"cn">>,
                                     <<"useruid">> => <<"cn">>},
                                   default,when_present},
                                 <<"mod_pubsub">> =>
                                  {section,
                                   #{<<"access_createnode">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,mod_pubsub_db},
                                       undefined,default},
                                     <<"default_node_config">> =>
                                      {section,
                                       #{<<"access_model">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"deliver_notifications">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"deliver_payloads">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"max_items">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"max_payload_size">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"node_type">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"notification_type">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"notify_config">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"notify_delete">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"notify_retract">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"persist_items">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"presence_based_delivery">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"publish_model">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"purge_offline">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"roster_groups_allowed">> =>
                                          {list,
                                           {option,binary,non_empty,
                                            undefined,default},
                                           any,list,undefined,default},
                                         <<"send_last_published_item">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"subscribe">> =>
                                          {option,boolean,any,undefined,
                                           default}},
                                       any,[],any,list,undefined,#{},default,
                                       when_present},
                                     <<"host">> =>
                                      {option,string,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                     <<"ignore_pep_from_offline">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"item_publisher">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"last_item_cache">> =>
                                      {option,atom,
                                       {enum,[mnesia,rdbms,false]},
                                       undefined,default},
                                     <<"max_items_node">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"max_subscriptions_node">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"nodetree">> =>
                                      {option,binary,
                                       {module,nodetree},
                                       #Fun<mod_pubsub.0.81398248>,default},
                                     <<"pep_mapping">> =>
                                      {list,
                                       {section,
                                        #{<<"namespace">> =>
                                           {option,binary,non_empty,
                                            undefined,default},
                                          <<"node">> =>
                                           {option,binary,non_empty,
                                            undefined,default}},
                                        any,all,any,map,
                                        fun mod_pubsub:process_pep_mapping/1,
                                        #{},default,when_present},
                                       any,map,undefined,default},
                                     <<"plugins">> =>
                                      {list,
                                       {option,binary,
                                        {module,node},
                                        undefined,default},
                                       any,list,undefined,default},
                                     <<"sync_broadcast">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"wpool">> =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,undefined,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       default,always}},
                                   any,[],any,map,undefined,
                                   #{<<"access_createnode">> => all,
                                     <<"backend">> => mnesia,
                                     <<"default_node_config">> => [],
                                     <<"host">> => {prefix,<<"pubsub.">>},
                                     <<"ignore_pep_from_offline">> => true,
                                     <<"iqdisc">> => one_queue,
                                     <<"item_publisher">> => false,
                                     <<"last_item_cache">> => false,
                                     <<"max_items_node">> => 10,
                                     <<"nodetree">> => nodetree_tree,
                                     <<"pep_mapping">> => #{},
                                     <<"plugins">> => [<<"flat">>],
                                     <<"sync_broadcast">> => false},
                                   default,when_present},
                                 <<"mod_http_upload">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_http_upload},
                                       undefined,default},
                                     <<"expiration_time">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"host">> =>
                                      {option,binary,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"max_file_size">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"s3">> =>
                                      {section,
                                       #{<<"access_key_id">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"add_acl">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"bucket_url">> =>
                                          {option,binary,url,undefined,
                                           default},
                                         <<"region">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"secret_access_key">> =>
                                          {option,binary,any,undefined,
                                           default}},
                                       any,
                                       [<<"bucket_url">>,<<"region">>,
                                        <<"access_key_id">>,
                                        <<"secret_access_key">>],
                                       any,map,undefined,
                                       #{<<"add_acl">> => false},
                                       default,when_present},
                                     <<"token_bytes">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,
                                   [<<"s3">>],
                                   any,map,undefined,
                                   #{<<"backend">> => s3,
                                     <<"expiration_time">> => 60,
                                     <<"host">> => <<"upload.@HOST@">>,
                                     <<"iqdisc">> => one_queue,
                                     <<"max_file_size">> => 10485760,
                                     <<"token_bytes">> => 32},
                                   default,when_present},
                                 <<"mod_offline">> =>
                                  {section,
                                   #{<<"access_max_user_messages">> =>
                                      {option,atom,access_rule,undefined,
                                       default},
                                     <<"backend">> =>
                                      {option,atom,
                                       {module,mod_offline},
                                       undefined,default},
                                     <<"store_groupchat_messages">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"access_max_user_messages">> =>
                                      max_user_offline_messages,
                                     <<"backend">> => mnesia,
                                     <<"store_groupchat_messages">> => false},
                                   default,when_present},
                                 <<"mod_vcard">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_vcard},
                                       undefined,default},
                                     <<"host">> =>
                                      {option,string,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                     <<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"ldap">> =>
                                      {section,
                                       #{<<"base">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"binary_search_fields">> =>
                                          {list,
                                           {option,binary,non_empty,
                                            undefined,default},
                                           any,list,undefined,default},
                                         <<"deref">> =>
                                          {option,atom,
                                           {enum,
                                            [never,always,finding,searching]},
                                           undefined,default},
                                         <<"filter">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"pool_tag">> =>
                                          {option,atom,pool_name,undefined,
                                           default},
                                         <<"search_fields">> =>
                                          {list,
                                           {section,
                                            #{<<"ldap_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default},
                                              <<"search_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_vcard:process_search_spec/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"search_operator">> =>
                                          {option,atom,
                                           {enum,['or','and']},
                                           undefined,default},
                                         <<"search_reported">> =>
                                          {list,
                                           {section,
                                            #{<<"search_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default},
                                              <<"vcard_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_vcard:process_search_reported_spec/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"uids">> =>
                                          {list,
                                           {section,
                                            #{<<"attr">> =>
                                               {option,binary,any,undefined,
                                                default},
                                              <<"format">> =>
                                               {option,binary,any,undefined,
                                                default}},
                                            any,
                                            [<<"attr">>],
                                            any,map,
                                            fun mongoose_ldap_config:process_uids/1,
                                            #{},default,when_present},
                                           any,list,undefined,default},
                                         <<"vcard_map">> =>
                                          {list,
                                           {section,
                                            #{<<"ldap_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default},
                                              <<"ldap_pattern">> =>
                                               {option,binary,non_empty,
                                                undefined,default},
                                              <<"vcard_field">> =>
                                               {option,binary,non_empty,
                                                undefined,default}},
                                            any,all,any,map,
                                            fun mod_vcard:process_map_spec/1,
                                            #{},default,when_present},
                                           any,list,undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"binary_search_fields">> => [],
                                         <<"deref">> => never,
                                         <<"filter">> => <<>>,
                                         <<"pool_tag">> => default,
                                         <<"search_fields">> =>
                                          [{<<"User">>,<<"%u">>},
                                           {<<"Full Name">>,<<"displayName">>},
                                           {<<"Given Name">>,<<"givenName">>},
                                           {<<"Middle Name">>,<<"initials">>},
                                           {<<"Family Name">>,<<"sn">>},
                                           {<<"Nickname">>,<<"%u">>},
                                           {<<"Birthday">>,<<"birthDay">>},
                                           {<<"Country">>,<<"c">>},
                                           {<<"City">>,<<"l">>},
                                           {<<"Email">>,<<"mail">>},
                                           {<<"Organization Name">>,<<"o">>},
                                           {<<"Organization Unit">>,<<"ou">>}],
                                         <<"search_operator">> => 'and',
                                         <<"search_reported">> =>
                                          [{<<"Full Name">>,<<"FN">>},
                                           {<<"Given Name">>,<<"FIRST">>},
                                           {<<"Middle Name">>,<<"MIDDLE">>},
                                           {<<"Family Name">>,<<"LAST">>},
                                           {<<"Nickname">>,<<"NICK">>},
                                           {<<"Birthday">>,<<"BDAY">>},
                                           {<<"Country">>,<<"CTRY">>},
                                           {<<"City">>,<<"LOCALITY">>},
                                           {<<"Email">>,<<"EMAIL">>},
                                           {<<"Organization Name">>,
                                            <<"ORGNAME">>},
                                           {<<"Organization Unit">>,
                                            <<"ORGUNIT">>}],
                                         <<"uids">> => [{<<"uid">>,<<"%u">>}],
                                         <<"vcard_map">> =>
                                          [{<<"NICKNAME">>,<<"%u">>,[]},
                                           {<<"FN">>,<<"%s">>,
                                            [<<"displayName">>]},
                                           {<<"FAMILY">>,<<"%s">>,[<<"sn">>]},
                                           {<<"GIVEN">>,<<"%s">>,
                                            [<<"givenName">>]},
                                           {<<"MIDDLE">>,<<"%s">>,
                                            [<<"initials">>]},
                                           {<<"ORGNAME">>,<<"%s">>,[<<"o">>]},
                                           {<<"ORGUNIT">>,<<"%s">>,[<<"ou">>]},
                                           {<<"CTRY">>,<<"%s">>,[<<"c">>]},
                                           {<<"LOCALITY">>,<<"%s">>,[<<"l">>]},
                                           {<<"STREET">>,<<"%s">>,
                                            [<<"street">>]},
                                           {<<"REGION">>,<<"%s">>,[<<"st">>]},
                                           {<<"PCODE">>,<<"%s">>,
                                            [<<"postalCode">>]},
                                           {<<"TITLE">>,<<"%s">>,
                                            [<<"title">>]},
                                           {<<"URL">>,<<"%s">>,
                                            [<<"labeleduri">>]},
                                           {<<"DESC">>,<<"%s">>,
                                            [<<"description">>]},
                                           {<<"TEL">>,<<"%s">>,
                                            [<<"telephoneNumber">>]},
                                           {<<"EMAIL">>,<<"%s">>,[<<"mail">>]},
                                           {<<"BDAY">>,<<"%s">>,
                                            [<<"birthDay">>]},
                                           {<<"ROLE">>,<<"%s">>,
                                            [<<"employeeType">>]},
                                           {<<"PHOTO">>,<<"%s">>,
                                            [<<"jpegPhoto">>]}]},
                                       default,always},
                                     <<"matches">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"search">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,#Fun<mod_vcard.0.52229309>,
                                   #{<<"backend">> => mnesia,
                                     <<"host">> => {prefix,<<"vjud.">>},
                                     <<"iqdisc">> => parallel,
                                     <<"matches">> => 30,<<"search">> => true},
                                   default,when_present},
                                 <<"mod_blocking">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_privacy},
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia},
                                   default,when_present},
                                 <<"mod_privacy">> =>
                                  {section,
                                   #{<<"backend">> =>
                                      {option,atom,
                                       {module,mod_privacy},
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"backend">> => mnesia},
                                   default,when_present},
                                 <<"mod_mam">> =>
                                  {section,
                                   #{<<"archive_chat_markers">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"async_writer">> =>
                                      {section,
                                       #{<<"batch_size">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"enabled">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"flush_interval">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"pool_size">> =>
                                          {option,integer,non_negative,
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"batch_size">> => 30,
                                         <<"enabled">> => true,
                                         <<"flush_interval">> => 2000,
                                         <<"pool_size">> => 16},
                                       default,always},
                                     <<"backend">> =>
                                      {option,atom,
                                       {enum,[rdbms,cassandra,elasticsearch]},
                                       undefined,default},
                                     <<"cache">> =>
                                      {section,
                                       #{<<"module">> =>
                                          {option,atom,
                                           {enum,[internal,mod_cache_users]},
                                           undefined,default},
                                         <<"number_of_segments">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,[fifo,lru]},
                                           undefined,default},
                                         <<"time_to_live">> =>
                                          {option,int_or_infinity,positive,
                                           undefined,default}},
                                       any,[],any,map,
                                       fun mongoose_user_cache:process_cache_config/1,
                                       #{<<"module">> => internal,
                                         <<"number_of_segments">> => 3,
                                         <<"strategy">> => fifo,
                                         <<"time_to_live">> => 480},
                                       default,always},
                                     <<"cache_users">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"db_jid_format">> =>
                                      {option,atom,module,undefined,default},
                                     <<"db_message_format">> =>
                                      {option,atom,module,undefined,default},
                                     <<"default_result_limit">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"delete_domain_limit">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"enforce_simple_queries">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"extra_fin_element">> =>
                                      {option,atom,module,undefined,default},
                                     <<"extra_lookup_params">> =>
                                      {option,atom,module,undefined,default},
                                     <<"full_text_search">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"is_archivable_message">> =>
                                      {option,atom,module,undefined,default},
                                     <<"max_result_limit">> =>
                                      {option,integer,non_negative,undefined,
                                       default},
                                     <<"message_retraction">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"muc">> =>
                                      {section,
                                       #{<<"archive_chat_markers">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"async_writer">> =>
                                          {section,
                                           #{<<"batch_size">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"enabled">> =>
                                              {option,boolean,any,undefined,
                                               default},
                                             <<"flush_interval">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"pool_size">> =>
                                              {option,integer,non_negative,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"batch_size">> => 30,
                                             <<"enabled">> => true,
                                             <<"flush_interval">> => 2000,
                                             <<"pool_size">> => 16},
                                           default,when_present},
                                         <<"backend">> =>
                                          {option,atom,
                                           {enum,
                                            [rdbms,cassandra,elasticsearch]},
                                           undefined,default},
                                         <<"cache_users">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"db_jid_format">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"db_message_format">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"default_result_limit">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"delete_domain_limit">> =>
                                          {option,int_or_infinity,positive,
                                           undefined,default},
                                         <<"enforce_simple_queries">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"extra_fin_element">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"extra_lookup_params">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"full_text_search">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"host">> =>
                                          {option,string,subdomain_template,
                                           fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                           default},
                                         <<"is_archivable_message">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"max_result_limit">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"message_retraction">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"no_stanzaid_element">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"send_message">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"user_prefs_store">> =>
                                          {option,atom,
                                           {enum,[rdbms,cassandra,mnesia]},
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"host">> =>
                                          {prefix,<<"conference.">>}},
                                       default,when_present},
                                     <<"no_stanzaid_element">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"pm">> =>
                                      {section,
                                       #{<<"archive_chat_markers">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"archive_groupchats">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"async_writer">> =>
                                          {section,
                                           #{<<"batch_size">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"enabled">> =>
                                              {option,boolean,any,undefined,
                                               default},
                                             <<"flush_interval">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"pool_size">> =>
                                              {option,integer,non_negative,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"batch_size">> => 30,
                                             <<"enabled">> => true,
                                             <<"flush_interval">> => 2000,
                                             <<"pool_size">> => 16},
                                           default,when_present},
                                         <<"backend">> =>
                                          {option,atom,
                                           {enum,
                                            [rdbms,cassandra,elasticsearch]},
                                           undefined,default},
                                         <<"cache_users">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"db_jid_format">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"db_message_format">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"default_result_limit">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"delete_domain_limit">> =>
                                          {option,int_or_infinity,positive,
                                           undefined,default},
                                         <<"enforce_simple_queries">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"extra_fin_element">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"extra_lookup_params">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"full_text_search">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"is_archivable_message">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"max_result_limit">> =>
                                          {option,integer,non_negative,
                                           undefined,default},
                                         <<"message_retraction">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"no_stanzaid_element">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"same_mam_id_for_peers">> =>
                                          {option,boolean,any,undefined,
                                           default},
                                         <<"send_message">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"user_prefs_store">> =>
                                          {option,atom,
                                           {enum,[rdbms,cassandra,mnesia]},
                                           undefined,default}},
                                       any,[],any,map,undefined,
                                       #{<<"archive_groupchats">> => false,
                                         <<"same_mam_id_for_peers">> => false},
                                       default,when_present},
                                     <<"send_message">> =>
                                      {option,atom,module,undefined,default},
                                     <<"user_prefs_store">> =>
                                      {option,atom,
                                       {enum,[rdbms,cassandra,mnesia]},
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"archive_chat_markers">> => false,
                                     <<"backend">> => rdbms,
                                     <<"cache_users">> => true,
                                     <<"default_result_limit">> => 50,
                                     <<"enforce_simple_queries">> => false,
                                     <<"full_text_search">> => true,
                                     <<"is_archivable_message">> =>
                                      mod_mam_utils,
                                     <<"max_result_limit">> => 50,
                                     <<"message_retraction">> => true,
                                     <<"no_stanzaid_element">> => false,
                                     <<"send_message">> => mod_mam_utils},
                                   default,when_present},
                                 <<"mod_version">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"os_info">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => no_queue,
                                     <<"os_info">> => false},
                                   default,when_present},
                                 <<"mod_ping">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"ping_interval">> =>
                                      {option,integer,positive,
                                       fun timer:seconds/1,default},
                                     <<"ping_req_timeout">> =>
                                      {option,integer,positive,
                                       fun timer:seconds/1,default},
                                     <<"send_pings">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"timeout_action">> =>
                                      {option,atom,
                                       {enum,[none,kill]},
                                       undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => no_queue,
                                     <<"ping_interval">> => 60000,
                                     <<"ping_req_timeout">> => 32000,
                                     <<"send_pings">> => false,
                                     <<"timeout_action">> => none},
                                   default,when_present},
                                 <<"mod_adhoc">> =>
                                  {section,
                                   #{<<"iqdisc">> =>
                                      {section,
                                       #{<<"type">> =>
                                          {option,atom,
                                           {enum,
                                            [no_queue,one_queue,parallel,
                                             queues]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,
                                       [<<"type">>],
                                       any,map,
                                       fun mongoose_config_spec:process_iqdisc/1,
                                       #{},default,when_present},
                                     <<"report_commands_node">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"iqdisc">> => one_queue,
                                     <<"report_commands_node">> => false},
                                   default,when_present}},
                               module,[],any,map,undefined,#{},host_config,
                               when_present},
                             <<"outgoing_pools">> =>
                              {section,
                               #{<<"cassandra">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"auth">> =>
                                              {section,
                                               #{<<"plain">> =>
                                                  {section,
                                                   #{<<"password">> =>
                                                      {option,binary,any,
                                                       undefined,default},
                                                     <<"username">> =>
                                                      {option,binary,any,
                                                       undefined,default}},
                                                   any,all,any,map,undefined,
                                                   #{},default,when_present}},
                                               any,all,any,map,undefined,#{},
                                               default,when_present},
                                             <<"keyspace">> =>
                                              {option,atom,non_empty,
                                               undefined,default},
                                             <<"servers">> =>
                                              {list,
                                               {section,
                                                #{<<"host">> =>
                                                   {option,string,non_empty,
                                                    undefined,default},
                                                  <<"port">> =>
                                                   {option,integer,port,
                                                    undefined,default}},
                                                any,
                                                [<<"host">>],
                                                any,map,undefined,
                                                #{<<"port">> => 9042},
                                                default,when_present},
                                               unique_non_empty,list,
                                               undefined,default},
                                             <<"tls">> =>
                                              {section,
                                               #{<<"cacertfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"certfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"ciphers">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"keyfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"password">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"server_name_indication">> =>
                                                  {section,
                                                   #{<<"enabled">> =>
                                                      {option,boolean,any,
                                                       undefined,default},
                                                     <<"host">> =>
                                                      {option,string,
                                                       non_empty,undefined,
                                                       default},
                                                     <<"protocol">> =>
                                                      {option,atom,
                                                       {enum,[default,https]},
                                                       undefined,default}},
                                                   any,[],any,map,undefined,
                                                   #{<<"enabled">> => true,
                                                     <<"protocol">> =>
                                                      default},
                                                   default,always},
                                                 <<"verify_mode">> =>
                                                  {option,atom,
                                                   {enum,
                                                    [peer,selfsigned_peer,
                                                     none]},
                                                   undefined,default},
                                                 <<"versions">> =>
                                                  {list,
                                                   {option,atom,any,
                                                    undefined,default},
                                                   any,list,undefined,
                                                   default}},
                                               any,[],any,map,
                                               #Fun<mongoose_config_utils.0.103156362>,
                                               #{<<"verify_mode">> => peer},
                                               default,when_present}},
                                           any,[],any,map,undefined,
                                           #{<<"keyspace">> => mongooseim,
                                             <<"servers">> =>
                                              [#{port => 9042,
                                                 host => "localhost"}]},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 20},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"elastic">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"host">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default}},
                                           any,[],any,map,undefined,
                                           #{<<"host">> => <<"localhost">>,
                                             <<"port">> => 9200},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"http">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"host">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"path_prefix">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"request_timeout">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"tls">> =>
                                              {section,
                                               #{<<"cacertfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"certfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"ciphers">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"keyfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"password">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"server_name_indication">> =>
                                                  {section,
                                                   #{<<"enabled">> =>
                                                      {option,boolean,any,
                                                       undefined,default},
                                                     <<"host">> =>
                                                      {option,string,
                                                       non_empty,undefined,
                                                       default},
                                                     <<"protocol">> =>
                                                      {option,atom,
                                                       {enum,[default,https]},
                                                       undefined,default}},
                                                   any,[],any,map,undefined,
                                                   #{<<"enabled">> => true,
                                                     <<"protocol">> =>
                                                      default},
                                                   default,always},
                                                 <<"verify_mode">> =>
                                                  {option,atom,
                                                   {enum,
                                                    [peer,selfsigned_peer,
                                                     none]},
                                                   undefined,default},
                                                 <<"versions">> =>
                                                  {list,
                                                   {option,atom,any,
                                                    undefined,default},
                                                   any,list,undefined,
                                                   default}},
                                               any,[],any,map,
                                               #Fun<mongoose_config_utils.0.103156362>,
                                               #{<<"verify_mode">> => peer},
                                               default,when_present}},
                                           any,
                                           [<<"host">>],
                                           any,map,undefined,
                                           #{<<"path_prefix">> => <<"/">>,
                                             <<"request_timeout">> => 2000},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"ldap">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"connect_interval">> =>
                                              {option,integer,positive,
                                               undefined,default},
                                             <<"password">> =>
                                              {option,binary,any,undefined,
                                               default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default},
                                             <<"root_dn">> =>
                                              {option,binary,any,undefined,
                                               default},
                                             <<"servers">> =>
                                              {list,
                                               {option,string,any,undefined,
                                                default},
                                               unique_non_empty,list,
                                               undefined,default},
                                             <<"tls">> =>
                                              {section,
                                               #{<<"cacertfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"certfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"ciphers">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"keyfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"password">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"server_name_indication">> =>
                                                  {section,
                                                   #{<<"enabled">> =>
                                                      {option,boolean,any,
                                                       undefined,default},
                                                     <<"host">> =>
                                                      {option,string,
                                                       non_empty,undefined,
                                                       default},
                                                     <<"protocol">> =>
                                                      {option,atom,
                                                       {enum,[default,https]},
                                                       undefined,default}},
                                                   any,[],any,map,undefined,
                                                   #{<<"enabled">> => true,
                                                     <<"protocol">> =>
                                                      default},
                                                   default,always},
                                                 <<"verify_mode">> =>
                                                  {option,atom,
                                                   {enum,
                                                    [peer,selfsigned_peer,
                                                     none]},
                                                   undefined,default},
                                                 <<"versions">> =>
                                                  {list,
                                                   {option,atom,any,
                                                    undefined,default},
                                                   any,list,undefined,
                                                   default}},
                                               any,[],any,map,
                                               #Fun<mongoose_config_utils.0.103156362>,
                                               #{<<"verify_mode">> => peer},
                                               default,when_present}},
                                           any,[],any,map,
                                           fun mongoose_config_spec:process_ldap_connection/1,
                                           #{<<"connect_interval">> => 10000,
                                             <<"password">> => <<>>,
                                             <<"root_dn">> => <<>>,
                                             <<"servers">> => ["localhost"]},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"rabbit">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"confirms_enabled">> =>
                                              {option,boolean,any,undefined,
                                               default},
                                             <<"host">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"max_worker_queue_len">> =>
                                              {option,int_or_infinity,
                                               non_negative,undefined,default},
                                             <<"password">> =>
                                              {option,binary,non_empty,
                                               undefined,default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default},
                                             <<"username">> =>
                                              {option,binary,non_empty,
                                               undefined,default}},
                                           any,[],any,map,undefined,
                                           #{<<"confirms_enabled">> => false,
                                             <<"host">> => "localhost",
                                             <<"max_worker_queue_len">> =>
                                              1000,
                                             <<"password">> => <<"guest">>,
                                             <<"port">> => 5672,
                                             <<"username">> => <<"guest">>},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"rdbms">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"database">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"driver">> =>
                                              {option,atom,
                                               {enum,[odbc,pgsql,mysql]},
                                               undefined,default},
                                             <<"host">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"keepalive_interval">> =>
                                              {option,integer,positive,
                                               undefined,default},
                                             <<"max_start_interval">> =>
                                              {option,integer,positive,
                                               undefined,default},
                                             <<"password">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default},
                                             <<"query_timeout">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"settings">> =>
                                              {option,string,any,undefined,
                                               default},
                                             <<"tls">> =>
                                              {section,
                                               #{<<"cacertfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"certfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"ciphers">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"keyfile">> =>
                                                  {option,string,filename,
                                                   undefined,default},
                                                 <<"password">> =>
                                                  {option,string,any,
                                                   undefined,default},
                                                 <<"required">> =>
                                                  {option,boolean,any,
                                                   undefined,default},
                                                 <<"server_name_indication">> =>
                                                  {section,
                                                   #{<<"enabled">> =>
                                                      {option,boolean,any,
                                                       undefined,default},
                                                     <<"host">> =>
                                                      {option,string,
                                                       non_empty,undefined,
                                                       default},
                                                     <<"protocol">> =>
                                                      {option,atom,
                                                       {enum,[default,https]},
                                                       undefined,default}},
                                                   any,[],any,map,undefined,
                                                   #{<<"enabled">> => true,
                                                     <<"protocol">> =>
                                                      default},
                                                   default,always},
                                                 <<"verify_mode">> =>
                                                  {option,atom,
                                                   {enum,
                                                    [peer,selfsigned_peer,
                                                     none]},
                                                   undefined,default},
                                                 <<"versions">> =>
                                                  {list,
                                                   {option,atom,any,
                                                    undefined,default},
                                                   any,list,undefined,
                                                   default}},
                                               any,[],any,map,
                                               #Fun<mongoose_config_utils.0.103156362>,
                                               #{<<"verify_mode">> => peer},
                                               default,when_present},
                                             <<"username">> =>
                                              {option,string,non_empty,
                                               undefined,default}},
                                           any,
                                           [<<"driver">>],
                                           any,map,
                                           fun mongoose_rdbms:process_options/1,
                                           #{<<"max_start_interval">> => 30,
                                             <<"query_timeout">> => 5000},
                                           default,when_present},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 60000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present},
                                 <<"redis">> =>
                                  {section,
                                   #{default =>
                                      {section,
                                       #{<<"call_timeout">> =>
                                          {option,integer,positive,undefined,
                                           default},
                                         <<"connection">> =>
                                          {section,
                                           #{<<"database">> =>
                                              {option,integer,non_negative,
                                               undefined,default},
                                             <<"host">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"password">> =>
                                              {option,string,any,undefined,
                                               default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default}},
                                           any,[],any,map,undefined,
                                           #{<<"database">> => 0,
                                             <<"host">> => "127.0.0.1",
                                             <<"password">> => [],
                                             <<"port">> => 6379},
                                           default,always},
                                         <<"strategy">> =>
                                          {option,atom,
                                           {enum,
                                            [best_worker,random_worker,
                                             next_worker,available_worker,
                                             next_available_worker]},
                                           undefined,default},
                                         <<"workers">> =>
                                          {option,integer,positive,undefined,
                                           default}},
                                       any,[],any,map,
                                       #Fun<mongoose_config_utils.0.103156362>,
                                       #{<<"call_timeout">> => 5000,
                                         <<"strategy">> => best_worker,
                                         <<"workers">> => 10},
                                       item,when_present}},
                                   non_empty,[],any,list,undefined,#{},none,
                                   when_present}},
                               any,[],any,list,undefined,#{},host_config,
                               when_present},
                             <<"s2s">> =>
                              {section,
                               #{<<"address">> =>
                                  {list,
                                   {section,
                                    #{<<"host">> =>
                                       {option,binary,non_empty,undefined,
                                        default},
                                      <<"ip_address">> =>
                                       {option,string,ip_address,undefined,
                                        default},
                                      <<"port">> =>
                                       {option,integer,port,undefined,
                                        default}},
                                    any,
                                    [<<"host">>,<<"ip_address">>],
                                    any,map,
                                    fun mongoose_config_spec:process_s2s_address/1,
                                    #{},default,when_present},
                                   any,map,undefined,default},
                                 <<"certfile">> =>
                                  {option,string,filename,undefined,default},
                                 <<"ciphers">> =>
                                  {option,string,any,undefined,default},
                                 <<"default_policy">> =>
                                  {option,atom,
                                   {enum,[allow,deny]},
                                   undefined,default},
                                 <<"dns">> =>
                                  {section,
                                   #{<<"retries">> =>
                                      {option,integer,positive,undefined,
                                       default},
                                     <<"timeout">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"retries">> => 2,<<"timeout">> => 10},
                                   default,always},
                                 <<"host_policy">> =>
                                  {list,
                                   {section,
                                    #{<<"host">> =>
                                       {option,binary,non_empty,undefined,
                                        default},
                                      <<"policy">> =>
                                       {option,atom,
                                        {enum,[allow,deny]},
                                        undefined,default}},
                                    any,all,any,map,
                                    fun mongoose_config_spec:process_s2s_host_policy/1,
                                    #{},default,when_present},
                                   any,map,undefined,default},
                                 <<"max_retry_delay">> =>
                                  {option,integer,positive,undefined,default},
                                 <<"outgoing">> =>
                                  {section,
                                   #{<<"connection_timeout">> =>
                                      {option,int_or_infinity,positive,
                                       undefined,default},
                                     <<"ip_versions">> =>
                                      {list,
                                       {option,integer,
                                        {enum,[4,6]},
                                        undefined,default},
                                       unique_non_empty,list,undefined,
                                       default},
                                     <<"port">> =>
                                      {option,integer,port,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"connection_timeout">> => 10000,
                                     <<"ip_versions">> => [4,6],
                                     <<"port">> => 5269},
                                   default,always},
                                 <<"shared">> =>
                                  {option,binary,non_empty,undefined,default},
                                 <<"use_starttls">> =>
                                  {option,atom,
                                   {enum,
                                    [false,optional,required,
                                     required_trusted]},
                                   undefined,default}},
                               any,[],any,map,undefined,
                               #{<<"ciphers">> => "TLSv1.2:TLSv1.3",
                                 <<"default_policy">> => allow,
                                 <<"max_retry_delay">> => 300,
                                 <<"use_starttls">> => false},
                               host_config,when_present}},
                           any,[],any,list,undefined,#{},none,when_present},
                          any,list,undefined,none},
                        <<"internal_databases">> =>
                         {section,
                          #{<<"cets">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {enum,[file,rdbms]},
                                  undefined,default},
                                <<"cluster_name">> =>
                                 {option,atom,non_empty,undefined,default},
                                <<"node_list_file">> =>
                                 {option,string,filename,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => rdbms,
                                <<"cluster_name">> => mongooseim},
                              default,when_present},
                            <<"mnesia">> =>
                             {section,#{},any,[],any,map,undefined,#{},
                              default,when_present}},
                          any,[],any,map,undefined,#{},global_config,
                          when_present},
                        <<"listen">> =>
                         {section,
                          #{<<"c2s">> =>
                             {list,
                              {section,
                               #{<<"access">> =>
                                  {option,atom,non_empty,undefined,default},
                                 <<"allowed_auth_methods">> =>
                                  {list,
                                   {option,atom,
                                    {module,ejabberd_auth},
                                    undefined,default},
                                   unique,list,undefined,default},
                                 <<"backlog">> =>
                                  {option,integer,non_negative,undefined,
                                   default},
                                 <<"backwards_compatible_session">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"c2s_state_timeout">> =>
                                  {option,int_or_infinity,non_negative,
                                   undefined,default},
                                 <<"hibernate_after">> =>
                                  {option,int_or_infinity,non_negative,
                                   undefined,default},
                                 <<"ip_address">> =>
                                  {option,string,ip_address,undefined,default},
                                 <<"ip_version">> =>
                                  {option,integer,
                                   {enum,[4,6]},
                                   undefined,default},
                                 <<"max_connections">> =>
                                  {option,int_or_infinity,positive,undefined,
                                   default},
                                 <<"max_stanza_size">> =>
                                  {option,int_or_infinity,positive,
                                   fun mongoose_config_spec:process_infinity_as_zero/1,
                                   default},
                                 <<"num_acceptors">> =>
                                  {option,integer,positive,undefined,default},
                                 <<"port">> =>
                                  {option,integer,port,undefined,default},
                                 <<"proto">> =>
                                  {option,atom,{enum,[tcp]},undefined,default},
                                 <<"proxy_protocol">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"reuse_port">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"shaper">> =>
                                  {option,atom,non_empty,undefined,default},
                                 <<"tls">> =>
                                  {section,
                                   #{<<"cacertfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"certfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"ciphers">> =>
                                      {option,string,any,undefined,default},
                                     <<"crl_files">> =>
                                      {list,
                                       {option,string,filename,undefined,
                                        default},
                                       any,list,undefined,default},
                                     <<"dhfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"disconnect_on_failure">> =>
                                      {option,boolean,any,undefined,default},
                                     <<"keyfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"mode">> =>
                                      {option,atom,
                                       {enum,[tls,starttls,starttls_required]},
                                       undefined,default},
                                     <<"module">> =>
                                      {option,atom,
                                       {enum,[fast_tls,just_tls]},
                                       undefined,default},
                                     <<"password">> =>
                                      {option,string,any,undefined,default},
                                     <<"protocol_options">> =>
                                      {list,
                                       {option,string,non_empty,undefined,
                                        default},
                                       any,list,undefined,default},
                                     <<"verify_mode">> =>
                                      {option,atom,
                                       {enum,[peer,selfsigned_peer,none]},
                                       undefined,default},
                                     <<"versions">> =>
                                      {list,
                                       {option,atom,any,undefined,default},
                                       any,list,undefined,default}},
                                   any,[],any,map,
                                   #Fun<mongoose_config_utils.0.103156362>,
                                   #{<<"mode">> => starttls,
                                     <<"module">> => fast_tls,
                                     <<"verify_mode">> => peer},
                                   default,when_present}},
                               any,
                               [<<"port">>],
                               any,map,
                               #Fun<mongoose_config_utils.0.103156362>,
                               #{<<"access">> => all,<<"backlog">> => 1024,
                                 <<"backwards_compatible_session">> => true,
                                 <<"c2s_state_timeout">> => 5000,
                                 <<"hibernate_after">> => 0,
                                 <<"max_connections">> => infinity,
                                 <<"max_stanza_size">> => 0,
                                 <<"num_acceptors">> => 100,
                                 <<"proto">> => tcp,
                                 <<"proxy_protocol">> => false,
                                 <<"reuse_port">> => false,
                                 <<"shaper">> => none},
                               default,when_present},
                              any,list,undefined,none},
                            <<"http">> =>
                             {list,
                              {section,
                               #{<<"handlers">> =>
                                  {section,
                                   #{default =>
                                      {list,
                                       {section,
                                        #{<<"host">> =>
                                           {option,string,non_empty,
                                            fun mongoose_http_handler:cowboy_host/1,
                                            default},
                                          <<"path">> =>
                                           {option,string,any,undefined,
                                            default}},
                                        any,
                                        [<<"host">>,<<"path">>],
                                        any,map,
                                        fun mongoose_http_handler:process_config/2,
                                        #{},default,when_present},
                                       any,list,undefined,none},
                                     <<"mod_websockets">> =>
                                      {list,
                                       {section,
                                        #{<<"backwards_compatible_session">> =>
                                           {option,boolean,any,undefined,
                                            default},
                                          <<"c2s_state_timeout">> =>
                                           {option,int_or_infinity,
                                            non_negative,undefined,default},
                                          <<"host">> =>
                                           {option,string,non_empty,
                                            fun mongoose_http_handler:cowboy_host/1,
                                            default},
                                          <<"max_stanza_size">> =>
                                           {option,int_or_infinity,positive,
                                            undefined,default},
                                          <<"path">> =>
                                           {option,string,any,undefined,
                                            default},
                                          <<"ping_rate">> =>
                                           {option,integer,positive,
                                            undefined,default},
                                          <<"timeout">> =>
                                           {option,int_or_infinity,
                                            non_negative,undefined,default}},
                                        any,
                                        [<<"host">>,<<"path">>],
                                        any,map,
                                        #Fun<mongoose_config_utils.0.103156362>,
                                        #{<<"backwards_compatible_session">> =>
                                           true,
                                          <<"c2s_state_timeout">> => 5000,
                                          <<"max_stanza_size">> => infinity,
                                          <<"timeout">> => 60000},
                                        default,when_present},
                                       any,list,undefined,none},
                                     <<"mongoose_admin_api">> =>
                                      {list,
                                       {section,
                                        #{<<"handlers">> =>
                                           {list,
                                            {option,atom,
                                             {enum,
                                              [contacts,users,sessions,
                                               messages,stanzas,muc_light,muc,
                                               inbox,domain,metrics]},
                                             undefined,default},
                                            unique,list,undefined,default},
                                          <<"host">> =>
                                           {option,string,non_empty,
                                            fun mongoose_http_handler:cowboy_host/1,
                                            default},
                                          <<"password">> =>
                                           {option,binary,any,undefined,
                                            default},
                                          <<"path">> =>
                                           {option,string,any,undefined,
                                            default},
                                          <<"username">> =>
                                           {option,binary,any,undefined,
                                            default}},
                                        any,
                                        [<<"host">>,<<"path">>],
                                        any,map,
                                        #Fun<mongoose_config_utils.0.103156362>,
                                        #{<<"handlers">> =>
                                           [contacts,users,sessions,messages,
                                            stanzas,muc_light,muc,inbox,
                                            domain,metrics]},
                                        default,when_present},
                                       any,list,undefined,none},
                                     <<"mongoose_client_api">> =>
                                      {list,
                                       {section,
                                        #{<<"docs">> =>
                                           {option,boolean,any,undefined,
                                            default},
                                          <<"handlers">> =>
                                           {list,
                                            {option,atom,
                                             {enum,
                                              [sse,messages,contacts,rooms,
                                               rooms_config,rooms_users,
                                               rooms_messages]},
                                             undefined,default},
                                            unique,list,undefined,default},
                                          <<"host">> =>
                                           {option,string,non_empty,
                                            fun mongoose_http_handler:cowboy_host/1,
                                            default},
                                          <<"path">> =>
                                           {option,string,any,undefined,
                                            default}},
                                        any,
                                        [<<"host">>,<<"path">>],
                                        any,map,
                                        #Fun<mongoose_config_utils.0.103156362>,
                                        #{<<"docs">> => true,
                                          <<"handlers">> =>
                                           [sse,messages,contacts,rooms,
                                            rooms_config,rooms_users,
                                            rooms_messages]},
                                        default,when_present},
                                       any,list,undefined,none},
                                     <<"mongoose_graphql_handler">> =>
                                      {list,
                                       {section,
                                        #{<<"allowed_categories">> =>
                                           {list,
                                            {option,binary,
                                             {enum,
                                              [<<"checkAuth">>,<<"account">>,
                                               <<"domain">>,<<"last">>,
                                               <<"muc">>,<<"muc_light">>,
                                               <<"session">>,<<"stanza">>,
                                               <<"roster">>,<<"vcard">>,
                                               <<"private">>,<<"metric">>,
                                               <<"stat">>,<<"gdpr">>,
                                               <<"mnesia">>,<<"server">>,
                                               <<"inbox">>,<<"http_upload">>,
                                               <<"offline">>,<<"token">>]},
                                             undefined,default},
                                            unique_non_empty,list,undefined,
                                            default},
                                          <<"host">> =>
                                           {option,string,non_empty,
                                            fun mongoose_http_handler:cowboy_host/1,
                                            default},
                                          <<"password">> =>
                                           {option,binary,any,undefined,
                                            default},
                                          <<"path">> =>
                                           {option,string,any,undefined,
                                            default},
                                          <<"schema_endpoint">> =>
                                           {option,atom,
                                            {enum,[admin,domain_admin,user]},
                                            undefined,default},
                                          <<"sse_idle_timeout">> =>
                                           {option,int_or_infinity,positive,
                                            undefined,default},
                                          <<"username">> =>
                                           {option,binary,any,undefined,
                                            default}},
                                        any,
                                        [<<"host">>,<<"path">>,
                                         <<"schema_endpoint">>],
                                        any,map,
                                        #Fun<mongoose_config_utils.0.103156362>,
                                        #{<<"sse_idle_timeout">> => 3600000},
                                        default,when_present},
                                       any,list,undefined,none}},
                                   module,[],any,list,undefined,#{},default,
                                   always},
                                 <<"ip_address">> =>
                                  {option,string,ip_address,undefined,default},
                                 <<"ip_version">> =>
                                  {option,integer,
                                   {enum,[4,6]},
                                   undefined,default},
                                 <<"port">> =>
                                  {option,integer,port,undefined,default},
                                 <<"proto">> =>
                                  {option,atom,{enum,[tcp]},undefined,default},
                                 <<"protocol">> =>
                                  {section,
                                   #{<<"compress">> =>
                                      {option,boolean,any,undefined,default}},
                                   any,[],any,map,undefined,
                                   #{<<"compress">> => false},
                                   default,always},
                                 <<"tls">> =>
                                  {section,
                                   #{<<"cacertfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"certfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"ciphers">> =>
                                      {option,string,any,undefined,default},
                                     <<"dhfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"keyfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"password">> =>
                                      {option,string,any,undefined,default},
                                     <<"verify_mode">> =>
                                      {option,atom,
                                       {enum,[peer,selfsigned_peer,none]},
                                       undefined,default},
                                     <<"versions">> =>
                                      {list,
                                       {option,atom,any,undefined,default},
                                       any,list,undefined,default}},
                                   any,[],any,map,
                                   #Fun<mongoose_config_utils.0.103156362>,
                                   #{<<"verify_mode">> => peer},
                                   default,when_present},
                                 <<"transport">> =>
                                  {section,
                                   #{<<"max_connections">> =>
                                      {option,int_or_infinity,non_negative,
                                       undefined,default},
                                     <<"num_acceptors">> =>
                                      {option,integer,positive,undefined,
                                       default}},
                                   any,[],any,map,undefined,
                                   #{<<"max_connections">> => 1024,
                                     <<"num_acceptors">> => 100},
                                   default,always}},
                               any,
                               [<<"port">>],
                               any,map,
                               #Fun<mongoose_config_utils.0.103156362>,
                               #{<<"proto">> => tcp},
                               default,when_present},
                              any,list,undefined,none},
                            <<"s2s">> =>
                             {list,
                              {section,
                               #{<<"backlog">> =>
                                  {option,integer,non_negative,undefined,
                                   default},
                                 <<"hibernate_after">> =>
                                  {option,int_or_infinity,non_negative,
                                   undefined,default},
                                 <<"ip_address">> =>
                                  {option,string,ip_address,undefined,default},
                                 <<"ip_version">> =>
                                  {option,integer,
                                   {enum,[4,6]},
                                   undefined,default},
                                 <<"max_stanza_size">> =>
                                  {option,int_or_infinity,positive,
                                   fun mongoose_config_spec:process_infinity_as_zero/1,
                                   default},
                                 <<"num_acceptors">> =>
                                  {option,integer,positive,undefined,default},
                                 <<"port">> =>
                                  {option,integer,port,undefined,default},
                                 <<"proto">> =>
                                  {option,atom,{enum,[tcp]},undefined,default},
                                 <<"proxy_protocol">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"shaper">> =>
                                  {option,atom,non_empty,undefined,default},
                                 <<"tls">> =>
                                  {section,
                                   #{<<"cacertfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"certfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"ciphers">> =>
                                      {option,string,any,undefined,default},
                                     <<"dhfile">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"protocol_options">> =>
                                      {list,
                                       {option,string,non_empty,undefined,
                                        default},
                                       any,list,undefined,default},
                                     <<"verify_mode">> =>
                                      {option,atom,
                                       {enum,[peer,selfsigned_peer,none]},
                                       undefined,default}},
                                   any,[],any,map,
                                   #Fun<mongoose_config_utils.0.103156362>,
                                   #{<<"verify_mode">> => peer},
                                   default,always}},
                               any,
                               [<<"port">>],
                               any,map,
                               #Fun<mongoose_config_utils.0.103156362>,
                               #{<<"backlog">> => 1024,
                                 <<"hibernate_after">> => 0,
                                 <<"max_stanza_size">> => 0,
                                 <<"num_acceptors">> => 100,
                                 <<"proto">> => tcp,
                                 <<"proxy_protocol">> => false,
                                 <<"shaper">> => none},
                               default,when_present},
                              any,list,undefined,none},
                            <<"service">> =>
                             {list,
                              {section,
                               #{<<"access">> =>
                                  {option,atom,non_empty,undefined,default},
                                 <<"backlog">> =>
                                  {option,integer,non_negative,undefined,
                                   default},
                                 <<"check_from">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"conflict_behaviour">> =>
                                  {option,atom,
                                   {enum,[kick_old,disconnect]},
                                   undefined,default},
                                 <<"hibernate_after">> =>
                                  {option,int_or_infinity,non_negative,
                                   undefined,default},
                                 <<"hidden_components">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"ip_address">> =>
                                  {option,string,ip_address,undefined,default},
                                 <<"ip_version">> =>
                                  {option,integer,
                                   {enum,[4,6]},
                                   undefined,default},
                                 <<"max_fsm_queue">> =>
                                  {option,integer,positive,undefined,default},
                                 <<"max_stanza_size">> =>
                                  {option,int_or_infinity,positive,
                                   fun mongoose_config_spec:process_infinity_as_zero/1,
                                   default},
                                 <<"num_acceptors">> =>
                                  {option,integer,positive,undefined,default},
                                 <<"password">> =>
                                  {option,string,non_empty,undefined,default},
                                 <<"port">> =>
                                  {option,integer,port,undefined,default},
                                 <<"proto">> =>
                                  {option,atom,{enum,[tcp]},undefined,default},
                                 <<"proxy_protocol">> =>
                                  {option,boolean,any,undefined,default},
                                 <<"shaper_rule">> =>
                                  {option,atom,non_empty,undefined,default}},
                               any,
                               [<<"port">>,<<"password">>],
                               any,map,
                               #Fun<mongoose_config_utils.0.103156362>,
                               #{<<"access">> => all,<<"backlog">> => 1024,
                                 <<"check_from">> => true,
                                 <<"conflict_behaviour">> => disconnect,
                                 <<"hibernate_after">> => 0,
                                 <<"hidden_components">> => false,
                                 <<"max_stanza_size">> => 0,
                                 <<"num_acceptors">> => 100,
                                 <<"proto">> => tcp,
                                 <<"proxy_protocol">> => false,
                                 <<"shaper_rule">> => none},
                               default,when_present},
                              any,list,undefined,none}},
                          any,[],any,list,
                          fun mongoose_listener_config:verify_unique_listeners/1,
                          #{},global_config,always},
                        <<"modules">> =>
                         {section,
                          #{<<"mod_time">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => one_queue},
                              default,when_present},
                            <<"mod_keystore">> =>
                             {section,
                              #{<<"keys">> =>
                                 {list,
                                  {section,
                                   #{<<"name">> =>
                                      {option,atom,non_empty,undefined,
                                       default},
                                     <<"path">> =>
                                      {option,string,filename,undefined,
                                       default},
                                     <<"type">> =>
                                      {option,atom,
                                       {enum,[file,ram]},
                                       undefined,default}},
                                   any,
                                   [<<"name">>,<<"type">>],
                                   any,map,fun mod_keystore:process_key/1,#{},
                                   default,when_present},
                                  any,map,undefined,default},
                                <<"ram_key_size">> =>
                                 {option,integer,non_negative,undefined,
                                  default}},
                              any,[],any,map,undefined,
                              #{<<"keys">> => #{},<<"ram_key_size">> => 2048},
                              default,when_present},
                            <<"mod_disco">> =>
                             {section,
                              #{<<"extra_domains">> =>
                                 {list,
                                  {option,binary,domain,undefined,default},
                                  any,list,undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"server_info">> =>
                                 {list,
                                  {section,
                                   #{<<"modules">> =>
                                      {list,
                                       {option,atom,module,undefined,default},
                                       any,list,undefined,default},
                                     <<"name">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"urls">> =>
                                      {list,
                                       {option,binary,url,undefined,default},
                                       any,list,undefined,default}},
                                   any,
                                   [<<"name">>,<<"urls">>],
                                   any,map,undefined,#{},default,when_present},
                                  any,list,undefined,default},
                                <<"users_can_see_hidden_services">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"extra_domains">> => [],
                                <<"iqdisc">> => one_queue,
                                <<"server_info">> => [],
                                <<"users_can_see_hidden_services">> => true},
                              default,when_present},
                            <<"mod_cache_users">> =>
                             {section,
                              #{<<"number_of_segments">> =>
                                 {option,integer,positive,undefined,default},
                                <<"strategy">> =>
                                 {option,atom,
                                  {enum,[fifo,lru]},
                                  undefined,default},
                                <<"time_to_live">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default}},
                              any,[],any,map,
                              fun mongoose_user_cache:process_cache_config/1,
                              #{<<"number_of_segments">> => 3,
                                <<"strategy">> => fifo,
                                <<"time_to_live">> => 480},
                              default,when_present},
                            <<"mod_auth_token">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_auth_token},
                                  undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"validity_period">> =>
                                 {section,
                                  #{<<"access">> =>
                                     {section,
                                      #{<<"unit">> =>
                                         {option,atom,
                                          {enum,[days,hours,minutes,seconds]},
                                          undefined,default},
                                        <<"value">> =>
                                         {option,integer,non_negative,
                                          undefined,default}},
                                      any,all,any,map,undefined,#{},default,
                                      when_present},
                                    <<"refresh">> =>
                                     {section,
                                      #{<<"unit">> =>
                                         {option,atom,
                                          {enum,[days,hours,minutes,seconds]},
                                          undefined,default},
                                        <<"value">> =>
                                         {option,integer,non_negative,
                                          undefined,default}},
                                      any,all,any,map,undefined,#{},default,
                                      when_present}},
                                  any,[],any,map,undefined,
                                  #{<<"access">> =>
                                     #{unit => hours,value => 1},
                                    <<"refresh">> =>
                                     #{unit => days,value => 25}},
                                  default,always}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => rdbms,
                                <<"iqdisc">> => no_queue},
                              default,when_present},
                            <<"mod_csi">> =>
                             {section,
                              #{<<"buffer_max">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"buffer_max">> => 20},
                              default,when_present},
                            <<"mod_muc">> =>
                             {section,
                              #{<<"access">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"access_admin">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"access_create">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"access_persistent">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,mod_muc},
                                  undefined,default},
                                <<"default_room">> =>
                                 {section,
                                  #{<<"affiliations">> =>
                                     {list,
                                      {section,
                                       #{<<"affiliation">> =>
                                          {option,atom,non_empty,undefined,
                                           default},
                                         <<"resource">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"server">> =>
                                          {option,binary,domain,undefined,
                                           default},
                                         <<"user">> =>
                                          {option,binary,non_empty,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_muc:process_room_affiliation/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"allow_change_subj">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_multiple_sessions">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_private_messages">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_query_users">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_user_invites">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_visitor_nickchange">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"allow_visitor_status">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"anonymous">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"description">> =>
                                     {option,binary,any,undefined,default},
                                    <<"logging">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"max_users">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"maygetmemberlist">> =>
                                     {list,
                                      {option,atom,non_empty,undefined,
                                       default},
                                      any,list,undefined,default},
                                    <<"members_by_default">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"members_only">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"moderated">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"password">> =>
                                     {option,binary,any,undefined,default},
                                    <<"password_protected">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"persistent">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"public">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"public_list">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"subject">> =>
                                     {option,binary,any,undefined,default},
                                    <<"subject_author">> =>
                                     {option,binary,any,undefined,default},
                                    <<"title">> =>
                                     {option,binary,any,undefined,default}},
                                  any,[],any,map,undefined,
                                  #{<<"affiliations">> => [],
                                    <<"allow_change_subj">> => true,
                                    <<"allow_multiple_sessions">> => false,
                                    <<"allow_private_messages">> => true,
                                    <<"allow_query_users">> => true,
                                    <<"allow_user_invites">> => false,
                                    <<"allow_visitor_nickchange">> => true,
                                    <<"allow_visitor_status">> => true,
                                    <<"anonymous">> => true,
                                    <<"description">> => <<>>,
                                    <<"logging">> => false,
                                    <<"max_users">> => 200,
                                    <<"maygetmemberlist">> => [],
                                    <<"members_by_default">> => true,
                                    <<"members_only">> => false,
                                    <<"moderated">> => true,
                                    <<"password">> => <<>>,
                                    <<"password_protected">> => false,
                                    <<"persistent">> => false,
                                    <<"public">> => true,
                                    <<"public_list">> => true,
                                    <<"subject">> => <<>>,
                                    <<"subject_author">> => <<>>,
                                    <<"title">> => <<>>},
                                  default,when_present},
                                <<"hibernate_timeout">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"hibernated_room_check_interval">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"hibernated_room_timeout">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"history_size">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"host">> =>
                                 {option,string,subdomain_template,
                                  fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                  default},
                                <<"http_auth_pool">> =>
                                 {option,atom,pool_name,undefined,default},
                                <<"load_permanent_rooms_at_startup">> =>
                                 {option,boolean,any,undefined,default},
                                <<"max_room_desc">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"max_room_id">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"max_room_name">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"max_user_conferences">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"max_users">> =>
                                 {option,integer,positive,undefined,default},
                                <<"max_users_admin_threshold">> =>
                                 {option,integer,positive,undefined,default},
                                <<"min_message_interval">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"min_presence_interval">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"online_backend">> =>
                                 {option,atom,
                                  {module,mod_muc_online},
                                  undefined,default},
                                <<"room_shaper">> =>
                                 {option,atom,shaper,undefined,default},
                                <<"user_message_shaper">> =>
                                 {option,atom,shaper,undefined,default},
                                <<"user_presence_shaper">> =>
                                 {option,atom,shaper,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"access">> => all,
                                <<"access_admin">> => none,
                                <<"access_create">> => all,
                                <<"access_persistent">> => all,
                                <<"backend">> => mnesia,
                                <<"default_room">> =>
                                 #{public => true,description => <<>>,
                                   persistent => false,title => <<>>,
                                   password => <<>>,anonymous => true,
                                   subject => <<>>,allow_change_subj => true,
                                   allow_query_users => true,
                                   allow_private_messages => true,
                                   allow_visitor_status => true,
                                   allow_visitor_nickchange => true,
                                   public_list => true,moderated => true,
                                   members_by_default => true,
                                   members_only => false,
                                   allow_user_invites => false,
                                   allow_multiple_sessions => false,
                                   password_protected => false,
                                   max_users => 200,maygetmemberlist => [],
                                   logging => false,affiliations => [],
                                   subject_author => <<>>},
                                <<"hibernate_timeout">> => 90000,
                                <<"hibernated_room_check_interval">> =>
                                 infinity,
                                <<"hibernated_room_timeout">> => infinity,
                                <<"history_size">> => 20,
                                <<"host">> => {prefix,<<"conference.">>},
                                <<"http_auth_pool">> => none,
                                <<"load_permanent_rooms_at_startup">> => false,
                                <<"max_room_desc">> => infinity,
                                <<"max_room_id">> => infinity,
                                <<"max_room_name">> => infinity,
                                <<"max_user_conferences">> => 10,
                                <<"max_users">> => 200,
                                <<"max_users_admin_threshold">> => 5,
                                <<"min_message_interval">> => 0,
                                <<"min_presence_interval">> => 0,
                                <<"online_backend">> => mnesia,
                                <<"room_shaper">> => none,
                                <<"user_message_shaper">> => none,
                                <<"user_presence_shaper">> => none},
                              default,when_present},
                            <<"mod_muc_log">> =>
                             {section,
                              #{<<"access_log">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"css_file">> =>
                                 {option,binary,non_empty,undefined,default},
                                <<"dirname">> =>
                                 {option,atom,
                                  {enum,[room_jid,room_name]},
                                  undefined,default},
                                <<"dirtype">> =>
                                 {option,atom,
                                  {enum,[subdirs,plain]},
                                  undefined,default},
                                <<"file_format">> =>
                                 {option,atom,
                                  {enum,[html,plaintext]},
                                  undefined,default},
                                <<"outdir">> =>
                                 {option,string,dirname,undefined,default},
                                <<"spam_prevention">> =>
                                 {option,boolean,any,undefined,default},
                                <<"timezone">> =>
                                 {option,atom,
                                  {enum,[local,universal]},
                                  undefined,default},
                                <<"top_link">> =>
                                 {section,
                                  #{<<"target">> =>
                                     {option,string,url,undefined,default},
                                    <<"text">> =>
                                     {option,string,non_empty,undefined,
                                      default}},
                                  any,all,any,map,
                                  fun mod_muc_log:process_top_link/1,#{},
                                  default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"access_log">> => muc_admin,
                                <<"css_file">> => false,
                                <<"dirname">> => room_jid,
                                <<"dirtype">> => subdirs,
                                <<"file_format">> => html,
                                <<"outdir">> => "www/muc",
                                <<"spam_prevention">> => true,
                                <<"timezone">> => local,
                                <<"top_link">> => {"/","Home"}},
                              default,when_present},
                            <<"mod_caps">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_caps},
                                  undefined,default},
                                <<"cache_life_time">> =>
                                 {option,integer,positive,undefined,default},
                                <<"cache_size">> =>
                                 {option,integer,positive,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia,
                                <<"cache_life_time">> => 86400,
                                <<"cache_size">> => 1000},
                              default,when_present},
                            <<"mod_roster">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_roster},
                                  undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"store_current_id">> =>
                                 {option,boolean,any,undefined,default},
                                <<"versioning">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia,
                                <<"iqdisc">> => one_queue,
                                <<"store_current_id">> => false,
                                <<"versioning">> => false},
                              default,when_present},
                            <<"mod_extdisco">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"service">> =>
                                 {list,
                                  {section,
                                   #{<<"host">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"password">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"port">> =>
                                      {option,integer,port,undefined,default},
                                     <<"transport">> =>
                                      {option,binary,
                                       {enum,[<<"udp">>,<<"tcp">>]},
                                       undefined,default},
                                     <<"type">> =>
                                      {option,atom,non_empty,undefined,
                                       default},
                                     <<"username">> =>
                                      {option,binary,non_empty,undefined,
                                       default}},
                                   any,
                                   [<<"type">>,<<"host">>],
                                   any,map,undefined,#{},default,when_present},
                                  any,list,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => no_queue,<<"service">> => []},
                              default,when_present},
                            <<"mod_offline_chatmarkers">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_offline_chatmarkers},
                                  undefined,default},
                                <<"store_groupchat_messages">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => rdbms,
                                <<"store_groupchat_messages">> => false},
                              default,when_present},
                            <<"mod_private">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_private},
                                  undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => rdbms,
                                <<"iqdisc">> => one_queue},
                              default,when_present},
                            <<"mod_sic">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => one_queue},
                              default,when_present},
                            <<"mod_carboncopy">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => no_queue},
                              default,when_present},
                            default =>
                             {section,#{},any,[],any,map,undefined,#{},
                              default,when_present},
                            <<"mod_smart_markers">> =>
                             {section,
                              #{<<"async_writer">> =>
                                 {section,
                                  #{<<"pool_size">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"pool_size">> => 8},
                                  default,always},
                                <<"backend">> =>
                                 {option,atom,
                                  {enum,[rdbms,rdbms_async]},
                                  undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"keep_private">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => rdbms,
                                <<"iqdisc">> => no_queue,
                                <<"keep_private">> => false},
                              default,when_present},
                            <<"mod_global_distrib">> =>
                             {section,
                              #{<<"bounce">> =>
                                 {section,
                                  #{<<"enabled">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"max_retries">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"resend_after_ms">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"enabled">> => true,
                                    <<"max_retries">> => 4,
                                    <<"resend_after_ms">> => 200},
                                  default,always},
                                <<"cache">> =>
                                 {section,
                                  #{<<"cache_missed">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"domain_lifetime_seconds">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"jid_lifetime_seconds">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"max_jids">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"cache_missed">> => true,
                                    <<"domain_lifetime_seconds">> => 600,
                                    <<"jid_lifetime_seconds">> => 5,
                                    <<"max_jids">> => 10000},
                                  default,always},
                                <<"connections">> =>
                                 {section,
                                  #{<<"advertised_endpoints">> =>
                                     {list,
                                      {section,
                                       #{<<"host">> =>
                                          {option,string,network_address,
                                           undefined,default},
                                         <<"port">> =>
                                          {option,integer,port,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_global_distrib:process_endpoint/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"connections_per_endpoint">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"disabled_gc_interval">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"endpoint_refresh_interval">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"endpoint_refresh_interval_when_empty">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"endpoints">> =>
                                     {list,
                                      {section,
                                       #{<<"host">> =>
                                          {option,string,network_address,
                                           undefined,default},
                                         <<"port">> =>
                                          {option,integer,port,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_global_distrib:process_endpoint/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"tls">> =>
                                     {section,
                                      #{<<"cacertfile">> =>
                                         {option,string,filename,undefined,
                                          default},
                                        <<"certfile">> =>
                                         {option,string,filename,undefined,
                                          default},
                                        <<"ciphers">> =>
                                         {option,string,any,undefined,default},
                                        <<"dhfile">> =>
                                         {option,string,filename,undefined,
                                          default},
                                        <<"protocol_options">> =>
                                         {list,
                                          {option,string,non_empty,undefined,
                                           default},
                                          any,list,undefined,default},
                                        <<"verify_mode">> =>
                                         {option,atom,
                                          {enum,[peer,selfsigned_peer,none]},
                                          undefined,default}},
                                      any,[],any,map,
                                      #Fun<mongoose_config_utils.0.103156362>,
                                      #{<<"verify_mode">> => peer},
                                      default,when_present}},
                                  any,[],any,map,undefined,
                                  #{<<"connections_per_endpoint">> => 1,
                                    <<"disabled_gc_interval">> => 60,
                                    <<"endpoint_refresh_interval">> => 60,
                                    <<"endpoint_refresh_interval_when_empty">> =>
                                     3},
                                  default,always},
                                <<"global_host">> =>
                                 {option,binary,domain,undefined,default},
                                <<"hosts_refresh_interval">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"local_host">> =>
                                 {option,binary,domain,undefined,default},
                                <<"message_ttl">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"redis">> =>
                                 {section,
                                  #{<<"expire_after">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"pool">> =>
                                     {option,atom,pool_name,undefined,default},
                                    <<"refresh_after">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"expire_after">> => 120,
                                    <<"pool">> => global_distrib,
                                    <<"refresh_after">> => 60},
                                  default,always}},
                              any,
                              [<<"global_host">>,<<"local_host">>],
                              any,map,fun mod_global_distrib:process_opts/1,
                              #{<<"hosts_refresh_interval">> => 3000,
                                <<"message_ttl">> => 4},
                              default,when_present},
                            <<"mod_push_service_mongoosepush">> =>
                             {section,
                              #{<<"api_version">> =>
                                 {option,binary,
                                  {enum,[<<"v2">>,<<"v3">>]},
                                  undefined,default},
                                <<"max_http_connections">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"pool_name">> =>
                                 {option,atom,pool_name,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"api_version">> => <<"v3">>,
                                <<"max_http_connections">> => 100,
                                <<"pool_name">> => undefined},
                              default,when_present},
                            <<"mod_bosh">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_bosh},
                                  undefined,default},
                                <<"inactivity">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"max_pause">> =>
                                 {option,integer,positive,undefined,default},
                                <<"max_wait">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"server_acks">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia,
                                <<"inactivity">> => 30,<<"max_pause">> => 120,
                                <<"max_wait">> => infinity,
                                <<"server_acks">> => false},
                              default,when_present},
                            <<"mod_stream_management">> =>
                             {section,
                              #{<<"ack">> =>
                                 {option,boolean,any,undefined,default},
                                <<"ack_freq">> =>
                                 {option,integer,positive,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,mod_stream_management},
                                  undefined,default},
                                <<"buffer">> =>
                                 {option,boolean,any,undefined,default},
                                <<"buffer_max">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"resume_timeout">> =>
                                 {option,integer,positive,undefined,default},
                                <<"stale_h">> =>
                                 {section,
                                  #{<<"enabled">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"geriatric">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"repeat_after">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"enabled">> => false,
                                    <<"geriatric">> => 3600,
                                    <<"repeat_after">> => 1800},
                                  default,always}},
                              any,[],any,map,
                              fun mod_stream_management:process_buffer_and_ack/1,
                              #{<<"ack">> => true,<<"ack_freq">> => 1,
                                <<"backend">> => mnesia,<<"buffer">> => true,
                                <<"buffer_max">> => 100,
                                <<"resume_timeout">> => 600},
                              default,when_present},
                            <<"mod_inbox">> =>
                             {section,
                              #{<<"aff_changes">> =>
                                 {option,boolean,any,undefined,default},
                                <<"async_writer">> =>
                                 {section,
                                  #{<<"pool_size">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"pool_size">> => 8},
                                  default,always},
                                <<"backend">> =>
                                 {option,atom,
                                  {enum,[rdbms,rdbms_async]},
                                  undefined,default},
                                <<"bin_clean_after">> =>
                                 {option,integer,non_negative,
                                  fun timer:hours/1,default},
                                <<"bin_ttl">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"boxes">> =>
                                 {list,
                                  {option,binary,non_empty,undefined,default},
                                  unique,list,undefined,default},
                                <<"delete_domain_limit">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"groupchat">> =>
                                 {list,
                                  {option,atom,
                                   {enum,[muc,muclight]},
                                   undefined,default},
                                  any,list,undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"max_result_limit">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"remove_on_kicked">> =>
                                 {option,boolean,any,undefined,default},
                                <<"reset_markers">> =>
                                 {list,
                                  {option,binary,
                                   {enum,
                                    [<<"received">>,<<"displayed">>,
                                     <<"acknowledged">>]},
                                   undefined,default},
                                  any,list,undefined,default}},
                              any,[],any,map,
                              fun mod_inbox:process_inbox_boxes/1,
                              #{<<"aff_changes">> => true,
                                <<"backend">> => rdbms,
                                <<"bin_clean_after">> => 3600000,
                                <<"bin_ttl">> => 30,<<"boxes">> => [],
                                <<"delete_domain_limit">> => infinity,
                                <<"groupchat">> => [muclight],
                                <<"iqdisc">> => no_queue,
                                <<"max_result_limit">> => infinity,
                                <<"remove_on_kicked">> => true,
                                <<"reset_markers">> => [<<"displayed">>]},
                              default,when_present},
                            <<"mod_last">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_last},
                                  undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia,
                                <<"iqdisc">> => one_queue},
                              default,when_present},
                            <<"mod_event_pusher">> =>
                             {section,
                              #{<<"http">> =>
                                 {section,
                                  #{<<"handlers">> =>
                                     {list,
                                      {section,
                                       #{<<"callback_module">> =>
                                          {option,atom,module,undefined,
                                           default},
                                         <<"path">> =>
                                          {option,binary,any,
                                           fun mod_event_pusher_http:fix_path/1,
                                           default},
                                         <<"pool_name">> =>
                                          {option,atom,pool_name,undefined,
                                           default}},
                                       any,[],any,map,undefined,
                                       #{<<"callback_module">> =>
                                          mod_event_pusher_http_defaults,
                                         <<"path">> => <<>>,
                                         <<"pool_name">> => http_pool},
                                       default,when_present},
                                      unique,list,undefined,default}},
                                  any,[],any,map,undefined,
                                  #{<<"handlers">> => []},
                                  default,when_present},
                                <<"push">> =>
                                 {section,
                                  #{<<"backend">> =>
                                     {option,atom,
                                      {module,mod_event_pusher_push},
                                      undefined,default},
                                    <<"iqdisc">> =>
                                     {section,
                                      #{<<"type">> =>
                                         {option,atom,
                                          {enum,
                                           [no_queue,one_queue,parallel,
                                            queues]},
                                          undefined,default},
                                        <<"workers">> =>
                                         {option,integer,positive,undefined,
                                          default}},
                                      any,
                                      [<<"type">>],
                                      any,map,
                                      fun mongoose_config_spec:process_iqdisc/1,
                                      #{},default,when_present},
                                    <<"plugin_module">> =>
                                     {option,atom,module,undefined,default},
                                    <<"virtual_pubsub_hosts">> =>
                                     {list,
                                      {option,string,subdomain_template,
                                       fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                       default},
                                      any,list,undefined,default},
                                    <<"wpool">> =>
                                     {section,
                                      #{<<"call_timeout">> =>
                                         {option,integer,positive,undefined,
                                          default},
                                        <<"strategy">> =>
                                         {option,atom,
                                          {enum,
                                           [best_worker,random_worker,
                                            next_worker,available_worker,
                                            next_available_worker]},
                                          undefined,default},
                                        <<"workers">> =>
                                         {option,integer,positive,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"call_timeout">> => 5000,
                                        <<"strategy">> => available_worker,
                                        <<"workers">> => 10},
                                      default,always}},
                                  any,[],any,map,undefined,
                                  #{<<"backend">> => mnesia,
                                    <<"iqdisc">> => one_queue,
                                    <<"plugin_module">> =>
                                     mod_event_pusher_push_plugin_defaults,
                                    <<"virtual_pubsub_hosts">> => []},
                                  default,when_present},
                                <<"rabbit">> =>
                                 {section,
                                  #{<<"chat_msg_exchange">> =>
                                     {section,
                                      #{<<"name">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"recv_topic">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"sent_topic">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"type">> =>
                                         {option,binary,non_empty,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"name">> => <<"chat_msg">>,
                                        <<"recv_topic">> =>
                                         <<"chat_msg_recv">>,
                                        <<"sent_topic">> =>
                                         <<"chat_msg_sent">>,
                                        <<"type">> => <<"topic">>},
                                      default,always},
                                    <<"groupchat_msg_exchange">> =>
                                     {section,
                                      #{<<"name">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"recv_topic">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"sent_topic">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"type">> =>
                                         {option,binary,non_empty,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"name">> => <<"groupchat_msg">>,
                                        <<"recv_topic">> =>
                                         <<"groupchat_msg_recv">>,
                                        <<"sent_topic">> =>
                                         <<"groupchat_msg_sent">>,
                                        <<"type">> => <<"topic">>},
                                      default,always},
                                    <<"presence_exchange">> =>
                                     {section,
                                      #{<<"name">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"type">> =>
                                         {option,binary,non_empty,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"name">> => <<"presence">>,
                                        <<"type">> => <<"topic">>},
                                      default,always}},
                                  any,[],any,map,undefined,#{},default,
                                  when_present},
                                <<"sns">> =>
                                 {section,
                                  #{<<"access_key_id">> =>
                                     {option,string,any,undefined,default},
                                    <<"account_id">> =>
                                     {option,string,any,undefined,default},
                                    <<"muc_messages_topic">> =>
                                     {option,string,any,undefined,default},
                                    <<"plugin_module">> =>
                                     {option,atom,module,undefined,default},
                                    <<"pm_messages_topic">> =>
                                     {option,string,any,undefined,default},
                                    <<"pool_size">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"presence_updates_topic">> =>
                                     {option,string,any,undefined,default},
                                    <<"publish_retry_count">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"publish_retry_time_ms">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"region">> =>
                                     {option,string,any,undefined,default},
                                    <<"secret_access_key">> =>
                                     {option,string,any,undefined,default},
                                    <<"sns_host">> =>
                                     {option,string,any,undefined,default}},
                                  any,
                                  [<<"sns_host">>,<<"region">>,
                                   <<"access_key_id">>,
                                   <<"secret_access_key">>,<<"account_id">>],
                                  any,map,undefined,
                                  #{<<"plugin_module">> =>
                                     mod_event_pusher_sns_defaults,
                                    <<"pool_size">> => 100,
                                    <<"publish_retry_count">> => 2,
                                    <<"publish_retry_time_ms">> => 50},
                                  default,when_present}},
                              any,[],any,map,undefined,#{},default,
                              when_present},
                            <<"mod_register">> =>
                             {section,
                              #{<<"access">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"ip_access">> =>
                                 {list,
                                  {section,
                                   #{<<"address">> =>
                                      {option,string,ip_mask,undefined,
                                       default},
                                     <<"policy">> =>
                                      {option,atom,
                                       {enum,[allow,deny]},
                                       undefined,default}},
                                   any,all,any,map,
                                   fun mod_register:process_ip_access/1,#{},
                                   default,when_present},
                                  any,list,undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"password_strength">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"registration_watchers">> =>
                                 {list,
                                  {option,binary,jid,undefined,default},
                                  any,list,undefined,default},
                                <<"welcome_message">> =>
                                 {section,
                                  #{<<"body">> =>
                                     {option,string,any,undefined,default},
                                    <<"subject">> =>
                                     {option,string,any,undefined,default}},
                                  any,[],any,map,
                                  fun mod_register:process_welcome_message/1,
                                  #{<<"body">> => [],<<"subject">> => []},
                                  default,when_present}},
                              any,[],any,map,undefined,
                              #{<<"access">> => all,<<"ip_access">> => [],
                                <<"iqdisc">> => one_queue,
                                <<"password_strength">> => 0,
                                <<"registration_watchers">> => []},
                              default,when_present},
                            <<"mod_jingle_sip">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_jingle_sip},
                                  undefined,default},
                                <<"listen_port">> =>
                                 {option,integer,port,undefined,default},
                                <<"local_host">> =>
                                 {option,string,network_address,undefined,
                                  default},
                                <<"proxy_host">> =>
                                 {option,string,network_address,undefined,
                                  default},
                                <<"proxy_port">> =>
                                 {option,integer,port,undefined,default},
                                <<"sdp_origin">> =>
                                 {option,string,ip_address,undefined,default},
                                <<"transport">> =>
                                 {option,string,
                                  {enum,["udp","tcp"]},
                                  undefined,default},
                                <<"username_to_phone">> =>
                                 {list,
                                  {section,
                                   #{<<"phone">> =>
                                      {option,binary,any,undefined,default},
                                     <<"username">> =>
                                      {option,binary,any,undefined,default}},
                                   any,all,any,map,
                                   #Fun<mod_jingle_sip.0.54879970>,#{},
                                   default,when_present},
                                  any,list,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia,
                                <<"listen_port">> => 5600,
                                <<"local_host">> => "localhost",
                                <<"proxy_host">> => "localhost",
                                <<"proxy_port">> => 5060,
                                <<"sdp_origin">> => "127.0.0.1",
                                <<"transport">> => "udp",
                                <<"username_to_phone">> => []},
                              default,when_present},
                            <<"mod_muc_light">> =>
                             {section,
                              #{<<"all_can_configure">> =>
                                 {option,boolean,any,undefined,default},
                                <<"all_can_invite">> =>
                                 {option,boolean,any,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,mod_muc_light_db},
                                  undefined,default},
                                <<"blocking">> =>
                                 {option,boolean,any,undefined,default},
                                <<"cache_affs">> =>
                                 {section,
                                  #{<<"module">> =>
                                     {option,atom,
                                      {enum,[internal,mod_cache_users]},
                                      undefined,default},
                                    <<"number_of_segments">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,[fifo,lru]},
                                      undefined,default},
                                    <<"time_to_live">> =>
                                     {option,int_or_infinity,positive,
                                      undefined,default}},
                                  any,[],any,map,
                                  fun mongoose_user_cache:process_cache_config/1,
                                  #{<<"module">> => internal,
                                    <<"number_of_segments">> => 3,
                                    <<"strategy">> => fifo,
                                    <<"time_to_live">> => 2},
                                  default,when_present},
                                <<"config_schema">> =>
                                 {list,
                                  {section,
                                   #{<<"field">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"float_value">> =>
                                      {option,float,any,undefined,default},
                                     <<"integer_value">> =>
                                      {option,integer,any,undefined,default},
                                     <<"internal_key">> =>
                                      {option,atom,non_empty,undefined,
                                       default},
                                     <<"string_value">> =>
                                      {option,binary,any,undefined,default}},
                                   any,
                                   [<<"field">>],
                                   any,map,undefined,#{},default,when_present},
                                  any,list,
                                  fun mod_muc_light:process_config_schema/1,
                                  default},
                                <<"equal_occupants">> =>
                                 {option,boolean,any,undefined,default},
                                <<"host">> =>
                                 {option,string,subdomain_template,
                                  fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                  default},
                                <<"legacy_mode">> =>
                                 {option,boolean,any,undefined,default},
                                <<"max_occupants">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"rooms_in_rosters">> =>
                                 {option,boolean,any,undefined,default},
                                <<"rooms_per_page">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"rooms_per_user">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default}},
                              any,[],any,map,undefined,
                              #{<<"all_can_configure">> => false,
                                <<"all_can_invite">> => false,
                                <<"backend">> => mnesia,
                                <<"blocking">> => true,
                                <<"config_schema">> =>
                                 [{<<"roomname">>,<<"Untitled">>,roomname,
                                   binary},
                                  {<<"subject">>,<<>>,subject,binary}],
                                <<"equal_occupants">> => false,
                                <<"host">> => {prefix,<<"muclight.">>},
                                <<"legacy_mode">> => false,
                                <<"max_occupants">> => infinity,
                                <<"rooms_in_rosters">> => false,
                                <<"rooms_per_page">> => 10,
                                <<"rooms_per_user">> => infinity},
                              default,when_present},
                            <<"mod_domain_isolation">> =>
                             {section,#{},any,[],any,map,undefined,#{},
                              default,when_present},
                            <<"mod_shared_roster_ldap">> =>
                             {section,
                              #{<<"auth_check">> =>
                                 {option,boolean,any,undefined,default},
                                <<"base">> =>
                                 {option,binary,any,undefined,default},
                                <<"deref">> =>
                                 {option,atom,
                                  {enum,[never,always,finding,searching]},
                                  undefined,default},
                                <<"filter">> =>
                                 {option,binary,any,undefined,default},
                                <<"gfilter">> =>
                                 {option,binary,any,undefined,default},
                                <<"group_cache_size">> =>
                                 {option,integer,positive,undefined,default},
                                <<"group_cache_validity">> =>
                                 {option,integer,positive,undefined,default},
                                <<"groupattr">> =>
                                 {option,binary,any,undefined,default},
                                <<"groupdesc">> =>
                                 {option,binary,any,undefined,default},
                                <<"memberattr">> =>
                                 {option,binary,any,undefined,default},
                                <<"memberattr_format">> =>
                                 {option,binary,any,undefined,default},
                                <<"memberattr_format_re">> =>
                                 {option,binary,any,undefined,default},
                                <<"pool_tag">> =>
                                 {option,atom,pool_name,undefined,default},
                                <<"rfilter">> =>
                                 {option,binary,any,undefined,default},
                                <<"ufilter">> =>
                                 {option,binary,any,undefined,default},
                                <<"user_cache_size">> =>
                                 {option,integer,positive,undefined,default},
                                <<"user_cache_validity">> =>
                                 {option,integer,positive,undefined,default},
                                <<"userdesc">> =>
                                 {option,binary,any,undefined,default},
                                <<"useruid">> =>
                                 {option,binary,any,undefined,default}},
                              any,[],any,map,
                              #Fun<mod_shared_roster_ldap.0.13941630>,
                              #{<<"auth_check">> => true,<<"deref">> => never,
                                <<"filter">> => <<>>,<<"gfilter">> => <<>>,
                                <<"group_cache_size">> => 1000,
                                <<"group_cache_validity">> => 300,
                                <<"groupattr">> => <<"cn">>,
                                <<"memberattr">> => <<"memberUid">>,
                                <<"memberattr_format">> => <<"%u">>,
                                <<"memberattr_format_re">> => <<>>,
                                <<"pool_tag">> => default,
                                <<"rfilter">> => <<>>,<<"ufilter">> => <<>>,
                                <<"user_cache_size">> => 1000,
                                <<"user_cache_validity">> => 300,
                                <<"userdesc">> => <<"cn">>,
                                <<"useruid">> => <<"cn">>},
                              default,when_present},
                            <<"mod_pubsub">> =>
                             {section,
                              #{<<"access_createnode">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,mod_pubsub_db},
                                  undefined,default},
                                <<"default_node_config">> =>
                                 {section,
                                  #{<<"access_model">> =>
                                     {option,atom,non_empty,undefined,default},
                                    <<"deliver_notifications">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"deliver_payloads">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"max_items">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"max_payload_size">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"node_type">> =>
                                     {option,atom,non_empty,undefined,default},
                                    <<"notification_type">> =>
                                     {option,atom,non_empty,undefined,default},
                                    <<"notify_config">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"notify_delete">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"notify_retract">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"persist_items">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"presence_based_delivery">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"publish_model">> =>
                                     {option,atom,non_empty,undefined,default},
                                    <<"purge_offline">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"roster_groups_allowed">> =>
                                     {list,
                                      {option,binary,non_empty,undefined,
                                       default},
                                      any,list,undefined,default},
                                    <<"send_last_published_item">> =>
                                     {option,atom,non_empty,undefined,default},
                                    <<"subscribe">> =>
                                     {option,boolean,any,undefined,default}},
                                  any,[],any,list,undefined,#{},default,
                                  when_present},
                                <<"host">> =>
                                 {option,string,subdomain_template,
                                  fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                  default},
                                <<"ignore_pep_from_offline">> =>
                                 {option,boolean,any,undefined,default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"item_publisher">> =>
                                 {option,boolean,any,undefined,default},
                                <<"last_item_cache">> =>
                                 {option,atom,
                                  {enum,[mnesia,rdbms,false]},
                                  undefined,default},
                                <<"max_items_node">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"max_subscriptions_node">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"nodetree">> =>
                                 {option,binary,
                                  {module,nodetree},
                                  #Fun<mod_pubsub.0.81398248>,default},
                                <<"pep_mapping">> =>
                                 {list,
                                  {section,
                                   #{<<"namespace">> =>
                                      {option,binary,non_empty,undefined,
                                       default},
                                     <<"node">> =>
                                      {option,binary,non_empty,undefined,
                                       default}},
                                   any,all,any,map,
                                   fun mod_pubsub:process_pep_mapping/1,#{},
                                   default,when_present},
                                  any,map,undefined,default},
                                <<"plugins">> =>
                                 {list,
                                  {option,binary,
                                   {module,node},
                                   undefined,default},
                                  any,list,undefined,default},
                                <<"sync_broadcast">> =>
                                 {option,boolean,any,undefined,default},
                                <<"wpool">> =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"call_timeout">> => 5000,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  default,always}},
                              any,[],any,map,undefined,
                              #{<<"access_createnode">> => all,
                                <<"backend">> => mnesia,
                                <<"default_node_config">> => [],
                                <<"host">> => {prefix,<<"pubsub.">>},
                                <<"ignore_pep_from_offline">> => true,
                                <<"iqdisc">> => one_queue,
                                <<"item_publisher">> => false,
                                <<"last_item_cache">> => false,
                                <<"max_items_node">> => 10,
                                <<"nodetree">> => nodetree_tree,
                                <<"pep_mapping">> => #{},
                                <<"plugins">> => [<<"flat">>],
                                <<"sync_broadcast">> => false},
                              default,when_present},
                            <<"mod_http_upload">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_http_upload},
                                  undefined,default},
                                <<"expiration_time">> =>
                                 {option,integer,positive,undefined,default},
                                <<"host">> =>
                                 {option,binary,subdomain_template,
                                  fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                  default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"max_file_size">> =>
                                 {option,integer,positive,undefined,default},
                                <<"s3">> =>
                                 {section,
                                  #{<<"access_key_id">> =>
                                     {option,binary,any,undefined,default},
                                    <<"add_acl">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"bucket_url">> =>
                                     {option,binary,url,undefined,default},
                                    <<"region">> =>
                                     {option,binary,any,undefined,default},
                                    <<"secret_access_key">> =>
                                     {option,binary,any,undefined,default}},
                                  any,
                                  [<<"bucket_url">>,<<"region">>,
                                   <<"access_key_id">>,
                                   <<"secret_access_key">>],
                                  any,map,undefined,
                                  #{<<"add_acl">> => false},
                                  default,when_present},
                                <<"token_bytes">> =>
                                 {option,integer,positive,undefined,default}},
                              any,
                              [<<"s3">>],
                              any,map,undefined,
                              #{<<"backend">> => s3,
                                <<"expiration_time">> => 60,
                                <<"host">> => <<"upload.@HOST@">>,
                                <<"iqdisc">> => one_queue,
                                <<"max_file_size">> => 10485760,
                                <<"token_bytes">> => 32},
                              default,when_present},
                            <<"mod_offline">> =>
                             {section,
                              #{<<"access_max_user_messages">> =>
                                 {option,atom,access_rule,undefined,default},
                                <<"backend">> =>
                                 {option,atom,
                                  {module,mod_offline},
                                  undefined,default},
                                <<"store_groupchat_messages">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"access_max_user_messages">> =>
                                 max_user_offline_messages,
                                <<"backend">> => mnesia,
                                <<"store_groupchat_messages">> => false},
                              default,when_present},
                            <<"mod_vcard">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_vcard},
                                  undefined,default},
                                <<"host">> =>
                                 {option,string,subdomain_template,
                                  fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                  default},
                                <<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"ldap">> =>
                                 {section,
                                  #{<<"base">> =>
                                     {option,binary,any,undefined,default},
                                    <<"binary_search_fields">> =>
                                     {list,
                                      {option,binary,non_empty,undefined,
                                       default},
                                      any,list,undefined,default},
                                    <<"deref">> =>
                                     {option,atom,
                                      {enum,[never,always,finding,searching]},
                                      undefined,default},
                                    <<"filter">> =>
                                     {option,binary,any,undefined,default},
                                    <<"pool_tag">> =>
                                     {option,atom,pool_name,undefined,default},
                                    <<"search_fields">> =>
                                     {list,
                                      {section,
                                       #{<<"ldap_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default},
                                         <<"search_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_vcard:process_search_spec/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"search_operator">> =>
                                     {option,atom,
                                      {enum,['or','and']},
                                      undefined,default},
                                    <<"search_reported">> =>
                                     {list,
                                      {section,
                                       #{<<"search_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default},
                                         <<"vcard_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_vcard:process_search_reported_spec/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"uids">> =>
                                     {list,
                                      {section,
                                       #{<<"attr">> =>
                                          {option,binary,any,undefined,
                                           default},
                                         <<"format">> =>
                                          {option,binary,any,undefined,
                                           default}},
                                       any,
                                       [<<"attr">>],
                                       any,map,
                                       fun mongoose_ldap_config:process_uids/1,
                                       #{},default,when_present},
                                      any,list,undefined,default},
                                    <<"vcard_map">> =>
                                     {list,
                                      {section,
                                       #{<<"ldap_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default},
                                         <<"ldap_pattern">> =>
                                          {option,binary,non_empty,undefined,
                                           default},
                                         <<"vcard_field">> =>
                                          {option,binary,non_empty,undefined,
                                           default}},
                                       any,all,any,map,
                                       fun mod_vcard:process_map_spec/1,#{},
                                       default,when_present},
                                      any,list,undefined,default}},
                                  any,[],any,map,undefined,
                                  #{<<"binary_search_fields">> => [],
                                    <<"deref">> => never,<<"filter">> => <<>>,
                                    <<"pool_tag">> => default,
                                    <<"search_fields">> =>
                                     [{<<"User">>,<<"%u">>},
                                      {<<"Full Name">>,<<"displayName">>},
                                      {<<"Given Name">>,<<"givenName">>},
                                      {<<"Middle Name">>,<<"initials">>},
                                      {<<"Family Name">>,<<"sn">>},
                                      {<<"Nickname">>,<<"%u">>},
                                      {<<"Birthday">>,<<"birthDay">>},
                                      {<<"Country">>,<<"c">>},
                                      {<<"City">>,<<"l">>},
                                      {<<"Email">>,<<"mail">>},
                                      {<<"Organization Name">>,<<"o">>},
                                      {<<"Organization Unit">>,<<"ou">>}],
                                    <<"search_operator">> => 'and',
                                    <<"search_reported">> =>
                                     [{<<"Full Name">>,<<"FN">>},
                                      {<<"Given Name">>,<<"FIRST">>},
                                      {<<"Middle Name">>,<<"MIDDLE">>},
                                      {<<"Family Name">>,<<"LAST">>},
                                      {<<"Nickname">>,<<"NICK">>},
                                      {<<"Birthday">>,<<"BDAY">>},
                                      {<<"Country">>,<<"CTRY">>},
                                      {<<"City">>,<<"LOCALITY">>},
                                      {<<"Email">>,<<"EMAIL">>},
                                      {<<"Organization Name">>,<<"ORGNAME">>},
                                      {<<"Organization Unit">>,<<"ORGUNIT">>}],
                                    <<"uids">> => [{<<"uid">>,<<"%u">>}],
                                    <<"vcard_map">> =>
                                     [{<<"NICKNAME">>,<<"%u">>,[]},
                                      {<<"FN">>,<<"%s">>,[<<"displayName">>]},
                                      {<<"FAMILY">>,<<"%s">>,[<<"sn">>]},
                                      {<<"GIVEN">>,<<"%s">>,[<<"givenName">>]},
                                      {<<"MIDDLE">>,<<"%s">>,[<<"initials">>]},
                                      {<<"ORGNAME">>,<<"%s">>,[<<"o">>]},
                                      {<<"ORGUNIT">>,<<"%s">>,[<<"ou">>]},
                                      {<<"CTRY">>,<<"%s">>,[<<"c">>]},
                                      {<<"LOCALITY">>,<<"%s">>,[<<"l">>]},
                                      {<<"STREET">>,<<"%s">>,[<<"street">>]},
                                      {<<"REGION">>,<<"%s">>,[<<"st">>]},
                                      {<<"PCODE">>,<<"%s">>,
                                       [<<"postalCode">>]},
                                      {<<"TITLE">>,<<"%s">>,[<<"title">>]},
                                      {<<"URL">>,<<"%s">>,[<<"labeleduri">>]},
                                      {<<"DESC">>,<<"%s">>,
                                       [<<"description">>]},
                                      {<<"TEL">>,<<"%s">>,
                                       [<<"telephoneNumber">>]},
                                      {<<"EMAIL">>,<<"%s">>,[<<"mail">>]},
                                      {<<"BDAY">>,<<"%s">>,[<<"birthDay">>]},
                                      {<<"ROLE">>,<<"%s">>,
                                       [<<"employeeType">>]},
                                      {<<"PHOTO">>,<<"%s">>,
                                       [<<"jpegPhoto">>]}]},
                                  default,always},
                                <<"matches">> =>
                                 {option,int_or_infinity,non_negative,
                                  undefined,default},
                                <<"search">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,#Fun<mod_vcard.0.52229309>,
                              #{<<"backend">> => mnesia,
                                <<"host">> => {prefix,<<"vjud.">>},
                                <<"iqdisc">> => parallel,<<"matches">> => 30,
                                <<"search">> => true},
                              default,when_present},
                            <<"mod_blocking">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_privacy},
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia},
                              default,when_present},
                            <<"mod_privacy">> =>
                             {section,
                              #{<<"backend">> =>
                                 {option,atom,
                                  {module,mod_privacy},
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"backend">> => mnesia},
                              default,when_present},
                            <<"mod_mam">> =>
                             {section,
                              #{<<"archive_chat_markers">> =>
                                 {option,boolean,any,undefined,default},
                                <<"async_writer">> =>
                                 {section,
                                  #{<<"batch_size">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"enabled">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"flush_interval">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"pool_size">> =>
                                     {option,integer,non_negative,undefined,
                                      default}},
                                  any,[],any,map,undefined,
                                  #{<<"batch_size">> => 30,
                                    <<"enabled">> => true,
                                    <<"flush_interval">> => 2000,
                                    <<"pool_size">> => 16},
                                  default,always},
                                <<"backend">> =>
                                 {option,atom,
                                  {enum,[rdbms,cassandra,elasticsearch]},
                                  undefined,default},
                                <<"cache">> =>
                                 {section,
                                  #{<<"module">> =>
                                     {option,atom,
                                      {enum,[internal,mod_cache_users]},
                                      undefined,default},
                                    <<"number_of_segments">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,[fifo,lru]},
                                      undefined,default},
                                    <<"time_to_live">> =>
                                     {option,int_or_infinity,positive,
                                      undefined,default}},
                                  any,[],any,map,
                                  fun mongoose_user_cache:process_cache_config/1,
                                  #{<<"module">> => internal,
                                    <<"number_of_segments">> => 3,
                                    <<"strategy">> => fifo,
                                    <<"time_to_live">> => 480},
                                  default,always},
                                <<"cache_users">> =>
                                 {option,boolean,any,undefined,default},
                                <<"db_jid_format">> =>
                                 {option,atom,module,undefined,default},
                                <<"db_message_format">> =>
                                 {option,atom,module,undefined,default},
                                <<"default_result_limit">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"delete_domain_limit">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"enforce_simple_queries">> =>
                                 {option,boolean,any,undefined,default},
                                <<"extra_fin_element">> =>
                                 {option,atom,module,undefined,default},
                                <<"extra_lookup_params">> =>
                                 {option,atom,module,undefined,default},
                                <<"full_text_search">> =>
                                 {option,boolean,any,undefined,default},
                                <<"is_archivable_message">> =>
                                 {option,atom,module,undefined,default},
                                <<"max_result_limit">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"message_retraction">> =>
                                 {option,boolean,any,undefined,default},
                                <<"muc">> =>
                                 {section,
                                  #{<<"archive_chat_markers">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"async_writer">> =>
                                     {section,
                                      #{<<"batch_size">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"enabled">> =>
                                         {option,boolean,any,undefined,
                                          default},
                                        <<"flush_interval">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"pool_size">> =>
                                         {option,integer,non_negative,
                                          undefined,default}},
                                      any,[],any,map,undefined,
                                      #{<<"batch_size">> => 30,
                                        <<"enabled">> => true,
                                        <<"flush_interval">> => 2000,
                                        <<"pool_size">> => 16},
                                      default,when_present},
                                    <<"backend">> =>
                                     {option,atom,
                                      {enum,[rdbms,cassandra,elasticsearch]},
                                      undefined,default},
                                    <<"cache_users">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"db_jid_format">> =>
                                     {option,atom,module,undefined,default},
                                    <<"db_message_format">> =>
                                     {option,atom,module,undefined,default},
                                    <<"default_result_limit">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"delete_domain_limit">> =>
                                     {option,int_or_infinity,positive,
                                      undefined,default},
                                    <<"enforce_simple_queries">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"extra_fin_element">> =>
                                     {option,atom,module,undefined,default},
                                    <<"extra_lookup_params">> =>
                                     {option,atom,module,undefined,default},
                                    <<"full_text_search">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"host">> =>
                                     {option,string,subdomain_template,
                                      fun mongoose_subdomain_utils:make_subdomain_pattern/1,
                                      default},
                                    <<"is_archivable_message">> =>
                                     {option,atom,module,undefined,default},
                                    <<"max_result_limit">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"message_retraction">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"no_stanzaid_element">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"send_message">> =>
                                     {option,atom,module,undefined,default},
                                    <<"user_prefs_store">> =>
                                     {option,atom,
                                      {enum,[rdbms,cassandra,mnesia]},
                                      undefined,default}},
                                  any,[],any,map,undefined,
                                  #{<<"host">> => {prefix,<<"conference.">>}},
                                  default,when_present},
                                <<"no_stanzaid_element">> =>
                                 {option,boolean,any,undefined,default},
                                <<"pm">> =>
                                 {section,
                                  #{<<"archive_chat_markers">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"archive_groupchats">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"async_writer">> =>
                                     {section,
                                      #{<<"batch_size">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"enabled">> =>
                                         {option,boolean,any,undefined,
                                          default},
                                        <<"flush_interval">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"pool_size">> =>
                                         {option,integer,non_negative,
                                          undefined,default}},
                                      any,[],any,map,undefined,
                                      #{<<"batch_size">> => 30,
                                        <<"enabled">> => true,
                                        <<"flush_interval">> => 2000,
                                        <<"pool_size">> => 16},
                                      default,when_present},
                                    <<"backend">> =>
                                     {option,atom,
                                      {enum,[rdbms,cassandra,elasticsearch]},
                                      undefined,default},
                                    <<"cache_users">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"db_jid_format">> =>
                                     {option,atom,module,undefined,default},
                                    <<"db_message_format">> =>
                                     {option,atom,module,undefined,default},
                                    <<"default_result_limit">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"delete_domain_limit">> =>
                                     {option,int_or_infinity,positive,
                                      undefined,default},
                                    <<"enforce_simple_queries">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"extra_fin_element">> =>
                                     {option,atom,module,undefined,default},
                                    <<"extra_lookup_params">> =>
                                     {option,atom,module,undefined,default},
                                    <<"full_text_search">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"is_archivable_message">> =>
                                     {option,atom,module,undefined,default},
                                    <<"max_result_limit">> =>
                                     {option,integer,non_negative,undefined,
                                      default},
                                    <<"message_retraction">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"no_stanzaid_element">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"same_mam_id_for_peers">> =>
                                     {option,boolean,any,undefined,default},
                                    <<"send_message">> =>
                                     {option,atom,module,undefined,default},
                                    <<"user_prefs_store">> =>
                                     {option,atom,
                                      {enum,[rdbms,cassandra,mnesia]},
                                      undefined,default}},
                                  any,[],any,map,undefined,
                                  #{<<"archive_groupchats">> => false,
                                    <<"same_mam_id_for_peers">> => false},
                                  default,when_present},
                                <<"send_message">> =>
                                 {option,atom,module,undefined,default},
                                <<"user_prefs_store">> =>
                                 {option,atom,
                                  {enum,[rdbms,cassandra,mnesia]},
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"archive_chat_markers">> => false,
                                <<"backend">> => rdbms,
                                <<"cache_users">> => true,
                                <<"default_result_limit">> => 50,
                                <<"enforce_simple_queries">> => false,
                                <<"full_text_search">> => true,
                                <<"is_archivable_message">> => mod_mam_utils,
                                <<"max_result_limit">> => 50,
                                <<"message_retraction">> => true,
                                <<"no_stanzaid_element">> => false,
                                <<"send_message">> => mod_mam_utils},
                              default,when_present},
                            <<"mod_version">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"os_info">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => no_queue,
                                <<"os_info">> => false},
                              default,when_present},
                            <<"mod_ping">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"ping_interval">> =>
                                 {option,integer,positive,
                                  fun timer:seconds/1,default},
                                <<"ping_req_timeout">> =>
                                 {option,integer,positive,
                                  fun timer:seconds/1,default},
                                <<"send_pings">> =>
                                 {option,boolean,any,undefined,default},
                                <<"timeout_action">> =>
                                 {option,atom,
                                  {enum,[none,kill]},
                                  undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => no_queue,
                                <<"ping_interval">> => 60000,
                                <<"ping_req_timeout">> => 32000,
                                <<"send_pings">> => false,
                                <<"timeout_action">> => none},
                              default,when_present},
                            <<"mod_adhoc">> =>
                             {section,
                              #{<<"iqdisc">> =>
                                 {section,
                                  #{<<"type">> =>
                                     {option,atom,
                                      {enum,
                                       [no_queue,one_queue,parallel,queues]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,
                                  [<<"type">>],
                                  any,map,
                                  fun mongoose_config_spec:process_iqdisc/1,
                                  #{},default,when_present},
                                <<"report_commands_node">> =>
                                 {option,boolean,any,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"iqdisc">> => one_queue,
                                <<"report_commands_node">> => false},
                              default,when_present}},
                          module,[],any,map,undefined,#{},host_config,always},
                        <<"outgoing_pools">> =>
                         {section,
                          #{<<"cassandra">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"auth">> =>
                                         {section,
                                          #{<<"plain">> =>
                                             {section,
                                              #{<<"password">> =>
                                                 {option,binary,any,
                                                  undefined,default},
                                                <<"username">> =>
                                                 {option,binary,any,
                                                  undefined,default}},
                                              any,all,any,map,undefined,#{},
                                              default,when_present}},
                                          any,all,any,map,undefined,#{},
                                          default,when_present},
                                        <<"keyspace">> =>
                                         {option,atom,non_empty,undefined,
                                          default},
                                        <<"servers">> =>
                                         {list,
                                          {section,
                                           #{<<"host">> =>
                                              {option,string,non_empty,
                                               undefined,default},
                                             <<"port">> =>
                                              {option,integer,port,undefined,
                                               default}},
                                           any,
                                           [<<"host">>],
                                           any,map,undefined,
                                           #{<<"port">> => 9042},
                                           default,when_present},
                                          unique_non_empty,list,undefined,
                                          default},
                                        <<"tls">> =>
                                         {section,
                                          #{<<"cacertfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"certfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"ciphers">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"keyfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"password">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"server_name_indication">> =>
                                             {section,
                                              #{<<"enabled">> =>
                                                 {option,boolean,any,
                                                  undefined,default},
                                                <<"host">> =>
                                                 {option,string,non_empty,
                                                  undefined,default},
                                                <<"protocol">> =>
                                                 {option,atom,
                                                  {enum,[default,https]},
                                                  undefined,default}},
                                              any,[],any,map,undefined,
                                              #{<<"enabled">> => true,
                                                <<"protocol">> => default},
                                              default,always},
                                            <<"verify_mode">> =>
                                             {option,atom,
                                              {enum,
                                               [peer,selfsigned_peer,none]},
                                              undefined,default},
                                            <<"versions">> =>
                                             {list,
                                              {option,atom,any,undefined,
                                               default},
                                              any,list,undefined,default}},
                                          any,[],any,map,
                                          #Fun<mongoose_config_utils.0.103156362>,
                                          #{<<"verify_mode">> => peer},
                                          default,when_present}},
                                      any,[],any,map,undefined,
                                      #{<<"keyspace">> => mongooseim,
                                        <<"servers">> =>
                                         [#{port => 9042,
                                            host => "localhost"}]},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 20},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"elastic">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"host">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"port">> =>
                                         {option,integer,port,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"host">> => <<"localhost">>,
                                        <<"port">> => 9200},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"http">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"host">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"path_prefix">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"request_timeout">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"tls">> =>
                                         {section,
                                          #{<<"cacertfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"certfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"ciphers">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"keyfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"password">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"server_name_indication">> =>
                                             {section,
                                              #{<<"enabled">> =>
                                                 {option,boolean,any,
                                                  undefined,default},
                                                <<"host">> =>
                                                 {option,string,non_empty,
                                                  undefined,default},
                                                <<"protocol">> =>
                                                 {option,atom,
                                                  {enum,[default,https]},
                                                  undefined,default}},
                                              any,[],any,map,undefined,
                                              #{<<"enabled">> => true,
                                                <<"protocol">> => default},
                                              default,always},
                                            <<"verify_mode">> =>
                                             {option,atom,
                                              {enum,
                                               [peer,selfsigned_peer,none]},
                                              undefined,default},
                                            <<"versions">> =>
                                             {list,
                                              {option,atom,any,undefined,
                                               default},
                                              any,list,undefined,default}},
                                          any,[],any,map,
                                          #Fun<mongoose_config_utils.0.103156362>,
                                          #{<<"verify_mode">> => peer},
                                          default,when_present}},
                                      any,
                                      [<<"host">>],
                                      any,map,undefined,
                                      #{<<"path_prefix">> => <<"/">>,
                                        <<"request_timeout">> => 2000},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"ldap">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"connect_interval">> =>
                                         {option,integer,positive,undefined,
                                          default},
                                        <<"password">> =>
                                         {option,binary,any,undefined,default},
                                        <<"port">> =>
                                         {option,integer,port,undefined,
                                          default},
                                        <<"root_dn">> =>
                                         {option,binary,any,undefined,default},
                                        <<"servers">> =>
                                         {list,
                                          {option,string,any,undefined,
                                           default},
                                          unique_non_empty,list,undefined,
                                          default},
                                        <<"tls">> =>
                                         {section,
                                          #{<<"cacertfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"certfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"ciphers">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"keyfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"password">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"server_name_indication">> =>
                                             {section,
                                              #{<<"enabled">> =>
                                                 {option,boolean,any,
                                                  undefined,default},
                                                <<"host">> =>
                                                 {option,string,non_empty,
                                                  undefined,default},
                                                <<"protocol">> =>
                                                 {option,atom,
                                                  {enum,[default,https]},
                                                  undefined,default}},
                                              any,[],any,map,undefined,
                                              #{<<"enabled">> => true,
                                                <<"protocol">> => default},
                                              default,always},
                                            <<"verify_mode">> =>
                                             {option,atom,
                                              {enum,
                                               [peer,selfsigned_peer,none]},
                                              undefined,default},
                                            <<"versions">> =>
                                             {list,
                                              {option,atom,any,undefined,
                                               default},
                                              any,list,undefined,default}},
                                          any,[],any,map,
                                          #Fun<mongoose_config_utils.0.103156362>,
                                          #{<<"verify_mode">> => peer},
                                          default,when_present}},
                                      any,[],any,map,
                                      fun mongoose_config_spec:process_ldap_connection/1,
                                      #{<<"connect_interval">> => 10000,
                                        <<"password">> => <<>>,
                                        <<"root_dn">> => <<>>,
                                        <<"servers">> => ["localhost"]},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"rabbit">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"confirms_enabled">> =>
                                         {option,boolean,any,undefined,
                                          default},
                                        <<"host">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"max_worker_queue_len">> =>
                                         {option,int_or_infinity,
                                          non_negative,undefined,default},
                                        <<"password">> =>
                                         {option,binary,non_empty,undefined,
                                          default},
                                        <<"port">> =>
                                         {option,integer,port,undefined,
                                          default},
                                        <<"username">> =>
                                         {option,binary,non_empty,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"confirms_enabled">> => false,
                                        <<"host">> => "localhost",
                                        <<"max_worker_queue_len">> => 1000,
                                        <<"password">> => <<"guest">>,
                                        <<"port">> => 5672,
                                        <<"username">> => <<"guest">>},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"rdbms">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"database">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"driver">> =>
                                         {option,atom,
                                          {enum,[odbc,pgsql,mysql]},
                                          undefined,default},
                                        <<"host">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"keepalive_interval">> =>
                                         {option,integer,positive,undefined,
                                          default},
                                        <<"max_start_interval">> =>
                                         {option,integer,positive,undefined,
                                          default},
                                        <<"password">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"port">> =>
                                         {option,integer,port,undefined,
                                          default},
                                        <<"query_timeout">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"settings">> =>
                                         {option,string,any,undefined,default},
                                        <<"tls">> =>
                                         {section,
                                          #{<<"cacertfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"certfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"ciphers">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"keyfile">> =>
                                             {option,string,filename,
                                              undefined,default},
                                            <<"password">> =>
                                             {option,string,any,undefined,
                                              default},
                                            <<"required">> =>
                                             {option,boolean,any,undefined,
                                              default},
                                            <<"server_name_indication">> =>
                                             {section,
                                              #{<<"enabled">> =>
                                                 {option,boolean,any,
                                                  undefined,default},
                                                <<"host">> =>
                                                 {option,string,non_empty,
                                                  undefined,default},
                                                <<"protocol">> =>
                                                 {option,atom,
                                                  {enum,[default,https]},
                                                  undefined,default}},
                                              any,[],any,map,undefined,
                                              #{<<"enabled">> => true,
                                                <<"protocol">> => default},
                                              default,always},
                                            <<"verify_mode">> =>
                                             {option,atom,
                                              {enum,
                                               [peer,selfsigned_peer,none]},
                                              undefined,default},
                                            <<"versions">> =>
                                             {list,
                                              {option,atom,any,undefined,
                                               default},
                                              any,list,undefined,default}},
                                          any,[],any,map,
                                          #Fun<mongoose_config_utils.0.103156362>,
                                          #{<<"verify_mode">> => peer},
                                          default,when_present},
                                        <<"username">> =>
                                         {option,string,non_empty,undefined,
                                          default}},
                                      any,
                                      [<<"driver">>],
                                      any,map,
                                      fun mongoose_rdbms:process_options/1,
                                      #{<<"max_start_interval">> => 30,
                                        <<"query_timeout">> => 5000},
                                      default,when_present},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 60000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present},
                            <<"redis">> =>
                             {section,
                              #{default =>
                                 {section,
                                  #{<<"call_timeout">> =>
                                     {option,integer,positive,undefined,
                                      default},
                                    <<"connection">> =>
                                     {section,
                                      #{<<"database">> =>
                                         {option,integer,non_negative,
                                          undefined,default},
                                        <<"host">> =>
                                         {option,string,non_empty,undefined,
                                          default},
                                        <<"password">> =>
                                         {option,string,any,undefined,default},
                                        <<"port">> =>
                                         {option,integer,port,undefined,
                                          default}},
                                      any,[],any,map,undefined,
                                      #{<<"database">> => 0,
                                        <<"host">> => "127.0.0.1",
                                        <<"password">> => [],
                                        <<"port">> => 6379},
                                      default,always},
                                    <<"scope">> =>
                                     {option,atom,
                                      {enum,[global,host_type,host]},
                                      undefined,default},
                                    <<"strategy">> =>
                                     {option,atom,
                                      {enum,
                                       [best_worker,random_worker,next_worker,
                                        available_worker,
                                        next_available_worker]},
                                      undefined,default},
                                    <<"workers">> =>
                                     {option,integer,positive,undefined,
                                      default}},
                                  any,[],any,map,
                                  #Fun<mongoose_config_utils.0.103156362>,
                                  #{<<"call_timeout">> => 5000,
                                    <<"scope">> => global,
                                    <<"strategy">> => best_worker,
                                    <<"workers">> => 10},
                                  item,when_present}},
                              non_empty,[],any,list,undefined,#{},none,
                              when_present}},
                          any,[],any,list,undefined,#{},global_config,always},
                        <<"s2s">> =>
                         {section,
                          #{<<"address">> =>
                             {list,
                              {section,
                               #{<<"host">> =>
                                  {option,binary,non_empty,undefined,default},
                                 <<"ip_address">> =>
                                  {option,string,ip_address,undefined,default},
                                 <<"port">> =>
                                  {option,integer,port,undefined,default}},
                               any,
                               [<<"host">>,<<"ip_address">>],
                               any,map,
                               fun mongoose_config_spec:process_s2s_address/1,
                               #{},default,when_present},
                              any,map,undefined,default},
                            <<"certfile">> =>
                             {option,string,filename,undefined,default},
                            <<"ciphers">> =>
                             {option,string,any,undefined,default},
                            <<"default_policy">> =>
                             {option,atom,
                              {enum,[allow,deny]},
                              undefined,default},
                            <<"dns">> =>
                             {section,
                              #{<<"retries">> =>
                                 {option,integer,positive,undefined,default},
                                <<"timeout">> =>
                                 {option,integer,positive,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"retries">> => 2,<<"timeout">> => 10},
                              default,always},
                            <<"host_policy">> =>
                             {list,
                              {section,
                               #{<<"host">> =>
                                  {option,binary,non_empty,undefined,default},
                                 <<"policy">> =>
                                  {option,atom,
                                   {enum,[allow,deny]},
                                   undefined,default}},
                               any,all,any,map,
                               fun mongoose_config_spec:process_s2s_host_policy/1,
                               #{},default,when_present},
                              any,map,undefined,default},
                            <<"max_retry_delay">> =>
                             {option,integer,positive,undefined,default},
                            <<"outgoing">> =>
                             {section,
                              #{<<"connection_timeout">> =>
                                 {option,int_or_infinity,positive,undefined,
                                  default},
                                <<"ip_versions">> =>
                                 {list,
                                  {option,integer,
                                   {enum,[4,6]},
                                   undefined,default},
                                  unique_non_empty,list,undefined,default},
                                <<"port">> =>
                                 {option,integer,port,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"connection_timeout">> => 10000,
                                <<"ip_versions">> => [4,6],
                                <<"port">> => 5269},
                              default,always},
                            <<"shared">> =>
                             {option,binary,non_empty,undefined,default},
                            <<"use_starttls">> =>
                             {option,atom,
                              {enum,
                               [false,optional,required,required_trusted]},
                              undefined,default}},
                          any,[],any,map,undefined,
                          #{<<"ciphers">> => "TLSv1.2:TLSv1.3",
                            <<"default_policy">> => allow,
                            <<"max_retry_delay">> => 300,
                            <<"use_starttls">> => false},
                          host_config,always},
                        <<"services">> =>
                         {section,
                          #{<<"service_domain_db">> =>
                             {section,
                              #{<<"db_pool">> =>
                                 {option,atom,pool_name,undefined,default},
                                <<"event_cleaning_interval">> =>
                                 {option,integer,positive,undefined,default},
                                <<"event_max_age">> =>
                                 {option,integer,positive,undefined,default}},
                              any,[],any,map,undefined,
                              #{<<"db_pool">> => global,
                                <<"event_cleaning_interval">> => 1800,
                                <<"event_max_age">> => 7200},
                              default,when_present},
                            <<"service_mongoose_system_metrics">> =>
                             {section,
                              #{<<"initial_report">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"periodic_report">> =>
                                 {option,integer,non_negative,undefined,
                                  default},
                                <<"report">> =>
                                 {option,boolean,any,undefined,default},
                                <<"tracking_id">> =>
                                 {section,
                                  #{<<"id">> =>
                                     {option,string,non_empty,undefined,
                                      default},
                                    <<"secret">> =>
                                     {option,string,non_empty,undefined,
                                      default}},
                                  any,all,any,map,undefined,#{},default,
                                  when_present}},
                              any,[],any,map,undefined,
                              #{<<"initial_report">> => 300000,
                                <<"periodic_report">> => 10800000},
                              default,when_present}},
                          any,[],any,map,undefined,#{},global_config,always},
                        <<"shaper">> =>
                         {section,
                          #{default =>
                             {section,
                              #{<<"max_rate">> =>
                                 {option,integer,positive,undefined,default}},
                              any,all,any,map,undefined,#{},default,
                              when_present}},
                          non_empty,[],any,map,undefined,#{},global_config,
                          when_present}},
                     key => <<"instrumentation">>,class => error,
                     what => toml_processing_failed,
                     toml_value =>
                      #{<<"general">> =>
                         #{<<"default_server_domain">> => <<"example.com">>,
                           <<"hosts">> => [<<"example.com">>]},
                        <<"instrumentation">> => #{}},
                     toml_path => []}]}
  in function  mongoose_config_parser_toml:process/1 (/home/circleci/project/src/config/mongoose_config_parser_toml.erl, line 77)
  in call from config_parser_SUITE:parse/1 (/home/circleci/project/test/config_parser_SUITE.erl, line 3050)
  in call from config_parser_SUITE:instrumentation/1 (/home/circleci/project/test/config_parser_SUITE.erl, line 2931)
  in call from test_server:ts_tc/3 (test_server.erl, line 1793)
  in call from test_server:run_test_case_eval1/6 (test_server.erl, line 1302)
  in call from test_server:run_test_case_eval/9 (test_server.erl, line 1234)