coolor-0.9.0/.cargo_vcs_info.json0000644000000001360000000000100123370ustar { "git": { "sha1": "38e13e2720a48891d29d84246957e7c5c94ac45d" }, "path_in_vcs": "" }coolor-0.9.0/.gitignore000064400000000000000000000000741046102023000131200ustar 00000000000000.bacon-locations /glassbench_*.db Cargo.lock /target/ /trav coolor-0.9.0/Cargo.lock0000644000000174520000000000100103230ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "coolor" version = "0.9.0" dependencies = [ "crossterm", "rand", ] [[package]] name = "crossterm" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ "bitflags 2.4.1", "crossterm_winapi", "libc", "mio", "parking_lot", "signal-hook", "signal-hook-mio", "winapi", ] [[package]] name = "crossterm_winapi" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ "winapi", ] [[package]] name = "getrandom" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] name = "libc" version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "lock_api" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "mio" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys", ] [[package]] name = "parking_lot" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", "windows-sys", ] [[package]] name = "ppv-lite86" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ "getrandom", ] [[package]] name = "redox_syscall" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "signal-hook" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", ] [[package]] name = "signal-hook-mio" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", "mio", "signal-hook", ] [[package]] name = "signal-hook-registry" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "smallvec" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" coolor-0.9.0/Cargo.toml0000644000000021660000000000100103420ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "coolor" version = "0.9.0" authors = ["dystroy "] description = "conversion between color formats" readme = "README.md" keywords = [ "ansi", "hsl", "rgb", "color", "no-std", ] categories = ["no-std"] license = "MIT" repository = "https://github.com/Canop/coolor" [[example]] name = "rgb-to-ansi" required-features = ["crossterm"] [[example]] name = "ansi-grey" required-features = ["crossterm"] [dependencies.crossterm] version = "0.27.0" optional = true [dev-dependencies.crossterm] version = "0.27.0" [dev-dependencies.rand] version = "0.8" features = ["std_rng"] [features] default = [] coolor-0.9.0/Cargo.toml.orig000064400000000000000000000012061046102023000140150ustar 00000000000000[package] name = "coolor" version = "0.9.0" edition = "2021" authors = ["dystroy "] repository = "https://github.com/Canop/coolor" description = "conversion between color formats" keywords = ["ansi", "hsl", "rgb", "color", "no-std"] categories = ["no-std"] license = "MIT" readme = "README.md" [features] default = [] [dependencies] crossterm = { optional=true, version="0.27.0" } [dev-dependencies] crossterm = { version="0.27.0" } rand = { version = "0.8", features = ["std_rng"] } [[example]] name = "rgb-to-ansi" required-features = ["crossterm"] [[example]] name = "ansi-grey" required-features = ["crossterm"] coolor-0.9.0/LICENSE000064400000000000000000000020461046102023000121360ustar 00000000000000MIT License Copyright (c) 2021 Canop Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. coolor-0.9.0/README.md000064400000000000000000000035441046102023000124140ustar 00000000000000[![MIT][s2]][l2] [![Latest Version][s1]][l1] [![docs][s3]][l3] [![Chat on Miaou][s4]][l4] [s1]: https://img.shields.io/crates/v/coolor.svg [l1]: https://crates.io/crates/coolor [s2]: https://img.shields.io/badge/license-MIT-blue.svg [l2]: LICENSE [s3]: https://docs.rs/coolor/badge.svg [l3]: https://docs.rs/coolor/ [s4]: https://miaou.dystroy.org/static/shields/room.svg [l4]: https://miaou.dystroy.org/3 Definition of ANSI, RGB and HSL color types and all the conversions between them. There are many other color conversion crates. This one is no-std and pure-rust and may be useful when you're interested into - variations of an ANSI color for your TUI application, for example fading, lightening, darkening, with compatibility with terminals that don't support RGB. - translations of color schemes - automatic downgrading of RGB color schemes for non RGB terminals - automated building of harmonious color schemes with guarantees of contrast - etc. Coolor is used in [SafeCloset](https://github.com/Canop/safecloset) to dynamically fade the background behind a dialog: ![img](doc/faded-background.png) Be warned that the ANSI range is intrinsically limited to 240 colors and that not all intuitive operations will give good results. Coolor doesn't contain functions to print on the terminal, but the colors can be used in other crates. There's an optional [feature](features.md) for conversion from and into [Crossterm](https://github.com/crossterm-rs/crossterm) colors. You'll see it used in the included examples. ## Included Examples ### ansi-variations Luminosity and saturation variations of all 240 ANSI colors, with all variants still ANSI colors. ![ansi-variations](doc/ansi-variations.png) ### ansi-mix Several ways to mix colors ![ansi-mix](doc/ansi-mix.png) ### rgb-to-ansi Finding the nearest ANSI color from a RGB one ![rgb-to-ansi](doc/rgb-to-ansi.png) coolor-0.9.0/bacon.toml000064400000000000000000000017641046102023000131160ustar 00000000000000# This is a configuration file for the bacon tool # More info at https://github.com/Canop/bacon default_job = "check-all" [jobs] [jobs.check] command = ["cargo", "check", "--color", "always"] need_stdout = false [jobs.check-all] command = [ "cargo", "check", "--all-targets", "--features", "crossterm", "--color", "always", ] need_stdout = false watch = ["tests", "benches", "examples"] [jobs.ex] command = [ "cargo", "run", "--color", "always", "--features", "crossterm", "--example" ] allow_warnings = true need_stdout = true [jobs.clippy] command = [ "cargo", "clippy", "--color", "always", "--", "-A", "clippy::match_like_matches_macro", "-A", "clippy::collapsible_if", "-A", "clippy::collapsible_else_if", "-A", "clippy::manual_range_contains", ] need_stdout = false [jobs.test] command = ["cargo", "test", "--color", "always", "--features", "crossterm"] need_stdout = true watch = ["tests"] [jobs.doc] command = ["cargo", "doc", "--color", "always", "--no-deps"] need_stdout = false coolor-0.9.0/doc/ansi-mix.png000064400000000000000000000254331046102023000141360ustar 00000000000000PNG  IHDRnsBIT|dtEXtSoftwaregnome-screenshot>-tEXtCreation TimeThu 11 Nov 2021 03:23:30 PM CETek IDATx{M\̐1*BAd)(rIrJ:.N8N9C"عA  3{̏k5{x=xtf~Z{޳Exl9ݯP??Bgޓ[fGK4~R~qۨH޵bc+hʍzK>IҸѷ+cK7Lڐ]>yjHZ/]Ԫ7Њ6ɇH[ḷWrFw.jL6ejt:I޾yMڗ|uV+SYsc?q:i?C=\*iSձ%+3{ڷI }sUk]ikxl}A_6Ivz ԾMq/:_/Q)W[Vg^֚u[%I6n+NfnIR\EEEjæ Z4owS/}^o`t68U]Rcf1 y]5:~N׷^b-M֢H:=6I\@3 ~%ccԱyJ߼#),R-4r[4%?G:].kqTޣ-7v/{`jTѠa/i vEbJ% SS2jU\=nWl@$|4V [*Y_uïq R7w5&+푉:Pzw/]CO~ޣ{\UG-iuhB߭ܠe+֫}ϚT];] E~yfAUR5WOƌL L{Qy_t|}qګ.Eiأo!i̅*[^0eeæڙm[vIkhѐ;~N׷k[/JNA^$% Wrpܟ@3~07k|''a;zhU̬z>ok<{ᵙ'T+i_Ҧ-Y_RNJbb*eЃOLƌLmTrPDT'hæLmt~%/Ihs%I; ù-;=?vykMo^Y0y$i{ngКu[T+nY[TAWB|ΪwVޤB*!>NW:!=S:'? W>CW٢nņFk.юlL֬o$;5-s؎''LYZ*%_r}Lܮ|+9qs}>N3M/ZU+醔K5>6ig3Tb&<}qs箽8xHUT$׮HelBw8t_!:JG_$)cKIN'yFG=?q_?RW\T32UrEÇ$IyyO11]v.n5qڷI;.*ެyuyёy/IU3==67g^GAq:Z82/`%پ?Jr&WVnЗKha`KVkSjS`Ws g} Bg;36n<4W߬ j=)Uf"c?{s%_dYD ?;|+{O\JCw/Nf oپMMj$)22R>_q/: Z{oc~ v~?'q}YkY}*(,TJ1+Wpӳu0oH-\Qvګ|_OE@Q^OM%CqóJ85*!>No3_{r$I$8xH{P qÑ' M%*g;ܨT1FD#Ǿ]ó5>|F"4w2]{kؙHU)M[Աy8.{|:мϗi˔?W$:WH`__),,ԢQrsKVm;)yyGޱб98m4[dDa.F5(T qB߸Mݮh5߾ 4/t%kztIkF%qg dEEF^b-uNnUjOX^&ԾMR?pkڗsPTԤaMXG|Z4?Kn\}MW^?vjktaqϚTm.(WKWwimawj}vu$)NM5k*+rj8Q|YJ#UΊWtgk˃9>ovJujZfޚbZu+ɂVI⢟tNJ~cP8lh`X߲p''aWW(gAgЃONQ{3pZ/]-[o;_QQwpU;_ '#i[j[.}piV߿>P-߾v۞ m&[#ݤ7;4A/_Avtn*ܵWZ]i'ODիWO TDD.Y7ޚW*o6Idw\m~5tyM?~&|}G%CZ:]_~"_=Ŵ}9t Mݣ;;`Oq:[oukCZdޞΨBJ__Yf |U^4v[_:Is4t`F ]+= f@{8eNF្AX5]Fsc,V='{[c(:B9 ԮGU*WTte y)ڑ[_,^@ǓNE;{*!>Nvf/>/3@@9^9B':` sN#t0슋f?c9A)ÃZ/Yhg?og7ʳ_z`qU;}|>[B߭P*q<ϒtmΈk5oZO?x7KuybrcuStu+ޓ~(3ƍ]WO$׮!I[n7w$ L{Q6{G  [<>9qoY$ziRr.**RI?6I+yBk35_OV\U/ZM[$I Z.;l_Pʕ4yZr\FWwn߸AfXNX+:*R[vyG vpF??]32%I ke>__%tQfzzmzob\vVo^NR&ѧJ6J<яTJ%I]{K4N&uJ߼Cm%O֧oS+jE}9{Zz&<}B?E+Tj%ݐrF=G;>2y俳3k(g[IuΌS1G~=p𐿏y} ӷ׮۪տf.T͸7v]y7c?Pۗ_PdY]ڰ)S6ejO;[?W,^c_|W=Oݔzbc+w:vu%֩)_O)!>NkI;ew>z*"d_Vj熒?EBٖ[ӷk9ڵHv#g_A_Y?g`a߲I;JiqU;uNn:5uvùM9cc%PjtV7;]c8>.MɊTZܪ:_c'C*WKWwi?H~:gTUƉEWw:YfuzY^߭ܠ]/xڗsPTԤajj#o֮Yz8>]\ujChO4OW)R5k\W/=蚿W֏W vG |ZvsPm[sr+5i}҂VCWi(]KKKZ{4z-A;l~3azCgկ[[%Ao'GFwӤq(gpE(og%y(0G9B':` sN#t\$\Ū$ir޾L]jZ߻kZyN+=8y!>|x[J;r<9B':` sN#t0G9B':` sN#t0mUxXl=ҒѴZMTiB.;r{qisۻvx!oy? 4Ͽl }}_͓N#t0G9B':` sN#t0G9B':` sVLiU$3gzM[70(ۇ/.wasOw!2- Zx^ 8ߟ4t0G9B':` sN#t0G9B':` sN*ꍰ*-IZ*i}=d[7>=}|vRjgRYp?x 3ot0G9B':` sN#t0G9B':` sN*3uUiIgI걝u9ۻ?K-jtۧt¾8v;~yPk=?e]߲y sN#t0G9B':` sN#t0G9B':`.ڪZoOҒ1-/M-o}=^uBs_ۙqެۏx6 7O:` sN#t0G9B':` sN#t0G9B'E[zZ>iږ>^nwaDBxeݪZu[;E391ooy=_ޏa0G9B':` sN#t0G9B':`~ gIDAT sN#t\UUY>%f)_o߾+=\͝9R}C 53th[! :؍?34~ sx sN#t0G9B':` sN#t0G9B':`.ڪ]*-IVji}Xk\M mӷy sN#t0G9B':` sN#t0G9B':`.ڪ yJKFVƌaZX9w7֥Q arߡ/BAH 8/sz|,'0G9B':` sN#t0G9B':` sN#t梭 {5Ӫږ/-i>~.緬?{;9a0G9B':` sN#t0G9B':` sN#t\UaOU-iZw{o\=ͥ97\\j~~\ %|I':` sN#t0G9B':` sN#t0Gh©X$RSL//y]-wډ޹O m̱;h֥S!Oۇ.O:` sN#t0G9B':` sN#t0G9B'E[(L*-I$M5/5Դ^ur\rgߣ\nYovkw[1Ocĺ?]2?v?W ot0G9B':` sN#t0G9B':` sN*<*-IjZ]9H2-o}Tqx=nsL7UۑsYԀn5o徿>X>6?k͓N#t0G9B':` sN#t0G9B':` sVSg*-IjZ]~=K[Oe};i{yc;3?wo}Y{q?ׯP['0G9B':` sN#t0G9B':` sN#t梭 {GL*}cZ~Lji#w{=}Ki"r^͝x9?Ʃ \ F#޽ q\ׇ s92Nۡi.nߎ3`<9B':` sN#t0G9B':` sN#t0mU;ƪQSm{"lc[zKgr|z벾;'`b 9۴ǩAFZs>wZ'0G9B':` sN#t0G9B':` sN#t梭 z*1ն3<->}]mQuX<_=NýyoU.?gŹux16wx]>9 İy sN#t0G9B':` sN#t0G9B':`.ڪpfX$y4´ҙG@Y7i>~aּ}~\sO?m'0G9B':` sN#t0G9B':` sN#t梭 {*}Jx-tEXtCreation TimeThu 11 Nov 2021 08:10:56 AM CETD IDATxw`TϨj4YQM1X`0.qI{/{dfKrx}o;xJ1ۀ[`%4 hw?@s3Kswy|=A`( D6`)`)`)`)`)`)`)`)`=>fEx]14_BnO*׏}щKgK4K4K4K4K4K4K4K4K}O-3馉_ew)o2y:}抮pݿܨ1rڒ;V$?h믟x2,W^Y',~nNChǧ?׷e%Wh;;t\jkE]/1Ms֮mE%zkm$)66FKԍGhϾ2#ut$%'k_)T~VGV\r(9f4Fޘh땷6%,{Z52(]9Y:UQ_zfOtZ:t_3oʗGқk UЬ/5C-JJ{֢STqV~anrd߯U\X}[tp$iQZ8wߖk|~;z#[ųt8o~ՒdxTj׿;|ㅵ'f+m$EEy5&Wv+1z=>S_?[f/׏ 4I z|ٝڶDb⼱ru]w͟Q#7V@P߸?EoDf(%9Q[5@_@*kF]?\ϿZuIzya]|H߭֙}۵pDrK_9&Жm/^Q||HR|Wi/Լ=JEfHYq˟uy1n7U[v-[\zoBygOCר]lEE}mt3 z)7'K%d䪳:~&Mtu9ҾCX1{|^fJ\՟F?'͜cU]ۨ+tNT՟>yٰSND֮ߩ7Kbc5Zv=ڽ;ܠ+HYk5bRSq$IE>ӵ:ޯ]>a56jջҦF>Z)IiTyeNV*UWeU%K6ЧlNWí4aP):[ݠժk=:~ۋk #=*[WV2{| 2.VI*6C9UYxJJLPtT*OvWUfz$)=-YqX_,ܹӒ6}o$߿֎˹Οܹ_$ qqY21Ƿ?Byw)լG?{U\Z=tp(v9/5CLun;p)f`~~oC!m߰G__}뿗oTcS&O%wNz"UOo;Y/k|~]}.ٛƦV(97ԱU8EjfO>{_NaY:<]۶sjni]68]mjmP]}2.`$)#=뚺&wH`KevBdXƦVIҐA?wbct71mT闱$>- _A[u|EEw #5iH}_o7bp K|T_iZxg隡Ӻ?ΝkswMu> ;vѼ+*ʣTMzs ֽfhX2R5ntЂpܵ~1jjiSKkFtE>k. dY͘JL^;;Q~VWllR4uR^Xk3{gOIF*#=E9C3tݵCU~WSۨ@ _EG]{_&j #sϑ+r q%oƦV=5߫mY5f%'%sb{v'_ә}DtZ.EEG+g*%)A5uMڵh8ZݿPAݷh^x꛵q^͙>s]b@sUIiEr_otolv9׏yη>T[dzq^ nTV}eZie]CoD-e̿tyWksu~w'0z|7z|By}\=VO~~e͡c!E"ǽE*=Vi/)^?E?>p ^Mu';0G @׷);#U4]B ~vKgK4K4K4K4K4K4K4K}:\g}OC ~N4X:XXXXXXX!vϷm~|^m>Enar+v~8q0ն^GwbFATD,Nҵ'~j. ${um,@19PrRJN*7'R=DČ\ R R R R4qX i6$Cq"͹9YoQ]v$?YյvPMIisvkKK4K4KE~C?]:n3nlfvg  "f]_l9=G1y9:Q^mw9EȌFn>VKϒ';bm%AAc=vZCKwLմyںeU/b]-:YQ(ݽp*AQ{4<1vPhRxT=pL -Eݤ=]@4ų9Un4" h:]Gp`)`)헻BXؤYqm&g>LeӢE&W7ɍ))---p&p, |!mvz!? R R4GOSjraAS0s%zHicfKtAx}zkm]ܪ|&8&3=ULk+] 9YJNדUI$'^y#}wW=lH=0_zmWX@ik?3u]NJΜWk[]e.r \?Dsv R R RGnSj]BH]RS7i0>grovƧ73lguuuQQ㹁+( h`uh7Yz0XX*"Ζ=0_&{zm:|ʦ""h$i߼gMa1AܪSv!bfƔѺe87iֽ  AǴ}W[ڔ7r9]uAK^DͶKրD͞6ȷ7IvPAUShwEY|\{/ScSvfOJMICQ7VgkڪCvP͹~vCDXX{4v{yKuo] W19xЎ_drӫ .>>p,;Lu} 0~~:1XX*bnqνQYT[ߤWWnվC. z4׏EkPqinwYEH,;Q6靍EvAa*Y޽JNWrzZZ;.z3@rRtz5tp}pp}DG] [Ԟe:zVM_h>h[$Ig뻾WS$ǣ\ik?Fev}/m@Zm E$pg~viIIY0|,]a3\t>}?? U:>hZtE>hNUTw;::JF Kol*@ۣ0'Iw𸽅$E`̘2Z;?",hH֘Q9*Ylw)"*hM3u:~ݥ.xiF15b2Sݥ>yRݸh:vEhD,E,1{4vݳiw V\lvsq3نv7Nz7ߴ\h"h}#I*)UbselegW~B) z`(BfxNVZUVթpgrd]@4OkL^⼱zc4nt,"$h^|C/|DO=MEGGi-vPͭ'(9)^O?JO?JIqYvPMllnuVۦc*=V7jJJ<>h⼱nAy<DT냦U*hMkfj©:UQMop=}zѻ$IG*W?( 5 z. /XX*"hÒRKwFuuuS }& L3עE\ .o|fp@z7+/ƦViݥUKg) ߡʪZ>ZvkƔvPMj-;Wv>TASجFh$j|y<%&]\\G JXAX:OOd:Ν׆{5<'[@c_Sވjni4EDtjlj$MaʎWۛv4sƨIsuӍxxkmؼW]}ݚ5u 6\11hPV^ى*ee*>kce%3#ɉV=rkk밳<>h:EEEUQQ0Q #A&IJJo,I9Th|=:}Nވue3pWh⼱HUvI4%&ƩV~@[&;^~K&7'K>5$/Q6Հ$}[%I8 R+Rr=z=s~l R Rأq7rwuBo8nxg2^>#?L}ϘE,劥3gfbFcl`Wh \4qX qIaC2կq}\fgf"hR R Rأq/.!D?ƭˊ}&㏙pp>_h'%%%q<x[[xYل-鲄)+{Ja <Ϙ,E,劥3f nAS'RFzZ񧇴ncU$Mgc#ZrύO:YQ4-]@)I Z6 .Il\4Fj4>?Ww]ufg/P"h +"hE,E,='BL6MMM50pܧ2& MRIc}&W\\l8-t~?T3,=!oh"hrҙY j#Vk;l $h5kmkR}eL?3\4fouى*C pڣxvKf4qZx<>Qk .  2(]_cM. z4-jimɊjDS pڣx䍉 \21j| jcjhlQv-&9pKƨYsk1ZxRԢ=Gv Ac/c5{4 h"hr.!4]@h W=3m LAhǛ=3crH{fgBxLwMy#iɝqN[4EDl+*i HIic p|{Ɋj `vȠ:hjhN3g1ѺYڳLM=m^~#H. g -JMICQ7VgkڪCv Ac/ c5{4 h"hr͝{%$??oڴ;]vvݍB=զLb#?,E,劥3gtӍp&r:nSNg׏EkPqinC\4fΝuƢ0W0㊠1a*Y޽JNWrzZZ;.z3@rRtz5tpdݥAu.lvP{Z6Mbbmini$^M]<R* p냦k jhj275>*Yy7Ojji]'k2?ﷹr+ƨYumm,RRb=8_t)-_ŖZrEИ5>zuVjkhF,E,=g[d~G;lw.gWUL Nj_d+/7z'L0;B:㫪t~ R RX:3j|>wx^`0qE5>kjiOKw܉"d\4FNUTw;::JF Kol g>D̈́>IҾ- )fƔڱݥaA3p@ƌQbK\QA3mrNg.pQ#M4 8+&aC2.i|6lH?+ԈLO">Roo6k|&I'Vr54R#wg7p\Gl> 3fgxh|&7hR|!iiif-=p Y|~"A+ΌIRJrrLʑ$VhͪohdEt6>[=JoW(5%A,*qŌƨ$ t$pgn;)%5&/GqXy17:WO]@4/AO>|(B]]8,(&66F:I+mSJԛk 5}h%%z8o.`PG16UwyczI8UVժU*hMzmAi©:UQMopWY=}zѻ$IG*W?T@ggkׅ"@~l R Rأq6 $nlȤPb6>1ڢE>ի n`)`)W,5>H}wԈTX+٦@ `c%3g>@oV?_|Wyg>"hw?Uъύ$'(gh~*juhoڭSFP)'W?[&;wޯ|&8냦Y5*9N11JMIԬxx&h⼱oޡragZ$IIz%Iy#J\tǾ~4hʭut3uvg!h<+I.~]}~%I6Հ$}[%I8 X8>ha3I z=sb^ R Rߣq>\hlʸә5>o01|滼.Cof|~`FA+Nҵ'~jl $h%{ukɝmН+Ƭف:PrR9Yv+h7>8낦g3*h5AW3"h:3k|UfF3Hg)11NU pAYnN۟}hw)I_VumcO㳒r={4K4K9~Mηv IvrU}&(079,o> h>LJt\?$Ծ~fό`)`)W,5>3Acl`WY3q}\Gch g4FgqUИ5>18kƬ\4fhw5>3Ac?q|И5>Oc4}\Gp/`)`)8՝vͼ13/xi {rsTf4K4Kb̬S5JKMRSs 6WpEИ56knmuT[פ):>g"hߴkD|dkȡ 8+hjlHٙ4&/G'ʫm Г+f4u66 k/jYxHUA[TV0Q} \fgs'.,IOAGdG-.pE5>wW=lH=0_zmWքT@gmv ^Iҙjm밥^g4f1k|Sى˺=Zz}G|> k8o8z02E&xuכg8!W N`)`)W,5>[|M0c~:tqEٶ%ZV7Q*WSYJ KU*(`ASg4ch2cj뛴`^]\YuA/ޟ]%jniSaZrtwm ,hzk|&IۊJ.=vZR5{X5ooYoNVTk0U0⊠1j|֛1 ̸b̨Y|\{/ScSvfO ƬPjJw⼱:[ӠVm'd@7g/yY\Gp/`)`)8`qVԩ&gY:n8LhWw7g--W Giv3\tfLnqνQYT[ߤWWnվCm $h]?f]CťJJSk[Y1k|pDXw6U"7>VL,?|^%'ƫH^[E-6W pݛ:mؼG(zy} .cseA[ wa˶ڳLG֪wikmg(hj|&I:S]&y<&'N\4FϩQ]K`0p o0j|&I;5 :Y~VM-mkd_v Ƭ$X8-{p$SZbK|Ƭ$j^]vs G|> ;C3Å̴x,˛?hw f4K4Kb̨Yjr_1~@KAcM?/s'***pE5> :UQ5Q#76Q*Wto|ӄ>IҾX/ z1ev9" qU5fT wP7 u7mrNg\/g<iڤQfa\3g4jPej{aAӟg4}h)W]CskAӟg7r Gx)vWvW6ne8a3\d\&&LZgL 4/ڵ #)TY{p3XXKgF$)%9A_{GHJJ+|f7Y6@. gt=50-IO?R`P{X2G;6WpE5>9YZU$,s'R+RܣiQ7V^oƍ6V亠ً`P哏'(-_*\4}5>u%'gWgW))1N3J\4}5>NuTzR*BMhwzO_k.IW?{s|ٚ=uap9\Gp/`)`)8q);lw7[ C= ?`)`)W,5>H}wԈTX+٦@ `sWYG\f=JNחScSߴg) c*.4>[iGr{?[&;wޯ|&8낦gfU4`8D+5%Q(11jX:[`P yz'q6lޫ9 6W pMLJ֏R~Ny#t-㊠1j|]cS$i #UvJ~ sE5>zcTSۤq?cg4i|xtӔ3W6hߡ ユ?8"pۛB,E,=]@g8^pE@Y|~"A+/׏PZj[UXT5jlx>9OG87 Aڮ붩IS3u|3SFW6kكUB?pWnQvJk5zЮ5u6lޫ}KpfMCj㑲3hL^NWK JU]+;QT{*p+f4tZx=bX[(IJN$57)&6ZoiX[[m5\4;vc5dPtTMvGEEUQQ0Q g`7MKkZZuZ11Q{Tm~PM-mxǒC%gڣx䍉$ut3uvxvue3phRxT=pL -Eݤ=l~PϛҲ7z.tr|М;W7FKRJrZTV66Հ$}[%I8 U2M[[~zAz 9\Gp`)`)8`54/ &70;nfϏߜpYm|xw f4K4Kb̬lq$];H qzg/KƬYBW'ϪH9jݹ"h(9%'eW>jggsŌF\4f䚠\Gө{39~FӟgqXef*;s$ipvTYU+?`W h,7'K>u$/15>O㳒r=Trr R Rߣq>\BmlVgrB;}hWw7g--١ _S0XXKgfrNT56Oi"A+"hM:YQ4-]KLӷ^w?إG+lНkƬY7V;TRZ޵wh:l|Ǿ~4hʭ6V34>{JIJЊwitIWeU]e.r|И5>h|~$ᄏ븺fg/R33g@g`ܣAAhgwWxSMtܬЮWgȍLB:9N`)`)W,5>3Acl`WY3q}\Gcd嚠1k|֟hsMИ5>3U{4z6>q@8~Fc?q|И5>3Acl`/W܃XX{4bw!ʷ444nd|RgLƍWȤ5&'Yff4K4Kb̬ٲk҄֡ç(Ѝ+?϶,{}R="houى*C/ Vp\4<)+B'/1en1NM~}uA tqM5>cھD-m9LKsں$M_$i[QIJրD͞6pM7'+uk\!7;z3t@5"@_?1k|=Ԫ>r䂠1k|8o4U[ɧl h;ׯ_XƊÕ{4 h"hr. DWw=V76 S{ .IDATuRVoQKk\4}5>KNWTTnyx56{fK/osM_Ϣ.qn˶ڳLm?qbbuƪ 5ITwݶIG kd\w4SuM2S$+ ծ9~FcL wktZtڽe3pY3IZHIqZ|Iç|Jt1k|&I@@ڪWWm SUr =G|> |6JQQ(x|+ R RX:3j|>wx^`І\4FϚZ>wpWQ@ S]Q5b^zczp#eg^h|vL$;x<w㳞fL{B@o\4}5>ndeS\4}5>n<>S'T%'WtI&Rb34>Q#*3=UۋT)74>GHmMI/j˕{4 h"hr.z Lt|Qig7ɰ_fϟl??g8Ƈ|}`FA+ΌI+wTIRIiܬ;%AcLg%gW* {oKxg4<'K?ڣӵź}$[j\U{4}5>+=~Zcr獕qs:bF#7>{哏H[lНkƨ٭'(9)^O?JtYzMv :mU}E$INuTzR*BMF—0B~nij͂-,N_&KSyGLEbq'bxۚ苟)+]O{kaPVHG)epcO>ÝSW[M6l=t".v8+o|u$S4l!NY\8&hZlT""}И5>ѴKS47moXX,}Ьah6ors>ԪJNnʢg""VuUT Oh_Mt˛v33sMrS]5amal-tEXtCreation TimeWed 10 Nov 2021 06:59:17 PM CETӡ~ IDATxg`TUgfHLLH E, ,KE .Ȣ(eA)˂ M)!Z ވɔf( {g3 v?{w~g cjFԌtDwScЛZ!&\im_sY8pCfpS?[GDη)=xJ1)Լi^xI4kز#= .-kq|PK% S' E6qU9^ =n8t>l J01ȸaiW|m}|o: %2"WGtg_|ܼb4*%e7 闲1`4HV>Q4UFv=.XY(Jom~~m{iT:</OrEW]8t}ڽj<ڵ5f HO]Pco: 4FZz?6-b쫟X>tekpط3fyk~1g. ?ٳ6O^@K׫# =~ n,l}`cìykq452ykѶUC9Y/fʈ?#jn_XK7Y#+8qg.Ky qO@mg .e^W?URz}? 0WޜR=ھiyK6!-= Ǯw}Oa9 [)25Ner>8sY񄟯}PǠGp/OwǸwX Y. |(?OtTUow/]=eo}ܛY/Pw4nx/"/~&uzpc@le]̵~]RZn9N qbh2[6Ϳkyi1[j|N6)+nڟ|?<7' d6㑮:TUm! Cfڱ=6`i+-(,_^xI, J*y{u}mGCa[.ڀbCfV.w#KWm9yMA(=?5Lf3} <cFFNnV}~<-ޜ0x3=_Ik{'ϯ>wX:U_~CnSZV60}j{'"*zտLa__^ƹذuGmiIScW/w>{ ;z߹?bQ!>h(O<wz,k;^a_kv礓Ze '"%IßP1uD$$ DDBb8ND$$ DDBb8uDD;lCܕ?Ɵq7<#"!1HH '"Ép""!1HH '"0UpzU*KzNr.22zhh(EEI}HH '"uz/<$Næ$]=L&֣ ҇׫#} & '?ܼb,[SшHO? Vݍ}O!Y,I뱈H%QuqEe'N_DDx|=5Ԓ.0PT\'a7[>(+r<"RApfPPX R="TXTQ'Zhߦ1\H=*~2&zY˘hdfHrR90̀hnfՏZED*IN+Fh?MMbn""'قOm6h= ّ{NDND$$ I='-->x@Ty*&FGV~O'^a=eWC4ib{=^aB?p""!IZ($ 뉖1 gf"'H뱈H%鏜=q\&Z(DdG9%AR4.H.9kb8ND$$ DDB><ѸA8[]4n:u OFDjHV&1ݱg=0x{SXDrs?#"p""!1HH9iZ,p(݁BŶ9 JT>ȉp""!IZ7|УX;DUa6[T>6C,ԏń0z5$9̤qZ>fMKl3\n E%ZAD*T8EEE׎ͱb.G!"\&}1͑Xj;?8DK;>> )c "W }8ὩO<̞VqNm݌ןB`/-وaфK9OFDjHN]bzz"ZEDv u8f(51HH '"{NZ^z{6۴9lsD#'"É$iݘ}֨⏂2lٞ˷d2k= }8cޒMȹV`3UF~ƎHr҇5;_MоMc\fIӡ~D]tlgej=$ CacAr#J.N hqEa""\"KQ\Z+ps3`̈ '"ɹ̞S5^7 ">r }g*Y?=ST:*+pDŽ(,ݬhDTV^cܞ DDBzIkZTzG6 Cv]ܔ)Jus%$(r/[IZADv#'"Ép""!Ԟ=v#^,83o ]n)+݃w,FMesDDwDDBnޭfW pHF=HNy{2Ve>3+Oi\" ʐ'Š.ȾV5bz,"RAp9$HAQIڷnGzE%6l=hDC֯`?p"˽ - j=r0* Wslf"ԧu^xewxE 7w֣JRdFH&<ޞȼ9 T:*+ڴEZADr{NDND$$ I='w#PmBCCm/p ]qS>AJ^kj]Iddu^vprȉp""!IZcC&Ac/z4"RA#W D=xixa\aKT>b)HK9؜& z,"RIp:~l^pGO>XDU0[,ؼb:f[XD4l KS>KS>7^7P뱈H% zb8cѷgyk= u8yyzS0-tpwh*"éҳSOƑh(cGƹ,v;IN7aW~xs9{SZ҇ӕyΗZADv&i. DDB~IK j=*@\=.1 ew II JʍGND$$ IӺ3-Ed2cSb2-ɬhD4/Ƹ!S: Xf֣ RI{hVd\ƑXxG#":d҈p&u8#+;?7: C'N Rb-G֍X`2QkX4Ԑ~C 2}/h۪&3˴T>z>RO_o% %<=q5;cGb/T>z%EH?2rG˰)""=Sg%ߓuDND$$ I='--*zUl/|(tMQ6P5HNuxDDBb8?kqD˘hza33߿3OoXt:lJL߳lHr9y{{L|2wC\xKѻ{ S 䔔rI)g$x++|ٿwNXf3$";OwDEʼn8}!p2"RK#'[n* {Opwwo}PV^xDT͠סÍA 戤&u8( 'Zhߦ1\H=*~2&zY˘hdfHr9yy#"< q)F G8z2& CU?j<5%|849~?՜\6q8 6%Ċu5EpJ9vMl6E89{NDND$$ I='#BTYZuMtQz"BPPX `0-NMDj Nerg~PXyg~D(&d׫'ɉd&|8)ɍ8t4kR]b1$r{N~^(*)z "Rɥ)*.vlkwi= 2덙oUqy!"\"س?yňßOMDj NJJG`/ K㞣XtVNJes'NCDr{NDND$$ I='7#B vלbenJ]sJ\kGND$& I:jz'[esWs LpR*ىk}]"Կ#"p""!1HH9l#誼\W*rzURGND$$ I:铆{65n3a~BߧÉHr.V+D˅Sè0VOl͹+c`Ͼ/,-Nk4>l"$_ oOwd^ÜaIZKDv"|8)ͽ6m!"gq='"r '"É$Ȃm.&&ơw9Eyσ)ܿȉp""! ZT6mCCDx(bu{F=NJes];6 Ɨc[IDAT獒LJD$|8)͍KWnW+<9d[4Ėbx H,%06a,^ o5/z4"RIpo~w'N]HVps'u8.]ɵ^S^ &u8_Y ^V74y%NFDj clh4aSb2w(,.èὰk TU5>l])ҕƴáŬykDpR*3̘`f/XĩѤs""p""!1HH9-ATگ_lx۾}?t;w~/xDDBb8?U6u_TM9 gKDv"|8*+**3/\㲄=LD>l͙fgYSǀvD.Ѓ-{Nj< Rx,~uFYQH% zmz" >=bq13^z"'N>=csb֣N^h F\S`NV ~O0HjL"3JT6}{б4\+}|'9xgַNE:";1HH '"{Nb]&>٦T&]W'F﹧~xDDBb8?U6A?f:mtH9v[b &"?r.je-_7ɟIs䇉/ rDdo9*nBld$ ?rRr<خ)<α1؟|Z뱈H%9`Xy lY9u ̚V뱈H%i||?o:ncJR%q,5R3ߣoz<"RAp@Cͧ`6[TDd‡¢RKsO=GiҳD$9JT6ƻ_/c앚JD#|8)])|鼁)?#Ép""! $6vb%(LNi=((GND$$ I:3-Ed2cSb2-ɬDGNJes3^73Wxk+ 3G$">R`[p߭I{hVd\ƑXx &%"{>lc0L*+ w~HjRSn~11Cps ?At:zi= u8Y,rk? &cfEH [ 2}/h۪&3˴T>z>RO_o% 鎈es~ȸф.鎫 ?g|DT60./BB?Z}Oi5.ىT6g*OuDD R\Ép""! $6͉MLNc8lNk;3OoXt:lJL߳lHr‡CZ`}H;06&_07i.hO!7xr"RCp7q룩h֤>6S'Ċ _߻ÉHr9zᎨȺ8qu鋈V#HNQuѵcsX (*.^yc$~J lN"ROӺjޘH,]w}0 0n䭅esDR"og^1ˍMHD"M8*KuN^@0{/z [h4)كT&W\Zr_cFf8IN=;-upsdDH9* }g*Y?=S5:*+pDŽ(,ݬDd'BR\Yy7NE='";1HH '"{N⓽ . ~sg{PzO){!Fi8O]=*ّdl/p9z]_O\Uh2/هT6GDKpR*/H\. '"É$d/sm6׽m端kP&erJxDDBb8?S*>i8wkS6.#iZKDv"|8զlnMYyZJDv$|88t4kR]b¢2tDDpߖbP\d_+Ě?bHRSukY/9$HAQIڷnGzE%6l=D4t9!O^@Htb8INܮlVү^h&#"G>lJè0\)pdDHŸ*+c`Ͼ/,-Nk4:&3B0tG˶F1AOJDjIN*o~w'N]HVpsn"E8ݮlӻKWre@!$sNʯ|DX/łgJDv$9ؔp|& 0jx/wUUF-&"'9X2~ޘ6y8t᳘5OΗ&t8)d0{:'MED ݝND$$ I='^ڂm _&p'HH '"u悃~w* =Q"|8*+**3/\ C{@3$'|8*3HKϲשc@VOVk1*ّt{N7CM:̑ ߖVaMf'OFD&M8ݪlfB۶)6o?tDdoRn֧G,.fNApU6WMӡO؜QmRmc$";:jS6}{б4\+rDBSmY:a"r&p""!1HHB9 /F엻,??,TVoW-Q++8Pg0zU DDBVbж t!9|l^h ^9, &<_oDdlbǷم͉HW7Ht9l x]Sxycc?=HN*{*-l^1[V@ݺ!M8ݮln||?o:n=HN+pC°d#fXj>{~NLDj N<=PP)t:x9sL"3éln]h q_z¢RKsO=GiҳD$9JP7 x̜] N)r5S9ZGDw' DDBzI|˾ķ_4mpԖ]GND$$ I:3-Ed2cSb2-ɬDT67/Ƹ!S: Xf*‡@_4ix/>t52.([Ó]NDn油:d]4"*._"IN-/FVv>nnuO<N_/%"5 [Y,rk? &cfEqH%ۗ7:ć~A( ڶjɌ2%"{>lݬz|+Ԅ겹yK6ath4!RKl3xzjv>:6㏴uD:jS60./BB?Z}Oi2/ُT=Sg&""guDtwa8ND$$'{]62x{ xDDBb8?3?uCQPT-ۓx6k^ <=c)1 sϲ9" N%嘷dr <, @e!WGLpLFO~ yXfƓ‡B&%4om[ébw/݉D$9it:GEvMq\&QuqENx{j5*فGN0og^1ˍ@QqڟlBH))q;y 0ݣ6l=`]7u((,`p`²9"INť(.-GZ0fDolzE7 }ɿڷi|6sqTReLueL42xJG$9}|BٟbDEOԨHYu?ѓ0M ߬QéJ#<=1x?9K7[rnc,ؔx+nh" é1-t|h""gnω '"É$d/sm?js29u? ^9ND$$OZa=2&~^Li<5%|8)y{{L:xZ"Il.) R IV#Ht9"r]9/#"%E8)"nW6GDK=j7ȩ6es^A{?od\ʁhjt"RIpM\LX <=\)pDdBSmRC~49t{NDtw`8ND$$'z]kS[&wMGpl\Bٜ; Os #B1al6c8IN=ږz܉#Ծl.*.vlצ-rDdoRSm}1͑Xj;?ѤDd/RRٜ;>> )[Hn9Umٜޛ4\k5I#ڔx)bޒh0MȸDdBRٜAGf^Z^LMf&":Lf3\t{NDtw`8ND$$'z]k~G{pp­z9ND$$O։HN‡Rٜ:IpR*SZ'"9IT6W2:"GNr\mHRR\mH.RRٜ:G=j-u"GNJes)#"9 NJesJD$/IlNi%ݞND$$ I='贞@%m_o~) 붗lKP[p1^w49ND$$Oj[&ɻϣu0r J4Apmܠd"jŸ-_;~:3HA6k\'"<te[5Mpv29^7^Ͽ؈NHD$i`LnP\WhqS=IN+7,#wǨzD"3)ver͚F"+Nq_7W/ăNMDjHN7Lno)|#Z>i8O]@pR*+ .\α^p9+eLD!t8L%t8i܉ѭ$NDD"p""!1HHB9vk=bs&*AmYʶ:-9ND$$OOԸ̈́ pHN)ۼ=+~ŨDdG‡5;_MоMTXTt~ȕNt:" EvM?t'Š.ȾV5bhR")VI'uG Jоu8*+*a '&"ەYw!O'ەJZ<ڥ'$"{}N7Jè0\)pDDB9)y{yg  пO'5ONDj NJesF!~`x{#j,Hxr"RKpR*k9q""r"f>kjIENDB` coolor-0.9.0/doc/faded-background.png000064400000000000000000001465121046102023000155730ustar 00000000000000PNG  IHDR_sBIT|dtEXtSoftwaregnome-screenshot>-tEXtCreation TimeFri 26 Nov 2021 08:04:45 PM CETe IDATxy|Tϝ}23d'%M%HQk>*J+Gi[.UZjPqA6! ɾ$ ~x9s|9^%777?[lڈV0sR2_Ml!4gdd;|Y+G017m{Zt26n6+L| 5~pgK`0yg$a6jEl 9}jehjL$)אָ%sP cc]餸InPKEQHHH`ȑ޽[uE_rJz=~3f ++^xP(Ă 1cW`ҤI 6^xŐ!CP%Rꫯt:>}: . !B*py</E4zXE-o! 'Og/m>b-zbZe#nËWo30sR2Mm^Oi1L̍gˮVygqɹi䍲Ua 6=Ս^dj%ͯN(zG3$LU$`|N zO)X*l{ 93?>uVճ궴rȶjXz5|'̟??@v#3p|rXjoZ8Nq!BUa Č,0 s%00Vs&f]d M o=逴DkH%mmd!cqg ?cě;./;v젢̙Ä ؼy)))oFbbbld2a6q\0i$nfJKK)** x /v||$B!QZeo=s'l7kqL \]IM33,݂FDoxif8Lt(0v*(v2u|"gع '{Tw2p\\.jkkN Ϫ̨Q9r$7po&۶mC~B!q*9k\<~@ G'@"e>_߲ք\3g  A0b{A}zM_ie`h&s'ᛖ2_Yn8c3%_h͘ sҷ_U4@ F!m6-+e{}}=cƌAQ&j@`0NIjj*guRSSqݸ\.mƶmp\m6ZZZzdffcǎ>;~!B{AO.u2saIO2Q즦эVTjeRn@Q=j;c2h"3jmLI2h 3f v V+gϦARRukkEwپqF9ϟφ ?>rgjjj>r-[>}:B!?|n;i$n7՘L&(((n:͛燐$&L+B!D&%%.11ǝ|:v}m>;f2$:~~㍼:F-N{@vZ [j6lMx}A~neP8O6FfZ=h4 -˨6w[I30j k{j`X&Ca72-'dalv,9V^Qq3'---j~ìY={6C 믿FQƌɓ2e ܹիWG0ydEaƍ]|>駟N~~>cƌ.r90k,$%%Yf1a{?%%s=3f0n8JJJ裏" @yy9Fӧ3uT222`ރ9GW_!b PrssC999ǀe˖S$!B4B!! B!B5I B!)!yB!B B!B& B!B5I B!I!B!PM!B!j@!B!TB!Bd2wB!BvwBd2ϼB!,aB!B& B!B5I B!I!B!PM!B!j@!B!TB!BB^ױZ !AqdB!B$B!B$B!B& B!B5$1|x zV v3oAע(>q}$&ZIHb1xf ZXVPG]]>_\!BHd$cq8 ZRRb#ۭV#.]Lzk4 Bjj.If'6֌Ӌb ##B!8 I6<+kh}k{;@.$ :fz6O]]v4 ml&t:-HGfRRbIH`p:8B!ĉI  (qqfh]'u0"P(D(@Q0@xv#77K}AB!HqQ%2?dғK('1I r}ttx1 !BS$$'Tx& o#QB!T ),lj5a61x|'4eg'j5$B!S맶`0DzAUB`0%yB!)!q!PRRR GCBB!B& B!B5I B!S8wBCB2!B!PM![b湣Y7_p1k_!'Y$B `a6m W$N!b۰7?Aqh@1@Xb H^vd0{Rl/Uxt$2Z}}rG3B9Oye:¢yѠ+(uE>8kf1bw_WBL!Srx ԵqœYxdyi-#Ežf z-W\r&>Vm [LrC>ꊯ0uL>#\?Cx$y0sb"㲭?t9ĂFDc-:~{pnoU ߏ !5I  ٽxm⇳1>>TeϾDvH[:xmȶn}Oeʄa<8)8̜̉=/G& Եx#3m]ΞHCީl+<Q !d2wBc-򹶡 E{\ .wv.;Ę ıœľV<q2=oVKr]mwDʇ$]''-8YY^Qtٽ^ger j3cycx^%=QR-dHqu[rCBbPrlsjR,`bmfu[Sư)PۨKom`HOBwN[x >ĄO܌j_BS$B F &o|&v.t}S㣣CSL4Kݵw`aEHK##=]p!)S\l#j֑jO g3'&p;)e_5g 0$Dvgס!Z-{ɟT; f Ͻ9?p"\p-m|iSr"un Ν7 ?u[azg`Xx1?6!љ2&)c<]TֻB|T%p{|UƊ/#w}7_$8q)!q!PRRR幹)!誨/!B!j@!B!TB!BD-).d!Bh֬Y,3B!Bm">> B!ĉ(\t5mNo3&Ή<ʏCq:47wXǗhb1RQԧ q4dBS\b/]?͊lJ+HOce|2^~'/[YG~}%gRZNai nҧm]ˮ]G\NN&\yD!q}c]*~wUL2bBw圑d۸/_dPb ΗB dZd2IIlhk뤡Ff" tk' jHKcxtvvT$+v{ 饶?:t;@P(@}};QHKSSzqqfpfCd V_/ı~{-ҭLQ|͜Ѩg[A)>6ͭN^~y7ٴK q//g꿮=Ul+(`s3Xag|pCQxjjV}sK9$? ywp/@5*΢sYl Ҝ[\dF x[!qVn [%ƞJMM+.u,#vSՇV!33IOgm6V <յERSc /i zj5b#ihjrdQY٬*dd$1uzA -ÆD=0 Q_4⇞ǏюhdzB0th"F#k F/&@ee3UU͘lXt: eeM459#HH`j@ @zdCwY-h_^?.|LXG%\xP ?W}<Ξ˲?O>IG_ߺ=U ܭΈ4 TQ,=4ь\w, * =seϓgSӿծV޲k:{ ɟsPx~ K7wۋɤVhr#>Bsseeh4RSjHf Wߖd-y8@R[ۊ'!BEEF٠*lfjk).# n PTTCYYx0_TTCQQM$yP_4?Ǐюhd:cյq}յw)oltryq|]EQ3pq:^PD m\>^?uubbt[eilt_=(ƆwmB+uNv1]k4 W\:Ǟ^IAQ9UyU>6=U_Ǽ9,ݕGK+I ]7:yq8]ַ|Śu۩Hqi o _Sӿgm /3,wI ̑&˧ӍS_߆j: Z[;iowEN--X,.4: !B\frpx~<z6j|}5q8Bp1/vz-o;1?Q>AmVFAQ鴑m.t4 Iu!D/4^EQ0}ҿ?* FM+MwqS*ٓp$h3#X##ġvTr{TnnZ7D/}{B3'b8.Fv"InAQRIO[Ku?^o׿yѨ'%ņɤG *}@&نҗcP(/9(QϷcBh4/F;=j%p̏Du\SP(t8d}/XZUw,#;=[UKU8 &x{xu<ڝ{^Æ-y/cusU\c|VSӿg/ĩ[~\>t: zP(D(T^-a:Cᡦ ?f"5BPQ$$X"kCnS,α<s)`0H h<:`() tgf`{F'e: vv}/D_\[e3G5r{7z!tނP}n̓ p2u|p 0{OFO<6l]9;^ה$ZD;v3NN/v׳̈́Ѩ#%%C0 CA,tn_F_}[GNlF'<aUsz-{>>c9?QIRG{孴B!8NJ0 !B!TB!B,a/'gPå ^O(Vbb ?B!-FAQbjڜ-BSIOVVEE5$c~OvEQFt}#om=hXg EQ>߂HNſWZǗwsdB^r&A<[\! !,acN~/ġә>q0K^35wX]׸QT\niSwHB9#Jqc_ۿ~ɠ?B#U3a677 ˛ E!)Ɋ(tvzm/'oFS[ۆS~OV))6:&'II6<_~FF^/͋3hUugl.WEha4zTW7|Q.9/ϷgZ]7^؆?{HIy-cr2HKpw% ɬFp̛9Q϶R}m[?OkU df3T}luK'>U3^oo,* 7!jFH./-m ն^OB&F=fAu&>MQQ #CM}Lmm;uAmh_ \)1,z K~c1t5mӸs#eW}<Ξ˲?O>IG_ߺK?O_]?˦q̛=4e\w, *X;/{̌_==U ܭiR}|=/ĩjWy+soYAuڦN޲&,Ǥ1)g|ߧ62믐A,aRD m\>^?uubbt.z^ۇpv{|ˇ}Gs8\x~Bpa2'Ԝ1pLwykszیmkIyU@WZSǣht=r538}l ;)o~1e{sg_Em} ; XWY}ֻp0 @c̉NJSB d׻QSowXBcO¤ih4df&u+u^] HVV.Mgg=! x ?Po^ hɁ/ķb_mu-c l2𽋻IMG7En]R}CS9>8xvTs\8k~Yix+񪎯,f=v=m,zb-;>}kqq=~v()j5bH6W_)?tcm#b-.e@$!䰢(]!O(AQ!N.mN/#nP;ξ[,8*(Z]PSz-V A&X3zIOL=k/>,pZC/p}_5/`(Ċec8A5>`+>+8,1u<ٙp,>O0շqzhR㙒ݷ]٧qsl\7'ՏUkotqƸl 9Pټ{? 8UI)?Ntto%8z) 55NqMM AhȍB!- qANOji &)x~76~mىOO ptxw}'ۣ/}٨号NB|Gu}V} /JVF _,oϿ){Oj5 Zkhe>X{|T dXߡˋ KIi /7ȄܽLJ,y >CB#I ӳ0<~O =auG^ɔ~wUϯvK9#Jq] sɵG|$B T@q3Lʢ?bGq-]9wtC|'{˰Ap8;o71y٥fWq53oDF= JyinUʺ TAϵ@,N7~yh4 O-_ͪ6O7=&woaYp!NU2,8pkylHAqz;?y&UMDi]q{ 8|A<Ƥv{7V;˞'3#W`oy- m5qTd)y9:U\ U?'OӥO׷.<7m+&{h*6SYrTT5DhO9wcDv{zT#`33e\*?OYpۻ,_ F鯐ǁ@q BMϏ&YrG-W.Rw7p"_9s4~5SͺN7XNAQ9?7$ح8eXNWd{sg_Em}KT3"@CQh3#SW!d ȌCMcE?G$8$bX϶ 96{/^@Tnn\ol_a'}P&Oo'Mwq~SG@rCn)]%\4{2ΚmfDV?ګ׿<7|ͅ2;'ĩL!Gw?/d>|U?VBܐ'A!Hccc Pi͚5ϲI!B$B!B$B!B& B!B5I B!I!`;e|22O:}oCgcg5w8B~&b3*]s9r{ذe .:y~Rq"{əVYvn}pm$G2!0,s}U g$p圑d۸/_dPb a !@1\|y䩷#۶ثѨ31( yVxr|Ν2AOyU<6ť5h4 _ϼ1l+(ѧަUK,cm1,MYe=wugpCQxjjV}sK9$? ywpoi[q&Ɲ7ޯ*d5*΢sYl .?>]7:{;Ӳᥣ{?CBC2!)NQNg96]8f0&'ȏϟ=ӆ/_=+@Q"W}<Ξ˲?O>IG_ߺPu7/=O>ɫoE'rSYrTT5`ƪ|߹}df"gnmNpOU?\Bv2TwD6u27cdB$ 8DHcs1/?);wUR s"僒㩮iV>|Kه+.cO}<*NEo^SKQZQ'MEܷɳ/}颶+֬Nվpo  Ĉ41oDFKpwe?\B!ĩD0 !zc6k.ńjt;]of[^oYfd{wk;5uSJR:ʮJC=4èჱY7:2qI( fFd㭽p !I 89;ܸ^bP(jÜ7F7_Ͼ{ՒjF>CrKaÖ<SDZ亹ؓO0lgpZ"KZ̪?\BP"K8ŅB!˴_ b4ltyhwٖ=4gg;ɇ}>:>ĔZp=olvqH}pVRgqgef!zŌ9 ㇱ  ()aΌ<m>l~p>s2=rYHE'3q JgDvGgRVYiշqzhR㙒ݷ]*v'`hHygU}8. p@ўJOdenD$~!Nu-LKdВgiY%LB ť5q Ytyrn噕|ol+(e«w^y?^Yx NKa݆VOo{Vm,TKW}M|y#ɢyx,y\2wJd=L?{+ ³6p q*{=&K(q fa !!%777t{ē!!ill*Ys¡,aB!B& B!B5I B!I!B!PM!B!j6!3}zͩ~|b|2>xm}y]ySx쾛z]}!N6=8Kٓw ȄA{ ,ࠩ)D+6in賀RRbo6jΙ{ȲM?,?1\|u]}vjb =~1χ(n`Td_Ou>x/D{əVYvn}pm$G_$Lf3Y`BWnYZza5.ovmز [v 3t!<\;Wub`P@x4^vFf" tk' aHI4459IJlVտ@jjV FS[ۆSU_Րfb1:p)~5vP=Ϥvdғ٬'ICCUюOQ1(BgV`_q⪭o|vt0vhsˍv֘ț=Xk w2&:,cL~TG(\y>fNhԳGz־y崳r;Fް}@-?[)gβ^Gkw-̌r{J qʴ\/[C{fuW#gl=6)S)~Ac?CBCpkf3ptŐh%&@ee3UU͘lr^Kmm+> Mzk) `[v{ fJK"3!jĢi(+k્?Z6`0DII= x<~UtMSZHUU3hǗ`j FHў_qrv No[{ "?R~s[oeI]G+ٓrYW't[ɱf/g!o^4{.}WfOUyΟ:>,~?UMXU[VP]p)`mS'soYI.Y|Wq*howaL146:p\nX/ryzx<>zmv46v:^?n/V}u\Q448x|8nή PiltT.cյEKv|h ˇ맮ALNsW?eJ T?an~?4yCJjYa'o,ԍVFpťxSǟYcH[U½l} ^zzٗ>O>TvN*rG?'ĉ`ݶx/c%wHBcH&'hj5]{<~4%rRP(/9ޓvC&pw[s8ƧTƯXeLG:6t=ht=NALz{TWbFbm1VEVaYb봔WG+iJ)Iq=Gd{̮zӝ6cgNJWUV}c[f5G?'ĉ#bao!ɮW ӑT>JJZX,F22m~P萟R }{{__q9V?'rՒhl>/Nvq}~v?ʣ }L&q wop!Ne~Dgە` x IDAT0H h<<kFitK,َ!q|Rn-G9 ݲJW v).Kn[-nY)G8K!Ӊؒ-ٺGۚ%9#f>g}>3nj PQTRHݼwKl2!'2NiFOKϕ8\ZHgtwFϺ;#  :zzg{Qz(v{~PfUg#eh<YQ+(L7"3G!("TJ@(a!t} 986Å4MC*%4f)._2),hif32ߨ|a|<ϲq<,lSƷĪZюO_t&[Iwpeѽ4׭V#8Ck x!<_oWSO\H'm7_ e$Ͽ..,Zp)M7"3G!(j4x<E{{ d2EM4 6"-4Z[XYV00@8EwwU 2ߨ|D/,VNYKn?xN+i\zt~+7]u6}i sO-t?{X,,n#{]%7c3=~;ಿi op4_ނ߈#BLooҔB#ŷIuTp;BI7N^Xl&BȡkՊvp ]YtyOAR?y g-B@w "<ϡutׁVyQ$],>߶-[ )O?Դ{W|yex< PUT`iv;9|&{iӇ)qb.ık{p~own%~wdEIk{q׭W?/~ӏe<|=}`h K;9 vGq??dxZ-Vngh )P?pއnyK?~SF,߻._LVs/A[KS]77oW׳}w`"1qӟGمlCt$.iX IV[s3*;\7"'.F}0ǖ 3qؕ!|uHeED!p $Y\m8vCQ+8cG "DQF uu:m`F;r?72Z(r)s쟅)UհshųE}}#ؽYA_߈HȲDWWV6TgA4$hjra` Qwla8aYїd f XиLP8Bw];‘=pÆS/O9׭[wwu+k^~y'k IVp'_<}6|a|'~bN)>6܏\|by-[®=Q|p]?}߱?o VV`fl_M;;p]gǮƟ١_{]xWq-˷K;¸0bT>w8ۺ'so Ϣ<ν7ز#KŻ;oK!8Sad2BPa  DQF,i:E&#@ehZ7@R)}ׁtZV}Y$)d >-o?0Bazk(* E$)t͆m`YMHI3_2A EŢ~% C>׭/~:h<-Dxܓw]u-[a> ߻i4 1Y#lSpuo?nbiGܼCOsWG,uj}LU~B!j;F1fLmɲ\ND AӴc aQv\vtt4!Me#f-0FPuִZorcxvQ2IAx<<"o_lQ38_|9yl3'& DYYu7QY*"hn߲7چ* _z{rRFُ?"8ȴmjl϶!LgiR)MMl6KϚa|Dd<²hki駬6,$+xcp88^E 0l5ncL/ ]X݊V-Q=~ _uN=qZ#|,y-a?n|,moƊemO%RPTv;뾡Fwqv ǬS:tct(u^?uӖ}m?3WmB؜4Z[XeM-oh]]! ^#ELp#fOU5e`t鴀v+Agk(~N"IR0>C 0ىXUyeE)DjU ${jT0 όP^'4=q}i sO-? op4_ނڦ-?཭wTUûVWb7p}7ch$^قOYcjY(E\35PĦcO`ᚏu!6Ħ7ޟ7Z><r x ׾tq4Fgm9 Uŷ~>y河1H~*>vV?FϨ|FۏBH%WfIut4Pm:Finj`d1LXFx,;3ZdBB ~r`ڸq&jett6fFr8l`Y fsPqf2HPȃf/XA2h=~B!rp8`:AlVftzPJo:,e9 b ft0O!B|Lbq\];9;'B!S0B!B@B!BH A]^K>qbA睄{B,g !ȕzXPom?zrê[sЋw3@(?G i"G8+p+޿'簥o"GF!pDw 9 ,[ڂ|,VC}o'v |)N;]\{ᎇ W.G^!!+.>};<ֻ*r˱eؾkwO^2%8 Kۛ! ^~} ( Ҏ0zhîъn'n'qQ˰kO ~o7֬Z4WY8`sؼ?x)}y3bx6o኿^z==}M"-@{Z,y_%e/q #/+_xe~stwFq;*>Щk I2{c`h̰|}ۇsĒiy,nۇjkU(JPU 6j?x=lO< X1nW\! _#pC8W},pÆS/OSBYtC#>7چ >cw߯ O߯gq,8Gع; ho (}'NW>>_=U45݅(طLɋLV?Of Noz瞵 OX o)򯅃OU޶9#qCl,YjFZ~m-?x7\s>wT~S??C@ 8-@uC!daPNgsB>w9Xyxb pj} ; ߻i1Es@hf|ν3~^|[wկ0VP ǒ a:7W Nou^\ĵ+pq+pm?ztWi;Aˊ#Bqwwᴓ6+QFُ?"#bzx 3ެPfU.G@lʗ矌[vww# d¼?LV@@ TEIg~8imt"YݝyvwF 5OAVԊ;-tBdԁ 0.8epӅMd@q3$;^Vu+tUد7é'Bk$ඛ/pǬuWGC׷}瞵Ne=kv 542Gן3>-wUKṲW+?<-|3Vg%I//,,&~zBCn4]6|B<-&[bY[5C!d0Z6[CC(ZjvjrC!,xy4^6=B!@BgxbA!!LB!ӨA!B10-,C(/rDs t088^R>22?^ {)-`| t?YV "u`l,Ek. Ţ|^aÞ=q }xv<񤹗L~b(@k$ {D*MMBuOEkȹ8B;V+ Eq cba1>q fSǁht]UUS !\ވp۶EzZS nCCؽ;EQV! F{wi\w_Ffl|z<YV:; jf+a/V{$Hd9*qDIH&98F/)oDo7eTF#]W{qw G._WxqMiG{E܉BQ^u!/e7!cd$ Ӧ/_Q(Hd f yHbQ H(Xq|2ڿר|[sߎyseO{ilۃ8~38fungh _o™y9\tDx¿_?QC_w͊|^5n{,R\i`XVS,`Y,˘$8Vcдe8 Y\+iVje!*v$#9x<<8AEfcдҿtO/GoKK/0Dp6|k-i4ML¢9pr8܅ڻQ<4eC].12,+xxD"ު,LێPjQ1?C0WiWn kdgDU돥 w$g)뾃xzt# `ױ!LENCZ,gA<<ݙ EQ+fۭPUm{uQ4M$)eSm^kl7 Ţs`~ IaaSݩwVf~ZR5:~OQJNL-m^K+!_Z0! t"q`YsEQ7nTJ@(a!t#O^{{:;3ۭd дҬI9D">ݥ!?nBe^o#/$|}ÖJyŗvۡ@K!ȲUUi@:- ~7lۯ_R;Uد7é'Bk$ඛ/#8Ck xqW>ЩG{il$BȡSLae ^tw>_4 'x$)!0KS0@&SD<^ی?y45aӏN.H0hiba!I 2UUXV+[tf/@ RjCKӖgjt4V?B(KI`f-[֬LNug4f ٓ/baq5Bl,Mo?{>4n…'b~|ic#wۍ/` !ˏ=#t^&pj٬$dC%gg2zǂeYhnj`d$aE M~}'yuC!D!7LIR y2H&-=p AfD4J !BHcQ R(HyHPM^pb|<;]B!D@D!sAC9xLTk !B!5@B!BLkx"tѫ5DSk%@KihO]p׭W/vqrx枏w?>m!,:>˖5c,[<ƊE\qy0jAoo+۴r7*US g VфVbŊ:;o&xObO.m;V^?Ûw̘sD{zC%nDM ~I!d@|NLgO'q:X <ɷ7{t#*=/gOB ]Ku-Nh !,SqtZ;Qс*DN8+DQ\Wf0 `ЅqBiX,V.3-2e y0Z HzsaJoyN/hZ'"M@T~a9088bQB()=74/==+ճcqB1cgt;l vyq7\d"̧ZXھvx*G>_l,7##I1YƼY(O[ÔcJF dC8ssSN +ALZY,;c}r`aif/B9AF*+bY9cYC_xYv5ᚫF(]$dE"~RB!R!TfÓ0^.\Dp0ڶ]8i]vO}ױD SVn`) 9,#;ӂ N^! rcɅH IRFeWSN2D|Zٚq#EYztT*`нov hjF4 'x$)!pV|'tfAQTdièVD"AK IRzH(Q xx S3XX0@&S6cl,V?/u7'owp9xo ?|]=7ϾW-C# ~='߿ K&)Oz~cҰl\|K4&_Ol 2x8!d1Z6]8!s 67/M rwa"Ѥ^?F7|y##iW].;ؾ=f?X,,. 9"FF_}xx,YV/RB!1Lw ~'\.;ơ(*x\Eggh4e9#K#ϠՏ`ЃX,`Z[<MJQ  I47{M800$hoo' FBS nw~5.100n*ZF #V+ etihZY0JtYʿPN`_C*%WE pŢll|B!~;;Gvrфh4TJs 3E\{{\##)ȲG$⭺L۱cL,U_$X,8MӠi<9ASO5ꉏB!SEQJ N"vz(p:UPvdnBU}iZof=j[,u<7c_xeyFRU pADrE.HULoOlΈ$M1#B!c;:q<V1=q`YJB868A7ɼBA7|GZAQT\{v뜞$WĦis,Eg=9+Qz#߁l|^6en""-BUKnj!BiC44惢foe ^twZMS ,0 gLE)DMZM5MpH:al,H/`KDx<<Awh?#tIB4:9lY3lݱ/"(s tc׮1}6?EiKoqM#dIWA(0EDIrohm岡Xϋ%I $c Sf3ݰ٬4 lXJ0@$̓eh4Qog$tO{tju2hooY{7ʿZm6 - RMwNGGDQnAkt՘??ͨ?2D|x}Xsp88(T*__$i@"$.mm~lzmDVc~3j:;EMIo|=_ ;fzߨ~(0>0F$IA(C$QQ,J8s \r_sGoF7LT5 DS mm=V]4 V,8kYҩ=bQ5~67OEaxF/tZ@gg]]!LP0zkԫ eMߨ3vi-7f;jXiL, V?,ˀejŢ\ЂBA~ } |`z=Ffzo~?y>.9(*o#4 復izQrgeAϳ?Y6G7LTs~bxXBOO._zJޱctƫ6[Sg?[|@.WH xBAΝpphB4~UTU5};lj7vs=V߾Fǟo!'-e4k>4`` %KhjrC V+ @4hZQq_7^nr/70\gz5zL8?2U$XvPkcYV*]{(>gtZ IDAT1"03y o:V~`]JWE+/ei0ukg\OUU(Z~ݺc^ Ze8ՇL h vxU4#pADrE.HRC}Ͷ~ԯs4 >e ]?FFQsՈW;~_y~XXDt5   xi~˰PrS4Y 8{rMӐJ hj* `Y.FEQrNۭNxpLr"a!ڿu~F~֣v67GwwsMuC]5 a <X,M@h 4~_htջQ1X,,` )"U ${jU/bi,[F02 ASU?(~5cb"&7xfeh ~#Fw#XQr!j٬(auv(&PR~޽ C7nlB!dVM@@B!RE>_Į]c94E BAd` !BA@B!BL!B!4DYtMEoWͲSb[_}{!gvNS;]0e\gE7GEy^ zسw1dؿqweVu3%Dre&1"$P‚(˂(Sl X62LA,EXK ʀ!?4Kur0ʫ2323x#**;2#+}Tgdx"ݯpM1y=YG !0MYCb(be7oVjiҮv簱Qˇ+ݷq( :8;\)3WFDx\^J=LS=<To**a eJ0-| (]x U7M~m-L&w8iXEq@ayVq yTU,;+~ӞTYzܥ) gߣ!J% M F\]r9 LzR=>"n\dhpVZ7պ i;Yos ("Eco/zeMc !tlx^qp0Hj /J׳8>:GJ j.lۇ߷ D1+w`Y\7@Mj lZm#חvn}ض >$IXJqY aYΉ]5$ɳ!,I];e'}r8KwA.a{Bſ׳Ueضrf1=gSx0K|M3]˞'gTt}, Y! C{Eww<1ƒq|2?*@BQ`bo a*{Ty')Wy߿6q|ܿ_a(dlnQuSwY yW^_/Xov9=մ!٬[jv}ߗߴ?٨ !/8A!I~F4'9A!"hd(G˲|?; #(x߮wպ(ͱe!y^]e=E,iQlVi?}MI{߷ yECFddIsa(c?viuA2 $ 0YCdy"*,}Q7j MP*Ńi_y\;+ʊ EaDgwd}}~LSE6rـe9`͌_{d0p Kz_cCb2#G.v:8>2G.ſ۵Q,3HɲlV}ii?o{Z?E !/8vw;VXY1! l14D{Eo8f!|2oEaqMHiAxllqeh6ǧhiӄ7͛+c5GVq sՂΊ?c ROO - Q,w8PiK|͛J42=/B<~BK/E;Zkky չt]/Wy,h֭J[S3z~Ҥ,ii4"ܹg#!$=UU8`yqE{{馹l[[%NOɋisSOAȼ|oD!书irEDU%rR[@L<0T躼c0By+g!I Bݟ{.yBdYDnPBsm0pA㲣qf.; {yQ / D!BI B!ԨA3\r@hB!3BHBr:߯}^*f5r<:y4 キ0j[_/km n5MF>,i+T';{3ܺUEݧB4*@BM2#q|ȲԔ?](3`v;9n;qشiۣM b,2TGwK_BY&*@B٬vbUc~2,ǭz^# ٩+ 0p1sE7m;csJH٬ .J% B4*@Bĵ"uOD(_[+Ѱ&>4 :|?D3I/ja]}w? D!\T $IeYa(n'A~߁]aAe"v⪩'E7Oy鋔M>*4H@B!W !6F[66 h6=qfT2/f߶AD( uǚ}:2BUDBd+s(b8>+ę[*պcaJٞiԱ B<6>BʨAw]"E'1q|?@6xx[Eq ;>шL!<8ca/#~i*1vEMJ!J!$t$O ]_C4V2R1x^(Gik=/./;)CE (֭ ѢL!Z>N\78E}Lx660 e~'( r:<Xz\NCd@~v{0uUe)3Th4T2b^Zh#/`^yQU 7nqeGT~}< f>"39ǿC2s0d0Myv&L sVs0M0|&?>׋Wua8T*&Z~e4+páF޿EEҟ7WVU8nUPuaYΥ_ggO CsZ㧺?OsO{>=wkIzyGp;;}r#&iϬLJ-# ¤"f;;}r\utAt:Czv0 L9,^&i:M 3gO3ݗ$IT2p*n^J3qr9 aYΙ^ TajҒ29CAօmt]I>! #4q?aG5??Ȫ4Hi.z=&/#~ `>lۃp]?yw̒ߛig v;z?v} wQE"۵2٬^c~]$I,}i?qc;05[>,HTLZ2#ggH<y<ϥ4`amMH./1~*($.Iݾߋ_ye1xZ(<("-ad0p(su_gD]FfTi6=e0MuwZ UE.R"l[ t(2BQDT*Y.h8>r9YAvm&4MI(X$*%*M$x {M ++& TU8+1t6xYT-"g$lH8<G&9\noE4|?0c;$`u5YgJs}MSE6e央^-^;:>FmvIfwVtg?iy>=eŅ"/@,>,suaZ_/ Ngl ͛+c5FvTY"jx!T2("lG֝CZBul:fӂ (ڀ`4Q E&$ ɍ8dg"G?bjbDgſam-[* -6Z,OC躌_X3Q>O>iDCaZA;?!?nR⥗ʈ"6W4`b1~?{(~垘N{~n?ͬC,}wbigVy>=m1ʿ7-}r;w~?炪p*ܑJZmn8Jɋlof7ͱI!\"`*t]^zۃLh IDATq@1!k(8~oE[kY<"|oeQ?]8q~10qhuZyf]_CZ?qߧ?!@B&:'5 ;>dOZ3@yCAbnA: Y!qs*4E^F"xAd9gw*@B <Y%Hk,3geIX e 8rE`C1AUDbVEoX=8Ï$G?UUp Aߺ*$Ȓr^ Y:&Ayd4)hofF5oigQ\Os!.LtUJc 弆RNCDXrK,D8CPP̓a2QkC9\+ǫl힓ڨuܸ=(d+, gaye` G3>5ϪP$>Z réV>^(Ya"Ƭ볨Ywk5;rkR~!,w_f !KUU82\[1zӡB!7L.Lr<wZV#B!䬨 !\q(>S! T +nֻ(B! *@B!B?Mc !B!=7- O:k;y :Y5/;*B!/Q䱲b0Tp!>,jL5p۷WϴT*Y@N}sV޽:_Z͡PГ?zԂm{3y?wA²4J>!B#ubm-c48!٤2 cǧ mvŹ=Ȳj5㰿߽ ! A<~܄}:㌯LSc X ky!c |\X *RB$!C;Da%q( :8pV XҔi?-á7Wp~ ֭ jnVk` CsZw:uTQ*e"TUen-_7jͷ:G=ÇMlo!"VV8>|?i CAId?J?JZ~R9"0MC&s( Q&H]vBI'U c ] \XQyz/jQ&af:I}>.+q(2n'- ^} Qe'$jl\ׇi:$qi{IYa;祛l % ǁ1RHBI/nN2 c5<ϡ\4}DQ`BU?zJm&#Q@փz]?[7lV;u0dSW?q+L1( *@BYHi\}. C/ ,wT2LF'ma4C/\ׇi:$ZF<./q((q$<|ƍ2LSęQQ8>=jAQDܸq4 eRɢX0 8ӭj5]{rX B4m$ I+#N;vÖ^++&%yNB$ T rfs < fQ~{=[[%ܸQm{,gHTLc҆R Avv( q#]E,Ikm{Iw LF;kcǕe!; #ܽ$<66 h6-IHT*Y::!$I@d[,1 '8~mۃ$ g:( u^B!Eh` p],q~ /jsc^A4UT!OE Q%ݍN6itf"Mf6OZ8D ǹn CiԱj} r8dY0Bk۵vmIlnH ɨ9>,cEQ(NQ-`v:z!AQę"&3sQŴp0i\ !,dDڵl$EQ<YTqFYyƐ n4E,Ke9,beńe9ߋ :q¹T3Ec0<PeY6Aej DQ"2lۧTB! 1H7o$?Σc(20B&51vZ}?D=@ǏXY1.$.-F磥 ^ĉǓ'`Ad0{g 1hś߿:«X0!2ac9Cl qCZgi+yF2J\`]gX[ˣ\6Q8TU(@(R+vǚu~cknN崉pLSE3u8| 66(LwS?בɌҙ4ݽ$se]9;;p-t&]Y MH*I;'F\ `sl ׳Y ܿ_O8beBDs dYLj_҃ pR)v߷U"V|^GK Vj3?rqƦBUT3cbu5|^`²@y`hדj0Biw 'Id9.P1vo qqɓvȕa(e)eI6rN,@8.k6(}`Tb$Ii6pq T(Ą8.~o2bSd *}ZaAy<Yi2$Ix!!r-4qzybIZNqMy.0gqH ݮݮ r`*24VeQ* @\NCd$-#'0B!Y1p^Ap񵅶CyHXR.IB.L@\ lz6,Kz~2/ OoM8g TU1v{:yq8>߯0d2qZ>U8>?nd*Z-EiFvo\ 'H1hXnlBY,$(MMɝ8m{E( Z(bEBa0pQ(d 4Eǥ:? ʙ?9躌<|ÇMv(y1]Q !B8*@ 8U !B9G.;B!g B!6wO|y&~w~gɨ~? K'C|EXYYg>q|_~sÃgWW!Bu[FB!Wl:677 xבvǽ{N ڵkx?Ľ'}O:s8Y4~;盾? _(0(}@¯+_9|گڕOB݅wŷGS*WTo={(dO-8dtc畾gKY4.gw|JXģG0 9ĔB!/U}߇ܿGX//'$޻w_fҚ:- ?;W!{}/?`c{`wji'I>O { A>)|$Ih4?C>8VVV!<*/_r(_|_8~ 200^{5o&MitP)(>_~@ˏc8&]\ߟɟmGqo;N8/]^>M?s?ZMEloo_:V+'BR ~m|K_Jn/} ׮]E|K_+ _3Y}Qÿ7CR&~'q |k_c gO~7Scn޼}kmรi˿.dYOOG~Go|Z No??n߾~kW_}~^{ gۿ۩7M?:~z 9C~1q~J_WdpZ百u}UOJ? >c^}Cw|+PU\.u>я7-|ӟk7xr?aj~?c?'Brua_:~tJA^.[d|#?Slooɓ'ַ~hC[odw|E n3|ɿܹ~@\{o=zV7x7n܀aK8~c+w~ww:xo;u|g]{T/|~'l.-ܴ׷OO`6xw~]~z-4 DQo~"-eC!\_??@VeOԥD$-+O=xAo)a+]ױ|UUiZz  xqݱWZŏb}}n?$C+wwB,gg'[(ҍiMH&= (,%Eh3uܾ}{)Hُlu/4=^WJm;IJcB#됆Z8viK0~0S r^FW \S;Z|?vNe2Y9,ˢfRreee-z~3~_h4 Z?q O!r7rzqt:BaNo$?v) 8}H0B&+ FzԠJ+,?F>VFb1l6 PѼ_}܈bti.u$̿lFCCT*:::{^jBH$tvv4l?[2I%f#zD—@i4C. )B! YHR~;`0uX,t?15AZ6yb1&''!vvߑHfRPn6 uijb.//aa2899q(--I8 C$oKӓ~G]'k= { <긗Q&0== χ}zJ%pqq/i n|gbq7[Ud2(a9]Ánd2cmm'B VKm[YY籼 ˕z!WQ{ ]̀a:B!g)Ba JQB!"ǃBQ(B)TD!BI[pYB!BI@B!B/= ԉIENDB`coolor-0.9.0/doc/rgb-to-ansi.png000064400000000000000000001143501046102023000145300ustar 00000000000000PNG  IHDRGJsBIT|d IDATx}PW oAeDP(/XjMz1ͭV6[nn*Mpc55j 7$/@@Q^a`@fϾNAo|>}ts稢zB!SR!@@!pb!NlVӭXjj*=|eJ&WWWΝ;wrXt)O>$s%$$cǎ"V7S:'dggw8ȹw;:łh!oҥK=z zgy/py;kKoU줩Cqt̙3 zzzpԓ7w^V)`dee1z[{n:O<SN/6x xikk`L4UVBzz:> c0عs':3f̰֭[wh@YYvŅ0~aٵkא7VQQAEE T8rܸyG蠸p}YN:ņ hkkc„ ڜJJJEV>b!//vNEVv#HLLڵZG 9z(̟?477+4줾/2~xbbbl^xFE||SN%--ѣG̑#G8x ==C{ssœ9s7nnnnדXzY:>hooW 6maaaʾ͟?/kkk>֒@HHȐ0n8233;f.\PNJ t|‘|X̭c9a٤0b;vm|8#r8cwGk1HT*;v??d2٤9s |}ޭꫯl?4LL&F@}}=C*5w}( ~իOOOرc^Bxx_|,Yo111|gkt:-[FYYUUUttt(ʕ+/9|Pĉyټy3x{{e$33۷SUUŃ>ȓO>Iccr޽{9y$-ogy/~;(//ϏEuC8w}gڈ`…tvvRZZ8dddߘL&~+_>>CBtt4j|}} >s8Jd(x8s _fĉ5J918r|1|yG:6BBBhhh+̟?R~al `uc8Ͻz2jjjhjj"&&.,--ߟx.+WÇo1P܍r8PՄrY&\eɓC.hTVVVHPP.~~~X,JKKd2QSSc&55Ǐ+޽{} }:?>G!>>'ڜ<;IIIĠVQw^qmf3|rpCǑm9@uÑ:[YdžSgg'9VzRSS T?ݑm9za#Z͔)Sعs'NBl۶'|_~****8~8^>Tz_]99s;vإMMM6xyyt?vif͚ŋ/Hyy9555T"VKQQz555Jc3JOOR9, ju...h4HIIaz#FP @à 9r$...xxx"8{xxŋ孭v_8>Cq!;Fͣ>NvrrrHHHISZZ;v,?0ͳB fTWWБ㈡3Pp;Vֱ`2 t}wt[g趆n8",, F3%%%c"͛܎^ee%o!!!1uTΝnՠg㊊ >s1Lކȭa6y7 #44$fϞ[o5hw*J}vQ@͍\_J ↲-PPQ[[Kmm-#F`ѢER[[xZ顶xxx#-ơzUgq3uzwBe=hGqnk#ݍ{饗lʩ9tMڮ.;RSSl??@^^K.eΜ9o2ߍ4蠶˗/N> Eww7#F<, wADMMML0fI{{;&@Pn;BR8pL&3f̐j\BkkM\=]3F:u222[d.]bԩC]ɚ 8p {yCBB3gƍ͍z)..VdggFkk+<*#G_5c ʕ+TVVyfe_|qG!wt;իX,+ˢbǎ3m4RSS)))cĉ:tիW+𴴴pرa-}ݧVFDD .f>3^{5t:˖-L3|ĉe8qM `4D*++ill$((H X,ՅdfX*AΝ;2/ڥεp ##`F ڤkjjK>}4f_imm2 !'c*fZVcX~"멧͍\ZW+`c̛f|M %))ٳg[oI0 >xgܸqʴJbرvl~Ǎg7RTt:8@EE&vƌZ=*eXNgWWכ!wCIRR~~~g?.'?5j??}ݰzj3<<~ŋtwwò?B]۷3w\~a?NYY6銋quu??X,|P`˖-deec69t!3;w....444Gqefm۶1o<233㭷=B礊!c-_rBGɣJbƌhZܸ7n.B<zΝˈ#gƍ444b !ɣ!‰0w.O.O"]!#I!‰I B81 B'P8Xf iiiqF4zŋSTTĶm\_բVihh 88LQT\x?j5:%dٳ۷ϦO,ܹs@oCEKK ߿оŽ->>pyyyh TWnP Jee򹼼fyTT .w>˗!&&'|6*** dٲe9s>v~kN>Ve̙,_ە4&۬wUsff&lڴ:&NHvv6fBGGR^^ξ}}YyB v܉ZFӱge/K,aL6牏',,L өfӦMJ:`l`0`08{,+V`ƌ6ek&L@yy9eee΄ $pr|ŋӟĔ)S@Ѻ*w~Vˁޱ/^LOOe˖QSSúu0L]o p=WWW~4 ΝS懇SOBKK pvΟ?ODDM 0RSS󣱱PFə3gC8wwwT*&Iw#uU!TMMM^gӦMjٱc`7\ yzz/VdZۛT޽{ '++Nkii!,,foͼ|vޭ|h4 @o۷SZZ:~2g8qpsuU!DVHpp0'Oh4(((h4yChϜ9D>ctdeeqJJJo4k,&OOWWMU!\J;AVV ,W^҆V+@o ٰa]]]\zzu0yPT̙3('ZȐ@@0c fΜڵkillTL]B;Q@NN!!!,X5kMBB6l* 777e… hZ4F!!!i...},zL>{&FBܩknn&.. F#jƎ 6$00Ţ\5-\rquuE3qD Xd )))4i| ߟ 8xж|m]+jjkkGӡ9p Bq/ 55O>777+ Bq7pe˖q1 ~Ǯ]Zk4>444j*~_ѣX,455qA=jNRRb4oo:jiiL&޷ 233z/^LQQM/Bq7q( R\^^,{mj4-[fEvv6{졤d~i~m._+))!77ZM@@>(<%M}}=7oV`OOÓO>I[[x8F8'G3 bXneb9ܹZNcϞ=ʲ7c :::8u2/%%ϓSO=뉊"11?\I٩OP[[KBB!!!6_zߑ{OXX#HϾ,Yݻw3mڴ[]D!VZ˗}/^ u٬RHLLH 88ƏOdd$ &LU*Ǐg„ ,;v,+WdĈTUU och4Ν;wis>L&֮]`@@q7hjj"''Xz=6m"%%Vˎ;['22VÇyjFlOOOZ[[Q %&&ZZ{* [n___xXz22ܵ_~ej5l޼2m9F856H!_jh4ɓ'1t: "&99~湿Jz_%ʕ+ʼ땖*mƎ?̼yz\sXb۷OYANN^c=Fss3CJ#[_Y!5+WDRNDDxxxł #22Ҧ!с?~\nkkI6<#ܚѣm[Vqs == 6 )p^g!‚ Xf $$$a+yӧO-FaZٲe jA_׳X,j\]] <<<5jMCT*n:pg!477GEEF󏹺~k:yg={6O&%%gVjc0hoo`ѢE`4f֬YXV=pB˩^ĉmv$p^k$00ŢBŀs1"""صkWNGsٳgٶm̞=:֯_o5::h, ټիTVVب --ѣGcXhjjb֭6#i>+cƌaʔ)444jժ[UL!(bPEIܳ]BXB!@@!pb!N̡EItwww BE!NL!‰I B81őĚ5kHKK#887=͛7^---~zzzPռ@oQP IDAT&gϲo>e=L:/,$##flW_R>׋eѢE~zGpzŋSTTg 3rHؽ{7ӓzI&I}}]!8RYY|.//WeffϦMcĉdggc6),,T}ל>}V̙3Y|9999Juktt4ϟG^__o3L]ѣT ** bX]͞={())!99~~[-3;;@lBKK SNeҥ[6=a !УP~j5:*eل (// DQQL0&ٌ`رcoˋ3fؤDRc+իWtWWWgƑ|j5-"77aNח%K{nL硇b\rDnM<|*++|2{졹iӦBA{G@ղ|rwŋӃFaٲe԰n:JJJHMMϏFBCC9r$gΜw?z=eeeDLL Ywر\#FPUUEnn#̛7N<0L]vpp0?H\]]1 J;bm!~&rrrE׳i&RRRjرC9hxv۷ot LjLΝ;8uz`0uV%--{իWc2'22XV^=%`wZF`6qwwz*#vuuQ]]Mrr2eeev7ZF9y$FNGAAP3g$11?:t:YYY\r7Raaah4%vGiTx}~.\+VϾ}ۛ-[1%ܵ:ӣ+W(Oy'XbVjN8 Bq7Xr%* www"""HOOÃ,,X+JbΜ98pbjkk ###c@EAVK/)j5zCG{{;FѣG;O@@>>><36^{5osX,tttCmm-ǏWڔt{h4\\\0,]Ts%w~BBBX`k֬!::6lؠ\T*\\\l]!ˋ|z=yyyJ@0gbbb <<<5jNr8o䓝Mww7}Mp"D_tXVlقZ&((Ȧ]s/ !Ānnn&.. F#kV+P[[K}}=:W ߟ ڔx{{S\\L}}ӧYp!ޘf-ZDII Fooof͚jѣCeLnp>jZ}ꊧ'X,~AAAQSSL&۲_BџرcDDDk.4[n%33GyDP믿V_̙3iii})}zZZZ~2e GŅիWwUv4!?L3)SU8{,۶m###ٳgSWW>7H>}:tvvRVV_|!RwUTT}}1_BUΕ]!#XB!@@!pb!NLܠOt mEITTD"!I!NL!‰I B8;&..$֬YCZZlܸxzˣJY-ƍzjonn{bZ$##ffW_}Uss,^"mfl(H=tuue޼yzBgwBq's( R\^^,}Mjj*>,uuuJrssQ裏bXS׳yfeZp=m]zf:** 8#4X=$>>M6QWWĉl6SXXx+7@`Νjt:{Q}6i/^ȟ'Lbtvv*]֒@HHͺW^ҥK{4,Yݻw3mڴG8 (//W.**"== &H hZ/_xbzzzh4,[֭[g;*VU*Ǐg„ ,;v,+WdĈTUUKmк5L]0` D%%%Gcc#93gR !č7hjj"''Xz=6m"%%Vˎ;s9s'lZFVSXX޽{[؈/iii>f$þ yLJ+qoqΜ9D>ctdeeqno rJT*DDDYYY,XW^y&39s&k׮Uޏxxx#g4c4=zz/m#~\U*s9,, w~BBBX`k֬!::6l`ԬY>}:^A@_, jWW>FũSKB CJK 8V!(шz'F`` {%u}wwwQhZ1 ٿh"JJJ0x{{3k,V+G-k,rڣ}ӓ@4#`jRZZJJJ ף8p6^!nKp;@DDvK'K.ao߮LGGGb2]\\?>\zJ}]; <6L&pssY>fLBCCVr8[n%33GyDP믿i"w }w}P!&c !NL!‰I B81y%xݛm.7!䎀B$B!B!s@\\IIIY4ٸq<88LQT\x?%MBB9:vMEEvӓzI&I}}}z/^LQQ۶mwbccYhv 瓙IFF<̫L2o{h4\\\0,]TRsD@@>>><3\%22\w6󲳳>s{yyxx0j(N:...}&"=v !>шz,YtL4O>DIsAyfϞӧIIIÃÇ) ˋLL&MDZ<*puuӓ@, tuuyꢻnp>-ш7fjrQYii))))R__NCs\z!/a9vڵ.ͩSرcIMMgwޡNI7Xym5 ˖-_C!= ~@V:ҥK6>yd󩬬ٳfMfGdd$*;v|fݺu9sK.QTTė_~eɒ%޽1qOˣJ>\\\2eƑP/B;EwZ-˗/zG`[x1===ʕMMM ֭t#Fz\yz2jjjhjj"&&)hJKKiooL&kb0!JzGRHQQ]]]?eqb !66^ϦMHIIAղc6_}_~%]]]TWWLYYos[UV3ev B@|FٳgqnΜ9444p C?hZ6No `Z1sIF#:lV><XJuu5'NP  CPZZ @II p>*ϱYf1ydONN~mS!+WDRNDDxxxł xWl 466{hpqql6tRۭ111j^z%eZFs!15Ǝߌ39s&k׮i:T~~~DFFya,B ~BBBX`k֬!::6lpW@ocHrssޫx^O^^M9sPZZJbb"?fb{7$%%ӧtB1 шy ///2331L|w@[ S__wi.\7fy|Oll, ƏZV'I`` fddd'|+w?$$$bZo!G < x1c0eXj 7$''ҥKm>|۷ןSƑ#GnMe (~e.O}2BEB!B!@@!pb :$enw~7H!B!B!@@!pb#))5k֐Fpp07nTɤIh4OaLff&T*.^ȇ~tÒ%Ke:!!tFI]]w廉`剏'!!.\@^^UUU7q,^"mfӓzI&I}}]=jjϷB[!TVV*˕e7tttfƍVUl2Μ9G}D{{;}YQ Evv6{졤d~i~med7GKyy9T}Yy9$… m^vv6lٲNҥKy뭷 zzz8|0/_|IW!v܉ZFӱgeYzz:2ϥKlOOOM6)}Q SRR8<^ww7}ߏFܹs^f!MMM^gӦMjٱcr"5jgϞwjoooRSSٿ?{%<<,:;;힙ꫯ/Qh4f3@Ve$8Gӗ9s'7w j)++8%xzz/Vd@ZBq7ZF9y$FNGAAͭ{Jk]A ު !!.q٬lzpeYf1yd}^O8O?'x+V`Zĉ6)@GG999h4z==TWWߦ !~+WRpww'""t<<TWWZlٲZMPP]GwO{'A!^}%22Ri(Jۭ(B8jTTT`4W>777+ϕ+Wɓ $>>L%MAA&M"%%1cƐI8z {AÙ={6deeÇTM IDAT عs'nnn#=jZxzzh0((dBBBgd24~]p!qqqƂ 8q"Ǐ%p;@DDvKc6yw䗿%455q%ͩSرc|۷L?L3)SU[ӧOߟN/;{ --ѣGcXhjjb֭C~⧦reP|xx.Ob^[DBXB!@@!pb!N̡=.O]H.Bܑ䎀B$B!B!s@\\IIIY4ٸq#j_ d2qYۧ OBB@oyyyTUU)i\]]7oz///ZZZ(,,d6]ɤIh4OaaMz=/m۶,wAQyд8v"6"aЊ`֐r*d V*;Vƪ[[ڙىDd1a!V&HC@P@lfϫJ9>ۧi>~6l0{oo[ӟ4gyBLn%+T .^` %%-[G]]%%%bZٴi;w ϧEn:z{{?: ?>Att4ׯTNwV:vءzؼy;}^!O>VdHݎnҥKlݺUV)q{Q߸q7xXG144:^{ee%6P%lEI2n޼v@@6l˗{t(<;>j*pႲ̝>/ӁD`0ef||\9~:i[z*|}}h4UUUXVΝK{{;̞=j%&&&V"//~D@;oh4$&&RYYȈ˸BL.rrrl6Orr2G2::r,\5kƹseeeet:^{5`bAAA555JL`` .]痲Wo|n}V/ӁD`۶mh4|}}fGVVl߾F_L9oժUG{{\ѰfN< jnnf…+ 00G;;w.QQQ8pe>/ӅD ''0233%&&¾}zV>sL(++S-OMMeŊڵkFkzyokjjHLLDu+W/Nn}^! @gg'\|APPNDzz:}}}|tV+LJ`b`aWWNinnɄlɓvJKK7 EEEtvv2|Νj̛7@?Q,w7SNt:'m^}^!>>ٳgرcSl6RRR{RRz7>WQQAAA&##~ZP/Dw!##g}___:::Tɂ#666z-wPe˖_=vB1hw{A7gQV}TBH!ƒI" Bx0IBV1=&,&4!\B!<$B!D@!`ngʕ撖hdzHFFFFÍ7xTmcٲe|gInX,l6fϞMKK \|YYb!88k׮Q\\LCC}m1 hZ(++SϕAzzjYoo/o~(puuuʺ6oLuu5|LjիfݺuQUUERR/;vP*QWWGII XV6mΝ;iiiq{;TTTp-Yt)?<}}}AxVU!;v !­[\rVdRl6ҥKvTۈBpQ,X@@@j}rr2W^kRPPJ̞={(..z:o3gիWOd…w#ixx7o*N?B+-[Gvv6t:6oywԩS⋄W_}7|ڞlׯҥKUF#̟?(턆l/FU~OjXVkgՌ300/K,X#G ==T>cFGG5kfbƌS lg`jOOoƍnO[].n<:HV]y1c̜9SyB<={H;6)… =zڵkq8;vxZ{bcc믹tG!==իW޽{glܸQ iii̙31:::8|0gΜqGO=zaywTgC!xXhSYzmݽBMα݄h)?(SZB!D@!`!̭CbC^栰Gsvh Ӓ\B!<$B!D@!`ngʕ撖hdLvv69rd Z-mmmMb`٘={6---reUh$##шFƍ{lxǁ|8q @BB``bb=nwYv-/F:e_B[@xx8:d:Ѭ_'[n1>>ҥKyS~(W^n!!!#{9n݊餩s)IBLB Mtt ?G`TBH!ƒI" Bx0IBV!1Jso|MYB1=!ƒI" Bx0IBxV\Inn.iiiF~;q`b*N{N8OӔۭG?QFWW.]D)By'1̜9nN>Mii25rVVݻ9$g6ΦR5&@FFe曪eٳiii˗ͱ%B[@xx8뺺:*_pp0;vu:7oV/x"lBNN25; !!|ZZZXh֭ӧO+b޽s8#.::ߵpkk+PNDuQTTDUUIIIKرC5[BWMM 477ڊdl6sI"$$DlllL <[N0gz=!!! /PUUߟTN'gΜQ_/zj.^Hrr2~~~nB&GDDpY"##9vؔq111066FOOF/[ klMMM %%%d}>| ~ieB/vxWU˺pC"q>>>~cK[[o0D>SzwQ=~z%9Bzz:W{BiG-~m~MY\A7g?&!Ĵ$B&B$B!< ?Ãn"Z !Ĕ䊀B$B!<$B!skxV\Inn.iiiF߯1dggSYYɑ#G&mb`٘={6---rm322HOOW}7|SyYv-/F:i;j0jQVVۛ'|٬L:tiJKK(KHHb L*..Aq !­D <& n sZ-&Iuv (,,m'''sUXv- ͛ʿ?01%K(++[nQTTDgg'˗/W[Μ9Ccc#W^O?epp *1Q[[KWWQ={P\\Lmm-:t///bccwB<,\^0 lٲ8:͛7su}]n h7v}ym6f̘ACCǏ3fhtt)O =l]@բk9B IDATӣTyÇN@@iii+tuu122BSSIIIC||[f mmm;wN^}L!.Ӊh4ry&)Kh=== (nR^_vnJBBR9>c֭8N8w*$''Nlg&RRRHLL?DVVvϖʒ%Kؽ{7###ucBpl۶ F/l6"33۷15k|w>p0geY{{;vBEoo/7ntt* fo>4 k֬ɓ(f.\Hzz$UVB^^mwcB0qFff&`Xطo}?bԄdtrAZ- ,V~~~r…IQQQ?~h4(^^n=D!qX]vML}L!&.uvv˗q8)H*潽066Fkk+_~%/2Wŋ$''GEE^x*t:9s`,Xי9s&tuu7(1ׯV1,ZHtRSSCrr2ʹb20͜>>{Xx뭷tG!==իW޽{UsxyySOwyGuFt:YbAAA Q[[g}\!iii̙31:::8|*8|0<ʄB_|2Ax$z=7nT-p !BHR}"bjRk@!`!L!ƒr?ҹo>&,nBLSrE@!`!L!ƒ5F >>+WKZZFEbb466{nX,EihhP݉ӟ4eyF F#7n{)eddFoo/o;CxLvv6Sx>n_BͭD <IZ[[9pts(f[Ns !tv"'j1L֏r{QqoywbǪUT&l455,4<<|6  (,,dSƸB1L [l&*fgg3>>\~w}GF3|h4TՊԩS⋄W_}*L0o =;wID(,,rk֬sιlؽb0 ZV+8qR.v>L{{;+o59a+H~h*ӅDtp80?Ád|R)MT,Yݻ]ĕ+WT g̘Lh###X,ʏtUUk׮֭[IHH c?4U_Be"m64 DFFb#++Lo߮kmV"%%v*ӁDx._ ((Hy=i#^^)gMXV:߯ܓw'©S|䯼 6Lmm-&ŋs!%^ Á?8NΜ9&V˼y󀉾 Qgw߭ !tp#""8{,;vlʸ^}Uղ.?Hz=7nTTTTPPPv e믿-.\ѣXV֮]رc|wxꩧ S__;s׫3c=Fll,mmm[{} Wb:DGGu~AѸA7gV|A7A!%5 Bx0IB&Bܪ5 &+ {MYt31B1" Bx0IB&B#ʕ+%-- ]ŋimmw<=k,222Xx1~~~88} /PSS*f͓O>lf̙twwsiJKKi݉qg_³fȑ#u0 hZ(++SJHHb LLK\\\LCC?{!ĽS__S֭[>NEEnb||Kק$qqqQRR(VM6sNZZZ_G!ʭ[\rVdRjZ-K,znݺEQQ,_\fߟw}jn޼Iee%1Z-/ǏwR;BCC.*++ioo'44bٗLlذBڦo9s \zO?A.\ٳbjkkСCxyy*BW [l&egg3>>Nc\~]>::(AAAjjjkc|I8c֭8N8wR@L9P6_2882.%%D>CZZZ0Ldee100@UU[1K$''NlgI,Yݻw322Z+LmۆFחHl6~~~deehoog׮]t:eƍK@f֬Y2vb¿tuufNLFFO?2Y_|AII}኏#666z-`WZZsall>̙3g%%%ٸqjcBAzp5ӆ݄Eף9_/?&!Ĵ$B&B$B!<[Edģy/A7gBO$WB&B$B!<[cYr%a4ٿ?YYYSmlldYfŋpPVVӧӟ4徫yF F#7n{&0r'^)!!Bpp0׮]Ubf1{lZZZ(,,Yv-/F:)F!puuu]]]ݻWlxxXyo 1< %fǎt:6oެ aTWWOHH;1Gx8())attʦMعs'---DGGn:"))^z;vp-`~EHHe˖qF?K!Ĵv"'j1L֏rMlE):tgWZ .\Pm|eٝݍW{gڳg7x7Ud^JYY/"{%::D>SZ-K,O>Q袢"X| B =;w{eeeȥKnTTT eVJii)'N "",݊1k͚5q9`t:z{{&(U GFFhjj"))Zzzz'((]b*.Ӊh4ry&I#קh4{ĕ+WgYvR`r~dd$ޭRSSYd wVLi4```@YvG}s=֭[q:455q9%YBe"m64 DFFb#++Lo߮k 00Э͝;(8Z>22R"""܎ϴj*RRRS cppYfw}aή]txyyƍUb:pFff&`Xطo}MԐ^}+Wŋ'vڤtwwWGxTVX]ԄdtrAZ- ,P=rGVBig`xcf8}4 ܺusΩ_d ̚5K37nҥKۛh.]ʕ+Wmy{{_O 088Hll,V'Nv/t?d:G:t~wNjj*1J1cCCCzj% ,ȑ#Jb`f3Z2::OD(]ٳDFFrر)xWU˺@oo/<ɓ'UYl>>>|S… =zڵkq8;vbm&!+B!D@!`!̭1\\0߿VG`b..]DIIR ##t6{{{y7򘄄, Ĕ444(1wVJߝC"qfl*++9rȤF F#7n{)IB<,JéW^թ\x@JJ [l!''G5kk霴"&..:JJJji&vIKK ;vP}Fӱy)'::׻,͛>U cBۉ'|Vd2QTTZۋnns%nʪUTqwPSٳGƍ*_j\p6l@aa!˗/2fD~~nb !.-[#;;q~^Jdd*7o۶mcƌ444pqOCh4_5 TVV*5"//2ԩS⋄W_}7|3e1!t2 ''8f3$''c08z]+uwwpV>|vHKKW^V@T1wZf mmm;wnQQQ ***}GZ-XVJKK9qdee1444cBSNÁh8L&=C5p*Fy]UUϵk׸x"{ˋ @BB``bbm1:;;9q2s7O>$f3gӧ)--UF ==]{{{y7Gl&;;J9ZwV2UAwBLn%+u: ?=..:JJJji&vIKK10QhZiiiaѢE[^%1hmmU)`mѬ_)׏SQQ[gҥ/Dtp80?Ád\UX(ܑʒ%Kؽ{7###SSS7oկx'9~8)))$&&҂d"++ nJBB%%%nAa6yg줩iR;}^!mh4fϏ,233پ};@vj*RRRS;OS\\(k֬ɓf.\Hzz*~sq{t:[Icطo*Ν>/D ''0233%&&¾}TWjjjHLLDu@jj*+V`׮].݉Zooo q~~~r)ĝ4 >>>e?? !?˿seAAA*--%..7;w.9XV:!!!ę{Ġ Z-͆nWinnɄlɓ6^xp8̙3?1۷`b ^'$$1J멫ooof3-R7nBFDDLTgEdDPDLR@Q;M1l5ݬ65d?z&tMlQ]V-jP%8 .V~Q xn;U,|sss&D?pk.L&k׮% >e˖jٰa۲Ν6$''322 qƊ L&k֬Qu/Vk.9keYHII;vV\̙3 DY!&*))~BoOvOS_۪';!x.I!‡I" B0IBU)&;BMdtH!\B!|$B!D@!a^HKKcҥrJbbb8x2?$$… fQ__Occ#j{nsUjjjT֑JIIǶN'o60:[~~>A,:ao[̙υ 8u.k 455W^… jtwwSUUE[[ۘ2_EB58ە׭'7룴ш`,t:ǎS¸z7<00@||7|W_}ףhغu+0z٬6Hjj*jZMcc#N~j;oxx7nl2, v+aFv,BB'6n"rlp%l6zR*ʭDT*i%՜2339|0]]]z eBfٳ/~A~~>'Nx}O?W_孷rq .^/W^СCܻwoB7ضm*%00B ؾ};6 o^S`ww[JbժU>} .I||pk[TT?! &ֆf#""ByCuuuF^uܹs wLdd$qΜ9u. LVVtww1 >}zZFӑjP `t VKTT###y1oESd %5 B0IB&Bü*:$1EM>| 2hUcc#uuuddd ͛7B<8ە׭mfΜdc^TT6mʕ+oݻDEEy  =hG%%%n:?hx7w}̙3N7:o0LS^^NWWϧá$FVjjjp:dggk5{ u"_VCj֯_ω'<ƍ+ƪt:}3^B-SRRBUU/Mnn./Q9fbꋎ@SSDGG+̷~~;RRR$B쌛t:6o @`` 0?fDraوҥKl6z= e`^y:4niӦ?uuueD222ܹscp8^(J?A2339|0]]]z ţ+Xh{axxx"BfD`۶mT*HLL$77@ )((`DFFƍ'}]}G>ܦ'xfˋIRj*N>$Ǔ,_Kood,?ٸ@ii)PVVFrr28p@9>p[߼yӣG~XXc{?MfLZ JߘWUVX%Kؽ{$Bq~hkkf~hxxLxx6X,z.\ȑ#G܃#**mȈ6GV3{l`pVKTTz0L!‡I" B0j O#-Sіd %" B0IB&Bü#ҥK)++cʕpA6*/"_~dddˌ3ꢪ 1L-p8*{#v^JMM 2ddd \]]׽80 ѣGysL>| 20Qcc#uuuRJ\*]y6_VLGGpIIIqIZZZXlw}u-8]yr<⭭t:rrrؼy3J]Hkk+5558Ny#SXRR֭cddd?&tbp8hll|#խ8]ZF{9/XJűcǘ7on󳲲蠾իWSYYjp}n߾p8Z477G˕1X,9r~~~xq),447Ott4X,v;MMMvE!2N͛ hشinb߾}eT­[#553g(늉s`OjuR ٳٶmӦM8qqwݻtttɓ'lJ1޽{Z,^ثe:~ZZZ&<<^1cW\yZ !7룴ш`,t:ǎtRRR/CAIj5A@@ZAJ7mV+ʕ+o~Ν;#>00@||WZEOO/^CSjPz4 [nFTVVb6 !O5n"rlp%l6zRh4 PHHT*ͅ $>>VKTT###1cǏl6Egg'1BӓHLLn nI2Z&%%\zGK/DWWw6~~~hZ߿O{{;v8#%''f3555˖-CղaΝ;Gee~hbg˖-YfBOO;v;~***0LYFPG!ijJJJaΞ>Z}R}P!$B&B$B!|B!|\B!|$B!D@!a!>L!‡I" Bh'QIENDB`coolor-0.9.0/examples/ansi-grey/main.rs000064400000000000000000000015651046102023000161440ustar 00000000000000//! Run this with //! cargo run --example ansi-grey --features=crossterm use { coolor::*, crossterm::style::{Color as CC, Stylize}, }; /// Return the hexa notation commonly used for the web pub fn to_hexa(rgb: Rgb) -> String { format!("#{:02X}{:02X}{:02X}", rgb.r, rgb.g, rgb.b) } fn print_color(c: Color) { let cc: CC = c.into(); print!("{}", "██████".with(cc)); } fn show(rgb: Rgb, ansi: AnsiColor) { print!(" {} ", to_hexa(rgb)); print_color(ansi.into()); print!(" {:>3} {:>3}", ansi.code, rgb.r); println!(); } fn main() { println!("All the ANSI colors with r=g=b"); println!(" hexa ansi r=g=b"); for code in 0..=255 { let ansi = AnsiColor { code }; let rgb = ansi.to_rgb(); if rgb.r == rgb.g && rgb.g == rgb.b { show(rgb, ansi); } } println!(); } coolor-0.9.0/examples/ansi-mix/main.rs000064400000000000000000000037101046102023000157650ustar 00000000000000//! Run this with //! cargo run --example ansi-mix use { coolor::*, crossterm::style::{self, Stylize}, rand::Rng, }; /// number of steps in gradients const N: usize = 20; fn rand_ansi() -> AnsiColor { AnsiColor::new(rand::thread_rng().gen()) } fn print_ansi(ansi: AnsiColor) { print!("{}", "█".with(style::Color::AnsiValue(ansi.code))); } fn bar(n: usize) -> String { "─".repeat(n) } fn main() { const T1: &str = "HSL walk"; const T2: &str = "RGB walk"; const T3: &str = "blend"; let b = bar(N + 2); let b = &b; println!( "\n{:^w$}", "Blending random ANSI colors, all variants still ANSI", w = 3 * N + 18 ); println!(" ┌─────┬─────┬{}┬{}┬{}┐", b, b, b); println!(" │ src │ dst │{:^w$}│{:^w$}│{:^w$}│", T1, T2, T3, w = N + 2); println!(" ├─────┼─────┼{}┼{}┼{}┤", b, b, b); for _ in 0..20 { let c1 = rand_ansi(); let c2 = rand_ansi(); print!(" │ "); for _ in 0..3 { print_ansi(c1); } print!(" │ "); for _ in 0..3 { print_ansi(c2); } print!(" │ "); let hsl1 = c1.to_hsl(); let hsl2 = c2.to_hsl(); let n = N - 1; for i in 0..=n { let hsl = Hsl::mix(hsl1, (n - i) as f32, hsl2, i as f32); print_ansi(hsl.to_ansi()); } print!(" │ "); let rgb1 = c1.to_rgb(); let rgb2 = c2.to_rgb(); for i in 0..=n { let rgb = Rgb::mix(rgb1, (n - i) as f32, rgb2, i as f32); print_ansi(rgb.to_ansi()); } print!(" │ "); for i in 0..=n { let c = Color::blend(c1, (n - i) as f32, c2, i as f32); print_ansi(c.ansi()); } print!(" │ "); println!(); } println!(" └─────┴─────┴{}┴{}┴{}┘\n", b, b, b); } coolor-0.9.0/examples/ansi-variations/main.rs000064400000000000000000000024731046102023000173540ustar 00000000000000//! Run this with //! cargo run --example ansi-variations use { coolor::AnsiColor, crossterm::style::{Color, Stylize}, }; fn print_color(ansi: AnsiColor) { print!("{}", "█".with(Color::AnsiValue(ansi.code))); } fn main() { println!(" Variations on ANSI colors:"); println!(" ┌──────┬────────┬─────────────────┬─────────────┐"); println!(" │ code │ normal │ luminosity │ saturation │"); println!(" ├──────┼────────┼─────────────────┼─────────────┤"); for code in 1..=255 { let ansi = AnsiColor::new(code); print!(" │ {:>3} │ ", code); for _ in 0..6 { print_color(ansi); } print!(" │ "); for i in -7..=7 { print_color(ansi.with_luminosity_change((i as f32) * 0.1)); } print!(" │ "); for i in -10..=0 { print_color(ansi.with_saturation_change((i as f32) * 0.1)); } println!(" │"); } println!(" └──────┴────────┴─────────────────┴─────────────┘"); } coolor-0.9.0/examples/rgb-to-ansi/main.rs000064400000000000000000000016161046102023000163650ustar 00000000000000//! Run this with //! cargo run --features crossterm --example rgb-to-ansi use { coolor::*, crossterm::style::{Color as CC, Stylize}, rand::Rng, }; /// Return the hexa notation commonly used for the web pub fn to_hexa(rgb: Rgb) -> String { format!("#{:02X}{:02X}{:02X}", rgb.r, rgb.g, rgb.b) } fn print_color(c: Color) { let cc: CC = c.into(); print!("{}", "██████".with(cc)); } fn compare(rgb: Rgb) { print!(" {} ", to_hexa(rgb)); print_color(rgb.into()); let ansi = rgb.to_ansi(); print_color(ansi.into()); print!(" {:>3}", ansi.code); println!(); } fn main() { let mut rng = rand::thread_rng(); println!(" Print some random RGB colors and the nearest ANSI color"); println!(" rgb ansi"); for _ in 0..20 { let rgb = Rgb::new(rng.gen(), rng.gen(), rng.gen()); compare(rgb); } println!(); } coolor-0.9.0/features.md000064400000000000000000000004761046102023000132760ustar 00000000000000 Optional features in the Coolor crate: ## crossterm This feature enables From/Into conversions between the coolor Color type and the [Crossterm](https://github.com/crossterm-rs/crossterm) Color type. Example inclusion in Cargo.toml: ```toml [dependencies] coolor = { version="0.5", features=["crossterm"] } ``` coolor-0.9.0/src/ansi.rs000064400000000000000000001130771046102023000132270ustar 00000000000000use crate::*; /// 8-bit Ansi Color Code /// /// See #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct AnsiColor { pub code: u8, } impl AnsiColor { pub const fn new(code: u8) -> Self { Self { code } } pub const fn to_hsl(self) -> Hsl { ANSI_TO_HSL[self.code as usize] } #[inline(always)] pub const fn to_rgb(self) -> Rgb { ANSI_TO_RGB[self.code as usize] } pub fn with_luminosity_change(self, delta_luminosity: f32) -> Self { let mut hsl = self.to_hsl(); hsl.l = (hsl.l + delta_luminosity).min(1.0).max(0.0); hsl.to_ansi() } pub fn with_luminosity(self, l: f32) -> Self { let mut hsl = self.to_hsl(); hsl.l = l; hsl.to_ansi() } pub fn with_saturation_change(self, delta_saturation: f32) -> Self { let mut hsl = self.to_hsl(); hsl.s = (hsl.s + delta_saturation).min(1.0).max(0.0); hsl.to_ansi() } pub fn with_saturation(self, s: f32) -> Self { let mut hsl = self.to_hsl(); hsl.s = s; hsl.to_ansi() } } pub const ANSI_TO_RGB: &[Rgb] = &[ Rgb { r: 0x00, g: 0x00, b: 0x00, }, Rgb { r: 0x80, g: 0x00, b: 0x00, }, Rgb { r: 0x00, g: 0x80, b: 0x00, }, Rgb { r: 0x80, g: 0x80, b: 0x00, }, Rgb { r: 0x00, g: 0x00, b: 0x80, }, Rgb { r: 0x80, g: 0x00, b: 0x80, }, Rgb { r: 0x00, g: 0x80, b: 0x80, }, Rgb { r: 0xC0, g: 0xC0, b: 0xC0, }, Rgb { r: 0x80, g: 0x80, b: 0x80, }, Rgb { r: 0xFF, g: 0x00, b: 0x00, }, Rgb { r: 0x00, g: 0xFF, b: 0x00, }, Rgb { r: 0xFF, g: 0xFF, b: 0x00, }, Rgb { r: 0x00, g: 0x00, b: 0xFF, }, Rgb { r: 0xFF, g: 0x00, b: 0xFF, }, Rgb { r: 0x00, g: 0xFF, b: 0xFF, }, Rgb { r: 0xFF, g: 0xFF, b: 0xFF, }, Rgb { r: 0x00, g: 0x00, b: 0x00, }, Rgb { r: 0x00, g: 0x00, b: 0x5F, }, Rgb { r: 0x00, g: 0x00, b: 0x87, }, Rgb { r: 0x00, g: 0x00, b: 0xAF, }, Rgb { r: 0x00, g: 0x00, b: 0xD7, }, Rgb { r: 0x00, g: 0x00, b: 0xFF, }, Rgb { r: 0x00, g: 0x5F, b: 0x00, }, Rgb { r: 0x00, g: 0x5F, b: 0x5F, }, Rgb { r: 0x00, g: 0x5F, b: 0x87, }, Rgb { r: 0x00, g: 0x5F, b: 0xAF, }, Rgb { r: 0x00, g: 0x5F, b: 0xD7, }, Rgb { r: 0x00, g: 0x5F, b: 0xFF, }, Rgb { r: 0x00, g: 0x87, b: 0x00, }, Rgb { r: 0x00, g: 0x87, b: 0x5F, }, Rgb { r: 0x00, g: 0x87, b: 0x87, }, Rgb { r: 0x00, g: 0x87, b: 0xAF, }, Rgb { r: 0x00, g: 0x87, b: 0xD7, }, Rgb { r: 0x00, g: 0x87, b: 0xFF, }, Rgb { r: 0x00, g: 0xAF, b: 0x00, }, Rgb { r: 0x00, g: 0xAF, b: 0x5F, }, Rgb { r: 0x00, g: 0xAF, b: 0x87, }, Rgb { r: 0x00, g: 0xAF, b: 0xAF, }, Rgb { r: 0x00, g: 0xAF, b: 0xD7, }, Rgb { r: 0x00, g: 0xAF, b: 0xFF, }, Rgb { r: 0x00, g: 0xD7, b: 0x00, }, Rgb { r: 0x00, g: 0xD7, b: 0x5F, }, Rgb { r: 0x00, g: 0xD7, b: 0x87, }, Rgb { r: 0x00, g: 0xD7, b: 0xAF, }, Rgb { r: 0x00, g: 0xD7, b: 0xD7, }, Rgb { r: 0x00, g: 0xD7, b: 0xFF, }, Rgb { r: 0x00, g: 0xFF, b: 0x00, }, Rgb { r: 0x00, g: 0xFF, b: 0x5F, }, Rgb { r: 0x00, g: 0xFF, b: 0x87, }, Rgb { r: 0x00, g: 0xFF, b: 0xAF, }, Rgb { r: 0x00, g: 0xFF, b: 0xD7, }, Rgb { r: 0x00, g: 0xFF, b: 0xFF, }, Rgb { r: 0x5F, g: 0x00, b: 0x00, }, Rgb { r: 0x5F, g: 0x00, b: 0x5F, }, Rgb { r: 0x5F, g: 0x00, b: 0x87, }, Rgb { r: 0x5F, g: 0x00, b: 0xAF, }, Rgb { r: 0x5F, g: 0x00, b: 0xD7, }, Rgb { r: 0x5F, g: 0x00, b: 0xFF, }, Rgb { r: 0x5F, g: 0x5F, b: 0x00, }, Rgb { r: 0x5F, g: 0x5F, b: 0x5F, }, Rgb { r: 0x5F, g: 0x5F, b: 0x87, }, Rgb { r: 0x5F, g: 0x5F, b: 0xAF, }, Rgb { r: 0x5F, g: 0x5F, b: 0xD7, }, Rgb { r: 0x5F, g: 0x5F, b: 0xFF, }, Rgb { r: 0x5F, g: 0x87, b: 0x00, }, Rgb { r: 0x5F, g: 0x87, b: 0x5F, }, Rgb { r: 0x5F, g: 0x87, b: 0x87, }, Rgb { r: 0x5F, g: 0x87, b: 0xAF, }, Rgb { r: 0x5F, g: 0x87, b: 0xD7, }, Rgb { r: 0x5F, g: 0x87, b: 0xFF, }, Rgb { r: 0x5F, g: 0xAF, b: 0x00, }, Rgb { r: 0x5F, g: 0xAF, b: 0x5F, }, Rgb { r: 0x5F, g: 0xAF, b: 0x87, }, Rgb { r: 0x5F, g: 0xAF, b: 0xAF, }, Rgb { r: 0x5F, g: 0xAF, b: 0xD7, }, Rgb { r: 0x5F, g: 0xAF, b: 0xFF, }, Rgb { r: 0x5F, g: 0xD7, b: 0x00, }, Rgb { r: 0x5F, g: 0xD7, b: 0x5F, }, Rgb { r: 0x5F, g: 0xD7, b: 0x87, }, Rgb { r: 0x5F, g: 0xD7, b: 0xAF, }, Rgb { r: 0x5F, g: 0xD7, b: 0xD7, }, Rgb { r: 0x5F, g: 0xD7, b: 0xFF, }, Rgb { r: 0x5F, g: 0xFF, b: 0x00, }, Rgb { r: 0x5F, g: 0xFF, b: 0x5F, }, Rgb { r: 0x5F, g: 0xFF, b: 0x87, }, Rgb { r: 0x5F, g: 0xFF, b: 0xAF, }, Rgb { r: 0x5F, g: 0xFF, b: 0xD7, }, Rgb { r: 0x5F, g: 0xFF, b: 0xFF, }, Rgb { r: 0x87, g: 0x00, b: 0x00, }, Rgb { r: 0x87, g: 0x00, b: 0x5F, }, Rgb { r: 0x87, g: 0x00, b: 0x87, }, Rgb { r: 0x87, g: 0x00, b: 0xAF, }, Rgb { r: 0x87, g: 0x00, b: 0xD7, }, Rgb { r: 0x87, g: 0x00, b: 0xFF, }, Rgb { r: 0x87, g: 0x5F, b: 0x00, }, Rgb { r: 0x87, g: 0x5F, b: 0x5F, }, Rgb { r: 0x87, g: 0x5F, b: 0x87, }, Rgb { r: 0x87, g: 0x5F, b: 0xAF, }, Rgb { r: 0x87, g: 0x5F, b: 0xD7, }, Rgb { r: 0x87, g: 0x5F, b: 0xFF, }, Rgb { r: 0x87, g: 0x87, b: 0x00, }, Rgb { r: 0x87, g: 0x87, b: 0x5F, }, Rgb { r: 0x87, g: 0x87, b: 0x87, }, Rgb { r: 0x87, g: 0x87, b: 0xAF, }, Rgb { r: 0x87, g: 0x87, b: 0xD7, }, Rgb { r: 0x87, g: 0x87, b: 0xFF, }, Rgb { r: 0x87, g: 0xAF, b: 0x00, }, Rgb { r: 0x87, g: 0xAF, b: 0x5F, }, Rgb { r: 0x87, g: 0xAF, b: 0x87, }, Rgb { r: 0x87, g: 0xAF, b: 0xAF, }, Rgb { r: 0x87, g: 0xAF, b: 0xD7, }, Rgb { r: 0x87, g: 0xAF, b: 0xFF, }, Rgb { r: 0x87, g: 0xD7, b: 0x00, }, Rgb { r: 0x87, g: 0xD7, b: 0x5F, }, Rgb { r: 0x87, g: 0xD7, b: 0x87, }, Rgb { r: 0x87, g: 0xD7, b: 0xAF, }, Rgb { r: 0x87, g: 0xD7, b: 0xD7, }, Rgb { r: 0x87, g: 0xD7, b: 0xFF, }, Rgb { r: 0x87, g: 0xFF, b: 0x00, }, Rgb { r: 0x87, g: 0xFF, b: 0x5F, }, Rgb { r: 0x87, g: 0xFF, b: 0x87, }, Rgb { r: 0x87, g: 0xFF, b: 0xAF, }, Rgb { r: 0x87, g: 0xFF, b: 0xD7, }, Rgb { r: 0x87, g: 0xFF, b: 0xFF, }, Rgb { r: 0xAF, g: 0x00, b: 0x00, }, Rgb { r: 0xAF, g: 0x00, b: 0x5F, }, Rgb { r: 0xAF, g: 0x00, b: 0x87, }, Rgb { r: 0xAF, g: 0x00, b: 0xAF, }, Rgb { r: 0xAF, g: 0x00, b: 0xD7, }, Rgb { r: 0xAF, g: 0x00, b: 0xFF, }, Rgb { r: 0xAF, g: 0x5F, b: 0x00, }, Rgb { r: 0xAF, g: 0x5F, b: 0x5F, }, Rgb { r: 0xAF, g: 0x5F, b: 0x87, }, Rgb { r: 0xAF, g: 0x5F, b: 0xAF, }, Rgb { r: 0xAF, g: 0x5F, b: 0xD7, }, Rgb { r: 0xAF, g: 0x5F, b: 0xFF, }, Rgb { r: 0xAF, g: 0x87, b: 0x00, }, Rgb { r: 0xAF, g: 0x87, b: 0x5F, }, Rgb { r: 0xAF, g: 0x87, b: 0x87, }, Rgb { r: 0xAF, g: 0x87, b: 0xAF, }, Rgb { r: 0xAF, g: 0x87, b: 0xD7, }, Rgb { r: 0xAF, g: 0x87, b: 0xFF, }, Rgb { r: 0xAF, g: 0xAF, b: 0x00, }, Rgb { r: 0xAF, g: 0xAF, b: 0x5F, }, Rgb { r: 0xAF, g: 0xAF, b: 0x87, }, Rgb { r: 0xAF, g: 0xAF, b: 0xAF, }, Rgb { r: 0xAF, g: 0xAF, b: 0xD7, }, Rgb { r: 0xAF, g: 0xAF, b: 0xFF, }, Rgb { r: 0xAF, g: 0xD7, b: 0x00, }, Rgb { r: 0xAF, g: 0xD7, b: 0x5F, }, Rgb { r: 0xAF, g: 0xD7, b: 0x87, }, Rgb { r: 0xAF, g: 0xD7, b: 0xAF, }, Rgb { r: 0xAF, g: 0xD7, b: 0xD7, }, Rgb { r: 0xAF, g: 0xD7, b: 0xFF, }, Rgb { r: 0xAF, g: 0xFF, b: 0x00, }, Rgb { r: 0xAF, g: 0xFF, b: 0x5F, }, Rgb { r: 0xAF, g: 0xFF, b: 0x87, }, Rgb { r: 0xAF, g: 0xFF, b: 0xAF, }, Rgb { r: 0xAF, g: 0xFF, b: 0xD7, }, Rgb { r: 0xAF, g: 0xFF, b: 0xFF, }, Rgb { r: 0xD7, g: 0x00, b: 0x00, }, Rgb { r: 0xD7, g: 0x00, b: 0x5F, }, Rgb { r: 0xD7, g: 0x00, b: 0x87, }, Rgb { r: 0xD7, g: 0x00, b: 0xAF, }, Rgb { r: 0xD7, g: 0x00, b: 0xD7, }, Rgb { r: 0xD7, g: 0x00, b: 0xFF, }, Rgb { r: 0xD7, g: 0x5F, b: 0x00, }, Rgb { r: 0xD7, g: 0x5F, b: 0x5F, }, Rgb { r: 0xD7, g: 0x5F, b: 0x87, }, Rgb { r: 0xD7, g: 0x5F, b: 0xAF, }, Rgb { r: 0xD7, g: 0x5F, b: 0xD7, }, Rgb { r: 0xD7, g: 0x5F, b: 0xFF, }, Rgb { r: 0xD7, g: 0x87, b: 0x00, }, Rgb { r: 0xD7, g: 0x87, b: 0x5F, }, Rgb { r: 0xD7, g: 0x87, b: 0x87, }, Rgb { r: 0xD7, g: 0x87, b: 0xAF, }, Rgb { r: 0xD7, g: 0x87, b: 0xD7, }, Rgb { r: 0xD7, g: 0x87, b: 0xFF, }, Rgb { r: 0xD7, g: 0xAF, b: 0x00, }, Rgb { r: 0xD7, g: 0xAF, b: 0x5F, }, Rgb { r: 0xD7, g: 0xAF, b: 0x87, }, Rgb { r: 0xD7, g: 0xAF, b: 0xAF, }, Rgb { r: 0xD7, g: 0xAF, b: 0xD7, }, Rgb { r: 0xD7, g: 0xAF, b: 0xFF, }, Rgb { r: 0xD7, g: 0xD7, b: 0x00, }, Rgb { r: 0xD7, g: 0xD7, b: 0x5F, }, Rgb { r: 0xD7, g: 0xD7, b: 0x87, }, Rgb { r: 0xD7, g: 0xD7, b: 0xAF, }, Rgb { r: 0xD7, g: 0xD7, b: 0xD7, }, Rgb { r: 0xD7, g: 0xD7, b: 0xFF, }, Rgb { r: 0xD7, g: 0xFF, b: 0x00, }, Rgb { r: 0xD7, g: 0xFF, b: 0x5F, }, Rgb { r: 0xD7, g: 0xFF, b: 0x87, }, Rgb { r: 0xD7, g: 0xFF, b: 0xAF, }, Rgb { r: 0xD7, g: 0xFF, b: 0xD7, }, Rgb { r: 0xD7, g: 0xFF, b: 0xFF, }, Rgb { r: 0xFF, g: 0x00, b: 0x00, }, Rgb { r: 0xFF, g: 0x00, b: 0x5F, }, Rgb { r: 0xFF, g: 0x00, b: 0x87, }, Rgb { r: 0xFF, g: 0x00, b: 0xAF, }, Rgb { r: 0xFF, g: 0x00, b: 0xD7, }, Rgb { r: 0xFF, g: 0x00, b: 0xFF, }, Rgb { r: 0xFF, g: 0x5F, b: 0x00, }, Rgb { r: 0xFF, g: 0x5F, b: 0x5F, }, Rgb { r: 0xFF, g: 0x5F, b: 0x87, }, Rgb { r: 0xFF, g: 0x5F, b: 0xAF, }, Rgb { r: 0xFF, g: 0x5F, b: 0xD7, }, Rgb { r: 0xFF, g: 0x5F, b: 0xFF, }, Rgb { r: 0xFF, g: 0x87, b: 0x00, }, Rgb { r: 0xFF, g: 0x87, b: 0x5F, }, Rgb { r: 0xFF, g: 0x87, b: 0x87, }, Rgb { r: 0xFF, g: 0x87, b: 0xAF, }, Rgb { r: 0xFF, g: 0x87, b: 0xD7, }, Rgb { r: 0xFF, g: 0x87, b: 0xFF, }, Rgb { r: 0xFF, g: 0xAF, b: 0x00, }, Rgb { r: 0xFF, g: 0xAF, b: 0x5F, }, Rgb { r: 0xFF, g: 0xAF, b: 0x87, }, Rgb { r: 0xFF, g: 0xAF, b: 0xAF, }, Rgb { r: 0xFF, g: 0xAF, b: 0xD7, }, Rgb { r: 0xFF, g: 0xAF, b: 0xFF, }, Rgb { r: 0xFF, g: 0xD7, b: 0x00, }, Rgb { r: 0xFF, g: 0xD7, b: 0x5F, }, Rgb { r: 0xFF, g: 0xD7, b: 0x87, }, Rgb { r: 0xFF, g: 0xD7, b: 0xAF, }, Rgb { r: 0xFF, g: 0xD7, b: 0xD7, }, Rgb { r: 0xFF, g: 0xD7, b: 0xFF, }, Rgb { r: 0xFF, g: 0xFF, b: 0x00, }, Rgb { r: 0xFF, g: 0xFF, b: 0x5F, }, Rgb { r: 0xFF, g: 0xFF, b: 0x87, }, Rgb { r: 0xFF, g: 0xFF, b: 0xAF, }, Rgb { r: 0xFF, g: 0xFF, b: 0xD7, }, Rgb { r: 0xFF, g: 0xFF, b: 0xFF, }, Rgb { r: 0x08, g: 0x08, b: 0x08, }, Rgb { r: 0x12, g: 0x12, b: 0x12, }, Rgb { r: 0x1C, g: 0x1C, b: 0x1C, }, Rgb { r: 0x26, g: 0x26, b: 0x26, }, Rgb { r: 0x30, g: 0x30, b: 0x30, }, Rgb { r: 0x3A, g: 0x3A, b: 0x3A, }, Rgb { r: 0x44, g: 0x44, b: 0x44, }, Rgb { r: 0x4E, g: 0x4E, b: 0x4E, }, Rgb { r: 0x58, g: 0x58, b: 0x58, }, Rgb { r: 0x60, g: 0x60, b: 0x60, }, Rgb { r: 0x66, g: 0x66, b: 0x66, }, Rgb { r: 0x76, g: 0x76, b: 0x76, }, Rgb { r: 0x80, g: 0x80, b: 0x80, }, Rgb { r: 0x8A, g: 0x8A, b: 0x8A, }, Rgb { r: 0x94, g: 0x94, b: 0x94, }, Rgb { r: 0x9E, g: 0x9E, b: 0x9E, }, Rgb { r: 0xA8, g: 0xA8, b: 0xA8, }, Rgb { r: 0xB2, g: 0xB2, b: 0xB2, }, Rgb { r: 0xBC, g: 0xBC, b: 0xBC, }, Rgb { r: 0xC6, g: 0xC6, b: 0xC6, }, Rgb { r: 0xD0, g: 0xD0, b: 0xD0, }, Rgb { r: 0xDA, g: 0xDA, b: 0xDA, }, Rgb { r: 0xE4, g: 0xE4, b: 0xE4, }, Rgb { r: 0xEE, g: 0xEE, b: 0xEE, }, ]; pub const ANSI_TO_HSL: &[Hsl] = &[ Hsl { h: 0.0, s: 0.0, l: 0.0, }, Hsl { h: 0.0, s: 1.0, l: 0.25, }, Hsl { h: 120.0, s: 1.0, l: 0.25, }, Hsl { h: 60.0, s: 1.0, l: 0.25, }, Hsl { h: 240.0, s: 1.0, l: 0.25, }, Hsl { h: 300.0, s: 1.0, l: 0.25, }, Hsl { h: 180.0, s: 1.0, l: 0.25, }, Hsl { h: 0.0, s: 0.0, l: 0.75, }, Hsl { h: 0.0, s: 0.0, l: 0.5, }, Hsl { h: 0.0, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.49804688, }, Hsl { h: 60.0, s: 1.0, l: 0.49804688, }, Hsl { h: 240.0, s: 1.0, l: 0.49804688, }, Hsl { h: 300.0, s: 1.0, l: 0.49804688, }, Hsl { h: 180.0, s: 1.0, l: 0.49804688, }, Hsl { h: 0.0, s: 0.0, l: 0.99609375, }, Hsl { h: 0.0, s: 0.0, l: 0.0, }, Hsl { h: 240.0, s: 1.0, l: 0.18554688, }, Hsl { h: 240.0, s: 1.0, l: 0.26367188, }, Hsl { h: 240.0, s: 1.0, l: 0.34179688, }, Hsl { h: 240.0, s: 1.0, l: 0.41992188, }, Hsl { h: 240.0, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.18554688, }, Hsl { h: 180.0, s: 1.0, l: 0.18554688, }, Hsl { h: 197.77777, s: 1.0, l: 0.26367188, }, Hsl { h: 207.42859, s: 1.0, l: 0.34179688, }, Hsl { h: 213.4884, s: 1.0, l: 0.41992188, }, Hsl { h: 217.6471, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.26367188, }, Hsl { h: 162.22223, s: 1.0, l: 0.26367188, }, Hsl { h: 180.0, s: 1.0, l: 0.26367188, }, Hsl { h: 193.7143, s: 1.0, l: 0.34179688, }, Hsl { h: 202.32556, s: 1.0, l: 0.41992188, }, Hsl { h: 208.23529, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.34179688, }, Hsl { h: 152.57141, s: 1.0, l: 0.34179688, }, Hsl { h: 166.2857, s: 1.0, l: 0.34179688, }, Hsl { h: 180.0, s: 1.0, l: 0.34179688, }, Hsl { h: 191.16278, s: 1.0, l: 0.41992188, }, Hsl { h: 198.82355, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.41992188, }, Hsl { h: 146.51163, s: 1.0, l: 0.41992188, }, Hsl { h: 157.67444, s: 1.0, l: 0.41992188, }, Hsl { h: 168.83722, s: 1.0, l: 0.41992188, }, Hsl { h: 180.0, s: 1.0, l: 0.41992188, }, Hsl { h: 189.41174, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 1.0, l: 0.49804688, }, Hsl { h: 142.35294, s: 1.0, l: 0.49804688, }, Hsl { h: 151.76471, s: 1.0, l: 0.49804688, }, Hsl { h: 161.17645, s: 1.0, l: 0.49804688, }, Hsl { h: 170.58826, s: 1.0, l: 0.49804688, }, Hsl { h: 180.0, s: 1.0, l: 0.49804688, }, Hsl { h: 0.0, s: 1.0, l: 0.18554688, }, Hsl { h: 300.0, s: 1.0, l: 0.18554688, }, Hsl { h: 282.22223, s: 1.0, l: 0.26367188, }, Hsl { h: 272.5714, s: 1.0, l: 0.34179688, }, Hsl { h: 266.5116, s: 1.0, l: 0.41992188, }, Hsl { h: 262.3529, s: 1.0, l: 0.49804688, }, Hsl { h: 60.0, s: 1.0, l: 0.18554688, }, Hsl { h: 0.0, s: 0.0, l: 0.37109375, }, Hsl { h: 240.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 240.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 240.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 240.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 77.77777, s: 1.0, l: 0.26367188, }, Hsl { h: 120.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 180.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 210.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 220.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 225.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 87.42859, s: 1.0, l: 0.34179688, }, Hsl { h: 120.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 150.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 180.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 200.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 210.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 93.48837, s: 1.0, l: 0.41992188, }, Hsl { h: 120.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 140.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 160.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 180.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 195.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 97.647064, s: 1.0, l: 0.49804688, }, Hsl { h: 120.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 135.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 150.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 165.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 180.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 0.0, s: 1.0, l: 0.26367188, }, Hsl { h: 317.77777, s: 1.0, l: 0.26367188, }, Hsl { h: 300.0, s: 1.0, l: 0.26367188, }, Hsl { h: 286.2857, s: 1.0, l: 0.34179688, }, Hsl { h: 277.67444, s: 1.0, l: 0.41992188, }, Hsl { h: 271.7647, s: 1.0, l: 0.49804688, }, Hsl { h: 42.22223, s: 1.0, l: 0.26367188, }, Hsl { h: 0.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 300.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 270.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 260.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 255.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 60.0, s: 1.0, l: 0.26367188, }, Hsl { h: 60.0, s: 0.17391305, l: 0.44921875, }, Hsl { h: 0.0, s: 0.0, l: 0.52734375, }, Hsl { h: 240.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 240.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 240.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 73.714294, s: 1.0, l: 0.34179688, }, Hsl { h: 90.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 120.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 180.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 210.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 220.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 82.32556, s: 1.0, l: 0.41992188, }, Hsl { h: 100.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 120.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 150.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 180.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 200.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 88.23529, s: 1.0, l: 0.49804688, }, Hsl { h: 105.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 120.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 140.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 160.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 180.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 0.0, s: 1.0, l: 0.34179688, }, Hsl { h: 327.42856, s: 1.0, l: 0.34179688, }, Hsl { h: 313.7143, s: 1.0, l: 0.34179688, }, Hsl { h: 300.0, s: 1.0, l: 0.34179688, }, Hsl { h: 288.83722, s: 1.0, l: 0.41992188, }, Hsl { h: 281.1765, s: 1.0, l: 0.49804688, }, Hsl { h: 32.57144, s: 1.0, l: 0.34179688, }, Hsl { h: 0.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 330.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 300.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 280.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 270.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 46.285706, s: 1.0, l: 0.34179688, }, Hsl { h: 30.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 0.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 300.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 270.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 260.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 60.0, s: 1.0, l: 0.34179688, }, Hsl { h: 60.0, s: 0.3305785, l: 0.52734375, }, Hsl { h: 60.0, s: 0.1980198, l: 0.60546875, }, Hsl { h: 0.0, s: 0.0, l: 0.68359375, }, Hsl { h: 240.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 240.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 71.16278, s: 1.0, l: 0.41992188, }, Hsl { h: 80.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 90.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 120.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 180.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 210.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 78.82355, s: 1.0, l: 0.49804688, }, Hsl { h: 90.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 100.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 120.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 150.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 180.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 0.0, s: 1.0, l: 0.41992188, }, Hsl { h: 333.48837, s: 1.0, l: 0.41992188, }, Hsl { h: 322.3256, s: 1.0, l: 0.41992188, }, Hsl { h: 311.16278, s: 1.0, l: 0.41992188, }, Hsl { h: 300.0, s: 1.0, l: 0.41992188, }, Hsl { h: 290.58826, s: 1.0, l: 0.49804688, }, Hsl { h: 26.511627, s: 1.0, l: 0.41992188, }, Hsl { h: 0.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 340.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 320.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 300.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 285.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 37.674408, s: 1.0, l: 0.41992188, }, Hsl { h: 20.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 0.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 330.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 300.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 280.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 48.83722, s: 1.0, l: 0.41992188, }, Hsl { h: 40.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 30.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 0.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 300.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 270.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 60.0, s: 1.0, l: 0.41992188, }, Hsl { h: 60.0, s: 0.5940594, l: 0.60546875, }, Hsl { h: 60.0, s: 0.49382716, l: 0.68359375, }, Hsl { h: 60.0, s: 0.32786885, l: 0.76171875, }, Hsl { h: 0.0, s: 0.0, l: 0.83984375, }, Hsl { h: 240.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 69.41177, s: 1.0, l: 0.49804688, }, Hsl { h: 75.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 80.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 90.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 120.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 180.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 0.0, s: 1.0, l: 0.49804688, }, Hsl { h: 337.64706, s: 1.0, l: 0.49804688, }, Hsl { h: 328.2353, s: 1.0, l: 0.49804688, }, Hsl { h: 318.82352, s: 1.0, l: 0.49804688, }, Hsl { h: 309.41177, s: 1.0, l: 0.49804688, }, Hsl { h: 300.0, s: 1.0, l: 0.49804688, }, Hsl { h: 22.352936, s: 1.0, l: 0.49804688, }, Hsl { h: 0.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 345.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 330.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 315.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 300.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 31.76471, s: 1.0, l: 0.49804688, }, Hsl { h: 15.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 0.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 340.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 320.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 300.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 41.176483, s: 1.0, l: 0.49804688, }, Hsl { h: 30.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 20.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 0.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 330.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 300.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 50.588226, s: 1.0, l: 0.49804688, }, Hsl { h: 45.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 40.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 30.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 0.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 300.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 60.0, s: 1.0, l: 0.49804688, }, Hsl { h: 60.0, s: 0.9876543, l: 0.68359375, }, Hsl { h: 60.0, s: 0.9836066, l: 0.76171875, }, Hsl { h: 60.0, s: 0.9756098, l: 0.83984375, }, Hsl { h: 60.0, s: 0.95238096, l: 0.91796875, }, Hsl { h: 0.0, s: 0.0, l: 0.99609375, }, Hsl { h: 0.0, s: 0.0, l: 0.03125, }, Hsl { h: 0.0, s: 0.0, l: 0.0703125, }, Hsl { h: 0.0, s: 0.0, l: 0.109375, }, Hsl { h: 0.0, s: 0.0, l: 0.1484375, }, Hsl { h: 0.0, s: 0.0, l: 0.1875, }, Hsl { h: 0.0, s: 0.0, l: 0.2265625, }, Hsl { h: 0.0, s: 0.0, l: 0.265625, }, Hsl { h: 0.0, s: 0.0, l: 0.3046875, }, Hsl { h: 0.0, s: 0.0, l: 0.34375, }, Hsl { h: 0.0, s: 0.0, l: 0.375, }, Hsl { h: 0.0, s: 0.0, l: 0.3984375, }, Hsl { h: 0.0, s: 0.0, l: 0.4609375, }, Hsl { h: 0.0, s: 0.0, l: 0.5, }, Hsl { h: 0.0, s: 0.0, l: 0.5390625, }, Hsl { h: 0.0, s: 0.0, l: 0.578125, }, Hsl { h: 0.0, s: 0.0, l: 0.6171875, }, Hsl { h: 0.0, s: 0.0, l: 0.65625, }, Hsl { h: 0.0, s: 0.0, l: 0.6953125, }, Hsl { h: 0.0, s: 0.0, l: 0.734375, }, Hsl { h: 0.0, s: 0.0, l: 0.7734375, }, Hsl { h: 0.0, s: 0.0, l: 0.8125, }, Hsl { h: 0.0, s: 0.0, l: 0.8515625, }, Hsl { h: 0.0, s: 0.0, l: 0.890625, }, Hsl { h: 0.0, s: 0.0, l: 0.9296875, }, ]; #[test] fn check_array_lengths() { // just check I properly generated the tables ^^ assert_eq!(ANSI_TO_RGB.len(), 256); assert_eq!(ANSI_TO_HSL.len(), 256); } coolor-0.9.0/src/color.rs000064400000000000000000000115161046102023000134060ustar 00000000000000use crate::*; #[cfg(feature = "crossterm")] use crossterm::style::Color as CC; /// Color type, may be Ansi, Hsl or Rgb #[derive(Clone, Copy, Debug)] pub enum Color { Ansi(AnsiColor), Hsl(Hsl), Rgb(Rgb), } impl Color { pub fn ansi(self) -> AnsiColor { match self { Self::Ansi(ansi) => ansi, Self::Hsl(hsl) => hsl.to_ansi(), Self::Rgb(rgb) => rgb.to_ansi(), } } pub fn hsl(self) -> Hsl { match self { Self::Ansi(ansi) => ansi.to_hsl(), Self::Hsl(hsl) => hsl, Self::Rgb(rgb) => rgb.to_hsl(), } } pub fn rgb(self) -> Rgb { match self { Self::Ansi(ansi) => ansi.to_rgb(), Self::Hsl(hsl) => hsl.to_rgb(), Self::Rgb(rgb) => rgb, } } pub fn luma(self) -> f32 { self.rgb().luma() } /// compute a natural feeling intermediate between two colors pub fn blend, C2: Into>(c1: C1, w1: f32, c2: C2, w2: f32) -> Self { let c1: Color = c1.into(); let c2: Color = c2.into(); debug_assert!(w1 + w2 > 0.0); let hsl1: Hsl = c1.hsl(); let hsl2: Hsl = c2.hsl(); let mixed_hsl = Hsl::mix(hsl1, w1, hsl2, w2); let rgb1: Rgb = hsl1.to_rgb(); let rgb2: Rgb = hsl2.to_rgb(); let mixed_rgb = Rgb::mix(rgb1, w1, rgb2, w2); let mixed_rgb_hsl = mixed_rgb.to_hsl(); let mixed = Hsl::mix(mixed_hsl, 0.5, mixed_rgb_hsl, 0.5); Hsl { h: mixed_rgb_hsl.h, // hue blending done only on rgb space s: mixed.s, // saturation is mix between RGB computation and HSL one l: mixed.l, // luminosity is mix between RGB computation and HSL one } .into() } } impl From for Color { fn from(ansi: AnsiColor) -> Self { Self::Ansi(ansi) } } impl From for Color { fn from(rgb: Rgb) -> Self { Self::Rgb(rgb) } } impl From for Color { fn from(rgb: Hsl) -> Self { Self::Hsl(rgb) } } impl From for Color { fn from(code: u8) -> Self { Self::Ansi(AnsiColor::new(code)) } } #[cfg(feature = "crossterm")] impl From for Color { fn from(cc: CC) -> Self { match cc { CC::Reset => 0.into(), CC::Black => 0.into(), CC::DarkGrey => 8.into(), CC::Red => 9.into(), CC::DarkRed => 1.into(), CC::Green => 10.into(), CC::DarkGreen => 2.into(), CC::Yellow => 11.into(), CC::DarkYellow => 3.into(), CC::Blue => 12.into(), CC::DarkBlue => 4.into(), CC::Magenta => 13.into(), CC::DarkMagenta => 5.into(), CC::Cyan => 14.into(), CC::DarkCyan => 6.into(), CC::White => 15.into(), CC::Grey => 7.into(), CC::Rgb { r, g, b } => Color::Rgb(Rgb { r, g, b }), CC::AnsiValue(code) => code.into(), } } } #[cfg(feature = "crossterm")] impl Into for Color { fn into(self) -> CC { match self { Self::Ansi(AnsiColor { code }) => CC::AnsiValue(code), Self::Rgb(Rgb { r, g, b }) => CC::Rgb { r, g, b }, Self::Hsl(hsl) => { let Rgb { r, g, b } = hsl.to_rgb(); CC::Rgb { r, g, b } } } } } /// check going from ansi to rgb and back makes us fall on the first color #[test] fn test_ansi_to_rgb_to_ansi() { // we don't check the range 0..16 as it's made of colors // which are also in the 16..255 range for code in 16..=255 { let c1 = AnsiColor { code }; let c2 = c1.to_rgb(); let c3 = c2.to_ansi(); assert_eq!(c1, c3); } } /// check going from ansi to hsl and back makes us fall on the first color #[test] fn test_ansi_to_hsl_to_ansi() { // we don't check the range 0..16 as it's made of colors // which are also in the 16..255 range for code in 16..=255 { let c1 = AnsiColor { code }; let c2 = c1.to_hsl(); let c3 = c2.to_ansi(); assert_eq!(c1, c3); } } #[test] fn test_rgb_to_hsl() { assert!(Rgb::new(255, 0, 0).to_hsl().near(Hsl::new(0.0, 1.0, 0.5))); // red assert!(Rgb::new(255, 255, 0) .to_hsl() .near(Hsl::new(60.0, 1.0, 0.5))); // yellow assert!(Rgb::new(255, 255, 255) .to_hsl() .near(Hsl::new(0.0, 0.0, 1.0))); // white } /// check going from hsl to rgb and back makes us fall on the first color (or not too far) #[test] fn test_hsl_to_rgb_to_hsl() { let red = Hsl::new(0.0, 1.0, 0.5); let yellow = Hsl::new(60.0, 1.0, 0.5); let white = Hsl::new(0.0, 0.0, 1.0); assert!(red.to_rgb().to_hsl().near(red)); assert!(yellow.to_rgb().to_hsl().near(yellow)); assert!(white.to_rgb().to_hsl().near(white)); } coolor-0.9.0/src/error.rs000064400000000000000000000001161046102023000134130ustar 00000000000000/// coolor error type pub enum CoolorError { InvalidHsl(f32, f32, f32), } coolor-0.9.0/src/hsl.rs000064400000000000000000000103261046102023000130540ustar 00000000000000use crate::*; /// HSL color #[derive(Clone, Copy, Debug, PartialEq)] pub struct Hsl { /// hue in `[0,360[` pub h: f32, /// saturation in `[0,1]` pub s: f32, /// luminosity in `[0,1]` pub l: f32, } impl Hsl { /// Create a new HSL color from its components pub fn new(h: f32, s: f32, l: f32) -> Self { debug_assert!(h >= 0.0 && h < 360.0); debug_assert!(s >= 0.0 && s <= 1.0); debug_assert!(l >= 0.0 && l <= 1.0); Self { h, s, l } } /// Create a new HSL color from its components, checking the ranges pub fn checked(h: f32, s: f32, l: f32) -> Result { if !(h >= 0.0 && h < 360.0 && s >= 0.0 && s <= 1.0 && l >= 0.0 && l <= 1.0) { Ok(Self { h, s, l }) } else { Err(CoolorError::InvalidHsl(h, s, l)) } } pub fn mix(c1: Self, w1: f32, c2: Self, w2: f32) -> Self { debug_assert!(w1 + w2 > 0.0); let h = if dist(c1.h, c2.h) > 180.0 { // the shortest path involve crossing Tau let (h1, h2) = if c1.h < c2.h { (c1.h + 360.0, c2.h) } else { (c1.h, c2.h + 360.0) }; ((w1 * h1 + w2 * h2) / (w1 + w2)) % 360.0 } else { // direct way (w1 * c1.h + w2 * c2.h) / (w1 + w2) }; //let h = (w1*c1.h + w2*c2.h) / (w1+w2); let s = (w1 * c1.s + w2 * c2.s) / (w1 + w2); let l = (w1 * c1.l + w2 * c2.l) / (w1 + w2); Self { h, s, l } } /// Return the nearest ANSI color /// /// This is a slow function as it literally tries all /// ANSI colors and picks the nearest one. pub fn to_ansi(self) -> AnsiColor { let mut best = AnsiColor { code: 16 }; let mut smallest_distance: f32 = self.distance_to(best); for code in 17..=255 { let color = AnsiColor { code }; let distance = self.distance_to(color); if distance < smallest_distance { best = color; smallest_distance = distance; } } best } pub fn to_rgb(self) -> Rgb { let h = self.h / 360.0; let s = self.s; let l = self.l; let rgb = if s == 0.0 { (l, l, l) } else { let v2 = if l < 0.5 { l * (1.0 + s) } else { l + s - (s * l) }; let v1 = 2.0 * l - v2; ( hue_to_rgb_component(v1, v2, h + (1.0 / 3.0)), hue_to_rgb_component(v1, v2, h), hue_to_rgb_component(v1, v2, h - (1.0 / 3.0)), ) }; rgb.into() } pub fn delta_h(self, other: Hsl) -> f32 { dist(self.h, other.h).min(dist(self.h, 360.0)) // it's a circle, 0==360 } pub fn delta_s(self, other: Hsl) -> f32 { dist(self.s, other.s) } pub fn delta_l(self, other: Hsl) -> f32 { dist(self.l, other.l) } /// tentatively perceptual distance between the two colors, /// except it's just as unscientific it can possibly be so /// check it looks good before trying ot use it, at least... pub fn distance_to>(self, other: H) -> f32 { let other: Hsl = other.into(); self.delta_h(other) / 360.0 + self.delta_s(other) + self.delta_l(other) } /// Tell whether it's about the same color /// /// There's no theory behind this function, it should not /// be used outside of unit tests pub fn near(self, other: Hsl) -> bool { self.distance_to(other) < 0.01 } } impl From for Hsl { fn from(ansi: AnsiColor) -> Self { ansi.to_hsl() } } impl From for Hsl { fn from(rgb: Rgb) -> Self { rgb.to_hsl() } } fn hue_to_rgb_component(v1: f32, v2: f32, vh: f32) -> f32 { let vh = (vh + 1.0) % 1.0; if 6.0 * vh < 1.0 { (v1 + (v2 - v1) * 6.0 * vh).min(1.0).max(0.0) } else if 2.0 * vh < 1.0 { v2 } else if 3.0 * vh < 2.0 { (v1 + (v2 - v1) * ((2.0 / 3.0) - vh) * 6.0) .min(1.0) .max(0.0) } else { v1 } } fn dist(a: f32, b: f32) -> f32 { if a < b { b - a } else { a - b } } coolor-0.9.0/src/lib.rs000064400000000000000000000015651046102023000130410ustar 00000000000000/*! Definition of ANSI, RGB and HSL color types and all the conversions between them. There are many other color conversion crates. This one may be useful when you're interested into - variations of an ANSI color for your TUI application, for example fading, lightening, darkening, with compatibility with terminals that don't support RGB. - translations of color schemes - automatic downgrading of RGB color schemes for non RGB terminals - automated building of harmonious color schemes with guarantees of contrast - etc. Be warned that the ANSI range is limited and that not all intuitive operations will give good results. The included example shows luminosity and saturation variants of all 240 ANSI colors, with all variants still ANSI colors. */ #![no_std] mod ansi; mod color; mod error; mod hsl; mod rgb; pub use { ansi::*, color::*, error::*, hsl::*, rgb::*, }; coolor-0.9.0/src/rgb.rs000064400000000000000000000155231046102023000130440ustar 00000000000000use crate::*; /// RGB color, with u8 components #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct Rgb { /// red pub r: u8, /// green pub g: u8, /// blue pub b: u8, } impl Rgb { /// Create a new RGB color from its components pub const fn new(r: u8, g: u8, b: u8) -> Self { Self { r, g, b } } pub const fn is_grey(self) -> bool { self.r == self.g && self.g == self.b } #[inline] pub fn nearest_ansi_in_range(self, min: u8, max: u8) -> AnsiColor { let mut best = AnsiColor { code: min }; let mut smallest_distance: f32 = self.distance_to(best.to_rgb()); for code in min+1..=max { let color = AnsiColor { code }; let distance = self.distance_to(color.to_rgb()); if distance < smallest_distance { best = color; smallest_distance = distance; } } best } /// Return the nearest ANSI color /// /// The ansi->rgb->ansi round trip is guaranteed to /// always fall on the first color. pub fn to_ansi(self) -> AnsiColor { if self.r == self.g && self.g == self.b { AnsiColor { code: GREY_TO_ANSI[self.r as usize] } } else if self.r < 108 { if self.r < 41 { self.nearest_ansi_in_range(17, 51) } else { self.nearest_ansi_in_range(52, 87) } } else if self.r < 195 { if self.r < 151 { self.nearest_ansi_in_range(88, 123) } else { self.nearest_ansi_in_range(124, 159) } } else { if self.r < 235 { self.nearest_ansi_in_range(160, 195) } else { self.nearest_ansi_in_range(196, 230) } } } pub fn mix(c1: Self, w1: f32, c2: Self, w2: f32) -> Self { debug_assert!(w1 + w2 > 0.0); let (r1, g1, b1) = c1.parts(); let (r2, g2, b2) = c2.parts(); let r = (w1 * r1 + w2 * r2) / (w1 + w2); let g = (w1 * g1 + w2 * g2) / (w1 + w2); let b = (w1 * b1 + w2 * b2) / (w1 + w2); (r, g, b).into() } #[allow(clippy::float_cmp)] pub fn to_hsl(self) -> Hsl { let (r, g, b) = (self.rp(), self.gp(), self.bp()); let min = r.min(g).min(b); let max = r.max(g).max(b); let l = 0.5 * (max + min); if min == max { // gray level return Hsl::new(0.0, 0.0, l); } let h = if max == r { 60.0 * (g - b) / (max - min) } else if max == g { 60.0 * (b - r) / (max - min) + 120.0 } else if max == b { 60.0 * (r - g) / (max - min) + 240.0 } else { 0.0 }; let h = (h + 360.0) % 360.0; let s = if 0.0 < l && l <= 0.5 { (max - min) / (2.0 * l) } else { (max - min) / (2.0 - 2.0 * l) }; Hsl { h, s, l } } /// red part in `[0,1]` pub fn rp(self) -> f32 { self.r as f32 / 256f32 } /// green part in `[0,1]` pub fn gp(self) -> f32 { self.g as f32 / 256f32 } /// blue part in `[0,1]` pub fn bp(self) -> f32 { self.b as f32 / 256f32 } pub fn parts(self) -> (f32, f32, f32) { (self.rp(), self.gp(), self.bp()) } /// Compute the Luma value characterizing the "light" of the color, /// going from 0 (black) to 1 (white). /// /// Reference: pub fn luma(self) -> f32 { 0.2627 * self.rp() + 0.6780 * self.gp() + 0.0593 * self.bp() } /// tentatively perceptual distance between two RGB colors /// (adapted from the ansi_colours crate, by mina86, who adapted /// a formula found at https://www.compuphase.com/cmetric.htm) #[inline(always)] pub fn distance_to>(self, other: O) -> f32 { let other = other.into(); let r_sum = self.r as f32 + other.r as f32; let r = self.r as f32 - other.r as f32; let g = self.g as f32 - other.g as f32; let b = self.b as f32 - other.b as f32; (1024.0 + r_sum) * r * r + 2048.0 * g * g + (1534.0 - r_sum) * b * b } } pub fn r255(v: f32) -> u8 { (v * 255.0) as u8 } impl From<(f32, f32, f32)> for Rgb { /// Convert from a (r,g,b) float tupples with components in [0,1[ fn from(c: (f32, f32, f32)) -> Self { debug_assert!(c.0 <= 1.0); debug_assert!(c.1 <= 1.0); debug_assert!(c.2 <= 1.0); Rgb::new(r255(c.0), r255(c.1), r255(c.2)) } } pub const GREY_TO_ANSI: &[u8] = &[ 16, 16, 16, 16, 16, 232, 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 240, 240, 240, 240, 59, 59, 59, 59, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 102, 102, 102, 102, 102, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 145, 145, 145, 145, 145, 249, 249, 249, 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 188, 188, 188, 188, 188, 253, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 231, 231, 231, 231, 231, 231, 231, 231, ];