d<55.5.0+dev0-2025-04-28/$Misc+fatal_error@&stringW@@@!a@A@@@@4../../utils/misc.mliYY@@$Misc@@@,fatal_errorf@&StdlibZ'format4!a@ A@&StdlibX&Format)formatter@@@ $unitY@@@ !b@ A@ @@@  @@ @5\DD6\D@@4A@@±+Fatal_errorA##exnG@@@AB`C`@@AB@B@+try_finally&always&optionL@0[@@@ 5\@@@ @@ @@@ -exceptionally@D]@@@ I^@@@ @@ @@@ @@S_@@@ !a@ B@ @@ @@ @@ @@ @dAAg@@C@@h@@@ @@ @@ @@ @P   P  @@F@@.map_left_right@@!a@ B@ !b@ B@ @@ @_i@@@ ej@@@ @@ @@ @/S l l0S l @@.G@@(for_all2@@!a@ !B@ @!b@ #B@ $boolk@@@ @@ @@ @l@@@ @m@@@ n@@@ @@ @@ @@ @eV  fV .@@dH@@.replicate_list@!a@ +B@ $@#into@@@ %p@@@ '@@ (@@ )@[[@@I@@+list_remove@!a@ 4B@ ,@q @@@ .r@@@ 0@@ 1@@ 2@_}}_}@@J@@*split_last@s!a@ =B@ 5@@@ 7@t@@@ 9@@@ :@@ ;@cc=@@K@@.repeated_label@ v@u@@@ >@@@ @@!a@ JB@ A@@ B@@@ Dw@@@ E@@@ G@@ H@ff@@L@@0create_hashtable@x@@@ K@Ey@!a@B@ L@!b@B@ M@@ N@@@ P&Stdlibz'Hashtbl!t@@@@@@@@-k88.k8y@@,M@@ӱ&StdlibB@ӱ$ListC@!tD;!a@@A@A{ E@@@@Y@@@@@SujnTuj@@@@RN@A@'compare@@!a@E@@|@@@@@@@@$Misc}&Stdlib$List!t@@@@$Misc~&Stdlib$List!t*@@@@@@@@@@@@@ww@@O@@%equal@@!a@E@@[@@@@@@@@$Misc&Stdlib$List!t@@@@$Misc&Stdlib$List!t*@@@~@@@@@@@@@@{HL{H@@P@@=some_if_all_elements_are_some@$Misc&Stdlib$List!t!a@E@@@@@@@$Misc&Stdlib$List!t@@@@@@@@@U@@Q@@+map2_prefix@@!a@E@@!b@E@!c@E@@@@@@$Misc&Stdlib$List!t"@@@@$Misc&Stdlib$List!t)@@@@$Misc&Stdlib$List!t4@@@砠@$Misc&Stdlib$List!tI@@@@@@@@@@@@a#bf@@`R@@&iteri2@@@@@@!a@E@@!b@E@\@@@@@@@@@@@@@@@@@q@@@@@@@@@@  U@@S@@(split_at@0@@@@$Misc&Stdlib$List!t!a@E@@@@ @$Misc&Stdlib$List!t@@@ @$Misc&Stdlib$List!t&@@@@@@@@@@ @@T@@)chunks_of@u@@@@$Misc&Stdlib$List!t!a@E@@@@$Misc&Stdlib$List!t$Misc&Stdlib$List!t@@@@@@@@@@@!" @@ U@@)is_prefix%equal@!a@-E@ @@@@!@@"@@#@{@@@%#of_@@@'@@@(@@)@@*@@+@T Uer@@SV@@@@Z@@@@@_@@@@@@@@@W@A@ #find_and_chop_longest_common_prefix%equal@!a@aF@S@b@@@T@@U@@V%first@@@X&second @@@Z$Misc&Stdlib$ListC@c@@@ӱ&StringI@!tIJ;@@@A&stringQ@@@@@@@*string.mliK  K  @@@@.Stdlib__String@@A@$makeJ@#intA@@@@$charB@@@!@@@@@@@@N   N  =@@A@@$initK@@@@@@%@@@!@@@@@@@@@@@@@@>T  ?T @@=B@@%emptyLM@@@@K[L[@@JC@@&lengthM@\@@@M@@@@@.%string_lengthAA @@@ca((da(Z@@bD@@#getN@t@@@@g@@@c@@@@@@@0%string_safe_getBA@@@@dd@@E@@(of_bytesO@%bytesC@@@@@@@@@juuju@@F@@(to_bytesP@@@@@@@@@@qq@@G@@$blitQ@@@@@@@@@4@@@@@@@@@@@$unitF@@@@@@@@@@@@@@xy@@H@@&concatR@@@@@$listK@@@@@@@@@@@@@@sss@@I@@#catS@@@@@ @@@@@@@@@@@ttt@@J@@%equalT@(@@@@@@@$boolE@@@@@@@@)rr*r@@(K@@'compareU@@@@~@@@@}/@@@|@@{@@z@@A*@@?L@@+starts_withV&prefixS@@@y@Y@@@x4@@@w@@v@@u@[\%@@ZM@@)ends_withW&suffixn@@@t@t@@@sO@@@r@@q@@p@vw@@uN@@-contains_fromX@@@@o@z@@@n@x@@@mn@@@l@@k@@j@@i@RRR@@O@@.rcontains_fromY@@@@h@@@@g@@@@f@@@e@@d@@c@@b@666h@@P@@(containsZ@@@@a@@@@`@@@_@@^@@]@000U@@Q@@#sub[@@@@\@@@@[@@@@Z@@@Y@@X@@W@@V@@@R@@-split_on_char\@@@@U@@@@T @@@S@@@R@@Q@@P@  @@ S@@#map]@@@@@O@@@N@@M@'@@@L+@@@K@@J@@I@)aa*a@@(T@@$mapi^@@)@@@H@'@@@G+@@@F@@E@@D@L@@@CP@@@B@@A@@@@NOE@@MU@@)fold_left_@@#acc@@L@@@? @@>@@=@ @o@@@<@@;@@:@@9@mn@@lV@@*fold_right`@@e@@@8@#acc@@@7@@6@@@@5@  @@4@@3@@2@@@W@@&existsb@@@@@*z@@@)@@(@@@@'@@@&@@%@@$@   !@@Y@@$trimc@@@@#@@@"@@!@!!!!@@Z@@'escapedd@@@@ @@@@@@"H"H"H"f@@[@@/uppercase_asciie@@@@@@@@@@$y$y$y$@@\@@/lowercase_asciif@@@@@@@@@@ %E%E %E%k@@]@@0capitalize_asciig@@@@ @@@@@@ && &&8@@ ^@@2uncapitalize_asciih@@@@@@@@@@&&&&@@_@@$iteri@@@@@^@@@@@@:@@@h@@@ @@ @@ @<!''=!''@@;`@@%iterij@@<@@@ @:@@@ @@@@@@@@_@@@@@@@@@@@a%((b%((@@`a@@*index_fromk@r@@@@e@@@@c@@@o@@@@@@@@@@-)P)P-)P)}@@b@@.index_from_optl@@@@@@@@@@@@&optionL@@@@@@@@@@@@@5*o*o5*o*@@c@@+rindex_fromm@@@@@@@@@@@@@@@@@@@@@@<+o+o<+o+@@d@@/rindex_from_optn@@@@@@@@@@@@E@@@@@@@@@@@@@C,,C,,@@e@@%indexo@@@@@@@@@@@@@@@@J--J--@@f@@)index_optp@@@@@@@@|@@@@@@@@@@@ M--!M-.@@g@@&rindexq@1@@@@@@@(@@@@@@@@9R.n.n:R.n.@@8h@@*rindex_optr@J@@@@5@@@E@@@@@@@@@@@WU..XU./@@Vi@@&to_seqs@H@@@&Stdlib#Seq!tZ@@@@@@@@@t\//u\//@@sj@@'to_seqit@e@@@#Seq!t@@@@Ǡ@~@@@@@@@@@@@b0 0 b0 0/@@k@@&of_sequ@>#Seq!t@@@@@@@@@@@@g00g00@@l@@/get_utf_8_ucharv@@@@@@@@a%Uchar*utf_decode@@@@@@@@r1V1Vr1V1@@m@@.is_valid_utf_8w@@@@@@@@@@v11v11@@n@@2get_utf_16be_ucharx@@@@@@@@%Uchar*utf_decode@@@@@@@@|2o2o|2o2@@o@@1is_valid_utf_16bey@@@@@@@@@@ 22 23@@ p@@2get_utf_16le_ucharz@@@@@@@@%Uchar*utf_decode@@@@@@@@'33(33@@&q@@1is_valid_utf_16le{@@@@@@@@@@94(4(:4(4I@@8r@@-edit_distance|%limit=@@@@@@@7@@@@<@@@L@@@@@@@@@@]44^44@@\s@@*spellcheck}(max_dist$@u@@@f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8888@@t@@)get_uint8~@@@@@@@@@@@@@@@@?;?;?;?_@@u@@(get_int8@@@@@@@@@@@@@@@@????@@v@@-get_uint16_ne@@@@@@@@@@@@@@@@@]@]@]@@@w@@-get_uint16_be@@@@@@@@@@@@@~@@}@AAAA/@@x@@-get_uint16_le@@@@|@@@@{@@@z@@y@@x@AAAA@@y@@,get_int16_ne@'@@@w@@@@v@@@u@@t@@s@/BXBX0BXB@@.z@@,get_int16_be@@@@@r@3@@@q7@@@p@@o@@n@HBBIBC%@@G{@@,get_int16_le@Y@@@m@L@@@lP@@@k@@j@@i@aCCbCC@@`|@@,get_int32_ne@r@@@h@e@@@g%int32N@@@f@@e@@d@| DGDG} DGDp@@{}@@$hash@m@@@c}@@@b@@a@DDDD@@~@@+seeded_hash@@@@`@@@@_@@@^@@]@@\@EEEE@@@@,get_int32_be@@@@[@@@@ZE@@@Y@@X@@W@ FF FF@@@@@,get_int32_le@@@@V@@@@U^@@@T@@S@@R@'GfGf'GfG@@A@@,get_int64_ne@@@@Q@@@@P%int64O@@@O@@N@@M@.HH.HH0@@B@@,get_int64_be@@@@L@@@@K@@@J@@I@@H@ 5HH 5HH@@ C@@,get_int64_le@@@@G@@@@F4@@@E@@D@@C@%<IFIF&<IFIo@@$D@@*unsafe_get@6@@@B@)@@@A%@@@@@@?@@>2%string_unsafe_getBA@@@@CGJ3J3DGJ3Ju@@BE@@+unsafe_blit@T@@@=@G@@@<@@@@;@S@@@:@Y@@@9@@@8@@7@@6@@5@@4@@30caml_blit_stringE@@@@@@@@vHJvJvwJJJ@'noalloc}JJJ~JJJ@@JJJ @@F@@ӱ#SetK@#eltL;@@@A Q@@@\@@@@ | }@@@@ {d@A@!tL;@@@A@@@@@'set.mliJ U YJ U _@@@@+Stdlib__SetD@A@%empty@@@[@M ~ M ~ @@E@@#add@1@@@Z@@@@Y@@@X@@W@@V@&P  'P  @@%F@@)singleton@@@@U)@@@T@@S@7V  8V  @@6G@@&remove@(@@@R@<@@@Q?@@@P@@O@@N@MY 5 9NY 5 R@@LH@@%union@M@@@M@R@@@LU@@@K@@J@@I@c_]ad_]w@@bI@@%inter@c@@@H@h@@@Gk@@@F@@E@@D@ybzb@@xJ@@(disjoint@y@@@C@~@@@B$boolE@@@A@@@@@?@ee@@K@@$diff@@@@>@@@@=@@@<@@;@@:@i(,i(A@@L@@(cardinal@@@@9#intA@@@8@@7@mm@@M@@(elements@@@@6$listK@@@5@@@4@@3@rr7@@N@@'min_elt@@@@2@@@1@@0@x x5@@O@@+min_elt_opt@@@@/&optionL@@@.@@@-@@,@}}@@P@@'max_elt@@@@+@@@*@@)@@@ Q@@+max_elt_opt@@@@()@@@'@@@&@@%@$%>@@#R@@&choose@$@@@$@@@#@@"@56@@4S@@*choose_opt@5@@@!P-@@@ @@@@@@KL@@JT@@$find@<@@@@P@@@D@@@@@@@@ab@@`U@@(find_opt@R@@@@f@@@^@@@@@@@@@@@|x|}x@@{V@@*find_first@@o@@@@@@@@@@@@{@@@@@ @@ @KOKx@@W@@.find_first_opt@@@@@ @@@ @@ @@@@@@@@@@@@@@@RVR@@X@@)find_last@@@@@=@@@@@@@@@@@@@@@@@{{@@Y@@-find_last_opt@@@@@Y@@@@@@@@@@@@@@@@@@@@@@Z@@$iter@@@@@$unitF@@@@@@@@@ @@@@@@@@@@[@@$fold@@@@@@#acc@%@@@@@"@@@@  @@@@@@@23@@1\@@#map@@%@@@(@@@@@@<@@@?@@@@@@@@MN@@L]@@&filter@@@@@@@@@@@@X@@@[@@@@@@@@i  j  @@h^@@*filter_map@@\@@@c@@@@@@@@@x@@@{@@@@@@@@"" ""7@@_@@)partition@@|@@@ @@@@@@@@@@@@@ˠ@@@@@@@@@@@$;$?$;$i@@`@@%split@@@@@@@@@@@@à@>@@@Ġ@@@@@@@@@@@%Z%^%Z%@@a@@(is_empty@@@@U@@@@@@'$'('$'?@@b@@#mem@@@@@@@@l@@@@@@@@'p't'p'@@c@@%equal@@@@@@@@@@@@@@@@ '' ''@@d@@'compare@@@@@@@@p@@@@@@@@*(_(c+(_(}@@)e@@&subset@*@@@@/@@@@@@@@@@@A((B() @@@f@@'for_all@@4@@@@@@@@@L@@@@@@@@@@@^)f)j_)f)@@]g@@&exists@@Q@@@@@@@@@i@@@@@@@@@@@{))|)*@@zh@@'to_list@{@@@s@@@@@@@@@ ** **@@i@@'of_list@Ҡ@@@@@@@@@@@@$+ + $+ +'@@j@@+to_seq_from@@@@@@@@&Stdlib#Seq!t@@@@@@@@@@@*,,*,,/@@k@@&to_seq@@@@#Seq!t@@@@@@@@@/,,/,,@@l@@*to_rev_seq@@@@5#Seq!t@@@@@@@@@3-*-.3-*-M@@m@@'add_seq@K#Seq!t@@@@@@@@@@ @@@@@@@@7--7--@@n@@&of_seq@i#Seq!t@@@~@@@}#@@@|@@{@1;..2;...@@0o@@@@?@e@@@ӱ#MapYM@#key,N;@@@AT@@@@@@@ @@@@f@A@!t-N;!a@@A@A@I@B@@@'map.mliI V ZI V e@@@@+Stdlib__MapD@A@%empty.!a@@@@@L  L  @@E@@#add/@<@@@@!a@@  @@@$ @@@@@@@@@@3O  4O  @@2F@@+add_to_list0@@@@@!a@@>$listK@@@@@@I @@@@@@@@@@@@@]X  ^X  @@\G@@&update1@I@@@@@&optionL!a@@@@  @@@@@@v@@@z@@@@@@@@@@^^@@H@@)singleton2@u@@@@!a@@@@@@@@@jW[jW{@@I@@&remove3@@@@@!a@@@@@@@@@@@@oo@@J@@%merge4@@@@@@`!a@u@@@@k!b@s@@@t!c@q@@@@@@@@@@@@@@@@@@@@@@@@@@@vY]x@@K@@%union5@@@@@@!a@e@ @@@@@@@@@@@@@@@@@@@@@@@@@@@)fj*f@@(L@@(cardinal6@)!a@`@@@#intA@@@@@@BC@@AM@@(bindings7@B!a@[@@@ @>@@@@@@@@@@@@c8<d8a@@bN@@+min_binding8@c!a@U@@@@[@@@@@@@@@bfb@@~O@@/min_binding_opt9@!a@P@@@#@{@@@@@@@@@@@@JNJ|@@P@@+max_binding:@!a@J@@@@@@@@@@@@@484[@@Q@@/max_binding_opt;@!a@E@@@`@@@@@@@@@@@@@ @@R@@&choose<@ݠ!a@?@@@@@@@~@@@}@@|@@@S@@*choose_opt=@!a@:@@@{@@@@z@@@y@@@x@@w@@@T@@$find>@@@@v@!a@3@@@u@@t@@s@23@@1U@@(find_opt?@@@@r@7!a@.@@@q۠ @@@p@@o@@n@OIMPIs@@NV@@*find_first@@@=@@@m$boolE@@@l@@k@\!a@&@@@j@T@@@i@@@h@@g@@f@x  y  D@@wW@@.find_first_optA@@f@@@e)@@@d@@c@!a@@@@b'@@@@a@@@`@@@_@@^@@]@"*"."*"l@@X@@)find_lastB@@@@@\U@@@[@@Z@!a@@@@Y@@@@X@@@W@@V@@U@#_#c#_#@@Y@@-find_last_optC@@@@@T|@@@S@@R@֠!a@ @@@Qz@@@@P@@@O@@@N@@M@@L@$y$}$y$@@Z@@$iterD@@@@@K@!a@$unitF@@@J@@I@@H@ @@@G @@@F@@E@@D@%%%& @@[@@$foldE@@ @@@C@!a@@#acc@@@B@@A@@@@0@@@?@  @@>@@=@@<@A'%')B'3'l@@@\@@#mapF@@!a@!b@@@;@M @@@:Q @@@9@@8@@7@`(e(ia(e(@@_]@@$mapiG@@N@@@6@!a@!b@@@5@@4@q @@@3u @@@2@@1@@0@))))@@^@@&filterH@@r@@@/@!a@;@@@.@@-@@,@ @@@+@@@*@@)@@(@****@@_@@*filter_mapI@@@@@'@!a@O!b@@@@&@@%@@$@@@@# @@@"@@!@@ @ ,, ,,?@@`@@)partitionJ@@@@@@!a@@@@@@@@@ @@@@@@@@@@@@@@@@@@.../%@@a@@%splitK@@@@@!a@@@@@ @@@@@@@@@@@@@@@@@@,$0'0+-$0'0\@@+b@@(is_emptyL@,!a@@@@ @@@ @@ @C022!D022;@@Bc@@#memM@/@@@ @H!a@@@@ @@@@@@@@_32l2p`32l2@@^d@@%equalN@@!a@@@@@@@@@@m@@@@s@@@#@@@@@@@@@@722723-@@e@@'compareO@@!a@@]@@@@@@@@@@@@@@@m@@@@@@@@@@=4(4,=4(4a@@f@@'for_allP@@@@@@!a@d@@@@@@@@ @@@n@@@@@@@@A45A450@@g@@&existsQ@@@@@@!a@@@@@@@@@ @@@@@@@@@@@F55F55@@h@@'to_listR@!a@@@@@@@@⠠@@@@@@@@@M6~6M6~6@@i@@'of_listS@ՠ@ @@@ޠ@!a@@@@@@(@@@@@@7Q668Q67@@6j@@&to_seqT@7!a@}@@@&Stdlib#Seq!t@9@@@ؠ@@@@@@@@@^W77_W77@@]k@@*to_rev_seqU@^!a@w@@@'#Seq!t@]@@@Ӡ@@@@@@@@@[8A8E[8A8n@@l@@+to_seq_fromV@n@@@@!a@p@@@P#Seq!t@@@@͠@@@@@@@@@@@_88_88@@m@@'add_seqW@l#Seq!t@@@@Ƞ@!a@f@@@@@@  @@@Ơ@@@@@@@@d99d99@@n@@&of_seqX@#Seq!t@@@@@!a@_@@@@@@@@@@@h::h::>@@o@@@@@g@@@ӱ#TblO@#keyP;@@@A v@@@w@@@@  $  5@@@@h@A@!tP;!a@@A@A@O@B@@@+hashtbl.mliw<<w<<@@@@/Stdlib__Hashtbld@A@&create@#intA@@@v!!a@@@@u@@t@x<<#x<<;@@e@@%clear@!a@@@@s$unitF@@@r@@q@5y<<<@6y<<@@Sp@@2filter_map_inplace@@@@@>@!a@Q@@@=@@<@@;@^@@@:F@@@9@@8@@7@y>>z>C>M@@xq@@$fold@@@@@6@!a@H@#acc@F@@5@@4@@3@@@@2@  @@1@@0@@/@>f>j>u>@@r@@&length@!a@B@@@.@@@-@@,@>>>>@@s@@%stats@!a@>@@@+*statistics@@@*@@)@>>>>@@t@@&to_seq@Ơ!a@9@@@(&Stdlib#Seq!t@w@@@'@@@&@@@%@@$@????+@@u@@+to_seq_keys@@@4@@@#%#Seq!t@@@"@@@!@@ @?D?H?D?j@@v@@-to_seq_values@ !a@.@@@C#Seq!t @@@@@@,??-??@@+w@@'add_seq@$!a@*@@@@`#Seq!t@@@@@@@@@@#@@@@@@@@V??W??@@Ux@@+replace_seq@N!a@"@@@@#Seq!t@@@@@@@@@@M@@@@@@@@@@@@E@@y@@&of_seq@#Seq!t@@@@@!a@@@ @@@ @@@ @@ @@^@b@^@@@z@@@@  @i@@@%print@&Stdlib&Format)formatter@@@x@@@@y@@@z@@{@@|@ 7 ; 7 d@@j@@'for_all@@$char@@@}@@@~@@@ @@@@@@@@@@@ f j f @@k@@,to_utf_8_seq@!@@@&Stdlib#Seq!t&Stdlib%Uchar!t@@@J@@@L@@M@    @@l@@@@pr  @m@@@'compare@!a@SQ@N@@@@O@@P@@Q(%compareBA @@@@5  6  @@4n@@@@9q:  @8o@@@,find_in_path@U@@@T@@@V@]@@@Wb@@@X@@Y@@Z@[!,!,\!,!]@@Zp@@0find_in_path_rel@w@@@[@@@]@@@@^@@@_@@`@@a@}!!~!!@@|q@@8normalized_unit_filename2@@@@b&Stdlib&Result!t@@@ h@@@ i@@@ l@@ m@""""@@r@@7find_in_path_normalized3@ɠ@@@ n@@@ p@@@@ q@@@ r@@ s@@ t@"""#@@s@@+remove_file4@@@@ u@@@ v@@ w@####@@t@@0expand_directory5@@@@ x@@@@ y@@@ z@@ {@@ |@$$$$@@u@@3split_path_contents6#sep/@@@ }@@@ @@@@ ~OԠ$@@@ @@@ @@ @@ @%C%C%C%~@@v@@)copy_file7@&Stdlib*in_channel@@@ @&Stdlib+out_channel@@@ @@@ @@ @@ @@&&A&&@@?w@@/copy_file_chunk8@&Stdlib*in_channel@@@ @&Stdlib+out_channel@@@ @@@@ =@@@ @@ @@ @@ @i'q'qj'q'@@hx@@.string_of_file9@&Stdlib*in_channel@@@ @@@ @@ @(X(X(X(@@y@@@3@@@ 8@@@ @@ @1"--2"--@@0~@@$log2?@@@@ @@@ @@ @F+..G+./@@E@@%align@@@@@ @@@@ @@@ @@ @@ @b//b/bc//b/~@@a@@@/no_overflow_addA@@@@ @@@@ /@@@ @@ @@ @~3//3/0@@}A@@/no_overflow_subB@@@@ @@@@ K@@@ @@ @@ @70y0y70y0@@B@@/no_overflow_mulC@-@@@ @4@@@ g@@@ @@ @@ @;11;11<@@C@@/no_overflow_lslD@I@@@ @P@@@ @@@ @@ @@ @?11?11@@D@@-letter_of_intE@e@@@ @@@ @@ @C2K2KC2K2l@@E@@ӱ5Int_literal_converterJQ@#intF@@@@ @@@ @@ @F22F22@@F@@%int32G@@@@ %int32@@@ @@ @K3m3oK3m3@@G@@%int64H@/@@@ %int64@@@ @@ @.N33/N33@@-H@@)nativeintI@E@@@ )nativeint@@@ @@ @DQ33EQ34@@CI@@@@HE2n2nIT4E4H@GJ@@@/find_first_monoK@@@@@  @@@ @@  @@@ @@ @dV4J4JeV4J4t@@cK@@0search_substringL@{ @@@ @ @@@ @ @@@  @@@ @@ @@ @@ @k7`7`k7`7@@L@@1replace_substringM&before@@@ %after@@@ @@@@ @@@ @@ @@ @@ @q88q88@@M@@/rev_split_wordsN@@@@ @@@ @@@ @@ @v9}9}v9}9@@N@@&cut_atO@@@@ @@@@ @@@@ @@@@ @@ @@!@@!@z:+:+z:+:Y@@O@@.ordinal_suffixP@@@@! @@@!@@!@;;;;@@P@@-normalise_eolQ@@@@!!@@@!@@!@=!=!=!=E@@Q@@1delete_eol_spacesR@1@@@!6@@@! @@! @/>'>'0>'>O@@.R@@-ref_and_valueSR;@@!RT&Stdlib #ref!a@!S@! @@@! S@!@$Misc!-ref_and_value@@@!Z??+[??K@@YT@@@A@@@@@^??@@@@\S@A@,protect_refsU@#$Misc"-ref_and_value@@@!#@@@!%@@S$@@@!&!a@!,S@!'@@!(@@!)@@!*@?M?M?M?@@U@@'get_refV@&Stdlib&#ref%!a@!6S@!-@@@!/@@@!1' @@@!3@@!4@@w@w@w@@@V@@-set_or_ignoreW@@!a@!ES@!7o!b@!GS@!8@@@!:@@!;@&Stdlib(#ref@@@!=@@@!?@#)@@@!@@@!A@@!B@@!C@AAAA^@@W@@$fst3X@@!a@!NS@!H@!b@!PS@!I@!c@!RS@!J@@!K@@!L@ BB BB8@@ X@@$snd3Y@@!a@!YS@!S@!b@![S@!T@!c@!]S@!U@@!V@@!W@ *B9B9 +B9BU@@ )Y@@$thd3Z@@!a@!dS@!^@!b@!fS@!_@!c@!hS@!`@@!a@@!b@ OBVBV PBVBr@@ NZ@@$fst4[@@!a@!pS@!i@!b@!rS@!j@!c@!tS@!k@!d@!vS@!l@@!m@@!n@ |BtBt }BtB@@ {[@@$snd4\@@!a@!~S@!w@!b@!S@!x@!c@!S@!y@!d@!S@!z@@!{@@!|@ BB BB@@ \@@$thd4]@@!a@!S@!@!b@!S@!@!c@!S@!@!d@!S@!@@!@@!@ BB BB@@ ]@@$for4^@@!a@!S@!@!b@!S@!@!c@!S@!@!d@!S@!@@!@@!@!BB!BB@@!^@@-edit_distance_@!*@@@!@!!+@@@!@,@@@! Ҡ-@@@!@@@!@@!@@!@@!@!+C9C9!,C9Cr@@!*_@@*spellcheck`@ r/!G.@@@!@@@!@!O0@@@! 2!Y1@@@!@@@!@@!@@!@!SE\E\!TE\E@@!R`@@*align_hint&prefix!l3@@@!$main*Format_doc4!t@@@#$hint*Format_doc5!t@@@#@*Format_doc6!t@@@#@*Format_doc7!t@@@#@@#@@#@@$@@$@!FF!FF@@!a@@0align_error_hint$main*Format_doc8!t@@@$$hint*Format_doc9!t@@@$@*Format_doc:!t@@@$@*Format_doc;!t@@@$@@$@@$@@$@!JJ!JK @@!b@@,aligned_hint&prefix!<@@@$ @*Format_doc=)formatter@@@$ @&StdlibB'format4!a@$S@$ *Format_doc>)formatter@@@$ !?@@@$ @!*Format_doc@!t@@@$@@@$!A@@@$@@$@@@$+@@$@@$@@$@"K9K9"KvK@@"c@@,did_you_mean"pp!٠*Format_docD'printer"?C@@@$@@@$@@@$'@!xF"ME@@@$ @@@$"!*Format_docG!t@@@$#@@@$%@@$&@@$(@"TLsLs"ULL@@"Sd@@ӱ%ColorS@'settingT;@@$Auto@@"iMM"jMM@@"hf@&Always@@"rMM"sMM@@"qg@%Never@@"{MM"|MM@@"zh@@@A@@@@@"MM@@A@"}e@A@/default_setting$MiscH%Color'setting@@@$/@"MM"MN@@"i@@*is_enabled@"uI@@@$0!WJ@@@$1@@$2@"NN"NN.@@"j@@@@"MM"N/N2@"k@@@ӱ%StyleU@%colorV;@@%Black@@" NN" NN@@"m@#Red@@" NN" NN@@"n@%Green@@" NN" NN@@"o@&Yellow@@"NN"NN@@"p@$Blue@@"NN"NN@@"q@'Magenta@@"NN"NN@@"r@$Cyan@@"NN"NN@@"s@%White@@"NN"NN@@"t@@@A@@@@@# NzN|@@A@#l@A@%styleW;@@"FG$MiscK%Style%color@@@$9@@#NN#NO @@#v@"BG$MiscL%Style%color@@@$:@@#/OO#0OO,@@#.w@$Bold@@#8O>OB#9O>OH@@#7x@%Reset@@#AOIOM#BOIOT@@#@y@@@A@@@@@#ENN@@@@#Cu@A@±%StyleX#&Stdlib&Format$stag@"N$MiscM%Style%style@@@$D@@@$F@@A#fOUOk#gOUO~@@#ez@@@/ansi_of_style_l@"P$MiscO%Style%style@@@$H@@@$J#Q@@@$K@@$L@#OO#OO@@#{@@)tag_styleY;@@$ansi@@"S$MiscR%Style%style@@@$M@@@$O#OO#OP@@#}@)text_open@@#T@@@$R# P P # P P@@#~@*text_close@@#U@@@$U#!PP##!PP4@@#@@@A@@@@@#OO#"P5P8@@@@#|@A@&stylesZ;@@%error@@$MiscV%Style)tag_style@@@$f#%PLPP#%PLPa@@#@'warning@@$MiscW%Style)tag_style@@@$i#&PbPf#&PbPy@@#@#loc@@$MiscX%Style)tag_style@@@$l#'PzP~#'PzP@@#@$hint@@$MiscY%Style)tag_style@@@$o$(PP$(PP@@$@+inline_code@@$MiscZ%Style)tag_style@@@$r$")PP$#)PP@@$!@@@A@@@@@$&$P:P<$'*PP@@@@$%@A@$hint@*Format_doc[)formatter@@@$$\@@@$@@$@$>,PP$?,PP@@$=@@.as_inline_code@*Format_doc]'printer!a@$[@$@@@$*Format_doc^'printer@@@$@@$@$a-PP$b-PQ1@@$`@@+inline_code*Format_doc`'printer$~_@@@$@@@$@$x.Q2Q4$y.Q2Q^@@$w@@.default_styles$Misca%Style&styles@@@$@$0Q`Qb$0Q`Q|@@$@@*get_styles@$ob@@@$$Miscc%Style&styles@@@$@@$@$1Q}Q$1Q}Q@@$@@*set_styles@$Miscd%Style&styles@@@$$e@@@$@@$@$2QQ$2QQ@@$@@%setup@${$Miscf%Color'setting@@@$@@@$$g@@@$@@$@$4QQ$4QQ@@$@@0set_tag_handling@&Stdlibh&Format)formatter@@@$$i@@@$@@$@$9RR$9RR@@$@@@@$ NgNg$;S!S$@$@@@ӱ+Error_style[@'setting\;@@*Contextual͐@@%@SrSv%@SrS@@%@%Shortΐ@@%ASS%ASS@@%@@@A@@@@@%?SaSc@@A@%@A@/default_setting$Miscj+Error_style'setting@@@$@%0CSS%1CSS@@%/@@@@%4>SHSH%5DSS@%3@@@(print_if@&Stdlibk&Format)formatter@@@$@&Stdlibm#ref$ l@@@$@@@$@@&Stdlibn&Format)formatter@@@$@!a@$]@$%Ho@@@$@@$@@$@  @@$@@$@@$@@$@%vHSS%wIST/@@%u@@0print_see_manual*Format_docr'printer$q$p@@@$@@@$@@@$@%LTT%LTT@@%@@4show_config_and_exit@%ws@@@$%|t@@@$@@$@%QTT%QTU%@@%@@=show_config_variable_and_exit@%u@@@$%v@@@$@@$@%UUU%UUU@@%@@9get_build_path_prefix_map@%w@@@$%~5Build_path_prefix_mapx#map@@@%+@@@%-@@%.@%^VV%^VW7@@%@@6debug_prefix_map_flags@%y@@@%/%&{%z@@@%0@@@%2@@%3@%bWW%bWW@@%@@ӱ,Magic_number]@1native_obj_config^;@@'flambda@@$|@@@%4&aQaU&aQad@@& @@@A@@@@@&a4a6&aeah@@@A&@A@1native_obj_config$Misc},Magic_number1native_obj_config@@@%>@&%b=b?&&b=bh@@&$@@'version_;@@#A$~@@@%@@@@@&4bb&5bb@@A@&3@A@$kind`;@@$Exec@@&Cbb&Dbb@@&B@#Cmi@@&Lbb&Mbb@@&K@#Cmo@@&Ubb&Vbb@@&T@#Cma@@&^bb&_bb@@&]@#Cmx$Misc,Magic_number1native_obj_config@@@%G@@&rcc&scc@@&q@$Cmxa$Misc,Magic_number1native_obj_config@@@%H@@&cc&cc:@@&@$Cmxs@@&c;c?&c;cE@@&@#Cmt@@&cFcJ&cFcO@@&@(Ast_impl@@&cFcP&cFcZ@@&@(Ast_intf@@&cFc[&cFce@@&@@@A@@@@@&bb@@@@&@A@$infoa;@@$kind@@$Misc,Magic_number$kind@@@%R&cwc{&cwc@@&@'version@@$Misc,Magic_number'version@@@%U&cc&cc@@&@@@A@@@@@&cgci&dd@@@@&@A@#rawb;@@$A&@@@%d@@@@&dd&dd@@@@&@A@+parse_errorc;@@)Truncated'@@@%k@@&ee'ee@@&@2Not_a_magic_number'@@@%l@@'ee'ee@@' @@@A@@@@@'ekem@@@@'@A@3explain_parse_error@&͠$Misc,Magic_number$kind@@@%v@@@%x@$Misc,Magic_number+parse_error@@@%y'C@@@%z@@%{@@%|@'<ee'=ee@@';@@%parse@$Misc,Magic_number#raw@@@%}&Stdlib&result$Misc,Magic_number$info@@@%~$Misc,Magic_number+parse_error@@@%@@@%@@%@'off'pff@@'n@@)read_info@&Stdlib*in_channel@@@%&Stdlib&result$Misc,Magic_number$info@@@%$Misc,Magic_number+parse_error@@@%@@@%@@%@'gg'ggU@@'@@,magic_length&1@@@%@'iXiZ'iXip@@'@@*unexpectedd;!a@%@A(expected@@ e@%'ii'ij @@'@&actual@@e@%'ij 'ij@@'@@@A@Y@@@@@'ii'ij@@@@'@A@0unexpected_errore;@@$Kind$Misc,Magic_number*unexpected$Misc,Magic_number$kind@@@%@@@%@@'j2j6'j2jO@@'@'Version$Misc,Magic_number$kind@@@%$Misc,Magic_number*unexpected$Misc,Magic_number'version@@@%@@@%@@("jPjT(#jPjz@@(!@@@A@@@@@(&jj@@@@($@A@-check_current@$Misc,Magic_number$kind@@@%@$Misc,Magic_number$info@@@%&Stdlib&result('@@@%$Misc,Magic_number0unexpected_error@@@%@@@%@@%@@%@(_j|j~(`j|j@@(^@@8explain_unexpected_error@$Misc,Magic_number0unexpected_error@@@%(@@@%@@%@(ykCkE(zkCk~@@(x@@%errorf;@@+Parse_error$Misc,Magic_number+parse_error@@@%@@(kk(kk@@(@0Unexpected_error $Misc,Magic_number0unexpected_error@@@%@@(kk(kl@@(@@@A@@@@@(kk@@@@(@A@1read_current_info -expected_kind(h$Misc,Magic_number$kind@@@%@@@%@&Stdlib*in_channel@@@%&Stdlib&result$Misc,Magic_number$info@@@%Ӡ$Misc,Magic_number%error@@@%@@@%@@%@@%@(ll(l2lu@@(@@.string_of_kind @$Misc,Magic_number$kind@@@%)@@@%@@%@)mSmU) mSmx@@)@@2human_name_of_kind @$Misc,Magic_number$kind@@@%))@@@%@@%@)"mm)#mn@@)!@@+current_raw @$Misc,Magic_number$kind@@@%$Misc,Magic_number#raw@@@%@@%@)Ann)Bnn@@)@@@/current_version@$Misc,Magic_number$kind@@@%$Misc,Magic_number'version@@@%@@%@)`nn)ann@@)_@@(raw_kindg;@@'"A)v@@@%@@@@)ooxoz)poxo@@@@)n@A@*parse_kind@$Misc,Magic_number(raw_kind@@@%)5$Misc,Magic_number$kind@@@%@@@%@@%@)oo)op@@)@@(raw_kind@$Misc,Magic_number$kind@@@%$Misc,Magic_number(raw_kind@@@%@@%@)p;p=)p;p\@@)@@#raw@$Misc,Magic_number$info@@@%$Misc,Magic_number#raw@@@%@@%@)qq)qq@@)@@)all_kinds)$Misc,Magic_number$kind@@@%@@@%@)*s`sb)*s`s{@@)@@@@)hX~X~)+s|s@)@@@ӱ+Utf8_lexeme?h@!ti;@@'A* @@@%@@@@*7tt*7tu@@@@*@A@)normalize@*@@@&&Stdlib&Result!t$Misc+Utf8_lexeme!t@@@&$Misc+Utf8_lexeme!t@@@&@@@& @@& @*39uu*49uu,@@*2@@*capitalize@*J@@@& &Stdlib&Result!t$Misc+Utf8_lexeme!t@@@& $Misc+Utf8_lexeme!t@@@& @@@&@@&@*c@v#v%*d@v#vM@@*b@@,uncapitalize@*z@@@&&Stdlib&Result!t$Misc+Utf8_lexeme!t@@@&$Misc+Utf8_lexeme!t@@@&@@@&@@&@*Eww*EwwB@@*@@.is_capitalized@$Misc+Utf8_lexeme!t@@@&)^@@@&@@&@*Jx x*Jx x+@@*@@3is_valid_identifier@$Misc+Utf8_lexeme!t@@@&)x@@@&@@&@*Oxx*Oxy@@*@@,is_lowercase@$Misc+Utf8_lexeme!t@@@&)@@@& @@&!@*Uyy*Uyy@@*@@1validation_resultj;@@%Valid@@*[zz*[zz@@*@1Invalid_character&Stdlib%Uchar!t@@@&"@@+\zz+\zz@@+@1Invalid_beginning&Stdlib%Uchar!t@@@&#@@+]{{+]{{7@@+@@@A@@@@@+Zzz@@@@+@A@3validate_identifier=(with_dot*٠)@@@&@@@&@$Misc+Utf8_lexeme!t@@@&$Misc+Utf8_lexeme1validation_result@@@&@@&@@&@+G_{f{h+H_{f{@@+F@@>starts_like_a_valid_identifier>@$Misc+Utf8_lexeme!t@@@&*@@@&@@&@+ac|>|@+bc|>|m@@+`@@@@+e6tt+fg} }#@+d@@@(filepath@k;@@)'A+{@@@&@@@@+tk}L}L+uk}L}b@@@@+s@A@'modnameAl;@@)6A+@@@&@@@@+l}c}c+l}c}x@@@@+@A@$crcsBm;@@)EA*Ԡ@$Misc'modname@@@&砠@+Q&Stdlib&Digest!t@@@'X@@@'Z@@'[@@@']@@@@+m}y}y+m}y}@@@@+@A@&alertsVn;@@)rA$Misc&Stdlib&String#Map!t+@@@*@@@*@@@@+o}}+o}}@@@@+@A@@3 (Miscellaneous useful types and functions@# (Warning:@ ' this module is unstable and part of -Compiler_libs@-compiler-libs@!.@@@@@@@@@@@@A+쐠A@6Reporting fatal errors@@0Misc.fatal_error3*Raise the +Fatal_error ! exception with the given string.@@@@@@@@@@@@,@ ,@@@@, 1Misc.fatal_errorf3 JFormat the arguments according to the given format string and raise +Fatal_error; with the resulting string.@@@@@@@@@@@@,@,@@@@+젗0Misc.Fatal_error@@@@@++@@A@;Exceptions and finalization@@0Misc.try_finally3 'try_finally work ~always ~exceptionally is designed to run code in $work L that may fail with an exception, and has two kind of cleanup routines: &always j, that must be run after any execution of the function (typically, freeing system resources), and -exceptionally=, that should be run only if $work$ or &always failed with an exception (typically, undoing user-visible state changes that would only make sense if the function completes correctly). For example:@%  let objfile = outputprefix ^ ".cmo" in let oc = open_out_bin objfile in Misc.try_finally (fun () -> bytecode ++ Timings.(accumulate_time (Generate sourcefile)) (Emitcode.to_file oc modulename objfile); Warnings.check_fatal ()) ~always:(fun () -> close_out oc) ~exceptionally:(fun _exn -> remove_file objfile); @( If -exceptionally 7 fail with an exception, it is propagated as usual.@( If &always$ or -exceptionally G use exceptions internally for control-flow but do not raise, then +try_finally @ is careful to preserve any exception backtrace coming from $work$ or &always: for easier debugging.@@@@@@@@@@@@,C@,C,B@,/,.@,@@@@, !Misc.reraise_preserving_backtrace3 reraise_preserving_backtrace e f P is (f (); raise e) except that the current backtrace is preserved, even if !f< uses exceptions internally.@@@@@@@@@@@@,@,@,@@@@, A@/List operations@@,Misc.map_end3-map_end f l t$ is +map f l @ t6, just more efficient.@@@@@@@@@@@@,@,@,@, @@@@,0Misc.rev_map_end3-map_end f l t$ is 1map f (rev l) @ t6, just more efficient.@@@@@@@@@@@@, @, @+@+@@@@+3Misc.map_left_right3%Like (List.map 0, with guaranteed left-to-right evaluation order@@@@@@@@@@@@+@+@+@@@@+ࠕ-Misc.for_all23(Same as ,List.for_all : but for a binary predicate. In addition, this (for_all2 R never fails: given two lists with different lengths, it returns false.@@@@@@@@@@@@+@+@"+@%+@@@@+ˠ3Misc.replicate_list35replicate_list elem n2 is the list with !n & elements all identical to $elem!.@@@@@@@@@@@@+@C+@F+@@@@+͠0Misc.list_remove3/list_remove x l3 returns a copy of !l , with the first element equal to !x) removed.@@@@@@@@@@@@+@d+@g+@@@@+Ϡ/Misc.split_last3 AReturn the last element and the other elements of the given list.@@@@@@@@@@@@+@v+@@@@+3Misc.repeated_label3 7Detects a repeated label - for use with labeled tuples.@@@@@@@@@@@@+@+@@@@+A@5Hash table operations@@5Misc.create_hashtable3 _Create a hashtable with the given initial size and fills it with the given bindings.@@@@@@@@@@@@+@+@+@@@@+|A@ "Extensions to the standard library@@/+Misc.Stdlib+~@A-/0Misc.Stdlib.List+}3B@=Extensions to the List module@@@@@@@@@@@@@A-#2Misc.Stdlib.List.t@+Y@@A+@+y+x@@8Misc.Stdlib.List.compare3 }The lexicographic order supported by the provided order. There is no constraint on the relative lengths of the lists.@@@@@@@@@@@@+{@+|@+n@+b@@@@+R6Misc.Stdlib.List.equal3(Returns $true u if and only if the given lists have the same length and content with respect to the given equality function.@@@@@@@@@@@@+Y@+Z@+L@+@@@@@+0 .Misc.Stdlib.List.some_if_all_elements_are_some3 &If all elements of the given list are &Some _& then 'Some xs> is returned with the "xs= being the contents of those $Some 3s, with order preserved. Otherwise return $None!.@@@@@@@@@@@@+O@+P@@@@+(@C+?@F+*@I+@@@@*7Misc.Stdlib.List.iteri23(Same as *List.iter2@@ e, but the function is applied to the index of the element as first argument (counting from 0)@@@@@@@@@@@@*@^*@a*@d*@@@@*Ҡ9Misc.Stdlib.List.split_at3,split_at n l2 returns the pair -before, after' where &before0 is the !n3 first elements of !l% and %after the remaining ones. If !l/ has less than !n # elements, raises Invalid_argument.@@@@@@@@@@@@+@+@*@@@@*̠:Misc.Stdlib.List.chunks_of3-chunks_of n t l returns a list of nonempty lists whose concatenation is equal to the original list. Every list has !n T elements, except for possibly the last list, which may have fewer. )chunks_of+ raises if &n <= 0!.@@@@@@@@@@@@*@*@*@@@@*:Misc.Stdlib.List.is_prefix3(Returns $true } if and only if the given list, with respect to the given equality function on list members, is a prefix of the list #of_!.@@@@@@@@@@@@*@**@*@**@@@@*# -Misc.Stdlib.List.longest_common_prefix_result@*_@*@@*@*@@*@*}@@*|@@@@@*p*o@@ 4Misc.Stdlib.List.find_and_chop_longest_common_prefix3 Returns the longest list that, with respect to the provided equality function, is a prefix of both of the given lists. The input lists, each with such longest common prefix removed, are also returned.@@@@@@@@@@@@*r@*r*q@*b*a@*[*Z@@@@*I@@*G*F@@@@@/2Misc.Stdlib.Option*C3B@?Extensions to the Option module@@@@@@@@@@@@@A/(#4Misc.Stdlib.Option.t@*KY@@A*H@*A*@@@8Misc.Stdlib.Option.print@*=@4*>@7*&@:*@@@@* @@* * @@@@@/1Misc.Stdlib.Array*3B@>Extensions to the Array module@@@@@@@@@@@@@A/R9Misc.Stdlib.Array.exists23(Same as -Array.exists2; from the standard library.@@@@@@@@@@@@*@_*@b*@e*@@@@):Misc.Stdlib.Array.for_alli3(Same as -Array.for_all from the standard library, but the function is applied with the index of the element as first argument, and the element itself as second argument.@@@@@@@@@@@@)@z*@})@@@@)䠕;Misc.Stdlib.Array.all_somes@)@)@@@@)@@))@@@@@/2Misc.Stdlib.String)3B@?Extensions to the String module@@@@@@@@@@@@@A/&String@@/6Misc.Stdlib.String.Set":@A/%Set.S@7 with type elt = string@"3@@@@@/6Misc.Stdlib.String.Map@A/%Map.S@7 with type key = string@@@@@@/6Misc.Stdlib.String.Tbl@A/)Hashtbl.S@7 with type key = string@@@@@@8Misc.Stdlib.String.print@@@@@@@ :Misc.Stdlib.String.for_all@@@@@@@?Misc.Stdlib.String.to_utf_8_seq@@@@@@@@@@@@@3Misc.Stdlib.compare@@@@@@@@@@@@@@A@ "Operations on files and file paths@@1Misc.find_in_path3 'Search a file in a list of directories.@@@@@@@@@@@@@@ @@@@5Misc.find_in_path_rel3 0Search a relative file in a list of directories.@@@@@@@@@@@@@@@@@@=Misc.normalized_unit_filename34Normalize file name &Foo.ml$ to &foo.ml *, using NFC and case-folding. Return %Error 0 if the input is not a valid utf-8 byte sequence@@@@@@@@@@@@@=@@@@ (an alternate root directory)@@@@@@@@@@@@@@@@@@8Misc.split_path_contents3:split_path_contents ?sep s, interprets !s o as the value of a "PATH"-like variable and returns the corresponding list of directories. !s > is split using the platform-specific delimiter, or $~sep1 if it is passed.@ % Returns the empty list if !s* is empty.@@@@@@@@@@@@@@@@@@.Misc.copy_file3/copy_file ic oc< reads the contents of file "ic? and copies them to "oc $. It stops when encountering EOF on "ic!.@@@@@@@@@@@@@@@@@@4Misc.copy_file_chunk37copy_file_chunk ic oc n' reads !n, bytes from "ic? and copies them to "oc,. It raises +End_of_file % when encountering EOF on "ic!.@@@@@@@@@@@@@@"@%@@@@Ǡ3Misc.string_of_file31string_of_file ic< reads the contents of file "ic K and copies them to a string. It stops when encountering EOF on "ic!.@@@@@@@@@@@@@C@@@@͠ !Misc.output_to_file_via_temporary3 Produce output in temporary file, then rename it (as atomically as possible) to the desired output file name. (output_to_file_via_temporary filename fn 6 opens a temporary file which is passed to "fn (name + output channel). When "fn [ returns, the channel is closed and the temporary file is renamed to (filename!.@@@@@@@@@@@@@@m@p@@@@Misc.Int_literal_converter.int3 (Convert a string to an integer. Unlike 4Stdlib.int_of_string@@ =, this function accepts the string representation of +max_int + 15 and returns 'min_int. in this case.@@@@@@@@@@@@@@@@@⠕ Misc.Int_literal_converter.int3232Likewise, at type %int32@@@@@@@@@@@@@@@@@ޠ Misc.Int_literal_converter.int6432Likewise, at type %int64@@@@@@@@@@@@@@@@@ڠ $Misc.Int_literal_converter.nativeint32Likewise, at type )nativeint@@@@@@@@@@@@@@@@@@@@@@@@4Misc.find_first_mono31find_first_mono p< takes an integer predicate /p : int -> bool J that we assume: 1. is monotonic on natural numbers: if &a <= b& then #p a) implies #p b 9, 2. is satisfied for some natural numbers in range *0; max_int ! (this is equivalent to: 0p max_int = true").@& 1find_first_mono p 1 is the smallest natural number N that satisfies !p &, computed in O(log(N)) calls to !p!.@ G Our implementation supports two cases where the preconditions on !p8 are not respected:#If !p+ is always %false5, we silently return 'max_int ' instead of looping or crashing.@#If !p N is non-monotonic but eventually true, we return some satisfying value.@@@@@@@@@@@@@@?@@@@@@1A@1String operations@@5Misc.search_substring3>search_substring pat str start C returns the position of the first occurrence of string #pat+ in string #str &. Search starts at offset %start$ in #str). Raise )Not_found$ if #pat; does not occur.@@@@@@@@@@@@`@a@]@Y@@@@Q6Misc.replace_substring3 $replace_substring ~before ~after str ( replaces all occurrences of &before& with %after$ in #str - and returns the resulting string.@@@@@@@@@@@@g@gf@a`@\@@@@T4Misc.rev_split_words31rev_split_words s( splits !s U in blank-separated words, and returns the list of words in reverse order.@@@@@@@@@@@@^@_@@@@Q+Misc.cut_at31String.cut_at s c L returns a pair containing the sub-string before the first occurrence of !c$ in !s 6, and the sub-string after the first occurrence of !c$ in !s%. Olet (before, after) = String.cut_at s c in before ^ String.make 1 c ^ after4 is the identity if !s* contains !c!.@* Raise )Not_found / if the character does not appear in the string@@@@$4.01@@@@@@@@W@Z@@@@u3Misc.ordinal_suffix30ordinal_suffix n 4 is the appropriate suffix to append to the numeral !n; as an ordinal number: !1$ -> $"st"", !2$ -> $"nd"", !3$ -> $"rd"&, !4$ -> $"th" ,, and so on. Handles larger numbers (e.g., "42$ -> $"nd" ,) and the numbers 11--13 (which all get $"th",) correctly.@@@@@@@@@@@@@@@@@2Misc.normalise_eol3/normalise_eol s9 returns a fresh copy of !s with any '\r' characters removed. Intended for pre-processing text which will subsequently be printed on a channel which performs EOL transformations (i.e. Windows)@@@@@@@@@@@@@@@@@6Misc.delete_eol_spaces33delete_eol_spaces s9 returns a fresh copy of !s g with any end of line spaces removed. Intended to normalize the output of the toplevel for tests.@@@@@@@@@@@@@@@@@A@8Operations on references@@#2Misc.ref_and_value@@@@@A@@@@1Misc.protect_refs30protect_refs l f2 temporarily sets !r$ to !v* for each (R (r, v)$ in !l5 while executing !f B. The previous contents of the references is restored even if !f ? raises an exception, without altering the exception backtrace.@@@@@@@@@@@@@ /@ 2@@@@,Misc.get_ref3*get_ref lr + returns the content of the list reference "lr 4 and reset its content to the empty list.@@@@@@@@@@@@@ J@@@@2Misc.set_or_ignore35set_or_ignore f opt x& sets #opt$ to #f x/ if it returns &Some _ 3, or leaves it unmodified if it returns $None!.@@@@@@@@@@@@@ t@ w@ z@@@@A@ $Operations on triples and quadruples@@)Misc.fst3@@ @ @ @@@@@)Misc.snd3@@ @ @ @@@@@)Misc.thd3@@ ~@ y@ t@@@@@p)Misc.fst4@k@ j@ e@ `@ [@@w@@@W)Misc.snd4@R@ Q@ L@ G@ B@@^@@@>)Misc.thd4@9@ 8@ 3@ .@ )@@E@@@%)Misc.for4@ @ @ @ @ @@,@@@ A@ /Spell checking and ``did you mean'' suggestions@@2Misc.edit_distance38edit_distance a b cutoff 0 computes the edit distance between strings !a% and !b <. To help efficiency, it uses a cutoff: if the distance !d1 is smaller than &cutoff-, it returns &Some d+, else $None!.@  The distance algorithm currently used is Damerau-Levenshtein: it computes the number of insertion, deletion, substitution of letters, or swapping of adjacent letters to go from one word to the other. The particular algorithm may change in the future.@@@@@@@@@@@@?@ E@@ H<@ K8@@@@+/Misc.spellcheck33spellcheck env name7 takes a list of names #env < that exist in the current environment and an erroneous $name 3, and returns a list of suggestions taken from #env?, that are close enough to $name ' that it may be a typo for one of them.@@@@@@@@@@@@G@ uH@ x>@@@@0/Misc.align_hint36aligned_hint main hint5 vertically aligns a $main T message and a hint message. The vertical alignment is controlled by the use of 5@{ ... @} boxes: the start of one box, in either the hint or the main message, will be shifted on the left to ensure that the end of the two boxes are vertically aligned, taking in account a pre-existing &prefix , before the main message. For instance, ) let main, sub = align_hint ~prefix:"Error: " (doc_printf "@{The value @}%a is not an instance variable" Style.inline_code "foobar" ) (doc_printf "@{Did you mean @}%a" Style.inline_code "foobaz" ) in printf "Error: %a%a" pp_doc main pp_doc sub @ produces the following text:@! V Error: The value "foobaz" is not an instance variable Hint: Did you mean "foobar"? @ @ where the main message has been shifted to the left to align ("foobaz"' and ("foobar"!.@@@@@@@@@@@@d@dc@^]@UT@@@@85Misc.align_error_hint3(Same as Misc.get_build_path_prefix_map3?Returns the map encoded in the 5BUILD_PATH_PREFIX_MAP: environment variable.@@@@@@@@@@@@@ @@@@;Misc.debug_prefix_map_flags34Returns the list of 2--debug-prefix-map 9 flags to be passed to the assembler, built from the 5BUILD_PATH_PREFIX_MAP6 environment variable.@@@@@@@@@@@@@ @@@@A@9Handling of magic numbers@@/1Misc.Magic_number@A8  a typical magic number is "Caml1999I011"; it is formed of an alphanumeric prefix, here Caml1990I, followed by a version, here 011. The prefix identifies the kind of the versioned data: here the I indicates that it is the magic number for .cmi files.@ 4 All magic numbers have the same byte length, ,magic_length , and this is important for users as it gives them the number of bytes to read to obtain the byte sequence that should be a magic number. Typical user code will look like:  let ic = open_in_bin path in let magic = try really_input_string ic Magic_number.magic_length with End_of_file -> ... in match Magic_number.parse magic with | Error parse_error -> ... | Ok info -> ... @ s A given compiler version expects one specific version for each kind of object file, and will fail if given an unsupported version. Because versions grow monotonically, you can compare the parsed version with the expected "current version" for a kind, to tell whether the wrong-magic object file comes from the past or from the future.@ | An example of code block that expects the "currently supported version" of a given kind of magic numbers, here $Cmxa7, is as follows: let ic = open_in_bin path in begin try Magic_number.(expect_current Cmxa (get_info ic)) with | Parse_error error -> ... | Unexpected error -> ... end; ... @ 0 Parse errors distinguish inputs that are 6Not_a_magic_number str U, which are likely to come from the file being completely different, and -Truncated str W, raised by headers that are the (possibly empty) prefix of a valid magic number.@ Unexpected errors correspond to valid magic numbers that are not the one expected, either because it corresponds to a different kind, or to a newer or older version.@< The helper functions 3explain_parse_error% and 8explain_unexpected_error Z will generate a textual explanation of each error, for use in error messages.@# #Misc.Magic_number.native_obj_config3 native object files have a format and magic number that depend on certain native-compiler configuration parameters. This configuration space is expressed by the 1native_obj_config+ type.@@@@@@@@@@@@@K@@J@@A@@CB@@ #Misc.Magic_number.native_obj_config3 Gthe native object file configuration of the active/configured compiler.@@@@@@@@@@@@E@@@@=#9Misc.Magic_number.version@@@A9@65@@#6Misc.Magic_number.kind@@1@@@+@@@%@@@@@@@@@ @@@@@@@@@@@@@@@@A@@@@#6Misc.Magic_number.info@@@@@@@ϐ3 1Note: some versions of the compiler use the same 'version suffix for all kinds, but others use different versions counters for different kinds. We may only assume that versions are growing monotonically (not necessarily always by one) between compiler versions.@@@@@@@@@@@@@A@@@@#5Misc.Magic_number.raw3 \the type of raw magic numbers, such as "Caml1999A027" for the .cma files of OCaml 4.10@@@@@@@@@@@@@@AҠ@@@C@5Parsing magic numbers@@#=Misc.Magic_number.parse_error@@ё@@@Ƒ@@@@A@@@@ %Misc.Magic_number.explain_parse_error3 Produces an explanation for a parse error. If no kind is provided, we use an unspecific formulation suggesting that any compiler-produced object file would have been satisfying.@@@@@@@@@@@@@ @ @@@@7Misc.Magic_number.parse39Parses a raw magic number@@@@@@@@@@@@@ @@@@;Misc.Magic_number.read_info3 .Read a raw magic number from an input channel.@8 If the data read #str A is not a valid magic number, it can be recovered from the &Truncated str | Not_a_magic_number str6 payload of the 1Error parse_error& case.@ # If parsing succeeds with an 'Ok info $ result, we know that exactly ,magic_length 7 bytes have been consumed from the input_channel.@ ^ If you also wish to enforce that the magic number is at the current version, see  #Misc.Magic_number.read_current_infoD@' below.@@@@@@@@@@@@@'@@@@>Misc.Magic_number.magic_length3 /all magic numbers take the same number of bytes@@@@@@@@@@@@@@@@C@ 'Checking that magic numbers are current@@#