# Structs
sections:frontend,backendname:aclis-multiple:truetest:ok:acl url_stats path_beg /statstest:ok:acl url_static path_beg -i /static /images /javascript /stylesheetstest:ok:acl url_static path_end -i .jpg .gif .png .css .jstest:ok:acl be_app_ok nbsrv(be_app) gt 0test:ok:acl be_static_ok nbsrv(be_static) gt 0test:ok:acl key req.hdr(X-Add-ACL-Key) -m foundtest:ok:acl add path /addacltest:ok:acl del path /delacltest:ok:acl myhost hdr(Host) -f myhost.lsttest:ok:acl clear dst_port 80test:ok:acl secure dst_port 8080test:ok:acl login_page url_beg /logintest:ok:acl logout url_beg /logouttest:ok:acl uid_given url_reg /login?userid=[^&]+test:ok:acl cookie_set hdr_sub(cookie) SEEN=1test:fail:acl cookietest:fail:acl.
sections:defaults,backendname:balanceis-multiple:falsetest:ok:balance roundrobintest:ok:balance uritest:ok:balance uri wholetest:ok:balance uri len 12test:ok:balance uri depth 8test:ok:balance uri depth 8 wholetest:ok:balance uri depth 8 len 12 wholetest:ok:balance url_paramtest:ok:balance url_param session_idtest:ok:balance url_param check_post 10test:ok:balance url_param check_post 10 max_wait 20test:ok:balance url_param session_id check_post 10 max_wait 20test:ok:balance hdr(hdrName)test:ok:balance hdr(hdrName) use_domain_onlytest:ok:balance randomtest:ok:balance random(15)test:ok:balance rdp-cookietest:ok:balance rdp-cookie(something)test:fails:balance somethingtest:fail:balancetest:fail:balance uri len notIntegertest:fail:balance uri depth notIntegertest:fail:balance url_param check_post notInteger.
sections:frontendname:bindis-multiple:truetest:ok:bind :80,:443test:ok:bind 10.0.0.1:10080,10.0.0.1:10443test:ok:bind /var/run/ssl-frontend.sock user root mode 600 accept-proxytest:ok:bind :80test:ok:bind :443 ssl crt /etc/haproxy/site.pemtest:ok:bind :443 ssl crt /etc/haproxy/site.pem alpn h2,http/1.1test:ok:bind :::443 v4v6 ssl crt /etc/haproxy/site.pem alpn h2,http/1.1test:ok:bind ipv6@:80test:ok:bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pemtest:ok:bind [email protected] user root mode 600 accept-proxytest:fail:bind.
sections:frontendname:bind-processis-multiple:falsetest:ok:bind-process alltest:ok:bind-process oddtest:ok:bind-process eventest:ok:bind-process 1 2 3 4test:ok:bind-process 1-4test:fail:bind-process nonetest:fail:bind-process 1+4test:fail:bind-process none-nonetest:fail:bind-process 1-4 1-3.
name:commentsno-sections:truedir:extrais-multiple:trueno-init:trueno-parse:true.
name:config-versionno-sections:truedir:extrano-init:trueno-get:true.
sections:defaults,backendname:cookieis-multiple:falsetest:ok:cookie testtest:ok:cookie myCookie domain dom1 indirect postonlytest:ok:cookie myCookie domain dom1 domain dom2 indirect postonlytest:ok:cookie myCookie indirect maxidle 10 maxlife 5 postonlytest:ok:cookie myCookie indirect maxidle 10test:ok:cookie myCookie indirect maxlife 10test:ok:cookie myCookie domain dom1 domain dom2 httponly indirect maxidle 10 maxlife 5 nocache postonly preserve rewrite securetest:ok:cookie myCookie attr \"SameSite=Strict\" attr \"mykey=myvalue\" inserttest:fail:cookietest:fail:cookie myCookie maxidle somethingtest:fail:cookie myCookie maxlife somethingtest:fail:cookie myCookie attr \"SameSite=Lax;\".
sections:globalname:cpu-mapis-multiple:truetest:ok:cpu-map 1-4 0-3test:ok:cpu-map 1/all 0-3test:ok:cpu-map auto:1-4 0-3test:ok:cpu-map auto:1-4 0-1 2-3test:fail:cpu-map.
sections:defaults,backendname:default-serveris-multiple:truetest:ok:default-server inter 1000 weight 13test:ok:default-server fall 1 rise 2 inter 3s port 4444test:fail:default-server.
Enabled is used by parsers Daemon, MasterWorker, ExternalCheck, NoSplicegen:Daemonname:daemoncreate-type:booltest:ok:daemontest:ok:daemon # commentgen:MasterWorkername:master-workercreate-type:booltest:ok:master-workertest:ok:master-worker # commentgen:ExternalCheckname:external-checkcreate-type:booltest:ok:external-checktest:ok:external-check # commentgen:NoSplicename:nosplicecreate-type:booltest:ok:nosplicetest:ok:nosplice # comment.
sections:defaults,frontend,backendname:errorfileno-init:trueis-multiple:truetest:ok:errorfile 400 /etc/haproxy/errorfiles/400badreq.httptest:ok:errorfile 408 /dev/null # work around Chrome pre-connect bugtest:ok:errorfile 403 /etc/haproxy/errorfiles/403forbid.httptest:ok:errorfile 503 /etc/haproxy/errorfiles/503sorry.httptest:fail:errorfile.
sections:backendname:external-check commandno-parse:truetest:ok:external-check command /bin/true.
sections:backendname:external-check pathno-parse:truetest:ok:external-check path /usr/bin:/bin.
name:filterno-sections:truedir:filtersis-multiple:trueparser-type:Filteris-interface:trueno-init:trueno-parse:true.
sections:userlistname:groupis-multiple:truetest:ok:group G1 users tiger,scotttest:ok:group G1test:fail:group.
sections:defaults,backendname:hash-typetest:ok:hash-type map-basedtest:ok:hash-type map-based avalanchetest:ok:hash-type consistenttest:ok:hash-type consistent avalanchetest:ok:hash-type avalanchetest:ok:hash-type map-based sdbmtest:ok:hash-type map-based djb2test:ok:hash-type map-based wt6test:ok:hash-type map-based crc32test:ok:hash-type consistent sdbmtest:ok:hash-type consistent djb2test:ok:hash-type consistent wt6test:ok:hash-type consistent crc32test:ok:hash-type map-based sdbm avalanchetest:ok:hash-type map-based djb2 avalanchetest:ok:hash-type map-based wt6 avalanchetest:ok:hash-type map-based crc32 avalanchetest:ok:hash-type consistent sdbm avalanchetest:ok:hash-type consistent djb2 avalanchetest:ok:hash-type consistent wt6 avalanchetest:ok:hash-type consistent crc32 avalanchetest:fail:hash-type.
sections:defaults,backendname:http-checkis-multiple:truetest:ok:http-check disable-on-404test:ok:http-check send-statetest:ok:http-check expect status 200test:ok:http-check expect ! string SQL\\ Errortest:ok:http-check expect ! rstatus ^5test:ok:http-check expect rstring <!--tag:[0-9a-f]*--></html>test:fail:http-check.
No description provided by the author
name:http-responsesections:frontend,backendstruct-name:Responsesdir:httpis-multiple:trueparser-type:HTTPActionis-interface:trueno-init:trueno-parse:truetest:fail:http-responsetest:ok:http-response capture res.hdr(Server) id 0test:ok:http-response set-map(map.lst) %[src] %[res.hdr(X-Value)] if valuetest:ok:http-response set-map(map.lst) %[src] %[res.hdr(X-Value)]test:fail:http-response set-map(map.lst) %[src]test:ok:http-response add-acl(map.lst) [src]test:fail:http-response add-acl(map.lst)test:ok:http-response add-header X-value valuetest:fail:http-response add-header X-valuetest:ok:http-response del-acl(map.lst) [src]test:fail:http-response del-acl(map.lst)test:ok:http-response allowtest:ok:http-response del-header X-valuetest:fail:http-response del-headertest:ok:http-response del-map(map.lst) %[src] if ! valuetest:ok:http-response del-map(map.lst) %[src]test:fail:http-response del-map(map.lst)test:ok:http-response denytest:ok:http-response lua.footest:ok:http-response lua.foo if FALSEtest:ok:http-response lua.foo paramtest:ok:http-response lua.foo param param2test:fail:http-response lua.test:fail:http-response lua.
sections:defaults,backendname:http-reuseis-multiple:falsetest:ok:http-reuse nevertest:ok:http-reuse safetest:ok:http-reuse aggressivetest:ok:http-reuse alwaystest:fail:http-reuse sometimes.
Int64 is used by parsers MaxConn, NbProc, NbThreadgen:MaxConnname:maxconntest:ok:maxconn 10000test:ok:maxconn 10000 # commenttest:fail:maxconngen:NbProcname:nbproctest:ok:nbproc 4test:ok:nbproc 4 # commenttest:fail:nbprocgen:NbThreadname:nbthreadtest:ok:nbthread 4test:ok:nbthread 4 # commenttest:fail:nbthread.
sections:defaults,frontend,backendname:logis-multiple:trueno-init:trueno-parse:truetest:ok:log globaltest:ok:log stdout format short daemon # send log to systemdtest:ok:log stdout format raw daemon # send everything to stdouttest:ok:log stderr format raw daemon notice # send important events to stderrtest:ok:log 127.0.0.1:514 local0 notice # only send important eventstest:ok:log 127.0.0.1:514 local0 notice notice # same but limit output leveltest:ok:log 127.0.0.1:1515 len 8192 format rfc5424 local2 infotest:fail:log.
sections:globalname:lua-loadis-multiple:truetest:ok:lua-load /etc/haproxy/lua/foo.luatest:fail:lua-load.
sections:mailersname:maileris-multiple:truetest:ok:mailer smtp1 192.168.0.1:587test:ok:mailer smtp1 192.168.0.1:587 # just some commenttest:fail:mailer.
sections:frontendname:monitor failtest:ok:monitor fail if no_db01 no_db02test:ok:monitor fail if ready_01 ready_02 ready_03test:ok:monitor fail unless backend_readytest:ok:monitor fail unless ready_01 ready_02 ready_03test:fail:monitor failtest:fail:monitor fail iftest:fail:monitor unless.
sections:defaults,frontendname:monitor-uritest:ok:monitor-uri /haproxy_testtest:fail:monitor-uri.
sections:resolversname:nameserveris-multiple:truetest:ok:nameserver dns1 10.0.0.1:53test:ok:nameserver dns1 10.0.0.1:53 # commenttest:fail:nameserver.
sections:frontend,backendname:option forwardforno-parse:truetest:ok:option forwardfortest:ok:option forwardfor except Atest:ok:option forwardfor except A header Btest:ok:option forwardfor except A header B if-nonetest:ok:option forwardfor # commenttest:ok:option forwardfor except A # commenttest:fail:option forwardfor excepttest:fail:option forwardfor except A headertest:fail:option forwardfor header.
sections:defaults,backendname:option httpchkno-parse:truetest:ok:option httpchk OPTIONS * HTTP/1.1\\r\\nHost:\\ wwwtest:ok:option httpchk <uri>test:ok:option httpchk <method> <uri>test:ok:option httpchk <method> <uri> <version>.
sections:frontendname:option httplogno-parse:truetest:ok:option httplogtest:ok:no option httplogtest:ok:option httplog clftest:ok:option httplog # commenttest:ok:option httplog clf # comment.
sections:backendname:option mysql-checkno-parse:truetest:ok:option mysql-checktest:ok:option mysql-check user johntest:ok:option mysql-check user john post-41test:ok:option mysql-check # commenttest:fail:option mysql-check usertest:fail:option mysql-check user # comment.
sections:backendname:option pgsql-checkno-parse:truetest:ok:option pgsql-checktest:ok:option pgsql-check user johntest:ok:option pgsql-check # commenttest:fail:option pgsql-check usertest:fail:option pgsql-check user # comment.
sections:backendname:option redispatchno-parse:truetest:ok:option redispatchtest:ok:no option redispatchtest:ok:option redispatch 1test:ok:option redispatch # commenttest:ok:option redispatch -1 # comment.
sections:backendname:option smtpchkno-parse:truetest:ok:option smtpchktest:ok:no option smtpchktest:ok:option smtpchk HELO mydomain.orgtest:ok:option smtpchk EHLO mydomain.orgtest:ok:option smtpchk # commenttest:ok:option smtpchk HELO mydomain.org # comment.
sections:peersname:peeris-multiple:truetest:ok:peer name 127.0.0.1:8080test:fail:peer name 127.0.0.1test:fail:peer name :8080test:fail:peer.
name:redirectsections:frontend,backenddir:httpis-multiple:trueparser-type:HTTPActionis-interface:trueno-init:trueno-parse:truetest:fail:redirecttest:ok:redirect prefix http://www.bar.com code 301 if { hdr(host) -i foo.com }.
name:sectionno-sections:truedir:extrano-init:true.
sections:backendname:serveris-multiple:truetest:ok:server name 127.0.0.1:8080test:ok:server name 127.0.0.1test:ok:server name 127.0.0.1 backuptest:fail:server.
name:simple-numberno-sections:truestruct-name:Numberdir:simpleparser-type:Int64C.
name:simple-optionno-sections:truestruct-name:Optiondir:simpleno-init:true.
name:simple-stringno-sections:truestruct-name:Stringdir:simpleparser-type:StringC.
name:simple-timeno-sections:truestruct-name:Timedir:simpleparser-type:StringC.
name:simple-timeoutno-sections:truestruct-name:Timeoutdir:simpleno-init:true.
name:simple-wordno-sections:truestruct-name:Worddir:simpleparser-type:StringC.
sections:globalname:stats socketis-multiple:truetest:ok:stats socket 127.0.0.1:8080test:ok:stats socket 127.0.0.1:8080 mode admintest:ok:stats socket /some/path/to/sockettest:ok:stats socket /some/path/to/socket mode adminatest:fail:stats socket /some/path/to/socket modetest:fail:stats socket.
name:statssections:defaults,frontend,backendstruct-name:Statsdir:statsis-multiple:trueparser-type:StatsSettingsis-interface:trueno-init:trueno-parse:truetest:fail:statstest:ok:stats admin if LOCALHOSTtest:ok:stats auth admin1:AdMiN123test:fail:stats auth admin1:test:fail:stats authtest:ok:stats enabletest:ok:stats hide-versiontest:ok:stats show-legendstest:fail:stats NON-EXISTStest:ok:stats maxconn 10test:fail:stats maxconn WORDtest:ok:stats realm HAProxy\\ Statisticstest:ok:stats refresh 10stest:fail:stats refreshtest:ok:stats scope .test:fail:stats scopetest:ok:stats show-desc Master node for Europe, Asia, Africatest:ok:stats show-nodetest:ok:stats show-node Europe-1test:ok:stats uri /admin?statstest:fail:stats uritest:ok:stats bind-process alltest:ok:stats bind-process oddtest:ok:stats bind-process eventest:ok:stats bind-process 1 2 3 4test:ok:stats bind-process 1-4test:fail:stats bind-process nonetest:fail:stats bind-process 1+4test:fail:stats bind-process none-nonetest:fail:stats bind-process 1-4 1-3test:ok:stats http-request realm HAProxy\\ Statisticstest:ok:stats http-request realm HAProxy\\ Statistics if somethingtest:ok:stats http-request auth if somethingtest:ok:stats http-request deny unless somethingtest:ok:stats http-request allowtest:fail:stats http-requesttest:fail:stats http-request none.
sections:backendname:stickis-multiple:trueno-parse:truetest:ok:stick on src table pop if !localhosttest:ok:stick match src table pop if !localhosttest:ok:stick store-request src table pop if !localhosttest:fail:stick.
sections:frontend,backendname:stick-tabletest:ok:stick-table type ip size 1m expire 5m store gpc0,conn_rate(30s)test:ok:stick-table type ip size 1m expire 5m store gpc0,conn_rate(30s) # commenttest:ok:stick-table type string len 1000 size 1m expire 5m store gpc0,conn_rate(30s)test:ok:stick-table type string len 1000 size 1m expire 5m nopurge peers aaaaa store gpc0,conn_rate(30s)test:fail:stick-table type string len 1000 size 1m expire 5m something peers aaaaa store gpc0,conn_rate(30s)test:fail:stick-table typetest:fail:stick-table.
String is used by parsers Mode, DefaultBackend, SimpleTimeTwoWords, StatsTimeoutgen:Modename:modetest:ok:mode tcptest:ok:mode httptest:ok:mode tcp # commenttest:fail:modegen:DefaultBackendname:default_backendtest:ok:default_backend httptest:fail:default_backendgen:StatsTimeoutname:stats timeouttest:ok:stats timeout 4test:ok:stats timeout 4 # commenttest:fail:stats timeouttest:fail:statstest:fail:timeoutgen:LogSendHostNamename:log-send-hostnametest:ok:log-send-hostnametest:ok:log-send-hostname something.
StringSliceC is used by ConfigSnippetgen:ConfigSnippetname:config-snippettest:ok:###_config-snippet_### BEGIN\n tune.ssl.default-dh-param 2048\n tune.bufsize 32768\n ###_config-snippet_### ENDtest:fail:tune.ssl.default-dh-param 2048\ntune.bufsize 32768.
name:tcp-requestsections:frontend,backendstruct-name:Requestsdir:tcpis-multiple:trueparser-type:TCPTypeis-interface:trueno-init:trueno-parse:truetest:ok:tcp-request content accepttest:ok:tcp-request content accept if !HTTPtest:ok:tcp-request content rejecttest:ok:tcp-request content reject if !HTTPtest:ok:tcp-request content capture req.payload(0,6) len 6test:ok:tcp-request content capture req.payload(0,6) len 6 if !HTTPtest:ok:tcp-request content set-priority-class int(1)test:ok:tcp-request content set-priority-class int(1) if some_checktest:ok:tcp-request content set-priority-offset int(10)test:ok:tcp-request content set-priority-offset int(10) if some_checktest:ok:tcp-request content track-sc0 srctest:ok:tcp-request content track-sc0 src if some_checktest:ok:tcp-request content track-sc1 srctest:ok:tcp-request content track-sc1 src if some_checktest:ok:tcp-request content track-sc2 srctest:ok:tcp-request content track-sc2 src if some_checktest:ok:tcp-request content track-sc0 src table footest:ok:tcp-request content track-sc0 src table foo if some_checktest:ok:tcp-request content track-sc1 src table footest:ok:tcp-request content track-sc1 src table foo if some_checktest:ok:tcp-request content track-sc2 src table footest:ok:tcp-request content track-sc2 src table foo if some_checktest:ok:tcp-request content set-dst ipv4(10.0.0.1)test:ok:tcp-request content set-var(sess.src) srctest:ok:tcp-request content set-var(sess.dn) ssl_c_s_dntest:ok:tcp-request content unset-var(sess.src)test:ok:tcp-request content unset-var(sess.dn)test:ok:tcp-request content silent-droptest:ok:tcp-request content silent-drop if !HTTPtest:ok:tcp-request content send-spoe-group engine grouptest:ok:tcp-request content use-service lua.denytest:ok:tcp-request content use-service lua.deny if !HTTPtest:ok:tcp-request content lua.footest:ok:tcp-request content lua.foo param if !HTTPtest:ok:tcp-request content lua.foo param param1test:ok:tcp-request connection accepttest:ok:tcp-request connection accept if !HTTPtest:ok:tcp-request connection rejecttest:ok:tcp-request connection reject if !HTTPtest:ok:tcp-request connection expect-proxy layer4 if { src -f proxies.lst }test:ok:tcp-request connection expect-netscaler-cip layer4test:ok:tcp-request connection capture req.payload(0,6) len 6test:ok:tcp-request connection track-sc0 srctest:ok:tcp-request connection track-sc0 src if some_checktest:ok:tcp-request connection track-sc1 srctest:ok:tcp-request connection track-sc1 src if some_checktest:ok:tcp-request connection track-sc2 srctest:ok:tcp-request connection track-sc2 src if some_checktest:ok:tcp-request connection track-sc0 src table footest:ok:tcp-request connection track-sc0 src table foo if some_checktest:ok:tcp-request connection track-sc1 src table footest:ok:tcp-request connection track-sc1 src table foo if some_checktest:ok:tcp-request connection track-sc2 src table footest:ok:tcp-request connection track-sc2 src table foo if some_checktest:ok:tcp-request connection sc-inc-gpc0(2)test:ok:tcp-request connection sc-inc-gpc0(2) if is-errortest:ok:tcp-request connection sc-inc-gpc1(2)test:ok:tcp-request connection sc-inc-gpc1(2) if is-errortest:ok:tcp-request connection sc-set-gpt0(0) 1337test:ok:tcp-request connection sc-set-gpt0(0) 1337 if exceeds_limittest:ok:tcp-request connection set-src src,ipmask(24)test:ok:tcp-request connection set-src src,ipmask(24) if some_checktest:ok:tcp-request connection set-src hdr(x-forwarded-for)test:ok:tcp-request connection set-src hdr(x-forwarded-for) if some_checktest:ok:tcp-request connection lua.footest:ok:tcp-request connection lua.foo param if !HTTPtest:ok:tcp-request connection lua.foo param param1test:ok:tcp-request session accepttest:ok:tcp-request session accept if !HTTPtest:ok:tcp-request session rejecttest:ok:tcp-request session reject if !HTTPtest:ok:tcp-request session track-sc0 srctest:ok:tcp-request session track-sc0 src if some_checktest:ok:tcp-request session track-sc1 srctest:ok:tcp-request session track-sc1 src if some_checktest:ok:tcp-request session track-sc2 srctest:ok:tcp-request session track-sc2 src if some_checktest:ok:tcp-request session track-sc0 src table footest:ok:tcp-request session track-sc0 src table foo if some_checktest:ok:tcp-request session track-sc1 src table footest:ok:tcp-request session track-sc1 src table foo if some_checktest:ok:tcp-request session track-sc2 src table footest:ok:tcp-request session track-sc2 src table foo if some_checktest:ok:tcp-request session sc-inc-gpc0(2)test:ok:tcp-request session sc-inc-gpc0(2) if is-errortest:ok:tcp-request session sc-inc-gpc1(2)test:ok:tcp-request session sc-inc-gpc1(2) if is-errortest:ok:tcp-request session sc-set-gpt0(0) 1337test:ok:tcp-request session sc-set-gpt0(0) 1337 if exceeds_limittest:ok:tcp-request session set-var(sess.src) srctest:ok:tcp-request session set-var(sess.dn) ssl_c_s_dntest:ok:tcp-request session unset-var(sess.src)test:ok:tcp-request session unset-var(sess.dn)test:ok:tcp-request session silent-droptest:ok:tcp-request session silent-drop if !HTTPtest:fail:tcp-requesttest:fail:tcp-request contenttest:fail:tcp-request connectiontest:fail:tcp-request sessiontest:fail:tcp-request content lua.test:fail:tcp-request content lua.
name:tcp-responsesections:frontend,backendstruct-name:Responsesdir:tcpis-multiple:trueparser-type:TCPTypeis-interface:trueno-init:trueno-parse:truetest:ok:tcp-response content lua.footest:ok:tcp-response content lua.foo param if !HTTPtest:ok:tcp-response content lua.foo param param1test:fail:tcp-responsetest:fail:tcp-response content lua.test:fail:tcp-response content lua.
name:simple-time-two-wordsno-sections:truestruct-name:TimeTwoWordsdir:simpleno-init:trueparser-type:StringCtest:skip.
sections:defaults,frontendname:unique-id-formattest:ok:unique-id-format %{+X}o_%ci:%cp_%fi:%fp_%Ts_%rt:%pidtest:ok:unique-id-format %{+X}o_%cp_%fi:%fp_%Ts_%rt:%pidtest:ok:unique-id-format %{+X}o_%fi:%fp_%Ts_%rt:%pidtest:fail:unique-id-format.
sections:defaults,frontendname:unique-id-headertest:ok:unique-id-header X-Unique-IDtest:fail:unique-id-header.
name:unprocessedno-sections:truedir:extrais-multiple:trueno-init:trueno-parse:truetest:skip.
sections:frontendname:use_backendis-multiple:truetest:ok:use_backend test if TRUEtest:ok:use_backend test if TRUE # denytest:ok:use_backend test # denytest:fail:use_backend.
sections:userlistname:useris-multiple:truetest:ok:user tiger password $6$k6y3o.eP$JlKBx(...)xHSwRv6J.C0/D7cV91 groups G1test:ok:user panda insecure-password elgato groups G1,G2test:ok:user bear insecure-password hello groups G2test:fail:user.
sections:backendname:use-serveris-multiple:trueno-parse:truetest:ok:use-server www if { req_ssl_sni -i www.example.com }test:ok:use-server www if { req_ssl_sni -i www.example.com } # commenttest:fail:use-server.
# Interfaces
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author