AW3IHN2SW4JYIT4Y26Q45BLD5RFJ3POVSTECR4GQ3ZQVB463EZVQC G4U6J7TOHDXUL6ECIGJUSTQPURB54PC4VIAW2UGXDJPPFQLR64LQC FEHWT3MOW3STJXNBQWXSY6ZDSJIJWVU6EWCXA6KARH7DCYFNM5NQC HMJFS6WWD2JJZB57HBXRHYS2A2N25YDDAJ443KRMT6K3ALHIBRVQC P35HCXDOT4NKKPTM6OMKEVKBLB3VLEODS7LNKRG7777RLOFDGU2AC SM5TELBWYEM67PHIK2RSGJ3E4TCUT2XLVEZIJGM2GEI45RHSBH6AC ITQF7AQWZNN733JQHK3PHYDWDGM4JJZVFBLB7F7XPS56PMHCKTMQC LB4HIYWKTVYQPH77VAQCFOXNO7JD72SMXTK2U6G7UC2MDQM6VHPAC WWOXTYSKCYOBP6H7OQNLZJ22O6WVWCHQNJTHBRQ3ZEJH2KSQF3UAC AYSPIRRQNBESKXOVILHY4QEIZA37AOFFT5KY75GKZJIPUXD62UIQC B22T6OTOYMTCUQJGC4DVNB2FNKIYQHLU3I7H2OBWTNLX5WT2Y5RQC MGOB3WXKVDFPE5PPKWC4EEST2CR4NQ7B2FASVYHO5JNNGXC5NNPAC let () =assert (Some 1 = gl ());assert (Some 2 = gl ());assert (Some 3 = gl ());assert (None = gl ());assert (None = gl ()) *)let gen_list : 'a list -> 'a gen = generate List.iterlet gl : int gen = gen_list [ 1; 2; 3 ]let generate (type elt) (i : (elt, 'container) iter) (c : 'container) : elt gen=let module M = structtype _ eff += Yield : elt -> unit effend inlet open M inlet rec step =ref (fun () ->i (fun v -> perform (Yield v)) c;(step := fun () -> None);None)inlet loop () =try_with !step (){effc =(fun (type a) (e : a eff) ->match e with| Yield v ->Some(fun (k : (a, _) continuation) ->step := continue k;Some v)| _ -> None);}inlooptype ('elt, 'container) iter = ('elt -> unit) -> 'container -> unittype 'elt gen = unit -> 'elt option(*open EffectHandlersopen EffectHandlers.Deeplet () =Eio_luv.run @@ fun env ->main ~net:(Eio.Stdenv.net env) ~addr:(`Tcp (Eio.Net.Ipaddr.V4.loopback, 1337))open Eio.Stdlet run_client ~net ~addr =traceln "Connecting to server...";Switch.run @@ fun sw ->let flow = Eio.Net.connect ~sw net addr inEio.Flow.copy_string "Hello from client" flowlet run_server socket =Switch.run @@ fun sw ->let rec loop () =Eio.Net.accept_sub socket ~sw(fun ~sw:_ flow _addr ->traceln "Server accepted connection from client";let b = Buffer.create 100 inEio.Flow.copy flow (Eio.Flow.buffer_sink b);traceln "Server received: %S" (Buffer.contents b))~on_error:(traceln "Error handling connection: %a" Fmt.exn);loop ()inloop ()let main ~net ~addr =Switch.run @@ fun sw ->let server = Eio.Net.listen net ~sw ~reuse_addr:true ~backlog:5 addr intraceln "Server ready...";Fibre.both (fun () -> run_server server) (fun () -> run_client ~net ~addr)
let open Result inlet+ token =Toml.Lenses.(get tbl (key "auth" |-- table |-- key "token" |-- string))|> Option.to_result_lazy (fun () ->`Msg "Invalid configuration: missing [auth.token]")
let token =matchToml.Lenses.(get tbl (key "auth" |-- table |-- key "token" |-- string))with| Some t -> t| None ->raise@@ Invalid_config "Invalid configuration: missing [auth.token]"
Error.msgf"Invalid TOML in configuration: @[file='%s'@] @[line=%d@] \@[column=%d@]@."filename loc.line loc.column
let msg =Format.sprintf"Invalid TOML in configuration: @[file='%s'@] @[line=%d@] \@[column=%d@]@."filename loc.line loc.columninraise @@ Invalid_config msg
Sink.make (fun r ->if Level.Infix.(Record.level r <= v) then cli_fmter cli_fmt r else ())|> Relog.Sink.set
let mtx = Mutex.create () inlet handler r =if Level.Infix.(Record.level r <= verbosity) then (Mutex.lock mtx;Fun.protect~finally:(fun () -> Mutex.unlock mtx)(fun () -> cli_fmter cli_fmt r))else ()inSink.make handler |> Relog.Sink.set
Lwt_unix.on_signal Sys.sigint (fun _ ->Lwt.dont_wait (fun () -> Client.disconnect client) ignore)|> ignore;let open Lwt.Syntax in
Sys.set_signal Sys.sigint(Sys.Signal_handle (fun _ -> Client.disconnect client));
| Some ("join", vchan) -> (let guild_id = Option.get_exn guild_id inlet vchan = M.Snowflake.of_string vchan inlet voice = Client.voice client inlet call = Voice.Manager.get ~guild_id voice inVoice.Call.join call ~channel_id:vchan >>= function| Error e ->let msg =Msg.fmt "⚠️ Couldn't join voice channel: %a" Voice.Error.ppeinClient.send_message channel_id msg client| Ok () -> Lwt.return_unit)| Some ("leave", _) ->let guild_id = Option.get_exn guild_id inlet voice = Client.voice client inlet call = Voice.Manager.get ~guild_id voice inVoice.Call.leave call
(* | Some ("join", vchan) -> (let guild_id = Option.get_exn guild_id inlet vchan = M.Snowflake.of_string vchan inlet voice = Client.voice client inlet call = Voice.Manager.get ~guild_id voice inVoice.Call.join call ~channel_id:vchan >>= function| Error e ->let msg =Msg.fmt "⚠️ Couldn't join voice channel: %a" Voice.Error.pp einClient.send_message channel_id msg client| Ok () -> Lwt.return_unit)| Some ("leave", _) ->let guild_id = Option.get_exn guild_id inlet voice = Client.voice client inlet call = Voice.Manager.get ~guild_id voice inVoice.Call.leave call *)
(Lwt.async_exception_hook :=fun exn -> L.err (fun m -> m "async exn: %a" Error.pp (`Exn exn)));let inner () =let open Result.Infix insetup_logging ();let* config = Config.of_filename "./discopotty.toml" inlet* ytdl = Ytdl.create () inlet token = Config.token config inLwt_main.run (Client.run ~handler:(handler config ytdl) token)inmatch inner () with| Ok () -> ()| Error error -> prerr_endline (Error.to_string error)| exception e -> prerr_endline Error.(of_exn e |> to_string)
Printexc.record_backtrace true;setup_logging ();let config = Config.of_filename "./discopotty.toml" inlet token = Config.token config intry Client.run ~env ~handler:(handler config) tokenwith e ->L.err (fun m ->m "fatal exception: %s@.%s" (Printexc.to_string e)(Printexc.get_backtrace ()));exit (-1)let () =Eio_unix.Ctf.with_tracing "discopotty.ctf" @@ fun () -> Eio_luv.run main
let create path =let oflags = Unix.[ O_WRONLY; O_CREAT ] inlet readers = Ke.Fke.empty inLwt_io.open_file ~mode:Lwt_io.Output ~flags:oflags path >|= fun oc ->{ path; oc; readers; written = 0 }
let create path =let oflags = Unix.[ O_WRONLY; O_CREAT ] inlet readers = Ke.Fke.empty inLwt_io.open_file ~mode:Lwt_io.Output ~flags:oflags path >|= fun oc ->{ path; oc; readers; written = 0 }
let notify_readers t written =let rec notify ?(acc = Ke.Fke.empty) k =match Ke.Fke.pop k with| Some ({ ic; _ }, xs) when Lwt_io.is_closed ic -> notify ~acc xs| Some (({ op = Live n; _ } as r), xs) ->r.op <- (if written = 0 then Draining n else Live (n + written));notify ~acc:(Ke.Fke.push acc r) xs| Some (({ op = Scheduled u; _ } as r), xs) ->r.op <- (if written = 0 then Draining 0 else Live written);Lwt.wakeup_later u ();notify ~acc:(Ke.Fke.push acc r) xs| Some (({ op = Draining _; _ } as r), xs) ->if written <> 0 then failwith "write after close?";notify ~acc:(Ke.Fke.push acc r) xs| None -> accint.readers <- notify t.readers
let notify_readers t written =let rec notify ?(acc = Ke.Fke.empty) k =match Ke.Fke.pop k with| Some ({ ic; _ }, xs) when Lwt_io.is_closed ic -> notify ~acc xs| Some (({ op = Live n; _ } as r), xs) ->r.op <- (if written = 0 then Draining n else Live (n + written));notify ~acc:(Ke.Fke.push acc r) xs| Some (({ op = Scheduled u; _ } as r), xs) ->r.op <- (if written = 0 then Draining 0 else Live written);Lwt.wakeup_later u ();notify ~acc:(Ke.Fke.push acc r) xs| Some (({ op = Draining _; _ } as r), xs) ->if written <> 0 then failwith "write after close?";notify ~acc:(Ke.Fke.push acc r) xs| None -> accint.readers <- notify t.readers
let write t ?(off = 0) ?len b =if Lwt_io.is_closed t.oc thenfailwith "File_stream: cannot write to closed file";let len = Option.get_lazy (fun () -> Bigstringaf.length b - off) len inLwt_io.write_from_exactly_bigstring t.oc b off len >|= fun () ->t.written <- t.written + len;notify_readers t len
let write t ?(off = 0) ?len b =if Lwt_io.is_closed t.oc thenfailwith "File_stream: cannot write to closed file";let len = Option.get_lazy (fun () -> Bigstringaf.length b - off) len inLwt_io.write_from_exactly_bigstring t.oc b off len >|= fun () ->t.written <- t.written + len;notify_readers t len
let reader t =let iflags = Unix.[ O_RDONLY ] inLwt_io.open_file ~mode:Lwt_io.Input ~flags:iflags t.path >|= fun ic ->let op =if Lwt_io.is_closed t.oc then Draining t.written else Live t.writteninlet r = { ic; op } int.readers <- Ke.Fke.push t.readers r;r
let reader t =let iflags = Unix.[ O_RDONLY ] inLwt_io.open_file ~mode:Lwt_io.Input ~flags:iflags t.path >|= fun ic ->let op =if Lwt_io.is_closed t.oc then Draining t.written else Live t.writteninlet r = { ic; op } int.readers <- Ke.Fke.push t.readers r;r
module Reader = structlet rec read t ?(off = 0) ?len b =let len = Option.get_lazy (fun () -> Bigstringaf.length b - off) len inmatch t.op with| _ when Lwt_io.is_closed t.ic -> Lwt.return None| Scheduled _ -> failwith "File_stream: read already scheduled"| Draining 0 ->(if not @@ Lwt_io.is_closed t.ic then Lwt_io.close t.icelse Lwt.return_unit)>|= fun () -> None| Live 0 ->let p, u = Lwt.wait () int.op <- Scheduled u;p >>= fun () -> read t ~off ~len b| (Live avail | Draining avail) as op ->Lwt_io.read_into_bigstring t.ic b off (min len avail) >>= fun n ->t.op <-(match op with| Live _ -> Live (avail - n)| Draining _ -> Draining (avail - n)| _ -> failwith "unreachable");Lwt.return @@ Some n
module Reader = structlet rec read t ?(off = 0) ?len b =let len = Option.get_lazy (fun () -> Bigstringaf.length b - off) len inmatch t.op with| _ when Lwt_io.is_closed t.ic -> Lwt.return None| Scheduled _ -> failwith "File_stream: read already scheduled"| Draining 0 ->(if not @@ Lwt_io.is_closed t.ic then Lwt_io.close t.icelse Lwt.return_unit)>|= fun () -> None| Live 0 ->let p, u = Lwt.wait () int.op <- Scheduled u;p >>= fun () -> read t ~off ~len b| (Live avail | Draining avail) as op ->Lwt_io.read_into_bigstring t.ic b off (min len avail) >>= fun n ->t.op <-(match op with| Live _ -> Live (avail - n)| Draining _ -> Draining (avail - n)| _ -> failwith "unreachable");Lwt.return @@ Some n
let to_pipe t =let buf = Bigstringaf.create 0x1000 inlet p = Lwt_pipe.create () inlet rec fwd () =read t buf >>= function| None -> Lwt.return_unit| Some n ->Lwt_pipe.write p (Bigstringaf.copy buf ~off:0 ~len:n) >>= fun ok ->if ok then fwd () else close tinlet f = Lwt.finalize fwd (fun () -> close t) inLwt.on_termination f (fun () -> Lwt_pipe.close_nonblock p);Lwt_pipe.keep p f;pendend
let to_pipe t =let buf = Bigstringaf.create 0x1000 inlet p = Lwt_pipe.create () inlet rec fwd () =read t buf >>= function| None -> Lwt.return_unit| Some n ->Lwt_pipe.write p (Bigstringaf.copy buf ~off:0 ~len:n) >>= fun ok ->if ok then fwd () else close tinlet f = Lwt.finalize fwd (fun () -> close t) inLwt.on_termination f (fun () -> Lwt_pipe.close_nonblock p);Lwt_pipe.keep p f;pendend
type track = {id : string;title : string;url : string;thumbnail : string option; [@yojson.option]}[@@deriving show, yojson] [@@yojson.allow_extra_fields]
type track = {id : string;title : string;url : string;thumbnail : string option; [@yojson.option]}[@@deriving show, yojson] [@@yojson.allow_extra_fields]
let create ?(max_size = 500 * mb) ?(dir = "./.discostore") () =let open Result.Infix inlet+ () =match Sys.is_directory dir with| false -> Error.msgf "'%s' already exists and is not a directory" dir| true -> Ok ()| exception Sys_error _ ->Sys.mkdir dir 0o751;Ok ()in{ dir; max_size }
let create ?(max_size = 500 * mb) ?(dir = "./.discostore") () =let open Result.Infix inlet+ () =match Sys.is_directory dir with| false -> Error.msgf "'%s' already exists and is not a directory" dir| true -> Ok ()| exception Sys_error _ ->Sys.mkdir dir 0o751;Ok ()in{ dir; max_size }
let query t q =let cmd = t.bin inlet playlist = String.find ~sub:"list=" q <> -1 inlet args = base_args @ [ "-j"; q ] inlet args = if playlist then "--flat-playlist" :: args else args inlet cmd_str = cmd :: args |> List.to_string ~sep:" " Fun.id inL.info (fun m -> m "running cmd: %s" cmd_str);Lwt_process.with_process_full("", Array.of_list @@ cmd :: args)(fun proc ->let _logs () = Lwt_io.read proc#stderr inL.info (fun m -> m "youtube-dl running with pid=%d" proc#pid);(Lwt_io.read_line proc#stdout |> Lwt_result.catch >|= function| Error End_of_file -> Ok []| Error exn -> Error.exn exn| Ok track ->let track_json = Yojson.Safe.from_string track inlet track = track_of_yojson track_json inOk [ track ])>>= fun res ->proc#close >|= fun _ -> res)
let query t q =let cmd = t.bin inlet playlist = String.find ~sub:"list=" q <> -1 inlet args = base_args @ [ "-j"; q ] inlet args = if playlist then "--flat-playlist" :: args else args inlet cmd_str = cmd :: args |> List.to_string ~sep:" " Fun.id inL.info (fun m -> m "running cmd: %s" cmd_str);Lwt_process.with_process_full("", Array.of_list @@ cmd :: args)(fun proc ->let _logs () = Lwt_io.read proc#stderr inL.info (fun m -> m "youtube-dl running with pid=%d" proc#pid);(Lwt_io.read_line proc#stdout |> Lwt_result.catch >|= function| Error End_of_file -> Ok []| Error exn -> Error.exn exn| Ok track ->let track_json = Yojson.Safe.from_string track inlet track = track_of_yojson track_json inOk [ track ])>>= fun res ->proc#close >|= fun _ -> res)
let download t track =let open Lwt.Syntax inlet filename = Store.path t.store track.id inlet p, u = Lwt.wait () inlet w () =Lwt_process.with_process_full("", [| t.bin; "-a"; "-"; "-o"; "-" |])(fun proc ->let* () = Lwt_io.write proc#stdin track.url inlet* () = Lwt_io.close proc#stdin inlet* sf = File_stream.create filename inlet buf = Bigstringaf.create 0x1000 inlet rec poll () =Lwt_io.read_into_bigstring proc#stdout buf 0 0x1000 >>= function| 0 -> File_stream.close sf| n ->let* () =if Lwt.is_sleeping p thenFile_stream.reader sf >|= File_stream.Reader.to_pipe>|= fun s -> Lwt.wakeup_later u (Ok s)else Lwt.return_unitinFile_stream.write sf ~off:0 ~len:n buf >>= pollinpoll () >>= fun () ->proc#close >>= function| Unix.WEXITED 0 ->if Lwt.is_sleeping p then Lwt.return (Error.msg "0 byte stream?")else Lwt_result.return ()| WEXITED n | WSTOPPED n | WSIGNALED n ->Lwt.return (Error.msgf "youtube-dl returned non 0 code: %d" n))inLwt.async (fun () ->w () >|= fun r ->match (Lwt.is_sleeping p, r) with| true, (Error _ as e) -> Lwt.wakeup_later u e| true, Ok () -> ()| false, _ -> ());p
let download t track =let open Lwt.Syntax inlet filename = Store.path t.store track.id inlet p, u = Lwt.wait () inlet w () =Lwt_process.with_process_full("", [| t.bin; "-a"; "-"; "-o"; "-" |])(fun proc ->let* () = Lwt_io.write proc#stdin track.url inlet* () = Lwt_io.close proc#stdin inlet* sf = File_stream.create filename inlet buf = Bigstringaf.create 0x1000 inlet rec poll () =Lwt_io.read_into_bigstring proc#stdout buf 0 0x1000 >>= function| 0 -> File_stream.close sf| n ->let* () =if Lwt.is_sleeping p thenFile_stream.reader sf >|= File_stream.Reader.to_pipe>|= fun s -> Lwt.wakeup_later u (Ok s)else Lwt.return_unitinFile_stream.write sf ~off:0 ~len:n buf >>= pollinpoll () >>= fun () ->proc#close >>= function| Unix.WEXITED 0 ->if Lwt.is_sleeping p then Lwt.return (Error.msg "0 byte stream?")else Lwt_result.return ()| WEXITED n | WSTOPPED n | WSIGNALED n ->Lwt.return (Error.msgf "youtube-dl returned non 0 code: %d" n))inLwt.async (fun () ->w () >|= fun r ->match (Lwt.is_sleeping p, r) with| true, (Error _ as e) -> Lwt.wakeup_later u e| true, Ok () -> ()| false, _ -> ());p
let stream path =let open Lwt_result.Syntax inlet+ ic = Lwt_io.open_file ~mode:Lwt_io.input path |> Error.catch_lwt inlet p = Lwt_pipe.create () inlet b = Bigstringaf.create 0x1000 inlet blen = Bigstringaf.length b inlet rec fwd () =Lwt_io.read_into_bigstring ic b 0 blen >>= function| 0 -> Lwt.return_unit| len ->Lwt_pipe.write p (Bigstringaf.copy b ~off:0 ~len) >>= fun ok ->if ok then fwd () else Lwt.return_unitinlet f = Lwt.finalize fwd (fun () -> Lwt_io.close ic) inLwt.on_termination f (fun () -> Lwt_pipe.close_nonblock p);Lwt_pipe.keep p f;p
let stream path =let open Lwt_result.Syntax inlet+ ic = Lwt_io.open_file ~mode:Lwt_io.input path |> Error.catch_lwt inlet p = Lwt_pipe.create () inlet b = Bigstringaf.create 0x1000 inlet blen = Bigstringaf.length b inlet rec fwd () =Lwt_io.read_into_bigstring ic b 0 blen >>= function| 0 -> Lwt.return_unit| len ->Lwt_pipe.write p (Bigstringaf.copy b ~off:0 ~len) >>= fun ok ->if ok then fwd () else Lwt.return_unitinlet f = Lwt.finalize fwd (fun () -> Lwt_io.close ic) inLwt.on_termination f (fun () -> Lwt_pipe.close_nonblock p);Lwt_pipe.keep p f;p
let get t q =query t q >>= function| (Ok [] | Error _) as o -> Lwt.return o| Ok (track :: _) -> (let f =Store.get t.store track.id|> Option.map (fun path ->L.debug (fun m -> m "track file '%s' cached in store" path);stream path |> Lwt_result.map (fun s -> `Stream s))|> Option.get_lazy (fun () ->L.debug (fun m ->m "track '%s' not cached, downloading..." track.id);download t track |> Lwt_result.map (fun s -> `Stream s))inf >|= function Ok i -> Ok [ (track, i) ] | Error _ as e -> e)
let get t q =query t q >>= function| (Ok [] | Error _) as o -> Lwt.return o| Ok (track :: _) -> (let f =Store.get t.store track.id|> Option.map (fun path ->L.debug (fun m -> m "track file '%s' cached in store" path);stream path |> Lwt_result.map (fun s -> `Stream s))|> Option.get_lazy (fun () ->L.debug (fun m ->m "track '%s' not cached, downloading..." track.id);download t track |> Lwt_result.map (fun s -> `Stream s))inf >|= function Ok i -> Ok [ (track, i) ] | Error _ as e -> e)
let create ?(bin = "youtube-dl") ?store () =let open Result.Infix inlet* () =match Sys.command (bin ^ " --version") with| 0 -> Ok ()| _ -> Error.msgf "'%s' is not a valid youtube-dl binary" bininlet+ store = Option.map Result.return store |> Option.get_lazy Store.create in{ bin; store }
let create ?(bin = "youtube-dl") ?store () =let open Result.Infix inlet* () =match Sys.command (bin ^ " --version") with| 0 -> Ok ()| _ -> Error.msgf "'%s' is not a valid youtube-dl binary" bininlet+ store = Option.map Result.return store |> Option.get_lazy Store.create in{ bin; store } *)
module Eio_proc = Disco_utils.Eio_proclet read_str flow =let out = Buffer.create 1024 inlet buf = Cstruct.create_unsafe 1024 inlet rec read () =match Eio.Flow.read flow buf with| (exception End_of_file) | 0 ->Buffer.to_bytes out |> Bytes.unsafe_to_string| n ->Buffer.add_bytes out (Cstruct.to_bytes ~len:n buf);read ()inread ()let worker n =Eio.Switch.run @@ fun sw ->let str = Format.sprintf "worker %d" n inlet proc = Eio_proc.spawn ~sw "cat" inEio.Flow.copy_string str (Eio_proc.stdin proc);Eio.Flow.close (Eio_proc.stdin proc);let logs = read_str (Eio_proc.stderr proc) inEio.traceln "logs: %s" logs;let str_out = read_str (Eio_proc.stdout proc) inEio.traceln "%s vs %s" str str_out;assert (String.equal str str_out)let () =Eio_luv.run @@ fun env ->let _dmgr = Eio.Stdenv.domain_mgr env inEio.Switch.run @@ fun _sw -> worker 0(* for i = 1 to 10 doEio.Fiber.fork ~sw @@ fun () ->Eio.Domain_manager.run dmgr @@ fun () -> worker idone *)
open Disco_utilsopen Eio.Stdlet consumer ~sw ~clock ?(prefix = "") bucket =let rec loop ?(cmavg = 0.) ?(n = 0.) () =traceln "%s taking" prefix;let now = Eio.Time.now clock inLf_token_bucket.take ~sw bucket;let dt = Eio.Time.now clock -. now inlet n = n +. 1. inlet cmavg = cmavg +. ((dt -. cmavg) /. n) intraceln "%s took %fs (avg: %fs)" prefix dt cmavg;loop ~cmavg ~n ()inloop ()let consumers ~clock ?(prefix = "") ?(n = 10) bucket =let prefix n = Format.sprintf "%s [%d]:" prefix n inSwitch.run @@ fun sw ->let spawn n () = consumer ~sw ~clock ~prefix:(prefix n) bucket infor i = 1 to n doFiber.fork ~sw (spawn i);Fiber.yield ()donelet main_sc ?n env =let clock = Eio.Stdenv.clock env inlet bucket = Lf_token_bucket.make ~capacity:10 1. inconsumers ~clock ?n bucketlet main_mc env =let clock = Eio.Stdenv.clock env inlet dmgr = Eio.Stdenv.domain_mgr env inSwitch.run @@ fun sw ->let bucket = Lf_token_bucket.make ~capacity:10 ~init:0 1. inlet spawn_worker name =Fiber.fork ~sw (fun () ->Eio.Domain_manager.run dmgr (fun () ->consumers ~clock ~prefix:name ~n:6 bucket))infor i = 1 to 6 dolet asci = char_of_int (64 + i) inspawn_worker (Format.sprintf "[%c]" asci)donelet () =(* Eio_unix.Ctf.with_tracing "trace.ctf" @@ fun () -> *)(* Eio_luv.run @@ fun env -> main_sc env *)Eio_luv.run @@ fun env -> main_mc env
"devDependencies": []},"esy-openssl@archive:https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#sha1:33324ff957edaae8ae575817b456320378da46ff@41b6fb3d": {"id":"esy-openssl@archive:https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#sha1:33324ff957edaae8ae575817b456320378da46ff@41b6fb3d","name": "esy-openssl","version":"archive:https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#sha1:33324ff957edaae8ae575817b456320378da46ff","source": {"type": "install","source": ["archive:https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#sha1:33324ff957edaae8ae575817b456320378da46ff"]},"overrides": [ "esy.lock/overrides/41b6fb3db953254b0cb4c5e1b546f3f4" ],"dependencies": ["@opam/conf-pkg-config@opam:1.3@93481236","@opam/conf-autoconf@github:esy-packages/esy-autoconf:package.json#fb93edf@d41d8cd9"],
"dependencies": [],"devDependencies": []},"esy-gmp@archive:https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#sha1:0578d48607ec0e272177d175fd1807c30b00fdf2@d3dc108f": {"id":"esy-gmp@archive:https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#sha1:0578d48607ec0e272177d175fd1807c30b00fdf2@d3dc108f","name": "esy-gmp","version":"archive:https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#sha1:0578d48607ec0e272177d175fd1807c30b00fdf2","source": {"type": "install","source": ["archive:https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#sha1:0578d48607ec0e272177d175fd1807c30b00fdf2"]},"overrides": [ "esy.lock/overrides/d3dc108f8f9f64699d29c9c180f20b50" ],
"@opam/websocketaf-lwt-unix@github:anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e@d41d8cd9","@opam/websocketaf@github:anmonteiro/websocketaf:websocketaf.opam#ad4e61e@d41d8cd9",
"@opam/websocketaf@github:quartz55/websocketaf:websocketaf.opam#49bb812@d41d8cd9",
"@opam/mtime@opam:1.2.0@acd670b8","@opam/lwt-pipe@opam:0.1@0ce87a36", "@opam/lwt@opam:5.4.2@f5e79982","@opam/ke@opam:0.4@10bac7d7", "@opam/hxd@opam:0.3.1@a1c09d49","@opam/httpaf-lwt-unix@github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde@d41d8cd9","@opam/eio_luv@github:quartz55/eio:eio_luv.opam#3c5d949@d41d8cd9","@opam/eio@github:quartz55/eio:eio.opam#3c5d949@d41d8cd9",
"@opam/mtime@opam:1.2.0@acd670b8", "@opam/ke@opam:0.6@9ad9641b","@opam/hxd@opam:0.3.2@e56508b0","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#395aad2@d41d8cd9","@opam/gluten@github:anmonteiro/gluten:gluten.opam#7257692@d41d8cd9","@opam/eio_luv@github:quartz55/eio:eio_luv.opam#2c68f46@d41d8cd9","@opam/eio@github:quartz55/eio:eio.opam#2c68f46@d41d8cd9",
"@opam/qcheck-core@opam:0.18@d76ebd27","@opam/qcheck-alcotest@opam:0.18@92fc95b9","@opam/odoc@opam:2.0.2@8ef5ea1b","@opam/ocamlformat@opam:0.20.1@6e37e311","@opam/ocaml-lsp-server@opam:1.9.1@1397dba9",
"@opam/qcheck-core@opam:0.18.1@5f40aab3","@opam/qcheck-alcotest@opam:0.18.1@c4603318","@opam/odoc@opam:2.1.0@d39daa6f","@opam/ocamlformat@opam:0.21.0@b395910b","@opam/ocaml-lsp-server@opam:1.9.0@671f2077",
"@opam/alcotest-lwt@opam:1.5.0@f1f00af0","@opam/alcotest@opam:1.5.0@c3a8eb69"
"@opam/earlybird@opam:1.1.0@4bff968a","@opam/alcotest@opam:1.5.0@338d9572"]},"@opam/zarith@opam:1.12@232cc7f2": {"id": "@opam/zarith@opam:1.12@232cc7f2","name": "@opam/zarith","version": "opam:1.12","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/bf/bf368f3d9e20b6b446d54681afc05a04#md5:bf368f3d9e20b6b446d54681afc05a04","archive:https://github.com/ocaml/Zarith/archive/release-1.12.tar.gz#md5:bf368f3d9e20b6b446d54681afc05a04"],"opam": {"name": "zarith","version": "1.12","path": "esy.lock/opam/zarith.1.12"}},"overrides": [{"opamoverride":"esy.lock/overrides/opam__s__zarith_opam__c__1.12_opam_override"}],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ocamlfind@opam:1.8.1@b7dc3072","@opam/conf-gmp@opam:4@c394e8f1", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ocamlfind@opam:1.8.1@b7dc3072","@opam/conf-gmp@opam:4@c394e8f1"
"@opam/websocketaf-lwt-unix@github:anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e@d41d8cd9": {"id":"@opam/websocketaf-lwt-unix@github:anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e@d41d8cd9","name": "@opam/websocketaf-lwt-unix","version":"github:anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e",
"@opam/x509@opam:0.16.0@7ea5b66f": {"id": "@opam/x509@opam:0.16.0@7ea5b66f","name": "@opam/x509","version": "opam:0.16.0",
"github:anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e"]
"archive:https://opam.ocaml.org/cache/sha256/67/67a6727fb4c38b919334eef2f8ef4eac0237029a439ff981d408eca8b9833595#sha256:67a6727fb4c38b919334eef2f8ef4eac0237029a439ff981d408eca8b9833595","archive:https://github.com/mirleft/ocaml-x509/releases/download/v0.16.0/x509-0.16.0.tbz#sha256:67a6727fb4c38b919334eef2f8ef4eac0237029a439ff981d408eca8b9833595"],"opam": {"name": "x509","version": "0.16.0","path": "esy.lock/opam/x509.0.16.0"}
"@opam/websocketaf-lwt@github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e@d41d8cd9","@opam/websocketaf@github:anmonteiro/websocketaf:websocketaf.opam#ad4e61e@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","@opam/faraday-lwt-unix@opam:0.8.1@e733b134","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/websocketaf-lwt@github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e@d41d8cd9","@opam/websocketaf@github:anmonteiro/websocketaf:websocketaf.opam#ad4e61e@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","@opam/faraday-lwt-unix@opam:0.8.1@e733b134"]},"@opam/websocketaf-lwt@github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e@d41d8cd9": {"id":"@opam/websocketaf-lwt@github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e@d41d8cd9","name": "@opam/websocketaf-lwt","version": "github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e","source": {"type": "install","source": ["github:anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e"]},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/websocketaf@github:anmonteiro/websocketaf:websocketaf.opam#ad4e61e@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/faraday-lwt-unix@opam:0.8.1@e733b134",
"@opam/ptime@opam:0.8.6@5df936b0", "@opam/pbkdf@opam:1.2.0@1484a934","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto-pk@opam:0.10.6@86e09b65","@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/logs@opam:0.7.0@46a3dffc", "@opam/ipaddr@opam:5.3.0@56e263f1","@opam/gmap@opam:0.3.0@5c009abd", "@opam/fmt@opam:0.9.0@87213963",
"@opam/websocketaf@github:anmonteiro/websocketaf:websocketaf.opam#ad4e61e@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/faraday-lwt-unix@opam:0.8.1@e733b134","@opam/digestif@opam:1.1.0@a8d16625"
"@opam/ptime@opam:0.8.6@5df936b0", "@opam/pbkdf@opam:1.2.0@1484a934","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto-pk@opam:0.10.6@86e09b65","@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/logs@opam:0.7.0@46a3dffc", "@opam/ipaddr@opam:5.3.0@56e263f1","@opam/gmap@opam:0.3.0@5c009abd", "@opam/fmt@opam:0.9.0@87213963","@opam/dune@opam:2.9.3@f57a6d69","@opam/domain-name@opam:0.4.0@ab0ca2e3","@opam/cstruct@opam:6.1.0@b0cd6e0b","@opam/base64@opam:3.5.0@827395e3","@opam/asn1-combinators@opam:0.2.6@220d4b1d"
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten@opam:0.2.1@fca26440",
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#395aad2@d41d8cd9","@opam/gluten@github:anmonteiro/gluten:gluten.opam#7257692@d41d8cd9",
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten@opam:0.2.1@fca26440",
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#395aad2@d41d8cd9","@opam/gluten@github:anmonteiro/gluten:gluten.opam#7257692@d41d8cd9",
"archive:https://opam.ocaml.org/cache/md5/a7/a7c542405a39630c689a82bd7ef2292c#md5:a7c542405a39630c689a82bd7ef2292c","archive:http://erratique.ch/software/uutf/releases/uutf-1.0.2.tbz#md5:a7c542405a39630c689a82bd7ef2292c"
"archive:https://opam.ocaml.org/cache/sha512/50/50cc4486021da46fb08156e9daec0d57b4ca469b07309c508d5a9a41e9dbcf1f32dec2ed7be027326544453dcaf9c2534919395fd826dc7768efc6cc4bfcc9f8#sha512:50cc4486021da46fb08156e9daec0d57b4ca469b07309c508d5a9a41e9dbcf1f32dec2ed7be027326544453dcaf9c2534919395fd826dc7768efc6cc4bfcc9f8","archive:https://erratique.ch/software/uutf/releases/uutf-1.0.3.tbz#sha512:50cc4486021da46fb08156e9daec0d57b4ca469b07309c508d5a9a41e9dbcf1f32dec2ed7be027326544453dcaf9c2534919395fd826dc7768efc6cc4bfcc9f8"
"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/uchar@opam:0.0.2@c8218eea"]
"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]
"@opam/uchar@opam:0.0.2@c8218eea": {"id": "@opam/uchar@opam:0.0.2@c8218eea","name": "@opam/uchar","version": "opam:0.0.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/c9/c9ba2c738d264c420c642f7bb1cf4a36#md5:c9ba2c738d264c420c642f7bb1cf4a36","archive:https://github.com/ocaml/uchar/releases/download/v0.0.2/uchar-0.0.2.tbz#md5:c9ba2c738d264c420c642f7bb1cf4a36"],"opam": {"name": "uchar","version": "0.0.2","path": "esy.lock/opam/uchar.0.0.2"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ocamlbuild@opam:0.14.0@0dee4078","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]},
"@opam/tls@opam:0.15.2@49c3e04e": {"id": "@opam/tls@opam:0.15.2@49c3e04e","name": "@opam/tls","version": "opam:0.15.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/b7/b76371757249bbeabb12c333de4ea2a09c095767bdbbc83322538c0da1fc1e36#sha256:b76371757249bbeabb12c333de4ea2a09c095767bdbbc83322538c0da1fc1e36","archive:https://github.com/mirleft/ocaml-tls/releases/download/v0.15.2/tls-v0.15.2.tbz#sha256:b76371757249bbeabb12c333de4ea2a09c095767bdbbc83322538c0da1fc1e36"],"opam": {"name": "tls","version": "0.15.2","path": "esy.lock/opam/tls.0.15.2"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/x509@opam:0.16.0@7ea5b66f","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ptime@opam:0.8.6@5df936b0","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_cstruct@opam:6.1.0@95f58e08","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto-pk@opam:0.10.6@86e09b65","@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/lwt@opam:5.5.0@30354e4c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/ipaddr-sexp@opam:5.3.0@3f923dde","@opam/ipaddr@opam:5.3.0@56e263f1", "@opam/hkdf@opam:1.0.4@c948bc13","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/domain-name@opam:0.4.0@ab0ca2e3","@opam/cstruct-sexp@opam:6.1.0@c7f4312d","@opam/cstruct@opam:6.1.0@b0cd6e0b","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/x509@opam:0.16.0@7ea5b66f","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ptime@opam:0.8.6@5df936b0","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_cstruct@opam:6.1.0@95f58e08","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto-pk@opam:0.10.6@86e09b65","@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/lwt@opam:5.5.0@30354e4c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/ipaddr-sexp@opam:5.3.0@3f923dde","@opam/ipaddr@opam:5.3.0@56e263f1", "@opam/hkdf@opam:1.0.4@c948bc13","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/domain-name@opam:0.4.0@ab0ca2e3","@opam/cstruct-sexp@opam:6.1.0@c7f4312d","@opam/cstruct@opam:6.1.0@b0cd6e0b"]},"@opam/time_now@opam:v0.14.0@ecc73110": {"id": "@opam/time_now@opam:v0.14.0@ecc73110","name": "@opam/time_now","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/a9/a93116938783587f8b9f5152dd543037#md5:a93116938783587f8b9f5152dd543037","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/time_now-v0.14.0.tar.gz#md5:a93116938783587f8b9f5152dd543037"],"opam": {"name": "time_now","version": "v0.14.0","path": "esy.lock/opam/time_now.v0.14.0"}},"overrides": [{"opamoverride":"esy.lock/overrides/opam__s__time__now_opam__c__v0.14.0_opam_override"}],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppx_optcomp@opam:v0.14.3@08009524","@opam/ppx_base@opam:v0.14.0@3221121a","@opam/jst-config@opam:v0.14.1@95aef818","@opam/jane-street-headers@opam:v0.14.0@b38e12bf","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppx_optcomp@opam:v0.14.3@08009524","@opam/ppx_base@opam:v0.14.0@3221121a","@opam/jst-config@opam:v0.14.1@95aef818","@opam/jane-street-headers@opam:v0.14.0@b38e12bf","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},
"@opam/stdlib-shims@opam:0.3.0@0d088929": {"id": "@opam/stdlib-shims@opam:0.3.0@0d088929",
"@opam/streaming@github:odis-labs/streaming:streaming.opam#74a4863@d41d8cd9": {"id":"@opam/streaming@github:odis-labs/streaming:streaming.opam#74a4863@d41d8cd9","name": "@opam/streaming","version": "github:odis-labs/streaming:streaming.opam#74a4863","source": {"type": "install","source": [ "github:odis-labs/streaming:streaming.opam#74a4863" ]},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdlib-shims@opam:0.3.0@72c7bc98","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdlib-shims@opam:0.3.0@72c7bc98","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/stdlib-shims@opam:0.3.0@72c7bc98": {"id": "@opam/stdlib-shims@opam:0.3.0@72c7bc98",
"@opam/ssl@opam:0.5.10@de15d287": {"id": "@opam/ssl@opam:0.5.10@de15d287","name": "@opam/ssl","version": "opam:0.5.10","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/af/afebbdc3130c1addf1da31e3b92c1dcd#md5:afebbdc3130c1addf1da31e3b92c1dcd","archive:https://github.com/savonet/ocaml-ssl/archive/v0.5.10.tar.gz#md5:afebbdc3130c1addf1da31e3b92c1dcd"],"opam": {"name": "ssl","version": "0.5.10","path": "esy.lock/opam/ssl.0.5.10"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/conf-libssl@opam:2@5d3479e1","@opam/base-unix@opam:base@87d0b2eb","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/conf-libssl@opam:2@5d3479e1","@opam/base-unix@opam:base@87d0b2eb"]},
"@opam/sexplib@opam:v0.14.0@61ef150a": {"id": "@opam/sexplib@opam:v0.14.0@61ef150a","name": "@opam/sexplib","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/6e/6e230eae22face46cb8645e53e351067#md5:6e230eae22face46cb8645e53e351067","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/sexplib-v0.14.0.tar.gz#md5:6e230eae22face46cb8645e53e351067"],"opam": {"name": "sexplib","version": "v0.14.0","path": "esy.lock/opam/sexplib.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/parsexp@opam:v0.14.2@1d15b9d2", "@opam/num@opam:1.4@54b259a0","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/parsexp@opam:v0.14.2@1d15b9d2", "@opam/num@opam:1.4@54b259a0","@opam/dune@opam:2.9.3@f57a6d69"]},
"archive:https://opam.ocaml.org/cache/md5/7e/7eb8cbbff8565b93ebfabf4eca7254d4#md5:7eb8cbbff8565b93ebfabf4eca7254d4","archive:https://registry.npmjs.org/@esy-ocaml/reason/-/reason-3.7.0.tgz#md5:7eb8cbbff8565b93ebfabf4eca7254d4"
"archive:https://opam.ocaml.org/cache/sha256/94/9478724b01767320064ba950ddea24c5df0eefdcdd8ff1324ba9ccd646258979#sha256:9478724b01767320064ba950ddea24c5df0eefdcdd8ff1324ba9ccd646258979","archive:https://github.com/reasonml/reason/releases/download/3.8.0/reason-3.8.0.tbz#sha256:9478724b01767320064ba950ddea24c5df0eefdcdd8ff1324ba9ccd646258979"
},"@opam/react@opam:1.2.2@e0f4480e": {"id": "@opam/react@opam:1.2.2@e0f4480e","name": "@opam/react","version": "opam:1.2.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha512/18/18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1#sha512:18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1","archive:https://erratique.ch/software/react/releases/react-1.2.2.tbz#sha512:18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1"],"opam": {"name": "react","version": "1.2.2","path": "esy.lock/opam/react.1.2.2"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/topkg@opam:1.0.5@0aa59f51","@opam/ocamlfind@opam:1.8.1@b7dc3072","@opam/ocamlbuild@opam:0.14.1@ead10f40","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]
"archive:https://opam.ocaml.org/cache/md5/a8/a830f187d3eed60eba960c8d626035a4#md5:a830f187d3eed60eba960c8d626035a4","archive:https://github.com/c-cube/qcheck/archive/v0.18.tar.gz#md5:a830f187d3eed60eba960c8d626035a4"
"archive:https://opam.ocaml.org/cache/md5/e2/e207362d67387d6dbb8dcd4ba7238b39#md5:e207362d67387d6dbb8dcd4ba7238b39","archive:https://github.com/c-cube/qcheck/archive/v0.18.1.tar.gz#md5:e207362d67387d6dbb8dcd4ba7238b39"
"archive:https://opam.ocaml.org/cache/md5/a8/a830f187d3eed60eba960c8d626035a4#md5:a830f187d3eed60eba960c8d626035a4","archive:https://github.com/c-cube/qcheck/archive/v0.18.tar.gz#md5:a830f187d3eed60eba960c8d626035a4"
"archive:https://opam.ocaml.org/cache/md5/e2/e207362d67387d6dbb8dcd4ba7238b39#md5:e207362d67387d6dbb8dcd4ba7238b39","archive:https://github.com/c-cube/qcheck/archive/v0.18.1.tar.gz#md5:e207362d67387d6dbb8dcd4ba7238b39"
"archive:https://opam.ocaml.org/cache/sha256/77/7766027c2ecd0f5b3b460e9212a70709c6744278113eb91f317c56c41e7a90c8#sha256:7766027c2ecd0f5b3b460e9212a70709c6744278113eb91f317c56c41e7a90c8","archive:https://github.com/ocaml-ppx/ppxlib/releases/download/0.24.0/ppxlib-0.24.0.tbz#sha256:7766027c2ecd0f5b3b460e9212a70709c6744278113eb91f317c56c41e7a90c8"
"archive:https://opam.ocaml.org/cache/sha256/2d/2d2f150e7715845dc578d254f705a67600be71c986b7e67e81befda612870bd5#sha256:2d2f150e7715845dc578d254f705a67600be71c986b7e67e81befda612870bd5","archive:https://github.com/ocaml-ppx/ppxlib/releases/download/0.25.0/ppxlib-0.25.0.tbz#sha256:2d2f150e7715845dc578d254f705a67600be71c986b7e67e81befda612870bd5"
"@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e": {"id": "@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","name": "@opam/ppx_sexp_conv","version": "opam:v0.14.3","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/25/25caf01245e0113e035ccefe275f85d9#md5:25caf01245e0113e035ccefe275f85d9","archive:https://github.com/janestreet/ppx_sexp_conv/archive/v0.14.3.tar.gz#md5:25caf01245e0113e035ccefe275f85d9"],"opam": {"name": "ppx_sexp_conv","version": "v0.14.3","path": "esy.lock/opam/ppx_sexp_conv.v0.14.3"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_optcomp@opam:v0.14.3@08009524": {"id": "@opam/ppx_optcomp@opam:v0.14.3@08009524","name": "@opam/ppx_optcomp","version": "opam:v0.14.3","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/2d/2d012df62dd0bc82d2ea4ab25b628992#md5:2d012df62dd0bc82d2ea4ab25b628992","archive:https://github.com/janestreet/ppx_optcomp/archive/v0.14.3.tar.gz#md5:2d012df62dd0bc82d2ea4ab25b628992"],"opam": {"name": "ppx_optcomp","version": "v0.14.3","path": "esy.lock/opam/ppx_optcomp.v0.14.3"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdio@opam:v0.14.0@a5affb43","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdio@opam:v0.14.0@a5affb43","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},
"@opam/ppx_inline_test@opam:v0.14.1@8b68b6f7": {"id": "@opam/ppx_inline_test@opam:v0.14.1@8b68b6f7","name": "@opam/ppx_inline_test","version": "opam:v0.14.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/13/132754f0757188c3b700a2c5b6a2fb3f#md5:132754f0757188c3b700a2c5b6a2fb3f","archive:https://github.com/janestreet/ppx_inline_test/archive/v0.14.1.tar.gz#md5:132754f0757188c3b700a2c5b6a2fb3f"],"opam": {"name": "ppx_inline_test","version": "v0.14.1","path": "esy.lock/opam/ppx_inline_test.v0.14.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/time_now@opam:v0.14.0@ecc73110","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/time_now@opam:v0.14.0@ecc73110","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_here@opam:v0.14.0@c05577d4": {"id": "@opam/ppx_here@opam:v0.14.0@c05577d4","name": "@opam/ppx_here","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/bb/bb3bbde0964a1f866de09f3df44def4d#md5:bb3bbde0964a1f866de09f3df44def4d","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_here-v0.14.0.tar.gz#md5:bb3bbde0964a1f866de09f3df44def4d"],"opam": {"name": "ppx_here","version": "v0.14.0","path": "esy.lock/opam/ppx_here.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_hash@opam:v0.14.0@455f5f56": {"id": "@opam/ppx_hash@opam:v0.14.0@455f5f56","name": "@opam/ppx_hash","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/b7/b78aee19bb4469731f9626b04fe7f341#md5:b78aee19bb4469731f9626b04fe7f341","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_hash-v0.14.0.tar.gz#md5:b78aee19bb4469731f9626b04fe7f341"],"opam": {"name": "ppx_hash","version": "v0.14.0","path": "esy.lock/opam/ppx_hash.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_expect@opam:v0.14.1@72b3b5e4": {"id": "@opam/ppx_expect@opam:v0.14.1@72b3b5e4","name": "@opam/ppx_expect","version": "opam:v0.14.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/9c/9cc03dcabb00c72e17f7f5b0e4d28603#md5:9cc03dcabb00c72e17f7f5b0e4d28603","archive:https://github.com/janestreet/ppx_expect/archive/v0.14.1.tar.gz#md5:9cc03dcabb00c72e17f7f5b0e4d28603"],"opam": {"name": "ppx_expect","version": "v0.14.1","path": "esy.lock/opam/ppx_expect.v0.14.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdio@opam:v0.14.0@a5affb43", "@opam/re@opam:1.10.3@0585c65d","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_inline_test@opam:v0.14.1@8b68b6f7","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdio@opam:v0.14.0@a5affb43", "@opam/re@opam:1.10.3@0585c65d","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_inline_test@opam:v0.14.1@8b68b6f7","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_enumerate@opam:v0.14.0@2be34197": {"id": "@opam/ppx_enumerate@opam:v0.14.0@2be34197","name": "@opam/ppx_enumerate","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/18/188421af960759f6e45dd748f4f08e8d#md5:188421af960759f6e45dd748f4f08e8d","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_enumerate-v0.14.0.tar.gz#md5:188421af960759f6e45dd748f4f08e8d"],"opam": {"name": "ppx_enumerate","version": "v0.14.0","path": "esy.lock/opam/ppx_enumerate.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1": {"id": "@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1","name": "@opam/ppx_deriving_yojson","version": "opam:3.6.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/71/712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6#sha256:712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6","archive:https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.6.1/ppx_deriving_yojson-v3.6.1.tbz#sha256:712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6"],"opam": {"name": "ppx_deriving_yojson","version": "3.6.1","path": "esy.lock/opam/ppx_deriving_yojson.3.6.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/yojson@opam:1.7.0@69d87312", "@opam/result@opam:1.5@1c6a6533","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/yojson@opam:1.7.0@69d87312", "@opam/result@opam:1.5@1c6a6533","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/dune@opam:2.9.3@f57a6d69"]},
}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/ppx_cstruct@opam:6.1.0@95f58e08": {"id": "@opam/ppx_cstruct@opam:6.1.0@95f58e08","name": "@opam/ppx_cstruct","version": "opam:6.1.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/4f/4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b","archive:https://github.com/mirage/ocaml-cstruct/releases/download/v6.1.0/cstruct-6.1.0.tbz#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b"],"opam": {"name": "ppx_cstruct","version": "6.1.0","path": "esy.lock/opam/ppx_cstruct.6.1.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdlib-shims@opam:0.3.0@72c7bc98","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/stdlib-shims@opam:0.3.0@72c7bc98","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"]},"@opam/ppx_compare@opam:v0.14.0@fbd22977": {"id": "@opam/ppx_compare@opam:v0.14.0@fbd22977","name": "@opam/ppx_compare","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/91/9149b3a0c954fe2cef2b0705d254b9e3#md5:9149b3a0c954fe2cef2b0705d254b9e3","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_compare-v0.14.0.tar.gz#md5:9149b3a0c954fe2cef2b0705d254b9e3"],"opam": {"name": "ppx_compare","version": "v0.14.0","path": "esy.lock/opam/ppx_compare.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_cold@opam:v0.14.0@91b05a20": {"id": "@opam/ppx_cold@opam:v0.14.0@91b05a20","name": "@opam/ppx_cold","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/6a/6a61807cd3b105b8c885bd2076986339#md5:6a61807cd3b105b8c885bd2076986339","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_cold-v0.14.0.tar.gz#md5:6a61807cd3b105b8c885bd2076986339"],"opam": {"name": "ppx_cold","version": "v0.14.0","path": "esy.lock/opam/ppx_cold.v0.14.0"
"@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/ppx_base@opam:v0.14.0@3221121a": {"id": "@opam/ppx_base@opam:v0.14.0@3221121a","name": "@opam/ppx_base","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/b2/b29a24907e60f42e050ad90e5209bb92#md5:b29a24907e60f42e050ad90e5209bb92","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_base-v0.14.0.tar.gz#md5:b29a24907e60f42e050ad90e5209bb92"],"opam": {"name": "ppx_base","version": "v0.14.0","path": "esy.lock/opam/ppx_base.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_js_style@opam:v0.14.1@03f2d62f","@opam/ppx_hash@opam:v0.14.0@455f5f56","@opam/ppx_enumerate@opam:v0.14.0@2be34197","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/ppx_cold@opam:v0.14.0@91b05a20",
"@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_js_style@opam:v0.14.1@03f2d62f","@opam/ppx_hash@opam:v0.14.0@455f5f56","@opam/ppx_enumerate@opam:v0.14.0@2be34197","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/ppx_cold@opam:v0.14.0@91b05a20",
]},"@opam/ppx_assert@opam:v0.14.0@f5d6cf6a": {"id": "@opam/ppx_assert@opam:v0.14.0@f5d6cf6a","name": "@opam/ppx_assert","version": "opam:v0.14.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/53/535b5f241eb7f10da8c044c26afbc186#md5:535b5f241eb7f10da8c044c26afbc186","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_assert-v0.14.0.tar.gz#md5:535b5f241eb7f10da8c044c26afbc186"],"opam": {"name": "ppx_assert","version": "v0.14.0","path": "esy.lock/opam/ppx_assert.v0.14.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/ppx_cold@opam:v0.14.0@91b05a20","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ppxlib@opam:0.25.0@8553d2e8","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/ppx_compare@opam:v0.14.0@fbd22977","@opam/ppx_cold@opam:v0.14.0@91b05a20","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"
"@opam/piaf@github:anmonteiro/piaf:piaf.opam#01601aeda4a415d335f61ac13fb738cdb7b834ea@d41d8cd9": {"id":"@opam/piaf@github:anmonteiro/piaf:piaf.opam#01601aeda4a415d335f61ac13fb738cdb7b834ea@d41d8cd9","name": "@opam/piaf","version":"github:anmonteiro/piaf:piaf.opam#01601aeda4a415d335f61ac13fb738cdb7b834ea",
"@opam/pbkdf@opam:1.2.0@1484a934": {"id": "@opam/pbkdf@opam:1.2.0@1484a934","name": "@opam/pbkdf","version": "opam:1.2.0",
"github:anmonteiro/piaf:piaf.opam#01601aeda4a415d335f61ac13fb738cdb7b834ea"]
"archive:https://opam.ocaml.org/cache/md5/1e/1e0e69de61b2d9d4f9843572ecc6655c#md5:1e0e69de61b2d9d4f9843572ecc6655c","archive:https://github.com/abeaumont/ocaml-pbkdf/archive/1.2.0.tar.gz#md5:1e0e69de61b2d9d4f9843572ecc6655c"],"opam": {"name": "pbkdf","version": "1.2.0","path": "esy.lock/opam/pbkdf.1.2.0"}
"@opam/uri@opam:4.1.0@4aeee2d3", "@opam/ssl@opam:0.5.10@de15d287","@opam/ocaml-syntax-shims@opam:1.0.0@9f361fbb","@opam/magic-mime@opam:1.2.0@6a509c98","@opam/lwt_ssl@opam:1.1.3@653af026", "@opam/lwt@opam:5.4.2@f5e79982","@opam/logs@opam:0.7.0@46a3dffc","@opam/httpaf-lwt-unix@github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde@d41d8cd9","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/h2-lwt-unix@opam:0.8.0@eca8e357","@opam/h2@opam:0.8.0@ceb17f54","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f",
"@opam/mirage-crypto@opam:0.10.6@51aedda0",
"@opam/conf-libssl@opam:2@5d3479e1","@opam/bigstringaf@opam:0.8.0@6a362afb",
"@opam/cstruct@opam:6.1.0@b0cd6e0b",
"@opam/uri@opam:4.1.0@4aeee2d3", "@opam/ssl@opam:0.5.10@de15d287","@opam/ocaml-syntax-shims@opam:1.0.0@9f361fbb","@opam/magic-mime@opam:1.2.0@6a509c98","@opam/lwt_ssl@opam:1.1.3@653af026", "@opam/lwt@opam:5.4.2@f5e79982","@opam/logs@opam:0.7.0@46a3dffc","@opam/httpaf-lwt-unix@github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde@d41d8cd9","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/h2-lwt-unix@opam:0.8.0@eca8e357","@opam/h2@opam:0.8.0@ceb17f54","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","@opam/dune@opam:2.9.3@f57a6d69","@opam/conf-libssl@opam:2@5d3479e1","@opam/bigstringaf@opam:0.8.0@6a362afb"
"@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"
"@opam/optint@opam:0.1.0@4e40be46": {"id": "@opam/optint@opam:0.1.0@4e40be46",
"@opam/path_glob@opam:0.2@7fdbb3d9": {"id": "@opam/path_glob@opam:0.2@7fdbb3d9","name": "@opam/path_glob","version": "opam:0.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/5e/5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07#sha256:5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07","archive:https://gasche.gitlab.io/path_glob/releases/path_glob-0.2.tbz#sha256:5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07"],"opam": {"name": "path_glob","version": "0.2","path": "esy.lock/opam/path_glob.0.2"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/parsexp@opam:v0.14.2@1d15b9d2": {"id": "@opam/parsexp@opam:v0.14.2@1d15b9d2","name": "@opam/parsexp","version": "opam:v0.14.2","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/f6/f6e17e4e08dcdce08a6372485a381dcdb3fda0f71b4506d7be982b87b5a1f230#sha256:f6e17e4e08dcdce08a6372485a381dcdb3fda0f71b4506d7be982b87b5a1f230","archive:https://github.com/janestreet/parsexp/archive/refs/tags/v0.14.2.tar.gz#sha256:f6e17e4e08dcdce08a6372485a381dcdb3fda0f71b4506d7be982b87b5a1f230"],"opam": {"name": "parsexp","version": "v0.14.2","path": "esy.lock/opam/parsexp.v0.14.2"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868"]},"@opam/optint@opam:0.2.0@e98c4cb7": {"id": "@opam/optint@opam:0.2.0@e98c4cb7",
"archive:https://opam.ocaml.org/cache/sha256/27/27847660223c16cc7eaf8fcd9d5589a0b802114330a2529578f8007d3b01185d#sha256:27847660223c16cc7eaf8fcd9d5589a0b802114330a2529578f8007d3b01185d","archive:https://github.com/mirage/optint/releases/download/v0.1.0/optint-v0.1.0.tbz#sha256:27847660223c16cc7eaf8fcd9d5589a0b802114330a2529578f8007d3b01185d"
"archive:https://opam.ocaml.org/cache/sha256/1d/1dcbe0b6b6031f77db33028c87138fdb3bf90f92915e3b6629ddeb30a0d3000b#sha256:1dcbe0b6b6031f77db33028c87138fdb3bf90f92915e3b6629ddeb30a0d3000b","archive:https://github.com/mirage/optint/releases/download/v0.2.0/optint-0.2.0.tbz#sha256:1dcbe0b6b6031f77db33028c87138fdb3bf90f92915e3b6629ddeb30a0d3000b"
"archive:https://opam.ocaml.org/cache/sha256/41/41fb15e43f49a3b1f436115d1358a0c7a61d38fea9a2b56861af859863629ff0#sha256:41fb15e43f49a3b1f436115d1358a0c7a61d38fea9a2b56861af859863629ff0","archive:https://github.com/ocaml/odoc/releases/download/2.0.2/odoc-2.0.2.tbz#sha256:41fb15e43f49a3b1f436115d1358a0c7a61d38fea9a2b56861af859863629ff0"
"archive:https://opam.ocaml.org/cache/sha256/65/65a2523a50ee368164f1f24f75866a6a36cdb0d00039c3006ec824351d4e4967#sha256:65a2523a50ee368164f1f24f75866a6a36cdb0d00039c3006ec824351d4e4967","archive:https://github.com/ocaml/odoc/releases/download/2.1.0/odoc-2.1.0.tbz#sha256:65a2523a50ee368164f1f24f75866a6a36cdb0d00039c3006ec824351d4e4967"
"@opam/ocaml-migrate-parsetree@opam:2.3.0@c1e63238","@opam/logs@opam:0.7.0@46a3dffc", "@opam/fpath@opam:0.7.3@674d8125","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cppo@opam:1.6.8@7e48217d","@opam/cmdliner@opam:1.0.4@93208aac",
"@opam/fpath@opam:0.7.3@674d8125", "@opam/fmt@opam:0.9.0@87213963","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cppo@opam:1.6.8@7e48217d","@opam/cmdliner@opam:1.1.1@03763729",
"@opam/ocaml-migrate-parsetree@opam:2.3.0@c1e63238","@opam/logs@opam:0.7.0@46a3dffc", "@opam/fpath@opam:0.7.3@674d8125","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.0.4@93208aac",
"@opam/fpath@opam:0.7.3@674d8125", "@opam/fmt@opam:0.9.0@87213963","@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.1.1@03763729",
"archive:https://opam.ocaml.org/cache/sha256/7d/7d3a51645416fa78287344fa03af6b78450067a1a61e4790bf1b29779cd10235#sha256:7d3a51645416fa78287344fa03af6b78450067a1a61e4790bf1b29779cd10235","archive:https://github.com/ocaml-ppx/ocamlformat/releases/download/0.20.1/ocamlformat-0.20.1.tbz#sha256:7d3a51645416fa78287344fa03af6b78450067a1a61e4790bf1b29779cd10235"
"archive:https://opam.ocaml.org/cache/sha256/2a/2a1817f6bc581ff0cce9f0aa9687b897b02726e2ab75749ee98d57637057332d#sha256:2a1817f6bc581ff0cce9f0aa9687b897b02726e2ab75749ee98d57637057332d","archive:https://github.com/ocaml-ppx/ocamlformat/releases/download/0.21.0/ocamlformat-0.21.0.tbz#sha256:2a1817f6bc581ff0cce9f0aa9687b897b02726e2ab75749ee98d57637057332d"
"archive:https://opam.ocaml.org/cache/sha256/87/87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78","archive:https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78"
"archive:https://opam.ocaml.org/cache/md5/70/7027e507ed85f290923ad198f3d2cd1c#md5:7027e507ed85f290923ad198f3d2cd1c","archive:https://github.com/ocaml/ocamlbuild/archive/refs/tags/0.14.1.tar.gz#md5:7027e507ed85f290923ad198f3d2cd1c"
"@opam/ocaml-migrate-parsetree@opam:2.3.0@c1e63238": {"id": "@opam/ocaml-migrate-parsetree@opam:2.3.0@c1e63238","name": "@opam/ocaml-migrate-parsetree","version": "opam:2.3.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/10/108126b247f190e04c8afd3d72ced0b63ffdf73c3f801f09be5db0cd7280bf0a#sha256:108126b247f190e04c8afd3d72ced0b63ffdf73c3f801f09be5db0cd7280bf0a","archive:https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v2.3.0/ocaml-migrate-parsetree-2.3.0.tbz#sha256:108126b247f190e04c8afd3d72ced0b63ffdf73c3f801f09be5db0cd7280bf0a"],"opam": {"name": "ocaml-migrate-parsetree","version": "2.3.0","path": "esy.lock/opam/ocaml-migrate-parsetree.2.3.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/ocaml-lsp-server@opam:1.9.1@1397dba9": {"id": "@opam/ocaml-lsp-server@opam:1.9.1@1397dba9",
"@opam/ocaml-lsp-server@opam:1.9.0@671f2077": {"id": "@opam/ocaml-lsp-server@opam:1.9.0@671f2077",
"archive:https://opam.ocaml.org/cache/sha256/cf/cf1cdb257d4ef1ed1a05e951264b11c7dc7d3066bf448111cb17c67be56ddcee#sha256:cf1cdb257d4ef1ed1a05e951264b11c7dc7d3066bf448111cb17c67be56ddcee","archive:https://github.com/ocaml/ocaml-lsp/releases/download/1.9.1/jsonrpc-1.9.1.tbz#sha256:cf1cdb257d4ef1ed1a05e951264b11c7dc7d3066bf448111cb17c67be56ddcee"
"archive:https://opam.ocaml.org/cache/sha256/70/7046491eb9d0417d23d2a0ce39f9bc3bb9b75521453106f723c8e5f18c2584a9#sha256:7046491eb9d0417d23d2a0ce39f9bc3bb9b75521453106f723c8e5f18c2584a9","archive:https://github.com/ocaml/ocaml-lsp/releases/download/1.9.0/jsonrpc-1.9.0.tbz#sha256:7046491eb9d0417d23d2a0ce39f9bc3bb9b75521453106f723c8e5f18c2584a9"
},"@opam/num@opam:1.4@54b259a0": {"id": "@opam/num@opam:1.4@54b259a0","name": "@opam/num","version": "opam:1.4","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/cd/cda2b727e116a0b6a9c03902cc4b2415#md5:cda2b727e116a0b6a9c03902cc4b2415","archive:https://github.com/ocaml/num/archive/v1.4.tar.gz#md5:cda2b727e116a0b6a9c03902cc4b2415"],"opam": {"name": "num","version": "1.4","path": "esy.lock/opam/num.1.4"}},"overrides": [{"opamoverride":"esy.lock/overrides/opam__s__num_opam__c__1.4_opam_override"}],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/ocamlfind@opam:1.8.1@b7dc3072","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]
"archive:https://opam.ocaml.org/cache/md5/8c/8c5d5fbc537296dc525867535fb878ba#md5:8c5d5fbc537296dc525867535fb878ba","archive:https://github.com/mirage/mmap/releases/download/v1.1.0/mmap-v1.1.0.tbz#md5:8c5d5fbc537296dc525867535fb878ba"
"archive:https://opam.ocaml.org/cache/sha256/16/1602a8abc8e232fa94771a52e540e5780b40c2f2762eee6afbd9286502116ddb#sha256:1602a8abc8e232fa94771a52e540e5780b40c2f2762eee6afbd9286502116ddb","archive:https://github.com/mirage/mmap/releases/download/v1.2.0/mmap-1.2.0.tbz#sha256:1602a8abc8e232fa94771a52e540e5780b40c2f2762eee6afbd9286502116ddb"
"@opam/dune@opam:2.9.3@f57a6d69"
"@opam/dune@opam:2.9.3@f57a6d69","@opam/bigarray-compat@opam:1.1.0@84cda9d0"]},"@opam/mirage-no-xen@opam:1@0d45465b": {"id": "@opam/mirage-no-xen@opam:1@0d45465b","name": "@opam/mirage-no-xen","version": "opam:1","source": {"type": "install","source": [ "no-source:" ],"opam": {"name": "mirage-no-xen","version": "1","path": "esy.lock/opam/mirage-no-xen.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]},"@opam/mirage-no-solo5@opam:1@84049e1f": {"id": "@opam/mirage-no-solo5@opam:1@84049e1f","name": "@opam/mirage-no-solo5","version": "opam:1","source": {"type": "install","source": [ "no-source:" ],"opam": {"name": "mirage-no-solo5","version": "1","path": "esy.lock/opam/mirage-no-solo5.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9" ]},"@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b": {"id": "@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","name": "@opam/mirage-crypto-rng","version": "opam:0.10.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/01/01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410","archive:https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410"],"opam": {"name": "mirage-crypto-rng","version": "0.10.6","path": "esy.lock/opam/mirage-crypto-rng.0.10.6"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/mtime@opam:1.2.0@acd670b8","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/lwt@opam:5.5.0@30354e4c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/duration@opam:0.2.0@385467fd","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/mtime@opam:1.2.0@acd670b8","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/lwt@opam:5.5.0@30354e4c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/duration@opam:0.2.0@385467fd","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"
"@opam/mirage-crypto-pk@opam:0.10.6@86e09b65": {"id": "@opam/mirage-crypto-pk@opam:0.10.6@86e09b65","name": "@opam/mirage-crypto-pk","version": "opam:0.10.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/01/01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410","archive:https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410"],"opam": {"name": "mirage-crypto-pk","version": "0.10.6","path": "esy.lock/opam/mirage-crypto-pk.0.10.6"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/zarith@opam:1.12@232cc7f2","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/mirage-no-xen@opam:1@0d45465b","@opam/mirage-no-solo5@opam:1@84049e1f","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/eqaf@opam:0.8@9fcc4833", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@opam/conf-gmp-powm-sec@opam:3@b66b4239","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/zarith@opam:1.12@232cc7f2","@opam/sexplib0@opam:v0.14.0@155c136c","@opam/mirage-no-xen@opam:1@0d45465b","@opam/mirage-no-solo5@opam:1@84049e1f","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/eqaf@opam:0.8@9fcc4833", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b"]},"@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05": {"id": "@opam/mirage-crypto-ec@opam:0.10.6@d3d8fb05","name": "@opam/mirage-crypto-ec","version": "opam:0.10.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/01/01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410","archive:https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410"],"opam": {"name": "mirage-crypto-ec","version": "0.10.6","path": "esy.lock/opam/mirage-crypto-ec.0.10.6"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/eqaf@opam:0.8@9fcc4833","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@opam/conf-pkg-config@opam:1.3@d5a0b3fd","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/mirage-crypto-rng@opam:0.10.6@d6188d6b","@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/eqaf@opam:0.8@9fcc4833","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"]},"@opam/mirage-crypto@opam:0.10.6@51aedda0": {"id": "@opam/mirage-crypto@opam:0.10.6@51aedda0","name": "@opam/mirage-crypto","version": "opam:0.10.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/01/01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410","archive:https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz#sha256:01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410"],"opam": {"name": "mirage-crypto","version": "0.10.6","path": "esy.lock/opam/mirage-crypto.0.10.6"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/eqaf@opam:0.8@9fcc4833","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@opam/conf-pkg-config@opam:1.3@d5a0b3fd","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/eqaf@opam:0.8@9fcc4833","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"]},
"@opam/magic-mime@opam:1.2.0@6a509c98": {"id": "@opam/magic-mime@opam:1.2.0@6a509c98","name": "@opam/magic-mime","version": "opam:1.2.0",
"@opam/macaddr@opam:5.3.0@df76c0df": {"id": "@opam/macaddr@opam:5.3.0@df76c0df","name": "@opam/macaddr","version": "opam:5.3.0",
"archive:https://opam.ocaml.org/cache/sha256/f1/f121b67500f8dd97e2fc9fd5d01c7325e4c84bc5c0237442779fbd6fa20694f5#sha256:f121b67500f8dd97e2fc9fd5d01c7325e4c84bc5c0237442779fbd6fa20694f5","archive:https://github.com/mirage/ocaml-magic-mime/releases/download/v1.2.0/magic-mime-v1.2.0.tbz#sha256:f121b67500f8dd97e2fc9fd5d01c7325e4c84bc5c0237442779fbd6fa20694f5"
"archive:https://opam.ocaml.org/cache/sha256/36/36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755","archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755"
"@opam/lwt_ssl@opam:1.1.3@653af026": {"id": "@opam/lwt_ssl@opam:1.1.3@653af026","name": "@opam/lwt_ssl","version": "opam:1.1.3",
"@opam/lwt_react@opam:1.1.5@9b9c268e": {"id": "@opam/lwt_react@opam:1.1.5@9b9c268e","name": "@opam/lwt_react","version": "opam:1.1.5",
"archive:https://opam.ocaml.org/cache/md5/b1/b18414b2ef71ededa07666dfc467f10a#md5:b18414b2ef71ededa07666dfc467f10a","archive:https://github.com/ocsigen/lwt_ssl/archive/1.1.3.tar.gz#md5:b18414b2ef71ededa07666dfc467f10a"
"archive:https://opam.ocaml.org/cache/md5/94/94272fac89c5bf21a89c102b8a8f35a5#md5:94272fac89c5bf21a89c102b8a8f35a5","archive:https://github.com/ocsigen/lwt/archive/refs/tags/5.5.0.tar.gz#md5:94272fac89c5bf21a89c102b8a8f35a5"
"@opam/ssl@opam:0.5.10@de15d287", "@opam/lwt@opam:5.4.2@f5e79982","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-unix@opam:base@87d0b2eb","@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/react@opam:1.2.2@e0f4480e", "@opam/lwt@opam:5.5.0@30354e4c","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/ssl@opam:0.5.10@de15d287", "@opam/lwt@opam:5.4.2@f5e79982","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-unix@opam:base@87d0b2eb"
"@opam/react@opam:1.2.2@e0f4480e", "@opam/lwt@opam:5.5.0@30354e4c","@opam/dune@opam:2.9.3@f57a6d69"
"@opam/lwt-pipe@opam:0.1@0ce87a36": {"id": "@opam/lwt-pipe@opam:0.1@0ce87a36","name": "@opam/lwt-pipe","version": "opam:0.1",
"@opam/lwt_ppx@opam:2.0.3@125707d0": {"id": "@opam/lwt_ppx@opam:2.0.3@125707d0","name": "@opam/lwt_ppx","version": "opam:2.0.3",
"archive:https://opam.ocaml.org/cache/md5/46/46cfc88c4220d40356f6bea7c535be6e#md5:46cfc88c4220d40356f6bea7c535be6e","archive:https://github.com/c-cube/lwt-pipe/archive/v0.1.tar.gz#md5:46cfc88c4220d40356f6bea7c535be6e"
"archive:https://opam.ocaml.org/cache/md5/94/94272fac89c5bf21a89c102b8a8f35a5#md5:94272fac89c5bf21a89c102b8a8f35a5","archive:https://github.com/ocsigen/lwt/archive/refs/tags/5.5.0.tar.gz#md5:94272fac89c5bf21a89c102b8a8f35a5"
"archive:https://opam.ocaml.org/cache/md5/ba/ba3659a8918d8e7cb0f4ef9a83945f90#md5:ba3659a8918d8e7cb0f4ef9a83945f90","archive:https://github.com/ocsigen/lwt/archive/refs/tags/5.4.2.tar.gz#md5:ba3659a8918d8e7cb0f4ef9a83945f90"
"archive:https://opam.ocaml.org/cache/md5/94/94272fac89c5bf21a89c102b8a8f35a5#md5:94272fac89c5bf21a89c102b8a8f35a5","archive:https://github.com/ocsigen/lwt/archive/refs/tags/5.5.0.tar.gz#md5:94272fac89c5bf21a89c102b8a8f35a5"
"@opam/luv@opam:0.5.10@c638e445": {"id": "@opam/luv@opam:0.5.10@c638e445",
"@opam/luv_unix@opam:0.5.0@34c321cb": {"id": "@opam/luv_unix@opam:0.5.0@34c321cb","name": "@opam/luv_unix","version": "opam:0.5.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/ef/efe61a4b4725d59901984022c02ef698#md5:efe61a4b4725d59901984022c02ef698","archive:https://github.com/aantron/luv/releases/download/0.5.11/luv-0.5.11.tar.gz#md5:efe61a4b4725d59901984022c02ef698"],"opam": {"name": "luv_unix","version": "0.5.0","path": "esy.lock/opam/luv_unix.0.5.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/result@opam:1.5@1c6a6533", "@opam/luv@opam:0.5.11@ad29ad88","@opam/dune@opam:2.9.3@f57a6d69","@opam/ctypes@opam:0.20.1@8c3cb4dc","@opam/base-unix@opam:base@87d0b2eb","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/result@opam:1.5@1c6a6533", "@opam/luv@opam:0.5.11@ad29ad88","@opam/dune@opam:2.9.3@f57a6d69","@opam/ctypes@opam:0.20.1@8c3cb4dc","@opam/base-unix@opam:base@87d0b2eb"]},"@opam/luv@opam:0.5.11@ad29ad88": {"id": "@opam/luv@opam:0.5.11@ad29ad88",
"archive:https://opam.ocaml.org/cache/md5/58/583feee83bd0ff577ca8c59c3408b413#md5:583feee83bd0ff577ca8c59c3408b413","archive:https://github.com/aantron/luv/releases/download/0.5.10/luv-0.5.10.tar.gz#md5:583feee83bd0ff577ca8c59c3408b413"
"archive:https://opam.ocaml.org/cache/md5/ef/efe61a4b4725d59901984022c02ef698#md5:efe61a4b4725d59901984022c02ef698","archive:https://github.com/aantron/luv/releases/download/0.5.11/luv-0.5.11.tar.gz#md5:efe61a4b4725d59901984022c02ef698"
"@opam/lru@opam:0.3.0@f1c1341c": {"id": "@opam/lru@opam:0.3.0@f1c1341c","name": "@opam/lru","version": "opam:0.3.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/ec/ecaa8c9f5f708879140961ce35bcdba4#md5:ecaa8c9f5f708879140961ce35bcdba4","archive:https://github.com/pqwy/lru/releases/download/v0.3.0/lru-v0.3.0.tbz#md5:ecaa8c9f5f708879140961ce35bcdba4"],"opam": {"name": "lru","version": "0.3.0","path": "esy.lock/opam/lru.0.3.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/psq@opam:0.2.0@e2fd474c", "@opam/dune@opam:2.9.3@f57a6d69","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/psq@opam:0.2.0@e2fd474c", "@opam/dune@opam:2.9.3@f57a6d69"]},
"@opam/ocamlbuild@opam:0.14.0@0dee4078","@opam/lwt@opam:5.4.2@f5e79982", "@opam/fmt@opam:0.9.0@87213963","@opam/cmdliner@opam:1.0.4@93208aac",
"@opam/ocamlbuild@opam:0.14.1@ead10f40","@opam/lwt@opam:5.5.0@30354e4c", "@opam/fmt@opam:0.9.0@87213963","@opam/cmdliner@opam:1.1.1@03763729",
"archive:https://opam.ocaml.org/cache/sha256/dd/ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d#sha256:ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d","archive:https://github.com/mirage/ke/releases/download/v0.4/ke-v0.4.tbz#sha256:ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d"
"archive:https://opam.ocaml.org/cache/sha256/61/61217207e2200b04b17759736610ff9208269a647f854cb5ae72cdac0d672305#sha256:61217207e2200b04b17759736610ff9208269a647f854cb5ae72cdac0d672305","archive:https://github.com/mirage/ke/releases/download/v0.6/ke-0.6.tbz#sha256:61217207e2200b04b17759736610ff9208269a647f854cb5ae72cdac0d672305"
"@opam/integers@opam:0.5.1@8fb996f8": {"id": "@opam/integers@opam:0.5.1@8fb996f8","name": "@opam/integers","version": "opam:0.5.1",
"@opam/jst-config@opam:v0.14.1@95aef818": {"id": "@opam/jst-config@opam:v0.14.1@95aef818","name": "@opam/jst-config","version": "opam:v0.14.1",
"archive:https://opam.ocaml.org/cache/md5/24/24d629966763b4956edfb7e64d6c5427#md5:24d629966763b4956edfb7e64d6c5427","archive:https://github.com/ocamllabs/ocaml-integers/archive/0.5.1.tar.gz#md5:24d629966763b4956edfb7e64d6c5427"
"archive:https://opam.ocaml.org/cache/md5/ca/ca0d970356cc99b0a5660058a93ff589#md5:ca0d970356cc99b0a5660058a93ff589","archive:https://github.com/janestreet/jst-config/archive/refs/tags/v0.14.1.tar.gz#md5:ca0d970356cc99b0a5660058a93ff589"
"@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/stdio@opam:v0.14.0@a5affb43","@opam/ppx_assert@opam:v0.14.0@f5d6cf6a","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69", "@opam/base@opam:v0.14.3@b3ddb868","@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/hxd@opam:0.3.1@a1c09d49": {"id": "@opam/hxd@opam:0.3.1@a1c09d49","name": "@opam/hxd","version": "opam:0.3.1",
"@opam/jane-street-headers@opam:v0.14.0@b38e12bf": {"id": "@opam/jane-street-headers@opam:v0.14.0@b38e12bf","name": "@opam/jane-street-headers","version": "opam:v0.14.0",
"archive:https://opam.ocaml.org/cache/sha256/1c/1c226c91e17cd329dec0c287bfd20f36302aa533069ff9c6ced32721f96b29bc#sha256:1c226c91e17cd329dec0c287bfd20f36302aa533069ff9c6ced32721f96b29bc","archive:https://github.com/dinosaure/hxd/releases/download/v0.3.1/hxd-v0.3.1.tbz#sha256:1c226c91e17cd329dec0c287bfd20f36302aa533069ff9c6ced32721f96b29bc"
"archive:https://opam.ocaml.org/cache/md5/e8/e8d253ac44d25c8c66367153a0c77495#md5:e8d253ac44d25c8c66367153a0c77495","archive:https://ocaml.janestreet.com/ocaml-core/v0.14/files/jane-street-headers-v0.14.0.tar.gz#md5:e8d253ac44d25c8c66367153a0c77495"
},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.0.4@93208aac","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.0.4@93208aac"]},"@opam/httpaf-lwt-unix@github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde@d41d8cd9": {"id":"@opam/httpaf-lwt-unix@github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde@d41d8cd9","name": "@opam/httpaf-lwt-unix","version": "github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde","source": {"type": "install","source": [ "github:anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde" ]
"@opam/lwt@opam:5.4.2@f5e79982","@opam/httpaf-lwt@github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde@d41d8cd9","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","@opam/faraday-lwt-unix@opam:0.8.1@e733b134",
"@opam/lwt@opam:5.4.2@f5e79982","@opam/httpaf-lwt@github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde@d41d8cd9","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","@opam/faraday-lwt-unix@opam:0.8.1@e733b134",
"@opam/httpaf-lwt@github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde@d41d8cd9": {"id":"@opam/httpaf-lwt@github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde@d41d8cd9","name": "@opam/httpaf-lwt","version": "github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde",
"@opam/iter@opam:1.4@50f41812": {"id": "@opam/iter@opam:1.4@50f41812","name": "@opam/iter","version": "opam:1.4",
"source": [ "github:anmonteiro/httpaf:httpaf-lwt.opam#0555dde" ]
"source": ["archive:https://opam.ocaml.org/cache/md5/24/24b1ea680cd2f8d3ee664ea21837e58b#md5:24b1ea680cd2f8d3ee664ea21837e58b","archive:https://github.com/c-cube/sequence/archive/v1.4.tar.gz#md5:24b1ea680cd2f8d3ee664ea21837e58b"],"opam": {"name": "iter","version": "1.4","path": "esy.lock/opam/iter.1.4"}
"@opam/lwt@opam:5.4.2@f5e79982","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/result@opam:1.5@1c6a6533","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-bytes@opam:base@19d0c2ff","@opam/base-bigarray@opam:base@b03491b0","@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/lwt@opam:5.4.2@f5e79982","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/dune@opam:2.9.3@f57a6d69"
"@opam/result@opam:1.5@1c6a6533","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-bytes@opam:base@19d0c2ff"
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9": {"id":"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","name": "@opam/httpaf","version": "github:anmonteiro/httpaf:httpaf.opam#0555dde",
"@opam/ipaddr-sexp@opam:5.3.0@3f923dde": {"id": "@opam/ipaddr-sexp@opam:5.3.0@3f923dde","name": "@opam/ipaddr-sexp","version": "opam:5.3.0",
"source": [ "github:anmonteiro/httpaf:httpaf.opam#0555dde" ]
"source": ["archive:https://opam.ocaml.org/cache/sha256/36/36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755","archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755"],"opam": {"name": "ipaddr-sexp","version": "5.3.0","path": "esy.lock/opam/ipaddr-sexp.5.3.0"}
"@opam/result@opam:1.5@1c6a6533","@opam/faraday@opam:0.8.1@3e04a493","@opam/dune@opam:2.9.3@f57a6d69","@opam/bigstringaf@opam:0.8.0@6a362afb","@opam/angstrom@opam:0.15.0@105656d9",
"@opam/sexplib0@opam:v0.14.0@155c136c","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ipaddr@opam:5.3.0@56e263f1", "@opam/dune@opam:2.9.3@f57a6d69",
"@opam/result@opam:1.5@1c6a6533","@opam/faraday@opam:0.8.1@3e04a493","@opam/dune@opam:2.9.3@f57a6d69","@opam/bigstringaf@opam:0.8.0@6a362afb","@opam/angstrom@opam:0.15.0@105656d9"
"@opam/sexplib0@opam:v0.14.0@155c136c","@opam/ppx_sexp_conv@opam:v0.14.3@fd72d57e","@opam/ipaddr@opam:5.3.0@56e263f1", "@opam/dune@opam:2.9.3@f57a6d69"
"@opam/hpack@opam:0.2.0@acd9f903": {"id": "@opam/hpack@opam:0.2.0@acd9f903","name": "@opam/hpack","version": "opam:0.2.0",
"@opam/ipaddr@opam:5.3.0@56e263f1": {"id": "@opam/ipaddr@opam:5.3.0@56e263f1","name": "@opam/ipaddr","version": "opam:5.3.0",
"archive:https://opam.ocaml.org/cache/md5/c8/c883927ce8a9f3f7159ef7b20988f051#md5:c883927ce8a9f3f7159ef7b20988f051","archive:https://github.com/anmonteiro/ocaml-h2/releases/download/0.2.0/h2-0.2.0.tbz#md5:c883927ce8a9f3f7159ef7b20988f051"
"archive:https://opam.ocaml.org/cache/sha256/36/36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755","archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz#sha256:36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755"
"@opam/h2-lwt-unix@opam:0.8.0@eca8e357": {"id": "@opam/h2-lwt-unix@opam:0.8.0@eca8e357","name": "@opam/h2-lwt-unix","version": "opam:0.8.0",
"@opam/integers@opam:0.7.0@a2d78a42": {"id": "@opam/integers@opam:0.7.0@a2d78a42","name": "@opam/integers","version": "opam:0.7.0",
"archive:https://opam.ocaml.org/cache/sha256/c6/c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661","archive:https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661"
"archive:https://opam.ocaml.org/cache/md5/20/201cf24143d7cb9a3921d572b6e6c42c#md5:201cf24143d7cb9a3921d572b6e6c42c","archive:https://github.com/ocamllabs/ocaml-integers/archive/0.7.0.tar.gz#md5:201cf24143d7cb9a3921d572b6e6c42c"
"@opam/h2-lwt@opam:0.8.0@3199e725": {"id": "@opam/h2-lwt@opam:0.8.0@3199e725","name": "@opam/h2-lwt","version": "opam:0.8.0",
"@opam/hxd@opam:0.3.2@e56508b0": {"id": "@opam/hxd@opam:0.3.2@e56508b0","name": "@opam/hxd","version": "opam:0.3.2",
"archive:https://opam.ocaml.org/cache/sha256/c6/c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661","archive:https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661"
"archive:https://opam.ocaml.org/cache/sha256/a0/a00290abb8538e79b32ddc22ed9b301b9806bc4c03eb1e5105b14af47dabec9f#sha256:a00290abb8538e79b32ddc22ed9b301b9806bc4c03eb1e5105b14af47dabec9f","archive:https://github.com/dinosaure/hxd/releases/download/v0.3.2/hxd-0.3.2.tbz#sha256:a00290abb8538e79b32ddc22ed9b301b9806bc4c03eb1e5105b14af47dabec9f"
"@opam/lwt@opam:5.4.2@f5e79982", "@opam/h2@opam:0.8.0@ceb17f54","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/lwt@opam:5.5.0@30354e4c","@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.1.1@03763729","@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/lwt@opam:5.4.2@f5e79982", "@opam/h2@opam:0.8.0@ceb17f54","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/dune@opam:2.9.3@f57a6d69"
"@opam/dune-configurator@opam:2.9.3@174e411b","@opam/dune@opam:2.9.3@f57a6d69","@opam/cmdliner@opam:1.1.1@03763729"
"@opam/h2@opam:0.8.0@ceb17f54": {"id": "@opam/h2@opam:0.8.0@ceb17f54","name": "@opam/h2","version": "opam:0.8.0",
"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#395aad2@d41d8cd9": {"id":"@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#395aad2@d41d8cd9","name": "@opam/httpaf","version": "github:anmonteiro/httpaf:httpaf.opam#395aad2",
"source": ["archive:https://opam.ocaml.org/cache/sha256/c6/c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661","archive:https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz#sha256:c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661"],"opam": {"name": "h2","version": "0.8.0","path": "esy.lock/opam/h2.0.8.0"}
"source": [ "github:anmonteiro/httpaf:httpaf.opam#395aad2" ]
"@opam/psq@opam:0.2.0@e2fd474c","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/hpack@opam:0.2.0@acd9f903",
"@opam/result@opam:1.5@1c6a6533",
"@opam/psq@opam:0.2.0@e2fd474c","@opam/httpaf@github:anmonteiro/httpaf:httpaf.opam#0555dde@d41d8cd9","@opam/hpack@opam:0.2.0@acd9f903",
"@opam/result@opam:1.5@1c6a6533",
"@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f": {"id": "@opam/gluten-lwt-unix@opam:0.2.1@6a8f271f","name": "@opam/gluten-lwt-unix","version": "opam:0.2.1",
"@opam/hkdf@opam:1.0.4@c948bc13": {"id": "@opam/hkdf@opam:1.0.4@c948bc13","name": "@opam/hkdf","version": "opam:1.0.4",
"archive:https://opam.ocaml.org/cache/sha256/86/86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de","archive:https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de"
"archive:https://opam.ocaml.org/cache/sha256/b9/b926d6da4ac45aab999735dd2bbfd1f7511316710d791afa361006b6fe36fd5b#sha256:b926d6da4ac45aab999735dd2bbfd1f7511316710d791afa361006b6fe36fd5b","archive:https://github.com/hannesm/ocaml-hkdf/releases/download/v1.0.4/hkdf-v1.0.4.tbz#sha256:b926d6da4ac45aab999735dd2bbfd1f7511316710d791afa361006b6fe36fd5b"
"@opam/lwt_ssl@opam:1.1.3@653af026", "@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/gluten@opam:0.2.1@fca26440","@opam/faraday-lwt-unix@opam:0.8.1@e733b134","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@esy-ocaml/substs@0.0.1@d41d8cd9"
"@opam/lwt@opam:5.4.2@f5e79982","@opam/gluten-lwt@opam:0.2.1@4dbee72c","@opam/gluten@opam:0.2.1@fca26440","@opam/faraday-lwt-unix@opam:0.8.1@e733b134","@opam/dune@opam:2.9.3@f57a6d69"
"@opam/mirage-crypto@opam:0.10.6@51aedda0","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"
"@opam/gluten-lwt@opam:0.2.1@4dbee72c": {"id": "@opam/gluten-lwt@opam:0.2.1@4dbee72c","name": "@opam/gluten-lwt","version": "opam:0.2.1",
"@opam/gmap@opam:0.3.0@5c009abd": {"id": "@opam/gmap@opam:0.3.0@5c009abd","name": "@opam/gmap","version": "opam:0.3.0",
"archive:https://opam.ocaml.org/cache/sha256/86/86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de","archive:https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de"
"archive:https://opam.ocaml.org/cache/sha256/04/04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c#sha256:04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c","archive:https://github.com/hannesm/gmap/releases/download/0.3.0/gmap-0.3.0.tbz#sha256:04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c"
"source": ["archive:https://opam.ocaml.org/cache/sha256/86/86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de","archive:https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz#sha256:86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de"],"opam": {"name": "gluten","version": "0.2.1","path": "esy.lock/opam/gluten.0.2.1"}
"source": [ "github:anmonteiro/gluten:gluten.opam#7257692" ]
}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/faraday-lwt-unix@opam:0.8.1@e733b134": {"id": "@opam/faraday-lwt-unix@opam:0.8.1@e733b134","name": "@opam/faraday-lwt-unix","version": "opam:0.8.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/51/51b97f082af4679e3b428a03c3b657de#md5:51b97f082af4679e3b428a03c3b657de","archive:https://github.com/inhabitedtype/faraday/archive/0.8.1.tar.gz#md5:51b97f082af4679e3b428a03c3b657de"],"opam": {"name": "faraday-lwt-unix","version": "0.8.1","path": "esy.lock/opam/faraday-lwt-unix.0.8.1"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/faraday-lwt@opam:0.8.1@5a6331d0","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-unix@opam:base@87d0b2eb","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982","@opam/faraday-lwt@opam:0.8.1@5a6331d0","@opam/dune@opam:2.9.3@f57a6d69","@opam/base-unix@opam:base@87d0b2eb"]},"@opam/faraday-lwt@opam:0.8.1@5a6331d0": {"id": "@opam/faraday-lwt@opam:0.8.1@5a6331d0","name": "@opam/faraday-lwt","version": "opam:0.8.1","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/md5/51/51b97f082af4679e3b428a03c3b657de#md5:51b97f082af4679e3b428a03c3b657de","archive:https://github.com/inhabitedtype/faraday/archive/0.8.1.tar.gz#md5:51b97f082af4679e3b428a03c3b657de"],"opam": {"name": "faraday-lwt","version": "0.8.1","path": "esy.lock/opam/faraday-lwt.0.8.1"
"@opam/eio_luv@github:quartz55/eio:eio_luv.opam#3c5d949@d41d8cd9": {"id": "@opam/eio_luv@github:quartz55/eio:eio_luv.opam#3c5d949@d41d8cd9",
"@opam/eio_luv@github:quartz55/eio:eio_luv.opam#2c68f46@d41d8cd9": {"id": "@opam/eio_luv@github:quartz55/eio:eio_luv.opam#2c68f46@d41d8cd9",
"@opam/eio@github:quartz55/eio:eio.opam#3c5d949@d41d8cd9": {"id": "@opam/eio@github:quartz55/eio:eio.opam#3c5d949@d41d8cd9",
"@opam/eio@github:quartz55/eio:eio.opam#2c68f46@d41d8cd9": {"id": "@opam/eio@github:quartz55/eio:eio.opam#2c68f46@d41d8cd9",
"@opam/earlybird@opam:1.1.0@4bff968a": {"id": "@opam/earlybird@opam:1.1.0@4bff968a","name": "@opam/earlybird","version": "opam:1.1.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/aa/aae7257fa73a502ea808eb5c3f3bf9fa0218cedf43342289ca44f03b32839fdf#sha256:aae7257fa73a502ea808eb5c3f3bf9fa0218cedf43342289ca44f03b32839fdf","archive:https://github.com/hackwaly/ocamlearlybird/releases/download/1.1.0/earlybird-1.1.0.tbz#sha256:aae7257fa73a502ea808eb5c3f3bf9fa0218cedf43342289ca44f03b32839fdf"],"opam": {"name": "earlybird","version": "1.1.0","path": "esy.lock/opam/earlybird.1.1.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/path_glob@opam:0.2@7fdbb3d9","@opam/ocaml-compiler-libs@opam:v0.12.4@41979882","@opam/menhirLib@opam:20211128@e86421ad","@opam/menhir@opam:20211128@29de3b7a","@opam/lwt_react@opam:1.1.5@9b9c268e","@opam/lwt_ppx@opam:2.0.3@125707d0", "@opam/lwt@opam:5.5.0@30354e4c","@opam/lru@opam:0.3.0@f1c1341c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/iter@opam:1.4@50f41812", "@opam/fmt@opam:0.9.0@87213963","@opam/dune@opam:2.9.3@f57a6d69", "@opam/dap@opam:1.0.6@216aa631","@opam/csexp@opam:1.5.1@8a8fb3a7","@opam/cmdliner@opam:1.1.1@03763729","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/path_glob@opam:0.2@7fdbb3d9","@opam/ocaml-compiler-libs@opam:v0.12.4@41979882","@opam/menhirLib@opam:20211128@e86421ad","@opam/lwt_react@opam:1.1.5@9b9c268e","@opam/lwt_ppx@opam:2.0.3@125707d0", "@opam/lwt@opam:5.5.0@30354e4c","@opam/lru@opam:0.3.0@f1c1341c", "@opam/logs@opam:0.7.0@46a3dffc","@opam/iter@opam:1.4@50f41812", "@opam/fmt@opam:0.9.0@87213963","@opam/dune@opam:2.9.3@f57a6d69", "@opam/dap@opam:1.0.6@216aa631","@opam/csexp@opam:1.5.1@8a8fb3a7","@opam/cmdliner@opam:1.1.1@03763729"]},"@opam/duration@opam:0.2.0@385467fd": {"id": "@opam/duration@opam:0.2.0@385467fd","name": "@opam/duration","version": "opam:0.2.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/ad/ad14fb75a5a6f73fff7ef1721178925ee555cf0f23b23e3ab329184bc0c1ce69#sha256:ad14fb75a5a6f73fff7ef1721178925ee555cf0f23b23e3ab329184bc0c1ce69","archive:https://github.com/hannesm/duration/releases/download/0.2.0/duration-0.2.0.tbz#sha256:ad14fb75a5a6f73fff7ef1721178925ee555cf0f23b23e3ab329184bc0c1ce69"],"opam": {"name": "duration","version": "0.2.0","path": "esy.lock/opam/duration.0.2.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},
"archive:https://opam.ocaml.org/cache/sha256/14/14a36d6fb8646a5df4530420a7861722f1a4ee04753717947305e3676031e7cd#sha256:14a36d6fb8646a5df4530420a7861722f1a4ee04753717947305e3676031e7cd","archive:https://github.com/ocaml/merlin/releases/download/v4.1/dot-merlin-reader-v4.1.tbz#sha256:14a36d6fb8646a5df4530420a7861722f1a4ee04753717947305e3676031e7cd"
"archive:https://opam.ocaml.org/cache/sha256/31/31587b422b5ebd3eebda730e946868807d829128f8dc7153fb05c0c82742058e#sha256:31587b422b5ebd3eebda730e946868807d829128f8dc7153fb05c0c82742058e","archive:https://github.com/ocaml/merlin/releases/download/v4.5-414/merlin-4.5-414.tbz#sha256:31587b422b5ebd3eebda730e946868807d829128f8dc7153fb05c0c82742058e"
"@opam/digestif@opam:1.1.0@a8d16625": {"id": "@opam/digestif@opam:1.1.0@a8d16625","name": "@opam/digestif","version": "opam:1.1.0",
"@opam/domain-name@opam:0.4.0@ab0ca2e3": {"id": "@opam/domain-name@opam:0.4.0@ab0ca2e3","name": "@opam/domain-name","version": "opam:0.4.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/a5/a5c06e22845895201973e812fe3019274d1db81c0a7873da6c8007c4ad2108c5#sha256:a5c06e22845895201973e812fe3019274d1db81c0a7873da6c8007c4ad2108c5","archive:https://github.com/hannesm/domain-name/releases/download/v0.4.0/domain-name-0.4.0.tbz#sha256:a5c06e22845895201973e812fe3019274d1db81c0a7873da6c8007c4ad2108c5"],"opam": {"name": "domain-name","version": "0.4.0","path": "esy.lock/opam/domain-name.0.4.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/dune@opam:2.9.3@f57a6d69"]},"@opam/dap@opam:1.0.6@216aa631": {"id": "@opam/dap@opam:1.0.6@216aa631","name": "@opam/dap","version": "opam:1.0.6",
"archive:https://opam.ocaml.org/cache/sha256/65/654b195c668f2d1e35b8b06a8932d058fcc8f4d39e70be58eb2432fbf39afc05#sha256:654b195c668f2d1e35b8b06a8932d058fcc8f4d39e70be58eb2432fbf39afc05","archive:https://github.com/mirage/digestif/releases/download/v1.1.0/digestif-v1.1.0.tbz#sha256:654b195c668f2d1e35b8b06a8932d058fcc8f4d39e70be58eb2432fbf39afc05"
"archive:https://opam.ocaml.org/cache/sha256/e0/e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff#sha256:e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff","archive:https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz#sha256:e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff"
"@opam/stdlib-shims@opam:0.3.0@0d088929","@opam/eqaf@opam:0.8@9fcc4833", "@opam/dune@opam:2.9.3@f57a6d69","@opam/conf-pkg-config@opam:1.3@93481236","@opam/bigarray-compat@opam:1.1.0@84cda9d0","@opam/base-bytes@opam:base@19d0c2ff",
"@opam/yojson@opam:1.7.0@69d87312","@opam/react@opam:1.2.2@e0f4480e","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/ppx_expect@opam:v0.14.1@72b3b5e4","@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/lwt_react@opam:1.1.5@9b9c268e","@opam/lwt_ppx@opam:2.0.3@125707d0", "@opam/lwt@opam:5.5.0@30354e4c","@opam/logs@opam:0.7.0@46a3dffc", "@opam/dune@opam:2.9.3@f57a6d69","@opam/angstrom-lwt-unix@opam:0.15.0@c3599c52","@opam/angstrom@opam:0.15.0@105656d9",
"@opam/stdlib-shims@opam:0.3.0@0d088929","@opam/eqaf@opam:0.8@9fcc4833", "@opam/dune@opam:2.9.3@f57a6d69","@opam/bigarray-compat@opam:1.1.0@84cda9d0","@opam/base-bytes@opam:base@19d0c2ff"
"@opam/yojson@opam:1.7.0@69d87312","@opam/react@opam:1.2.2@e0f4480e","@opam/ppx_here@opam:v0.14.0@c05577d4","@opam/ppx_expect@opam:v0.14.1@72b3b5e4","@opam/ppx_deriving_yojson@opam:3.6.1@c454c0f1","@opam/ppx_deriving@opam:5.2.1@089e5dd3","@opam/lwt_react@opam:1.1.5@9b9c268e","@opam/lwt_ppx@opam:2.0.3@125707d0", "@opam/lwt@opam:5.5.0@30354e4c","@opam/logs@opam:0.7.0@46a3dffc", "@opam/dune@opam:2.9.3@f57a6d69","@opam/angstrom-lwt-unix@opam:0.15.0@c3599c52","@opam/angstrom@opam:0.15.0@105656d9"
"@opam/conf-libffi@opam:2.0.0@a3db0b0d","@esy-ocaml/substs@0.0.1@d41d8cd9","@esy-ocaml/libffi@3.2.10@d41d8cd9"
"esy-libffi@3.3.1@d41d8cd9", "@opam/conf-libffi@opam:2.0.0@ef7e9742","@esy-ocaml/substs@0.0.1@d41d8cd9"
"archive:https://opam.ocaml.org/cache/md5/e2/e286bc69e536e581529f01059dd4bbb3#md5:e286bc69e536e581529f01059dd4bbb3","archive:https://github.com/ocamllabs/ocaml-ctypes/archive/0.20.0.tar.gz#md5:e286bc69e536e581529f01059dd4bbb3"
"archive:https://opam.ocaml.org/cache/md5/91/91211baac16cb43134b1d6009b1edf92#md5:91211baac16cb43134b1d6009b1edf92","archive:https://github.com/ocamllabs/ocaml-ctypes/archive/0.20.1.tar.gz#md5:91211baac16cb43134b1d6009b1edf92"
"@opam/integers@opam:0.5.1@8fb996f8","@opam/ctypes-foreign@opam:0.4.0@6d218780",
"@opam/integers@opam:0.7.0@a2d78a42","@opam/ctypes-foreign@opam:0.4.0@62b5f863",
"@opam/ctf@github:quartz55/eio:ctf.opam#3c5d949@d41d8cd9": {"id": "@opam/ctf@github:quartz55/eio:ctf.opam#3c5d949@d41d8cd9","name": "@opam/ctf","version": "github:quartz55/eio:ctf.opam#3c5d949",
"@opam/cstruct-sexp@opam:6.1.0@c7f4312d": {"id": "@opam/cstruct-sexp@opam:6.1.0@c7f4312d","name": "@opam/cstruct-sexp","version": "opam:6.1.0",
"source": [ "github:quartz55/eio:ctf.opam#3c5d949" ]
"source": ["archive:https://opam.ocaml.org/cache/sha256/4f/4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b","archive:https://github.com/mirage/ocaml-cstruct/releases/download/v6.1.0/cstruct-6.1.0.tbz#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b"],"opam": {"name": "cstruct-sexp","version": "6.1.0","path": "esy.lock/opam/cstruct-sexp.6.1.0"}
"@opam/mtime@opam:1.2.0@acd670b8", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.0.1@69eae449",
"ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b",
"@opam/mtime@opam:1.2.0@acd670b8", "@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.0.1@69eae449"
"ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/sexplib@opam:v0.14.0@61ef150a","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"
"archive:https://opam.ocaml.org/cache/sha256/4a/4a67bb8f042753453c59eabf0e47865631253ba694091ce6062aac05d47a9bed#sha256:4a67bb8f042753453c59eabf0e47865631253ba694091ce6062aac05d47a9bed","archive:https://github.com/mirage/ocaml-cstruct/releases/download/v6.0.1/cstruct-v6.0.1.tbz#sha256:4a67bb8f042753453c59eabf0e47865631253ba694091ce6062aac05d47a9bed"
"archive:https://opam.ocaml.org/cache/sha256/4f/4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b","archive:https://github.com/mirage/ocaml-cstruct/releases/download/v6.1.0/cstruct-6.1.0.tbz#sha256:4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b"
"@opam/conf-pkg-config@opam:1.3@93481236": {"id": "@opam/conf-pkg-config@opam:1.3@93481236",
"@opam/conf-texinfo@github:esy-packages/esy-texinfo:package.json#4a05feafbbcc4c57d5d25899fbdab98961b9a69c@d41d8cd9": {"id":"@opam/conf-texinfo@github:esy-packages/esy-texinfo:package.json#4a05feafbbcc4c57d5d25899fbdab98961b9a69c@d41d8cd9","name": "@opam/conf-texinfo","version":"github:esy-packages/esy-texinfo:package.json#4a05feafbbcc4c57d5d25899fbdab98961b9a69c","source": {"type": "install","source": ["github:esy-packages/esy-texinfo:package.json#4a05feafbbcc4c57d5d25899fbdab98961b9a69c"]},"overrides": [],"dependencies": [],"devDependencies": []},"@opam/conf-pkg-config@opam:1.3@d5a0b3fd": {"id": "@opam/conf-pkg-config@opam:1.3@d5a0b3fd",
"@opam/conf-libssl@opam:2@5d3479e1": {"id": "@opam/conf-libssl@opam:2@5d3479e1","name": "@opam/conf-libssl","version": "opam:2","source": {"type": "install","source": [ "no-source:" ],"opam": {"name": "conf-libssl","version": "2","path": "esy.lock/opam/conf-libssl.2"}},"overrides": [{"opamoverride":"esy.lock/overrides/opam__s__conf_libssl_opam__c__2_opam_override"}],"dependencies": ["esy-openssl@archive:https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#sha1:33324ff957edaae8ae575817b456320378da46ff@41b6fb3d","@opam/conf-pkg-config@opam:1.3@93481236","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": []},
"esy-libffi@github:esy-ocaml/libffi#c61127dba57b18713039ab9c1892c9f2563e280c@d41d8cd9","@opam/conf-pkg-config@opam:1.3@93481236",
"esy-libffi@3.3.1@d41d8cd9","@opam/conf-pkg-config@opam:1.3@d5a0b3fd","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": []},"@opam/conf-gmp-powm-sec@opam:3@b66b4239": {"id": "@opam/conf-gmp-powm-sec@opam:3@b66b4239","name": "@opam/conf-gmp-powm-sec","version": "opam:3","source": {"type": "install","source": [ "no-source:" ],"opam": {"name": "conf-gmp-powm-sec","version": "3","path": "esy.lock/opam/conf-gmp-powm-sec.3"}},"overrides": [],"dependencies": ["@opam/conf-gmp@opam:4@c394e8f1", "@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": [ "@opam/conf-gmp@opam:4@c394e8f1" ]},"@opam/conf-gmp@opam:4@c394e8f1": {"id": "@opam/conf-gmp@opam:4@c394e8f1","name": "@opam/conf-gmp","version": "opam:4","source": {"type": "install","source": [ "no-source:" ],"opam": {"name": "conf-gmp","version": "4","path": "esy.lock/opam/conf-gmp.4"}},"overrides": [{"opamoverride":"esy.lock/overrides/opam__s__conf_gmp_opam__c__4_opam_override"}],"dependencies": ["esy-gmp@archive:https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#sha1:0578d48607ec0e272177d175fd1807c30b00fdf2@d3dc108f",
"archive:https://opam.ocaml.org/cache/md5/fe/fe2213d0bc63b1e10a2d0aa66d2fc8d9#md5:fe2213d0bc63b1e10a2d0aa66d2fc8d9","archive:http://erratique.ch/software/cmdliner/releases/cmdliner-1.0.4.tbz#md5:fe2213d0bc63b1e10a2d0aa66d2fc8d9"
"archive:https://opam.ocaml.org/cache/sha512/54/5478ad833da254b5587b3746e3a8493e66e867a081ac0f653a901cc8a7d944f66e4387592215ce25d939be76f281c4785702f54d4a74b1700bc8838a62255c9e#sha512:5478ad833da254b5587b3746e3a8493e66e867a081ac0f653a901cc8a7d944f66e4387592215ce25d939be76f281c4785702f54d4a74b1700bc8838a62255c9e","archive:https://erratique.ch/software/cmdliner/releases/cmdliner-1.1.1.tbz#sha512:5478ad833da254b5587b3746e3a8493e66e867a081ac0f653a901cc8a7d944f66e4387592215ce25d939be76f281c4785702f54d4a74b1700bc8838a62255c9e"
"archive:https://opam.ocaml.org/cache/md5/c3/c3b8164c1ed1eba9977dcd0c5490e61d#md5:c3b8164c1ed1eba9977dcd0c5490e61d","archive:https://github.com/inhabitedtype/bigstringaf/archive/0.8.0.tar.gz#md5:c3b8164c1ed1eba9977dcd0c5490e61d"
"archive:https://opam.ocaml.org/cache/md5/0d/0d8ceddeb7db821fd4e5235a75ae9752#md5:0d8ceddeb7db821fd4e5235a75ae9752","archive:https://github.com/inhabitedtype/bigstringaf/archive/0.9.0.tar.gz#md5:0d8ceddeb7db821fd4e5235a75ae9752"
"@opam/conf-pkg-config@opam:1.3@93481236","@opam/bigarray-compat@opam:1.1.0@84cda9d0",
"@opam/conf-pkg-config@opam:1.3@d5a0b3fd",
},"@opam/asn1-combinators@opam:0.2.6@220d4b1d": {"id": "@opam/asn1-combinators@opam:0.2.6@220d4b1d","name": "@opam/asn1-combinators","version": "opam:0.2.6","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/01/012ade0d8869ef621063752c1cf8ea026f6bc702fed10df9af56688e291b1a91#sha256:012ade0d8869ef621063752c1cf8ea026f6bc702fed10df9af56688e291b1a91","archive:https://github.com/mirleft/ocaml-asn1-combinators/releases/download/v0.2.6/asn1-combinators-v0.2.6.tbz#sha256:012ade0d8869ef621063752c1cf8ea026f6bc702fed10df9af56688e291b1a91"],"opam": {"name": "asn1-combinators","version": "0.2.6","path": "esy.lock/opam/asn1-combinators.0.2.6"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/zarith@opam:1.12@232cc7f2", "@opam/ptime@opam:0.8.6@5df936b0","@opam/dune@opam:2.9.3@f57a6d69","@opam/cstruct@opam:6.1.0@b0cd6e0b","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/zarith@opam:1.12@232cc7f2", "@opam/ptime@opam:0.8.6@5df936b0","@opam/dune@opam:2.9.3@f57a6d69", "@opam/cstruct@opam:6.1.0@b0cd6e0b"]
"@opam/alcotest-lwt@opam:1.5.0@f1f00af0": {"id": "@opam/alcotest-lwt@opam:1.5.0@f1f00af0","name": "@opam/alcotest-lwt","version": "opam:1.5.0","source": {"type": "install","source": ["archive:https://opam.ocaml.org/cache/sha256/54/54281907e02d78995df246dc2e10ed182828294ad2059347a1e3a13354848f6c#sha256:54281907e02d78995df246dc2e10ed182828294ad2059347a1e3a13354848f6c","archive:https://github.com/mirage/alcotest/releases/download/1.5.0/alcotest-js-1.5.0.tbz#sha256:54281907e02d78995df246dc2e10ed182828294ad2059347a1e3a13354848f6c"],"opam": {"name": "alcotest-lwt","version": "1.5.0","path": "esy.lock/opam/alcotest-lwt.1.5.0"}},"overrides": [],"dependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982", "@opam/logs@opam:0.7.0@46a3dffc","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/alcotest@opam:1.5.0@c3a8eb69","@esy-ocaml/substs@0.0.1@d41d8cd9"],"devDependencies": ["ocaml@github:quartz55/ocaml#8899e5d@d41d8cd9","@opam/lwt@opam:5.4.2@f5e79982", "@opam/logs@opam:0.7.0@46a3dffc","@opam/fmt@opam:0.9.0@87213963", "@opam/dune@opam:2.9.3@f57a6d69","@opam/alcotest@opam:1.5.0@c3a8eb69"]},"@opam/alcotest@opam:1.5.0@c3a8eb69": {"id": "@opam/alcotest@opam:1.5.0@c3a8eb69",
"@opam/alcotest@opam:1.5.0@338d9572": {"id": "@opam/alcotest@opam:1.5.0@338d9572",
]},"overrides": [],"dependencies": [],"devDependencies": []},"@esy-ocaml/libffi@3.2.10@d41d8cd9": {"id": "@esy-ocaml/libffi@3.2.10@d41d8cd9","name": "@esy-ocaml/libffi","version": "3.2.10","source": {"type": "install","source": ["archive:https://registry.npmjs.org/@esy-ocaml/libffi/-/libffi-3.2.10.tgz#sha1:72697f135ee228b94294ec32f0d5b0fa313de403"
"@opam/ctypes-foreign@opam:0.4.0@6d218780","@opam/ctypes@opam:0.20.0@4e68beca",
"@opam/ctypes-foreign@opam:0.4.0@62b5f863","@opam/ctypes@opam:0.20.1@8c3cb4dc",
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/ocaml-h2"bug-reports: "https://github.com/anmonteiro/ocaml-h2/issues"dev-repo: "git+https://github.com/anmonteiro/ocaml-h2.git"doc: "https://anmonteiro.github.io/ocaml-h2/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.06"}"faraday-lwt-unix""h2-lwt" {>= version}"dune" {>= "1.7"}"lwt""gluten-lwt-unix" {>= "0.2.1"}]depopts: ["tls""lwt_ssl"]synopsis: "Lwt + UNIX support for h2"description: """h2 is an implementation of the HTTP/2 specification entirely in OCaml.h2-lwt-unix provides an Lwt runtime implementation for h2 that targets UNIXbinaries."""url {src:checksum: []}"sha256=c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661""sha512=b01897990a18ac8da7a88fb9ed8348175cefddf468173d3e28f784cd79ca0395061a3e6504b308eb79cf75035715f9e6e6d571b4fcc5dcd548f79762e495d892""https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz"x-commit-hash: "a696a1ce66f573c23041840322d0e1770d5ebc70"
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/ocaml-h2"bug-reports: "https://github.com/anmonteiro/ocaml-h2/issues"dev-repo: "git+https://github.com/anmonteiro/ocaml-h2.git"doc: "https://anmonteiro.github.io/ocaml-h2/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.06"}"h2" {>= version}"dune" {>= "1.7"}"lwt""gluten-lwt" {>= "0.2.1"}]synopsis: "Lwt support for h2"description: """h2 is an implementation of the HTTP/2 specification entirely in OCaml. h2-lwtprovides an Lwt runtime implementation for h2."""url {src:checksum: []}"sha256=c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661""sha512=b01897990a18ac8da7a88fb9ed8348175cefddf468173d3e28f784cd79ca0395061a3e6504b308eb79cf75035715f9e6e6d571b4fcc5dcd548f79762e495d892""https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz"x-commit-hash: "a696a1ce66f573c23041840322d0e1770d5ebc70"
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/ocaml-h2"bug-reports: "https://github.com/anmonteiro/ocaml-h2/issues"dev-repo: "git+https://github.com/anmonteiro/ocaml-h2.git"doc: "https://anmonteiro.github.io/ocaml-h2/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.06"}"dune" {>= "1.7"}"alcotest" {with-test}"yojson" {with-test}"hex" {with-test}"base64""bigstringaf" {>= "0.5.0"}"angstrom" {>= "0.14.0"}"faraday" {>= "0.5.0"}"psq""hpack""httpaf"]synopsis:"A high-performance, memory-efficient, and scalable HTTP/2 library for OCaml"description: """h2 is an implementation of the HTTP/2 specification entirely in OCaml. Itis based on the concepts in http/af, and therefore uses the Angstrom andFaraday libraries to implement the parsing and serialization layers of theHTTP/2 standard as a state machine that is agnostic to the underlying I/Ospecifics. It also preserves the same API as http/af wherever possible."""url {src:checksum: []}"sha256=c6675a092f8ef9f69d04eb830fe3809557a71910cba6275d0a0482efb71f9661""sha512=b01897990a18ac8da7a88fb9ed8348175cefddf468173d3e28f784cd79ca0395061a3e6504b308eb79cf75035715f9e6e6d571b4fcc5dcd548f79762e495d892""https://github.com/anmonteiro/ocaml-h2/releases/download/0.8.0/h2-0.8.0.tbz"x-commit-hash: "a696a1ce66f573c23041840322d0e1770d5ebc70"
opam-version: "2.0"synopsis: "Lwt-based helpers for Alcotest"description: "Lwt-based helpers for Alcotest"maintainer: ["thomas@gazagnaire.org"]authors: ["Thomas Gazagnaire"]license: "ISC"homepage: "https://github.com/mirage/alcotest"doc: "https://mirage.github.io/alcotest"bug-reports: "https://github.com/mirage/alcotest/issues"depends: ["re" {with-test}"cmdliner" {with-test}"fmt""ocaml" {>= "4.03.0"}"alcotest" {= version}"lwt""logs"]build: [["dune""build""-p"name"-j"jobs"@install""@runtest" {with-test}"@doc" {with-doc}]]dev-repo: "git+https://github.com/mirage/alcotest.git"url {src:checksum: []}"sha256=54281907e02d78995df246dc2e10ed182828294ad2059347a1e3a13354848f6c""sha512=1aea91de40795ec4f6603d510107e4b663c1a94bd223f162ad231316d8595e9e098cabbe28a46bdcb588942f3d103d8377373d533bcc7413ba3868a577469b45""https://github.com/mirage/alcotest/releases/download/1.5.0/alcotest-js-1.5.0.tbz"x-commit-hash: "12889aa7f993ad55434443f1c447a59f18ffc9bf"["dune" "subst"] {dev}"odoc" {with-doc}"dune" {>= "2.8"}
opam-version: "2.0"maintainer: [ "Eyyüb Sari <eyyub.sari@epitech.eu>""Romain Calascibetta <romain.calascibetta@gmail.com>" ]authors: [ "Eyyüb Sari <eyyub.sari@epitech.eu>""Romain Calascibetta <romain.calascibetta@gmail.com>" ]homepage: "https://github.com/mirage/digestif"bug-reports: "https://github.com/mirage/digestif/issues"dev-repo: "git+https://github.com/mirage/digestif.git"doc: "https://mirage.github.io/digestif/"license: "MIT"synopsis: "Hashes implementations (SHA*, RIPEMD160, BLAKE2* and MD5)"description: """Digestif is a toolbox to provide hashes implementations in C and OCaml.It uses the linking trick and user can decide at the end to use the C implementation or the OCaml implementation.We provides implementation of:* MD5* SHA1* SHA224* SHA256* SHA384* SHA512* BLAKE2B* BLAKE2S* RIPEMD160"""build: [[ "dune" "build" "-p" name "-j" jobs ][ "./install/install.ml" ][ "dune" "runtest" "-p" name "-j" jobs ] {with-test}]install: [[ "dune" "install" "-p" name ] {with-test}[ "./test/test_runes.ml" ] {with-test}]depends: ["conf-pkg-config" {build}"eqaf""base-bytes""bigarray-compat""stdlib-shims""fmt" {with-test}"alcotest" {with-test}"bos" {with-test}"astring" {with-test}"fpath" {with-test}"rresult" {with-test}"ocamlfind" {with-test}]depopts: ["ocaml-freestanding"]conflicts: ["mirage-xen" {< "6.0.0"}"ocaml-freestanding" {< "0.6.0"}]url {src:checksum: []}x-commit-hash: "ecee3ed464a62b9f96be1eaf81d5bcdde53d8e6c""sha256=654b195c668f2d1e35b8b06a8932d058fcc8f4d39e70be58eb2432fbf39afc05""sha512=229218b0a66c9e8809ff960b5bcfb4499bcbdc1da70ca6aff7f4676e51f60c5947516f510f2fe68cee380b0a2aab5a2c270d06da055ca0b583948abce2418845""https://github.com/mirage/digestif/releases/download/v1.1.0/digestif-v1.1.0.tbz""ocaml" {>= "4.05.0"}"dune" {>= "2.6.0"}
opam-version: "2.0"maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]license: "BSD-3-clause"homepage: "https://github.com/inhabitedtype/faraday"bug-reports: "https://github.com/inhabitedtype/faraday/issues"dev-repo: "git+https://github.com/inhabitedtype/faraday.git"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["dune" {>= "1.11"}"faraday-lwt""lwt" {>= "2.7.0"}"base-unix"]synopsis: "Lwt_unix support for Faraday"url {}src: "https://github.com/inhabitedtype/faraday/archive/0.8.1.tar.gz"checksum: "md5=51b97f082af4679e3b428a03c3b657de""ocaml" {>= "4.03.0"}["dune" "runtest" "-p" name "-j" jobs] {with-test}["dune" "subst"] {dev}
opam-version: "2.0"maintainer: "Spiros Eliopoulos <spiros@inhabitedtype.com>"authors: [ "Spiros Eliopoulos <spiros@inhabitedtype.com>" ]license: "BSD-3-clause"homepage: "https://github.com/inhabitedtype/faraday"bug-reports: "https://github.com/inhabitedtype/faraday/issues"dev-repo: "git+https://github.com/inhabitedtype/faraday.git"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["dune" {>= "1.11"}"faraday" {>= "0.5.0"}"lwt"]synopsis: "Lwt support for Faraday"url {}src: "https://github.com/inhabitedtype/faraday/archive/0.8.1.tar.gz"checksum: "md5=51b97f082af4679e3b428a03c3b657de""ocaml" {>= "4.03.0"}["dune" "runtest" "-p" name "-j" jobs] {with-test}["dune" "subst"] {dev}
opam-version: "2.0"synopsis: "Map filenames to common MIME types"description: """This library contains a database of MIME types that maps filename extensionsinto MIME types suitable for use in many Internet protocols such as HTTP ore-mail. It is generated from the `mime.types` file found in Unix systems, buthas no dependency on a filesystem since it includes the contents of thedatabase as an ML datastructure.For example, here's how to lookup MIME types in the [utop] REPL:#require "magic-mime";;Magic_mime.lookup "/foo/bar.txt";;- : bytes = "text/plain"Magic_mime.lookup "bar.css";;- : bytes = "text/css""""maintainer: "Anil Madhavapeddy <anil@recoil.org>"authors: ["Anil Madhavapeddy" "Maxence Guesdon"]license: "ISC"homepage: "https://github.com/mirage/ocaml-magic-mime"doc: "https://mirage.github.io/ocaml-magic-mime/"bug-reports: "https://github.com/mirage/ocaml-magic-mime/issues"dev-repo: "git+https://github.com/mirage/ocaml-magic-mime.git"depends: ["ocaml" {>= "4.03.0"}"dune"]build: [["dune" "build" "-p" name "-j" jobs]]url {src:checksum: []}x-commit-hash: "11afeba987ca94cb9a6b1e4e1695f1d54c6e23b2""sha256=f121b67500f8dd97e2fc9fd5d01c7325e4c84bc5c0237442779fbd6fa20694f5""sha512=f55e39b11e145f97eaec6796cb99bdca3ac62130995fc36f82fdd097ab5ed6ff9130c671546b76b7c21777284977c02f6b6f74d5549a367481210342708886da""https://github.com/mirage/ocaml-magic-mime/releases/download/v1.2.0/magic-mime-v1.2.0.tbz"["dune" "subst"] {dev}
opam-version: "2.0"maintainer: "frederic.bour@lakaban.net"authors: ["Frédéric Bour <frederic.bour@lakaban.net>""Jérémie Dimino <jeremie@dimino.org>"]homepage: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree"bug-reports: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/issues"dev-repo: "git+https://github.com/ocaml-ppx/ocaml-migrate-parsetree.git"doc: "https://ocaml-ppx.github.io/ocaml-migrate-parsetree/"tags: [ "syntax" "org:ocamllabs" ]depends: []synopsis: "Convert OCaml parsetrees between different versions"description: """Convert OCaml parsetrees between different versionsThis library converts parsetrees, outcometree and ast mappers betweendifferent OCaml versions. High-level functions help making PPXrewriters independent of a compiler version."""url {src:checksum: []}x-commit-hash: "7ef6ff49bfd7d6d816be61d3acea460af25d7d99""sha256=108126b247f190e04c8afd3d72ced0b63ffdf73c3f801f09be5db0cd7280bf0a""sha512=cccd766d33e2c70015735e050c2b7cdacf9f046e2874b563ef64b77706f56d004aa9b9df7d5cc201e5f3ba6e3267f95f654e1e3de58891b91f9c28a61988a9ee""https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v2.3.0/ocaml-migrate-parsetree-2.3.0.tbz""dune" {>= "2.3"}"cinaps" {with-test & >= "v0.13.0"}]conflicts: ["base-effects""ocaml" {>= "4.02.3" & < "4.15"}build: ["dune" "build" "-p" name "-j" jobs]run-test: ["dune" "runtest" "-p" name "-j" jobs]license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception"
opam-version: "2.0"maintainer: "David Sheets <sheets@alum.mit.edu>"authors: ["The OpenSSL Project"]bug-reports: "https://github.com/ocaml/opam-repository/issues"homepage: "https://www.openssl.org/"license: "Apache-1.0"build: [["pkg-config" "openssl"]{os != "freebsd" & os != "openbsd" & os != "netbsd"} # libssl is provided by base system on BSDs]depends: ["conf-pkg-config" {build}]depexts: [["libssl-dev"] {os-family = "debian"}["openssl-devel"] {os-distribution = "centos"}["openssl-devel"] {os-distribution = "ol"}["openssl-devel"] {os-distribution = "fedora"}["openssl"] {os = "macos" & os-distribution = "homebrew"}["openssl"] {os = "macos" & os-distribution = "macports"}["openssl-dev"] {os-distribution = "alpine"}["openssl"] {os-distribution = "nixos"}["openssl"] {os-distribution = "arch"}["libopenssl-devel"] {os-family = "suse"}]post-messages: ["Make sure libssl/openssl is installed and accessible using pkg-config." {failure}"Set the PKG_CONFIG_PATH environment variable if necessary." {failure}"For example: export PKG_CONFIG_PATH=$(brew --prefix openssl)/lib/pkgconfig" {failure & os-distribution = "homebrew"}"For example: export PKG_CONFIG_PATH=$HOME/.nix-profile/lib/pkgconfig" {failure & os-distribution = "nixos"}"For example: export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig" {failure & os-distribution = "macports"}]synopsis: "Virtual package relying on an OpenSSL library system installation"description:"This package can only install if the OpenSSL library is installed on the system."flags: conf
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/gluten"bug-reports: "https://github.com/anmonteiro/gluten/issues"dev-repo: "git+https://github.com/anmonteiro/gluten.git"doc: "https://anmonteiro.github.io/gluten/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.03.0"}"dune" {>= "1.0"}"faraday-lwt-unix" {>= "0.5.0"}"gluten" {= version}"gluten-lwt" {= version}"lwt"]depopts: ["tls""lwt_ssl"]synopsis: "Lwt + Unix support for gluten"url {src:"https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz"checksum: ["sha256=86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de""sha512=dff8f9af28696d8ff9aa73b99d7ce4e82d0e34928e2688bfd4245b1c76834f6900551a5ac2fdd6cb6faf74dc5c7fc307c6279f78c00679adb2a4f764aef0612f"]}conflicts: [ "tls" {>= "0.15.0"} ]
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/gluten"bug-reports: "https://github.com/anmonteiro/gluten/issues"dev-repo: "git+https://github.com/anmonteiro/gluten.git"doc: "https://anmonteiro.github.io/gluten/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.03.0"}"gluten" {= version}"dune" {>= "1.0"}"lwt"]synopsis: "Lwt-specific runtime for gluten"url {src:"https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz"checksum: ["sha256=86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de""sha512=dff8f9af28696d8ff9aa73b99d7ce4e82d0e34928e2688bfd4245b1c76834f6900551a5ac2fdd6cb6faf74dc5c7fc307c6279f78c00679adb2a4f764aef0612f"]}
opam-version: "2.0"maintainer: "Antonio Monteiro <anmonteiro@gmail.com>"authors: [ "Antonio Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-clause"homepage: "https://github.com/anmonteiro/gluten"bug-reports: "https://github.com/anmonteiro/gluten/issues"dev-repo: "git+https://github.com/anmonteiro/gluten.git"doc: "https://anmonteiro.github.io/gluten/"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.06"}"dune" {>= "1.0"}"bigstringaf" {>= "0.4.0"}"faraday"]synopsis:"A reusable runtime library for network protocols"description: """gluten implements platform specific runtime code for driving network librariesbased on state machines, such as http/af, h2 and websocketaf."""url {src:"https://github.com/anmonteiro/gluten/releases/download/0.2.1/gluten-0.2.1.tbz"checksum: ["sha256=86308b0695eb2b56ea0653cdf6cdd1a7338743e1e722b1a3aa10fd7cd9ad80de""sha512=dff8f9af28696d8ff9aa73b99d7ce4e82d0e34928e2688bfd4245b1c76834f6900551a5ac2fdd6cb6faf74dc5c7fc307c6279f78c00679adb2a4f764aef0612f"]}
opam-version: "2.0"maintainer: "Antonio Nuno Monteiro <anmonteiro@gmail.com>"authors: [ "Pieter Goetschalckx <3.14.e.ter@gmail.com>""Antonio Nuno Monteiro <anmonteiro@gmail.com>" ]license: "BSD-3-Clause"homepage: "https://github.com/anmonteiro/ocaml-h2"bug-reports: "https://github.com/anmonteiro/ocaml-h2/issues"dev-repo: "git+https://github.com/anmonteiro/ocaml-h2.git"doc: "https://anmonteiro.github.io/ocaml-h2/"depends: ["ocaml" {>= "4.04"}"yojson" {with-test}"hex" {with-test}"faraday"]build: [["dune" "build" "-p" name "-j" jobs]]synopsis:"An HPACK (Header Compression for HTTP/2) implementation in OCaml"description: """hpack is an implementation of the HPACK: Header Compression for HTTP/2specification (RFC7541) written in OCaml. It uses Angstrom and Faraday forparsing and serialization, respectively."""url {src:"https://github.com/anmonteiro/ocaml-h2/releases/download/0.2.0/h2-0.2.0.tbz"checksum: "md5=c883927ce8a9f3f7159ef7b20988f051"}"angstrom" {>= "0.2.0"}"dune" {>= "1.7"}
opam-version: "2.0"maintainer: "simon.cruanes.2007@m4x.org"synopsis: "An alternative to `Lwt_stream` with interfaces for producers and consumers and a bounded internal buffer"build: [["dune" "build" "@install" "-p" name "-j" jobs]["dune" "build" "@doc" "-p" name "-j" jobs] {with-doc}["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["dune" {>= "1.1"}"lwt""ocaml" { >= "4.03.0" }"qcheck" {with-test & < "0.14"}"qtest" {with-test}"odoc" {with-doc}]tags: [ "lwt" "pipe" "stream" "blocking" ]homepage: "https://github.com/c-cube/lwt-pipe/"dev-repo: "git+https://github.com/c-cube/lwt-pipe.git"bug-reports: "https://github.com/c-cube/lwt-pipe/issues/"authors: "Simon Cruanes"url {src: "https://github.com/c-cube/lwt-pipe/archive/v0.1.tar.gz"checksum: ["md5=46cfc88c4220d40356f6bea7c535be6e""sha512=ebc04adf58d913aac8caf43d76b2191fa76101c60a48f6c992a396e5bc8b0756d1c6ca0f9038141b77a40185c8cdb03a9de62252b1d23b06e12f201a9dff914b"]}"mdx" {with-test & < "2.0"}
opam-version: "2.0"synopsis: "OpenSSL binding with concurrent I/O"license: "LGPL with OpenSSL linking exception"homepage: "https://github.com/ocsigen/lwt_ssl"doc: "https://github.com/ocsigen/lwt_ssl/blob/master/src/lwt_ssl.mli"bug-reports: "https://github.com/ocsigen/lwt_ssl/issues"authors: ["Jérôme Vouillon""Jérémie Dimino"]maintainer: "Anton Bachin <antonbachin@yahoo.com>"dev-repo: "git+https://github.com/ocsigen/lwt_ssl.git"depends: ["base-unix""dune""lwt" {>= "3.0.0"}"ocaml""ssl" {>= "0.5.0"}]build: [["dune" "build" "-p" name "-j" jobs]]url {src: "https://github.com/ocsigen/lwt_ssl/archive/1.1.3.tar.gz"checksum: "md5=b18414b2ef71ededa07666dfc467f10a"}
opam-version: "2.0"maintainer: "Samuel Mimram <samuel.mimram@ens-lyon.org>"homepage: "https://github.com/savonet/ocaml-ssl"dev-repo: "git+https://github.com/savonet/ocaml-ssl.git"bug-reports: "https://github.com/savonet/ocaml-ssl/issues"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.02.0"}"dune" {>= "2.0.0"}"dune-configurator""base-unix""conf-libssl"]synopsis: "Bindings for OpenSSL"authors: "Samuel Mimram <samuel.mimram@ens-lyon.org>"url {src: "https://github.com/savonet/ocaml-ssl/archive/v0.5.10.tar.gz"checksum: ["md5=afebbdc3130c1addf1da31e3b92c1dcd""sha512=f2d0acc8dcdb0a36c8ad236f60c6e9d7f8f76ea25183017218953dbe3432a19de5b0be8214714add71b88b211ac78318f09429d4df7ecba1e19dc94d4414f0e1"]}]conflicts: ["base-nnp""ocaml-option-nppchecker"]x-ci-accept-failures: ["centos-7" # https://github.com/savonet/ocaml-ssl/pull/73"oraclelinux-7" # https://github.com/savonet/ocaml-ssl/pull/73["dune" "subst"] {dev}
opam-version: "2.0"maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"authors: ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]homepage: "http://ocaml.org"doc: "https://ocaml.github.io/uchar/"dev-repo: "git+https://github.com/ocaml/uchar.git"bug-reports: "https://github.com/ocaml/uchar/issues"tags: [ "text" "character" "unicode" "compatibility" "org:ocaml.org" ]license: "typeof OCaml system"depends: ["ocaml" {>= "3.12.0"}"ocamlbuild" {build}]build: [["ocaml" "pkg/git.ml"]["ocaml""pkg/build.ml""native=%{ocaml:native}%""native-dynlink=%{ocaml:native-dynlink}%"]]synopsis: "Compatibility library for OCaml's Uchar module"description: """The `uchar` package provides a compatibility library for the[`Uchar`][1] module introduced in OCaml 4.03.The `uchar` package is distributed under the license of the OCamlcompiler. See [LICENSE](LICENSE) for details.[1]: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Uchar.html"""url {src:"https://github.com/ocaml/uchar/releases/download/v0.0.2/uchar-0.0.2.tbz"checksum: "md5=c9ba2c738d264c420c642f7bb1cf4a36"}
opam-version: "2.0"maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"authors: ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]homepage: "http://erratique.ch/software/uutf"doc: "http://erratique.ch/software/uutf/doc/Uutf"dev-repo: "git+http://erratique.ch/repos/uutf.git"bug-reports: "https://github.com/dbuenzli/uutf/issues"tags: [ "unicode" "text" "utf-8" "utf-16" "codec" "org:erratique" ]license: "ISC"depends: ["ocaml" {>= "4.01.0"}"ocamlfind" {build}"ocamlbuild" {build}"topkg" {build}"uchar"]depopts: ["cmdliner"]conflicts: ["cmdliner" { < "0.9.6"} ]build: [["ocaml" "pkg/pkg.ml" "build""--pinned" "%{pinned}%""--with-cmdliner" "%{cmdliner:installed}%" ]]synopsis: """Non-blocking streaming Unicode codec for OCaml"""description: """\Uutf is a non-blocking streaming codec to decode and encode the UTF-8,UTF-16, UTF-16LE and UTF-16BE encoding schemes. It can efficientlywork character by character without blocking on IO. Decoders performcharacter position tracking and support newline normalization.Functions are also provided to fold over the characters of UTF encodedOCaml string values and to directly encode characters in OCamlBuffer.t values.Uutf has no dependency and is distributed under the ISC license."""url {archive: "http://erratique.ch/software/uutf/releases/uutf-1.0.2.tbz"checksum: "a7c542405a39630c689a82bd7ef2292c"}
opam-version: "2.0"authors: "David Kaloper Meršinjak"maintainer: "David Kaloper Meršinjak <dk505@cam.ac.uk>"homepage: "https://github.com/mirleft/ocaml-asn1-combinators"doc: "https://mirleft.github.io/ocaml-asn1-combinators/doc"license: "ISC"dev-repo: "git+https://github.com/mirleft/ocaml-asn1-combinators.git"bug-reports: "https://github.com/mirleft/ocaml-asn1-combinators/issues"synopsis: "Embed typed ASN.1 grammars in OCaml"build: [ ["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs ]["dune" "runtest" "-p" name "-j" jobs] {with-test} ]depends: ["ocaml" {>="4.08.0"}"dune" {>= "1.2.0"}"cstruct" {>= "6.0.0"}"zarith""ptime""alcotest" {with-test}]description: """asn1-combinators is a library for expressing ASN.1 in OCaml. Skip the notationpart of ASN.1, and embed the abstract syntax directly in the language. Theseabstract syntax representations can be used for parsing, serialization, orrandom testing.The only ASN.1 encodings currently supported are BER and DER."""url {src:"https://github.com/mirleft/ocaml-asn1-combinators/releases/download/v0.2.6/asn1-combinators-v0.2.6.tbz"checksum: ["sha256=012ade0d8869ef621063752c1cf8ea026f6bc702fed10df9af56688e291b1a91""sha512=4c1b28f1d230395ff1ad3b8e8d03981b10015062ec270f29e2521914eb64c2fa4d5df68363e339e9a1158c3b58aef0e25156f7ec6addd85a580fecadc17edfac"]}x-commit-hash: "1fc666e8b4231846cf65704ffcb09d240981dcb6"
maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"authors: ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]homepage: "http://erratique.ch/software/cmdliner"doc: "http://erratique.ch/software/cmdliner/doc/Cmdliner"dev-repo: "git+http://erratique.ch/repos/cmdliner.git"bug-reports: "https://github.com/dbuenzli/cmdliner/issues"tags: [ "cli" "system" "declarative" "org:erratique" ]license: "ISC"depends:[ "ocaml" {>= "4.03.0"} ]build: [[ make "all" "PREFIX=%{prefix}%" ]]install:[[make "install" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%" ][make "install-doc" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%" ]]synopsis: """Declarative definition of command line interfaces for OCaml"""
synopsis: "Declarative definition of command line interfaces for OCaml"
"""
Home page: http://erratique.ch/software/cmdliner"""maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"authors: "The cmdliner programmers"license: "ISC"tags: ["cli" "system" "declarative" "org:erratique"]homepage: "https://erratique.ch/software/cmdliner"doc: "https://erratique.ch/software/cmdliner/doc"bug-reports: "https://github.com/dbuenzli/cmdliner/issues"depends: ["ocaml" {>= "4.08.0"}]build: [make "all" "PREFIX=%{prefix}%"]install: [[make "install" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%"][make "install-doc" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%"]]dev-repo: "git+https://erratique.ch/repos/cmdliner.git"
archive: "http://erratique.ch/software/cmdliner/releases/cmdliner-1.0.4.tbz"checksum: "fe2213d0bc63b1e10a2d0aa66d2fc8d9"}
src: "https://erratique.ch/software/cmdliner/releases/cmdliner-1.1.1.tbz"checksum:"sha512=5478ad833da254b5587b3746e3a8493e66e867a081ac0f653a901cc8a7d944f66e4387592215ce25d939be76f281c4785702f54d4a74b1700bc8838a62255c9e"}
#include <gmp.h>#ifndef __GMP_H__#error "No GMP header"#endif#if __GNU_MP_VERSION < 5#error "GMP >= 5 is required to support mpz_powm_sec"#endifvoid test(void) {mpz_t base;mpz_t exp;mpz_t mod;mpz_t rop;mpz_init_set_ui(base, 2u);mpz_init_set_ui(exp, 4u);mpz_init_set_ui(mod, 3u);mpz_init(rop);mpz_powm_sec(rop, base, exp, mod);mpz_clear(base);mpz_clear(exp);mpz_clear(mod);mpz_clear(rop);}
opam-version: "2.0"maintainer: "Etienne Millon <etienne@cryptosense.com>"homepage: "http://gmplib.org/"bug-reports: "https://github.com/ocaml/opam-repository/issues"license: "GPL-1.0-or-later"build: [["sh" "-exc" "cc -c $CFLAGS -I/usr/local/include test.c"] {os != "macos"}["sh""-exc""cc -c $CFLAGS -I/opt/homebrew/include -I/opt/local/include -I/usr/local/include test.c"] {os = "macos"}]depends: ["conf-gmp"]synopsis:"Virtual package relying on a GMP lib with constant-time modular exponentiation"description: """This package can only install if the GMP lib is installed on the system andcorresponds to a version that has the mpz_powm_sec function."""authors: "Etienne Millon <etienne@cryptosense.com>"extra-files: ["test.c" "md5=29317f477fa828e18428660ef31064fb"]flags: conf
#include <gmp.h>#ifndef __GMP_H__#error "No GMP header"#endifvoid test(void) {mpz_t n;mpz_init(n);mpz_clear(n);}
opam-version: "2.0"maintainer: "nbraud"homepage: "http://gmplib.org/"bug-reports: "https://github.com/ocaml/opam-repository/issues"license: "GPL-1.0-or-later"build: [["sh" "-exc" "cc -c $CFLAGS -I/usr/local/include test.c"] {os != "macos" & os != "win32"}["sh""-exc""$(ocamlc -config-var c_compiler) -c $CFLAGS -I/usr/local/include test.c"] {os = "win32" & os-distribution = "cygwinports"}["sh""-exc""cc -c $CFLAGS -I/opt/homebrew/include -I/opt/local/include -I/usr/local/include test.c"] {os = "macos"}]depexts: [["libgmp-dev"] {os-family = "debian"}["libgmp-dev"] {os-family = "ubuntu"}["gmp"] {os = "macos" & os-distribution = "homebrew"}["gmp"] {os-distribution = "macports" & os = "macos"}["gmp" "gmp-devel"] {os-distribution = "centos"}["gmp" "gmp-devel"] {os-distribution = "fedora"}["gmp" "gmp-devel"] {os-distribution = "ol"}["gmp"] {os = "openbsd"}["gmp"] {os = "freebsd"}["gmp-dev"] {os-distribution = "alpine"}["gmp-devel"] {os-family = "suse"}["gmp"] {os = "win32" & os-distribution = "cygwinports"}["gmp"] {os-distribution = "nixos"}]synopsis: "Virtual package relying on a GMP lib system installation"description:"This package can only install if the GMP lib is installed on the system."authors: "nbraud"extra-files: ["test.c" "md5=2fd2970c293c36222a6d299ec155823f"]flags: conf
opam-version: "2.0"maintainer: "anil@recoil.org"authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire""Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott""Mindy Preston" "Thomas Leonard" "Anton Kochkov" "Etienne Millon" ]homepage: "https://github.com/mirage/ocaml-cstruct"license: "ISC"dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git"bug-reports: "https://github.com/mirage/ocaml-cstruct/issues"doc: "https://mirage.github.io/ocaml-cstruct/"tags: [ "org:mirage" "org:ocamllabs" ]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["ocaml" {>= "4.08.0"}"dune" {>= "2.0.0"}"sexplib""cstruct" {=version}"alcotest" {with-test}]synopsis: "S-expression serialisers for C-like structures"description: """Cstruct is a library and syntax extension to make it easier to access C-likestructures directly from OCaml. It supports both reading and writing to thesestructures, and they are accessed via the `Bigarray` module.This library provides Sexplib serialisers for the Cstruct.t values."""url {src:"https://github.com/mirage/ocaml-cstruct/releases/download/v6.1.0/cstruct-6.1.0.tbz"checksum: ["sha256=4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b""sha512=24620eb8dd37b7508a6adbad19fe21b44739a1bd641827b4fdd74e642991647fb814cabdf44195199bdb5208cac182580c55dce511bf22ad595d56a140cc0584"]}x-commit-hash: "7cfde7fad479b2c707ece96c35edbcbd89cf752a"
"sha256=4a67bb8f042753453c59eabf0e47865631253ba694091ce6062aac05d47a9bed""sha512=3eeeb6ae0fd3b625cf1d308498f0a1e6951d16566561f3362fdf74e7158d92d8f6c6d9fa968ff15f8c19a1886dce99d0ef17b44dbb37b97cc68c9b088fdc2248"
"sha256=4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b""sha512=24620eb8dd37b7508a6adbad19fe21b44739a1bd641827b4fdd74e642991647fb814cabdf44195199bdb5208cac182580c55dce511bf22ad595d56a140cc0584"
x-commit-hash: "7cfde7fad479b2c707ece96c35edbcbd89cf752a"
opam-version: "2.0"synopsis: "Debug adapter protocol"description: """The Debug Adapter Protocol defines the protocol used between an editor or IDE and a debugger or runtime."""maintainer: "文宇祥 <hackwaly@qq.com>"authors: "文宇祥 <hackwaly@qq.com>"license: "MIT"homepage: "https://github.com/hackwaly/ocaml-dap"bug-reports: "https://github.com/hackwaly/ocaml-dap/issues"dev-repo: "git+https://github.com/hackwaly/ocaml-dap.git"doc: "https://hackwaly.github.io/ocaml-dap/"depends: ["ocaml" {>= "4.08"}"dune" {>= "2.7"}"yojson""ppx_here""ppx_deriving""ppx_deriving_yojson""ppx_expect""lwt""lwt_ppx""lwt_react""react""angstrom""angstrom-lwt-unix""logs"]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]]x-commit-hash: "34cd793c049c7fb7bd7f78f80e1f36291aa60e70"url {src:"https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz"checksum: ["sha256=e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff""sha512=97805a383ad03ba24f1dabe20798c139678f958dfa2aed1664098f444aaeefd56d6dd7ff3650800eaefe5b17e09098427b78500316699e7267eb1fef233d6a99"]}
opam-version: "2.0"maintainer: "Hannes Mehnert <hannes@mehnert.org>"authors: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"homepage: "https://github.com/hannesm/domain-name"doc: "https://hannesm.github.io/domain-name/doc"bug-reports: "https://github.com/hannesm/domain-name/issues"depends: ["ocaml" {>= "4.04.2"}"dune""alcotest" {with-test}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/hannesm/domain-name.git"synopsis: "RFC 1035 Internet domain names"description: """A domain name is a sequence of labels separated by dots, such as `foo.example`.Each label may contain any bytes. The length of each label may not exceed 63charactes. The total length of a domain name is limited to 253 (byterepresentation is 255), but other protocols (such as SMTP) may apply evensmaller limits. A domain name label is case preserving, comparison is done in acase insensitive manner."""url {src:"https://github.com/hannesm/domain-name/releases/download/v0.4.0/domain-name-0.4.0.tbz"checksum: ["sha256=a5c06e22845895201973e812fe3019274d1db81c0a7873da6c8007c4ad2108c5""sha512=f25aedb1ddf6ab8c49b1545cf88f4990114a9e7954d91cabf260e6ce470abd42dd135e8a55084262a77d4c9ee4bff6dc00c71307b23a48d82d50593b910ee173"]}x-commit-hash: "e9833486ee40ef2c49c43dd72976022a627b4a34"
"sha256=14a36d6fb8646a5df4530420a7861722f1a4ee04753717947305e3676031e7cd""sha512=65fd4ab08904c05651a7ef8971802ffaa428daa920765dbcf162e3c56e8047e4c9e4356daa45efccce7c73a586635c8f6cf8118fd3059789de9aff68579bd436"
"sha256=31587b422b5ebd3eebda730e946868807d829128f8dc7153fb05c0c82742058e""sha512=cc2cf2c208091b3ae435a8124617e56f2002b7091532002ab49a1f817d90a5c4f9cf0bc5741dc7f2526e0352c3ca95b42c3b3a17c6cbfb80ad73d42310a25d22"
x-commit-hash: "cc1582373e5baea1d236a63be39493858032a182"
opam-version: "2.0"maintainer: "Hannes Mehnert <hannes@mehnert.org>"authors: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"homepage: "https://github.com/hannesm/duration"doc: "https://hannesm.github.io/duration/doc"bug-reports: "https://github.com/hannesm/duration/issues"depends: ["ocaml" {>= "4.04.2"}"dune" {>= "1.0"}"alcotest" {with-test & >= "0.8.1"}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/hannesm/duration.git"synopsis: "Conversions to various time units"description: """A duration is represented in nanoseconds as an unsigned 64 bit integer. Thishas a range of up to 584 years. Functions provided check the input and raiseon negative or out of bound input."""url {src:"https://github.com/hannesm/duration/releases/download/0.2.0/duration-0.2.0.tbz"checksum: ["sha256=ad14fb75a5a6f73fff7ef1721178925ee555cf0f23b23e3ab329184bc0c1ce69""sha512=6a259ca406739bfc6020c7de767e39c2a7ee06169aa1966d43d426b2a54fc69b81be6465d04b9bd8fbbbbfd9ebe1c82a1cbfbf62100a37eb0f7403f6cf53e3b8"]}x-commit-hash: "ec2b9a36901d1902cc90d202a8987d7e3b3e63df"
opam-version: "2.0"synopsis: "Debug adapter for OCaml 4.11"maintainer: ["hackwaly@qq.com"]authors: ["hackwaly@qq.com"]homepage: "https://github.com/hackwaly/ocamlearlybird"bug-reports: "https://github.com/hackwaly/ocamlearlybird/issues"depends: ["dune" {>= "2.8"}"ocaml" {>= "4.11.0" & < "4.13"}"ppx_deriving" {>= "5.1"}"ppx_deriving_yojson" {>= "3.6.1"}"menhir" {>= "20201216" & build}"menhirLib" {>= "20201216"}"ocaml-compiler-libs" {>= "0.12.3"}"iter" {>= "1.2.1"}"lwt" {>= "5.4.0"}"lwt_ppx" {>= "2.0.1"}"lwt_react" {>= "1.1.3"}"cmdliner" {>= "1.0.4"}"logs" {>= "0.7.0"}"fmt" {>= "0.8.9"}"path_glob" {>= "0.2"}"sexplib" {>= "0.14.0"}"csexp" {>= "1.3.2"}"lru" {>= "0.3.0"}"dap" {>= "1.0.6"}"odoc" {with-doc}]build: [["dune" "subst"] {dev}["dune""build""-p"name"-j"jobs"@install""@runtest" {with-test}"@doc" {with-doc}]]dev-repo: "git+https://github.com/hackwaly/ocamlearlybird.git"x-commit-hash: "5f39f4d2f96aafb896ccd0ce494150f38f929b38"url {src:"https://github.com/hackwaly/ocamlearlybird/releases/download/1.1.0/earlybird-1.1.0.tbz"checksum: ["sha256=aae7257fa73a502ea808eb5c3f3bf9fa0218cedf43342289ca44f03b32839fdf""sha512=c1b3e24a52c8c6a4e757b9aae6b2d39131d65df401d35f7a35e175fc12d3ea964e92b7a28d24df6e5d026fd194460f994ba8cecf81fd41e8134f09a5e31973b1"]}
opam-version: "2.0"maintainer: "Hannes Mehnert <hannes@mehnert.org>"authors: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"homepage: "https://github.com/hannesm/gmap"doc: "https://hannesm.github.io/gmap/doc"bug-reports: "https://github.com/hannesm/gmap/issues"depends: ["ocaml" {>= "4.04.2"}"dune""alcotest" {with-test}"fmt" {with-test}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/hannesm/gmap.git"synopsis: "Heterogenous maps over a GADT"description: """Gmap exposes the functor `Make` which takes a key type (a[GADT](https://en.wikipedia.org/wiki/Generalized_algebraic_data_type) 'a key)and outputs a type-safe Map where each 'a key is associated with a 'a value.This removes the need for additional packing. It uses OCaml's stdlib[Map](http://caml.inria.fr/pub/docs/manual-ocaml/libref/Map.html) datastructure."""url {src:"https://github.com/hannesm/gmap/releases/download/0.3.0/gmap-0.3.0.tbz"checksum: ["sha256=04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c""sha512=71616981f5a15d6b2a47e18702083e52e81f6547076085b1489f676f50b0cc47c7c2c4fa19cb581e2878dc3d4f7133d0c50d8b51a8390be0e6e30318907d81d3"]}
opam-version: "2.0"maintainer: "Hannes Mehnert <hannes@mehnert.org>"authors: "Hannes Mehnert <hannes@mehnert.org>"license: "BSD-2-Clause"homepage: "https://github.com/hannesm/ocaml-hkdf"doc: "https://hannesm.github.io/ocaml-hkdf/doc"bug-reports: "https://github.com/hannesm/ocaml-hkdf/issues"depends: ["ocaml" {>= "4.07.0"}"dune""cstruct" {>= "3.2.0"}"mirage-crypto""alcotest" {with-test}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/hannesm/ocaml-hkdf.git"synopsis: "HMAC-based Extract-and-Expand Key Derivation Function (RFC 5869)"description: """An implementation of [HKDF](https://tools.ietf.org/html/rfc5869) using[nocrypto](https://github.com/mirleft/ocaml-nocrypto)."""url {src:"https://github.com/hannesm/ocaml-hkdf/releases/download/v1.0.4/hkdf-v1.0.4.tbz"checksum: ["sha256=b926d6da4ac45aab999735dd2bbfd1f7511316710d791afa361006b6fe36fd5b""sha512=d08e50857f7761572adc4d382975fde5808898c1d92d9e6e943a496cba8780ffabe1edf67844063b70d9727c0fe10b24391e001a3f65c978a5326ac82199cc88"]}
"sha256=1c226c91e17cd329dec0c287bfd20f36302aa533069ff9c6ced32721f96b29bc""sha512=93ff909eb519f750794684dcb050bdf51d271652dcea5501654e63b6ac17b79a85981f984a2e1a6db963240de594f21dde4dc541ef8e5873b906fa50d4ef803b"
"sha256=a00290abb8538e79b32ddc22ed9b301b9806bc4c03eb1e5105b14af47dabec9f""sha512=1340fc747ef88b679e08e0b63f7b33f9ff6b7c5a03a03a029ba45be4f8837ebe22dc784e4e692074bfcc961b8709af9f586ed9f92bc936ae46bac0724c7b7a23"
x-commit-hash: "9f4460bfe4528fec4700adfb1650e4970fcd44e6"
opam-version: "2.0"maintainer: "anil@recoil.org"authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"]synopsis: "A library for manipulation of IP address representations using sexp"description: """Sexp convertions for ipaddr"""license: "ISC"tags: ["org:mirage" "org:xapi-project"]homepage: "https://github.com/mirage/ocaml-ipaddr"doc: "https://mirage.github.io/ocaml-ipaddr/"bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues"depends: ["ocaml" {>= "4.04.0"}"dune" {>= "1.9.0"}"ipaddr" {= version}"ipaddr-cstruct" {with-test & = version}"ounit" {with-test}"ppx_sexp_conv" {>= "v0.9.0"}"sexplib0"]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git"url {src:"https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz"checksum: ["sha256=36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755""sha512=06b16e319672c8182210296ed005accd9a4e190f99bd019f24232e213be8de6d198f9e8cb40ee00ec226184e1dd4ebd7e589d890b1f88f40f17eaf785dae975c"]}x-commit-hash: "842b88da1b699f8c087e15696f76f6e0f47055c8"
opam-version: "2.0"maintainer: "anil@recoil.org"authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"]synopsis: "A library for manipulation of IP (and MAC) address representations"description: """Features:* Depends only on sexplib (conditionalization under consideration)* oUnit-based tests* IPv4 and IPv6 support* IPv4 and IPv6 CIDR prefix support* IPv4 and IPv6 [CIDR-scoped address](http://tools.ietf.org/html/rfc4291#section-2.3) support* `Ipaddr.V4` and `Ipaddr.V4.Prefix` modules are `Map.OrderedType`* `Ipaddr.V6` and `Ipaddr.V6.Prefix` modules are `Map.OrderedType`* `Ipaddr` and `Ipaddr.Prefix` modules are `Map.OrderedType`* `Ipaddr_unix` in findlib subpackage `ipaddr.unix` provides compatibility with the standard library `Unix` module* `Ipaddr_top` in findlib subpackage `ipaddr.top` provides top-level pretty printers (requires compiler-libs default since OCaml 4.0)* IP address scope classification* IPv4-mapped addresses in IPv6 (::ffff:0:0/96) are an embedding of IPv4* MAC-48 (Ethernet) address support* `Macaddr` is a `Map.OrderedType`* All types have sexplib serializers/deserializers"""license: "ISC"tags: ["org:mirage" "org:xapi-project"]homepage: "https://github.com/mirage/ocaml-ipaddr"doc: "https://mirage.github.io/ocaml-ipaddr/"bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues"depends: ["ocaml" {>= "4.04.0"}"dune" {>= "1.9.0"}"macaddr" {= version}"stdlib-shims""domain-name" {>= "0.3.0"}"ounit" {with-test}"ppx_sexp_conv" {with-test & >= "v0.9.0"}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git"url {src:"https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz"checksum: ["sha256=36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755""sha512=06b16e319672c8182210296ed005accd9a4e190f99bd019f24232e213be8de6d198f9e8cb40ee00ec226184e1dd4ebd7e589d890b1f88f40f17eaf785dae975c"]}x-commit-hash: "842b88da1b699f8c087e15696f76f6e0f47055c8"
opam-version: "2.0"authors: ["Simon Cruanes" "Gabriel Radanne"]maintainer: "simon.cruanes.2007@m4x.org"license: "BSD-2-clause"synopsis: "Simple abstraction over `iter` functions, intended to iterate efficiently on collections while performing some transformations"build: [["dune" "build" "@install" "-p" name "-j" jobs]["dune" "build" "@doc" "-p" name "-j" jobs] {with-doc}["dune" "runtest" "-p" name "-j" jobs] {with-test & arch != "arm32" & arch != "x86_32"}]depends: ["base-bytes""result""ocaml" { >= "4.03.0" }"dune" { >= "1.1" }"dune-configurator""qcheck" {with-test}"qtest" {with-test}"mdx" {with-test & >= "1.3" }"odoc" {with-doc}]tags: [ "iter" "iterator" "iter" "fold" ]homepage: "https://github.com/c-cube/iter/"depopts: ["base-bigarray"]doc: "https://c-cube.github.io/iter/doc/"bug-reports: "https://github.com/c-cube/iter/issues"dev-repo: "git+https://github.com/c-cube/iter.git"url {src: "https://github.com/c-cube/sequence/archive/v1.4.tar.gz"checksum: ["md5=24b1ea680cd2f8d3ee664ea21837e58b""sha512=8bcb6ddaab69aa18a8489a2287313227d59062fd554f70373a10bdbe1d1eabe4b199860223709fe7baa917d0d47aedeed895ed6d610a989ca540e00fe9cd135b"]}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/jane-street-headers"bug-reports: "https://github.com/janestreet/jane-street-headers/issues"dev-repo: "git+https://github.com/janestreet/jane-street-headers.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/jane-street-headers/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"dune" {>= "2.0.0"}]synopsis: "Jane Street C header files"description: "C header files shared between the various Jane Street packages"url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/jane-street-headers-v0.14.0.tar.gz"checksum: "md5=e8d253ac44d25c8c66367153a0c77495"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/jst-config"bug-reports: "https://github.com/janestreet/jst-config/issues"dev-repo: "git+https://github.com/janestreet/jst-config.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/jst-config/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_assert" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"dune-configurator"]synopsis: "Compile-time configuration for Jane Street libraries"description: "Defines compile-time constants used in Jane Street libraries such as Base, Core, andAsync.This package has an unstable interface; it is intended only to share configuration betweendifferent packages from Jane Street. Future updates may not be backward-compatible, and wedo not recommend using this package directly."url {src: "https://github.com/janestreet/jst-config/archive/refs/tags/v0.14.1.tar.gz"checksum: "md5=ca0d970356cc99b0a5660058a93ff589"}
"ocaml" {>= "4.03.0"}"dune" {>= "1.5"}"fmt" {>= "0.8.5"}"bigarray-compat""alcotest" {with-test}"bigstringaf" {with-test}
"ocaml" {>= "4.08.0"}"dune" {>= "2.0"}"fmt" {>= "0.8.7"}"alcotest" {with-test}"bigstringaf" {with-test}"bechamel" {with-test}"bechamel-notty" {with-test}"bechamel-perf" {with-test}"ocplib-json-typed" {with-test}"core_bench" {with-test & >= "v0.15"}"lwt" {with-test}"crowbar" {with-test}"rresult" {with-test}"jsonm" {with-test}"psq" {with-test}"cmdliner" {>= "1.1.0" & with-test}
"sha256=ddf60f66569b77c35c664087beb8934b3e43df1f70bccb6d4d02d70d8cef898d""sha512=3e4b9a30d2eb8af842b7953ba04ba64aadeafad807e098c203234924301e1b020b0fdf5f4f46e688c23058dacf5de86deae2c29e6874f4672cf990564cb9b8d3"
"sha256=61217207e2200b04b17759736610ff9208269a647f854cb5ae72cdac0d672305""sha512=be277780a7a6c9109068b6c8d54fa88c35180802ff86951516a32a6b7c0335fd6584753d1c670e02632b3956c09ae31bfec70e3dd5ea94697e9e032ba3b9248b"
x-commit-hash: "7678aee5921580378f543a11101b2b0118f2cf6c"
opam-version: "2.0"maintainer: "David Kaloper Meršinjak <dk505@cam.ac.uk>"authors: ["David Kaloper Meršinjak <dk505@cam.ac.uk>"]homepage: "https://github.com/pqwy/lru"doc: "https://pqwy.github.io/lru/doc"license: "ISC"dev-repo: "git+https://github.com/pqwy/lru.git"bug-reports: "https://github.com/pqwy/lru/issues"synopsis: "Scalable LRU caches"build: [ [ "dune" "subst" ] {dev}[ "dune" "build" "-p" name "-j" jobs ][ "dune" "runtest" "-p" name ] {with-test} ]depends: ["ocaml" {>="4.03.0"}"dune" {>= "1.7"}"psq" {>="0.2.0"}"qcheck-core" {with-test}"qcheck-alcotest" {with-test}"alcotest" {with-test}]description: """Lru provides weight-bounded finite maps that can remove the least-recently-used(LRU) bindings in order to maintain a weight constraint."""url {src: "https://github.com/pqwy/lru/releases/download/v0.3.0/lru-v0.3.0.tbz"checksum: "md5=ecaa8c9f5f708879140961ce35bcdba4"}
src: "https://github.com/aantron/luv/releases/download/0.5.10/luv-0.5.10.tar.gz"checksum: "md5=583feee83bd0ff577ca8c59c3408b413"
src: "https://github.com/aantron/luv/releases/download/0.5.11/luv-0.5.11.tar.gz"checksum: "md5=efe61a4b4725d59901984022c02ef698"
opam-version: "2.0"synopsis: "Helpers for interfacing Luv and Unix"license: "MIT"homepage: "https://github.com/aantron/luv"doc: "https://aantron.github.io/luv"bug-reports: "https://github.com/aantron/luv/issues"authors: "Anton Bachin <antonbachin@yahoo.com>"maintainer: "Anton Bachin <antonbachin@yahoo.com>"dev-repo: "git+https://github.com/aantron/luv.git"depends: ["base-unix""dune" {>= "2.0.0"}"luv" {>= "0.5.8"} # uv.h."ctypes" {>= "0.14.0"}"ocaml" {>= "4.02.0"}"result"]build: [["dune" "build" "-p" name "-j" jobs]]url {src: "https://github.com/aantron/luv/releases/download/0.5.11/luv-0.5.11.tar.gz"checksum: "md5=efe61a4b4725d59901984022c02ef698"}
"mmap" {>= "1.1.0"} # mmap is needed as long as Lwt supports OCaml < 4.06.0."ocaml" {>= "4.02.0"}
"mmap" {>= "1.1.0" & "os" != "win32"} # mmap is needed as long as Lwt supports OCaml < 4.06.0."ocaml" {>= "4.02.0" & "os" != "win32 " | >= "4.06.0"}
"md5=ba3659a8918d8e7cb0f4ef9a83945f90""sha512=9f46fb2e56dc7bd57a12d5ab4dc68719947a1462f336087a95e991d087bb9b5b8dee2592d0f7d35abc507d9a641dd221c44c949c81d00e26c673a067d94ba3f4"
"md5=94272fac89c5bf21a89c102b8a8f35a5""sha512=8951b94555e930634375816d71815b9d85daad6ffb7dab24864661504d11be26575ab0b237196c54693efa372a9b69cdc1d5068a20a250dc0bbb4a3c03c5fda1"
opam-version: "2.0"synopsis: "PPX syntax for Lwt, providing something similar to async/await from JavaScript"license: "MIT"homepage: "https://github.com/ocsigen/lwt"doc: "https://ocsigen.org/lwt/dev/api/Ppx_lwt"bug-reports: "https://github.com/ocsigen/lwt/issues"authors: ["Gabriel Radanne"]maintainer: ["Anton Bachin <antonbachin@yahoo.com>"]dev-repo: "git+https://github.com/ocsigen/lwt.git"depends: ["dune" {>= "1.8.0"}"lwt""ocaml" {>= "4.02.0"}"ppxlib" {>= "0.16.0"}]build: [["dune" "build" "-p" name "-j" jobs]]url {src: "https://github.com/ocsigen/lwt/archive/refs/tags/5.5.0.tar.gz"checksum: ["md5=94272fac89c5bf21a89c102b8a8f35a5""sha512=8951b94555e930634375816d71815b9d85daad6ffb7dab24864661504d11be26575ab0b237196c54693efa372a9b69cdc1d5068a20a250dc0bbb4a3c03c5fda1"]}
opam-version: "2.0"synopsis: "Helpers for using React with Lwt"license: "MIT"homepage: "https://github.com/ocsigen/lwt"doc: "https://ocsigen.org/lwt/dev/api/Lwt_react"bug-reports: "https://github.com/ocsigen/lwt/issues"authors: ["Jérémie Dimino"]maintainer: ["Anton Bachin <antonbachin@yahoo.com>"]dev-repo: "git+https://github.com/ocsigen/lwt.git"depends: ["dune" {>= "1.8.0"}"lwt" {>= "3.0.0"}"ocaml""react" {>= "1.0.0"}]build: [["dune" "build" "-p" name "-j" jobs]]url {src: "https://github.com/ocsigen/lwt/archive/refs/tags/5.5.0.tar.gz"checksum: ["md5=94272fac89c5bf21a89c102b8a8f35a5""sha512=8951b94555e930634375816d71815b9d85daad6ffb7dab24864661504d11be26575ab0b237196c54693efa372a9b69cdc1d5068a20a250dc0bbb4a3c03c5fda1"]}
opam-version: "2.0"maintainer: "anil@recoil.org"authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"]synopsis: "A library for manipulation of MAC address representations"license: "ISC"tags: ["org:mirage" "org:xapi-project"]homepage: "https://github.com/mirage/ocaml-ipaddr"doc: "https://mirage.github.io/ocaml-ipaddr/"bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues"depends: ["ocaml" {>= "4.04.0"}"dune" {>= "1.9.0"}"ounit" {with-test}"ppx_sexp_conv" {with-test & >= "v0.9.0"}]conflicts: ["ipaddr" {< "3.0.0"}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git"description: """A library for manipulation of MAC address representations.Features:* oUnit-based tests* MAC-48 (Ethernet) address support* `Macaddr` is a `Map.OrderedType`* All types have sexplib serializers/deserializers optionally via the `Macaddr_sexp` library."""url {src:"https://github.com/mirage/ocaml-ipaddr/releases/download/v5.3.0/ipaddr-5.3.0.tbz"checksum: ["sha256=36979edf64b464d44055f3504b97d61e22050e7369d983052c4ecc3d2b1ab755""sha512=06b16e319672c8182210296ed005accd9a4e190f99bd019f24232e213be8de6d198f9e8cb40ee00ec226184e1dd4ebd7e589d890b1f88f40f17eaf785dae975c"]}x-commit-hash: "842b88da1b699f8c087e15696f76f6e0f47055c8"
opam-version: "2.0"synopsis: "Elliptic Curve Cryptography with primitives taken from Fiat"description: """An implementation of key exchange (ECDH) and digital signature (ECDSA/EdDSA)algorithms using code from Fiat (<https://github.com/mit-plv/fiat-crypto>).The curves P224 (SECP224R1), P256 (SECP256R1), P384 (SECP384R1),P521 (SECP521R1), and 25519 (X25519, Ed25519) are implemented by this package."""maintainer: "Hannes Mehnert <hannes@mehnert.org>"authors: ["Hannes Mehnert <hannes@mehnert.org>""Nathan Rebours <nathan.p.rebours@gmail.com>""Clément Pascutto <clement@tarides.com>""Etienne Millon <me@emillon.org>"# and from the fiat-crypto AUTHORS file"Andres Erbsen <andreser@mit.edu>""Google Inc.""Jade Philipoom <jadep@mit.edu> <jade.philipoom@gmail.com>""Massachusetts Institute of Technology""Zoe Paraskevopoulou <zoe.paraskevopoulou@gmail.com>"]license: "MIT"homepage: "https://github.com/mirage/mirage-crypto"doc: "https://mirage.github.io/mirage-crypto/doc"bug-reports: "https://github.com/mirage/mirage-crypto/issues"depends: ["conf-pkg-config" {build}"dune" {>= "2.6"}"ocaml" {>= "4.08.0"}"cstruct" {>= "6.0.0"}"dune-configurator""eqaf" {>= "0.7"}"mirage-crypto" {=version}"mirage-crypto-rng" {=version}"mirage-crypto-pk" {with-test & =version}"hex" {with-test}"alcotest" {with-test}"asn1-combinators" {with-test & >= "0.2.5"}"ppx_deriving_yojson" {with-test}"ppx_deriving" {with-test}"yojson" {with-test & >= "1.6.0"}]depopts: ["ocaml-freestanding"]conflicts: ["mirage-xen" {< "6.0.0"}"ocaml-freestanding" {< "0.4.1"}]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/mirage/mirage-crypto.git"tags: ["org:mirage"]url {src:"https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz"checksum: ["sha256=01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410""sha512=870b7d0d32acde970afcd3fac2cb51131ac74bb20c887d07ddfccd239467a5dc8b700adf463427fa916393c503f106feb733cba5bf4b9d1f8eb57f52b5af9f9c"]}x-commit-hash: "cb946119d60f180e2e5ff1eecfa3ff79c249cd9e"
opam-version: "2.0"homepage: "https://github.com/mirage/mirage-crypto"dev-repo: "git+https://github.com/mirage/mirage-crypto.git"bug-reports: "https://github.com/mirage/mirage-crypto/issues"doc: "https://mirage.github.io/mirage-crypto/doc"authors: ["David Kaloper <dk505@cam.ac.uk>" "Hannes Mehnert <hannes@mehnert.org>" ]maintainer: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"synopsis: "Simple public-key cryptography for the modern age"build: [ ["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs ]["dune" "runtest" "-p" name "-j" jobs] {with-test} ]depends: ["conf-gmp-powm-sec" {build}"ocaml" {>= "4.08.0"}"dune" {>= "2.6"}"ounit2" {with-test}"randomconv" {with-test & >= "0.1.3"}"cstruct" {>="6.00"}"mirage-crypto" {=version}"mirage-crypto-rng" {=version}"sexplib0""zarith" {>= "1.4"}"eqaf" {>= "0.8"}(("mirage-no-solo5" & "mirage-no-xen") | "zarith-freestanding" | "mirage-runtime" {>= "4.0"})]conflicts: ["mirage-xen" {< "6.0.0"}]description: """Mirage-crypto-pk provides public-key cryptography (RSA, DSA, DH)."""url {src:"https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz"checksum: ["sha256=01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410""sha512=870b7d0d32acde970afcd3fac2cb51131ac74bb20c887d07ddfccd239467a5dc8b700adf463427fa916393c503f106feb733cba5bf4b9d1f8eb57f52b5af9f9c"]}x-commit-hash: "cb946119d60f180e2e5ff1eecfa3ff79c249cd9e"
opam-version: "2.0"homepage: "https://github.com/mirage/mirage-crypto"dev-repo: "git+https://github.com/mirage/mirage-crypto.git"bug-reports: "https://github.com/mirage/mirage-crypto/issues"doc: "https://mirage.github.io/mirage-crypto/doc"authors: ["David Kaloper <dk505@cam.ac.uk>" "Hannes Mehnert <hannes@mehnert.org>" ]maintainer: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"synopsis: "A cryptographically secure PRNG"build: [ ["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs ]["dune" "runtest" "-p" name "-j" jobs] {with-test} ]depends: ["ocaml" {>= "4.08.0"}"dune" {>= "2.6"}"dune-configurator" {>= "2.0.0"}"duration""cstruct" {>= "6.0.0"}"logs""mirage-crypto" {=version}"ounit2" {with-test}"randomconv" {with-test & >= "0.1.3"}# lwt sublibrary"mtime" {>= "1.0.0"}"lwt" {>= "4.0.0"}]conflicts: [ "mirage-runtime" {< "3.8.0"} ]description: """Mirage-crypto-rng provides a random number generator interface, andimplementations: Fortuna, HMAC-DRBG, getrandom/getentropy based (in the unixsublibrary)"""url {src:"https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz"checksum: ["sha256=01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410""sha512=870b7d0d32acde970afcd3fac2cb51131ac74bb20c887d07ddfccd239467a5dc8b700adf463427fa916393c503f106feb733cba5bf4b9d1f8eb57f52b5af9f9c"]}x-commit-hash: "cb946119d60f180e2e5ff1eecfa3ff79c249cd9e"
opam-version: "2.0"homepage: "https://github.com/mirage/mirage-crypto"dev-repo: "git+https://github.com/mirage/mirage-crypto.git"bug-reports: "https://github.com/mirage/mirage-crypto/issues"doc: "https://mirage.github.io/mirage-crypto/doc"authors: ["David Kaloper <dk505@cam.ac.uk>" "Hannes Mehnert <hannes@mehnert.org>" ]maintainer: "Hannes Mehnert <hannes@mehnert.org>"license: "ISC"synopsis: "Simple symmetric cryptography for the modern age"build: [ ["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs ]["dune" "runtest" "-p" name "-j" jobs] {with-test} ]depends: ["conf-pkg-config" {build}"ocaml" {>= "4.08.0"}"dune" {>= "2.6"}"dune-configurator" {>= "2.0.0"}"ounit2" {with-test}"cstruct" {>="6.0.0"}"eqaf" {>= "0.8"}]depopts: ["ocaml-freestanding"]conflicts: ["mirage-xen" {< "6.0.0"}"ocaml-freestanding" {< "0.6.0"}]description: """Mirage-crypto provides symmetric ciphers (DES, AES, RC4, ChaCha20/Poly1305), andhashes (MD5, SHA-1, SHA-2)."""url {src:"https://github.com/mirage/mirage-crypto/releases/download/v0.10.6/mirage-crypto-0.10.6.tbz"checksum: ["sha256=01d6477a4edcad007b56983955d327f0e61c3f36494822f3755017d26e8f9410""sha512=870b7d0d32acde970afcd3fac2cb51131ac74bb20c887d07ddfccd239467a5dc8b700adf463427fa916393c503f106feb733cba5bf4b9d1f8eb57f52b5af9f9c"]}x-commit-hash: "cb946119d60f180e2e5ff1eecfa3ff79c249cd9e"
opam-version: "2.0"maintainer: "mirageos-devel@lists.xenproject.org"authors: ["mirageos-devel@lists.xenproject.org"]homepage: "https://mirage.io"license: "BSD-2-Clause"conflicts: [ "mirage-solo5" ]synopsis: "Virtual package conflicting with mirage-solo5"depends: ["ocaml"]
opam-version: "2.0"maintainer: "mirageos-devel@lists.xenproject.org"authors: ["mirageos-devel@lists.xenproject.org"]homepage: "https://mirage.io"license: "BSD-2-Clause"conflicts: [ "mirage-xen" ]synopsis: "Virtual package conflicting with mirage-xen"depends: ["ocaml"]
"https://github.com/mirage/mmap/releases/download/v1.1.0/mmap-v1.1.0.tbz"checksum: "md5=8c5d5fbc537296dc525867535fb878ba"
"https://github.com/mirage/mmap/releases/download/v1.2.0/mmap-1.2.0.tbz"checksum: ["sha256=1602a8abc8e232fa94771a52e540e5780b40c2f2762eee6afbd9286502116ddb""sha512=474a70b0de57bb31f56fe3a9e410dcc482d3c0abd791809cf103273a7ce347d6d23912920f66d60e95d1113c3ec023f2903bc0f71150a1a9eb49c24928bf7bb2"]
x-commit-hash: "b5efb79871d290072a17f755566c8288cf069e4f"
opam-version: "2.0"synopsis:"The legacy Num library for arbitrary-precision integer and rational arithmetic"maintainer: "Xavier Leroy <xavier.leroy@inria.fr>"authors: ["Valérie Ménissier-Morain" "Pierre Weis" "Xavier Leroy"]license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception"homepage: "https://github.com/ocaml/num/"bug-reports: "https://github.com/ocaml/num/issues"depends: ["ocaml" {>= "4.06.0"}"ocamlfind" {build & >= "1.7.3"}]conflicts: ["base-num"]build: makeinstall: [["ocamlfind" "remove" "num"]["ocamlfind" "remove" "num-top"][make"install" {!ocaml:preinstalled}"findlib-install" {ocaml:preinstalled}]]dev-repo: "git+https://github.com/ocaml/num.git"url {src: "https://github.com/ocaml/num/archive/v1.4.tar.gz"checksum: ["md5=cda2b727e116a0b6a9c03902cc4b2415""sha512=0cc9be8ad95704bb683b4bf6698bada1ee9a40dc05924b72adc7b969685c33eeb68ccf174cc09f6a228c48c18fe94af06f28bebc086a24973a066da620db8e6f"]}
"sha256=cf1cdb257d4ef1ed1a05e951264b11c7dc7d3066bf448111cb17c67be56ddcee""sha512=1f073db86a8d44e5a4501f0d5c233f07f2dd4e8dd6abb918ef50846031af63e4ab9b408fffd9b32d1a7e9e5c7343c9b6ce97b07effed8359f7b610818f78e967"
"sha256=7046491eb9d0417d23d2a0ce39f9bc3bb9b75521453106f723c8e5f18c2584a9""sha512=591fcf1fd2308b56ca2b5f60383d9a24e59aea49bf0dfe4f3b3e1d3a44f0537be07c650523e7f229122c7914fca78bccaafd01c5f79793e38617959f1bcfc7e1"
license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception"doc: "https://github.com/ocaml/ocamlbuild/blob/master/manual/manual.adoc"dev-repo: "git+https://github.com/ocaml/ocamlbuild.git"
depends: ["ocaml" {>= "4.03"}]conflicts: ["base-ocamlbuild""ocamlfind" {< "1.6.2"}]
src: "https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz"checksum: "sha256=87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78"}
src: "https://github.com/ocaml/ocamlbuild/archive/refs/tags/0.14.1.tar.gz"checksum: ["md5=7027e507ed85f290923ad198f3d2cd1c""sha512=1f5b43215b1d3dc427b9c64e005add9d423ed4bca9686d52c55912df8955647cb2d7d86622d44b41b14c4f0d657b770c27967c541c868eeb7c78e3bd35b827ad"]}
"sha256=7d3a51645416fa78287344fa03af6b78450067a1a61e4790bf1b29779cd10235""sha512=8cc8bc9ebf822b18cf54f2f5b0b61c7bf775a1de9b984f57448dcee391627a08d43e7b15a2cfbd287f5ae16b3b9dd18c42086b59ccfbe3174184418652c4f668"
"sha256=2a1817f6bc581ff0cce9f0aa9687b897b02726e2ab75749ee98d57637057332d""sha512=db47f843bfc5a438d43f7c482cde86bd13f05a6825e2a0afa80614b651a88ae8b3805cca45da6bcf9189e741e0c79d38652b0bc47efe636c1502a66676dcb28e"
x-commit-hash: "74668925ca977e252acb084bd139b3077cf95b58" # OCamlFormat is distributed under the MIT license. Parts of the OCaml library are vendored for OCamlFormat and distributed under their original LGPL 2.1 license
x-commit-hash: "63e478f1186a03c7e4dfeeb39b3d8fe2ef1cb429" # OCamlFormat is distributed under the MIT license. Parts of the OCaml library are vendored for OCamlFormat and distributed under their original LGPL 2.1 license
"sha256=41fb15e43f49a3b1f436115d1358a0c7a61d38fea9a2b56861af859863629ff0""sha512=4762ee06d0a58fe22b44f6a0c0dda4890f919e6eaa0bd07706a425c00bd39f4a74e0222f2bd5810e3ea9347596ac6a7e835932a440362c82a22c0e1eb61f2a58"
"sha256=65a2523a50ee368164f1f24f75866a6a36cdb0d00039c3006ec824351d4e4967""sha512=cf4d7e884b94a9b9c4bcb62d4423d7289d7bbbf2642c5eacf9577b76eb835cf6ecc79d2384d36d174d2e9d8f758b5082c0c4bf8f66b5c6db4e9805dc3fc9ee1a"
"sha256=27847660223c16cc7eaf8fcd9d5589a0b802114330a2529578f8007d3b01185d""sha512=6ec2f6977b2cb148b0b9c2664e8a8525b0d0b987652f5a4c9754d200d8026de8bfab664d31807e68b5f1dffa8bbe5b51167435e6e66faf5baefb509c667e0c77"
"sha256=1dcbe0b6b6031f77db33028c87138fdb3bf90f92915e3b6629ddeb30a0d3000b""sha512=7d4b63c82b1dc1e363a892895c1a612bac3dcd33c27e2c27e8ea2e8868d659413226c7a0d7bdcac423f7fb016069d0de90c3eaa68986da6aea69e1f1ca583f18"
x-commit-hash: "4b71b6b2afbd8374a08121466f7ff41e4680d38c"
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/parsexp"bug-reports: "https://github.com/janestreet/parsexp/issues"dev-repo: "git+https://github.com/janestreet/parsexp.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/parsexp/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}]synopsis: "S-expression parsing library"description: "This library provides generic parsers for parsing S-expressions fromstrings or other medium.The library is focused on performances but still provide full genericparsers that can be used with strings, bigstrings, lexing buffers,character streams or any other sources effortlessly.It provides three different class of parsers:- the normal parsers, producing [Sexp.t] or [Sexp.t list] values- the parsers with positions, building compact position sequences sothat one can recover original positions in order to report properlylocated errors at little cost- the Concrete Syntax Tree parsers, produce values of type[Parsexp.Cst.t] which record the concrete layout of the s-expressionsyntax, including commentsThis library is portable and doesn't provide IO functions. To reads-expressions from files or other external sources, you should useparsexp_io."url {src: "https://github.com/janestreet/parsexp/archive/refs/tags/v0.14.2.tar.gz"checksum: "sha256=f6e17e4e08dcdce08a6372485a381dcdb3fda0f71b4506d7be982b87b5a1f230"}
opam-version: "2.0"synopsis: "Globbing file paths"description: """An implementation of 'glob' patterns for file paths,extracted from ocamlbuild."""homepage: "https://gitlab.com/gasche/path_glob"bug-reports: "https://gitlab.com/gasche/path_glob/-/issues"doc: "https://gasche.gitlab.io/path_glob/doc/path_glob"dev-repo: "git+https://gitlab.com/gasche/path_glob.git"maintainer: ["Gabriel Scherer <gabriel.scherer@gmail.com>"]authors: ["Berke Durak"]license: "LGPL-2.0-only WITH OCaml-LGPL-linking-exception"depends: ["ocaml" {>= "4.03"}"dune" {>= "2.7"}"odoc" {with-doc}]build: [["dune" "subst"] {dev}["dune""build""-p"name"-j"jobs"@install""@runtest" {with-test}"@doc" {with-doc}]]x-commit-hash: "2cc5714fbe0439af7ba36eeff8b6d1acd437474b"url {src: "https://gasche.gitlab.io/path_glob/releases/path_glob-0.2.tbz"checksum: ["sha256=5e09a2148876b68ac8fb315679ba69b1e207ced55d91a3ea5b3046f917102a07""sha512=f55775c694e4b66acdfc9210cccc4af505ecbce3101b638495623d7f18a169e4c904e1b86c1c13ec3af9ae765acd6eedfa6cb7059a0c8a4a1aff375b7e9114ab"]}
opam-version: "2.0"synopsis: "Password based key derivation functions (PBKDF) from PKCS#5"description: """An implementation of PBKDF 1 and 2 as defined by [PKCS#5](https://tools.ietf.org/html/rfc2898) using[mirage-crypto](https://github.com/mirage/mirage-crypto)"""maintainer: ["Alfredo Beaumont <alfredo.beaumont@gmail.com>"]authors: ["Alfredo Beaumont <alfredo.beaumont@gmail.com>" "Sonia Meruelo <smeruelo@gmail.com>"]license: "BSD-2-Clause"homepage: "https://github.com/abeaumont/ocaml-pbkdf"bug-reports: "https://github.com/abeaumont/ocaml-pbkdf/issues"dev-repo: "git+https://github.com/abeaumont/ocaml-pbkdf.git"doc: "https://abeaumont.github.io/ocaml-pbkdf/"depends: ["ocaml" {>= "4.07.0"}"dune" {>= "1.8.0"}"cstruct" {>= "6.0.0"}"mirage-crypto""alcotest" {with-test & >= "0.8.1"}]build: [[ "dune" "subst" ] {dev}[ "dune" "build" "-j" jobs "-p" name "@install" ][ "dune" "runtest" "-p" name "-j" jobs ] {with-test}]url {src: "https://github.com/abeaumont/ocaml-pbkdf/archive/1.2.0.tar.gz"checksum: ["md5=1e0e69de61b2d9d4f9843572ecc6655c""sha512=d6f7d5efd761b87dd420ddcf97c2f9d4402dcc81d65cd1f4d81039b70c4d8c1e803bbaf4251482de8de7076da9f40b48c7eb1684e31e7a316deb5036c192bd3c"]}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_assert"bug-reports: "https://github.com/janestreet/ppx_assert/issues"dev-repo: "git+https://github.com/janestreet/ppx_assert.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_assert/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_cold" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_here" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Assert-like extension nodes that raise useful errors on failure"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_assert-v0.14.0.tar.gz"checksum: "md5=535b5f241eb7f10da8c044c26afbc186"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_base"bug-reports: "https://github.com/janestreet/ppx_base/issues"dev-repo: "git+https://github.com/janestreet/ppx_base.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_base/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"ppx_cold" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_enumerate" {>= "v0.14" & < "v0.15"}"ppx_hash" {>= "v0.14" & < "v0.15"}"ppx_js_style" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Base set of ppx rewriters"description: "ppx_base is the set of ppx rewriters used for Base.Note that Base doesn't need ppx to build, it is only used as averification tool."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_base-v0.14.0.tar.gz"checksum: "md5=b29a24907e60f42e050ad90e5209bb92"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_cold"bug-reports: "https://github.com/janestreet/ppx_cold/issues"dev-repo: "git+https://github.com/janestreet/ppx_cold.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_cold/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Expands [@cold] into [@inline never][@specialise never][@local never]"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_cold-v0.14.0.tar.gz"checksum: "md5=6a61807cd3b105b8c885bd2076986339"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_compare"bug-reports: "https://github.com/janestreet/ppx_compare/issues"dev-repo: "git+https://github.com/janestreet/ppx_compare.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_compare/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Generation of comparison functions from types"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_compare-v0.14.0.tar.gz"checksum: "md5=9149b3a0c954fe2cef2b0705d254b9e3"}
opam-version: "2.0"maintainer: "anil@recoil.org"authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire""Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott""Mindy Preston" "Thomas Leonard" "Etienne Millon" ]homepage: "https://github.com/mirage/ocaml-cstruct"license: "ISC"dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git"bug-reports: "https://github.com/mirage/ocaml-cstruct/issues"doc: "https://mirage.github.io/ocaml-cstruct/"tags: [ "org:mirage" "org:ocamllabs" ]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["ocaml" {>= "4.08.0"}"dune" {>= "2.0.0"}"cstruct" {=version}"ounit" {with-test}"ppxlib" {>= "0.16.0"}"ppx_sexp_conv" {with-test}"sexplib" {>="v0.9.0"}"cstruct-sexp" {with-test}"cppo" {with-test}"cstruct-unix" {with-test & =version}"stdlib-shims""ocaml-migrate-parsetree" {>= "2.1.0" & with-test}"lwt_ppx" {>= "2.0.2" & with-test}]synopsis: "Access C-like structures directly from OCaml"description: """Cstruct is a library and syntax extension to make it easier to access C-likestructures directly from OCaml. It supports both reading and writing to thesestructures, and they are accessed via the `Bigarray` module."""url {src:"https://github.com/mirage/ocaml-cstruct/releases/download/v6.1.0/cstruct-6.1.0.tbz"checksum: ["sha256=4f0d2d7d6b7048c99e5d9d62e62ed3fe957bdede56b385567962075c969f1d8b""sha512=24620eb8dd37b7508a6adbad19fe21b44739a1bd641827b4fdd74e642991647fb814cabdf44195199bdb5208cac182580c55dce511bf22ad595d56a140cc0584"]}x-commit-hash: "7cfde7fad479b2c707ece96c35edbcbd89cf752a"
opam-version: "2.0"maintainer: "whitequark <whitequark@whitequark.org>"authors: [ "whitequark <whitequark@whitequark.org>" ]license: "MIT"homepage: "https://github.com/ocaml-ppx/ppx_deriving_yojson"bug-reports: "https://github.com/ocaml-ppx/ppx_deriving_yojson/issues"dev-repo: "git+https://github.com/ocaml-ppx/ppx_deriving_yojson.git"tags: [ "syntax" "json" ]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["ocaml" {>= "4.05.0"}"dune" {>= "1.0"}"yojson" {>= "1.6.0" & < "2.0.0"}"result""ppx_deriving" {>= "5.1"}"ppxlib" {>= "0.14.0" & < "0.26.0"}"ounit" {with-test & >= "2.0.0"}]synopsis:"JSON codec generator for OCaml"description: """ppx_deriving_yojson is a ppx_deriving plugin that providesa JSON codec generator."""url {src:"https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.6.1/ppx_deriving_yojson-v3.6.1.tbz"checksum: ["sha256=712ee9207c70dd144e72cd689bee2d2beb120b804e77c74ec6f7b843a88944e6""sha512=d8c828902b8441f73e08fc03e2173ce81a09cccfe091471fbcffe098b2272739b98a05e8308016da3efeb3d4d1abd7d941bfaac42c85961ea40915ddce526577"]}x-commit-hash: "d0abe462de8bab52d763eeafd751e8ea1ba211ac"
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_enumerate"bug-reports: "https://github.com/janestreet/ppx_enumerate/issues"dev-repo: "git+https://github.com/janestreet/ppx_enumerate.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_enumerate/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Generate a list containing all values of a finite type"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_enumerate-v0.14.0.tar.gz"checksum: "md5=188421af960759f6e45dd748f4f08e8d"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_expect"bug-reports: "https://github.com/janestreet/ppx_expect/issues"dev-repo: "git+https://github.com/janestreet/ppx_expect.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_expect/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_here" {>= "v0.14" & < "v0.15"}"ppx_inline_test" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.18.0"}"re" {>= "1.8.0"}]synopsis: "Cram like framework for OCaml"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_expect/archive/v0.14.1.tar.gz"checksum: "md5=9cc03dcabb00c72e17f7f5b0e4d28603"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_hash"bug-reports: "https://github.com/janestreet/ppx_hash/issues"dev-repo: "git+https://github.com/janestreet/ppx_hash.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_hash/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"ppx_compare" {>= "v0.14" & < "v0.15"}"ppx_sexp_conv" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "A ppx rewriter that generates hash functions from type expressions and definitions"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_hash-v0.14.0.tar.gz"checksum: "md5=b78aee19bb4469731f9626b04fe7f341"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_here"bug-reports: "https://github.com/janestreet/ppx_here/issues"dev-repo: "git+https://github.com/janestreet/ppx_here.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_here/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.11.0"}]synopsis: "Expands [%here] into its location"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/ppx_here-v0.14.0.tar.gz"checksum: "md5=bb3bbde0964a1f866de09f3df44def4d"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_inline_test"bug-reports: "https://github.com/janestreet/ppx_inline_test/issues"dev-repo: "git+https://github.com/janestreet/ppx_inline_test.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_inline_test/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"time_now" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.14.0"}]synopsis: "Syntax extension for writing in-line tests in ocaml code"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_inline_test/archive/v0.14.1.tar.gz"checksum: "md5=132754f0757188c3b700a2c5b6a2fb3f"}
opam-version: "2.0"maintainer: "opensource@janestreet.com"authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]homepage: "https://github.com/janestreet/ppx_optcomp"bug-reports: "https://github.com/janestreet/ppx_optcomp/issues"dev-repo: "git+https://github.com/janestreet/ppx_optcomp.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_optcomp/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.08"}"base" {>= "v0.14" & < "v0.15"}"stdio" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.18.0"}]synopsis: "Optional compilation for OCaml"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_optcomp/archive/v0.14.3.tar.gz"checksum: "md5=2d012df62dd0bc82d2ea4ab25b628992"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/ppx_sexp_conv"bug-reports: "https://github.com/janestreet/ppx_sexp_conv/issues"dev-repo: "git+https://github.com/janestreet/ppx_sexp_conv.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_sexp_conv/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"ppxlib" {>= "0.22.0" & < "0.26.0"}]synopsis: "[@@deriving] plugin to generate S-expression conversion functions"description: "Part of the Jane Street's PPX rewriters collection."url {src: "https://github.com/janestreet/ppx_sexp_conv/archive/v0.14.3.tar.gz"checksum: "md5=25caf01245e0113e035ccefe275f85d9"}
"sha256=7766027c2ecd0f5b3b460e9212a70709c6744278113eb91f317c56c41e7a90c8""sha512=726e48899c43f8bee1935618827e68b2953753a62868e424a2dadf2e156cc60794abacea658686a8a160eccde0f75b95b98daacf2b9242b4f86a92798d47b597"
"sha256=2d2f150e7715845dc578d254f705a67600be71c986b7e67e81befda612870bd5""sha512=464220e3d8c75503824b73393df0b8ad16019acf55b8ecef89f8d464cd6d054e470ce4866b244216c5f7b85a5e8abad908aad212a78b4a132f3092fa785da0de"
"md5=a830f187d3eed60eba960c8d626035a4""sha512=08da783ca991dcee26f88b8d6db2fcf2589d3e753ce355d5e3c8944b58ce43b444c6cde054971a557d7d345b4386e6e976111d4c537840a1269c7e361340fcfe"
"md5=e207362d67387d6dbb8dcd4ba7238b39""sha512=6fd5fd4348ed6a48a8f64a466fedd07374eaf23d516b3c250ebad2a32ddbca3ae4ad9c84fe1112858075df46c119cd6550205a4228a553b014d135581f024ded"
"md5=a830f187d3eed60eba960c8d626035a4""sha512=08da783ca991dcee26f88b8d6db2fcf2589d3e753ce355d5e3c8944b58ce43b444c6cde054971a557d7d345b4386e6e976111d4c537840a1269c7e361340fcfe"
"md5=e207362d67387d6dbb8dcd4ba7238b39""sha512=6fd5fd4348ed6a48a8f64a466fedd07374eaf23d516b3c250ebad2a32ddbca3ae4ad9c84fe1112858075df46c119cd6550205a4228a553b014d135581f024ded"
opam-version: "2.0"synopsis: "Declarative events and signals for OCaml"description: """\Release %%VERSION%%React is an OCaml module for functional reactive programming (FRP). Itprovides support to program with time varying values : declarativeevents and signals. React doesn't define any primitive event orsignal, it lets the client chooses the concrete timeline.React is made of a single, independent, module and distributed underthe ISC license.Homepage: <http://erratique.ch/software/react>"""maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"authors: "The react programmers"license: "ISC"tags: ["reactive" "declarative" "signal" "event" "frp" "org:erratique"]homepage: "https://erratique.ch/software/react"doc: "https://erratique.ch/software/react/doc/"bug-reports: "https://github.com/dbuenzli/react/issues"depends: ["ocaml" {>= "4.08.0"}"ocamlfind" {build}"ocamlbuild" {build}"topkg" {build & >= "1.0.3"}]build: ["ocaml" "pkg/pkg.ml" "build" "--dev-pkg" "%{dev}%"]dev-repo: "git+https://erratique.ch/repos/react.git"url {src: "https://erratique.ch/software/react/releases/react-1.2.2.tbz"checksum:"sha512=18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1"}
homepage: "https://github.com/facebook/reason"doc: "http://reasonml.github.io/"bug-reports: "https://github.com/facebook/reason/issues"dev-repo: "git+https://github.com/facebook/reason.git"
homepage: "https://github.com/reasonml/reason"doc: "https://reasonml.github.io/"bug-reports: "https://github.com/reasonml/reason/issues"dev-repo: "git://github.com/reasonml/reason.git"
src: "https://registry.npmjs.org/@esy-ocaml/reason/-/reason-3.7.0.tgz"checksum: "md5=7eb8cbbff8565b93ebfabf4eca7254d4"
src:"https://github.com/reasonml/reason/releases/download/3.8.0/reason-3.8.0.tbz"checksum: ["sha256=9478724b01767320064ba950ddea24c5df0eefdcdd8ff1324ba9ccd646258979""sha512=c5dcec810a1981b78b19271a8a255f4087628514725d6818419b141be6346a62b28fe8d0f10855efe420ede2839bfe562aa5abf21f29d66250e5c0d02323d6d8"]
x-commit-hash: "52fcae90ef3b304f55dce0a57125a2483e792a03"
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/sexplib"bug-reports: "https://github.com/janestreet/sexplib/issues"dev-repo: "git+https://github.com/janestreet/sexplib.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/sexplib/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"parsexp" {>= "v0.14" & < "v0.15"}"sexplib0" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}"num"]synopsis: "Library for serializing OCaml values to and from S-expressions"description: "Part of Jane Street's Core libraryThe Core suite of libraries is an industrial strength alternative toOCaml's standard library that was developed by Jane Street, thelargest industrial user of OCaml."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/sexplib-v0.14.0.tar.gz"checksum: "md5=6e230eae22face46cb8645e53e351067"}
opam-version: "2.0"maintainer: "Jane Street developers"authors: ["Jane Street Group, LLC"]homepage: "https://github.com/janestreet/time_now"bug-reports: "https://github.com/janestreet/time_now/issues"dev-repo: "git+https://github.com/janestreet/time_now.git"doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/time_now/index.html"license: "MIT"build: [["dune" "build" "-p" name "-j" jobs]]depends: ["ocaml" {>= "4.04.2"}"base" {>= "v0.14" & < "v0.15"}"jane-street-headers" {>= "v0.14" & < "v0.15"}"jst-config" {>= "v0.14" & < "v0.15"}"ppx_base" {>= "v0.14" & < "v0.15"}"ppx_optcomp" {>= "v0.14" & < "v0.15"}"dune" {>= "2.0.0"}]synopsis: "Reports the current time"description: "Provides a single function to report the current time in nanosecondssince the start of the Unix epoch."url {src: "https://ocaml.janestreet.com/ocaml-core/v0.14/files/time_now-v0.14.0.tar.gz"checksum: "md5=a93116938783587f8b9f5152dd543037"}
opam-version: "2.0"homepage: "https://github.com/mirleft/ocaml-tls"dev-repo: "git+https://github.com/mirleft/ocaml-tls.git"bug-reports: "https://github.com/mirleft/ocaml-tls/issues"doc: "https://mirleft.github.io/ocaml-tls/doc"maintainer: ["Hannes Mehnert <hannes@mehnert.org>" "David Kaloper <david@numm.org>"]license: "BSD-2-Clause"build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]depends: ["ocaml" {>= "4.08.0"}"dune" {>= "1.0"}"ppx_sexp_conv" {>= "v0.9.0"}"ppx_cstruct" {>= "3.0.0"}"cstruct" {>= "6.0.0"}"cstruct-sexp""sexplib""mirage-crypto" {>= "0.8.1"}"mirage-crypto-ec" {>= "0.10.0"}"mirage-crypto-pk""mirage-crypto-rng" {>= "0.8.0"}"x509" {>= "0.15.0"}"domain-name" {>= "0.3.0"}"fmt" {>= "0.8.7"}"cstruct-unix" {with-test & >= "3.0.0"}"ounit2" {with-test & >= "2.2.0"}"lwt" {>= "3.0.0"}"ptime" {>= "0.8.1"}"hkdf""logs""ipaddr""ipaddr-sexp""alcotest" {with-test}"randomconv" {with-test}]conflicts: [ "result" {< "1.5"} ]tags: [ "org:mirage"]synopsis: "Transport Layer Security purely in OCaml"description: """Transport Layer Security (TLS) is probably the most widely deployed securityprotocol on the Internet. It provides communication privacy to preventeavesdropping, tampering, and message forgery. Furthermore, it optionallyprovides authentication of the involved endpoints. TLS is commonly deployed forsecuring web services ([HTTPS](http://tools.ietf.org/html/rfc2818)), emails,virtual private networks, and wireless networks.TLS uses asymmetric cryptography to exchange a symmetric key, and optionallyauthenticate (using X.509) either or both endpoints. It provides algorithmicagility, which means that the key exchange method, symmetric encryptionalgorithm, and hash algorithm are negotiated.Read [further](https://nqsb.io) and our [Usenix Security 2015 paper](https://usenix15.nqsb.io)."""authors: ["David Kaloper <david@numm.org>" "Hannes Mehnert <hannes@mehnert.org>"]url {src:"https://github.com/mirleft/ocaml-tls/releases/download/v0.15.2/tls-v0.15.2.tbz"checksum: ["sha256=b76371757249bbeabb12c333de4ea2a09c095767bdbbc83322538c0da1fc1e36""sha512=e6e089a853848e82647bc3f6ecaa3a95cdb559e50b7ad9d06064c1fd0c931b0e942ff0877c8066ec79b6b42a29512449ba1a5c6de1f1502cdbfc3397546f417c"]}x-commit-hash: "0ba4883e9372495682e3407817614f17ddf002d7"
opam-version: "2.0"synopsis: """Non-blocking streaming Unicode codec for OCaml"""maintainer: ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]authors: ["The uutf programmers"]homepage: "https://erratique.ch/software/uutf"doc: "https://erratique.ch/software/uutf/doc/"dev-repo: "git+https://erratique.ch/repos/uutf.git"bug-reports: "https://github.com/dbuenzli/uutf/issues"license: ["ISC"]tags: ["unicode" "text" "utf-8" "utf-16" "codec" "org:erratique"]depends: ["ocaml" {>= "4.03.0"}"ocamlfind" {build}"ocamlbuild" {build}"topkg" {build & >= "1.0.3"}]depopts: ["cmdliner"]conflicts: ["cmdliner" {< "0.9.8"}]build: [["ocaml" "pkg/pkg.ml" "build" "--dev-pkg" "%{dev}%""--with-cmdliner" "%{cmdliner:installed}%"]]url {src: "https://erratique.ch/software/uutf/releases/uutf-1.0.3.tbz"checksum: "sha512=50cc4486021da46fb08156e9daec0d57b4ca469b07309c508d5a9a41e9dbcf1f32dec2ed7be027326544453dcaf9c2534919395fd826dc7768efc6cc4bfcc9f8"}description: """Uutf is a non-blocking streaming codec to decode and encode the UTF-8,UTF-16, UTF-16LE and UTF-16BE encoding schemes. It can efficientlywork character by character without blocking on IO. Decoders performcharacter position tracking and support newline normalization.Functions are also provided to fold over the characters of UTF encodedOCaml string values and to directly encode characters in OCamlBuffer.t values. **Note** that since OCaml 4.14, that functionalitycan be found in the Stdlib and you are encouraged to migrate to it.Uutf has no dependency and is distributed under the ISC license.Home page: http://erratique.ch/software/uutfContact: Daniel Bünzli `<daniel.buenzl i@erratique.ch>`"""
opam-version: "2.0"maintainer: ["Hannes Mehnert <hannes@mehnert.org>"]authors: ["Hannes Mehnert <hannes@mehnert.org>""David Kaloper <dk505@cam.ac.uk>"]license: "BSD-2-Clause"tags: "org:mirage"homepage: "https://github.com/mirleft/ocaml-x509"doc: "https://mirleft.github.io/ocaml-x509/doc"bug-reports: "https://github.com/mirleft/ocaml-x509/issues"depends: ["ocaml" {>= "4.08.0"}"dune" {>= "1.2"}"cstruct" {>= "6.0.0"}"asn1-combinators" {>= "0.2.0"}"ptime""base64" {>= "3.3.0"}"mirage-crypto""mirage-crypto-pk""mirage-crypto-ec" {>= "0.10.0"}"mirage-crypto-rng""fmt" {>= "0.8.7"}"alcotest" {with-test}"cstruct-unix" {with-test & >= "3.0.0"}"gmap" {>= "0.3.0"}"domain-name" {>= "0.3.0"}"logs""pbkdf""ipaddr" {>= "5.2.0"}]conflicts: [ "result" {< "1.5"} ]build: [["dune" "subst"] {dev}["dune" "build" "-p" name "-j" jobs]["dune" "runtest" "-p" name "-j" jobs] {with-test}]dev-repo: "git+https://github.com/mirleft/ocaml-x509.git"synopsis: "Public Key Infrastructure (RFC 5280, PKCS) purely in OCaml"description: """X.509 is a public key infrastructure used mostly on the Internet. It consistsof certificates which include public keys and identifiers, signed by anauthority. Authorities must be exchanged over a second channel to establish thetrust relationship. This library implements most parts of RFC5280 and RFC6125.The Public Key Cryptography Standards (PKCS) defines encoding and decoding(in ASN.1 DER and PEM format), which is also implemented by this library -namely PKCS 1, PKCS 5, PKCS 7, PKCS 8, PKCS 9, PKCS 10, and PKCS 12."""url {src:"https://github.com/mirleft/ocaml-x509/releases/download/v0.16.0/x509-0.16.0.tbz"checksum: ["sha256=67a6727fb4c38b919334eef2f8ef4eac0237029a439ff981d408eca8b9833595""sha512=c9b4cf55d16d8b1e6b6faa18fc9ac08065fa09937f07a3447d4b637539b37bea6374c98d184eba159a8ba8eba860303a78563097e47ef30529fedaaf722115c6"]}x-commit-hash: "e87d4baef3faedc05e1e4f2e36e16a4def5894ff"
opam-version: "2.0"maintainer: "Xavier Leroy <xavier.leroy@inria.fr>"authors: ["Antoine Miné""Xavier Leroy""Pascal Cuoq"]homepage: "https://github.com/ocaml/Zarith"bug-reports: "https://github.com/ocaml/Zarith/issues"dev-repo: "git+https://github.com/ocaml/Zarith.git"build: [["./configure"] {os != "openbsd" & os != "freebsd" & os != "macos"}["sh""-exc""LDFLAGS=\"$LDFLAGS -L/usr/local/lib\" CFLAGS=\"$CFLAGS -I/usr/local/include\" ./configure"] {os = "openbsd" | os = "freebsd"}["sh""-exc""LDFLAGS=\"$LDFLAGS -L/opt/local/lib -L/usr/local/lib\" CFLAGS=\"$CFLAGS -I/opt/local/include -I/usr/local/include\" ./configure"] {os = "macos" & os-distribution != "homebrew"}["sh""-exc""LDFLAGS=\"$LDFLAGS -L/opt/local/lib -L/usr/local/lib\" CFLAGS=\"$CFLAGS -I/opt/local/include -I/usr/local/include\" ./configure"] {os = "macos" & os-distribution = "homebrew" & arch = "x86_64" }["sh""-exc""LDFLAGS=\"$LDFLAGS -L/opt/homebrew/lib\" CFLAGS=\"$CFLAGS -I/opt/homebrew/include\" ./configure"] {os = "macos" & os-distribution = "homebrew" & arch = "arm64" }[make]]install: [[make "install"]]depends: ["ocaml" {>= "4.04.0"}"ocamlfind""conf-gmp"]synopsis:"Implements arithmetic and logical operations over arbitrary-precision integers"description: """The Zarith library implements arithmetic and logical operations overarbitrary-precision integers. It uses GMP to efficiently implementarithmetic over big integers. Small integers are represented as Camlunboxed integers, for speed and space economy."""url {src: "https://github.com/ocaml/Zarith/archive/release-1.12.tar.gz"checksum: ["md5=bf368f3d9e20b6b446d54681afc05a04""sha512=8075573ae65579a2606b37dd1b213032a07d220d28c733f9288ae80d36f8a2cc4d91632806df2503c130ea9658dc207ee3a64347c21aa53969050a208f5b2bb4"]}
{"name": "esy-openssl","version": "1.1.1g","description": "Mirror of OpenSSL","license": "Apache 2.0","source": "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz#33324ff957edaae8ae575817b456320378da46ff","override": {"build": [["bash","-c","#{os == 'windows' ? './configure mingw64 --prefix=$cur__install --openssldir=$cur__install/ssl --cross-compile-prefix=x86_64-w64-mingw32-' : './config --prefix=$cur__install --openssldir=$cur__install/ssl'}"],["make","-j4"]],"install": [["make","install"],["bash","-c","mkdir -p #{self.install / 'ssl'}"],["bash","-c","mv cert.pem #{self.install / 'ssl'}"]],"buildsInSource": true,"exportedEnv": {"LD_LIBRARY_PATH": {"val": "#{self.lib : $LD_LIBRARY_PATH}","scope": "global"},"OPENSSL_LIB_PATH": {"val": "#{self.lib}","scope": "global"},"OPENSSL_INCLUDE_PATH": {"val": "#{self.install / 'include'}","scope": "global"},"OPENSSL_BIN_PATH": {"val": "#{self.bin}","scope": "global"},"PKG_CONFIG_PATH": {"val": "#{self.lib / 'pkgconfig'}","scope": "global"}},"dependencies": {"@opam/conf-autoconf": "esy-packages/esy-autoconf:package.json#fb93edf","@opam/conf-pkg-config": "*"}}}
#### Bundle of CA Root Certificates#### Certificate data from Mozilla as of: Wed Nov 27 04:12:10 2019 GMT#### This is a bundle of X.509 certificates of public Certificate Authorities## (CA). These were automatically extracted from Mozilla's root certificates## file (certdata.txt). This file can be found in the mozilla source tree:## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt#### It contains the certificates in PEM format and therefore## can be directly used with curl / libcurl / php_curl, or with## an Apache+mod_ssl webserver for SSL client authentication.## Just configure this file as the SSLCACertificateFile.#### Conversion done with mk-ca-bundle.pl version 1.27.## SHA256: 607309057d0ec70f8e4e97b03906bafb2fcebb24cd37b5e8293e681ae26ceae0##GlobalSign Root CA==================-----BEGIN CERTIFICATE-----MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==-----END CERTIFICATE-----GlobalSign Root CA - R2=======================-----BEGIN CERTIFICATE-----MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==-----END CERTIFICATE-----Verisign Class 3 Public Primary Certification Authority - G3============================================================-----BEGIN CERTIFICATE-----MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==-----END CERTIFICATE-----Entrust.net Premium 2048 Secure Server CA=========================================-----BEGIN CERTIFICATE-----MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6YfzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=-----END CERTIFICATE-----Baltimore CyberTrust Root=========================-----BEGIN CERTIFICATE-----MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp-----END CERTIFICATE-----AddTrust External Root======================-----BEGIN CERTIFICATE-----MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=-----END CERTIFICATE-----Entrust Root Certification Authority====================================-----BEGIN CERTIFICATE-----MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8-----END CERTIFICATE-----GeoTrust Global CA==================-----BEGIN CERTIFICATE-----MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==-----END CERTIFICATE-----GeoTrust Universal CA=====================-----BEGIN CERTIFICATE-----MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRcaanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=-----END CERTIFICATE-----GeoTrust Universal CA 2=======================-----BEGIN CERTIFICATE-----MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+zdXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS-----END CERTIFICATE-----Comodo AAA Services root========================-----BEGIN CERTIFICATE-----MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==-----END CERTIFICATE-----QuoVadis Root CA================-----BEGIN CERTIFICATE-----MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOKSnQ2+Q==-----END CERTIFICATE-----QuoVadis Root CA 2==================-----BEGIN CERTIFICATE-----MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u-----END CERTIFICATE-----QuoVadis Root CA 3==================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----Security Communication Root CA==============================-----BEGIN CERTIFICATE-----MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==-----END CERTIFICATE-----Sonera Class 2 Root CA======================-----BEGIN CERTIFICATE-----MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M-----END CERTIFICATE-----XRamp Global CA Root====================-----BEGIN CERTIFICATE-----MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxtqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=-----END CERTIFICATE-----Go Daddy Class 2 CA===================-----BEGIN CERTIFICATE-----MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8=-----END CERTIFICATE-----Starfield Class 2 CA====================-----BEGIN CERTIFICATE-----MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=-----END CERTIFICATE-----Taiwan GRCA===========-----BEGIN CERTIFICATE-----MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS-----END CERTIFICATE-----DigiCert Assured ID Root CA===========================-----BEGIN CERTIFICATE-----MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==-----END CERTIFICATE-----DigiCert Global Root CA=======================-----BEGIN CERTIFICATE-----MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=-----END CERTIFICATE-----DigiCert High Assurance EV Root CA==================================-----BEGIN CERTIFICATE-----MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCevEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K-----END CERTIFICATE-----DST Root CA X3==============-----BEGIN CERTIFICATE-----MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ-----END CERTIFICATE-----SwissSign Gold CA - G2======================-----BEGIN CERTIFICATE-----MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ-----END CERTIFICATE-----SwissSign Silver CA - G2========================-----BEGIN CERTIFICATE-----MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u-----END CERTIFICATE-----GeoTrust Primary Certification Authority========================================-----BEGIN CERTIFICATE-----MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=-----END CERTIFICATE-----thawte Primary Root CA======================-----BEGIN CERTIFICATE-----MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAXxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==-----END CERTIFICATE-----VeriSign Class 3 Public Primary Certification Authority - G5============================================================-----BEGIN CERTIFICATE-----MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq-----END CERTIFICATE-----SecureTrust CA==============-----BEGIN CERTIFICATE-----MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=-----END CERTIFICATE-----Secure Global CA================-----BEGIN CERTIFICATE-----MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xcf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW-----END CERTIFICATE-----COMODO Certification Authority==============================-----BEGIN CERTIFICATE-----MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==-----END CERTIFICATE-----Network Solutions Certificate Authority=======================================-----BEGIN CERTIFICATE-----MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3HtvwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey-----END CERTIFICATE-----COMODO ECC Certification Authority==================================-----BEGIN CERTIFICATE-----MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=-----END CERTIFICATE-----OISTE WISeKey Global Root GA CA===============================-----BEGIN CERTIFICATE-----MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXahNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=-----END CERTIFICATE-----Certigna========-----BEGIN CERTIFICATE-----MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/QwWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==-----END CERTIFICATE-----Cybertrust Global Root======================-----BEGIN CERTIFICATE-----MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jWWL1WMRJOEcgh4LMRkWXbtKaIOM5V-----END CERTIFICATE-----ePKI Root Certification Authority=================================-----BEGIN CERTIFICATE-----MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLHClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=-----END CERTIFICATE-----certSIGN ROOT CA================-----BEGIN CERTIFICATE-----MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD-----END CERTIFICATE-----GeoTrust Primary Certification Authority - G3=============================================-----BEGIN CERTIFICATE-----MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGDAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt-----END CERTIFICATE-----thawte Primary Root CA - G2===========================-----BEGIN CERTIFICATE-----MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==-----END CERTIFICATE-----thawte Primary Root CA - G3===========================-----BEGIN CERTIFICATE-----MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1but8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=-----END CERTIFICATE-----GeoTrust Primary Certification Authority - G2=============================================-----BEGIN CERTIFICATE-----MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2npaqBA+K-----END CERTIFICATE-----VeriSign Universal Root Certification Authority===============================================-----BEGIN CERTIFICATE-----MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1UdDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO37M2CYfE45k+XmCpajQ==-----END CERTIFICATE-----VeriSign Class 3 Public Primary Certification Authority - G4============================================================-----BEGIN CERTIFICATE-----MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==-----END CERTIFICATE-----NetLock Arany (Class Gold) Főtanúsítvány========================================-----BEGIN CERTIFICATE-----MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzCbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=-----END CERTIFICATE-----Staat der Nederlanden Root CA - G2==================================-----BEGIN CERTIFICATE-----MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==-----END CERTIFICATE-----Hongkong Post Root CA 1=======================-----BEGIN CERTIFICATE-----MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbiAmvZWg==-----END CERTIFICATE-----SecureSign RootCA11===================-----BEGIN CERTIFICATE-----MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=-----END CERTIFICATE-----Microsec e-Szigno Root CA 2009==============================-----BEGIN CERTIFICATE-----MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW-----END CERTIFICATE-----GlobalSign Root CA - R3=======================-----BEGIN CERTIFICATE-----MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpHWD9f-----END CERTIFICATE-----Autoridad de Certificacion Firmaprofesional CIF A62634068=========================================================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----Izenpe.com==========-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----Chambers of Commerce Root - 2008================================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----Global Chambersign Root - 2008==============================-----BEGIN CERTIFICATE-----MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9JhwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B-----END CERTIFICATE-----Go Daddy Root Certificate Authority - G2========================================-----BEGIN CERTIFICATE-----MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPOLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1-----END CERTIFICATE-----Starfield Root Certificate Authority - G2=========================================-----BEGIN CERTIFICATE-----MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/KpL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0-----END CERTIFICATE-----Starfield Services Root Certificate Authority - G2==================================================-----BEGIN CERTIFICATE-----MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkdiEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6-----END CERTIFICATE-----AffirmTrust Commercial======================-----BEGIN CERTIFICATE-----MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=-----END CERTIFICATE-----AffirmTrust Networking======================-----BEGIN CERTIFICATE-----MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=-----END CERTIFICATE-----AffirmTrust Premium===================-----BEGIN CERTIFICATE-----MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMgNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==-----END CERTIFICATE-----AffirmTrust Premium ECC=======================-----BEGIN CERTIFICATE-----MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==-----END CERTIFICATE-----Certum Trusted Network CA=========================-----BEGIN CERTIFICATE-----MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=-----END CERTIFICATE-----TWCA Root Certification Authority=================================-----BEGIN CERTIFICATE-----MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==-----END CERTIFICATE-----Security Communication RootCA2==============================-----BEGIN CERTIFICATE-----MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03-----END CERTIFICATE-----EC-ACC======-----BEGIN CERTIFICATE-----MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=-----END CERTIFICATE-----Hellenic Academic and Research Institutions RootCA 2011=======================================================-----BEGIN CERTIFICATE-----MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4-----END CERTIFICATE-----Actalis Authentication Root CA==============================-----BEGIN CERTIFICATE-----MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbtifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==-----END CERTIFICATE-----Trustis FPS Root CA===================-----BEGIN CERTIFICATE-----MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQENZetX2fNXlrtIzYE=-----END CERTIFICATE-----Buypass Class 2 Root CA=======================-----BEGIN CERTIFICATE-----MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462sA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=-----END CERTIFICATE-----Buypass Class 3 Root CA=======================-----BEGIN CERTIFICATE-----MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdVcSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=-----END CERTIFICATE-----T-TeleSec GlobalRoot Class 3============================-----BEGIN CERTIFICATE-----MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuImle9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==-----END CERTIFICATE-----EE Certification Centre Root CA===============================-----BEGIN CERTIFICATE-----MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5uuSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=-----END CERTIFICATE-----D-TRUST Root Class 3 CA 2 2009==============================-----BEGIN CERTIFICATE-----MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=-----END CERTIFICATE-----D-TRUST Root Class 3 CA 2 EV 2009=================================-----BEGIN CERTIFICATE-----MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1-----END CERTIFICATE-----CA Disig Root R2================-----BEGIN CERTIFICATE-----MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFMtCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL-----END CERTIFICATE-----ACCVRAIZ1=========-----BEGIN CERTIFICATE-----MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5hI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7-----END CERTIFICATE-----TWCA Global Root CA===================-----BEGIN CERTIFICATE-----MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsnLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=-----END CERTIFICATE-----TeliaSonera Root CA v1======================-----BEGIN CERTIFICATE-----MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=-----END CERTIFICATE-----E-Tugra Certification Authority===============================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----T-TeleSec GlobalRoot Class 2============================-----BEGIN CERTIFICATE-----MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==-----END CERTIFICATE-----Atos TrustedRoot 2011=====================-----BEGIN CERTIFICATE-----MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed-----END CERTIFICATE-----QuoVadis Root CA 1 G3=====================-----BEGIN CERTIFICATE-----MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOCMTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD-----END CERTIFICATE-----QuoVadis Root CA 2 G3=====================-----BEGIN CERTIFICATE-----MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M-----END CERTIFICATE-----QuoVadis Root CA 3 G3=====================-----BEGIN CERTIFICATE-----MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3pxKGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0-----END CERTIFICATE-----DigiCert Assured ID Root G2===========================-----BEGIN CERTIFICATE-----MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwoIhNzbM8m9Yop5w==-----END CERTIFICATE-----DigiCert Assured ID Root G3===========================-----BEGIN CERTIFICATE-----MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv6pZjamVFkpUBtA==-----END CERTIFICATE-----DigiCert Global Root G2=======================-----BEGIN CERTIFICATE-----MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTflMrY=-----END CERTIFICATE-----DigiCert Global Root G3=======================-----BEGIN CERTIFICATE-----MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8sycX-----END CERTIFICATE-----DigiCert Trusted Root G4========================-----BEGIN CERTIFICATE-----MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+-----END CERTIFICATE-----COMODO RSA Certification Authority==================================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----USERTrust RSA Certification Authority=====================================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----USERTrust ECC Certification Authority=====================================-----BEGIN CERTIFICATE-----MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=-----END CERTIFICATE-----GlobalSign ECC Root CA - R4===========================-----BEGIN CERTIFICATE-----MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=-----END CERTIFICATE-----GlobalSign ECC Root CA - R5===========================-----BEGIN CERTIFICATE-----MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3-----END CERTIFICATE-----Staat der Nederlanden Root CA - G3==================================-----BEGIN CERTIFICATE-----MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BDU5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=-----END CERTIFICATE-----Staat der Nederlanden EV Root CA================================-----BEGIN CERTIFICATE-----MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsIeK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==-----END CERTIFICATE-----IdenTrust Commercial Root CA 1==============================-----BEGIN CERTIFICATE-----MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H-----END CERTIFICATE-----IdenTrust Public Sector Root CA 1=================================-----BEGIN CERTIFICATE-----MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qjt2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c-----END CERTIFICATE-----Entrust Root Certification Authority - G2=========================================-----BEGIN CERTIFICATE-----MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZRkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==-----END CERTIFICATE-----Entrust Root Certification Authority - EC1==========================================-----BEGIN CERTIFICATE-----MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G-----END CERTIFICATE-----CFCA EV ROOT============-----BEGIN CERTIFICATE-----MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIBACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su-----END CERTIFICATE-----OISTE WISeKey Global Root GB CA===============================-----BEGIN CERTIFICATE-----MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02IcNc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=-----END CERTIFICATE-----SZAFIR ROOT CA2===============-----BEGIN CERTIFICATE-----MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==-----END CERTIFICATE-----Certum Trusted Network CA 2===========================-----BEGIN CERTIFICATE-----MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbiDrW5viSP-----END CERTIFICATE-----Hellenic Academic and Research Institutions RootCA 2015=======================================================-----BEGIN CERTIFICATE-----MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZaycBw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9qp/UsQu0yrbYhnr68-----END CERTIFICATE-----Hellenic Academic and Research Institutions ECC RootCA 2015===========================================================-----BEGIN CERTIFICATE-----MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR-----END CERTIFICATE-----ISRG Root X1============-----BEGIN CERTIFICATE-----MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=-----END CERTIFICATE-----AC RAIZ FNMT-RCM================-----BEGIN CERTIFICATE-----MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDDnFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=-----END CERTIFICATE-----Amazon Root CA 1================-----BEGIN CERTIFICATE-----MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5-----END CERTIFICATE-----Amazon Root CA 2================-----BEGIN CERTIFICATE-----MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=-----END CERTIFICATE-----Amazon Root CA 3================-----BEGIN CERTIFICATE-----MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==-----END CERTIFICATE-----Amazon Root CA 4================-----BEGIN CERTIFICATE-----MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==-----END CERTIFICATE-----LuxTrust Global Root 2======================-----BEGIN CERTIFICATE-----MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr-----END CERTIFICATE-----TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1=============================================-----BEGIN CERTIFICATE-----MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifhAHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=-----END CERTIFICATE-----GDCA TrustAUTH R5 ROOT======================-----BEGIN CERTIFICATE-----MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfgp8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==-----END CERTIFICATE-----TrustCor RootCert CA-1======================-----BEGIN CERTIFICATE-----MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yfke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=-----END CERTIFICATE-----TrustCor RootCert CA-2======================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----TrustCor ECA-1==============-----BEGIN CERTIFICATE-----MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11FhcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==-----END CERTIFICATE-----SSL.com Root Certification Authority RSA========================================-----BEGIN CERTIFICATE-----MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=-----END CERTIFICATE-----SSL.com Root Certification Authority ECC========================================-----BEGIN CERTIFICATE-----MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl-----END CERTIFICATE-----SSL.com EV Root Certification Authority RSA R2==============================================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----SSL.com EV Root Certification Authority ECC===========================================-----BEGIN CERTIFICATE-----MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==-----END CERTIFICATE-----GlobalSign Root CA - R6=======================-----BEGIN CERTIFICATE-----MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLNnsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=-----END CERTIFICATE-----OISTE WISeKey Global Root GC CA===============================-----BEGIN CERTIFICATE-----MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9-----END CERTIFICATE-----GTS Root R1===========-----BEGIN CERTIFICATE-----MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl-----END CERTIFICATE-----GTS Root R2===========-----BEGIN CERTIFICATE-----MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JTvhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC-----END CERTIFICATE-----GTS Root R3===========-----BEGIN CERTIFICATE-----MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd-----END CERTIFICATE-----GTS Root R4===========-----BEGIN CERTIFICATE-----MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w==-----END CERTIFICATE-----UCA Global G2 Root==================-----BEGIN CERTIFICATE-----MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg51eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==-----END CERTIFICATE-----UCA Extended Validation Root============================-----BEGIN CERTIFICATE-----MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAURap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax-----END CERTIFICATE-----Certigna Root CA================-----BEGIN CERTIFICATE-----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-----END CERTIFICATE-----emSign Root CA - G1===================-----BEGIN CERTIFICATE-----MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxxiN66zB+Afko=-----END CERTIFICATE-----emSign ECC Root CA - G3=======================-----BEGIN CERTIFICATE-----MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj-----END CERTIFICATE-----emSign Root CA - C1===================-----BEGIN CERTIFICATE-----MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=-----END CERTIFICATE-----emSign ECC Root CA - C3=======================-----BEGIN CERTIFICATE-----MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==-----END CERTIFICATE-----Hongkong Post Root CA 3=======================-----BEGIN CERTIFICATE-----MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0ei9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEGmpv0-----END CERTIFICATE-----
{"hash": "d10585b707b5ab54802c6c85154328fd","root": "root@path:./package.json","node": {"root@path:./package.json": {"record": {"name": "root","version": "path:./package.json","source": "path:./package.json","files": [],"opam": null},"dependencies": []}}}
pwdmkdir -p _testcd _testif which x86_64-w64-mingw32-gcc; thenCC=x86_64-w64-mingw32-gccelseCC=gccfiecho "Using compiler: $CC"echo "include..."#ls -a $INCLUDEecho "lib.."#ls -a $cur__lib$CC ./../../esy/test.c -o ./test.exe -I$OPENSSL_INCLUDE_PATH -L$OPENSSL_LIB_PATH -lssl -lcrypto#export PATH=$PATH:$cur__bin:$cur__lib#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$cur__lib#echo "Augmented path: $PATH"echo "Copying binaries..."#cp $cur__bin/*.dll .echo "Test executable path:"ls -a ../test.exe
/* From: https://wiki.openssl.org/index.php/Libcrypto_API */#include <openssl/conf.h>#include <openssl/evp.h>#include <openssl/err.h>int main(int arc, char *argv[]){/* Load the human readable error strings for libcrypto */ERR_load_crypto_strings();/* Load all digest and cipher algorithms */OpenSSL_add_all_algorithms();/* Load config file, and other important initialisation */CONF_modules_load(NULL, NULL, 0);printf("OpenSSL successfully initialized.\n");/* Clean up *//* Removes all digests and ciphers */EVP_cleanup();/* if you omit the next, a small leak may be left when you make use of the BIO (low level API) for e.g. base64 transformations */CRYPTO_cleanup_all_ex_data();/* Remove error strings */ERR_free_strings();return 0;}
jobs:- template: .ci/build.yaml # Template referenceparameters:host: macOSpool:vmImage: 'macOS-latest'- template: .ci/build.yaml # Template referenceparameters:host: Linuxpool:vmImage: 'ubuntu-latest'- template: .ci/build.yaml # Template referenceparameters:host: Windowspool:vmImage: 'windows-latest'sign: true # Extra step on Windows only
### `esy` build status[](https://ci.appveyor.com/project/bryphe/esy-openssl/branch/esy)[](https://travis-ci.org/bryphe/esy-openssl)-----------OpenSSL 1.1.1 11 Sep 2018Copyright (c) 1998-2018 The OpenSSL ProjectCopyright (c) 1995-1998 Eric A. Young, Tim J. HudsonAll rights reserved.DESCRIPTION-----------The OpenSSL Project is a collaborative effort to develop a robust,commercial-grade, fully featured, and Open Source toolkit implementing theTransport Layer Security (TLS) protocols (including SSLv3) as well as afull-strength general purpose cryptographic library.OpenSSL is descended from the SSLeay library developed by Eric A. Youngand Tim J. Hudson. The OpenSSL toolkit is licensed under a dual-license (theOpenSSL license plus the SSLeay license), which means that you are free toget and use it for commercial and non-commercial purposes as long as youfulfill the conditions of both licenses.OVERVIEW--------The OpenSSL toolkit includes:libssl (with platform specific naming):Provides the client and server-side implementations for SSLv3 and TLS.libcrypto (with platform specific naming):Provides general cryptographic and X.509 support needed by SSL/TLS butnot logically part of it.openssl:A command line tool that can be used for:Creation of key parametersCreation of X.509 certificates, CSRs and CRLsCalculation of message digestsEncryption and decryptionSSL/TLS client and server testsHandling of S/MIME signed or encrypted mailAnd more...INSTALLATION------------See the appropriate file:INSTALL Linux, Unix, Windows, OpenVMS, ...NOTES.* INSTALL addendums for different platformsSUPPORT-------See the OpenSSL website www.openssl.org for details on how to obtaincommercial technical support. Free community support is available through theopenssl-users email list (seehttps://www.openssl.org/community/mailinglists.html for further details).If you have any problems with OpenSSL then please take the following stepsfirst:- Download the latest version from the repositoryto see if the problem has already been addressed- Configure with no-asm- Remove compiler optimization flagsIf you wish to report a bug then please include the following informationand create an issue on GitHub:- OpenSSL version: output of 'openssl version -a'- Configuration data: output of 'perl configdata.pm --dump'- OS Name, Version, Hardware platform- Compiler Details (name, version)- Application Details (name, version)- Problem Description (steps that will reproduce the problem, if known)- Stack Traceback (if the application dumps core)Just because something doesn't work the way you expect does not mean itis necessarily a bug in OpenSSL. Use the openssl-users email list for this typeof query.HOW TO CONTRIBUTE TO OpenSSL----------------------------See CONTRIBUTINGLEGALITIES----------A number of nations restrict the use or export of cryptography. If youare potentially subject to such restrictions you should seek competentprofessional legal advice before attempting to develop or distributecryptographic code.
parameters:host: ''pool: ''sign: falsejobs:- job: ${{ parameters.host }}pool: ${{ parameters.pool }}steps:- ${{ if eq(parameters.sign, 'true') }}:- script: 'npm install -g esy@latest --unsafe-perm'displayName: 'Installing deps'- ${{ if eq(parameters.sign, 'false') }}:- script: 'sudo npm install -g esy@latest --unsafe-perm'displayName: 'Installing deps'- script: mkdir -p test_dirdisplayName: 'make test dir'- bash: |cd test_direcho '{"dependencies": {"@esy-packages/esy-openssl" : "esy-packages/esy-openssl:package.json#'$(git rev-parse --short HEAD)'"}}' > package.jsondisplayName: 'create test package.json'- script: |cd test_diresy installdisplayName: 'Install esy-deps'- script: |cd test_diresy x which opensslesy sh ../esy/test.shdisplayName: 'Building and dry run'
--- ./Makefile+++ ./Makefile@@ -213,7 +213,7 @@rm -f man/ocamlbuild.1man/options_man.byte: src/ocamlbuild_pack.cmo- $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte+ $(OCAMLC) -I +unix unix.cma $^ -I src man/options_man.ml -o man/options_man.byteclean::rm -f man/options_man.cm*--- ./src/command.ml+++ ./src/command.ml@@ -148,9 +148,10 @@let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals inlet b = Buffer.create 256 in(* The best way to prevent bash from switching to its windows-style- * quote-handling is to prepend an empty string before the command name. *)+ * quote-handling is to prepend an empty string before the command name.+ * space seems to work, too - and the ouput is nicer *)if Sys.os_type = "Win32" then- Buffer.add_string b "''";+ Buffer.add_char b ' ';let first = ref true inlet put_space () =if !first then@@ -260,7 +261,7 @@let execute_many ?(quiet=false) ?(pretend=false) cmds =add_parallel_stat (List.length cmds);- let degraded = !*My_unix.is_degraded || Sys.os_type = "Win32" in+ let degraded = !*My_unix.is_degraded inlet jobs = !jobs inif jobs < 0 then invalid_arg "jobs < 0";let max_jobs = if jobs = 0 then None else Some jobs in--- ./src/findlib.ml+++ ./src/findlib.ml@@ -66,9 +66,6 @@(fun command -> lexer & Lexing.from_string & run_and_read command)command-let run_and_read command =- Printf.ksprintf run_and_read command-let rec query name =tryHashtbl.find packages name@@ -135,7 +132,8 @@with Not_found -> slet list () =- List.map before_space (split_nl & run_and_read "%s list" ocamlfind)+ let cmd = Shell.quote_filename_if_needed ocamlfind ^ " list" in+ List.map before_space (split_nl & run_and_read cmd)(* The closure algorithm is easy because the dependencies are already closedand sorted for each package. We only have to make the union. We could also--- ./src/main.ml+++ ./src/main.ml@@ -162,6 +162,9 @@Tags.mem "traverse" tags|| List.exists (Pathname.is_prefix path_name) !Options.include_dirs|| List.exists (Pathname.is_prefix path_name) target_dirs)+ && ((* beware: !Options.build_dir is an absolute directory *)+ Pathname.normalize !Options.build_dir+ <> Pathname.normalize (Pathname.pwd/path_name))endendend--- ./src/my_std.ml+++ ./src/my_std.ml@@ -271,13 +271,107 @@try Array.iter (fun x -> if x = basename then raise Exit) a; falsewith Exit -> true+let command_plain = function+| [| |] -> 0+| margv ->+ let rec waitpid a b =+ match Unix.waitpid a b with+ | exception (Unix.Unix_error(Unix.EINTR,_,_)) -> waitpid a b+ | x -> x+ in+ let pid = Unix.(create_process margv.(0) margv stdin stdout stderr) in+ let pid', process_status = waitpid [] pid in+ assert (pid = pid');+ match process_status with+ | Unix.WEXITED n -> n+ | Unix.WSIGNALED _ -> 2 (* like OCaml's uncaught exceptions *)+ | Unix.WSTOPPED _ -> 127++(* can't use Lexers because of circular dependency *)+let split_path_win str =+ let rec aux pos =+ try+ let i = String.index_from str pos ';' in+ let len = i - pos in+ if len = 0 then+ aux (succ i)+ else+ String.sub str pos (i - pos) :: aux (succ i)+ with Not_found | Invalid_argument _ ->+ let len = String.length str - pos in+ if len = 0 then [] else [String.sub str pos len]+ in+ aux 0++let windows_shell = lazy begin+ let rec iter = function+ | [] -> [| "bash.exe" ; "--norc" ; "--noprofile" |]+ | hd::tl ->+ let dash = Filename.concat hd "dash.exe" in+ if Sys.file_exists dash then [|dash|] else+ let bash = Filename.concat hd "bash.exe" in+ if Sys.file_exists bash = false then iter tl else+ (* if sh.exe and bash.exe exist in the same dir, choose sh.exe *)+ let sh = Filename.concat hd "sh.exe" in+ if Sys.file_exists sh then [|sh|] else [|bash ; "--norc" ; "--noprofile"|]+ in+ split_path_win (try Sys.getenv "PATH" with Not_found -> "") |> iter+end++let prep_windows_cmd cmd =+ (* workaround known ocaml bug, remove later *)+ if String.contains cmd '\t' && String.contains cmd ' ' = false then+ " " ^ cmd+ else+ cmd++let run_with_shell = function+| "" -> 0+| cmd ->+ let cmd = prep_windows_cmd cmd in+ let shell = Lazy.force windows_shell in+ let qlen = Filename.quote cmd |> String.length in+ (* old versions of dash had problems with bs *)+ try+ if qlen < 7_900 then+ command_plain (Array.append shell [| "-ec" ; cmd |])+ else begin+ (* it can still work, if the called command is a cygwin tool *)+ let ch_closed = ref false in+ let file_deleted = ref false in+ let fln,ch =+ Filename.open_temp_file+ ~mode:[Open_binary]+ "ocamlbuildtmp"+ ".sh"+ in+ try+ let f_slash = String.map ( fun x -> if x = '\\' then '/' else x ) fln in+ output_string ch cmd;+ ch_closed:= true;+ close_out ch;+ let ret = command_plain (Array.append shell [| "-e" ; f_slash |]) in+ file_deleted:= true;+ Sys.remove fln;+ ret+ with+ | x ->+ if !ch_closed = false then+ close_out_noerr ch;+ if !file_deleted = false then+ (try Sys.remove fln with _ -> ());+ raise x+ end+ with+ | (Unix.Unix_error _) as x ->+ (* Sys.command doesn't raise an exception, so run_with_shell also won't+ raise *)+ Printexc.to_string x ^ ":" ^ cmd |> prerr_endline;+ 1+let sys_command =- match Sys.os_type with- | "Win32" -> fun cmd ->- if cmd = "" then 0 else- let cmd = "bash --norc -c " ^ Filename.quote cmd in- Sys.command cmd- | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd+ if Sys.win32 then run_with_shell+ else fun cmd -> if cmd = "" then 0 else Sys.command cmd(* FIXME warning fix and use Filename.concat *)let filename_concat x y =--- ./src/my_std.mli+++ ./src/my_std.mli@@ -69,3 +69,6 @@val split_ocaml_version : (int * int * int * string) option(** (major, minor, patchlevel, rest) *)++val windows_shell : string array Lazy.t+val prep_windows_cmd : string -> string--- ./src/ocamlbuild_executor.ml+++ ./src/ocamlbuild_executor.ml@@ -34,6 +34,8 @@job_stdin : out_channel;job_stderr : in_channel;job_buffer : Buffer.t;+ job_pid : int;+ job_tmp_file: string option;mutable job_dying : bool;};;@@ -76,6 +78,61 @@inloop 0;;++let open_process_full_win cmd env =+ let (in_read, in_write) = Unix.pipe () in+ let (out_read, out_write) = Unix.pipe () in+ let (err_read, err_write) = Unix.pipe () in+ Unix.set_close_on_exec in_read;+ Unix.set_close_on_exec out_write;+ Unix.set_close_on_exec err_read;+ let inchan = Unix.in_channel_of_descr in_read in+ let outchan = Unix.out_channel_of_descr out_write in+ let errchan = Unix.in_channel_of_descr err_read in+ let shell = Lazy.force Ocamlbuild_pack.My_std.windows_shell in+ let test_cmd =+ String.concat " " (List.map Filename.quote (Array.to_list shell)) ^+ "-ec " ^+ Filename.quote (Ocamlbuild_pack.My_std.prep_windows_cmd cmd) in+ let argv,tmp_file =+ if String.length test_cmd < 7_900 then+ Array.append+ shell+ [| "-ec" ; Ocamlbuild_pack.My_std.prep_windows_cmd cmd |],None+ else+ let fln,ch = Filename.open_temp_file ~mode:[Open_binary] "ocamlbuild" ".sh" in+ output_string ch (Ocamlbuild_pack.My_std.prep_windows_cmd cmd);+ close_out ch;+ let fln' = String.map (function '\\' -> '/' | c -> c) fln in+ Array.append+ shell+ [| "-c" ; fln' |], Some fln in+ let pid =+ Unix.create_process_env argv.(0) argv env out_read in_write err_write in+ Unix.close out_read;+ Unix.close in_write;+ Unix.close err_write;+ (pid, inchan, outchan, errchan,tmp_file)++let close_process_full_win (pid,inchan, outchan, errchan, tmp_file) =+ let delete tmp_file =+ match tmp_file with+ | None -> ()+ | Some x -> try Sys.remove x with Sys_error _ -> () in+ let tmp_file_deleted = ref false in+ try+ close_in inchan;+ close_out outchan;+ close_in errchan;+ let res = snd(Unix.waitpid [] pid) in+ tmp_file_deleted := true;+ delete tmp_file;+ res+ with+ | x when tmp_file <> None && !tmp_file_deleted = false ->+ delete tmp_file;+ raise x+(* ***)(*** execute *)(* XXX: Add test for non reentrancy *)@@ -130,10 +187,16 @@(*** add_job *)let add_job cmd rest result id =(*display begin fun oc -> fp oc "Job %a is %s\n%!" print_job_id id cmd; end;*)- let (stdout', stdin', stderr') = open_process_full cmd env in+ let (pid,stdout', stdin', stderr', tmp_file) =+ if Sys.win32 then open_process_full_win cmd env else+ let a,b,c = open_process_full cmd env in+ -1,a,b,c,None+ inincr jobs_active;- set_nonblock (doi stdout');- set_nonblock (doi stderr');+ if not Sys.win32 then (+ set_nonblock (doi stdout');+ set_nonblock (doi stderr');+ );let job ={ job_id = id;job_command = cmd;@@ -143,7 +206,9 @@job_stdin = stdin';job_stderr = stderr';job_buffer = Buffer.create 1024;- job_dying = false }+ job_dying = false;+ job_tmp_file = tmp_file;+ job_pid = pid }inoutputs := FDM.add (doi stdout') job (FDM.add (doi stderr') job !outputs);jobs := JS.add job !jobs;@@ -199,6 +264,7 @@tryread fd u 0 (Bytes.length u)with+ | Unix.Unix_error(Unix.EPIPE,_,_) when Sys.win32 -> 0| Unix.Unix_error(e,_,_) ->let msg = error_message e indisplay (fun oc -> fp oc@@ -241,14 +307,19 @@decr jobs_active;(* PR#5371: we would get EAGAIN below otherwise *)- clear_nonblock (doi job.job_stdout);- clear_nonblock (doi job.job_stderr);-+ if not Sys.win32 then (+ clear_nonblock (doi job.job_stdout);+ clear_nonblock (doi job.job_stderr);+ );do_read ~loop:true (doi job.job_stdout) job;do_read ~loop:true (doi job.job_stderr) job;outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs);jobs := JS.remove job !jobs;- let status = close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in+ let status =+ if Sys.win32 then+ close_process_full_win (job.job_pid, job.job_stdout, job.job_stdin, job.job_stderr, job.job_tmp_file)+ else+ close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) inlet shown = ref false in--- ./src/ocamlbuild_unix_plugin.ml+++ ./src/ocamlbuild_unix_plugin.ml@@ -48,12 +48,22 @@endlet run_and_open s kont =+ let s_orig = s in+ let s =+ (* Be consistent! My_unix.run_and_open uses My_std.sys_command and+ sys_command uses bash. *)+ if Sys.win32 = false then s else+ let l = match Lazy.force My_std.windows_shell |> Array.to_list with+ | hd::tl -> (Filename.quote hd)::tl+ | _ -> assert false in+ "\"" ^ (String.concat " " l) ^ " -ec " ^ Filename.quote (" " ^ s) ^ "\""+ inlet ic = Unix.open_process_in s inlet close () =match Unix.close_process_in ic with| Unix.WEXITED 0 -> ()| Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ ->- failwith (Printf.sprintf "Error while running: %s" s) in+ failwith (Printf.sprintf "Error while running: %s" s_orig) inlet res = trykont icwith e -> (close (); raise e)--- ./src/options.ml+++ ./src/options.ml@@ -174,11 +174,24 @@build_dir := Filename.concat (Sys.getcwd ()) selsebuild_dir := s++let slashify =+ if Sys.win32 then fun p -> String.map (function '\\' -> '/' | x -> x) p+ else fun p ->p++let sb () =+ match Sys.os_type with+ | "Win32" ->+ (try set_binary_mode_out stdout true with _ -> ());+ | _ -> ()++let spec = ref (let print_version () =+ sb ();Printf.printf "ocamlbuild %s\n%!" Ocamlbuild_config.version; raise Exit_OKin- let print_vnum () = print_endline Ocamlbuild_config.version; raise Exit_OK in+ let print_vnum () = sb (); print_endline Ocamlbuild_config.version; raise Exit_OK inArg.align["-version", Unit print_version , " Display the version";@@ -257,8 +270,8 @@"-build-dir", String set_build_dir, "<path> Set build directory (implies no-links)";"-install-lib-dir", Set_string Ocamlbuild_where.libdir, "<path> Set the install library directory";"-install-bin-dir", Set_string Ocamlbuild_where.bindir, "<path> Set the install binary directory";- "-where", Unit (fun () -> print_endline !Ocamlbuild_where.libdir; raise Exit_OK), " Display the install library directory";- "-which", String (fun cmd -> print_endline (find_tool cmd); raise Exit_OK), "<command> Display path to the tool command";+ "-where", Unit (fun () -> sb (); print_endline (slashify !Ocamlbuild_where.libdir); raise Exit_OK), " Display the install library directory";+ "-which", String (fun cmd -> sb (); print_endline (slashify (find_tool cmd)); raise Exit_OK), "<command> Display path to the tool command";"-ocamlc", set_cmd ocamlc, "<command> Set the OCaml bytecode compiler";"-plugin-ocamlc", set_cmd plugin_ocamlc, "<command> Set the OCaml bytecode compiler \used when building myocamlbuild.ml (only)";--- ./src/pathname.ml+++ ./src/pathname.ml@@ -84,6 +84,26 @@| x :: xs -> x :: normalize_list xslet normalize x =+ let x =+ if Sys.win32 = false then+ x+ else+ let len = String.length x in+ let b = Bytes.create len in+ for i = 0 to pred len do+ match x.[i] with+ | '\\' -> Bytes.set b i '/'+ | c -> Bytes.set b i c+ done;+ if len > 1 then (+ let c1 = Bytes.get b 0 in+ let c2 = Bytes.get b 1 in+ if c2 = ':' && c1 >= 'a' && c1 <= 'z' &&+ ( len = 2 || Bytes.get b 2 = '/') then+ Bytes.set b 0 (Char.uppercase_ascii c1)+ );+ Bytes.unsafe_to_string b+ inif Glob.eval not_normal_form_re x thenlet root, paths = split x injoin root (normalize_list paths)--- ./src/shell.ml+++ ./src/shell.ml@@ -24,12 +24,26 @@| 'a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '/' | '_' | ':' | '@' | '+' | ',' -> loop (pos + 1)| _ -> false inloop 0++let generic_quote quotequote s =+ let l = String.length s in+ let b = Buffer.create (l + 20) in+ Buffer.add_char b '\'';+ for i = 0 to l - 1 do+ if s.[i] = '\''+ then Buffer.add_string b quotequote+ else Buffer.add_char b s.[i]+ done;+ Buffer.add_char b '\'';+ Buffer.contents b+let unix_quote = generic_quote "'\\''"+let quote_filename_if_needed s =if is_simple_filename s then s(* We should probably be using [Filename.unix_quote] except that function* isn't exported. Users on Windows will have to live with not being able to* install OCaml into c:\o'caml. Too bad. *)- else if Sys.os_type = "Win32" then Printf.sprintf "'%s'" s+ else if Sys.os_type = "Win32" then unix_quote selse Filename.quote slet chdir dir =reset_filesys_cache ();@@ -37,7 +51,7 @@let run args target =reset_readdir_cache ();let cmd = String.concat " " (List.map quote_filename_if_needed args) in- if !*My_unix.is_degraded || Sys.os_type = "Win32" then+ if !*My_unix.is_degraded thenbeginLog.event cmd target Tags.empty;let st = sys_command cmd in
node_modules_esy*~
{"name": "esy-gmp","version": "6.2.0","description": "GMP packaged for esy","source": "https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz#0578d48607ec0e272177d175fd1807c30b00fdf2","override": {"buildsInSource": true,"build": ["find ./ -exec touch -t 200905010101 {} +","./configure --enable-fat --prefix=#{self.install} #{os == 'windows' ? '--host x86_64-w64-mingw32' : ''} --with-pic","make -j4"],"install": ["make install"],"exportedEnv": {"LDFLAGS": {"scope": "global","val": "-L#{self.lib} -lgmp"},"CPPFLAGS": {"scope": "global","val": "-I#{self.install / 'include'}"},"LD_LIBRARY_PATH": {"scope": "global","val": "#{self.lib}:$LD_LIBRARY_PATH"},"LIBRARY_PATH": {"scope": "global","val": "#{self.lib}:$LIBRARY_PATH"},"CPATH": {"scope": "global","val": "#{self.install / 'include'}:$CPATH"},"PKG_CONFIG_PATH": {"val": "#{self.lib / 'pkgconfig' : $PKG_CONFIG_PATH}","scope": "global"}}}}
{"name": "esy-gmp-test","description": "For manual testing only","version": "0.1.0","description": "GMP packaged for esy","license": "MIT","esy": {"buildsInSource": true,"build": ["#{os == 'windows' ? 'x86_64-w64-mingw32-gcc': 'gcc'} $CFLAGS -o testinggmp test.c $LDFLAGS"],"install": "cp testinggmp #{self.bin}"},"dependencies": {"gmp": "esy-packages/esy-gmp"}}
#include <gmp.h>#include <stdlib.h>#include <stdio.h>int main() {mpz_t i, j, k;mpz_init_set_str (i, "1a", 16);mpz_init (j);mpz_init (k);mpz_sqrtrem (j, k, i);if (mpz_get_si (j) != 5 || mpz_get_si (k) != 1) abort();printf("%s\n", "Works as expected");return 0;}
{"build": [["#{os == 'windows' ? 'x86_64-w64-mingw32-gcc' : 'cc'}","-c","${CFLAGS:--g}","$CPPFLAGS","$LDFLAGS","test.c"]],"dependencies": {"esy-gmp": "esy-packages/esy-gmp#e27cb300adfb0c0b320c273082c5affafcd225fa"}}
diff --git a/src/Makefile b/src/Makefileindex 8ad0e2c..d41d63c 100644--- a/src/Makefile+++ b/src/Makefile@@ -1,16 +1,16 @@-OCAMLC=ocamlc-OCAMLOPT=ocamlopt-OCAMLDEP=ocamldep-OCAMLMKLIB=ocamlmklib-OCAMLFIND=ocamlfind+OCAMLC=$(shell which ocamlc)+OCAMLOPT=$(shell which ocamlopt)+OCAMLDEP=$(shell which ocamldep)+OCAMLMKLIB=$(shell which ocamlmklib)+OCAMLFIND=$(shell which ocamlfind)INSTALL_DATA=install -m 644INSTALL_DLL=installINSTALL_DIR=install -dSTDLIBDIR=$(shell $(OCAMLC) -where)DESTDIR ?=-include $(STDLIBDIR)/Makefile.config+include $(STDLIBDIR)/Makefile.configifeq "$(filter i386 amd64 arm64 power,$(ARCH))" ""# Unsupported architectureBNG_ARCH=generic@@ -86,14 +86,14 @@ endifVERSION=$(shell sed -ne 's/^ *version *: *"\([^"]*\)".*$$/\1/p' ../num.opam)install:- $(INSTALL_DIR) $(DESTDIR)$(STDLIBDIR)+ $(INSTALL_DIR) $(LIBDIR)sed -e 's/%%VERSION%%/$(VERSION)/g' META.in > META$(OCAMLFIND) install num METArm -f META- $(INSTALL_DATA) $(TOINSTALL) $(DESTDIR)$(STDLIBDIR)+ $(INSTALL_DATA) $(TOINSTALL) $(LIBDIR)ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true"- $(INSTALL_DIR) $(DESTDIR)$(STDLIBDIR)/stublibs- $(INSTALL_DLL) $(TOINSTALL_STUBS) $(DESTDIR)$(STDLIBDIR)/stublibs+ $(INSTALL_DIR) $(LIBDIR)/stublibs+ $(INSTALL_DLL) $(TOINSTALL_STUBS) $(LIBDIR)/stublibsendiffindlib-install:@@ -105,9 +105,9 @@ findlib-uninstall:$(OCAMLFIND) remove numuninstall: findlib-uninstall- cd $(DESTDIR)$(STDLIBDIR) && rm -f $(TOINSTALL)+ cd $(LIBDIR) && rm -f $(TOINSTALL)ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true"- cd $(DESTDIR)$(STDLIBDIR)/stublibs && rm -f $(TOINSTALL_STUBS)+ cd $(LIBDIR)/stublibs && rm -f $(TOINSTALL_STUBS)endifclean:
{"buildsInSource": true,"build": [["make"]],"install": [["make","LIBDIR=#{self.install / 'lib'}","findlib-install"]],"exportedEnv": {"CAML_LD_LIBRARY_PATH": {"val": "#{self.install / 'lib' / 'num' : $CAML_LD_LIBRARY_PATH}","scope": "global"}},"dependencies": {"ocaml": "*","@opam/ocamlfind": "*"}}
--- ./Makefile+++ ./Makefile@@ -271,7 +271,7 @@echo ' "ocamlbuild.byte" {"ocamlbuild.byte"}' >> ocamlbuild.installifeq ($(OCAML_NATIVE), true)echo ' "ocamlbuild.native" {"ocamlbuild.native"}' >> ocamlbuild.install- echo ' "ocamlbuild.native" {"ocamlbuild"}' >> ocamlbuild.install+ echo " \"ocamlbuild.native\" {\"ocamlbuild${EXE}\"}" >> ocamlbuild.installelseecho ' "ocamlbuild.byte" {"ocamlbuild"}' >> ocamlbuild.installendif
From ea077c8ace1fc9f59afd915327f3b1d0de36fb8c Mon Sep 17 00:00:00 2001From: Manas Jayanth <3097018+ManasJayanth@users.noreply.github.com>Date: Fri, 28 Jan 2022 01:44:03 +0530Subject: [PATCH] Patch missing win32 implementation for gettimeofday---src/time_now_stubs.c | 32 +++++++++++++++++++++++++++++++-1 file changed, 31 insertions(+), 1 deletion(-)diff --git a/src/time_now_stubs.c b/src/time_now_stubs.cindex e08d72c..dce49f9 100644--- a/src/time_now_stubs.c+++ b/src/time_now_stubs.c@@ -5,7 +5,7 @@#define NANOS_PER_SECOND 1000000000-#if defined(JSC_POSIX_TIMERS)+#if defined(JSC_TIMESPEC)/* Note: this is imported noalloc if (and only if) ARCH_SIXTYFOUR is defined.* This is OK because caml_alloc_int63 doesn't actually allocate in that case. */@@ -21,9 +21,39 @@ CAMLprim value time_now_nanoseconds_since_unix_epoch_or_zero()#else+#if (defined(WIN32) || defined(_WIN32))+// Credit: https://stackoverflow.com/questions/10905892/equivalent-of-gettimeday-for-windows+#include <Windows.h>+#include <stdint.h> // portable: uint64_t MSVC: __int64++int gettimeofday(struct timeval * tp, struct timezone * tzp)+{+ // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's+ // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC)+ // until 00:00:00 January 1, 1970+ static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);++ SYSTEMTIME system_time;+ FILETIME file_time;+ uint64_t time;++ GetSystemTime( &system_time );+ SystemTimeToFileTime( &system_time, &file_time );+ time = ((uint64_t)file_time.dwLowDateTime ) ;+ time += ((uint64_t)file_time.dwHighDateTime) << 32;++ tp->tv_sec = (long) ((time - EPOCH) / 10000000L);+ tp->tv_usec = (long) (system_time.wMilliseconds * 1000);+ return 0;+}++#else+#include <sys/types.h>#include <sys/time.h>+#endif+CAMLprim value time_now_nanoseconds_since_unix_epoch_or_zero(){struct timeval tp;--2.34.1.windows.1
{"build": [["bash","-c","patch -p1 < 0001-Patch-missing-win32-implementation-for-gettimeofday.patch"],["dune","build","-p","time_now","-j","4"]]}
{"build": ["#{os == 'windows' ? 'env CC=x86_64-w64-mingw32-gcc ': ''}./configure","make"],"install": ["make install"],"exportedEnv": {"CAML_LD_LIBRARY_PATH": {"val": "#{self.lib / 'zarith' : $CAML_LD_LIBRARY_PATH}","scope": "global"}},"dependencies": {"ocaml": "*","@opam/conf-gmp": "*"}}
"comma": {"flake": false,"locked": {"lastModified": 1605805720,"narHash": "sha256-+Qtn8mU6sDbBvhBuoRnMMhxgphkmnekd6VYIOHm2LOg=","owner": "fzakaria","repo": "comma","rev": "86b0a9d35c978d4f4aa14a897b6e1320fc996337","type": "github"},"original": {"owner": "fzakaria","ref": "check-local-index","repo": "comma","type": "github"}},"darwin": {"inputs": {"nixpkgs": ["dotsnix","nixpkgs"]},"locked": {"lastModified": 1645293039,"narHash": "sha256-PwdDu+SkX8dreeuJ/4av1sEluNZdrpdXv8JsRKKg1Yc=","owner": "lnl7","repo": "nix-darwin","rev": "1df878b6f8351795a3bebfbe4fd2d02e1e8b29d6","type": "github"},"original": {"owner": "lnl7","repo": "nix-darwin","type": "github"}},"deploy-rs": {"inputs": {"flake-compat": "flake-compat","nixpkgs": ["dotsnix","nixpkgs"],"utils": "utils"},"locked": {"lastModified": 1643787431,"narHash": "sha256-8IwuVgXulRE3ZWq6z8mytarawC32pKPKR20EyDtSH+w=","owner": "serokell","repo": "deploy-rs","rev": "4154ba1aaaf7333a916384c348d867d03b6f1409","type": "github"},"original": {"owner": "serokell","repo": "deploy-rs","type": "github"}},"dotsnix": {"inputs": {"comma": "comma","darwin": "darwin","deploy-rs": "deploy-rs","flake-registry": "flake-registry","home-manager": "home-manager","nixos-hardware": "nixos-hardware","nixos-stable": "nixos-stable","nixpkgs": "nixpkgs","nixpkgs-stable-darwin": "nixpkgs-stable-darwin","nur": "nur","ocaml-overlays": "ocaml-overlays","sops-nix": "sops-nix","utils": "utils_2"},"locked": {"lastModified": 1649249728,"narHash": "sha256-xsg02WrNbUYsCC5/TVoYLoqMAD/8ExVfL7m93qztGv4=","owner": "quartz55","repo": "dotsnix","rev": "b1811f495401dd5008761770b1bed7bf42aa2491","type": "github"},"original": {"owner": "quartz55","repo": "dotsnix","type": "github"}},"flake-compat": {"flake": false,"locked": {"lastModified": 1641205782,"narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=","owner": "edolstra","repo": "flake-compat","rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7","type": "github"},"original": {"owner": "edolstra","repo": "flake-compat","type": "github"}},"flake-registry": {"flake": false,"locked": {"lastModified": 1644873853,"narHash": "sha256-dyXxs6wh1uqCPaXfAc3PAnxeRbEFg4Bikza3Aqq0YVw=","owner": "NixOS","repo": "flake-registry","rev": "8d4ec27c73f33091e3b4b50ee89f38f73b946626","type": "github"},"original": {"owner": "NixOS","repo": "flake-registry","type": "github"}},"home-manager": {"inputs": {"nixpkgs": ["dotsnix","nixpkgs"]},"locked": {"lastModified": 1645746341,"narHash": "sha256-j4fTWByYMGSSl0P7HEJQmbU/ifJtW25n/SoF6hgXN8c=","owner": "nix-community","repo": "home-manager","rev": "650cfe60f31f3d27ba869bf7db12ca8ded5f1d74","type": "github"},"original": {"owner": "nix-community","repo": "home-manager","type": "github"}},"nixos-hardware": {"locked": {"lastModified": 1645346782,"narHash": "sha256-3qd0cu+2kapIP7cdHW9n8zh1wCvRGg83K7/cCj5Xv+A=","owner": "NixOS","repo": "nixos-hardware","rev": "1ccfe243aa6e94bf80f2a66f6be41d086d37fc87","type": "github"},"original": {"owner": "NixOS","repo": "nixos-hardware","type": "github"}},"nixos-stable": {"locked": {"lastModified": 1645652565,"narHash": "sha256-yVQN2Wi8xSSpuj6JTck/6IOJ40hNvmoReMvFY86xd9w=","owner": "nixos","repo": "nixpkgs","rev": "4275a321beab5a71872fb7a5fe5da511bb2bec73","type": "github"},"original": {"owner": "nixos","ref": "nixos-21.11","repo": "nixpkgs","type": "github"}},
"nixpkgs-stable-darwin": {"locked": {"lastModified": 1645635047,"narHash": "sha256-4+hYwKZ9lf48Yb6PKmWERoKjvFcf9KIzWkVPiawcK/8=","owner": "nixos","repo": "nixpkgs","rev": "759e24c7d9169ec798107246b5117a997f27e5dc","type": "github"},"original": {"owner": "nixos","ref": "nixpkgs-21.11-darwin","repo": "nixpkgs","type": "github"}},"nixpkgs_2": {"locked": {"lastModified": 1648219316,"narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=","owner": "nixos","repo": "nixpkgs","rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634","type": "github"},"original": {"owner": "nixos","ref": "nixpkgs-unstable","repo": "nixpkgs","type": "github"}},"nur": {"locked": {"lastModified": 1645772197,"narHash": "sha256-OoZVfnWV8CV6MH5AxLMJterUp2iaf1CYRSVb8MN0GUQ=","owner": "nix-community","repo": "NUR","rev": "fdbe6965f82f14561f1b0f1e800ad092799d5409","type": "github"},"original": {"owner": "nix-community","repo": "NUR","type": "github"}},
"rev": "348a9b5bf2d19ad85be200974f531ae299fc76cc",
"rev": "e9815a3c08a50bceacb79f8cb05f3ca21d3766fd","type": "github"},"original": {"owner": "anmonteiro","repo": "nix-overlays","type": "github"}},"ocaml-overlays_2": {"flake": false,"locked": {"lastModified": 1649116256,"narHash": "sha256-AYqLAr2C9Wmv1bEeZp4LrjdjgIZasl8FEghQAI9Mmjg=","owner": "anmonteiro","repo": "nix-overlays","rev": "12f7fdd63aa7aee942dcb320b2ba7d2f2add8381",
"ocaml-overlays": "ocaml-overlays","utils": "utils"
"ocaml-overlays": "ocaml-overlays_2","utils": "utils_3"}},"sops-nix": {"inputs": {"nixpkgs": ["dotsnix","nixpkgs"]},"locked": {"lastModified": 1645434840,"narHash": "sha256-C8gH2YOtk8atRRpmEZUGpvDUNfNXFtftobvYdNFqdHI=","owner": "Mic92","repo": "sops-nix","rev": "cda46de69a7acef8df1ac07d27c2c2b1a8be8f21","type": "github"},"original": {"owner": "Mic92","repo": "sops-nix","type": "github"
"type": "github"},"original": {"owner": "numtide","repo": "flake-utils","type": "github"}},"utils_2": {"locked": {"lastModified": 1644229661,"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=","owner": "numtide","repo": "flake-utils","rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
},"utils_3": {"locked": {"lastModified": 1648297722,"narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=","owner": "numtide","repo": "flake-utils","rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade","type": "github"},"original": {"owner": "numtide","repo": "flake-utils","type": "github"}
letpkgs = import nixpkgs {inherit system;};anmonteiro = import nixpkgs {inherit system;overlays = [ (import ocaml-overlays) ];};# some symlink/relative path shenanigans happening 🤷esy = pkgs.writeShellScriptBin "esy" "${pkgs.nodePackages.esy}/lib/node_modules/.bin/esy $@";inrec {packages = {discopotty = pkgs.callPackage ./. { inherit pkgs; };docker = pkgs.dockerTools.buildImage {name = "discopotty";config = {Cmd = [ "${packages.discopotty}/bin/discopotty" ];};};};defaultPackage = packages.discopotty;apps = {discopotty = utils.lib.mkApp { drv = packages.discopotty; };};defaultApp = apps.discopotty;devShell = pkgs.mkShell {nativeBuildInputs = with pkgs; [ pkg-config ];buildInputs = with pkgs; [esyffmpegyoutube-dlopamanmonteiro.ocaml-ng.ocamlPackages_4_12.carl];
letpkgs = import nixpkgs {inherit system;overlays = dotsnix.overlays;};anmonteiro = import nixpkgs {inherit system;overlays = [ (import ocaml-overlays) ];};# some symlink/relative path shenanigans happening 🤷esy = pkgs.writeShellScriptBin "esy" "${pkgs.nodePackages.esy}/lib/node_modules/.bin/esy $@";inrec {packages = {discopotty = pkgs.callPackage ./. { inherit pkgs; };docker = pkgs.dockerTools.buildImage {name = "discopotty";config = {Cmd = [ "${packages.discopotty}/bin/discopotty" ];
}
};};defaultPackage = packages.discopotty;apps = {discopotty = utils.lib.mkApp { drv = packages.discopotty; };};defaultApp = apps.discopotty;devShell = pkgs.mkShell {nativeBuildInputs = with pkgs; [ pkg-config ];buildInputs = with pkgs; [esyffmpegyoutube-dlopambabeltrace2];};}
(*4000 `Unknown_error4001 `Unknown_opcode4002 `Decode_error4003 `Not_authenticated4004 `Authentication_failed4005 `Already_authenticated4007 `Invalid_seq4008 `Rate_limited4009 `Session_timed_out4010 `Invalid_shard4011 `Sharding_required4012 `Invalid_API_version4013 `Invalid_intents4014 `Disallowed_intents*)type discord =[ `Unknown_error| `Unknown_opcode| `Decode_error| `Not_authenticated| `Authentication_failed| `Already_authenticated| `Invalid_seq| `Rate_limited| `Session_timed_out| `Invalid_shard| `Sharding_required| `Invalid_API_version| `Invalid_intents| `Disallowed_intents ]type t = [ Websocket.Close_code.standard | discord ]let is_discord = function #discord -> true | _ -> falselet is_std = function #Websocket.Close_code.standard -> true | _ -> falselet to_int = function| #Websocket.Close_code.standard as c -> Websocket.Close_code.to_int c| `Unknown_error -> 4000| `Unknown_opcode -> 4001| `Decode_error -> 4002| `Not_authenticated -> 4003| `Authentication_failed -> 4004| `Already_authenticated -> 4005| `Invalid_seq -> 4007| `Rate_limited -> 4008| `Session_timed_out -> 4009| `Invalid_shard -> 4010| `Sharding_required -> 4011| `Invalid_API_version -> 4012| `Invalid_intents -> 4013| `Disallowed_intents -> 4014let of_close_code_exn = function| #Websocket.Close_code.standard as c -> c| `Other 4000 -> `Unknown_error| `Other 4001 -> `Unknown_opcode| `Other 4002 -> `Decode_error| `Other 4003 -> `Not_authenticated| `Other 4004 -> `Authentication_failed| `Other 4005 -> `Already_authenticated| `Other 4007 -> `Invalid_seq| `Other 4008 -> `Rate_limited| `Other 4009 -> `Session_timed_out| `Other 4010 -> `Invalid_shard| `Other 4011 -> `Sharding_required| `Other 4012 -> `Invalid_API_version| `Other 4013 -> `Invalid_intents| `Other 4014 -> `Disallowed_intents| `Other c -> failwith (Printf.sprintf "unknown voice close code: %d" c)let pp =let pp' fmt = function(* TODO @quartz55 *)| `Unknown_error -> Format.fprintf fmt ""| `Unknown_opcode -> Format.fprintf fmt ""| `Decode_error -> Format.fprintf fmt ""| `Not_authenticated -> Format.fprintf fmt ""| `Authentication_failed -> Format.fprintf fmt ""| `Already_authenticated -> Format.fprintf fmt ""| `Invalid_seq -> Format.fprintf fmt ""| `Rate_limited -> Format.fprintf fmt ""| `Session_timed_out -> Format.fprintf fmt ""| `Invalid_shard -> Format.fprintf fmt ""| `Sharding_required -> Format.fprintf fmt ""| `Invalid_API_version -> Format.fprintf fmt ""| `Invalid_intents -> Format.fprintf fmt ""| `Disallowed_intents -> Format.fprintf fmt ""infun fmt t ->match t with| #Websocket.Close_code.standard as c -> Websocket.Close_code.pp fmt c| #discord as t -> Format.fprintf fmt "(%d %a)" (to_int t) pp' tlet is_recoverable : t -> bool = function| `Authentication_failed | `Invalid_shard | `Sharding_required| `Invalid_API_version | `Invalid_intents | `Disallowed_intents| #Websocket.Close_code.standard ->false| _ -> true
module Token_bucket = Lf_token_bucketmodule Subs = structtype t = { mtx : Eio_mutex.t; mutable st : state }and state =| Waiting of (unit Promise.t * unit Promise.u)| Serving of sub listand sub = Events.t -> unitlet make () = { mtx = Eio_mutex.make (); st = Waiting (Promise.create ()) }let sub ~fn t =Eio_mutex.with_ t.mtx @@ fun () ->match t.st with| Waiting (_, u) ->t.st <- Serving [ fn ];Promise.resolve u ()| Serving s -> t.st <- Serving (fn :: s)let rec pub ~sw t v =Eio_mutex.lock t.mtx;match t.st with| Waiting (p, _) ->Eio_mutex.unlock t.mtx;Promise.await p;pub ~sw t v| Serving s ->List.iter (fun fn -> Fiber.fork ~sw (fun () -> fn v)) s;Eio_mutex.unlock t.mtxend
let connect ?(max_concurrency = 1) ~token url =let open Lwt_result.Syntax in(* docs: identify requests allowed per 5 seconds *)let rate = 1. /. (float max_concurrency /. 5.) inlet id_bucket = Token_bucket.make ~capacity:max_concurrency rate inlet+ main = Session.create ~id_bucket token (Uri.of_string url) inlet user = Session.user main inlet shards = [ main ] inlet ev_rx = List.map Session.events shards |> Lwt_pipe.Reader.merge_all inlet src, snk = Mpmc.make () inlet rec fwd () =Lwt_pipe.read ev_rx >>= function| Some v -> Mpmc.Source.write src v >>= fwd| None -> Mpmc.Source.close src
let connect ~sw ~net ~dmgr:_ ?(max_concurrency = 1) ~token url =assert (max_concurrency > 0);let p, u = Promise.create () inlet spawn () : no_return =Switch.run @@ fun sw ->(* docs: identify requests allowed per 5 seconds *)let rate = 1. /. (float max_concurrency /. 5.) inlet id_bucket = Token_bucket.make ~capacity:max_concurrency rate inlet subs = Subs.make () inlet fwd = Subs.pub ~sw subs inlet main =Session.create ~sw ~net ~id_bucket ~fwd token (Uri.of_string url)inlet user = Session.user main in(* TODO @quartz55: multiple shards using domains *)(* TODO @quartz55: max_concurrency "bucket" handling *)let shards = [ main ] inlet t ={user;subs;shards = List.map (fun s -> (Eio_mutex.make (), s)) shards;dead = Promise.create ();}inPromise.resolve u t;Promise.await (fst t.dead);t.shards|> List.map (fun (mtx, sess) () ->Eio_mutex.with_ mtx @@ fun () -> Session.disconnect sess)|> Fiber.all;raise Exit
open! Globalsopen Eio.Stdmodule L = (val Relog.logger ~namespace:__MODULE__ ())module type IO = sigtype sockettype addrval read :socket -> Bigstringaf.t -> off:int -> len:int -> [ `Eof | `Ok of int ](** The region [(off, off + len)] is where read bytes can be written to *)val writev :socket -> Faraday.bigstring Faraday.iovec list -> [ `Closed | `Ok of int ]val shutdown_send : socket -> unitval shutdown_receive : socket -> unitval close : socket -> unitendmodule type Client = sigtype ttype socketval create :sw:Switch.t ->read_buffer_size:int ->protocol:'t Gluten.runtime ->'t ->socket ->tval upgrade : t -> Gluten.impl -> unitval shutdown : t -> unitval is_closed : t -> boolendmodule Qe = Ke.Rke.Weightedmodule Buffer = structtype t = (char, Bigarray.int8_unsigned_elt) Qe.tlet create capacity =let queue, _ = Qe.create ~capacity Bigarray.char inqueuelet get t ~f =match Qe.N.peek t with| [] -> f Bigstringaf.empty ~off:0 ~len:0| [ slice ] ->assert (Bigstringaf.length slice = Qe.length t);let n = f slice ~off:0 ~len:(Bigstringaf.length slice) inQe.N.shift_exn t n;n| _ :: _ ->(* Should never happen because we compress on every `put`, and therefore* the Queue never wraps around to the beginning. *)assert falselet blit _src _off _dst _dst_off _len = ()let linger t = Qe.length tlet put t ~f =Qe.compress t;let buffer = Qe.unsafe_bigarray t inmatch f buffer ~off:(Qe.length t) ~len:(Qe.available t) with| `Eof -> `Eof| `Ok n as ret ->(* Increment the offset, without making a copy *)let (_ : ('a, 'b) Qe.N.bigarray list) =Qe.N.push_exn t ~blit ~length:(fun _ -> n) bufferinretendmodule IO_loop = structlet start :type t fd.(module IO with type socket = fd) ->(module Gluten.RUNTIME with type t = t) ->t ->read_buffer_size:int ->fd ->unit =fun (module Io) (module Runtime) t ~read_buffer_size socket ->let read_buffer = Buffer.create read_buffer_size inlet rec read_loop ?(linger = None) () =match Runtime.next_read_operation t with| `Read -> (L.trace (fun m -> m "read_loop: read");let res =match linger with| Some r ->Fiber.yield ();r| None -> Buffer.put ~f:(Io.read socket) read_bufferinmatch res with| `Eof ->L.trace (fun m -> m "read_loop: read EOF");let n =Buffer.get read_buffer ~f:(fun bigstring ~off ~len ->Runtime.read_eof t bigstring ~off ~len)inL.trace (fun m -> m "read_loop: runtime read EOF %d" n);let linger =if n <> 0 && Buffer.linger read_buffer > 0 then Some `Eofelse Noneinread_loop ~linger ()| `Ok n ->L.trace (fun m -> m "read_loop: read %d" n);let n2 =Buffer.get read_buffer ~f:(fun bigstring ~off ~len ->L.trace (fun m -> m "read_loop: buffer get %d" len);Runtime.read t bigstring ~off ~len)inL.trace (fun m -> m "read_loop: runtime read %d" n2);let l = Buffer.linger read_buffer inlet linger = if n2 <> 0 && l > 0 then Some (`Ok l) else None inread_loop ~linger ())| `Yield ->let p, u = Promise.create () inL.trace (fun m -> m "read_loop: yield");Runtime.yield_reader t (Promise.resolve u);Promise.await p;read_loop ()| `Close ->L.trace (fun m -> m "read_loop: close");Io.shutdown_receive socketinlet rec write_loop () =match Runtime.next_write_operation t with| `Write io_vectors ->L.trace (fun m -> m "write_loop: write");Io.writev socket io_vectors |> Runtime.report_write_result t;write_loop ()| `Yield ->let p, u = Promise.create () inL.trace (fun m -> m "write_loop: yield");Runtime.yield_writer t (Promise.resolve u);Promise.await p;write_loop ()| `Close n ->L.trace (fun m -> m "write_loop: close %d" n);Io.shutdown_send socketinlet run () =Fiber.first(fun () ->try read_loop () with| Eio.Cancel.Cancelled _ as e -> raise e| exn ->L.warn (fun m -> m "error reading: %a" Fmt.exn exn);Runtime.report_exn t exn;raise exn)(fun () ->try write_loop () with| Eio.Cancel.Cancelled _ as e -> raise e| exn ->L.warn (fun m -> m "error writing: %a" Fmt.exn exn);Runtime.report_exn t exn;raise exn)inFun.protect~finally:(fun () ->L.trace (fun m -> m "io_loop: done");Io.close socket)runendmodule MakeClient (Io : IO) : Client with type socket = Io.socket = structmodule Client_connection = Gluten.Clienttype socket = Io.sockettype t = { connection : Client_connection.t; socket : socket }let create ~sw ~read_buffer_size ~protocol t socket =let connection = Client_connection.create ~protocol t inFiber.fork ~sw (fun () ->IO_loop.start(module Io)(module Client_connection)connection ~read_buffer_size socket);{ connection; socket }let upgrade t protocol =Client_connection.upgrade_protocol t.connection protocollet shutdown t =L.trace (fun m -> m "shutting client down");Client_connection.shutdown t.connection;Io.close t.socketlet is_closed t = Client_connection.is_closed t.connectionendmodule Eio_io :IO with type socket = eio_socket and type addr = Eio.Net.Sockaddr.t = structtype socket = eio_sockettype addr = Eio.Net.Sockaddr.tlet read socket bigstring ~off ~len =L.trace (fun m -> m "reading up to %dB from eio socket" (len - off));let buf = Cstruct.of_bigarray bigstring ~off ~len inmatch Eio.Flow.read socket buf with| got ->L.trace (fun m -> m "read %dB" got);`Ok got| (exception End_of_file) | (exception Eio.Net.Connection_reset _) ->L.trace (fun m -> m "EOF");`Eoflet writev socket iovecs =L.trace (fun m -> m "writting %d iovecs to eio socket" (List.length iovecs));let source =iovecs|> List.map (fun { Faraday.buffer; off; len } ->Cstruct.of_bigarray buffer ~off ~len)|> Eio.Flow.cstruct_sourceintryEio.Flow.copy source socket;let n =iovecs |> List.fold_left (fun n { Faraday.len; _ } -> n + len) 0inL.trace (fun m -> m "wrote %dB to eio socket" n);`Ok nwith Unix.Unix_error (Unix.EPIPE, _, _) -> `Closedlet shutdown socket cmd =try Eio.Flow.shutdown socket cmdwith Unix.Unix_error (Unix.ENOTCONN, _, _) -> ()let shutdown_send socket =L.trace (fun m -> m "shutdown_send eio socket");shutdown socket `Sendlet shutdown_receive socket =L.trace (fun m -> m "shutdown_receive eio socket");shutdown socket `Receivelet close socket =L.trace (fun m -> m "closing eio socket");shutdown socket `Allendmodule Client = MakeClient (Eio_io)
type t = {
module type T = sigtype tval gen : unit -> tval eq : t -> t -> boolendmodule Unit = structtype t = unitlet gen () = ()let eq _ _ = trueendmodule Int = structtype t = intlet gen =let st = Random.State.make_self_init () infun () -> Random.State.bits stlet eq = Int.equalendtype 'a t = {
let cancel { cancel; _ } = cancel ()let make ?err fn interval =let err =Option.get_or~default:(fun () -> failwith "no ACK of last heartbeat received")errinlet stub = Fun.const () in
let make (type a) ~sw ?err ~(t : (module T with type t = a)) (fn : a -> unit)interval : a t =(* TODO @quartz55: feels like the wrong way to do this *)let module T = (val t) inlet module T : T with type t := T.t = T inlet err = Option.get_or ~default:(fun () -> raise Missed_ACK) err inlet stub _ = () in
let () = fn () inlet p_preempt, u_preempt = Lwt.wait () inlet p_sleep = Lwt_unix.sleep out.interval |> Lwt.map (Fun.const `Sleep) inout.ack <- (fun () -> acked := true);
let nonce = T.gen () inlet () = fn nonce inlet p_preempt, u_preempt = Promise.create () inlet p_sleep () =Eio_unix.sleep out.interval;`Sleepinout.ack <- (fun n -> if not !acked then acked := T.eq nonce n);
if Lwt.is_sleeping p_preempt thenLwt.wakeup_later u_preempt (`Preempt interval));let* r = Lwt.pick [ p_sleep; p_preempt ] in
if not @@ Promise.is_resolved p_preempt thenPromise.resolve u_preempt (`Preempt interval));let r = Fiber.first p_sleep (fun () -> Promise.await p_preempt) in
open Containersopen Lwt.Infix
open! Globalsmodule L = (val Relog.logger ~namespace:__MODULE__ ())module F = Relog.Fieldmodule Client = Http_clientlet user_agent = "discopotty (github.com/quartz55/discopotty-re, v0.0.1)"
let user_agent = "discopotty (github.com/quartz55/discopotty-re, v0.0.1)"let base_url = "https://discord.com"let base_uri = Uri.of_string base_urllet create ?(version = Versions.Http.V8) token =let open Lwt_result.Syntax inlet+ client =Piaf.Client.create~config:{Piaf.Config.default withfollow_redirects = true;allow_insecure = true;}base_uri|> Lwt_result.map_err Error.of_httpin
let create ~sw ~net ?(version = Versions.Http.V8) token =let client = Client.create ~sw ~net () in
let* res = Piaf.Client.request client ~headers ?body ~meth target inif Piaf.Status.is_successful res.status then Lwt.return (Ok res)
let res, body = Client.call client ~headers ?body ~meth target inif Httpaf.Status.is_successful res.status then Ok (res, body)
m "http request failed %a@.%a" ApiError.pp err Piaf.Response.pp_hum res);Lwt.return (Error.msgf "discord http error: %a" ApiError.pp err)
m "http request failed %a@.%a" ApiError.pp err Httpaf.Response.pp_humres);Error err
let open Lwt_result.Syntax inlet* res = get "/gateway/bot" t inlet* body = Piaf.Body.to_string res.body inResult.guard (fun () ->let raw = Yojson.Safe.from_string body inR.gateway_info_of_yojson raw)|> Result.map_err Error.of_exn|> Lwt.return
let open Result inlet+ _, body = get "/gateway/bot" t inlet body = Bigstringaf.to_string body inlet raw = Yojson.Safe.from_string body inR.gateway_info_of_yojson raw
m "Couldn't get gateway url from API, using fallback (%s):@.%a"fallback_gw_url Piaf.Error.pp_hum e);
m "Couldn't get gateway url from API, using fallback (%s): %a"fallback_gw_url ApiError.pp e);gateway_info| exception e ->L.warn (fun m ->m "Couldn't get gateway url from API, using fallback (%s): %s@.%s"fallback_gw_url (Printexc.to_string e)(Printexc.get_backtrace ()));
open! Globalsmodule L = (val Relog.logger ~namespace:__MODULE__ ())module F = Relog.Fieldmodule Http_client = Httpaf_eio.Client (Gluten_eio.Client)module Headers = structinclude Httpaf.Headerslet canonicalize ~body_length ~host t =let h = add_unless_exists t "Host" host inmatch body_length with| `Fixed n -> add_unless_exists h "content-length" (Int64.to_string n)| `Chunked -> add_unless_exists h "transfer-encoding" "chunked"| `Close_delimited -> add_unless_exists h "connection" "close"| `Error _ | `Unknown -> hendmodule Status = structinclude Httpaf.Statuslet is_permanent_redirection = function| `Moved_permanently(* https://tools.ietf.org/html/rfc7538#section-3 *)| `Code 308 ->true| _ -> falseendexception Http_error of stringexception Invalid_scheme of stringlet base_url = "https://discord.com"let base_uri = Uri.of_string base_urltype t = {net : Eio.Net.t;sw : Switch.t;mutable uri : Uri.t;mutable base_path : string;}type conn = { http : Http_client.t; socket : eio_socket; info : conn_info }and conn_info = {host : string;port : int;tls : bool;addrs : Gluten_eio.Eio_io.addr list;}let conn_info uri =let tls =match Uri.scheme uri with| Some "http" -> false| Some "https" | None -> true| Some scheme -> raise @@ Invalid_scheme schemeinlet host = Uri.host uri |> Option.get_exn inlet port = Uri.port uri |> Option.get_or ~default:(if tls then 443 else 80) inlet addrs =Unix.getaddrinfo host (Int.to_string port)Unix.[ AI_CANONNAME; AI_PROTOCOL 6; AI_FAMILY PF_INET ]|> List.map (fun addr ->match addr.Unix.ai_addr with| Unix.ADDR_INET (inetaddr, port) ->`Tcp (Eio_unix.Ipaddr.of_unix inetaddr, port)| ADDR_UNIX name -> `Unix name)in{ host; port; tls; addrs }let connect_tls ~sw host flow =L.trace (fun m -> m "configuring TLS client");let null ?ip:_ ~host:_ _certs = Ok None inlet host =Domain_name.of_string_exn host |> Domain_name.host |> Option.of_resultinlet cfg = Tls.Config.client ~authenticator:null () inL.trace (fun m -> m "performing TLS handshake for socket");let out = Tls_eio.client_of_flow ~sw ?host cfg flow in(out :> eio_socket)let open_socket ~sw ~net ?(tls = false) ?(port = if tls then 443 else 80) host =let rec inner = function| addr :: xs -> (L.trace (fun m -> m "trying %a" Eio.Net.Sockaddr.pp addr);try Eio.Net.connect ~sw net addr with _ -> inner xs)| [] ->raise@@ Invalid_argument(Format.sprintf "couldn't connect socket to %s:%d" host port)inlet addrs =Unix.getaddrinfo host (Int.to_string port) [ Unix.(AI_FAMILY PF_INET) ]|> List.map (fun addr ->match addr.Unix.ai_addr with| Unix.ADDR_INET (inetaddr, port) ->`Tcp (Eio_unix.Ipaddr.of_unix inetaddr, port)| ADDR_UNIX name -> `Unix name)inL.trace (fun m -> m "connecting socket");let flow = inner addrs inif tls then connect_tls ~sw host flow else flowlet create_conn t uri =let info = conn_info uri inlet socket =open_socket ~sw:t.sw ~net:t.net ~tls:info.tls ~port:info.port info.hostinlet http = Http_client.create_connection ~sw:t.sw socket in{ http; socket; info }let drain body =let p, u = Promise.create () inlet on_eof = Promise.resolve u inlet rec on_read _bs ~off:_ ~len:_ =Httpaf.Body.Reader.schedule_read body ~on_read ~on_eofinHttpaf.Body.Reader.schedule_read body ~on_read ~on_eof;Promise.await p;Httpaf.Body.Reader.close bodylet read_body body =let buf = Faraday.create 1024 inlet p, u = Promise.create () inlet on_eof = Promise.resolve u inlet rec on_read bs ~off ~len =Faraday.schedule_bigstring buf bs ~off ~len;Httpaf.Body.Reader.schedule_read body ~on_read ~on_eofinHttpaf.Body.Reader.schedule_read body ~on_read ~on_eof;Promise.await p;Httpaf.Body.Reader.close body;Faraday.serialize_to_bigstring buflet rec handle t ?(uri = t.uri) ?(body = Bigstringaf.empty) req =let conn = create_conn t uri inlet p, u = Promise.create () inlet error_handler = function| `Malformed_response msg -> Promise.resolve_error u @@ Http_error msg| `Invalid_response_body_length _res ->Promise.resolve_error u @@ Http_error "invalid response body length"| `Exn exn -> Promise.resolve_error u exninlet response_handler res res_body = Promise.resolve_ok u (res, res_body) inlet body_length = `Fixed (Bigstringaf.length body |> Int64.of_int) inlet canonical_headers =Headers.canonicalize ~body_length ~host:conn.info.hostreq.Httpaf.Request.headersinlet req_body =Http_client.request ~flush_headers_immediately:true ~error_handler~response_handler conn.http{ req with headers = canonical_headers }inif Bigstringaf.length body > 0 then (L.trace (fun m -> m "scheduling request body for writing");Httpaf.Body.Writer.schedule_bigstring req_body body);Httpaf.Body.Writer.close req_body;L.trace (fun m -> m "req: %a" Httpaf.Request.pp_hum req);let res, res_body = Promise.await_exn p inmatch (res.status, Headers.get res.headers "location") with| status, Some loc_str when Status.is_redirection status ->let location = Uri.of_string loc_str inlet new_uri =match Uri.host location with| Some _ -> location| None ->Uri.resolve(if conn.info.tls then "https" else "http")t.uri locationinL.trace (fun m -> m "handling redirection to %a" Uri.pp new_uri);if Status.is_permanent_redirection status then (t.uri <- new_uri;L.warn @@ fun m -> m "moved permanently to: %a" Uri.pp t.uri);let target = Uri.path_and_query new_uri inlet meth =match (req.meth, res.status) with| `POST, (`Found | `Moved_permanently) -> `GET| _ -> req.methinlet req = Httpaf.Request.{ req with meth; target } indrain res_body;Http_client.shutdown conn.http;handle t ~uri:new_uri ~body req| _ ->let body = read_body res_body inL.trace (fun m ->m "res: %a@.%s" Httpaf.Response.pp_hum res(Bigstringaf.to_string body));Http_client.shutdown conn.http;(res, body)let call t ~meth ?(headers = []) ?body target =let version = Httpaf.Version.{ major = 1; minor = 1 } inlet headers = Httpaf.Headers.of_list headers inlet req = Httpaf.Request.create ~version ~headers meth target inlet res, body = handle t ?body req inL.dbg (fun m ->m "%a %s -> %a" Httpaf.Method.pp_hum meth target Httpaf.Status.pp_humres.status);(res, body)let get t = call t ~meth:`GET ~body:Bigstringaf.emptylet put t = call t ~meth:`PUTlet post t = call t ~meth:`POSTlet delete t = call t ~meth:`DELETElet del = deletelet create ~sw ~net ?(uri = base_uri) () ={ sw; net; uri; base_path = Uri.path_and_query uri }
module Client (Client_runtime : Gluten_eio.Client) = structtype socket = Client_runtime.sockettype runtime = Client_runtime.ttype t = { connection : Httpaf.Client_connection.t; runtime : runtime }let create_connection ?(config = Httpaf.Config.default) ~sw socket =let connection = Httpaf.Client_connection.create ~config inlet runtime =Client_runtime.create ~sw ~read_buffer_size:config.read_buffer_size~protocol:(module Httpaf.Client_connection)connection socketin{ runtime; connection }let request t = Httpaf.Client_connection.request t.connectionlet shutdown t = Client_runtime.shutdown t.runtimelet is_closed t = Client_runtime.is_closed t.runtimelet upgrade t protocol = Client_runtime.upgrade t.runtime protocolend
(* docs: clients are allowed to send 120 gateway commands every 60 seconds *)let create ~id_bucket conn =let capacity = 120 inlet rate = 1. /. (float capacity /. 60.) inlet bucket = Token_bucket.make ~capacity rate inref (Open { id_bucket; bucket; conn })
match !t with| Open t ->let bucket =match pl with Pl.Identify _ -> t.id_bucket | _ -> t.bucketinToken_bucket.take bucket >|= fun () ->Ws_conn.send t.conn pl;Ok ()| Closed -> Lwt.return (Error.msg "cannot send payload to closed ws")
if Ws_conn.is_closed t.conn then raise Closed;let bucket = match pl with Pl.Identify _ -> t.id_bucket | _ -> t.bucket inToken_bucket.take ~sw:t.sw bucket;Ws_conn.send t.conn pl
match !t with| Open { bucket; conn; _ } ->t := Closed;Token_bucket.cancel_waiting bucket;Ws_conn.close ~code conn| Closed -> ()end
if not @@ Ws_conn.is_closed t.conn then Ws_conn.close ~code t.conn
type info = { id : string; seq : int }
(* docs: clients are allowed to send 120 gateway commands every 60 seconds *)let create ~sw ~net ~id_bucket uri =let capacity = 120 inlet rate = 1. /. (float capacity /. 60.) inlet bucket = Token_bucket.make ~capacity rate inlet conn = Ws_conn.create ~sw ~net ~zlib:false ~enc:`json uri inlet t = { sw; id_bucket; bucket; conn } inSwitch.on_release sw (fun () -> close ~code:`Going_away t);tend
shard : shard option;ev_rx : Events.t Lwt_pipe.Reader.t;op_tx : op Lwt_pipe.Writer.t;
shard : shard;ops : op Eio.Stream.t;mutable state : state;id_bucket : Token_bucket.t;version : Versions.Gateway.t;mutable fwd : Events.t -> unit;token : string;uri : Uri.t;sw : Switch.t;
| Greet of conn| Id of Heartbeat.t| Resuming of info * ev_tx * Heartbeat.tand conn = Fresh | Reconnection of info * ev_tx
| Greet of info option| Id of heartbeat| Resuming of info * heartbeat
let rec poll' st =let* pl =Lwt_pipe.read pl_rx >|= function| Some (`Pl pl) -> Ok pl| Some (`Closed code) -> Error (`Closed code)| None -> assert falsein
let rec loop st =match Ws.read_exn ws with| Ws_conn.Payload pl -> next st pl| Close code -> Error (`Closed (Close_code.of_close_code_exn code))and next st pl =
poll' (Id hb)|> Lwt_result.map_err (fun e ->Heartbeat.cancel hb;e)| Greet (Reconnection (info, ev_tx)), Hello hb ->
loop (Id hb)| Greet (Some info), Hello hb ->
let* () = Lwt_pipe.write_exn ev_tx ev |> Error.catch_lwt inpoll' (Resuming ({ info with seq }, ev_tx, hb))| Resuming (_, _, hb), Invalid_session _ ->
fwd ev;loop (Resuming ({ info with seq }, hb))| Resuming (_, hb), Invalid_session _ ->
let* () =Lwt_unix.sleep rand_wait >>= fun () -> Ws.send ws (Pl.Identify id)inpoll' (Id hb)| _, Reconnect -> Lwt_result.fail `Retry
Ws.send ws (Pl.Identify id);loop (Id hb)| _, Reconnect ->Ws.close ~code:`Abnormal_closure ws;Error `Retry
let c =match reconn with| Some (info, ev_tx) -> Reconnection (info, ev_tx)| None -> Freshinpoll' (Greet c)
match loop (Greet reconn) with| Ok o -> `Ok o| Error `Retry -> `Retry| Error (`Closed c) when Close_code.is_recoverable c -> `Retry| Error (`Closed _) ->L.err (fun m -> m "session closed during handshake");raise @@ Handshake_error "unrecoverable close code"| Error `Invalidated ->L.err (fun m ->m "session invalidated during handshake, invalid permissions?");raise @@ Handshake_error "invalid session"
(* TODO refactor this into Ws module *)let create_conn ~id_bucket uri =let open Lwt_result.Syntax inlet+ conn = Ws_conn.create ~zlib:false uri inlet p =Lwt_pipe.of_stream (Ws_conn.stream conn)|> Lwt_pipe.Reader.map ~f:(function| Ws_conn.Payload pl -> `Pl pl| Close code ->L.warn (fun m ->m "gateway ws session was closed: %a" Websocket.Close_code.ppcode);`Closed code)
let connect ~sw ~net ~id_bucket ~token ~fwd ?info uri =let rec loop () =let ws = Ws.create ~sw ~net ~id_bucket uri inhandshake ~sw ~token ~fwd ?reconn:info ws |> function| `Ok res -> (ws, res)| `Retry ->L.warn (fun m -> m "retrying handshake");loop ()
( Ws.create ~id_bucket conn,(p: [ `Pl of Pl.recv | `Closed of Websocket.Close_code.t ] Lwt_pipe.Reader.t))let create ?(on_destroy = fun _ -> ()) ?(zlib = false)?(version = Versions.Gateway.V8) ~id_bucket token uri =let open Lwt_result.Syntax inlet uri = uri |> with_ws_params ~zlib ~version ~enc:`json inlet p_init, u_init = Lwt.wait () inlet ev_pipe = Lwt_pipe.create () inlet op_pipe = Lwt_pipe.create () inlet read_exn p = Lwt_pipe.read p >|= Option.get_exn in
loop ()
let rec manage' ?session () =let rec connect () =let* ws, pipe = create_conn ~id_bucket uri indo_handshake ~token ?reconn:session ws pipe >>= function| Ok res -> Lwt_result.return (ws, pipe, res)| Error (`Closed _) ->L.warn (fun m -> m "session closed during handshake");Lwt_result.fail (`Discord "unrecoverable close code during handshake")| Error `Invalidated ->L.warn (fun m ->m "session invalidated during handshake, invalid permissions?");Lwt_result.fail (`Discord "unrecoverable close code during handshake")| Error `Retry ->L.warn (fun m -> m "retrying handshake");Ws.close ~code:`Abnormal_closure ws;Lwt_pipe.close_nonblock pipe;connect ()| Error #Error.t as e -> Lwt.return einlet* ws, ws_rx, res = connect () inlet bus =Lwt_pipe.Reader.merge_all[ws_rx |> Lwt_pipe.Reader.map ~f:(fun pl -> `Ws pl);op_pipe |> Lwt_pipe.Reader.map ~f:(fun op -> `Op op);]inLwt_pipe.link_close ws_rx ~after:bus;let info, hb =match res with| `Connected (user, info, hb) ->if Lwt.is_sleeping p_init thenLwt.wakeup_later u_init(Ok { user; ev_rx = ev_pipe; op_tx = op_pipe; shard = None });(ref info, hb)| `Reconnected (info, hb) -> (ref info, hb)inlet rec poll' () =let open Lwt.Syntax inread_exn bus >>= function| `Op (Ws pl) -> Ws.send_exn ws pl >>= poll'| `Ws (`Pl pl) -> handle_payload pl| `Ws (`Closed code) ->L.error (fun m ->m "session closed with unrecoverable close code: %a"Websocket.Close_code.pp code);Lwt_result.fail(`Discord(Format.asprintf "unrecoverable close code: %a"Websocket.Close_code.pp code))| `Op (Dc k) ->Ws.close ~code:`Normal_closure ws;Lwt_pipe.close_nonblock op_pipe;Lwt_pipe.close_nonblock bus;k ();Lwt_result.return ()and handle_payload = function| Hello new_hb ->L.warn (fun m -> m "got new greeting, updating heartbeat");Heartbeat.preempt ~interval:(float new_hb /. 1e3) hb;poll' ()| Heartbeat ->L.debug (fun m -> m "requested hearbeat, obliging...");Heartbeat.preempt hb;poll' ()| Heartbeat_ack ->L.debug (fun m -> m "got heartbeat ack");Heartbeat.ack hb;poll' ()| Invalid_session resumable ->L.warn (fun m -> m "session invalidated (resumable=%b)" resumable);let session = if resumable then Some (!info, ev_pipe) else None inHeartbeat.cancel hb;Lwt_pipe.close_nonblock bus;Ws.close ~code:`Abnormal_closure ws;(* TODO what to do in case of `false` again?? *)manage' ?session ()| Reconnect ->L.warn (fun m -> m "got reconnection request, obliging...");Heartbeat.cancel hb;Lwt_pipe.close_nonblock bus;Ws.close ~code:`Abnormal_closure ws;manage' ~session:(!info, ev_pipe) ()| Dispatch (seq, Ready _) | Dispatch (seq, Resumed) ->L.warn (fun m ->m "ignoring handshake related payloads on established session");info := { !info with seq };poll' ()| Dispatch (seq, ev) ->info := { !info with seq };Lwt_pipe.write ev_pipe ev >>= fun ok ->if ok then poll' () else Lwt_result.return ()inpoll' () >>= fun out ->Heartbeat.cancel hb;Ws.close ~code:`Normal_closure ws;Lwt_pipe.close_nonblock op_pipe;Lwt_pipe.close_nonblock bus;Lwt_pipe.close ev_pipe >|= fun () -> outinLwt.async (fun () ->manage' () >|= function| Ok () -> ()| Error e when Lwt.is_sleeping p_init -> Lwt.wakeup_later u_init (Error e)| Error e -> on_destroy e);p_initlet events { ev_rx; _ } = ev_rx
let is_dead { op_tx; _ } = Lwt_pipe.is_closed op_txlet send_exn { op_tx; _ } op =Lwt_pipe.write op_tx op >>= fun ok ->if ok then Lwt.return_unitelse (L.err (fun m -> m "trying to interact with dead session");Lwt.fail (Failure "trying to interact with dead session"))
let send_exn t op =if is_dead t then raise Dead;Eio.Stream.add t.ops op
if is_dead t then Lwt.return_unitelselet p, u = Lwt.wait () insend_exn t (Dc (Lwt.wakeup_later u)) >>= fun () -> p
if not @@ is_dead t then (let p, u = Promise.create () insend_exn t (Dc (Promise.resolve u));Promise.await p)let kill t =t.state <- Dead;match Switch.get_error t.sw with| None -> Switch.fail t.sw Exit| Some _ -> ()let manage ~sw ~net t =let drain () =match t.state with| Dead -> ()| Alive { ws; hb; _ } ->Heartbeat.cancel hb;Ws.close ~code:`Abnormal_closure ws;t.state <- Deadinlet reconnect ?info () =drain ();let new_state =matchconnect ~sw ~net ~id_bucket:t.id_bucket ~token:t.token ~fwd:t.fwd ?infot.uriwith| ws, (`Connected (_, info, hb) | `Reconnected (info, hb)) ->Alive { ws; hb; info }int.state <- new_stateinlet rec loop () =match t.state with| Dead -> ()| Alive { ws; hb; info } -> next ~ws ~hb ~infoand next ~ws ~hb ~info =let bus =Fiber.first(fun () -> `Ws (Ws.read_exn ws))(fun () -> `Op (Eio.Stream.take t.ops))inmatch bus with| `Op (Ws pl) ->Ws.send ws pl;loop ()| `Ws (Payload pl) -> handle_payload ~hb ~info pl| `Ws (Close code) ->L.error (fun m ->m "session closed with unrecoverable close code: %a"Websocket.Close_code.pp code);Error.raise(`Discord(Format.asprintf "unrecoverable close code: %a"Websocket.Close_code.pp code))| `Op (Dc k) ->Ws.close ~code:`Normal_closure ws;Fiber.yield ();k ()and handle_payload ~hb ~info = function| Hello new_hb ->L.warn (fun m -> m "got new greeting, updating heartbeat");Heartbeat.preempt ~interval:(float new_hb /. 1e3) hb;loop ()| Heartbeat ->L.debug (fun m -> m "requested hearbeat, obliging...");Heartbeat.preempt hb;loop ()| Heartbeat_ack ->L.debug (fun m -> m "got heartbeat ack");Heartbeat.ack hb ();loop ()| Invalid_session resumable ->L.warn (fun m -> m "session invalidated (resumable=%b)" resumable);let info = if resumable then Some info else None in(* let state = match connect *)(* TODO what to do in case of `false`let state = again?? *)reconnect ?info ();loop ()| Reconnect ->L.warn (fun m -> m "got reconnection request, obliging...");reconnect ~info ();loop ()| Dispatch (seq, Ready _) | Dispatch (seq, Resumed) ->L.warn (fun m ->m "ignoring handshake related payloads on established session");info.seq <- seq;loop ()| Dispatch (seq, ev) ->info.seq <- seq;t.fwd ev;loop ()inFun.protect ~finally:drain looplet create ~sw ~net ?(zlib = false) ?(version = Versions.Gateway.V8) ~fwd~id_bucket token uri =let uri = uri |> with_ws_params ~zlib ~version ~enc:`json inlet p, u = Promise.create () inlet spawn () : no_return =Switch.run @@ fun sw ->let user, state =match connect ~sw ~net ~id_bucket ~token ~fwd uri with| ws, `Connected (user, info, hb) -> (user, Alive { ws; hb; info })| _, `Reconnected _ ->Error.(raise @@ of_discord "reconnected on creation?")inlet ops = Eio.Stream.create 0 inlet t ={user;shard = Single;ops;state;id_bucket;version;fwd;token;uri;sw;}inSwitch.on_release sw (fun () -> kill t);Promise.resolve u t;manage ~sw ~net t;(* cleanup: stops any fibres still running (e.g. heartbeats) *)raise ExitinFiber.fork ~sw (fun () -> match spawn () with _ -> . | exception Exit -> ());Promise.await p
module Flow = Eio.Flowmodule L = (val Relog.logger ~namespace:__MODULE__ ())exception Tls_alert of Tls.Packet.alert_typeexception Tls_failure of Tls.Engine.failureexception Closedlet () =Printexc.register_printer (function| Tls_alert typ ->Some ("TLS alert from peer: " ^ Tls.Packet.alert_type_to_string typ)| Tls_failure f -> Some ("TLS failure: " ^ Tls.Engine.string_of_failure f)| Closed -> Some "TLS closed"| _ -> None)type t = {role : [ `Server | `Client ];flow : < Flow.two_way ; Flow.close >;mutable state : [ `Active of Tls.Engine.state | `Eof | `Error of exn ];mutable linger : Cstruct.t list;}let () = Mirage_crypto_rng_unix.initialize ()let check_active t =match t.state with| `Eof -> raise End_of_file| `Error exn -> raise exn| `Active tls -> tlslet check_write t res =match (t.state, res) with| _, Ok () -> ()| `Active _, Error e ->t.state <- `Error e;Flow.close t.flow;raise e| _, Error e -> raise elet copy src dst =match Flow.copy src dst with () -> Ok () | exception ex -> Error exlet read_react t =let handle tls buf =match Tls.Engine.handle_tls tls buf with| Ok (res, `Response resp, `Data data) ->let state' =match res with| `Ok tls ->L.trace (fun m -> m "tls still active");`Active tls| `Eof ->L.trace (fun m -> m "tls eof");`Eof| `Alert alert ->L.trace (fun m -> m "tls alert");`Error (Tls_alert alert)int.state <- state';Option.iter(fun buf ->copy (Flow.cstruct_source [ buf ]) t.flow |> check_write t)resp;(match res with `Ok _ -> () | _ -> Flow.close t.flow);L.trace (fun m ->m "data@.%a"(CCOpt.pp (Hxd_string.pp Hxd.default))(Option.map Cstruct.to_string data));data| Error (fail, `Response resp) ->L.trace (fun m -> m "tls failed");let ex = Tls_failure fail int.state <- `Error ex;(try Flow.copy (Flow.cstruct_source [ resp ]) t.flow with _ -> ());Flow.close t.flow;raise exincheck_active t |> ignore;let cbuf = Cstruct.create 4096 in(* this is hanging everything for some reason *)match Flow.read t.flow cbuf with| got ->L.trace (fun m -> m "got %dB" got);let tls = check_active t inlet cbuf = Cstruct.sub cbuf 0 got inhandle tls cbuf| exception (End_of_file as ex) ->t.state <- `Eof;raise ex| exception ex ->t.state <- `Error ex;raise exlet rec read_into t buf =let got, bufs = Cstruct.fillv ~src:t.linger ~dst:buf int.linger <- bufs;if got > 0 then (L.trace (fun m -> m "tls: read %dB into buf" got);got)elsematch read_react t with| None -> read_into t buf| Some next ->t.linger <- t.linger @ [ next ];read_into t buflet writev t bufs =match t.state with| `Eof -> raise Closed| `Error e -> raise e| `Active tls -> (match Tls.Engine.send_application_data tls bufs with| Some (tls, answer) ->t.state <- `Active tls;L.trace (fun m -> m "tls writev %dB" (Cstruct.length answer));copy (Flow.cstruct_source [ answer ]) t.flow |> check_write t| None ->(* "Impossible" due to handshake draining. *)assert false)let write t buf = writev t [ buf ]let close t =match t.state with| `Active tls ->L.trace (fun m -> m "close_notify tls");t.state <- `Eof;let _, buf = Tls.Engine.send_close_notify tls in(* XXX: need a switch here *)let _ = copy (Flow.cstruct_source [ buf ]) t.flow inL.trace (fun m -> m "closing underlying flow");Flow.close t.flow;L.trace (fun m -> m "closed underlying flow")| _ -> L.trace (fun m -> m "already closed")(** XXX bad XXX* This is a point that should particularly be protected from concurrent r/w.* Doing this before a `t` is returned is safe; redoing it during rekeying is* not, as the API client already sees the `t` and can mistakenly interleave* writes while this is in progress.* *)let rec drain_handshake t =match t.state with| `Active tls when not (Tls.Engine.handshake_in_progress tls) -> ()| _ ->(* read_react re-throws *)let mbuf = read_react t int.linger <- Option.to_list mbuf @ t.linger;drain_handshake tlet wrap t =object (_ : < Eio.Generic.t ; Flow.source ; Flow.sink ; Flow.close ; .. >)method probe _ = Nonemethod read_into buf = read_into t bufmethod read_methods = [] (* TODO: this would be faster *)method copy src =let buf = Cstruct.create 4096 inlet rec loop () =match Flow.read src buf with| exception End_of_file -> ()| got ->(* XXX: wrap errors? *)write t (Cstruct.sub buf 0 got);loop ()inloop ()method epoch =match t.state with| `Eof | `Error _ -> Error ()| `Active tls -> (match Tls.Engine.epoch tls with| `InitialEpoch -> assert false (* `drain_handshake` invariant. *)| `Epoch e -> Ok e)method reneg ?authenticator ?acceptable_cas ?cert ?(drop = true) () =match t.state with| `Eof -> raise End_of_file| `Error e -> raise e| `Active tls -> (match Tls.Engine.reneg ?authenticator ?acceptable_cas ?cert tls with| None ->(* XXX make this impossible to reach *)invalid_arg "Renegotiation already in progress"| Some (tls', buf) ->if drop then t.linger <- [];t.state <- `Active tls';copy (Flow.cstruct_source [ buf ]) t.flow |> fun _ ->drain_handshake t)method key_update ?request () =match t.state with| `Eof -> raise Closed| `Error e -> raise e| `Active tls -> (match Tls.Engine.key_update ?request tls with| Error _ -> invalid_arg "Key update failed"| Ok (tls', buf) ->t.state <- `Active tls';copy (Flow.cstruct_source [ buf ]) t.flow |> check_write t)method close = close tmethod shutdown = function `All -> close t | _ -> ()endlet client_of_flow ~sw conf ?host flow =let conf' =match host with None -> conf | Some host -> Tls.Config.peer conf hostinlet tls, init = Tls.Engine.client conf' inlet t = { role = `Client; flow; state = `Active tls; linger = [] } incopy (Flow.cstruct_source [ init ]) flow |> fun _ ->drain_handshake t;let flow = wrap t inEio.Switch.on_release sw (fun () -> Flow.close flow);flowlet server_of_flow ~sw conf flow =let t ={role = `Server;flow;state = `Active (Tls.Engine.server conf);linger = [];}indrain_handshake t;let flow = wrap t inEio.Switch.on_release sw (fun () -> Flow.close flow);flow
let connect_ssl host fd =L.info (fun m -> m "initializing SSL context");let ctx = Ssl.create_context Ssl.TLSv1_2 Ssl.Client_context inlet s = Lwt_ssl.embed_uninitialized_socket fd ctx inlet ssl_sock = Lwt_ssl.ssl_socket_of_uninitialized_socket s inSsl.set_client_SNI_hostname ssl_sock host;Ssl.set_hostflags ssl_sock [ No_partial_wildcards ];Ssl.set_host ssl_sock host;L.info (fun m -> m "performing SSL handshake for socket");let open Lwt.Syntax inlet+ socket_or_error =Lwt.catch(fun () -> Lwt_result.ok (Lwt_ssl.ssl_perform_handshake s))(function| Ssl.Connection_error _ssl_error ->let msg = Ssl.get_error_string () inL.err (fun m -> m "error performing SSL handshake: %s" msg);Lwt.return (Error.msg msg)| _ -> assert false)inmatch socket_or_error with| Ok ssl_socket ->let _ssl_version = Ssl.version ssl_sock inlet ssl_cipher = Ssl.get_cipher ssl_sock inL.info (fun m ->m "SSL connection using TLS1.2 / %s" (Ssl.get_cipher_name ssl_cipher));Ok ssl_socket| Error e ->let verify_result = Ssl.get_verify_result ssl_sock inif verify_result <> 0 thenL.err (fun m -> m "verify_result=%d" verify_result);Error elet open_socket ?(ssl = false) ?(port = if ssl then 443 else 80) host =let open Lwt_result.Syntax inlet* addresses =Lwt_unix.getaddrinfo host (Int.to_string port) [ Unix.(AI_FAMILY PF_INET) ]|> Lwt_result.catch|> Lwt_result.map_err (fun e -> `Exn e)
let connect_tls ~sw host flow =L.trace (fun m -> m "configuring TLS client");let null ?ip:_ ~host:_ _certs = Ok None inlet host = Domain_name.host_exn @@ Domain_name.of_string_exn host inlet cfg =Tls.Config.client ~authenticator:null ~version:(`TLS_1_2, `TLS_1_3) ()
let fd = Lwt_unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 inL.info (fun m -> m "connecting socket");let* () =let rec inner = function| addr :: xs ->Lwt.try_bind(fun () -> Lwt_unix.connect fd addr.Unix.ai_addr)(fun () -> Lwt_result.return ())(fun _exn -> inner xs)| [] ->Lwt.return (Error.msgf "couldn't connect socket to %s:%d" host port)ininner addresses
let open_socket ~sw ~net ?(tls = false) ?(port = if tls then 443 else 80) host =let rec inner = function| addr :: xs -> ( try Eio.Net.connect ~sw net addr with _ -> inner xs)| [] ->raise@@ Invalid_argument(Format.sprintf "couldn't connect socket to %s:%d" host port)
let+ socket =if ssl then connect_ssl host fd else Lwt_ssl.plain fd |> Lwt_result.return
let addrs =Unix.getaddrinfo host (Int.to_string port) [ Unix.(AI_FAMILY PF_INET) ]|> List.map (fun addr ->match addr.Unix.ai_addr with| Unix.ADDR_INET (inetaddr, port) ->`Tcp (Eio_unix.Ipaddr.of_unix inetaddr, port)| ADDR_UNIX name -> `Unix name)
let stream { stream; _ } = fst streamlet is_closed { wsd; _ } = Websocketaf.Wsd.is_closed wsd
let read t =match is_closed t with| true -> Eio.Stream.take_nonblocking t.stream| false -> Some (Eio.Stream.take t.stream)
let rec _connect ~enc ~zlib ~ssl host port resource =let open Lwt_result.Syntax inL.info (fun m -> m "opening socket (%s:%d) ssl=%b" host port ssl);let* socket = open_socket ~ssl ~port host in
let rec _connect ~sw ~net ~enc ~zlib ~tls host port resource =L.info (fun m -> m "opening socket (%s:%d) tls=%b" host port tls);let socket = open_socket ~sw ~net ~tls ~port host in
Lwt.wakeup_later u(Error.msgf "failed to handshake websocket: %s" rsp.reason)| _ -> assert false
let emsg =Format.sprintf "failed to handshake websocket: %s" rsp.reasoninPromise.resolve_error u @@ Handshake_failure (emsg, rsp)| `Malformed_response msg -> Promise.resolve_error u @@ Http_failure msg| `Invalid_response_body_length _res ->Promise.resolve_error u@@ Http_failure "invalid response body length"| `Exn exn -> Promise.resolve_error u @@ exn
let stream, push = Lwt_stream.create () inlet close_stream () =if not @@ Lwt_stream.is_closed stream then push NoneinLwt.wakeup_later u(Ok { info = conn_info; wsd; stream = (stream, close_stream) });
(* TODO @quartz55: does this effectively back-pressureor will it just be catastrophic?maybe an unbounded stream would make more sensegiven ws/af is push-based *)let stream = Eio.Stream.create max_int inPromise.resolve_ok u (`Conn { info = conn_info; wsd; stream });
let do_handshake =if ssl thenWss_client.connect socket ~nonce ~host ~port ~resource ~error_handler~websocket_handler>|= ignoreelseWs_client.connect (Lwt_ssl.get_fd socket) ~nonce ~host ~port ~resource~error_handler ~websocket_handler>|= ignore
L.info (fun m -> m "initiating websocket handshake");let nonce = gen_nonce 20 inlet conn =Ws_client.connect ~sw socket ~nonce ~host ~port ~resource ~error_handler~websocket_handler
let* _ = do_handshake |> Error.catch_lwt inp >>= function| Error (`Redir loc) ->let host, port, ssl, resource = _uri_info (Uri.of_string loc) in_connect ~enc ~zlib ~ssl host port resource| Error #Error.t as err -> Lwt.return err| Ok t -> Lwt.return (Ok t)
match Promise.await_exn p with| `Conn t ->Switch.on_release sw (fun () -> Ws_client.shutdown conn);t| `Redir loc ->let host, port, tls, resource = _uri_info (Uri.of_string loc) in_connect ~sw ~net ~enc ~zlib ~tls host port resource
let host, port, ssl, resource = _uri_info uri in_connect ~enc ~zlib ~ssl host port resource
let host, port, tls, resource = _uri_info uri inlet t = _connect ~sw ~net ~enc ~zlib ~tls host port resource inSwitch.on_release sw (fun () -> close t);t
let sha1 s =s |> Cstruct.of_string |> Mirage_crypto.Hash.SHA1.digest |> Cstruct.to_stringmodule Client (Client_runtime : Gluten_eio.Client) = structtype t = Client_runtime.ttype socket = Client_runtime.socketlet connect ?(config = Httpaf.Config.default) ~sw ~nonce ~host ~port ~resource~error_handler ~websocket_handler socket =let headers =Httpaf.Headers.of_list[ ("host", String.concat ":" [ host; string_of_int port ]) ]inlet connection =Websocketaf.Client_connection.connect ~nonce ~headers ~sha1 ~error_handler~websocket_handler resourceinClient_runtime.create ~sw ~read_buffer_size:config.read_buffer_size~protocol:(module Websocketaf.Client_connection)connection socketlet is_closed t = Client_runtime.is_closed tlet shutdown t = Client_runtime.shutdown tend
type t = int * int reflet k = Domain.DLS.new_key Random.State.make_self_initlet create ?(max = 32) () = (max, ref 1)let once (maxv, r) =let t = Random.State.int (Domain.DLS.get k) !r inr := min (2 * !r) maxv;if t = 0 then ()elsefor _ = 1 to 4096 * t doDomain.cpu_relax ()donelet reset (_, r) = r := 1
type t = Eio.Semaphore.tlet make () = Eio.Semaphore.make 1let lock t = Eio.Semaphore.acquire tlet is_locked t = Eio.Semaphore.get_value t = 0let unlock t =if not @@ is_locked t then raise @@ Invalid_argument "already unlocked";Eio.Semaphore.release tlet with_ t fn =lock t;Fun.protect ~finally:(fun () -> unlock t) fnlet with_lock = with_
open Eio.Stdtype sink = < Eio.Generic.t ; Eio.Flow.sink ; Eio.Flow.close >type source = < Eio.Generic.t ; Eio.Flow.source ; Eio.Flow.close >let wrap_in src =let b = Bytes.create (1024 * 4) inlet blen = Bytes.length b inobject (_ : source)method probe _ = Nonemethod read_into buf =let rlen = min blen (Cstruct.length buf) inEio_unix.await_readable src;match Unix.read src b 0 rlen with| 0 -> raise End_of_file| n ->Cstruct.blit_from_bytes b 0 buf 0 n;nmethod read_methods = []method close = Unix.close srcendlet wrap_out snk =object (_ : sink)method probe _ = Nonemethod copy src =let buf = Cstruct.create_unsafe (1024 * 4) inlet rec loop () =match Eio.Flow.read src buf with| (exception End_of_file) | 0 -> ()| n ->Eio_unix.await_writable snk;ignore @@ Unix.write snk (Cstruct.to_bytes buf) 0 n;loop ()inloop ()method close = Unix.close snkendtype proc = {pid : int;stdout : source;stdin : sink;stderr : source;mutable status : Unix.process_status option;}let pipe ~sw () =let r, w = Unix.pipe ~cloexec:true () inSwitch.on_release sw (fun () ->try [ r; w ] |> List.iter Unix.closewith Unix.Unix_error (EBADF, _, _) -> ());(r, w)let rec waitpid_non_intr pid =try snd @@ Unix.waitpid [] pidwith Unix.Unix_error (EINTR, _, _) -> waitpid_non_intr pidlet stdout { stdout; _ } = stdoutlet stdin { stdin; _ } = stdinlet stderr { stderr; _ } = stderrlet signal t signal = Unix.kill t.pid signallet close_pipes t =tryEio.Flow.close t.stdout;Eio.Flow.close t.stdin;Eio.Flow.close t.stderrwith Unix.Unix_error (EBADF, _, _) -> ()let wait_set_status t =let s = waitpid_non_intr t.pid int.status <- Some s;slet kill t =match t.status with| None ->signal t Sys.sigkill;close_pipes t;wait_set_status t| Some s -> slet close t =match t.status with| None ->close_pipes t;wait_set_status t| Some s -> slet spawn ~sw prog =let stdout_r, stdout_w = pipe ~sw () inlet stdin_r, stdin_w = pipe ~sw () inlet stderr_r, stderr_w = pipe ~sw () inlet pid = Unix.create_process_env prog [||] [||] stdin_r stdout_w stderr_w in[ stdout_w; stdin_r; stderr_w ] |> List.iter Unix.close;let stdout = wrap_in stdout_r inlet stdin = wrap_out stdin_w inlet stderr = wrap_in stderr_r inlet t = { pid; stdout; stdin; stderr; status = None } inSwitch.on_release sw (fun () -> ignore @@ kill t);t
open Containersopen Eio.Stdmodule L = (val Relog.logger ~namespace:__MODULE__ ())module Lf_queue = Eio_utils.Lf_queue(* author's note: decided to go with unboxed intsin the end, I don't expect this to be used in systemsother than 64 bit (and 63 bits is more than enough) *)type t = {sleep : float -> unit;capacity : int;capacity_ns : int;ns_per_token : int;bucket : bucket Atomic.t;attending : bool Atomic.t;waiters : waiter Lf_queue.t;}and bucket = { tokens : int; ts : Mtime.Span.t }and waiter = Waiter of int * unit Promise.u * unit Promise.tlet check_capacity ~n { capacity; _ } =if n > capacity thenraise (Invalid_argument "can't take more than bucket's capacity")let make ~capacity ?init rate =let sleep secs = Eio_unix.sleep secs inlet ns_per_token = Int.of_float (1e9 /. rate |> ceil) inlet init = match init with Some i -> min capacity i | None -> capacity inlet bucket = { tokens = init * ns_per_token; ts = Mtime_clock.elapsed () } in{sleep;capacity;capacity_ns = capacity * ns_per_token;ns_per_token;bucket = Atomic.make bucket;attending = Atomic.make false;waiters = Lf_queue.create ();}let capacity { capacity; _ } = capacitylet rate { ns_per_token; _ } = 1. /. (float ns_per_token /. 1e9)let is_full { capacity_ns; bucket; _ } =let { tokens; _ } = Atomic.get bucket intokens >= capacity_nslet fill t =let b = Backoff.create () inlet rec loop () =let bucket = Atomic.get t.bucket inmatch bucket with| { tokens; _ } when tokens >= t.capacity_ns -> t| { tokens; ts } ->let now = Mtime_clock.elapsed () inlet span = Mtime.Span.abs_diff now ts inlet diff_ns = Mtime.Span.to_uint64_ns span |> Int64.to_int inlet tokens = min t.capacity_ns (tokens + diff_ns) inif Atomic.compare_and_set t.bucket bucket { tokens; ts = now } then telse (Backoff.once b;loop ())inloop ()let try_take_ns_unsafe ~n t =let b = Backoff.create () inlet rec take' t =let ({ tokens; _ } as bucket) = Atomic.get t.bucket inlet cas tokens =Atomic.compare_and_set t.bucket bucket { bucket with tokens }inmatch tokens - n with| n when n < 0 -> false| n when cas n -> true| _ ->Backoff.once b;take' tinif take' t then true else fill t |> take'let try_take ?(n = 1) t =check_capacity ~n t;if Atomic.compare_and_set t.attending false true then (let n_ns = n * t.ns_per_token inlet out = try_take_ns_unsafe ~n:n_ns t inAtomic.set t.attending false;out)else falselet attend_waiters t =let b = Backoff.create () inlet rec attend ?(n = 0) () =traceln "Attending...";match Lf_queue.pop t.waiters with| None when n = 0 ->Backoff.once b;attend ()| None -> Atomic.set t.attending false| Some (Waiter (n, u, _)) when try_take_ns_unsafe ~n t ->Promise.resolve u ();attend ~n:(n + 1) ()| Some (Waiter (n, _, _) as waiter) ->Lf_queue.push_head t.waiters waiter;let { tokens; _ } = Atomic.get t.bucket inlet wait_ns = max (n - tokens) 0 inlet wait_secs = float wait_ns /. 1e9 int.sleep wait_secs;attend ~n ()inattend ~n:0let take ~sw ?(n = 1) t =check_capacity ~n t;let n_ns = n * t.ns_per_token inlet enqueue' () =let p, u = Promise.create () inLf_queue.push t.waiters (Waiter (n_ns, u, p));pinmatch Atomic.compare_and_set t.attending false true with| false -> Promise.await @@ enqueue' ()| true when try_take_ns_unsafe ~n:n_ns t -> Atomic.set t.attending false| true ->let p = enqueue' () inFiber.fork ~sw @@ attend_waiters t;Promise.await p
open! Disco_core.Globalstype t = {mutable interval : float;mutable preempt : ?interval:float -> unit -> unit;mutable ack : int -> unit;mutable cancel : unit -> unit;}let interval { interval; _ } = intervallet preempt ?interval { preempt; _ } = preempt ?interval ()let ack nonce { ack; _ } = ack noncelet cancel { cancel; _ } = cancel ()let make ?err fn interval =let err =Option.get_or~default:(fun () -> failwith "no ACK of last heartbeat received")errinlet out ={interval;preempt = (fun ?interval:_ -> ignore);ack = ignore;cancel = ignore;}inlet gen_nonce =let st = Random.State.make_self_init () infun () -> Random.State.bits stinlet rec loop () =let open Lwt.Syntax inlet acked = ref false inlet nonce = gen_nonce () inlet () = fn nonce inlet p_preempt, u_preempt = Lwt.wait () inlet p_sleep = Lwt_unix.sleep out.interval |> Lwt.map (Fun.const `Sleep) inout.ack <- (fun n -> if not !acked then acked := nonce = n);out.cancel <-(fun () ->if Lwt.is_sleeping p_preempt then Lwt.wakeup_later u_preempt `Cancel);out.preempt <-(fun ?(interval = interval) () ->if Lwt.is_sleeping p_preempt thenLwt.wakeup_later u_preempt (`Preempt interval));let* r = Lwt.pick [ p_sleep; p_preempt ] inmatch (r, !acked) with| `Sleep, true -> loop ()| `Preempt interval, _ ->out.interval <- interval;loop ()| `Sleep, false ->err ();Lwt.return ()| `Cancel, _ -> Lwt.return ()inLwt.async loop;out
(** Conservative default of 10 already taking intoaccount the occasional packet loss that might occur *)let n_silence_pipe ?(n = 10) () =Lwt_pipe.of_list (List.init n (fun _ -> silence_frame))
let create_opus_encoder ?(frametype = `s16) () =let ( let+ ) res fn = fn (get_opus_res_exn res) inlet open Opus inlet rec set_ctls ~l enc =match l with| ctl :: l ->let+ () = Encoder.ctl enc ctl inset_ctls ~l enc| [] -> encinlet+ enc =Encoder.create ~samplerate:Rtp._SAMPLE_RATE ~channels:`stereo~application:`Audio ()inlet shared =CTL.[Set_signal `Music;Set_bitrate `Max;Set_complexity 10;Set_packet_loss_perc 5;Set_inband_FEC true;Set_DTX false;]inlet ctls =match frametype with| `s16 -> CTL.(Set_LSB_depth 16) :: shared| `f32 -> CTL.(Set_LSB_depth 24) :: sharedinset_ctls ~l:ctls enc
module Parser = structlet frame ~sample_p ~channels ~size ~kind =let buf =Bigarray.Array1.create kind Bigarray.c_layout (channels * size)inlet p =let open Angstrom inlet sample = count channels sample_p inlet rec samples ?(i = 0) () =end_of_input >>| (fun () -> `eof) <|> (sample >>| fun s -> `sample s)>>= function| `eof -> return ()| `sample chans ->List.iteri (fun ci c -> buf.{i + ci} <- c) chans;samples ~i:(i + channels) ()insamples () >>| fun () -> bufinfun buf ->Angstrom.parse_bigstring ~consume:Angstrom.Consume.All p buf |> function| Ok frame -> frame| Error str -> failwith @@ "error parsing raw audio frame " ^ strlet s16le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_int16 ~channels ~size:frame_size~kind:Bigarray.int16_signedlet s16be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_int16 ~channels ~size:frame_size~kind:Bigarray.int16_signedlet f32le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_float ~channels ~size:frame_size~kind:Bigarray.float32let f32be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_float ~channels ~size:frame_size~kind:Bigarray.float32let f64le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_double ~channels ~size:frame_size~kind:Bigarray.float64let f64be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_double ~channels ~size:frame_size~kind:Bigarray.float64endlet pcm_args =["-nostdin";"-analyzeduration";"0";"-f";"s16le";"-ar";"48000";"-ac";"2";"-flush_packets";"1";]
let s16_encoder () =let buf = Bigstringaf.create Rtp._VOICE_PACKET_MAX infun frame ->Opus.Encoder.encode_blit opus_s16 ~duration:Rtp._FRAME_LEN frame buf|> opt_of_opus_res
let stdout_args = [ "-" ]let frame_reader () =let buf = Bigstringaf.create (Rtp._FRAME_SIZE * Rtp._CHANNELS * 2) inlet blen = Bigstringaf.length buf inlet parse_frame =let parser =Parser.s16le ~channels:Rtp._CHANNELS ~frame_size:Rtp._FRAME_SIZEinfun () -> parser bufinfun ic ->Lwt_io.read_into_exactly_bigstring ic buf 0 blen |> Lwt_result.catch>|= function| Ok () -> `Frame (parse_frame ())| Error End_of_file -> `Eof| Error exn -> `Exn exnlet writer = function| `Stream s ->let f oc =Lwt_pipe.read s >>= function| Some d -> (Lwt_io.write_from_exactly_bigstring oc d 0 (Bigstringaf.length d)|> Lwt_result.catch>|= function| Ok () -> true| _ -> false)| None -> Lwt_io.close oc >|= Fun.const falseinf| _ -> fun oc -> Lwt_io.close oc >|= Fun.const false
let f32_encoder () =let buf = Bigstringaf.create Rtp._VOICE_PACKET_MAX infun frame ->Opus.Encoder.encode_blit_float opus_f32 ~duration:Rtp._FRAME_LEN frame buf|> opt_of_opus_res
let create input =let open Lwt_result.Syntax inlet cmd = "ffmpeg" inlet* i =match input with| `Stream _ -> Lwt_result.return [ "-i"; "-" ]| `File path -> (Lwt_unix.file_exists path >|= function| true -> Ok [ "-i"; path ]| false -> Error.msgf "input file '%s' does not exist" path)| `Url url -> Lwt_result.return [ "-i"; url ]inlet args = List.concat [ i; pcm_args; stdout_args ] in
type t = { mutable src : bigstring Streaming.Source.t option }
Lwt_process.with_process_full("", Array.of_list @@ cmd :: args)(fun proc ->L.debug (fun m -> m "ffmpeg running with pid=%d" proc#pid);
(** Conservative default of 10 already taking intoaccount the occasional packet loss that might occur *)let silence_frames ?(n = 10) () =let src = Streaming.Source.generate ~len:n @@ fun _ -> silence_frame inof_source src
let read_logs () =Lwt_io.read ~count:0x100 proc#stderr >|= fun s ->`Logs (String.length s = 0)inlet read_frame () = frame_reader () proc#stdout inlet write () = writer input proc#stdin >|= fun r -> `Write r in
let of_raw_s16 src =let enc = s16_encoder () inStreaming.Source.filter_map enc src |> of_source
let rec poll' q =Lwt.nchoose_split q >>= function| [], [] -> Lwt_result.return ()| rs, ps -> (match handle ~out:ps rs with| Ok [] -> Lwt_result.return ()| Ok q -> poll' q| Error _ as e -> Lwt.return e)and handle ?(out = []) = function| [] -> Ok out| (`Write false | `Eof | `Logs true) :: xs -> handle ~out xs| `Logs false :: xs -> handle ~out:(read_logs () :: out) xs| `Frame frame :: xs ->if Lwt.is_sleeping p_p then Lwt.wakeup_later u_p (Ok p);let fwd = Lwt_pipe.write p frame >|= fun r -> `Fwd r inhandle ~out:(fwd :: out) xs| `Fwd true :: xs ->let r = read_frame () inhandle ~out:(r :: out) xs| `Fwd false :: _ ->L.warn (fun m ->m "receiving end of pipe closed, cleaning up...");List.iter Lwt.cancel out;let clean =Lwt_io.abort proc#stdin >>= fun () ->Lwt_io.abort proc#stdout >>= fun () ->Lwt_io.abort proc#stderr >|= fun () ->proc#terminate;`EofinOk [ clean ]| `Write true :: xs ->let w = write () inhandle ~out:(w :: out) xs| (`Exn _ as e) :: _ ->List.iter Lwt.cancel out;L.err (fun m -> m "boop %a" Error.pp e);Error ein
let of_raw_f32 src =let enc = f32_encoder () inStreaming.Source.filter_map enc src |> of_source
let res =let open Lwt_result.Syntax inlet* () =poll' [ read_frame (); write () ] >>= function| Error _ as e ->Lwt_pipe.close_nonblock p;close_input input;proc#close >|= Fun.const e| Ok () as o -> Lwt.return oinL.info (fun m -> m "closing the process");proc#close >|= function| Unix.WEXITED 0 when Lwt.is_sleeping p_p ->Error.msg "0 byte stream?"| Unix.WEXITED 0 -> Ok ()| Unix.WEXITED n -> Error.msgf "non 0 status code: %d" n| Unix.WSIGNALED n | Unix.WSTOPPED n ->L.warn (fun m -> m "stopped with code: %d" n);Ok ()in
let read t =match t.src with| Some src -> (Streaming.Source.next src |> function| Some (v, src) ->t.src <- Some src;Some v| None -> None)| None -> None
res >|= fun r ->L.err (fun m -> m "oyy m8");match (Lwt.is_sleeping p_p, r) with| true, (Error _ as e) -> Lwt.wakeup_later u_p e| true, Ok () -> failwith "unreachable"| false, Error e -> L.err (fun m -> m "%s" (Error.to_string e))| false, Ok () -> ())inlet k =Lwt.catch spawn (fun e ->L.err (fun m -> m "spawn error: %a" Error.pp (`Exn e));Lwt.return_unit)inLwt_pipe.keep p k;Lwt.on_termination k (fun () ->L.err (fun m -> m "HALP");Lwt_pipe.close_nonblock p);p_p |> Lwt_result.map of_pipeend
let close t =match t.src with| Some src ->t.src <- None;Streaming.Source.dispose src| None -> ()
open! Disco_core.Globalsopen Lwt.Infixmodule Snowflake = Disco_models.Snowflakemodule E = Disco_core.Eventsmodule Gateway = Disco_core.Gatewaymodule F = Relog.Field
(* open! Disco_core.Globalsopen Lwt.Infixmodule Snowflake = Disco_models.Snowflakemodule E = Disco_core.Eventsmodule Gateway = Disco_core.Gatewaymodule F = Relog.Field
type t = {gw : Gateway.t;mixer : Mixer.t;guild_id : snowflake;mutable muted : bool;mutable deafened : bool;tx : op Lwt_pipe.Writer.t;}
type t = {gw : Gateway.t;mixer : Mixer.t;guild_id : snowflake;mutable muted : bool;mutable deafened : bool;tx : op Lwt_pipe.Writer.t;}
type conn =| Detached| Init of { channel_id : snowflake; req : unit req; info : conn_info }| Connecting of { channel_id : snowflake; req : unit req }| Live of Session.t
type conn =| Detached| Init of { channel_id : snowflake; req : unit req; info : conn_info }| Connecting of { channel_id : snowflake; req : unit req }| Live of Session.t
let make ?(muted = false) ?(deafened = false) ~guild_id gw =let ( let+ ) = Result.( let+ ) inlet op_rx = Lwt_pipe.create () inlet mixer_rx = Lwt_pipe.create () inlet+ mixer = Mixer.create (Lwt_pipe.write mixer_rx) inlet t = { gw; guild_id; muted; deafened; tx = op_rx; mixer } in
let make ?(muted = false) ?(deafened = false) ~guild_id gw =let ( let+ ) = Result.( let+ ) inlet op_rx = Lwt_pipe.create () inlet mixer_rx = Lwt_pipe.create () inlet+ mixer = Mixer.create (Lwt_pipe.write mixer_rx) inlet t = { gw; guild_id; muted; deafened; tx = op_rx; mixer } in
let read_op () =Lwt_pipe.read op_rx >|= Option.get_exn >|= function| Req r -> `Op r| Gw g -> `Gw ginlet _read_mixer () =Lwt_pipe.read mixer_rx >|= Option.get_exn >|= fun mix -> `Mixer mixin
let read_op () =Lwt_pipe.read op_rx >|= Option.get_exn >|= function| Req r -> `Op r| Gw g -> `Gw ginlet _read_mixer () =Lwt_pipe.read mixer_rx >|= Option.get_exn >|= fun mix -> `Mixer mixin
let do_connect ~srv ~sess =let user_id = (Gateway.user t.gw).id inlet guild_id = t.guild_id inSession.create ~guild_id ~user_id ~channel_id:sess.channel_id~session_id:sess.session_id ~token:srv.token srv.endpointin
let do_connect ~srv ~sess =let user_id = (Gateway.user t.gw).id inlet guild_id = t.guild_id inSession.create ~guild_id ~user_id ~channel_id:sess.channel_id~session_id:sess.session_id ~token:srv.token srv.endpointin
let run () =let conn = ref Detached inlet rec poll q =Lwt.nchoose_split q >>= function| [], [] -> Lwt_result.return ()| rs, ps -> (match handle ps rs with| Ok [] -> Lwt_result.return ()| Ok q -> poll q| Error _ as err -> Lwt.return err)and handle out rs =match (rs, !conn) with| [], _ -> Ok out| `Noop :: xs, _ -> handle out xs| `Cancel :: xs, Init { req; _ } ->Lwt.wakeup_later (snd req) @@ Error.msg "timed out";conn := Detached;handle out xs| `Cancel :: xs, _ -> handle out xs| `Connected (Ok session) :: xs, (Init { req; _ } | Connecting { req; _ })->conn := Live session;L.info (fun m -> m "connected");Lwt.wakeup_later (snd req) (Ok ());handle out xs| ( `Connected (Error _ as err) :: xs,(Init { req; _ } | Connecting { req; _ }) ) ->conn := Detached;L.err (fun m -> m "error connecting");Lwt.wakeup_later (snd req) err;handle out xs| `Connected (Ok session) :: xs, _ ->conn := Live session;handle out xs| `Connected (Error _) :: xs, _ ->conn := Detached;handle out xs| ( (`Op (Join (cid, nreq)) as op) :: xs,(Init { req; channel_id; _ } | Connecting { req; channel_id; _ }) ) ->L.info (fun m -> m "join request while connecting");if Snowflake.(cid = channel_id) then (Lwt.async (fun () ->fst req >|= fun res -> Lwt.wakeup_later (snd nreq) res);handle (read_op () :: out) xs)else handle (Lwt.return op :: read_op () :: out) xs| `Op (Join (channel_id, req)) :: xs, Live session ->L.info (fun m -> m "join request while connected");if Snowflake.(channel_id = Session.channel_id session) then (Lwt.wakeup_later (snd req) (Ok ());handle (read_op () :: out) xs)else (conn := Init { channel_id; req; info = Empty };let reconn =Session.disconnect session >>= fun () ->Gateway.send_voice_state_update t.gw ~channel_id~self_mute:t.muted ~self_deaf:t.deafened t.guild_id>|= fun () -> `Noopinhandle (reconn :: read_op () :: out) xs)| `Op (Join (channel_id, req)) :: xs, Detached ->L.info (fun m -> m "join request while detached");conn := Init { channel_id; req; info = Empty };let send =Gateway.send_voice_state_update t.gw ~channel_id ~self_mute:t.muted~self_deaf:t.deafened t.guild_id>|= fun () -> `Noopinlet timeout =Lwt.pick[(Lwt_unix.sleep 5. >|= fun () -> `Cancel);(fst req >|= fun _ -> `Noop);]inhandle (send :: timeout :: read_op () :: out) xs| `Gw Dc :: xs, Live session ->L.info (fun m -> m "disconnected");conn := Detached;let dc = Session.disconnect session >|= fun () -> `Noop inhandle (dc :: read_op () :: out) xs| `Gw (Srv srv) :: xs, Live s ->ifString.(Session.endpoint s <> srv.endpoint || Session.token s <> srv.token)then (L.warn (fun m -> m "new voice server info, reconnecting");let req = Lwt.wait () inlet sess ={session_id = Session.session_id s;channel_id = Session.channel_id s;}inconn := Connecting { channel_id = sess.channel_id; req };let reconn =Session.disconnect s >>= fun () ->do_connect ~srv ~sess >|= fun res -> `Connected resinhandle (reconn :: read_op () :: out) xs)else handle (read_op () :: out) xs| `Gw (Sess sess) :: xs, Live s ->ifSnowflake.(Session.channel_id s <> sess.channel_id)|| String.(Session.session_id s <> sess.session_id)then (L.warn (fun m -> m "new voice session info, reconnecting");let req = Lwt.wait () inlet srv ={ token = Session.token s; endpoint = Session.endpoint s }inconn := Connecting { channel_id = sess.channel_id; req };let reconn =Session.disconnect s >>= fun () ->do_connect ~srv ~sess >|= fun res -> `Connected resinhandle (reconn :: read_op () :: out) xs)else handle (read_op () :: out) xs| `Gw _ :: xs, Detached ->L.warn (fun m -> m "gateway event on detached call");handle (read_op () :: out) xs| (`Gw _ as ev) :: xs, Connecting _ ->L.info (fun m -> m "buffering gw event while connecting");handle (Lwt.return ev :: read_op () :: out) xs| `Gw (Srv srv) :: xs, Init { info = Got_sess sess; channel_id; req }| `Gw (Sess sess) :: xs, Init { info = Got_srv srv; channel_id; req } ->conn := Connecting { channel_id; req };let connect = do_connect ~srv ~sess >|= fun res -> `Connected res inhandle (connect :: read_op () :: out) xs| `Gw (Srv nsrv) :: xs, Init ({ info = Got_srv _ | Empty; _ } as init) ->conn := Init { init with info = Got_srv nsrv };handle (read_op () :: out) xs| `Gw (Sess nsess) :: xs, Init ({ info = Got_sess _ | Empty; _ } as init)->conn := Init { init with info = Got_sess nsess };handle (read_op () :: out) xs| `Gw Dc :: xs, Init { req; _ } ->Lwt.wakeup_later (snd req) (Error.msg "dc'ed when connecting?");handle (read_op () :: out) xsinpoll [ read_op () ]inlet evloop =run () >|= function| Ok () -> ()| Error e -> L.err (fun m -> m "call evloop crashed: %a" Error.pp e)inLwt_pipe.keep op_rx evloop;Lwt.on_termination evloop (fun () ->Lwt_pipe.close_nonblock op_rx;Mixer.destroy mixer;Lwt_pipe.close_nonblock mixer_rx);t
let run () =let conn = ref Detached inlet rec poll q =Lwt.nchoose_split q >>= function| [], [] -> Lwt_result.return ()| rs, ps -> (match handle ps rs with| Ok [] -> Lwt_result.return ()| Ok q -> poll q| Error _ as err -> Lwt.return err)and handle out rs =match (rs, !conn) with| [], _ -> Ok out| `Noop :: xs, _ -> handle out xs| `Cancel :: xs, Init { req; _ } ->Lwt.wakeup_later (snd req) @@ Error.msg "timed out";conn := Detached;handle out xs| `Cancel :: xs, _ -> handle out xs| `Connected (Ok session) :: xs, (Init { req; _ } | Connecting { req; _ })->conn := Live session;L.info (fun m -> m "connected");Lwt.wakeup_later (snd req) (Ok ());handle out xs| ( `Connected (Error _ as err) :: xs,(Init { req; _ } | Connecting { req; _ }) ) ->conn := Detached;L.err (fun m -> m "error connecting");Lwt.wakeup_later (snd req) err;handle out xs| `Connected (Ok session) :: xs, _ ->conn := Live session;handle out xs| `Connected (Error _) :: xs, _ ->conn := Detached;handle out xs| ( (`Op (Join (cid, nreq)) as op) :: xs,(Init { req; channel_id; _ } | Connecting { req; channel_id; _ }) ) ->L.info (fun m -> m "join request while connecting");if Snowflake.(cid = channel_id) then (Lwt.async (fun () ->fst req >|= fun res -> Lwt.wakeup_later (snd nreq) res);handle (read_op () :: out) xs)else handle (Lwt.return op :: read_op () :: out) xs| `Op (Join (channel_id, req)) :: xs, Live session ->L.info (fun m -> m "join request while connected");if Snowflake.(channel_id = Session.channel_id session) then (Lwt.wakeup_later (snd req) (Ok ());handle (read_op () :: out) xs)else (conn := Init { channel_id; req; info = Empty };let reconn =Session.disconnect session >>= fun () ->Gateway.send_voice_state_update t.gw ~channel_id~self_mute:t.muted ~self_deaf:t.deafened t.guild_id>|= fun () -> `Noopinhandle (reconn :: read_op () :: out) xs)| `Op (Join (channel_id, req)) :: xs, Detached ->L.info (fun m -> m "join request while detached");conn := Init { channel_id; req; info = Empty };let send =Gateway.send_voice_state_update t.gw ~channel_id ~self_mute:t.muted~self_deaf:t.deafened t.guild_id>|= fun () -> `Noopinlet timeout =Lwt.pick[(Lwt_unix.sleep 5. >|= fun () -> `Cancel);(fst req >|= fun _ -> `Noop);]inhandle (send :: timeout :: read_op () :: out) xs| `Gw Dc :: xs, Live session ->L.info (fun m -> m "disconnected");conn := Detached;let dc = Session.disconnect session >|= fun () -> `Noop inhandle (dc :: read_op () :: out) xs| `Gw (Srv srv) :: xs, Live s ->ifString.(Session.endpoint s <> srv.endpoint || Session.token s <> srv.token)then (L.warn (fun m -> m "new voice server info, reconnecting");let req = Lwt.wait () inlet sess ={session_id = Session.session_id s;channel_id = Session.channel_id s;}inconn := Connecting { channel_id = sess.channel_id; req };let reconn =Session.disconnect s >>= fun () ->do_connect ~srv ~sess >|= fun res -> `Connected resinhandle (reconn :: read_op () :: out) xs)else handle (read_op () :: out) xs| `Gw (Sess sess) :: xs, Live s ->ifSnowflake.(Session.channel_id s <> sess.channel_id)|| String.(Session.session_id s <> sess.session_id)then (L.warn (fun m -> m "new voice session info, reconnecting");let req = Lwt.wait () inlet srv ={ token = Session.token s; endpoint = Session.endpoint s }inconn := Connecting { channel_id = sess.channel_id; req };let reconn =Session.disconnect s >>= fun () ->do_connect ~srv ~sess >|= fun res -> `Connected resinhandle (reconn :: read_op () :: out) xs)else handle (read_op () :: out) xs| `Gw _ :: xs, Detached ->L.warn (fun m -> m "gateway event on detached call");handle (read_op () :: out) xs| (`Gw _ as ev) :: xs, Connecting _ ->L.info (fun m -> m "buffering gw event while connecting");handle (Lwt.return ev :: read_op () :: out) xs| `Gw (Srv srv) :: xs, Init { info = Got_sess sess; channel_id; req }| `Gw (Sess sess) :: xs, Init { info = Got_srv srv; channel_id; req } ->conn := Connecting { channel_id; req };let connect = do_connect ~srv ~sess >|= fun res -> `Connected res inhandle (connect :: read_op () :: out) xs| `Gw (Srv nsrv) :: xs, Init ({ info = Got_srv _ | Empty; _ } as init) ->conn := Init { init with info = Got_srv nsrv };handle (read_op () :: out) xs| `Gw (Sess nsess) :: xs, Init ({ info = Got_sess _ | Empty; _ } as init)->conn := Init { init with info = Got_sess nsess };handle (read_op () :: out) xs| `Gw Dc :: xs, Init { req; _ } ->Lwt.wakeup_later (snd req) (Error.msg "dc'ed when connecting?");handle (read_op () :: out) xsinpoll [ read_op () ]inlet evloop =run () >|= function| Ok () -> ()| Error e -> L.err (fun m -> m "call evloop crashed: %a" Error.pp e)inLwt_pipe.keep op_rx evloop;Lwt.on_termination evloop (fun () ->Lwt_pipe.close_nonblock op_rx;Mixer.destroy mixer;Lwt_pipe.close_nonblock mixer_rx);t
let update_session ?channel_id ~session_id t =let upd =match channel_id with| None -> Dc| Some channel_id -> Sess { channel_id; session_id }inLwt_pipe.write_exn t.tx @@ Gw upd
let update_session ?channel_id ~session_id t =let upd =match channel_id with| None -> Dc| Some channel_id -> Sess { channel_id; session_id }inLwt_pipe.write_exn t.tx @@ Gw upd
let join ~channel_id t =let req = Lwt.wait () inLwt_pipe.write_exn t.tx @@ Req (Join (channel_id, req)) >>= fun () -> fst req
let join ~channel_id t =let req = Lwt.wait () inLwt_pipe.write_exn t.tx @@ Req (Join (channel_id, req)) >>= fun () -> fst req
let leave t =Lwt_pipe.write t.tx @@ Gw Dc >>= fun _ ->Gateway.send_voice_state_update t.gw ~self_mute:t.muted ~self_deaf:t.deafenedt.guild_id
let leave t =Lwt_pipe.write t.tx @@ Gw Dc >>= fun _ ->Gateway.send_voice_state_update t.gw ~self_mute:t.muted ~self_deaf:t.deafenedt.guild_id *)
(* open! Disco_core.Globalsmodule L = (val Relog.logger ~namespace:__MODULE__ ())module Parser = structlet frame ~sample_p ~channels ~size ~kind =let buf = Bigarray.Array1.create kind Bigarray.c_layout (channels * size) inlet p =let open Angstrom inlet sample = count channels sample_p inlet rec samples ?(i = 0) () =end_of_input >>| (fun () -> `eof) <|> (sample >>| fun s -> `sample s)>>= function| `eof -> return ()| `sample chans ->List.iteri (fun ci c -> buf.{i + ci} <- c) chans;samples ~i:(i + channels) ()insamples () >>| fun () -> bufinfun buf ->Angstrom.parse_bigstring ~consume:Angstrom.Consume.All p buf |> function| Ok frame -> frame| Error str -> failwith @@ "error parsing raw audio frame " ^ strlet s16le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_int16 ~channels ~size:frame_size~kind:Bigarray.int16_signedlet s16be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_int16 ~channels ~size:frame_size~kind:Bigarray.int16_signedlet f32le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_float ~channels ~size:frame_size~kind:Bigarray.float32let f32be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_float ~channels ~size:frame_size~kind:Bigarray.float32let f64le ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.LE.any_double ~channels ~size:frame_size~kind:Bigarray.float64let f64be ?(channels = 2) ?(frame_size = 48000) =frame ~sample_p:Angstrom.BE.any_double ~channels ~size:frame_size~kind:Bigarray.float64endlet pcm_args =["-nostdin";"-analyzeduration";"0";"-f";"s16le";"-ar";"48000";"-ac";"2";"-flush_packets";"1";]let stdout_args = [ "-" ]let frame_reader () =let buf = Bigstringaf.create (Rtp._FRAME_SIZE * Rtp._CHANNELS * 2) inlet blen = Bigstringaf.length buf inlet parse_frame =let parser =Parser.s16le ~channels:Rtp._CHANNELS ~frame_size:Rtp._FRAME_SIZEinfun () -> parser bufinfun ic ->Lwt_io.read_into_exactly_bigstring ic buf 0 blen |> Lwt_result.catch>|= function| Ok () -> `Frame (parse_frame ())| Error End_of_file -> `Eof| Error exn -> `Exn exnlet writer = function| `Stream s ->let f oc =Lwt_pipe.read s >>= function| Some d -> (Lwt_io.write_from_exactly_bigstring oc d 0 (Bigstringaf.length d)|> Lwt_result.catch>|= function| Ok () -> true| _ -> false)| None -> Lwt_io.close oc >|= Fun.const falseinf| _ -> fun oc -> Lwt_io.close oc >|= Fun.const falselet close_input = function `Stream s -> Lwt_pipe.close_nonblock s | _ -> ()let create input =let cmd = "ffmpeg" inlet i =match input with| `Stream _ -> [ "-i"; "-" ]| `File path -> [ "-i"; path ]| `Url url -> [ "-i"; url ]inlet args = List.concat [ i; pcm_args; stdout_args ] inSwitch.run @@ fun sw ->let cmd_str = cmd :: args |> List.to_string ~sep:" " Fun.id inL.debug (fun m -> m "running cmd: %s" cmd_str);let init () = Eio_proc.spawn ~sw inlet stop proc = Eio_proc.close proc |> ignore inlet pull proc = None inlet p = Lwt_pipe.create () inlet p_p, u_p = Lwt.wait () inlet spawn () =let cmd_str = cmd :: args |> List.to_string ~sep:" " Fun.id inL.debug (fun m -> m "running cmd: %s" cmd_str);Lwt_process.with_process_full("", Array.of_list @@ (cmd :: args))(fun proc ->L.debug (fun m -> m "ffmpeg running with pid=%d" proc#pid);let read_logs () =Lwt_io.read ~count:0x100 proc#stderr >|= fun s ->`Logs (String.length s = 0)inlet read_frame () = frame_reader () proc#stdout inlet write () = writer input proc#stdin >|= fun r -> `Write r inlet rec poll' q =Lwt.nchoose_split q >>= function| [], [] -> Lwt_result.return ()| rs, ps -> (match handle ~out:ps rs with| Ok [] -> Lwt_result.return ()| Ok q -> poll' q| Error _ as e -> Lwt.return e)and handle ?(out = []) = function| [] -> Ok out| (`Write false | `Eof | `Logs true) :: xs -> handle ~out xs| `Logs false :: xs -> handle ~out:(read_logs () :: out) xs| `Frame frame :: xs ->if Lwt.is_sleeping p_p then Lwt.wakeup_later u_p (Ok p);let fwd = Lwt_pipe.write p frame >|= fun r -> `Fwd r inhandle ~out:(fwd :: out) xs| `Fwd true :: xs ->let r = read_frame () inhandle ~out:(r :: out) xs| `Fwd false :: _ ->L.warn (fun m -> m "receiving end of pipe closed, cleaning up...");List.iter Lwt.cancel out;let clean =Lwt_io.abort proc#stdin >>= fun () ->Lwt_io.abort proc#stdout >>= fun () ->Lwt_io.abort proc#stderr >|= fun () ->proc#terminate;`EofinOk [ clean ]| `Write true :: xs ->let w = write () inhandle ~out:(w :: out) xs| (`Exn _ as e) :: _ ->List.iter Lwt.cancel out;L.err (fun m -> m "boop %a" Error.pp e);Error einlet res =let open Lwt_result.Syntax inlet* () =poll' [ read_frame (); write () ] >>= function| Error _ as e ->Lwt_pipe.close_nonblock p;close_input input;proc#close >|= Fun.const e| Ok () as o -> Lwt.return oinL.info (fun m -> m "closing the process");proc#close >|= function| Unix.WEXITED 0 when Lwt.is_sleeping p_p ->Error.msg "0 byte stream?"| Unix.WEXITED 0 -> Ok ()| Unix.WEXITED n -> Error.msgf "non 0 status code: %d" n| Unix.WSIGNALED n | Unix.WSTOPPED n ->L.warn (fun m -> m "stopped with code: %d" n);Ok ()inres >|= fun r ->L.err (fun m -> m "oyy m8");match (Lwt.is_sleeping p_p, r) with| true, (Error _ as e) -> Lwt.wakeup_later u_p e| true, Ok () -> failwith "unreachable"| false, Error e -> L.err (fun m -> m "%s" (Error.to_string e))| false, Ok () -> ())inlet k =Lwt.catch spawn (fun e ->L.err (fun m -> m "spawn error: %a" Error.pp (`Exn e));Lwt.return_unit)inLwt_pipe.keep p k;Lwt.on_termination k (fun () ->L.err (fun m -> m "HALP");Lwt_pipe.close_nonblock p);p_p |> Lwt_result.map of_pipe *)
open! Disco_core.Globalsopen Lwt.Infixmodule Snowflake = Disco_models.Snowflakemodule E = Disco_core.Eventsmodule Sf_map = Map.Make (Snowflake)module Gateway = Disco_core.Gateway
(* open! Disco_core.Globalsmodule Snowflake = Disco_models.Snowflakemodule E = Disco_core.Eventsmodule Sf_map = Map.Make (Snowflake)module Gateway = Disco_core.Gatewaymodule L = (val Relog.logger ~namespace:__MODULE__ ())module F = Relog.Field
type t = { mutable calls : Call.t Sf_map.t; gw : Gateway.t }
let server_update t srv =Eio_mutex.with_ t.mtx @@ fun () ->L.info (fun m -> m "srv update");Sf_map.get srv.E.Voice_server_update.guild_id t.calls|> Option.iter (fun call ->Call.update_server ~token:srv.token ~endpoint:srv.endpoint call)
let user_id { gw; _ } =let user = Gateway.user gw inuser.idlet server_update t srv =L.info (fun m -> m "srv update");Sf_map.get srv.E.Voice_server_update.guild_id t.calls|> Option.map (fun call ->Call.update_server ~token:srv.token ~endpoint:srv.endpoint call)|> Option.get_or ~default:Lwt.return_unitlet state_update t vst =L.info (fun m -> m "state update");match vst.E.Voice_state.guild_id with| Some guild_id when Snowflake.(user_id t = vst.user_id) ->Sf_map.get guild_id t.calls|> Option.map (fun call ->Call.update_session ?channel_id:vst.channel_id~session_id:vst.session_id call)|> Option.get_or ~default:Lwt.return_unit| _ -> Lwt.return_unit
let state_update t vst =Eio_mutex.with_ t.mtx @@ fun () ->L.info (fun m -> m "state update");match vst.E.Voice_state.guild_id with| Some guild_id when Snowflake.(user_id t = vst.user_id) ->Sf_map.get guild_id t.calls|> Option.iter (fun call ->Call.update_session ?channel_id:vst.channel_id~session_id:vst.session_id call)| _ -> ()
let make gw =let t = { calls = Sf_map.empty; gw } inlet evloop () =let open Lwt.Syntax inlet* evs = Gateway.events gw |> Mpmc.Sink.clone inlet rec fwd () =Mpmc.Sink.pull evs >>= function| Some (E.Voice_server_update v) -> server_update t v >>= fwd| Some (Voice_state_update v) -> state_update t v >>= fwd| Some _ -> fwd ()| None -> Lwt.return_unitinfwd ()inLwt.async evloop;t
let make gw =let t = { mtx = Eio_mutex.make (); calls = Sf_map.empty; gw } inGateway.sub gw ~fn:(function| E.Voice_server_update v -> server_update t v| Voice_state_update v -> state_update t| _ -> ());t
let destroy t =Sf_map.to_seq t.calls|> Seq.map (fun (_, call) -> Call.leave call)|> Seq.to_list |> Lwt.join>|= fun () -> t.calls <- Sf_map.empty
let destroy t =Eio_mutex.with_ t.mtx @@ fun () ->Sf_map.to_seq t.calls|> Seq.map (fun (_, call) () -> Call.leave call)|> Seq.to_list |> Fiber.all;t.calls <- Sf_map.empty
let get t ~guild_id =match Sf_map.get guild_id t.calls with| Some call -> call| None ->let call = Call.make t.gw ~guild_id |> Result.get_exn int.calls <- Sf_map.add guild_id call t.calls;call
let get t ~guild_id =Eio_mutex.with_ t.mtx @@ fun () ->match Sf_map.get guild_id t.calls with| Some call -> call| None ->let call = Call.make t.gw ~guild_id |> Result.get_exn int.calls <- Sf_map.add guild_id call t.calls;call *)
module Driver = structtype t = {mutable state : state;mutable silence : silence_stream option;mutable dead : bool;}
and state = Idle | Playing of streamand stream = { waker : waker; rx : bigstring Lwt_pipe.Reader.t }and waker = bool Lwt.t * bool Lwt.u
and state = Idle | Playing of stream
let waker : unit -> waker = Lwt.tasklet make_silence ?n () = Audio_stream.n_silence_pipe ?n ()let create () = { state = Idle; silence = None; dead = false }let now () = Mtime_clock.elapsed_ns ()let playing t = match t.state with Playing s -> Some s | _ -> Nonelet is_playing t = match t.state with Playing _ -> true | _ -> false
let waker : unit -> waker = Lwt.task
let play ~s t =match t.state with| Playing os ->Lwt.wakeup_later (snd os.waker) false;if Option.is_none t.silence then t.silence <- Some (make_silence ());t.state <- Playing s| Idle -> t.state <- Playing s
let create () = { state = Idle; silence = None; dead = false }
let run ~yield ~play ~stop t =let rec exhaust ?(i = 0) p =Lwt_pipe.read p >>= function| Some frame ->play (i + 1) frame >>= fun ok ->let i = i + 1 inif ok then exhaust ~i p else Lwt.return (`Yield i)| None -> Lwt.return (`Closed i)inlet framelen = float Rtp._FRAME_LEN /. 1e3 inlet schedule_next ?drift ?(frames = 1) () =let timeout = float frames *. framelen inlet with_drift d =let delta = Int64.(now () - d |> to_float) /. 1e9 intimeout -. Float.min delta timeoutinlet timeout =Option.map with_drift drift |> Option.get_or ~default:timeoutinL.trace (fun m ->m "sent %d frames, next tick in %f seconds" frames timeout);Lwt_unix.sleep timeout >|= fun () -> `Tickinlet last_yield = ref None inlet last_tick = ref (now ()) inlet rec yield_till tick =let y =match !last_yield with| Some y -> y| None ->let y = yield t inlast_yield := Some y;yinLwt.choose [ tick; (y >|= fun () -> `Yield) ] >>= function| `Yield when t.dead ->Lwt.cancel tick;Lwt.return_unit| `Yield ->last_yield := None;yield_till tick| `Tick ->let t = now () inL.trace (fun m ->let delta = Int64.(t - !last_tick |> to_float) inm "tick +%2fms" (delta /. 1e6));last_tick := t;Lwt.return_unitinlet rec f' ?(drift = now ()) ?(i = 0) () =match (t.silence, t.state) with| _ when t.dead ->destroy_active t;Lwt.return_unit| Some s, st -> (exhaust ~i s >>= function| `Closed i ->t.silence <- None;(match st with Idle -> stop () | _ -> Lwt.return_unit)>>= f' ~drift ~i| `Yield frames -> yield_till (schedule_next ~drift ~frames ()) >>= f')| None, Idle ->(match !last_yield with| Some y ->last_yield := None;y| None -> yield t)>>= f'| None, Playing s -> (exhaust ~i s.rx >>= function| `Closed i ->t.silence <- Some (make_silence ());t.state <- Idle;Lwt.wakeup_later (snd s.waker) true;f' ~drift ~i ()| `Yield frames ->yield_till (schedule_next ~drift ~frames ()) >>= fun () -> f' ())inf' ()end
let playing t = match t.state with Playing s -> Some s | _ -> None
let create ?(burst = 15) out =let chan = Lwt_pipe.create () inlet evloop_tx = Lwt_pipe.Writer.map ~f:(fun msg -> `Req msg) chan inlet driver = Driver.create () inlet yield driver =Lwt_pipe.read chan >|= Option.get_or ~default:`Poison >|= function| `Req (Play (s, waker)) ->let s = Lwt_pipe.Reader.filter_map ~f:encode s inDriver.play driver ~s:{ waker; rx = s }| `Req Stop -> Driver.stop driver| `Poison -> Driver.destroy driverinlet play i frame = out (`Play frame) >|= fun r -> r && i < burst inlet stop () = out `Stop >|= ignore inlet f = Driver.run ~yield ~play ~stop driver inLwt_pipe.keep chan f;Lwt_pipe.link_close chan ~after:evloop_tx;Lwt.on_termination f (fun () -> Lwt_pipe.close_nonblock chan);{ driver; evloop_tx }
let is_playing t = match t.state with Playing _ -> true | _ -> false
let play ?(k = fun ~status:_ s -> Lwt_pipe.close_nonblock s) t stream =let ((wp, _) as waker) = Driver.waker () inLwt.on_success wp (fun status -> k ~status stream);Lwt_pipe.write_exn t.evloop_tx (Play (stream, waker))
let destroy_active t =match t.state with| Playing s ->Lwt.wakeup_later (snd s.waker) false;t.state <- Idle| Idle -> ()let stop = destroy_activelet play ~s t =match t.state with| Playing os ->Lwt.wakeup_later (snd os.waker) false;if Option.is_none t.silence then t.silence <- Some (make_silence ());t.state <- Playing s| Idle -> t.state <- Playing slet destroy t = if not t.dead then t.dead <- truelet run ~yield ~play ~stop t =let rec exhaust ?(i = 0) p =Lwt_pipe.read p >>= function| Some frame ->play (i + 1) frame >>= fun ok ->let i = i + 1 inif ok then exhaust ~i p else Lwt.return (`Yield i)| None -> Lwt.return (`Closed i)inlet framelen = float Rtp._FRAME_LEN /. 1e3 inlet schedule_next ?drift ?(frames = 1) () =let timeout = float frames *. framelen inlet with_drift d =let delta = Int64.(now () - d |> to_float) /. 1e9 intimeout -. Float.min delta timeoutinlet timeout =Option.map with_drift drift |> Option.get_or ~default:timeoutinL.trace (fun m ->m "sent %d frames, next tick in %f seconds" frames timeout);Lwt_unix.sleep timeout >|= fun () -> `Tickinlet last_yield = ref None inlet last_tick = ref (now ()) inlet rec yield_till tick =let y =match !last_yield with| Some y -> y| None ->let y = yield t inlast_yield := Some y;yinLwt.choose [ tick; (y >|= fun () -> `Yield) ] >>= function| `Yield when t.dead ->Lwt.cancel tick;Lwt.return_unit| `Yield ->last_yield := None;yield_till tick| `Tick ->let t = now () inL.trace (fun m ->let delta = Int64.(t - !last_tick |> to_float) inm "tick +%2fms" (delta /. 1e6));last_tick := t;Lwt.return_unitinlet rec f' ?(drift = now ()) ?(i = 0) () =match (t.silence, t.state) with| _ when t.dead ->destroy_active t;Lwt.return_unit| Some s, st -> (exhaust ~i s >>= function| `Closed i ->t.silence <- None;(match st with Idle -> stop () | _ -> Lwt.return_unit)>>= f' ~drift ~i| `Yield frames -> yield_till (schedule_next ~drift ~frames ()) >>= f')| None, Idle ->(match !last_yield with| Some y ->last_yield := None;y| None -> yield t)>>= f'| None, Playing s -> (exhaust ~i s.rx >>= function| `Closed i ->t.silence <- Some (make_silence ());t.state <- Idle;Lwt.wakeup_later (snd s.waker) true;f' ~drift ~i ()| `Yield frames ->yield_till (schedule_next ~drift ~frames ()) >>= fun () -> f' ())inf' ()endtype t = { driver : Driver.t; evloop_tx : evloop_msg Lwt_pipe.Writer.t }and evloop_msg = Stop | Play of pcm_s16_frame Lwt_pipe.Reader.t * Driver.wakerlet create_opus_encoder ?(frametype = `s16) () =let open Result.Infix inlet rec set_ctls ~l enc =match l with| ctl :: l -> Opus.Encoder.ctl enc ctl >>= fun () -> set_ctls ~l enc| [] -> Ok encinOpus.(Encoder.create ~samplerate:Rtp._SAMPLE_RATE ~channels:`stereo~application:`Audio ()>>= fun enc ->let shared =CTL.[Set_signal `Music;Set_bitrate `Max;Set_complexity 10;Set_packet_loss_perc 5;Set_inband_FEC true;Set_DTX false;]inlet ctls =match frametype with| `s16 -> CTL.(Set_LSB_depth 16) :: shared| `f32 -> CTL.(Set_LSB_depth 24) :: sharedinset_ctls ~l:ctls enc)|> function| Error e -> Error.msgf "opus error: %a" Opus.Error.pp e| Ok v -> Ok vlet create ?(burst = 15) out =let ( let+ ) = Result.( let+ ) inlet chan = Lwt_pipe.create () inlet evloop_tx = Lwt_pipe.Writer.map ~f:(fun msg -> `Req msg) chan inlet+ encoder = create_opus_encoder () inlet encode =let pkt_buf = Bigstringaf.create Rtp._VOICE_PACKET_MAX infun buf ->matchOpus.Encoder.encode_blit encoder ~duration:Rtp._FRAME_LEN buf pkt_bufwith| Ok `DTX ->L.err (fun m -> m "DTX????");None| Ok (`Packet p) -> Some p| Error e -> failwith ("opus error: " ^ Opus.Error.to_string e)inlet driver = Driver.create () inlet yield driver =Lwt_pipe.read chan >|= Option.get_or ~default:`Poison >|= function| `Req (Play (s, waker)) ->let s = Lwt_pipe.Reader.filter_map ~f:encode s inDriver.play driver ~s:{ waker; rx = s }| `Req Stop -> Driver.stop driver| `Poison -> Driver.destroy driverinlet play i frame = out (`Play frame) >|= fun r -> r && i < burst inlet stop () = out `Stop >|= ignore inlet f = Driver.run ~yield ~play ~stop driver inLwt_pipe.keep chan f;Lwt_pipe.link_close chan ~after:evloop_tx;Lwt.on_termination f (fun () -> Lwt_pipe.close_nonblock chan);{ driver; evloop_tx }let play ?(k = fun ~status:_ s -> Lwt_pipe.close_nonblock s) t stream =let ((wp, _) as waker) = Driver.waker () inLwt.on_success wp (fun status -> k ~status stream);Lwt_pipe.write_exn t.evloop_tx (Play (stream, waker))let destroy t = Lwt_pipe.close_nonblock t.evloop_tx
let destroy t = Lwt_pipe.close_nonblock t.evloop_tx *)
(* TODO i'm assuming the same rate limiting of themain gateway applies here as well *)let create uri =let open Lwt_result.Syntax inlet capacity = 120 inlet rate = 1. /. (float capacity /. 60.) inlet tb = Token_bucket.make ~capacity rate inlet+ ws = Ws_conn.create ~zlib:false uri inlet rx =Lwt_pipe.of_stream (Ws_conn.stream ws)|> Lwt_pipe.Reader.map ~f:(function| Ws_conn.Payload pl -> `Pl pl| Close code ->let code = Close_code.of_close_code_exn code inL.warn (fun m ->m "voice ws session was closed: %a" Close_code.pp code);`Closed code)in{ tb; ws; rx }let rx { rx; _ } = rx
type t = { sw : Switch.t; bucket : Token_bucket.t; conn : Ws_conn.t }type frame = Payload of Payload.recv | Close of Close_code.t
if is_closed t thenLwt.return (Error.msg "cannot send payload to closed ws")elseToken_bucket.take t.tb >|= fun () ->Ws_conn.send t.ws pl;Ok ()
if Ws_conn.is_closed t.conn then raise Closed;Token_bucket.take ~sw:t.sw t.bucket;Ws_conn.send t.conn pl
let send_exn t pl =send t pl >|= function| Ok () -> ()| Error e -> failwith (Error.to_string e)
let read t =Ws_conn.read t.conn|> Option.map (function| Ws_conn.Close c -> Close (Close_code.of_close_code_exn c)| Payload p -> Payload p)let read_exn t = read t |> Option.get_exn
Lwt_pipe.close_nonblock t.rx;if is_closed t then ()else (Token_bucket.cancel_waiting t.tb;Ws_conn.close ~code t.ws)
if not @@ Ws_conn.is_closed t.conn then Ws_conn.close ~code t.conn(* TODO @quartz55: i'm assuming the same rate limitingof the main gateway applies here as well *)(* docs: clients are allowed to send 120 gateway commands every 60 seconds *)let create ~sw ~net uri =let capacity = 120 inlet rate = 1. /. (float capacity /. 60.) inlet bucket = Token_bucket.make ~capacity rate inlet conn = Ws_conn.create ~sw ~net ~zlib:false ~enc:`json uri inlet t = { sw; bucket; conn } inSwitch.on_release sw (fun () -> close ~code:`Going_away t);t
type handshake_state =| Greet of conn| Id of Heartbeat.t| Resuming of Heartbeat.t * rtp| Establish_udp of Heartbeat.t * Udp_connection.t
type heartbeat = int Heartbeat.ttype t = {guild_id : snowflake;user_id : snowflake;channel_id : snowflake;token : string;session_id : string;uri : Uri.t;ops : op Eio.Stream.t;mutable state : state;version : Versions.t;sw : Switch.t;}and op =| Ws of Pl.send| Speak of bool| Rtp of bigstring| Dc of (unit -> unit)
let do_handshake ~server_id ~user_id ~session_id ~token ?rtp wsd =let open Lwt_result.Syntax inlet ws_rx = Wsd.rx wsd in
let handshake ~sw ~net ~server_id ~user_id ~session_id ~token ?reconn ws =let module L =(val Relog.clone (module L) ~fields:F.[ bool "handshaking" true ])in
Heartbeat.make(fun nonce -> Lwt.async (fun () -> Wsd.send_exn wsd (Pl.heartbeat nonce)))
Heartbeat.make ~sw~t:(module Heartbeat.Int)(fun nonce ->L.debug (fun m ->m "sending heartbeat" ~fields:F.[ float "interval" interval ]);Ws.send ws (Pl.heartbeat nonce))
let rec poll' st =let* pl =Lwt_pipe.read ws_rx|> Lwt.map (function| Some (`Pl pl) -> Ok pl| Some (`Closed code) -> Error (`Closed code)| None -> assert false)in
let rec loop st =match Ws.read_exn ws with| Payload pl -> next st pl| Close code -> Error (`Closed code)and next st pl =
poll' (Resuming (hb, rtp))| ( ((Id hb | Resuming (hb, _) | Establish_udp (hb, _)) as st),Hello new_interval ) ->let hb_secs = Float.of_int new_interval /. 1e3 inL.warn (fun m -> m "got new greeting, updating heartbeat");
loop (Resuming (hb, rtp))| ((Id hb | Resuming (hb, _) | Establish_udp (hb, _)) as st), Hello new_hb->L.info (fun m -> m "got new greeting, updating heartbeat");let hb_secs = Float.of_int new_hb /. 1_000. in
let* udp = Udp_connection.create ~ssrc (ip, port) |> Error.catch_lwt inlet ip, port = Udp_connection.local_addr udp inlet address = Unix.string_of_inet_addr ip inlet* () =Wsd.send wsd(Pl.make_select_protocol ~address ~port ~mode:"xsalsa20_poly1305")inpoll' (Establish_udp (hb, udp))
let udp = Udp_connection.create ~sw ~net ~ssrc (ip, port) inlet (`Udp (ip, port)) = Udp_connection.local_addr udp inlet address = Format.sprintf "%a" Eio.Net.Ipaddr.pp ip inWs.send ws(Pl.make_select_protocol ~address ~port ~mode:"xsalsa20_poly1305");loop (Establish_udp (hb, udp))
let c = match rtp with Some s -> Reconnection s | None -> Fresh inpoll' (Greet c)type t = {version : Versions.t;guild_id : snowflake;user_id : snowflake;channel_id : snowflake;token : string;session_id : string;endpoint : string;op_tx : op Lwt_pipe.Writer.t;on_destroy : Error.t Lwt.t;}and op =| Ws of Pl.send| Speak of bool| Rtp of bigstring| Dc of (unit -> unit)let create ?(version = Versions.V4) ~guild_id ~user_id ~channel_id ~session_id~token endpoint =let open Lwt_result.Syntax inlet uri = Uri.of_string ("wss://" ^ endpoint) |> with_ws_params ~version inlet p_init, u_init = Lwt.wait () inlet chan = Lwt_pipe.create () inlet on_destroy, destroyed_u = Lwt.wait () inlet read_exn p = Lwt_pipe.read p >|= Option.get_exn inlet rec manage' ?rtp () =let rec connect () =let* wsd = Wsd.create uri inlet res =do_handshake ~server_id:guild_id ~user_id ~session_id ~token ?rtp wsdinLwt.bind res (function| Ok (hb, rtp) -> Lwt_result.return (wsd, hb, rtp)| Error (`Closed code) when Close_code.is_recoverable code ->L.warn (fun m ->m "recoverable close code during handshake, retrying...");connect ()| Error (`Closed `Disconnected) ->L.warn (fun m ->m "disconnected during handshake, invalid permissions?");Lwt.return(Error (`Discord "voice session disconnected during handshake"))| Error (`Closed _) ->L.error (fun m -> m "unrecoverable close code during handshake");assert false| Error #Error.t as e -> Lwt.return e)inlet* wsd, hb, rtp = connect () inif Lwt.is_sleeping p_init thenLwt.wakeup_later u_init(Ok{version;guild_id;user_id;channel_id;token;session_id;endpoint;op_tx = chan;on_destroy;});
match loop (Greet reconn) with| Ok o -> `Ok o| Error `Retry -> `Retry| Error (`Closed c) when Close_code.is_recoverable c -> `Retry| Error (`Closed _) ->L.err (fun m -> m "session closed during handshake");raise @@ Handshake_error "unrecoverable close code"| Error `Invalidated ->L.err (fun m ->m "session invalidated during handshake, invalid permissions?");raise @@ Handshake_error "invalid session"
let bus =Lwt_pipe.Reader.merge_all[Wsd.rx wsd |> Lwt_pipe.Reader.map ~f:(fun pl -> `Ws pl);chan |> Lwt_pipe.Reader.map ~f:(fun op -> `Op op);]inlet rec poll' () =let open Lwt.Syntax inlet* task = read_exn bus inmatch task with| `Ws (`Pl pl) -> handle_payload pl| `Ws (`Closed code) when Close_code.is_recoverable code ->L.warn (fun m ->m "session closed with recoverable close code, retrying...");rtp.speaking <- false;Lwt_pipe.close_nonblock bus;Heartbeat.cancel hb;manage' ~rtp ()| `Ws (`Closed code) ->L.error (fun m ->m "session closed with unrecoverable close code: %a" Close_code.ppcode);Lwt.return(Error (`Discord (Format.asprintf "%a" Close_code.pp code)))| `Op (Ws pl) -> Wsd.send_exn wsd pl >>= poll'| `Op (Speak sp) when Stdlib.(sp != rtp.speaking) ->rtp.speaking <- sp;Wsd.send_exn wsd(Pl.make_speaking ~ssrc:(Rtp.ssrc rtp.rtp) ~delay:0(if sp then 1 else 0))>>= poll'| `Op (Speak _) -> poll' ()| `Op (Rtp audio) -> Rtp.send_packet rtp.rtp audio >>= poll'| `Op (Dc k) ->Lwt_pipe.close_nonblock bus;Lwt_pipe.close_nonblock chan;Rtp.destroy rtp.rtp;Wsd.close ~code:`Normal_closure wsd;k ();Lwt.return (Ok ())and handle_payload = function| Hello new_hb ->L.warn (fun m -> m "got new greeting, updating heartbeat");Heartbeat.preempt ~interval:(Float.of_int new_hb /. 1e3) hb;poll' ()| Ready info ->L.error (fun m ->m "got ready on established session, new voice server??@.%a"Pl.Ready.pp info);assert false| Session_description desc ->L.warn (fun m ->m "got session description, updating...@.%a"Pl.Session_description.pp desc);let secret = secret_of_int_list desc.secret_key inlet mode = Udp_connection.encryption_mode_of_string desc.mode inRtp.set_crypt rtp.rtp Udp_connection.{ secret; mode };poll' ()| Heartbeat_ack nonce ->Heartbeat.ack nonce hb;poll' ()| Speaking _ | Resumed | Client_disconnect ->L.debug (fun m -> m "ignoring speaking/resumed/clientdisconnect");poll' ()inpoll' () >|= fun out ->Heartbeat.cancel hb;Rtp.destroy rtp.rtp;Wsd.close ~code:`Going_away wsd;Lwt_pipe.close_nonblock bus;Lwt_pipe.close_nonblock chan;out
let connect ~sw ~net ~guild_id ~user_id ~session_id ~token ?info uri =let rec loop () =let ws = Ws.create ~sw ~net uri inhandshake ws ~sw ~net ~server_id:guild_id ~user_id ~session_id ~token?reconn:info|> function| `Ok (hb, rtp) -> Alive { ws; hb; rtp; speaking = false }| `Retry ->L.warn (fun m -> m "retrying handshake");loop ()
Lwt.async (fun () ->manage' ()|> Lwt.map (function| Ok () -> ()| Error e when Lwt.is_sleeping p_init ->Lwt.wakeup_later u_init (Error e)| Error e -> Lwt.wakeup_later destroyed_u e));p_initlet is_dead { op_tx; _ } = Lwt_pipe.is_closed op_txlet version { version; _ } = versionlet guild_id { guild_id; _ } = guild_idlet user_id { user_id; _ } = user_idlet channel_id { channel_id; _ } = channel_idlet token { token; _ } = token
loop ()
let p, u = Lwt.wait () insend_exn t (Dc (Lwt.wakeup_later u)) >>= fun () -> p
if not @@ is_dead t then (let p, u = Promise.create () insend_exn t (Dc (Promise.resolve u));Promise.await p)let kill t =t.state <- Dead;match Switch.get_error t.sw with| None -> Switch.fail t.sw Exit| Some _ -> ()let manage ~sw ~net t =let drain () =match t.state with| Dead -> ()| Alive { ws; hb; _ } ->Heartbeat.cancel hb;Ws.close ~code:`Abnormal_closure ws;t.state <- Deadinlet reconnect ?info () =drain ();let new_state =connect ~sw ~net ~guild_id:t.guild_id ~user_id:t.user_id~session_id:t.session_id ~token:t.token ?info t.uriint.state <- new_stateinlet rec loop () = match t.state with Dead -> () | Alive st -> next stand next st =let bus =Fiber.first(fun () -> `Ws (Ws.read_exn st.ws))(fun () -> `Op (Eio.Stream.take t.ops))inmatch bus with| `Op (Ws pl) ->Ws.send st.ws pl;loop ()| `Ws (Payload pl) -> handle_payload st pl| `Ws (Close code) when Close_code.is_recoverable code ->L.warn (fun m ->m "session closed with recoverable close code, retrying...");reconnect ~info:st.rtp ();loop ()| `Ws (Close code) ->L.error (fun m ->m "session closed with unrecoverable close code: %a" Close_code.ppcode);assert false| `Op (Speak sp) when not @@ Bool.equal sp st.speaking ->st.speaking <- sp;Ws.send st.ws(Pl.make_speaking ~ssrc:(Rtp.ssrc st.rtp) ~delay:0(if sp then 1 else 0));loop ()| `Op (Speak _) -> loop ()| `Op (Rtp audio) ->Rtp.send_packet st.rtp audio;loop ()| `Op (Dc k) ->Ws.close ~code:`Normal_closure st.ws;k ()and handle_payload st = function| Hello new_hb ->L.warn (fun m -> m "got new greeting, updating heartbeat");Heartbeat.preempt ~interval:(float new_hb /. 1e3) st.hb;loop ()| Ready info ->L.error (fun m ->m "got ready on established session, new voice server??@.%a"Pl.Ready.pp info);assert false| Session_description desc ->L.warn (fun m ->m "got session description, updating...@.%a"Pl.Session_description.pp desc);let secret = secret_of_int_list desc.secret_key inlet mode = Udp_connection.encryption_mode_of_string desc.mode inRtp.set_crypt st.rtp Udp_connection.{ secret; mode };loop ()| Heartbeat_ack nonce ->Heartbeat.ack st.hb nonce;loop ()| Speaking _ | Resumed | Client_disconnect ->L.debug (fun m -> m "ignoring speaking/resumed/clientdisconnect");loop ()inFun.protect ~finally:drain looplet create ~sw ~net ?(version = Versions.V4) ~guild_id ~user_id ~channel_id~session_id ~token endpoint =let uri = Uri.of_string ("wss://" ^ endpoint) |> with_ws_params ~version inlet p, u = Promise.create () inlet spawn () : no_return =Switch.run @@ fun sw ->let state = connect ~sw ~net ~guild_id ~user_id ~session_id ~token uri inlet ops = Eio.Stream.create 0 inlet t ={guild_id;user_id;channel_id;session_id;ops;state;version;token;uri;sw;}inSwitch.on_release sw (fun () -> kill t);Promise.resolve u t;manage ~sw ~net t;(* cleanup: stops any fibres still running (e.g. heartbeats) *)raise ExitinFiber.fork ~sw (fun () -> match spawn () with _ -> . | exception Exit -> ());Promise.await p
let b = Faraday.serialize_to_string f |> Bytes.unsafe_of_string inlet len = Bytes.length b inLwt_unix.send sock b 0 len [] >|= fun n -> assert (n = len)
let b = Faraday.serialize_to_bigstring f |> Cstruct.of_bigarray inEio.Net.send sock addr b
let recv_ip ~buf sock =let open Lwt.Syntax inlet b = Bigstringaf.to_string buf |> Bytes.unsafe_of_string inlet* _ = Lwt_unix.read sock b 0 74 inBigstringaf.blit_from_bytes b ~src_off:0 buf ~dst_off:0 ~len:74;
let recv_ip ~buf sock () =let b = Cstruct.of_bigarray ~len:74 buf inlet _, n = Eio.Net.recv sock b inassert (n = 74);
let () =match crypt.mode with| Normal ->let nonce = Faraday.create 24 inPacket.RTP.write_header ~seq ~ts ~ssrc:t.ssrc nonce;let padding =String.make(Sodium.Secret_box.nonce_size - Faraday.pending_bytes nonce)'\x00'inFaraday.write_string nonce padding;nonce |> Faraday.serialize_to_bigstring |> encrypt|> Faraday.schedule_bigstring f| Suffix ->let nonce = Sodium.Secret_box.(random_nonce () |> Bigbytes.of_nonce) inFaraday.schedule_bigstring f (encrypt nonce);Faraday.schedule_bigstring f nonce| Lite n ->let nonce = Bigstringaf.create Sodium.Secret_box.nonce_size inBigstringaf.unsafe_set_int32_be nonce 0 (Uint32.to_int32 !n);let _padding =Seq.(4 --^ Bigstringaf.length nonce|> iter (fun i -> nonce.{i} <- '\x00'))inlet next =if Uint32.(compare !n max_int) = 0 then Uint32.zeroelse Uint32.(!n + one)inn := next;Faraday.schedule_bigstring f (encrypt nonce);Faraday.schedule_bigstring f nonceint.flush_packet ()
match crypt.mode with| Normal ->let nonce = Faraday.create 24 inPacket.RTP.write_header ~seq ~ts ~ssrc:t.ssrc nonce;let padding =String.make(Sodium.Secret_box.nonce_size - Faraday.pending_bytes nonce)'\x00'inFaraday.write_string nonce padding;nonce |> Faraday.serialize_to_bigstring |> encrypt|> Faraday.schedule_bigstring f| Suffix ->let nonce = Sodium.Secret_box.(random_nonce () |> Bigbytes.of_nonce) inFaraday.schedule_bigstring f (encrypt nonce);Faraday.schedule_bigstring f nonce| Lite n ->let nonce = Bigstringaf.create Sodium.Secret_box.nonce_size inBigstringaf.unsafe_set_int32_be nonce 0 (Uint32.to_int32 !n);let _padding =Seq.(4 --^ Bigstringaf.length nonce |> iter (fun i -> nonce.{i} <- '\x00'))inlet next =if Uint32.(compare !n max_int) = 0 then Uint32.zeroelse Uint32.(!n + one)inn := next;Faraday.schedule_bigstring f (encrypt nonce);Faraday.schedule_bigstring f nonce
let create ~ssrc (ip, port) =let open Lwt.Syntax inlet sock =Lwt_unix.socket Unix.PF_INET Unix.SOCK_DGRAM(Unix.getprotobyname "udp").Unix.p_protoinlet* () = Lwt_unix.bind sock Unix.(ADDR_INET (inet_addr_any, 0)) inlet addr = Unix.inet_addr_of_string ip inlet* () = Lwt_unix.connect sock Unix.(ADDR_INET (addr, port)) inlet discord_addr = (addr, port) inL.info (fun m ->m "discovering external ip using discord's voice server: %s:%d" ip port);let* ip_d, port_d =ip_discovery ~ssrc sock|> Lwt.map (function Ok d -> d | Error msg -> failwith msg)inL.info (fun m -> m "discovered ip and port: %s:%d" ip_d port_d);let local_addr = Unix.(inet_addr_of_string ip_d, port_d) inlet f = Faraday.create (1024 * 4) inlet writev = Faraday_lwt_unix.writev_of_fd sock inlet send_tx = Lwt_pipe.create () inlet t ={f;sock;local_addr;discord_addr;ssrc;flush_packet = (fun () -> Lwt_pipe.write send_tx `Flush >|= ignore);send_tx;}inlet yield =let keep_alive =Lwt_stream.from (fun () ->Lwt_unix.sleep Packet.Keep_alive.interval >|= fun () ->Some `Keep_alive)|> Lwt_pipe.of_stream
let create ~sw ~net ~ssrc (ip, port) =let p, u = Promise.create () inlet run () : no_return =Switch.run @@ fun sw ->let discord_addr = `Udp (Eio.Net.Ipaddr.of_raw ip, port) inlet sock = Eio.Net.datagram_socket ~sw net discord_addr inL.info (fun m ->m "discovering external ip using discord's voice server: %s:%d" ip port);let ip_d, port_d =ip_discovery ~ssrc ~addr:discord_addr sock |> Result.get_exninL.info (fun m -> m "discovered ip and port: %s:%d" ip_d port_d);let local_addr = `Udp (Eio.Net.Ipaddr.of_raw ip_d, port_d) inlet sync = Eio.Stream.create 0 inlet send = Eio.Stream.add sync inlet t = { sw; sock; local_addr; discord_addr; ssrc; send } inlet write_worker () =let f = Faraday.create (1024 * 4) inlet shutdown () =if not @@ Faraday.is_closed f then (Faraday.close f;Faraday.drain f |> ignore)inlet writev = function| [] -> assert false| [ Faraday.{ buffer; off; len } ] ->let buf = Cstruct.of_bigarray ~off ~len buffer inEio.Net.send sock discord_addr buf;len| vecs ->let len =List.fold_left (fun n Faraday.{ len; _ } -> n + len) 0 vecsinlet buf = Cstruct.create_unsafe len inList.fold_left (fun dstoff Faraday.{ buffer; len; off } ->Cstruct.blit buffer off buf dstoff len;dstoff + len)|> ignore;Eio.Net.send sock discord_addr buf;leninlet rec loop () =match Faraday.operation f with| `Writev iovecs ->let n = writev iovecs inFaraday.shift f n;loop ()| `Yield ->let fn = Eio.Stream.take sync infn f;loop ()| `Close -> ()inSwitch.on_release sw shutdown;Fun.protect ~finally:shutdown loop
Lwt_pipe.connect ~ownership:`OutOwnsIn keep_alive send_tx;fun f ->Lwt_pipe.read send_tx >|= function| Some `Keep_alive ->L.debug (fun m ->m "sending UDP keepalive packet"~fields:Relog.Field.[int "ssrc" ssrc;float "interval" Packet.Keep_alive.interval;]);Packet.Keep_alive.write ~ssrc f| Some `Flush -> ()| None ->L.debug (fun m -> m "closing udp socket");Faraday.close finlet write_worker = Faraday_lwt_unix.serialize f ~yield ~writev inlet read_worker =let open Lwt.Infix inlet b = Bytes.create (1024 * 4) inlet b_len = Bytes.length b inlet rec f () =if Lwt_pipe.is_closed send_tx then Lwt.return_unitelselet r = Lwt_unix.read sock b 0 b_len >|= fun n -> `read n inlet t = Lwt_unix.sleep (1. /. 5.) >|= fun () -> `timeout inLwt.pick [ r; t ] >>= function| `read _n ->(* L.trace (fun m ->m "got %d bytes from UDP (ssrc=%d) (rtcp? keepalive ack?)" nssrc); *)f ()| `timeout -> f ()
let read_worker () =let buf = Cstruct.create (1024 * 4) inwhile true dolet _addr, n = Eio.Net.recv sock buf inL.trace (fun m ->m "got %d bytes from UDP (ssrc=%d) (rtcp? keepalive ack?)" n ssrc)doneinlet keep_alive () =while true dosend (fun f ->L.debug (fun m ->m "sending UDP keepalive packet"~fields:Relog.Field.[int "ssrc" ssrc;float "interval" Packet.Keep_alive.interval;]);Packet.Keep_alive.write ~ssrc f);Eio_unix.sleep Packet.Keep_alive.intervaldone
"@opam/eio": "quartz55/eio:eio.opam#3c5d949","@opam/eio_luv": "quartz55/eio:eio_luv.opam#3c5d949","@opam/ctf": "quartz55/eio:ctf.opam#3c5d949","@opam/httpaf": "anmonteiro/httpaf:httpaf.opam#0555dde","@opam/httpaf-lwt": "anmonteiro/httpaf:httpaf-lwt.opam#0555dde","@opam/httpaf-lwt-unix": "anmonteiro/httpaf:httpaf-lwt-unix.opam#0555dde","@opam/piaf": "anmonteiro/piaf:piaf.opam#01601aeda4a415d335f61ac13fb738cdb7b834ea","@opam/websocketaf": "anmonteiro/websocketaf:websocketaf.opam#ad4e61e","@opam/websocketaf-lwt": "anmonteiro/websocketaf:websocketaf-lwt.opam#ad4e61e","@opam/websocketaf-lwt-unix": "anmonteiro/websocketaf:websocketaf-lwt-unix.opam#ad4e61e",
"@opam/streaming": "odis-labs/streaming:streaming.opam#74a4863","@opam/eio": "quartz55/eio:eio.opam#2c68f46","@opam/eio_luv": "quartz55/eio:eio_luv.opam#2c68f46","@opam/httpaf": "anmonteiro/httpaf:httpaf.opam#395aad2","@opam/websocketaf": "quartz55/websocketaf:websocketaf.opam#49bb812","@opam/gluten": "anmonteiro/gluten:gluten.opam#7257692",
open Containersmodule M = Disco_utils.Token_bucketmodule U = structlet ns_conv =let conv n e = Int64.(n / (10L ** e)) infun ?(unit = `ns) n ->match unit with| `ns -> n| `us -> conv n 3L| `ms -> conv n 6L| `s -> conv n 9Llet ( -|> ) n u = ns_conv ~unit:u nlet take_measure ?(unit = `ns) ~n b =let open Lwt.Syntax inlet t1 = Mtime_clock.elapsed_ns () inlet+ () = M.take ~n b inInt64.(Mtime_clock.elapsed_ns () - t1) |> ns_conv ~unitendlet test_invariants () =let exn = Invalid_argument "can't take more than bucket's capacity" inlet b = M.make ~capacity:10 1. inAlcotest.check_raises "take over capacity" exn (fun () ->M.try_take ~n:11 b |> ignore);Alcotest.(check bool) "initially full" true (M.is_full b);Alcotest.(check bool) "initial take" true (M.try_take ~n:10 b);Alcotest.(check bool) "empty take" false (M.try_take ~n:10 b)let test_correct_waiting_time =QCheck.Test.make ~count:1000 ~name:"correct_waiting_time"QCheck.(float_range 1000. 10000.)(fun rate ->(* would take too long otherwise zzzz... *)QCheck.assume (rate >. 0.5);let ns_per_token = Int64.of_float (1e9 /. rate |> ceil) inlet b = M.make ~capacity:1 ~init:0 rate inlet check =let open Lwt.Syntax inlet+ ns = U.take_measure ~n:1 b inInt64.(ns >= ns_per_token)inLwt_main.run check)let test_concurrent _switch () =let open Lwt.Syntax inlet b = M.make ~capacity:1 ~init:0 10. inlet t1 = Mtime_clock.elapsed_ns () inlet* () = List.(1 -- 10) |> List.map (fun _ -> M.take b) |> Lwt.join inlet d_ns = Int64.(Mtime_clock.elapsed_ns () - t1) inif Int64.(U.(d_ns -|> `s) <> 1L) thenAlcotest.failf "expected around 1 sec waiting but got %Lds (%Ldms) (%Ldns)"U.(d_ns -|> `s)U.(d_ns -|> `ms)d_ns;Lwt.return ()let () =let lwt =Alcotest_lwt.(run ~and_exit:false "Token_bucket_lwt"[ ("all", [ test_case "concurrent" `Quick test_concurrent ]) ])inlet sync () =Alcotest.(run "Token_bucket"[( "all",[test_case "invariants" `Quick test_invariants;QCheck_alcotest.to_alcotest test_correct_waiting_time;] );])inmatch Lwt_main.run lwt with _ | (exception _) -> sync ()