JFIF  ` ` ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 85 C   !"$"$ C hh"       } !1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz      w !1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? .(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+QI3L( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( @y -#yIޚXP2$袊 ( ( ( ( ( ( ( ( ( ( ( ( ( ( 3FE a(dN^M4GӁMoO$dssYz4]4+HM9վ2#OL@ܟH O@}LYW=p3! 7'Z&;" zםg|Ij~DǶr^2sI🆒TS(2?y}xmux#sھ[Cqg0mr\ ҏĺҋ{d^Rrr#mOŬ]\>uKcq*?ɯL񆥥Ƕ[ĆlO b[2+'c9Yl{I`:R fڽ;g8jc}ZC)ʑX匌J@:(P Hzh@#֌6Y$ʹ -ڛhJۆqi7s^{|c)]zyۿP+𗈬MaH_?LfG/U ( ( ( ( ( ( ( ("iX1?.ቨ.a?6I"|O+<.2H]aizhV3G8v|t".RcR7t+d(E~0 zD$r2ۜ~oC+Qsvx~%8 ~_|@Nկ81\gNMI#x ÞƠ W Cidlu;$1G5xh\NM#oL Zv6u+fd$HbaKiܻN?ʥt0F۟+g ]Q+r{8"28S4.ofXɑ|֗ x&s_Мp{W.14h~RME;XVX`q֡|:֢oB1fSBP_ WI~Ծ<04%ar UΉ>cy ~1b5w|Iϊ1ٯ4D`A y{-+N SkڲVCXR)M^ѠSc^3! }b}VBَ'9ִ/j~!]/DY_'׿} UQDRBͲ>GLsSnJQ(W Cx`rbF }G:~çivZ1Q =V&,gߥI}kdsѻ4RVEPEPEPEPEPEPH)I1@ (;=7JkO8j_ ٛVr\Q0 "=_Z;-8*ᛯ[ino ZU>#/9]x0]> 3u&%S9/PQVҭtIbxP ==*9 jPX7uMr3<`Z\g:^qV \WKg.잹ȩZ]][Pi۬h=V'O2VK0 TI`z'_֚CH/G Է4V 5, up쇖?夿w5j9]APn<:cs[V57 ]vAl*բp֖Z Pu{ _N]6@ȫaՏ@6sX+W1q@ tX 鴫`I8h3D Gm vCċiҝzRzP!Ҕ`p:P }>5|4VR!-䝒I,O98(=e"|ۦuK *pl?B k@u=$ Mz%%Sr~SsW۴ͧ1;Lg99qw:)Ծ~Ǟ+|7s]Md 9)V5"ھ;/?p MLGN=ҾÈ67c&XL1#}0瞾o};^̠yJ}}ǡǾ%!<zbfEe}I]ֽ NzZ-T0I WiiehRin-lPN׉bgfIìh% $L vˆ*n.Kr{waҷRnGz<+d63G <M4Ҽ' m4H ǪՅ$qpxZZ)gڊ(((((( W|sZ|akmD:rJELr~wkMCX _v4E|!e u.W%1zu?θߎ b%#QB#ApN9^78R ᭭DdA&ӶJ:h9>ct`lҝQ+9 erGn"  0=*(((((&4u+`=cpoōj:-pwp~Q*%*nH/=6a#4׎cÚwyC޾W})ǚEEQ4w_JȨÔjf5>Ϟ[<t(c ~m1K#SI1S@ Z@5F)E0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )8;qzj6:s3yv ӥ b|J ͭj'*"㔃Ty ėc^lb=$7 N4a. R#!{\ts '᳣xj ao% T9ڔ4|QwZ|Z20k G>xO^;]o..tn7h ֆ[\y5/glKv:xu^)-_ۏLwOY5y` 6gҴ/ɬi[X~77O_ x>}NU =?=6;XDa+XSHRlA Q<7ֺ8@ԊzSA7qB Z(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^WZ#GkM-] eRH-##0'TH( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ^cef6b88lr1ڀ< &[^dB>ץYYh#0JpP c4  QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE QE * $teller = Teller::USD(); * * * @param non-empty-string $method * @param array{0?: int} $arguments * * @return Teller */ public static function __callStatic(string $method, array $arguments): self { $currency = new Currency($method); $currencies = new ISOCurrencies(); $parser = new DecimalMoneyParser($currencies); $formatter = new DecimalMoneyFormatter($currencies); $roundingMode = empty($arguments) ? Money::ROUND_HALF_UP : (int) array_shift($arguments); return new self( $currency, $parser, $formatter, $roundingMode ); } private Currency $currency; private MoneyFormatter $formatter; private MoneyParser $parser; private int $roundingMode = Money::ROUND_HALF_UP; public function __construct( Currency $currency, MoneyParser $parser, MoneyFormatter $formatter, int $roundingMode = Money::ROUND_HALF_UP ) { $this->currency = $currency; $this->parser = $parser; $this->formatter = $formatter; $this->roundingMode = $roundingMode; } /** * Are two monetary amounts equal to each other? * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function equals(mixed $amount, mixed $other): bool { return $this->convertToMoney($amount)->equals( $this->convertToMoney($other) ); } /** * Returns an integer less than, equal to, or greater than zero if a * monetary amount is respectively less than, equal to, or greater than * another. * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function compare(mixed $amount, mixed $other): int { return $this->convertToMoney($amount)->compare( $this->convertToMoney($other) ); } /** * Is one monetary amount greater than another? * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function greaterThan(mixed $amount, mixed $other): bool { return $this->convertToMoney($amount)->greaterThan( $this->convertToMoney($other) ); } /** * Is one monetary amount greater than or equal to another? * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function greaterThanOrEqual(mixed $amount, mixed $other): bool { return $this->convertToMoney($amount)->greaterThanOrEqual( $this->convertToMoney($other) ); } /** * Is one monetary amount less than another? * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function lessThan(mixed $amount, mixed $other): bool { return $this->convertToMoney($amount)->lessThan( $this->convertToMoney($other) ); } /** * Is one monetary amount less than or equal to another? * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function lessThanOrEqual(mixed $amount, mixed $other): bool { return $this->convertToMoney($amount)->lessThanOrEqual( $this->convertToMoney($other) ); } /** * Adds a series of monetary amounts to each other in sequence. * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount * @param mixed[] $others subsequent other monetary amounts * * @return string the calculated monetary amount */ public function add(mixed $amount, mixed $other, mixed ...$others): string { return $this->convertToString( $this->convertToMoney($amount)->add( $this->convertToMoney($other), ...$this->convertToMoneyArray($others) ) ); } /** * Subtracts a series of monetary amounts from each other in sequence. * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount * @param mixed[] $others subsequent monetary amounts */ public function subtract(mixed $amount, mixed $other, mixed ...$others): string { return $this->convertToString( $this->convertToMoney($amount)->subtract( $this->convertToMoney($other), ...$this->convertToMoneyArray($others) ) ); } /** * Multiplies a monetary amount by a factor. * * @param mixed $amount a monetary amount * @param int|float|numeric-string $multiplier the multiplier */ public function multiply(mixed $amount, int|float|string $multiplier): string { $multiplier = is_float($multiplier) ? Number::fromFloat($multiplier) : Number::fromNumber($multiplier); return $this->convertToString( $this->convertToMoney($amount)->multiply( (string) $multiplier, $this->roundingMode ) ); } /** * Divides a monetary amount by a divisor. * * @param mixed $amount a monetary amount * @param int|float|numeric-string $divisor the divisor */ public function divide(mixed $amount, int|float|string $divisor): string { $divisor = is_float($divisor) ? Number::fromFloat($divisor) : Number::fromNumber($divisor); return $this->convertToString( $this->convertToMoney($amount)->divide( (string) $divisor, $this->roundingMode ) ); } /** * Mods a monetary amount by a divisor. * * @param mixed $amount a monetary amount * @param int|float|numeric-string $divisor the divisor */ public function mod(mixed $amount, int|float|string $divisor): string { $divisor = is_float($divisor) ? Number::fromFloat($divisor) : Number::fromNumber($divisor); return $this->convertToString( $this->convertToMoney($amount)->mod( $this->convertToMoney((string) $divisor) ) ); } /** * Allocates a monetary amount according to an array of ratios. * * @param mixed $amount a monetary amount * @param non-empty-array $ratios an array of ratios * * @return string[] the calculated monetary amounts */ public function allocate(mixed $amount, array $ratios): array { return $this->convertToStringArray( $this->convertToMoney($amount)->allocate($ratios) ); } /** * Allocates a monetary amount among N targets. * * @param mixed $amount a monetary amount * @psalm-param positive-int $n the number of targets * * @return string[] the calculated monetary amounts */ public function allocateTo(mixed $amount, int $n): array { return $this->convertToStringArray( $this->convertToMoney($amount)->allocateTo($n) ); } /** * Determines the ratio of one monetary amount to another. * * @param mixed $amount a monetary amount * @param mixed $other another monetary amount */ public function ratioOf(mixed $amount, mixed $other): string { return $this->convertToString( $this->convertToMoney($amount)->ratioOf( $this->convertToMoney($other) ) ); } /** * Returns an absolute monetary amount. * * @param mixed $amount a monetary amount */ public function absolute(mixed $amount): string { return $this->convertToString( $this->convertToMoney($amount)->absolute() ); } /** * Returns the negative of an amount; note that this will convert negative * amounts to positive ones. * * @param mixed $amount a monetary amount */ public function negative(mixed $amount): string { return $this->convertToString( $this->convertToMoney($amount)->negative() ); } /** * Is a monetary amount equal to zero? * * @param mixed $amount a monetary amount */ public function isZero(mixed $amount): bool { return $this->convertToMoney($amount)->isZero(); } /** * Is a monetary amount greater than zero? * * @param mixed $amount a monetary amount */ public function isPositive(mixed $amount): bool { return $this->convertToMoney($amount)->isPositive(); } /** * Is a monetary amount less than zero? * * @param mixed $amount a monetary amount */ public function isNegative(mixed $amount): bool { return $this->convertToMoney($amount)->isNegative(); } /** * Returns the lowest of a series of monetary amounts. * * @param mixed $amount a monetary amount * @param mixed ...$amounts additional monetary amounts */ public function min(mixed $amount, mixed ...$amounts): string { return $this->convertToString( Money::min( $this->convertToMoney($amount), ...$this->convertToMoneyArray($amounts) ) ); } /** * Returns the highest of a series of monetary amounts. * * @param mixed $amount a monetary amount * @param mixed ...$amounts additional monetary amounts */ public function max(mixed $amount, mixed ...$amounts): string { return $this->convertToString( Money::max( $this->convertToMoney($amount), ...$this->convertToMoneyArray($amounts) ) ); } /** * Returns the sum of a series of monetary amounts. * * @param mixed $amount a monetary amount * @param mixed ...$amounts additional monetary amounts */ public function sum(mixed $amount, mixed ...$amounts): string { return $this->convertToString( Money::sum( $this->convertToMoney($amount), ...$this->convertToMoneyArray($amounts) ) ); } /** * Returns the average of a series of monetary amounts. * * @param mixed $amount a monetary amount * @param mixed ...$amounts additional monetary amounts */ public function avg(mixed $amount, mixed ...$amounts): string { return $this->convertToString( Money::avg( $this->convertToMoney($amount), ...$this->convertToMoneyArray($amounts) ) ); } /** * Converts a monetary amount to a Money object. * * @param mixed $amount a monetary amount */ public function convertToMoney(mixed $amount): Money { return $this->parser->parse((string) $amount, $this->currency); } /** * Converts an array of monetary amounts to an array of Money objects. * * @param array $amounts an array of monetary amounts * * @return Money[] */ public function convertToMoneyArray(array $amounts): array { $converted = []; /** @var mixed $amount */ foreach ($amounts as $key => $amount) { $converted[$key] = $this->convertToMoney($amount); } return $converted; } /** * Converts a monetary amount into a Money object, then into a string. * * @param mixed $amount typically a Money object, int, float, or string * representing a monetary amount */ public function convertToString(mixed $amount): string { if ($amount instanceof Money === false) { $amount = $this->convertToMoney($amount); } return $this->formatter->format($amount); } /** * Converts an array of monetary amounts into Money objects, then into * strings. * * @param array $amounts an array of monetary amounts * * @return string[] */ public function convertToStringArray(array $amounts): array { $converted = []; /** @var mixed $amount */ foreach ($amounts as $key => $amount) { $converted[$key] = $this->convertToString($amount); } return $converted; } /** * Returns a "zero" monetary amount. */ public function zero(): string { return '0.00'; } }