pax_global_header00006660000000000000000000000064152050107060014506gustar00rootroot0000000000000052 comment=3fc84fd00216c5ecca5ff6ae3cfcb3f3007dae87 qalculate-qt-5.11.0/000077500000000000000000000000001520501070600141675ustar00rootroot00000000000000qalculate-qt-5.11.0/.gitignore000066400000000000000000000011661520501070600161630ustar00rootroot00000000000000changes qalculate-qt # C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.so.* *.dll *.dylib # Qt-es object_script.*.Release object_script.*.Debug *_plugin_import.cpp /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.qbs.user *.qbs.user.* *.moc moc_*.cpp moc_*.h qrc_*.cpp ui_*.h *.qmlc *.jsc Makefile* *build-* *.qm *.prl # Qt unit tests target_wrapper.* # QtCreator *.autosave # QtCreator Qml *.qmlproject.user *.qmlproject.user.* # QtCreator CMake CMakeLists.txt.user* # QtCreator 4.8< compilation database compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* qalculate-qt-5.11.0/AUTHORS000066400000000000000000000000571520501070600152410ustar00rootroot00000000000000Hanna Knutsson qalculate-qt-5.11.0/COPYING000066400000000000000000000431001520501070600152200ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Moe Ghoul, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qalculate-qt-5.11.0/README000066400000000000000000000017551520501070600150570ustar00rootroot00000000000000Qalculate! Qt UI Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK, Qt, and CLI). 1. Requirements * Qt5 (>= 5.6) or Qt6 * libqalculate (>= 5.6.0) 2. Installation Instructions and download links for installers, binaries packages, and the source code of released versions of Qalculate! are available at https://qalculate.github.io/downloads.html. In a terminal window in the top source code directory run * qmake * make * make install (as root, e.g. sudo make install) The resulting executable is named qalculate-qt. qalculate-qt-5.11.0/README.md000066400000000000000000000275561520501070600154650ustar00rootroot00000000000000# Qalculate! Qt UI Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK, Qt, and CLI). > [!TIP] > Visit the website at https://qalculate.github.io/ to see additional screenshots, read the manual, and download the latest version. ## Requirements * Qt5 (≥ 5.6) or Qt6 * libqalculate (≥ 5.6.0) ## Installation Instructions and download links for installers, binaries packages, and the source code of released versions of Qalculate! are available at https://qalculate.github.io/downloads.html. In a terminal window in the top source code directory run * `qmake` * `make` * `make install` *(as root, e.g. `sudo make install`)* The resulting executable is named `qalculate-qt`. ## Features *Features specific to qalculate-qt:* #### Graphical user interface * Flexible expression entry with customizable completion and function hints * Calculate as you type * Context-dependent menu for conversion to suitable units and output formats * History list with support for comments, protection of individual items, search, and access to actual values of previous calculations * Customizable keypad with access to most features * Customizable workspaces for switching between different projects and settings * Dialogs for management of and easy access to functions, variables and units (with quick conversion) * Dialogs for easy entry of all functions * Create/edit functions, variables, matrices/vectors, units, and data sets * Tools for quick conversion between number bases, floating point conversion, calendar conversion, and percentage calculation * Convenient interface for plots and graphs * Configurable keyboard shortcuts *Features from libqalculate:* #### General * All common operators — arithmetic, logical, bitwise, element-wise, (in)equalities * Expressions may contain any combination of numbers, constants, functions, units, variables, matrices, vectors, and time/dates * Fault-tolerant and flexible input parsing with verbose error/warning messages * Arbitrary precision with both rational and floating point numbers * Complex and infinite numbers * Propagation of uncertainty and interval arithmetic * Both exact and approximate output (*sqrt(32)* = *4 × sqrt(2)* ≈ *5.657*) * Simple and mixed fractions (*4 / 6 × 2* = *1.333…* = *4/3* = *1 + 1/3*) * All common number bases, as well as negative and non-integer radices, roman numerals, etc. * RPN mode * Highly customizable with a myriad of options for every aspect of the calculator #### Symbolic calculations * Factorization and simplification * Differentiation and integration * Can solve most equations and inequalities * Customizable assumptions (e.g. *ln(2x) where x > 0* = *ln(2) + ln(x)*) #### Functions * Over 400 flexible and diverse functions (trigonometry, exponents and logarithms, combinatorics, geometry, calculus, statistics, finance, time and date, etc.) * Easily created and edited, with support for different argument types, subfunctions, and custom conditions #### Units * Over 400 diverse units and all standard decimal and binary prefixes * Includes all SI units, as well as imperial, CGS, and atomic units, and more… * Automatic and explicit conversion (e.g. *ft + yd + m* = *2.2192 m*, *5 kg × m/s^2* = *5 N*, *5 m/s to mph* = *11.18 mph*) * Currency conversion with daily updated exchange rates #### Variables and constants * All common basic constants (Ï€, e, φ, etc.) * Fundamental physical constants with 2022 CODATA values (including standard uncertainty and optional units) * CSV file import and export * Easily created and edited, including by using simple assignment expressions (e.g. *x = 2 s*) * Data sets with objects and associated properties (a data set with chemical elements is included) #### Plots and graphs * Uses Gnuplot * Can plot functions or data (matrices and vectors) * Can be customized using several options, and saved as image files *…and more…* > [!TIP] > For more details about the syntax, and available functions, units, and variables, please consult the manual (https://qalculate.github.io/manual/). ## Examples (expressions) > [!NOTE] > Semicolon can be replaced with comma in function arguments, if comma is not used as decimal or thousands separator. #### Basic functions and operators ```R sqrt 4 # = sqrt(4) = 4^(0.5) = 4^(1/2) = 2 sqrt(25; 16; 9; 4) # = [5 4 3 2] sqrt(32) # = 4 × √(2) (in exact mode) cbrt(-27) # = root(-27; 3) = −3 (real root) (-27)^(1/3) # ≈ 1.5 + 2.5980762i (principal root) ln 25 # = log(25; e) ≈ 3.2188758 log2(4)/log10(100) # = log(4; 2)/log(100; 10) = 1 5! # = 1 × 2 × 3 × 4 × 5 = 120 5\2 # = 5//2 = trunc(5 / 2) = 2 (integer division) 5 mod 3 # = mod(5; 3) = 2 52 to factors # = 2^2 × 13 25/4 * 3/5 to fraction # = 3 + 3/4 gcd(63; 27) # = 9 sin(pi/2) - cos(pi) # = sin(90 deg) − cos(180 deg) = 2 sum(x; 1; 5) # = 1 + 2 + 3 + 4 + 5 = 15 sum(\i^2+sin(\i); 1; 5; \i) # = 1^2 + sin(1) + 2^2 + sin(2) + … ≈ 55.176162 product(x; 1; 5) # = 1 × 2 × 3 × 4 × 5 = 120 var1:=5 # stores value 5 in variable var1 var1 * 2 # = 10 sinh(0.5) where sinh()=cosh() # = cosh(0.5) ≈ 1.1276260 plot(x^2; -5; 5) # plots the function y=x^2 from -5 to 5 ``` #### Units > [!TIP] > ` to ` can be replace with an arrow (`âžž` or `->`). ```R 5 dm3 to l # = 5 dm^3 to L = 5 L 20 miles / 2 h to km/h # = 16.09344 km/h 1.74 to ft # = 1.74 m to ft ≈ 5 ft + 8.5039370 in 1.74 m to -ft # ≈ 5.7086614 ft 100 lbf * 60 mph to hp # ≈ 16 hp 50 Ω * 2 A # = 100 V 50 Ω * 2 A to base # = 100 kg·m²/(s³·A) 10 N / 5 Pa # = (10 N)/(5 Pa) = 2 m² 5 m/s to s/m # = 0.2 s/m €500 - 20% to £ # ≈ £347.12 500 megabit/s * 2 h to b?byte # ≈ 419.09516 gibibytes ``` #### Physical constants ```bash k_e / G * a_0 # = (CoulombsConstant / NewtonianConstant) × BohrRadius ≈ 7.126e9 kg·H·m^−1 ℎ / (λ_C * c) # = planck ∕ (ComptonWavelength × SpeedOfLight) ≈ 9.1093837e-31 kg 5 ns * rydberg to c # ≈ 6.0793194E-8c atom(Hg; weight) + atom(C; weight) * 4 to g # ≈ 4.129e-22 g (G * planet(earth; mass) * planet(mars; mass))/(54.6e6 km)^2 # ≈ 8.58e16 N (gravitational attraction between earth and mars) ``` #### Uncertainty and interval arithmetic > [!NOTE] > Results with interval arithmetic activated are shown in parenthesis. ```R sin(5±0.2)^2/2±0.3 # ≈ 0.460±0.088 (0.46±0.12) (2±0.02 J)/(523±5 W) # ≈ 3.824±0.053 ms (3.825±0.075 ms) interval(-2; 5)^2 # ≈ interval(−8.2500000; 12.750000) (interval(0; 25)) ``` > [!TIP] > "±" can be replaced with "+/-". #### Algebra ```ruby (5x^2 + 2)/(x - 3) # = 5x + 15 + 47/(x − 3) (\a + \b)(\a - \b) # = 'a'^2 − 'b'^2 (x + 2)(x - 3)^3 # = x^4 − 7x^3 + 9x^2 + 27x − 54 x^4 - 7x^3 + 9x^2 + 27x - 54 to factors # = (x + 2)(x − 3)^3 cos(x)+3y^2 where x=pi; y=2 # = 11 gcd(25x; 5x^2) # = 5x 1/(x^2+2x-3) to partial fraction # = 1/(4x − 4) − 1/(4x + 12) x+x^2+4 = 16 # x = 3 or x = −4 x^2/(5 m) - hypot(x; 4 m) = 2 m where x > 0 # x ≈ 7.1340411 m cylinder(20cm; x) = 20l # x = (1 / (2Ï€)) m ≈ 16 cm asin(sqrt(x)) = 0.2 # x = sin(0.2)^2 ≈ 0.039469503 x^2 > 25x # x > 25 or x < 0 solve(x = y+ln(y); y) # = lambertw(e^x) solve2(5x=2y^2; sqrt(y)=2; x; y) # = 32/5 multisolve([5x=2y+32, y=2z, z=2x]; [x, y, z]) # = [−32/3 −128/3 −64/3] dsolve(diff(y; x) - 2y = 4x; 5) # = 6e^(2x) − 2x − 1 ``` #### Calculus ```ruby diff(6x^2) # = 12x diff(sinh(x^2)/(5x) + 3xy/sqrt(x)) # = (2/5) × cosh(x^2) − sinh(x^2)/(5x^2) + (3y)/(2 × √(x)) integrate(6x^2) # = 2x^3 + C integrate(6x^2; 1; 5) # = 248 integrate(sinh(x^2)/(5x) + 3xy/sqrt(x)) # = 2x × √(x) × y + Shi(x^2) / 10 + C integrate(sinh(x^2)/(5x) + 3xy/sqrt(x); 1; 2) # ≈ 3.6568542y + 0.87600760 limit(ln(1 + 4x)/(3^x - 1); 0) # = 4 / ln(3) ``` #### Matrices and vectors ```R [1, 2, 3; 4, 5, 6] # = [1 2 3; 4 5 6] (2×3 matrix) 1…5 = (1:5) = (1:1:5) # = [1 2 3 4 5] (1; 2; 3) * 2 - 2 # = [(1 × 2 − 2), (2 × 2 − 2), (3 × 2 − 2)] = [0 2 4] [1 2 3].[4 5 6] = dot([1 2 3]; [4 5 6]) # = 32 (dot product) cross([1 2 3]; [4 5 6]) # = [−3 6 −3] (cross product) [1 2 3; 4 5 6].*[7 8 9; 10 11 12] # = [7 16 27; 40 55 72] (hadamard product) [1 2 3; 4 5 6] * [7 8; 9 10; 11 12] # = [58 64; 139 154] (matrix multiplication) [1 2; 3 4]^-1 # = inverse([1 2; 3 4]) = [−2 1; 1.5 −0.5] ``` #### Statistics ```R mean(5; 6; 4; 2; 3; 7) # = 4.5 stdev(5; 6; 4; 2; 3; 7) # ≈ 1.87 quartile([5 6 4 2 3 7]; 1) # = percentile((5; 6; 4; 2; 3; 7); 25) ≈ 2.9166667 normdist(7; 5) # ≈ 0.053990967 spearman(column(load(test.csv); 1); column(load(test.csv); 2)) # ≈ −0.33737388 (depends on the data in the CSV file) ``` #### Time and date ```ruby 10:31 + 8:30 to time # = 19:01 10h 31min + 8h 30min to time # = 19:01 now to utc # = "2020-07-10T07:50:40Z" "2020-07-10T07:50CET" to utc+8 # = "2020-07-10T14:50:00+08:00" "2020-05-20" + 523d # = addDays(2020-05-20; 523) = "2021-10-25" today - 5 days # = "2020-07-05" "2020-10-05" - today # = days(today; 2020-10-05) = 87 d timestamp(2020-05-20) # = 1 589 925 600 stamptodate(1 589 925 600) # = "2020-05-20T00:00:00" "2020-05-20" to calendars # returns date in Hebrew, Islamic, Persian, Indian, Chinese, Julian, Coptic, and Ethiopian calendars ``` #### Number bases ```R 52 to bin # = 0011 0100 52 to bin16 # = 0000 0000 0011 0100 52 to oct # = 064 52 to hex # = 0x34 0x34 = hex(34) # = base(34; 16) = 52 523<<2&250 to bin # = 0010 1000 52.345 to float # ≈ 0100 0010 0101 0001 0110 0001 0100 1000 float(01000010010100010110000101001000) # = 1715241/32768 ≈ 52.345001 floatError(52.345) # ≈ 1.2207031e-6 52.34 to sexa # = 52°20′24″ 1978 to roman # = MCMLXXVIII 52 to base 32 # = 1K sqrt(32) to base sqrt(2) # ≈ 100000 0xD8 to unicode # = Ø code(Ø) to hex # = 0xD8 ``` qalculate-qt-5.11.0/TODO000066400000000000000000000000001520501070600146450ustar00rootroot00000000000000qalculate-qt-5.11.0/data/000077500000000000000000000000001520501070600151005ustar00rootroot00000000000000qalculate-qt-5.11.0/data/128/000077500000000000000000000000001520501070600154125ustar00rootroot00000000000000qalculate-qt-5.11.0/data/128/qalculate-qt.png000066400000000000000000000111651520501070600205210ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆ pHYsbb8z™ÛtEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTbøIDATxœí�{lמǿgçws ¢¢¢¢’¡�IC%vh<³1^GB¼§?‘Œ=a1LD�F'ñ�Çp׫D&”1i„c¤ëýˆÖ(¾Æ%Ÿ×�!Tºª&F0ú;X}^‡JÃ�hJ_ã2A‚¦  €[¶lÙ�ÙÙÙEƒ¡D§ÓMÀа,k¢”¦¬ñŸºuŸÒY !„:©ÓFD Äew9º\ƒ­7»oîûû‡í6Ø<† Q‰ ’a ¯ ±X,æeË–m5�•:�n˲….—‹q¹\”RPJ!Šbì¿@ØÕR 4 ` 0„€¤H�E4̘ˆ–Ñi@8 ˆ–ˆn—Ð1êäG¬_U]>öÙþvrAøŠÂ·D�¦îÞð7>;cÆŒ)[¶lù³ÉdúãÐÐ�Ñjµbxx<σҸœQÅØs¥a¡%´„…–°à a”ÎZxÀ80&-49S@Ìœ­wxðпþíÙ»b»9À�(DÉaÿ׳‹/Î~衇þw```EGGAHð7R†I+€Ç€+½î\MÝž¿ÿeãß¿€Gã¥Dá¾åø¿_€«¬¬ü¨¥¥eE[[[Ú?� .Ϋƒ W+þ}Åî¿bÌÃm‡=(ÁàëÉ34;wî¬ìêꪴZ­‰Î·J‚úF »%>x¼ò/ë €D¡JߺŸcfg___jxE*qwÚÉœ)OÃS ŒÛ1¨ý €`V¬Xa¶Ùlÿ(KNS€P�“=úÉ?¬)]a†Ÿ�„ˆ>Àœ9sþihhhJØ_q2£´¥d ÔÊv–o­€§ˆÚLJãv»çOÖ&^&CŠÜQýïµõ±�.[.Ud…§#Bª+ØW-i-€p%édGOÙ\Dø:KJi^¢3¦’8pyˆ¡>†aTLRXŠið±%‚!RGDQœ*KîTd‡#"T‘†ƒ ¥”Kh®R BB‡É#Û.šù±N‹ B �““›Í†ÖÖÖ¨®ËÊÊBQQ¬V+nÞ¼)g'- !šHç("£Ñˆ%K–`éÒ¥X¸p!ôz½÷³#GŽàË/¿ y­ÙlÆc�=‹Å†ñÔ`gÏžEUUU¢³9éa@"Ú.Ü có•¡Õ«W£¢¢sçÎ¥�T 7nDMM xž—|VTT„_|¹¹¹~ñ+W®Ä©S§Ô’ z{, $‘Z Q#ÑBAMM öìكǻwïFss³ß9z½Ë—/—\k6›ñ /HŒ?NªÏûLrÞüùóýÞët:<÷Üs0 8pà^~ùeœ>}N§púôitvvÆ”§è¶—-0‘í+¯ƒ /^ÄÈȈŸP^^îwÎÎ�;QXXˆ7ÞxW¯^|üñÇ8räX–ÅÈÈHRó,ëýcüíÒ‚”@ss3xž‡N§óÆ­[·z½û÷ïÚ$TI )Q‚ ©ßõz=êëëñÓO?)”«Ì %@âÀ矮@N2‹”@cc£$.T§O"QÚGSØL455I8)..V(7™CÊÀétbppÐ/®´´4yPú¯ªP�2X¿~½¤È/++I‡�ù&%PRR‚Í›7{ûöÇ1�˜1c†B¹Ê ÇqصkDQÄþýû%ŸŽ $âsLÇ Å°mÛ6”””àСCøí·ßÐÕÕå÷ùܹsÊYf ¨,X€ÊÊJœ>}çÎ� P /Š `êԩرcnܸ�#GŽxãüÎËÉÉA~~~Ð4 à$ú–JØÉ¯!O=õt:Þyç¸\.ïg�€{î¹GWZZŠW^yÓ§Ç÷à’ÒæÉH`Æ °X,¨ªªBoo¯ßgýýý¸uë–_Ü‚ üÞgggãÙgŸÅÉ“'%çN¥-¤°d ,//‡ÅbÁÀÀ¾ÿþ{o'�ÅbÁÖ­[qêÔ)üüóÏA¯mhh@AA�÷ý’%K`0àp8 ×ëñüóÏ£»»_}õ•\ÙÏd@~~>^zé%°¬'ùM›6¡®®.— +W®D}}=Ž=òú‹/âþûï÷¾×ëõxæ™gP[[‹µk×"77˜´+“¥²`æÌ™^ã˲¸ï>Ï‚Œ×®]Ã|vï/¿ü§Ó ­Vë�[´h-Z§Ó‰7ß|SRuÄŠoI9Ñú3�Åhnnº’Øõë×ñÖ[oIzüáy555’x·Û�ªªª 3ˆTbC– «« ï¿ÿ>6mÚ„ÂÂBØívÔÖÖâèÑ£�*�£G�Âh4âÞ{ï˲hllħŸ~ŠëׯˑåŒE6'°®®uuu1_Ïó¼ú¸WH‰9�ŠO#: Èxd¸ý• RQ–Œ/b�ÉÒaê¿È;Lí‹håaÿoé¤ÙD  ³¦�‹“v?wë�*¹ˆÅPÂ?�랪�ád|  â �áÿø%y÷³Ê÷hœ*€Ä!¶¿&Od«T@íPÉ`"–S¦¤ïV*QÀwí•ôC­2œŒw�¾Ls3^±t2Y:¶%w,Àñ©Úœ2�,¦îHÞX€Ð:$›T ÃÉø Óƒ2^±@­<ìIì VÇR 1É�ÕÈp2¾5¨ö$�¼¼<”••¡¸¸F£S§NÇq°Ûí°ÛíèééASSš››áv»åÉD†O NºX–…ÅbÁ<€¼¼Û[Úív BEãŽ;îð~æt:qþüyÔÔÔx7›PI I@yy9}ôQdggðlórîÜ9ÔÖÖ¢­­ÍïÜÂÂBX,¬^½Z­«V­BEEjjjðÅ_}öPeâ$E„TVVâÁôîô500€êêj´´´½¦³³'NœÀ¹sçðôÓO£¨¨�kÖ¬ÁìÙ³Q]]�¡¡¡dd?­IJ+`Æ X¿~½×øV«ï¾ûnHãûÒÓÓƒƒúm.5kÖ,ìÞ½;!s”^ÀCî ÙPQQ�5kÖxßSJqøðaôôôD�ÆÈȪ««a·Û½qEEEرc‡º’hœÈ*€ììllܸÑ/îÂ… 1=ß?88ˆcÇŽùÅ•••Áb±Ä•ÇLGV<üðÃ~«|PJƒ.ü-õõõ°Z­~q6lð»Ç„QºŒV¸�M&“ K—.õ‹»qãF\«z ‚ Ys +++®Å$•¶OÚú‹-ò:}ã455Å�n°B.\GŠJ›HY È&€9sæHâ¢Ý<ÁÒ())‰;ÝLE6ŒoüèK"Úí6›M²<œo¯¡ÊÄ�­#(˜Q¢] *¢(‚çy¿>£ÑBHLëÆS¦²•Áºjƒm �Ë̹\.uÑÈ‘M¾�6ã�Æ„¤í»Ád¨{©D‡lèîî–Ä%BZ­VÒîooo�/Q¥uÛ�² Xo_"öœ6mš¤û÷Úµkq§›©Èæ644Hö¾ë®»âN7°É'~üñǸÒT�@p88{ö¬_ÜܹsÁq\\éΟ?ßï}°îa•è‘u,à믿F__Ÿ÷½V«•tO„¬¬,¿^?‡Ã�'NÄ•ÇLGVŒŒŒàСC~[¬[·.æRà‘Gñ.C/>ùäuRHœÈ> µµ~ø!xÞópCnn.ž|òÉ ÷ ¬Zµ Ë—/àY6þðáøtéRÜùó­ï•vØh$gFPSSöïß�ÎÎNÀâÅ‹±wï^¿maB1eÊlÙ²›7oôõõáàÁƒ¨¯¯OLæ”¶P:6÷îÝ+‰ëèèÀÛo¿�ãÇ�chh3gÎľ}û°víÚ�é,\¸¯¿þ:V­Z«ÕŠãÇ�ãµ×^ó›6Ξ={ù2Yš�ÅÅÅ(--•Ìùs:�¨©©Á™3g0kÖ,lß¾=ìñÅÅÅÐétøè£�ð믿†ÜfæÎ;ïÄìÙ³ú2…H caÂÍâíÛ·ã›o¾A{{;l6›Äxày>ìD&“ .— íííÞ©ä¾dee!??k×®�yn`<õgª#Ò03�M Dyžf³[·n�x^¸~|“ÉŽãðꫯNôö*(ñqªP>€ïК¬O` †�Ÿ™L&9o�öPP·÷¥¿M½„s)‘R*ÓCyÂUêD�¸q[ D[Lˆ¶¶6É�m(ÂíØßߟ�I$™Š1¢í" @E÷D;m<8¡óCñÞ{ï%$�p2æô�AÆ^§�H©³p; J‡”•$Ën[¤s‚ €úEQLÌ­*IG ´a@ r+€RJULRìßÿ?´Dá| @t¹\=Ñ:t“‘tî�Ýð´b*(:::Ú%CÞT’@¯ÛÖ‹«Œ]$:Ž‹‰Î˜ŠüTÄ.âv UG Bccã—Ë•¾�q¥‡ke VÑ>ò_ƒßÖÁ_!D,:::ú‡‡‡ˆæ·œŒŸc:…¾¯¶®÷ú<y1û"w___5Ïóê£7“„^—�þ0|í<ƒAªÆ7¾ÀU[[ûV«õ›ÀG²TR«Û�Ë£m_¾pý“3¸=²%©#H„§©¯¯ÆjµÖÛívõ9¼ÄM´ñ}¸<Ú~a_ëÿü À<¶ó5¾Äp¡:ù%Í`‡Ãá¼y󿉼¼<­Ûížçv»µ@‘,1™¸¯{:4„K°D a ! ˜   ]èrZÑâìµ^çoUm»ôîsí|Ï'¤�î[ŽûÌX`pô999¹óæÍûgƒÁp?Çqå„�é„ Ã0`„ï ß™:©¸¢×®†{ÀZF-á e4à QFÔ”Rˆcö¢ ¨8ö¨'uÃME8© ¢Ðé üå›üÀ·ïÜ:yêÒð­~xþù.Ü®ÿÃú‘,(ÍXàà„vìÈÍž={†Ùl.à8®X«ÕNÓh4º±/dbF ÃèDQL©nÅ?´”Ë0”#‘CY†•’ªÑ)ˆ†ˆ/ à ˆ"?,:z;ܶö#Ý]Çz~èàÁ�Ú9vtÁó¯ÿç‡5>]�§oë‚ 4cGâs L;]zW“I áÆ_ûuÜGƒ„ íþ@¢5J`s™Aè&h¨tULŒ`† Ø �ÿøˆÞúDŒêêϽTB/и¡Fû¢jªÅj”@1$*]•ð„+B}–DJ5¶²¨�2*****±ðÿ‚µòGÜ2WîIEND®B`‚qalculate-qt-5.11.0/data/16/000077500000000000000000000000001520501070600153265ustar00rootroot00000000000000qalculate-qt-5.11.0/data/16/qalculate-qt.png000066400000000000000000000017511520501070600204350ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTblIDAT8�m‘ÏkWÇ?óöyWŽ%Ù1Š�|H ÂC½”âÆ.iñÅCn!1ù’KþŠBO&'_ ¹|Ñ͆¢B}±AÁ!!Iƒë‹cuÿX)±ôvwr�¼±|yÌðæóæ;O€+•Jån.—›‘‚ª.Ä�'×=ߨä<·x©Ó$zçÞ76£æS[*•î/,,<™™™±¾ïc­½ØÏ�Ö÷Œ™\–Ç.!î:^¾|ñàcã‰gƒ ¸Ø��â8ÆCš¦¨*¿ü;‚ÚÂT¬áFqÒVý«³VD ggg8çX^^ftt” h44›M$U$Õ!.Áÿdd܈ˆ5¦o{ccƒÙÙYVVVh6›ƒç@.‘'‚¾.‹T«U¬µ”ËeZ­ªÚ¿\ôñ¿›Ìè½ú‰–:ˆ¹¹9Â0dmm�Z­Æááá`Á¿9Aé÷Û |¸Iïõñ0 ^¯£ú•WÀ¸gÿsðëÓáúØbÀær9obb‚n·{)@ö øá“ü–Õ><ÚĽùjc KKK”J%vwwÙÚÚ:ß!ÉÛŽÿ•’·'ÈyßÅÄqÌêê*óóó”Ëå>@@Û=Üö»LÚî!ƒæ P(ÃU% Còù|øF¦˜4McUåàà€ÅÅEjµÓÓÓt:�ÌÂeR…ØŠHÇ1ÇÇÇÔëu:�ëëë¤iŠˆ ^_Û…®:@OmEÛívûÞÑÑ‘�¢ÏóØßßÇZK¥R!8ÇzcYoœ$¸Äñªµçþë¶¶¸:55õ ŸÏÿlŒÉ~ç§°ª#ÆKbMc”3§îd¯÷þŸ¿OŸÿù£W HŒ –IEND®B`‚qalculate-qt-5.11.0/data/22/000077500000000000000000000000001520501070600153235ustar00rootroot00000000000000qalculate-qt-5.11.0/data/22/qalculate-qt.png000066400000000000000000000022541520501070600204310ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs ‰ ‰P”‚%tEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTb/IDAT8��UMOãV=÷ù�'1xLf¨HY@ÛEŠJH•H3dÑu;‹ŠüXS6l@ü€vU©Û‰TZ±AB*‹ )Õ´L?F…VªÄÇ"åkBB°�g?wA¾L¹z?l®#ªŽ¨¹ŽôŽ_YÿÒ:ü™âñøÓt:ýÃää¤ÑÓÓ)%\×…ïûÏŠ)Ę֩¬˜ª z]Å/¿¾(}ý2ÿ9×u=788hìííÁ¶íPG <ý'â½áI˜ÆñÑPÒxO}'Ç œžžÂ¶m‰FGGCCCˆÇã-.u ¾å‚ŸØ bO˜¢(Z‹HH&“X]]ÅÔÔæææ�ÉdÚMÝ @Dy 1"b ¢”ÛÛÛ°, ãããXXXÀúúúÛ9® "…×'jÂ÷}‹E!:ÊÈè6º¡^â탩T ¦iâââÉdÃÃÃ8::‚çyMQwe"ÑmIšÈårÐukkkˆD"èïïo‰¢UGõƒGˆ• Äß4óp¼¸¸Ø|ŸŸŸ_&~µñçy ç—�V�ï ߇Q«¸þö÷7æ�FÃ0à8νÂìð–Dªö8Ø�ò†o»ÁR´ÿ]×111ØÝÝE¹\îp¤¦ÃøæÓ€ðÕ—?Áùñ0¼Æ¦ibii ;;;�Rbyy+++8;; ‹ßþÃyöy@Ø·ÜÖ~fw„gff°¿¿ßl Ó4‘Íf‘Ïço…ëÏ*µ€0Ýy„£Ñh`éår±X¬�ü–ûwöq¡PÀØØ4Mƒ¦iH¥R( m¤V÷u àRJÙ NOO£··³³³BÀ4M¤Ói4…ï1\Ïû.w]×jêØÜÜlžË[[[�3£½³Þ Ž'n8€s!c(•J�O*•J‡›®ŽáF:p!.y©Tz~yyùÙÈÈHŸ¦i¡WRªõ �…' ¨Ø7(¿zýÇõIž�a™���/ˆ(Á9È9�„q3¯’ƒuÌ\óÞù=)"õ×”IEND®B`‚qalculate-qt-5.11.0/data/32/000077500000000000000000000000001520501070600153245ustar00rootroot00000000000000qalculate-qt-5.11.0/data/32/qalculate-qt.png000066400000000000000000000031041520501070600204250ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTbÇIDATX…Å—ßk“WÇ?ç¼o’·‰ý¹Ä0kpi»‹±º�zÓÂ+8û'XV„Ýx± ·] v»›‰aÐ]UØ…D6ÙE«e›k7íJu¤í†±bÕþŽÍ¯÷}Ï.–¤Iú¾Ñ”Éžð@Þó>ç9Ÿó}Î99�ÿÙDÕ÷Žp8|Ü0Œ˜”rà”R¹;¼³uM.‘J)•‚­¬�K­X©Ù››³7²d€*�¡P裣G�~ÒÕÕµ¿­­ �ǃ×ëE×u¤”®ƒ_:È+zN„¶ec™f.�•7Y[^å·ÙéßÎŒ~9–šlÀëõvÅãñÏâñøÞ‡rÿþ}LÓÜNdÛX–åðÚŸÇÐ}¯"Ë4��UHI[³�Þ7»÷ Óþ|jòÞXŠÜ¬ …>ƒ{‰›››®³u2eÚ ÙTTÓ,è[ni07r¨Ío4 ¿ÛüÖûW×þ@×õ×·¶¶*fý¢&DÁ_0ÞÞÌðš¤ï0€�R¶T×9‰Ð××G?±XŒ³gÏ¢iZ%@½®†ô"¤ÖZPJéÕÉd’™™úûû‰D"„Ãanݺµc-”¨ÃuM"P^½�Çq™ÏÏÏ“Éd8yò$ÃÃÃŽ’–ÏîEM"�YàhJ)æççÙØØ¨�±žÑ«hkD£Q,Ë¢³³³F¾íÏn(¥×u¿ßO4edd„X,†ÏçãСC;Síb ˆç)pñâE¦¦¦¸téJ)Òé4gΜáÂ… îó‘-Ôà:g{=‡Ê˜¥øšض]z¬xvR@ßÛ@øÚ‡®«ŸÞ$}u ñÅMçP=˜Ûà°]Mµžcý‹Ÿ\ãÌé'¥™?W�z¬TÓ¬IúJâ¹±ˆÊ� †¡·´´�ÍfQjÇ)þRí?S@kò²çã#®qé+ ò<)­�¢® twwcY†a�L&¹sçÎN€¢{4|oïsÈM<À,ëS4G€ææfΟ?ÏÐÐssshšÆÀÀ±XŒ‘‘‘B€ZI³üÞw®P¶Ê¢¾¾>˜››À²,._¾Loo/Á`°zü]»+@$áÑ£GmËËËäóyöí«”YðNÂ¥¥%+ÚŠ÷Ãj°Ýü”Ç:*0::JGGMMM¥¶'Npýúu?~\�m÷ú³}!)u�@€h4Êðð0§OŸ �cÛ6ccc9R¹Õv7¶B€ …!¬â$„àÔ©Sd2™TOO===LLL099¹ P¬«“”N&ÀT6J©| @)µV¼�¦R)Î�;WÑg||œñññZ9ëä즰סP‚L&“Èd25ÿ€ÔÈWŸk‚µ|ŠU3•(,..^[YYyÚØØˆa躎¦i%B¸»tpÍÁ=é÷ Z¼üþ쯥Wnÿ…˜¦y{zzú+)åà�Ú[[[Ñ4­RK™@>Œîks܆¶mcÙ93�eY¬n­óëâÝä7ÿus*K× noo?fF§®ë¥”_aH)ý¸”9¾”iä«_*”ÊcmY¶Ê€x–ÇÜJæžþycíî/À=`µÀ4žByêZ_.¦ ny d‹/ÿį½Ö?±IEND®B`‚qalculate-qt-5.11.0/data/48/000077500000000000000000000000001520501070600153335ustar00rootroot00000000000000qalculate-qt-5.11.0/data/48/qalculate-qt.png000066400000000000000000000042731520501070600204440ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTb>IDATh�Õš[L”ÛÇßm‡D˜Q�9TAP¨‘pJZÎ`´¢Ö¤ñÒh›è“�ÆTMßÛ>™ødÓóÒ5Æxˆñé´&mlHHZIå(�Q4#ZPdèˆ30Ì|·>Ìå  Ÿßx¾Ñô?Ù™ËÚkíõßk¯ýíËÀÿ9„¿)ÀgUUUM�’$Õ ‚P+I’G×u©Ø‚ñÍEÕEPô´i,jFj:‰öæñâøðh*üx h«p¹\?¬¯¯ÿMggçþ†††zŸÏ'z<Ün7’$¡( ¢(ÚvÆ0 vF7áݸ—-Ó0ÐT C7H'S¤“ÌLG�ç“ãáÛ#ßüý¯s÷ÿ0“žy¼‚Àš5k~ÜÕÕõUooo³¢(LOO�ÇQUMÓÐuÃ0ÐuÓ43I*MÓøõØøä**%�mâ(bÞ¶à‘+ËPÄS üeàoOÿ8zóÄKõÍ}9«R~ ›Ãá0SSSy¿4MC[Hc(*†¤~˜‘N�E)û¬’_üäg-#Ñç¿¿¹} PEEQ¶mÞ¼¹{nnŽp8ìˆó9N´ó¸b?ÝøyЋ«29CMMÍ�g]4uÌñRA½ÈÊÖ×ü¨bk7d‡�,Ë­¹qî4–÷¢0TÊ™Z¥r+d H’T¯( ªú�ãÔ N3Êe7nѵ²CH— X·àóùØ¿?‡"W×årqðàAÚÛÛ�óÎdQ7d#`š¦bE`ýúõ477ÓÑÑAOO###LLLpöìYššš…BŒŒŒÔ-A�Á¤,O@ÙŠ@$!‰�Féé顳³“`0È•+W˜��uÐ5{EQ@‚첋ÑÑQ’É$`llÌ–ó™Þwðefì™dz¼(º® …(//çÎ�;ö”{Pp<E`ii �ÇÆ ŠU- Š" ™ŸŸ`ëÖ­¶õJûjjjØ´i—.]BÓ4Z[[«.æ>, ”——søðaÚÚÚ8vì7oÞ$•J …èêꢥ¥…mÛ¶Y?ÁK•¢ 7nääÉ“œ:uŠ7näŸÔýýýøý~Ž=J¿•‰RûŸ_NÄÓ§O9~ü8ªª¾ÕË ‘H$,�_•”KB Tتk.¨èÿ]XUnI2³N!Øu¾Pâ)Ík©ýêç¶ôSw^1sn`…ÍÞK $Ð ŒXÊVU#a½À,=�!PGg‰ôÞ,ÎF¡Ï|¥XÌ-·'¸ÝnyíÚµ¤R)G·“º®Ã ÇÌÄG‰Àòw'mÂ'ʹ¥šê?í·¥žþW˜¹ß.[8¾cï“ÌB‚,"®-³W׫XÊmE‘îîn:::H$x½^LÓdpp�X;ÀÊ$֟ŘùÕ-;Mc.ª+†_QCÈårqîÜ9ªªª¸xñb~ÓÖÖÆéÓ§æêÕ«E%¿™ÖÑþ³]ß ï]�ž8q‚ööv._¾üÖìñãÇ\¿~�]»vÑÛÛkiã“-§Ýn7;wîäÅ‹Œ��¯�ß»w]×Ù½{·%�R2°$à÷û‘e™×¯_”ëºN4Åï÷[pï>Xæ@n÷eu¤.sss«ËYöï‹åö,#‹Å˜œœ$”»Ýnª««yøð¡ƒî‡÷&ñµk×X·n;vìX!Û³g±XŒ[·,¦ÄRíh–0W™ëêê…B\¸p�}ûö ó²#GŽP__Ïùóç‰ÇãÔÕÕ­âi^9äNæôBöîÝ‹(мyó†'OžÐÞÞÎàà ­­­Ÿ¯yûöí›*++YZZÊhJp[Î ‚KBp‰ ]A@@À%!”+ÄÒ |údz¯g¿ùˆç:(¯,Ë]MMM§¶lÙôûýu¢ËåBQ$IÊÜŒùWƒ_>ßL�R‰W´·Ó Ý00 �”ª²”JMÄŒÑÙW“·_ÞýçŸg†/'´Ä·À»<@5ðz½�µµµ;$Iª‘ey�(Šå†a€˜½|ï‘´išâçQe‚¢+‚dFSK£§e0EdC3ÔŤ‘žIšjô߉ñGééqà0 ,æô M;PFæ_+ ™<)Í3©ÌeÅÈHgË[K†ÿc~·blëû•IEND®B`‚qalculate-qt-5.11.0/data/64/000077500000000000000000000000001520501070600153315ustar00rootroot00000000000000qalculate-qt-5.11.0/data/64/qalculate-qt.png000066400000000000000000000047531520501070600204450ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsÄÄ•+tEXtSoftwarewww.inkscape.org›î<tEXtTitleYaru Icon Theme TemplateaŸÛÊftEXtAuthorYaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu JamesE¬ƒRtEXtCopyrightCC Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/ÃTbnIDATxœÕ[]LYþnUuWÓtJ3ŒH#ˆd™>ÀjdWD2‡˜l|Z�<¬Y]7úâÄd÷͇ Dƒ1Æd&qYãšl6»c4a£‰Jˆq˜àƒŽ¨ (ÿÝÐ@Q]óÐÝEÝÕÕôOáGn¨ê:÷Ô=_�{ï¹§êhƒD¸þ±@ w!”�$L '¿¡ýUT,7ˆòsôèÑ2›ÍVÀ0ÌF)R(ŠJ‰gKGªâ©‚,p!œp/�K“o¿úþtÑ_d°” ]]]�¹cÇŽ¿y½Þ/yž_Ïó<A€,Ë�$)®�€Ó/÷ •ba¥,0&>JiB3 ÂÒ€�™œcŻ߾þþë‹?üc€? �;T~~~jQQѽÁÁÁ’D Š B¡€’"G® ¢ß×çEßù(2Sêr,{š×½ûÑàOøE(€©®®>ýáǤŸL(¢ j€ûìBñŸÿ߃'€Ïíá?a<O�¢„0B’Xöijïr£<-ËòçIµÞXÓçhøíV= ´´Ô&IRš� 7ï&¢Ð"I¯ß¼+Ë»€Ýnÿ4Ùîod…üÖúÅ'ð Î;‚ Äu~× BüOÇßO“–§-�ãàiФ§2!(//Gii)rrrðäÉ\½zU•ÉÌÌDcc#¶mÛ†¶¶6ܺu+®Ä I1aYMÓº°ÛíÈËËCWW†††À²,víÚ‡ÃÈÈÈÀ¹sçàt:Á²,6oÞœbB*aU[Õ. w™Áƒ¢(b÷îÝ „ ¤¤8qâZZZ088ˆ¼¼°8ôé&Àn·«ý}ãÆ�Ø¿?Z[[o߾Ь¬ pèÐ!pÙ|’ü<òëšÌf3šššÀ²,z{{‘––†ææfx½^¾(²§§åå娯¯ÇÖ­[ár¹ðüùs½ü] I8ŽÃ0ÈÍÍEKKËŠ·½½²,cýúõðz½¸yó¦îF9êòI’pöìYäääàýû÷ày~…̳gÏpæÌB0>>®Ûx£¡;âyo޼є™˜˜ˆºËûg0ì'¾€¥2'j�âÀ \ß< /@/Æ)Ÿ0Î4˜>s¬¢¢þÉÍp´ú'$Wñ®@”u‡Õ† ÷7�àÖrå8Àx4] ñP  (Š˜Lº²bq…Áö/`³Ùh›Íf@Œ…á]`Íx€¡Ãû»<0[ÖE­NžàÀýû¥.Yà ÐòKM>,µùQë_NaAƒ€`£cÎ}ìˆÉ!°Ûí0™L�'ꤨ–pß>ÿŸ_¢n—<'$6ÊÍÍEMM Š‹‹1>>Žééi8¬[·½½½hooÇðð°>e ˆ¯ÝÀk÷jš¨{D�š€ÚÚZ8pÃÃÃhnnÆØØ˜z-??���(++ÃíÛ·ÑÞÞ­ú¤#ª1`ïÞ½8x𠦧§ÑÒÒ²ÄxÀ—ºxñ"xžGCCöìÙQ§ ±Uàp8P__¸sçæççCÊMMM¡­­ ÐÐЀôôtmÅ3 ›€ªª*0 I’ÐÕÕ¥)¸n2™ÔaxøZ•Ì¿UPPPÀ—ôäÃÁår© Q§Ó©÷†@7V«B¦ÃB!@˲šrÁ^¹fs‚077`‘ˆH¤Ðgff´�X Y­ÛúûûøÞGz j±XT^½z¥)kÄ”ÔO@GGAÃ0زe‹¦ìöíÛøf„îîn½·0º p¹\¸qã$I¾}û@Q¡«²,‹ÚÚZx½^\¿~¢(†”[+ÐE€Íf!OŸ>Å•+W°aÃ?~YYYKäœN'Nž< Š¢péÒ%ô÷÷Ãl6kv5%|œà5¥¥¥(,,àû âüùóèëëS£>Œ{÷îáÂ… ê÷A•••Èɉ>·Ÿ,Ïš¾zêÔ)ŒŽŽª_“Ñ4½b„OMME]]êêêø¡ììl455…ÕkÄ$À)‚j«J€,Ë‚V%š¦Wç=;ïÛö²‹× éÚÎÃB !†B¡ Rš‰¤J“6J”´RT¥_š&ª|ˆÚJI%,Uj©ªF4¤mcHÃBMclÃÚûš}ïÎ{æÎ½sï=ù°x‹‹Û&ê‡{]Íï뜙ùÿÏïžó?çè\H¢øk 7€ °–…/ÖsÁõ‚Ìßv¸BG@ÀtLG@ÀtLG@ÀtLG@ÀtLG@ÀtLG@ÀtLG@ÀtÌõ-@ˆ #ø?£À¯ƒbš(±Z:�l·Ñóy|ÇÁ^\eçYò ¤ïê¯Ìu!@�Ç1zzˆ��ÂÙØÀ·mô|žæ… ¸Å"zOæÀ^­†[­b/,àV*A‡þ¿zJ4Š98ˆšH D£X³³ (h]]½½8ëëDGG‘®‹Ð4Œ¾>¢ÃèÑ(Òuiœ=‹ï8A§ñßjZ:Mä†ºŽžËa¯¬ -“¡ñÆØ…j<ŽžË!|=Ÿ§57‡[©�9~£¯�ò¿ÿ¯V :�kçt×D€DÏåPãqbcc´pËeìB�ÈÐñ›oFèúN{)©ž;‡W¯ã–˨ñ8‘¡!|Ë)‘²½³Üai¥c´—èM°ß\Dß“§væ �™™ÝâÚÞÞÆ-—ñ[-ìåe"ÃÃø–…½ºŠ³ºŠšLC‰˜X…Y’ÇoÁº0‹s~5èÔÞCè–¡JOŒÌÇî!ûñû‰ß}Ñob-¾½Ûùð›Mœõ š—ßFËgqÖÖpÖ×¹²(õj5¬¥YÈ "GGÈ>ò™�݃Ò :½÷ætïFÄtÒÝEdd„ÖÒ‘û1öö‚'‘@ìÐAöüîÃ¸Õ ž[£ï ¿Göá{ñ¼:Òm“ÿÔÃÄܑԲ1ì#zó�;¿52Bú¡»1=è4¯"ÚË—¾ŽÈˆ” €WnRþÁót=ò!„ªá–Ê$o�Àz}–ÖÏ/ƒØ}´«�5ŸÀéÞ/Ð.l#t Ùrh¾zž�’ Ñý7’™Úsøµ SB4 Sï;´fæPÐIL¡þò Òqÿ³�¢¢šQü†ƒ,{´‹[8ÅMä¶�l:(‘BQwÛKÇ¥þò ‰‰#(è´fæðë ÍsŽ t™Ä'Çñ«-’ãGÑögp*k;ŸE ¤ë¡¥ÒD÷ ãUêøËï�™¼{÷øÁü`/Êw£8›+Dú÷¡%SøV¡íÈhW¶HÜò›¸ %*g_$>9N½ò2`�z8Ãý$>pÕI0øé¯P�ù…Ïᮕ‰NÄ·Z´ÎÎcoPú"XoÌQ>û”X¤�oÙUCID±7—ñ "‡‡Q¢¬³³4ϼIösÇI}â ÷WxFgv ææ‚N=„¢ ÆâT_}…ÊÌ©ñI¼¥Òséÿìçð\‹Ë_øœÊÑÔÊÏ?‡}q·PFJ‰Ö—ÂÝGþ‘‡h7¶�ŠOß~U‹1ûÅ?Æ[j�¿•ÊÌÕ×_!õÁ£ŽÙ7QD¼¦…>˜£vù ¾×"yx©yxV“øèæÁA|»�[®á,¬Ó~{¿l#+î¥íÂn©†o;˜‰�Þ„g5‘šGòð¾×¢vù ú`¯iAD�œf‡b¨ñÒ÷Ðòœâ:›O=�gÕPqæÿìÏQ#Q¤^£Jëâ™'õGGi\<Çú‰ïᮕ‘-—Öì<^£Š×lráÑÏàµ,ÔDϪ±ùÔ8õu´|é{¨‰plÊ0â½dŽCuãÙnšKoamÌsÃ7¾IÏcŸÄ)lã­”Q{’¨ÝqbGÉ~ä>º?ý ú¾þyÔ|¿ÖBíN ö&ñVÊ8…mzû$7|ã›Xó4—ÞÂÈv£ºq2GŽaÄz‘!8 | yñMð ÿÑÏ£ÅSÈv›ÍzšòéçPâ1àÛ^©‰’ˆà{Öê%ͤû�Gp.-Süá�Q¼bßö€W±(Ÿþ Ýÿö|ôa„®ã6ª4οNó­7 C\@{­ÄÖOŸ¡|n Q$޼Ÿô�·³uò$å|z·�‘èÆŒÒ.¬³ýÃA*ÉÃGÉ<ða¯�Ã4°‹»í7þöèºïé;o§4õ<õ_¼†ÌJÜííÕRÐi!˜‚¼í:­…yÔDŒÒôiO|‹ÍN¢ôÅwÛ 1~„ÔømȆ‹_nânUØ|òû8…5Ì¡Ac‡ˆ�½ïêûâl¾p’Åߢ4}5£µ0�Wª‡¢‡B€[("4�ØøZ® T�Ö›AÝ“!HÞq”ØM7¡(¹Ä]©¢Ø¢¡"‹>z,‡Wªa ’˜8Ô=I´ÞÌÎo庈��!4 ·P :Ý]®³»ߒ$f�}ì>Ì�AœíUÐTÕÄYZ�uAÿïÿZW|'l!@¾º” ªày (¸¥Ë�ÿ b@ÅØÛ�ïÙàz¹>ìåÅ¿ÿ7h:¡xK25@6ªÏNÓóÅO¡Èz›üƒ%6:†5w‰ÕÇOP=õÒNc!ˆ aôô }»PÀ^^F¼sM%uüvÿô+D‡o¤ùÖ¶žy �¢$MªÏN#›Nf Dü­&f×>zïÿ ‘Þýàûl�~»±Œ:œÆó,¢{GðªU|ÛÆÙØ@K§Ñ’I¼T 5™ÄZº„:œ¦¹v¯V'σdï¼�ÖÚ¥—Não5ƒNó*B%À+5Xýöã(_3¨(/R™~‘Ê‹S$î|?ª!yÏ-° ɉ |Û!P ƒè�QZ‹sh³)¨þâêS¯Qœú1éÉ€ï³úíÇñJ� Ó¼ŠÐÔ€+AH@Ì’ºc_?Ši 4é¸ÄGÞ‡õ³ØóìÅeð|PBUл÷9°ŸÄ± ªoü¡)H×÷œÅªÿ:M»PÜ�zÂò¦|¨FìtŒ[(R=5MöÑßBMDR'{ì^Ò¿qîdkn–öÖH‰×l‚/Q"1œ•5"©!Œ»{)¾p t¿Ú¤zjzg•tr× 4ËÐÿŠ»X¢zògx‹ rw}„ÄȪ/MÓš½Lëâe„«=„™ÀÛ®Ñ<{é¸E#}è²·ß‹7W¥zò%ÜÅplº®EèFÀ.¾Ä:?�=û=¼åÙûïEˤi»mŒý}H§MýÜkȶK|baè @‰™l=ù4Û?øg6O>‰ïz¡|ò¯^¼S Úm6žø>¥SÏ’ºí6¼Z£¿�vqköm@ÁÀY]G‰F©LMÑ.—„b³û?jW€[.SüÑ�vV=º~Õ}O{¡€Ðud»}Õw®B[Þûv½×ºlûîοž¸~ü?¥# `:¦# `:¦# `:¦# `:¦# `:¦# `:¦# `:æ—XRg.[Ñ?†%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:11+00:00~/<tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ALL.png000066400000000000000000000040631520501070600173150ustar00rootroot00000000000000‰PNG  IHDRZ@­;�ÍgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<|PLTEä å æ ç â Óã ÙË�iŽÄÜ´5¯è!¦«„;P 'E ®1¿¼t~hB œO ˜ØÒ¨s)3Â4\ ^ ǪX  ÝÏ�Ì»C P °Þ¶º6ÀÅ|*Ñà(àuÛé!ƒº”†–w¾ß%x½‰+> ÖK   ‘«É§{È"G Œb Ê€g&'õ’9³] —¹J ·` 7H M ›‚­×zœÐ.¡q¶Y R 9‹/¥? ¤: Ë�A ¯è!Y Ѳ2S Íê!�[ •f L H _ Õ@ yˆvÙo<’ÆjÁ”�™±8a  I „ÿÿÿƒS«ÄbKGDÓ—ßž& pHYsººôw0tIMEæÓ¸UÛzIDATXÃí–éWR[ÆÏ X*D(Bbš$)&…•Â$ É1ÄE#sÈ s£4©LÓR ´h¢Û53óZZš TšÍÓ_t˜«»î¥ûa/ýp×åù²ÏÙë¬ßzϳŸ÷œA ( ÿ·Ð †ã8æ÷–D"ûXÁK–†„†Q‚|{”°Ð�¥K‚}p2)ŽŒ‡S—Ñ”¾œ±‚ÉŠb4”ÅŠŒ`®`,§£m5‡CÓ9+£i87fUlÜêxÀãï@æó@üê¸ØU1\œ½’C‡C£Á R°K®]'ˆ%&¢uk…‰ØA$H†t#ÅJeIÉIr¡bý† ”§¦Ê• eÃz…PNlˤ±$ ŽŒ¦¥«6ÆlR�±9S³%dmÝšR¶h27g Þ³Q•žW5¾Mªdë¶srróÈÏ !/7‡Øàl×e ´Òmp^#…;DL}ZCñNàÓÎbƒÖ»院…�†$»vï))5 ø²rùZ^^O,ÆÒ’=»wI �†„ï5í+«Øï#æWVÍ¡«*ó}ëþв}¦½�¹F«k8ÄɵÀ�j“Å285ÕÐá;xè07Äìmá>t6|X�¼âH=UÝàÝ ¦Ö©�×Á±±F±´é¨¥ù˜?ô±fËÑ&©¸¶gHÑV]³ø•²Yg�&AZ�’Ž×Ÿhi5�ôG>ijm9Q’�µÙÀ©ä0‹ÿc´„%Ÿ¶6HCȧÙgÚmþжö3Ù‚ÓdHCªÏ¶±;´�-JãßÁFeK‰¶ƒÝv2×ø¹.iQ÷ù ¬Îž^»±kÛe´÷öt².œï.’v�ƒüx8F£¡�0ÙãD=2Îf0ЈÒhcŒB6zÞ°©äÑ㉉Éî'SæI¤ü©÷Ÿ–#“æ©'Ý“�•˜†ó j~ÆxþÂÓÎkz™IIå§½zíkxóëWiüTJæË&^»çÅsÆ3È�ˆ"¢ÆÃuMMsI3ž¨7sÙ{å™!q§§\\OM„2 Οvs©Ä5:;¤~[êû%4”¾UÍŽº$Ä¸êžæC6#‚Œ|Åãê|÷¾5΋Žk}ÿΉ"¸¯\Ã,ùçøŒ} êM#^ôˆIOý€ýãx¡ƒ?9>1›¿|v|ú8¸ÄŸÂœú¾¯2Ù×>}‡öì~¡‚þë7¾Ygú!‡±_ ÿîõúû8t(þÅ.1«¹ ìÆ¶[&s/ A)v;eAÃñ—²gg§hoÝ‹Ts@ôŸÕŸ¸)R£|ì�+%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:06+00:00s,tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/AMD.png000066400000000000000000000006321520501070600173040ustar00rootroot00000000000000‰PNG  IHDR€@ øbLgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÙØM!n4¢3 1£V\gñ¨ò¨ÿÿÿ"Y"ÔbKGD ñÙ¥ì pHYs × ×B(›xtIMEæÓ¸UÛ?IDATXÃíÌAÁ­ ‚ *¨ ‚ *ˆí¦Àwòv H’®¢†h!zÈÀÀÀà]0BÌ+Ä|vú@=Þ½I‚%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:12+00:00?–5¡tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ANG.png000066400000000000000000000075621520501070600173210ustar00rootroot00000000000000‰PNG  IHDRÀ@LlxßgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs  šœtIMEæÓ¸UÛaIDATxÚíœ{p\Õ}Ç?ç>öî{W«Çê-Y²å7Â<ŒMì@xdˆI i'Íd L›¶iû¥É?¡“a �$“Î@KB€�´& ! ÐB!åU0Pƒ�±lËÆÆ²-ÉZë-­öu÷>ú‡dcù)˲V�ó™Ù?´wuιwÏ÷ü¾çwÎYÁò»]$Ó�ãRWåå¯Ç =þsr!TµÐ­šw(…nÀ¼F_Ý@ü?÷æ ppåx4�H„À³úrâ�?Bø/nEƨ$Ó‚@¡ðµò8%÷ý€’ûîA«¬Û.tËæ€ Íáñ¾íâ�=Œw­´DÓÁ„ÐXÃëÑ ÝÞy�wõåÄ“–h:˜� ]åŽ[ÖÐXSŽ‘¦i‰¦‡Ó ÀuG;»íP[áæë–påÅ5`;£ï;î1ÿ*¹0HKtá9¥¼†Fme”ÚÊñ0Ö/¢¦<†/.¢®6FME„úê(Eo¡Û?/�–èÂq²©wG-Ï·n^Å7o\‰¡«DB£ý+ë±ji›·wrÏÃo10”! }sž£–ÈX±œ�Äê< ráì¼Q)»úžqïÈå,>ÜyËv¸úò”Äühª‚ß«óâ›{¸ë¡7Ø{°OvþÉâB4ìå/o^E44±H*T£ù"¼—¬"ßÖ†ÕÞ1vA~“åÔs!H¥óüì©÷yðWŒ»ôî–ƒÜñ“Whk�¾@HK4uœ~,@ÑU–5–к¿‡t&OCMŒXÄWèvÏ{d–hj8½—úŠ(Í‹ãÜ¿ñ=®ÿë§ø›»_$gZ¬¿´îÌÙ™¨˜d–èü9ypëblkíâ¡g634œ¥åÓ#lÚÖN$h°û@ß)û¹ß«³¤¡„îþT¡ïmf3‰9ÀéЪªðéjÜLs÷Èç¥=� §�Š`ÛîÏýO+¶ã‚"@|¼«‹ç^ß�{ªîï¸4Õó�·®ÁgÈUãéDZ¢ÉqÆ•`ËvNI�m;§Ž´®ËºUµÜxU�51¹j<ÍHKtîœßnP÷ø—‹ÇйþÊFâÅAÖ_Zûùjññ/ÉGf‰&Τ k*E/‘�A8d ¬l*ãò•ܰnÅÅÂc×£áÑÏ*Ò›NcãÎ)‘–hbLΨ».¡€‡ïÞ¶–/¡EÇ%4ˆ—¸nmøåmX¶ƒª($S9ûíž}u'Ø2œV~3µ ;õØ}(¾f´à<¾FÄqcÚQKäY²˜¾û~BöƒÍ£–VBÇ8}èLA&›gǾ*KCløbõUQJŠüˆ±‡«k*¥!ªÊÂd²<ù>¿{myK†c`RY +›eèð›¤Ý ý#’ïÐÛÒCrÿF:Þ&›:‚'\�æ �û?™%:=â¼Å».Šªpó5K¸÷ökŽ-šŶ^zëSîúùìøôÈh&I2ŠãRWåí�ߢ®2rÆ�Ú¹,‰­ÿGÿÞ÷Éto+…�7P4‡ÌPx)4¯‰^´Éj"õ‹ˆ5-G÷Ž•ãš&É_ÿFî%:ŽÉE€£�ëBëž#x �Ö-w¹o0Í_Ýõ´´&@•§/Çq¶à8؃ƒ(†�Ðu„×Åx˜²ê͸¶F²;†e €c«„K©X~€¢Êhñ‹ðÆ.E3 Täó£eȽD'1%ÉzÕи|EÕ±¿Í¼�GW)Žúi^\Î'­]…¾ÏY‡ë8 <ð No¾•+°Õ,NÛ>Ìþ<ÞîÃTeûЈ*dwèøv'Q?2q£ZÍf´Ê ²G lo!ú÷߯{ÅêceÍ <ð¯$ý[Ül”ù9@�¿Æ~ßfÝ%µX¶Ã“/lãÕMûøÎmkY{q 7¬[ÈÓÿµ}t1M2a„¦¡h;>ØÎHk%ýƒ¨vÓ×H:ÆU ´¹#7ÂP¤œ¼æÅ×9„7�DÉ·’v2PTFÃ@ÅÑèIåËíÕcÏá¼KpÝѽAÀ?üøežx~Ù´ÉûŸtp×ß]ÅúKk©«Œ²ÿP¿œœ#FCGÊcüà†*–ë KÙ›ãñ76ª1ïÆ?ÔÅ`ýeà ¢åsèÉ~¢ŸÑ[¾’â#4½ý$jYÙ)Ë—Y¢)øYEWQU…?ÿÞïyä™Éæ,Ð:º†¸ýÇ/óÓ_¾KUiè|«™—¨µÕÔŒä©ÒB,­}ƒpì1¶dgÐ$Û¾“Xª•º’<ögÿK&›&瓉D©[VO*"ÚÛ…¿,†ÏXÏ|^8;ïàºðôn'—³Æ�ðŠÀ4mž|ñ �*GÿI Æã„œKÅZ>J‘M¿ÃÂðMõÕ½Du‡áþ^j‚Qö»Ž™¥Ê`Ye;öôî:€QGhgÿšç«%š¸äòö©;øØ[9S®BN%ÁëQ‰f<ä¢×‘Ò–±8x-�ôËŠU¾ØŽ�£xÈ&tôäý6$ò(¹$þ®ý¨Ík&\ß|´DrËæ Fx t]CÏ$© ~U¦*sˆ‹ckV­&V\€eY4¶îæƒ} Zí2:SQ´p1AÝ‹0<ç\ï|ÊIÌ`\ÓÄ1ó8ºŽ9ÜËzßʃ)Ê¢¥jï`ç®V¼^/¹\ŽX¬ˆjÃda8Í+‡’ ‡à¨*n&;©ºO´DvçaÄ\Ë‘˜A8v–T÷3¨ž8ÞØµØ=½¤²yF¢¥º†ßÍ044Huu5‰D‚öööchnn&›ËÁp¥¡rU�áh)ùÇÈ¥÷c¿Žæ¿ _xÕ„ÚsÔy—-á³ïÿˆží»bn‰@ `aåzP†ÿÛ䃯bº�>O�‘h)8&¦c!òÝÝÝlÚ´ Û¶Ñu�\.‡ã8ƒA4UÁv,\MÐU¿”ô–籓äRÏ¢ÿËú>nxçâê?Ô*¹+t{ÂKQæX2C `†à8©ÞgpÒGPŒ‹ðkQ2;vÐSREÎëGMÄÎŽÇQ…êêjðx<ôõõ1<zÓ¥+þá(8É´¼ €+”cþ[UU,ËÂ[°r×uB ª*BUqÇAÉe±z{ð…—‘6®a{[9ëÌÛ¯7míàß}�GŸý˜¬i�uþ¹‰Œ3E5èK×s°£�æŠýíZ”H„Ú–� &PäMR__GYI1¸.ííìhÙŽªi £k‹—,ƶlÌönB# ªöî%<Ô‡‰âº#Xfº¦áõŸ² ¦ióÄQËÓ5<'³>'"0CB#RÔ„r𠆺_£¤öø¾|=Õ¯ÝÉ�DûU_âÓÌBZÛX/y½Œ�äQð£;´Ö!´\–@rˆÕ[ÿÀÒwÞÄ_S‰qéeŒôn"›ÚGIQÝ»à¤úO²<ó óh¸s7¼Íh\pœñÏ>\¼Ž’èSt%Z)Ol$xÓßRÜÛ‹þoOPÿ«ÇH²Þˆ¡ÒJö¯\K_y=M¿Eüàü#ƒ™þô0!ÛÄ»´‰Ø�wB©Ëà®GNY”U^Œî«W玲ÜùÀ[¼»¥„˜Ó–çD´ºòáB·a^â8.5¥šúùÆ3_ø"B%×ÐÙóß´íþw–j„¾}+� 7b¶´`'؉.òaµµÑü܇¤mˆFüM‹ÐªV¡— ÆËÑâY¹ Û×K÷¾¢««•Ú¸F¼æOQ”ÑÕáqYžybyNDìûdÁÜ›ÚÏ\tO5U Ï¢yŽ;L”ÞGç®ÛéìÚ‡ÏШªZI ô�ñ›Qôr4½ဓL’Ûº•\ËN_½½¶4ÛÍcçعvRýïÐ×ù2ƒ�¡Q¿èÊîD(Úi²<ó‘?R,PPëТ/�Z=j¡}÷OéíþˆÁX\�¤¼X%cU B†ºÕ¨@ÕC€Šë˜Øæv®�LÿKX©÷8xD�Îd±C44ý E5w ¨�Ï-ÏÖv@Ìå½ngEä%RÁA¨µhE/!N@Þ$Ý÷ }‰× ˆ÷ê‡0óÃ#j€þT©\š¦ Š ±@º2ˆifIçtö'J))®%Rr áÒ›ðE×bæá‰ç>™×–çDdh†¢{¢D*¾I8þuº^`°ë‡xµÃ(JU ÓÓï!ÑŸ'•Õ)g-èÅëË£ªBx©«YF¬á~|¡F`þfyΆŒãÌàx\×!ŸmÇÊìÄÉîÁµÚ±Í>\'I./p\ƒ`À�¢•!< ¨Þeh¾¥hž"àYžylyNDF€Y€ __°××µÁµ„hE·ÉMfyÎŽ¦ ƒ ‚sÚ•y”ÑCZ*pú#‹ÒòL í@"\è6ÌS4O�ê�@›â£·óyaë\Ñ®ûÎ× Ý†y‰ã¸ÔTÄøÍ¿ø©ŠOM™Òòœ;ÚA ƒã‚IJ§¦“JË394ä 0E™šg/-Ïä‘Y YŒ´<ç�À,EZž©A `rÒ^iy&�À,BZž©G `– -Ï…A ` ³<)€Œ´<)€Š´<ÓƒÀ DZžéC `!-Ïô#PhÆwiy ƒ@AàÂ{wð½ûßäÝ-ÒòL3RÄu]~ÿÚnzz+mírÔ/ÿ\)l½zƒ ¥%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-30T16:08:54+00:00šÃ=IEND®B`‚qalculate-qt-5.11.0/data/flags/AOA.png000066400000000000000000000046001520501070600173020ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs$é$éP$çøtIMEæÓ¸UÛJIDATxÚíš}lUåÀï{>îgikËÊ—@©àP¬&ð+Ü Ë\â²¹]6�û@—�ÌL7YXÔýµ%þ#[2·¹E]œ�L�Ä�¬**jKÖl ”µ”¶ÜÞ¯óñ¾ûã\•)2pÁ÷ÜqÉI“ÓœÛç=¿sžçyŸ[±«±MSÃÒtç:5†© 0LM€aj S`˜šÃÔ¦&À05†© 0LM€aj S`˜ÿPÑOaE‡+çcŽm:€ÿ v“ÆªÓøƒ‚L{@ýJ�Ü6—ñWmÂ1a:ÂSRõ´‚†•M7–ðYÈ”&ÙR•ÏÐ#I™4â)©zB‚3Yá¶(œf�V Àak„ ª¥%4³º-Õ´Öt™Ê MLWȬFX “‘€T›"1]ŽWy¨¢ ”±’ ªö;a 2…® ™Ö¸S™õ×x¤.£÷[C8*°&hJ}‡ïKSì¶b#¡jß­ þJŸÄùŠÒ^ |�TRè´Éíp ŽI3V�FVÊ€}ž&8&É¿ŸÌ[µm¨p nI@Ý’á"J=‚pD0üh‚ƒ?JSÜ]yÚ„Çã¯ÚQ‹ªK@¥ß×8ÍŠÔ¼€Ô¼§YE…·²@D+Ë¿isè§iŠ]‘«AÓtC+Ÿ¬[5 Òë×/÷*7[àLRL¸ÚàøVÿˆDØÿ¨dl“K0,@D²ô¼�ó×åq¦*tŽmH  ‚áÇ„£Âh=¨Ž @—2 ×y4¬ðIÎŽòˆ��j É´`Áñ-.å>ë½K%ƒ@vQ”®ÒŸ É\PÚcSzËz·k2AÕ¤ ­ ÷¢Mÿ]F6¸hÿ„ßù0²Á¥ÿ® ¹m´zßÅÆ6»ºìèfk.Ô-ó�®ÙuU�ˆ ¬7 Éu8èç>rÞ€Œ6\¸‚1ÁØ&7ªÊû$c›]ãó¢ª lÈ.ò‘.Œï´ßi#Ýèœ8Ew)äwÙøG%B€ö…Ýæ;¢ø4ÄÿaG©Æž¨HÌV ý6ÁÑ?D ~ó�%Ò—„ØÍŠ`èCvº‚A�w@âNVØ£ñEaØ:ù[ó1aÝžjZ[i“cy Á®×Ô¯ð)÷Z¸M¯Ïbtc]è² °Ë!–è’ Hñ!Ÿ ÒóRsCÑÆL ðöYHC볩ªY Ñ¡ yfȬ[ÊäG4}[%¢O€8!îxA dˆ&Œö'û,%H�i+õ£á³>ã9ÍáçÌ­Ïþfî ¹¿~Jsóä$ ZÒdo+°¾oœ—:}lyæÍ{¨4÷øi¾C’°üÝϳ&7dl+`Äü ðS 4LmÜ}o’[ïñéìþhq;u:K„ðÇgJ<¹½Äƒ÷ *º #C ?¥`Á<‡_ß7�ÅíÎN*!h�f!€ñ‚ægëó<ùײѵU…€W:}úB¤B[«ÅÝßΰrÙ™í¢¦N’´Í´ÑÀáÁ�þuFן ªB@ï��‡Ÿ(¡ÑPÍdÓ‚oÝ�â–/¥°O³™^ºÐer‹D)pÁ§ç;X[P Xk6„Ó£óŸŸh²˜?ÇÆ±aj‹E¾Ó&YÌšnѵ'¤Tþðm턬`ÝfϰP Zš$ظ¹Œ2¸®e¶ïô(ûpál›ú¬`òÄèiN&—Í·é= 8:rò´òÕU)nûJ)A ðx`}�Ý{£ëªIxáUŸŽ]>ÙŒdæ4‹i“$™´ _„Ï\ê0^мµÿ?ç ϱùùëhi’”}øÕãEž{Ñã±§ÊKf‡Aãã¨�F2!øÜ•.«oJsy»CÉÓ¼Ò0r\±m§ÏoþT$—×Ìžañк \¹ÈAO?ïñõ5cäòñXv¬ß€ó$­Ó,†Ž}0­!t÷†<õ¼Ç¿†|Ò¦ýB¥¢|É\›þÅ�«’|í I02¦YóÀ8=oÇç;ÉØ H&뾟eíê hÁÞýáIÓE¡¤yé ŸM;<´\~©ËôÉžóçÚtõ„t÷†Ì™es^ƒ`ÿ¡�m;ã³ùŒ­€/>ÉÚÕYš%W/vYºÀ!á ryM¡Áûjg.{÷ìÞÐÜ(YºÐA hœ Ùw(dã–2ãÍï7–9Œ�kz÷‡ŒŒifL±xf›GWOÀ³Û=úW]æÒÒ,ñ|XºÀ¥wÈhÎü³k]=!ovø�æ¹ÿ¡ÞZfb“äâ9–%ذ¹Ìí?Îñà#EþñVˆëÀsãš0„®=[:<®`q»ÃµW$˜?צï@ÈÁ#fëA¬SЉØVhXé ¯_‘`å²Ïn/¿;Õ´*ÿœ¤Ó̦ׯHðÅå –/IðF·Ïýxj«Ù‰¨>׎tJè;oNë�ŽfÝ»µY_{…k,–ا ³�ÀËoúd3‚e ].jsøÛË#c2¨ŠqôÙ@kxðwE^éôi¿Ð¦­ÕÌ\ºjjÀÙ¢m¦Å²E.·”O:ò8ÛœóLsΦ ¸P`˜šÃÔ¦&À05†© 0LM€aj S`˜~8˜îõ¡pŒ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:48:19+00:00ÈoêëtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ARS.png000066400000000000000000000021211520501070600173230ustar00rootroot00000000000000‰PNG  IHDRf@ßôò{gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<‰PLTEt¬ßu¬ßÎâôÿÿÿÿþüöïêøòíêÚÊïâÖîàÓêÙÈøòîöðêûøöñçÞéÖÃêØÄáÚçÑ·èÒ¹âÛëÚÈèÔÀñæÛú÷õöïéóéàáÞéÓ¸âÅŸäŘ߽ŽåɣᾊàÁšë׿áÄ¡ôëãú÷ôôìåàãë׽ߺ‚Þ¹‡Ù¯uÚ²{Õ§iܵ~Þº‰çͬóéáòçÞáß޺ŠÙ°wÕ¨lÇŽCÆ�FÂ…8Ë—TÏ›Vܶ�Þ»‹àÂ�òéá÷ñìçÓ¿ëØÀᾋܶ€ÍšW¿/½xÈ�È‚¼vÁƒ6ߺƒêÔ¹èÕÂøóïìÜÊÆì¨ ö´¿0Õ¨mâÅ ëÙÆøóîëÚË̘ܵV¼vê¦ è¤é¥ç£é¦ ÇŽDÙ°vëÛÍÿþþþýüïáÕèÒºåɤըjÂ…9È�ó°ÓŒ Ø’ Ò‹ ò°ÆŽGà½�èÒ¸ïâ×ö³ò¯ä  õ³ë¨ ÷µàœ à› ï¬ É‚È‚Ú±{y¼)bKGD Lò pHYsÃÃpMBtIMEæÓ¸UÛ‹IDATXÃíÖÇV1€áÑA�"½8 MŠÔAah@)RE±K/£ØÁ®Oî+˜EfC¾ý=ÿ"9ÉÅ0AA¦Ú #°YF`80 |43Çž_àpy‹P3|�pI$–H—er¼ŒR¥ÖhuúÂ`\5)aeÌ«mÍîpºÖÝ„ÇêåCÊøüžÜØ …©HÔ‹ÃÉ$¶¶wv“©ôÞ~&›$sùƒ”L¡hpSÙR¹R)—ª‡öÚÑ1”L]Jœœž�_\^^]§M�¨Õ†�ét{ýÁ�¾¹�îîéçãÓsFæùéÑù@¿Œ'“ñ+=ô{]™vK¤k6ÒoïŸïog§'„´þïY�³9>ªÙ«¥ò×W¹”¥Ü†bJ&q�Ï‘Élæû'�JîîloÁ¹Ðxše¨e˜dÞ(ñÉÐ GgLæø”—.�Ó}<Öœ™²Q»ÌœœÊòxÔ2GñàHY‰& �¡h¥=êè”Q*(øÁ÷í½ö:l@DÀØŸ—žÞgÿ±¿ÍbíµÞߺün{‘9óçãÖ[@Je*ÒÄÁƒ'žzêãÕ«¿üD.Ιa˜hB0èËμnÝÿÝ!‹wòQ#@¥X7òã|äðÉYsó¾ÂH…RšJ�´_Íù‡…É}+¾T󞤷ó¡”è¶[«æÎ�›º«ªò·^uÉ�™ÅŘ0&àÃÁ9iBIÙ·oÄ›oN()™ž•¯”iuD‚�Ÿ6 Áˆ`µJéYw�*Ùÿð›¿íÕ÷‰{TÂÊߥ�’‚‚-Øôž9b$t €.4“�csî‘`òý÷‘šŠ´4ç 0u™˜»~ý¤òò_ggŸ'14£ÞŸ�3ªü_�¬ÿcßÄï3¯ ^û2tŒ‡ÂBÊ´q€ !�ñó4,‚Vúð^±Ÿß¯É­[qóÍHK£ÂB¦q ~#>¾ûºuËÊrîº+ˆbhNý]ÓG•ztÝ3WÄ/œmôê'_YÎJKCa!¶l‘))Òo �ŸþXSã¸4 €%ƽ˜ñȾ/þËÙbà……Â!,1$$\–›;±¬,ÇöÙÐbÔ—z4wÁ ‹f½ûËW— €[ÔXÔs€;Dié‘ÌÌü””µ~¿ADAÚˆ@A^Û‘ö·5Ÿ éû\ÖcJZÂ+öóÚƒ5lÃÙÔ¯{& ê³²ÞNL\µa׃}‹t"(e*e6ý Š”‚!D޼Õ;¯z>ë±¥¿éŒ8'°X8§®PŸ—·›ˆ á ö•2‰H)sÀ€è¢›~C €a˜JAˆÐVÄp bðùêˆsm‰VŸïT©W çTd;Ë¾ŠŽa @UNΠœœA@cˆŽQJÙ.&DÀsæt†iš+oõ'‰W½0yÞÁ]�¾Ì�ü“Ï�Æ`‰aüx^TÔ Mb˜:50««}hcX««ësê̤²Ã¿]÷Ǹ„ÅsΦ))0M‹ú]»*'O~'1ñ�¼¼/5M8�ΫÍÜnˆˆÙ³gHqñÔiÓÆ¤§Ç¥§ÇM›6¦¸xj�!€$»%@À3mù^Á!¿_ÚeˆA×exx·ž=CH©pN=z„†‡G�<é³}Ï'p}ê\½”¬½{7âã[ÌìÚ…ë¯?]¦ /jþÆËb^>~ì¼#mrAPJED¸-Jš81ÎãÑ"#�ª«}^¯þÎ;ü£'êí•��Å;)gé-�&Ló´FÆùi–-ZM¡¡øì³Vªøì3¼¶ŒYëLóÚÏ Â"W¶×KS)M°ªj]ùu» 1¥Pm­ΜfÍÊÏÏÿå¤Iq>úèðí·¿ÅX›g€à£FØYßY:}3cF‡þ»ýYÂÊpà) ʰkj¼ûòËÃÒÒÖX´h,à6Í {"XÆÙãÄæ`.(›ý–á¾ï¾vì8 ¶V�ˆp�8QGÄì7;.QŠT8ä­·ö¬]»‹sgû“¸¡žv�qõ€#-mà¼yÃ’’z“决¬ÖÂB,\ˆ­[Fô”Lü×ü¢¢÷~utæœöœq¯½òÅ5×ÅŒ{9i˜àŒë~¼û.žy¥¥ …yì#yų¿+Ú’ÿ)`ž®;ãW ØåK‚†÷–[®Þºõ.†a Á6m:0qâZÆ\*NLwóËéôX�À9eÊðÝ»gd�{9Yn2ÎQXˆ´4Ü|³ÜºUü�™üÈ¿JæN^\�œ¼"??ÙÚ»­‡ùoïON^1yò;¥¥G¸`œ …CÞy'>ÿEE?JaÕýØå,¸ûðSSfÜ pÀlj^ãåáÜ8YJ©ðpWx¸K)Õõ`* CÎ�­¦Æ�Ɖuôh]dd¸iê¸f†aZ)MŸÏkFvöõeew¯YsÛ A1†ß�;“zâÜË+”þ楬‡¿I¼baîòí·¼W­¾ÙzáxnîîÄÄUYYo—–á �~C&%a󿆷(%—,3zÆ Z0sÍïû”z8;g„aÔû|5RšÖp3 Óº†Qœš2åš)S®NF]`Í¥ÇöúëiÖT×4VWgdfÈÍ�Ô¯_7¥$cç–ACpƒ†Q§”™�_V–³nÝÄ„„Ë,ê…CðÔß/¯Ø_ú›%Y�H¼êù¼Õ;ˆNgã\ŒXœN7ËËk&‡hCJ PXÈÓÒ _]nôhöºg®(;ôhvÎ(¥ü†Q`,š1Œoì±`Á-nwdfæ€ÌÌnwä‚·ÜxcÀ„£v*ù岨Ø?=ýôN"èºyìX]·n™0!ï»ïjÈ*d…$¦þ�{yÅþ҇Π^ˆP¥´Æsö¦ÉÓ©„èªp.óÎ4cZIIEBBw¯wî˜1½ÆŒéåõÎMHè^RRÑE×4•׫2!¡ûŸþôùÕW/W ±±Ãðû|2ÀJ ²²®//ÿu'F½E}§c³�±èNŠá®é£C)ÕÎjKdÙ±Þ_,àr —KxñÅÀkš]�ñš¦<«WýÐC<øcFF¾Ç£Y¹� à‹/¦¯_?)>¾{»ÔhuÔÛï¤ÎÎ]Ô·¨lŽÃ¥µ•¯`©=.—X¼ø¶m۲Ѹsض-{ñâÛ\.Ñõ8;Þ!BJJ¾ß·ïx‡¢ClðàË ]wVX¨Æ¥©& çþ¦g€Ô[¯5•R€5»`*…¶�¥@Ä  Ô¶ml\ô¥ËÑ#nèŸ s·i‚Y$0Fë×síµ+ Y¡ü‚‚C×^»býúo¬  ‹*©R`L#‚a˜Œ‰Žê¸€Ð8¶mÅ‚ø°4Ágýžx¼Ô×ûÙÇŠòV¯ "箦ÔVc­a{l*©š2jÏ}oU.„[J3/ow^ÞÞÌÌkæÍ6dHlC=©©HMÅ?Š´E‹ðîûþ•ËLü¾Ý€ y½þÏ>; øbc=ÖB”šÚgÏžogçœÌŒQ‹�£Cn»–¨úàc,ZŒÞ Qéébþ¼ý1×<ûx‡¨oPË|>)�ªj�ƒ®F® ¨—ÕzàóÉsFõÚC¿~QF½ŸȱjÃXmӻǟýoõ¹Ù~D’ˆ”âQQÑkÖìyî¹}tDTTtUU]GG+çdš0Mƒs¡Tgèn¥yQxÐÁ¢ºÑ»7ƒyìÛ�ÈÈ—Íáp°Ð0§òë¨9ÙÒwN­¶Æç÷w ÂƯêgt´§¡ÏR‚ˆ¢"MŸÿÄÇUž/ÎIJ£É¹ÄOpêWNÎu+W–‚HëºE-ªX,¨)J®ðm@ÂyÎQ6ü~yüØ)€€°3‡%¡FüÍåoœ Ã0�;uÆßN|P€1%)‘hlRgØçœ%&^9ztï§žáõß|SU^~¤ë^ F¦AÒG0AiDަžwDĉ¨¡¶Ó—ADD� ìY�!âg^¢Dô”RJA)t"lBDRêC†Ä¾ðBrD„sÙ²ñ11nÀìz¢k©®tª}­ôó ÈÆš[ ‹ÝïÀ˾tiÉW_°yóÁmÛ¾†P%Ò‚×êó�_~@@öéõã�Þ3 Ünñõ×5~¿ ¹0<¼FÛëþ½8à8 ‰öø´ƒÔL+»&2Ò  º:(5œ;•Q用V¬/Ü8g€oêÔ�S§|¶ç‘_(H©LSÙÅ>l€âœšb÷ÖÚ“‘1 #c@sË«±ÌOb:ØÛ– §Sø|u€œšÆt]FFFÜtS‘‘ÕÕõšÆuÝ”² §Ó¸Ãö§ f€ôèÛ7bÅŠIIIq€Òõ:À›šÚ',ÌæHMíxu½PIIq+VLêÛ7¢‹Á�Ÿ l€i*ε½{ðz�¢¢_”–NòÉänÝ¢32ú[22úwëýä“É¥¥Ó‹Š~áõ{÷þÀyóý.!Ø£†6jœª¼ü×ññÝÔ×K"8�€Ï'•‚ËÅ”—Wü¿ûié¦�‡=›°Ràœƽ÷n`¦ËÅ-ö8�Üåâ–;aæÌ-€äüR=[ÃvØh +·ÛyèÐa¿_Œw¥a˜Ô˜S RšB°yóþ±ví§nw¸®ÿ¼7Àž Sʬ««���KM퀱Ó~*"k£FjjŸøø¸ººZ¥ÌóvöÊE{f€iz=ž�… SW­šif Ë‹ˆ Ãì×/jÖ¬ÁaažíÛ+|¾Z@»ÐÝoDÄYyÎÖ0b,X'âØ° 3F÷Üÿç?§X Z$+´øY_oÌ�ûá²e».BEˆˆ”2¨´´þ¶lÙg…1ˆ„íØ®bÊážøÕ¯ÞóxD¯^¡QQ®‘#{�ÝK)ee“2"Ú¾ýûââ﫪ê¿ÿ¾Öë5jjü¯¯×/†ìþ&XìxYx¸ã“O¾þå/زå‹aî=yÒ·gO¥í2°E U€¿Ñ»À€S³f%¿úê¸úzi©žÖÍìÙ[—.ý;Ò¬'ÀqQ±�ÈîÝCwì˜zèЉAƒb|ùåÑ+¯Œ1bMee­-$7‡-®âÜe�³ «¯‡•Äàrñwßý'€Ûn» °†¸\+°Ó¥e”RBˆÊÊŠiÓÞ+.žj=Œ� 9rMee…Ýl?!ÄUDJ%¥i¦uj€õ�qqEzz^zz^qq€ž=Còû¥•T{²oÁ0ÌÛo¿qåÊ[èºi±rå­·ß~c0Îg±Y4Mð!Cb÷í«JN^kmeÉÉk÷í«2$àá®Û"*2ÒÙ¿Ô¦Mvï®Ô4¦il÷îÊM›ôïél>±ÆÎˆ˜µƒõé•›;q„¼ãÇk9×H©wëúÞ{™ÙÙoûmu0t [ami§ gÅÄx=êMM] „cÓ²w(k‘ÉÈÈ?~¼F‡”JJ%„ãøñšŒŒ|¿ß¼øØ#""Whhluµ/)é¯II­®ö…†Æ¹l?,¶Ç„­H$ÆÎXm#Ó”.‘ؤòx4ÎYMM€ðp·a˜^oP4f›cÂJ�ˆ­dOqt51å¼�¼^cÀÉ“Ö'�—ÈQm%A_*Ü7‚¿-nVÇϱ6Ñâ´� ág\`ü,€ ŒŸp�ñÿP\XU½Þ*À%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:48:37+00:00Úu–ËIEND®B`‚qalculate-qt-5.11.0/data/flags/AWG.png000066400000000000000000000022261520501070600173220ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<øPLTEA�Þ@ŽÞ@�ÞC�ÞG’ßB�Þ9‹Ýb¢ã–Àì5ˆÜD‘ß2†Û�¾íåóþ:ŠÜ6�à¿ÇâÿÒÑ[¦ê:ŠÛB�Þ>‹ÛM£ìè´Àÿtw‘Ëø3…ÙD‘Þ6…ÙzÀöý�”÷8AÊÖí8�àC�ÞE‘Þ²Óòþ^dí .ò½ÅU¦í>ŠÛ>‰Ú?“âãÊÖõ6Aê#3ÿŠŒ‚Àô/~ÕF‘ÞD�Þ>“âˆÕÿü¢¦í$3ì0>úPWËåúM¤î:Žß:ˆÚBŽÝL¢ìz¿ö²Óóü¢§ñFRî/=ï5Bî0=ùz�ó½ÄÊÒé“Ë÷_°ò=•å2‡Ü>�Þ�¾ì¿Çãç´Àý�”þ_dí%3ï4Aï3@í'5ð+8ûJRÿz~ô¦­ÓÁÔ¥Çìv®èM–àäòýÿuw÷8Bì/>î4Aê(8ë.ò(5ÿTZÿ§¦ùòõ¿Ûõc¢ã=�Ý6ˆÜ9ŠÜZ¥éÊ×íñ½ÅÿŠ�úPXî1>ó;Fÿptû§¬ßÐÞ¬Õ÷r¸òE“à4‡Û<ŒÝ;ŠÛT¦í�Àôù{‚ìÏØ�Ñùh³ñB—å3†Û7†Ú?ŽÝó¾Å�Ñú%|Ö;ˆÚA�Ü:�ßûKRû¨¬E‘ßò)5B–å_¯òÿUZ¬Ô÷ÿ§§q¸ò¤Çìùóöu®çD�Û5‹ì€¥•ÿÕûÐÿÓlž¬:Œæmž«€¥”ÿÿÿÀ8!åbKGD§À·+tIMEæÓ¸UÛ›IDATXÃíÕåVQà‹ã€€-ƒ�(vcw�=ˆ�Ø`ƒ…�ÝÝ­Ï©‹åò fÿqÍ÷gß8ç^Bþ¶¼åM …"'1 �H�]\i`åæîáé…K�yûøúùËÜ�AÁ!¡°€0qxDdT´sF2*,&VŸ�˜”ÌpAKR¼âÔ´ôŒÌ,uvŽ<7�á¶[…R·ü‚BUQqIiYyEeUµF+®á°>%ª­«ohŒk*aul³¾¥µ­½£³‹»™8:u{ôôFÆ÷•êtl¿a`phxdtÌÈÝMLãþ“SÓ3e,;k¶ÌÍ/,.Y—e\ž½"Y]S¯7÷›76m[Û;»Ž;‰fB•IÙ{zƒeÿàðˆ¡¸\þ_FòqåÉÀ©íð PÜŽ‘WµžÏ_¡ê:÷²íêz÷Ø‘Áð— oSø }�á;øsÍãñÈ7ãÔ •J>Ëv%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:21:41+00:00 '¯IEND®B`‚qalculate-qt-5.11.0/data/flags/AZN.png000066400000000000000000000020031520501070600173250ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<YPLTE˜Ã—‘6g�4e�2dä1ä2ä0çFíJoów’õޤõŽ¥óv’íInçEà4à2ãGï{–úÔÝþúûÿÿÿþõ÷üçìûÝäøÃÏîu‘ç6_ÿûü÷ÀÍím‹ç8`ä#Pç;cï~˜å,Wà3ç7`úØàüèíâ@à1âCè?fãHøÄÐêOsà5â ?à6ï}˜à4á8îv’ãKà5ãJú×ßâ?ëY{ä"Oä$QûÛâêTwâAêVyä$PêQtð†žûÚâö¸ÆÿýýùÊÕøÉÔö¸Çï~™ýñôß/æ4]ýìðíiˆß0ò–«üäéãIíoŒ÷¿ÌþøùÿþþúÓÜñˆ æ/Yîp�ð‡Ÿæ.Yð…žö·ÆøÈÓö¹ÇêUxêVxäKä3çHíJpóv”õ�¦íIoçF‘>E�MLûÀ|I_ú0ó¥3�–AA¤ì©P ©ãr»]bÁ#H M׫kjëê›t]õ4·´2ÖÖÞáíôP`P€vyëö™þ@ Çìíã²hÿcƒ¦eÛ”ÚöÐp�P�Ž8ùGi>)Y!cl\¦À„sþf±òaJ'§¦)�Hà3³Œù¬Â¡ó¹ù…hl1¾´ ¨DÀ^qúß´í¬&Ö’©õ�¸,�MƶüE¾½³Ëöö÷"À; ’ñ£ã“S'ÿÙùÅeX�ÀU^àúFŽ€ò”6ámì.™º�Õ„^ÃÄ£õ•$P2ˆ"b=ËDêG±òÇHýsüŸ’ šöú–ÎdÒïš�! Ÿ`²¹\V,xùR ùV         (ø¢=Éà™~ö%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:48:57+00:00ŸLtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/BAM.png000066400000000000000000000024341520501070600173040ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<³PLTE#•$• “0›æêõÿÿÿÁÉå’$–’$”š‰}EÿÙúÈþËüÊÿÐß·'’"–#•&–�Ga³üüþÄÌæþþþ=¡’%–"•'—0M© ”$•›“„?ÿØ&—�°»Þûûý>Y¯Žaw½x‹ÇŒ(— ?£$”Ÿ‘ƒ@“3œ™§Õ5žŽŒ6Q«’¡Ò*˜�Ypº)F¦(˜'–%•ž"”'—‘� ‰§³Ús†Å†��%•!”/›†—Í©µÛ”£Ó›©Õòôúâæó“¢Ò—¦Ô®¹Ýn‚Ã#”$–+H§Ð×ì6žzŒÈùúýþþÿûüýìï÷Vm¹åéô½Æã“Kd´ÃËæ"@£1M©¯ºÞúûý?Y¯bx¾xŠÇ ?¢ÀÉå+I§øÇÿ×ÿÍß¶‡—Í•¤Ó›¨Õòôùáæó“¡Ò˜¦Ô�‚@ÿÞݵÍÔê«·Ü–†=ïÁ &“„•Ìýþþôöû^t¼‹{tM.‹ ˜G»û<bKGDøoéÇ pHYs Ö Ö�oyœtIMEæÓ¸UÛQIDAThÞ½ÔëWAÇñYk!ËJEC ´Â¼QØšXâ­Ð.¤eE¡3+µ‹¥Ýó^™š²ëœzÓawgžyf~çðbß}xöì—�ÿg8H)-öx­‡Ãç?TzøxeG�/¯ "« TÑê4X GNžª­#§Ïœ… €hý¹†Æ¦fÚ;ï¹P!qÒz.fÛ¥öD´ãò£3ÙE»Kzzû®Â€ \ë4C)’ê®ß 7o¥c·á€ U„‰1tçîð½ûèÑÑÌØx,€Ø²fî‘õ-­_æqí Xï@úÉD~’>�Š…²¤*€Heyfýÿ鎔„ç> @�|A«_R:³ßƒYè[�Dëç^½N¼¡o­Ì¿‹Ø à¤H\§œÈزæ{©Hd{ �ì@ª¹È${€p¹ äz€`ƒö íØL¨ˆXðÀ ^ÖD¬˜6Ñ D{€ì� €PÄz€ì�‚ ˆõ@@¬*l¼=Pàí�:gT¸z À×uÎ(¼_øz ÀæÖå·¨¸ô@À±Î=Ppé�† 8÷@À¹:lv=аë�>€Mt ö@# pôlz° ï…{°øá£.À¿|þüå+ýö}‰õ`yeU€-kæÖþö`}¿­?~j�p:ù+¿™§¿·¶­øˆçÏ®`‹¬› ªPû%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:33+00:00ÁøÙæIEND®B`‚qalculate-qt-5.11.0/data/flags/BBD.png000066400000000000000000000022251520501070600172720ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<APLTE&%€9tà´1ÿÈ%ÿÇ&ÿÈ&ïº$ÿÊ'œz÷À%F7 Ø èµ#ï»$ÿÊ&ýÆ&gP8,sZ˜ùÂ%ÿÉ&Ç› YF ÌŸó¾$P? ±Š �{øÂ%ûÄ%‰k XD ˜vã±"í¹#²‹—M<  Ÿ|aL\HI9 ÷Á%`K¾” Ö§ öÀ% }›yeOܬ!2'UB Π’r¦‚Åšcå³"&^JþÆ&aKC4 úÃ%YE þÇ&_JrYZF ^I¯ˆ|aÿÿÿÖì:bKGDj%b• pHYs  šœtIMEæÓ¸UÛõIDATXÃíÖÇR#1`¦icc~ƒE2ÉC6lrN&çœßÿV¦˜2».ÛÚ½¨/£¹è«nI-…B?FYyE¥óCTV”—…þ&,` XÀF"³UU‘Q€Ãa6 TG"ÕâÀ·²s´¦&ZJ�HˆÕ’û5c]=P_÷õãRmLpÃñ†Æ„úL ©hnúLA%âaWP±8ZZÛt�(ÙíÉ⸭µñ˜’(wt]Ý)òzzû€¾Þ�RÝ]@gËì¢T?008¤ÒÃ#£ÀèÈpZ ý)¡mÊÑ1ŒOèU`ž&Y¯�šǘÞOBçÀ›2ÙâÒNÓÅo6Lyb�g|ÌΩ æfáϰ@¹ òó\x>�LŽäZ/ä±ø½D‹È/°`/RKËXISPzËKJ²Ùy«X[W Ö×°ê‰vSÞÀæombƒe�m;n¸;ð·eÚÝÃ~Áq€Ç)ìco—d/œÜ!"G…ä1pœ,Ep˜¾ÑNNqv~qy\]^œŸáôDP×ø-®•0À7zÖ[ÿ¸óoõð†¥3¸x|z~y^_žŸî¥3pYÝ­Ýb»vu¿Î& =[‚^dì]d�ÿ¼oF�÷��w£€bVF�?ð€,ðo€_EMa[%ŠÒž%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:00+00:00~ŸÄ˜tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of BarbadoszèÅIEND®B`‚qalculate-qt-5.11.0/data/flags/BDT.png000066400000000000000000000017231520501070600173160ustar00rootroot00000000000000‰PNG  IHDRk@* yËgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<#PLTEjNkN gM bL7\KIWJSTJUTIMVJ=ZK'`LfMjNdMLVJŠFGº9DØ1Bè-Bï+Aò*Að+Aë,AÞ0BÅ6DšBF_QI$`LiN|IGÉ5Cø)A÷)Aö*Aõ*Aô*Aó*AÙ1B–CF>ZKiNdMzJH×2Cö)Aæ.B›AF/^KDXJ¿8DiNH hNhNkNHâ/B—BF�HGî,A®OÏ+úåèí¨¯ÝZiÒ#6ýõöóÆËä{‡Ö7HÏ(ùàâ랦ÛQaÑ2üðñâq~Ô0BÍ þúú÷ÙÜê— ÚL\Ð0ýóôòÁÇãu‚Õ3Eùâå좪ÜUdÑ 4Í$ý÷÷ôÊÎå‹Ö9KúèêÞ^lÒ%8þúûöÔØç‹–‹œÙBbKGDˆH pHYs  šœtIMEæÓ¸UÛ¬IDATXý™åR1…/P¶º¸{ñâP(ww(îî.Å]›eû›$3½sÎ |“ä\ Ñ¿ ±„jV>‘Ha¶ð» aŠŠŽ‰Õ™'cÅÅ'$&%sNÎ2”’š–®éQFfV¶Ä"ÊÉÍ ôIù…ENĹŠKJËÊÜ!'UTVU»\ƒä¬šZw�“ÅðV½§¡ÑÂÈbV“»YãKPbVKk[»•&|­ŽÎ®î¾K”¹°·¯€Ë á584<ÂbzÑèØøC0+± MNy§Q,š™�ÃäÞù…Å¥eÈ®¬®­k æ�‚66·¶wxL/uìîí°³th;:flÙD,�×qÂR·X§gç—Œ%Eò^W×7>;W©”ûðöîþA݈žž_^Y_–¡·÷�O-à—Sc}}ÿø@½(�»Cœ7`ž‡Å22G!s/²¦°Vúëü‚õ6¦p=›)X/ ì±q³l&‚Íz¸9›#wÈ]ÊŸ`;"¿`»/S¸�ž)Ø®Òn‹Û-Ãv渿Øîï†ýOêá¡Ì'”Ç'%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:48:51+00:00ʪvtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/BIF.png000066400000000000000000000120201520501070600172750ustar00rootroot00000000000000‰PNG  IHDRk@’¶®gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs Ö Ö�oyœtIMEæÓ¸UÛÿIDATxÚå\y|•ÅÕ>gæ}ï¾d% [ÂÛXd©‚‚(Ÿ Öµøi)ÅVµhQA@­"UúakE‹X?+¶Xµî"nˆ ‚ ²…! YHIî–{oî�™óýñÞ„˜Ü$7$På{~üCî¼ç¾óÜóÌ™9sf�ˆ ˆ1Zu´lÎ#5ÿê:w9HHhÝò4"j\ú�¦ÞxmÎâùzFºÁLˆ——ƦÞw>,¿Iý¶šÛ�&�„üO÷ìT5N!¼^ûЂì³Ý—�oÎIËÆÔ–g0JU.]^ùØS¢¦VKI&"Pê?ÝÇ“ÆQÔÖi©)™÷ÌÈœ5Ý`ãÒ(• †,>�B¢Æ òmYÙ¼GkW¿�:çÉÓNԈȹ (*S®»2gá}¦>9Íh E c>(Hrdñh&")QÓÀ·v]Ù¼Eõ[¶knšôÓFÔ¨qŠD…×g~fι®‹Î9�ëz$IiÈ€û³ÀgÿæT$ã8#"2J‘R–¹é¿¾�»œõ›¾5µÜnĶ32† E­‡»œÙÝÛoå2sÿ~$%´EŸám Ù^ÉÝ;òC—Õ¿\öNDEG¤˜˜®H¶~#!‘sǨ)×_)ŽÕ·l'!™Õòƒ$5Mê)N½áçyÿ|Æ}É€“m<î r8òYºoÅo¿ùýOÏš2�€ÖV}öΑ�3-郜yˆ(H bkQ#c†¨µä¤ä«'8ÎÚUÞ_ÂL&ÔõP„AM!Dm�mè�û=·,sÖtîv‘ˆˆTøÄ;G>±p“�Û$ ÀÞYF†€ž¨Ï¡Ùnͽáw~máfEÊø(®é㑺ìHùý‹k_z ãÎïk¤6¢­?J¥Lº&{ÁSNtm�! ˆ?îöé’ULÒ]d|Ü}C¯@dãVú°êó·+?Î0§ v%&ê$wòU—:F� ïÞÞwà{(ê&ÙÚ‡�Ù÷oOdÞu w9”í›NÛzïëåk­ÜbãVI’à¸÷ÁãЉ:– —fŽ}0ÿÎAÎ\HPÔUO¬¨\üçhÕQž’„tb<"4›Ä4íÎXbŒd­GÏHÏœsGÆÌß@‚²Ýë/y¨pÙ{•ŸZ¸ÙÆ­†l[ÚoÍ �&QÛ¹õ–ÜI³þÆÊ-ˆZJƒÄhEeùýKj^|r§³¢f,æ×B��±‘sÔ8j ’R‰zwL¶~P”:ybö‚ÙzÏÌæïÙM ÉðÒ}+ž)y©^†ZÈ6Q pä’d]Ô;È‘;oÈíWõ¼ž~û×m(›»0°q w¹˜ÙDB´×YΉHƒ*FMãn—–’Ä�Ô4Bú¢Ö#½>‚Y-ÌfCD’íÍçQÓTCDú|Žs†ç,šç<$+·Þœû‹»þÆÆ­ŠðE}¤ºü�%5ÿp×wD�š&}~@Lºò’Ó§:Çž“ÈËø?ÝX½üyÏk€È�½Aä\úü�zãµÙÏÖ³z@»²•¤€! ÊÐãûVüµä!rë.¥yeÐ@“¨:úÍ|Û5Ù—@â¢^ÿeùÜ…þ/6s—“™M$ Êš:Çè9KîwŒ{B@#ò#( fX&"" 2¬@à‹Íe÷.løŠ§&r¦"ÒçwŽ™½hžsÌÙ�°l_+_³¨è/û‘mKNšf3‰À‡NÍQñ¼RþÞמ]g¸fXÒ:^SKeî×;mÚ$==­~ó6Q}Œéºô²fß‘»j¹©w¶á˜È˜ñ/–MB@d€`ü7ö€ÑØÜ§WÚM“T$âÿøs¦iÒãÓRSr�ßçé?˜ûä�Hhm[èÛÛ¶þ¸eX6¸u—ÕÙ�ß9 (P:ÓlܺÇ_ü�Ò·ü"0"¹ÀÂÍŠH±¶ÖÔR"cö‘CS'O”ox÷Þ¾Ï<–ñ»[¡qN‹Í)©$(…ŒÜÑGÏTR¨f)8ƒJs]xž¹ooï{¥Þ81oõ ׸ÑÅm­m%)àÈ"¸¨è/wn_°?p0ÙäæŒI:‘‰WçTÜ’þ˜¨}ýí}æž11gt j ) FÊ*L9=ÛO^î /›{õ]�þû {ÿøoИŽ”V˜zõ„˜lµ6¿¼Q¶¯”½»¨è©âúo“uWgeÛ’„ðÁæïNÍî‰z_-_³¥ng¾«¦%½mQƒ!j ân(†`›D@�ªñËҶýòsïüØv¨ë6V|™›}†MF›Fƒˆ Orf‘ó¸ô5Év—wïŒm,+~®A� l[ö©+>؆Ȁy¢~ 7ÝÔ÷º{ÝâÔ줈ڊԠX¼¾*Œ-}ùž¼)ËûèÜd–‘†o£U^˜1ë¿ÿ#=qk’CD@¿¨lï3+­ËH’îT GÛöÑ%l( +·0`ëŽ}ùzÅÚ“ûG®A Q�Œ»¦nK¹ Óαkóš�%"`!Wßõ_Ù?ò×T°ª¸¹Ë6¬5É_.{û¦-³×T}jç6+·H’Ý•ù`]7ÑcÉ�fJ© »yë}×l¼u‡·Èè€Hx A"ØôéKÙ“�12û£âMŸ¾‰§|IÔ�ïð]³ñÖ›·ÞW>–fJ1RÝØëîñÁæP 4ävͶÏ_ò�Ò·ê"ÞáÉVn1†›ø¦„È<zÛ«8tàþŒè  •ÝØ7|ýØRKý™CÆX[ŒƒmŽÌ ,Øó§Y;–ÔN6¹2ÝŸ.êžq0.8rEª.êígë5gðôë{]�±¢ƒ'wf?©úâÝ)'¼ð긌QÍÿÞÁoÿ,}kqÑòƒÁÒdÝÍ�u¯ß�" h¨…UØ­¿4óüçGÍ" ظuCÍÖˆŠr䆳”nàãï|Ø›Ÿá”zPWIÍíèIcïØ*……Œ�‚Icïñ_;:)¢u唺7?cü]»� ”†–9òˆŠn8¶ÕÆ­§¦k'�A µ°lˆú<{ïæ‹SN%ï¿•µ³†¤â€ZƒLû p{é:`qö0I)`°½t]Ú…Zƒä€$UÖΚ’5o5Y3 Iæ:zD}X6hxÒ‡©îÏÍ7�j£ž^¶¬Ç æ>˜?SgZãhEˆì€8òÁg«¢¹GÉ×·Ðÿþ´~áayûœþóò.`ÀZ„¦Vmz,¦}ƒ,ƒ¿8úÕhWÅ/F–ðš~CG¥pW“e�és&ä9úlóì.WZ¹Åpü“ÔÍ“’Yh+e ßÍn)%ã`õçÏÝÿÐ¥k?9G¥`¼é‘:°�ѽï]4nð‚¯;÷  )ÉØñÞôE'))ÝÝl}"paÆè•×\×ër33ÅÝ~Bd\왕wx\¿«ÓÆ�Pœ±¶r0ˆÈA¨^zzјÌ+‡\eG+j1hû¤‚¤•›Çõ8çâÌ1ßËwûö1@33w{а;}°Ó[wÐ,£GDæ¯b�4¶l?Qv’6çZöº[|�!2äÞ¨�#¿-oʳÃÿ$)ߨ>6²üqžQ±t©1xQâIDT¤›� Æ®i‹f€ c»Àg¸Nî}m­ÛõVnEìž¡±|PC-$CA¾(ã¼ßçß™ïÕ%@ì¤ ëŽÉ€a§Él<4½O¡oÿï —­­úÌÆ-ÖÄj‹ÚG—|Јq5Ѻ¾öœÇ æ=�?3ÝœjlÎÅßä4Êh8ÄÈáržäŽu»ùÓ–c;î‡Ëx’�²ÔÖ�Ì…$•aI»6ç²�Î~ßx KC]�Ô'È`3ÙjwôŸºbØâ÷EªÙUÈX´²ºôÎùßÞ~ŸÞ3Ã6ôDZ�wF9ÄcϯÞÅ”†í#Ïâ.g¬²¼õœü¸¨)ß5`rŸ«pK—E}" j¨…dƒ_.γrø’‰Ù—êL$9r†ñ7ÑI©¦rƒ7Þø|3³˜ë^y[C®ñcŒª£ò(!îŒÆ€²Ù�”Í]ÈÌæúMÛjW½ÊL&ûOÏŠ•éÄsFDDAÒÌLcÓziÖù¥¡#;½{ñD#uçŒÉ6R—kïõÇ3çÏrGº9%Ù"cþuJ&ÝztÅß�1î´³Xü¬÷®ýÄ20ÏÜ·w¬.K f+Œ¦3SDFýoS}—ý—%×ßR·ú žœˆÜnU¡†º×ßõ­]gÉëgÎí“�¨Íis& våm÷žˆ¨¯Àl^V}ì�¿î–²jÔ4é÷AÒ÷˜>Õyþ¨ŽÇD"ÿº ÕËŸ÷¼ù> pg« Ì/œ~ö™’UNwšÁï–öŸÿ`þÌn.íg ¤Ç‡œY ò]ãÇ8F�´î¯e¤§ ¸êh¨¨8ðÅf߇ëC; I*žä2¾«å wµxÿ‰÷*×µS¼ß9c“äˆwˆ«ÿ¼Á·_Ñs<¼­Y^óƒ ^>wQ`ÓVÍíBS‚•è! …AãÜåÔR“¹Ó�ºFQ!ýQS'}~­f³&R‰N‘ˆðú?–½h®ë‚s¡ã’Vid"Þ¬øpaÑ“{|Åɦ.T¢ÿgŽ81† � íÓ@*á#â'çSÇ " GÞÕcvG�iÉ]8f×}'rbéêzdÏ“…¾ýI&·ÖJÔ­O&z�šczÞä»Üdf¦De[Z^>oqí?ÿ œÿN&J™ò‹«³™cê• ‰‰ºAEþgÿÊå^ô‹@’îny2�37¼<ëÂç†?vEÏñrÑx4/žmEJ¡ÆA©Ê¥OœúÛúM[µd7ê:ÈïñÕJ¡ÙÄ,æúM_×¼ø* :Îf„û¸Óolœ~›˜~nڈ˳Æ Wo÷î! 3Ç‘¹ïž%á‰ø~ä8È2ÇAâ²ýÁ^»pB+ÄDýnå'�ìùó.ï¾$“KG “^/pëÎÛúO™ÙÿWÆ-�ˆlOƒ«?Nðr`È"*úDñßþRü‚7êÇi_Ý3gðŒ޾�X´%)«–>]ùøérýLó fîž‘1ëÖ˜¨ŠÔ‡=Õ¹ÛR¼k>.Ÿ÷hý×§ÛHÇ/9:« {á}îK.€„O”¡T�mÃÁÃåó­ý×›¨ëÜaÿAʶ Q×S4šríÙ ï3÷ë ˆºã[£HÊÊÇŸªz|¹¨­;dÛ>šD�’œq÷ôÌ»g çÜÕþÍež·Ö–?°$øÍ.-É�úé#Ûö�§¨¯í'?Ê~xvÒå5ç¤eã6oÏ«¬.»wAͪWѬsçÿ×Ûóüjˆ¦Þðóœ?ܯgöˆKâÿKˆÓõ=Üœ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:46+00:00™ÿXIEND®B`‚qalculate-qt-5.11.0/data/flags/BMD.png000066400000000000000000000137731520501070600173170ustar00rootroot00000000000000‰PNG  IHDR€@]´è(gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæÓ¸UÛÿIDATxÚí\wxUU¶_»œÛsK I � 5¡JQ�Ч$�g, JufÐgFQO$€è¨0Ø!Í�¢@pDˆ˜¡‡`h!!åæörÎÞûýq†NŠòxðûΗ/ß¹;»¬ßÚ«í}ƒŽþfRø¼§Œ#’8çœcJKOÖ¾œöÍgÿ*—™µ„`EápMP‚«;%¹wÆŠßÚó �Ý—Š5!îõÆnÉ0è�:sMfV!µèvý¢Ö é‘G_ùÃè¨Ê'.·çlev dyptè´É'§ÿQ®¬F*©~¬[ ´ö«-Ž{L¿>ëqÃÐcÁxǶÁŸ¾•üìãƒ^ÿÇöìœýŠÍ‹L‚ñu¥Ö2s"˜q¡Ô8AC“M\ðÌðÞÄ^ùÊÂýŸýK>{–è ¦Q÷´š3Õ8,Qq{¸,B7[ŒMîøÜ P«Îe¬9:rbiòTÇw»ÁÀÖ7¡MÖŠ‰…93S'ô2S¬n„€üË͆ŒRjœÂãK},qïî?g>׿Ý;K zŽúéÍ4nµ?<.î«Ïc×h–ȨPÁ·¤î€Ëç<×gßæN/Ìz}UvvÉèI¥ÉSÛó% ÈJ¯®‘éË&nœ•œÚGÈü¢¡¡èSMÜ»ë¥ôyýÚ,{3?~äÑEiàñ„�OŽÛ´¦cöÊ ¤Ь(*>ëtËÿ‚:ñK÷²0ùͼògžë[¼)î…¹B«­ÊÎ.õÛÒä'ßí¦… Ý"3—O,Ü83%µ…wÃåZŸ1¿_›å‹óF•,JCOØÃãã¾þ¼cÖAI¢§Ý{ðìC³3’&­òùŒ‘¸5`PKÙßcà+ÞÚszöü¾Å›ã^xVhuUÙY%£']NCÆò g¥¤ömþn¸DôEõZ¿8?~dÉ¢4äv‡�OŽûúóŽÙ+оðàÙÔÙ齯¼½.#Ÿ`L¾Ue_O€b@ZuƇ;z z5õ­=gž™×wÿ¦¸æ �®*;«ä7“Fé ½»Ef,ŸP¸qfC£D†ô…È• NÔòÅùñ£J-¹šÖ<›:{mŸ1+23ò±D X·®î@ ÛÐã"ó£™é»S&|qÎü¾s§Ö¤­*[™^•�mËùÆtÿðVÏL J ŒRÑô³¯½û]æ†}>§¹ �¾'H8õ±ÄçŽè�l5Kç¯Ê”kΨ´–°ñÉ G¡ hýëï~—¹¡Ü~dÒ‹Ž1 ¿µe  ¡!‘VFÆyæ';33˜4qà‚gŸë;ÿɺ´•e«2j²³m9[M÷všaH?`\ŒRáô¤EïïXûÉn›ÃW KØ^ð³IÓ‡ýaÖ°ÄVóÖ[ù¤Ëµå—ˆ8Œ©D‹�T¾þîwk6ì·LM¢S±€º$¦â@@ÐêùËßÁÀ8XÝ ¡÷MøÒÜý°­jÅêÚµëýUgPã=Iáóž2�¾GP‰3N)€í{Ê­œ6y€sOÑÑá)—$b�¶fúõzïÓ¼®�“,þÊEï–ý3‹s›Zf}o«9S¢œ#£mye ßÝ–»¡Ü2˜4õSºˆY„À¿�k¿rËæ(eÆçWþ!˜1n­sëÔäÑG†‚@ÃùUÌG6o9³p¡ºì'ó׿FõëŒ]Ùy0”êdf¿Ä ßÐdn?Ž„Ðe!‚¢ŒŒ³�=æóxñ'Oî,,¼7//,:Zp~¹-â€0@Ó*õô—  /×÷_m f‚1 ô\z†Ùã‘ã»…œ:í�jc8pÈ]] ÑÑB\)÷kÆÊ(÷z[Z"WqÂ>ÿMwÂ×g SzüÈÝ©“:¾ÿà €Ž6»†�ÒÕ«Czõ2"„@-§L4vKÆ�´»r‘çòh’ ¬×º ŠOÎz ©Uòáó·}ûU]Ÿîr_lF€¸Ð�ahpƒaè©©ó™Ý‰hK83!0!·ûÔŠæ={¡R€SBè ‰f¬jóæ}o¿=xöl¢w35èÝR}Áy6 PQhøžs]Ÿ„@"Ö²{àŒDY‹Z!‰R�Û­DDÄTTÄ dˆà¨JJ¨ËÕ¢s ©3×\ñƒŸKv¯^#=ò_=Ç�î.c€’(Ø·î°f~ɽ>ÙjC}‡§'‘¡ƒ€»Ü—Šwyà¼ôYA„`¡(5kÖÙ6悬×ÑKèã´ñ]Ö{ìÃO¾wz•`‹î:¥—¬%˜‰æñPê€gÆXX­ŠÏ·¨0€ K’ˆˆ¨o\ï«[@—hfÖe™ð…bœÝ Ziø˜„g|÷ÀöÀŒ»sG^eÚJÛWßøÜUcžHaúv›úÐgyÓ&è ±š@ê‹qýc@aKª�IÑÐàÊÅïÙ³Ö �k>É N}`ä¬ÇƒŸûjÚ–ŒOwƒG‹îjŸ©œéP£ƒ¿‹&Æ"$ð PJ[ÇÅy¿ø"„®0€ÁQf‰†·i=pŽ0œ£ó´5˜Zt u¨�Zt ôê‰O&îýþùÜ�»wP(“ìØžWš2íè¨IUÙYB­éôÂüg÷œ{õ�G>.M½|]î!àü !Yàåú­‡ï½|✌‚å”`Œ€j3¢ó7™]¿Ï INá.wÅŠw�$=”ðÑŠMK:pøõÉóF�†ã¦G-:É¢‹.جm® �á²W‚¾.²5ð+(@‡à 2 §S!fÀ”"ŒýŽ:„1 æÓè…›&”`ƹbuƒNÿp¯Ó“úto çOEcçö¼Êe«l9¹~·U n;sNèÜ©ÅÂ2sqnúš] s�ˆ)(�W_%»0©AEÒ3 Ò×ïM›°`zRïó£ße|×ùQ¶~c‰ô~z»))ŸÎ�ú¬a —æf¬Ý¥xdÑŒ&¸Ò¼Å Î!…k3ö®üœR<øÏsMq��,z”†:CµiOb,ÕÒeS•¯há;Þ)“ZêýË˶…÷ê3”[•![; Ò¿XªrÖÊ"fX;s“åþ3_Îè}±Ö_XpÑŸ78kw�GA}3ED½Q“ðbß4t@ÐeF)æ‰äìç§?~—{ä·ÜãC¤)‰‚ ´eßñƒ5έº�7·›¹Ò+jUXlq?˜g�¶åý[JzÈÔ:ŠÉ2GD»ŠcYi«»3�}ݾ’á!F½†)Íð½»·f #”Ô‹~éJ[ÎVÙc•‚[ÇÍœ2wj±0ÏNÛºvÍ.ðÊØ¢'º€Á—úâÂÏ+ËBˆ†Í.ùóÀQ»0J™ùÙŠSÆ&üé< ì¼Qr|·; GßLS­ÎŽúíØ*5•]€šdŠ1â¸nïü~U'¹ºëàÒen¶úÝÎû'ï-8¥AA­œÕÚ°� cB"„Pr�;”Pý�É›[Ñuƒ±ó!š®ˆ%Žíy•o½gß¼�¹�RDd̬GÃç>Yæ§Òr³×î� =´œ ήœÌʀýB‘5ð’a€d¸rõPf†`0‘™U˜¹ñÀƒcâ_œqw¿n ‚’% tîÎ?·t•mc?T…„ JšV‡äR÷OX¢ÑtؽuÚÑÓ?ÅÅÆ‡«‹{ôJÍŒØoÿ~<y½ŽÓ§ÛEµ×`~Ϋ8“ßUóêÌ)‹…f‰ŽƒÜ WLÛv�[þO[ÎVLŒl3oZEDÌSKr?[³Ûå•Í=ÑJŒù®M3¨üz¯ ”ººËHBJ]è½.þ`A®A €˜ãÊúŒ]¹ò'ŽIøãÓCcÛË>a¤¿«ġKì›·U¦}à.ÜßäBÆ„œù¢P>¶<kÄq¹]÷訠“§JíÛ“hµ?1ÚÞÆÌ¼gkJò—ZC#ÿ“ÿE—ªƒÇß܆T"|bJX‡Á8�&r€òõ…¢“!\H‘­0ˆÊU—߬§ݸ¡TÑë%.+�ÂÃE«Õk±D].Ù/³�(Á V›Ç¨W‡k@0¨ÙÄ}~å\õ�ç¢!�ŠMš!?nnÊ æÌaË–<Ž/²tJíp¸ó Î�ªŽÍe5ƒ«ËÊ%ð–ÿXqìÀü·VwIšxàÐ§Ž—™` 2Ä}¿32!vý{£3ùéÖÁÁ~Æq"†õ:„�8ÀûËN €P•¢º®Ö_a…~!{8 „.Ófw2!´ë8*€BÌ”1Ù_}Ñ"«©Œ�$Ýp_ æ)(bóf À)Іµó £q¢×I:å wØåíYU�®’˜¤Öé5êm[¶t½obh«¸º(ð‚º.ˆD:œ¶}û4 øEW)�Z�2kRáa$‘À/ý$à4!f”™@€‘tq‰)p © ÆGˆ@znÿ~«Ç `Ïé‘ÚN#ùÏYe½AͽÜãe®ªª£6H+qnBNm¯Ø·½cŸ¡û†Œslû2è±Hû÷;݃N ¨)K×O„ I�8ß\±gÔÔžáBÏ—<�‡‚Zc³ýø»Éa'NžiK¼ U†f´é´ØK¢0“‰8ì5w Ö© jâW8²Š{H݉ôw—UÛD쀕ü¿§YS� ¼ñÆîU+xSb¡ÛñLcì÷z¢""Û<ðà‘¢ÃÐ5bºöéµ,:’œ*�QÛ+ö®_Ø9ñ÷ =ZþÓj!—½²ÚØaÈ8—µjì´­L¨´”wè÷—½E›Û� ßÈÔT¨WþFیۑB`¨g/ËŒ)¬7Ÿv»Ê `Œi\Û¸CtíÙ³ç`öÚžwåa=cùº„ø¸=ûÏÅu4@û˜ëOKT­ï7ŽUÉí‚eEhâ¡÷íHPª€®£F9õ7G�8ðZõ™-êÐñ¡f¬×k{nË;.8Žˆfû„—V$ÄÇyÜîÖa„U.·ÇïîÚâÑ�¥YÇz5Fƒº9yÀÍÅMäðÙU¤1…ë£ ì• ÅÚØÙ6Þ¶èÈ9*0±­ÿÁùeØ¢ÜIp¨Xlt•„¸ÖM²ø-T *ÄÁ "ö¤dDØ ¢Q7ßÉÓºV7[,¿€*H�]Ù{6sZ‹�‡Èß²5F§-Ä+k�¯o¯{¿Ê÷î>UüN8i3¨ïÝÅ?&¯<øÎšÚŠ“VMÔ1wEqy”�5 v¶)H�%Ž�{NùžÊQGJ*Y4îkS·à@BñU´Èë>ÓKäñˆÖ‰uÆ~\àýZÕÉ„¡Ÿ�«V:m²%Ä^^Uyló™ÓÖâ�v©£Ak,M@ n_I;×ô‡»ÜõCòƒv±GÒJ•ê'0ÎapÒÆ©? ÂÐî7[&¿68€#»Kùû`û¡h6ú­ÐE?¥öÄFw—^ÇL4 ‰E± nþö qSìÅ37Q÷P;""úÊŸÝõ-„¢º ïøÏÅ´3&�PãsáÛ‘à*Œ˜‹­ŽqæŒa(–hÜàÉNPÕ_6U¢€(B^ÁI½aAÀÁà Ð8B±üÈÿZ5Êmpj4éâëmJp‚‘Þ {±7³‡·h0W¢%‘$Ÿ&Ê@Ý 0B TØ' ¯Ço<ÌïÙAÆÿ¤�P«ì”㦞‰Ý¾@ý@¹ùÉ—ÛÑW�À«b ²5Á*X  ?>?—*Yôa>d½÷¬&Kn ø… ͸�t[ :�©WTqe�¯ Z9ÜQœ‹o(jŒ�ÜPÉ£Ê þ8îsVêìUTÔ£>!p3ï¤Þ!à8€À Ò2„üÂÁX¹¤”š”Z�®#í]4œQ�Dd ¼˜3Í}w¸"ð` €$’‚0FA&‚ @ZöÆ·W&|]Ôþp |* @�{¿Àˆw¸*@s¼ë âþg_ÿ?p‡€›Œ;ÜdÜ!à&ã7w¸É¸CÀMÆn2îp“q‡€›ŒÿvøÜÆ ò�%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:26:06+00:00¹; ¢IEND®B`‚qalculate-qt-5.11.0/data/flags/BND.png000066400000000000000000000105651520501070600173140ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs ‰ ‰7ÉË­tIMEæÓ¸UÛ?IDATxÚí�{p\Õ}Ç?ç>ö¥Õ®Þ�•eËÙ–mɘ1�†„GS I M˜†?šÒ?Ó6)“vÒ S’t¦MR’I&ÓÉÒN§@§„ „¡†Ø0„ Ä Žmðû!Ë’-K–¬ÕjµÚ½{_çô�]Û²½2È–õ²>3;ûÐî½çžûÝßùžßïì•°ºë \³h3Ý€f–\ãàj€(Þ¸V0ŒØ_!ÝN”Û…’ƒ ³D!.¸-0J)…rPråG¹‡‘Î~”{åõ ü!P(„à\¤X`>P@)”…ò‡P^7Ê=TÅa”w%S ò ä‚(æ8  r å ¼cHçÊ=€r� ü>”?8 ˆ?1W˜œ.B¢ä(øýH÷(ª( éÿTáox€bÁdÎN®P%PJŽ ü“…èàìGºQ9 ™z”bÁdÎZ¦G¥X0™³‚™@)¦Ûd*ÎÙ“k”Ù%€‹¸Š&Sƒü~k‡AŃ6"È™>Þég–  Sd2…Ön�Þ¿�P¶Ñ£ú‹6�e² ¥kc¦0i„�Ðkz ÖC—e2…‡Êø)�0gúÀf¨;ç\ø¨|ˆÉ¦‹µ[�yÓ$Ô*‰lôÐãêš‹óW¥�c(9ˆŸÞGzË`í=ŒÕµe ßàb68 ¯­LæÜ®-ŠÐ¢X{‡ü�‹0—#™·’T?¼†šGZQùý×T&ÓØ´é¿i]ÑÊâ%K¨ªªÆ0æÿ`˜Û±»³-@æ,rÛסÿõcˆr�òS×L&ShšP±X9MM V®\I{û:ÚÛ;Xµj5‹š¯¨@Óô™n甡|Iæ�·Éþv'˜2“Eè:f¢žŠ?º3Q_âCó7“)(a{ ]§²²‚ææE¬^½ŠöŽÚÛÛi]ÑJcc‚òXlN$R’ï<†}è(Ê÷ ­nÅé9AvÇn*?÷òû"m‡PëRBkV��2O2™%PŠ@À¤ººŠ––%´µµ±¾£ƒµëÖ±|ÙrêêˆDÊfúX&Ä9ÞËé{†‘_¼Žw:‰R ³¡Žp[+îé$r,‹Ý}”B/�R~ûÍÔ=ö‘ í“ÛÑ,—d”"QWW˲¥KY»v ¬Y»–––¥ÔÔÔ †.wÓ—�r=¼ä0B×ñ3cdÞz‡¡ÿÜD~ÿáBçkżïøÉÏ…¯+…¹(AåŸÜGüž;1êkQžG ©-žDkf¹üŠPŠh´ŒÆ†zV¬Xκuëèèè`u[‹O�É”9‹¾'þ…ÌÛ¿AÙÒu1*âø™1¼¡$Êq‹a¹J!ôŠf] ~ziå¦IôÖYôä7Ñ+ãWÖÀYV.Ÿr\ˆ&±xŒ¦¦Æ¢Él§½½ýªšL»«‡Ôó/“y{^*]íÑ2¼á2gá � „@IÓ@y>Fm5Â00*ã(ßGæmŒª *>ói*î¿—À⦫ÓI3h2¯ºJq9&SZy”ç¡GË&þ�ïSÛ!ùì dwìÆÚ{ïÔ f¢ox-`¢Åʱv省ZŽ0MÜþAÌÆzÜÁÓèÑ2¢Ÿ¼…HÇâ÷܉^Y�0?$m¢þXaèháÉ ¥¶5=&sFPŠK™ÌúDÞ»Ûyé5‚Ë–PvÓÊn½i‚ŽSd·¿OhÕ ôx9þh†ô«[ñ’)†ú2z,Jã_Å9ÞËɯÿ3Ò²h|ü1Êïúßû1ÖÞƒT=ô�%͔ꌪJœã'±ö ~Ï�Šoì�ß’}ovW•ÜGù·M}']“9k2�ŽãÒß?@ÿÛ¶½œ3™K—/ã¶`Œß?‘"°í=â�GYÒ±špyì¢íä!·se7^€+§ê¡P®KìîÛ1ëkÑ+ãØµÕ–.FåóD®o'¼v‹Ÿz·o³±þ¼i ÙPÇ韀ÐzoB‡¢ÉÆhNè$S’œ5+¼à%yÑ¡Ír³YF¯ïR«ü]¤–é°×Ë“0CÄ5ƒ€'fxh˜�»>€M/œo2×®áöš×:ŠÊæÛ¹»dè�ÌYø™,vw/eo ·k'ÿ6Þp =^ŽÝ}‚Ø·QóðŸÎt7}4Da4aly¾’ã'}öòØsÐãÀ�ž^Ÿä°Âvf—(’ÒçŸrƒ|=RÇ]fÄ„N­(²ˆÐ �Ez¼ÜyŸ½Ðdvé¾[ž@žþöwè}{3Ú'Îdº'O¡\4Sx~ê4~z€üÁNâŸý4‹žüFmÍLwÓ¤0–-ÑYÑ¢sÇm<ƲŠS§%]ÝûŠ¢8Ôés¢Ï'•–xÞ•ïôJ’O[I6èaª5Å9_+QèÀ:#Ä‹ö¥ç·Y¿ñrèÞÚ½›7vmJd2ׯ§må*Êví@7 bÓΘL©0êkhüû/cÖ×Îlç\†”ç/†-� bå:«—ëÜ{g׃tFÑwʧó˜ÏÞƒ{zîòè;%Ig$ršWÓ¦”OFùÔ #8w2F•ÄE±ÁÓ¨™ôIwÂm( Uâ)EVSà^Ër¤³‹#�]¼öúV‚5U•ük¤†*Cç•7IYu€å]ýh( ##8O>”˜k!gE!TÆÕk î¿7ˆã@*-éí“:ZľC�ݧ%™±«;tH¥Îœ/àܲþÓÒ##%ÍÂä®@”gó© ·á£¨EîR«â”âå±ü㣠íóãŸ>ÏûËkxBT  ÁHf”-oü’– בhhœSåò�4 P |ÅYUè:ÔVkÔ×jÜp��”�·É”âx¯ÏÁ#…¡cÿa�®ŸÓÉ©5™ã·t& 0(= —D�âóýqÞu³õ�’ÛØ`„ ‹Â\ø#ÌžUò}-F€Ï‡*Ðò>£õ'»}�’\Ö‚hBúúúùË/>Œ¨Š³tŽ•Ë/{¨øã¾†SÐT/XÔ¨qëM&¾9Kq:)9vÜçÀá©5™ãëdZñÛ–V>ÓÜ�Ó’òeYÃ73¤•Þg>frõ ØhFø{K�?–•£óµëËX¿ÈÅŒûìÉX ¨‚ Ò…8¯ Žã’êàT‰Læl*—_Ȕ椂ñ±9´4ë,[¬sçïM�ÉÔ„ §$y¾*ŒÃgØšÊñ¹–0±„ý'Œí®åÙÓ E SÂBã°o“WŠ¨Ð Ès.ºT �¿ ÕòI;„›ñÑøù® ²ø…"¯$z±-š¹Îñ™Ì·~õk`æËå"¦û:�BnZqˆ¼“Ùn„x4TMPhÀ všÍNaJ‚ﮬâ�#x¸ƒ&¿îsxÊâ7OÁýÁ8ë�0‹5! Û/ä^vF±”d½âK¡n …)[›Ç )~¾ÍçñÑòÅqðÞ@Œƒq<ÀV’§òIöxùI÷ÇL”ËÏ;³áB‘g!´ÂÐr)“90(¹Ï‰ó #ЇBØãçyÆ&_4s+´ O__ÅÚ�{äŽÀ ä$/½ï±ÅÍP§Üˆ³X7@¯tyÍÉpRºÜ]VÆÝá(-×;˜Í6šì{-ÂWzØ/ '8$ª¢C£P˜Bð+'Ë&;5%¥Õé\“9+P²a¢PT‚óLæÉ^ŸÈïB¤ß5H%Y[²}(Ï¥Rd�ÄÑYg†XmùÊ]Aª#ö°ö†qNH»’c¶‹¥$QQ˜FÚRDÐ5Xü¼œ†€#èßâ©�4ïxYŽKG)bBçÁ`œez�‡âÿÜ›�Qü+=ð ¸Zk2g­J1>JÈ1�Ì 2yÉÞ^—݇\öðh}7ÆÝ£1Ž(›C¾Í'ÂZÖ»5^J'Üâ�}?‚u,ˆWœ „ê<´€"ßgRñ© F…OþpˆaÇçÕ}‹0YiyÚJ²É@GfÑŒ©éÿiñT˜Ì9%€ó[^¼)Ü þ0ÌØÖ rXq—žHž� !ªêm0fµ‡›4�9 é ”'0â>�:§ß@C#½;Ìá¼ÃÝ¢C±ªÂKã¹� ?ÌŸ&¯äìXES‚ɚ̹+€ñHy9ÀØÛ&2'ŽA0x‚l¯O¨Ã#Xí`wid·ñ†5´ D ËBDñ"⣯Íp`g�ýýŠ‚Û¯‡¦5.¹® Ùý!g]Æ”ä]7Ë3ùÁ9.e2‰Ä<€™œx´ŒÜv½ð3o  A ¡è!lpR>áõ>F­Då^J l�Ю®Ø~Äaï�t6$ êsAŒ¨$v[†ÌÎ2ò]4 ø�dzg$ìO†®SYUA"Ñ8 aä¥C? â'5Ô™ô¿á‚È*�uDau)”"¤·)‚‹Ò/üÜŒH’ñ�Y|ü1$XÇ‚…ëHð…"‰Ï³ö0?³G®šé›.æÌ‚�’�¶@¹Pÿµ<"¨°v¤7›¸}¹ƒ wHl†È*�7)¸½ -Ð`”AX‚Vï E]¼œ@D4ܧWGhl•ô­Ìñf·Åp¯":¢aØþ¿®ÌÜ�ÅÙVJç÷é ="·]'¸Ú§úa›Ì–Î1#¢!Lð†Á¨/Y¸·ƒò=¢7Ù„7ø× Ò¯ÝbRv³GÍ£yôfÿl&³»Ûgÿ!Ÿ=ÝYU.Ÿt×Í \ˆ2#°;5ôJE E¢pºt¬Ý:þ�޲5Ü!PŽÂ¨Sè1I`…$Ôêc&$˜ Ó/)0"\(‘NE&s61?g£‚WŤ8]T’‚W(®–�ÿþ3•ž3—“›hW“ÈdNG¹|RÝ4o0ÃL”ÉœŽrù¤Ú¹ €éãL”‚«^.ÿ¨,`¡‡š™X“¹ €YÆt›ÌÌ®¦É\ÀeªLæ‚æ—c20�9ÏO\`2�v{:ê/àZãB“9·‹A Lš øs ÿ¯Œ`A×<ÿ5;«%+2Â6%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:39+00:00eˆ†¨tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/BOB.png000066400000000000000000000006271520501070600173110ustar00rootroot00000000000000‰PNG  IHDR^@a ݶgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÕ+Õ,ì¢ úæùãý塽z4y4ÿÿÿ­ªªbKGD ñÙ¥ì pHYs¨¨Û;tIMEæÓ¸UÛ¾94]Ö-[–l)’e)–�œ^6NŽv¡¨p¥X’8¨â(ŠÊÖÂ^,÷.ì‚�P�,�%Y EØØYÈ¡„8ŽbKò%ÉŽîktŒ43ß÷u¿ûc$Å‘å[>¨õS£šêùºûé§û}úíþ?¼ qÄùnÀ‡‹ŒÌÅEFæâ"#sq¡0r¡´ãBh ’ØZ!‰é|7æü3¢ˆ™Éøjq8a|ÅLŠøÿ)#‚ ˆ}O‡¤ÙR·ÿðú][êö‡¤ñ=­ˆÅùS‹ÄM‹Ï}­šØa�zOñÀ“«[®-c‹uyñ[‹¦œÖ±(ƒµ`‹ó@̹ֈ$Äž«óƒîC�-�­i+ ¹®K ¸.•†ÜÇÖ´=ÔØ’t=W byÎ'Ñ9Õˆ&ö�d+o[ÒûĪÖ5y“¾GÌP”^_a-¬¥†œ©Û‹ûû�jÍb&-ì¹ �›}�$¶Lì©Êh|kmûõ…£ðáÙù×QŸI †ÂSýÙw¶V¶�GHû‚Øœ“XtÖ5Biiø „ÏWv=zi[U4éy@ðô¥K 0†ª¢É»Jû ¦Ñ(©¥å³/–³Ëˆ"¶ ëéÆœñ_¯j½µ|@Zx†±µd­`@„I cÉZ@ ö iâw�¾37ör<£;†´égþù1BHW%¤ýjuçOë÷—†]×#Ø "–aÈ  ðŸr¦Ú÷…£� C†YH°7]Ò3´$ý£´?¨ü§cYÆSêlŠå¬¬#ŠØ·¾¼¶pxKÍÁê¬${0L`HÁx©¥øÉ]/¶–tôeÅâAÏZÙœH²¢hìŠÚžÖt\¶¢!pÆ’˜4ö�7·-ÛÑŸe”°þYXY˜A °ñt$�úNuç'–ôƒáRÄÆ±Há�m+¿÷Øšæ¶$H i Ä`‚! #tkz>ýÞ]·nÜ�¼¸�ÒúLŽd~x¸ð³û–ÆS©=Ù РɈ&öŒ„¥÷• üGM{Q†g\D`ˤ²øÅ�%w~ﯽ¶ÚPÈ•‚™Áüf¼!€ˆ‰`,qÂ�'/½ôðÖOo¿b]�?F‚˜AK}“úî¶Ê_õ@°–Æ[8±,Ì:"‰‰È¸º(œx ~ÿWªßˆHëú¤¦ÛI2“¿ó“uøòûú¢:š$m-“eb&aæÃ f²LIǨ�×Ó“ó£ÿYuW¯ëa—,ž¡,Ç| d¸>2ùÌhæx2(”�áë|32\%[º½¼ç7�m«rÞô]$3øsßÝð÷ß¿ž2R2àûFðI išðA¼mGÝDŠnø‹ëÑ›^neöÔ�%ýÃF¾‹² žÏˆ9\«£ñ_¬Úû©Ê^œ®DࡲøË[×íÞkU^œ�td=y0«°ûüóÕ,¼k×öB&‚ ø†BÒ¾»8ö—Ùc/ŒG§B�Vž™XN“‘#}×—–þÕ¥{+3SžG4ã»Òtè¨}t{Õ]_·ÌNX>)iÌ[ƒdØýý U—VôÖ­ö“B  ø†–e&ï*í󈟋e�¡—;�•Uû–à«uy£÷ÖlÌ�„ï­© Ë$5�O„–ßvûàpHhßÌ‚!ˆˆÀ`fË`>AÀ‚­«òrâûï¿/'+e}¢#ªó™414šG2îh]¶s8ÊW‚O#<ŸšF ‰}Oie¿qIÇýõŠCž;3·�„e!B¼ùW=ÿ»å:j¬UŽTDB m<Ÿxʵñ„Mùì[ABJ!H¤-½4‡"fÒŽ‰d%›®éHÏ�7F`À3Tv?QÖŸ©½§cY¾§”´À©mŸOA#³¾ëEC[jÚ+£IëÁ2Í·a'"NúE_yêßÊ•vñ—ä—ÅÌhyfQËÈ¡ÊPi×H eÇ�½�­:‡FG\;•Y„B ;å"¨�z(ØP(èí¿ÿ¾Ò¢¸qIUµaÄB£}<¸¹­r{ߢSõr'¥AÄÆÕYoKÝ�o×væhßõIæOv‘"cÕ¢»'V®¯oÐ~A¼²";R@Å¥ã™C764²éž�l _2UUU¸(²¨{`Ü›ò®¸¼²{pLŠiɼ9*ʺ±HQÑØÕëºÍ[e2ÛTìƒ`†åôFfš$…p”92äXæ7õ5=½ÿ•扶ݣ‹œìPGJ¸áŠhCc¾ŽçîßsŠœ€0qýöËÛjMRgîÌv'íå‚’ßY».gô…‰È@< içíÎ\FÒÃ'‰¿^Óñ_õûÊ3æú®3Â$CüÜ+e¿}öòà8ó%íìšÌÓ–„¨ cYP”ñÊîÞm�îïÞk×Ww}ðÊ« ×ø•¥¥­¯�OŒÅ@‘ëÖXWßg“tBFÒ˜õr‘ÔÝe}Ž¿#–eAGw똞z¡vØvf¯>]¹åP@¿gcý¼…}cIÒ�®ç‹¨zöùÖÿ̓O|sb÷«#û“�·Ü¶âÿ}ÍúËk0’<ÃV§wâ袦/îY^ÛÔøÌpT;,§fþY)ÌŒž ""ölúŸ”ëÿagûlY"š©´1#­°–efHd:¿ÛÞºéƒ?3;Ê÷õõ¦Š‡þã¿ÞðÑ•™ÁS#Ågíð3ÃÑÚ¦Æ/îYn˜h>jŽéG´2‰À=…)µ!g,è°o(�>!ýBat4ðÀö(K$l¸¸$'>™JHN¹éYCDìú$åû7Ö·µÚ©9rÖ­233dH³µ;¶·ìß›¼ãºkÿè½ü® u7-}†’�â(Ãr4,`˜´æ)O|¦µâ“-ˇRŽvüc%k�9k<&©ŒvKGYuÓêÇ{sµf)pÂx.ðPU‹d%¬+ìDâúkW4Ö/‰–�H{PÏ/-ˉF�lßéÕk*Ø·s&·1–©¼Ð®:7ÝüÓÔîü·WÚ7ÓßãÁc’Zóã½¹ÕM«·t” a¥:ž+9ÞÞÜ0Y@;^w"øÞ]u77W$µã°�NêÌ"6NÖ•÷«Pf8/ÜÑ5202éÅSJÊ`H¿uWGÖ";3d}Ã<ßB7-øžq²C±Á‘Í›wüçÏ §ÇΜkÌ/ &Ëä8<�Ô77W¿wW]w"¨/-™ã�(N�IH+µÿpWQuÓêûHÅRòqh¶–Â�k[—”ÖTæØÝÕ݃’9Y¡·­­„k„ t?IËÞî‘ñÉ$€É‰ä®]�$Åœ=`ì�¼RQ[W"2Cm-[àÀòq.Y*¾ÿPAUÓê‡»Š¤ö…´'“|<��Þõ…C[jÛ—{§—Nô DÊ?úq?éÈ€`†õÍ’²Ü¡ÑÉ©x ‚fõ@f4\RÜr ßØY·>K`ß”–däEZ EBÞë[¿_\p‚�ÞÁñàæÖʧúOy§w -ŸI+Ç{j ¯¦©ñ[J„€RìñÜv b/%JÊãwß´ɰ&]@)@hèÙN³å€£VÕ AlÁ¾eÏÒY×g߀@DŽâTxÃÎâ%q/)æÐÁ€Ç¤ �o(©ij|j O9ž SË’œnƈ žZ›7zoíÁÕóeŒ˜I(Ž�ªn»}x$"Ÿ™Ø³HyW®¯^\”õß¿Ü)2ƒÓn…�„‹°ßF… Þ¾±P8`™+ÊrõÄJ ¢Ë—ä<ù›Öü¥fß�îÍŽ3côÊHÆ­Ë^ΆöÕ)r‘ÆédÓVO+Ó5¾¯»0å‹ 9cJÃ7D3ᙾ/2rýêÂØÃO6ˆ€ÏI -{'ö¶Zy„Ù$ˆ€Ëá°ã›Ž7®ZOHAZI€w5wBe=xÏ#«ê½)1ûkž ®Æàž}å·ì®îI„´ötz‡¡§Ÿy¶ )-Ï æþ|0¯.<µ<š$žöB„`?)êꆉÍÓ¨Q.3bËÖÎ5Ðé9$¤˜ŒMÃ�õW.îÙ}¬äÚú²?µu��O"‘ó•;¶ßyókÞ˜PÒÎJC H�ƒY›šë~ÝSiÓg]§×©3bψe0øIwaOR_“3rl:7A!ئhÕ‡'=<×T…€¯¤µLÇ ³ @ Ÿr'’ "˜Øx ™ŸÿØïÿù®gMœÒê° Òš'<ù©–ÊÏ´,ñô™HcaI#-Ø5œ}_þÒ@jeö” x–¦ïCx´ñm�Ù™“Û^\n“Ž zD˜“—ω†’)ˆ|×LŒ%¤CJ2Éœøhâ_?ûäß}¢ÉN�‰à1i ¡ðËž¼›W<3˜+´ t ¼0gz b@+3î©_ô¼½-{<;d¬AÚ©›]uyÏ�«îêÈïéÌg+H%™ÒBÊõA,B°’€”vÊ1“NyÉžß|õÑ÷ݰÏ'!xº"½ }ëëUÿ°oiÜ­�™>\œÅ“ðoWwÞ¾¤€ëqîâ'Ûê¾ûØÚWÚJ�p ,Ô[OÂ} +rW×ô|æ¯^¾eãè#N¸ïpáçþ,NÂg1ëå6 o­m¯ÎJ̽-‘ÄΖ¢m»*^l-9Ø›‹=_jer"ÉeÅ£WÔöl\Ó±nE‚Gß–ÝÙZùôÀŸÏm‰#ž;}²#´ù§e‡¾TÑ ×'6VHaEЀN žp<#´´‘�Ka@lé’>ÈQ ‹é(ýÛƒåÖ“Jû†ÏÖ%Ƴ{3oÖË5æŽÝ[{p]^|ÖËKé3])˜ÄtòŽ-Žü~Öw½4¹£uÙ«#Y§í»Ng÷Ú¬—ëž ý°»0îË ¹cZ³oH–‚ÓÉ>¶`KÌ!½¸‚¦}—gè‹{—~lwU_2¸ Áõ<32Ë‹”„¦¡œòjÉꬤ˜ñrÍ|á»¶÷goj^ñÛÞ|Rgê».,F¤C£Vf8øYwá¡„sMÎXFðM/7Í]Úw9<š’›[–}¾mYÌÓZû \/F¦; Â’°Í#Ù?îÏ_ì¸ 3^.�ÊMû®‡ºÝøêЦÁ\¡}çèbï,ÎÑ�ç9ÐÄž°ò¦â�ï×´—E\x€FWÜùd[å¯{ Œ>¹Ï‚ãü¼;aA‚ ¥i‹ní)È•þÚh|ëá¢w¿Z»g,ª´‚9/Nà|idÓ^ΊÅSoL†!ìYò]'�óü–Ÿ¶Êc*$•OgÙkœ N|[âl#�òžãôX8ÿo.¦aÏü „ …‘ ™‹‹ŒÌÅEFæâÿysD=Gø%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:31+00:00VgÈÏIEND®B`‚qalculate-qt-5.11.0/data/flags/BSD.png000066400000000000000000000014361520501070600173160ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<¥PLTE2;‚™«Ê¬Ë«ÉVešµ­Ì#)p„¦Ã­Ë:Eˆ ¬Êq„Ud;E¦Â®Ê«É«È>;nŸe¢Îr£Ïr¡Ír�qæË9ÿäAÿâ@þá@3. ¤“+òÙ@ýãCúàBVMDz5ûáBüâB}p!áÊ;~q!ìÔ>ÿÿÿ Ó†bKGD6G¿ˆÑ pHYs¯¯^‘tIMEæÓ¸UÛEàSâ뀟ÿÍl˜S�> Üü˜5Õ·ï±~ ü�. “à£ò?îôˆ8e xцþé��“€,ð3�û�›O5ÂiÊ*à@÷T$øà~%péF•§< |u*¦ZÀ€ß”¼²@ip“`œRp=¢µ “#ûAÆìÏî¾øÐŒƒÕyzîå¸Ý›1ǶáFÞg 0`\@ƒ**PMÉÀÝÈúp’LЀ,Õ¿øRààtݾ «s9¡�ßC誕¨ªY¢ ¡*tËbTE³hˆ1ÅþÚ�?Œ9ãóKWüjo ª¼ÝtÖø£X&cЭ‹ ]õÄúq#;p¶?…Ûõª�Q˜„=,oë³Ó½f0Óˆ9gŽR�¶E•ݤ§Ò)´.ªnªjöø£cÛ ~PÞì· bu^‡ªl�ø}a2 qá YX…€,µø6þz¬·÷Mù®¼ ݸp¼m`fèhP‹¡Fö-ÿ@r ¾܆ìß‹û¥Öó<€U†ªž�ªž�>ó2pLp>ɘ˜ÃHÕ¸U5nyî±7!1”€lÚn¾›& Cý7ϳ�ªž-@uȧ}â3U3‡²O>Š:"¶ž"ÎMbº7Éb•EÀgñ¶Ñ±•³°~xMuªá$x(ZLdî¡—1ÑýªDUÍ$wÔ­DKÊ›Äõ¥Þ3Äú Ö�í"‚Ñ„:  oç¨< hþ‰¤²`ÀM¯ÜªæLBW?Šn=¿°®b܃ëpÞ|ZK Efò@Rkב¥"i¬`DiqƒÚÆ Áôíö/1Œ9q’£¹»*oÂZx#¡O=Ž}Á U-ò0§ÁeŸÃ ”U¡êü×UçàK$7üUÛŽn=ݶݲxÜEfQÑŒý‘ï *[Hl¸’1ŠÐ„r$iû‚�>Kƒ�¸¶ê6TÝü›�nÄ ¼�‰¾ƒûî¿á�ÇЭK°?t;zÞ2Ù0M`Ac-º·o7Îö§Šu�K�&�$5‹v}þ ºélT¹Ï†,1,þ?e.Ê’gïþ‡øÚ8ÛžôWumc�}jF²,ó��ZÔ—„e¡[—ø®Þfð&úvV›BÇI¾þ0f`¯·µóP5mņÈuÀ�œØä{h1 ñì¿å\ßV·o'&Öç¯ÆJËièH^C`W©ØÀb�„¿%Ào$¬�çßܽœxŽo]TYª¢Å¿ÙÃÄð†tØÈY] pÑ�9ìßÃŒFÅ¥%GOÎY!¬Î娆ÿ¾»`¸›2òslJiÿ3—œ¼’XeØ—üëì›1‘·pû÷bFzÀ‰£f4 ç\Š5ÿZÿPqŸf´?ˆMR� T�Þ³ÿæss´+TE³„¾³/–#âTnP‡& yÝÞí8;þ$¢x*mJ±¦ì?‡ÿ÷=ÅPÜ$îÑM$×ÿsü@Pû««?“Ûbg×_!\#ïÔ´ÉZ0™ÄIn~gûÓ˜Ñ� ·ÇØHq‚UlGdû7ƒGH¾ökL¬UÞˆª_ !ðÜ+ÐÍçøÛ}¨=ï*I¨^?�L[’©ÌP&··o§x f¤÷ðz’¯ÞGâùÏ‘xñÛ˜ÈB5zæ„®|ÝvI�ç#ˆ‹rû7=[¼ü?²ˆi ”…‰ àì\Eü…;ps̲ªš…ýáo§d@#59E‚v¼Y1`tãY¹ãÿcÛð�`”„Áf`/ÉWî7ç#ºu‰$NÝ¢3Ň4 ‚D‡Ðg~B®…pzîeþö?Ôåÿg÷gáöíÂDø·Û3Pµí¤»m¤+I!îÐ8èÆE„–=v™ ÚC·œçûº™$þO÷ Ê*C¥rƒ~ŒHoØH)ZI‹å)½àÓ¨J‰Ù3sú¾ØÒçx$hÏRy@WH�½U翇ÀMÂpOD�­6bûó&À¸¨Ú¹X ®�ö'Vçõ¨Ê™¸=[0ý{0Ã=²©ñž*\ƒn»û¢o�ퟠ2±>Üþ=AhÁ><ˆ uxå÷½AU´`Fz!\ƒ ×Ošª†¬†,s+&~F"b‰I§WÎDÕÎ�4 nº7aŽ ‚€ÿ})»_‹œ¢N?/¨,Üž-$ž¿UÓ†j:GÂæsQuí¨p]îA*-íá:T}fÉÉ]“¤.*v‹y˜Ó ßF¤1¿´¸q1ñã˜Þ8¶ g×_Pe5¨š6¬%waurÌ�g÷³’;ÔEÏþvszCÖÖ——§m@aâ'p{ßòŽÀ<žÆŽ“Üòξçe#“o*˸8{Ö�|å>/…^ô.ð9ó×·9j/ªk#¹|� ›è~’¯Ý‰a¬ù×Èù¿%¥f与ÄvxÜl\“ÂôïÅÙý,Ξ50v"Û?èaÀ._Ñ•:*Þ�”ŸÞ]\ÿ.ª¶U3žh2½Û!1$@«g§Áã:$_¹÷ðTÕ¨òFU ⃒8=~3àÁøÿgðêŒËWt�ü<Žœ^új ªe”Õ¤ÿïv{çÿV•qDfFûp�nÂD÷c¢ïpRt§”<°Íê~cZ²)݃ÔÞhë�œî¤@ŽE%TyãÄÒ˜èÛ˜¡.ïÍJ§¥ÿ”E™OO\ಊ«5œT9õ$ðbÁ?£ÎÞ¿ãl} ÷èFL÷f̉ÃÒT?UÝ6NÀ±m äd²9'³�ùÀ[ ú‘RÓs(¤ظ¸×á| ʪQ¡ Lb�TÐÄQV(�Û³E#­m’„.‰ƒ'Ï¿û€Ð…D³‰�c'É! ˆ&#Z.Gðð1´\ŽøýG„¿½LôÆM’]ODñUǯ{IbñÜY>9ˆšÉàmÞ@òq7ÁCǰN�kÑ|B[]¸DéÊ70W–Ó÷ñ îÌc«ÐTíUǯ{IbôfáK—q¯|ÿÛÍ8fM'øùqR=ÏÑr9{`(+Å·k+Þæ&’Ý=„΋d1zÈwÒŽ˜²G²Û(ß½“dgöi� �þ5™$Ý×ÏЩs”ïÞ˜Ê}dúú ·\!;BM¥@^õн±hö ²Ã!R=ϰM®#ÞqÇô)8¦5"9ˆ¶w`S�’L’ì~‚uâxŒž24Mä;Ñ¿k+&¿—à¡c$=fàØ)ŠæÌ¤dÙbìÓ§P¶ná–«DÛn1øå”Dߎ-È®bÐ@Þ:ñnÝH²»‡ç¿ûo´\ßÛÍd‡CÄÚoãÙ¸sU/>ú”ÐÅÊÖ¬A ùXŸÑä÷RòÆŠfM#ñ५–S4k:™àÉîLå>|Û6‘é `,uãÙ´£Ïƒd³ê]@�mS&mm£lýjÔtçâDÛoc®ƒ¡¤„Dg7æqU”,û”z2Á,ã«1ú<$:»^uüº—$ÆÚoóì?ÿ �Ê_¼G²«›çþ DóØJ{÷3|æ<¾�[°Õ×Òû‡�}Óè£ÿB ýÔâÜ£e²dAl uEM¥P“)²ƒÃ„/]!30„­¶†‘ÖvRÏ_�zÒC¦¯%2¢O󜘋ǑlVÔT %ž@Ëå�,f”x%G�eID‰ÅQâ $›-“EÍdõ›_Äòw¶“q¯X†Éç¥xÞlrÑ8ÞMë(]³ƒ³se9ÖÚJ–/! ãZ¶Kušª¾êøu/IP³Y-t¡Éf!xäK|Û6¡ÄâØëQS)²C¨Ù,Ãg¾Æ6¹¹È�mr-]¿ùg—®è«�yNLõ<§xÞl�ŸaøÌyF®ÝÀ¹hÉÇÝD®´bŸÚ@.fàØ)ú?;‚µnj&Kv8¤w@ŽÝ¾ƒÔÕMèÂ%4M#xäÎEó‘‹‹0¦3d‡C>=„’H¿û€Áã§±NOv`AoyO,zm�}‡ÉÅã¢HæE�Obª(§ø¯^cðØ)b7;F³~šFðð1$› ëÄ ú H?¯®Ý3|ælµ5hªÊ³ß~H6MC@@‰ÇQSir‘™@AÔßùLø~îrMMg0¸]ÈÎb2ýAr#QŠçÌÂèó0xü4‚ш©Â�–N“îëG0D5�yÕñë^’(šMhšŠkÙb&þÓJ–/EE¢7;>{MÓ°7ÔQóÁ¯ñíØ‚ IˆA’õý @ôÿt’ÙÌÐɯ8~os¦1hÙ,j*�l·ã{»™ÄÃǼøó'hŠBɛ˰ÖMDS•W¿î%‰î7_ÇñÚtD“×’Øjk(Y¶MÓÐTÇŒ)Ï™IñÜY=¥˜ÇTP¶~µ¾\ äpËU|Û6’xЉcj©g½„[®"È‚(ë¸GôÖœóçâÛÙŒ�“ ‘xôXo@vΛƒ¡´{ãd4 ÿ³#$=Æ1} F¯‡¡Sg ìý {ãd\K‚ª�‹Æ1UøÉ†Âz. ω¡K—�Fdg1ÑÖv†NžE²˜ñmÛ„×VL匴¶�^·Z�ìvâwï“~Ðo~Ÿ$v÷J"IàÓƒdq½¾£ßKndï¦uhÙ,ý¿ õôù™ÁÜHTOi·ÕµGËåÈ…"~�Á]BÕ/ÿ˸*$» Û¤b·î¿÷Á` ÕÝÃàɳ£÷^/ É{²{õO{™X{j2�×6ÔD’\8‚Áíb¤µïÖ&�::ñ‚,co¬G‰Ç‰ß¤óœXþîv î]O°5ÔRÖôÉîúeð˯·\ŵx>®% ÉP’I|;6cp»õmá@´NªÁ³y¢ÉˆÉïÃä÷ao¬'vë_œ-qرN€ûÍeÏ™š¾TD÷Š7(ž=5›#üÝUÌÕU8ÎÅ2~,Î%ó¹ÖFn$Š¥z,Þæ ˆ³ž.zþÿœ0tú‘k7 2ÎùsIu?%|é*ɮ¿£hö ä"ÇèØàÀÔdJß^ ÄÄÃÎÑ­àé é¾é¾±Ž{ا6P¶~5Ñ›(щG£E Cg¾&òýuô—G!�v•íI<ìÄäó’ììF²Y±Õ×Rw‘þýŸãÝÚ„�“¸÷ˆØí;X'NÀ»y=’ÝFøò5¢í·_uìº�èÛ±ûäZ$«ßöÍËJ �ÿ†L_?rQý‡Ž" x7¯Ç\U‰¡Ä…oû&ä"‡ž*¢ká<ÔL†\8‚ãµé¸W-GI¦ì;DßÇûI÷¾ èµ£×I”X Ûä:Lå>½<¼ÈáËßcò{I<è¤|÷N¼[6¹z�XÇ]„»FŸø·· 9<ñJ<ŽÁí&ÝÛ§ €ì\0—îþ•Äý‡8fMÇ1µ点$=FÓr£³�© dúƒþ÷J,Îøß¼�½f‘+­ziXž“‡Îœ'ÚÚŽ`� ]lA4™þú›Ñ§[ˆ¶Ý&òý ”XœLp�ìÐ0Á£'x\e 7fAõ�Ï„Ö%oiÙpos¾­Môí=ÀÀ‘/G÷þK"J2EÑÌiŒýÕß½~“§¿ýšÕÄþ¦îù$}�×d5•FDB_CôÆM2ýA4U¥hZã…!±;÷é|ÿÐÒi4EAÍæÐ”‚>Ès¢oçY";4L¢³ %Gv8ðíÜ‚ÿÝí˜ÇT¢¦Ó$»ž�î €ªáZºsý$4E_Îw¢§i ö© £u�)u-[DÑœYXªÇâÙ´Q–GÀä÷âÙò—%a}M8ï‰#­mø¶mD¶ÙÐTc¹ßöͤ{_¹ÒJéڕا5ŽV e×¢Æâ¤èu…@´Oi xþ\\K"ž «±ÕO"!ø!ó'Y-Ø&×R¶f– Õæ†#Ä€!� ¿òš(Ûl(ñ¢ÙŒd³"È2J2…d³!Ùmh¹š¢"Ùm£ç &’ˆF‚Ñðªc×ýDÿ;ÛÐT÷Še¢ˆëõ…ˆf3eëWQ²| –qUØê0¸Kp.˜‹`�q¯\ޱ²Mßž÷UQ´hkJ2ƒCÅ6oj<6ôd`ž­µ5ôï?Œ¥z,•¿xA–G¿VâÂ>} ÁÃÇH=í¥üÝí¸–,`àøi4À\S­ŸX¤÷Jü{b·îPñ³·±7Ô#C§Îa*÷¡&“<û�?R$ÛèBpŠz�çÄŠ¿~‡ìÐ0Ãç.â˜1•à¡£HV Þæ&<ÞÂV?‰þƒG1UøIv=aäz;¥ëVaž4^ï €è˜Öˆsá<†N�£oï¢×Ûñ4­Á<¶A–G¿ 60HàãýôøKõX\Ë¡¦Ò¯:vÝ�@Œ\½ŽoÇfD£‘þG°L¨Æ³i-‰G]„¾ý×’¸–.dðÔ9RÏ_àßÕLnp˜t÷S}9¸ˆ¥«–c›\‹kéÔT𲵫0”ºGO MgdÏÆµ²Œ­n"Î…ó°ÏœŠ¹fœÞ€ÿÁ5Ø¿¯É"€%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:09+00:00ë�KtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Belarus‚¹³IEND®B`‚qalculate-qt-5.11.0/data/flags/BYR.png000066400000000000000000000073401520501070600173420ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæMÜÀx ‰IDATxÚíÝÙoTWžÀñï]j¯²«\v-¶1 ¶±Ù ;!tXÂf³…¤IkZêÑh¤~˜~ˆÔêÑDš‘f¦f¦Ó­žé΄I€!@Ø lÀìÆÆ€q¹¼T•k_î½óàVþ"¡ª¹ŸÇ[/¿Ò=÷žs~çüÎr#QM´Yyú/ÿNßÞÏÿë¿Ç³y#­m¤žõâiZC´í÷ÿöWØj™ôo )*ù>#­m’„.‰ƒ'Ï¿û€Ð…D³‰�c'É! ˆ&#Z.Gðð1´\ŽøýG„¿½LôÆM’]ODñUǯ{IbñÜY>9ˆšÉàmÞ@òq7ÁCǰN�kÑ|B[]¸DéÊ70W–Ó÷ñ îÌc«ÐTíUǯ{IbôfáK—q¯|ÿÛÍ8fM'øùqR=ÏÑr9{`(+Å·k+Þæ&’Ý=„΋d1zÈwÒŽ˜²G²Û(ß½“dgöi� �þ5™$Ý×ÏЩs”ïÞ˜Ê}dúú ·\!;BM¥@^õн±hö ²Ã!R=ϰM®#ÞqÇô)8¦5"9ˆ¶w`S�’L’ì~‚uâxŒž24Mä;Ñ¿k+&¿—à¡c$=fàØ)ŠæÌ¤dÙbìÓ§P¶ná–«DÛn1øå”Dߎ-È®bÐ@Þ:ñnÝH²»‡ç¿ûo´\ßÛÍd‡CÄÚoãÙ¸sU/>ú”ÐÅÊÖ¬A ùXŸÑä÷RòÆŠfM#ñ५–S4k:™àÉîLå>|Û6‘é `,uãÙ´£Ïƒd³ê]@�mS&mm£lýjÔtçâDÛoc®ƒ¡¤„Dg7æqU”,û”z2Á,ã«1ú<$:»^uüº—$ÆÚoóì?ÿ �Ê_¼G²«›çþ DóØJ{÷3|æ<¾�[°Õ×Òû‡�}Óè£ÿB ýÔâÜ£e²dAl uEM¥P“)²ƒÃ„/]!30„­¶†‘ÖvRÏ_�zÒC¦¯%2¢O󜘋ǑlVÔT %ž@Ëå�,f”x%G�eID‰ÅQâ $›-“EÍdõ›_Äòw¶“q¯X†Éç¥xÞlrÑ8ÞMë(]³ƒ³se9ÖÚJ–/! ãZ¶Kušª¾êøu/IP³Y-t¡Éf!xäK|Û6¡ÄâØëQS)²C¨Ù,Ãg¾Æ6¹¹È�mr-]¿ùg—®è«�yNLõ<§xÞl�ŸaøÌyF®ÝÀ¹hÉÇÝD®´bŸÚ@.fàØ)ú?;‚µnj&Kv8¤w@ŽÝ¾ƒÔÕMèÂ%4M#xäÎEó‘‹‹0¦3d‡C>=„’H¿û€Áã§±NOv`AoyO,zm�}‡ÉÅã¢HæE�Obª(§ø¯^cðØ)b7;F³~šFðð1$› ëÄ ú H?¯®Ý3|ælµ5hªÊ³ß~H6MC@@‰ÇQSir‘™@AÔßùLø~îrMMg0¸]ÈÎb2ýAr#QŠçÌÂèó0xü4‚ш©Â�–N“îëG0D5�yÕñë^’(šMhšŠkÙb&þÓJ–/EE¢7;>{MÓ°7ÔQóÁ¯ñíØ‚ IˆA’õý @ôÿt’ÙÌÐɯ8~os¦1hÙ,j*�l·ã{»™ÄÃǼøó'hŠBɛ˰ÖMDS•W¿î%‰î7_ÇñÚtD“×’Øjk(Y¶MÓÐTÇŒ)Ï™IñÜY=¥˜ÇTP¶~µ¾\ äpËU|Û6’xЉcj©g½„[®"È‚(ë¸GôÖœóçâÛÙŒ�“ ‘xôXo@vΛƒ¡´{ãd4 ÿ³#$=Æ1} F¯‡¡Sg ìý {ãd\K‚ª�‹Æ1UøÉ†Âz. ω¡K—�Fdg1ÑÖv†NžE²˜ñmÛ„×VL匴¶�^·Z�ìvâwï“~Ðo~Ÿ$v÷J"IàÓƒdq½¾£ßKndï¦uhÙ,ý¿ õôù™ÁÜHTOi·ÕµGËåÈ…"~�Á]BÕ/ÿ˸*$» Û¤b·î¿÷Á` ÕÝÃàɳ£÷^/ É{²{õO{™X{j2�×6ÔD’\8‚Áíb¤µïÖ&�::ñ‚,co¬G‰Ç‰ß¤óœXþîv î]O°5ÔRÖôÉîúeð˯·\ŵx>®% ÉP’I|;6cp»õmá@´NªÁ³y¢ÉˆÉïÃä÷ao¬'vë_œ-qرN€ûÍeÏ™š¾TD÷Š7(ž=5›#üÝUÌÕU8ÎÅ2~,Î%ó¹ÖFn$Š¥z,Þæ ˆ³ž.zþÿœ0tú‘k7 2ÎùsIu?%|é*ɮ¿£hö ä"ÇèØàÀÔdJß^ ÄÄÃÎÑ­àé é¾é¾±Ž{ا6P¶~5Ñ›(щG£E Cg¾&òýuô—G!�v•íI<ìÄäó’ììF²Y±Õ×Rw‘þýŸãÝÚ„�“¸÷ˆØí;X'NÀ»y=’ÝFøò5¢í·_uìº�èÛ±ûäZ$«ßöÍËJ �ÿ†L_?rQý‡Ž" x7¯Ç\U‰¡Ä…oû&ä"‡ž*¢ká<ÔL†\8‚ãµé¸W-GI¦ì;DßÇûI÷¾ èµ£×I”X Ûä:Lå>½<¼ÈáËßcò{I<è¤|÷N¼[6¹z�XÇ]„»FŸø·· 9<ñJ<ŽÁí&ÝÛ§ €ì\0—îþ•Äý‡8fMÇ1µ点$=FÓr£³�© dúƒþ÷J,Îøß¼�½f‘+­ziXž“‡Îœ'ÚÚŽ`� ]lA4™þú›Ñ§[ˆ¶Ý&òý ”XœLp�ìÐ0Á£'x\e 7fAõ�Ï„Ö%oiÙpos¾­Môí=ÀÀ‘/G÷þK"J2EÑÌiŒýÕß½~“§¿ýšÕÄþ¦îù$}�×d5•FDB_CôÆM2ýA4U¥hZã…!±;÷é|ÿÐÒi4EAÍæÐ”‚>Ès¢oçY";4L¢³ %Gv8ðíÜ‚ÿÝí˜ÇT¢¦Ó$»ž�î €ªáZºsý$4E_Îw¢§i ö© £u�)u-[DÑœYXªÇâÙ´Q–GÀä÷âÙò—%a}M8ï‰#­mø¶mD¶ÙÐTc¹ßöͤ{_¹ÒJéڕا5ŽV e×¢Æâ¤èu…@´Oi xþ\\K"ž «±ÕO"!ø!ó'Y-Ø&×R¶f– Õæ†#Ä€!� ¿òš(Ûl(ñ¢ÙŒd³"È2J2…d³!Ùmh¹š¢"Ùm£ç &’ˆF‚Ñðªc×ýDÿ;ÛÐT÷Še¢ˆëõ…ˆf3eëWQ²| –qUØê0¸Kp.˜‹`�q¯\ޱ²Mßž÷UQ´hkJ2ƒCÅ6oj<6ôd`ž­µ5ôï?Œ¥z,•¿xA–G¿VâÂ>} ÁÃÇH=í¥üÝí¸–,`àøi4À\S­ŸX¤÷Jü{b·îPñ³·±7Ô#C§Îa*÷¡&“<û�?R$ÛèBpŠz�çÄŠ¿~‡ìÐ0Ãç.â˜1•à¡£HV Þæ&<ÞÂV?‰þƒG1UøIv=aäz;¥ëVaž4^ï €è˜Öˆsá<†N�£oï¢×Ûñ4­Á<¶A–G¿ 60HàãýôøKõX\Ë¡¦Ò¯:vÝ�@Œ\½ŽoÇfD£‘þG°L¨Æ³i-‰G]„¾ý×’¸–.dðÔ9RÏ_àßÕLnp˜t÷S}9¸ˆ¥«–c›\‹kéÔT𲵫0”ºGO MgdÏÆµ²Œ­n"Î…ó°ÏœŠ¹fœÞ€ÿÁ5Ø¿¯É"€%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:09+00:00ë�KtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Belarus‚¹³IEND®B`‚qalculate-qt-5.11.0/data/flags/BZD.png000066400000000000000000000156111520501070600173250ustar00rootroot00000000000000‰PNG  IHDR`@jVåYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs Ö Ö�oyœtIMEæMÜÀxxIDATxÚí|wt׳ÿÜÝÕjÕ%Û²-[î Ü�1ÅCè¡% @ �ž�R(�TI !´Ð’С—` `ì¸îÝ–eɲºVÚòûC~ù¾_yç=Û$ïœïœ£rVWs¯>;wfî¡"U,ü›þß„ýÝ ø§Á¢côÿ#‡qþÝkøG±= íï^B€Àû<ï}üÁ¨Ïÿ®™CxXX8þ>*†ÇÇ!8þ&¼üán1„Ž! i\`y q¡D裤db¡�Ä€ËÃZì´Éê¢-4¸YÀP!IËñü퇪¤ cXޱÒà«Qf&g§„¤ÅFh¾r‘„8ÆñÏ!»Ëm0;ëuÝEUºk¥-7Ê[�íÝ!Aà Ë=´5#±á!LƒcÇq¼ÕRá¤Ì˜''$ŽI�PJ…ÿ2ˆ¿¯‚8ŽÅ0ü¯Ÿ˜¬®KE�»Ï–žºQ6É( ÃXîaÀ„Cø˜>�! pŒµ¹C ¦¥xwÚ‹� Œ÷£H¢³»SBIŒüðÚ†å'WÆIc¢ý£½WœºÉÐì#Q‰„D|¸ß¼1 ³éo㸒*ït”à!h¦¾ÇÇgvf �:¶nÆÊœt¥˜öx€ƒÍ7¶,8³¤¨®('v²¹«£¡º,Ø!©ª¹µáÖcÄ‹•PÔ{7?ú2÷‹ùÉó8Žç8>ÐG:}xìÔa1­¦Æ*8†úT)õ!@ޱ4Ÿ¼4nÇê‰A¾²ö®1.�†cQÒ�p±%sEi¾_½Ýl1ˆÕãCÆn?*±ÞUzûJe~n ´¾ä­*l`X:`˜ÉÒ%Š4¾Ò%“¥ ñ…ü:žá’àú $¢ïÐal´O€üÄúY‰!ðÞé5_~¥Q†~6ôá�6£¡mÒ é§»ò•Ñ¡ã'¼JWg®›{hAxhÌó Ö=àÓ^V1Ä0ðì¹�ýjظ±¾ªÙ]Û|wßìýG¯Îœ•¤�üæá® !ö‘æîFàcuEF©K~XìEÇNÛ'eLË[z5ªÆóäÞ9¡É¦¼øî×üù_ §^ò 9ì@þ�Y!¯,¾âU,Í·r~Ìpf‚8ÀwïÛçÏíÝ2¨^z¸ü§£åÇMM.Û¹42RÍX]Þ'¿¥÷™ze'2Ú¿`ÛB­Z~§õ^î½+¡DÓÌÖ<1?k¹(R“:¤ZwÏl3V½P® ¯3V~~ã­~þ~_MÜòeîš±»cW çØ%ƒ—î˜ñíùgŤ$fÀÐ'^ß:À·*šÿ±€€ ?éíŒòglt_`ÔËfÇK3>¾’⇨Gþ<öÌoO‘”HiFok—Ì[òîèC“â”áÛ¦n€:Ã�n—)Æ/iÚ¡”ÛÆ7 Ã2´DÔ-ý•f·ÎÔ'ç�•0ÅËyOáî}EûêlÍêð¦ôØà„Ò(·ÀÅ/¼Z ÖäÅ?tuÙq!Ár½©�zS!,džN¬Ÿ¢V0 /‰î¼YUôîEw_#žÐÍXæÆM*ãix÷²oþüŽ$`ZXN­¾!"S’‡í+ß›”:à½öõ…ò’€$íîó[>»õÎÀ€a�§._”þ$‹8))™�8ÎíÙjž•¹|Ëñõæ9®7%ˆÀ1¦Û±ñÕñ«úàâÑ­kSúg=Õ¼atø°wF¾ç½x¾úèäý3‡†÷“¦.üºVÞz¹<)kØþ£Ÿç•”UåZ•œJé¯ÓUyXp° %|_Q­«Àâ2»<´¿Ì¿ðôÑ¡ggÞx³d &ÙͰ$�r(õ¦Ó„JÒ‹ »×$Ç0Æê2$bõãCÿl.~ëÔÚàèÌ®€þšHÁðû÷¦%Ÿ'ã¾SRåò ßœ¯»]Ö"l9Vµ«“n Œ¯Ú] ô‘áˆhúҋ�pw·§b $¬»ÑaÜpáÍçÓ×ùk•$!\tøI]W;'!“|bøŠN“ìñ8IBúÚÜÁǯWß(¨Ã¥ToùÙ½çñ< 8ññ�¯dá¡…¡aáµUû«ùâŃ6[÷ÓƒžöûÀ¯ûwO~ôÑÖÛµŠñÊ/qßt³Ð\\ÖRû{GžÞywrÀŒÇSWd`Ãgy´´åFÍF„ŒQú«N¾|rãû›|䲬¬ì¡!C9’Ÿ5ö«ÙÛ/üäÔûEŸ¦©SbEJ”úûS¥÷£&ÿ€ã,ÎÓ<›“f´™¦%O›—0�¿{‚(š�81Æ'FHYÆ�a¸îÂöç² ànûäÜ©½ Oû™}nvLHÑ,4a*uËYÜv‹®*Åt\Òˆ`>4¹ÁœÚæ¹Èt¥<™¶RJÅ#3g+)eVhV¸<¼ËmÎ5½ðà¾-úƒZIÈ€�A~²:�¹¤¸‰“½â=öÎcX¤Â×ç •H�áØ™½[ 6@i ô§üÀãq û%Í“|}ÞǦ'ù E¤ó�ê1šÙ&}í Á¼uŸlÑïnÁ@À�ŠY¸:%cÐRzXÇù�Z¡ÕˆALÚ pÓ’\†±;Æ,¼ŠU[[n·Žˆå]Ìë�ùñ\Yo©¡^� Ãx›kRvÜ‹�eÂP{c­®¤X6&c´vøÀà ÀqœEpéë]ç?ÛÈÔú¥Œ÷é~æ ÔŽš´ SfD£´û_~.>x€]b ˆI2…v9:Ú‘µ°­š‰W.{êĵC¿´4w¦'R¡Iib•””2F½õææza×t87k"à¯ߪÔUWêpŠìy𨬎c¬ÅùÓ'³f�ŒÿðÌÚo ¿ÁÌö­3¾ž1ô ï€öªÜ’37s7}-Å[†ÏÖÆÒxÜœ‹ˆ� |ƒ ‰ãüã—š~¥y Æ:F»n§Üw­å�®~|ñëí‹~=–vYA›:º;< O›¹0zú+ª�8‰èþ¸uúË2¬D¡ÅÇÿüûÝ9«Æå"¶ÇrÔS×!ÄÒŒ2Pž“GW¾çÎî3¿jíÖ‡Œ‡€ûvn=òî/ߎ_6xå'IÙ ’ÈØß4­˜¿Í™Êþ:þÇÒ_ü=а:_ RÔñû»~ŽŒ-}«bEE[áúG¾›c�l¯­ ”KüD‚¥æ^*)¨Ü¹2ç“l�®¹òó2�iki»ÓZüÜ©ç`tz¨�FÁº„zª®{ †! =õ$ BLœÿüíxò¢´EnÆSãn®½|u÷“«gôŸ139q``U­¹¼ÒŠp¤ïöèì"æÎŽ™‘þ|ê{Ÿk}‰]qÔ‰ñošìÿh³Ñ¼ûÞ§f°+ƒüm8X2zhÇ€8”Æ´œÌ¿àÓ¹÷ŽnïÚºµW?IŸýòŽX(_¹$3A .†õ ž*i,—� ¡ªP�€¸˜À'>f‚iB¬$ºšh_zühœ†6¬Ï±µ©�H!³X�÷hÞƒ¤6»£&ï¹ìuó…Cú9?x#8((:ý™”×'½6«æ²@Ý5–šŠră�¦<ǰ<EGu:àÕÿÆqÖöÎ/¦~9qǨ/uF !>2ùKï†'‡üv®¬çæ¾§q<$‘M]Msræ ‘MÄⲇ€Y¯s_*R1|%}êEÊW…s¼ÛBw×\¬6øØM6õ»OP8. cçÍ%QaãÝ/9'¯Ö[Û»«DŠJòÛX\Ät»�ÕêxòÛm¹;·ÙïÝ�•á¨ñ.£ñ导ê«-¹Dø†yC·b 7âD=p,GH„a�2¸Y›7÷ÀSw[e¿qìFŽç0@Ë*üC>Η(ý •Å*�1>N““�½JÆBcYÁ¨e„¤=b³Z!5kí‡dý›þ¥ZŽ÷w‰çúi#( ¢Eê”ÛG?¥pÄx°°¤ð·O\èÖëü5ËB†_®½œ:DçÈ5ÙŒ¥ºŠÑÙá�rB"d!Ô�z&AÃ)•B¥žúí™aÁiS}žzöÖÖ(Ÿ¨gÒŸa9'žãT ViG®½ ³†Cš°xBæß½çÍs¯�_zÑeÔwôÒ@„t‘zÇ:‰þPH@~·p³Ûœ;ûõ Bš‘9e Ž#Ž�“¤ÜGíç£öã8à †c0€uWÖÎK]”éß¿¸>ÿÅÜwJVù«$J©Ð`´ƒëÉáµG~†ϰ�þòWæ fY�T¬Xñ„œ„§ú½ú¬¤ÙÏaóš›ÕŠdXX$)ò ‰Á€wuw&�Ÿë°˜*Nï.9u[Ò/ØÑu7$6ªø×m¾C~Q ²ë3N<’‡û„aBuppÂpŽc…B¡—-<†0…X1ÿðv�áÍ¢µãc'OK˜ ˆßqªÔd²cÞ ê™Cvà¥/¶Z[q„ÿ‡Ó�Çã‘H$�a˜ËnNHX²÷G�¨T0ãÓ:Yl‘Ïg˜²Ô =oƒ“$OoŠcÜ Bèñ/α7qÈrì†kŠZŠ£(í±Æ“.¯«Óe±»Ãzhç{fÅxpd²¹ f§�LB³ôŠO“]0*nìî{<¬ç¯c9Ž£(Ên·K¥R§Ó©P(Ì��1™™$†qnçé C“ÏܨÃDâê}[‡f²Ï7àVújÄŒ’H$v«Q,–X­V©Têr¹¼< –c…¸pYÖŠqß�ÁÆuYxŒfW·ÍxOã¯==Íc8Æ:ÜÓFô� R&ù'Å'5þ™›’šª*xï G¹Ýn–e=EQ�€$Én³™à8‚#Ý�.±¬¾@,`°®f±Ð­×ÐêÛOpÅíF6j®Ÿ:C!DÓ4†a!¡Pèe‹ây~tÄ( N^i¸¾éщ àÏ*ýžãE˜�è¡«ØS€p ãìtRÿ ¬D-ð(@ªvê 7oP!¾¤ !Äï}vÑ®û7\(‹Õ"Iuú® m¼Yècmðãõ2!¢$8SRvd‹U«#,µª°9·K –aq€fò¾Q5¹§ŒÓ´Èùü2víÜU¶ѯ²¡tñÜÏ€f!Al:”všPŠ{%±Ñk©g„€÷p·w.I� €”Íiã5™3 ‰ƒŸ]‘[uXXŽáÀ�Þ W*©ü×}Õjs—­¬žÊHމ #Ï4uˬ­F³H@%'ô PS>¥µæ…wD±BRPSS5kæ<�QRàË~[ÞÕ¢{É=:sÅs.Ü�±ˆ +u—îD¬·Òó½–YÅ1Ä;=eÍ]K'¥€Á¬§ü²Â†ÙµqúÔå÷�õÜNëO— Wšb.N×XüØ´Áfk †ã1²¤!a#³´Ùƒ5™áÒƒÎ`qÙêêŠyº•fñ c`…sHS{KL0+’Êì´�$H†Bk6¯I1øˆñBUÃ�¬¨,xlͱ––.œì©Øûñ<” ©ºC,e%iGD� |£b“ÁN9»ã[óñϽkr™Æö_S×hvpN§eP¢Æn± ƒ¾]oêlmoíìì4t<Œ§µµ•vÙuíz‘HìZÕÆñœ+BIÇÄù¾uþ�äà4…P^¶k_ÀÀ˜ƒmçì&ÓÛcÖÈEÒ�ÜÜýs¡÷bLoVwܯ;a¸ëÛf%j€ç9„°Ø�¢|Z�‹g¿}°ùØK«¦Åçm¡Œs³%%‡š;lR�«©¹Y*•J$’¨¨( CµÍf¥rIhXˆT"ÆõÎÅ·óZ /.:»í½eÙãgÇg�~0ûµ²æì?�õnùKoÖñ<`âx~Ê›‡Kw.ÕªeamÆÖVdØ>ï{®°qßä¯Ä1aPfnºÙš7"x8Îñg --\ú°ðæ‰ã–à8ŽÀ™w<—«û…Å�$ÒRIB¡îÏæ®¦œøiÝZ®c ¶~3õ‰D±aÇ2OD³Þ2í­#Àó†zîûü•z¹Ê•ç� G·ãØÍšãÅB�L$/¬/HL>fØÌ£»>Á;¬û�g–Ÿz®A_×Ô]?%-':40.Å„¨r¹L¡�ËdJ‚Àc5\Furl¿“u''외hðS‘H}û÷“ÛnýbŽÃ÷vü¦¤©dm ŽaF‹sè³?êÚº 1Ù»åeÐG•öÞ"ÎðHõÕ¯æ‡øË]´§ÉT—Μrvþ·).š±¤w< æí·~#ù¢Ô…‚\wuýw·¶.ðÄG�l€ÔoÓæùMË‘ º^tî‘Ió+åÖÝ7v¤kÒ^yd5†CK§eøsûê; )Õ…®}ÕŠ@àc§UjÙÉõ�e%iÀíaHŠ÷U«´3Gxâ�nS|ük°pÖÑ�Ò !1™o�~çz}î«Ç^ùaúÎþªh—±ËØP“siÉ8<ùÝ™£† ÃÿõðøGyË”7›:­„¤¯Ê€ûª�œãyB(pX];O•Š(Á°$-Žc´ÇCà¸FpºûæŠùkb£R]�«N¿¬1 > Xçöëú³â½Üµ#M0„—_3¶7EJ·¡u÷eG!大9=nŽÀÆyóÖw9Ý„˜ì»ö–¾mf¹¯2-ΡC£·¼0ÖëC€Ínç0V.’À‡ç×í,ÿ¾nUU§¡M†‹ÏÕåÎ88{ë¬/žÉZ%ÀîÛ�±½¬£bxt6E’PX¥{nó…›7k@.êu­ü¨o{5xB,lª7|÷[Im{wlˆ¯¿JL’¤P ô0 p008ýÒ½KõÖ¦I)ÓRIÿ�„”àÔ CeJ@²D q3ŽçRE”:’Àñ²ºÎW¿¹¼ê³s--]„BÌCŸw�=´v(ÄñEf¢6;%$5Ú?B£ô‘S$æ-•§=›ËÝmu7´›‹ª;®–4ÿQÞbj7�ï3yX„ðìu=çò_˜ïAK¦û_Z2U2J.R$.7kqÐ&«‹¶ÿZ2 ÑÜï %ñý¦^šåtÝŒ®Ëó¯M½$È©M½´ü¿=í ÕÍWöœÿ7B÷›Âï×#À?§-¼Vöw¯áMD×Cßbÿ³ˆÀù‡gþ'Ò¿ÿÙä?¡ÿ,’J[EãR®%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:07+00:00»8úIEND®B`‚qalculate-qt-5.11.0/data/flags/CAD.png000066400000000000000000000026321520501070600172740ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<›PLTEÿÿÿààÿÿÿÿþþÿ¶¶ÿððÿ@@ÿ  ÿÿêêÿ66ÿ’’ÿÿááÿ++ÿýýÿííÿƒƒÿyyÿÜÜÿÙÙÿ!!ÿ��ÿ%%ÿººÿXXÿ¬¬ÿÿÐÐÿÿ,,ÿúúÿNNÿvvÿòòÿÓÓÿÈÈÿ22ÿÂÂÿÆÆÿ ÿûûÿââÿññÿ��ÿ..ÿÒÒÿããÿ##ÿøøÿ]]ÿ55ÿccÿ½½ÿööÿLLÿ==ÿßßÿCCÿ~~ÿ ÿ ÿEEÿÿjjÿ``ÿ‘‘ÿææÿ((ÿÿqqÿˆˆÿüüÿZZÿ33ÿÿ––ÿÌÌÿÿ44ÿÔÔÿxxÿ""ÿ‰‰ÿÿ””ÿÿµµÿ))ÿDDÿççÿeeÿÿ««ÿÉÉÿ::ÿ||ÿ ÿhhÿ‡‡ÿùùÿOOÿØØÿ ÿÿ00ÿJJÿ††ÿÿ„„ÿ´´ÿIIÿ……ÿ¦¦ÿÃÃÿÛÛÿggÿ[[ÿ__ÿYYÿSSÿTTÿBBÿõõÿ÷÷ÿììÿ<<ÿèèÿ$$ÿ88ÿóóÿÿÿîîÿFFÿååAù°ÆbKGD Lò pHYsœœ&Í:4tIMEæMÜÀxÂIDAThÞí˜çSâ@ÀW� UDOƒ¨€  ¢"bEŠ{CÅ®pw6¼êõúg_sw 3H³»_x_^vç÷f~$»›Gx<ê$ðI!©O‹š@M ’€TJX ¾ž¬€L.—PP”‚¤€²€%A•µŠœ€FË"Z ~�¾�‹Lca ×á0Œ6™ŠŒ© B£Á€SšA³ÙÒòj±˜›�ëh¥xöŸb.©V¬mí¥`{V¥µ´*± Øì¥ Ý†Uv”‚“í($…šÏ©‹¯�\ ÓÙŦî>×ÓÍÎv9;Q ¸ÜžâE/ðú˜Ô×Ïçúû˜IŸô)�Û%²€?00¨’éaFF! †ø\(áèÃtP2¤øÅ~cÌ <ŠL0ÙÎl¹I>7ÉlMvgLDBãa&�‰¾,aÎì §ùÜ4¤§8ðEt�™YÎltNãs1Ù\”3œ�] žàNSÉy>7Ÿ¤¸ÃD\üm¸PMÙ‚s`qIxÕÒ"YJxUJ†@`Ù*¼Êº,¶€Ô±²ZMÙêŠC*ª€nm½ººõ5�ÈGñÆf5e›¢Åpk[xÕöŠ×±oGhÑŽM?°›¦„”Pé]T I0¶W¹b/D×I÷M• Lû¼o&¢·d™ÇùÌ¢–ì_hÑòt4QúOA[N•ƒ�iˆ^Æ�ËÁÇqˆCž”ƒO �Ó³rðÙ)�s¶‹^\fsióóº/Íé\öò‚]šóçX®’×é›Û»¼žý½÷¯Ø{¢ÏßÝÞ¤¯“WXh=çNß¿æ<=�E€�7�,F- {ûNGTÀ•;‹ð¿Ï¹ˆ å³ váç–ÞŸ‘Ÿ»€ëâ¿GUM )hÙ­R»\Ãû¥ÀlEk·nC ­ÜÑçc>ýÐ&XqWÆí≜…Lì÷![#¦"ð×Kõw5Õ ŠzBºUBïˆj°„íuƒ(kÈ<þ+]ð‘�^ˬÌå̰„´¨ý˜ªŠÞ"hÜ(¨]¦Ñ¼ËR]D·+õš¸í\ÿC\[-¨z$ØD€›{­'?·�a [ÚU/Vq/×ð~!0~¦zGéTÆ$�Óæetr++ïA^¨¥\P^»›'rrO¿pؽ–êÇž <ïhøw¬zG9s¨’"jžð†T¿…”ˆ£nJ¾ð.ÂÝ<�±‚¹Y‹I�ªjWý› ê;U0YõŽÒ­J»‹ÌèJtS#=ºŠ«âvp¸iüùFÔõUŸ�ò9ù—2<á;„j`HAk‰Jí ïçÄمê<1Ý‚:*¹ˆ(͇!‘¢™1IE¬;t�@•pyl �ç,dR¿÷qUÔ <êÞª®œYuž˜S¡žî¦UB´ÝÇÈÄoOÚüúÄÍÄØ¨oužþp>/\áu<�¾’¹Y‹ÉŒÞg©Þ*hÜT}GPõ3¬ÌŸç$¨65À ØŸpj^ Ný™L©’åØC®³SªÇÿ–í,gRê{7d£*æ)û ¼z4?z.ÇoÚÏ9LMèŒOù‚üÜB®OÜÜ®z™Š{…FÃ�ÑØ=ÕO<Dœ<ª)iQûùóÿCFt%†ü9X¡ØUÿñn/QˆÖ|\ótpû“K](•¾TžÙùl«tÎ�^SÊüœELN]KŒ½ÁRÝÝ®zà�=PÝJ88n0pMÒQN™RI¸6a+ü £’6"¥‚å­<ñ—¢jm¯(’¢ša<µýOl®rîô—æafÆ*Ëz�þÑ{1Ó¯àÛ,¨}S£i‡ ݯLŽ#!<×$~ºŽc”�APƒ§Då©�ÿ˃™+ -ÇuïJTŤÕãÍ}Sxvç9Ô”rn€JÐT�±)_‘Ÿ[ȈÄMhÂÀD¥u�Š{¥FÃg'¨ÞƒãHl‰’Ø» âîÖ±%KTiÒªÛjpÇ0ágVærþ{`½#ª;¸œ¡T·$ó÷]OòZÅý´èaç hNL9ó³1%õ]bÃê1�^§Pÿ¡À½F#pÐR½GßÇ% # \3t".7QUi*lq_ÍËå³Nõ„ŒJÚÈ_?Ëï\Û:=æÖºA<½ýi6¹á�´`ƆÕ3#}5ó²^%ËQa©ª¾L£i[UÏ1qM×qŽ2P#%ªir°¹¯í¹ŸW÷<Àá¦ä®AÅ„aI[xgäL\öº¯« O †I_/¥èȰž�@OR¨7&Mþe…Ü�ø šÐ-Õ+Ü«4>Õ0¼=T�FPõ; âîѱ¥HTiЈäƒCx®x[ÜW�á­CAqßÔ\ÕÏT iÑûy,ëÌÌx‹Ä°c–ê^•†O5jWjø÷†PõáAÕ¯nW}§çr^(�Úª»h D…¼:ÏT Ñ6“RßãñìE ŒÝm©nš¾W©]¦áûwèT·gHâïÓqŽoW½¦%�7öNᥲ?PÙØï¬Â<»Pƒªÿ>éßäç2>åsµVLþ î5õYä�¨+‰¹Å n²NX?‰Š5�ÿ¬z»ó(ªvÖT?7P%¤F`î€Å<�±’¤ðš ê‚†Ï4Ü«4Z÷„Nõ¨¡Ö>êjU³TßUŸÃ‹¥sX]9o úœTçÙ�*!ÊÖĽýÞçñœ—ûS»ê[ƒªBÕÓ­®3Á@8MTÓäXK<ËöMfAÙØëM;ç0C5¨ú°Ä-äçrS¯ „k-–êêÞÖð|(ÐÝ!R=Fâ¼ÙÀ5EÇž*˜øuë«o  8�¯k†cšêy}p£gP%ô‹:È£–ð`æ ’Ã�Zª7 Ö Ü+5Z÷g°=T ¢¯3‰Ÿ êwíªïnÈæÅ’GXUu7^¿ã¼UgÏ¡Jˆ´5swßx"g!ƒãv�‚¥úvkïûV ý„Fõ4‰kŠNÌM"F¢šµ-.–WN¢°t6Þô_ÌîA ŽÀ†&l!?w7÷þŒˆ6ÕUÿ@ ×†Fu#‰™`àšªcOkWýó#£((ÎãˣןwÕ{UBŸ¨C̰”‡2—“~ÄRÝ'ðnÔ®Ðh-¡êCLâï9ÄDU/n@aé#¬¨¼—†_‰ê݃*!Bkfbß�x2÷%ÇîDQ%†)hÞfuõÆoB¨zª$n²NÌÍZ¬¥º»5Žûl6åmïü av5¨úµ ?�Ÿ»€[{J„ÖŒ©Z«Ô½£áù§@?"Õ�3A·ºz†¥z@×Xt$Åy|qd†)~Õ0OUBïÈj°”‡3—Ñ+¢º]õ/î-¥!R]@Ôµ¦µ€¿Ö@Ø$Š””zûSX:›åû&Qïwþê«ó—¡J×Z¸«ï:žÌy‰«ãv´«¾#¨úF�l%$ªÛúJ\“ubn ª. êZcYUy/–>BYCÿ æÉPƒª‰ßÆ“¹ ¸½÷'DÚš¬74ªÛUÔ„Hu8Ç븦ê„eZ÷꺮ñyÍ vç±áÈÈ FõŽ¡Jèy„Ùý_çáþoÒ'â°õØv“ áK�{¹FKIUb?C'j¨�j³?,óf² l6ËöMÆÓsAVçIPgf®âÑKâÚÚ®ú�*îeÞ¢ªÞG⚤s›�g©îi�á­ª»y±t%õ.x˜mQ¼;ûÊ0Í�©¨Ž(Ô½«áy/¨z'o¶uÊÓ Îq®ûtÂú›–ꆠ¨f8Åy¬¯¾ÝÔ~0Û¢Ùl:z³Š÷KAír�–âª~M°«5Pí–ê{3x©ìaÞØ;•ºÖØßLuž­i«Š{�†÷+�l!4ª÷–ÄÝ«{»�æ²T¯÷;Y]5‘Kæ°»>û7 ³-Êö´tiÔõü±íãªßhàšT]11LÁÆš¡çñiõhtã·¥zGÑ �Ò³ê4"¯¶ºzôp5ÌúÿP…7�…eñú¾ûp·Äý¦«óÄhÝ>IkÆ�½× ªÇ[ª7´:X³ÿN^(™ËOžœ‹f[º5O•ˆ(pŒ1ˆŸ¦–TÝl<6œ‚Ýy|R=†€a»¨`¶åÌ ¶©>8¨úï ÔpKõ}�©–ê{§q¬ÅuÑUç‰éÔàËXö^’Ø{tbï0°%Xª{[¼sàvž/žËNÏeÖö)̶t Uš "¬74\Óu³-ÕMCeã1««|xìE«zGétž9(¨úõíªW6öcQù,–TL§¦%þ¢V½£tø¾¿4Á–"‰»['öN[bPu4k÷߯ó%sÙáxÆ�m_,9 ª4A�ç(ƒøé:á9íªoª½Ž‚ây¬;4®ý‰êK@;ÌIóÔÈ�&®:Žj„¥z•¯/¯”?ÈâŠmN¸³ Ñ� %Iâ&UO’(¦ÄÛÅûoáù’¹l¯»â’êg-úzƒø™:‘W™4CRáKão»òY]5±ýÕòK@»œÿ;n<ʯXB%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:16+00:00ì~6tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CHF.png000066400000000000000000000007351520501070600173070ustar00rootroot00000000000000‰PNG  IHDR@@XGlígAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<$PLTEÿÿÿÿÿÅÅÿââÿààÿÿÿÿÿ::ÿääÿûû˜pôbKGDaˆë pHYsœœ&Í:4tIMEæMÜÀx|IDATHÇc`•��ÀH§&×4 QÀ©€9¼J p+H)(U@±ˆ‚LH4w.)¨šaŒ©�hLËÚRP½, #R!ш P"â:TP6 (‚AM0²F7ÕRÔ¨¨B…Áb�`A: h |îÊ‹ É“™%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:48+00:00ýJÐutEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CLP.png000066400000000000000000000014141520501070600173200ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÌPLTE9¦7¥Q±àçôÿÿÿ:¦-\¶œÒ8¦ BªÄÑê6c¹ïóú6¥4¤w•Ï!R±p�Í|™Ñy—Ð{˜ÑÒÜï @©b…Èáèõ1_·¶ÆåþþÿF¬… Ô÷øü.]¶ëðøl�Ìýýþ>¨²Ãäçí÷r‘Î*Zµèí÷ÅÒë>i¼8¥]�Æ“«ÙM¯ R±?©9§Q²àéö7–6•5LŸßÑÚüçåúåä»-.»,.¿00ÖB8ÚE9×+Ö+Õ*Õ)Õ+»›äbKGD�hÙQ pHYs  šœtIMEæMÜÀxIDATXÃíÕÇ’Â0 €a 0Å´Ð{o¡îÒ{yÿw¢80ã‹£Ã.úOòM¬ÌDmàñ¢Y‚\,‹Ÿh¿Ÿ��`0 …Ã! @)‰"F#÷¸ÈX¾ÍkeœßÏ5fBàà¡`¨�´.~G8 wÔ£�‡�xŽZ˜ŒuuÅ–“qo÷1DéRÕ@Å}¾¸©j(H—tÝ€ta*A>™Hœ’…êd÷¿¾éÜé3ÉՊ(Z/ žTooªG/%šB5e]£ïÜù ñªô§Ýé´{ £(™c”î¯-�þÁÐ¥Ë<ƒP6—Î�¨<¯Žä‡‡r¹,ª™D]¹z�]gñ,b¢ù‚ª(¼Ž¢¨…|”i¨Ó7²7‰[·ñŽ”GSű !+¦Fe“ãÝ—EÜã&Pò„O-ñ|IõMÈœÐä ÇAüs¤¾ImªTšÒ&û¤–pÀ’~GºËÓ3³³3Óew«$²à Cf.1¯-,hó‰9¦iÅ,Þ¥ñs’KZqyee¹¨-%›¶€¼ç¹ÿ@ÄV ‰Õµu!q}m•0yÐøÃG�Ÿ¤i<› \Él†�&ÞÌTÌUJ€ìF¡ü÷æ®­í˜dŒ¤Øö–¹wD={þýk`“Úu^@¦ø€„;/Û¯^‹Ø…Ô¸ï뽚"!Hì^ìþýFzy§w9HXú²¨'Âz:ßç?Ø÷ò’>~ ~®XøªhÉ€ŽQ¿~ûn[€mûñó—(Ûg`o4n›C†¬�ñ«6Çwppppppppppø[~3T«þ>†´%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:02+00:00Ô›!»IEND®B`‚qalculate-qt-5.11.0/data/flags/COP.png000066400000000000000000000006441520501070600173270ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<$PLTEüÑþÒÞ¿%J„7”8“8”3†µ3Ð%Î&ÿÿÿ–¾#bKGD ×ÄÀ pHYsttÞfxtIMEæMÜÀxCIDATHÇíË1 €@ÀÀZÀ°€,` XÀ*QÀÐéóIo?H’Lh‘X%6‰]â� …¿pJ\·Ä#ñJ…°ððÚý#Bûì%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:00+00:00C0’tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CRC.png000066400000000000000000000006661520501070600173210ustar00rootroot00000000000000‰PNG  IHDRk@ïú”ÊgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE+'}Zv¬þþþÿÿÿÿþþßesÍ "Î&}±þñbKGD�hÙQ pHYsœœ&Í:4tIMEæMÜÀx^IDATHÇc`# ’”È Æär€Ã¨¶�ÖJ`H#$0”“ :È £ÚFµ�jüÚÈ,È,‚È,ð†Da>ª C™Í2Od6ÕFÁHù¯•.ö}¤%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:10+00:00�®0 tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CUP.png000066400000000000000000000031351520501070600173330ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<vPLTE•G6$u*�*�*�Ð*¼4pY'‚Ï+Ñ*¯;W!e)ˆÍ,›D>#q)�Ò*Æ/„O)&{Ð+º5j\'„ª=P!h )ŠË-8$t*ŽÃ1}S$&~¶7c_(…¥?J"k)‹Ê.�J2%w*Ž)�'�À2vV=@�?a­@`¬?_«Ð*Î.Eà��òåê÷ûþöøüö÷ûÏ)Ð,ÛK\ð³»þøùÿÿÿÎ(Ñ3ßdsõÌÑÏ*Ó)>å��ùáä×:M램üðòÐ-ÛQbñºÁþúûÑ5álzöÒ×Ô-A牔úæèØ@Rí¦¯ýóôÐ-Õ0DÏ,Î)Ð/ÝXhòÁÇþüüÓ(=ꙣÒ#9Ò"8âs�÷ØÜÜRcúèêÚI[Õ1E鑜ûêìè�›æ†’ÚGXÒ–©Ÿ§Í“¨Ò–§ÑÒ#8õÍÒóÄÊÏ)Ç-ŒJ/$w)ŽÏ*Î'ÛL^ýóõüïñÙDVÎ'¿3tW'�Ò 6Ô/CÔ,AÓ*?é“�犕±:Z c(ˆÕ3Gí§°ùàãøßâøÞáüòóùßâ좫Õ/DÎ,žCA#p)ŒÔ.Bë�§þùùý÷øê—¡Ô*?Ç/†N+%zájyøÜßßetÐ.½4mZØ@Sñ»Áÿýþÿýýðµ¼×°iÓg Ìœ5ÛþÊLŸ3w›¿`!sP‹2#K2—_ÌeËW h+õU¦pIÂê5k×­w[v¶a£¾ÉÏD°yËÖmYIYe[ÊÉÝ®ïØ¹+üìÀP•Ý{öº|f«Ø—ƒûp_&ó§@žßù'øäC‡ó]%ˆ°#G C¡�µâ�ñßã…'NŠœ�O�>sÖE„( Î�¿•΋E—ÄIåò•«î]£¢B¨¥_+ˆÔ¿~ã¦q¤*·nç{À·ß;wï…ËßðÐ,t€G�Ÿ„ž>ˉ[Þ; ¸Œçå¼0â•÷.„–/_ñô¥ñ,¾.—÷pZ2ß¼Õß½/ýðQÏLEÐÛ‘åÀ'ýóMc_¿éß�õ=þ[ü(*µÌ7~þúíða3bþþË.+V’j; mÇã‹m@<�ˆ„z$s ûPjÁ±<Ö|Ú‹ ñÕŒørJ}='nP·hˆ›TÔm:âF%q«–ºYMÜ®'X�l¨‡VÄc;âÁ%õè–|xM=¾ÿå@*»ÔüÐ~%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:23+00:000É-rtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CVE.png000066400000000000000000000042031520501070600173160ustar00rootroot00000000000000‰PNG  IHDRm@Êù¾gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs ‘ ‘£õetIMEæMÜÀxMIDATxÚí›[lWÇg.»k¯×w{½Nb»¦Iì´ADJCÛ¤"mâDE-/„(ˆ �hÅ¥R%n*R¸PûÀREy‰¾ ! nÚ¥i¢VIÛMHß/k¯³Þµwgwæð0vl×±qfÖ³žŸ´ÒÙÝÑ÷Í9ÿs?çÜÿ²ÄÇS(…~Ÿµã‹æA|Ñ<ˆ/šñEó ¾hÄ̓ø¢y_4â‹æA|Ñ<ˆ/šñEó ¾hÄ̓ø¢y_4â‹æA|Ñ<ȆMWMTÅ*ôkl(6®hR€©r¤­›] #`ªöo>h…~�_J±ˆ–'ÑU“§8Í…¡F3¥¦Êøt„Í~}¬ ¢éªIÎT—ý.„äðΞ=x’{bÃiëfëU^<~”±éÈŠÏkе¢­b¤0Ý£„ŸÛóºj.ëör¦ÊÎìãï—î!4 jy~ûöÞúpÇr[–B42Ígv_°íl‚.Ôõ–”³´EGyæàIzFë¼QIr6ÄlN¿ùœ"$%zŽ_ž8D}Ù4Õá™e¶*B‚zއ·_ækûOñÁÀVRF€D:ŒQÄ­Neë§äš7)ˆU$ùÁ£ÿà¹Ã¯Ó¥£­›Ú²4gûšHgC0×PBZžþD<»—v·‘6‚ÄÓaäüR°#:ƱÇÿÊÓþM{t„Žö4Åâ\†¹!‡ë;‚»Ý£�ôMVóóÎÃÌÔ ÅxºŒ_tb4YbaŠ1›Ó9?¸K RÙ ±w}Brap ¿~óaTÅB Zt�4ðò¿>E**t¹:JAªcPËsm¢†¿œÿ8÷Ɔíqm%‰¸$=�”êgz›ém ±âBÜâÙ"B¸€!wÕÆQ‹+£QÚ‡˜Î„HTý_…½+6ÂÔL CS•|b[?}‰j&Sá¢N°ï%r'`ÉêJØ_…´g{ë*àù.óNØòZsc¹ãN9$ ìkÎwñ z‡“VM0‰?#Ë�€VR‚ã{„Š˜=¹Adù£ MüºƒÖÜY¿•1ÀL@>ÉW!ƒð>PJ@8ås+2ñ7€‹Pû  ‚ZÃFÞn]-BJéLõ30ú+H¼Ù+ 5@ù!hxB;Öoÿ1ýŒü Òï�œ…’ÝP÷ ¨þ"}ýö ŒsÕN­‚èw Ð ¦ B�è÷œ òÔ~¬˜ˆ‚ê/…`54{†h‚�Øó0{¬Yû/Ç|λ`¦ âñ¹qÔpǯKˆkOסœ%�4F�Ú.Dî:" ±d3NO„auaY� „Q¬.¤¾iõëâ\¤ÕÁs‹…žØ¥Sh¡,´,!@Ïé·&47Ö0Ê-ÒnâýYcñåd¡É|Þq'J‰@fAZîN„&*XÙ☀̣Uþ³™€‚ O(úÙ‰=Xù ì1ÍéBT@*èeWQ‚“d'ö‚°pm€r‚ø+`ôAöY¨x b?Qã`–×`øÇ�:e¯ÑŒë}‚M8—_÷ppG¤ÜÞ)¹×žz+ˆ½Á»œÏUÙ¨û–½¸·òPñT¡(Z8}r-S WBóo }Ì8°Ý�œ™cP÷Уöv&P—}<š��ƒ9 ¡»!7V-8?± sMö©B¦Ûö«ÇÝÑüÄï�ݹ¹±è„yQêN�0ËlÝÜ‘séâ˜9hׇ’…ñ, ¨çÈæôõ7ô6—ÇêèOT1œ,'• ®ÉV]dšŠ’YÙñ!O=pšóƒ�$3!¦*Éq«sý†qM8Íó�|¿£“ÖÚ8‡ÛzÐU‹3½-ÌÁeƒœ®šö°øÑ;úRÐ\“à'�ý�¯?ô­µt´õ�Ê9××TÔÁ®ß0šªä§Ç�26]*ôÆk8v¢ƒxªléõ·Ûŧ I×PŒc'Ž�Ík(šäÝÞ^:y�ô[¬×pµ)µá4—FøÝ©ý<Øz•Ê’YéðÂK­!>-IÒÙ½“÷¶±»qˆÒ€�‘/ŽEô­(È ã-U LKa$QŶÚ8F^[r—_WMžÜ{öf|Z6¯sº·…�å­+w/1×Zgr&ÌT*ÌÇêLj§Ãܘ)-êK«îWI!LTÙiÕ¤²Ú.àE…<Ÿ¶½~œ=-€XˆOûHüõÕñ:;¡Xüg¼n™­b¤0ýÈí+X]|Újm¶ó¨&¯¾ûI.Å( ´ÔL¢¨æÒp§MŠûcÚZXP±I‚+VÃÆ¾#² »¾Õ°±EóY_4â‹æAþ º¾ ç1þÏÇ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:51+00:00�ÁHtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CYP.png000066400000000000000000000050041520501070600173340ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæMÜÀxÎIDATxÚí›{PT×Ç?wawY^ ‹<ÅV…´I}ĤmœÌÔ&uÚæ1fZÛæ�LŸÓ´3yLm'S§Óš¶é¤ÓÔ™&&¶fLŒ£�Xãà«âøÀ D Èûµ° .°/öžþq$h…Ô÷ÞMÜÏ s‡»Ë=çü¾çüÎïw~E!ˆ`&£;p§À`"LDƒ‰`0 &"€ÁD0˜ˆ·ŠP5ylD€ÿÇH'Ô¿ç5y|´Ñã K‚pŸ…®*j«²îפ)%rô?ô×ÂùßÁÕ!£ò†¤y`2kÒ\dˆ µ€×=Ç £RÎú‚o¢Ÿ�I[EV@ó[P÷GAplé�¿ò¿V‡æÍß¹xš¡e4ïŸ[Îô„Ù°ð�q�nݸ³ùa¸Ú+¡m¯t=(�<r„ÌUëÔµKá·‡ xb3§þ¬á69ÓE ÅßÕáÀëÚ6fŽç=?Kãö¦í 2C­pøqYs�î½`,oˆŽ‡™÷Êzl¦.¥ÄéBûL8&R–@Çþk» nz)JLÒØÙ_�Ì•`/ [7óqèS’ô÷CãvhÝ+«Q£Þ 2Þ±¸ýº{B•E[ºÜ\C^éã“È#…ÌUòú)F¿š°ÉœÀÓ,Ï{ºË̤qÍ ruŒ• Ò—>i_�…”�P¤ º†¶ÚaLQ>ä—¯ú¹þ#�šZqY²ÔØð*\Þ!+_e[äAÝg]ðúF0›-DGÝ–ãí�#OH1*¶�5Y³~‚~„X-Æíº¬ã}ïídë+Ï34âÁç÷~L“s7AÖ}²83Íx}#Gƒ¸úºØüâ�8õþ1=L0)ºÔâ“xc÷_B°¢ì^\î.Ö­Ù0ñ—E%Å÷Ó„*»þõw—²íŸ[9yî?°QLŠ.Tܵ–Mßú){î$#u&â– ;½‡wÁÑQ<ÃT×TÑØr‘g3Å…%z˜`òê±ô ¸8xt� Ÿâ‚f8ÒéìiexdˆÕå`Ò8¢ üì;´“Ù³Š‰µÅÑÙÓFSÛ%ã“X[ñ ±¶ø©7r›è²,f 5ªiéhÄ™–ÍÁc{˜‘œNåá·‰µÅ²|ÙMÛß}àuöØÁŠ»Öâ÷{Éræ±»òu–/[�ÙlÑÓ¢[êõ�àpÑÞÕLuM.�eAÑ®öóÔÆg°'$¡LóJ©!º{;øý_Ÿ#7«€SïeEÙ},ž_†3-›”ä4,wŠcì;ô&Ý®vâã)Ì�@s{93óiël¢d^)yÙEShAp¾þ Íí ¤:2èîí 0oî½îº\m”–”S¶¸BÏaOŠî¯¥X-1:¾ŸßË—W=D^v!ïVí¢´dµOñê®—xþ‡ ¸`&SÊ-¾Á ª*ÁáûÙòò/([¼‚”¤4ê/ŸgfFÕgsìôARé”—jëò> º¯!ýWzqôm¦×ÝEs{5uÕ,[TŽ aOLÆžèÀmÆåîbé»IudLø¼–ŽFêkIJtcµq©é1Vî�^>lª£´¤œœÌ|’B�êÈÀž¨]r÷IÑý@EQR’Ó(ÊŸO~NÎôlT5„ÕCsÛ%–.¼›@0À™Úã¸ú:ùÛ?¶ò“Íiio¸éYg/œà©g¿Á[ニûJ/‡OV’–â$7«€¶®&b¬6„d9s™=k.¹Åae|ƒW³œ¹Ì/ú™é9¨ªJ�»“«žZ;.sºö8�|õ{¤§fòÎ�ŒŽ?ú;ÏÐ ïT¾ÁÒE˹åzŽŸz�nW;ƒžzú:1G›ÉÎÌcÁœ%¤¦dL¡‡Úvÿ!3âæä¹#d9syùµß0èé§(o«ËבlO¡£«U r‹ih®£êÄ~.·]"?»ˆG¿ö$—[ë©([‹Édìkç·JØ rŸñqö ZÚI²;X8g»+·S[š@0À—¾¸žÒ’ÔÔUã÷û(̛ǹ˰˜-·¼q‡a)ÀD4¶\äÅm¿äû�«ÝéD0˜ˆÀ`"LDƒ‰`0 &"€Áü H�‘ gÄ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:21+00:00§V<[tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/CZK.png000066400000000000000000000013521520501070600173320ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<{PLTE_‚¨ÔÝèÿÿÿD}7b’¨»ÐøúûE~C}J‚iŠ®ÛãëD~C}5a’§ºÏ3b“«¸ÌùãäúããE~F-oŽ&?Ñ×¹)Ø0=nR5]³,Ú©Z°•bKGDf |d pHYsttÞfxtIMEæMÜÀx2IDATXõÏ‚@DQŒ˜#˜1§ûŸPÔÒBa—Ù�î9À¼þAP©R/¨ÕM*¶Ú�.{ýÁ�‘!5â0#Þ1âÐ"¾+"p"²%â Düøˆ€ŽÈàˆ"Q # .ÂÀ"Ì(Â`"¬"Â"ÊuD) �º  Š�Š!à!|#ä€g„ �FŒÆ“©Û9Q<›/–nçÄ«õ&Ù:žˆâÝþ�]O ¤óOÉÙù¿ðœ/|ç ÿù2@1_¨æ ÝüR@;¿ PÏ·€ùV1ß`æ›Ð|›opó äü":?€ççôü??ÿ ÌÏ”ù€3ÿ °æÚü7@œÿ˜óŸ@t!Î×Û�7?½g¤wplìþ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:20+00:00!7ïtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/DEM.png000066400000000000000000000006461520501070600173150ustar00rootroot00000000000000‰PNG  IHDRk@ïú”ÊgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE�áÝÜéIÿÍÿÎÿÿÿ—Çß9bKGD ñÙ¥ì pHYsœœ&Í:4tIMEæMÜÀxKIDATHÇc`£`Œ*Ar€ƒ9@�Á˜`ÀàBpÕ6ªmTÛà×J`H#$0”“ :È £ÚFµ�jÕ†¢ `R•.À��´%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:19+00:00õôátEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/DJF.png000066400000000000000000000042471520501070600173140ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEæMÜÀxqIDATxÚí›[l׆¿™5¶1¦@ $QI›V�桹´‰Ú¦UUU•’JU*µêCoR¤T}êC*5j¥V‘Ú�Bƒí' Ú‚��c6`pÁ€½7Ûk{×ëµ×{™™��9§˦d`½³Ë®=ß“/òîœóÍüçœß¶reÊ�'¼i†¦Ml ª‚KQ¤”2™œ ét5¦Ò6Š®‡ò H)eþ“HÊ¢3 Ñ7n�2…û4”�[H Þ“6_šÁ¨IÖ–®ˆr›€<[riҠݯ16—EJP\Ž3¯€TŒ€<¡„ÅIšþI} ÔÞ'rµ÷µh†6_šá˜¹¨kïÒp(Èõ¬äüD®öžHX¹ ^d"`…#˜� Ï=ëØkÆ´µ÷˜Îœ±¸¶­ªÓ/¨÷�#ÞÔ‚´,Ç^smƒ‡ïm^É/žYÃ3×SëQœ ÃqéS]hÝ=dÇBŽ_ìÆÕËøÑ«øñS«øâÚZriWÍ8*ÀŠFÑÏôbM†Ñ{ûJrÁ5ªÂ—ªçg_]ÍK�¯d}£)sÅ_5â¨ãâf ˆ´mÒ';Aˆ’]øŠZ•o|~¿|ö^x´�ÆZµ*c©¦àŸ°mìD2÷ñÍ‹¡¢�>цÐ4UEï;GæÚu–=¼y³!P—7 ,¯wdëWxxéñOñägêiói\™ª®Ú»à]�4MæZßa®uB×QÔÜC$‘dGƉDn¯¨ªÔ~îÔ†�‰!Yþä¬}åe–mü¬ãƒ1mÉ@8W{�ij€Rñ§émC¥a0·ÿÓ~�lp<žÜ@UõÖ�º¹É¥¾žUß‘u¿y…e�l,é RIϘÆoˆ„i”yJ £¨s€qi€è«"ÝÞ1ÿáKj6l`ݯ_fÕ€RWWòAE31ö±Ûû>ñL¥‚OoEÄìÙ8±¿þ�Ù»�Ùì­ß‚å_yšõ¯þžåO?UòÁè¶Áщv¶{›éŸ½Œ@T|¾ÏšÕ4~óâ»÷ Mó–§@ AÝæM%Ÿ|!%½±~¶y›8îB·u<ŠÕùcŽã- Ýy ‘J�ÇÃͤ¨*ZoV8BÍC–dþÔ»ü­ì=B4CUT<Ч|3X$E ‰ZW7RH”e*+¿ûê6=F|O Ùp˜lp£ÿ"�ßþ–£>cÆÙ7z˜ÝþV¼É Š¢TÕÄç)Z€1x�ÌàUjÖ¯ã�_ýœ5?ý jc# [ž#ú‡?¢õœ!u²Ã1ar"ÜŶá&ÎÆú±¥�ªT~ÔÌGÑ´ŽNj¿ð(ŸþÝoYñõ¯}üõ†-ϳa÷N¦ÿòFÿ%¬H„š‹‹¡ ³ÿeûp3Ç&O’²Ò¹œ¯âɇ"wAÒ0H|�†-ÏÏ{°’f–ä‘©Ûôu_Ú¼ ÷Ó&xÿ�·F6¦Pµâw7÷JqÛÐ|Å Þý.”–�RSXF'²I†Ž±Ó·—«sÞÜ[Uðž~!Tä¯$³Â¢sê4Û¼M|íÃYEKð-ÁwÓ&UÎß GbÅ�¶4�çu_ ñ«H)ý]3÷M€-=Ó}ln¢cªÃ6ñ(jEg¥à¾DÐPÒÏ?|{90v”3¾¤îøORVÑÌ ­#ïñFà©1TEY9'ÊA†mpl²ƒíÞfÎÏ ¤X´ÛÊB)ñ¿(IzcÙîmæ?“�h7jb—ÿS2�ô(»}o³oô0S™é%³­,ÇÌšsì;Â._+ÃI?Š›ówı5ÀYÚ"]lnæLì–°ª¾©,Ž<g¯°ÝÛÌщv’VÊÍù(J@H›dO WOè7çÀ‚"(™Mq(ô/vúö2˜BJÜ»~�$À’§¦Î²u¸‰®èÙ�kâ%Ö8Ê=GÐàÜ;|oò~èßÄ—@M\.î* lDy3x�æÀ~Fµq7çfÞÒ,�#'xÝÛÂ¥øà�úÀ½ë�æ¶'@HÁééólõ6Ñ鯰 wâKÈ-†“vùÞâÝЇÄ2³¨ŠÇ ›£H)e4ãí‘nÔÄ£n}PFjÚ#ÝümèŸtE{«þ¯Ìª‘ÿžçL ÉÓžÔ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:24+00:00õnütEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/DKK.png000066400000000000000000000010611520501070600173110ustar00rootroot00000000000000‰PNG  IHDRU@\0Ë@gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<uPLTEÆ 0Ç3Â!ßu‰ÿÿÿþûüþüýñÂËÄ(Æ2È7Ã%ßw‹ñÃÌÅ+Ç5¾Ük�þûûþüüð½ÇÀÂ#Â"痦癨å� ñÄÍÿýþÿþþùåéæ“£ç˜§þýý斥原ùäè咢斦'Ûò;bKGD�hÙQ pHYs Ö Ö�oyœtIMEæMÜÀx¤IDATXÃíÔË‚0…ái�zC¼ h½ Ð÷De�‰‹!ŒQâù7Ý}™¤�I;`Ç�†<OèCA… *T¨PÿF5RÓhÖ¨ñ|aT‘•Š–+NjuÍ›t»³šÈKíG>ÕjÆç195=3;7¿°H‘YZ^Y][ߨÜÚÞÙ¥Èìퟜž�_\Rd®®onï_8ÍqdXöõíýãóëû‡ã�¯?½Nk<©Q«àk—À—¹R!0fä2)üˆøi’ˆM¾ˆ�ŸD?´B3S†Çp¸ðÈ ƒ 2È ƒ 2ÿ†ùîÁ¹×›b4%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:30+00:00Í‹7qtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/DZD.png000066400000000000000000000023561520501070600173310ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<àPLTEb3a1uLàìæÿÿÿvLàîèc3_3Z23iIßÓÒýìïýö÷b3W3LD3{24�%4¯4»7Ô,KÚ8VÝLgåsˆï¨µùßäÿþþ,Q3|24¸4Ð4Õ4Ô4Ò3Ò 2Ñ 1Ñ 0Ò5Ø.MårˆöÍÔZ3o74À4Ò4Ó4Ò 1Ò2Ó6Ó:Ó9Ò3Ñ .Õ!B瀓ûéì*R3ž$4Ó4Å9ÛWoꎠð±¼ó¿Éó½Çï©¶ç�”ÝIeÔ=ÝHcöÎÕ4N3²4¼4m62BeJáèäýôõôÂÌâczÛ@]óÂËÑ4“)4vLàìçþúûð°¼á_wõÍÔÏ4w44]3÷×ÝéŒ�úçët54_3úâæóÀÉþüüŽ+4 ]3ùâæýôöûëîýòô·4$T3úæêän„c;3tKàíçþûüåuŠÙ3R¶4a2qHÒ£¨ô¾Èüíð�04wMÕ²µÚ2RÚYp)æäÍGX�—Ÿ¢ç‚à—§Ý�ù Œ…E`mÅ%¥TÊìò`”ñƒ-(¯¨¬ªjs2¢– ‚àR¨áókëꛚ[Z©d‡Ø‚à6vˆLí�*]ݺÔòAO/( ¬ûúaM˜h`b¢k2iò”©Äx„¢`ZØ‚é3`0³Ìœe2™=gùƒÞší#™æÉ”æ�æEÍ ;Ú×4¯ph_eÒ¼Ò§}³…ö /Ú7ißøe yólm; @Ó.Ø‚¡ß˵`Ô‚Q F- …sÀÀë�WW¹%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:08+00:00WLjqtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/EEK.png000066400000000000000000000006211520501070600173050ustar00rootroot00000000000000‰PNG  IHDRe@ñ3¤ygAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEH‘ÙH�Ø3MZZZþþþÿÿÿÕNk³bKGDaf¸} pHYsÇÇËFŸtIMEæMÜÀx?IDATHÇc`£`Œ($0(‘ ŒI£zFõŒê¦z\H ¡$ƒ†4’A¨žQ=£z†§WLff%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:01+00:00 ±PtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/EGP.png000066400000000000000000000025051520501070600173170ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<CPLTEÎ&Î'Ï(Ï*Ï)î«²íª±é¢�䚊矖ÿÿÿýÿøæ×šÜÆsèÚ¡úùìøóâóëÐýü÷øóäÿÿþþþüûùððæÃòéÊ÷ñßÿþýøôäøòáüúò÷ñÝîâºîâ¼õíÕüúóûøïãÏ�ðåÂüúôùôæõî×îá¸ïã½îá¹õíÖЮ?Ó³LíàµýûõüûõöðÛñçÆñçÇ÷ñÞÏ­>öðÜѯC×»^ÝÅuÚÀjÚ¿g÷òàöïÚØ¼bÛÁlõîÖϬ;ѰD׺\Äş̌0úöêÉ¢$ÄšóëÏΫ9ѰEÖ¹[ÔµQ˦.̨1üùñúöéÉ£&̧/Ϋ8ñèÈΪ7ѱFÖ¹ZÕ·Uͪ6Ë¥+Ю@ͪ7ðåÁÍ©5Ö¹YÕ¶SÛÂoùõèðåÀÍ©4Ò±GÖ¸Xíß´çןùôåæÕ›ìß´ìޱͩ3Ò±HÕ¸Víà·äÐ�ãÐ�ê۩̨2Õ·VÝÄtïä¿Í¨3ïäÀÞÆxÕ¸WêÚ©èסåÓ–ôìÓʤ'Ê£'è×¢ôíÔïä¾çÖ�Ó³MèנϬ<â΋ú÷ëé٥ϭ=åÒ•éÙ¦òéÌìß³éÚ§êÛ«æÔ›ÜÄsæÕœóêÍéÚ¨éÙ¤ýûöëÝ®êÜ«ïã¾÷ðÝêÚ¨ëݰïã¼îã¼åÓ—ñçÅóêÌÿÿùõêÇôéÄóçÀðâ´î߬ëÙ íݪíܧîÞ«îß®òæ½ô鯥¥¥¤¤¢¢ ™ œ�ž™Š�˜†�—…žšŠ œ‘\šVbKGD hÐôV pHYsttÞfxtIMEæMÜÀxÅIDATXÃc`£`Œ‚Q0 FÁ Œ$&fÒ402°’ØØ98ÙHÒÁÊÀE àæáåã'Iip  ÓÊQ !&.! ¤DE¨o�”´Œ€¬”œ¼‚¢¨’€Œ°Õ-PVQUS×ÐÔRÕÖQWSUQ¦ººzú†FÆ&¦úzfT·ÀÜÌÂÒÊÚÆÖÎÞÁÊÒÂÌœê8:9»8»ºÉº{xN:T·ÀËÛÇ×Ï? 0(8ÄÏ×'Ô‹ê„…GDFéFÅÄFEFÄ…QÝ‚ø„ˆÄ¤dK±”¤ä¤Äˆ„Tª[ �–žá’™•-�“ë’‘ž¦Mu òò ]Ä‹ŠKŠT] òó¨nAiYAyEXeUUuXMmAYÕ-¨ÐkÐj¬ojnimkï褺 ]õîñâÝ11Ýâª=½}ýT· wÂÄI“§L�6mú”É“fÌœEu fËå)TΔŸ3w^ž¼ªöüÙT·€k†ê‚…ý™‹k¦.™²tÑÚˆ·`ùŠ•«V¯Y»ný†�›6/'Þ‚-Dƒ­Û¶ïعk×ÎÝ{¶m%^Ã^âÁ¾ýP°�M h F-µ`Ô‚Q F-µ`Ô¢s•Í„¿¼x%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:48+00:00ô¡ptEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ERN.png000066400000000000000000000072531520501070600173350ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsœœ&Í:4tIMEæMÜÀx uIDATxÚíœiŒ�ÕyÇgy—{ïŒ7¼Ô°�í`Lb7,ue)Q!Q’–¤)ÐDQø�¦TJ[E­*T©í§æKÛP©RÔFJšðÒlu– ¹¡q)‰K/ˆÁØØà¯³Üûnç<ýp®·™10«gÆ÷/�,yæ¾ÛÿwÎyžç<ïU;Þ /\íØö^ÇöUž×{Nu •% %üÛÑÌ”zËÜ( ¨ ô6„ =/öxv¬ô¼Øã8°HèmÎ fœÔQ{ãY;Ïñ•�Ó áà"aw�cÇ*ÏîÇÁEÂéFg†˜)º€!¿ì1ãõ¶ ùã3N#`ȇ;@L{� €!ë1í4® 9xˆ)¯ `ÈÉ:@L9M*CNÞâ’ë’0äb:@Lº¦C.®Ä„kê €ºÈÅv€wMМ3ÖsÎh}ÞŤ‚JÀŸTüÿE/¾Ę5±¨â›Jü)EùœEÕ=_Ðs=R(Ü~�d <èEžÆ¶È”PMóÛ)Ù–˜ä¶{µÃ®­ˆÖW´þ#¡~Fë;IX4(Âò çx¢5Žr»Å¬pè+J!¹½ Ø…ôp h:1zæ f¾Ç,kOÕñ-ÕK¾å¼(]B…/ÞXB R@ëÑ”r»¥öÑ�`&ÐõGMü MóÑôÜy4Tû ùÖ˜ô·sÜa U€zžÃ„ã¡éĨPu�ôÊ Ù“ Ío¤øúC¤¥H~«ÀŸÒØ•Žò¹=[0‹=DáxÓ´þ=�l�™4ÿ- ³Åu80K=f‰ÇŸn×ú¦ ûÃ=¶)Äèc(г­o§ |µ†ä\˜£�VÈñ£ë+”¢÷—Ø5Àƒ4î &¾©¤|Þ"ÇÏHƒ; éû»:]_j­«|8©¦Ìô?M F@E˜†{Ü>Mù’A„¡6ƒÜ›†hC Ò;Jô\Oñt„¾Â£»=OÈžˆ‡ÌŽY½lÈ6ÇD×Vg�+}í�¤¢KÄèP„_‚š-H¥ˆ®­Èÿ{˜Í›2¤‹É]ÅYcíµù1_K‘>…YîA…òðE+| üÉœ¹jwXÃ%L'Z“ÄÈð!Ÿ7K¾©0³„huEöÃr†¦dò§"’; ¢õR)”ü)¢ÿï&Ä·„Š_¹cPíà|)ð‡4¾/œðà�j’Û ²-qè9˜áš F€@´¾"ÚP"½ –‚{Ýàö›áóqŒêý›ÑV¨6Ã,öH®ˆÖ8êŸÊ(·G7_Bq(ÚPQí±Ä7—È)…?­¨}2£Üaq‡ô”Ì&RcÂP"£[T]ˆ7TøÞpv÷º&Z_Q½l�|xüM~H‡Ñ{_†]é0ËɦCëûq0:)¢µUíßOˆ®¯p‡5ö‡YâQ]2æ­â™ w¢·áycAxëûÙÕðü5ÉèðG4jŽÇÔT âß(ɷĸ7µsIØÝÃ…hXРúO Ío¦  þ™ŒòK¹kh, º³Ìãkª v…üÇã�*ü©©Y¸ô„3s¾ÁºnêùB®8Ýò·VÒÛµ|¨PÂõoiÌ2UØ6K<æ*‡;¨_v�#½«A_hÿBbµ{sj¿›S¾dC,¡†9çkÄ(q‡5ѯW P>‡à°J$ü 8mè¯wqdÞBö-îaÏò•ì[ÜÑy ¨5pÚ G³¨ºàO*ŠŸÅÔîË@ƒíq`@/´ˆ+Hn+‘˜Ǭ¿ ÿ+u¤P?�h=ž„Á¹r¶gÐ> ôoª}†ôãyˆ=<øŠü§Ѻv9�k£ÑH WÈÙÏ¢æ‘àA_!DK²ŸÄÄ·˜¥a*—þÐÉs�`„ƲPÚPÑø| • Ùcò­1ŠPQĵ»‚‡‹Ψ çgNXó³Í jž`;Êçì¸4‰Le�‡áƒ52ThÙN6‡Z�¥t=Ô„ª½&LïæÂ£KSQ>‘Þ�ƒE!»Ò¡´`–xêŸk‘mNˆÖUä[£Òùfz°«+ì{C)Eè+Üii<Ø¢ùõÚŒýaø`�ém\�[4¿V#ß“ÜY ¡Þ/Í÷FØÍÃAt]…YYQl‹ˆo,QÝ¡Œk×8Ô,¡ö©Œäƒ%Ê„X"ûÉ01€sµ û€œVOG4>“…ëùåÌý“aø`�*Ìžˆ‰o.i|¾E¾5ÂÖ˜+zžGú­Ç’Ш!�o‰In-1Šs/‚x0 Ü3ù Ÿ!¤�Ë=sþ©/c¡VPî¶ô>ÜÀ× �ÞSÐõgMЂ²„À€;¨x¤N¾5štGôp>Pk¼kÃ'K£ß Ô¡Ä;ð¯)Õ‹†ôÃ9öšv:8_¨ý^Fõ«Fè<¯9 R…³,Ìþ”¢Üii}3 æj–�~4[¿íÀ� Ч#þ¥Fõ’™r#*ŽðwÒè°W9jŸÈÑ¿æqG5R*¢5Ä�l*©~'>ƒË´e»�ô¤¢ÿË ÊÝ&s ÎÎÑuv¥ ³G;ûÈŸŒ)žŠpoN�ÂÏt4|°F€‚êuÃÀWkØŽøÖ»²<÷z˜…ú§3¤¥hý 9g.!Ï—ªg#òŸEa‹·}L�Y[Qÿt–•6*¯‘é9‚{Íà.AÐL0|°Æö^€ #³Øf)~i‰6Vt±‰YF®ê_ha®rd›ÜA–„\!-EµÇ@zíjG´®Â^ã°×„Œ‚P†2,7Ù�b²'áõñIð&>äÇõí` <µû3’›JÔ9;êý …?h¨ökŠ_DÔîÍq¯…G’M%f¹ o©ÐaLþxè4*žŠ)þÏâ�´§þ 2:mã~Ïãþz¸b°«*â÷W!‡_Š8ª!gó|e$¤”Uè,’VýQMµ×PýÊP½bC×Ï™>Ãq6þr4|È3˜Èï@€8l énAÍö¤w¤÷!º÷P¾`i~+Žjðýai `ØoóÍv ¢qy9tX�1Î�ô*ÜIEr»#½»åàöú½¯"=™Ó÷· d �2Ž“é—Ã>VMçëLÈ|Ú¾+Ú›7¡¶+ Õ-¡ad,§é>òg6©ßvþ:>ø¬Âˆwô:SúØ593Àù±}¼3ÂÇ_“ ÀÕ1|â5¥è>ùº¤t ¿ôšT:†O=M(ç¾Æ€ŽáÓOc cøô׈è>óô¶t Ÿùº€Žá—Ÿì™º¸Óš�zGç.dß’^Y¶‚}Kz82·cøL–=>{{—^Íî«Ö²gùJÍ_L_½»cøe¢ÿަŽw>‰S %tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:42+00:00PÑ/AtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ESP.png000066400000000000000000000042441520501070600173350ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs%%IR$ðtIMEæMÜÀxnIDATxÚí›ÛoWÀ眹ìîìz}IâK'Ž'!MÈ……R©TˆP€DR%xá Áÿâ!Á o\â Ú”\ª4©ëÚé-‰ãl;ö®½÷¹œ9…ºslf’ :ÇâšÃBÅùàófÄzlW`Œ Ž%åF?’¼VƵ„kÅ z-¤Œ°YJãcÐmJkÍ@R©gðÖé˵°ã Ú´xPu˜¿7Ì@¾MÎŽÙ>Ð c‡IÇgÃÙð¤cÅÌbQØdPÔ©UCr«�sb)‡\òhþÃÂ+Ôª!ƒ¢N5™YìCÇ*éøl8ž�¶X©Ä´¯8ܞͲ²ÍââZîM›úçZ ³çŠø»Cô€Åìrïp‹Úñ_[ädowé Ï× éÏhnßU¬V±là�ú4§$B6A´hNI‚ŸXÕY­*nÞRMÆêý$Ì… hwÚ>d\À€•×ï¾ÚO¤#â\ˆt-�lb?Bµl¤p˜:]æÔqMÆéŒi°=Ù˜». ×/[¼[LO ‘Ä1¼>/˜]vX lmȯ…ÈØ Ø´¤`ÈñÙ?râ ( ´†·çïÜLŒÂ¡ÃŽ�tȺK×{@Œa~f– x†C@cUR[Rôû îšs*t”§86F¶ßÆÝáíÙSцŒ~HVU˜¿+¸4«(·b¦=• ]`$lÝrh† VpçŠÃü‹E„„¸/d²%É6Q¡À–¾Ov|â˜Úý÷˜kÛä� †Í‹L©ß20q¨/b¨¯3v/6@€£ ïf9žÆ±ßÀQ70‘€¶deØçÁX;�LÜòÈ ´ ùÖZ†ôÝhSÛ¡ GBĨ‹%!ïíCEG±Ô®5“t¼ºN×`xüi´üÅÚOAݱ€ÚTµ³�6PoX¸eƒ•u!dg×Èi�Vqw¸“-HØ6v‚`â{Ø«¿DŠTÀÇ#ÀªuÚko#Ê+<,KškIÌúú«‘Æoçj>DRâ‹59÷Û䤃 5í¶`ù.”Û«4½9rÔ0E:bz¨ uU@ØÌÿ5Ciáo´Ö.ÓVU®Ô‹¬/X8l „À‘>Fhê­6òÚ žù í;2QDfÕGôXø]†Å7óhwmß$P fvç˜~¶…ëõÎZQ÷~ˆ }¸yÎ¥áœÀûúÈ?w’#ÏW?Ý&°!;|—µÕ#Ø�Íz!à�ãOó‹W2÷ëß ,Aã©-”•�²l†Ÿ 9|¶Î¶/� ÿµ²^8Æ­Ë6~³·–M»'À@®Ïpð+u†Žï";5MéZ†Ú’¤@€aàZ‘SWgÙûJ™åÆ•£ëlÞ*-¡›eÈBPˆ©.,âõ—iWañRw|/ùý»˜þ|‹ÂPÜ3w?l@Þù©ˆòÌ¥ŸüŒÜíËäOÀJ1Àmâb\]Â/Išµ}Tý"ÒŠXo¸4þü#¼*5Aö`…ÉO*ìù‹<øqÀà±»N‡iø8¢^ûUžï”0&Øñí=Œ¸ÉZ ²ƒÝoˆC�ÃÑâ,�7³hGqJ]§P\ÇÊŒm D3fdZ³ç»{yÿÕí¬üåï\™-pê;5œlïô€® ´±õ…Ïb|§úsàQ¬ŒÓyJ �ÖxN¿Œ½f10cŠ’ºm‘­DÄuƒ�R“߯àóß :í£¯ÞDz&øÐåÕPeÃÑ/·Úe!Pÿ¨õO‰À×x;khelôå¶�/¼ÀHúF-Ž�mb»=}ºÝ ú!(¿Gyý<¶Y„~°dçÎÿwB­ ¶ÀññVBv¯U>¼z´Ú¨-RöÏS ß§0Ò[Á‡ hÂu_poé%üð%*64· Š®!ŽÑI#£ñ�CP,û—ˆ« á„ck‚¡=!~(¸·|‘–¬7%ý^úôÑ8¿pŒ?-<ƒ0¬s|qÏU>qÒçvI¶Ƹ„Ã{±3ŸFŽD”¯ÇäÅ „ñÑ+0z¸Í®#/ß9Äïo}cBŒpð¹ÄW^H:f]¥ë c›7À×9Õ$Šm„„cgBÆîkn?(ÐTg¨m9ÉÜý D;Î>‹·¼�Lí;&KŒí ‘„±MÑ ðµ‡£Zhóø^âx\t}CÆ�:é�V8ª³ŸëZ�öu5á(vð#�VÔ)ô®�±ØÊï|!Ha>j¬ac¶$ÿë«?:÷PMÿ_±žˆ7Òž„9$„å/õ^]ýB\�ÛÄ yÒ H˜'£lbÒI&L* aR “ H˜T@¤&�0©€„I$L* aR “ H˜T@Âü ]~ Š„=%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:37+00:00Ç©…tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ETB.png000066400000000000000000000102451520501070600173160ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEæMÜÀxoIDATxÚíœyPUWžÇ?çÞûÞã�€€¢€ ( ‚Á�¸`ÒêÄŒ¦’ôر“‰ÕN&I'ÕÝÓÉ™ê¤{º¦j2•™Lªº¦&m’J%1Û�£YŒû‚DÔˆ+a{"ËC”õñ¶sæ�( kz‚øTÝ?Þå¾sÏ;¿ï9¿åž‹°ýË ÅÃm°;0Âà2"€aΈ†9#æŒ`˜3"€aΈ†9#æƒÝ�¡€þj_”ìþ¨ ¨€Ñ•>‚ðŒŸá·®Ð½`¸PÖ6”µ 7Ù%†¡-ˆ¡+¡@ „; ­9íZ"¢u¢3á³�4®Ïv¡@ó¡ 7*¨Z‹}^…²µö´5zè6|k,z]&zãd„+2`ðî¿ß씿á·!:ÃáZzÍL”½ ÿ˜ü±§Q£ê‡¤†–„B¸"Ð/ÍF¯ËD¸C{Î#äèrJC´�Åh‹^—‰?ö4þ …(ûÕ!%‚!"€€�×�éŽ\D[là´¸ýƒNM ˆBÊ~’¡®ï O(FÕô¦Iø’àSÜ%(ó a@�ߊQ•ƒQ=¼öÍv¿Ô˜9± €c“Ñ5yû{¢u– "â£ñ%äƒîÁì"0¹ø‚°T,C¯™ˆô´ÔƒŠî9 ©»��à ¨ÌExCð&ï£3‹ÀÄ… ÀÌ·T,C¿4»Ë/fª¡û±^Ôm £ EDH‹¦œ%"¸Õ�_Wl†C÷_¿¯è—fc©X~+ý×î~Ì+¥aTåfþ H%HSÏ3y;±[Ü}Š@*�ɱ—¹|-’„('ã«�}@!°[Ü<“·“¤1õ·\£×ÌÂ¨Ê ¬<&Åœ= ½1-àóo|M(�1èšäá9GPýLÎ53�ÚL³+˜%égú\+”‚‡çA×$ŽÆ´›ƒJ¥aTÏGoLûÁ€ónEë®u™æ Ý5ÑøúX~=>ƒ·.çžÄræ$—â¿!ÊWJnogiFVÃljʧ�!ü&7à—s’K¹'±œ·.Çãë+\Ràµc8rÑ]£B þøÜáa¼5§võwçH%x{×½o�EôðiBÑÐÎûùKX¿`•�Ñ4´„£ …T‚´¸K¤ÄÔòçý÷£¼úè;¤Å]¢ l z×51á×øYÎ~Þ;²„†–ðþ³!Q­±ÌuMçÉ{ÿûÖUâ.ÇX—Ø<Ø}8šä|uÿìÈþÁKuMrÜ‘BÚ¸K<¹è^ûrMÏJ�›v–·�c“èp‘›v†‚²)Xt?O.ú†ÂŠTŽ;R~ E PçÈ&Ûò ñ�æñ¬š_ Lsøu6,¤º)j@3MÅ–ÂìV«fâ—aö–¤ŸæDe 5W£¨¹ʼnÊI,I?C˜½¿ÔX5£»ÕÖÂÄî£ EuS› â÷ëƒ?Nwp˜FªšPÔ^‹äë³ÙκàòZyëÀrò2ŠÈ_MJL-SbkØ}> ·Ï‚Ûga÷¹,¦ÄÖ�SKÆøjò2ŠxëÀr\^ëÝëë³ÙÔ^‹4•0�„�|[>GCLO ÁšÏ¯÷{H©QÞ0ŽÍ¹$�©gÑ”s¸}Ž”d ¥†”‚C%Sqy­,šrޤ1õl.È¥¼a²�¶¥=ço .5MâhˆáÛòÉýÆ&w#¦©J©q´,�NŸC e‚,^rR/v­Ï<þF‹îcí¬|Î^J$=®š9É%(VÝG‡ÛÆÚYù¼uà>‚;øù‚½}¶s®&]H2ÆWSß2šüÒt:½�}�>+GËÒX3óè`×€1…„P´¸‚)ªJBÜ�öy|R _¸‡äèz|~ …@²ÏeØjøäâO»§ñ›ÛHˆtöN˜½ƒ—V‚vó à÷8mÂEÖ̶ŸšÃ«;âbct¯ AEuÓœ-á„ÛÛo[о[0‡4´†ÓÒ|KT®igkùeéÄG5ò›[Y�z�?lûöœÏB*�@dñ’SËéꉜ«IÀå±öjÇfñòâª-d%8ø¨`�^K×j¢X–QÄK«?alh ¯l[LJGáòÚnI…P´tÓÐNjìeS<"0I¨¸Ú> �ÏèsNiBáöYx÷ðR6lzŽVW0›6¼Á +·ÒŠT)1—ÉŒw°ç|.�]“½·×¾ ÓÉJ¨ %æ2RiD†´òÂÊ-lÚð-®`óW¼}0�NŸõV7A`±ñø ®¶�ÂÖÇ$+\kÿ7¸ !ÏöÿvÓó=¶€²úq´vÚ�€Ö5‰’‚y)ÅY¼,žŠ®Iª®ŒåÅOžà±œ}üÊmdÄWòþ᥼øñã´»ƒÐ„ä`ñ4žY¶“y)Å”ÔÇ¡k’Vw…ŽT ©„¹H‰©eFB£ƒÛ¹ÒJ`G¢ +ÁAX�9ª€`š `Ôù)ÅžÀg¡¨pÆðΡ<¾»˜L»ÇÖ“Ów½Íð’7µˆÒú8¾¯�€"BÚx6o/¬Ú•¶PœÏä¾ißñËå;ˆiCŵã)­�#oj6à È_ÌÕŽQd%Tð»?f^J1ïÌ㣂EütÞAžÉÛIöÄrþéóG)ªJfß…é<–³Ÿ ‘�8œ½÷öu_)5’b/3wR ÊD›DMÓS©ãF7qÿ´“ʰ¤ ìéeë$¿4�Gç⃧^#9ºŽçÞÛÈË[×1-þ"Óâ/òòÖu<÷ÞF&E×ñþS¯ñèÜC.É Øêfî¤ä ª€û§�dÜè¦|2y7aÓ¬  É#9‡ùôÄBj›"n»ñªûX–q ‡3–¥§Ù�»‹ý2ùãöG(¾<¥��!0{·ž˜Ï…Úxþqõ'üÛºM|v<‡ÏŽç0müEl†·ÏÚA7R ⢚x$ç0ºEH0w Fëëÿ½•‘YÏFoªý¦ÚR &D\avr)GËÒÈN,çõ¯äÍý÷Óâ F×$>¿Þë;º&)¾<�§ß}Š ¹ßðlÞÎ>,ÈÅ¢ûðÉÛìRð€Q@ÂÉzšO öÝFÃïB»w„†bµíûS¦S�¦n�¤Ò˜•\JDHù¥é”ÔÅqÜ‘ŠRâ¶å\]“´uÚycלªJâå¿þˆß®üŒÊÆhöœËêó»RhLvW³zï®|iGš$ý»q<1Ó!•`¼«‘�5_êëè3ß¶ê>rRŠÙR˜Ãç'çñmy`·ï@6xv_³ï|&?ÿ¯_±÷|&+3�céy5ì: A¨¯ƒ�5_0ÞÕðýwÁÝÉ¡ÿÒúÊ�¥¶¿J;ëñ �S¡“�BpÃþ ‚­š;ƒù 1î 4íVÃK¥‘•P Àéê¤[®Ñ„¢ÙÂþ Óié ¦±5�ßèu]Iž¨ÝÅça®ï 1æ‰VnBG²¾n79qýµÐ@XÐá±qèûÀFÏ�Ìú~G(\^+‡¾ŸJ‡ÇÖËøxÈyˆõu»Ñ1OÞ3&Êz£Ø¥›§/m`ËØ{ñ ½gÏà_jkv÷ëh7ÞWW~râéK۱˾_@5 ¦tù`¿‹çª·ámãƒØe´Á}†· èÙÍ;PûI¡êëàgu{X_·ÛôÆ%‘q&ynu›�Â�Æ�ˆ,Þ¿’û„®—ûÿi ·wÐì ¾­UWK“]—ØXó¹W‹Ð‘¦7> t£)I�m ŸÆäòeÔ¬£{Î÷E÷›þâ)!R´ç+®ãáúŒw7öœ )@ ¯õ£QÇQs8âÝN^;ÃÊ+ÇH鸌Ž4]žÿC 9t£)‰NëhŠF%s24…âàêl‘´éAx„Ñ3“5%±*£ü�ĺ›Hë¨"»µŒ¬¶ Æz®õ´5²èù�(4¥�B£M¢ÉÆK(-z�Z  ’^ÂüíDy[‰ô¶0ÊßÙet1$üümÇg¨  ×�í2§Pªç3\wJúvCS§�wJw4oÖªÝÿCÓ±�0`F0ÌÀ0gDÜ sF0ÌÀ0gDÜÿáúm73¢ê%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:59+00:00ž|{%tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/EUR.png000066400000000000000000000114351520501070600173410ustar00rootroot00000000000000‰PNG  IHDR`@jVåYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs ˆ ˆåŽ)ItIMEæMÜÀx^tEXtRaw profile type iptc iptc 28 3842494d040400000000000f1c015a00031b25471c02000002000000 2÷�ÐæzTXtRaw profile type xmph�ÕZY’«H ü×)æPªŽƒ)ø{ó9ÇŸL6‹ñÊD nGcª¤”2%áî–þü-áËW©íuLMªb5^bHÞUÑÅSlã Ù¹a¼\.£s¸ÞFÏ+!iðY+ŸSåk›ØŠoR—°1hêü|Ä; ªb“s:êPuÚ§F»ÔDlŒ™Îbí*þû8$å=¡ ñq$íÊ�ÛrC2›Áµ‹aj|•#ž‘0\%Ü 5¾±ƒÞ]ÿ†£vÁyïãÆw¹G÷MòxUÚÁÝ(ɾÜ�°Ê f?¹QkmùÂY£:s1‚wMȧÆe:p*WK$€�|"[.¶N‹À ›î#.<‘!vìšØ&ŽÙ¸ož‡9Ÿ8G†bv`=Ö’*‚ULlÁ¶5�­zoX0ö%!ÂŒp!Žùbüð^Ô�ì>CSY> `‰óìDî¼hò�ÊÞ¡ø™Y{¡ö˜Â¢‘æ’;B1Oì*ƒ)2¿ Tža ù’úG8£BÉŽÉ j§Ÿ)gÚ>ï–×*2eÇWÉ—�§iÓžùIñ�gédˆx\ Ú1öÖFü ¾ò-�ôÈ(À†i9†WÔ£C׊æçÐH¬–òe²cãÚ§~ƒ÷å�N'SÁ¡Cb �X èG­v¸í¨î¶�ó aÝÏ‘å„àS»5.{Ö'ãÉ ¶/�[/•X,×ïÀæ@®¬Ut Œ=2Ó¨ÑÝòr�¦Ë•U'VA#¿vB4ô†à˜¦û" ަb¶Ú}CžÄkºõ!�4š[ä̦Y¼#*¨ƒL"æ‹…­ìdG'šà"㦪²±“Aœƒ}„ SŽ@ÝÇá©"-ɬ<·8Ú‚æP¶HrƒŸ$8ì7étF2ˆQà›8XKŽšÅ1t6ˆöq��¶ uàî½ÕÚ^~®DÄ“0ÍŒÔÅ;pX:�5o× e¡gœe^ð�‹±Ô͈îˈåJÁø,&ú"ÃeB¯­ƒéœ” šHllum²­Ío“ïM]é¶­)›®SÙæò2kè�Á3[*rfâË‹7Ï”.Þ¨Þ0m•›Ø¸8ÚÑÊÁ\Iî-¥$ÛèÆJ˦Úeý ©^5Ù%†GªßaU^Ñú.«²Á°#µ÷0Ék©½‡I¶yI_´ÌœAè¼F5BMí¬žÕ&$�êë=ÙÞ†÷vÞvÅ;=ð¡O¯H $R4(Kêï¶=’à¦ÙP‡ò¬ë}Òôäš”Pã¡ðbªØL”GCqÇ4›Îà¢&·ÞÊ›ê¢3ù/æ>;”,çþNºÙĘjú.�çcÑÍr9—c¤¯jí[Ò×Fž�˜w'Ì¢ú¿ }ó(!ÇHŸ9¢p7hV„#¨}Â×|Ë7„kïÆmX´{šÑH–&Öå¦�éóì—}¢-Ÿ²édû9{-ÊUÑyý_†Ö29¢†󃡽ÌO„ö]0ç mÓØN€è€¡GÄüdhï©ìGBû¦dNÚñú?Oh›gÈ :`hŸ˜ í•ýLhŸ—̉C;Zÿg mõ›ˆS :`h�˜Ÿ íµÊ~(´OKæÔ¡«ÿs…¶øËñ§ïÿK†Ê¯TíWM©ü…_þ·¿kËŒRorNTÏ¢wš ÚIDATxÚí[{pTÕÿ¾sÎݽÙìf“Ù �$¢D>ÊSD…X5bF´|CgZm­Zý£8-uœŽŽÓiUdÐQ‡Q°U©:  hUÏ„šðÈ Èc7Éݽ瞯Üì&hÔÞ»]�üþÚÝ{ó�ûÛsÎ÷�ß9aÒs0ˆ ƒý¿�îh 4ƒ €A�@º„H qKãVòk: Õ�ÿÉ I1ˆf–_öå�ã÷Cg&)„ß–þcˆ,~®:š�¡`;pµpêîSöS¡ìvMÈs5:Ýe`j*iDBæ�¶Dýög"´?p¦þ8oó¢;3½1 ˆÆ½/T^õ»Íå*qC/=3ÚÒÙKOAËSу€LMuûˆðÉŠ7�PuùÈÔ’o)¶â•»ÖVÎÔsM=×üëö«yõÎ^ulz—þTñ&)¦º3lz R¡ŽbÅáF]‹ä¶Þ3£ê�½“êÎä¦VÛB¦ˆPã–)Åô«#9S¹™�` �[¦Å{èù ^!‹†œ¹wfÕkŸN>Ñ–Ý÷kÎC¦Üž“܉=B®_ôÒ•£ëâ1þίŸýüXÁ‚¡}Õ45_îÙƒ ùK7,äL-¿v›žÝf˜ Ù7x…ܸxÝEõñ8ßúà3ŸÕÚt@—Z*æ †¤ ½±º5«F•œ=q4§`åŠy™n¨ÄãÙ÷€'טëw‰ëFýš•ËÛê�æ®Z1O_º‹�w;@"Žº² V>_A„“ 뀩¾×!Ó d ™ê«N�®,¬³ˆ=üÂmpŨú~t÷àÖC$ >E ¡®™sŸY~`ß„·¿œ8ÄßyîÐHŠrÞiÅ+䜧ï?¸ü;_MÌöuõ¥# ¹”Ô\bˆDRSˆDÉ_L ¼FÌÐ5óÛ?RÀ«±î @JÒÑÎ÷Š¡�nhäðC·HŠË ëBÁv»Æ»äÑLæ1cR0ÍüNêôÒ53&óÄ“tÁÏi½¢èk’Âítˆã‘´ [U¶ufq-4ä[†Ž‰Kö R„ßã¯>—ŽÒС!ÿš‹�¬˜óOh�úOjŽÍAˆDÏ ¶ß;w«R¬lü¾P £hèéæH`Ãî©Î6:‰E×l϶ÿt¾KóO=ºx>¿ãªÓYÈ-§†›c=ˆ‘©æŽ¬¦Žàêò-Y>cö„à ¦ìùâø(PÌñE&"‘b{Ž]4ïòM[ôw¯˜óþ‘ÆÐéHÀ.>� ää#Á­—7ß²öã™� Àa醅ûªÇ‰ï8ã|«X„šfV,½ÿõ;€è°îã›¶ÎB:ûW8™æ@J‘]T7qäÉY�?tíØÃ÷N¯úôð%.%`Eº±pÚîßn¸½ªvôå[² ê;º|ή?œLóöº)7E 3-À[EÃOoͱ”;å(¡àV8«ãDcf= m�™é+PR#°»º÷€�®¨“„ŹfÚ�_¾:\Ir ¤bð«ÁïÒî¡v\ÇÃ9½Ô°‹”DÎJ�§• A„=E�£Ó±ÙÁNä!=š )7�ípº'îxt‡"$‹CÔÓÄ}·]þDdq·�šþÑ;²Lùäú±‡  )œŠî„@„! †žO쮟ì¹{Ú.Ð�QCO{43fxâ£óš!¹oúÎ;& ™�£ÃMçõü¿þ×,fÛÆ iuùÛË®Ùæ&ĤxnǬ•oͳà ØŽÀ^Ê{„|êöMKfV ¦ &µ5ï•ýáÝ2G&#Ãov •€}6‰{ã7L9À}ê©¿ÏYõÊÏIHD"p9‹1²,öÞ'S²ƒWM®áúÍÆù~ëVôÆ ì@#�[&ÀÈœÖÏ« ¤â#sZÁ¶âÝ߯"BÁ•djL^ˇ»J‡dvçµ#áPtgÒ¼)…l«>5ü—¯üŒ_vÝG™9­�†žc´g}3äÌ{ûÇ?ÿáuš¯ë¾éU"1¥pdˆ9VI÷ºîHðMC>@$2tÔ R âNúùŽжëN@ˆ©UˆÐ™r6º“•´êSÔö7íÝ„mÚÛÑÉé ®¬³mÓÞÞzO�:DHR¸T»;/�mÚOºèßùÙmDÈÝœ§mÓ~ÄÈ´ÂxÄßcÚ�©�ÆpÒ´wIÓ~ö%?(Óþ7ý‘挫gµ—†O´æ¬«šîŽD°äÚ�†ÛËÆï/Íox|É‹Šðo;f¥»i¤)ôÐ ø3Œ—ÖÜ8a_Um±{¦}UmñÍ—}5uì± ¿ûÁë?8ÔN{Ó^È×ß½qý®©�À`ùkw:|±æšià`é¯Ïï1íwºbÚ;)"HSË)úº4¿qò£�<üjÅÝÓvù'‚e›öSw?¸þöi�­œ0òdVA½tú`•ó¦}Ž?ªÛÏæÒÈpcCG–«¦}(«ãdc³sÏüðL{ „ó©÷pÙ´wzo™BnIÅ,ÅPKliØ»éHËfovµrÞS¾ps„)7&={±¾·®0.E/�§èŒ¢ë=8#2ô²Ë¿ÜjÄ=O? eE~]È<&®¸áý·õ—1yÍcòšW–m5LíÃC¥¶:Œú-“>¯¬)Yüì2òšYºqôø(ž’”¢W@ãÊìô�n€á¾n™(Žz¶=¢þÇîxã÷ ·Áª—n[³©Ѿ;"‚)Ù•z ]ËìL�ÛÝ75aÀ”œûº,Ÿ¯[Z¼w{@pK2U’×T¹·„35&Ôd»î²� ÒâÜ×m)Æ}]NùÍé% Ù%µ¥X¿Ç“¦–™ÝöqMÉÝk—ÒÒ«wdd·uÇ=߸íÂtw[�&ïÍÛ®;xc1/êFj^æéòÆ¡íºÛ•4Ku ¥Cl ¨sêït@ºô ´Å @`P 0(Ð,�&ÄtİeY|qeXIfII* ° ’˜ (1$¨2Ìi‡àKKAdobe Photoshop CC 2014 (Macintosh)2015:07:06 09:17:09�0221 ÿÿ ;  (š¯Lö%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:05:44+00:00µ³tEXtexif:BitsPerSample8, 8, 8í>'tEXtexif:ColorSpace655353{n!tEXtexif:DateTime2015:07:06 09:17:09ˆV¾ëtEXtexif:ExifOffset224ªQPItEXtexif:ExifVersion48, 50, 50, 49cÔ øtEXtexif:ImageLength800rHŠtEXtexif:ImageWidth1200’ådtEXtexif:PixelXDimension2363>tEXtexif:PixelYDimension1576ÞŒÚutEXtexif:SamplesPerPixel3§¥1tEXtexif:SoftwareAdobe Photoshop CC 2014 (Macintosh)�x\IEND®B`‚qalculate-qt-5.11.0/data/flags/FIM.png000066400000000000000000000007651520501070600173250ustar00rootroot00000000000000‰PNG  IHDRi@.ÿ©ögAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<BPLTEÿÿÿóõù:c�2~5€Z}­þþþóöùúûýûüýïò÷9bœY{¬ùúüNr§Ns§Jp¥C‰4KŽMr¦4€ôÇ ’bKGDˆH pHYs : :ðd’JtIMEæMÜÀxvIDATXÃíÖK@0EѦƒø†`ÿ[5¦*¤è2¸wgøžH¦ªVwK›V> ©´îUɧë‡ñ)Msï “%]X·x—â~„¥0Ñ\§{µ8qV!!!!!}&Ù­†ÝÚ­»ÝcùÇ CBBBBBBBÊtÆ.7±Éؾ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:53+00:00: $ktEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/FJD.png000066400000000000000000000117371520501070600173160ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsœœ&Í:4tIMEæ:Ûðî©IDATxÚíœ{tUÕ�Ç?ûœsß÷&÷æIx„(FÞB@Dˆ Q¨vƶRÛÕv­>m×<:«]³fÍj�ig¹ê´VGÛÑÚ ‚V”‡AŠ^!€ …!äý¸¹ïÇ9{þ¸ $¼ ptr¿%¹7ç·Ïþ~÷ï÷Û¿ý;GY°Jf­zˆŒ…³QœzãÓcMüò÷›¨xgííPÁ%#©óðÒ™üáÉ/ܶƒ#Ë¿ŠŽBÏ¥$(N;£+žÅ=k:�<ñ/¯Ùšz鶤C’•íaEÙt¾½r6Ûh}ú6lÈÅP37åwNä±ûf0ɈùÕ œX·™Dc+j†‹Œ»f’õèýxJKèÐl°»$ Vh9_\Œÿýíø×¼O`óǸçN'ûÑûq•– 8ìØ¬s§ßĬ[G³}ïQž­ø�uדú?‰UKg0YF‰¼ò�k7‘hhAÉô�±x^ŸûPÆ`åý4´ºÇÿž±�>@´âm:Ön¢ëÍ�·ì8GMeδ™9yÔõ!„ ÿ§×9Õ›øûæŸC<@"©³ë@�°‚P´kÍÃ5ƒVöÍß° t_]ù “—/"r½ Áâ·ï9Êo+¶R¹ÿ$sV=DFŽ)嵿âš@këò‡7þÂúÍûRºòA&//#R±þú‚Äï=Êo+>Lå2A\¹¾kÁ®54„UÐéñÒëÛX·©úú‚ÙÄ÷ŒKUƒ�}àLðH!\Žw•€n ñ©ëN—6ÎÍ~.&„eD^¹t!¬ÞX�aý”a¸3�,½çVó‰O£4’úE¿ÐÙà¥W*Y½a7‹ïœÄªeK™üà¢oã_¿%%„�ÛqÏ)!ëKà*-Aõ¸úáË;ÿJC«¿_Ž@åó&²jÉt¦*q"/½BýÚÍ$[Ú/J|$ç/=žçƒý„:‚ (©ý½~ËR¢ëÆ wâá<߯)�RbÙ>7‹çObþÔ1$ö¿ú=’ÍíHÃ@õ¸p—–àY8§9½ÑŸJ †Adû^:ßÚL¢¹ ¡—ÏÂ9¸Ï"R«þýí‡X·¥†¶Ž ŠÒŸø.Qœ3§£8�ƒ6$y‰û ÀeinßÉ‘e��_¯ýî™Ó.ëº: pi½ö„ä?w5ÓÑín@ nÛqõ¬) ‘êƒHÝèË”©Dª¦~¿„|ár!€�T‘zˆË•óß>ÄÞ¡¯ªï“º�ŒÇÏ?«q•’5atåáÍy’@n>ÂŒpµÜˆ‰áJ3ÂÑ«3è\dŽd<~ÕB±�23m2¥®‹†0Îs=Ñë'‰DÐÿ�ñÙßU„Àfw!Ts¼–vÝ�†\µñÓl E¡£ö0òéŸ1,®Ó;€ ¢èÄE“8cb†Ä*4)R‘ $Ht$†"Q¥ ¢&±«® €z«Jä›?"kt1Ò„P9xOĀ葥ÇN1?nAO/OBÛ¼aåuŒLxa-2�Ï+qÚR3P>ó` XÐ�I#BÈ1AtG’È ;Åa»3ñîÍÁ*­ >ˆ„L 7ÚeUé®h²>çó«5)͵%( 1‡A¨(€¥(Bò€õ¤‹pIysBtÞâÇ~ má)„&¶’NÂí¢A%U‡ ih3Q y×NËÈív†ÔyAÑMÍ54Åi¿ò«\ʼ_GI °ÛL�L]JÚç7SðPjDG/oæd�ߨÙ™ÐpJAÝçeDƒ—¶ç­´'$Ž„…è�]¨£CäÝ'sDO^’xÀOÓ_-4Tfÿȇ¥Ó6 áQ]ñìU™pàô6°þ'Ož#aµ2ì'Oà˜tËUÛ¶K‹žmN"(%I¯1s%­.Ñgß&™Ü‰oy3®,�Prr Ô¯ÔÓ²§ kBeÈð8ž1Q²ÆFqæ$©= Ím Ùùù7CÌ– n]ΘcHŒøq‹éÐܳ¦_Ú}re… ¡*©9ïUª‚cÒ-WµKHÄ®fˆèW¼º„! Ï¡hÁr°Û8:¬–ì—OÒàÔú�fÜ.pØ  /Lû´0ÃòÁb“`Ï›ì7D˜4>IÃq�½›,Ø=Ãþ±‡tUÒüÔŒ=¾+èYÐyâ…~}±w)¸|îîšy3–³š6�H”àUÞ©Ä…‘†Ä’—�wñ<3'§jó[Ýù̈D ¼SIðƒ*ô@¡(hyYdÞ7–‰7³q×_ykcõ5+KEàhìàðÛÏ  ­AoéÀðèdÚÂ1ˆÅÀå„p ¢qÈË‚@³Ê‰j§b ,Û½$vxIþóIN~äD¾\HТÓYÜ…�}|�a+š·§v f àå5Û?ožÀ0pùÜ”—Žç�»'sûäQ}È7"QBTÑöûÕ·ìÀðÐr³ð-™‡£l.IZh|{——|þD/¯ÛAAN&³§�9mGqØqß= aµÒþ»7VVaÃt¼ò6™es)Y¾Ë�ynÍǬÝTÝ÷0輆$ŽLšL†Óyåù Xš:pnz‘¬²&Ľ ɹ >—äÔ³ îwa%Сà²*ø] â„›X›FÞ�>cä÷ë8ñ¡‹ö:�µÎŽ#¬a•VB[8zÛIŠòBÄÚ4$ú•Ž´¯.Øz}ºÃEÙÜ <¾üföƒxKA.9+áXQÆ^aç¹5³fÃnÊçNà‘~@ë6×ðÖ–îŸ?‰¯ö²«z\d”ÏÅ=ÿ¶>vÛž{Ëú-Œ[r'¿YQÆ×—ÝÎsk>fݦj:;‚çoL‘UUÌÉeJ®ñcÆm„ßO 3“È‚ñn†ûmX U’BB–Ý ºÿ†¿ ·�t¾1Ž–oø°YéªÌ"7êB›BØ‘X=1ÔO ¿•œ!í©XgÒæÜ:@ñÞ+'þ4†DQúŸÝ+ŠBÈæ¥5±nK ås'ô‚â°ãY0WiIŸq4?ó –µ›»äN~µ¼ŒUKg|¾Ì‚äýà1F/Z‰�í-¨ªF¶'“„Lr¤å$6©22ojÒ ö‘ïÜZ…�0ÜSÂð{þ]Sh+ïÀm·£$á“O1aÜxšÃ~T!‘]Àáw7@ƒ‰!`@‰ïiÄ�—á¶ *tv �Lç_ЙˆðÒž?sSþHjëxmÿ¾\RFW,Ìëû·ðø´ÅtµëX¥À©*Ð]ŠP,*Í ??ýø>lù„|—�;½Åtî¯ãµøVŸúÅ|£xÄaâá•6 Ä›3³©%³…Ð0µX GÚêiS’<ð]æøŠùΜwåŒgzÁÍ|zì(m­*Š6Þ<dûÜ,¸c\Šø)×ñ&„E¬Z:ƒgWDeõqÓŸ ipsn!¶2ÙþáœvÖ¯¢ºþ3º‚fM$®'¸©`+ÇßC£²ñtBP^2�7j?¢¢²’Õ….$]ƒ;3 iÒƒdæeñÔü¼ºö-7›W'ÑÖ?ó-¦�Àj¹N‰ !<½|;—Ífm—…¸I*ˆ&ãt„;(^‚–„ÚX3cq³tìlv;H$â@ÃQŽ oÄÕ+'B5ì9XÃ�§¬äņ¡á(ê±6Œ‘ß¿„÷ëöðð„»pڦþ6ˆ?W(ëÚM ]z/΅ˈ)„´ÚëpS2ü&~wr-õösϬù´‡Û™™9‚ þZTU¥|ÌmŒôæÓ|–èT)øÊôÅTGë�'tž›õuöÅ7±×°Óëà{Ó—¡)ªé°h2!øAUjýAF „6$‡ì q,/£Z±ól7ñþâ{©þ HJzü� »/ NA)S;ó݇5ý¼Y¥»‹yõvÞÚ¼/%„‡R!ÍjÑN Á]ZB¨²Šöß­&¸ù#:_߀>ãnÈ·_ñ¶J"±Z¬  î;�¶†(£àrúhmj@9ò¿\òMv'.‡ ÙË \N'7gÝÈ¡ªüdÖ£Œ´8ñ4Ÿbám¥ko 0w¨©ÄŸ@ýö:þ´>µâ!„/ ×’{Èxt)õ9¹<ÿVë6VÓÚDÑ,xò².y®tÝ@q8hOHBR¥+wHª£w)Øn£]ªÄ© �#LJz‰ÞEI)ycë!*÷×Q6w�=8‹Q#rzÒmÄüÙ8§ßŠÜ²ƒ¶õ[14óNÄ `ü°1Œ6†:GuŸ~ÂËÆßÖ¨–\F+JÝn<�èÓ&BªhÜ3qv›�Ú=U4�<έC [tã#ŠÒmɈ®9 �H¡(ÝnUAËËF±YiïÐá£(å öÏR‚Ëi%ÇçFÆâ$ZÚÎ]ÝB`ÉÍFج´v …ãW´e7¤Ä0$¾ '¾LçÙ·�P’á(ŒK¨Qœw•–Ov³’&î›=›¤®cº®cµÙH&â$“IlöÔÉ«‹sê‰' ïÜ€sÚx†>ùŠÍ ¤aP]¹ ÿ©:¦,XBfvNªëZUY»u+"ŸÜâ[‘Æ•çâk[N�» »ÏÊ…À´Ç§$ Ù.pÍ»Š0íÔKJy~�Õ}e†¡¨´ØÉ¼Ÿÿó…ã¼)šènë±mÃÈd2õ™¦¡¸�}#R“Ÿš³îÿS��2Âæþ¹ã¦™"í‚Í�§Ã³yIÇiÞ/vM‘úÜÔ^�~ÿñÊ Á0z"Þ¿½×"�É$z‡¿_¦ KÒÔñ§[ÂÌDwQíBâíÝà™ê<“ŸYé½™•§sÙÛ†‰H À ty—/dÈMÅR"„8Ó!Üó»a¤HOêtüqñ£uXG�À÷…rÄé"œ(E’ˆÇ0ô$V»U€÷ÓORװà4. BÕp/žGÖÂ{©>þ)ñxœ±C‹P—ÃIgWmÍMbDb„¶í&ö×X Èýî—–±øB][HƧqà­íD~ §ÌdâÜ{p¿ó.âä@¥qù�Íå¡¡å�-�¼¶v5_ZðÇ £ ˆF£œ8q‚ö–VŠ †öuô2õ\�°h$’qÚŠU•Îf/Žì…Œšñ5 =µƒhhiGs™ ÒÏL›) YyÔÔ·™vÓD¦LžšÀápÐÔÔ„ÃáÀëõÒÚÚJVVÖ“ëW?ÛÊ£Ûùcm>Z†Ÿ1S*ÈÈÿ3c¦Î PSߊ#+)Í©¤`lNÍÎÞ¯ü�ì /�ß÷#‡ŽÀçóQTT„×륥¥…ââbl6û9!\ºa°öÈG¼×hã{ŸLâ[»'p°Ý‹Åz ·n£ÙY€Íé2mÜi˜ix‹§R±ó3:„¦ž©Û{<;v,£F�:ïêB¡ºù[ëöA •¼ÓšÏÿ6­Âí[ÎáÇ©ØùÞ⩦<Ôƒ´L„Õæ@™PÊ/^}‡cµµX­VNœ8�¯×‹EQΟÀ AkØOk¸+ßc –ÞÁ�ç|—ºc§øEÅÛ(J±Ú—:¬‹"-!¥�;;�pq)ÿúâêëë’Ÿ�ßïgÿþýlݺ•úúzÎ[ç”’!†�r¾8înžºû[k›ø××..Å�m^ìïAz`2¤aàÉJØz/?[·™&Ô±tὌ7ŽP(Ć X0o~Ÿ³!�Îöüö×üø†YLZöùVï½WÉë5'qL¹�7ËT×߃´Ò0pfú°Þ¾˜WV±ó©gY>ï6¦LžŒÃéÄmµqª×.@Áу5d�fö²G8~ª‰÷MŽÚ‡’uûb4‹e@ȇ´ RJTM#oò,šZ›øù{ULõícIéL2 G¢ˆ3�@HÉðÇ"}Ùüúµuìê�8nžC^N>Ò0ô-¦âë›ëçÛ‘®"Rea4Ö‘¨­¡Øå–Š?3òÀ1Ž�+âàŠ…|’°a)š€gÈaîAÜ…�öWR¦Þ ’YPˆQ0‚Ú¶fjÊl8|•DnŸƒû†²²óPHyõ^_—ö×¢û]‰x ‹Õìê/„´¸�R‚®£©©é—º¹Ïû] Òu€AŽ´9ÒäH `�#-€AŽ´9ÒäH `�#-€AŽ´9ÒäH `�#-€AŽÿ:ûBöÊwÞ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:57+00:00ÎCxtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/FKP.png000066400000000000000000000146631520501070600173340ustar00rootroot00000000000000‰PNG  IHDR€@]´è(gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæ:Ûðî·IDATxÚí\y\UÕÚ~×ÚkŸ}f8Ì ˆ¨ˆ8€†&e7mP³¾ë-Í2ÉL»Õ­¾;|ÕµºVØxoŸ•�*È-K¹)j9ÜPQ€dÎáÌçìa­ï�äP*o~þìý‹ß>{ïµöó¼ëžµ7èäoæ†/{Ș> €RJ)&¤ºÎü§œŸ}QNj8Ë2… á°lqeeŽÎ}û[IYÕͳ°Z Œ D=ž!…¹ÆÔѳ¯ÍÛPFLZY¹ø ʘÙjþ¾yiÏ?ukÿ–ںߴlWlv@(ä®idáüOí0·ÙÏù†ºê ›ÿUX5sAõì‡{JcLSèàAŸ¾–¹ÿ«G2²R˜De³ ! þeæD8Œ’;ÌíÍœ—Vúïg>yx”æù�LÎèøh-uº¦M‰ÛüiÌÚ¿kR“™$BèJ#é§áÁO<‚ª5wíÉ›çTg.°ï*FEVR’úmx{NYÁâY³S˜¤È–ÿ8 gB?ëwi‡Šÿ;ï‰ëcÞy½tÔ´š•9Ôb šy{Ü7ŸÙ¸Æ0uhAÆÃÕéû>Ã��=‘|xëÐ'—1�®-?¿òÖ¹Õ™ ì»K8€,É£†G®cvÙæìÌYÉL¢ÿ!΄>k^Ú¡¢çÖ/Ûï�•o9ùJ¸Ý¡™q[ÖÎ_m˜˜*K²Ïá÷–7:\^à\µ$à‘^Ì\YҸ䉔ò-qO.eM[~~å´{ª3´ï*&< ×Eæ½9§lóâ¬Y—y5œïõ¹ËÇö{óÕIÓ*_ÉAnwhFFÜ–µƒ7ü¯aÒ8Y’€ðä`ESVöºÉs?ðŠ Âè*M€Aàó?þ÷ˆqÏÏ~m_ý£ËSÊ·Æ=ù8ÓhÛò7TÞ:÷|rßœ]º9;kVJßWÃ9ÐìòúW$ÞRùJr¹B32ã¾ù|ð†.¯÷A_VÑ4ëÑõ£§¿µ!¯0BÜUŒ>``@‚õH#ä®Ù3jü ³^Û×°dYÊ‘-qO.eZm[þ†ÊßÜë J=4Œ¾.2÷ÍÙe›Ÿ”8_j"DÀýTÀéÿ¦úבÇÓ ý¹^?ëÑuÉÓßÎË=€xŽ˜´pU£|! Ö+”å}´'o}qÖœqÏ>¶)¶Ú½ð3)‘€ÕîQ™»hêSÙSGpÖŽ×^;ð¿ë%scôÝ¥€1áIù‰–ïîZ»é0¸$ æ´*Åç.öÝQ¹Êi@öûó�‡A¡`q�šÜ«6E»JË€:Ý€(´›¬žûœkŠr!0c<ÁíV“}RD/�ã8¬tºgÎõÐÂO6Úc„c€R.™à‘èÐ(Ã{ï}›ÿσ\ Æ�„DªnžÕÛk.b ÆHÅÿèNŒ!_—ý£ô2j6„±N,ÐÐÛ�SëÅ“#Ph¿PÝGUÞÏ·7©Ñ%`ÀdkÈ%F&#Å.Þ3•ïªEñïÉV«/$gÚy~„ÕeÌ #áÜ%xɦ(L%@L´yÆ )=Ø p+v¶}¹¿ ÔˆëŽÍçßšõe¨"‹²¬0¿Ã*ùå:™Ë=à Š1`ŒÁ#‡Ì ª�LyáýéÆá:ÇŠï� #€ ÀX¼ 0ÄB@t©°á>$aryA¹ŠŒ`lõÈ7&‡|9oО� Çê-ƒZžÙÑöÐ ðy•¢0°‰`Ì(€ÔXA€Zœˆ!„p—?1æg Ö5�>]};ßß/ó@俈xe¦ÕËÖ˜1v«¹¹Q¥ÈR`ÿ!w˜¬É�µD%Pଲ;]cY¡F­šÊÒQ3¼XƵ¹‰opÊ|”ŸF¨ÇsYq9# ŸsØ+^Þ$L£˜��ù—d�îï;N—Õ :æ^> ‚=¢Ä(¥juV566DFDô:«ÕªQ«;Ì š{ë0o^ò-E€ù"¡ÿF†æ^Êy?-òœ_MR†uWiy]ösHPõôÌ+xëmruºà¬ °žû0ÆF¾.± ÅË Á.A~â€PI=Ö,Lð-?Ñ_½‘‘‘ñCãôz]pPB("2J¡4($L–%ƒÁÈód¼¥Ü(˜mTßRïK2¦Žî �g�Ò�(ø…3¢T›œäkÄ.c$Š@ä[`^ìÇ"ð•›¼”2·Lƒƒ‚0F:�NèÕs&ÆX`ôý-z½ÖN‹šp6/ƒ®Ї4kñÚŸüáG)ÂæÑ©ùûî™qkcŠ!ž€mÇKÞ×Ôí•,V¤× zx.7ñ N×¹0# Nw=¾--ŽÃL’;Ö~iݼ °NKBL!¿›­I¶ñ»ª5ŸüÛᑃLÚ K¾1?Ú`„ºz`Æ@‘Á*a·Óai³„Bôz=BH§ÓY,�Nçt:[[[‡ q ´¸X‡a€ö-»‘¼ çuÂ=bœÍþ¦éIKî¿aò¸XŸÃø‚»cOIKÎjë¿vx]m>�þä¢ÝVáØg% ïMe?•BÐ%Æ]?d™b•*øÞ»IHPËkÿ°mø’�Ôññ† YwÜ’}ðïg<ŸS˜ûi1¸e0i/(ÆùB]´aÄ€¢cœb1}�V«Å×××ÛޱcÆ8�ÎÊÊJ�FÓÒÒ"Šb¿þÑHÍ.PdDT@c}Z¾m�ã8¬P*[= æÌó‡E“F ‹ 8Œì»KZßxßZ°]t™ySÔÐìåÁË–3Óò·v|öîößÜ‘´ðÞTJ¢<÷ܸýøÃKrgÿWê“ Ó’¢@áHàŒôÀéŽï÷·¼þžµ`[óÛïšs¿JœŸµå/ *þrç_s¶}¶¶<21i9ŒÏl÷û"G#ÔÕD0†Á¡”�$„ÆÆ°ÆÆÆ¶ö„ ¨¸„Øl6Îjå8®¡¡Ñ-)‘FÁ-Ê]}%ƒ>-Ò³­A|Ð[\ å3fŽzfÑ$@¾]Àر»¤å�÷­ÛD—…вø±�¥ Ê™iñ«ÛÖ¯-‰Ï|}õON@€A·>¯týÆC™3’žY4it÷(úÆèoÓCðñ—^çß[3?ëÓ¥ žÌžúâªm¹ëŠd·ŒLZã¾ïÆô„ „·¢U‡Ñ}®ƒ^Q¦ˆ3˜2`. F(— ”1µŠ“mí vömŒúžˆ±¾ˆ¡@΂^Ãgd&?ûÈäÑ ‘pƆ”cwIË«­;D—™ŠòÈoC°œ.ÎÙ–»®Ü22éTFÎÛá¸péݵ�`ÒŠ’²!¯tÃæòŒÛ’ÎÑ01Õ01µ'ÄUýmUíûy1d­üÁçKqÕ¶õk‹dÏe áǸá›2Ñ­® {Û\ÿ“‚"5lóiþ“*U\ ÖÔæ†: ¤?§ÈkN’‘AtW›L‘ õ5 €Üé5Ÿ™•ü‡³½¾úî€Óíõ‡™);gÛúµEàB«–ªœ Î( eŒ“V¡4Ci~Ayæô¤3G×§¥êÓR{F¯Z¹ªöƒ¼˜ùYë–.xæ±ô¿vÓ�Z„üÔ8Ö]%s  Ö­ ‰9Ü<¨Æ¥Õª¼ïÚ­5u@=Ài©;Œ!'šmÿ<¦ëˆò‹õÍ/ÒEÒ0è[…Þ=sô³§Œºî‚^ï 8p6ô:u_öf»ö¢MZ…Ò y¥6•gÎHzfÑ�«A?1U?1µ'(u­†ùYë–>øìcé/äææíe‡8ì„c u« a#@ošš»'ŠÔöÃNP\`m¢`^ &zÓ˧%ä!{j½Š³ d;�ýNcŒö© *ýú‘Ñg{ýYi¶ úsN¡ÿXWPšžô칡+(u;Ä�Aé÷=úÀ„ôŒw¼^Ù�—S0B„CàQ8-wWj„~ø…ÔaÉp´Ùuëß�´;$®�j(!œ{wQó«ÿ°î¢.»*"j`öoƒ—>XÎ{p|Â,O0a õé$eŒ'¸ç„K¡Á”2¦ÿ˜¢À8iœqÒ8OÑþæ7V;76¼õ�<è> ½Û�ñ¹„Há�ŒÁqFΠ!‰r3`ØöØ©_�t?´äÁ¬ùšú†ýù«ˆðÝ€Ôì]óVî{vqÅ�‰3ï¼Ȱd�("Œ"´O%Ÿ´)ë><íwOšvío}óƒÎ‚íÀgÔÝq{øò… 1‹s¶÷ zÒ^¯ÌÚ­žN,`$téõSÌÚ­žh¯W†‹É6g­†žýð¤!1A’WBqcÇ~”Âoù¶mÕǬšסF dYI$™€šÇ*¬D§ß6é�X~8â ‰RÝ¥c`kþ�ªBâMHæ––Zv½Z¥òÝIÍã”pò‰¬€¿ 2F-e²ÌPÆE†cFÛêZÁ)B�ŽôªÔc â±^+0Y¦NçÙ3bX§C„8\^Qê…&ê+‘™Õ :!ؤ£>=U¡€`¤¢hi³²^†`ÂaÙìœwÿ k^¾ Ot¾¶³�nùøÀ8Áqºt ïiWi㱉5ÅAaÍbô�8`vcñë&ƒ]£î_rÿÕ*�dzlJÿ[â`ÞïÿùñÇEĤó#)›>EérËÚO4B¯Ó,QRÌf' œúlu �]æõªoì^ :Y¡fçYÌYœ€0ð½õ`€qK›]øÃW5+ O`ðX KacÊæ¡ÚŠð(ëK?ŒL“6 tT˜„»¾ôxÿ—oŽ=¤Ñà ÇÓÿ¼µ‰§Úrļ<=zÅ�±M­6ÀØ?5– zö+ñÉÂ~V8!°ó‚2‚ü©{h@ç`M¸‹¥öŸ!€1à°¥Ýþ·ÂÓ+7Öp!:¥³x�š³'öÛ¡iv„¿QuçD�Õfj3Ä68¸a±¦8ÖÌÞ?È1¢¯ˆÀ©ð«_Ÿ ÕK»ü*…€œ{Ñ�[Î~ÚÏÎã?wg?î#�µáœ&#鬛>2Ú­ÀŽ£Î5)§6éðm1ž†×Þ©®;e V*WìJp·«â¸ºhû±º€¤éƒÔúoª½ ‡p,�¨5ƒ@˜_¯y]‹{ÂŒ§â:[ÎfË¢¨ê)á4uPGÌøô]§¤Õ+‹Ær»j;ÕÝ¢Óß3kr”wÔ¼¿½ùÑdü�vÛ·³¦Äª¥ÖšÝ­ÂG'$s]£½ÍÉ™´þÉ‚M¾Ò€\Ã1�„xòùŸÓÝÇKÚ[šTÁщ1!£“G(>(ÄOiiVBLÿ#Eå>1u¤ëb#>í6¤.šš]óõñmÿ¬Ü]�vSzfJÿ?¼¼¥¶ÎŒâßú¼WP…‚A]ðí±Êö»ÆÌYx,÷�ê»ZKìÁ1CれÆjŒ²h“d ˆ:pH.»Q #"Õ|SËÙ k¼æ ø1BPäÁЦ�Å5H/\T…ü9»FWðS³«µÓ>zBÒ;Ø>‹:ÔÛtô ]f!|àà¸Gö””íibýƒ˜Í)*b}Q¼^D6ó7šMIÉ)ϬØzòp=Ñ Ôß÷|¯QE¦X¯?2bð�Ð狜'å/ñ˜h¥)ÁyX‹¤×Ñ%›ZCxÏÞV¼j¿,wÔM6´Ö”ï¡)R=/ÿ®6btæ`áÄÉæÃuVE’�¿jÄ5JÇ!攞^<þ�Q¨¥jʸäueí Š-^¸Çp¢¬ºÑsêÐ� ¸Õ‚j„º-ºµ(ÄV µº•¥žLÓlY0(òTaœ¶&,>yÏîNíg¸ à0Ržøžº'2@tºëNÛ«cÇO-<ÜÔÊB£PÛ¡#cBCm'ÒB¼‰P7–Ô¥6pLÖrt~ç•lØÛ³¢Òø"‰mû¾�`,µ†·Ö4qj•\‹  È÷g§Ã�ØPq dûÖÙI¦¬¬':66D Še |Z'¨€R‡‘Ëí)q˜æ´Lïì?þ»ìøiêš}¥‡ ÂÛÛ«J÷ÄM™VXÜŒ°?kàš«‚Ár«#kî˜{¦Ç×Uv* H¸�uÈe¹ïÅ·ÖW=ýôg‡­רèàZGå>og"Æ`C숽¶Øõ÷' ‚µ©®²¾Ãj㣆µJúú½»F„ß;ç·Ÿ½»…D\ôŸjœ;Ÿ+ È/j#Ùá3yØ=SuuÕ5iéÓ¾×èø°xWÕ>cCó÷_~ÆkÇÝ=)58, ,üº±g^û@ãió_Hé§D™"""‰ÚÐqøßCUåÛ î|ìöÊ›Gíý¾ëÔ½ªˆ~¡ÿ¿ñÿÄc@„E1IÁŠ÷ø¾ŠƒûÓRÇßó¥Di“Å=pËAOÈÐ?ÿ1g{§Õ T‘™"€Ùlêå-ýÿºeŸE0š;¬U;¿þ8ûVcc¹Ó5*c!¿-ç�t¨uŒþº.` #Q”™ËiÑÒѱ¿ü¨Ãæ0†ÆzFê\Tš™¤� šRRÞ°tÅöy3“o¼¾?ìØÛðá†Òv³íOœ2²ŸøÍš÷ÌÇË:ÚZL‚ªÙ-êƒtáa!�ÇA%À½ÎטÊÝõuqçð›ÜÐzz‹×S__o îèhçOìL¸ÉéÁv¯«õ`Ó7§t‡›[³zqx»¥¾æÄîS’ÛcóˆN"ÙÛŽV¨±N<¸Õã´Suͱj½šOˆ3plçŽCzé´Ûbu<°]Gª£Ô¢Û¨ K•¢áqÉéêB�%,mÁ¦­¥`P÷V’»æÊPŽpÌî´!cÆ#Ü͵M^1,Á¢ž? ĤîbÀT2ht*^ôzE–%‘Ç,*Ho 4Ä%&I›AfÅÝ09ÚÈXgÛ©Êcƒ¯Ÿ´¦HWsô§z«™#òßW“_Ú8Œ‡øÔ’‰Óâ­V=j þì_õÇŽÔ 6~DøˆÁú~&f$¢¸°âF% n…wP]»Gwä´T\Þv¼¢aè��ÿš10ÁdÑ2Ûwͱ/­ÚÍéy¥÷ŠÐµH€ï�t?¬¿Õám®i�‘V`n Dxžµ¦@m€ATòŠŠÝ!š;�’Õ ^/¨0Òª˜[ƅdž›´Ç�žêíVk�]«øúa·qj ”a„0F”1*+ Ðî·á á0ÁaÊ¥Ì÷q·âA¡H+øý¥Òµ•„Ï4ÆkÐ7(cÔ'ëcŒ|ßdu¿�Îc”íþ0Ö×m!A…ø­EõLПO˜¬ûí¾ c}ݨ¾¶:áÿ‡ö+WØ~%à Û¯\aû•€+l¿p…íW®°ýJÀ¶ÿÍ•r¾¢Ë%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:33:01+00:00[;&¨IEND®B`‚qalculate-qt-5.11.0/data/flags/FRF.png000066400000000000000000000006061520501070600173210ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE#•!”=¢àåòÿÿÿýåçïCQí'7í)9Ø�_bKGD�hÙQ pHYsttÞfxtIMEæ:Ûðî.IDATHÇíËA°Ë ‹dQElïË`û/ic®²ÏmAAá×ðˆù(®Ôþ÷Ú%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:08+00:00Ÿ)ËtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/GBP.png000066400000000000000000000067071520501070600173240ustar00rootroot00000000000000‰PNG  IHDR€@]´è(gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs Ö Ö�oyœtIMEæ:Ûðî ¶IDATxÚíœ{tTÅÇ¿™Ù½›ì+ÙÝ<�P‚øjµ¢á•GQ¨¯Ñ‚5!!à³hðQ[«žö(Òè*&!ñ$À9ê©L@QˆØj|T²»Énv“}Ü™é7 d“M6° áûßžsgöw¿Ÿ™¹÷Îïw/œñûô¢Å–«r„�R"¥ÐYRJD¬wûÿþò/¬Þ«Öû )A§£*RÂ)¥„76¿ñÊ‚[f^¬ÃLѹ^¯ü!o)sؤʻl‚ŒªN÷¨òbû‚9Z“ [>¿õÎ×iR"çâʼnŒ’p˜Cc K1Ý}[æ#SSS­ Ö»êž+u¾¶AC€H©”’7z‘`ÒM3Ó‹3ßîO¾ý¨ÆruNÚýù¦¬Lì "J )6ãs�Î\r[æŠU»+6Ö„]~°˜ŽòS‰a (%j˜‡ýÌnÌ-Ì~ðÎÉãÎM€°Óí,[ã¬X:r”š� *¥T=^$Ä:kzÚ}ùæ+'£&£¢ñíížw޳̸2í�Eæì‰'c@)A1n¤½ä©)ÌY^ZU¶a¿êôƒuÈah·^mð3‡qaaö²¼)£G: xÌå*Yí,_:òµ˜Y’¤”j£)Iš9=í�E¦©™R‚”LCÄ g¶$)„çÝÞí»,3¦¥/]d: ƒö¯BH!ä¨áI/=q}Q~ÖòÒêU•ûÕ!3Ž[ßègvãÂÂ좼)cF9 Pçt•®qW¬ ù‰Z̺Ô�BpORb�5=}é"SV&tt‘1{R臉ÙH –l•Bx¶ìðn‹ˆ�$5 £3’W>yý²‚!�áDëE¶>ÅÑ£õØÖ-;o÷Û®WÖ»J×ÿHÍfbPÎb8=Ö !¥”LIsœóðݶ¼y®²5îòuÁÿ9‹¡ ëµµ¾ÿ¬B2F�>öæÁ¯ë )¶á�Þ;î£ {r³%…ë�"DBX²•˜Œž-;];ï›ßæúªö!H)!yë½ !ÈBªªÐ0Ú~_aaÓQÕå—B2Fûrþñµž1"…T�~¦£……Ùß¹kåS7ŒåÔ9zêù¯'ýæè+T�W—â Š"…P<Âç·Îš~ÞÖuc7—›²2[]Òk³^U…æØ¡ï]…~›•”V—UÖäÝ|Ù²¼ÉcǤô^{þü¡<zq™íÓ¨'¿=ì~¦´º¼r¿hhfÌnT⬬ºbã§¹³/]¶pÊ�ÅpêÖúÎÖWUTÖð†f°$0»‘©ª@ÔnTülÕîŠM† †Ón½�Ù�œ U ¤UHpbˆ£õÚ‘¬=”¡†!îÖŸ`è` Öw àÌÆ0 ¬ïÀ@ÀpÆ[ß3€øbÐé „gƒÔ1 8ë£/ §¤$$¦ghB¤ 8ý,9a Yß;1l>�û»S‚¡¸|Ï ¥U-µu÷RZ“–€ ŒÜ•ŸµôŽIÍzMHÇ?Þ·Á…Œ‘P˜ o@Ÿœ˜;û×˶&%Twc}Éj窵mô@Hà^/j™1-mé"Ӕ˻ì¶ÃFüçP�^GÇ�vˆ°Jt¬W)I­ÉÁï�¡ÿåø48\¥«ÝëµT *zà¢ÝzË5Wv±_ß•~ø©Q³>ÔÐL,½ŽªªèóJ‰�VÔ×¶m¢Tž°ç̾ô¡…S'\2¢††ÿ „H¤¤ä�&b™>-}é"ËÕÓP¯ëƒ”„@J{ u ü_¯�ú�ûgBMDQ$ç %H@½®u^Fa}Í??]R]¹±Ü~°&#óÍ{㕱´G)%!•74¶üXï¿8Va¶¤a�ÜãÈ›ëß³:l‡¶&¦=^ÞäS=ºT‡ÖEÇnÛ%ÄÖŒt¯%[J!ÄÑºÄ Ç™ËV·¥ªê†¥™&Oèh}¤kN0¤9ê�>iôìk/Ô3­ AbÌw ì–™ÇÖC7Hɹ.Õ‘tÓµÝ;v«c¼" %æœIæœIêÉzMŠžÝxÕùýnSƒá~î�ÒþC†ÃÐÍ I @.s•BDq0J!´&ÇÿUˆ4‰€Œ´¬uŠBˆXüIbLÑÅÞK·¢±wŒ5¥ìžJ)¨É¨(ýë§~:õéz½²ß;íwI!¨Éè}¿ZË=usQïûÕÀ}~<>®pˈw QÅ)¥ ŠBŒ‰ÐýQø›E0ˆHúôüpºÅ˜Ãï¢J!@ôtÛ'%1©Å<(ÜÍÅg�IÙ#§£A°JžÙ: Î: Î: Î: Î: Î: ÎbÈúãÔ(º1hÝË4bªÓï¢Qo¶"|þA´�Î×6Ä;†žÕ¾çz­’˜Œç!Âç·ß>Ç2=k°lÆ1û‚9ñŽ¡ª/]C-æH; Hˆ-Ó³’o¾.Þ‘F«S��é^ºIq B{?\EEá>O ‹D$Üç �¦æCv—×%xü\iB&ÂysŽH�EU£�ut—VÙºòÐ(î/¤VÜÑí!ªª½Î§(!³aËç±´ï””s·§%#ÝrMöX½.b¬’sDÔ*|î =†Œµ'Ê‘R r�×0ntâ”L-)ßçð¤”RFÈ-K ˆê1§÷ýÝRU©Õ‚ˆíï]i']¦KOà<ÄåÖêo¬õÚ¬ z]ÿ%åo½óõØz@ *Oƹs&,+ÈŽä~'ë«öÖ—x· CaÀ6ëA!|zG†-wnBÎdÍ8)e4iã“ãÒ¾°€ÚkY'b@šl¥S]q‰ç½�‚ÌЊA]ư”¼y)…`›žBFŠqí[Ÿ­ßXN?X À(pã½V …YÚ¨ž€ÁaÌ›3á¡‚¬ìÝX¯­é­ÖoÛ%… 3”È@ˆ75)#3lyóìùó›>ûò¨¢èÎÓ÷¬¯¾sƒê%¤DÀÐ&߇ûêŠK½[wJΩÕ „†¸·I1Üцq-/ÿ°|cMÀé'Vƒ>¶ofP™œ#{)Iªa®º›©Q_°`ÒÚçæÜvï¬fƒV›×qÑ�œ#€¶Œúªö¾ÿ/??Q8ô=µ˜hB"Š@Pu7èÒRRþX�ñâÓÉ3¦±Ã7ßûSñ{ ﯜxù¨KÎOWUNmùì¿�om%‰ ‘Ê,�ÑÜ’tã5‰—\¤5Ù²ëëkn)«k \pnŠ#9#E¨ÿÅpÛ-×›³'†ë]�/  *z¢ÓQc"÷7{¶îhxã-µÉ¯?¬ýǬ+Ï›7ë¢â§_Ö†œ>¡£”!„öêo¯Ô»ÚÐ“Þ ÌYV�5:#¹}|iµlG}§gÛ.ɵšµë¤yS“2rDjÑb{þ|CŠ ¾ùîØòU{*6àž2ÁÀ ªÂ•“B€!_.­.[¿/wÎedŸû Û ³A‹P‹Ö”•96+ÓWýqmq‰wëN-Z¢($EQ=Þ£O¬pW¬³åεÌ3ʱò©Šò¦<[¾gÕÆš>¿ß-€Ógý¦¼ÁƒÁn 8}¢ïU—BH@0Ø��@¸¬´º¢²f aèÀé·^«4k•Æ1ÖÆ!@¸cE÷ÃЀxY߇"ïubaý€ÁÐ5€3ÉúŽáDgªõÃqCÁúˆ� AëÆXÇoŸ !ë㌡í[{Luù™Í˜¿$§((Zg .?[²dÚÒÜ)ÿ`Z Ü9©øÕ½ìÅ¿^×ÿÖo>À݃ÏúÓŒaì˜Ô—ž¼žq.ûÉúò=›½õQ`˜ðPAVŒ\åkíùóí¹s¥}²þÁÅö‚3mÔG�¡ª¢rŒ³�{šjÖ]¾–õÅúüù†ÔA¿ÖÇŒ!¶EÉ ƒ^mô0Ú­¯þ¸ö%Þm­i›æ¢%À½MʨiE‹íó‡ ¾ý®þ™ò=›>=SG}/1LxxQö˜ÉÀ¹ #`Ðw[Ú‡èõLËR5íÜS÷|™wû­Y*D)¸T%÷7+#‡{ôÇÂÛ˜- ¾:T»â•_Ý| Æo$ ju¹(Ý1û²¢ü©ãG;:½yÞ CöıÙ}»?©{¾Ì»m—àœ5ïÿwí³+ß|WJÙž˜– $&(éKnO»?ŸÙ“ ®Öó·’ª—Öíã.Xtv£:ô¬ï³Ãa^^Võꦚ%ó'>¶dZªÝ¨e¤Ûî„aꦩWxß«ª]¾òÿ€§¬‚HH®%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:16+00:00 WÎrIEND®B`‚qalculate-qt-5.11.0/data/flags/GEL.png000066400000000000000000000023241520501070600173120ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÿÿÿÿûüö «æè0è-ÿýýÿûûÿüýÿþþø»ÃóŽõ—£ó†”öžªöž©ø¼Äö�©åç%ð_rï_qþúúúÇÎè )é5ç"ô��þùùÿüüüàäè.è/ç ÷«µè/üáäúÇÍûÔÙé6è-ç$÷ª´ýìîúÊÑö¤¯è.è1è*åíCYíBYó€�è,é4ç 'ï^qç &ç!åíI_íI^ð`rô‹˜ø¶¿õ•¡ñmòy‰ÿþÿñnø·¿úËÑþ÷øÿýþñm~ñl~þøøæðgyíBXö¥¯åýìïòyˆó†•ù¼ÄúÈÎö¥°úËÒÿúúÆêªìbKGDˆH pHYs Ö Ö�oyœtIMEæ:Ûðî®IDATXÃíXkWÚ@�E"SÐ*y„T1‹<Ë#¼ª*"¢¥¢¶ÿÿ�tµs(d'hNáî‡|Hvöfvvgç\[náî-{ñ¾Ø˜!zˆG²O 133ÿ¶éiƒ`¾Ù¼ÿ¯ÏØ™Ê#Ø9à÷}¾‚¡ÝÐÞì<™™Ì �Höá ¬D¢pHbx‚9„hD À>±ôáy]≤šú×1^�SjRûĉ[ÿàQü8}¢ÓÌ)Íâ ²ô4Cõ“ôqü(赈ƒ|¡p"�%_(–Ì#­Dø\,äAÈ¥áP™M³8Àþ]%ù4EE«Ö �pµªVyú’Tvý�ö@ Quö+uµÑla Dh7j�9®«‘PÀ ä/ÑU*õ³óÎ×.ôp=è~뜟Õ+ ME÷v@ZHðgdòšz1»,ƒü<ðBÕòÎ.bÙ†îª�\’~ È%tÕBŸ^¶ @‹µæ•ý“ÐÑ+Áˆâí\8ÈôF×þhú •‘†°…ÄHÏ SäôÖÜXh‚ Ú ‡±!ج�ãÍñTáx²s<]¯Ê…³Âwòˆ’¸DÙÒm•-Î^¬t¼5ÚË”Žmãö;¢tdÅïx©â÷ªYó‹_§Ë÷· �œh0 eL%Ôð/¡î†S eÈjI(AË$'ÿWÆš„øØŽ¿ qŸ…"ÜËñã´ ÓL?õˆßE�©Ÿ/­„ùÞª¥óÆfH‚× y‡vÎ/ÂKHK7¤ fD$Y¼eÿd‰–ÚÎÄ_ö"ZjŽ7�okÎÇz]™ëEð2µvQ4;×%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:04+00:00X‰¿IEND®B`‚qalculate-qt-5.11.0/data/flags/GGP.png000066400000000000000000000016351520501070600173240ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÞPLTEÿÿÿÿþþýîðê!;è )è.è-è-è.è .è-è -ç *é-ê'*é,é+ê";è *è-ô ùÝ÷ÌøÏô¡è)è /é,õ³úìùÞùáõ´è,è.è .è-öºùãùÚè,ç/ó“úëè-ç.ó™úêç.ó˜ÿýýýíïþòôýïðþóôüßãé :è *é!;è )ê'+ç.õ´æ0ó”øÌóšó™ó•÷ÆùÜøÐõ³ô¡X YYbKGDˆHtIMEæ:Ûðî¼IDATXÃí˜ko‚0@«ø@Å¡2�¢Âä�Šï)¾&:Åíÿÿ¡¡KœEL ñ.Æq¾õ–ö(½ô"䇊±xâD¿…°9öŽ%‰êe4FÇØ‡É�€$  H@ŸÆÖ¿NðA¸%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:22+00:00y|MøtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/GIP.png000066400000000000000000000066611520501070600173320ustar00rootroot00000000000000‰PNG  IHDR€@]´è(gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæ:Ûðî µIDATxÚíœkŒ]ÕuÇkŸsîs^ 6Ø~b 6&r ¦#żMÂ#1AmBy’4©©"$ú!R¤(Q+µ‰P$B *%ÛTÆÆ¦$ؘ‰Á`cv c�ÇãǼï�û8g­~8so.d�µÒ=WÍ_÷ÃÜ}ÎÝ{íõßkíµÖÙgÄÌøš×lþ¿ãO4-F€™Å>³þÇG5¶ ¤å$ÌLDN§1ùh% ˆ¢èÈÈH¡T‘ãã‡G†1ÃìðÈðñ‰q)”JGFF¢(j¶¤G€™EÄvEDªª ìïíÝÔ=wóƒõW+›.[³}Ö‚�Û·ïܾ}û¬›.[Ó_­l~ð¡MÝs÷÷öªŠêt€Q”@sO˜ 2£îF"Ås ¬\–tú­ÞÞ½]4•;s°³íüÁc]„otÏVŸÅï›;gîØd¶xjù[o]´bEü“øçqW3 ‘$È4ŠÙõü柮Zýê֭Þ{ìæ[Ö]yÝæG«¤Ó�Ü𹡗wdŸy&W¶îÊë»ù–aϽºuëOW­ÞõüfD4I>Êo¶ 0FÞÜsÉ®¿ûý÷õìÏ>½¶Ûpààâ�ëܬY—üè_Ÿ^|�zÏÄL5+0¥‘89iv|ñk¯½fß×þqñÆu|ˆ§Ÿ]½ÏûðÂWÿÁ{{ß%»vœxs×}Š$}’²ç.éé˜=û¥-úÒ–!¯}Љ·¯~oÏ1ðç͹*ßvÞýßlÿê½ç¸.Ñp·)°ÏœDG;ïÿæ¼|ÛKóæ„�ûÞwþΠéÉÃÿî §cöòs—ÔJ䂜çi^±öóÙï|k¢L×Dª•‚—VÉ ´ÏZuÏ]@P*φ�„{Ñ�T7RÝ‹n$œ A© ¬ºç®�öY*¹‚—.T+Qeº† û�o]±öó†Îóš=׆Y7[€@<XsçÁÙ •Šçˆ··P¼n+Î[{ÓÒ õ¼ l"ÜNÔ‰t"Û‰6f@=Xº`Á¼µ7u[q¡x p爷¨T Î^¸æÎ;êC$IrA5äÚÛç©EP'†àªPÍå§/7ø�I²õïµKgåò‹ ÀÎÄeŒñ •kooöÌf@ ˆ¢¨lZ‚"‹BU§CEø4þbôw(°7Wl0çªFeˆ 0 lšÌ-Y.(† ‚ÈYH ¤¶¼LÀ­s�÷Ñ÷Ñ9È­ “Ä g!HcŸIC-0È"_'¼•Ì9  —|8…ÝÆÔ>XO¸žÀ�—: 8„þ’òŸã߀$(ðü ’H€BvÞEì9lÔ·NƒA÷¡qã>ôzVŒÃ—˜ê§ Õ_á:(L’â‚4Š4 ã= Ãö @ú±÷ UÓ®Ej`àAx·X4­ä”ñôcö „a ¢a˜œd8`fql®a(¾ŸïèœËPYß@ ÝÞ–†tƒW1H#iH··Å_ƒÀÏ‚ƒ*9œËwt†Î÷ILùºù`ª"òÚ [·=þ„óý�¾w7ýà‡½…‰>3b¶ ”J¥Ý›·ì†7¬ê þyê»a÷æ-¥RIààÀÀ3˜õ!½…‰M?øá@ß»Î÷·=þÄk/lÓæ»¥æ€*pôáGÜû�AèY¿áÌo?pýh¡ƒ£ ‘Ù2¤í�ýýè«»vÍêÉ‹¥}nd!((„07²‹¥}þSO¾ºkW?ÚöÎþeHdVŒ‚ëG g~û�žõáÀ½ß8úð#õ¡›‹æ—£- Å÷×ßö¥ö'\üñÌðèù“Å”Ú{½…æá(v®3HÿîÌ® Œ–�µ«ŽÃ+q”Àeø0áÜ�îΪï-95:V-oCç!¸·H¼Š“¾¶\©»kî¡}_øâ�ÿñóxèæN?{€sÀüûî~ùرYÿ½EȽ‰Å¡Îy¸ZFfWÃÎcG®Œ? üA½�6 žê'NžP4Eê82Y„«À(Öc¡D䯯eìXïšk¯¸ïîúÐÍEó-Ð0t¾ÿÎÞ½[þæö3ßx#p)S5Ðé¼×°sqžHÎLÀ>V:˜nñ!2;ˆ~ É!Z»*ÎUµrjåÊkñ³eË—km7n.š/à|?,•–-_~ô¾{ºî¾ó —�tÚ½Ä9AÑIÌ7r zÿÐê�ŽMÍ bâ.Å+4Üæ9D £÷ݳlùò°Tò3™fÏB/FŸˆõeµÂšƒ\ŒwÂ.Á+~tä �ƒ]DgããµoµÞd|¢>\�9¦Q{r۟Ǿ%ƒä ÊGÖt Ò�C2ˆýA'"!H «�Z[×Qm]K­PQ¿¡ùÛÚi#éü¡*¥Ö؉ÄÒ‡0�1“e‰,�6 ¹ĮƇJ  )ØHõMø3¼«ñâê]ÝV»3KDÂ93J@ü„0†ÍB@£¦Ê­!»ÿGdêÆ¡�BRØI,6”BC=5QHâÊPÈ#=DŸ¥x%ÅÛ)�@ãí7‚äçT·àƒ@9^¿ì ¤V k™Áoë’PÞJ8‚½�ÞIi ¹9'Ž…òÑ(Ôäû-Ñ –šöìVžé‡ek5Œ£Øo‰âé0‚½F”K¤$Ž€±wo (7Ø©µÇV£^±I(F€j¬ÇX,¯¶sz ѧÅú•žo“ß³e ™A½Wg(%èF$…€øÌˆ´µÅÇI¦¨ÔVî0bˆ�tf#4œÃ90ò�ÄBlB¨0”AÚÚêÃ%‰CU5H§§àðó[·ªKPß6Û‘wÑnd®“Iå’˽Žòë�áÐ |aõgüK§¼÷¶jÞѯ:Œ}�T=;«‚¯Xuôù-Å»ïÌ¥ÓªêþTŽŽµïœëééyî‹_YÙ·/ŸêUÈ×ê9¡êI ‡A >#4Šu-“ƒŸÔƒ}î#{5÷y^9%0è†YÎ÷�‹;)`Uð�+VÆvŸ÷ñÏ<ñ³K/½4 ˆ5Û5 ]*õèÍ·Ì{öéTë•}PÈÂNs™¿PÉÔÂ_�ÃèáµäVHùQ]Õ籠0”±�Î:µô—0U{n,µ·GoZû•uÿ©•JÓË¢~ÓŸ ¹T Xñµ¿¾h…d³AÃ&iªA>ß±íÅ5ÿµÞ#_Eã}W�Ržüfrj¢�«³éyØ”Q/e¸›´ðú§o ®ºÒ i˜£8ÇÔÔŠO^Qº¹�ò;û›-¨¥ÚÚÈfLµ1¸1U—Éô÷ööíx%“ɨÖßKÕL�}àåS'Þ’jE³ç^ÿ‰Šå ‘érƒsR*•οü²+Vh©ÔHfâS¥Êä$Nšž›IŸ´5YQ‹¨-ðÆvCSA6�o3›¶ õè.¹Ï(öÏ%5ä‚tuí±öá”zQC® ®\˜¬T§÷¡Øœ/ ©±ŸŒ÷uÌý>vÿ¯Z­TFONß)ÄàmtïJ�.gé|ú%ï(��«Bˆ5äkÎ1CbúKDB� 8-ø&GºÀÜ_34f½/E]³å«]pXüuÌ?âÎP Åþ  ÒGË ŽœòÜ’pùSÞÀFmûg :+[¡l{ÊMù”¿`«Ë~AÌ%ÁªO­D BÁìpÚJw˜·Rrÿs˜º�ê3Ö±^æOŸ#j%´€'Ævð\+ü“q‚îïË’q—‡r«iŸäÔ‚N¡Q:S²ô ë{QOl°ãÎOQlAí“�ZЉƒÓˆIlõe^”g|'™¨—Њ#®-{N\2_ý:m´*Ó¥ÿÖûMF«PGK/ZqˆëÖü*Îÿ ZÌd�”‘%bÉ}ÿô4ÑJà`{?gíí�:¢ÝNZi3¡eäW!cI[÷z)±‰’-[êÆ§(ïlmh$†BÎ8þšMÝ�|�C¿V*-4ƒ™ÑJâdBÙó“¨û¤,¨Ê«ÿMž4¯elxf´‚ƒÑ´Ý¸.8~›½ý)ýòÖÔì%¢•f ö¿Cë¬à UåÀO¢Î $'òÎ�#w¹¤Z<h*°0t³l >2Žm »åB\d­JCë•£�W{noÃ¥Û’xêö4ñ?ÊÏÔ½?. %tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:36:39+00:00r¤hIEND®B`‚qalculate-qt-5.11.0/data/flags/GMD.png000066400000000000000000000007441520501070600173160ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<!PLTEÎ'î­´¸Î²:w(Î&ÿÿÿÒÕê,” Œ Œ:w(!·QtRNSþûûþÁö|RbKGDøoéÇ pHYs¯¯^‘tIMEæ:ÛðîRIDATHÇíÓA À Áµ€…ZÀ°P XÀB-T%öAÉÍw4‰ hE¢K>x%†Ä”ø¤·zz|zÞû÷HT‰_J� ÁÑÁÁîtlPPa;%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:05+00:00þþt tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of The Gambia°G�HIEND®B`‚qalculate-qt-5.11.0/data/flags/GNF.png000066400000000000000000000006201520501070600173120ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<$PLTEÎ&Î&Ô($öºüÒüÑþÑÞÊ›W”a”`ÿÿÿ#s9bKGD ×ÄÀ pHYs$é$éP$çøtIMEæ:Ûðî/IDATHÇíËÁ °cˆ%•bI%ÊÞÇÐö_ÒÆ\eŸÛ"‚ ‚ ¯á‘ðô®µ%¼â%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:24+00:00¬xÂtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/GRD.png000066400000000000000000000027331520501070600173230ustar00rootroot00000000000000‰PNG  IHDRb@ÖRgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE ^¯ \®7z½»ÒèÆÙìÅØìÇÚì�³Ù^¯q Ò †ˆ‡ˆx ]¯ jµiµÿÿÿ¨ÅâÄØëÂ×ë>¿RŒÆ£Âà»Òég³f³Ã×ë [®�«ÕÒáñh›Í ]®ÁÖê�µÛW�Ç#m¶&o·­ÈäÄ×ë�¾Þc²d² \®p ÐüþÿÀÕêOŠÅx¥Ó ^¯ ^¯ ^¯ \®9{½èð÷úûýùûýýýþ¤Ãá^¯ ^¯ ]¯iµÏßïûüþùûý \®üýþB�ÀÆÙìíóùf³ [®•¸Üt£Ñ ]®úüý÷ùü_”Ê$m¶Öäñ½Óéc² \®ªÕûýþôøûUŽÇ ^¯ \®9{¾îóùÿÿÿ§Äâ^¯ ]¯_¯g³jµiµ ^¯d²¥ÃáÖãñÓâðe³ÊÛíÇÚíZ­6y½íóù¦Äá [®c²ÉÛíB�Á@€Àd˜ÌñöûºÑèB‚ÁB�ÀH…ëÇãÌÝîÊÜîó÷ûõøüþþÿûüþéðøK‡Äf³DƒÁôøûEƒÁøúýC‚ÁY­—ºÝ–¹ÜªÆãÙæó}©Ôu£Ñu¤Ò ]®[­7z½¦Äâ \®ÈÛíÆÙìýþþ`°LˆÄ`–Ë_•Ê8z½$m¶!k¶KˆÄïõú¯Êå$n·ÛçóÚçóáëõüýþòöûÁÖê \®€«ÕúüýUŽÇ›‚XZtRNS_ ��ž¡¡¡¡ �›››žŸŸ›ŸœžŸ››�œ›ŸŸœ›žž››�ŸŸœÈ*Þ bKGD »\– pHYsÆÆQÅÚ'tIMEæ:Ûðî%IDATXÃc` `DLÌ,¬lll윌T˜VpqóðòòòñS× cS803·°´²²²¶±5¥01†Za…Ñ1±q ŸE ` µÂŽvVØ�0+ÉöÄY‘”œ’Jp"ÊŠ´ôŒÌ,ò€£°qVdçÄ‘ œD‰´"—\+œĆ�LL.Ñ�—_–+D+*.!× Wp\ˆK¸•"@YyX®²ª.V]S[WOp–Z!ÅàÑ€›ÀV4#‹µ´¦·‘<¥e€VÈ28ònc{E¹[Œ°�Ñ•QÃà 6WBVtu÷‘¼ää€VÈ {÷"@_ØÔ ½È‚'M&ø((­PRò�‚S§Ar÷ôD„ØŒô™äf=?`‚.eÔȱbVÜlò€?ƒ2q̓9sçÍ'¨¨Ùȉ&3çA³Þ iª ~+ì‘ê�¢ð„ìV&F•¤¦¸-^¶bé²…Ô�êj@+4„ƒ–#ÀŠ•«ÀV¬^N$¬´B“Á‰Ü¼K8�'ªÖ#@ �áa…(ẛ|ipj ¯¡ÖZ¡­RL3¢£�Q€P`+£F­Ài…®nèZš�P]] zúaëhÂôõÀY/œvY/œõ†GE+ˆèNRb¨ñoÀ±žf h<ƒ¡Qäš�H#C rr^ä6'ÉkpÕ2jÔ ¢¬Æ¿èÂ¥À%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:18+00:00SƒUtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/GTQ.png000066400000000000000000000037001520501070600173350ustar00rootroot00000000000000‰PNG  IHDRf@è*IgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsÈÈ'SsÿtIMEæ:ÛðîgIDATxÚíÛKlwÀñïÎ̾ß^?ÖOÖÙ8MÛ´4u h…4•ŠxŠr(Š” ·J\8!Nô=�Š@  @‚–"„Ò� #(FP2Œ dAÉ0‚’a%ÃJ†” #(FP2Œ dAÉ0‚’a%ÃJ†” #(FP2Œ dAí©0¦eÒj7?qܲLÎÜø+‹™¹ÿ}�ibY¶þè‘í‰0¦i�É/s~ê®Ìœ£X)ì8ßn5ø×ÅßóçÉßPªm}âú\1Ãåé³lneìå¡í‰0¥Ú9ÿkÎßx‹©¹S­W?6„F2æÌÙÓüì�¯±œKí8?·t“³Soó‡¾Áv¹ð(·¶�ðaêÍ*Ó‹WÑ •dü'�}—°¯›Üf†Üê$Íʇ@š¯¿üm~0ñÕjŠ_¼óS–6¨×Tª5º#}¨šƒZ£J:sÃ4ìkWšÝ Ø�iÜ]›e¨k”ÙõP•`Ð�ÞX¥Qz¥íFÕœ^8ñù­��ª÷ñÖÅÓꛌ$~œážFÓ"“Ov1:pÀîÑHø0z»EÀææÝk*9¾ÑØ u?†^@Q>Úø=ÞÌB¥?ÊLv’‰qš­:5½‚Þl³�ÎÑî>Œðe³C±ZÄíöò±ï� Ý[¸ÀíK¢i �Ò&õí z­H«ºNW´Êž=A£Õ`9—Âç ðÙÄç(7‹äòYEµ{¬] ¦ctØ(¬±¼1OµQfâÐs;ïFuFñEzpº}˜¦�;Áﯡ:ôG‡¹›½ ÀøÈa\.7n¿—X¸×îÑv%tMÕX\›fic–|)‹at°, Ó4QÔ-Ž¡70M,‹F¹@ycžv=…Ss‘-®P©Ù,®0·|“™Åëv�¶ûìv/àAš­:!ÃÑ$mÝļÿ%Ѳ, [Û(¯æÄ²8Óhcv:hNz+ÇÂÊ,h&¡@„ˆ§‹®á>ú{†ÑÛ-\N·Ý#~*¡wŒËåÁíòòØè³DÃ=æ½£( ±®0�êÊ›—Ð\–i€e`tZTÊYæ×? ä‹÷þ‡‹ 0>øë¹%LÓ´{¼:ŒathµZ”ŠÖrinܾüßsm½Mq£@»Ù!¿^`»Ð¡RóQit‘Ϫ\™JÑ2uöõàêì9–²óÌmLã÷q9íý“Ôn„£©NFÇÁã@ÕT&o�¥R/¡·;\ŸzŸR)F|ìûôŽÿ�mõK”´ç<ô*#‡O±™·ÃÃØÀ!²…®Ìž£Ñ¬‹Äyrì(EèÑÅ~Ç8"�ûljY^[àêÌyB�ªÛË‘c/¢( [¹<Á@Ó²h6[D£Q|ûè^†Ra›¹ìa5ÊÀÈ(·—b¥@O4n÷x$t€h°›¯ù×n�c5—æ¿ý%AÝÇ+?yÃ2Éfr4[-öïKÐé¤WVIçجd™™àÍŸ¿Fè™1"�n¼^?Çž:ÎPoÂî±v%ö~¾OS� ÄG)}8OýòmŠî:wÞæú¥ß±¼ž"12Œ¢(¸\NbÝ!&§/â× æ7ßcyþ&«¿@¹^äÈ“Ïñ™þý¨ªðÏãÞ Ö Ê·R4‡Ü„÷÷Q[½@ié4ï^{“†^ ©7xé…í« •.`Vè}æ ê+ô™4~oÐî1šø�Î}½C ¾|êG¬Ô×È•ÒLç—ð{ÍE±œÇ0;¤2s”«E 3Ȫ1là$püiž>z‚þîa»Çxh{&ŒÓåæ…_¡©7øÓ»¿âÌzŠƒ!ßûê)TUãÖ†iòDHö=F©±ÅÜZ�ƒ‰$ßzùUºÙÜž óUQùâá“$â‰'‰'ù#Ô›U|ÞùÁ,wVfx~â%"Á½±»—ýÈö\§æb¤?ÉHrÇqŸÇ�ÏãØl¯Ú3/ÿÿ72Œ dAÉ0‚’a%ÃJ†” #(FP2Œ dAÉ0‚’a%ÃJ†” #(FP2Œ dAÉ0‚’aõ„s` øJÇ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:16+00:00¼ntEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of GuatemalaáY±…IEND®B`‚qalculate-qt-5.11.0/data/flags/GYD.png000066400000000000000000000061011520501070600173230ustar00rootroot00000000000000‰PNG  IHDRk@Ô‰ùgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs!8!8E–1`tIMEæ:Ûðî IDATxÚíÝÛs×Çñïje[7æCbHb�r)˜bðP&dh®¤iÚ”’�Î0¤m&iéCŸò—t†L›Ûc™¤I:“p7—€Œ�Á`ŒÁ–,_$t—V»Û‡ÕÊ+Y€$K² ú=0ƒµ’0¿Ù��vÏ9VnY§n|ëy‚ˬtŒ^a èA‘  ˜¨¦r"ŽÜp}‰z9›O¸¬]û ö°—WvlÅ6» °¤SQŽø¸0ÞÇaw'GÜéö à�@©rYìçšU¯šàPÜÏQ·)uP]­À‹ÛÙ¿¯…�­¿B¨ßµËAœ“öb)ÌåÛƒî¢Ýíä§±« …Ç‘«\%©²@ÃK®Éq>�yù& ¤*©ƒš ú­…wv>Ä£K›Q­À¾Áº Ì‹@SÇÆ•A£Whw]à„§‡¾€‹H"š|3ýݪÉ5ieé1*§¤0“4*†ÇW/ùðM ¯l«£¾ÞŠ"6‚u-‚£ lëj›Àdä<Nïumté¾H—o€ñ˜¿ÊeÉZ–�Ưâ>�z¹i ±¶Fà…-µìËÆÆU"&“‚¢šÁ¼Á²Á± ì,ËAlH{Ý€áŠ�cI.Ï�^e0SG½C@–TíC4h,Ö4"ØÖdpiM{OÔ‡s¼ŸÜ�ü8ÜI—÷c±(òÏeÎeéð©2_Çý|õ2�Aãsmµìßc£uu ¢¨ýHšˆ’¼bóü$—­`oE°<5‰Ë ¥×?È1O7í.'gÇz �‘�ã$—y—4^OÒøu� Lìù�…?ÿÁÊÒÅ"Šê¤wIžu).—Mpi] 5™\ÊÜ �pf´—v÷Ž{.qÕ?ô@qYPYzL@8-…9§CJ§ñçOšùÛ6~·½ŽY)³EçRMçÒ¾ì-µK'q9½M§7É¥û"}ýŒFý÷5—S*K�ˆÀm�Ƙ�r<õX�žm«ãÀ›Öd£1[Œ\ÎÓ¸´·‚£¡î)0ÏM;:”ˆÒëâx’Ë3£½Ü �j\"Ü7ŸéŠRLÐØ¯H|õòUÜOÀ@ãü94.[r'³ÅÈ¥CãÒ¶ÁaäÒœ::¡ÈÜ �j\ºœ÷tÓë"$…µ×bæžuE+K�N㙄ö�ºC #®6þì �Æßo¯cvýÝhÌ–L.A°®Ap¹´¥=c4ê碯ŸÝùÁÝI§·Ÿ‘èí$—3k�Rô²ôè4~÷óiÌG�¿Þ\Çþ=6ÚÖæJc¶dr¹BãÒÞŠ`Y1‰Ëp"ÆUÿÇ=—hw_àÌh/7C#H3„Ë’•4ÞHÑÀ¯NœJóæ˜xk‡…¿ì´òøEÍ•Æl1|¦ëê–‚­ÁÑ–äò‘t.U™ÁÐgÇ4.�yºéõŒW.—%-K�NãÙ$�§2h\ù¸™÷w[yíY sò¦1[2¹|x‚K[‹ös/ƒË±X€.ï ~îäw'Îñ~�y¹n Ñl†í­µØc§m] æ‚iÌ#—s5"í­).ç¥NĸpqÂs‰v—“Ó£W� É1¦“˲–4(_Ä|ŠùÓhœ;ÛÄ›;,üu§•'�*�Ù’Áem“68q´!X×LâRVÃcœ½J»Ûɱá.®ø ÄC”›Ë²—¥ÇÈÀ¹D„ƒÑqNdиb™™÷v[Ùù¬…9³ŠAc¶¹¬KŽ.WgpiO{Æx,@—o€#î‹v;qz¯ã‰øPËÀå´•¥GD  Ê|ð>#�"<ÓZË�=6¶¬«Ål.&�Ù¢s)‚8O»^éØˆ`ß”är~ÚÑ9N_ÀÅ Oí® ©y—ñq9íeÁ�7 4Þ6ÐØ0ËÄ/Yx÷u+O>V ³ÅÈ¥Cû g_�`oC°­�šÆI\…ÇùiLãòèp—oˆ)—Q–�ÆŸ 4& 4._*òþ.;Ÿ³Ð0»T4fK&—#XW!ØÛ´‹ÏY¸ôƃt§¸ìäÂxêRølçŠ*K�NãwI¯hEØöËZ¼mcëúrИ-F.çj\Ú7"86!XVNâ2*Çé ¸99ÒC»ËIÇÈeúƒâr”|¸¬È²`‚Æ[ŠÄ—1ÿ‰ùñhœ3K`÷‹Þ}ÝÆò¦rј-™\6i7V›lk“\Ö¤ŽVTWdœsc×8ìrrÔÓM�ï&þxP¸—[–�Æó‰ŸD½“Bi467‰¼·ËÆëÏ[˜[V³EE;ë’\ši\:Œ\:Ҟ዇¸äàÈp‡ÝNÎ�÷áŽxQ³,©ø²ôˆ@PUøŸä_Q/WåØÄc"<½A5nÝPK�JE|WF.²p¹ íè¨,Ñtsrä2í® œ¹Lp˜XBû^gLY ±h†”ŸÅ¼|»MÔpf–C`× þ±×Î# MÓÄâ�bäÒ5KlëêŸF¨ß âì´£Ue8êÅ9~�ï‡ÎóÝÐ9¦ÿ‚W59Ç<õ—(Oª ΀²ôÆ™<ÓWT棱8Œä £bË*dè>=#Á ÝMâ¤wªÈ²òýP,ߊ û;§¢ÊÒÉ;�ç|¹©{òI�R†%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:32+00:00µÖMftEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/HKD.png000066400000000000000000000057461520501070600173240ustar00rootroot00000000000000‰PNG  IHDR`@jVåYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæ:Ûðî êIDATxÚí›k”TÕ•ÇÿûÜS·î­WW7Õ/èDPDPbcx a‰Äwfg™¨˜ÉLLŒ²&®Q3c"$êJb‚$ºb21¢3Æ'ƒº$Š "¢¼§Qc$4Ý4]U]U]�{ï9{>ÜÆ¼tÕªJcýW­úp×­SçþîÙûì½ï¾ôÖ”8êz‰ZOàƒ®: 2ª*£: 2ª*£: 2ª*£: 2ª*£: 2’µžÀßH"€YCëZÏæÈ0 ™‡sÚq˜!‚&…#5gôÁD!t&M2œÑeÍ<;xêt=œK­^¥Ó)H æ�0 "0ët2´èÂÆ/Ýd�Ñå>üé%j ŸBáÚ.¢Z"‚Ö씫Ö4\õEì¹$ÙG~6üìzÙž`Ï«ík àb¡eõÚÈEË ”Ï €J%³Ö3PÛmž ©Ó©ÆëoŽ\´Œ]D ""ÁgAJ®µ‡®) !t>œvfãŠÿ@BÀÿ´¶»æ…,ÑÙ „ñD$¸Xl¸æKØq`ÅíÝξ�:›€Ø²åÐ T[>•Dô~ÇÙ-m£C – ÓTéäÀM_üã%s¸Tôe´¶“„æ‘q„€0 ÄûŽYUÖI³ëPÀ|�(†H‹öŒ.#Ñ­!„°l{öëô™ì”üST_/;Žˆ6°ë°S‚ë23 Ó¤@„cNýC ˆˆ]'´`I±û·¬¼‘Ûîk "xžÝ €YDi׫MÿöŸ"ÀN‰Ì`~Ózh­’GÉ ÊŽdK;™A�Ëz‡ÿèõ‚V"÷£„' f£nX•üÎ-™Ÿ?l$ÂPŠÝ²B"@Òë;ÄZ‹Xœ=Z‘,íy-ó¿?1F%¢—_¹p™yÒ²l`•N–v½š{ü�ܯ‡òD8ʪ‚±Re±ëÈæ6Ù1®åΟ‰æÂÖ(4'ž ¢âön÷�· „J'G®ùÈá@ÇX$% K{^;|Åb«knë]k嘱#cú+…Ùˆ7…æ. Í]ÔðÙënüBéõWŒxSåU ” �$%Œ`båš³"ÀÅBúÞï%¿ý5÷À>ßš¸X$;Z]yCúî;Ãç]Ð~ÿÓ1¦øÓ~â‡×ÁÓÎìøEwß?jøù§+Ǩ’NZk“få‘!@)VYvãõ7ɶÑý×-/îØjwÍãcîöÈW?—¾÷>ûãÓ}:î[=*�d×�ëÊƳã8ûwYÓ?&;Æ�™=�¤lû铇.�Szm…£ÐÇßmWf›g†!U:©³ä{ZÃ0È B+ö¼èÒ«Ãç_˜úÞ­ð-KˆâŽ­ÙÇÖÊæ`óÊ5*5˜ûå£*5(Û;ƒ§NN;ÓhhÌTèÞdž<Õ>gqæçÿ=’Ðß ©TwñÀÁsNIÿè»~.껞ì#÷“iòßY$­‡ÒdY¡ù‹CŸø¤9ù4£q”ow¥=¯åó«B÷&Vʈ6üUìG†då©�të½F/½@ö‘ŸùÊ5¢±©:™jõù- :›�RdY´æb�‹%¤ˆDAâ=Kî$¥Ê ÙgŸ3ú¡çœý»]¶®£JÕÛæ• âb­Á …E$Êš¡ø½W3ÃódÛ÷àÛ‡¯¼€ ÃdÙÕì9«n•RÇîûÈ3èò@Z“eyý½½Kª�>ŠD«f\#ý¼qHÄÅ"I‰@ úýеoÁ+/f²,5éæü0jØ\¡Œê€Ê¨¨Œê€Ê¨¨Œê€Ê¨¨Œê€Ê¨¨Œê€Ê¨¨ŒþðÞÜ´jT%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:15:56+00:00ƒßÄIEND®B`‚qalculate-qt-5.11.0/data/flags/HNL.png000066400000000000000000000016351520501070600173300ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<öPLTEsÏtÏ¥Íî¥ÎîÿÿÿüýþÚëø¦ÎîýþÿõùýúüþšÇìD˜ÜíõüùüþœÉìHšÝ„ÕxÑ:“Új­ãÜìùòøý¹çpÎ5�ÙÐåö€Ô'ˆÖI›Ýøûþ“Äë¶×ñáïù‚»èîöüóùýöúýÒæ÷ÏåöNžÞôùý‹¿é!…ÕuÐz¶ææñúf«âM�ÞÉáõïöü¬Òïñ÷üÕè÷Îäöt³å+‹×ÀÝóÍãöìôûþþÿ«Ñï0�ØvÐsÏÓn¯äçòú¨ÏïoÎóøý‘Âê>•ÛdªâE™Üìõûûýþ³Õñäðú·ØòÞíùþÿÿ'¾ËbKGD�hÙQ pHYsœœ&Í:4tIMEæ:ÛðîjIDAThÞí–g‹Â@†£5‰½Ç®ÑhÔØ{ï½Þÿÿ3ÇÁ!ƃ=çtñƒó|X˜áexÈdAAy{t/†ÑƒøxJä†axJ䘀ÑôwÆd¤%Àñ‚Ùbåm¤Œ�·ZÌÏQ°ÙN—Ûã%e¼·Ëé°Ûî� »Ÿ_'‚äL0 êü>ÀPИBáH”‰F¡;å\,ž�nV,™ÔÖF)�V&�bYAÖöôzm- ,›¢%ð >�Q”LšdÆCÙ\^Uó¹ìËX® ŠÈT@.Þ”ÊåÒ�@Q¾X "iëj­^¯Uµ=©BK@h4[íN·wÕê_ŽzÝN»ÕlT ƒáh<™ÎH™Ùt2 €?"è æêBY’#Ke¡Î!3A«õf»#GvÛÍzEK`8r§39s>qÇÞ’Àç÷Ñ'gú— *¥ÏçõÏrAAäíùo‡D‘ 2½"%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:26+00:00�3iëtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/HRK.png000066400000000000000000000053231520501070600173310ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEæ:Ûðî �IDATxÚíœ{pTÕÇ?çî3Ùd“�'K$! „÷ A,Ì€/|Ñ)Œâ”)´u´2ÚÑÖi© mǪàØÑZœŽ ê8#P†*ãj ¢P1æE’�y‘×&›}ÝÓ?.éf7é4–µ+w÷3³“9gÏ9{÷÷=çüιçFH�ĉY”h_@œè@Œ@Œ@Œ@Œ@Œ@ŒÛH²iŸFÿ°X¸pýÍô–†Xë͛ŽMϲcÓ³xó¦„Ü‘þÂR.\3X,ѾúoÃØ틈HN¿7¸·i|¶ð.~¸“Ã)edäg3i¨�Þi3ؼá~›]ÎÛ)EôÎ]ÀÂŽz,Rr´ìûÉú?@ À ÷uÕPöÖ!”ŸRøšµ—du�6{6mÚÄš™»9Ô»U*Üžú&¿¯ÿ-{$¹}_aðûiU²ðafÉ\ S—eòAÚÌÆ/é–l>[ͺŸ/Ú–_1ºˆΗ/ç©é·’á­çnÓ_pz»xÊ6Ñw‘ežÏQ…ÂÇæbv%.ã�–ôH;™öV«‚Õª�‘¢‚×@‰ã<Þq�bjÉú EõsØ“ÂöÄÙ|åíçAÛÓÜd|�mÓWr¾|y´ÍŽÆh_Àcµ°oé>$±ÔTËÚ”×iôQM.¿+½�g[â4¤á&)±UºÝ³Ùxn;þ€‡]´ f1Ë}Gù“‰8ß�·!�΂9³ Û›Î ÝpIͤAØÙ·t ?¯: Cžhß�+âêÀ�‡Ò _�8q)ǽ×óhûd.ªSAøiÈ+ Ât†ÅU”Z™âï$¿êÝÌÛ,bKÊ/Q°µÿI„Ç‹oHÁl ðã{>¢­ÓÎc[&ñ#ã?1$¨�0™cî8]>¬•Ò _\õÎ=Xrô åe«yO¦Ó($Í^Ò&øùƒÜÏìþ:†„‰naã’’„ÁíEAő쨨\†¼—Ÿ={æ3!Ó�ß`ÅÐafÖ«[9»wˆ óÊXwÝr>›y#]ª‰ÅGFÛ술 Øk¹§¾’3Óo%Ó f“‘ù©&þæÏ`gþm˜\­Ô˜|mH¥O$rI”à5¦òDû¯HŒéؼ½8û3éªNÆfp3H`êœ\äò')øì#šjNÓµý –9v2·| ¶¦†h›ô± Ú,fÕÆlV í U�’·‘äêf²+kqØL¶ â.2¦š1瘱øýxŒF|m^:›<8e2‡¬´º ´/)ÆwC³¬Pº¨h:ÎÌêJ²NGÔ×GÛ䈠‹ ûó“ÜÙ|ŠÇsn¤ªOeƒü°¯–eþãÌK<Ž£ç"vW'F· NyÁïyYûB€Ñf3þ„$ú’2p¦äq:°�÷œýKÉg«!� ŽÛÙ¥$rÇ�½Ñ67b)„.F¤¤aùí<}ËϨ8[É÷ªßÇÑpÑ×{eÍÚí8§ÍâÈüå|8³‚Gßzžâj¢ÑB¾úª>P_�Ú݃ÒÚþ( ˜L�™ C°ÜÀtw‡Ö�0ƒé@::´ÍU£uâ$”Ô(.޶¥CH)õ#€“'aÛ68qBs¸ªBa!¼ö¤§Ë8�=ZwÛ6Xµ*˜î섵k¡©IR ‹ÁÃCYY´-�º‰ÍIN'œ;̼aozz <ˆë ›*¼^­�‘mååi¿¡#t±BøÜ¬(£óþ[z8OQF·¥3ôgQ8ã™á¤ÔMP÷MÑ×`µj9†c«Üní#¥¶ÜSU°ÙB—�~¿6ìûýZÚíÖêZ­Á@‡Dôž:¥9ÐãÑœ(„É¿ôôõiiU…k®�Õ«Cë¾ñTWkΖìvظ22´´”A1ăÀï(BÀœ9��ÌklÔVÁ¼ÂB¨¨­»s';LgeÁóÏCAA0Ï톚šh[Qô„Gé�@茞ïÇŠ†§�‘¨êøbŠ«ý Î7B¿ÙS‡{÷È^><¯‡÷è‘e‡¿ ÿ«#ôž8‡i›<ÃköÄD-hŽà…€–8{6´î¬Yàp�ìñh;‹ƒƒZZU¡¤V®„ ¢miä�z¢ªJÊòò‘}[ÊÂB)ÛÛCËíÞZ¤|å•Ð2mmRæç‡–Y²Dû ¡¿) <à3F†c ûáßXÁcxZèOq¾ú€¢ŒÞ¯Fç�g¨(£G…±Ú¿ÊÑWxæ TUAss¨CÇn)Çvn¸FNRÂäÉpíµÚf“^ˆvQêë¥t:Gçee…s÷Ý7ºî½÷†–ÉΖ²±1´Lk«”uuѶ2¢èkÏ êRŠ"ø{‹… »zØÿô;¸›šù�¯A†Œ÷ùö?ó.vöp¤Ù¢[çˆìl}Åᨤ—Š|X}K×®˜A–³ãŽ?�«_+”lÇÿÓè˜XÄ?Þ­al·0£cß1 Ðú½ª‚EúÈKò3Ýadj–‘´ËG{ÜÐÔ ÖéãB¿�0i;ÃѾðÿ1!€‘¨R ^Þ𗧉v‚XE'ïÊŽ}� Š�—‡uÁè>[Î�qÆG\1N\1N\1N\1N\1N\1N\1N\1N\1N\1N\1N\1ο“v) ÐxF%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:09+00:00ÖœuAtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/HTG.png000066400000000000000000000033141520501070600173250ustar00rootroot00000000000000‰PNG  IHDRk@Ô‰ùgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs!8!8E–1`tIMEæ:ÛðîwIDATxÚíÚYL\UÀñÿ¹w†™éÌ00@¡´Ķb­VÑ÷šÔØ4š&>™>˜hŒ1®±Oê‹Õ_Œ&õAMŒKl\Òh¢X»µÕФvAºZJ–Ùà2Ë=>Ô½}@m2ù’ó{"$Üœoþœ{ïÌ\EÃÛC«Ø 0ÎÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄSìü+ZÃå|KJ{ª«:æ'ò^2˜R …ÂÕšœ«ñZ K)\ô…Èý$’9ÆãsÅkÁDÅzæ¡«¹ÿÞ&òù¿¿ø–e‘šM1=;CÄ»ˆ®íûY½n *àRˆ, âºîß÷(ÞýäOm=Xì±LT¬H¨„XÔwÑïGâ£ìèùŒ/Ž~MM¤’ö¬âåÎHè,w·¬cSÇFêªê.y�>NE ‚'Ömff™KEË”—EHÆãt¿þ*WÝu %þrÀƈ{ùÿ‰ç› þz‰q󺷽ƩxŒw{O¯ÙÅêUõDòcTDmp'˜ËÑ{t˜W»m6Ï¡±k/?ö�ãə߳ØM{ Ð9R“Ç™:9ÊŽž2qRØúÖažÛÐI}õÞÜ ™#¥¼øùb+Ë›Gât„B¬ì?JyS‚`´™€Î!i~Ï;éO‹½†kÉ7WQÈzèÜöçíJN'ü½s”ÏŽà¼ó=ÎF½8‰s"ÁÜ›h°��B-Ss>ÆÃ):ßØÎ¦—¶pS~Ió{êýgùÛY~S ·ñÍ—'¸vé‰,kòÓ,uè= ·¹¨=Ó4']Ú2ÃÄ—Diª†¯†´mX‹ßûãx’æ÷¸‚ÎÙZkæÓiJÃAÚnÈpûñÃø½9ª½J\œc1¨ª$;Þ‡^Þ‚Ç:Åu #Œf|Ø•Wxh½a)ÞE~æÓi´ÖHš_ÎÝ RÎljïíFµ4°fU3÷Ýøn¢‡ˆ?‡ÊÐ~˜³H¬¼•Èh/Vu’º°Ùža:]BI´•«W4rf Õwo|êÂý…�7Çrbi�'ZNlý�ôü²�ÝGw3‘vÈ�Tˆ¤¨ð*–Z3ÝIjÇŽ�ÈÍ0©5Ã3&³štb%%Ã?ìfÝ5wÐxs™±�bB�¤X(º÷sòãïøöø>zFúiR.�Pe‡–ÓUÕ….É™M3³¼!ðVãè!ìèÓ§ðÞÐ÷ü4ØI{m=«Ï.!¬”˜Ï�ÔÏ‘V+ÕÀ+S 4ÅIÙU4/k¥~QŒŠÐœŒÃàÙ~œù$ó¸d,EØöàÓ M)õ•�£A ¹Ãé)öžèÂÊŸãæÁOî £„l/1;Kdmú3~jJ}„³>FΞaס.lmõ†‰”†©) a[6(E2›&žž o¬�Yס±¢�hYÿ¬Åؼ�üœ í,€¸ß%íÕh4®[–eú·3ÙŸ£üþÓ…/ƒ-àj­5–e£PsŠÊY9O6ˆÙY±ŒEÕe\º´œ;wY±´uóvÙÉ9&–$&– &– &– &– &– &– &– &– &– &– &– &– &– &– &– &– &– &– &– ¿ÈÛú«²†4K%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:28+00:00Ý ¶tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Haiti›±ÄIEND®B`‚qalculate-qt-5.11.0/data/flags/HUF.png000066400000000000000000000006151520501070600173260ustar00rootroot00000000000000‰PNG  IHDR€@ øbLgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÎ&Î'ÿÿÿ¥ÔÁ‡R‡QpôJ0bKGD Lò pHYs × ×B(›xtIMEæ:Ûðî;IDATXÃíÌÁÀ0ÀU¨B¢…*Ä¡· ìí¿€Iø=¥¬RvI &§”·”[‚AÁÈÓ0.‰r%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:42+00:00¿DtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/IDR.png000066400000000000000000000005721520501070600173240ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÎ&Î$Ô.@ùâåÿÿÿÂv?0bKGD�hÙQ pHYs × ×B(›xtIMEæ:Ûðî.IDATHÇíË1 0 °P…Q(…ñÇ4 9+Ù¿:¥ÜR¦”WA6†¸fžp=‹‰´%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:38+00:00¦(tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/IEP.png000066400000000000000000000006141520501070600173200ustar00rootroot00000000000000‰PNG  IHDR€@ øbLgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE›H™EZ¾‰þÿþÿÿÿÿþþÿ¨Zÿwÿyž§G¨bKGD�hÙQ pHYs × ×B(›xtIMEæ:Ûðî4IDATXÃíÌ� °�%•b !ìž Û–c®bŸ[D �@ ÁïÁÓ08½õ­ç%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:47+00:00í+kØtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ILS.png000066400000000000000000000014741520501070600173370ustar00rootroot00000000000000‰PNG  IHDRX@©Î@ðgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÌPLTEÿÿÿàçöPÁ6·8¸ÃÐîñôûDmËœ²ã;¹âè÷.\Å5·|™ÛH¾ÍØñL¿Œ¥ßýýþìðúéîùêîùæëø[Ñ4¶ÕÞóúûþs’Ø&VÃ)XÄ)XÃ=º7¸E¼*YĽËìC¼:¹9¹9¸;¹9¸kŒÖF½•¬áµÅêV{И®â³Äê²Ãé×àô"RÁ��Üáç÷+ZÄs‘Ø‹¥ßM¿LsÍ'VÃÜäõêïù9eÈ“ªá©¼ç=ºtIMEæ:Ûðî3IDATXÃí—×nÃ0 EÕÒ™fœÕìÄQ†³÷Þóÿÿ©nÓ´oZë  óF?´HŠBhž—â„ ¡ÅÏ,†]7X�ÀJúðù0^ à‡ˆƒ¡Pá ›Ìf Ž�eQD½73âq#UåK$ß>H¥3Y3—3³™têóC2áQœ/K¶m—ŠeY©V+²üò^�\«³tM’N«Ýn9’š Gr½æ=îöú²†£ñx4´hÐïu¹ã5.“)Íæ ^Þ¢%/æ3šN¼{…XÉõ†¶»[°ÛÒf-W*¼bp³|¼GG7ǽ±8�ùr½× ŸOj¼01,¨Ÿ‡ºn°A•4¬ ÁÚæ7ªý¨Ñ„¦°ñ�{°ÀžXDo¦z3Õâ_Äz3}¨ÍTó?ÞiHDU·yý %tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:53+00:00ÕÎOUtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/INR.png000066400000000000000000000012251520501070600173320ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<~PLTEÿ™3ÿš4ÿÛ·ÿÿÿõõúÆÆå••Í{{Áüüþ´´ÜFF©))›??¦UU°ööû}}Â""˜wwÀ¿¿áääóëëö22Ÿ¨¨Öééõïï÷ÕÕëÜÜïççôÅÅ丸޾¾á¯¯Ú’’Ì��Ähh¹ii¹mm»SS¯‰«Ó¤ˆˆîbKGD Lò pHYs N NwŒ#tIMEæ:ÛðîÚIDATXÃíÕ ƒ @QZÅ AÄ7Dm{ÿ ö ´q’6™�¶� Ã0 Ã~¢pä €û#Ç4 �€„¥Y^y–²(y%d­T-EÅËë�„7ºíúaè»V7Ü{ Þ«´1£œ&9£+v5¦¢5ó²Z».³iEê{Ò¾@”Én\ìæÜf—±“Yt1@óº—ë¶Ǿ­²¯sz1j˜¬;ÎópvTÿ¾Eà‡ ~MÁü¨vðã:ÿp¾‹<€#OàÈ 8@@À«7ˆ {àLžf%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:37+00:00çîbÁtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/IQD.png000066400000000000000000000026671520501070600173320ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<sPLTEÎ'î­´£££Î&ÿÿÿóùöï÷óçòìôùöþÿÿ‚¾  Î·¾ÝÎÇâÔÞîæëõð»ÛË„Lƒ¾¡øûùÓèÞÎåÚÔèÞH tÉãÖ7—gW§íöñþþþòøõ·ÚȊ¦–È¯ÎæÚ�Ĩ €EÅáÓýþýqµ“*�]ÛìãÁßÐüýüæòì¹ÚʮշÚɃK”Ç®âðé¯Ö‡PªÓ¿˜É±$�XÌäØÑçÜ ‹U„¿¡ºÛÊ>šlX¨€õú÷àïç0“am³�üýýÝíå|»œÄàÒ €FÂßÑÔéÞÕé߇Qƒ¾ ¸ÚÉ:˜iN¢xùüúúýûe¯Š5•eåñë6–f‚I#ŒX·ÙȗɰˆQœÌ´Q¤{&ŽZ�½Ÿ9˜hg°‹¦Ñ¼‰R…NµØÇ/’`•È®ˆRôù÷Aœn'Ž[¼ž¹ÛÊ8—gi±�îöòõúøÛìä(�\Y©�áïèw¸—#ŒWe®‰”Ç­^«„¶ÙÈûýüñøôw¸˜ÆáÔ_¬†w8‚H‰S!‹VÜìä=šle®Š“Ç­ƒJ8—h)�\Óè݌ç…M¶ÙNjç}»œ{ºšx¹˜v¸—�èìõðØëáT¦}?›m)�\½ÜÍk²�ùüû\ªƒ†NœË´f¯‹±ÖİÖïÕ§Ѽ'ŽZf¯ŠƒJžÌµ�HD�q‰Á¥‡PN£xr¶”›Ë³‘ƬŸÍ¶|?}A D}B~C{?l²�˜É°}A D„KÀÞσI E†ND�pO£yµÙÇ´ØÆºÛËíõñÃàÒÜíä²×ňÁ¤s¶•[©‚ÖêàŠTýþþ«BtRNSþûûþÁö|RbKGDøoéÇ pHYsttÞfxtIMEæ:Ûðî÷IDATXÃc`¡1`µ`Ô‚Q F-µ`Ô‚Q ˆ²€æ€‘Æ€�•Æ€H ØØ1„88©h7†/++¿u,Æã—�¤ŠRÒ2 ZILN^AQIYE•¨©kh‚Z¼Am6]=}AC#Ê-061…0ÌÌ-�„-­¬m tmíì)µÀÁÑÉ™•ÕÅÕ�ÕÌÝá-O/o_?ÿ - :74,<"2Ên~tŒKlœ��~|¥A”˜ä $•“SRƒÒÒùa¢™RüYÙ9¹yY�_PXTìRRRZÆo[^�°À¾2”¿hA•T³ÖÔÖÕ74F¥'5©4·´¶µÃ,pVŒïèäï¢Ð‚îV…Þ¾þ '•Nž\”a6f·¹Í×ó#ž'C”�h =¿ÃORëO¹Œ³ˆ�性³ç¥£EÖ:~›/'¤DÅŒ­p“Çñ3ÆÙ¹È¼¶×âËÉ\ébŒf^&l66x=Y.JHšnÈ—“„NƒB—$UJ?èñ`úx±,X.tÜß§å5ɪŒ¼.èymL“T™]·¤"P>wÇ÷éùÝÅ TÐöZÜ›<$¯ G:øÒå^üˆA°Á´ˆ)uEÛkòtvˆñɽ7¯töØkï¢� Y]�” ý`c¹¨æUN²È c4ie§†~Ð[P�.‚Þ zè—,®õýîryžW)e]ѺKn^¦”ºbÃï,¹Y™ �^ŽÆ“kµÑô¼ö’‹‹9]¿½ä¢åµƘÅ5»Vw¼Ö’›3”�´½æ’›æ1Žth{Í%7Éc\éÐòÂ%7É#<åÑrÃ%7Î#|åÑtKnœG4”OÃm,ûo”Mi8¡,úÆÙ”¦Û p‚¸ ¡Òp|´1à`ö5¢„9©a­•Ôú9pÅåœu é(BO§ÈNgù]v»ËïçIçÒ@SULóê£#ÔÖ½Ÿÿü¬Ãú›èܬ�¦ªÈ?ÿ¸¯¼‚Žc†¿øƒ_ÿÙnSÞ¿�É2üýáœ�±{.Z¡£ˆÑ‡à^¹‚³·‡ð}²Ï?@ø>¦,Énߦ|ôˆÙoKÿ—¿<SêÊÿˆ1UÅèý÷Én߯ýutš¢¨k»ß&Ô5j0@§)þ믓ݾÍèý÷1UuÖá¿´VÞÀì�$úè#:7o’ß¹ƒ·¿ÿWYoŸüÎ:7o}ôÙþpÖá¿´VÞÀùï~‡ìõnÜ ¿sµ»ûWYµ»K~çÁ�È^�ùïÖá¿´VÚ@S×wïâ]¿Žð<êgÏ^h™D(…P äi3ëgÏž‡wý:ÅÝ»˜º>ëf¼”VÚÀ“ã Ùë�Rè8¦:8°]áyÏ× :8@Ç1(eïy¡ŒUÕJˆRx¯½fÔÛmd§CrëÂq¾oÿ� É­[ö�¾ÝFGÞk¯�RgÝŠ—Òj„o¿M=B]þô§Ì?ù„â‹/¬qA`ÿ|Ÿâ‹/˜ò áO~uM}tDøöÛgþKkå l¼õþ�¤Ÿ}FçæMPŠã÷ÞCÇ1" aˆŽcŽß{‡ÎÍ›¤Ÿ}†ÿÃÒxë­³ÿ¥µò ß§ÿÎ;èÑ÷Ú5~HrëÇヒ) LQpüî»$·n1øàÜk×УýwÞAøþY‡ÿòí?/[iz6[þh‰?þ˜á¯~Eýü9jg‡ÁÐþÙÏ–¦ÊVë¬CþÑÊgà²!­HI~çðßxÙj![-ü7ÞÀCþç?ƒ”çÆ<8G€1Ô“ z8×¥üê+Üý}(Kä`€êõìöÚ9Ñù2ðïPçf ý{•3þø_ ~ð¼«×–oàê4AG1ÎÎÎrºÑI‚žÅ8[Û§Ü|ŽžÏ-·�žÏÑI‚3œr³:Mq¶í+q�Ž#t–ãln.¹:Š0e�3ØZrõt e‰ê÷O¹éÔž0lnžr“1h�êmœr“1ì½'ÜhB ºÝSn4¥ìôzÂÛk�Î’«Ž‡׳÷.¸jx„ô|»®žpGGÈFÙnŸrG‡È �l6O¹ÃCd³ù�5yy- O¹çÏ‘�62l.Ë+îß#û¯ÿDÜþøÇ4Þ|syƒÉsLa_m«Áq0yZã}ÿûß匱§ß®‹É2¼ë×O¹,³G7UE=!�$×Å}õÕN ZcŠ=Ûz“áû¸×^`I€ISôtjË›Ïaˆû½ï}c€!fžØçB¥¨ãÕíâ\¾ü-NbâØþ¯:ŠPý>Îŋ߈Âq¨§S—RÔÓ)jk çÂ…S.ŽíÞìhdûMJôd‚³»‹ÚÚ:ìq„ð|êãcÛ�'Ü¥K§ƒÓ[^Pbª ¡Åýû¤Ÿ~Š#ÈV �$ÔÏŸ£vvìOívçÒ%ôd²•" 1IB=¢LU![-œ½=ôtjÍ�Í&f6£>>¶ 5¢×ùz=™`êEˆfÓ¾ÃE¨n“çÈ��åóš1ÇÈf“z2±×lB]#77íéû¢<3Ÿ[nÑq¢Ñ@¸¯¾ŠžLPeiëh6©‡CL]ÛýR)‘ÛÛ¸Ý.z<ÆT¦,‘Í&Õá¡}ƒÛq®‹³³c·ãâ•瘺¶Ü×_#\×rž‡sñ¢í×8F)-÷ô©�M*Ë]¾Œ\l8èÁÀÞßlR?y‚Xüº¾�så "l’Cö駨†÷o¾iBû}Dà\º„p]Xìæ;W¯"=Ïšxp€sá‚-ðâEû0l Âóp¯^µÇBP?~lËqû†¶CÂ÷Ê{JpÂííYîâEd³i;¸Ý¶×¥))>´å+µì@“$Öì½=»)-%å£Gx×®�”8. ;LÛ,¹tÉfÉ‚s_y¡jk Ùë¡§SœímÔ YW>z„·¿�pd¿�Úܤ�qvwmv.Ž«ƒ»·ê8È� Ë ‡8{{8;;v‚êÉÜý}„뢺]Ô`@=â^¹‚ÚÞ†ª²Iðô)îþ>Òó�í6j{›úè÷êUœ�ªƒò?ý ñ%uâz£a³*Ëì˜$±™$6Õë†ö„;I0Y†ð;$žQn¯(�]ùT¹gÄŽ>r@Nùü–/ar5ÜõV?åæ^…DÆQ£_Õ&$ÒRAîÉr/(7ur›"·ÝrIîŠÊ]þü!C† 2dÈòR¾\�4²ç<%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:40+00:00(ŒUVtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ITL.png000066400000000000000000000006061520501070600173340ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE’F‘EŸ\àòéÿÿÿùåçÔEOÎ)5Î+7§3(bKGD�hÙQ pHYs  šœtIMEæ:Ûðî.IDATHÇíËA°Ë ‹dQElïË`û/ic®²ÏmAAá×ðˆù(®Ôþ÷Ú%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:51+00:00BQ^|tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/JMD.png000066400000000000000000000021011520501070600173060ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÃPLTEþÑýÑÿÒÄÅ >¨,˜=œ9›:ÿÓ²Á9§-üÑÿÔ¶Â;§-ûÐüѵÁ:§-ýÐûÎÿÖÿÞúÎ:0¯�ÿØÿÝ8.²’ÿ×7.üЙ=6¦.³“úÐÿÚÿß*"«Œ-%­Žµ•:/ÿÕÿѳÁ3¦.7§-™<8§-;0<2²“ÿÙüЯÀ7§.ÁÄ;¨,ÿÿÿêLÞbbKGD@þÙ\Ø pHYs Ö Ö�oyœtIMEæ:ÛðîfIDAThÞ½ÙiWê0€áIµÜ EÑBE¬ ×Ü÷}ûÿÿêD/K’Î$3æð‘Ó÷iZÚpð3T²°˜¦µÚÁQ«¥éâB¢À:”NêK’„a~©žhG`Yeº±"EæW:SËà«ÍL¯­K†ùõ5�5Wg’yë7®|+‡v‘oH\ù�¼hCg³»%Kpç·º›(Ëí�]A‚'¿»³]–°×“$xó˲·gf@ŽP�73P–RL~ � àò?n6?à$àóS.%?à Ðòs€X5oÄèy+ ”’wBay'€JÍ{BxÞ Àbò !._ øOØ·ìù}\ð‡‡�˜< à½Iâ\laòHÀ˜p4Oè�>³ù#t pÏBØ­˜¸Z®|‹píß„ÁqnïçÇjžø"œœfVAž�žPót€9üÙ¹ p~öõ 1Àðà�‹AáºÅà¢C%PnÂQ¾ë¿ »TþgX™#`D怗–üüƒhD¸Äp�bÇÙ÷ÕÕõõ•êÇÌæeäÌgúæööFg1„ê×±'_¿KïïÓ‡z ¡jAâÏ�$1ˆË/É ›�%@|>Žùðäà À•%_>ŒœùðæéàÎS ÀŸ§@"O!€LO©<–=±<ŠÐ33ðhË79ò“„¦�ðhfàéùEèì„—ç'hÖü÷¦•ýBí¹m;þ¼—0û'‹wò1„©ñ f¡Í~öS³ˆ7ÇP:y{—Þ¼~sn^«äãó7¶ï??&·ïÿáØ~Hܽ%%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:59+00:00q¾IEND®B`‚qalculate-qt-5.11.0/data/flags/JOD.png000066400000000000000000000021371520501070600173210ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<kPLTE� G Ð&Å$� = Î&Ï&Ñ'Æ%� > Æ$š$•]c£œœ¥¨¨¥¥¥Ñ&Ô3á]kõ¼ÂÿúûÿÿÿÎ%Í#Ð.ÝXgð¸¾ýö÷Î&Ð-Ï(Î$àftÕ4FÍ "Í$Ö:KÚK[Ó(;òÀÆâp}Ó+>ÜTcÑ1Î%Ô.@òÁÇöÑÕýõöøßâ÷ÙÜ個Î'å�ŒùàãÕ5GÐ.ÜUdòÀÅÿþþÑ2ä}ˆùâåþùúñ½ÂÚIYÑ2ßesøÛÞ럨ÜVeÖ8JÎ(Í "Ñ"5ôÊÏç‹•ò¿ÅÌ Ô-?àgtßcpÏ)Ï*Ñ&Ô2á[jõºÁÿøúÆ&š54•ˆy£Ç²¥Ó½¥Ñ»¥ÐºÆ'�0->[6 w=~A{>v<|=z=Ð&Å'�1-=[6�*+GV5 u´�PQYU]#z=ôž—jëêL‰H€&H Ðܸ œõèr«ÏßF0¤ö@GgWwO¯D0úú‡†GFƒP—£eä�¾:6îw„‰É©ioÒÌ윾:¿°è¾lK�åQ\][W°NÁÆæÖöNhW†ÉnCyo_ñ�ò¤Ñ¡"IGA |âï�G1`þŸ½Ž‘?HõøäôÌã<=@PÏ/.¯®on½ÊÏrõîþáñé™ÁPý˜ù—W�ÉPüš±Ì»çÝÌó΀¼$oÊÛÀòd`žÍ[Ày3<@ÈÇPòQR>@ˇˆy€š×oïŸxyðõýƒ˜×´_BBPéYŽp%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:51:58+00:00×ɯtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/JPY.png000066400000000000000000000013001520501070600173360ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<cPLTEÿÿÿÿýþûîñöÛâñËÔïÂÍþûüôÕÜä—©Ô\yÉ3WÃCÀ:¿ 6ýùúíºÆÔ[xÃB¼-»)»*¼,òÏØ¿ 7þùú䚬ÄFüòôÛt�¾3»+×g‚¼.É[ÚibKGDˆH pHYsttÞfxtIMEæ:Ûðî IDATXÃí—YŽÃ ñ¾ÛÓÞâ%÷?eìägFJL¾¾>Þ^FÛSéá.U|¸çǨüÔìýî³jãwO2‡„†‘ðˆˆp (]|pŒd¢¢cb¹¸x�&>Ž‹�‰Žb"‘xˆ‘"A›˜¤ãHrJDDJ2átI‰ÚÊ¡¤U¥¦¥ó$#S23Ÿž–ªÒâ<�A*ë1!äÉSAxú„�³°~hÀ³ç„°/^ ÂË,!ÏŸ¡¯pÊΡaInž äåRƒÍÉF:‹É/(ä )*.))."„/,È'8O (•–•¿æ©¨Ôh*+áÞ”—•â<‘RUƈÕMµ‘WHG€¯©…ºzšú†ÆÆZŒú:¨­á%pMÍÐÒʶ­½½�%|k 47qJߪ¡£“F|÷þý;Êëìõ[\�€.€î±·¯¯—{ºº¤pýtß°ƒCCƒ,ÝSýR¦ˆÿ@�E|d˜� £ÃRYv€ì)’½È²oSÙh²²v79®e¿pd¿2e¿ô±_üô™üѶ|þ„|Áéë·á‘«ÆkdøÛW¤#|Gitl|bòªuœœÅyÂFúé™YýÜüïæw~N?;3­G¹â†…EÔ¸´|Ù¾//‰S†ÅƒtýÊê}ßë—@ÖЩµÕÔP€�Í-ãëŠÛ;>»»>;Û¢qQ[›Röö/ ñèøääøH¼ìïIПž™²!þ,”JAýÏ÷álŒÉ­ãžá�bç¸yXŽl•8G¤¨µ)&„Üê㓼»Czg ï¬>Á… d�Õ£%á%óˆšMåOYµa)ƒwj„³!¦|ɧx6 ñ—{0±Ä$ÿÜ®…µ.A­Ê5�û[dC£Vä¸'(^ñ©_±�b«Ž¡õ©�$w¶ÑóŠæU»¡FÏ){Â$"UUuai “è9‡ú_ìÅW‡äîjM†ÿÎ.Å Áy„48«2Ü“ˆf‰aBMðžD£Ä;)Â}ˀ⹀ÆÕ»)w¹ä�Õh_»¹<#¾~9“Sûà,²©+ K},œþÔ¡^Äë$Á9*AN”Ϙ�¤yÕЧjO\¼@±9ÄßÔCŽ•¨ÃrœÕÂ9U"�“%BaOœ5“£–夷·©hjzŸ™ÁÙ�Ø÷Þ’Ýß@ø¡]½_Tr`Æ€sdJíOöSît|sœæU»qß2`pÃ8�¿Þƒé(äL†¨Ùå›HRîtÑ»]Ì@"|�œ*PË3DKƒÓ· †Éƒë&qO‰pO]7E|ÓΚï­}’ï� çTåj²êÁr Â5˜žB­ÈhýÃô^‡øæQZŸ{ÓS6=_› w;$··IвwOhžÆä3�ȺÆ{kŸà¢Ô[o•Û\ ¢ô¿8�ÞãâŸ×Å9:aðoã¤w·ìß—`ý2 § Â÷Í#š%ÉwGAF¾²�òU—r›Gø{óàX×"½§EtÝ$Â3-àž¡& k7=¯ÈŸ¨‘|w„r—Kíg ~wL,HnAMç8벇Dÿé½-²˜H"§rô~Ñ.0‘Þ)þùœ£R„gX¸r%"ÔŒ\· ákŠ—}„4à™Y¥Gö“É-#èÙê„BçP/°í‹†ÆûíÎÚ ½Ï!½§EþL@íÒ9ÜÓ"ð åËé½-‚‹pŽJ­Ûî7Œ£Ö¤è9‡ò%çÈ”â%9Qà™PîðPk²ƒdøÞzŸ[F¾9Ä;3BMç¤?l’=Ü ØR¼ìað4Â3˜¼´ªK%”¯øÈ†ÆÛÔ£þá½èŽBïu0…¨ä›C{ÊN�@�™Uô®™AxgcLvoï­é} ¼S#L"Q«2ähIï“Ëi}a;jUn Ç�?RÇ;#²m•õ êð s¾BÏ:þ·Kr[›ò¯§«2v“‰%Å–€äÖºW/§ûñ›Cœ#RäX ŠŸˆÀ —gP@ôÕ ô¬ƒwFŸô¶6þtG⿳‹‰þ¹]²¨¢]}q3°}01ZPü܇„o0]Eþd�ìÑ:ù5²‡$·¶)·WTådP+3ÛºØ#%f Ñ}eÃÙTa åye‹æP“ý´Nr{›úûˆ¿5Šn׺ñ볇Áõc¤wÙ�k”ú‡f‰þe’ôŽ6þ9]D`Ðó¦el&:“¡÷8Ï6$"И¸Ït5` ÐEò�ÄÝMÔ)ÞÉë Ïä¶¶2�™wˆÿ}ï´ˆò%:q zΡù™�àÂÌ“?V§|ÕÃ=6!{ Ž~‡Á ã8ÇÆ˜DØ®³ŒMù…ÿ¬þ9=ô¼¢x! ù^›âÙðPïÐÁ�_ ™®Bw”­mrAñ\@z_“bsh/x r:Ç $ÉmmŠ-Þié�›x›z¤÷¶/�CN¶£\×Ô.›%{°Ž{JD¾9ÄY“bz’äæQÌœcÝÇ€´§µø…Oÿ ‡±pùjºW­ úòTe@AUN–9^¼w}Œ+‘c…tq ”».iÝ ïÔ=ë j¥­µxoïÙ ç„jEN¹ÝC­Í(¶Í`KœccpÀÌ)LWáoêÚ{î‘:é]-Š-ºt0I5žéjÀ`"E|ÓƒEÇ|YŽ».Á=i€^ÕÖ¸cÔê”üg!Îñ1ùÓ!îq±MÁOŠ�£å/a"4øoï‘ÜÑÆ;³Oöã&Áâÿ”ȱÂÖn4º«|cÝQ¸b¼Ó#ÔTNrgÛÞYH2ª 0‰@ð϶O·³.±Y›g0‰´YÜtAðîÅ–€bsH¹Ã%‚ :¸'Hoo“Þß@ïqõ¶ürõJ@ñLHþXh¼·÷.^°ízÇP<Øšk&§qõnº]I¹Û%ùö(&ÈfiOÖ¢ñ*°IIM#$ÿ5jm¨–¦ñ±Ý8­œ=\GÔ4�+÷Ðûü2®Xm»ÔÓ"¨†·¨jµH [°6>²ï̈ò¥€ä–Q²‡8‡§8‡g ju†sdJþTHþxÍš´€p aÝ÷yEù|@rÛÙ}MòçäDAó»ß·Úv—eS3øÚ$ÅÏj0‹ð éZ6 íT«[\#ì³.AÔ4Å3!¢® –ðóP@þD ïÌ9cC^±% ºn’ôžzA!ë1VØ©ÛT¢çm–'êïŒ>µ+öá�M¾;‚œ.P+2:Y…)m˜5E|ó(å¶ê¸P5X‹*ìŒz㣻Á3¤w´)÷8Ôÿl?îq1å.çèÄúƒ± ¢f�ß'kè=6Õ®AN8büM=¼Óû¶) ”Û<Ì‚BŽt?¹œàÂ䊜î_­¤|ÕEŽ’šj¤ì‹ª$,áÂKg)·ùd?iàÓºf'ˆo!¸°ƒsDŠÉm؆5ÝQ� p ²¥Í`lÆYnóPÓý/M¼g�ò%ŸÞ§—Qû£YÔÊŒèº)Šü 9Ô;ñZUëÑY”†øÛ£¤w¶pOÐüø.’»[t>²ç˜µ2cpØÝüí®õ K¡F-Ïm;deŽh•˜L@ų”‚ìþ&å6wcLÿ³ËpŽIpO‹è_;Íà›ÈÑ¢²_ª$,“ Û-ñÞÖ£ÿ÷‡}e’à’yÜãbºŸXލÛ^SrË(ÙC tWÙ9ÞuðM_’?ZGÏ9äττ¨™Œèë¸' Ðûúwáï,à¬OÈÿ§FöpÝ:"T%aŸìø?ÆIlœÛÅYŸÐùð*LjG§û×NÛñçŽ"ýQ!!½·‰‰%ÙCuô~‡b«O±%°`oo£ÏÈZ'²†ÿ®é]-¢/O¡VÛñë ïH…—&ìPfùª‹¬iÔáýÏ.£ÜáR»l?ñ7ÆÉjà�Õcð¯ˆ@SîtÉŸª�±sº«Ð»]òÍ!¢¦IÔ°÷ÜDAÿŸ¦ìÀÍú„üñéÝ­Êt„ßHÕ…µ(a3íø–kÄž0 Üî}mïm}Ê­>É­#¸ÇÇ$·µ1±°aïgvø¥ÜãXXŽA¿ê‘Ý×Ä=%¢|! ÿ¥)D]Û; *3óFª>,€\ØÑ2i0©$¾qܦ÷G& ¾9nûR�&ùï6²©)^ôÑ;=ô¬ƒé*ЧkÖ{¬— n·|¢ |1 2¬<¤E ,8håO‡¿ðÁ5äO×ÈŸªÙ^Ô å+&”/ú˜¾´½( åv�ô¾&r&Gït‰o³mUͬï�Toð7Õb¦VÒ»Z¶ý�cçÓ ë /‚Mîh#'r†ä;£àÛŽ²‰ªÑòøÿª’Eño¬EÃ~Ù¼vnBÙ/‹¿îõC¨á ƒ¿N¿ºñ‹},Ãkm¢Rüúס†ÖiÈ¡¼‘Þœ°Þ¤Z‚5DZ‚5DZ‚5DZ‚5DZ‚5DZ‚5DZ‚5DZ‚5DZ‚5Dú_m‘Íú·˜ÈW%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:10+00:00‹[à1tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/KHR.png000066400000000000000000000046611520501070600173350ustar00rootroot00000000000000‰PNG  IHDRd@ìßÒtgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsÃÃpMBtIMEæ£Ò¡T{IDATxÚíšKo$W€¿{ëÝw·»=vÜn{b�ƒ•‡ÅD(�!�IFh’� ",")Š”$$6°ñ�X±bÁ"bÍ.‘ˆ‹€"e„�é˜8ÖÐÝvwu»ŸUu/‹ÎtæeO¤(®TŸÔ’»ttúÖùêÜ{«ÊÂØþ­&%1ȸ�r=©�„‘ I©�„‘ I©�„‘ I©�„‘ I©�„‘ I©�„‘ I¦BÄ=†”k0k“NÜcH¹ñgûkéû�‘vH¸ã×�fà:4Þh‚¾ÃÏçŽÞe `(¼p†¾ý#qgË0ãÀCÑØ\Å|ùiˆÍ÷?¢VßEßÁ×Ù�;r`ô¶O1š‘Ðø÷­Ä=¨/HB…èO?‡#€ÖœGøð!1LƒÉ£ÛìåÜϱŠÜ>\$PˆÆ_[¢}ªÆQES(º›5æïߢ07G±Pd~û^ü�*udþÎú2�»—I¢”D @ß2™üä5Ô/~H7ç")ÚXJ‚�2ãQ)—) ˜¹,“õÆBš¿çÚ„?}ƒðgopàÚ‰Û“%JˆF±³yó͈�ûN¢"•¦°¶‚•ñèv»àä³Ì­.#µ:<ÿÖ u.y’�­•ÛtÓñ“(!p°½I¦2O¦P`øàcÄ-¯ânÖad› \×Åq]ýcÇ¢ç9·Ì?ú_½‡Üü<^©ÈàôW˜Ä}Ò7�!M+çbß¿‰çzx®ƒ»µA£œ»©GLÁ•³§ifL\Û&ŸÏ“Ïåp,›+žÉ'ߨfp‹3k38÷nâº.žëàÜ»I³�9tZŒãG”÷ 4šÿÎy ž?Kö©oRX¨�Íd ãbNBrïÿùi§»Û§By¥ŠVŠápˆišR"Î>ÄGSÎä°L­}ÛÀQŠ���ù|¥õz�ÅÅE´ø¯>¯¾B„!Wü6÷?v)†ã RJLÓ¤x×"þ�¢ÿôwhw!2�T„�t»]Ûf8"„Àq„g“{` ·PÀ²,4šAkoŽã†!aξ‹»Wp+eÐ ƒ ¹ÖcÏF�F„aHEd2‚ À²­DLW�!£ÓÃìôçKìµZT«U„ìììP,A) !@)¤˜–β,<Ï#›Í2 ÐZsòäIÇa<†!Bi´Ö˜Bbƒ~ß÷©V«(¥ØÝÝ¥4?�Ó"÷ý¸ $bQ8½>ݬÃúËÏ!…Baz• ÁÆÆAày¦ibš&–e±¼¼ÌÜÜRJlÛF�çy,,,�ÉdPJáº.†a`Y¶m³¾¾N”J%,ËÂ4Mjkkø¿y“…wÞC$`Ó™€‰&Ü÷¹p¡Ž%%–e!å´8õz�ápˆÖzvl00�é÷ûxž‡eY†A†4›M\×e0 „@)…ÖšápH½^Ç4MlÛ&Š"‚ àBýj¿ƒLÈÖ7B®"„@k}Ó1)åìsõ»Ã0×¼¹1Ö0¦»©«2ËŸ$!$BÑ‹ìþÁhŒeY!h4xžÇ`0À0ŒY‡ôû}šÍ&ÃáÃ0p¥AE®ërppp]‡ôz=lÛf4!¥$Š"Z­¶ç1ŽB&FÜ¥ˆWˆ†¶Iû{OQ|ê åê _¾<›n„œ8q¥Ùlöº) ¦ {«Õ"Š"”R(¥fëC&“!›Í ”š­7—?ͯ”Â4MªËËì¿òÍâ<¥ß¿…7 c�¼b¢ˆèœy�ü�_c©\BGŠñ‰SYB�Íf) ×M5ù|~–eEZk*•ÊMÓ’a”J%0M¥ù|žB>OñëÑßÚ¤óIç�EÄØ)± Ñh:ÕEä‹ç(,-B�40 ƒ(ŠBÌvTGž€ùÙ)\ÝMÝ(ä°økó–¼xŽÎG—)~ÒŒí¾$6!!Æk/qêõW@M� !èõzt»]2™ ¥RéÐ !ð}Ÿáp@6›¥X,Þ6þê”wcþâë¯p©åýòט}!|YÄ"D¡é<þ0Æé-šÍ¨iAÌdôz=�Æ‘¹z½Þìª÷}ö ñ¨ø«»¯^¯G³ÑølÍ�‚èô�Çfþ�÷�1tI,B"B²Ï?Éæ‹Ï¢Ãpv\AEìíí0??ÏêêꑞL&ôz=*• µZíÈ ‚ß÷gùk7ä_];ÉG—v‰ÞyC—»��î ö=kìîìÀ Åët:×ý½»»{d>ß÷g»¯v»�mÛGÆw:�Ù½Ç-ó ApÏýsg(½ýŒcî’c¢Ð̽ü Ïž¿i{)€q²··‡–‚b±DµV;t*€ÁdL·;í�R¥ò¹â}ßG A±R¾e|ue…ún õö»ÿÿB$ÿÍ?ðᇗà¦wß‚v§Ã$ AB)‰Š%8¢Äûí}B4Ji¦É¤P¼M|›P+”žÆ·Š’Ñûÿ Ã".sêØïƒ4êˆ.7Eßæ¾”x�Œåa£ù±]<öM9±ºõ«d<æLÒIfRÞ¤L‰ÿYÊu¤BF*$a¤BF*$a¤BF*$a¤BF*$a¤BF*$a¤BF*$aü«gTß+� ?%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:49:57+00:00óØôrtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/KMF.png000066400000000000000000000061351520501070600173240ustar00rootroot00000000000000‰PNG  IHDRk@Ô‰ùgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs!8!8E–1`tIMEæ£Ò¡T 'IDATxÚíœ[pTåÀß9{O6Knä ˜p¿&´"ˆ—"Ê(RqÀ�ñ¡/>ÔkûÐgÔ¶êØqÆéƒ/NGÛZ§ÖÑZëŠ"ÈÝ$�\—$°Éæ¾›½œïëÃîÃî’@6†ó{Üó�“³ßþ¿ïþßÙˆgßZ¬~^âg‰;ŒÉÄF×ÖL{þP· ¿!˜æ0pYTºïÉ$š¼!�·.dðÛSvzí¥‘î[3¹ ¢qÀÉ> ltóû7'{-é¾7“«M@P v¶Ûù®ÇÊÆ©¦ÆëÝÔõZÓ}¿·4Ã.Lš€�ìê°SÝkåá© /7dòb½›¦o7TŸkÂJðe‡�š^+ÅÔ8ÕTã¸r]™u5q5¾sÑÅsß{øì²©ÆñdTÁ‚+j<Óoá•F7/Ô»©í1Õ8ŒY›BQ°;¦Æ ùl*Pà0Õ8VŒyOIÐÖø[‹‹]6ž( °67ˆS— Ì¨�†qiÆ—¬ú~ ¯6ºÙã³±µ$Ìâœ)ÍJ¦û{ÿ(¹á`)¥PÈX²Ä3F „@Ñ¥0®Æ=>;µý.6Ì]ͦŠ-zJ¢ç˜™v]ˆ»ÿ´lÄ3¦PH)Ñ5�)Îl ³ŠÈwà¶»±êVáç:ÏÒè­'d„®:7JyÞl¶TmcÝœûqZéþþ?*FœYR8­T”Tr÷¬{XT\A�»� › !4Îu6³·þK.t�Oz~\� ÞS¼¶ó%öÖïbëòí,)®D³Ö Ãf–R MhT–V±eÙ“,›vŽdD{Ÿ—«ßçóºOhé¾€Ýꤢ¸’#ç!•TâÕÒ Ç•Ãú…y¬r EYÅéž‹ Ï53K)‰Ë–ÉãU[ÙRµ�,‡gÈñ£çóæ×oP×Z‹®é”åÍbfÞ,6.Þ„Z{ZhënA%©ÝuM§+ÐÅ?¿Í·g¿‰©ñ\6WºçdÂ¢ÏøiñóÉ(¥ÈrNáé5ÏðDÕ“8¬Î!Çw�ÞÁ«;_¢©£MÓB°¸¤‚_®|šù… )ö”PÛòÞ¾Ë)ÿ¸Ñ‚ÄçïàÛ³û©÷ž"?s*îBS�IH,…ÂisòôêgظxSÂÄíkØÃkÿûýí蚀DÒÖÓJeI6ÝÆ¡æoùäÄG#št!JIš}MìoúšN¥ÙÓq;²Ò=?ФÁ¯ÚÆÖåÛ&»±½ž—w¾@[OëÐõHA–ÃCW “¿~›°ârß% iŒøf4¡1 ¶µšÃçbÕ­LËžŽU·¥{ž& Á’J²°x ¿ºçÙ„õ# òç=¯sôÜ¡ÁŒŠ#„  rÎw–Þ`ºš‘òú~ãjìôû8ؼŸ3—¿'/3ŸÂ,S� †Íbçg•O�ãÊI|¨ùû¾BÓ’Wx …‹fÁ�FÒÂb¤hBÃ�û÷r¢­–õóâ±¥OPâ)M÷œ¥�!³.•ÁÜ©óøIÙÊ„�a#ħ'>Æò#Rì�ÒÀiu²ª|Mìz£o+éšNO ›÷Žþ�ç>|†�ªÿE¨?Ýó–®Ê,ÁвU¸íî„�;³Ô´OùÜdÑ,,(\ļÂ<0V‹•ÆöšÚF•aS#‚³�¼þå+ìmØÍ¶åÛ©,]–ò~&#ƒßT¡pÙ2XR²4éÀºÖZº])× C8m.«ØÂ‚ÂE<¼èÑÁëŽÙÍÆÔ¸¿ñk~÷ñ¯yc÷k\LÑ1™Œ f–RŠWÅž’¤ë½§1¤‘PXÄ‘JRÛòõígèõóý¥:¼gÆ¥(Ð5�ž�þyì]6àñ¥[¹Þz2ì™éžÏqeH°²]9d&Q`DF¸ÔÛ6ìÅìï{—æŽ&Êófa·Ú EBÞw#ÄÕØìkTãÖåÛ©š¶|ÒªqÈšå²¹°ê‰¨ˆÁ?Ì¢.ô tS}ñ8Áñ GoJ©­ ©$šöQwéÌ�me�’£»Q“l fvŠu¬º5a‹d¼£«ï›ïPêC²#vÔ${,,ÈO؈$t ,º—-cØ‹ÒÀãô°fÖ:þ[÷1†4Æ]IJ€nÀ¼Æë¾ 1û¬�n´œ„/~ +Þ5è ö&t.,š…wáµ/¤Y¸}Æ�T–Vq÷̵d:²¨i9ÎÉÖcZƉgMA»dÍÁËk"¸ ©�Òâï\M.†Ëç÷ÑÒ}‘©î‚„�³ò礬!Z„ô{YY¾šÛrË©š¶œ=õ»�È”Ñ7ŠÔ ︽:ÌêCa :$*öùdæJ°øCýT_&½A©A¦_±òH˜Ç¾² ÁÀ5É•—Œ„¯Šyÿø{øü¾„Á·Ï¸“•3×\sëC×t2왣®¥M¢Óžz?À¦Aò})˜t%ùHI˜QMhÔµÖðÞ‘¿&d†ÝbgûO1#·,iÖH%ñ8ˆÉ×ws®k‹D ûƒ�~>;ªµ†T?ù¹r¢D»XrÒʪCaòºœôÛ¡Ï~=Ýä†÷³¢;µú0ê’ ¬¨�ŽkhpæÒ´JÝòÏK7Ê8ýë³h¦©H)ªo-j`)(¾LÓu£a‚%Af¡üw"ý«ÀÈ%Gù°´þññôrxðBKÿýýôxð@Jýéêþîïð@Iù·»ôyñMVôz�ö‹‘ñT\ýêëýëëðCLòV^ûÍÏõ}„í"-î#-î&1õƒ‰ø­±ï;Dõ~„õ…í!ð>Hò`gñIQö�“ï2<ûÇÉüÓÕ÷œ¡þòóù®²ýæèï4>÷› þõõúÀÃñPYí",þõöþíîý>ÑbKGD#*bl: pHYs a aüÌJ%tIMEæ£Ò¡T‹IDAThÞc`£`Œ‚�Œ ˜000```ÀÀ:À€�m€Á�q;'''û9€�“�‹›‡—�_@�“ƒþ`ç—�”’–‘•£r0v‡¼‚¢’²²²Šª�T×ÐÔ⤫8´ut•A@O_L+ðQ3 9€ÃÐb­²1«‰)„efNEp‡…Ô~K+km (ÛÆ–zI¿Øíì¡v*;8r89Ã8.®Ts~p¸¹Ãìôðdcõò†ñ||© xÀá teoV6¹×4�ZY¯8Y`*Ý3Î £Ràs»P¸QD$DE ‚$ áEÆÄÄÆQ)ð9 >!1)9%äSÀ"ži`ž`z† �™¥®œ�ƒYôrjçæ)ç{ÒÞœšÀÈ+(DÍrììEÅ@ñ’Ò2Ú; ”Ü**«�C›Ã·º$\ËE�THØÊÊuõ)ÿ74BŠº8@šçšša±ÀÑ¢£GdfµBmkƒEG{Tˆ‰0Þµb™X<ÊwCPM‡lÈn— ±,\Ä㹂³+½tpg5Ķ> eœÁýØÙ�‰`"X(ŠE1¬2š4™ƒ�}ÊTåŽi¥lÓcèXA«ãÈœ3gÙ€ªÄÙs8YçÒ±:†6HæÍ_`m¨-äà—¤cƒÜ$³Yd" ¯†›/‰¤c“ Ô(]ºlù eP_¹ŠŽ�R  V¯Y«ŒÖ­§g³è‚ �Ž 444â©h?)]³¼�›¤kÆëœN¨Î)Ä Ú=§%x ø Õ€Ó ø@å€Õø`õ(£` 4-õQ§Ã-%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:12+00:00óš&tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/KRW.png000066400000000000000000000075161520501070600173560ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæ£Ò¡T óIDATxÚí\}PSçšÿ�œœ$|,†XK)`�\Š_]º·‚ #³îÞ*L{½@-¬u®w{˨\p–Y6TZá*ãt­½kGGp´—Ù±º¢ìU:2W,\¥†Z·ZX‚i‚‘¯$ |˜ä„äÙ?„ŒpkÀ�Úå7sòGæ=ïóñ{Ÿç}Ïyßç0DD˜ƒ× ð¶ÿß1G€—1G€—1G€—áQìv»·í›õ6xŒ“É„’’œO‰ñöíÛG‰„D"UVVzLŽG" ½½eeeàyb±qqqP*•¨®®†ÕjõÜhš&¬V+ª««¡T*±X žçQVV†öövÏu7£f³™6oÞL) êêꢤ¤$’H$”——GCCC½®`hhˆòòòH"‘PRRuuu‘B¡pرyóf2›Ín—ëv*++I,JLL¤ÎÎNÚ¹s§Ã�ììlêíí¥¦¦&²X,3â\g°X,ÔÔÔD½½½”��íÐsçÎ�ÔÙÙI‰‰‰€Äb±GR‘[ P©T$—Ë I¥Rª««£úúz’Éd€¢££I¥RQyy9Éd2ÊÉÉ!�N7cΞ�NG999$“ɨ¼¼œT*EGG’ÉdT__Ouuu$•Jú·µµ¹U·ð´Ô“œœL“YKK EFF ¦æææwüš››)88˜Pdd$µ´´8(99y\*Z¹r%µ¶¶ºU·ðC©§¸¸ØAȦM›È`0Pff& †a¨´´tÆ�>¥¥¥Ä0  ÌÌL2 ´iÓ¦q©H§ÓÑáÇI§ÓÑ… èüùón“連z***ˆã8@)))d0¼æø1 JII!ÄqUTTŒKE���TWWGDD{öì¡€€Š‰‰!•JåùÓ&ÀÕÔÓÐÐà²L›ÉL¼¡�,ºn²èº‰×÷‘Íäú ¥¡¡a\*ºyó&;vÌ‘Š’’’¨³³“ ݾ*š63’zìv2©ïQï‰/H½£ŒZ×ÿ–¾ýù¯èúâTº¾x=}ûw¿¢Öõï’zGõžø‚Lê{Dvû3‰(--uèüᇒÅb™‘UCäú†L{{;Þxã ´··C*•¢ªª ,Ë"==}}}ˆŽŽFMM ±mÛ6X­V¤¤¤àÔ©S˜?þTR0tý¡?~ý¾ ‹®Ä�>È1 ÆÑlô`DÄ/<éÚD„üÓð��ƒ£¡ ¼÷Þ{ˆ‰‰ÁÖ­[ÁqŒF#Þ|óMܹs2™ §OŸ†ÍfCFF|ø�îÝ»G …‚âããé»ï¾sº*‹ðááa—#Àe4 ­X±‚PBB‚[SÏàõVjùÇßP“ß2jò]6uÇÿ˨ÉoµüÃü¦eJ²?ûì3O]Sgg'%$$Z±bi4— ˜V R«Õ8xð Ö­[ÈÌÌœvêøË5¨óöà‘ê.–u=´ŸŒr› >òH¼t ɯ:m«×ë±qãFÔ×׃ã80 Ž¥\½¡AOwXwLh °4þ`¹,ºn *oxÛ|½­ÀWßÝC¿]š¦ÿY" ±BhEþЈýð€�%ÂsV¢,ƒXh5A‚�oÅPóMo\ïUû½J€ÙlE›F‹È<#€Ð…éˆÀ3ÔÿMÎJà’`ˆå@£Ž’!#&¬ìAz¿ ­& ¦[ØÍ$žK1“Á« ?²@ß7„nŸyèä|Á9œ30XG‚¢pN^À:^Êa4íŒ0 :9?—- Ÿ@ükw+b,°1 ¬z#lÃ�¼J€Wç3?“™‡�óÁÅ€…ŽQ;Œ�üŠ hœ ÏžpþD<~•Óâˆ�¼Œ^¡°?²€ÌÞ=4æõIÀ’†á[ß@°SHCc4�“¾€sÒ¦.‡7|ñ'iØh|x¿4«ˆÅBøHD¡/x7|!À¬\ðØñ,,ŒU�á¨І•yV\ Xˆ¡¬�ŒØ}Oµ®À«s€Ÿ�!�~c;*¸#@ñóˑޯŚÁ„Œ˜ÀÑãYÁƒ,•$g¥aø‹ˆ ÎB'ç •8±Á2§ï„f^%ÀGÂágÁ¨ÿú®Ã9=œ†ÈQø"¢,ƒxÎjK„¬±´"˜X¡“|?9F´"?øÄDzufÁs@Â’qø¿¿†}ÂꥋóE—hÂè¤Ñ7¼=–øÀïçK½m¾÷'áÄeá_Ø':uÔÑO^îš4ÉŽ€Ð`¬Xæmó=G€ÅbA[[l6›Óv‘/ÌǺD¹[FõTÁØlXºj9¸ðP§íl6ÚÚÚ`±X<¦‹GÐjµÈËËCjj*._¾ìÜ ƒ_§ÅcÁ|ÿ™!�aóý±:}5 pnþåË—‘ššŠ¼¼d~‘ 'nÝ3bxØòlDØ °Èü‘Ÿ™€ß±Q!“Þ600€ÐÐPˆÅb˜L&|òÉ'hhhÀÞ½{a³Ù�œœŒ�>úŸ~ú)Nœ8ñ˜Ü5kðÖ[o�ã8—ðèáܘ˜\¸puuuغuë3Î%"\kéÀÏ]CíÕÛÐö À>bûa2FÍY„/ÀºD9~��ø¸0—ç …B˜L&¼þúë¸uëÖì;œ;†§åÉd2***¢¾¾>žÖñt»ÍNê=¯¹F¹eÕô÷ï•Ó’Œ�饴½ôRÚ^Zœ±ŸR~[N[˪é?k®ÑÝ=Ù§q<ýƒ> ""£ÑHEEE$“Éz= M'w;{>-g4 M&v;{>&‘»¦¦Ñ¼¥Ðºäâãÿÿÿàààáää2Ø—žï¬³î«²L® Î' ‚ È%Ð&Î&Ï&!D ©Ñ&õ¤ ;bKGD|Ѩ pHYs × ×B(›xtIMEæ£Ò¡TIDAThÞíÐGÂ0DQ"çœ3˜xÿóáPv9HòJÝ 4˜÷[ˆJµÆCÞN{?¯zÞsý ·Ä¾°€ªÕÖœœâQ—¦ÍtíÚÏr,h葵lrÁ¦9ém¼®Öúõ‹ú·_öÁáøQÅï.A>_Èĉ±[ÖFgÿCŸ2P%`9öÈÉšô¹ëR§|ád„Ñ-ꃒËYµ·÷À7'->xþ™Eý Š}áYªÖXs²‹GO¹š†õË&åoš›žÑ¯õ»á è�\Ðú÷º·øÝ%Èë ™˜»ù›èì Z€¾àdMÆ3™ ã–ggåFˆ¹…Ñ Ø R+×µ§ï ·2¬š·°ßñ-±/, �5'»xÌ#£ÔLCB�ˆõË&lšs©Qb|½Žs-ƒÓaYúÏ_„þJ­Ïxf]â¸�³ÖFÚ5pK£,"B6H'šµrOVæþôÉ_™¿¨ß‚�KþY¶"Óš“ãÈÝa;’ä>x¤hxú‰X×íYºþ}?[“×½kXŠY¨{÷Ó²/² q(5!ÆÑw‡.˜ÐzJ¢@1Úy ìíOvnÛX^Œª S¢WMU§jóc„È2E(¥!cBÒÖ¤ÏþæÚ_ `,ËÄÞäÕ(™Ç¦yèîX߉3 _fJ 6âñ€qìpË”1§�e™œxœqe&·-S; ä=ûÎþýêrsf#V)Íé÷†*J@)0 Bðí–“«¾;âñŠf£*0�«WŽ1òû¥ÜÝ%‚(jÆHöI JH¯ ~ ,’¼X *3ˆ´)¨m9¥Àwâô©�ã±ú||÷ýÔ=»Ñ‹ël«á‚û½c³yÇ´ÍB�?95º}¸1síñ7^: ‡ÆêDVlÝ[¶3¯Ôï!¬$¹Í@c�y×sßïJ%!tj\ž‚µo~!—Ŧco~!�0™\$«ù9WŠü›‹¤”r,npðT ”"Ú‘`‹Æ«Õ½2{XRTѨ¤”¤.¥Ð¸¡cøsŸSFöú×Îh‹Úñþêò‚ƒgƒJn‹½€ëcÚdê—`c¤à®¼,ˆ”�6´×,¥MXyÈxR!h-#â—½5&¹Ñj0qæóÎsXn ÓÖ+ñ›C¢C㦲B±¨¼î'ÛË‹wÊrÛØ=«TmÉ¥r•A@JE:K ÁHyål‘ „ˆ(Eºv2†[êmåÛ°X^[íb‘ØÄH¼ŸG¬¾©b“ƃi‘ÝÎɼ„”¸MlûÇe2m= Ð61(F û7/wjÏ:ê�ó¾FnÒI:5ãå�Úä¶�âÔJ•ÆÏõòú›Ô¥Ï+´IþU˜ÿ? B û¤Ž#G$D­û®¾É®c\v»àóQ»“!ZŽ„›--s8¬J¨JˆÓ³L›).ÛVÜ•rõüÚx „j­aŒˆG>,&>¹î€k{¡¦{Œ=£¶®ËÇ_ïq±Áˆò’RßÙÄ uv‹ëÛ­÷ôÔy‡«N€A…Ø62A„çÛ—ï„ýBÛ:aB)Áô´5n€L:Êü_îÍ��§~°õƒÄˆâ³Ù„Ã…ì?>vpæØ„A«­nžw0m² äØŸ=÷]»Èsu4I(Öª½ù…s_EJEs@ýBÇåoiã‰Ç —E¨€6?‡RŠ0 Üp�ahß…[í.±-7ÇåÉ„±=â{Jy'r7çÿ ì#Ö¡Ñ&3ø�Ñ0T”� ¡Ö>cz=Ùmêú þ�»Š�²õ‘(kHJhå#~å"¢¨(\ú!šÄø@"Ö†–(±?õàoJ«™­?Ø�Ò¿ë¤hï�îa—+d° !‚ÕÀúH_Àz½èôœoòŸsƒ·IJÌfÌY{Í/~-E8y­Š›ú`Ÿ‰£{R Ë€âXpîØcÏÚ@|~Ñî@:m—§§0Cñx¯„ñøšé ´´SQj\û�cÓ6ÀZ l~|’ºW·ïÿ·ä«Õ{ݼd1k~»舵A¬SöÕ¹­Œq„V*q0&�Ì6Pa޵JÂ@Sç±%_½7¢ºøg.Ô þÞA…ë" +ûªL¸¹çäAÍ ?ïOƒSvä:ãîÞ“W·d…ãÇ~¯#C§éia/ÌÚíPžú:ïÉG’èµ|#E.ãtI"X¡zä!6ØR·ø3göwÄÆUÙ–Œûï�û§ çï{sÉÖõköƒO³æ7‹q-ßTJ€cÕdÏœÎoñl->cQFo}á-�‘FÌzÓãþ2}ÌØ¤A£·.ú¼&{atgÎl‘$F mut�Y³æÒ�2XÇš5@´ÊÉ3“�î}~ÛªÇïÔS F víÎ+M²hÔkN6Uªº¾°(©æ`ý[›ºª4eô²ï¶�B®¡�‹ßo?�:zÙäùëóOT³,ÆÚî·#«ûÞÜ ´tâñÔ~üé™”‡z­üxËŸSNœyç‘…£@Å‚Lš§×üaLšÖX4„€J„@°¼8uHÇ»ïé¾ê¥O;ûRlyæí§Êö4>y8MEp¿aƒ{œ_v–dÔ*sD*‘Vw 1§J ¥#™Éî%&>ÐgÍâ´g¦ ÖI¢„ ¹wçU>÷—ê7Þs=Œõæ.s§Ç¬ú°4iøüwÏ�·¦ðÐ9`ð]‰‘iczù«jm«³Ë6/”J’eZ†²CÄÆ§�Ÿ®;qªöóÌC'J¬±Q–va�DIÕ©ƒ%c¼.e uùù“Eu?ÿ\÷ÅwíyûÔùã&L¿×ÆK…e²ÃGU,FH’ i]u! ¢l 6ü×”˜{c¹áñÆÔh¥µ¬(DɶêBX!ZË4Õ”÷ï`iTØì¾š²Êâ¢ó§í“úÇ%w7¥tU¦Œ,(óò^?ú½6Ôo Ž@Éî571-ñ•Ù© =#à’†”{w^ÝÒŽÜ‚ׯYÚÅÌžüìÌBjš³dÛúuûÀ'!³Va`ü�nù÷Ê„�”f� ÊÙYùÙ› 'Ž�¿tDýÐ$ýФfWòÞGåÿÌŠšžžùìÌWç�xû£m™k÷I¼„ÌãÖ4ÅBÔ/…D;·Ë´nÓ™à`äµ>Ïa^àã¹û{y¾Ú®­ž¥=z©å‘š=o”=]£›ÎòçB‚ÔBS“÷щ_GörÔÚ§j±*° 5yAÅ¥¥'¾4+%±g»« ÿ§#wûèçÌ^0ã5Ï]²-sí>¡QI2‘¯6ÐÿN(È2¡”²f�LHNv~NnaÚ¸øKG×%'é’“šG/yÿ£ò/²¢žH_·`ÆËóGüõ" `Ò Ô +Œ@” õÊg½ŠªYS™ÇôZ§âÓY«ŠÊí4öõþ²Þ`a)UÉœZ]Ô—ÕÇk@îLog�µze‰@¨5µ( 2yhBBAîܬå“{¶kw畦Ï,=Åš�EUª˜çç÷+ÜR³àùÉK÷øfæ—»‘ZÁé(…«¡$J�5kÇdgå÷÷qúÜu'jš»ÿº¡IÑYŸÇnþ&$-ñ|É{ŽÕî£÷Ö-¸ëØþ×2OQ¢r <Þb �Œ!ˆ¡º}MƒÐTGQw{©¸Úxø88ª¼R… )–êëø³?7iBXÁ#³"M}±cI ¶‹"Çb€Öza6Ãì„˵޵;¯þJ­¿Òà0ZU[µÅ/ 0kdB/¥qñ¯ÌJižÕ£tÑ þj”žê™éCFLüÄï—Z\C �MΣ] nE»óû=Ú¦ðHcYÏöÁG«L­>qÀ]¯D²Ÿ­¬÷mŸ]ÒçV)?iƒ¬†MèÙN’d†eÐ×}´Â‘»]ôÙ› Náµ Žô{i*Ð_'‡š/^ $'+?gcaÚ}—¥¡Iº¡IÎ]ûÊqæý%ç¿Ì x¢N¥ôób‹� @1ÂfÄ`ƒi©ã»}¶ ‘Æ¡Ñç]2©vä«~²—ßËUŸñõ‰Ð'� gyÙá' ùÖp–kÂø²U¶Œ`YÆ·{_íŸ9·î"^—"¼]§¹Ó‚Ì,¤¦Ë ¿­ÇÇb–R „ˆPذ�®‡†ì¬üì�…Çýê¢À�2Ð�2�ßw¨vé Ϧ­UË¿�ºLV´¥{aäóØ<öBéLC‚BgÊ—8˜Þ_j½öÎ8!†ë�tâå3 '+Ag<¥èüŠET¡¶�x½µöd*[³ëPý²/šr·¥ŒÞ¤½|Ø¢'«Â£æ,Ù~CÐ�öû% Ðàà›°#å…z=ÂÓ à÷Kð{Në²ÝÐ좟N‰‰²ˆ~!Äô¿Ë´²·ågëG«h)iyY câõjr~w£`E'„àÍÁ�z�1(«ëË÷çG‡õ^ß§SSÍ÷D5}»Õióm[b� aó2¼ñ±$Ó~yiëÆÀÐn•$Æh@(†)±VÔƒG‹–½¡P�‚‚Ã:�’Jñx.7 kµˆeÝ^¿ Þ@M4"S‡´Ê ³–ê©2„£�‚Ýê -rÂ#ÂK�¢L?¬x ¾kWçÑ’ªyÿ­4;~ð*AêßYZûÆ2D ýëó‚_†øÏU5¼ð–×í�\úš:¶óÉ’Ò1�åTT9°‚%-C�: ²|A-Ëë«VÞ°›E ˆ²Íæ„€Q]^Cà€ú�A7T9¸¸´’LmžË˜³{aàZWÆ|<úÄèw®AÀTižvÜ@ �ï@ÕYè�õÍ…‚£�ܪdŠ( ¼á€‹Ë@ )E1a@@}&Š„ZzŒ70Ä`„/ù°LkRP„äN‘ÆjÞ¿z¯}Tß0•‚­*ßõí�Ÿ­Êë²-¿lX¯öšv!ʰQ„—¾:�›ï¨;³8H§1šcš\þiî;s¶²î¼»®Þ�8¦Å,°Wþ’B+{Üÿ6ÚùÏ=¹Odjp 9‡ê¬çGô‰«­ÍÜ{jÃÜUP ¶êEiƒ€¢ÿµoåϵñx‡¼õp¥º¹àôžµˆ@­>öæÇ·¶P„Ifn@Gw_óßWn®r /‹]‚–މ¥gèàçì„”øCcãvVº Ì!ÔئSì×=‚tAHûÀ¡¼Ö0pû6å)PàpM#?ipøÌŒGÏù¦w �´z}ÎA­ Ϧ½xÀvŸË%{Üò�Ʊó&¼¬Q‚³Á_ïå»Gt¨–f<‘þØÄ¤ÐZ›Ø–÷‚àvÞ!ŠhC¥S–™#£þ4rÚÒÕ?Ÿú%$ÒÒ9È4<ùѽI°ýP ¿+FÍÁ?6i«·ÛG'›õÈ4 ðuN…½Ê:ŒPË;B·é`YLx?£ÑN{´¯×Vûé¦c P%ù%sÑÛÿóèg‡­êÜ÷jîKl¸¯o�šƒò³}në»Ó>]»èo¬¼ùüÇBÑY?mZVk ïœo� ˆyíf£ñG F@\¼:,üõ‡#&lý¬ñè‰{;Î:¶WOSýžªÞû‹c‚\=B‘q\ß ¥ä£ö…’}c‘Õr¦Á0¸[ð ˆc§�Á»7n=ÿ…±O¯�|ú/_Ÿçëë°AMn¼MÌ€%õfò B T‚”A]¿Ö®]Ö¦ŸNDiÙ NÎñ'ürFq¾¦€OlW[ﬧÞÏm;UUÉø¼VWS„N:ÛÀTžoÜwVW\ÏN±æNö5xOV)Eþü@u½®¬¢a ”¢É�oBTY£��: Ãš×ItÔIw�W½«Ò)È!³:ŸÂ]dÐõìbx6­ß’½-LîÚk«Ü`ó ÿ¾×{멹KT“�÷Ë8&Ü5wÈYnkŒéÞõÿ°xýÉ Syµ—Óke�7�K]×Änè>BLŽ78|Ä�>pË·Ç]©qºº7 |Á– ïÆ�*1+#žèÖÉÒü«åkf=³ü+´|îÔ9S?o¾~ºÌæ¯YÑ=ºéû—ŠÙš†¡Ÿ ÞtÌÑ=ˆÛth”¾ö\°ÏßàrÖÛ¯óßn‹(!DýbD§Ð^'·¨¶m.üû›§gË/n?êýÞ0›[T˜Œ¡Fk]Ã1è4 QRpìÁÒ“��@(.8w ü¢¤äXàŽ…›æ�˜ÙÝE™œ®ódž‚ÇÓ+*<¨ÿßõ¥ �è4ÆYY�ìõ„F·‹ �̤ö6uÙö“MÏ£¤{#™òêÒjG(ö‹ïéêØ•?*Lꦗ¿>1oÅ[ÍÎX‹ã¿¦¯3hJMåþóê¦.¯?|ælÓ¸rƒ-,ˆSŠåJɯ3p[ B‘,wӜϢv,7iÕIây¸¾ºËm±(¬`øzG±:2!(åþú„…Áèl…£Ô&·ïfjlr�«mÿÙêÂ=‡K‡§†!¿ë“­^�nÜ;;¶" Æz<ÕjEU(èg¿yúøqoB×>áÚ“µ„ Uâñ=Í^‡¤„ç¦\!8äŒ*‚¯/Ç ö:¢Ûe`Œ©×§ ï?M1¥CH˜©s\owD†0§ëÄj/éÛ±aüÝ=÷‘ãÞûÍÁ&ÕñŠÆ&‡ßíá%É9¢›%)\»iG“F£^ñzû~] NÚ}Î:õØkb >!Bv ÊA!öþ}¾9YZT�•Üuff· ”pøl•»ÿè!©C5=¥¢DSUuP÷Héà9[�QÑ!¸ò‘‘ên�ŒE•¤Kpð£wwÖ«i|¤fÞ¨8…ÈØ�î§T¼2ÍÍ(Ž)ÔLµÝ3¸‹ñ�;´Ó(± Ñ)õºl¯¹kùš"ÊÞ@¯ø¶ˆ‚.,!*I §“ܱO,Ã2pºB.ª$óÓu£ûËÈö×Q�º†)Û›Lv‡‚eLF�šRhòøˆì2 §kÎ5 .Fv×D³wG/ËvÇEân�I‚#Eòæ½²èCìu¹ß ³º}€D¯˜@@E Ò›§?óøhO�¨ª#•5À°ÕvA"D¯ÂZ÷ŒÔ-w¶·h‰–5x# L\xØÙªŽŸoP­ÜPB]M€8@,"‚†EøÆ^˜½½„ãæÃ\’% ¼rhTÄÄ{Âî"uíÐØVioòI¢_�ûu6–7ðÁ:•E«¯·k«¬¡ßïa³¶×Z+jAÃ0là]¥‹¯C“.ÊÝv\#™@ÎdêcIŒÓôì„#‚ˆJIÀÃãêtºœ+ñ+níM F¥hÜ×ýAa ²(�_‚s à0Ç‘dD�EÀ” ñ„´Y{î¶È®G(¥² 3HËþ£ƒ�È~Œ°!ÄQ¸­-;£w¸L(ý5ƒúõ!ðú[ºÛ´!óÿGîp“å7Yîp“å7Yîp“å7Yîp“åÿ¿¡@•Õ›%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:28:58+00:00¿-I(IEND®B`‚qalculate-qt-5.11.0/data/flags/KZT.png000066400000000000000000000120331520501070600173510ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEæ£Ò¡TÁIDATxÚí�ytUÕ½Ç?{Ÿs„Œ �„ ó (*à„Z[µ8tòi[ëP}¾gWÛ÷ÚÚÚ>Wmëªm­Cûôi[[«h)â8‚ 3H˜�„ÌÉÍ�Ï9{¿?�$¶Ut­äÆ|ÖÊ:÷dåfíá{~{ïßï·÷<»AÓϧÙÓè§g1»ÿJœt=þYu|V=]Þ~>a: @¢˜lîç ;�r³’E YkO`ˆ¬ã°[D‹ÎúG�¾B'(LfY»™i½Ç9žÍls†3ÉÜÏYÏp£†»c_èéòöó Óe¸œem¥Ê-`uz*A‘` l¤DÖ‘ÐúŸþ¾E(ÆU”u(wþŒ�"¢ 3j Û¨UèAß¡Ó*ÀÄ!,blwʈj?̓Ĵ�z•CƒÊ&OFxbØO_ “LÞs‡RnVâ6ï¹%¸H†µ$ñPãö?ý} Ùõ6¢L2pš¹�çS³ñ‹4§[Û1pIà¥_}‹N¸Œ2ް"5‹S3¹Å¿”&•ÅŸ’ 0q)�-ô}‹.@“-bhŲ!`€Œà6A‘ƒC¿ú� 19à¢Ä¨£EY™žF› €æØ§fðéy·XÀUÀ{!‘àùÔêTu*‡íÎpRÚ¢ï  ½³"uâ:@¶¿H!O¸Áû¦(ºÀ%¡½45*�›ýÏÒ¬²"Øï"$}¨!Ú;¸P6‚‹½k,(7+¹Ô³‡+½¯IB"N^‡(úNýÛéf6ÚcÈ“ÚK¹YI±là ;�ˆÒ,@@$ñ/6·ø—R(›™kíä2ï›L7÷°Èó3¬÷¸Ê·ŸHóUÿrFÕ„E´§‹ÿ‰ÒE§{¶sÈ-â {u*‡÷Ü¡<—:�žM¸=]ÞOƒ"ÙÌ­þg0…K¹YÉm�§ÑÀYž­d‹(BhæYÛ ‰ =›ø²ïEšTWûV1ÇÚ ôKp’+X�%¢,ôlb³=ŠFæ¨ÊgŸ;E‘lfºµ‡uöD23,,(�Í – ìv‡2ÝÚÃ£Š·ì ”Èz~ÿ >‘¦ZåãK¦‘Bñbz&SÍ ÖÚå\àÙÀuþ|¶õG”Gñb³ÇJ¦[ÄNaÅÀe¼YÉ<Ï6æ[[ÈmT«|jU.³¬Ý¬³'õt™OA›p½ÿyÚt€©Y,ð¼ËÉEøDšif³­Ý •µBQ¯rØd�âmg<I�Í¿þÊòÔζ6s‰w wF¿N»%pzºb‹NÁ ¤ö)^LÏäk3•ªC(V¤g1×ÚI\ûzº¼§XI—YÖZtˆ?&ð»ð½luFpcÛí\á}�›Ï2ÑÜ�‡t§ïi¿Á!·ˆÇ“‹x0q Y"Î_³ÀÉ‹‰k/ <ëÙh�Éè ƒ%7ü £º4ê0ÃŒZî >F?×E¾…_¤ø^ð Út�{ãKˆe ÅF#¿Ìú5#Œj¾»ŽNß þ‘»‚�QbÔvL†d—È•mœåÙÆó +í<�šÏk/? =F…;„uv9™<8i((™bîã¡ÄÅDµŸ;O2ÇÜщKˆk/³­�WYŸH3ɬ I…ùEü ÒÚâˆ[À7ã›�§ñŠ4úŸ¤Fj$ÁyžõÜú5-*ˆ@ódò^MOaй÷¤%bæÑIƒ�RX$´G\ç�Ù‚…Ë^w0ãŒÃWQ[›Œ4ªy,|7úÿÆ�ã×2ÙÜÏ-þ¥Ht‡—ó_£1XäÙÈMþçøYüó ‘õ<—ýßœïÝ€£�ž®æ)sÒ@sØ-‹MXÆXššG¾leiêL²DœifJ�ÛÓåýHÀ#lV¥§ÒªƒÌ´vpc`!CóQ;NóßJžL�ËVg[œ‘<Ÿžƒƒ�ÄEe`’õI%ÖÔª<ÞqÆpÔ-`­=ƒÃn!«ÒÓˆko¥3m ¨™cíâ·Y÷ñ?ÁG8ä“#¢Ì6wr*ñÉP£ŽÓ­¼í”óEßË<þ1K|¯ài2Í:B·”0ͲÔéüWð ²EŒIæ~.÷½N« òŠ=…&“ ¼’žBµ›Ç%ÞµTºÅL0’+£ÚôwÇešYÁ ©Y¬²§±6]ÎZ{i23NÒ%@1̨¥EIbqÈ-b·3ŒlC É™•æ6‹<ïpcàoœåÙŠ�A¡lA~L�f¡lÆA2ƨâßü+¸Ê·:c'‚ÝÂÁŲ‘¸ö1Ö¨â¡ÄÅäɵ*—r³²×g¸ˆ“ÊçjÉQUÀf{Û�2"*ˆû t’B’Ƣ»Îhö¹ƒIv‰”šâ6ï6mL0ÑÂ"N®hCåFe¯Ö·�âÖÀ³Œ3AÇäΡݑӨ³;"}9âà|І¨�@•[@¡la¼QIR{8à$¦ý'š4,b|;øG 2À*t �6«@¶ˆò5ÿß)’Íä‰Vrd”ÑÒK+$QHΰ¶q޵™ =kÈíÃÖ4³‚ùÖlLÚ˧ŒZ•ÛÉR|\,Ö;ãIi‹f�Å$s?çzÞ%(’H4yÖ2×ÚÉEž·±pèíÛ/eç…�¢NåШ³±„C½Ê&ªDT¯œé Æ›™mí¢Â-áLÏ6nð?Ïhóƒ×íÉ|'v=¯¥OãZßJ\ V¦§s*“Y�b·3”uöxnð/§E…ø~ì+ü!¹ˆ˜ö‘-¢\ïž‹¼oÓ¨³)’MÌ÷lêéú§t€Âd—SÊ<Ï6N3÷ñBjy2Â<Ï6lLªU½o "ëùUÖ/iTaJ�c ”�K=�WØ\ë[ÉÞרW9¸<”¸˜jU€ø"hl,H\JDiPÙL6÷s[àiŠd`0Îß�}…˜|(.M\ÀÉEÜ|¸}Ðv'?‹_I›öšÅÞ·mT‘'#”µ m<Ÿšƒ‰ÝÓÍôé28Œ7+y3=‰-ÎH.ð®§Q…y3= ‡A²‘Þ6H4×ù_à�[D–ŒS"ë ‰8ó¬íœmmÁÁC½Êa¾µ•ó=XžšÃ\k'¯¥Oã¶èMÔ¨|D—ÕÃqÑ‘&wâsÜ¿–…ž�¬µË #|Å÷Qí'®ƒ 7Žò9ïøE‚lcªYÁ+ö¾ê_NŽŒöºv{¿ýNB!q‘ÊòD+¶6)�­„Dœ°Œ÷ÊÍ¡.KSó˜jUP鶇¯ÿ’:‡×íÉÜx–lA¢Øã–pMä»T¸%ü<ô[f[»X‘šÅå­wñ‡äySPê„UhÕ!V§§óÅÈ·ùil …¢…eœy˜/D¾ÃÒÔ™=—¯û—1Ú8„Æ`€ˆðž;”Ùæn^JÏ Aåôºv;Žè|DŒÁMþgXèÙÈ^wÈ ÏY³Î¢Ü¨äÊÈ÷;2ƒ{’™Ö.~z�QÆQ~»†?%ð‹¬¨p†pOüjÀ W¶ð½À㬳ÇS([¸Â÷7Dþ£#jx€¡²—:Ýž ]«rQZrgðÏäˆ('s­o%�$³ÉÀbï[Ü|Œ©Y 3j¹Ô»†J·˜{âWñdr½µóÛ[® M:‹Na'¢4ë,4°Ó-íÅÕÐ4ª0«ÓS©r 1дè0ß�^ÏTk/Wz_4®6øIü–§çr®ç]–¥Nç:ÿ î = ÙHJ[<“šÇÊôt¶Ú#nÔp¹÷u~¾—WÒS(3jˆè ·Goâ¨Êà4s—yßâÆ¶Û¹+ö%T6m:À«éÓ¨S¹=Ý0ÿ’.®`‡c*�€Hòž[Â×ü§Q…)’ÍìtJñ“¢·Že�*Œ‚"ÁHó&65ª€ŸÆ–ðuÿ2.ó¾AD‡¨WyɦY>cŒ*^IOárïë\í[Í—}/ñ“Ðï˜ïÙ·O²ÍAH$Øí ãŽè7Èm$´Ÿcª�Éf·žæ7ñϰÁ.ïH§€‰ÃXó0-*ÔkÛë8'eH$šEÞ�DTˆ…ÞM´ê ­*HµÊg£3žÞjÎ’xYk—S§raÔàbpHR¥Š9ªò¸=ð4~‘b§;ŒF•Ín·”,™À+lOžÇk«ÒÓhÑY„EŒÇ“ç1Ù:À#‰ÅÔ¨$´��Îxލ|@sžgw‡~ϲÔ¼�ž (È6nð¯`»3œoÇn`—[ÖkÛë8Ýð%ÿ‹T¹…<™:—ÙÖnKœÏ{"K¼¯ò†=‘$Þž.ó?Da`‰ö§ïZß*¸9àá€;ˆuöxFG˜`V’ÄC½Ê%¥-v¸e$µÉ{"Q4èlÖÙå´è‡T;�á4èl\LÊF¾è{™éV'³<5…¤X6rÖ¯"ë¹?ñ96;céí�]²‚‹d#3Ì=Tª"æZ;0pjÔQnVIÎðlgyê èµ�ÍgNÒ _¶r�o[œ‘4¨\ö¹%ìK e¨QÃÍþgÑþš:‹N x5=�Dœ Ü�€Áªô ,lJå1x6‘-£¼‘žÌ#É‹Hk )�ÍÜz�A²‘_į`ƒ=ŽL ›Ÿd$ãÍJ¦Xû¨vó™ïÙÊbïÛË&jT> :L®ˆ²ÆžDoWv½Ê¡U‡8ÛÚB¶ŒSá&¡½€¢Ug±ÕÁžõüGà)z61Ú8L±ÑD�lF q´É4k³­]\æ{“ožáÖÀRލ|î‹_É^w؉¨b®Œðƒàc”ÇøMâ2^JÏ ¦=Ýš“–�‚A²ž{C±×|b3X6°ÑãŠ?§ÎfYj™¢îÉæ~nò?Çs©3xÍžLüDļ˾áF5Y"A¶ˆ2ÕÜK­Ê%GFe¡Ò-¦ZåqT°ÛÊ[öDO=H ~ú_,\MžÏ~wé^è+ùgtò4wžâŽÀSlrFskÛ­,ñ­æÿ³¬·ÇóÕ¶;:–6™SÁ H2ƨ¢X6ѬCTºiPÙØ´/‚:6|jÉã(·žæ]g/§gФ²P˜t>0Scá0̨åjßjfZ»y þV¤gwüMæ´ t€d¬QÉC�²45�s¬ÍLµ*ˆj?%.f®µ“íÎpN\Jï�|pA`‘&_¶)šT-þ �Dœr³’)æ>¶8#Ø`—ÓÞ‘ºËÿ‘€b¸QM¹y�¤ö°ÉC“Ê&S¬bW:eFøDš¸ör¦µ�l£Tc«3‚ =ëiPÙD²§Ë{ ´w¤�IM‡óæýŽœemæjßjÂ2ÆÏcW²Ñ)§»ÀeF ó­Í($­:H}ǹ  S;º¤…ïwãb°Ë)å¥ôtŒ�˃‰K0P|É÷O¥æ“i&®3'—]2ÁÜÏ÷‚ÿ‡_¤ñ ›<¡XÖ×^L⓹ÙÈýY÷³Ø³–v¯c.•ªˆmξÙv3m¼m¾“Útˆ•éiŒ6Ž�'# – Œ4ŽrÈ-¢Vå²ÑC&«½3š¸ör_â êUmÚO™qŒ«|«É ¢ÚO¾lå k;3­ÝÔ©¼˜žAµÊç·‰Kˆi?m:@¦v>tK wY“žÈÂÐ&δ¶Q([kfй�e©¹¸y#EoFsÀÌ·\ä}‹Ï{_exÇAim šuûÜÁ¼œžÎ›éI¼ãŒ%­Í“ò 3·óᎋŸní¡Q…ÛݦN)ÇÔÊŒc”5„E,£wÂvGs|¼ßf�`½=ްˆ#P¤´K84ª0qíÃ9±jP'}7óé"¿H¡;6Šþ:qçz6qDå3¨&Ú‘ùÒ©R…4p<‚§¡ãt´÷ëÜW†¿÷é"ë™ií&ªý\ä]G¡l¡P¶0Ñ<€WØôöèÖ©s¼£Ç×ûï_û.ÝÂÁÃ�jªÜBrDŒ…žMd‰xGº”è80ª¯ àÓI hÕíûß�©\´†&&­-bÚK“¾þD|Úè²5Ì`¯;„ ½ë9ß»�_%>ËÙÆÕ¾U8Ô÷âܶ~N�.@q¶9ÃÙb�ä"ïÛ$´‡5öD\Œ^�ÔÏ©Ñí…c�ÃìtJIc1Ö¨Â@qÈ-ÂGš�Fÿ ¯Ñí…d¢y��H°Ý)#(’Èòe+�*Lÿзèâ�ìqK(–MÔ©H]Ê%Þ5ØÚÄÄ¥Iõ%'P?ðï 0pyÓžH‰QϹžwaTS£ò¨R…½tsh?‡./ŽtXo�ã ;�N92ÊVgĉGÊ>è û´#º¿<ºÿÕ±Ÿ&>ਠÝåÊ?¸ï§/�ñÛÃûùxü?ÜaÝ{iBèV%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:15+00:00ú1 /tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of KazakhstanÓc÷IEND®B`‚qalculate-qt-5.11.0/data/flags/LAK.png000066400000000000000000000012051520501070600173070ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<TPLTEÎ&Ð%µ.%`(i(h&g%f*j.lAyToš‰›¹«¸Í»Å×'h&HÚàéûüýÿÿÿ'g-kc{£Ûáê 1nˆš¸øùûýýþÕM¸bKGD »\– pHYs¯¯^‘tIMEæ£Ò¡TôIDATXÃí—Ù„ E™TÀÁÿÿÏ1>Í¢I�p'™¤ç…'rÒm‚a†ÉÀŒ¸‚70â~ ¹rn‡�tT¡Êª*×åÄ&º@ImlÝ4µ5ZÒTA«:Ûncèm§Ú¼‚ÑOÁ=&?æŒsLî…gš�$h}\ÜKô¤,‘jJîƒ4‘Nš"P]p;„Žb E`Ý.6SJ÷û‚^B  3ì Sä‰à CkŽòDPÖG‚ºÌ"¨š#ASý‡ž"ø!ã¯)ú¡ÁKÅŠº\ã¼eâ›>~l‘ðÁkS|5:‡_øøÿ€À¿P Ã0LÞÙ[­6Ÿ$D%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:08+00:00t®ÈtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LBP.png000066400000000000000000000051701520501070600173220ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs%%IR$ðtIMEæ£Ò¡T BIDATxÚí›kpTåÇçìý–ÝlBÈæBÈ „@‹¢¶%¥Þ¨—qðÒ‘q¼w†-Ö¶j§–NkÇAíÅZíØŠxAiÁ´Z[ä¢È=ÆÄ„$äB²!$Ù$»ÙÝìî9§–Ä ˆýðžŒûûrfgoÏóþÏó>ïû<ï‘zóJ4RCmÀ×�”‚I ˜”‚I ˜”‚I ˜”‚I ˜”‚I ˜”‚I #ª*Ú†¯5F9?O´ _ ES‘%I´)ÿŸÊ‰Ž ×��ˆñ\ón-º �É΄sb£œ›#Ú†óFAãɺ­<؉‡RVå^ÊD�£hΗþØ¿«ÛÊïë·IDyè苤¬|7§›Á,Ú¼óFÒ4mÂDo_,ĺšWyªñm†1�$Ð4ÒÌæ{‹™—^È²ì ¸4««Á$ÚÜ/Å„À ðLÓ¿yü“m ć 9ñh �¬æìF;×å/æ¡ò(uùD›|N&Œ5mlhÞÁæö½´uÒè K€væ*I%#ßñÍåáÙ+™ï-múY™9 e¨›‡?z…P"Êû$Zƒ]8ͦ§å2“cóÒ2Ô�Ãh¥¶¿—ÙJ•o.96¯hÓÏÉ„Ø »Œ6®È]@Ýà ꃦå°zúÜ7cn“€ 3§3?½‡ÉF±3›çšßeÃñø#ÑæŸÝGÀ@<ÌêCÏòZû>¼'�WÜÆÛþÃlhÞA(e 6šŠÑ`"¡©:²øÕœ›ðY= çXÐO¦Å…IÖ§«ºÎþH€Çê_g}Ýëhj‚™éS™åÎg{Ç"JŒI–4¢J«ÁÄ@ì:«é.êƒ�ÄtW.̺ž?5¼Éþ¾F“å 4m$2FwË“�BG˲/`팺™Št%Àá@3·øgõ4౺Y[¶‚i®ñ!­ÝJcÐÏér€E63'½UÓh vÑ1.?h 3§qËÔK(td‘f²ã2Ù˜æÊÁa´ˆvÐÑ´¯÷·ï{’°2Ìcóïà` ‰<{Ù¶tv�ªãÔðàèØž™ï‡Õ8û{iT”Ów?d *ÇCݼܺ‹E¥¬)»š)öLÑ®ŽC7Ðô³»ç–d–QêòñÛÚ²®f3áD„3Ŷ±Õ“ÓE¸3¯=f'÷”,g–;Ÿª_¤;:@ºÙAg¸—¥“ËyºòÊÒrE»›D7µ —�U…—a3˜y°ú%ž¨ßN$1LXIÂkq1ËS€ÄHÀ(ɤ›]Æ­€Àm²SäœÌ± £d`ÃâÕ¼ø�5L²zxïäǬܳžÝ§êD»›D7°­c?V¿Lu éLM¤3=üfÎͬ>ô,åî)Ô´ó‹òx¤v ƒɼ#=cMS’»e$@ž=“¹éSy¡å=:½<2÷û,÷Íí²>ÐÐøkã;Üt#ýÑŠÒrY‘»4À?ÚÞ'¡%°,¬,¸˜mû™æÊ¡>ØAEz»OÕQbã~m\£FU±›ì<³ðnžº”¨§f �ÉA‰6BP4•¦P›ZwóØ'¯ã5;¹&1w•TQâôñTã[¬9ô7âJlt\ådrÜuƒ$ã6Ù ÄBhÉf €†ÓdgeÁEüpú•”»§ˆõ1`Kûìí©§2£„‹2ËpšlìkâïÍï²õÄ>,²‘‹³fâ5;y³ó =Ãðyg 4�[‹¾É𲫸oW5›Û÷ÒîCECFBE£?6„ÛäàîÒ*î,®"Ëê8ô#èb Š*1v�ªã-ÿaÞ=ù ƒ�x-N®Î­äÆ‚‹©ô–`1˜ØØ²“»>|êSSÎIæÕ%k¹610ÒGÄB¨š†,Ih@W$ÀsÇw°©u7s<<^q›ð"�.ö}±›ZwÓê¢,-—;‹—±,ûŠ]¾q÷ú’Ì2ÒÍN"áÞqS€,IXÆœ„p›ìÉnÙi Y,Ì(eEîB~Y³‰‡ª_â•%kI3Ù„ù® rl^þRy7Цb–�_xÜðP yd úœ÷UM#ªÄÏù_Iæòœ x‹i÷b||E˜d& _ø~ïp�'þE,³ë%¹1ST…†`ç—þ¿,«[9@7±³W~[»…�Ý5ÌË(¥*g>3=ÌN/-*›ZwÑ:)ÚÜóBIølœ÷ò‡†7x¶é?ÜRx ?›q-³“`"Bïp�•{Ös´¿…LK15ÁÒ¬™ë: ì“Pu|x] ,Zª+ë$$†Õ8 MÁe´¡¢q® =�ÔÑÏÉ’Ä©áAì vƒeL;GH½9E:´nL-ç«þ‚$1¢‡Ýƒq¤Ù­W¾úcZòëú~tCÏ£ÿµ %€`R&%€`R&%€`R&%€`R&%€`R&%€`Ræ›6“9Ùñ… %tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:14+00:00Ä"tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LKR.png000066400000000000000000000126641520501070600173430ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEæ£Ò¡T~IDATxÚí�ésÇyÆÝ3³³;{bq HB¼/ѤdËm+¶S–mÑ%§";G%±?¤Rùš?"»\©Š'‘’’eG‘lY-—HY%Ó$ÅûÁqc±çìÌtçC/R`,rùT-fzgú}ºû}Ÿ~»Gè—ÑÜDÓBþ¡oà&þ°¸I€&ÇM49ì™ΕS ®å�Ÿw“b¦ƒMŽêdƒ\@ üè@7ÛÎä°Ä•U¨º…Ï?ÈãdDxåÏ �…À-ç<‡€Â°ÃöWÚ¨Õ$! å ±ÐÁ–ÝÄDB¥©ÛH…¬;ØÚ"ÓÜõè(ù.ÿšx£÷µn޾[%Û]¥{y…Ûï¨ÐµÈ礌p°f/¨(…µ|˜„ãííFX×o0 Eç"ŸÓ¿Kpò�ÇÄ)&ã¤brF¿èú$€WH(¦¨îK²oŸâÀ;%Ý3‰Q³f5d=ÒXˆùú“c<ÿL+BÌ~ÍUÜ.Z›-ÒzÊ¿µ„À)¯.x€vC ¾â™vžNã ‰KÑ0¼ž‘Ù×/¦ž\#-ˆ#ÑÃYv¾¡AHÂTÉůӂRºÈæoL�t¡4'+f¹gkݨp¡ñ#…D³ÀW �-§KÑ�J:$j)“_X!“±,MP”&m&‡\‚a/pq-y…:† …ü~[ŽÎb–øTøñe]ÿ8RjZJB­Áúø¯ªˆÅw޳v©âÃC]uâläiÆÊ�"Ôš‚]ÁI†(ßB—b¤Öá ÚÓ‚·t!…#yR*Æ]!R‚L[�u�rï�5ÚrÆYµ,@�R0Y�G-Þ{+ÅÈÞÒAG^îP¤I†.²ǺŒko(hÀ•’8_A-^ãÎ;«`ÁDA" „éž‹± H×8gE%-¨]‡xü±*cã’×·Åyø�+nQ<ÿz™O­ ééÒ¼´¥Ê±}Ùl™¡Ó.ß|ªÈÚe ¼»Óâ­·|éÑ «—*�)÷ÞqÛš;ö•xãåÕÞ E—Œï1WjwsEkG`Z–†jÅBj�\N HÖ¯R|뱺±r£iËpèø´g!áÂŽ#°jÔC°$,ëaƒ_Ó8ñˆJU’N+Jñ «î.Ð6ßgë– ¶–ªš¶fq,ðruž}ÞC…’û>]âéçR<ö°Ïy†—ž¯1YüõߌñÎ{q¼¸�´°ç$bi:L¼œÍE @+¨VdÃΚ„çõW3ôÌŸ —ÂHª� mË}^ ´f`¬‹ÚÍïŽ q§A¹Œ¢5 ïl�óµ?ª�m9ÍÚeŠç_L„DŽå³å?çãS§Ê[¯¶Ì!”äW''Ð%Íoþ«• ›†xâÛãøuX8vyjNCÕ¦#€’ŠTʨ~JA½&�>5.%“»:xög!ßÞ\Âs!ŠL7ŸˆÁê…˜îW@· Ý퀂 4ìê…Ž„Ê”µokžõëkÜ»AQ)ÃÑc6Ý·(ÆÉe±,pÃêt !Œšgõ·Ò�Â’}¿ìæø� –¬)ó£Ûs¤æ¨õC“@KEÜ5U¨4„uIæ”D@Ô^âÀ{9þE)Ü”dݲˆ6(„2C€cAÁPŽœ6Ÿ—ƒj&J°¦!ñ˜^ž|r’yyÍö�ÞztÕ@Ø Ç IdC2é7nZzaÔaèpš½‡òÄ,AZÊ9ÿ¡) `”1Û6ʘÖ…bʱ®±bã Úaû—[Ó$K)ŽuV™ß>ÆânMµ}ãÆÐ}CК†…íÐÝ R˜2O��YÄHÍ¿?ëaÛ°a} ÛÒ4%a*Œ¯ÂéZ�…£Ãw¬«ò•/…|úÁÉþ2{úL—ŸKCu·ÂÒ.ˆÇ P�±ÄlC†ßî…þ‹ÖªÇÓÏ¥àp;‰(Æ�7jx�eZ:ë¤3!–A (-ŠcÕñaņH‚¥H-,ñÍoMðø“£<óO.¹bvNsš”«[+Q$¦²ˆ¯Æ¦‡k¬^dZbw«&• p퀑I˜ßj†Žr &Ê�ñ`÷1È&!f™á Ÿ¸�KJÅ÷w‘´,KàÕ“D}Ç`Lk4�@ �¤d£7@Êû’¼¶%à;R¢uqg{öy®KF“¬F¶“R BÙ˜¬Ñ”e�·ßsy{WÈgîiIAWÞ8€õ’®)"ƒ§Àsáà)þ-ï6*À‹BèÔÑuÈÙö9 �Écˆ�½‘ T�iZˆÆÒü~µF3¡9 €žªûH�ŽFÐVÎrüµ4gÜI޽#°[ªÄ[}>{_�Þ>‡ûîô�4‚O[Æ&ˆ`´#ûÍð°|Xµ±B é\,³ÍL*Í”»¢�P+ª"Äê)ðÈgÊôÂH_’¬œ}ÂêrФhm*R)PÑ´y\)q¥$å‘ã‚ú¨¢Úðã]EV¬­P¾Õ§ZU4ÆÞ–͇ª=Æ™;5 ­�uFâEb(3{¨3M�YJm+D"ÀŽGÓò®!4ÒQä:êܾ²Æ†[ë<ýtw<}Uyš3¡9 pNË‹ÔY�ýüSLòŒÆå<ð`‰;練záôo=‚´'†Lo0¿� "ˆ9šòãÃäâ#ÌË ÂÈ 7†x�ôùœ"7ß%Ät—oYfˆ‘ ëü쇑]m´ÛÖœ§¼7´† 4☟~]�Ô\@‚PA¹mœÇ6³`~Äî^sý‚685bœ@Ç6$jÍ} \3s§†á¾5š\J“›)7þã¦íÎ�ï8ðî$á©¶)çu®p]æ^)”†Éô$ùõ#�. BçºqŠ-DçD)(µøÚSCÜ»!"“€ KL¸wtö‡–”ƒVvñ3æØÀê×�[:™–“?úQL“ࣟs¡¡³îúÌeQŸóäÕ¦éLþ_ÄºÏ óù‡|ŽöC¥¥<õ�*oö„lÆ#+Œ27iù<ðåaÖ¯TA&i>e2 3î§âLMÕ¶V Ÿ6ç„acˆ™«ÞZÁºÕoçªè ÷¦p%Ѐ#§�»Ë>žkZ­cC¥'޹ĉ¤A©•l¼3øHn×t¨wî10­ýì±¹ŒÓÏ"™'¢Ç¹)_)\))ì˜ÇúV>0F2¡É¥LJÖ‘Ã.í ­*BnßP&é1=x³�Û××bÅ[SùI‚É-iMOô@¡ ß|rœú‚QêD±€[z‚ÿ£^*¢`îÍÕt0C�$áR #í–k°v‰bówG¨/%°BÒÉË·~¤ŒS8ç0>)KrŽ{�¦#€«ìÒÆÂ’Æ[¯P«ÃòÍæïŒPï§X½Ü‚atÒDsîª 8Úç +sëBÀ‰lúOÄ(ùfJ7ŠN#M{y�â©ÍeJþ… ).&Ýž…4Ò½? �©i‹iùÿ2HppO‚„væ|Tj:øJõŒÒÕE` Á�=ŽŸ–Æ( ÖÝbföJU¦ %àÌ8¦g˜ÉxÚDY�iñ_špxö–¼½ÃâÈ)ÁHF �,¢Ùˆ ``X0ڛ™ëþŸ&‹ ‘ãY·È·(µC—dÕcx¤«{ 3×r؈Íçîž0jaÏÁdŒÔx–Ér�SgŒž/�lÊLð> ˺MƯm1³+L+Oy0\€vÅØý^šR_/pI ir µbôL /ЇöšÑ"”‚Ö,3’@+8v$ŽÙèk`­¦#@›JÁ¦V¯\2ÒaÛ«9ÞzUðÐÇùâÃu,a$ØÃ;o}àðÕÏÖ "ã,ž·þãDþ0èr|w5˜&©ò–@[F4«–Çvf9¼±Âò�‡Ý&§°@w[£À�”]u®Ù¶7MG€’¬3™© ÞtÝ Z&Èrıxïç ŠÅ3<òP�ý’m/æ©öåøç=:VØxw�ì¹]¶„öZüö¹NrµIaM%n\Ða HŒgøÅ eþâÏ ¤=£D®\Û vì—Õ•F,æ‘ÏH¸7®YÜ­H76ÝÔ¬ŠKJÚSaåE¡aÒ©‘^Y › XÙ°ñ®ú”lœo Ù™žàÖ»K¬^[eõÒÇ6›¿ÈçЇi.þL(«‰ !esn£”`<5‰ðmRÑÇ髳C (ÇËlúÂw¬ÒHa”A/#&×o²,ÐJÌÚòPÔ!‹`ãý5´©8•„3£fÞ¡­«ÎƯòàzM"fö"ˆ0Z€{î­ràƒj(ÿ1Ûï ʶO�ðé,¶LÉ׳áú'€(¥©£�%6Ü3Fßoæs^†ç•ŒÖ‚-/äÙö²Æ±5Õ²M®­ÎØ€K¶½Nq,Fªž˜½õZjúzô~�#×éS³ii˜qHe"j"$*ÅØóÄbŠÊ¤C¶ÃgtÀ¥µË'ôgb4i˦çÁAúwHê�m⬩mâfÆõK ¾VèŒÙ(rYc£ÈC]úªú*�% ´Ô=ôIϨz<Õ“�‚àŒÆ\RKÓ@‡èÄ<,!Ç49áÈÐà–˜>?„ƒ�—‚pD““Ÿ¦áÛd]ÉÃß`Çï&Îß(yiï ¸. 5§Î’G‡¹÷þ óÚñÆš½­[\,eq …Ί³‹5Î…±·¾¢Š3Iz*iôÜ2fº]›óÏŸµ|-9sÂeþ¦ Ý_ªà®ÂШàýíG¶v0S«¸.  ¤—øêWJÆð Á$PPž´›OÜh@ AuÒÁÌv5® »4��•ù�¡qÂj·p%¦”²³¨•ld“¾0B~Ù¯3ÝÝ+3¥¬•œÑ…¸. `I(œHÒ×/M&NI*Ãñk’>}=@�?çÔ@clÔË©AÁhoÒ8„ÁŒC@¤…/®XwDBpÕ»¯_du�¨Äxå[8¼²Æâs^# jj‡…æƒUŽóêÏÚ(n?ï•1ªèÎxþŒx°sÂv•/�JHuuvÐ@ë…ÇâÉ� w•©Õâ„1�™—F-Î9Ø÷OÞ|i”²èß��ziÔÏ"vw/^РÄL¯Ž½ùÚ¸WøÚ¸‹œ÷ÉÃy7yÓðâÒêäºtobîp“MŽ›hrü¯±ç0}$Ü%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:35+00:00–X¸¬tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LRD.png000066400000000000000000000035211520501070600173240ustar00rootroot00000000000000‰PNG  IHDR@OXYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÓPLTE&d¿ 0%d¾-*gÎC`6qøäè7qúíðúíï7rûðò0l嚪¾./kà‰›ùéì+hÒSn¾- %c¿ / 4nÄ@ÑÉÖñÈÐýïñûïñ%c(g¿ 0¿ 0¾-¾-*g(hÎDaÎC`7r*iüòôøâæ8r*jþýýúìî8rþüýúëîÿÿÿûïñ1m)i栯嚩¾.¾.0ká�Ÿàˆšûîñýøùùèë+hÓUoÒSn%c¾-¾-'g¿ /¿ /!4m7rÄ@Ä@ÑÈÕÒÖáóÒÙðÇÏüíïÿÿþúíð(h(i#"^± 4À 0¿ 0#"]° 1¿-¾-)h-l&-g¿BaÏDaÎDa'g6r\vŸ+j&f.N‚êæìýö÷üõö%f:YŠÆÏÝ>x/P„íðõÿÿÿz�°ûûüNi–/O„íðô'h 1n½ÇØ“¤¿&g#d1R…íïôÒÙä9t$eîó÷(h!D|7W‰7V‰4T‡‰œ¹öøúh€¦8W‰9XŠuÖ™«è¢°ç¢°²¾Òòôøñô÷ñó÷ùúü÷øúóõøîñõ˜©Â?x�¡½ö÷ùêíòs‰¬ 2o[tžÛàêþÿÿ@^Ž5T‡ÞãìÁÊÚ@y'Iåéï4p± 2¿.¾.g¥ýýþëîóòô÷=\Œ);rчœã� áŽ âŽ ,k­ºÎ…˜·3S†¢±È€”´&Hæêð×ÝçRm™*i 0nn…©êîó3p]wŸ¨¶Ë(I>]�´ÀÓ)i-N‚5q?x$F}/Oƒììñÿüüþûûþûü'0iÃRoÔUoÓUo°1¿,¾-"!]± 3À /¿ /8s8s43j·DÅ@Ä@ÒØäØ×âñÕÜôÔÛôÕÛÛ »VtRNS2ïì.ì.2ïí/4ðï24ðï24ï2ï23ðî1ì.3î02ï23í/2ì.ïì.2ïì.2ïî12ï22*A!bKGD4©±éý pHYs ç 癪&tIMEæ£Ò¡TßIDATXÃc``”Wà Â#"£¢i•˜Fí`û™ñÚO+ ¬Â´ŸUU ÙÆ„D$%§¤Ò ¨k°íg×ÔB²/-=#‰›•�“›G+ ­Ã´ŸSWÉÂü‚¢4$û‹KJiô ¸@ö"û?¿¬¼"ÉþÊ*ÚÙodÌ�nuMmi]]íç�†}>446•6·´‚˜àXÈ/n£�ý&¦¼@ûùÌÌA6µwtvuu÷”–ööuwuõO˜NŽ“&O™J+`aÉ�(ª+§MŸ>cæ, »fÏœ1gî¼ùiô-ÿ²&.XšE‹—ÔÓ»ü­Ï\º bûòÂiiô/ÿ«óW®Û¿z , Ò·üÏZ»lázX³aã&Z+k ý‚6æðÂgsié–­¥¥Û¶ÃüŸ¶cç®Ý4{lí„�ò?ìÝWºmÿ�ƒå¥‡²`.¢iþ·çE)ÿê9zìxþ‰“§ O§ @ù›æì9`À§¥�¿0!ŸŽöÃÂÿâ¥Ë�pÏ¿r•>þÕìˆú'- �‘uíú�›4·…�ö‹8¡´PAõí;wïÑ 8»ˆ‚ò¿+ÞößýiÜÜÅAûw íwõHà ª=~ò”VÀÓKh¿¤·Ï3œàù‹—¯^Ó øúIí—öxƒ¼}÷žVàC`� Ð~ÙàÚ1x�I¨Ð~nc£²Rþ´ýr¡&d?$üe‚?Ð,�‘þ¤ü|i–ÈÉ^ž4+aˆ)˜”iVÂSþ´ýbîn4«a‰©E]œiÖ ¦ý!ìèp‹VM,bÚ_\Xþq ‚òw íçµ°òÜÿ²³ÝC«.&1ýOk+šõ°‰étù7jÿÀÚÏoiA³FbÆyM,ÿƒÇ_ºühû¹ ôÈ~Èü‡Ž6ÍfXˆ™aÓP§Ù 1óO,*Ê4›a#fþm ËŸQûÒ~£šc,™×:n%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:18+00:00¸´®VtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LSL.png000066400000000000000000000025501520501070600173360ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<CPLTE Ÿ! œš™ÇÎêÆÍéÄÊæÏÖò×Þúÿÿÿñïé}|vƒ‚|ðîèüýþüüþûüýnno jjlûûû‡‡‡âââ$$$666ëëë ŒŒŒþþþüüü½½½,,,°°°ýýýËËËøøø"""000îîîØØØººº###§§§���ÆÆÆÌÌÌèèèUUUÛÛÛÖÖÖóóó×××ïïïãããÑÑÑúúú;;;���õõõåå僃ƒEEE”””333ˆˆˆrrr)))¢¢¢÷÷÷ %%%ÝÝÝHHH///gggÄÄÄ£££ùùùOOO***bbb777���ßßß???ÇÇÇfff222¤¤¤[[[444___ÂÂÂLLLVVVCCC………sssÕÕÕ&&&NNN­­­lllÉÉÉooo®®®BBBMMMÂÙÙÙ===YYYæææXXXwwwíííüþýýþýûýüæèç�Ž�<=<;=<%'&hji,.-“•”éëêõîòüÀ’‹�d]a^W[LEIB;?]VZwpt’‹ŽÅ¾Â÷ðôÇçÕÇèÕÆæÔÃãÑÅåÓÍîÛÕöäÚûèÛüêÖ÷åÖöäØùçÚúèÛüéÕöãÌíÛ’>’=�<�:Ž9Ž:�;‘<–D•D•C„1ÅNbKGD hÐôVtIMEæ£Ò¡T"IDATXÃí”çSA‡WAÊkýiƒFOQψQÑDcGEƒƒÆ‚½€ì¨`{ï]Š& ø§¹ç8ãGß�¹óÓ>sngö·Ïíûîž�F£Ñüz8Œè©DBbb‚ZBôR )9%55%9I%#H‰Þ}úöSKˆþlÒÒiÀ@`Ð`JOã§vࢌ!™YÙCs†ÉWþØ3Ý”;|yFÒ(�R‰Ø3 íCyci\~�Ø/È¥ñ…4æDòNrD`P‘w²ðM™:Í�›Š§Ïð0sV~PìÈÍž3˜7�3§H®º°d°xI©t9!pÓÒe™(S(�’À ¿fËW8´ƒÊ†|V’#MR†µ>A…B—Ù­B(d Àj©³Y¤â¨\ù7&´Æ^�¼¹kemþÆ:â^fžÀ ÒõˆÈ#j‚Y‰ ™�f Ú„¿ßo±y ¶ò+Kà¢mÛKv쬬 TÂÕQ”ï*ÛÝcŸÀ LîÝ·?»(r ¦¶ª&ïà!_Öaa87ù�æÇŽ×�¨=yª¾á´÷LΞ;Ïꂸðo›ˆ.^º \¹Šk×oàæ-ܾs—¨©‘VøUÜ»ÿàá£ÇOž>{þâ%?%^±hnim{ýæí»÷ÚÛ?~úü¥­µ¥™—_¹t|‹Å;c]]�ñxì{;&~¨ÑÝ­?F ´@ ´@ ´Àâ7’W\d9/%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:41:54+00:00l-ÂÕIEND®B`‚qalculate-qt-5.11.0/data/flags/LTL.png000066400000000000000000000006461520501070600173430ustar00rootroot00000000000000‰PNG  IHDRk@ïú”ÊgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEý¹ü¹Z†3iEjDkDDR<À'-Á'-ÿÿÿ4ëp£bKGD ñÙ¥ì pHYsœœ&Í:4tIMEæ£Ò¡TKIDATHÇc`£`Œ*Ar€ƒ9@�Á˜`ÀàBpÕ6ªmTÛà×J`H#$0”“ :È £ÚFµ�jÕ†¢ `R•.À��´%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:20+00:00ÔçÒtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LUF.png000066400000000000000000000006231520501070600173310ustar00rootroot00000000000000‰PNG  IHDRk@ïú”ÊgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEí)9í*:ù³¹ÿÿÿ¥Þó¡Þ¡Þ¸ûûrbKGD Lò pHYsœœ&Í:4tIMEæ£Ò¡TAIDATHÇíË! DÁ‹ 0C0xý# ¿½A¾õ+ÀÙ‘TEÝÑh4-¶éÚŽ¥ë84�ÚÅâ¯ßã�ïN%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:17+00:00NüÞ¿tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LVL.png000066400000000000000000000005631520501070600173430ustar00rootroot00000000000000‰PNG  IHDR€@¯¸—ìgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ< PLTEž09œ,6Æ…Šÿÿÿy­`'bKGD Lò pHYs × ×B(›xtIMEæ£Ò¡T*IDATHÇíÑ¡„À_Ò%]R0ÐL\¦‘H: ¤Aü8 wK:<¾PŠd%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:06+00:00$!Õ•tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/LYD.png000066400000000000000000000013651520501070600173370ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÒPLTEçéË <<<���ÉÉÉÛÛÛÎÎΰ°°:::���ðððÿÿÿÂÂÂmmm;;;,,,666KKK ­­­sss!!!öööfff   ïïï���ááá 444%%%õõõtttvvvÀÀÀ»»»ÅÅÅOOOëëëýýýñññJJJÚÚÚ555‡‡‡ÊÊÊòòò~~~‹>#ŸG#žF#‹ðbKGD|Ѩ pHYsœœ&Í:4tIMEæ£Ò¡TæIDAThÞíÖׂ@…áU±`Ga슽€½÷þþ¯d‰ ÞJ 'Æù¯vn6_ì"ÇqÇý}.p NxÀ ðë¯ÏÀä`(‰ÆâJHª¥Ò™l.¯€d‘´’þ\&Ê’^q «T­Yc¥ÞplR«m�C5¥n¯ï@%MyÆp4žL?vÞ…uk Ì´¤Õúó�ì|*ʯµ¹Ýítïhc£ŸÀü%Ćðƒ~ã/#üuüûCò•À<àNœÁ‰ 8qÇ0€ `p”3š ®¼@%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:24+00:00ñ›ÃÁtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MAD.png000066400000000000000000000016061520501070600173060ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÁ'-Â'-°,.Ä&-u>/v>/¾(-aƒRYÓYå¼Z£†AkU³Ât­\ŠtDõk¶.¤¶¢´¥ËV“5ê‡Iìt–löúýž)[v·yX  éhì8ã@ž$g2uµÙLs§ |°eª9¿ò¼ë¹©íÚÂVo\÷Vµ å woyË¥g=<‚¼Ù“á®|ŽóW®áC̈<ë/aøƒ•Ћ@^×o›]øÅÍû`Fdûñ~B>·—ðõë!„Bèo|~!"†èØ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:49+00:00V#«†tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MDL.png000066400000000000000000000060161520501070600173210ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs : :ðd’JtIMEæ£Ò¡T ØIDATxÚí›ylW€¿7ÇÞWv}Å^;¶ãÔI\š„&iÚ…4…ª�TZ.‰£œÄ%!üƒ„@ˆŠQŽB�(Ð*´4ô ´)iÚÆ9Ls™8^kï®×Þû˜™ÇvFØdv¿ÖÒŒßþÞû}ó›÷fÞ v< ¹Ü±TÞ¸þ ~ò†»â2W™Ïv‘ÚFh—y¬€RëÔ–†uNC€:§!@�Ó ÎiPç4¨sÔ9 ꜆uNý jÀåE] `šP(Ö:ŠË‹ºÀ4a" G‡!_d¾ˆz�ÅÑjÀÿùŒN 2yØûŒ†0Â8’®è=Ñ2nW­ƒ¬ ö@¬…¿%¼°ª[²{·Nüp€´/BKK‡«ø—Œ³sÇ(ËÚçϽq¡ ;b¿(æËýð((@U!z•A ³H¥*XÑæªö²é.Æâê?�†“ H¦m9R€ +€aÀ÷­ñè¾&6¯Oñî×Wñ¸ç�I z»$Ñ&ÿ�¥¸4B¼Þ"­æ…Š ÀŸá[? ãu[|äm³ôusñ96Àv^ï~DcðÐjv®ÛÀøÈµÜ}¯‡LnþXÀ +¢ÐÒTÅ”òå*³¹2MMi:Z¸Pæ¦Ó³yDH¡T1ñ{”Ë.~üË>^8:ËmÛ34G*<ò'/“É n§‰Dpàˆƒ—¬Ñèï–üñY�ïsú¬BÀcaX‚ŠQ¥T¶pøªµîâ%ÇV %N]£bX84…|±Â®­-˜••r+G¶’«LS™ó°ª³@Èëİ$Si“§ö…™ö2�ôÒ–¬ësqø”ÅèTE躂°Ùýì&P(W1 ÐT…RÕ$57ÆíS æˆEâÒKTµˆZiYÆ'ªB2�ƒSeµZBQ%£7Ìð`ÊE®(æ/–͖ØL¡Ú#>T¡ávhäJ­ ó`–ê�ƒ¤³Â‘õ3t .!f–‰¯™C›r0 1<�§P0é ¡;$î :#~fõ2ºªãq&kÝÅK޽VuF�R¥)è!1[¤?ª!”,e$£7&hë®âݯsrM’;¿�aÿ^�øW¼t–]TîHû†“åU¯“µÁ6&¦ó àq/ŒÙî� }–�„K‚%%–%Ï �ApckÒA“ÔñÆ�ì½ßÁØ~7íèh“N"&éhi�dáÿϵeÙ-õóØ¢XÌ$³Y‰\$OÐ9=Z!ƒÉºDˆÑ{<,C#ˆJ<œ#è–(õ_OöÄ|•±¬yÑ4µÖ=ÿï±…¥2|î·ž|^eWT ýC…*G÷øYó¡¹w�“>íD5!£I .Iç¶,#ϸ�¹Úâüóïž?-K`y'WüK¢+_³yÁàY'C#’[[-t‡zÑ 1Õ`fsŠ%ËJ~õÌ¥o¢¿'ÁÆŽïñšëcüz¯‡¡‡B´ û�[Ò¬êŸfQ ©U‚W÷ÁGÞb�=�}–ÁéàÂ}ZB×RX•|óg^Z}+8GwÇèmE"izYÓëahâ(Í�Oîïâç�À†«!軸­ÈÎÿvÀ.ØJ€E'hz:àí»ŠŒç’6ŽàP‚D#!¤·S£-Es&90ò×_cûеEÚ³Ùl¸ ü'$ø¼°óÛ7e†Ï~-ÞgOsÓÚnF¦2ìñ ;o’¼í5ÂA.þi¹Í±¿0åšàvÁú«áÛŸ+òÅ{ŽòÅÝã„Ãy>þÎ¯Ú 깫¾N’õ"À9JxçRøÒG%ßÞ�âÆµ°~0±e‰ÿwÔ—ç°æ«Á‡ßÂÂNÏZT;ì5 üO�ÿðY§Ô¯ €†uOC€:§!@�Ó ÎiPç4¨sÔ9 ꜆uNC€:§!@�Ó Îù·ÕJ\k%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:45:47+00:00%NbtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MGA.png000066400000000000000000000010011520501070600172760ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<xPLTEÿÿÿÿþþÿòñüJ@ü:.ü>3ü=2ûJ@û:.û>3û=2ÿI@ÿ8.ÿ=3ÿ<2þòñìN@ë>/ëB3ëA3þþþïöò!ƒG w6z:z9íöò ˆH}7€;:îöò†G{7~;~:‡G|7;~:óÔbKGDˆH pHYs Ö Ö�oyœtIMEæ£Ò¡TqIDATXÃíÍG‚P@ÁÁH‚dI÷¿!7ø³˜ V½¾@‹¸xr8žÎ ! ø—àê¡…D·øn¡�ç+y[¸ƒT²O^”ZPÕMÛYhAÿ~£…Ló²Zì%ØÞqlÎÇú%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:34+00:00=1Ã_IEND®B`‚qalculate-qt-5.11.0/data/flags/MKD.png000066400000000000000000000031611520501070600173160ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<}PLTEÝ6ï—ýÜÿêÿçÿæö¸Ý8ÒÑàEþáÔ àFò¢ýÝÿéúÌåcÙ$ûÏÔ ßEò¡ÿèþãð›Ú(Ô ô¯ùÇãXÓì„þàî�Ø ãUÿå÷¿áMÓÛ-üÖ×Õö¹ö¶ßBÒî‘üØéxÖåbô­Ý7ûÒçlÕÖøÃÿäÛ/ñ�å`èpþâð—Ù&ßCøÄÓØúËþßíŒØÔó©÷¼àJÓê}ýÛë€×áOõ³Þ?ûÓétÕÕ ÿíÜ5ä]í‰ûÐæiÔ ñŸÛ,ØùÊ׿eó¨úÊÒ÷½âSÜ1Ù"ÖÔ ÓÿëíŠýÚýÙõµò¤çiØ!ë�ÿÿÿA®ìbKGD~?¸As pHYs Ý Ý~tIMEæ£Ò¡T·IDAThÞÕ™W[ê0€+MµGhÜDq�{áÞŠ{oDTÜ[ÿû)=Œî¦çÉsrÍ—ï}»Ò †É²±€“��Û˜kÏ4±çB‚&9Ù kËb>/¿ Éj@QqžyÂ’Òt#PZb.œW\$§ Â‚ü<žªeår\QYeš±º¥âQMµixUe–ãËËÂi2¢�JÕÖÕ›¥l`SÑlƒYl}]-ÒÂ'4pcS³ñm€NW*Øå4 mnjÄšø´€Zàw«aÖ6O2xÚ ZÝ-hã%jdkh7JÜÑ™¼ª¨³ÃH´½Á†ôð2•À]Ý^ýÌ^_ò!`}FQÝ]™ÓWá*ÔÓÛ§{`êôëÇôõö ¼J@©¸Ý^ ÚÄ0`ÔÈà€^C@©€††Gtò�މ�6Õ1BÆxM…öŒkZ'ć€�Ðy[Æ üد# P@E“Í )ñüДffÇd2Åë Èðô̬VÈ\c¢¶qN+÷ìÌ46ÇÈšw.¨#—^ZT×,8çS- ñ†2¼¼²ªJX.2Z ¨Ú­®,c"¼‰€Tàõ�MeõVB`Kytsc]ì{ð¦R´½³+Ï÷üçßSÜÝÙF¤x‰ûòN·ê€CùÐÁ{°1žH@¢€¶=’Ö‘ïùïiÆiÔïÓK»J®à­ùýù9´8ƒÐƒ8³7ÄéÄS¾RƒÐ‚þÿþ7³6»åº1´3/´1N¾Oçöçt�5r2 µýÿýé)9é(9é+;÷²¸þøù÷«±ê(9ê&7íCRüãåüåçò{…ê-=ê%6ñr~ÿüüùÃÈîSaê'8ê):÷®´þóôõ˜ ì8Gê%7ê&8ì@OüàâûÛÞñlxê*:ñnzÿûûøµ»íHW÷©°ýìîó‰’ë1Bì=MüÝàúÏÓï^kñlwö§®ì?Nô‰“ò}‡ê*;ì:Iê'9›�ŒíbKGD hÐôV pHYs : :ðd’JtIMEæ£Ò¡T€IDATXÃí•WWÛ@……éK`�hD1`zzE±(k ¦÷ÞùѸ&‘liGŽôÝ'ïî¹÷;š�S”.]ºþ?…„h›o 5hK Ó6?<""\Ë|CdTT¤¦5ŠF(ZËü˜X„bc´Ë7ÄÅ#§a��S Úå'&¹I‰ŠL_àJNIuRS’˜¨¯p¥¥#·ÒÓ˜¨o`edfyY™pe‹ÎÎñr²i¸K€ÉE^å2ª¡è¼| ?�((ü.PQq‰PR\$<+,P`KËÊ+L«ýV¥à ¢¼¬”UþlUµ�d®®’Ì—»–©©…ä×Ö0Òùò]D×Õ7�âêëd›V¾M›š[äó[š›�Áœ½ÚÚÖ.ßÞÖJzćÆttvIåwuvŸù%³ÆîžÀù=ÝF–h‡Œ º·¯ß?¾¿¯2’@³ˆ4‰óMƒ ‰vìа0)ñ¶ ûÔúÒå�ÒS#êžï° ã‹Ê;*Ä%/Ê9*Ç0,á‚ï¯ ñ·ì¥ ÙiÊ:*ë¤úÑùÑøÌàß}ùÏùÐöÆÑQ$Ç/-í© ß{ï± â…Å+.èšÙjÉ6+ÔZ!úÑÏK%Ì@(Õ]!â†ô¿î¬ ÍC(æ“î« ÎF'×bÌ?)á„Õ\!öÅôÀÜtÚlë¢øËË<)Ä(/Öa úÓêŸÃ#0å�è˜â‡Æ/-ÏJ&Å,.ÌA(ÑP$ÐN$ÑR$È5+Æ.-÷Êï¯ õÄ÷Éò¸ÝuÓW"öÆó»î­ ôÁÌB(ñ´ É7+ë£Ö` ÔY"È4+Ë=)È4,ÔY!ÎG'ò·äŽÒR#ÑO$É5+íª ×eä‹åŽÅ).à�øÊÒR$ð´ Ûpóºß~ÓX"ÏH&ÝvÞxõÁøÍáƒÔX"ä�ÝwõÃØgéžÖ_ ð³ öÄé�ÜsÊ<)ÎG&ó½ô¾ì¤ úÔÆ,.÷ÈÍC'ÖaØfÇ2,ÿÿÿ耀bKGD¼JÒâï pHYsììu85tIMEæ£Ò¡TIDAThÞíÙëSQpÔ®¬/TÝZXÂRÖGhâFî�ÐȵPKÍ¡eX`e¢…˜ÙKK³,{hiï·=ÿ¹6™©A¿ð¥{?Ä™ÙæîÌÎ�{Ï=‡ËŠDÑF\|†(#!>.êÇF1@ €Å+€HJÆ;DJjš# =#S*ËZ·èòìrã& €P(iÕfuîÚ)@ ¶lUååk´Ø @§gô…騖@ŠŠK¶0&!(-KÛ¾..�aGùNc…WS%ËîbÌ»×&2@Ë ÷X,°×º àØjLqMÀì[Ól¶ýÌ*€«‘Y€Šx{žã÷”këêKш†‰ôAÈJ�ŠÆ&@|³úP-;ÜbOm�¼…($mGÚ›Žºª�¹�‘¥UèìÒ1ún½ôxViä�AP„Hâ1Ð=½'Nz VG€Ö"Dß)oQÿé3Âe±øÄýÂH†€ª I÷Y_cá97Ižw^H �äÀ°W‚à‚BýÕð”¼k2ê>‘Çn†¼x %Àä%€­�Ù(@]6 M©1`TÌóãü• Ïû¯b¨®…t�&(\׳í8):³;Ò8AC�EØ‚7'…Ø‚0Ey|=ÊZ¿ˆò`IBžPÜ‚íÖ€ìö(ÀxA ÃѶbãôÌ,ß,ËÁB{P™s÷ÞÀ\½“åÒÀÈýÝóqlÃGƒ�sÎ?~R™»`®±¦Ûšé\X„óô–R¼e©ÆåaÈ™Ûpä@p¢N·üü¥d˜—~œë©4ÿO£«½gïýÓzìµÎ&<°«ú¿Å—{+]«€–Ñ* e´ h­ZF«€–Ñ* e´ h­ZF+ t¹÷ð ­ @ˆ�­(F+�Í"†¶¥óÛÒy1d³\î-h¥ò\ ¹ä]�#wuŽ —ô\ërïhA—aL"BDb„·Š[þ½ÛklÿÎŽq憷sžõ䙎¢o‰üî”jï¶ÚxÆ·0¾E€DRô­£“õw¶�uÕºj w¶�½2Y¿H‡°8E¡êžW=@@¨>âíX3 ÁΦY [éßžo}üt'”†Ò�Ÿî|ý|«­ôâ€ëšf ¸vÍ\}ÄCu£xõ @,³…Ø}Û‡oyKÍ<Ê‘ {†‘,~©uê¶ÞÏÝÖû¹/µL!Yô °YPŽt×Ìßþòßlœ-Ĉ¥šf¤°ë³ÕY‰¢ù¦¶‰ow­«Ïû®Ý;][ð,"@(aëC£�ïL­9“I÷NÖÁÓŠÚp}¢t`ëù�mSµ,'ó‰�l’ª˜ãª‘ÌûÖ‰L*bè;ïoñ„ ¾E \Í�AnÑÄ< n�B5Ž÷ÚT]›ã=Ò·ñølmAWõ @ÕéI/Äc@|eÙþÆdñÌL-l?Ã,f¿Tض~#€“ÏZ±„o .ÝáY[2gçã¾g‘¥åÒ?¬‚BOó‰1l±ÑBdi_èL6©"®¥”ñÝÊšúµ¯þѶ>þÀTv–l‡‰´ÖDàˆ{&› Y€Eâf6"6¦pƒ4İñ¬¯mñ+Ž˜…åH‰bf”‹�ì¹cow*åŸïÿëúx²>ž|nÿ_¡RÞÛÝóÈž;P.2³"µ€B ùçkFŒg‰a9¥…ƒ˜`4ßÚ>öwW|½stÚ·f<;ïÙD�»‘1:M¼ðÍËŽÆâ÷^¿ÇÓÚˆtÔ5žÍÍ}å³;¿µã†GsØÓË%wkŽ—÷µ�ÿCÏÀ4f9�©á0óZˆ$�[sóº©-Í3»ÖÌ|õñÂLp+;Û71ñCgìÞ @1+fvï}cè,ïlß·²ÔNŠZíZ3·¥yfߺ©Ãã� 5퇃„Zbå§úÛ×ÇËϵäæãV´â  ´ÞÑÖ  è¹Û[;ÂDrukÇ¿½yÀ޶®£}oSpÍ,6¹ùø5Ç”*ÄZb•Áœ�0Qˆ€™ñRä¡w·‚M[²ÇÓK‹)‘ u�C™™®ú5ŒÅ´øGWýš‹™™ u�Xb!ZŽwn>~÷ëWÁp<â‚L¨q:d "}‹m_„†‹IÛ2Aæ2—ά˜såR[ºþÓSÛÒuÙr)ð¸@LDDL¸XLû¤ü¢o…j>á°X‚—2ž6P –CŽc1ûÀD>ËDéH, ¹ˆ@:c¢ñ|€Å¬Å×…ïj­¡XbI ›N5 "1Û9°÷«1Û959öÖȹþ±¡²?æ'FîºÆ^j&‹R¬¢¶Ý71 ær>Ëîni¿v݆mk[‹žûı_–<—(tBá"@1k#¥ÜÜTqþî7ìÛº½1‘š-Îÿlj7{åÿÝwüá=b±B¶f‹•¯õOûÞ¶©ûÿèæ;¯ú|C<9]È{F?ýÖÑRnŽâ)ŤM¸1(ÄRƒ1•’•Hmjhª‰Ä’NÄV*¢¬ŽºÆ7}fC]ã}¿øÉ �[¿|ÅÕW4µ˜ùFŸš}îÔ»GÏ�þÞÍ_=?7Ý;Ðw~nº¢}Oëy·’«”f&üB‘qˆÕYX€$F×Äâ�íýÊžÍ=�u�XÒÆœ™üíųsÅùž–õ£¹ÌÆúµ››êb Rh®T˜ž8;;ÙZSûÁØÅºxrçú�] k?^@äÜÜôá�>¸ÿÅgs¥±’pгðA Þÿ½ŽºF-†ôMÁôqÄù`ü¢§õºt�šSi¹4w<Ÿ%ÂHvÎVª§yýâx#²Ð|…(â sÓ��Ý'�ðj×K ‹Y— ÎLî¿æz#ÂÌAždzšRé†DR±ª‰F$rÀˆ‰ÙµÔÔ¶ÖÔ-¦…4O 2"Lô§?~rpì‚åDLh·éˉœï�'R»;·xÚg¦ ç$"#b±r”ÅÄD¤Å¦ÁÄŽ²sb‘,�xZÛJ=zô…¼|ÐJÕ�‘ÿ€c6µ¶<·�ëÚ7È7šèãÊŠ–&Ïh‹yF«Kn¸t€ÚhE¬˜ŸzýWÿ|äù–ƦéBa6©C,V1ÜÊM›{&¾ûýÞ�¾o|Æ7ÚbœFDê6Æ7Æfu¨ÿÄ¡þ6+ß}É.$ P�û�¾÷à3½}ßýþM›{àV…yŠð,H lÛo|x.—ùÉŸÝSôÜ'ŽÊWJ ‰TÒ‰2�´1�»1ÑÇýcïÏ^³v]WÃÚt$ÆÄy·üÞè…Ÿ�|G&†�òaÙ�…Ú ó&M$ž÷õkwÿaÇfOû«’çæ*eq”bâˆewÖ7îhëZ_Ûðü©wÿòùŽØØÚþ/üçû¶nÎξ5Á ¦"±l±�Í熳³#¹¹Ý�[v´uu767%kâN@Ñ­LÎçú§Çß|õ\ÿûãC¾[+‰UÍpUU Z²*ˆÈÏ…ç€eÃqleð´Ï…ç€íÀv˜Yª�ÿ7]žÇ¤ˆˆ8åh ‘X¼ °"æHŒ£ñÅß«éS+Т–>è¤}ú÷Ë«•òÕzõûj¥<$_±Z´ŒV-£U@ËhÐ2Z´ŒV-£U@ËhÐ2Z´Œþˆ ‘'=ÿ<%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:43:26+00:00õ‚ ØIEND®B`‚qalculate-qt-5.11.0/data/flags/MRO.png000066400000000000000000000027671520501070600173530ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<§PLTEb3d2c2\6Q�#Z7«¤b3a3d2è»]6A{&ÿÇe2^5`4Y8“šÿÉc3n-´§Ú¶Å® ɯ ȯ ôÀÿÅÛ¶c3_4Á¬ ÿÐÿÈÿÄ_5q�ýÃ!o,k.P'øC1»ª’ñ uG½¦ËSÆÌÐ*ë!b�ù„1UŽ(Øâ^ñxIVþ˜é´"—¸çói1Z„@ýôÉ©¾ÇŸ>cð7' dÏžòÕœ½ €òs—V}ëÅËW˜¡T~õò…åW©ûZ^G£$°™Z…ú®õf6ÏòÀ»>@@̾±\ŸVj3‘ªø—©x¬ÖEMO5æÞ¾“D戢ÃDéÝû9CõLÚUÃë»<Ð?Ô*Uê™*÷旊ťŅy�«¦G«•ÚG¬³ #’>V£J=ŸçV}Ô÷hð±6®Kë¾ý À3®ZX5 ~Áó‚ɬÖªî' bè.aÏsÜðü _Y�é{ïÿÌHP'øC1»ª’ñ uG½¦ËSÆÌÐ*ë!b�ù„1UŽ(Øâ^ñxIVþ˜é´"—¸çói1Z„@ýôÉ©¾ÇŸ>cð7' dÏžòÕœ½ €òs—V}ëÅËW˜¡T~õò…åW©ûZ^G£$°™Z…ú®õf6ÏòÀ»>@@̾±\ŸVj3‘ªø—©x¬ÖEMO5æÞ¾“D戢ÃDéÝû9CõLÚUÃë»<Ð?Ô*Uê™*÷旊ťŅy�«¦G«•ÚG¬³ #’>V£J=ŸçV}Ô÷hð±6®Kë¾ý À3®ZX5 ~Áó‚ɬÖªî' bè.aÏsÜðü _Y�é{ïÿÌH=¿¼¾•9®±�÷Q2ù°E£´¯SQ†xè[ÄG$[‚1!•+Và€P<™ÖJ?õÿËOþ]@@@@� |5x].•áï%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:45+00:00‘ƒÁòtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MUR.png000066400000000000000000000007011520501070600173430ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<0PLTEê(9ì(9Ñ'?3!g m mn66`ã¿ ÿÖÿÕàÏ «G¥R¥QÿÿÿŒDËùbKGDºÙ pHYsttÞfxtIMEæ£Ò¡TTIDATHÇíËA €0Áµ€,ÔB-` µP XÀ°€4T�MHÉÍ â7&‰Y¢HT‰EJHx «D“è›Ä.%$¼‰Sâ’¸¥„„ÏÂ'ÎÀì€OÜÅ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:40+00:00ûîUtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MVR.png000066400000000000000000000013141520501070600173450ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<¢PLTEÒ4Ó4Ô4Ï4¼5¹50e9r9q9€::~:}8|7<;|8€=*“Z`¯„�ŧ›Í²u¹”+”[~:~98še Ï¶çóíþÿþËå×c°‡�Q€>}9‚@s¸“èóíÿÿÿùüúŒÅ¦ŠLŠÄ¤ûýü÷ûùu¹•ÇãÔ_®ƒæòìÕêß‹MŸÎµ~;ŠÄ¥ª–ëbKGD&Z˜µ pHYsgŸÒRtIMEæ£Ò¡TíIDATXÃí— ‚0 EA–¶*⊠`q_î5õ2cç;8“w€¾´i“´Õb†a¦FÝúmËÖÂj×ÄouW§c}Þƒi;ž¯�çØf�Àõ…¾Û|�TRt{0A?„ÃÑx2Å"ÏæÉb¹Zcv�fù†¶E©RL¢lWÑþHX’óЍRôã ѱü¿ž ˜U'%P98]®)L Â„èv0�|ÑXáâö„ÿ,€>Éèk høR/v?(×膃o™Þô߀ǖ:š ¿ðñþÁ¡†a˜ox©©hYíâsm%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:27+00:00ÀsÙ\tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MWK.png000066400000000000000000000026361520501070600173470ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÎPLTE#$\A Š d� ~ } c‹ @ - h ¨v ¯ | ¥Ž §i .L^¡ � Ÿ ’ ‰ ¢ x ž „ ]MF z ¬ y r Œ fs z G > l ª{ KUŠ ? ¥œ ‡ w 8 #� £ q ±!n • Pe2 * *b� S%3 X²! … Æ%Í&Ï&4 t ˜ u – É%Ñ'Ð&Î&N[À#©o D Ì&« ‚ J!m `› H a/ ® Z(Ñ&. C Ò'R"… ƒ Ñ&”C+3�53ž5ÿÿÿðÄbKGD™Ö6¨ pHYsttÞfxtIMEæ£Ò¡TsIDATXÃí”ÙWQ€/9’Rb€ ±©3Hl `B!²$*àÂè(’¢†»å’J”¶ü¹Í9½´`u¦—î÷rϹçÞï{ù�ÿœkMHss3÷:‡ ;—Û‚Þàµòo¶Þj´p¹ Ö#í·…"qGg—DÒÕÙ!–vóï Ôߕݓ+”*uOo†õõö¨UJ…×ô7Ê/ЊîëôRƒ‘o„BÌÄ7>�êu„È,hˆ¾ÿ!i±Šˆ67Èl(:`“pâ!²ZÈA{ý~GûcŧÑ4„Ê\ÈðHSÓÈ0â’¡C&£ó©¢«Ý]¯ß£õúÆü�`èÙx8òí. üc>èÌSg ê•HɘybÒ=≤mzÚ–LÄÁ”{rÂ#¥o´.}$‰Ï¨ù˜Y;shÊ—Îd³™´/…Î�ð¬ÖŒñÕ3ø‹\�¼U7¿@iîœÇµ¸TXÎi²Ë…¥E—'缤æuDž¹ŸCö*,Ý+ƒŽxž·Z(~Ga•—�;Wº- =É|sÌâ%ypm=‘ ‹7²ÅÈnˆÃ¹ÄúZP^ÂÇ‚¯Ê”ssk{g7ó“Ÿ.dvw¶·6�TYdêGöôûþ@ÈÒ¿øéBú8Bÿ¾þ5ÓµôFy¨>ÒƒDé¤Xƒ“RkŽÔ‡Ê·Ìü§»˜ÕJ��ƒh¥P“JœŸQV;eà¼3:£ˆ½Z%U±š¨ÈjÕþ>ê4˜ÎQŽó�þêá\ ½'è';¿•”¯»H¥°rù’>jsqYþ# Â2 È2000ÿ&ð‘eÀ'–ŸY|a€€€ø+¾É+-GréQW%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:33+00:00ø–ýÑtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of MalawiÓA¾IEND®B`‚qalculate-qt-5.11.0/data/flags/MXN.png000066400000000000000000000047431520501070600173540ustar00rootroot00000000000000‰PNG  IHDRp@šóægAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs Ý Ý~tIMEæ£Ò¡T­IDATxÚíÙëo[åÀñï9Çw;Ž�›ãØIܧ¡%I›–4½Ð‰r©([ÑØØ&.i욊¶›¶wÓÞl“&M›`š6¤M ±AÅE…”µiJ“4mC®�sµ;¾ÄwŸ½ª´Ë›Ò™�Ï_ðû=_=Çö±Ä÷k|�H’ÄKOþˆGï®õ(ÿeã•ã\}懠}¡Ž ¹ÖènŽPpz@Áé§œPpz@Áé§œPpz@Áé§œPpz@Áé§Ü—>`±�§X(ðÅúýÖ1Ôz€ÏK.µÎÜÈ»$æGÑ$™*ZC;éèÛƒÝÕPëñn™/]ÀüfŠr.EdnŒ‘ã¿'ŸLa¬B,YÀlþ;mÁÛé=ò]»bµ×ÕzÜ›&|@U­�I­àtyÉD—˜?ó¢s—qyÛhßq�Øì±éiV7Š|šÎ³#s�åÄCÑ%�>‰Ñd®õ 7Eð€WÎS.l`”æßû3W>>I*W 5>ÃÔr K�‹&�ƒt¦ÊB&KI6ðñX˜ùÅß±™Jsè‰g…Ž(ø—‰l6N&›"¿~«2Mk‡»Ã�QÓètk,ÍNQ(•±[$ dU¥ž2ñÈ:oþõ�ŒžxµÖKÜÁBsS©R$?�fÝ ÷Èã þ*F»“¥”L$]%›ÓÈåJ¸œ6ŠUªU »¢±™JóÑ«"±ºXë5n˜ð½Þ­ìz £ç0áÂmdU7›‰5ªšLv=…ZTY_N³´©â¬³bÔTê&êhpÙX Ïrñäkµ^ㆠù¨UËdWN€Å�½±�õØÓK“4ï%›Ñ˜½ˆ¦Vˆçˬf+Ê*¾æ:œf™O3­J±¬’ÏPU•OÞ;N׾ôw…j½Úg&è ”�$‰ÈÚe.pqümÜ>úv¡”ŠÐ`,ÑdÓµš©3B¦"aW4ü™x:Kx5A"‘BÑÊhÕ áÅEâ±h­—º!BÞ@I6`÷ÁXc#±„šKãó„Pdg[ˆªÑDr3Ïj^¢Îfæ6§ wk3�{S;�ÉU"�‘*)I •ržLb½ÖkÝ¡‹9 Š,£IP.ç¨s6³i¶1ñÖó{Ü8]}¤ ]ŒŽŸ §J„:\túy{8ÌÖÌî}wqàèwpn¹gk;§‹ÕÕiNŸùçÎÿ“B1[뵯‹�PI’pÕ7Q*n`ª&‘]ÔÐAŽŸ>‡eknÅÈbÌ®ûèù˜?7‚šKlkÅ–R)Dˆ—d*H¬ÍÏòâÏŸãþo?Í]G§PV‘­Œ&¦’ƒÁ„ß· £QŒ·3B”e…�¡nL› æÀdæ‚§�cœ¢=²Äó‡ïa×–ƒh§ßÀæ}ëчðìœa¿ÝÅz,Î/rŒõ\ ¯¯5:O<ºÁk/þŠÙ©)|òY0›ÍP,2Ô»‡PhŠ,ÄшÀÞ´sr“H¦Šß™£§ÝÏî#+^8÷ ÅÄ×$õ™<“ñ8NG¡f·•§¾w?±Ù÷é9ðg‡—ˆ¯¬âlj!àóãRWèÚ1@¡´Éôâ"M-Û°8|µ^÷º °ªÁbd�ñ‹§Ø;øƒ»�òÛo=Âðü/œæ�«“¼f¯£1e5�Æ,Éô55H�p_Ç$±®vb©Ó ܹkçSL¬F8�Lb¯:�mnN¼ùk®L}ÈÞÁoàk¿³Öë^7a*Š‘@G?óW/°¼ödù�w€ìÀ1z¸@À·I±1|þ8Š"ÑØNCcÙ`ªõšŸ‰Pk ~–å5ÎŽ¼NµZ%ÔÿM~¶­…åÂ&¿˜Ë2“K3(E)e5ޱ‚¿½Êû‰6^˜Xåëuî b±:8ñþKŒŽ¿E«§‹­Ý?E¶¸k½Þg&ÄùÿZVèìègKg/‘èæÄ)¶:2 YæxÚg¦Ýéc"ÝÀrÁŽE2°žµà6¹yÊgç{$ ‘ðiR©5üm=ôn;„Íê¬õZ7D¸x�Ï{;�÷úI-½Ãz*Éô™·ÈåÒ4š¯Ðµ}/SmÌFc4–5œ­-Üá©çò¥—™Y¾„Ò½�-‡öÆÑÔ‹ÅlÄx÷ù¿„ (Ë 6› k׈…Y¾tŠXJ.»†²B�eOûOŸHšbÑ4o�KÎïä“‹{¨Ÿ9†Ï­£:e2Ù0vpðP>o´³nãLžýGÁ^–|¿ã�D+PÑr+•Uþ÷ù³?8L‹H³«sÃvqùí”b“笄`o»ŸõÛg°eO)]}Æ£ÍÂïÕiœ;„’Žnß;ÚUDrX¾wÎ!‘–õµýŸÁI;€.:;È�¿º‰†ÙÃÉ¿éö½~õè|Ö¾VMÏ€9Ys¦â­,š…"äQ†–ªËC(BÒÞSxTšä4…l‘ýB$«œ”H`å…m¬ºù”–DÁÄâ*÷?~?}p!<@2Ï ¬c´ CÁW�`NÍaþ¹§d✠qîMÒÞãŸ|ïG碳ÇËè¸ó¤‹HiIÌP9îÀ²i0e�VœdÕÍ( Ä&�Žh|÷Þ3øÅštCM«À@4®±biMµØ¸» �,œ3ŒC3ùÓóõH‹æ òésß⎚¦a!0úûé\yºKŸ¶ˆòŸÆ” ™óGùñW_§´dÂø€a(üè7�Üõǘ–8®ñSa\’|_ÂTé*à{×máŠo’¡‘-ÿ³…ÖÎ"~ûÔ\öwùhí(âºK[‰ë*%¾öùÝ|ås»Ù±?À¾ ŸŠ’q®¼h?�s‡øá¯‰'´)j 9!h )@rÉù�ɩޣÿ‰—jÙ¶¯$mC$­�Eܽ¦�ÿÿÞK|áÂ6~õÈ|:z¼œ³¸�›VîÄ¡%óׯ؉+ߤý@!W­x“k/mÅ�—àê–O°³-0eã+n —^DQ�iÛÅ ‘Éj ¾8ëV¯¥iþPrº' ÕøÌÍËY÷zõ1*ýcµsä�-X¾¤‹o‰²@„ÃãNü^ý˜×�†\ø<:‡Fó¸ºå\Ö®¯…#§‡8‚DRSàåo¤¦6€ÌÍÒA0«rŒºÊÐQá?Øçag[Ò0@¾ËdÞ¬ü�˜®�itõ{XýÈ|¾ýåmø}ú»6ã÷ÅÑu…{žÏþ®BÔ‘ï2q9MBaûºüÄâjúßF€Ð4PT„M—Å2v€Úòq¼úQÐÑãcä°+­¨ CáìÆƒ¬X¤®r è E‘Ç÷! Š×|v/×_ÞŠ"$Á>/Ϭ¯â±¿ÏÂ0ìÆO†Œk€€?†ªÉ£``8ÝHo™¦`W[€]mÅ<øÔ.<ë—]ÐÁÇô£iÖ ƒˆ¦Yùblzã}¡Žµë«éìñNN 3AJ�†–™Ké’*ÌŽDO(HH»ŒH$‚àA|öTÂQÕ3Æ™]}8­ë»û=Üûè|þòr ᘓdU‘©ÆÐ]×ÿ/–�‹ÀŒ u=J%x ” ÄMµ¨« ±âœ —/ë iÞšËz{Vq<$Ìžu˜ß¶¼ÈæÖSøÓsõ¬]_MWŸÓÊĈ+æðskqµ­”±ô×U\η­UyJ˜|—A8¦wIÀ�gpÞâ^.XÒMei˜Ž/;öð{ã¬X$ßu|/ˆÆ5ž~­Š±°Ÿ[çüææÔŒòì†*^ÜRA$®e0–“RHJ²#:€¤£ÇËÐh•eáÉ•¿ú™c”—Dhë.äxI\q]åÅͼðz%†¡`X‚B·Î/n]O~ž™ú˜c£@~žÁXØÉ wžE(ìÀ¡Yhš…ªÈ‰µ‡Ì¾�ÄÌ Aé#9ÐïaÇ›*ËÃÉ�-¡¢4ÌǤ­Ûωª8ÓDbÚDk‚|§Á×oáÊ‹ö³§£ˆñˆÆâ†ÁÔÇ%É×›w•RèѹúSûsñ­{š‰'TFf5HªqÅé¢à´&ܹŠô@L×xòåþûã6T‡äsÿÕÎ#«;aH!§frëU;X~æn¿o¿z6·_»…ÅdO›ŸÚŠ öy˜W?ÊÞ·üÜñ@W­x“Ë/hgp4�Ÿýn!†9•.ÑÊʘõ‡jkŠsËÁ™ð×Wkع¿•…ó%Õ@ Î;£—‹Ï ²fÝ©¤#)B²üÌnL >}Ó…ì ú)/ ³¤a€]ûйå®3¹÷¶W0-…î<‹U7m ¹a�Ñ�“ÛV7óÐs§rÙ²–5w³ncÕ”F°Pª×‹ðxI_>úp‘±þ%�ô¹¹{M ]™ Ïyy&ß¼z³«FIg¿¯¦J¶î-ᇿndoÐOrÈ! ò ¾ùËf^ÙZNÏ ›î~7/m©à¶{šñ¹uλۋùþýMìn/FS§^ÃÛ5ô§˜¢*Yó\=xföۉׂ�ÌæÎ72#9¡$ …Þ!7R¦É’†~Vÿùtž~­š˜®òf°�}ÁBâ •'_®åÿž˜Ç’†Ró~ÓtxH¤)B½�PlªO0¥ €HÜÁwVŸAEi˜åguO¦‚‹Ï r¯|…›W}l¢(|w‰%%ÞHÀW Ó;èæáçë'Ž*ìj+&a¨@rÛöÝ-àÒe¸ó“µÆÔ·” Œáaz[ZPm¼-<£ÕÀG"¨-ãî[6pñ¹ÁÔAP`ûž?x ‰µë«‰Æ¼›Z—:Rà2p9MFBy“Jáy‹z0L…W·—O øbDâÑx¦S¾wö½œ1îã *l,©‚E-S½X£ãy<¿±i N¯!¿À 3J£¬8»‹¦yCH ¡ˆƒX\ðRw 4Eâs'ÐTI$¦Õ�žAŒ†\ôÊ'žHíÚ�H\Ã4O¼ã(�Þ{ÑùmøÐ±íž é¸;X"P‹¥�¹ö’VÎo(Éè�zØ÷–ŸýÆÂLS0u°}_ ¯n›1-»|3ís9!îãI*ÛT:ÉðïH.‡ICý0ç�ÑKsó*Bø½:N‡IÂPÉcï[E¼¶}¯l-§³Ç‹a½ÿB¬DP¡EùMÙ&*µ¨mƒ¦ÕR¤fšbá)HàÎ7P ÝP�h„£Ž‰›D¦²Š7]}”ÔTúyáá+©­*Ì AÓIʨ¦%w2:î:⬜ÈçÙ/»„¦á¬š‰VU”í®d�÷ìöðÉXðA]Ò¶ARhҶψ�˜(É=�6F[©¾‘í>dKJa7Ñûïa°¨À¶’°ØúÁ�Ïï Ù¯D²‹f×éOŽ$šÍ€íÑT_a¶û�#‹ˆñM›r!ÀÆ)íZÿæ€Üƒ"mOÎlŽ6úøÙîCŽ,"þ©9r5€�Ѥad»9²H®°9šÝWÃìŽyìñ\ `crB�ÍÉÕ6'ç6G oÞœí>äÈ"b›¯0WØÍKïÉ\9>œh™>X%LJ‹Ü–0›#úWÝ•ó“‚lNN°99°99°9ÿ6 �ÆÔ‰n×%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:31+00:00o ìøtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/MZN.png000066400000000000000000000057341520501070600173570ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæÔÕ‘Â ¦IDATxÚíš{pTÕÇ?çÞ»ï̓$›Å$BD|D©8´Z)µb§¥µS:*ƒ‚–±*­­h[iÕ2Œ ‚:Ö©¶µVíÔZµŠO TGgTÔ* ²Éæ¹Iv“}ßsúÇ&!HÞîݽ{¾÷÷=¿ßïñ›Y«Î*"èu€RX_ô ÑÜUÓ[¢ìËqÒèµ�öõŒ94€ÙÁ0kߨËw>kA— Äh_ÖØA|˜;Sh ¢6�§¦ùx䌓huÙ,K:hÝO¤WZråÇ ¬Þ¾�SZ:AX¡p¬Ñz¿è¾ßçÚY÷ú^.Þׂ¦°,é¢õõ¦)ÃqVý{?Ë߯%+aZÑpŒÐúû@ �'erÍAîÚQͤ֘%Â1@èÃn÷™·¿•{ßø/îoµÜè(£ å S¦´Æ¸kG5×|Ä�²,éhÑ“†é`¦/—æ±éœbj²�Vªz„ )ºQ"S/\²¯…u¯ïeN }´¯ÿKϰèF ÁŒ–NVoßÇ•7àLK+U!ò ÃNV�ÖÏOÊgËÙVCo$Œ(ºQ ©XøY3kߨË9Á° Ã䈀Lª*T4vp϶}\¾» ›ÕÐ2GdA_DS�ÐÏL-àÁŠ"šÝvË’áˆ# 7R€]*®ØÝÄ=Ûöqzc‡ ƒpT# 7ºR¼¶œ]Äó“ò15aECŒL€î»z�3{¯1<ó•ɤó²Á”£ýŸÿ¯¾Rà˜ QåÎŒò@?H¥è˜u*ù¿¼WÅt„=Ã=AÙµÐTåðØî@B�ýÎÇh+Ö’½r)Ñsg�VÒšn(ÐÜ’ [ª8ð£©È¨ÖçD«e"�,¡gÞ”åvñrŽä±Dm*�>ÆeRdR%�T`/‹ã˜2ÏcyúA Eףʌq@&˜ed!èš.4 K0/*1R°!^Ïç*9Úc0ªhƒ}¨#x+æ¡x-2…wf=ÇDÏ1ñÌŒô›îš‘“(žK¶ð¯T;g^²…~è\-@×4æ;ò¹Ï;• m¹c:Œ€WSm¼›Ž°3ÕNµŒSã�ñÀì¢K6ÏyaÚŸ,$<š¨§Q¥H*‰Wè,u‘+túËyLStw¹Ëx4QÏã‰F¢Êíñ8îô)€Ž`—ÙÁêØd—Ð𠯤[y7¥X @JpLëä3+¯ïIòp*ˆ�…Ž–8Æ“5Ààw#Qd �åÎbÊu›bµÔÈÄh�Éqå ]>!„TŠÍ±ZdÆŸOÕ<üÄUÂ;E�üvK 'Ã)Sà±­inÛ[M(©8C÷ðs×N×=ò‹S{?>£ÈXÝ%¶|J5'÷ż™�ö¸7ć¹3•°+„]‚(›Û‚< �g¬Î)åW6ù«ªÙ¸»•7ß�Éáé`N© M.•¢�‰ºÙ£d¯_Ñ*©¡’»½Ž Y¥x$ä©dquâm l¾$ù‹ëñL�±u»âÏ뺲;üâFÅ¢óë0eÛÔ$³íð‡'áÕpé�<Øqå+Æaw0wî\N;í4***¨¬¬d÷îÝL›6�¶¶6æÏŸÏž={Ø´ù~n™{1¹#³.ú^�ŸM¢`I=ã.kÂ=3‚áO’ª³¾Ü#%x\l§ñX²T “ÇôrL?ëJ \�Ôýz"áóP)Ñga%tEºÉFúb»ñ- â>«ƒ¶Ú|D/cQ¦ÂQ^Šoå2®˜s•J"ÆøàC?C�VN"þO¦»9Ðâ¥Ê´?W@¢Ú…½$‘ùE×:ƒ"ëëÇu¸*¦gºt@­‘i#«”þæE ¦PR€™ÙE1î²& –&0 <(yâWáï5a•¹£G´s´+”)°'ð-¯#gA ÂPŒñ }2ì�YƒÒOžsÃøoà:³³—Y|‘£+€áPä.lÆ·¬›?SXôÏQ@™›?‰oY¹ ›{ê‹�9rºìÅ]Ñ�ÿæîîÍZÖ\;$ŽL•IYs´à[^‡½8iÝõÃdÄ(S`¤(XdÜeMhni þ™Rà:µ“›xç„®âX ›á �i‘ýÍ o¨ÅQšÈÜõVŠ9b†.€è9iò¯ª'oQ#š×´,ç(0$”)p–Ç(¼1@Ö×Ú2²e9G…�èÚá–}Q+…7p–Ç-Ë9Êô/€hÞ4y‹É¿ª=DzœcAßë¦ÀQ§ð†Z²¿Ërއ е¸ž5·�›8§G3oYÎ1ã ²Wï~I£ mYÎqÀzõîkÉYÊôî­Á?.žÙaü7Y½ûÑÀÈýn3¾ëê°—X�´ÑàU¬_àÎ@kÉ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:55+00:00])ÁltEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/NAD.png000066400000000000000000000050031520501070600173020ustar00rootroot00000000000000‰PNG  IHDR`@jVåYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs Ö Ö�oyœtIMEæÔÕ‘ÂòIDATxÚí›{TTÇÀ¿™;÷îƒåýQ|Å*„�U£mŒ1&V4i<©=±õÄT«é©Ç‚G#˜Dm¬�'zâ£k45m“¨ÁŠÑB´š¢E·¾Yºïû˜ék»,, ,|ÿíì}œùío¾oæÎ^©+Áƒã°¢P¨³ŽÕÿ“¬´A}B p÷‹¼òEÙ²±kñ:¤£;Òþ�Á’ÉÉXúܪ¹ã0‡€YmËþT³íŒxÞ:>È)ŽTcNL‰ß±bZÒ (g»)7ßðÛ,Çe= Òñ)@ ÅY±tòªôñ@˜Åvûëj>úñ„„…1YnÕe}PCq¶¯x)yP´³Ý’›oX”í¸¤çBƒ�Aké´ÄCMÆCqBÛ€¦u€BŒþ@„1#L�C!@ððÛÇ®Å)0,ÊòFœ�=¤Ã(¦"O0E@"ý"jÓR.0»€È1ЍÈ#äiæó>O°b¶ƒBW,�üÝ'ó“ESÅb3,|çSÒ¥$, ”zqÔ2 À.2È44®B6ù©ˆ á…ae«_<€G©CЪÄäþ·˜D#ŽÃ @ª1'�-Þ;ß9¬À’›_–2ݸyÔ!�ÚqŽ9D BÀìùâÍ¿Îøi±½68eêðËCúUî[.ƒtþ–Ó˶¥ÄU€CÅ=b@-‰3¯}ÄÁ0–�uBßbÆ»;1‚á«Y;sdÉÒ´S’9öîËÇ@Ô‚ÊíêÂå[ûÇÕýñÀÄ;f?ž—Á™¡Ap¦ŒÑ:KbRÜ¡œ×fMæl7çæ_›¾ÐtøˆEñê7 „YmÌj _ô븽ëÝ%iŒyjW�J‹æ»[QO�¾•–ô}þÕ>)+çQ†dŠ^I¹m6× eUa ‡ƒÄ�Ÿ­}=êRõC‡1ÈÆõ�„˜�þ? nªB@e²äùGè,úØâ›½*êlxaëÉóÆ�êgÐðÒÕê�ß&}\�¼jêñØ�»‘q剽«†ÅTek0#"· ¦G7ÇiÔ_B¨ÅÊ$9ü­ÙÑï¿ 50J]Æúªd@éªÍ(€�žZýÆ=›ºvÃ{�  ò_ägýmìì­3Ϯܜ4ø6h!sûCe§q(Ô[: NN†ÿÏF;›ÿSUºàÄF—€(CD/_ë=bMúÙ5}x4õš1¸jÃ:à@¬s–  0‚Œ_�4ÙU³>N+ݸiãþ§²ö?‡uïét 8À ³pgÖ™� H¨…Ç cðœéÿ:¥�ÍœrâÕ çÅzN ³ cÈYÚã—/~9åâÚ¯Æ�ƒ­ á¶Ï³‰3ï™fÅÁ~ÚvG©­k"NQuÙœ¼uçËÿ êa×Iš!`¨TÍ3rãBë�ðü°2°Ï5ª1IÁ|“póº1èÈ’�ï=&ÿj¬$òˆ£m¨ù+NFáŽì3»@‘ymˆLe…5—ƒbLá‚uÖœ_zm\ „ù‚h?•¨q„~|<@t ©¢ÞÒä«“ž¾ª¿2w÷Ôã0/{¾þèØŒÓHN�èý»4ˆ1˜ÖÛT¿ÿìÙƒç†Ì[D8j“x›D4‚Ì4í1¨µj0†ŠÿõGGç~ŸpåNÅs:�Mœ§¸bŒ¡ÊÚÀÏï„|ž7rÆÄÓ§œÒÇNHº¦˜1áMRb`‡¢ë½~s'vÙjòA^ÏfÕ�Sœ‡ç¹¹&$ 44¶r÷œƒ3G\\¼2ð@8*)˜2DR(rÈ„ eÛ¿IºQ´gîÁô±Å€@ÐÚ=¤ó¸VU„Ùìôž9ü­Ù‹ú9é0È8³#õÓôó•¥¼64§e@1Y&~Z[Ñò­ê^òÚYG-þ•õ3A |Å*†Æi™*Lþ:?á7ÛÓþ¾`„À–ù_NS,šµna)ôxWU5Bߘ~‡·Åäd`�U— ß?7; ` Z‰Ê®~O—eÞ¹ÎÈœvlÜÀy—âK ‘ƒ£Œ'¯ÄêV¿˜72Þ æ•ë5A›¿I=raÀ¢‰§/V„Ç™žŒ/� 0ÏÙõRU]"Š«JË᮵IÆ15Î8^¡i�q¼êÌ8g•Nv�¦@Àa†•î連pO÷Á›{7ýÔ‡ÿLÝpl”Uä0…âg‡ê?˜yDà”€…™`Sb v¨Õ¢]ä›e�jŽÓì˜jî« E #ÄßÂaæàè�èjPCˆŸmPd;¹t*qÓñ' ô}Bƒm Àà˜ªKå‚JeÎ�N[ªÚ1…bYF*�=¹ÏíÕ;Æ­Ø;xY?íXâÐÊ}…à N'^¬ˆp>º¤�¥¼ì<«ée:w©ò�³·” ÷·¤ïžú�o“„ “XïÿÙÙ'"ü-—ãù¨êóW↿³ !¢\L »¢8­Ä¢j •aœ¿UV0ðò—%Ív$B‰è,úÛáúÛH%6ÔuÅiÐ�÷æqƒ]�&›1ö£‰]¨T¹‰Vì‹5´£ ß§-€<Œ.�q- _§ýù˜8í È'Åi7@¾*N;òmq¼äóâ´P7§�€º�8­ÔÝÄi n(ާ€º­8êÎâ´¨Gw€zÄq ¨Gw€zÄq ¨Gw€zÄi�b²ƒªG×€F$ÇmY6%õ‰ççqšv�)0ê̻㠈1èj{U��|×\™ùçêM{°Jè§@¥C&ÛKõ\H@»ŠóÞÛ íÂâ<"Þ¬ aÁLöê�®^ªÜB‚à%(Uîyþ‚t3á»â4ÔÖðmq¼Ô Äi; n"N›!²Ñ¨< &çþ yP\}åõ¼µ>&Në!ÄD ( _üzôš%X£…*™…»Þ-ü‹ï‰ÓJ@οÝG†öÎɘ2ž…KwoÍ:š}îVÒaŸçAüGl± öÚË%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:51+00:00©fåIEND®B`‚qalculate-qt-5.11.0/data/flags/NGN.png000066400000000000000000000006011520501070600173210ustar00rootroot00000000000000‰PNG  IHDR€@ øbLgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE‡Q…NZ²�þÿþÿÿÿucšßbKGD�hÙQ pHYsììu85tIMEæÔÕ‘Â5IDATXÃíÌ1 °¯<à ø×„��¹D@’FíÛ8+S�@ �@ ~ Æm�¨="œ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:15+00:006¡¤¨tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/NIO.png000066400000000000000000000025601520501070600173320ustar00rootroot00000000000000‰PNG  IHDRk@* yËgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<mPLTEgÆiÇ]Â]Á^éÊë©ÊêªËìªÌð«ÍóªÌîÿÿÿÿöÐÿï½ÿ÷ÒÿÿöûýþûüýûýÿøøñðêËíå¼üþÿñìÑòçÀòîÕìã¸ëá³÷õéýÿÿûøìîã´÷òÜýü÷ÿÿþÓáÀÿÿýþýúóëÈñç¾öñØôíÍòêÄüúñþÿÿãëÔ™ÛÛíâ°þþýÿþýç×’üúðþ÷é°ÝÑ™çÿþþüíá¬ú÷êþýùòéÄùõãþþþÔëØŸéü«éùÓëØûùïìàªôìÌüõâªÁ¤“°¦�¯£“¯¥©Â¥ðç¿õïÔïä·ùôâýýÿµ¹ƒ{¦®�Éà�»Ò�Îæ|¥­òêÆýüøìá¬ûùîýýü×ÛÐzµÐ¤òÿžÛìÔ@FªÜí òÿz´Ððç½ùöçÿÿ𔵬¤ãî§æãžåíªÉÄ¡ßç¥ç䔳«ÿÿîîâ±üúòüúóÑʵ€¦iÈãd­ÕhÃßq¯ÚaÃàu±×gÉäc�©pÐÊ¿ÿþþýøî‹™~й1ÉÚÉÙÚÞµÒÌÙ­Ò´Ö“Æ-’¯�ÿüèú÷èüûõ½Ê…}¯0�Ã0‹½<›¿@—ÁC’ºS‚µO„²Vu¨X‡µKw¥H³½•üûöõð݆‘ww‹”yŽ”~”£qŒ©x•±u“¼s�µ{’´sˆªxŠ¥w‡¥{„~öñÚ÷óßüùòýùëüøíýùìþúëÿúéýùéþúéüùíú÷íùõäëߦìߨóëÉéÛŸùöæêÜ¡ôíÎóêÇíá­ñè¿ýûõùøòñëÎñìÐóïØëâ´èÞ©îçÂúú÷ÿÿôÿûÞÿøÔÿúÙ«Íò«Ìð^JÄbKGD ×ÄÀtIMEæÔÕ‘ÂIDATXÃc`£`Œ‚Q0 FÁˆŒô Läf&2t1°’ØXYÙ989X¹ØØHÕÊÀMàáåãæ']ƒI@PHXDTL\BRLJZFV�4ͤúKN^A‘[IY…[UM]ƒT‘¤ZISK›[‡[WOHjë«ÐÌ.Cn#cnnS3Snsn% Kn%ZùËÊÚ†ÛЖÛÎÞÁÞ‘ÛÖ�ÛÉÙ�Fþ2äÖrá64àvus÷ðôrå6Pâöö!Åc$…¡¯·Š?w@`PpHh·¿!·O­ì �ˆäŽâŽŽ‰�‹OHLв�’Íi†JÜ)ÎÜJ:©ié™YÙ9é¹y:ÜÜù$xŒ™*Eq—”–•WTVU×pGÕ’ ›ÄthnÀ]WßÐØÔÜÒÚÖÞÑÙÅm`E#»”¸»{¸{ûú'Lœ4yÊÔiÓgÌäžÕM«´³çÌ�7ÁÂE‹—,]¶|ÅJÒ4“f—ªÕkÖ®[¿fÃÆM›6nÚ¼e+)É�$»”¸}¶¡lw¡]¥Ä½cç.nîZ%` ܵ{IV‘ZÎsïÝ·?Ì<à“lCšU$ו²¥¤;rôØñ²¤é%¹®‚“§NsŸ9“GºFÒÛ6l\g9YÏ�å ¹iÃJN›�™ˆ˜Éh³Ñ³-: FÁ(£`Œ‚ ¾Ã+œ4ý#%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:48:47+00:00mzóIEND®B`‚qalculate-qt-5.11.0/data/flags/NLG.png000066400000000000000000000006111520501070600173200ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE®(®)⯳ÿÿÿ°½Ö"GŒ!F‹±~cbKGD Lò pHYsttÞfxtIMEæÔÕ‘Â7IDATHÇíËA ±µP XÀB-`ÿÐp¿³ù$}¥B¬;d0f‡qBÜ�Á`w�d;…Ë�%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:01+00:00D€%tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/NOK.png000066400000000000000000000010561520501070600173330ustar00rootroot00000000000000‰PNG  IHDRX@©Î@ðgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<EPLTEï+-ï)+ñEFýåæÿÿÿàåíBz&g(hñEGï(*ñCEýååó[]ýèéýééÿüüâæîâçîÅÎÝ?x'g+j éfJbKGD�hÙQ pHYs¨¨Û;tIMEæÔՑ¬IDATXÃíÕYÂ0 EQ·iÒ�6éþ—Ê DJFøñîÎOb›¨Z×+­�uþœ³Fkuèè 0`À€ß'ª !–p CÇŠújaœJxCÏŠTµ8-%¼LQ±"Ýîf÷ >ÞáõØ4[·”/pNÛjØ‘m—vmO–¹vÙßÊŽy¡?`±Çûnb"6ÒbKHlmŠ-z±Óô{W0`À€þøÎ7ýP,ƒ¸%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:13+00:00Uq‘’tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/NPR.png000066400000000000000000000060301520501070600173400ustar00rootroot00000000000000‰PNG  IHDR1@³âŸxgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs!!K»”6tIMEæÔÕ‘Â ÃIDAThÞÍšypUÕÇ?çÜûÖ¼—ä…�¢#‹B.¨D‘¥ŽD�NÇ:í •©mgêRǬN;ök‡EHƧµÅ™Žhk«vÆeFA‘© A� ²� Ë#ow9ýã&/yÙò›I&É;çÞû¹ßó=¿ßýݪ¶*œhžª�(íñÉ/ë!¨Úªt¥( ¡e@½Õ³?g䆑 ˜hÆy¢ñצ›ÜÀZÿ6¥Ù‘U[�¯1@WŠU±SÔ„÷²±å…VºÄSÀëÀ퀞3ÆB ÀB0ÁL𛦃loøˆE‰0uˆ]À6àš�1#;ÿb;<ÌOžcKÃÇ<Ñx€+ŒXÄFàßÀý@^ÌÙÓ-ù¶ÁúÈQjÂ{X=�GYÓAlþÌ˹Ì0W¬x*d§¹³õyÊÄÑ …`¼•bq"ÌÔL”S®<í‚ ðu@€+V8_gÞuÙß�GÙ¬ŽÕSÞËÏã—�xÇø«¸ÌÆï@á,±‰fœGšjÙÖð ãÏo3þàê�Q„D{ذ Íø¿m<@¹ ‚xÇø÷qŒ?(ˆö°Ø÷EŽRsvk¢'ñ(«ÄàeàÆ�†éÓØý…BPb¥¸%fJ&J½+ 5ê¾Ê6ãû€#@QãI‰ÎÑnü5±zjÂ{Ø9B��žâ㯴ì„PeØÐaür3Îc�µl Ä‚DµÄ+8ÆŸšr a. D{´aò[>æñÆZ&šñ ˆ‡pŒ¿'¿tÀŒ5ˆöpŒŸaC¤Žš³{Xí¿ÄNã?d˜0C3¶R ûçWJ­$·$˜lt3¾'ãÛøÝ!”èΡiMCŸ0ßÍsBà�;ãØi„Ç –Õ'ˆŽ¢2a±“ 9îÓB_ Ü4'p¬5$AÕ65Åhe×™÷)Qi”ǃJ¦:FØ6² HáÃ÷ ¤ pÇr¬Æv,Njÿ—¤þ÷ñÿîE¸]Õ5Ð5T*“s2‰ÂB²ÏWÂ΢JöùJPÈVP/ŽçLàÓd®:ø—UažiÃî™Wã›?‹ü{V’·r1² €>¡וðλót2χyö¼£ˆeã½ñ:¤×ƒu¡DnA)€IfŒ%ñ0EVšãî|OTºo~$�¯c0ªä,l•Îàž1•¼7ƒm�­@B�mÀ=}r—™¡kþê^<³+�»nÛhÇ“ÿ“U¨dšÞüe!(´3Ü©£:¼‡Û£õ¸•5£ÍøæfÀø¹Jd(HÑãÈ>޲, 7¬Ã3«é÷ö²(°š#X�Š· ðÝõ–³ô A™•dq"Ìd#F½; 5j¾mÆ÷0@ãçn1š$¹¯ûbŒÒžÄ7v4�,ô¡¥@ø½`+Šÿøkw,#öú{¨tºßeЮŠWYÜ=IÍÙ=¬�Ô‘o§'‚ø=°¸�~2~·ÝIÅS¨Xœà�nÿtú„bôñ¡œµÝM ]â]ð=ü‹æ�x{-Û_ÓêsNOªØæ'Îs]º™sº_|çÊ» Äj ¬M•HOªtßb¥t¶N— ÿâ¹h%Eý^ŒÌó£�+$}ðk.<þ;„2,<×OsrA?‘Üû9yãð±!t…ñ)‹9© T%ÏÕ\œtK,!W•8[q¸¤g!À0Ií?HæàQd~½8„ðzrO–10¾9EdÇ?hþC æ‰3ÃÈ Çø·ÄÃL2¢Ô»ƒZ“曉S»qJýdN²o%Q]·EËFäyqWLÁsÃtô+Ë.«é"FÝqÒµG1Ã��÷À`µ‘ N»òx©p»ó'Ó*= ÔÀŸû‡p޶�R !œ²D)EJhØRÁ‹Ï ©¦p2þŽÐ z‹ú€f @“9xø8¯œ— §‘rσÃM)âRG¢°þ�Aôó |áGu¨%4@Y@ë¨�¨ì7† ¡¿²x¸ù+4¥¨U` iâômwãè7* K x”ͦ–CT‡*<¦�ë�O�7F`ؽ€”›BV·ûµìÀ|I3”´Ú­°ë ²±¥]ÙeÀv`]vÐöžðŒ©r~y^ôò’nï ò@Ë‘QéB� ®Ø6¾›n ð—÷"\m+Ѷ‘Á<„Û•y¨åð¨‚ô aÛﺕ‚�w;%‡¦X»ŒÀÚ¥¸¦MB&ž93·ùAd(?G‘ÑéÓØÊV(Û¦xóC¸§M"þæøÏE+* °n9îS÷äXçšPñdǼN ;C•e¦�ÛÛ>~- r‰ÌÞ¢½ì6M0MÌÓ äß{;y+oF åP°~B—Ÿ—ô燱£q”e#4 šDÙ*¤:TYfŒH.„á÷PðÓ5È F}m\&èZQAv¨ v4ò„ÏC`Ýrôò´â±Ýï’®­CI9* ¹T<‰q*LÉ£ë‘?Ê´œ»ÛGø—Ìÿ´ ¤ ¶ûŒg²Šv]Z#Òýê„ þ懴<ÿW”a:=¤þ35 R�úôMÏTc·Æº´j:@6¶Áå˜ý.‘Ùs!(ËBèéuXç›~$©ý_b'’ÙÒ½ËÇ]AJÛ@î.H§'»ã}.ü?\DÑc÷Q¸éÇèx¾Î†Ï¬éø—ÎCÂ:ׄ‰v¦£˜�jD!øÂ[°…XŒÓÆ< ©�Ù¡„ává¾æ*Ü“�]hÝ pæ»®šˆûÚkÐÆö&XOŠlŽ"JDOâKÄIî«%öŸ0N|‡wV2Ï7°#)EôÕwh|ô9Z_zóT¸Ï›p)Éõ„„Àüî£¶Ú BÐa|kVLäOofc?z‚Ë«7 ¹=Ðü( Š9œÔ훰ΜÆó¯î⽜³ */KJðKâ"Y�•Î߯™JÊíëÜÚô Ý¹ƒ!ÊJì¢'q/]ÆSÿñ)e7êAéD½¾¨ö#Ÿâ**¦nî Öfc�=ÅÀ¨a üêµ§yöéÇxgÇIò>ºH}�+ÐX�Bw"%h’˜X K2Dzny:éØpnÚÄ•¼|¼•U¢"‰ÉœEÂÚlbæfp½Þ ïiË{5éùÔë÷9Àç×8}þ&gcŸ�ºøûÛxjÞhÖg¿È„•ËpììåBhq|KŒé°ã½>í^»mžžÅzµ¦ÎÉÖ]§Øw°$Гz«Z9>kÁXÖ/O'½+Žï-SX£"õ n¶î<žü^&„îr¼¡;Œ¯!jË¿ºSRvÜ2)Á¯}­f2p§Ñßc6¨÷ý¦„ðþ�4ûE ù%‘Ñf–/ÿµt<~�9�§pàã‹=fŸ`èk_!8²ÍjÛ¹k/õyñVÞF‰´`��Aâ‹+±Î™ŽÁÙòq¯OãÈÉ2*nÛyni:ŽG‚"gNc[ný¢LLV8vì¡f_>ÞªjÔè¨û׌Ûãåè™rÞÙ~’¼Cq´g ô¨0þûæðʯ zÌuÍŠ‰íz£”Íç'ç༠ƒùïÿL +¨Ý½_U RÓhÈ/@66½h^‹sŒªÂ¼Œaí6Hk�ÇUxŠš¼ƒx]n¢3g¡DXˆY4ëœ{àói|t¼”}½@VæhÄ#Öpº¼øä N—>[Áð0!‚¤~ÑL´—0hH"·o5  ‘Râ¹ãë~cšÛAÊŽMÐÐC' tžæÒª—Ð\mFK8#wl&2cr§žë:æÇ²J;sŸ}‡²òºîK˜5m·j奘î¸|ì×gÌ£1ÌŒsÐP~³ã GN”é›PíGOèS ®¢b¤_»·‚¤_ÃUTh+­ûEŠ8«\hž;ú4¶€Â³åD[Œü(ÝDòþ÷q•0¬¡�Ê¥ßbó¾Ï(<[®k`Jœ8¥KôÎ7‚ôkÈÆÆÿ·É„0(�a¦ÛM‘ÜÖ›2¨t)À¯1iÒ~;Ù�òö&´l`ÝigΔé¾&Q5·G׿Lݲ±±S;ÆÎ™!Ñi”º‡‚£ÃV§ Çw_Àê´§¯M(Ðõõ(t²C@ý�……øúØãl¸deÃ%+W{œ…Ã@ÑG¢vý!:‚Ål¤èZ-w”Qq³€ïTؘ;m³—Ç««=âdü8ýÖðèQ@Ç)à¦bá{Ö¹T*ºØžJ¤&ïÆ(¤D(�¡©ƒ›².£¶ÝSwoí{×"Pá�Œ›·.Wˆ¦µO;*.%Á<ÀRS·oÒ­òÍÛÀ?ÿå}"&öC,éiºmMU.Ô7>�j×WæTpôˆD®ßlÀ¤©BµÎœÖ¡t5 J@ñ­A `IOÓ5QiG ? Òõ•H 3©¼²v:›·Ÿâ\qEP‚Wêó¯îj×¥”hš$>ÆÂ’ù£ùÆÌ¨m’65·{A!õû¡9]H)1&%¿8KÆP”@ï~ÐH'¿<¤¹=4ì?„­ ¿Ã‰PÔÄxâ–/Â4>�ƒ'ËÉÍ/¡¦Ö‰bíWס÷·s�BÖ R2tP,óÃl�Œå\qe ã(�;lmF}/çì#*w÷0hñ¼Q¬øf3' ºÇùšÛƒýp!U؉½ _ƒ cbñKùôŽy#¹•÷Ïe¥·«-·í-¢’•YS‡`l*G1‡µ`6Âd¢êÝ�Ø¢9\ÔîÈ%fq&S³—bÌÍ–ÝçÈÍ/éØaPœg20‡i°y‚/)IÏÚ¥éD¸l¤„K 99¬™4ƒ‘ßIÇ�”È_N\çÃ×ѴΩÀ@“¯£î{5U&&.‚ì%�ñæOñÊ·g�:$£jhq¼íоøÅ[ÜÚø?¸‹JPãbHZó Iÿò*ÆgðÆžK¼¾ñ#��½h�å7©Ý•‡ôùîi0aT‰[¹„°A)¼±©€Ÿo<Ä…kÕ$ÄZÐ/ ƒ"PÂL„�Nì’DL�æöpçJ)Žc§pþõ0ƒ¤ƒ«f�¹d>ÕÀõÊ<o �Ý ðÀzvM2~L2Kæ�æDÑ�à¯#„Àál$:*œgSÃñÁŸ±>NTÙÒ&ã”7‚݇.ãìB^ãýq€ÖÉ–óFó½ÕS˜1ipKOlv|ëïo°cìŸDâê,"W.£HF³%§ˆÜüê뜠ICû-T Gƒ›­9gØwèÂ}v(æp¢>‰uvÆ=vTn~cn>#²°qå2Ö/ŸÀ–ÝçØ—_ܰæ1WJf§%°bBÜcÆÖànr„ÚhÐèõóç¼Ï¨±�ä×cÇVr‘°þýØæëÏÏ~ 4­Kuº+€îp|s"†Ô:n™|¶¾— Áb6a6¡&s³£}¤œ8BƤÁÿÛ¨€_Óh°yЂµ§00ÆDİ�œûÁ?2Â[Ï0‹Šªðy»V†Ú­ŽJå[e(õ´¤$9ÑÊO¾?‹qÞZ¯”’ðùqÏ—ð¯Ë–áNKÁ›žÎ¦½%äü¥8hñ 5L%}\ oUÔóÛ½ç™2&‰—²“: ŠË×jº4•‰ø©ÿ&ÍIå¥g§¶ÛññY ˆ\¹Œs2º©A?¿ëø5h0¯†uA°míÎËÿœ:›»c-&aø�8þiá`æžÿׇ‡Ð¼>,©C¨^±Š_^6�÷ÉU|¾NŒz!̤’’ÅÕòZÐ$HHîgÅï—TÕ8º6|°å&¦õÇd¼»³T�?'£Ù’Ó¦'éuŒ¤áíUÏ�=ë~šKM­³ý�(àji ?ÎiäOkf3¤ð>·ÃÔÉüWi8¹ÏwîNã—p§ÑÇÕÒš»L@åm;wOµ:�úø„�-?ôjÇ·¥‹B¨Û—OÒs°hfj:±bKŒ'åN�ßZA}ÂRo]a¤¢t_fQÛçiÇXºÝØ >¥úÝ�Ø ÑìŒÉI$®^JäÊ¥Aq|³¹ŠdÓ+@ Ž"Qš*Õ¡ªu@Ñsg`/(¤êÝ�8>>FíîÿÛ = ’’Y“R=f ¯o=Çå#üpédž™Ìæý—q8tÊ2 jIÞj¶ïmr¼fºp‰k³¹?€ßåü�Üüâ®õxˆº•UÚqV¹¸),hŠrÏi˜"Â1U¹ˆ¨´ãtuâÒæC„°nåd†ŠC"HŸŒx}4¢ ûÖ<üe ]­)ª�² ß}óååu àµß�dîãC‰0q8<|U Œù±ÔÜP �)Å`À˜”€0©«sö¶AØ?G˜M$ÄYÐNH}œ�ú8!ôqBèI$º]…{!ô"#MDFšzT!ôšÆÂY©,œ•Èìí!Bè!„Qå©qq<5.aì¹[ú¡ïÐ A«Si Æ0îö ˆá‹ëµ-'¡Bè7+„ RcaMV:ƒ#<5u ìEôÇïð‹gžáÆ-áñ±\wh¼—[Dm½>7–CÐ!¨³y8]\Áâ¬á¤]>‹cÿ<•ÕL/-#sú$ŠÓñþñ«Ôéø æ!è„”’£'JY[ZÃ�–Í`i­íZà‹"•‘©üï üçÆTWÙuÍ´-õÄ P}ÛNÁ;„™0NÁ<8ÂL\±S}[_çChУ�ùÃ#°ÔÅsø… ̾UÌüØòºvÙ¿„F=‘’ä„HÆOMåmóx^Þv‘—·]ämóxÆOM%9!Rw4e‡Ð):0–”þÑ|rêúÝ�¢ðÄ”Á|QÑ@é�:]“XCè 4yÿU¯ýNBS@Oð G÷Ю  �@'$€>NH}œ�ú8!ôqþ™ènÞ.ùK%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:52:59+00:00š‰«tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/OMR.png000066400000000000000000000024071520501070600173420ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÈPLTEÛÛß26ûãäÿÿÿÛÛÞ,1ÛÜ"çadèknÝ"'ÛèilãKOäQUøÕÖúÞÞçcgÛåTWõ¾Àî�’ï–˜Ý!&Ý %ô¹»ð� ÜÚë�ì‚„æ^büééÛî’•ôº¼÷ÎÏÞ+0á;?õ¿ÀõÁÃá>CÚäRV÷ÌÍéqt뀃úÞßúßßì…ˆÞ).Þ*.Ü$í��ô·¹ñ¨ªûääò­®í‹ŽÜ#Þ*/Þ(,ó´µöÆÇöÄÅöÅÆï™›øÏÐøÐÑøÓÔøÎÏègjùÙÚùÕÖî’”åW[샆ôµ·ë~�åWZñ¡£ùØÙùÖ×à8<âCGäPTäSWá:>á=AâDHêx{Ûá=Bá>Bò©ª÷ÉÊöÃÄöÇÈ÷ÈÊøÑÒõÁÂô¹ºõ¼½êy|Þ',êtwøÔÕúÝÞó±²÷ÍÎèhkß/4ãJNò¬®çaeúÜÝèmqêwzúÝÝ섇Ü!솈úàáêz}ò¨ªçcfãIMõÀÁäMQûâãÿþþÞ+/î‘“ë{~Þ-1æ_bÞßÜÒ—7�<ÝÁ#s€€s�@$ !bKGD�hÙQ pHYs¯¯^‘tIMEæÔÕ‘ÂäIDAThÞc`À ™˜Yh �X!62²"8tu;�ääâæZÎÁÎFwðòñ320  ³20òóñÒÝ"¢bLŒ œâ’@[ÅDEèîV)iY9y9Yi)Vú'BE%.e F.%E‘�ÈRªjêšZÚêjªRôϬ¬¬:ºzú†FÆúzº:@.}ÀfÂÎnjfnaÉle-mckÇÎnÂFO°Ú;8:9»p»º¹ z¸{š;;9:سÒÓ¦N^ÞÞ>¾~ªÎŽþ�AÁ!^N¦ôtƒlhXxDdT´„ªjL¬¤­FT\¨,]Óc|BbRrJjZzF&0A2}!kV¶ƒsŽW®³j^~¼*¢k6±-,*ö²)Ѱ)-ã`¥¿€vÅ–WTV‰ˆTU×ÔÊ@uÌÈS'¶˜U¶V¨Ž‡‘Þ‰¬wm€=+Gƒk}¤�ÐØ¤Ù �yÖfͦF¨ZXZi  6¶µwt2"¥‡ÎŽö6Vp ÕÅG[µ1–“‘÷@3rÆBX:4 £`Œ‚Q0 FÁ(£€èî¡- `}o_ÿÚ˜8iò”©40múš‚QŒ:`Ô£uÀ¨F0ê€Q ¸”Û²½Hœ»%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:10+00:00d™‹tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Oman{ß¶ IEND®B`‚qalculate-qt-5.11.0/data/flags/PAB.png000066400000000000000000000020021520501070600172760ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<>PLTEÿÿÿúâç×-LÒ2Ò4þþÿÒá쀩Éó÷ú;z¬ÉÛè]šˆ®ÍQ’Þéñ�³Ðƒ«Ë†­Ì„¬Ë-p¦P’öùû�¼Õf N�R“ÎÞêI„²S“Q“îóøz¥ÇX—Ñàì_›“¶ÑT”ùûüM†´M�b��²ÏÕâíb�:y«ÁÕå¢ÀØlœÁæîôßéñ÷úüûãç×+KÑ 1àêòàìóßÓÞØD`g fŸ9v¨O‘ÿþþ÷ÕÛ鈚ýôõÜGcöÍÔÕ@ê� ùáå떦鋜ê�žéŒ�Ú:Xý÷øî£±×,LÑ /Ñ 1Ñ 2Ò3öÑØßUoÒ5üïñè‚•Ó;÷ÔÚÕ#Dìš©Ò3Ò6þùúàXqÑ .Ö&G딤ø×ÝÜFbôÅÎ卑åvŠûçëþøù1b>�bKGDˆH pHYs$é$éP$çøtIMEæÔՑ‡IDATXÃíÕÇRÂP€á �P¥÷¢¢¨  -ôz'*Å÷Ͱ׹3œ…cþÍÍ*ßäœ;„ð’H +Ì÷‹€`20 — , T©” €Z£QƒZŠÒ:½Áh4™iÚl2 zÝÉ‹õ윦)†¡húüÌj‘Í~á`¾s\Øm0;¸¼r €óêjÉ.·0"· ìyÊë¥àó‚¡P0à÷áH4†P, ñĵp\'â0€ìæöøp{#~LDàÉ»{+”ÂêáñéNŠJc•y~LJ°BV/™Ü¡2XQé”ü[ ›r9`àõÈ yP X*A�2A”�¶R­Õê ‚hÔkµj…=9Ðlµ;ÝG’\¯Ûi·š#ꆜðïↃ>ÌFã‰ð“ñjÉә̦`·hN.–Ë9‡Vë ÿöÆoÖ+ à�ÿØ"´ýàß�€Ýþ ‡ýȲŸÇ‡O6 ü’ˆ€ /;sóR; çR%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:28+00:00Ùù‹tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/PEN.png000066400000000000000000000005731520501070600173310ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÙ#Ù!Þ-=úâåÿÿÿÒ˜£ÏbKGD�hÙQ pHYsttÞfxtIMEæÔÕ‘Â/IDATHÇc`@B&.(ÀY‘?Õ0ªaTè†Q £F5ŒjÕ0ªaTÈÑDê�µ©IP%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:38+00:00SÂtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/PGK.png000066400000000000000000000072231520501070600173270ustar00rootroot00000000000000‰PNG  IHDRU@kî;rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEæÔÕ‘Â 3IDATxÚíœ}lUežÇ?ÏsνçÜÞö¶ô¶¥ô:-:h„!ŒÝP0Ž�Mv²CpTÔdÀì$Î:›Å‰ú‡k“]'cfV³qŒk²î›Ë€ëtx›aa†EaU@JßKÛûz^Ÿýã–BÊ}œá›44§çå9_~Ï÷÷ýýžç^ñgÁˆz8¥IñP\G်M±9TÃmzש-‚Që¤Î÷Ì(+Œÿj�ì+Œ1R‚V•¬7«™,u¼«=º¯(Æ‘zsô›CµÌÖÍër�.J*Àd©ó°å>#BðIÔè[——$ («ƒ•¬7£ÔIí«- „Z…Â%�~ðÌ¥þ臽4G<‹-H½Ô¯65yAù¬ó™ü—iô*Eêc­¤Ñ*³9i¿›dkâ4ïÚ#8¨ì.ºVàCÙ�Sÿ:Iõ çŒ@•XË&ŒÔóW>¿v û3u“r!¯ýæƒñ5�æ$ Ïòx#’ÄA劒EkNAg)Å›Öïâ�›FRrÍÏ dHQ¿.MÙLåeÞ6Øè!¥}t^3yŸ›dk¢‹¶GpQ×$±Ê‡Ð�óÜqÓ]@š¥�cyËc—ïðãd—êgPyhWŒ®ìaLõ‘ej,Ó NŸÄ=#3Dû”Ä”ÎÓJñóôþϳتáëšyÅýìXžGÜX¨\@˜—8=’`ƒ� )ü4¸ƒ/Q\‹5¡OÍ 2À£¡(ß V #JŸÄhåŠ`“ȰÂhôI}ª‘:¢¡D¾áÐò· „žyS»Sâô�’j*”ÖI�ÞŸ™ÄöÏ.íN§}‡mÉŽzß5«‰Š |[ tEÕ=“þÔFŸ¤°NJN¿b¤#€V¡çEm°ÁÇhòQã¢ÚC¯ö3áåS”Ì›µ¥Ê.pÈMó‰gѪÔI½´ë‚Ý%I à%�¨Âhñ©Xàb¶øD:ê.�ÿ» Aùli@ú˜†² ·ZE%õ,Nù»�$UR§U3J“Ħø”}ÝC+SÄ÷ë ýWiB¸Ý¥ìF�@­ÊJܤáY.v�Fòc-Áש1åók7IBeŠ…²b &}˦éûIjVYTÝíPÞîŽÊ”ßꎟ-„BSÄ÷ðS…EkÑÕØ …@×uÇ;¶(fS¨†›4£(î ú>›†�)´°ÊdB‚r3n@ä;5ô½iÐõjˆBZô2~òäÉÜ{ï½ãŽu8 ¶ÄOó¯v¬ \ üÌ4­_—Bž%@‘©˜D„Ž¢ú^›ò[Ý‚úE'uΜ9¬[·ŽP(4îø)ßáo’=¼’êgHy¹?X�RÔ®±2Zy±—.4s�Ú4cª_Ðü- ©ÕÕÕ455Q__ϲeËX¸p!·ß~;õõõ455aš&)å³==ÈÓ‰n>ñ¬œ®TÌw)Ÿë¢Ü Hô3Sß™ì}9ÆýyŽ ¡Cù\iäÏGQ4uÑ¢E<óÌ3̘1ƒÚÚZÂá0]]]$ Þ{ï=ž}öYÇ]3Uتáî`Zƒ�AEõ ³ÅË Œ}’�Ó-q‡%ÒP¤ŽiÔ<`l˜ Òx± £Z™"¶/ãg¥¡0[=¬N‰}JãôOBX'e^aW´Dµ`Á^|ñE.\€mÛ¼ôÒK<÷Üs \ôš2!YcTñsUB›07-ÓQ^fÄÁz?)pGZ…´lKP>ÇÍœw±ûHHü^§÷ "‹”Ö �Øî ›RX§%¿0ðbw(?P4KÕÙÙICCwÝuƒƒƒ<þøãœõlfh5 ”-PnæÇ’¸oD ,�Ëü+CŠòyî¹JêK¬‚uJÒ÷¦Éð/ƒ$¯SÞîlô‰íÕ ·» ý2ˆ7$òÇ¢%ª²²2-ZÄ»ï¾Ë“O>ÉÈÈÈXÔ^ÿí$Ø’èâ?.çÄåÎü[��_™µ qñ›é…^™IvÞˆ ÷M¡)£þ¶|¶;VÊæƒ¢Eê”)Sp‡mÛ¶±k×.öíÛGmm-De1ÂaåÑá&±”ÏLÝ$$òhÊPŽ ñ;4�9ÍÃé“hå ¡È„�=ªÐ™*L¹Õ ßfŸ›¤Fê´hÁÜ5j´ãd}®áôH¿Ó‰ÐQ– 4ÓCš Wf:ZéÏ´1™ðÓ]ž´Ì&ñ?:º‰ªØR¿rØJ1S71ó”ƒ1R\Aâ°Žõ©F N¡Géc:©£ú¹ˆTP>×eÒÝ6B‡øÞ@^óøª‘ZUU…aX–uÉs¿uS|îÙÜ D¥–¿V�’›>©1ÒÀúB’þ\Ãé–cÓ_�(ê×§I}¢a4*’ÿ«áæ­YÏ,!­­­èzqúÚË–-céÒ¥—=O;�8ßOœf‡/x׎�à Îü{ÆNA¦o PûçÁzŸ¾·L¼aAÙÍ^^. kR#‘›7o&�…Ô+VpÏ=÷d}þçžÍÝü4=@\ù…yA-³(h4ùê}ÊosiÚ’¤ê.›îŸš¤>Öðâ‚@m~™*ë°›1c÷ß?ï¼ó===9?( rç�wÒØØHYYK–,!™LòÐCáº._|ñ»ví×2¼qå󩎺�…j˜®ó[²ñ35~Õ�6¡6-’IZ'&yD™)‹}+¿91!©---¬\¹Ó4™3gÍÍÍ<ñÄÜqÇxžÇûï¿Ï‘#G²z�ã8ضͣ�>ʼyóÆŽ¿úê«ìÙ³‡-[¶àºîeNœ¾Íc¡–ÊÏÚÏœ`��ôþÜD‹dVÜa‘‘‘ÑÖÀdë?ó›&*˲hooç©§žbÁ‚ÜtÓMÌŸ?Ÿ½{÷òÁL˜h.ÄñãÇÙ±c .¤±±€Ý»w³víZ:”ÓÀÏ(�'�´iFîî`49ù)�ŸçùP½ÜÆhöéû'eå^ÿO©©TŠW^y…þþ~^ýuLÓÄ÷}ž~úi^~ùåÜž4ŠÁÁA�H)Ñ4íK¬lS>Ÿêç¨g±ÑŒÒš�ÈÑÆ¶½Ò§ò›•ßtèÙnâ�ɯþÏê’³ ç`Ûö—й`öìÙtww³jÕ*xàb±·ÜrKÞ÷ó�ì[]ìt@n�%P~›Kí·ÓÔý……^­è|1Dü7zÞ�‘Ë–©º®óüóÏÓÝÝÍk¯½Æš5k˜;w.7n$™LæüÀ¶¶6âñ8���LŸ>Ó49|øpÞÄžEDh|ǜģŠr!³®2Ïî¯Rn¦•ÈÙ>Až¸,©†a0mÚ4Ž;6VÃÏš5‹'N‹Å &¢Ø�ÀÝÁ 6„jøš d/Eܶ^ôÕÔk7h›C5|#¾â/yEÊÔ††’ÉdNݪB1¨<:œ$ŠŒ;0òé䉒’jš&S§NeÓ¦M �Çs²`…ÂB±ßMrÊwhÓM&‰z9 ¤¤VTT°uëV6mÚDkk+ôõõ]�×:|êÙüÖMQ/4kÁ’oR.)©étšÊÊJš››Ù³go½õV‰_çÒP¿r’7–XJ®á---Äb1jjjøì³Ï&¬í¯4àOFÝÁÔ\ÜAøƒÍþ—ÃLÍ`s¨–;eE'á�–T€*¡ñ]³šoU”‰â}T´èš‡™>}:ýýýWœ¤\‘F±ÏMÑå;´éUErEß vóÍ7óÈ#�m… ÔðPü‹=–xNòR[rBQHçm=^¼x1Ë—/§®®î¢¿VqÄKóƒD?KŸ!¥ û¨hQ4uñâŬ^½š@ ÀÒ¥Kikkãí·ß¦¯¯�ÎÎN¶oßNooïÕæ-+h–+x$¥)OwPM¦½½� 6ÐÜÜŒ”’Y³f yã�78|øð-Q �Žz½4�Z€&ÈYŠBªeY|øá‡„Ãa–,Y@oo/k×®å£�>úÊz>ú|—'A@HnÐ ‚9 EKTRJ¦M›Fww7;wî$ måõjaPy¼˜ìãÇÉNûnÖŸ²)©g7¨=øàƒ¬\¹’^x�ööö«ÍKÁpQ¼g�°5qš=nvî hæ?‰`ÆXÃDÓ4ZZZ8~üxÞ{ª®5D¥Æz3Êê`%æÅÂuE•t÷6£4\âk¦®“š'nÕM6‡j™«gAÏ'ñ:© Fê¬7«YeTbž÷5S×I-+Œß3£L•ƒë¤ íç} åuR‹ˆ)2Àá(ÿõ=ýíLC5%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:26+00:00‰Æ¹ÖtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Papua New GuineaBŽ,IEND®B`‚qalculate-qt-5.11.0/data/flags/PHP.png000066400000000000000000000060561520501070600173400ustar00rootroot00000000000000‰PNG  IHDR€@ÒÖgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæÔÕ‘Â ÏIDATxÚí�ipUåÇï¹77Ü$„ *.cëè¸ÌˆŽÚÊL­­Ë´3ÚŽ:ÎtÆÚÍi?ÔqúÅ­�Î8íX—*‹E „€ì‹€� È6IHb $wß×sÞ§ND$¹Á’p~ßî=ëÜ÷žõ}ÏUëwœ”p„-µˆ%`(.”ˆHG(Ãü�𙹬‘¦Ö8(Ž. ”ˆHׇ#-1Þþ°�…ZG²àrT0Üé&­…O÷û™VUdž�íä²–ã†1g  ‹dÚdYMo,ªco]´ GN @,0; h"v €Å‰€ÉœÕM¼»²‘ã'“N|0Ì8ÃÒ1 Š& JïB¢ëQ?ϵlˆðÖâ£,Ù|œX,çÄÄn.@üÓѾi JP¥wb\=”çÔΦ%|²»ƒ×ªêØRÛ�™×Ž[â¸�ÿ‰,+±^òÝàv)¼{wß2†Å›ŽóÖâz¾lŒb»‡!‡mL?Y�¤÷#±  ŠQEãQ¿@�ýC7œÉ±ö³V42gMí¾´m  )ºg:ƒny5ò~Ôè'@§À}9¨¢O²ç«oT׳¼¦�T2ïÄCˆ³Ò@‰,C•ÞÓ™ N6¯Y¿ã$ÓªêØv0€6�ø`(pv@ò Üœ¯-År|°¡…·?� ZÎYú®4´&˜±¬�ù5fœø`�rÁ Û¿ðú¢:Ö~v’LÆtÜ ゠ ‹tÖbÕÖ6^_TÏ®CAÄ)+D]øÂ*×63sy_·&œ²ò `@ÐÅWÍ1þ³ä(U#â´�/*ý*ID¥P|}¯ûZZ¨ÙçgÚÂ:6îj'ŸsÚ΃~€€F·ü<“1&½F1…Ø÷DÚdé–VÞ¬®g_]ØŽ! ý"Ií†l#¬„¢«P#§¢ÊîÏ5Ÿ£ÍŸföª&f¯j¤µ=åÄ„Ñ÷C¾E/:‹d›Á(Ëd@ô·wn­Mçå�™5¯N噟_ÇÈR7Xž\r,‰,E‚s�Ô>$8Ä<µMy®ÆîŽåå…¢ËOlÅ�Àl$}ñ½‰$>=çun»¡‚Y/L¡ú¥{ùñÝp¹”=Éá‚P¸2GÐ'þŠÄ>FrÍH|Ëé�î1(à †P(÷ÛtY:‰g£;^†üɯUä6xøž‰,ýçxç/wpóõvl0ð ˰§@X¨òQ£ŸB‚sQF)’Ú ù¶Î³”žÑ5T๒..éH¾ 1ƒHtjÜŸÁ{[AWUVij�]Ïš×îã…§obü¯íô… @€ÄTÑ$Ôè'Б%€‰}l»3hÏ'̃l#˜Ð {rIâSÐ$¶cì³v³)} O7yÍÄRþõÇ[YõÊ}<õÐdJ¼.'>è' Ït‰¬Dr- 3�ª…Ò)¶YNnG2õ Y{_£å½ JnÉAj?”MÉ£Jî@•?pÎI&½‘ÍiÖí8Á´ªz¶  -§íü]ès(éC�¨Ar-¶ÈŸ°­€r�¹—�#Às5ªü!TѨòŸ‚çê~¹ñ`4Ç‚õÍL_ÚÀÑ–˜“6ž'çWÐqô‰‘P 9÷// Š1Æ?oû~åî§ÛÐQ0*8z<Î;Kx}3ÁPÖi;÷‘žc±�ôAû©7ƒ¶ÿ°’Hr`Ñó¯­@§‘ä®Ói£äÀô!©ý�©/üNuÚŽ+IîF‚ ¸áª‘L{îv–¿üC»ÿJŠ‹ 'mì=?’:©Z$׊(7Ê5 Š&A®rMC*IÕ"áÅ`x!ߎ踽Å{Ês•ý}oXQ´ï50Ê!±¼7Ÿ’ž¡÷Ý6Ž;¾+·¶ñú¢:vÙÁ«3©GÎé$µéxÕþ`”t¦x.Û×gŽ énkªì^[q†•P¥w‚×N¶±ÿ{ /^IÞD†3ø} Ï1@W!å�¢+ (]…X Vöc!HaFáÅóðÏþ€lÃ× ”3ðçÁ�+K6GôãüÓç’Ø¹, Œó˜ÖàjÄBsíB�Î ñ�¨Q�¢Š& .ûXQ$4¿saéÔè_¢*$T‰”¸‘ÈrŒÑO"©ZÐqÔè'û|³©½ñͨ$ºî¬DÒ~â�ÁÿN&”݃„ª�èZŒ±¿G$�*ÿ‰íÛÝcÀ=Þ6ïÆHp�£Ì>¶l*DעʊÌB�y¦àvp¹cm*\¸ŒüÉÇÏ÷#Æ.$¶ W¡Æ=‡èdçÒIöf�Ó×Y*ȵÒY†³]Aj?Xaõâ U|-Œ¸±×«Z±8áekñ¿»€Ìá£ÎÀ÷3�jÄ�¨+^ïí�þ5òG§7šAD§íêžK3ˆÒÉSV@U<†„«Qc~‡ò\ÓëÊcÉ›Äk¶ã{g‰m»Ð¹<Êå˜ú Áytí'»Û7‰mHb¤vÛVÁ=ã²§¡øºo½•�Ó_Á?sáU°¢1牿ÀœG)ø[Ð(F_ƒ$þ:�*¾”Ñûqg�?ÙApÁó—�;Þæøù¢_zªd x®GB Á�ªx¼saHïèdŠÈª øfÎ#}ð0ˆ8?€\´¥abiÛwá{g.ñ-Ÿ¡3gà/eqh¦¾ÿ» /]‹ £ —3‹ç"1 0ýA‚UË Ì­"Ût e(§U{‘�ù:�!º~3þ•$÷­�´n�pa-€É]ûðMŸKtc :•rüü ã‚ ûõ1ï-$T½‚¼/€2 ÇÜBúý5qV8JhÉ*»M[ߨ9_ßøÁÊY1€DWŸ×‹"%—#¶i+¾ésI|^ ¦étê†Ý 3H¸LŸ^›Ú÷%¾™•D×nŠ'œ6íâ;½,:×z‚@e5¡–’;Ñîøù!ˆm\£ì%ÝáêÓ¯‹/›j÷î¿eð­X‚ÈŠuøf- s¸Î^æD÷C[ʃ*²_#¹fP%öT®o˜~1Mâ5;l?¿õst¶³Më<ôC–3b�Ƙø�SC¾íÔ_ƤÕáŸ5ŸÈÊõ˜‘(ÊårŠ9Àþ4 @“o|ÿC‚ó“=ÖêøùaÆ9 A:•&²z#þ™óH8Z;‘ý0älhMbû|ÓçÛ¼ �vڴÙnÈm"ðß÷ }¸3rÚ´—JDÄô -ZA`n™¦{A¥ãç/ ܱÍ[ñ½5›øÖ�ˆeÙAžÃ%Ãÿ<4¥F½%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:37+00:00ã²ütEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of the Philippines/Y¿IEND®B`‚qalculate-qt-5.11.0/data/flags/PKR.png000066400000000000000000000030331520501070600173350ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÿÿÿàèä X7@A@A>F"S2D?Iv\‡¥”:lOB1eG§½°ØâÜMz`E!fŒvâéåõøöZ„l?K(‹¨˜øúù†¤’BF"L)˜²£þþþÇÕÍR0Q/„£‘R1ùúùX‚jA I&ÃÒÊ ¸ª J'>V5T3ÁÑȰĸ‰§–�¡�–°¡áèän“}š³¥ùúúìðî*`A¤»®éîë-bCP.ZƒkÑÜÖýýýr–�FuZóöôÀÐÇU4u˜„ÏÛÕ÷ùøYƒk•°¡#[;l‘|ÈÖÎìñîßçâ=nR+aBæìét—‚]†nÙãÝÖàÚÒÝÖiŽyþÿÿ_‡p2eGñôòçíé9kNQ/i�y[„lB£º­W�i$[;åëèAM+ÍÙÒ[…mS2¦¼¯X7$\<äëç I%5hJðôñЍ—>nRõ÷ö´Ç¼Þæâ X8ûüüY‚j«À´E!îó𪿳 G#`ˆqÞæá5hKÆÕÌ%\<C)_@4gJÏÛÔDsXD a‰r‡¦” H$êðퟌ&]>™³¤×áÛ3fIÍÚÓk�{W7~ž‹Ýåàúûûg�wÚãÞ0dFR0 J&F#K'6hKeŒuãêæ‹©˜ÖáÛÄÓ˻̼ÍÃïóñQe ‚bKGDˆH pHYsttÞfxtIMEæÔՑµIDATXÃí—gwA†'îKX ã–�Œcl£"Ä£Á†Ý€4‚ h¬±%öÞ�½û#Ý¡x²°(“a¿xöýøîœyν3{ïÔU3†ã«" t€ÐZ ¦ƒ`¬5i�cÇÕ™5@Î2¾~‚v)‚’ubÃ$Dq"tÎfw€ÉS sê4X-´5:AÓtå8£y¦‡ÌÌ(Ù�`V‹ t]îÙ­s07·¥ ²8«€y% 1Í , ëI¬ˆ�üaqQ<Äí`ÉRP³ 1 F¯ì/ïPîÉ+V®’}ßjõý)‚? û�nE†\kÖ®s’õë7¬ lTž€aSWëænòaËV‘ €z‚Ä߆‹óîí°cgÃ. Û-Â!bïÞƒK¶À{÷í?p°îP¯ÄGˆí;\ @GŽ6CNÀÇÌ,�Ûy¼Oô�,ß<* x"ëw• §:xž &SYÿ´Úu¯F±Ò™¬FâéD 8Û�´Rtî<ÖP8dpá¢6€ü5àRZÐ�ÿÑd] hùÔ¥B–㊨ _ìd]½F“¤ŠùrMtýF™à ×p²êR‹ÁÅÝì‡ €\ËÌéÖmWIyCwîÞ»ïbä›~NÖ Š=züä©Jê(¹±¥ gÏ_ðX„rN ñàÐËW¯ß¨m@vðú#çp{ïÛwï? |lûô¹ï _%ÈÈ�Ž#äëþöýÇϦá_„×hcžìòïªv›zW£�ñÝ£¶Üc•ÊJy€xÅ‹^ W®@ÑÈÊï Ž\ôú�åË=@~šzB‘X"•ɤ±H¨Ç$øjd!ŽÆ“ét2 ã¿÷ÐÑÈa QDôÏÞ0j@¥Ò:@ü€ßpžˆ¨„EA%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:17+00:00¡>µ�tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Pakistan Ìì&IEND®B`‚qalculate-qt-5.11.0/data/flags/PLN.png000066400000000000000000000005721520501070600173370ustar00rootroot00000000000000‰PNG  IHDRf@zgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÿÿÿûãèà0SÜ:Ü<6î€bKGDˆH pHYs ú ú~…¶ütIMEæÔÕ‘Â.IDATHÇíË1 °³€,`ÿšÐpù�´{Z½ì^N/·ç8Žãü{FmªÊÈ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:35+00:00t„£ÕtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/PTE.png000066400000000000000000000057221520501070600173400ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEæÔÕ‘Â œIDATxÚíÛYŒ]õ}ÀñϹÛ̽wvÏæÛcð‚mlõ‚]‹º@Ó’@’@¨€Th“ð‚JÒ4ª m£¦ŠZ)´jÚ¼”FQ$%¡A…ÒÒBÜ…/ñ‚÷e¼{<›çÎÜýž>\Cyˆ)æ+݇sçþçè÷½ÿý7�û….4¾ñŸ|f{Ô/2ýÄ¢~�;3"fF@Ä̈˜3# bfDÌŒ€ˆ™13"fF@Ä̈˜sá ¸ðöh§… C@ˆÚÙOÕ,ùlA¤ç!zÓ,ídE/´,ËßOû8Án·Ð¼‹¦1âQGíH"’§†$®êâ¶ܸ„ÞV e†N3•£ïN– ® v¥'÷qâ9ZŸ¡sïCÄùo5´pÿn]I¹ÊúüÇn¶�äXŽÛ.ãË·Pº—ÎmLÍaêJª¿FêjjcT¾EÏã´�DÂ÷ÇymAÈMóùÒÍô¶ñ½×y|;G©†êýQ�â™®)�§m¸þ±™ü ÿ“÷Òø'®eê+ÌÞZ/1rÞÄqç2¾ô±˜S§[|áû1ëS È6ž-W­‘Š‘/†‚fr-„ñ3ißFÃÃÝHêse“;éÐCs_¾8%œŸ.(äö%<ò[?Ú§øƒuNŽŽ(§}Co›Š…¡A3ÕyôýŒ¦œzdÃúkãí¦}$pz]—–[žÕ”ÏÉ>ÈœŸDÎ÷δ·€ dm;Ÿ^H©@¼–оûMs· šXð¯,:x¶|9Î c( =ŠWÎ ñÊ:Ž,dr3ýÇE-–Pîbïg ¦ÿPÔ!}oLï: dy�ÞÁå‹ê_årLµS]Eøòï¼¥”¤²K¨\Y_¼­:å‹©^M¥HËÄvÒ±’C�p¢-ê�¾7¦µ!w­cõ•õër…†€ñ$³‹T‘MŠÉ� ¤ØDkªþËhÎRÈ�!K³¬lgûvfÍ¢£ƒöNR{éþaŒbW¯ÓßyTCOµš `qq‚E¡ÊoP Câq…×_3ð•?²àñ2ÜMì÷i.n"ÛAá“䟧)uh/«ç³p€©<å2ûö19ê*…²…3åâiñk¯•ž=õVñO?>d×Á1«–uùÕ{ÏÖY­JcRÅ3·ž$øÙíÌ:ʱÏÐv§—ÑôÓ¨C{nLÛ�ŠqÃeœ:Íà0½=,ZDsË;Ë…«Õ·®KŪ¼°Ûßÿp»ç_>ðÎ)ZµúŽëä8s_ {-9šÿ­>Yš¼î�cÇ…ÌôéN³bë÷ð»Oñ�1鬯’Â91ñ‰¢–'éd2ËÔ%ÔöÓ8uhÏ�éYœÈ³ík.¡']ÿNÀH9gcO‰”rŒ±dYî‰o)ç&ë/ª5ò¥w.º¦öî3ùüSÆêk€©övMkŠ–þNÉø79²’Ñ%Äü„†Âÿã½# n¥/OGÅÕÍ1>¹Š­9žce·.©Y~Y›þ�)»æŒ{íF«{eÇd¯Z'Õ�ÄÃcwß²DWFþä�ƒý�ÍÝ/Ù½Š¦ƒL­X¡zÇ1½Ý£Ú2rÇæ‘é'ý(­G£mÄ`,Ï/÷qU·¯âþë¸f¥Æ)N-QH3¾¶&³¶&þ߯J>µ_­§Ç’Ëçøøõf§Jr/¾hìáÏ;¹èk˜Db¸Sâžù‚�M¦&kZ›iŸCµ‡“Ï1ÿqo Ô:Ó·ph‚õ»ùÜÍ<Êß½ÀKûÙ5–3;{ÔŸ _aanƒÊÎм•tù¶Â3Ï(\z©°¹Iuè”ôþýZóy•#¤ûh£àª•fýúfÝ=ƒƒìÚÅ‚ôv3º‰†©¨ÃzîLk qtŒeÍ´d8=Aï,ÚÈÇF�tÌrŶ¹–~wH÷ÑšÉBAã±cÔ04$Q©ÔWµáîfùökÔjûŒg’T+¤X!x…¾HúÎÇ™p�ûù›;‰×ÈMÑÔL2Ád‰ÚÈ"�ßïÓó�{µ>&ß½‚ª$Œ,¹ÄÐÝóÕnÜ®)5H†Z‰ñÍm ¤óó,ÞuHßçåP>¹k|+;ðØ«ÄXÜÍÜ2±6µ=‹ôlnÒ½#§s4'U­*'’&ºZ�.Í*]1lV÷�ãS ¶‡S�dî!S¡úóÖÓp‘å1ž·Ä¬8î^Îþ&{ŽógÏó_G�I’N’ÒÕ·Íovïš„àk%³~vZC0¢¡P’œ$1Yßj>q ±? ¬�ø"ó^º8ÓRÎ[^Pÿ°…¡ÉzbÖcwóäk|woŽ2YF�§vÄpœÎ9Ä�Ó7x¶Ž|#'ÖÕ³Ò7Qxƒ¦?¥oãÅ|Îsf\-à™½ìú¿·–Û×ÖÓü&ÿ¾‹mCõÔĆ ~²5•e¬“ü\&?r651•£ðuº¿MûPÔ!|D“’ XÕç®àúËèjaªÈ‰Ór,¹„“[èè$Ö‰•Ôþ…Ö§éÜUfñ/–ÈÓÓcèϲ¼‹³™ßQ_A_ÖLx&=Ý6Ó¼ƒ–SOÊɹ­€ÿ%ôÖ±p, ç«›¹g©|ý—~±öñ?� £ŸÙ¨£¾Ñ6Q#6Fö"Éíy?\ÿ¢ôy›�:¦€3"fF@Ä̈˜3# bfDÌŒ€ˆ™13"fF@Ä̈˜ó?¢øÈ½áhìx%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:33+00:00T–ïtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/PYG.png000066400000000000000000000022551520501070600173450ustar00rootroot00000000000000‰PNG  IHDRk@* yËgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ãPLTEÕ+Õ,ð´¯ÿÿÿ÷÷÷çççÜÜÜÚÚÚøøøÙÙÙÐÐÐÝÝÝèèèéééïïïÍÍÍåååíííààà©©©   ¶¶¶âââîîîäääòòò××ט˜˜¿¿¿”””•••ÎÍΖ––ýýýËËËŽŽŽª©©ÎÑÏáçãöööçìéÞàß¿¾¿………ÄÄÄëëëæææÛÛÛãã㬬¬ª«ª¥¿¯R™m}²‘õøöÒé۟вÁÛÊ­¯®wvwØØØÓÓÓ£££Ž��˜°¡&}Gz®�æïêþÿÿÄâÏN¬qµÒÀ™˜˜¥¥¥úúúÑÑÑêêꈈˆ¥¦¥R�iV–nùùùþýüíêÏýüú„Äœ{À•½¾½‘‘‘õõõÔÔÔ’’’½Á¿<ˆX‹µ›ÿýþéà�ìÖ2ÿýý°ÚÀbµ�ÌÐÍŠŠŠÕÕÕ���ÑÒÑP•js§†ìäªëÖ?‘˧j¸‡ÍÐÎŒŒŒ°¯°Ž¸ž-‚LÕãÛú÷ïù÷ïöõìÓêÜ=¤d�˦���¦¦¦†††Î×ÒM”g9‹X¸ØÅýþþª×»?¤eFªlÎßÔ®­­°°°ìììÖÖÖžžžÙá܃µ–f°‚œÐ°V°xx¾’ÌáÔ»»»ðððÍáÕÍãÕÇàÐåéçñññôóôóòòõóô¥¸à9¨8¨DpPÂbKGD Lò pHYsœœ&Í:4tIMEæÔÕ‘ÂoIDATXÃíÕåRQÀñÕ„vYƒ QQt»»;ÁÂÄÀîîZ;00Uß@çÜ/Þÿ üfîœ{Aàp8‡Ã€."]‰®_X¡(H$ °ÄJ*“ ¥”D mÑŒ‚  SªÔ ki6\¥�ŽaTŒÒÒQl¬>.>Á�˜dLNá( e2[RÓÒ32³²sróò Ì&@«�-*.)-+¯ +«ªkjÙB8Ëj³×Õ7465·´’mí�&›Ìr8•]Ý=½}®~×ÀàÐðˆÙ퀳ÜÒѱñ Ò3é!§¦gfE€–Õ&ÓÏÍ/,.-¯¬®­7ä€oèŸ�Í­í�ݽýƒÃ£ã“Sp6ü3vn¹¸¼º¾¹½ãï� 3¯£xNà埞½;ì_öï(ç3¼¼¾|ðŽúÞ½jšgU,OƒïÞŸ›¢�)PÜå­üCÄ;ºˆtŸè¶°…-la [ÿÓú5ó‡ævôtEXtAuthorCaleb MooreÁï–%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:24+00:00Y¨ÿtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/QAR.png000066400000000000000000000025331520501070600173300ustar00rootroot00000000000000‰PNG  IHDR£@Ab7žgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ< PLTEÿÿÿùôöâÅÎĈš¨Qk•,K�<‹9Œ;�=þþþ÷ïñçÎÖÏž­´i€ž>Z‘#DŒ;‹:Œ<þüýóèëàÁÊÆŽž­Zsš4R�!Búö÷ãÈкuŠ“&GùòôéÓÚÑ£±·o„¡C_“(HŽ>üùúïàäÚµÀ¿€“§Ni‹:áÄÍÇŽŸ­\tš5S�@Œ<õëîÒ¤²±d{›7U� AýûüòåéÞ½Çĉ›«Vo˜1OŽ?ìÚßÖ­¹»xŒ£Hc”)IøñóàÂ˸q†’&FüúûðâæÛ¸Ã„—ªTnõìïãÇÐÊ•¥°axéÒÙ¸p…̘¨©Tm•+Kúõöë×ÝÔ©¶¹tˆ¢EaÿþÿöíðäÉÑË—§±czœ9VþýþóæêÚ¶Á´j€’%E÷îñåÌÓÍœª´i�Ç� �"CŠ8‹9ýüüõêíâÆÎÉ“£¯_w›6T�AÛ¶ÁÀ‚”¨Pj–-L�=ìØÞÓ¦³°`x�=û÷øíÜáØ±½¾}�£Gc� Aß¿ÈÅ‹œ«Xq˜1PþüüöìïæÌÔÎ�«³hž×P軂À`€�Á>–ƒ}LjÐ�í þ1Ò¡0Ö<Æì†ÀÜ ö9$(ìsqƒ}NsðÏ …9ö¡°V�a¬ù€ç _;ƒ} Ò`_Ë5ø×ÄÑ{m!ÑDnÈFÆwK%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:31+00:00€Ë‡ÆtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/RON.png000066400000000000000000000006201520501070600173360ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<$PLTE+*€?rÞ½#þÒüÑüÒöºÔ($Î&Î&ÿÿÿ•ªébKGD ×ÄÀ pHYs¯¯^‘tIMEæÔÕ‘Â/IDATHÇíËÁ °cˆ%•bI%ÊÞÇÐö_ÒÆ\eŸÛ"‚ ‚ ¯á‘ðô®µ%¼â%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:45+00:00~AªÌtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/RSD.png000066400000000000000000000072251520501070600173400ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs N NwŒ#tIMEæÔÕ‘Â _IDATxÚíœ[Œ\å}Àßåœ9sÛ�]ï}íµ½ŽïÆÂ%ÆÆ)�P$!%PÔ¤„ TyˆB¥ ¥j¥>¥J«”´RûZEU£^$)ä‚(q5ØŒoൠ»ÞõÚ{™™�Ë™9·ïëÃP }éCvv ¦/ ƒ!VÞÊh»+v|#ìÛ‚Ü4†êŽ(>ý+Ä; h?F阃_£w[š©#o�Æ ¶nÆìT4ÿã§d&cÂTž®©ôŸÀδ>f‹NY¤™¶X H´A�÷‚Ш×&Ñ“µÏNÒuûgˆÏÏ šÍNÇnYhëîfk>JX”Žq#—äísˆLöæI”Û x³éS-N[‹µŒ%è‹ðön¥qa w6@!qR14Bˆ¢NÇmÙhŸ)áü4vVcvk‹8ÛdþÕÿ$’U®%_G"=JoÏR<ù$þŒ% ì+Ðpšåc”Ÿ{ åk‚Þ5¾�øÈr P�Žýe».LB£8C)]"öúH]»—Rå-ã„ìpBzû-„ù)š… ïÌ*Ön P£×‘ êkÎ3[nâ9yÒÛ0לÀT–H›GšN‡mùho$éó>µºfnW…ñt [Ô¤ºÀ¡þœd.&SpØ5lˆO¥½‡  z@!ZPÊÌ0%-{^öÑ‘ZQ•rûë!ذ¥ù*©üQF»$…M �ŒBª$#©Àí74L‚ª‘,ItFC¨/-R[X`ûbšÜ >\¦B,•@¡ä� Ñiˆ­ÀÇ-yIœD18ã¡$Ö‹1 @QL°§ªè¬¤ôÿ.K�/T‹)~u¼�Z”£ÑHS|Á¥6­@uñæLÿðÊ8õ(Kl2”�8,�ÖÄ¢›·çò¼r²¯Àèº]-`!å=H£hV”ŽÂA­ QÝ„a¼¯‰çÌ“NY„¨)‰ÔŠÄâj¡ B|86°IòaCï F|áàCËþ_H¥¸­Ë– Œ¬iåür(!Ý•@!…E*‰`’Ög¡ˆ¬¦ËIÐXü÷Â%A€u\žhä8¾à<¿úi=°üu4·ÅeÆÏOzÛVÜõcÔŸ�z¹{ ÙÍ÷à^œÃíuâéD¡›Ôömd÷í¡aŠTþû_§œþ-x»7Q?|Q*!ryŽ÷�ñ”Ê¡¯ð;“Vm˜C),ÂZL’à}ú[¿÷]JÇORyéYú…èÑ Þµï²ïÁo�zà+œû§ã?÷Ã�=Êè�7ðöÄ)š§þ–±[+\ D’eó£ß¦ôÖ &¿ÿh†H,‹êtGÚ·‚�E ²ñO!³f ‹ÏüYjrñ°ËüÓ1…ÉWpm™®�Ò…BºGGñ2rþI䑳L=ãàŸs‰N¿ÍÒ©ÓŒ:Èš/ s…_õ¥mŒ5äo>@÷¦qÂ0Df2vÊ¡^T4çÏ1{äH`à¦ýdîgͦqüòÝ_¼c-rí(}÷~‰ZçR­‚””ÊeôÚ ÷Ü�‘z{Xÿío¡úû˜»t‘f³‰ßðq‡‡@]éÛo‹¶µ"×aq©LÃXz{{q—¥j•ñ¯�#—.¬a. ˜=z�Ë#]‡¤îù>ή”öífëm·Ð½g7¥b‘t:C©T"0 V]é@‹¶ �Í€Œ›ÂKgˆ“„8iàgsè cø¿xŠÒ['HÊe†ÿèAú>u#�ÿáÔ4B+lµŠ³m+¥R k-µZ/í‘Îf¨½w’•± ·M€P !%Žë �"ŒµT+ü¹9rëÇHíÞ…ªT)d2 r©Ðãã4>öù™Ÿ�e +�©©TŠÄX”ã¬Î„ÿ_¬ý W£µƒÖI’Ð C,S­Lž';2ÜúÛ„—"ñ}ÂÙYlØšz¥<GµÊE%qýÖ±¯tÚ—†6ŽÁ‚Åb¬Ak�—öÈxd³8£#˜f³•Ó �iˆL=4Z“ÏåPR!¥Â|�÷[’z}ÅhÏ ‚¸îÓXª�.0±¡á7�R`€¨ÐMf!‹Ž"’òîš^„”¸…nš E<%‰ÆÖáÇ1ißG 0Æ r9’$¡¾°°b ±ömÂR`’˜Z­†‚|.�”’( ¾õ÷ÿÆÃ­å'Jk„lÿæ#XcBP*—YX˜'—Í‚ (—ËX!®øèGißF¸Rù.´RHÙj%#\‚¹9.N_@8$ =;v�`ñø ‚b©•z=¾­,–´L“J¥ˆâ¿¬˜ÉdÛnA6ˆ—–H+‰ëºDQ„@�KååW)?‰wÝ>ÌùL‘þìmL=ñSŒçÅþëo0òØŸ’ "…D�뺄a@\,®˜:Ú·š£ˆx~cí‡}!¨LNR-—é4q¥Š·a}keX‹êîFå³$qŒq&&ˆý‹�˜F$ó‹+f8߯v´!ºx kLK€€úâ"KGŽ2°g7aÆkÝ‚~+Ÿ·¥@)ÄÆõôäò\:ü*&1ð~ªj|Ÿ¤X\1u@Û žŸÇ$Éûõ3g~ƒþý7bׯCEÁ‰“¼`‹˜ó3ÄQD×ÍèÞ²™ÚLj|k‰k5L­¾bž�ÖqJz+B+°�)퀀Ðo°4qŽ®¯ÇJÅèÁƒ¼û×?$75�¸ç‹­+ºReáð«è{>ÏðžÝĉÁÛ¸‘âÉSŒØ�Rǘ(¢©-Qb°W¸ý‡¿ÿÉe?¨PŠÑâ„‹x™ A³Éô“¿$i”Pk´Öte³dúû ¯ÝËãOœ¡¼c+"ëÑ“Nãz¦YÃûD�¹Ÿý^o×\C*å!3Þ¸“‘@"¯p³ìù„‚â /qþ×ÏÒs×ç.^âÂ�þžúÎ%Äú�¬[•_Á;Aî±ï�Ú¸›$­©üóO^;Jî šÙ©'óšOÏú›è½ï^dR{êi¶ýÅŸ¡²™+¾"¶M£¥àâ%Þü«ï³Ô8‹cc²n‘ÚH“ƬÂ=ÓEf1ÆÙ½“¡ï}—H+¬1h×%|ãóó8&I¨­ ±›|z3s6‡ŸÎBÔÅø§îdü‘¯w:vËBÛ ±Ôà½Ã�?Gj·Áí–x/fÆâÖZY¹;¶ã ¤¬ÁÒZ9rËfd_rúÙ%�™HãlL0×W°3KèköîítÜ–�ö¥¡B0xçxz áEEí¬Æ‚ _Ã1V9¸ÃƒA“F£A„øuëhôà –ÂM!ƒû#j§4�9I<«èÛs=ùkvv:nËF[ÎÍ﹆u;ïbêØO{!m@äXœ½>vËn½�I ¥$1 BJÌWþ€ êb$¸ 7 ü¢ «4ÀØ·îGz©NÇmÙh«¡ëþøAª~š¥wÞ¢‰ ÑôÆLÓˆ#d½Õ|²5„·By.QÝ¡<-À{Iá^H3öÕûé¾þÚNÇlYi{c15<ÄæïÖ=ô5T6Ûéx-;—M@87Ï…ù7ß|“Ô¡›Èm߆Ûß�ò<¤”Xc—*Ôß{�æÇ¿™dô�ûè½åBwüwEÚÂe€µÔ'βðÜóT&ÎÖj­q£”­÷¤$3ÐOïuŸ¤ç¦ý8=…NǨ­\~Áø Âb‘x©‚Mb”—ÆéíA÷Z]Ñ«€Ž Xåcò‹YW3«:̪€³* Ã¬ è0«:̪€³* Ã¬ è0ÿ¬‚à} ‘£¥%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:05+00:00׿OtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/RUB.png000066400000000000000000000006241520501070600173340ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÿÿÿþþÿZÆ6¤9¦9¨K4vÔ+Õ+S\½³bKGDˆH pHYsttÞfxtIMEæÔÕ‘ÂÚ½ ĺ!›µHd®}0§°l¯v�³T¤¶@�µG«·9¥¶>¤ËGªš(¦·S¬Žm¯u޳UžµE¢µBšµIr¯p@©¡£Ì¤Ç`­�v°lw°k.§±!¥¿£Ð,§³[¬†C©ž£Ð¢×-§³.§²B©ž!¥¾Jª–£Î¤Ê¤Ç ¢Ó¢Ù¥Â¥Á £Ò¡à§ÃÜÌüÒúÒüÓàÄ:n6_= `=ÿÿÿêp:bKGDÁdfïn pHYsaa¨?§itIMEæÔÕ‘ÂéIDATXÃc`£`0FF&fFZÏÂÀÊÆÎÁÉÅÍÎH;Ø9Ùxxù¸ù˜ia/£�°ˆ¨˜€¸„$?;'3ÕÝÏ*%Í/#+'/¤ ¨Ä¤¬ÂNeóUÕÔ54µ´utõô �ŒÙ9M¨lƒ©�”™¹…¥•µ�­�½›±²#U�wrdvvqus÷ðôòò¶¶óñõcôg¥jȺ‡x…†…GDFEÇÄÆùQ7ŒØY9â“’SRÓÒ=32í³²¨Íþ9Y¹y ù^©……iE‘Å%¥eåÔÌ Œ¼ª•öUÕ5i……©µuõ ¢�þT "Þ¦æ…Ö¶¤ö´ÂŽÎê.{·n6ªf5FSASƒžÞ¾þ ½Úê{šË¥'Q9’™%'O™:múŒ™u³êgǸÌa£rVfœ;�ÕECcþ‚…³u{)¨pòsR×FöÅBKì—*h-‹Y¾¢T˜�êêJAöU‹…V¯Y».Àh½ÉêØŒì&k�Ë�+ø6njbw¢ºù@°Ù‘y ãVám9ì+Yha>0ó²oÚÌÈK#Ó‡1ØNcÀ°ƒÆ€a'�Ã.†Ý4£ŒZ0jÁ¨ÄX°‡Æ€a/�Ã>†ý4 h F-µ`Ô‚Q F„ªóÊ6WEV%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:53:44+00:00Ø6¡xtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of RwandaXc:0IEND®B`‚qalculate-qt-5.11.0/data/flags/SAR.png000066400000000000000000000077141520501070600173400ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs%%IR$ðtIMEæÔՑ–IDATxÚíœytužÀ?UÕ�£;�ÎÙI:¹€„+ärË¡¢DÀt]ÔÑÝqŸÎ83뎻>õÉóÇWƒxàÁ€ �p…#@Hi’tŽNúH_uì ß¾çlÓë›þ¼W©êªêªÊïÓ¿ëûûu ¬¾F#BØÃýÿèD„™ˆ€0f"ÂLD@˜‰3a&" ÌD„™ˆ€0f"ÂÌÕ ª i—.öhê¥çk¨ÊÅ—zIwÉaA¾½îÅkZ¾æÅ{\ôÕT`à9?ã…sµ«$–˜�ùT(o %æOÂáu£—t$L˜bŒgä# Tdr“­ôzÝhôÿã¹ÉVÆæÓâhg\v1™ ©´tÚH3§rãˆ)L+,£×ça|n ©ÙÜ8òZD¢tz¬æTºûœä§dáòy°Ä'�e²Óðý(ªB´.škrKèõz˜œ?š·ƒ)¥—×EfRñ1F\>7\�ýc jwŽ›‹_2$9ƒ{Ë+�güOÀKJ\"¯Þù;Óáê`Ù5×ó“ 7PuöS Jéõ¹žQÀÔÂ2 S²¨=GŸ‹‡gÞÉãærMn ‹JgQ–5”›FMcGÃa~5Ž>'k¦ß†7èç¾)·àñ{9c?‹Ù`âÍåÿFQj6«ÊÒåîå—sVcdgÃaîž¼�e×ÌgÛ©½Èª „NBH‚€€@‡ÛAVBc2‹˜W2 ‹)‘MG¶³bâFdä3qÈHÚ\]ìj8 šÊ�”L†Zr1ècø²v?1º(ÞYùZz쬫|—±ÙÅØÝbtQ¸ü}üiß'Ü2f&I†xFZ󩷟㈭žd£™Åe³ÉL°0&«ˆ1™CÙ|¼¿à–13˜3|"¦h™ ¢$=“òF‘ŸBJœ™•PÕ\CC{3¡+©CZÄEÇrÝð ´¹ºxhÆí\_2Q™VPFvBAEÆc Ãí@EDIbÁ˜ÜS^Á_ª>%/ÙŠ9Öȼ’I$ÄÆaë±ÓÜÖDK�½¤ã­}ŸTdÞ®Úº�ï­�B%²-ìl8ÌŽ†Côz=œïíÀéõ¥Ó­�Âðò»mÂ/±šSiuvrª½oЇ1:sLm®.Zö�A¡ iDIz¦”Rœ–G_ÀGKOí®nÎ:ÚPT•7÷|ŒÓçÁÖcg×éjn5�GgßÅç§ö±õäz¼.n3“‘|t¬’ôødâL‰ µä0.{8._C-9übÚÎõØ9ÕÞ„$ˆ™²¬¡Œ¶âèsr¢­‘m�´övÒéî ©»•Ww½�¬*ôô¹¨¶ÕÓØužMÕÛ9z¾¡?qB\‡N€AE&/ÙÊÜâ‰Ô´�Áés£%̱qÜ4j*‰ƨXür�Ì ûšjXµþòS2™^8–m'÷rǸ¹™íuX5y!Ÿ¯~™üd+ÃÒrÙ¸ê÷èD‰Ò¬¡8úœ<±ùe:܆$YYT:‹i…et¸¥fs¢­‘œÄ4Rã¹cü|^X¼oÐÏ+»ÞgrÞ(üÁVs*M]­l¯Û�N”ÈMÎ Ôtÿ%¾ß€Ë߇/àþkñÒŽ�¬˜p#ñ1q¸ý}XL"Ï.\Í_}NPQÈJ°ÐÚ}tQ|vrÞ Ÿª!Šª�l0óemqÑøøY Q1¬š|3§;mœu´ñeíÚ��l>º“òüÑ,zã—ÔÚ›ù×¹wS’‘OåéjâcãH1šYU¾�¡–þå£u I¶ò³),{‰æX#mÎ.ú>¬æÔq4Uå…xjËkl>ºƒê–:þ\õ)¯=Â3ÛÞä7[ÿÈ[=Ã,¹˜Œ ˜b ìk:Ž€Àʉ X\:‹‚”,Ÿ»‚'>^ÇŠÿ~š#¯ejA)¿ûì-nQΗþŠ'çÿ€Z{3%éyÜí­hŠ‚ÝíÀbJ¤ÝÕ…ˆ€NÒñè/²éðvìný9uza½d�OÅí÷ÒÝç$ŘÊÒÇmõo©cDfïÙŽO ‰"‰†x–ŽŸOiæ0:α¤ì:œ>’ 2aÈšºZié±óÓI7aëé !ÖÄÔ‚RþRõ)Ý}N¼Vs I†xÎtÙ›=œ(}�îœ>‹Jgñ^õvÚ]ݘcâpúúpúLnR:Õ-uȪʆCŸ³¯¹†™Eã�$‰.O/}LÈ[A¡ÍšÊŒ¢± ³ä²zãpú<Ü>vS"J@eX~.­½](ª‚­·ƒ��URko¦¹»�ó½ô¸ºùâTyÉ™|]�å®çÁé·óØuw‘™`¡×ëæ³SûØzbÛNî%;%‹(I�ª©¼´ó]^½ãq¦ä�AQUÚ]ÝXÍ©˜¢ ¼²ë}Æç36{8~9€? ¹»•eãçóññJìn)qæ{$rðÜ)¾®?D èãß+"+ÁÂ�³'Yp+ù»3¹·¼�þ>ÃË•ï²fúmØz;púÜd¥d2­°Œ�‡¾àt§�ÑÖ"JÒó0ÇÄTdô’Ž‘§ á‘ÙËqú<¼W½�(Qgo毇>gqél‚ŠŒ¦A‡ËAš)‰ý�GAS‘D‘™Eã *2‚ Ðëuã“<2k9'ÚøÑA½^79Àœ’rf�åL—�õ·¢¨*óŠ'“Ÿ’…¦iè%AEfOã1ʲ†òó©‹ùó]O‘—ÀGÇw’l4cŒŠá©-¯3ãÅûyì×(A²,ä&e�fJ¢¹»•j[:I‡(ˆ¼]õ7êìg (AL1üJ�$‘gÉáÙEkñì:S�1:YUÈA¶Ôì¦ÓÓKyÞh‚Šò÷'ÀÿBHs@¬>š)ùcøºþ 7�šFP‘Y:~E©9Œ´æ“fJâ¹/ßá® ×ó^õvPdª[ê¸qĵ<:{9­ÎNîYÿ[|Á«§-ÁCnRýš_ßp‡Î�âpKg:mœjoâØùF[‹Ð4 �³]6^ÿæC™½œ ¹#ˆ�1ÒÜÝÆšé·óðÌ;’”q1dáò÷á øø¢v?uöfþPñ`p�Pæ‚Ð ÐTr’Ò)ËÆWõH6ij·é8:IÇŒ¢±´ôØyã›ÍL/‹^ÒñÎþmäYrxtö]¬œ´€j[÷mø=íÎnÖÝöS"�|𿘶„QÖŠ,Ù,}ëIªNW3ÌZH’1žgQ9%:WK—§—ÔøVNZÀÉöF’ ñt{œœlobfÑ8Ö¼ûk¦ßÆâ²Yl=±»«›OŽWRk?‹¢*t¸{èés�ª�øc Æi*©Ù<0uŽ>ð³ò ŽØê©jªÁ'YT:“TS�o~™ái¹<¿èŸI�OÆô¡¨*Šªðëï£(5‡6>Ëúý[iw;¨=ƒüäLÆç–p¼­‰¼+÷L® +)�Z{3[Oî¥05‹Wnœâô<~ïy¢tzæOb”µ[¯�§?}…¯±§ñ¯ì~Ÿ•`ë±ÓîìâŸf.eIÙlžÿj= ö³! Æ…."çzÚqû½ˆ‚È{63<-—åãç#"í®n¶žü†7¾Ù̘Ì"Æeç鿽ÎWõ•QÀ ‹×òðÌ¥T5×°fÓsì9s� ¶²³á0SòG3ÊZˆ¢*l©Ù�Ûïåtg g:m\_RÎË·=†7èç¡MÿI}{3mÎ.n1…JÊYµþjÎ7PÓRGlŒ‘4S÷–W��˜FQj6/~½�íu@”B–DB¨¿mÀô#+2Ñú(²ÓÐKz:\:=ÐÀcÄð¡*Á‹Ÿ6K|I3çíx|} �| b[]U.yïhkµöfÎu·õ×4ŒÑ²,œî²!+òÅËEéôdÄ'“��FnrGmõœhmDÑBÝ ¹€ïTbš:°KÔɹBE§ T€Âh ^tAÎàgÑ´+)ƒ‡KáRá!$´ýà;‰'ˆWHÏ+$ðIøÁï®Ttßß³„�÷z¯DdVD˜‰3a&" ÌD„™ˆ€0f"ÂLø\>Y÷â„ØÁËÿ-±ú¤Ö~W¡'|e̱ý“tJEUPTUSQ5 MÓbñ  ÌR{AËÀQmÐöŗߊÓýxbî ö6g˱ÊA�ì��0ô‚ûïŽëÐTFZ‹xváŠR³�UY• * ²*+AÓPXkêÀú[Aß®¹lße¯¶Ë²†Ñåéåèùœ>ªª¥ÓóÚî8ÒRÒ°ó÷òÙÑWD°»±Õ¡¨*:QBECVd‚ªÜŸ#4U½�#ú#Ÿý1¼�‘ZA@ÄþE�I”�D �(¢“$t¢½$¡—tè%ÉÆb£bH2šfÉedF>s†OD'êøäøî«ž Æ"âñ¶$�½¨»,::íŠ{¿s®öý‡P5•ÿ¨x�‚”Lê;Α™`Áðñ“Ä4Òã“�$ù*Œ_NX\ˆŒö�~B{/Måíª-ä%[qx]èE hì:ÏþæȲ–z {Ë|Ë’´áaÀ‡­ßL…Ïs Ù\�Ó^‘ÔVŒÑe–Õ€’gÔ½0þÒûЈ“%íɘ›#@l/ǺbKGD/#Ô  pHYs × ×B(›xtIMEæÔÕ‘ÂðIDAThÞÅÖgTÓ@Àñ:°ÖuöÄ�TŠVˆZ (‚â¨{+*ܸ·¸ADQ(î…[÷ÂnŽ÷Þ{ï÷LHRÚ4¥mì5ùÒ¾¤éïŸärïD"!¶\¹rçÉk—�ܲwŠóùµDbe¾@�‚… ¡üìPT 8‹ÙC+óÅKØ•¤øR¥´ûJ;ʸÊ8ÉqñÎeËiEù ܧ¸Tt­ÌýËøÊUªº‘»%dÕ�»"±Þ ä�êž5jʰÂ@0àk¹¹)‰ýÀË»¶Oòõó¯]·žîŽuê5@ ëû7ÂÁ+•YÇŠ5FÔÖ¤©Zï¤fNÍ©-Z¶ÂÂÓPݺ ¡´m×^®ÿ´�¸CGÒïÔ¹Ë D£< !]ÉËìÖÝàÔÐd€“ÌBÑ\ž �÷ì…z‡¡>†—Ù·ê? Tórä™Ù ðÁC†sÎvàˆ‘£F�Ûß¹ÈÏt?!‰“&ÓŽÄ� ˜2u„Óý½ù˜ä™€H…˜¸v5ƒº zf ]2k6AË#±xx&@D=|@?XoÎ\ú+½‹Ç0‹×èo°L\ü�{³yŽ€¾.‡„yÈG£Ñ¸„`ç Àü ƒ…!ÏÅK/•ò{ù,à9î€dY;jöm°|~žk ÀÄ•¾„¿jõ>¯ž…<ç ”­õ$Tëxøóœp=ÚàºÑ7Éâ÷€¯ pšMÉÁ‰›=·X8yñº[éÉ*|¶K£í;è‚È�øxÝ€]#¨‡¢½È/p÷:()ÞähàÍg€½)ûè‡Îš}ÁŽýl<ˆµç�æ~rX+"àA÷ä¹�}ÀZ<ÐH*MM;„�ó8Ò*Z÷¿ÅiÓS£Ž†…ÏŒJ=Ö,Oì9®:‘~�:œžqúŒî•f:¦d¤ŸEè\zÆù 8x*¸\¼DM¿—¯è™IW©ªnXxf ÈÏ\#”¸ë^ìñoÜ$ý[·!^»*޼CÜ 5`d÷È€ûrL<í<|ô=³°÷)J©ˆT¯ xöüÅÅËW¯ÙW ßœ}û.ñý¹2<¼vQÚ£&ñÆG|Ã~ÔàÓç9ˆýòÏĨIdªY¾H‘uïA„¯�Š�Îs@ïÃ꼑U±‘ oIÞüL¼¹Øxó0òæ`åM`æM`çs°ŸS€Mxã6â�ØŒç°!Ï`SÞ0ÀÆ<;Àæ¼~€¼n€ |v€@< OÈ“‚òD€°<ðí»�<ðCPž xçŸeU€gœÿù+¯Tþ(ï'[õ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:28+00:00;%ÙòtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SCR.png000066400000000000000000000023741520501070600173370ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<;PLTE?‡>‡ D…ª¦fÿÚUüØVüÚVûÓUê‡AØ1*Ö'(Ö((=ˆ]wuóÓXýØVüÚWøÆQæp;×.*'V€ÕÁ]üÙVó¯KßQ3C†ŸŸhí‘CÚ:-Ö&']xuõÔWåo;×-)Ö''Õ%%Ö&&Ø44àZZê��ßZZê““õÍÍýóóÿÿÿùüúêôïÓèݸÚÉÓèÞµÙǒƬm³�J u,‘^…M~B}By<x:y;z=ýÛV'VÖÁ^ÿÛVŸ¡iþÕTÚ9,Õ#%ë””÷ÎÎÿõõ]yvñÁRæm8×+'Ù34â[\ï–—úÏÐþôôùþýë÷òÓéß.Z}Í—TæaAâ�Žß¼ÏÜÑ´ÚÈ’È®l³�I u+‘^�zh½�e›–‚y­ŽT¨2—f‡Px9x;kCãçbKGD,ºÝq« pHYsttÞfxtIMEæÔՑ„IDAThÞ½‘‡BQEƒ (¬‚ bABQ,˜XAP°Ðl`Á.ÿÿ†d³Ù}oæ½ûf–�8wÎ)•Àk;ÖÞqº�'Ouu£‡òKÑé3=¿·ïl?·Dç ƒƒCç»øð€á ¿säâ¥<< º| ÐÛ7z5ä}x X?> ®èG DúÑ@™~p@¨à Ö� ð�ë‡x(ô#|Tú‘ž:ýÀO¥~ÿwµ~ÿg½~ïg€ôû¸䢿{¬\ÈCÿXy|brJ@¯ÿ�>}mæú Iµþ„^;A¥þ4Ý5€  Òoиý6Ý1€ ×OÒùL©~ŽÎ õ;èì2€H¿›Î ô{éÌ*@¸~„Î „êéô"@˜~œN°é¢“¬úCéÔ+¬_@'˜Pý2:1À€éÓíFD¿†n Èô+éÖ€L¯~5}vîæ<À£_GŸ�»u{áÎÝ{÷¹ný z‚~P©VV1\ú¥tÝ8:¯_D§Ñæ€VV8Ý…6$ý�t?Ú� õ‡ÐQtv@3¥¦‡¡³â¶~Œ.AgÄLý]ŽNh0ôûèZtz@=@F¿“ž:5  ¥Ÿ§ç‰n 8 ÐÒÏÐóG·Ô4õSô£B'j×õ[ô£E7DOž>«éÏÒ‹@ÇÚ†—–Gž¯ŒOL®¾xY(:­­¿zýæíÆæÖöλBÑñ€÷>NÚÝûüåë·ýbÑñ€ï?~þúýçïbå_õ XtãþÅù™£Û-%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:01+00:00옛\tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SDG.png000066400000000000000000000015531520501070600173230ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÏPLTEOM-¸3Õ4Ò4r)2[,¡'1Ó4Ó4s)h*}80Ì4Ô4o)UJ-¼31[,}8/Í6Ô6Ò5n([hFÕ› ò¬ºïª·u+<—^ÄâÑÿÿÿp&�?˜Æ¨øûùq'v/g«€åðér(q(;“[ÄÞÍ9’YÌãÔu+@—_ÈãÒn&c8‰•ލ¦§¥¥¥s*f%.W o(D  GGê¹ÒbKGDr + pHYs¯¯^‘tIMEæÔÕ‘Â_IDAThÞå×YVÂ@„á(W4¨ ¢(N€ gœtÿk²�á!Ý1/·êÁÞ@§~HÀóVV3ÌãÉZv}ƒ ðs›[ÛL€øùÂ/ƒB‘—áÀ̈¦^†€•a eXp2DŒ Q!ß!@gˆÀ,l+™Áfppœ“a·´·¯~Üñˇ•#í“9>9=Ó>‰©ÖêçT€4š­6 ÁEç’ PÏð7@9C €n†4Õ éŠR$h\]ÿk;ùCÈþ²DäG1ûeÄ~³�ÜÜÞ)_Ÿðï»=íãôŸž_^ßÔ�û�Éà}ˆ8®¿f£OÈý€™Œ¹ß@Íïàæ·€ó[Èù-ìüqxþ=ÿ?@˜?`Ì¿àÌ?�æŸXóO¼ùCqþ0˜¯7€¯oêýÃÁ‰y}³g¡k%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:31+00:00bœ¿tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SEK.png000066400000000000000000000007531520501070600173310ustar00rootroot00000000000000‰PNG  IHDRf@ßôò{gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<?PLTER“Q•2jvîà ÿËþËÿÍ›œ9P–N—.hx™›:i„VgƒX†’FõÇÿÌį"h„Wi„Wÿÿÿ‘ÃqbKGD’ßÉ5 pHYs a aüÌJ%tIMEæÔÕ‘ÂoIDATXÃíÕÁ € EÑ©´¬¬¬þÿ_[EB¤ 4DÜ»8»7"ɪº1ö¬íä¥`````````n¹dý3£+M|²i^.&¬ÛîË’�ÉF™ÜñcbU‚��ù.£46JÓ©ôþõ=a```````~ÃÆY;§ŽÃ@ß%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:49+00:00[=ÛÁtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SGD.png000066400000000000000000000024051520501070600173200ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ËPLTEí)9í(8í'7í&6î0@ïL÷š¢üÚÝýìîù³¸ñZfòeqþòóüáãðN[í(9ýíîõŒ•úÅÊõƒŒñUaù²¸ø¦­ü×Úñ\hî:Iï@Nî9Hí-<ðHVí+;òamî0?ø§®öš¡ù¶»ór|ï?Mï=KðO\úÀÅñ\iî6EûÓÖÿúúúÉÍÿúûýéêö–žî5Dóq{üÖÙÿüýüßáô‚‹í.>ðGUýèêðMZõ�•ÿþþüÜßïAOø¬²úÄÉðR_þñòýäæïBPí'8õˆ‘ôyƒî3Bö”œós~ö˜ ï=Lî2Bí#4ñS`ótðP]ôw�í$4óq|ø¯µûÎÑô{„ðM[óp{ûÐÔô|…õ†�þö÷ø®´ï>Mõ‚Œø±·ðKYüÝàí%5ûÔ×ô}‡ñ]iðIVògsðQ^òití%6ïCQýåçìRbKGD›i… pHYsØØnGc5tIMEæÔÕ‘ÂýIDATXÃc`Ž€‘‰‰‘v†33±°²±sprÑÆ|nN^>~A!aš8ŸKTL\BBRLJZFÈ¥ºùrò ŠJÊÌL@žŠ4•m`TUSš/& 2XVVCSK›ªèè‚Ì×ÓçÛ¦o`hdlBM?0›šÍ7·`†p-M¬$¬e©@26@óÕmAî%Qn;{[&(‡*Ð�ZàÈÊÌgNÎL Œ.®nîÀ„åéÅD¼�æKø sñõóWf`ZÅà¬ïF� š¦ÁÌ`É ‰^�˜Ø¸ø„D*XÀ”” ´À*è¦Ô´ô X°xdJd©R#-qgç-ÈÍËšYPµ€±¨¸¤´ŒÚ¨0)ËÀÄ£™‹8©`>r�Ê F˜£ÁQM €ˆdˆÃË!´vULx2ÚVQYUòGEuM-µJ DFc`䨫ohlb`tnÎli ¤’ÈEg[»DG'#ƒW—¸D· Õ¼€(ì˜{{ û€I˽¿wB•ÌG.®™*'Nš ,䘦ð$Mõ šˆ Ç’+?\ˆr1æS³òGT™Ó¨T€bØ€ZéÓиÙÂ@û†Äª6™h ¦Ó0Ì 1`� 1µ`Ô‚Q F-µ`Ô‚Q F-µ`Ô‚Q ¨³ÇØu:–O5%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:15+00:00Ô}¿ÑtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SIT.png000066400000000000000000000025551520501070600173500ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÿÿÿþþÿýýþüýþûýþûüþÿþþëóøÊÞñ·Òç­ËâìóøÈÛêw©Ï7€·fªg“YœS ÿýýýÿÿÿÙØgk–[§QœVŸX¥† N'q�\©\§ÿüüÿÀ¾S3dd¯_¤_¥^¥^£]¤\¥ÿÒÐk?jb­\¢]¤aŸÿýþüÿÿÿÝÚz?f`¬]¢_¢U®^ŒhÿèåŠCf^©]£]¥`�ÿñîšIf\¦]¤^¤[£c©ÿþÿÿùö©OiX£^¤P�…±Óùýþÿþü·WmUž`¦Z¢g©`¦ïõùËdtQ™a§UŸÉÝ샰Ói ÉV“ÃV“ÂV’ÁS˜ÈœIfW˜­ÑúüýöùüSžR�U¤|:`K�;‰Àýþþþÿÿ_¥^£e¯m€‹«›»‡§Báéáîæêòë9¼”Þ>/|ýüƒ‚üý|_úx+½ +CBÃÂÙˆHN¥â"#Øð°Ðe0Ñ DE«y„�*&F%¼::Šèb…¸ø„D„’’SR’“JLˆ�b È…Ô´ô qô̬¬LñÈHOKH¶P.dçäæ!�F›Ÿ¯ÕhP^nN6Q�¡°¨X§Ó²%¥¥%¬V§+.* ðd1)+¯¨¬ª®akëêjÙšêªÊŠò2 VÅꛚ[ZZ[š›ê±m»Íí�]ÝŠÐ÷ôê¡GÑÝÕÙÑÞ†è³HÿÀàÐ0¼ñèïÃŒZdl|br ôOפ‡©É‰ñ±Q,²ˆA==óúï=½™™V¬p³só ‹KË+««+ËK‹ ós³Qd0®­oln½ÙÚÜXgÄ´«Û;»{û‡GÇÇG‡û{»;Û„Äœ¼ÿðÔ€�ŸNp5À†â?Ÿž�_\œŸ�y\ù6Ä\^]ßÜ\_]b+€mÄ›¾ÜÞÝÝšMøæ·-€ ÷fóÃ=Æùÿ!€8þñ‘Çôø/P* ½€AbÀ$1ðUbà›ÄÀw‰�C¨ T€ P*@~ %¼“˜‘n%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:11+00:00 2›ÂIEND®B`‚qalculate-qt-5.11.0/data/flags/SKK.png000066400000000000000000000047411520501070600173400ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsttÞfxtIMEæDjŒS‰IDATxÚí›{lÕ‡¿{gv¼Žc;NlÇñƒà˜��ŠxJ“6<Š” Z©4B  Ej‹ ¨ˆVZ Ax¶*H´AA¤  *ÐBqHSBÓÒ„8Çv ;¶wí}ÎÜÓ?f7±c“˜jÌdÍ~Y;÷žÙ=¿{Ï9÷ÌX‰ˆP$4tØ_à‹NQ€�) 2EB¦(@È™¢!S dŠ„LQ€�) 2EB¦(@È{2ŒÊÀ 24JM`ðÝð‰ÌÑ]S ö¤|ýÏ•Iù©û"³nXÖÁj�rÄ”Rˆd2Ÿ#‚šQIÙý÷`5/,¿FðƒéèÄtt�}Dгk‰Þp-ª²l›ÌSÏ�ùã³ Uÿ28¶ï!x\I$|'Ì‘"H*�ž{öñÇ�yâ)ÿÚ!Àäî1< ‹ç"‰$*”+… cÚwûóbqÌîÎ åq=H$CqXÐØ�>V€ë}zÏó�¬”®ºöø—b1Ì'½þ8cÀˆoo¼â©¿´¡õ*§ÃûñWvbÈ3—Zfñ£e³)Éfdž"Ë—á\ü-$Gb1$‘DU– ›)ûí(Û‚éÓÑ••H2‰Ûº :»ÆØR™ ;÷Äxü•÷™2glÛ æÛ+%”–ØXb�ñv€âyþØŠrTEùèùÑ(Öü–Ñs ?1VLÒi¢ŽEÄV¨‰œS­‚,­ÐÆøyà@”‚áÞÖÿàíØ‰éîÆô`Ÿp<Ϊ•˜=ݤûþC–nž‹®®ö}?Ž%›Å¶>åb¬–F‰É­Ú±¤x¹ë>$>®‹d]¢—¯öø¤—ô£¿CâqÐDôÌ™È`lÜp†ëb[zBçÙà�܃g`zzÆÚñ/p@¡Æ[Ž#?Ê5à°<¿ —?h) ŽãW4ÚÝGϤH.böTAÆ÷…1¸ÿ�ôôà½ßž;„%�TŠÈ9g½â2¼> yëmH*�*�¢*+ÐõõX‹"½½ã$â1$�  d³OkU‹øj�ùð#×Þ€$“#*$…x.VK324„Ûú‹�6ê8(ÛÓ SN„tÖ~+"Hc±D†´í-›6ú‚çù‡°:¤jDE¤P`Ù~ïgäjÏω֨3èÊ`Œt+"°C¼R°7–f«¶æ³wÉ>‹#dN�½Ã˜ß�  •¢?ž¦#îaÏo™� AŒÏ©´‡ÆúF"è•dæ4°£s Lßã· �%Ó.o¿?€uÒ ûÊË< µÈ5Âîi5ܸ«”ónz‰ï>ÖÆúh žÒ£Æ8c°�>Š�K«ØÑ1PÐ�8º øë¿º¹jõqX� xí»ÑZá*M¿5 G<*¼Z„ö’™üøÈ x3sjÛÇŠ�õ+è—ßëý'Z„´¶´¢”š,å&�ÁŽP²|›?L±§w¸àÏ�  µâí¶^¶¦—pâÙËI=ô]ÑYüföél,ŸK™—æ‚þw¹¨o+÷ÎYJkù‘Øbö%Ý8%Ü5g‹“¡Ex`öWØ^ZC�;Ìe=›XÑ¿ »~î²e¬¾ƒtÖär…Kà'áþxš'^ßÍ)^@ßó¯qcé©ü¹ê˜ÜMñî´:ZËç²qú‘èò„Fø8RίΤÏ.c[i-Â{Ô²­´ŒáÛçŸÎfªxuË;X\ý䱜Þ¤A…¢³gˆ¥_[ÄŽÚîiw@)4¾ƒ�Ò´EkÈhkÜÂG]N{í2¬\ü×C*BrÁ"νê|n{¡�MÛ?)èò3Oà)L)èHqçºí»ò4N_R‡1cWúAm £Z"PQb±zõR^ë�õoî.øØŸÇvÕ$”<·¹›“Õñ‹ËNbÍÚ¿ÑöáÐÿ2ü.+\³j! ›gqéÚ7LyèB/r¨K¾ú“I9ʈ3Ë®¿î<Úªš¸ú×­tô&>“"¾ó/?g>·œß̳÷<ÃK­íS"ôäQ}�GOÚYRŒÁj¬§üö_òZE ×>ø;ºãÁˆàXš+VÍMç6ãÜqÃOÿ)¾¦�{çOîaÞtcÓoý[›�ç§�læõw{õ©�=#T—;\wñq\qrêöµ¤žÝ¶¯&놊Y7Oê”BcdþÞJSS5߸ä D[lï ™ñF%S“+K¿¼ š;¿*ß©ËàþüÒ/¾<±·¦ �ÉßyŒ�h”èEßľúJ^í³¸ûéóæ{H»þÕƙ¥\zÎ|ÖœÑLͦ×^{ÞÎ]‡~˺€ùü?«Š`->†²k®$vÚRÖméá‰Wv²°ikV,`±»—ÌÃ��^÷Üþ—|§0Ÿ¯yr»¡ä̯½|5ÃÇ,!„õHüþIL{‡_þLѰ3’p€ÜÛUUEä”ñººñ¶¿ç‹3ÅWýH ONˆüãË/áÿ“•RS:ÉŠ/Þ’;Ì( 2EB¦(@È™¢!S dŠ„LQ€�) 2EB¦(@ÈüµuS©O?%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:17+00:00Câ®øtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Slovakia/¹$€IEND®B`‚qalculate-qt-5.11.0/data/flags/SLE.png000066400000000000000000000006321520501070600173260ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEµ;±æ»£ÌërƵ:ÿÿÿrÆW,ietRNSþûûþÁö|RbKGDøoéÇ pHYs$é$éP$çøtIMEæDjŒS8IDATHÇíË1 ݳ€,` XÀ¿„×Ðí†fO.ƒÁP°åAƒ¡;l(ʇ CuÝÏŽ:¿‹%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:13+00:00·­ŠëtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SOS.png000066400000000000000000000016051520501070600173500ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÞPLTEA‰Ý@‰ÝIŽÞ>‡Ý{­ç¶Òò@ˆÝT•àãíú>‡Üûüþ¯ÎñÿÿÿR“àÞêùx«çùûþ«ËðP’àÛéùEŒÞG�ÞFŒÞCŠÝw«çøûþ^›â²ÏñÌàöÊÞöÊÞõÉÝõßëùBŠÝj£äÎàö?ˆÝO’ߤÇïõùý}®è¾×óýýÿIŽß—¾ìïõür§æâíúÑâ÷j¢äóøý›Áíöúýg äñöýÞëùüýÿ½Öó]šâîõü•½ìcžãðöüÔä÷p¦å”½ì°ÎñU•á?‡Ý®Íð‹·êE‹ÞH�ÞX—áWQ!?bKGD �³Qc pHYs × ×B(›xtIMEæDjŒSjIDATXÃí–Ys‚0… `�ª¢TШ¨¸ïû¾ýÿ?TuÚN§37/�|/!y8çÞ“d‚ÏÇáp8ΟA‚€˜ˆ’$²mÁïg*�Á`34�¥PH’Y¶&$ÌPGÞy‹°ËHŽ*„(Qváqˆ1ëÇ®A"ë�Tßo¤Ò× “NÝWÔ$@ÙZ6§\É䊑÷æz.«4cŠäŠ"#Z*W¾“¯”KBßIÉ´Œ¯ú†eÂm6ÕªµWùZU*ÿæP·Ïú »ªïÄ„š­‡~«‰ÀoÚƒ6ƒw�vºƒn8 × ÷¼=p$x×­ß÷®xFt0t…G–5rÇáºÑvdÇ“©(N'cçÓ†þ¹PuBfsÁ©› ó!º œÐbIVkïðc´^‘å6#y£lwûûl¿Û*؇S=OO%ÓÓñ›Ñù‚_Î%—3¨�ÿºÀáp8οæ{%OÚ0Xî%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:20+00:00Ê—•tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/SRD.png000066400000000000000000000017051520501070600173350ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<óPLTE7~?4|)êÁÒq$á¡ Ðg%Â:)êÀᢠÄ?)Ñm%íÌ×#·,à¡ ç¶ËX&¶-Û�"Á4)º (¸(²*m6TbKGD�hÙQ pHYsttÞfxtIMEæDjŒS•IDATXÃí—WoÂ0€ÝII „ƒ!PVI˜!Œ°÷Þÿÿ×4¤Myä\ÕHþ„Düàûäó�tFˆÃápnóÀôÈôÄôÌ.¸-xa z¥Ãå¢Ü€Þèp»)7 � ÑãévP ¼ïï^–Ÿä÷K>†1 èrD'…e9b'À‘(!Ñf&cqE‰Ç¨r„É›dJV9å¬�dAéL6÷y!¯jŠ¢©y{‘ËfÒÿ$À…b©,_°â[û³\* —º,TªÄî ‘jE]6ð’u©fÔ¯ñëFMÒa;¡U¤7š­ß3h­f^¦›íŸ3ÔÛ&÷¼p§K¾¤Û�÷\ öúNŠú=x¯Qœ``u™fÿäƒàÎ�(D�TëoÏX Ž'™Îa6%Úd ÎX ÏÆòRüº´4sh•‚xµÞlwvX}·Ý¬WÐ�ÍÜœâÇø°7Á�?ާóuq>ÁcËß&.øüÅ~t¼ÿéúþÌ�ÌŸ±Ìâ‡s›/ŠX’S† p‘%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:39+00:00QøÒØtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/STN.png000066400000000000000000000020471520501070600173510ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ùPLTEr^0¨+®+­+Ë4©+Ó4Î4©+Ò4Í4ª+®*­*Ì4ªf%²¿´Ä ´ÄÒ4Ö2ìpÿÊÿÏÓ3èoþÊÿÎüËÿÐÇ u^ïÁ3)ÿÑÁœ ~eöÇñÃóÅôÅçº:/Ô«^L7-;/;04*þÉͦI;éqþÌ€g þÍ´‘-$ÿÒfõÆE8ΦŽs oZè»÷ÇF8 ¤…ûËÕ¬dQШí¿ðÂÿÿÿÒwGdbKGDR `-� pHYsïï€b½œtIMEæDjŒSñIDAThÞÍÙwSÂ0ðºÐºwTŒ`�2Söüþ_ÆÒ¢ì&iïú˜¿z÷íïÊ%iÞWQÖÖ7�CÙT¶ ų­ì ŠêÙ… ,ÐXÁ¤ÀcNð € þ(ÁL0‚iD0@fÁ`$ØÛ?pqÌTÏáÑñÉ©{c ž�_\÷Æ"@=»º¾!^·Æ€»‚eÁí­³|9@\@ï|@X@}>ê$_ ÿý½ŸØÏ-b- 4û¹€'0&±b,¤—²9`-G¢ÑèC,ÎX<ö _FÂr¹ÀJ@ÉÇøS*�a,“N=Å“ "“‹F‚çUï ›cS#—•Í…ºàåuÅ©?ÿö{û·¼ŸÊæŽ^òþñiÞÿóã�ÈçNÿ}|̾ìå\o"KæJEb'çxK-WôI¦O´J™ÚÉyîR¨UÙw­^¯}³ªf'çøKq£Ùjw(í´[͆�ÜÀ>íöúÆ«¥ý^—ÊçÖ�­ˆ †ãÛÒá€Èç–¡­p²Á,ßjx¹ÀÍ�ÂÿøQŠþ,GLÐG3ôá}± Ì8óá ½“7I'ˆ…] ŽÞ¦ªt”ಠ‡j�1ž t7{‰7cÅ£d²åL «ŸÅ�áu/€ªzG«*l{ÇÆLÁÊïŽ-œ»z�þ¡ABÂõÛÉi¥¹–¥ ¨�5UTE#mªgÔÎ?£¾®žCmíÙÛŽb%ó“mÓ£‹=W  �æCË™�øõa7moo¦UßÈ;†—ŽÆ-¼ר™K°_5ndwBåxU;šÝ\ï&”¡dþ|qÁoߧ¾“`ÌCê.C^¾íêÄÌ™¸½Uìn<�è.�Ù§K4ÕûG–Qt¸>q+™ÀWVÆ—|L•s Üo�ÞPèݬš}_~Î*0sló/púЧt_¡«ïÑÔnN�Û£e§�¤ñ˜Á¹-pá�³Ü™»GÇñªŠž‚Rœ¿çjcöžDÈOcüáT�CSdãYúÆûè»Fkýiš«ßg2ÚÅ�©‹œÚsŠÆ†&ü~/'Þ܆[ ‚§ þBïbMì{vú’³JZñ›=t¼·ƒg±2zôPí¯f>Á£F „©©¨!¥¤ø¢ýÅÊ4¤'Á{ÈöA„I|)„x?¦±HÔy˜`,J4ªPí¯a|fŠíM>*½.|Ö(Îü'š·Ð«^âDÀ+Jå¿üMp#Ô'ûâ}QJÁÎ7³Wµã²Ãòß‚Ù�C¤7Óÿ+{_'J€Œ(Q2¢dDȈ� # @F€Œ(Q2¢dDȈ� # @F€Œ(Q«�J8¬„%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:50:46+00:00¤ž RtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of El SalvadorGÚ²0IEND®B`‚qalculate-qt-5.11.0/data/flags/SYP.png000066400000000000000000000015711520501070600173610ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<öPLTEÎ&Î'ÿÿÿþÿÿÈâÕçòíüýýb­ˆ­ÔÁàïçŠTi±�¨Ò½z=-‘_ëôðâðéÇâÔÊãÖÊã×Êä×T¦}x:~C—ɰÍåÙÈãÖÌäØóùö×êáV§~‚H �G�H|@z= D €FŒÃ¨ôù÷ìõðzºšy;z<±ÖÄýþýýþþ­ÔÀˆQy#€�÷Zü!ø|~PøÍ¡pDŒÆâ‰dJLg²´‹³™´˜J&ⱨ ‡L¹¼$Š—¤2_©Ò€j…/K%Œ‹YÊçÌmQ­.Œ±B„F“~ÿ͆@”¯eD®×ÌmB­vGÅXíö³^÷{U§Ý¢- ?d­Oˆ:¢' *!}�zžŒtEO¦3öüÙt2}dðéóÅrµÞ°�Ízµ\Ìuú CœÛÝ¡ÃñÄNÇBûÝ–úQ¡Úùq¸\o¬ù·ëåq&%»m›-–E»ã0è8˜Çïiž1ƒ­XAcCÃès6�ŠÇ‰twÓ·k=6ÿôS´în\pQ!~\T+UâR²Í²Ø`Ûì)3͉*¯io¼ñ?üðiÛ2m›þÎN:׬aàí·q<ˆv\ž.\4ÀÚl›w ƒÝRP>í6Êkfc¤¢¤†û9vt'Ã{©©®æ“M›˜:ujVmK §£ƒ¶×^#òöÛx"„ªæºË¨ uý™\¡)YcšüÆ0èr.¿òV¦Îþ|…•4Ø%“ 4܈ã8¤"‡¹çž{¨©©Éª}–—3ùÖ[¡©‰þ½{¡·7ãrŒœ {‡WÓi>¶, P:…†9?¢6Úƒ#.3A]÷gømµfG·ê?È�wÞ‰¦eïÆTE¡¢±‘²›o¦w`ãë¯Q¥<7I²íÌçyÊÙ…%@‚ã€Ìââx¿·Ø/§Óìw¾É‰”Õ]Oy] Gv÷•2P6)T⺟þÈQ± {÷ì ¥¥…É“'ŸõL””P}Ë- ˜&±Ï>C5l¤#Îl/™þ¥½n¬ÆFÌ@'E±,!ΉŒ IH;¸¯µÐ\ OãY„3 ¿ß.Y´ˆ�±§cƒ(fÃåÁmÄ(Šö¡86Uá#U�h°+eÑ¢E<øàƒ¼ð gµ……Üô“ŸðiY1}.£¨ Ždü"à 9”ýÕUÌ\ôµ×_�™Hpdófºþð†>úˆ¢X q–$\Ð`$îi6šïø—êË+ù nñV‡MÂ]×ñz½8ŽƒßçÃ4ÓøÈŠéxÓ1¼©Ý•Í$Ý…Xñ ±X©x„X¯»T¾û/?f£˜tÇ ø¼É´`w§¤xR-‹^¢ù¦»Ð4•c½½ì]¿ž¯^~™‚¶6|ªŠTÕsN{œ3Ðl�õ•Êp×į—€@` Y3ùc·3îÄÈÒû)¸õækÙѺ“.Såj/ ÄÓ™\Ï pÇÛª”§’“×u7ýãR6ý6Âàª×PMIá1ЂÁ�7s$P…§¤„ž-[\¿_0ˆ®jÈóÜÓeE€”`JFS�Š’1^: v¨XÎĉ/ØÖkl‡ñª··—ÖÖVÂá0[¶l!�²mÛ6ùòË6ºBój”×о)ȶmÛ°,kôùP(„ªª\uÕUTWW3{ölJJJ˜;w.………Ì™3‡²²2f̘A]]ñx�ÇsŠn——ïüðßùd{Šøª•T �Ò&üÕ+lþ¯ÿFz½¨Á\–‰®(ØŠ‚#%BdGJ¾‘/ ®,£3ûõ6Õ÷¸uI".i;PˆKwqyIŒxÊEYaš’"û„ˆÿ\o}n3‘{PUEQ°mMÓ0M—Ë…eY¨ª::»O¼Ç0Œ1m\yå•<ùä“<ðÀH)QU˲p¹\˜¦‰¦iض�¢(H)‘Râr¹Æµ'âãWÿ‰rg5.]É„ #+æ„,«‚$xÌÍÖ=L©¦²4NiaUćúßÒñ (p²– !%AW!Û•™lWoŠ)H†Iš~ê�ÏùïáÃÎY 8 aYBˆ3ÊÏÙ@�‘Ñ“¬@Ò|¨ü=»Ë®g Ê�~®ón¦IîD#�]ûYEAú�wg=„R8Ë`Ò±CD}“*©EFŽrï§Ë™š ㌳æ!Yk˜¬1 ¬qšŸ7o·Ür +W®dÉ’%¼øâ‹<ú裬ZµŠyóæÑÙÙ‰¦iLž<™M›6±páBžzê)b±´´´p÷ÝwSWWÇÆ�Y¸p!¯¼ò �?þ8+V¬`ñâŬ[·Žææfâñ8===<ñħ؋FùdéRb«V¢Ê NɰêâýkÐ_ÿ=4%#= ŽePyh#wï^C‰cžvöC–…Y‡½—M#^=“)_¡H›pÑåTì¡(Ö‹=ŠßŠ£+]pÊåEðC]çºÎx)°ÊÊJ®»î:Š‹‹OÑíéÓ§3eÊêëëinnfÒ¤IÌ™3gÌÆëÆo¤¦¦†öövº»»ÙµkCCCcüI(â‹/¾ ««‹ÐÖÖvŠÉd’?ýô§$W­Â'Aã÷Ç-$»«f2P.‘Ù&Åú(�F×T‚U3èö£d¡Y`G\>É1_)º™@qÂ…•¤ôåfœrÛœ°ÀB:p¿®sï$ŒÈƹÈGssó)z~¦ ÑÉ¿¦ÉæåË~óMt)'Œé� =ªÍLR´ű0\^TÛDH‘Âm&Î8û!K "h íå£H7¡âZ*Bû –MÅ— ƒtéØq¶'~ã tA&*‘£P(4nì‰D8pà}}}hš†Çã!ÓÞÞŽeY(ŠÂ]wÝÅâÅ‹yç�wÐ4�òòòÑ=ÅÕW_�ßï§©©‰ÂÂB¨¨¨Àï÷cŸ°c4m›-+Vúå/ñXÖiC ¸¥dæ±}Xƒû°U!%žt ozKÑ(¦ÔLL˜ÚCh6>@i)Ù¨¢sê÷p—N%ähåtœäs¶¿Æ_Gº ‹óM˜Ç Xm¤É¤"t]'•JáõzI$x½^R©º®�–ªª˜¦‰Ûí&‹1{ölÖ­[GEEÉdò”{’É$>Ÿ�d2‰Çã!�N£iRJÇÁçóaÚ6[õ+zž{o2™UBMUçÝ™.»‚ºÐE%\XEÈSÀôor[ÿ—(YŒGÖ¹ M*Ó3ÁþÚTE#ªû¸¼ãnêÿ÷YlÃU`šª‚Ç!iÛ†�ã8†�”rô»išØ¶�mÛ˜¦9zd4;‹QRRBee%�UUÑuEQp»Ý(Š2ú]×u4MCÓ4\.iÃ`óK/Ñ÷üóYþ\Ò&eŬ¿��’)¨Š‹!·Ÿª}qCÏN °ÉFƒÎ*$€aÅÅGU×.¨ &´�‚»ñdÛÀImI`«eñkàÏ9÷½‚‚,XÀòåË)**Êê™X4Ê–Ÿÿœ¡W_Åcç”J–R"�ìœÔDkãíÔm冮?S„“•üÀ9&ãlé` P÷y–ŒÈü6�æ‹ÓeòÆAmm-³fÍ¢©©‰¹sçrÛm·áv»Ïø\ßÁƒl挵kÑç¼U¤”ì÷•s™1L±�ÆÉrðá<²¡#3øB@ÂRò¾iò�iË"Ò4�gŸ}–%K–à÷û³z�iÛ´ø!_ÿìghŸŽvÏ…Åñ“µ³“œIB†H�\£ª\¡ª„¥dPÊÓÖ ;ŽÃ®]»hmmŲ,*++'$bäP~ë²e]¶ ÏáÃc²©縊.šªˆŒ–¥Ø6L“Û­šªª2cÆ {ì1.\8º'È—¥œ«QŒ-ÌÚjÛì±í1…YãÁíõòÒ/~Á=ßÿ>=;vä ³ÎÛ8¾)M �Tš–’´”™ ž¥À5ååL .™ÒDñžïâ%`ÔÈ‘ë¤âÜ¡�Ù[("óc&‡v‰çúª/3OÅ™ËÓ/�~‰ÄFqiXú Í{‰®€¿äÿ¤—cäÿ¤—ch«·Þ›k¾Õß}hCÞ äš"òN —È{€#O@Ž‘' ÇÈ�cä È1òäyrŒ<9Fž€ãÿ9kR"x{º-%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:33+00:00õˆ�–tEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of SwazilandWJØœIEND®B`‚qalculate-qt-5.11.0/data/flags/THB.png000066400000000000000000000006531520501070600173230ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEí$í ólrÿþþÿÿÿþþþrm� L$OÚ�¼ŽbKGD�hÙQ pHYsttÞfxtIMEæDjŒSSIDATHÇíÖA À ѱ€,`¡°€, »&„¤¤ûîsdùw*U¢I5¿10ÞKÛ¤eƒ@ÓôLpv.1?Ÿ˜› ÎLCC�€À,Ø=‹�–›—Ã+OBËæ§KÏ=örA`äÔêÚsÿ ÷ºñå+Óºûµ?¹¶š’\@ÂFzs%ýæí;ôþƒìDâÇOŸ­›é Ð…¿ ¿|�|ã·$ßÿ=ýã'8( ÛÞÙÝ“÷�Žöå½Ý�mV�èqêäÔ«gø³3žÑ{OORÇQ¬èüâ2¿½¼8QW02™ëüö:“Q¿4†ú­1D€"@ˆ o`ÌÊÄ ¥ë%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:44+00:00:êºtEXtSoftwarewww.inkscape.org›î<tEXtTitleFlag of Tajikistan¤BïnIEND®B`‚qalculate-qt-5.11.0/data/flags/TMT.png000066400000000000000000000107371520501070600173560ustar00rootroot00000000000000‰PNG  IHDR`@å4rgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsGGÁìýØtIMEæDjŒS©IDATxÚíœÙo\×}Ç?çÜuv’Ã]¤DJ¢$K–c[”íı㸠�&md�›"�-P @_úÜç¼-Ú ÐAÒišx©c7‰eË‹äE–¬…)ŠÛpHÎp8œ¹Û9§CÛ”­8œ�Mk>ÀPzâòžßùmßû;Wùé_v€‚ÇùÆ™2‚UkÑE¯¸,ç-JE ­#®C¾1ºbû³/À*&8�äB†¿¿{œ¹“Ë~ì±Ûùr³ä {b¢e—zÅg Ÿò1I}Ÿ¢?‘écJXÖ(¥b7¦®2üÖ…UA±âlVlt,Àù°oý£ÁÎ €Hb6,æ63\štȱ'ÕdÏrD^8\^W¸µ{Fsà�±üȦMQJÛdžxŽûÖæ0º³ó·³cv1&¾ìr¥'ʼnñÝ/+*™>–ŠižËgùE^ñ�ÿRäå4õTLW-Çñ5Mñ±/òãr‰õÇË8wÅ -‹vر„€dÍát>OñÞ rS=¤ +œéç¡Co)`,•g`è V稜9Ëv†þ¯ÿ%›O=ÉÝwÝÇK›1éK—;Ê:·mäC’‚CE>Û5N=pØ`“¸©\ÝäxfGŸX®ÖÉNNP®ÎrÆ3œ¬¼ŠÜXâà�:ˇ³”®Ø`~ÿî[? ±õïÇ‘¶’°¥ ¦æ3;ñeŠsÏ�?ø ž{‰�fX3Èl‘+wpήrµËfp(Ëç—Ÿa³6Äj}Š•y?öwt-)$_Ø3IÚvùï/ªøßhcÞ1Òn¤�Œ(° Š“§¯rö'?"ùâ× J5"-I=rœ}6X³3üOï¥=ðÕPóÙ•ë²CùuÍáð¯ 'b¬ÞÍCÆöyhàŸ¾‡.7óŽc€<é0Ù;AÑË£Íîô��{€,èm0ve‰³7Î1”‰é¿g’ñr�ô¸Ílí?øü¼ä^gžÂæ2�ÖÌ}¦¼.üó6£… µ| ´ø@Ó õ¤É?^ú%že³Ô�H>=p”¬“âÙÅ7hªˆFÒL"þæð—øáÕ§™­—‘bwyÂÎ=@€ªYè‚â@\gà{?aé™§yáÍçxÑ[gª4O}Øâ@O‘Úªá\ÆçYÝË|©€~2ˉ+M¬=IÕf'á\Ãt}‰·ªs(£IÙ._Ø3É·Ç¡ÇË!ç*3”ƒ*{ü[7yÊn¡-�9…ÌXÀXI±ïbHøV…é‘k\éAÕ¨\DZ�¾’ãÞë1… A Dp0ÂNi¤¥vT†J!yxàN<ËáÙÅ× Ţž&ï¦Y ÖoŠùOÌŸá[ãóͱOóÏ—Ÿd79ÁÎû ;_vÐyEàk¼½Όϑ Ìlƒíw.L«ØÑ= º?BZ†pÁ%{W„´Í-½àíÝ+dl�?=I·›ãÕÕ«”š.׿oa(ÁBs�©Ú_Û÷)~vã4å÷è£ÌÎû ¹ê`eÂ58ôŠ4%ZÍÚÛXrk�×-䦅�‰q‹1Í•4f¿xŸØÂâ3ƒÇ‘BðKoÐHB¾ù)|Ë¥m >`[G*áÆæ  ãŽÂ(¥fk—¸A[eh¼â`\M<ëc–<ˆ1�`H\�]P iJd]b#pb�˜õI*ú® âª�InÖ‚ †¬ãó•½àH›³«S¬„5ÎWgv”X£�B2–ÀðÆ‡½®Û`6-¢²ƒ ò�üv¢‡¾¾&�Ú%š6å�ß–8qu�‘jŒHìªE\v‘Ù÷Ç� üӥDZ„d=n` É‰Þ \ióòÊe"�üοË’¢— e{»&ü´m™UÄÓ>Ó®Ëåq�û†VèΆ¬º�Ôž_A—l–'r,ßqgß³dVë‡ZðvÔ„*â߯ýš”íR‹¿sW+£9Ù{ˆ¹Aš*âÚÆâÇׄ�È\tyíýç!QiîKä›ÐMcQtêLž¾A—±�–Ï� ó¼<î³R°w,ÄEZqfõ Ð*˜nµ¤Úúüß9ð(Ž´9¿v�‹ës»ªkKœ7€�†+еÃCT>ÖDÈå;3lF>bCà‡Š ê13šeó¸Â‰˜=1@wâPØT;âwüÿm´ÑdlŸïùs&{'ˆµâGÓ¿¡Õw•´¥‰¼Bº†¡¥o¦„—‰°ûc>¹Ÿ7ÃÎ+œ&\?™åÊŸÜM¼Wâw'Èò*Ã35\e]ÉV#¶3´1˜-Á̓2m4{³ýüÝ'ã±ñÏðŸ×Oñøü+±»ø´õ@FØë`“;®ÂÁ_,b•® ‘© ºëdöG4 ~O“æB‰ú›ªìóµå2v"pGdAüÞ-oër3ôû6â&�Šp¤ÍPª‡OõßÁ—Gïg<7H¤~2ýß»ð3‚$úÀ~á£H[dÔº…Ì)²Ý jÙE•]D¾:3‡•Oˆ†\¤ìy*æ/JSdb�Ê'/@zoODRÍíH @3 )zy¾5öóÃôûúü.²ŽO=xaù-~<ó¿Z|�PÅ»nñÛ2DNaÇ3@Z#ç<%H'¯Z$«\ ƒ[Í®� ú"ä`„óŽ´³KF:áùå·8W™f,;ÈÞLÛ£žÌn–™®—¨ÇM¤�»rñ¡M-(7‘liA‘¯ðFBôŒ�à#¶mìÖbt'¨þcoiAÇ#¤­ÁX;º®‚zr®2Íë•kÛ® �Bbí²˜ÿ^ÚÓ‚Öl¬ŒÏàJˆ+N+4Y‚JJâ(ƒ–-Cø‰!jâ¦…ÓØÒ‚z‚µ4F‹¶žÉ @ù±œ$j[ Ò~K –=.t{ì‰b"[pê`ŠâFBÓÃÕ„c !ç‹%I¡ãß º…t;Ó^#fDÝ¢^õ8ßã±w%¦’–œº#CàID¾Uç7±˜ðPÀþå˜]6‘äÐr€Ì~Ø·üÑ¢-¯¶r kKi¦²ùMÅò¨àü¸Ëá…�®šÚ£¡”t¸ïj“…›+‡-²aB9m1»’CºzK êíjAË.µ†ËÔA/TŒŒ6 ƒ½&øÊ™ zBáì½�ä•iªQÌ¥=Žú5ÎûY’Àª¼¹�õ· m-ƒ`ë)—„ЕH BC" {¢›àä^æú`àÁ}K¢x‘!ð-ôÖïíÎbñ�G{Z�Gò �0 b�1­Š&Y G“ ®_$xé%Ð-QXÅ4dBM:ÔìÒé‘?m$a�È)”�+Ù»¢  �|Csªœû H ]èf3¤°©(õ:L\ ˜ÏzDŽÀ-$�ÙÐm´¥ájFû6ð¦ ײ6{N Cš÷ûÔòy¡Âãb¿ÃÞ刽§MŽÖ"eêœïñ;9`mjA6ä¹lÄ@C²Ðc3QŠH%†Kƒšž &²‰HH‡†ÓM» ¡¡/I°FB’JvGZÐíB{ZP¶¥y£#Ë ¯’&­ »£\I®¡ ]‰AÑ[WôF`šþT€=b§ÛÓ‚nÚׂ¦L^f}¢�¾ÞÒ‚>9ÜôäÊl}­Õ¢\C¸è’½óí¹ N€6µ  j!S Þž ª´ô„C,À6­ï%[!ÞG@ÃB6-¬lŒã&•4FÓÉÁ[´%EDe“ÒÄ7|’Eb�²5McP} ÒàÎ�P#®sÝÇTlÌñ:Q¥£m§=-H›ñ²ƒŽ`á>Í\Þ%‘‚¦/QyPø¡Æ4¡8übkjÅAîìxÀmC[éPæÂŸ8¬Þ­9³/C©’æñ�>Nçû™x-Çäó)–Â"?Þ7ÀõÍ,ç2Yf'%QWBp9…ð;ZÐvÚO7¨²KH6Ž*~ú@‘§Gú`Xòp¥ÎðfŒ�d"È…ŠO¯l2�W¼5œãû“Ã,Ü-r†hnk.¨Ðf'Œ†¸ÛðƒÏ ðf*ωh“/gCìŠà¥¡¿~ò:F:ðÍÅ�TJcì&ÿ& üÃý£|·1‡\ììþí´‚Z g…09_c0 ˜µ\.'ËÆ08œ‘½&Ù¬X\’….ÃKò5�é”?7ѶäÔ$þoëóežïîâìœÍ•}Yz×mºã'.=�ÿö¸ërƒ°¤x4³ÂŸþf�Ô´Mù˜j�Øu ´©IO“ÞPŸöyà©ÿá5ær)ú…`}Psa2 GÅ\ëÉÒkré˜Þ¤Á#OÕ±RÃ!NQvš°m´§UmD>Á+(‡c/ÆìO%(ÓêÀJã�œä¿­c ¤ÀW«lãÚ`w´ ÷Ñž”Q؉F�˜”™÷ð•`C„a|Þ eBK$‚ ½qk.(«‘vG ÚN{gÄF#’«äIVᎆˆë>yDë55 P† ¼â»ô`þÖ\бŽ´�¶´ pÝB¦4¸[X˜­#§«9‹µbkEX)Œ�dÖËMì†D†v.Æ)$ë-h;íiAˤɜ‡Xð¨b1sT’90>h0½“¯ˆÛó V6 ¯?ù$ƒgfœU±1wv´ ÷Òž$ÀÔ-6×<®Žº˜O pÐ�)¼z…¢¶°‹i‚•*ù‚Oúì=‡�0w¢—7^X`ôì,Ã+!Òû°où£E[9ÀêJP¯xL÷º }¶Ê˜Î�" ¹gœuŽ¿î�,®²±ò©¾nöîŸd°âPùö£¼Ô÷=??…<©oyFìveÇõˆØÒ‚ôŠ ž`HÚ4/¬–kw˜F9G"}9D°ÞK0¿€Q1koTèZÛ$]È¢›’äFG ÚN[!¨U¿k„׃8öWXç‘£ƒèÆ&Ø@øi„c£#�öºH®þ±’\9�.VçeMï¡=l¡µ$È�Rè[Ã- AÎà-Ÿ'ÞˆÐ5 ÷Àig;\$•É¡t‰(êj�Ýêlþ›hÛ¤£ %Îþè_é¿·—Í:⢤ëÀýˆðA ²ö3¬¾�ŠÅ;o3Œ5ñº¢ªEõRªõÎèŽnâ2€Q‚�iŸxÓ";R˜h‚„¸n¡‰ßc�´ 3›ó:�Ç·à2´â{³ä¬Ø­8ŸSÄ:„«6IS¢�Q[[þm÷èpÿP.¦`e‹Z%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:10+00:00i‡ûHtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/TND.png000066400000000000000000000021251520501070600173270ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<JPLTEççççè é'ê.ççê"3ð]iõ–žù¿ÄûÕØüÞáì5Düßâÿýýÿÿÿé)ô‡�ýéëì3BùÀÅÿúûýíîüäæí?MûØÛÿûûúÍÑîO\ë0?úÏÒð`lé&ææ é#ð\húÍÐÿüüö�¤ê/é"í@Oòq|ô�–õ’šó~‡ïR_í?Nö�¥þùúô‰’è ðamúÅÉþôõüÜÞõ—Ÿ÷®´÷¦­üàâýèêê,ø¹¾ýéêúÌÏÿþþèöœ¤ûÚÝîKXüÛÝþö÷üÝßé*ð[gþööþ÷øüãåÿûü÷¯µçþ÷÷ûÒÕõ“›îN[õ™¡ë(8ýæèê-íAOé(îIWýîïîM[þóôúÊÎó{…ê$4ûÑÔðcoûÒÖó€‰í;Jè!èö¢©¹U3bKGD{¼l pHYs × ×B(›xtIMEæDjŒSÎIDATXÃíWG[Â@Ín6!Ô$‚ ATÄ‚½ì{ï½ëÿ¿ºÐOž’ñ´ï�ryoúÎJ’€€€€ÀƒJ Áb§2QTŸOUˆL虦û�@0  ¿®1¯­×ÂF$jÖ�aÍS/˜e7˜¿Ð`[:Ábñmc"™L4Ö¾ã1ÏXS30¦Òv&«ëÙŒ�NÁs“G ,æð·äòTf¬µP�ÛÚ;o| ħØYbD"¬«»§·Ü×?08Q²¼È´fÿ°Â¹èÈèØ8Ø^œ˜œ[ó @a¨ŸN‡¿4�ú.£™Y¨¥°û iÄ¿ü•9þ9¿PWX„‡áÚªGxý両di(WV×~´CDw›ÙÏû7�çŽeÖ�²º±¹Å_Û;»NOûe—"dƒ™K{ŽÍÕÊ~ùàðèøÄ ‘i¸œ­D ðþÍp3ééY-¹çL½¸dW×µw D šf"ËS ßÀˆ¸½»!„±‡Çz‚ª;ê ™f2)?™‹Ï/¯opÞ�÷�¯,‡|.€"ô$£—)~£¡� ôa‡?®Ñü#ýÐÇ_[ð/üÕù•Ð×wÇ Ü ˆÜ+”€€€€ÀŸø±]\Yú#ü%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:53+00:003ç„tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/TOP.png000066400000000000000000000011161520501070600173430ustar00rootroot00000000000000‰PNG  IHDR€@å�MgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<QPLTEÿÿÿÿþþ×ZZÀÁüôô÷àà÷ßßúëëì¯¯É ÉÈÜoo餤¿×YYÁ×[[馦øäää��ÔPPÆÄ øààÈîæÌbKGDˆH pHYsMMÀ9`ctIMEæDjŒSÀIDAThÞí×A‚0 à!Ó)¨*¢ÿÿ‡—rYMçKÜ{×úÚ2œS¤Ù´Þ*šúU¶»˜°G]ÿÉñÔ€gK `Œ§íD@µ€ë p?Èüßî˜CnÈüw9^úÜ>(�ùO“샒€1ûTÒŒü5Ý„ð1„/¢5°Uœ4cÅ_Cà—Røµþcò=p€› OEÂlxi²˜Õ÷ÎîU@@@@€.o´¢zp àh¤%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:00+00:00¥-ûÖtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/TRY.png000066400000000000000000000017621520501070600173660ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<#PLTEã ã ããä å+æ&1ãã ç+6íckóšŸøÁÅúÖÙûàáé=Hüàâÿýýÿÿÿÿþþüáâóš æ!-òŒ’ýêëÿüüþøøýîïò�“ãé;FøÃÆüãäö®²ð|ƒì[cêLUö°´üäæé>HêFPûÙÛûÚÜç.9ããð†ö´¸êHRþúúô ¥ç,8ç0;ðz�è6Aãþõöð}ƒää!é@Jä#ã ã ääç*6ä"ô›¡è5?øÆÉö²¶å$êFOì]eýëììV_êEOñˆ�ùÉÌüåçì\eäøÄÇýïïþóóå ,ëPZó–›ýíî÷½Àå)ëOXôœ¡ú×Ùüæçé=G¹å|SbKGD{¼l pHYs × ×B(›xtIMEæDjŒS’IDATXÃí—WSÂ@dz—ÀBóPÐH X!Pìbï½·ïÿ)d’Ã�dÆ ·o÷{ÉC.ÿÍîíîí)ŠD"‘Hð K�¨ …Âá�*A�§z$jÄâ‰DÑ‚ìð•ë~ zNÏÎ/.¯®ék1!Ûg�zsËØÝ=c¹Í ‚PÜí?Õë5UŸž�/¯�êš„ÎçfÕË@çíýÃt=üü –JèÐC„¾ÉèiŠ_hè­½Ùá·kôÿÈD?ôñÇüÁ tÄ~ôñÝñ÷â€{…’H$É?ùàèFÌó%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:11+00:00ÏððütEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/TTD.png000066400000000000000000000103651520501070600173420ustar00rootroot00000000000000‰PNG  IHDRk@Ô‰ùgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYsÃÃpMBtIMEæDjŒS¿IDATxÚíœG[é–€ßRŽ$ƒÁd“s‰`ƒ þ³ëç.f?Ï,{q÷ó¦—ó3„ìÆ´‘„Aä &g©”¥Y”s¯û>Ý}Ë6ÁgéÍ9®÷s}§ä÷áãÿ=™÷_ÿ‰*3ƒ«ØØØà§Ÿ~bxx9ÃjµòË/¿P__ýg‰€È§¿ÿ‡ÿû�ƒ Èšó!…ò?wŽøv1v´ 4ÈÌ̤¯¯�­­-–––dKæóùp»Ý455QXX€ Qc´´œš%‰þö;¡ü›&ëçÐÜ"Á¹% - ¨²³ Ø›7o¸¸¸`jjŠD"!KÂ��Þ¾}ËóçÏ©®®@¡Õ`êíD™™NÀ=CR þö…PþMÿäg�ðú×$ºš 4E Q«Õ¸\.¢Ñ¨,IOOO±ÙldddÐÒÒ‚B¡@P(0¶5¡-+FôÌ;=CP(¾÷ó¹S!Á…‚èÞ>þQ'šüÆÎ”FéÔðêÕ+Ö××YYY‘­�¥¥%\.---äççKÅ™Œ˜zHFcˆÓs�=j`_†ÒCI$ z-®`lkD•%�ú¬¬,†††8==ezzšd2)K1>Ÿ�wïÞQYYIE…tg*´Ì}](Í&ĉi’ÁУöû°@­n º§Ñ×W¡)x€ÑhdppA'‹ÉRÐññ16›�œœšššA©ÄØÑŒ¦¸�€gšøÙÅ£l<þ5¬T ‘O{øG]h‹ ÑU– Ñhxùò%ÙÙÙ8‚Á ,El6 …‚ÎÎNT*úº*ô�µ§ç‰î>:`HÀb'gøGÆP¦™Ð7Ö^wŠ���TVVât:9;;“¥°H$ÂÈȧ§§X­Vôz=Ú’BLÝí„W6ˆl}|T¯Ä? @P$"þ÷N’±8ƶ&„Ô÷Qmm-���LNN²··'Kq‰D—ËÅÚÚV«•ôôtÔ9Ù˜û»‰îZ\}4�⟂H­}4JÀ9Aôðcg ƒtê‹‹‹éïïgee…µµ5ÙŠœŸŸÇãñÐÖÖF^^žTxš™´�¡0Á™ùGñ#🇩N1ApzŽðÊ:†ö&TÒ©ÏÎÎfhhˆƒƒ¼^¯l…nmm122BMM eeÒ�©Ði1¿°¢Ðë LÌ� …4°¿ ¤‡"„–Ö NzÑ7Ô ~– €Ùlfhhˆx<ŽÛí&�ËRìáá!ÃÃÃäååÑÐÐ uŠ*%&Kšü<ĉâ~ÅÃö×a¥BPD>~Âÿaíób´å¥hµZÈÈÈÀáp …d)øòò’ááa4 (•J©Sl¨AWWEpz–èáñƒìÿmX�ê�N¹C••�¡¡¥R‰Õj¥¬¬ §ÓÉÅÅ…,E‡ÃaÞ½{‡ßïÇb± ÓéÐ>/Æhi#´¸JäãÂ{%Ê R�¢?Àå{ `hkDP©¨¯¯§µµ�ÇÃÁÁ�,…ÇãqÛÛÛX­VÒÒÒPçæ`~i%âÛ%¼¼<œNQ6X€Ô)F"ÆÜÄNÏ0u´ ÐK§¾´´”/^°¸¸Èææ¦l)½^/ÓÓÓttt�““#ý¥ÒÓ0ô’z ‘xÀä…ÒC‰Ç'½„7¶0v4£L—NýÓ§Odww—ÙÙYÙRnll0::J}}=%%%(ô:Ì/¬j5¢g†d8rï�É ®Jhq…àô†¦:Ô¹Ò©OKKchhˆp8ŒÇã‘­SÜßßÇn·STTD]]�T†Z…±»õÓlÓÄ/÷ºSü:°®BoùŒM «x޶´�NÇ«W¯0�8�NÂá°,éÎÏϱÙl ÚÚÚP*•‚€¡¹]UÁI/±ã“{Û)~]X¤t�ƒ#üï¨r²Ñ×U�  R©èé顨¨‡Ã�ßï—%_(âíÛ·ƒA¬V+šÔœê*J1v´œ_&âÛ½—ÿ¾:,�€%..ñ�8T* ­ ©SßÔÔDSSn·›££#YòÅb1>|øÀÎÎV«“É€:?sŸ…ȶ�ðêFª¸ûí›À¤N1ÆÿÛ8‰K¿ô›¢V @yy9½½½ÌÍͱ½½-Kºd2Éôô4ssstvv’�� €*3ƒ´�^âgçç–îU§øí`Áu§pOÙÞ‘:E³têóòòd{{›……ÙR®®®266Fcc#EEÒ�©0è1÷÷ âä,ÉÈýè¿-,¸éç–½‹[På< ##ƒ7oÞ˜œœ”M,ÝÝÝÅn·SZZJMM�T†Z�©»Õ“ D÷ qQ¼ó¿x|{XW!„7¶ 8=èª+ÐKb©^¯çõë×hµZ\.‘HD–tgggØl6ÒÓÓimm½K ­�hËK%±ôän‹¥ßWbé—﨟塯­@¥RÑ××dzgÏp8Yò‰¢ˆÝn'�b±XnÄÒªrŒ­�g‰~Ú»³À¾+,HuŠç)±T§ÅÐÜ€ T ­­­Ô××Ë.–ŽŽŽ²¿¿�ÕjÅh”†14…Ï0õv^ß"²¾}'ï°ï �:Å`ˆËß\$ņŽf©ï£ÊÊʯ"–z<éêê"+KÆP=ÉÄ<ÐCìø„àüò�Óî,¸-–~Ú“ÄR“tê¯ÄÒ�� –——eK¹¼¼ŒÓ餹¹™‚éμK‰'§gï”Xzw`ÁõC z .,chkDõä¶Xzvv&«Xº³³Ã»wï(//§²Rº3 ¦Þ.TifIÞ�¤»ë*�ðÚ&�ñ)ôµUh o‹¥ …‚ññqÙF�NNN°Ùl} HbiÚ@/qQ”ÄÒ¯Ð)ÞXpÝ)Š“³„×7o‰¥999 ²··'«Xº¹¹Éèè(µµµ”––Ÿ‰¥MJ,•wéaÀ‚T§¡¥UÄÉ9ô_K£Ñ(²‰¥Øív ®7½ *&kê¼§²‹¥V*A ²í#06޶¼íób@K0›Í²Š¥Øl6ôz=ííí×#H†¦:ô5ˆS^bGòˆ¥¤~><‘ÄÒì,ôõÕ×#HÝÝÝ”””àt:¹¼¼”%ß•X*Š"V«mJ±Ó–—bìl!´°Bäã¿/–>HX�ê/ý\Ž8¤�ØÖF•$–666ÒÜÜŒÛíæððP–|ñxœ>àóù°Z­˜ÍfÔÏr1½°ý¸CxåßK,, %–Fð'~~)‰¥:éÔ—••Ñ××Çüü<[[[²¥œ™™ÁëõÞK3Ò1ô?¿$4·ø—ÅÒ‡ nF�&foù¤N1M:õWb©Ïçc~~^¶”kkk|øð�††Š‹¥;SaÐc~Ù J%â¤÷/‰¥܈¥ó˽ ZêQçH§>==�7oÞ Š¢¬béÞÞv»�’’jkk¥2ÔjLݨ²³$±Ô/þ©{ìqÀº A ¼¹MÀáAWU†¶DÚÓ«×ëyõê:�§Ó)»Xj6›o‹¥- è*ž#NÎ;9ýÃ�âã‚EªSÜ?ÄÿÞ�:÷©$–¦F�z{{),,dllL6±4 b·Û‰D"X,–›¤Ê2ŒíM„f—ˆüA±ôÑÁ‚+±ô’Ë‘1­CKýõRKK Œ��s||,K¾X,Æèè({{{·ÅÒ‚g˜ûºˆl~$¼¾Hö¿��KÃøs‘ˆ;šQh¥S_QQAOO^¯ŸÏ'Kºd2Éää$ ·ÅÒ¬”Xzr*‰¥ÿ¢S|¼°àF,uOñ}º%–æççóúõk677eÝm¿²²òÏb©Ñ@Z7$’ˆS³ýònûÇ n:ÅÙE‚sËZoí¶ºÞm/·XZVVFUU•T†FÚm¯ÊH#01ýÅÝö?`]… ^ßLí¶¯DS$íé5 ¼~ýZöÝöWbiff&ÍÍÍ7»íۛі^í¶¿-–þ€õY ÑÝÔnûÂgèªoï¶ÏÍÍ•}·½Ýn'™LÒÕÕu3‚TS!‰¥ÞE¢{7»íÀú‡�vÛŸsùë £CÓ�XÚÞÞNMM .—‹ÓÓSYò}¾Û¾»»û³Ýö˜z: ¯mÙØ„°¾©ÝöþQ‰PC[ãu§X]]�Åb‘uéÊÈZZZ¢««ëönû~i·}xyí¬ß A �pM’ƒ˜º;4Òkª°°�žž<�l­=H»íçææxñâÅ50¥Ùˆ©¯‹D0Äÿ¦YC„ˆí%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:55+00:00P7±+tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/TWD.png000066400000000000000000000020771520501070600173460ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<DPLTE•”—Œí ÿýþ•”–’((¥˜ ˜––ŒyyÇ‘‘ÑŸ�˜�¹¹â��ЗŒŒÏååô—�èèõ��Ï—77¬ÿÿÿÔÔíœ;;­ÓÓì77«“ ™îî÷dd¾šQQ¶cc¾’’ÑŽŽÏ~~ÉAA¯hhÀÇÇçÜÜð ™66«Ÿääôíí÷ÉÉÉèìì÷‘øøüüüþþþþAA°ÓÓíbb½ggÀbb¾šÆÆç›==®&&¤wwƺºâééõRR¶ÝÝðééö»»âxxÇ''¥¹¹á›<<®BB°ííøÈÈè}}ÉŽŽÐ<<­ääó��Ñ•”‹˜š Ž‹‹"ƒî ì Ô”øˆbKGD#*bl:tIMEæDjŒSøIDATXÃí–ÛSÚ@ÆW¼í¬ºÁ¦ˆÇ ¢‚j£¥r±Uñ~¿´jm«mõÿ7@�/;ž&€ÒàÍ¥)cÔE0&amhHóŒá˜Ñ¢1><ÌcQ-¢3ü ÈȨ0âccqCŒ¾ `‹Lþ>a%�TÊV"ÍM\#¦-ÆaÂÉdœI˜¦I€é„‹éì ÌÎårsy˜ÉN N^ùðFe‘ù…©l²P,-.--–Š…äò‡ôH„Q¬ š»«í2´T¶ Ÿ ázýŠæAtÍž„b*ÕZ­Z�rÖ-Åó 3„ó¹•vø²á$�ZTãq#³¹Õ6  [�m=Î5$(ÛÙÝÛ‡ƒC¨µ58<€£ã“ÓŽËoœ¥þìmÑùâù&ç_›œG5ÙoÓúK›^Ân›jn® ÖWÿ YßVQeúüu3*ê�¨ÈzQ¡ãEÅKØ5r¹~Øuâzݹ¸ñâz9®›2yzÅ­�cߢœ–¾»þÈ\sƒ™Áý ¯-诞ëöõGè§4à—ŒB÷Ò€ß2úóð÷Qð$£¾§G¹å=@¿¤$×$’’Èþ          ð¿ž/–ý—kuu%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:53:17+00:00ôÙOIEND®B`‚qalculate-qt-5.11.0/data/flags/TZS.png000066400000000000000000000017631520501070600173710ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<#PLTEµ:µ:"¶9³¿7@Àï�ð»4üß¿ ãÿùí%ŸHù,�]ÓñYà†’Ïq‰�Ï)J> “·t|0J Ÿî¸ø÷Þø,B> ȶ߹�-ÿAœoÀâÛp¶o@ä[0ù�Hr�ì?O¹ìýí;Ìoâé9©&^^ߪü¾€ù÷°!K•�ÏÆßœo"¾臚%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:46+00:00­u«(IEND®B`‚qalculate-qt-5.11.0/data/flags/UAH.png000066400000000000000000000006031520501070600173160ustar00rootroot00000000000000‰PNG  IHDR`@o=gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTE[»Z¼j¤àÆÿÖÿÕÿÿÿ÷•ºûbKGDaf¸} pHYs × ×B(›xtIMEæDjŒS1IDATHÇíË1 À°YÀ°€ü[AÃ>HÖ¿�$ùÐ�˜KbK©P( „ TãþÝZ]Ä%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:03+00:00”ÅáKtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/UGX.png000066400000000000000000000026501520501070600173500ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<[PLTEYNûÛüÜûÚûÙûÙâKáIáGâMå\ædæcäXâLØÜæW[懋×{ಋîɽöÅÉð›ŸæVZÙÚæXX÷ÊÊÿÿÿä¿Á³-ˬÖ²6çÓÐÿüüÛ í‡‡þööæáá@%".+ …4Ð~~ýÿÿÿýýñññ›››!!!>CAwqqóëëëíí¯““F=@>ÆÇÆÜª¡¡B63€�€æZZÔÔÔMQNFKFŸŸŸÙñŸŸ|||V\VUZU}}éêéþþþÛÝ÷ÈÈüüüSSSX^XAFArxr¨­¨º½ºáâáûýý¿¾ÅöØØrrr\a\ÅÉÅØÙØ®±®­Ž�çÍÍ/ÜØØ222-0-flfšš—®gg±ÇÛ““ ÇÈÈÙÙÙTTT696"ZÈÐçÄÄ÷÷÷†††Z\\�86ÆÕÛ••ZZZúúúÎÎÎbbbLLLÙÚÚÎÀÀµ ÔᯯÊÊÊùùù“““```~~~eee\\\±²²Ü¹¹ÆÏ<<ôëëXXXöööáááJJJ’’’ïïï¼¼¼zzzííí÷øøÎ³³®QQçÇLJ‡‡ýýýãããââ⊊Šõóó ÇÇÇ———ÂÂÂóóóKKKºººôôôVVZœœ £¤§ÂÃÆØÙÝÇÇË››ŸXMUJZOi]rgqfg\úÚùÙ—ßl¿bKGDr + pHYsttÞfxtIMEæDjŒSIDATXÃc`£` ÀHcÀÀDcÀÀLc0jÁ¨CÁ’++i:؉œ\Ü<¼|üœ$hb  ‹ˆŠ‰KH ’ ‰AŠX -#+'¯ ¨¤,§"+#M´6¢-PUS—“ÓÐÔÒÖÑ•“SWS¥¶Òjzrrú†FÆ&r@ §F¬ˆµ@è~9S3s K90P—¡®V²`c­mlå @ÖŠšØ©€ µwpt‚Y b'@E œ]À†ºº¹{xzAmpq&Îob€�/ÈH?ÿ€À à�Ð0°¾>Die'DDF�ÍŒŽ‰�‹OHLJ¦T¹¨Èbô2¤RÓÒÁØg0dfeçäæåûÉÉ¥§¥£—¸¶MA!$Ü‹ŠKJËÊ+¼+«ää ¨Øxª†%žšÚºú†Æ¦æ99§jj6ÏZýÀæ·µµwtvu÷ôöÉùµRÓ|†þ @ã'NšÃÊU«åjÖ´É­]''·z½ÜêU+©lÆU@?Ìݸ©xs �^µ�Úæý0gÂê-«¶.ض}õ„9Tw?ìØ¹k÷ž½ûöïÜAŠ.šú:|äè±CЮpüĉã£ýƒQ F- ÙÒZû¤RúdRúdâûd‚Q F-µ@J 0 }ø¥è%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:07+00:00`ŠÅXtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/USD.png000066400000000000000000000111321520501070600173330ustar00rootroot00000000000000‰PNG  IHDRz@Õ¸c/gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs s s αmtIMEæDjŒS$IDATxÚíœYl\×yÇw›;ÃrHŠ›(‹”Hí²HíÔbZÖbÉ’åÄ–ë5±$A‚ E�})úÐ<¥i›¢èòÒ¢i‘¦i�´qc;®Ë–-[cE–l‰â*‘÷á2ûrç®}˜á•h-vÀJÊû.p1ÿËÁÁùæœo9ߥðÀîßw¸ Çq�;ñ›¤Û4ê žŠv!;6wFœ»±mŸO¡¢¢˺uÒÇA–%-*»£.ŠUÕalûö:@uu¹{»gª«Ë‹÷·ê¶]ÐA¸ãwxÜ©¡¡íÛUUaöïßLûƒ-ÌÎ&I&²îd:TT”ÒÞÞÂÁƒ[ˆÅR$lû†^VdÇŽu<öØ.‰ ñxÚ5¸ã@(`Ë–U;ÖN&«�§1Mˈßµ™§žÚƒaXÄb)tÝbnqû|2ëÖ-ãégBEb±yÝ Üʳ>7�ˆgø»!Ca%I’È�›ij®çüù^&nz¬0‰=ÔÊÖm«¹ti€þþÑy_dÛ6»¸Ÿ¶Ð×?Jw÷õyºiZlÛ¾šGogl|†Î˃·è--M>²�d*ËG]E˜§Û¬^½”Ç·#çÏ÷‡æàØ6Ž·uß@âñ4ÿýÆü*#ÃSØvÁø‚ `Y6©T–“'/rþ|/X–�(ŠH’ˆeÙd2gÎtÒÛ3BoϦiÍÓ5Mçü/{›e``]7EÁÕuÝäÒ¥þæ¯ÿ‹±±i4MGnè¦iÒÓ3ÌßýíO™žŽ“ÍjH%J+›Ppá×™‹ÿ×sÁ˜ X–�,K8Ô×/¢±±–s纋~YÀ²,W¯ª*cíÚF::º0MA0 E)èáp ›6­¤£ã ù¼q‹^TiÛ¾–>è&›Í#ܤ;¨ª��;×qáB?ÉdvžnÛ6¦i³¹µ‰?ý“/¡ª Þî}gä¹Çqpœ‚ÁMÓ¢±±–o|ó(+W.áûÿèçí·/`Y¶«×ÕUòµ¯aË–UTT„xýõÜUjš‹•qüŃìÙÓJ]]%/¿ü>¹\ÞÕËÊ‚<÷Ü>Ž<ÚÆò×êxé¥wH¥²®^RâçÉ'Ûù�§öpòäE~ø/o�¦Ea^0(*2¾E•ø|òÿi â'?˜K_&&f™žŠ35çúõ†aÎÓ§¦âLEbD"1†‡§Èçuá†>;›dr2ÆT$Æèè4Ù¬æFË‚ �HdŸ%‰16>K2™™§g29FGgˆDbLND‰FS·�¶� îõ<þÆãnݶí ª„B&'c¨ªÂ¢ª2 ÝIJbÑ$~¿�ŠŠRÆÇgQ™êš0zqKž™I¢(55Œ�M#I55åäó²,1=GE/®dllA¨©)G×M|>™©©8Žã°dIãã³…T«¦Ó°PU…©©–UÐ#‘–eaÛ[·®æ{õ-|²t¯çò7šbÔ ‹W²ÿf–6TóÊ+géëer"ê>X]]΃{ZY¿¾‘W_9KW×u&Æ£ÅU •!víºŸ¶¶5¼öZ—/ 21qC/++aûö5<´w#ÿóÆ9.^ìgr2æêÁ ŸÍ›Wrè‘m¼sò"ç~ÙËT$îê�€�––&ŽÝIGÇ::ºˆFSé4±‹—QÙsÑw¡èØLÓb{Ûš›ëyû­‹®?†ÂDëºÉ–-+Ù¶m5§ß¿\ŒªoD¹zÞ ¥e9íí8¾� ö»º @>o°fMííèî¾Î/>èž§ëºÁò¦Å´·o`ltšÓ§;?¡›Ô×Wñ@ûRé,ï¾û1‚$’ìéçÜ×^¬ŒyQ÷�pÓ«T*Ë+?=ƒ¢ÈŒ�Ï+]…ôÈ0L²Y�Ÿÿü<ï�ºÄÐPÛ¶‘$I–0t MÓyïÔ%.^¸ÊÐÐ$–UH¯EÆ0LtÝàܹú¯Ž191‹i~(sºaX\úøßùο�M¢ë—0§[–Eoï0öÝ'™Ì¢i: àXf:^}Wæ¥WŽã¸ù³,‹44Ô²|ygÎt’Ï8ŽƒetI*øÛõ÷/çý÷.‘ËéEÝB’$$IdÑ¢2¶n[Í{ï]"›Ñ°íº( „ÃAv゚ӧ;I&3·èÁ`€ÜÀ¹s=D£),ËvuÇq¼Z÷¯À¼ô @lÛ¦®®Šo|ó(«V݇$Iœ8ñ¡[϶m›êšr¾úµÃlݺš@@åg¯�Å0 EÛ¶)/ñÂñƒìÛ»‘ŠŠRþó?N‘Ëé® –ð̳{ùÂc»¨_RÅ¿þðétÎÕUUåñ'vóì³{Yµz)ÿôý7ˆÅRˆ¢8?òv˱moç¾ ·$Ÿ7Ò«(ƒƒ8ŽÃÀÀ¦iº“,ÓSq&  \GÓ $é†�&œ »®’��q2mžžLf˜ «û:ÅZ¼)½Ò˜ »{˜Á� b±Ô¼ô«8X|åeT¯Ý�âù®ÌK¯JK„ÃAFF¦ñùÊÂ%º‰ @"‘¥¤D¥ººœ¡¡IE¦¼o I‰DE‘Y²¤ŠÁÁI$I¤¢"„¦éø| ±X Iih¬ep`A(”äó:ªê#K°lyׇ"ضCEE]7ðû}Äbi,˦©©ŽÑÑ ÃͶl^ÉŸ÷k¨ª¯4vg¤††¶o;ŽÃ}÷Uóä“íìß¿‰x‰¢@.—§jQ-­M,®«$›ÕnJ¯òyƒ²Ò­­Í44Ô�É+m÷z©ü– 54´}»àû KqöìFF¦I¥²H’ˆ¢(X–…ã8¤Ó§ßïdddšx<�(Ѝª‚itMÓ9ýþeFF¦™�M"~ÿ Ý4,NŸîdxxªX |®n;gÏ^ah0ÂÄÄ,~¿êVÁÎ�ëáÚµ ÆÇf±íB¥ìБ6$ÑsÒwC¸¹•hî`CTUaÅŠ%47×óNç°,Ç)DÖ>ŸBCc ­-Mœ¯sâćB!2‡ƒá ÛÛÖà8ðê«gÜȹ$¨òÜsûØ`3~UáÇ?~×=£vÕ§pìX;�?ñ••¥üàobs‘=H’È‘Gwðå/ ¡±†øû×ÑuÃ52€ Ф¯òѾáåÑŸÂmÏöA ‰ÑÙ9D,–æêµñ›ŒDñ#NWצeÑß?ZŒ¾oèñXšîža•¾þQ²Ùü<=•ÊÒÛ;™3�ôôŽ�Ngoú~Èfóôõ�ræt'=Ý#$iæ\Ìͽƒx&Ÿwëv‡òò¥ Œ£(2�€Ša˜H’H&£ ¨¯¯¤¯o Y äó:Š"“Nçðû}46ÖÒÛ;‚(Š„B4MGUÒé’$±re=½½#8”–– i:~¿B*•CV¯¾�þþ1,Ë& �ÏÒ«t:‡m;¬Y³”ÁÁ òyGð*cŸ7½jh¨å¹çöñðÃ[ˆÇÓŒ�GÑ4˲ÉçMêëñÔÓ{8zt™ŒÆØØ ¹\ÛvÈç ª«Ã<ñD;ÇžlÇÐMÆÆfÈËžšfP^âèc;xöÙ}Œ�N»ÆËç B¡‡mãË/<Œª*Œ�N“(6(æó:~¿�}û7òâW. 266M&—§ÜÔX›Ž ÚضwÝá*nݱxŠÅ‹ÑÐXK.§»éÕ\p�§©®.§qY†iºéÕœžHd(¯±¬±Àíùš+›¦RYB¡��µø¹Ø:$Ì«„©ªÂ²eµƒ~R©¢xCÏå Ï76ÖÒÝu�d2 Žƒ¿¶šÆOàó¢î»ânÝ>ŸÂÚµ 8ÀäÄ,““QEÆçSÈd4EfýúFfg“ŒŒL!I�€�tºPÞ\·¾QH¦² L&ü¤Ó…myÍÚdYBËéÅ.R�P¨ ¬Zuªß‡iXôô ã8¡PÀÝššS `Û]]×1M‹­[Wñù-T¯•许³£ë}tÕ=ž …JX·¾‘Íõ¼õÖ¢Ñ|­¸Â þyÅŠ%lÜØÌ›ožgf&AçåAw*Ë–Õ²sç:Nœø�H$Fw×uWWU…%KªxhïFÞ9ùãã3ôõ�ººÏ'S[[É�‡·pæt'ÃÃ&\Ý=+¯•è30¯g¬P庑>=ÿü~^üÊ!6mZáNp!½q()Qyú™=ñ ;w­Ÿ÷÷ª*óøpüŃìÝ· QnÒ$IâÈ‘6Ž?È#‡·#I…ÏEQ,RdÿþM?þ0�?¾Ûmþ›Ó=~5î˜^MOÇùå¹®_�píÚ¸ÛH0§G£).\è':›¢¿oÔÍ�çôD"Ã¥�¯aè&=ÝÃärzј…ô(“ÉÑyeÕïãÊ•!2m^ŽœËåéîæg¯ý‚+W†Ší¾ÂmÇ*H^¿Ø§1/½ªª SU¦§gY–ÜîY–Ð4ƒp¸„¥KkèìB’TÕ‡®(ŠŒ¦é””¨¬X±„Ë—¿ßW<�RÈåt|>™µëé¼<ˆmÛøýª{z¥iyDQäþ ËéºrÃ0 nÖu6´,§¿o”\NÇvÖÕ•òûWà“Ä_gþßã¾’³lYÏ=¿�¥KkøÑ�ÞâÝn¤kšõKªxúé‡X¿¾‘—^z‡÷N]r[xM3Ouu9Çžl§­m-?ùÉ{¼ýÖWÏfó”—‡øâw³wß&~öZo¼qŽL&WÔ5B¡GŽ´qäѼýÖ‡¼úZ‰xÚÕ•oáØ±v:Î^áå—ßgj&IfxŒžï½éåÑŸ‚›^MOÇ))ñ‰Î¦æ5ÿ ‚ÀìLUU‡C$·YNŸ;o‡ƒd3Z±›ä†žHd°‹¾?¯®‘çôt:‡n˜„ÃAlÛ!™ÈÌÓsÙ<ÙŒF8D·A@E/»+7¥W2Ë—/Ʋlâñ4ÓÓñy>Q–%šš»ïYMLÌÎÓEQ ¹¹¾P`Ñ FG¦oñ©ÍÍõž2›¡¡Ÿt¹Ë–Õ¹?Ž�y/ùv�¥KkðùdDIäÚÕq,¯2övíü=w-ÌÎn|’_Wwl§ð*œÀm+÷µ @o§¢· �Æ|‚§£]Èx†¾Âÿù�ßÚMÏA lë¬1bÞûÑŸ‚àxÿ:`Aàå$ ÏÐ ÏÐ ùÒç^�Áãs@x¥a£Œ-dAöÎqž�^ È‚èÙz! Œ½~ÂóÑ ¯2¶@ðöí‚gè‚lëú½ƒÇç€Ðqüw=½�§N�½×cðø�½VÙ…�ì½å°0�åPè^�Áãs@ˆ^¼ì-é€W[ x“‚gè‚¬ÏÆîõ<>„w>íù耜ì»z¯Çàñ9àu˜,<+/PY@§ˆqÙùVšÑΙsÎ7gþ3ÿ�0 ÃÀÂ4$³+�ïXLÆ`2‰€ññqR©”Ùmù¿dÅ&&&H&“ïÛ×ÚÚÊÈÈÈÂv2™"‰�ÍfÍnߪGYé/½ø{nºy?ÕÕÕ†A_Ï *+Ê…B$1~ýØC7î ¯¨ìtV#™ÖÌî“�• Ð4�ØT;o·%©¬¼E‘I&“x¥n2±:àFzºŽ“ž9Ξëï»äxÃ0B\¶üç�óóßF�ò(2-+ »»¯·€ÊÊ dY¢yçut½ñCN¾šb{Ë÷Iħ)v £&ûÑt˜j¥jmCÏ-”¡ª��§ ƒøýþËžkb&Í™È Hb¹j}bXV€×[À/;ÄÁÛ°kÏ­Ô5ÝÁôàRÃ�ÒÕæ£°¬¿'Ф0|¾=ö:¥>UM�NñÌÓ�ãò®§¾¾~És !Þíü<°ì`¯¬¬ààmøÛKßãøÄ0á;qÚuRŸ¤§ãм*zº�È›SâÀé.B¶yé�ü“Ÿú ™ù3Üu×ç‘òéÞò!ùP1`çî$gN1õΣ´g:ÈÙ›©(ö23;‚6÷Î5 çqʃät�¤º�ÞŽg‰ž{‡¡pçÝG(**Â0À0tKÄ{XTÀøø8Šb£¤¤Ylßw/í™·‘“Ç�ÓmD¥,‰¤�×™DE08¢¡ª†|IœÄã”o=DyUýüë�#DRì¾á³ìÙ³EYñ$ìÇ¢=�J¥xêðOin¬¡È›C œî5h®�3¸”9Jü2ÇÞÑ0ƒwoÛ':r´ì°(Ž‘JkL¦ê)4œüów¹Ðû"s™õÜtËCTUoZt6$Ë›]FΣ .— ý{ëËt¼ñ •¾yÜ.±X†-5Ýý*2Õ2^—@×a|F§çœJ�Gàv TÍŽ@':'+m$|ýo¨ÞØtÙÊœKÒ;#º ñø<£½Œ�;Š-þ<^Ûï é \ÐÙVÈ©Š,h®S˜ŒêœŽ¨”IŒNéÄ5•2¸wR¾õ‚µÛÍnïªã²ÑÐ0 $I¡À·ŽÒŠ›¸˜¸ž±i‰2¿„Ç%n�錨}=C*ç.è¼ðj! Ì/!I‚\ÎàB´ Éÿ»›è̤•žø—Œ€ññqZ[[éë9�Wê¦Ø5ŒßÅçÉár„€éY�–v†Ç4b ƒÍ!…¹¸Aÿ°Ê–…©YƒÞA•@±D: ñ$Ì&ÜÌ$DÓ!do»®ÛGSS#v»Ýì>0•K‚paa!MMMTV”‘‰Õ¡&û¹Ar¹ADn€âB !@Ó¡º\¦XãÍ®ØVð¸#“:.§@–!‘q#<›ñù®¢ÈQ�ÝSƒ·¨Š å•Ö,ˆE¸\.B¡¡P¸€¡óýt�|„ÄÌ Ã£*Ýý*á*…bŸà­«ô iØð¸[j:zT†F5nh²¡Ø\(�/rMãçðù¼f·wÕ!–[褿í~lÙSx™¬D6ñ”AÓ5 ³1ƒî>•B¯Ä¶°ÂИÆô¬Á|Ü ¨¼n�xÚCœF¼e{¹*| UÕÛX,'g,üäK 9Ï?þø5lÙSøJj@)%ëdmIŽXÂàâ„ÎÚR‰  M‡Ó¡„Û n§ ëÂFÊ×ùPÓCÄãYFgÜ ŒùÙÇìk¹ù’ó=1Ê3\2cúIcÑ›ðèèÇŽý•¾Îç(/‰Q×|ˆ«Â·Ò{ú9é·H¦5lŠÂ褆¦ë$Ón§`à‚Ž³„×óñëJuÊ6ÿ˜â’245‹ÃYÀÄÄ$gººÉf³—à³s9:˜W ¥‹ (.ö³µn+ášuC×PØ@¤�¹óOâ±KDÕÝ©34×Å‘$E‘PdØR+³¶úÇ×ãr¹ÈÍ�eøìþ§Ó@IéZjj¯F–/íeI�ó+º¨‡ÃÁ¶ú†…íhtŠ×^ùC¦¼î…8IõßK�×FÏp ëýcÌdý¤�æãç( ¬ÇWû†Ï>Á¹î?a+ÜNËþ{ʳÙlf·{Õ°ì`WU�gž~œ™¸‡]�аû«HêZ.ÁT¶™Ò�ß!žg-k®¾Ÿ¬æev2‚Ãn°÷ö_Þù ¯¼ü<íí§ÌnëªdY��§qy×ó�o¦º¶dsY¢1™‚ò/¬½ŽÙ„M®`ëŽ/ ¬¹‡DbžîS‡‘%‰–ý÷ð¥¯?L{ûÛÄãq³Û»êXòIÈ0 ‚Á õõõïËák3[ÇîÊfœ®f’Š! �l6‹¢Ø�Þ3U²Ç¥¾ º=²Ç;°Æ-«Â4®Ä1­Ã›·š·jOgßQ`þùúÞQbx\,·:µ:~‹1JbKGD0®Ü-ä pHYs!8!8E–1`tIMEæDjŒS IDAThÞí–YWA…ï$£ôÄIeÔ°&ÜÚ„7LQâ7TTP\¢â¾+‚*® nÿ–â98è9úR¶uîÌ©‡®¯ª»zøÏd ­éƒæ¼ùeA_LX!ÏØB=ÂAšá¢òÅK*_pé²å6­¬ªjVÄj 󋺕õ îœ-ñU«€Õ¸Fa„bk×Ö¿~ƒÜèü'£*˜J6)Œô¦d† ²Yn±~³Å¥�³NÔ€º­Û¶èÖÿ3@L6ïðÞñpÂ+=›òŠæèZвS¶îòEÚ*w§€=U{] ßÞQtv5DÉBûäþ‚¯Ý=íªô)Œüá#½€{ôX’ Ài”Çû| ¶NÄ•Û'O©)Èô·©û)=`æÈ§å™Aÿ%`ˆŸÜ˜uýgå9ºåÿFçå…biEÆ«Z¤fÞKŸ†DÚs'Aù-ˆ\”—L�À¸lµW®ªäùk׳@ï�›j(÷n[„ºs·çž+ î?x¨ö¤øhxâñÈhè{ò´(<{§l�pº_Œ½, ¯^�«Z�2O–'&~*€#|%}%~D_ °»×úûüÙßìF`¡ ,‚j³2O—Qj¦4† .ƒ{޼ôõùÊÒä=Œ«·Ôîñ÷™§Ë%~!{Ph¦\s¬C^Ÿ/M•+�ez°ÒØèÿÿÿ¾ÇÞ-K”0„ ,‚Ib¢7S™$C�8‰;W›0M–5‡,J” {Ð×çPi¦áåï»ÅÜB]Ÿ&~Vn©��Å +�)€Kd£8‰ -‚ /ƒOh¥ z?�‚”¿ÉÑãs‡¸;‹[r«ûüýóõùUm¨'Rk§š¨Ë6S™$}7ˆ 0„$~#~I`Î+Ï+cû_bKGD/#Ô  pHYsttÞfxtIMEæDjŒS±IDATXÃíÔÙNÂ@€áºœÁ PD«­¢.€ T–º€ûŽÛû¿„Ë…ÑDN‹ÐÄ‹ùSÒ”Nû•aRE‘Éd2™Lö/p8eÐᔡ.þ±³—¶®DÄ—°U¸=£c^ïØ¨ÇÝÅE¶ß8’?019œb:859ðŽûú„Â3‘YŠÆæâóˆóñ¹X”f#3áP߀¨º°¨�¾´œX!ZI,/é -.¨Ñ>b5¹–J¯lô�c=°´žN­%WmüÙV ði›[žLö]ú"²ÏÖ¦æA=¹Ðöân¾€?¿ÇB~qg;”ë À„Z܃oÿmæÞ?{E5�ü¬€l)U®ø?鯔S¥lo€±_�Wj�ÎÖ*ñê¾Ñ  N ³ã3¢Ù :ðK‰ÄÁ!�¡u @‡¬ÀEŽÁ¢ãÈq³ÄÔlONÏØ…Ng§'ÅV“ÃNÑùÅåÕ5ÿ®¯./Îÿ:ExS½½Óy@¿»­Þp+•î¼mÓâu#̶÷áž™ž>7>«1ʳÃ)/§¼:œ$  H@°Õ׋¤Aì+%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:31+00:00�Õ÷�tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/VES.png000066400000000000000000000020241520501070600173350ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<&PLTEÿÌþËZ`Q! $}#} -‚*H’"|#B�¤±Ñ>Z�2O–'&~*€#|%}%~D_ °»×úûüÙßìF`¡ ,‚j³2O—Qj¦4† .ƒ{޼ôõùÊÒä=Œ«·Ôîñ÷™§Ë%~!{Ph¦\s¬C^Ÿ/M•+�ez°ÒØèÿÿÿ¾ÇÞ-K”0„ ,‚Ib¢7S™$C�8‰;W›0M–5‡,J” {Ð×çPi¦áåï»ÅÜB]Ÿ&~Vn©��Å +�)€Kd£8‰ -‚ /ƒOh¥ z?�‚”¿ÉÑãs‡¸;‹[r«ûüýóõùUm¨'Rk§š¨Ë6S™$}7ˆ 0„$~#~I`Î+Ï+cû_bKGD/#Ô  pHYsttÞfxtIMEæDjŒS±IDATXÃíÔÙNÂ@€áºœÁ PD«­¢.€ T–º€ûŽÛû¿„Ë…ÑDN‹ÐÄ‹ùSÒ”Nû•aRE‘Éd2™Lö/p8eÐᔡ.þ±³—¶®DÄ—°U¸=£c^ïØ¨ÇÝÅE¶ß8’?019œb:859ðŽûú„Â3‘YŠÆæâóˆóñ¹X”f#3áP߀¨º°¨�¾´œX!ZI,/é -.¨Ñ>b5¹–J¯lô�c=°´žN­%WmüÙV ði›[žLö]ú"²ÏÖ¦æA=¹Ðöân¾€?¿ÇB~qg;”ë À„Z܃oÿmæÞ?{E5�ü¬€l)U®ø?鯔S¥lo€±_�Wj�ÎÖ*ñê¾Ñ  N ³ã3¢Ù :ðK‰ÄÁ!�¡u @‡¬ÀEŽÁ¢ãÈq³ÄÔlONÏØ…Ng§'ÅV“ÃNÑùÅåÕ5ÿ®¯./Îÿ:ExS½½Óy@¿»­Þp+•î¼mÓâu#̶÷áž™ž>7>«1ʳÃ)/§¼:œ$  H@°Õ׋¤Aì+%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:31+00:00�Õ÷�tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/VND.png000066400000000000000000000015031520501070600173300ustar00rootroot00000000000000‰PNG  IHDRU@\0Ë@gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÏPLTEÚ%Ú$Û(áQÞ;ò³ Ù"ådýòïŸ ÿÿÝ6øÕä_þ÷Ú#î™Ü2÷ÑÜ0Þ=Þ:Ý8åhýõågßBñ¬ úàúßùßûêÞ<ð¤ þùÛ)èuúâáNôÀÚ"Ü4í”ýñê�þüë‡Û-õÄüîüïê„þøð¥ Û+ô¿ úäèyÛ*àJüìõÃýôî˜Ý5í—çoÚ'ÿÿÿz�åabKGDDù´˜Á pHYs × ×B(›xtIMEæDjŒS7IDATXÃí–Ér‚@†!cl—q 1JÜETÜ¢¢â®ïÿN™I”J8¥Š¦réï5søêŸžn M#‚ ˆ?Ãâ�&ôD I�'?-O>'9~֤г²t2il-Ïæ —Å.�È@^ üŽ(¥µX��HÖRÙxQ˜¯i­¼™_+£\еZ³¬wI½ŠF]-,«V�–5[mÓn5#6ƒèt{!i¯Û‰|kLØý_Ò¾-0ÚÖ G�s48NWsÇwéØÅû òI�u‚6^l: ¬³)VVaÏ•ðC=æ6ÒÔj|!uË•¾ZÊ÷«Þ`³õ¹¿Ý¬=¤ìöpÐe“2¡`¿Ã)w�§ów“:çÓÑÅ)�w¹ÞÏn× N |óç™…é£XCÓËÏAAü#Ÿ#VXª%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:29+00:00r�¹xtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/VUV.png000066400000000000000000000075741520501070600173770ustar00rootroot00000000000000‰PNG  IHDRk@Ô‰ùgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs¯¯^‘tIMEæDjŒSFIDATxÚíœypUUšÀçÜíåeßWˆˆì‹�#Ò²µŠŠÐÚ]–ÓÓ::SÕ3¥3=5Õ³´Ó35U]ÎtYã?ÒÚ‹öhOÛ¸€ˆh·�° dk�€$„-dï.gþ8ï2I :¼_UþH^î}÷ÝßûÎýÎ÷�{Å$3U}ÛÉã3�°0ðQ$¸>€Jåf‹œ\&š©„� i×!:­$ ƒ;¬tÛ¹Œ3SpÒ®+ºÈŠ“* fZÛýÖz�4*�|é�!L$$âìkÄxo�ûlÕV@i¡AJ²––Lcro¥Mqžä«†€gºªhV>5^ ëܳ4)Ÿi“!ÌžSÌ—�¡ÏÖ� xƒËÚ)`p¡A8,P Ò’ÓÇ™Üs‡M~¶äèñ€S�]U4)Ÿ­^3Ü&ZU@¡´Iæµþlx@)8Ú°r�Ëúí¶)\ %ii©‚Š &ó+lrÒµÇgšºJkT›½&6zMD(’© iWŒs²â jëV¬�²i§OÈ”HGKËJTN²˜Wn‘ž*©­hlî*íŒòØè5ñ±×Œ‡¢Ð°Ò®ÝdÅ 8t,àݵQ¶ìöII *�ض––�!™9ÅbN™Er’àp]@SkWi§”Ëï,[¼f”€"é�,Œký™ÿdéUV߇G–W¹ÔìõHK– Ê—X¶¹Y’YS-fO·pl-­¥­«´Êe�ÛÄ'~3(’6á„´~sQYq<ö×ji;>÷ÉH”䘠 ?Gr÷t‹oÜnaZZk{§4\ÖºgùÔoÁDP(’ÒúLŸeÅq=øì Ï²5.»ød§ Šó L„‚Â\Éœ2‹™St ¸. ½£s{ÔQªÝ³ìð[p„¤PÚ„Ò.J¿eʼnºðÇZÚ¾C¹’¢\‰“V’/™[nS9ÑÂ÷¡¶. #Ú¹}|D©rÙå·’$ ¥�#äµ>'×-—,+N$ ;÷û,[eÿ‘€ü,IaŽDJ�@i‘d~…Mùx‹ˆ«¨­ ºTø}àHa�×È¿•daP“–˜Xwå²eÅi�Àö}>˪¢:P�-)È‘HRÀ�É=3l¦�5iïÐÓƒhiŠÃ1iûü6R¥I�´±IH‹sÅdÅi뀚=>Ë«]ŽÖåJò²%B€!aX©Á½wXLmÒÒGê\¯s{ÅÁ ƒÕn#_øí¤K“|ic%¤]š,Ë!tÕ£7ZÛ[v{,¯v©;P’'ÉÍ’À4#†Ü[i1q”ÉÙÅÑz…çwnï¢8´³Úmä`ÐA¦0É“Ö -­O5W!àæÁ•“L&Ž2)Ê•D¢Šýµk·¹|¼ÓëVÅøÿ”H¾=ßáÏî³¹y°qN¶�ÐÜ¢øp“Ë‹K#¬­q» �qÒ„É]V‹b]kóì¥]TVi�äû�„X<Û¦$_"ϯ)hkSlÝãóÂo:XVÅó.ü†C‹%�Þãðè=ÃéÌ/.íl“båz—%K;ظÃë2<ÆÉ&ß°2Yèä2ÊßPK .8 NeòË'³xŽMzº®X´¶)ZZ––%R,™_avïô{<Éq›Õ5«6¸4µ*J 2Óô¾[0æfƒ•6· 5h8£8v"è2Üv°'¶Ô ^EÉ•6ÙÒBÞK z�¬ÁE’7~’ÂÔ±&(=§úõŠ›vx´´C^–`ÖT‹oͱT QJ—¦þý¥vþí¥v‚>¶ŽG 5øî‡‡çêý ô 'O+ÞY£»ÖŸìñzÜgž´˜ëZŽu­ª´^?ÛOþ&Ìß7À]þî¿ÚØ}ÀïöåãMž{:ÌôqZêé&Å¢´°z‹K3Âà{÷;,šmS”'9©Áñ“Š·>ÒÒ¶ïózLl ¥Í#i@/æéQVI¾äKRy“ÁÞ/|x¦…’|ÉÍ¥’•ë]jëF5˜=ÍbãN�HDñ»ÿLaäüfe”Çþ¹å‚Ãa�#`üH“ÇtX8Ë&?Gt‘v¬!àwFùù;ví÷û·ó@�׬)£MžzÈÁ4ϽÒÁòj—æVŤ[Mϱ^j°èn‡Ïk}Ömó8r<s¦[Hé)‚eU.§›úÿ¯?°jƒKu�‡@w­“ÃZZZX0m¬îZæè®õÉÆ�GÝéQÖô±&‹g;œiRüë’êO´uÀž/}æ”Y,ºÛaó.�ç_ë =¢·9ÙpÿL›Œ4�c >Ú첿öÒÖ<)_5¬\ï²îSËÐÒ’b]ëôAù“oÞa“›)8R¯hlVt 10zlßJ)Bgn'NëîØ‚‡çØ$9‚ç_ë`ÆD“wÚ¼½:Š@ýIÅ¡cCJ$Ž¥«ï—‹ïÃÆí[w{”�‹ðäC!æWX¤§ †Iþññ$¾5ÛáÓ}þ{”ÕpZ×í’B�ï¬q9z< =¢%4œøÛŸ¶1{ºÅ}•6UŸ¸ÜT¢ç[QêO]9Y– eãÌnàŒ}Õ¾¨ nÜaP)øï×;¸ý6“²I&?ÿQ2?z±�úSÄ dž‰£ þr±ÃD™Wa‘‘ª€3MŽ\þ™3 ¸}ŒÉ“ î­´ÉL�¥ò�uèXÀk+#¼²<Ê�£~l6}­Oé×Ç'ü£†üÇ_'ñÍ ?€íû<ö|éuaX‰däƒWWDرÏçÅJ&+] $¬Zïòà3-碰¿H “o5yâA‡ûgÚädiI"vÄGêþwU”_.‹°÷à§ó¸hu&5,˜Sf±`¦Íø› ²3íض×ãÕ¢.<ÿƒ0· 5½°æ‰·ò껑þLbR|áóCKiRBfš 3U�m æ–Y<µÈ¡8O XQíò�¶ÐÔÒ¿¨ºÜr™!(NÑméJŸ—ÉœjTRñÂ?$3ùV“ì ¡o÷‰‰Ú¹Ïç‡/´õKT�…Ü ï…\Ò˜œÓ‹ /Ü�¯ßŸý^Ó²õ ÎÉÒ™ˆ-ŒYWãñôsm}žF”6õ¡ùHŠãó ¢JRÁˆIà¢àduDáÃM.ž›wyT׸üêâ’.ÔÖoi½x[Ÿ°ãrµ¤Á©zõÍ ")N¿Gøø*%¯�ÉXQ®äá¹6¾ÀáÖa]%µ¶)>ÚìñâÒÖlñèè©ê‘d˜-ih:˜ò†t>_Ûå8?[²øn›ï=à0f„�”�’ÚÛUŸx,Yá÷»´uôpŽ£s`F1 ËëÆ•çŠß4•“)X8Ëæñ&Übb:»C@4 ë¶¹,YaÕF·ÛÝ&،ʂ%0"Cÿ~ƒ w½qÅde¥ Ì´ù‹…“o51ÍNI®›¶y,y³ƒ÷ÖºÝîãtäŒÌÒ‘42KGVBR.[VzŠàÞJ-iÚË»žylÝéñ³7#,¯Šr¦§µ…¦Ô4£DGTÈLHê…K¾f¥†ó*,ž|È¡|¼…ãhI"–|lÛëñò[ÞZívÃ8 SîaZÒèl�H$]�~GVr’`öt-©r’E(‹$¥oãÙù™ÏËoGXúû( §{Hé¥ÐYÝŒb¸-’-�y$D]”>GV’#¸kªÉS‹BÜ5ÅÔ�^t*z]á/Þ‰ðÛ¢=OŽ…€!iP^ ãr ÅÖ’ŽúÌEe96TNÒÛ»§YçjŸ/}vÐçWË#¼þ~”£ÇƒžßaPª–4>O—‰’.‰^eY&TLÐÃݼr‹´ÔNI(Ø_ëóêŠ(ÿó^„CÇz©`§hIótÁ5!é²è&Ë4`ÚXÝB¿g†EFúy’€/�¼ö^„WVD{ï&ë*øä|ݺHHº"œ“eH½¸ó‰… î´ÉÎìÚ�­­ xýý(¿Zaß¡^$å‡aZ!L)€ì¤„¤+Œ�5a¤n¡?0Ë&/»«¤¯~ûA”_¼á�z‘”“·Âí�ÖS KWñÒ¿$«ù3¬nÝÙúKÿåå·#ìÜ×Ër³B0µ@GS^ I_#—ôpH2=ÔM+Ô×§„¤«‚o¡÷屫¤Ù0)Ö�-J9ïÆâ„¨«�y¦I±jƒË‹K;Ø´Ãë¹O•jÄ<(/ÒÝÙx =MW• >*œä󺳥i�-ôׄž'ÅI&Œ�I’vCwg¯'ºÊ ™p[6T”ÀMé‰îìu†–2`T¶®„ÏËHHº ÏPÜ9H·+œ„¤ë™ÿp�=¨7C—ƒ%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:15+00:00;¿ÔïtEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/XAF.png000066400000000000000000000244071520501070600173270ustar00rootroot00000000000000‰PNG  IHDRA@E«àgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæDjŒS( IDATxÚ­»w|TUþÿÿ¼ezÉLzï�H ¡E°" ¬]tÁ‚XײºîºÖ]Ûgm«keݵ¬Š‘.]šô $$¤÷6™dú½÷ûGH$4ý=~{Écfîœ;÷œ×y½ßçÝŽ ª*§šÀ…›vF @AÓ´sõEÎñ‚ xí¿éTßÓïéës®ßù_5ù&Û÷þœ#85@M8c6Š¢ Š"Š¢ I‚ æDdYFS5šÚ[¸sî\A'ë À?ÿõ†åˆ@ÖɈ¢€ß ÃÕ� xz<˜Ì¦³Àú_5á4& ¸~çlÁ`�·ÞzKXºt©–––&x<MQâããùê³ÏqFDôu7«ª§*Jšªii@¢ Q¢(ØDQÒiš¦)ŠâÕ4­h JÅrQ’ªh@U…Úú:F�ËM7ÝÄC=„(Šÿ3Τø…ÄBë%€€ÛífΜ9,]ºtÀ÷¹ƒ‡à NEQò5M�"IÒx³Ù<ÈátFFEE™"#£p†;±Z,èt:TMÃçóÑårÑÖÖFKs‹ÒÖÖæîêêª øý…l‘$i‚V®“õ!¯ÇÃÁ#‡‰ŒŠ rgŠü:Öô‰Ã¹zž)®«ªªùýþ~0s²kÅeÇéêî¬(ÊodY¾6...wHNŽ%¿ ŸÜ¼\RÓÒˆˆˆÀd2¡Óéδ¢(ººº¤Æ†ÇñcÇû÷ïÏ=zøÈm•••õn·{‹_ñc4ÌÍÚÕÔÖBù‰¤¤¦âóùðù| TUE§Óá÷û±X,Èò¹¤þl&œ>És1cH‚ àõz¹þúëi¬®ES5:Ý®lEQî2™Ì7åää¤\~ùåd‚Þff̈‘èõú_µBgSWWÇêMk1j2‡bûŽŸ| õ ;5M[¨ÓÉ+�`wMC³fÍ¢©©‰úúzìv;&LààÁƒ 2„�?þøW�púj çT?3TUEE-1&�^¡*Ê]£ñþüüü´[fßJÞˆá¬,ÙΧ5›IöZùtî_qû=4v´ K2 ‘1D„Gœ“¾>Ÿw·Ÿß�,ɘd=�}õEb3³“.&ךÌOÛ¶³jåÊ@C}ý:áUY'nC´ºÆ|?³§ÓIqq1±±±çþ—t‚¢(ôôô I:�޶¶64€ÔĤIšÆó™™™SæÌ�#LŸ9�^ÏCß¿Î'Ê^L>�‡ÄIx­kºŽÐ(tcr©<w�Ìž�tMA`ëOÛxjóGÔ:ýè‰c2£õ)¼Ü±†6s�K)¼>ù~Ôn?Ÿüçc~üñÇÖ®®®weY~[Åöòª“ô„ÍfãØ±cÄÇÇÿ*Îb‚ ìÙ³‡?ÿùÏZOO� ª*Õ¥åš=©øýw�¦§§Ïœ7oÞ<T‘�˜ÁöÆ£‹˜ØX~M«©©¡¸ì5®f|´{\”�¬àpd'>Yáí´9¼zx1×e_ÌÌ´ñüóí·Ù´qS‘¢(É’´Ñh0PR^ÖÏ„ ‰ƒÌùmк»»E‘ìŒLZ;ÚÃU}-33óŽ¿<ý´�—?œÇ—¿Í'Ê^.�Î"/+‡+«ªy³m)K£›ñi*FMGº>ŒqZˆ.WeeeTUUÒÜØD§« UQÐédìavbbbHNI%55«ÅJK[+_–ob—©¯]ëgTs8ª¢ÒÖFLt Ï5/Ç òìóÏŸ�0ô«/}â÷ûôCK•.…Ìᙿ¸M^hïмéÉ)øü~‡¢¨oää ™ûðc ;äãû�ëùLÙ�EÕqµm?íæÇÆ#Ø<"OY¯")1o³‹ÖòZNìÛÏ/¡¾ÞEÀgB}ä�H¦øh >¯AÔ/:½�„Ä02³2?aíÚ�Æ ‚p>‹€ÖÖV2SÒˆŒŠ4†B¡¿g ôà /¼È’šo¨dTÌ þV¿œŒJ }J8Åa�ˆ!¸],àŽìËÙ¶u+ë×m¤¡ÞC(dä¦[/F’ììßÓȘqÉ<ðà-lݲ‡µ«ÑÑîG’TR3¬\2%ŸÆÆF¶mÝJkk+ãÇ�çúë¯GÕ4þ²ø-vذ[ldz¹:S<úÅAUU¾þúkNœ8�^¯§ÛÝMRl<V­½Òj³>ùð£�è&ŒŸÀ‹^Âm ¥YŸ; �¬£º©Ž‘ƒrééróþ»ï²oß1tR>vó0¡×ñ‘õí$$FSQ^ÁGl£`T"yÃsˆˆˆÆ`0a4šûØ7H“Éĸñã5z4;ÚÁÂ?dïž½,¸c®t~¨ÙG�äa¨M†1™›ÂzÏ.î^Êïÿ{êjjGlÞ¼ù¥è˜è;ãããÜ{áš››yýõב$i A ­­� &PZZ @fj:ŠJ–̽ãŽÑW_;MQy¸ðß÷4p�7‹ªpÇ}�Œ÷Ås¥}ß~û 5UݤK�¥ÄÓT‹€ 50mf8��ÝìÙ.csÖ“‘e`DAÃG eÔè‘Ølö ºÞííí,üàC¶oÝÆÃ?ŒÑlâÿÖ~Œ!&ŒK“ ðú¼<áYA˜_æÛÑ�a J<þØãJeåÉ'ŒÓë¥'O�’’Beeå€çHÏ>û,‚ PTTÄþýû©¨¨`dîp¼>¯ „”§Fäçßxß‚x~㿱h:4—‘Òªg³£�c“„TF{bYÿÃZ®™u 5|ž$áŒÉhJŠ|Ô×è�eA¿ƒÆz÷ÕPRrˆý{�0v\.f‹å¼²k6›?a’,ñþ»ï18;GR4ôlcU°c“Ÿp¯žãvÉ­Z›ZÈœ#Ú0Çï÷oŽŠˆl4šMÜu×]ètºþßí÷E#""(++C\î.Eo³Ûîœw÷�P’$n�=›û<À¿.d°Å£¦a Ь±Uç5‘Ø¢'¨„ø¢m'®(‘‰'%ªªúHH é=�]g¹àýŸbccñûýL5EQôšªþî’K¦Dfæ æ“ú­-áv“ÇL Ó3ÕŸÊ8{K—|Ï�7ßHc½Äk¯|EO·Ž�ãPU MPÁP'¡�UU~¦£hD£ùê³"¾^ôEG‹hnnº k|í¬YÌ™;—>ø€™)cùlÐ}\íNÃðsEg2Î��Ž0•O;w0~Ê$¢¢¢f©Š:Y�$Ü]]çÁív3dÈZÚÚPuœ3Ü9ý·sçÐòÒ$v“è1s¬¢Œ9ûßb…µœøøx>úèß\qåÄÆ&ÓXÉу1(ÁÈ~= iMÄ&Öb¶U1j‚‡;æÇrÕ52Ii ¨š»‚ âvÅñꋸgî'<õÄûtt´_ˆ›n¹™ 'òÁ{ï3:m(ñª Í*“Ÿ“G^j6B”™;©5{˜Ìj³ÒìêÀêÉs‡ñYÄ>ê̱LF­èÄd6‘ž‘ÅÛ¯mF Æ�ÚÚzP?6G#¿½s8Ó¯™Bgg ññ„9€Ê¡ƒ…üéÑOi¨ 6DQ� è@�Çï8°·šCŽ0åÒÉg)ȾD–eî½ÿ>ú݃¬Y³†.›É-ÛþÎfÏ ~[>‚Ø€‰«›6µ‡[o¸� 7^æêì¹3 öÇú™ÐÕÕEZR2¢ f˜Í–«¦OŸÎ¢]?pøä1¦yÓ é:Ê“¸.e»vídÂÄI¼÷�-47Ä Š? ª]d iã¥Wü{o#>>‘œœÂŽSÈ>œ¼w<œAÁØnµHºZ@hG ðùý(ŠBkK ­­-‰ˆˆàæÙ·ðõW_‘`�ä¹A7!i‹ÕÃdõ„¡wAœ†&‰äæå:UU½®©½u@P§Ÿ ½MÓPejzFzò ìl^ذŒAÄñÄÕsø¡hÙuµLÏɆuQ��^o¥®Æ€,õÔ`Cd éâïÿ¸—ÔÔôûþM!dÉ&{H6¿½£‡ÆÆFZ[Ú)séMf "U•Í|¿ä{zäa|ßvñqýüJ�)-±È6•¶}ʄܡìÙµûÊ´Ää×AhêW?EI'ÂåãÆ�ã8!uP¦¶�-<ŒýÁÜ^‡${HË—" v~öÁ44š^�HjjÚ/:.}™ÍÒÓ33v4×Ìš†Ëå¡ð@-/>ÿ-�>ø/JKK±ÛÃHÏH£äˆÄŸýš;n{‰wÞþG�EÕTLÆTÖü°‰–æf$Qb¸Ãhg¿/¸ŽÅÍF{ Áp±11Y!EÉ��ˆ:[1šõFTE‰7›MãÇ�çd[�:?U^[ý U~Nbb"�•µÄÆÅPz¬‰cEFDÑð³híÜ2'ž{¸…_Ncœ †¦iÄÄÆqý�3Ø·ÛÍÉÒXjÃYòíFf\3™¼|™Ö‰Š²¾ü¸ž{æ|Ê÷‹·k¥¦ª�];w�••ÅRÃqZÉÍÍ£^p°iTË]¤§g5M›tº»ÐB¸Ó‰¢(C"#£â Œ?@S5Â{dVx#‹7$OàðáBrór9^܉$ÙúY i`±y˜yíT"#£~unà\ÚÚô©\<5 Mó!KÖÿp’¢£G4xï,üÏ¿r1qí Æð¥pô …®®nD¹‡Í›·�›Nª1Š/åC¼µe¡`$—`HN’$�¶‡…ûžÝBHQP5mXJJŠ¡ª®w}©Ý¢+†n•'#¯fHT*-­­DDDQ[@û #EéaâÅ1d ÊüÿÄ€ââb‚Áà€kf³…y÷Î$"¦ MÓhoqòßO~ÀçëÁb1“––ˆÙ*‚ ¢)ÑêPn¸é7TUU! "óS.G üÔS†Á/€_e°-žü‚|ŒCf(ê—‡~Zšapjj*µ¾6Unå7êP.ËÍãƒC˜Gâĉø¼>(§§Ûtá$¹›IC¯7ü*‚@G{;ï¿ó.� ¡i¹yøåö 4!Iv6¯wñØÃopÿ¼WY0ÿsj*�?/‚ ðÙ0èÃ1ôTVUqãÈ˹[�«» “*Ûidrt.!UÁf�T%ÁzÊiû4(=à ‰bRbb"F“‘¶ ±aL1šoÛöðƒûµÕUœ(mgÝ*/¢ÆéA)YVˆˆtüj=z”nw7%%%炉ožÎȱ:¥‡` –í›LÚkÇÝ™„€• Y³Pz¬‹ÅLMU'ªqôHÜb�Ó§ãNãX¶•îgM áÎp‹ªiñÒ)ó¹Ÿ ªª™$YŽŒŠŽÂ(PL"ÛºKù`ó·,‹‰´9ikm'>щÑ$ž~k¯8…D:;Üç]õ3ÿEáÈá#Ü2ûVÊJËèófûþ5MÃáprÿƒ×’˜ÚŒÞX‹Þ؆(·ƒà?Ç3$Ü.ƒÁ@cc#:“�ÿöᵋÜ=óVb#¢y×½1ÜL˜=LBÓbúÛo'hªj”dÙj·Û1ÌȪH�ÏÃÎîR1ˆêC…̺î N”úÙ¾É�,÷%T4”�žšš¦s‚ÐÚÚŠ»« AÑÐ�D‘ººzEá’©S(**âà�$%%£Óë0 ȲŒ$Iä çÝ…NÚÛ;ðûìØ±—/>®-yEQ¤¾Ö@m]5‰‰ÉØ D»�öl%þ°“/Úwârª˜ô,½Q&GŸ#%ØLTMÓé%Q/ëtÄZÃI9útú¼Ü`Ê•ƒÆòΚ=�çX ;¶•rý�-DDD È6Ô7ðæë¯c #;;UUðùüDFF²ôûï w²mËVQ@Ó ¦ºgx8óæßCll,)©©¤¤¦¢i*«Wî@ …!Kgê U‰Äí‰Àï÷f±¡™©³{Y~|; ánÐDìF+ƒQ’L�=nAèå´þ”oÝ—^[¶u 7šò‰i—˜ªËâê¨6ì݆$I,þf#‡ö»�$ý€H’�ÃD^}å::ڸùy¹<ñç?àÁƒ¸ÿw¿cîwðý’%<þèclÙ¼…{î»—ûŒŒ Ìf33fÎ ::ú4%«±rÅ6¬i@O7ÐÎ\ D�g8׆ ô¨xC~|Zˆ¯™¼„Lúþø™ ¯›Ý¦¨ª ‚üè/CV¹øVedñûMï�d‰$Æh¤²Â…Íä@’ÎLQjˆBkW´âéù€Ù¿½³ÙLSS+0åÒÉÜsï|¾úr---Œ¤¥¹í”.p»Ý¬Z¹%âá?ªª ¢Üëˆxƒ~DQò‡B!o("ÕÇû®-LC×ae‹VÁMRNG8£ÆDa³úØ·KC­g!‰‘lÛäfÏŽï‘$ðù$lv7‘ò ¸ûžy¼ñêkج6l6Crr°Ûí¬_»ƒÞÀ­wÞ‰$Iý Ø¿ïï½½Œƒ{’ÅóÖŒÐë¿xˆŠŽ¢£§‹…­›™›<IKÁ£ÙÜQLOЇßëCÓ´®³|¼J(Ôáêr1:2 d‘…�›Xºg^£ŠIÒ“”’L˜ÃÎ]ó¯ÄliãÜæ€†$Ú’ðy´x\Iüß‹‹©««Ãçóa¶˜±Ú¬äæårÅUW"Ë2zƒ§ÓÙ€ •ðäã_°—Qˆ9¬9"šB’}$''ÓÒÕÎÉ?úË=z ‹å"¶Øêˆ ‹ÀÝíÖ€ÖS®´Ð‚,K>EUêkëë¸*w—Ó©ÅEEk-—Ääø<ggÓÔØD\|,×Þ�‰ 6�g@ žŠ3ªH¢™ãEp`ßJŠ‹‰ŽŽ¡»»Y§Ãçóa4±ÛíÔÖÖ0´Ž)¥©Þ‚,[¸P¢LUBJ;*'±ÙURSÓiïé"(k´…ºYräGŽ::ˆU-¤Ycèììô ¢XßWn$B¯…æv¹UUÕÊ«*+‰ �äýi�rm(¹Gå~Ë$f�¹Œ¤Ôdd�Ž“•üþ‘9Œ‘Q”¿ÆYDA€½{öRtô(Ï>õ ].Ççûï–°è‹/9YQAwww¿Bmku¡iº_ÀMRZ#<œÎ¬£HM�%>!ždg,ŸK@¤ÈWšÂ•¦: ��’$Öõ|½ê{`o��£ÕUÕJ[[+)é¼óŸyâº{xâ¦û0šŒ8�N†åcåŠAIDÕü¿€¦iØl f‹žõk×±lé2š{÷kÁ ?mÛÎömÛ¨­©égS{{7?›2g­(A2³Ý¼ñÏyÌ¿ÿvü~#Gb2›–1˜Ì#°w@ƒ¯ƒÑ]q<1é6ªkkðôôT˲®±}úè‘D©¨©±±­¢¢€È¨(.štaNGÿƒ/¿ì2¶ü¸™—þö"µBÏ)Õr>6ôîý&³��Ö¡ª*éé$§¤ =Ý=ÄÇÇ—�ÉlfåòtwwÓårQt¤Q0¡ª ŠÒs#D©•›oOFf•'Oräð¦LíÍjŒF»ø6®NÅîaŅ̃œšÉ¡ƒ †B…�>õxŸbÔú-ÆÆÖfÒ’’+»Üî’}{÷E�Ÿ04PQ)ì¬d{k fÙÀäœÁä†ÕfÅáp»�–ÆP£%3¢ ÓWá£j ªÒ�¤k£Ç[Æñ=cÆŽ¡¢¼‚ÄÄDDIBÕTRRS±Z­tvvRWWÇ7_}�Éd£ü¸‚¦õŸì&:F¥p¿ Qè]�P(@n�ÌÔK'râÄ ÞzãMââÉÍËëg_FZ ñ ˜Í½ŽRcc#EEE*ðÓ³�=Åýwß׫û@hiiaü¨1ÝÁ óÎ;&ß5ïn f⥒Ŵø]H‚Èô„ÑÌœq)k¿^Î?ß—×Ì`ûÖ�ìÙULeE.—‚�dsÈd Š$#k0µµFDAÄd2‘58‹ŽöNd�Y– s8ÈÈÈ ¬´”¸¸8Š‹ŽRy² D=3®Ê�óæñýw›8¸§QQUf[%MζmÛ©(¯àÀþ<÷·çû3Ј½ ›¾Ý¦ðà!jkjë$IÚå÷yû9Õ‚ÑhìMnˆâÚ’¢â‡Ž;ÔANþZü5‰¦H^̽YyªèK.’E¸ÓÉ—ÿýœGŒÔÔ4n¾5€ËÕ‰Ëå" a0è‘D‰“'ilj"!!Žuk×�U²ÒãñƒÉhÂn·ãp::l(ÕÕ5(ŠÊè±y¤¤62dh,‡ Ùüãv4Ábfk£#ˆŽ gÈ�/:�W§‹Oz½ž´´4®ºzÅEETVV’–žFssuµuäæå!ë Øí6ôz=v»�°°0ªªª°Ùl8NUœÝu÷Ý:x�¢£Gùíܹä ÍPpQz¼”·ßü·ÞvéCóÈö)pfðÁÈû‰1:xâð§è¨`é¤'Y¹|%uuõŒ&ã�Ý~o€|ºq²zÍ¢Ã#°Zm?TUWí=¶v÷øy³.㥒Åìk/g夿ð^Á|Œ§œ§ßÎ�KEÅIþ綾yâÉ')5§Ã�Åj¥®¶–õëÖE^^û÷ícÔè1TW-Æëõ’œšŠÉhDzS€ª¦ÒÔÔÄô™3Ø´a#¹¹¹áóù˜}ûí´µ¶²dñw˜L&"£"‘ÄÞ¤lþÈn¹õ:B^Nö43ÄžˆCgA/ʘ$='z9pì0«–¯PEù¤¶º©í´4€Öo'œžÙ9ZR‚¦imªª¼¿rÙòà´@&«.~šG]ƒ,JDìX$ã©X ™?þé ²‡ aÉâŽÉ\—‹Ë–³}ÛvÆŽGRr{vïaÜ„ TWU1"?Ÿ²²2TEÁfëMÎÆ'ÄS_WO·Û�ß 3+‹ÖÖVLFU••(Jˆ)—N军ndÜ„ñ´·µóäŸþLtL4�üáQtz=�…‹¢rXQ¿—Ûv¿ÁåkYßTÈg&›¿û�Š“»eYþÎ:Û®‘ž}öÙ¬V+Ï?ó,f‹¥Âår�x}ƒî¹f69Îd$ál÷Íl63nì8vîØÉ'ŒËÕÅÄI7a<'ÊÊ(:ZÄUWOãÈáÃÄÄÆ Óé ´47‘7bÝîn<^öïçâK.¡¥¹™‚Q#)4à˜»–íe¸‚=ÌM™Êûe?°¿õí~7w¤LEΗÐ4œ: é–64ò^Á½\—4žÝŇXõá׬[½¦Þëõ>#H§‘ÎðÐÁ¢#(ªzúÉÍçó (ÝëçœLX°`š¦QXXȆ (--eÏž=hšÆÍ·ÜŒRNêtº{Ê+ÊŸþÛ3Ï·{-Ù�öÞ`¾pþP›‚JwÈG¦-Y�XZ· WÐC‚5›l>§1v~è%9aIä:S¹È6˜¿_Ã[ø++–,Ýâ÷ùnvØÃþ}ÓÕ׆ö-BJèô[ûÅ¡»»ûtf€vÁïóÞ\½jwΙKrz<­�®É ý9))ùÒën¸^¾îúëHIM=뀠¦píö—PQñ)AJÝõŒp¤Ñèëd\Ä Þyß/ž�ÚßTʾ]{ØóýFvü´£¡§§g¡$Iï™M¦æâ²ã}“;×™.Ín·³lÙ2.¹ä’ +ÆsMúÌ6}Æ ~X·ŽQ£G‘š˜¼EÅCÕÕU7þó­·ï[±lyþW])^uõ4²³³x}!EÁô�a�Å êØÚTÈEYÓùºf;Vy`9þ™ ÐÜÔÌÎ�;X¹l{wïiïèìX.Šâ».Ÿ¸ï§µÛp$'R`+ ..ŽP($466jáááèt:­­­7á’——×'êNû\� ¿ÔA`ík¸ëŽ;�D Y§‹ …B3EQœ9:7/×:aâDFŽIjj*:«‰§Ž-b°=�0�™…åëx)÷vž:ú³ÆòPÆŒþßöz½475SRRÌÎ;Ù³k·VQQQíõxV‹’ôEl\ìžûöšBWW6› �Ç#œv:WÓŸ*FÓ4­ßu–eጚ㠂Ðg<ýR èõ2RR‘$‰P(dSe”ªiÓt:ùâ°°°Aññ Ž”Ô!>9‘ø„œáN0È8LVj=mèC:ŸFss3555Tž4òm¿6 Û­*LM‚� F"¬BÕ«±A †!À�ÆÐˆ¨PÕÝLE[¤)b¶‘‚TY!à\j0P~µ"(Ô«‡’5YžÑ¸­ˆ`ïQŒ\¯“'ä-!XqKå©Úd½h¾ˆÒ𳨱„(Mಠž©²”2Z0…�(² 33“Š…U ¢^¼ =çGÁ[FbX ^”wR[<ƒvbz[“~ŽÍv6›¶ C=¿¦šñ"51T”9ÊÓæ¤ô"b¡ &n»¡-C­$L«3…i­¥û¢D¼ &ït´:º\†aB'I–45èpàÊ:¨Fë+ÅÊùzë}„$EgÚÎ.Ä3ó˜›_Z\œi4Z�X˘ Çq¬Â!ˆhUÖýQµ>ñµô ¬{?ÉóÅF4gBSQ…WC(H­êʆM£(–Ô*‡Z&ãªß‰Ó–ï âù^4kU˜jªØ�ÊÍr¸&QÝm5¬kŸ?%O>²¶~ÁM-Û#7Ú™ÙŒ�6[‘ÎBªêÌ‹þô nr©F%hg‹ËÕUGë›o7w¼õàuÇöE1ªÊA“Èä1±@ʱÛÚì_X=Ý+.”£³!)§’ýL¯ùþ€ˆíÄPakyfèÓ'îöL*èˆ=�w*´†IˆfJ…šrsÜ”;MÃuçÉ&Ÿÿ“þ©ç&7¾…îþ�½û�¤Q>­ŒUk"o­Éy?WÖNÓýßxö¾¿9sþ$PYÄãt*\ãÂÛßsà–wf­YH=Õ6K�F§‘,Å4mÔ8Ù>ß;ñüú·ÆþrÞhÏdû#É %¸j&õv*$ D¤ô['Þ V|f*iI|HÈ‹FŠ <ìWÇnµ5Õ:óTú§Ÿ>÷Ì×K7d÷þâ•×ÜÜ(q©,Gê"<QÏ7Óykˆ*Ž moËÉGËoüõŧ6Zî1v#øþü¡øžϼå=q’ÔRtº�}óÝ+ç[×µÍ^f?–sOœû¹þÃY63Ûåïü‰=?ÿ¯—ç¬ö¶kï “7š@(��ætl¹*6†ãË£²?®FÃjŒd²ÿ¨Ó]ÝCG»k½­KÚh%“~ãñûÏ>>™ÝÛY>l7‹'V¶_Ø�µ“¹®Ø7wµsábÿ)�I’tÁ¦?¾àeÂ6 ½®»Á¼ïã‡" q0%™ÄæÖ¤0~8YŽ·¦;sõ{ý?üõBJúÐ'æ~쓳ãz¥ªØØ@H5$D!ÏšÆÚ¢,‹¢d¤ ²«dU%.'©÷ÕÞ«ü[ßÝhOñÉ'Êrl;S�µsÙß~ek4¿yOܬ‡åêúàÉÞ`µ™Ï7â}{¦n)}uëy5%E2ª.9­A‘µú: Ìno v+G*5 7²éñd»7¾Ô™i}ó3õüûM¸—>ü÷ç·†kÐ&±!.±6‹Ò´òUQ�*°‚­ xE D†”¹r¥„®½MoºmùÒÙþ…GÍNQ㹇ê§_=v|yv©áõtýôö‰ÌÆ{²#‹í›7‡g·Ëgk©•�²øà qd,ívh`Þÿs‡EYˆ5ÊP/ä{ãqÖ¨.>ÿæ§VÝdö ÷lÜûKûûã!qiX¡’G&I]—"�‰ˆ \øÕÕ¹…é£×5êjhlrqëTlÃUÓï¹K—/ıî`*DmÔ$@0ªªú*æc¨´á»ß?ýh Iý�ŸšÛ[V•gT@@¤RÄúšhTˆ%µàJƒoÙ+Ž.ÞÓ¶ËŒ(©aêYS°ÆÃáÚ]v?ÿo jR÷’Fmpà·å¥>OµAœÉÜ#gÿüåþÇ÷¼g:Ì× ÚV�(ˆ¯ê¨Ú)¦¯»”@R¥÷ýõEsÿµtÇ{ãÁxÓDAƒ!rø^§Àó=¼ "HÅ™ÅÖá]½¯s‹:RRÝñ·´ M–4b³µqáÆ·ó'ÿÅA¶uIQ:J⽟þW§ûZÔnä.�$ÕC§'²s»×y7RJ*DÊZ…‘—�ÏG¯+I h’˜sÏó‹O*âÁ[¿?O[Þ£U€ß±j ™>hM»-“Q Ë”.t˜½Õr*J«\y2@C1Uy óîñ }ý[ý'>u0Èv¨SDjÌìoýò¹s'ÓfÖ°  ÿÄÉ•¿Ù?sk,t÷ ÂeQ÷U“a%Ùy‚q=÷xá¶ÓÎr}ã[’IY2'$)�,¬b4e¦}Óþ÷7é`]‰€Õz1ÞÀC|ÃÌ-fW!`)?º`¯)PgA…"Ÿnúz”×so?òñcK÷x] úo|{ë'~aº¬.)—QâÝpÿþÕç«~Ä6BdO®}^¨Ýˆæ %ÈD"’P›I邆×{L¤êã—OŽPê‘k³¹ÅÈùÂišdPR@ÈKÃqo–�ýÐ ŸºnîN[¹Ú±Q$¡æ¥Îu�äpE>²É‘ùH“u~\Ìn~ßµ¿zM÷‡Ï­žo-w¶Ç§îúÁ=w}t®ô!Èšzñ…ÆÿøIÒeÎÆUeüP#�«Hlòùî¾¹æÁ™Ö¾<íX¶æ}?})vhb#¡Ì¾ôGEݿ󇲫�§åØ5-ÑP»Â“‚ÀꨮFýëþÎÝwìéì+'¾_‰X�³ llžxìÒŸß¼K_ðÕ¸¤<Ç ?uÇ¡Ÿl&s½jóÑóìì�`ˆëÊoÜxó¾“'ªõ bãI-¼üÌÖâ^søº¸œc×Ää£rd¬hà<�²ÜŠ9MLqÂY4ÝÎçÛù4À 2L“�ô6S4ôÀÕpuÈâVbmUŒ‰IVb5Ð`bºàžy¶ÿ€–’[ÞôŸÞ¼xwäWÙÖç{/½°ñ¹^õÍ�ñ×/ôŸRÃ6l.Äñá¥7[jCÍÚࡾ>ɶRxHCCFÑå¿ûK³ikª6¸g“îŸý—µþšÄ¹ï�ËQ¹É¶(H]W‘…ZRCjxº¹¿™Ì‘Fªä\Nªr$yÇvç­8î6§GÃ13H‹á`�X•Ïm|N´¥O¯áÉ•GJ;]k²'˜÷éàc“K?Z½x›nõ±�^.Îÿñ‰_8Ýûˆ_Ü|Ä£ƒ*€˜²¢¨÷­à§šÕd̤i¢›§›Ÿÿ£~ÞlÕž*é+ D¾öcÀ)a†gU*ë ¤@kS»º5%IÌ­|¡®�“! Vb!"�*ꄺÛÏ].=¹ú­/žý�˜Ÿú¾âÅÃõVpEÌ›Í0lÖRKj%¼srñíÕe¯«Ÿ?óŸ\ûƒáä9¦”ƒ!%¥*#ãû½òî辩›J.k4ïû¬?÷’Fu¤JʨÂ8h ‚BÊ ´rR‚@J ¶D!Ëh*ŸIÒööh›ã!bT•ª)û.…4Äý¯Ÿû½o¯þöA]¹Í—‡ÃÅëªñ„ÒK”3;‰©'vÞ…å°q §Þ.´åâýçÿl5òUl†bU¬Š1Blæ>ø“óB[!D”Nêíì[¹•F9‚a()‘Gí‚'Vf%Q.ˆ @*d#€ ÒœëN.�Œ@Lˆ31¦ši‹É_t/²‹W™pl¼ÑºØÈgÃ’÷¢¤@µW· »ØW{u0CmI•ZwݤU—RWƒÚm—~(bÆ“âú7GÇßÊq Š¢†>ôõáúù$I# »àG$„P�vFX"õ GÀˆ É$NCjó$jõ6/šØh0 �SÔ“*¤šØvBsâ*ÂK:—çá@e³0xãxü/—Án›¬Ðù½üŒqÅùôȃQZ‡°¨+ƒ¢{û¡o`nè6 ¿=qã:„^xùòøeo·Þõ¡Å§þvCC'Šý`¥ýÐýÞÿ±nU(íôJõAj¼Þ,�Cð ‚•àmmO‘H±=XUöŠ„H@µÑf‡æ³¨ÕN¦²ƒ­diº¹ï±�Ïœ^ù³Ië šåçóñM®qØ•ÏÛá3ébIº\Ô³>>™ì{’óTñ&ÙZãúÛuǺèŠÅw¼2Wáâð™.ýŽptì½êxxéÉ:ï0ˆ¶Ö h ¡V�q¯�“° â%0@(mbù`þÂÓç×6[Q»áÌ�ÆØkîºfþ® ÀÄ`´’©¿FMlŸ–'ÍÔ7 ¦“¦çu7 ª–“Áƒ.»À{®ÑÍã“‹FÇŠ%Ëtntꨤ[õÓOžûìË—,Mmø Igø¦»:/>уÎÀ¬_{ݱ€‘Š  XQ¯P(© ¤�¼«DLJÂLtÅ‘äÄ·1šÓS©„ÀЍ ÇÏþÞ©ÕŽ,Üshö¶†™÷®ìévNœÈ¶u8FÏCºFK�Q~:bŽD�ž6“ÃT|px.çe ïr®Û/ýŠêæã¾zbãÏGa5MË$GܯŠìºÛçó¹õrÛt¡kmá{bÁp¬MEUà™°Z¼/ Pï}8~Þ¿¨7×.bþ@UÕDUa2šÈZxbýÌÏ^ºæêå\5{-­8£²+:¹˜tF!qTw�í«YO’xº65�þ¶:î€ J¹ê6ët½ü™çae°Â‰&¶ÁBA+(“äΕ {Ý‘có'¾8<þýs³{†—VLÜL`ª‘jP¬Vn8÷ì.VÝAÃlµ¹w¾õúß\:ûâ3õ�o‹T@D hÐ6aã6ý‹÷ŸùµçÖ'2rÔúF« ÁT˜jB²h{Ñó‚L¶ãIæMæe^r®o:Ûq9¢h‚ÄEÍ�VM+‰‚x¢  �V&Ý:r}zâ«gÞrÏ-­Ÿx`pÓ›÷¦S;^Aa0ÙœTC&Dļ‹äÁØ„dyvêèq<}bøaÙGT¼ë� ¬Ò Nâ´º@g‰|j²èº]ߟÖKä['¸à޼ͅEEku•¿!ly>c‹ÆÄÄ´pÎÅ‘&"‘ ‘jE¬�˜Ä‚j@Iì=X¼Í}c<ê§O>P»‘3IðÂ&�ÆX­UZCо *È¢Q¹õÎÆ…—†Ûb£•EH‰%#‰™Ç q ´j,ÑR@˜’Ñ•~£«—Iíj?Ç|ÀVÖ Œs·xy¶Ý}8šUIÕ—&`RGZ-Þ½ïÞy–jÈlV•ò Ïd\eú�Ü{�I·7WãSO»º€¡X•TEÉ#D o ž+ª��…B @�›éAé�ܦí&Ÿ|xœåÖ‹‚<«Q žÉÁc )ÛÑ¡w_ý+‹|ÃóŒç²ˆÎ'Ýïpó ¯šl‹Ðf$Y9x÷xíLÜz\ù¤ûLÞ^­¢…îÞ«»ï~×Õ?ÛIö�1R¶Vƒr-°€% ÞUSËzå hxééÉè¢-'Þ @ 4V�v(|³Þ9·;Ô‚!E^*Ê[ámïïÜÿ¥M–iP©j•j#‘£F ýnµøÖC?;_uÃò�Ôõ¡“Üy®±ð]3Û1á¦rTXg•� ´­Ùñú›«ÁËiôålþdXJíÁ;öÿ\c:9òž«>µì–Œ;8WDTILÌÚ©ÒG¿íš®R¼V~{…9ef¦ïѨ¤ð·#+£ñæ;Þ·ïòúöÙgCšf"RÏ 1�çÞvèçödoD¨ŽÌ¼áÖ+>ºæ¯yHkНÑIJ—-¡Tk§Nœ¤a�Ÿìåá)³¸…™½ËW›d¶âJ5šÉ}àÚ_ëâ¸Ó H @•‰"†I3¹pº8ùh‰F¬êw/ø*‡€…æuGA‚`ÛôµÎ,ówÏås/üô?¹vR®0GÞ†ØqûöC?qhîA\!çÖ+u½¥ƒ>G‘Ç™C˜Ù[šA;šÈpÒËvú¹tæ¼G¬µÉ†/mßzãåvÒêÆ³ÝøP·½ÿØþŸ]üýR/€"1ÛȦÎY4ó­/œ*z°IM^ñÁ®Œò¿@ˆEû/Z›÷Ç+ïýЕÿöŸ=|îToz9su¥³/¯^:<Û\zøìg6ÆOlºçû~“]fó^´MóÌ8:Åu»96¬¥�ù|½äüƶM�æo[HO®Ym&ta³ðk_¥•F%lƒU•Áq”@MšðÊ|ëóƒ(ÙGÜÏóL¤AU‰@» «¬»¨ ��Ú»í,I#Û­ª^cîÂ�ï9úµ?={ï/Ù(*FÅ”�¿üÂå_v2b£lã8&Š\Ð<¸çèÇ‹Qÿ¹Þsúô¸\)}9Õœ9Ú~×¾ü¶S7Ÿï?öøÊ}&�°KÕÖ€R눔™‚8jD>ÔY³ù•¿:;Ü@–G»F7÷:VH3™ªëR¤&6`R�2”¡BT3óÈõùT¼�iÔߎßü^CN<8iwˆܤ’ IšDQÆØ”¸dìÝ;s×݇æ�>i ²�¯]ü‘Sw@cÃ13+êWTGµPb�ˆ ‚�ãVdÓ ¤Ì®æK/Ütn<5_·gÊàAˆÙ|·µ—(R5Ê!1FÓØ¤PGŒ‘ô _ìëÜ ¾Rk&ÕöûlùáolƒØZ©Ù!ŪЮ޸C*‘4@ •ác/ýÑØ?'²=YùúÓÿrè/€™Ì«»H�`U@Uƒ¤¶“ÙÄ€ÊÉxû²X“úºÚ{E£Ùò⑘k+1ÓÝÎ2(&·òù©æk¥ÊøõÁÓWÌÜ鲘ª¬£î‚ÞzçÔ×þj#Ï3 D …ÇëdtbB!EŒï;=üZ%Z7L’­VO=xú·ˆL“i—ÓT�PP(kàFÜÉ“6„T¡äÔVƒ-Ù\Ú(•G®Ïˆ­äiÛP*‰iOe{Œd,!äY;OºŒfuUAqtaë;SéÒÞ©[k'ëp@×ßÊS3ö;÷Ûí–÷Ð�âµõ‹Õ%Qt©|ú�Õ? �TÀ <¦†yaó‘GÎÿ×$‰­‰Uu—•ä (Y;O;Pfñ¡&ëοă­Ф㯹eQÆQ’&D™œÍÍÌtc‘óx~*›±Žlˆò¸k%Š(^©Ÿ½8Ú¸}ùC©o•lÝ`H·Þ95§ž¯ò¬)ÁæÕb¼£#:£pöÁS¿«¼aeç—`äÉæzâÒŸ?¿þ…VÒR;ë”`êÔÔ�N¶ØˆgÔÙÖHkøÊÕÒ§¾saªtƒkÞ˜/ÌêÒ5ã9Hº»C¡Î©ÍÍÆ,i aRŽ£fw!"äž½ð¹nséÆå÷è0Vë½uuåoËòúÚæå5JR¨*4ýž JˆÜw/þÅÊäI›«ca€H-©±~÷Ü—zÕ "�zލ5ÓYJâ¶Š1QZ—UaãA­yâþQ’�w|0õª±íäÙ”  D¬b¦\Õ1Àª¶‘β±Í.¿rjøÔ÷|ôêÎ=å8¦hÂ\£ãoXX__l“áDµ~ešP&[èÆÙÁ£”{…¦Ðè•–©P‚ñe²QaÀÊì’©|n¦³Ä”I �*‰`R–Cï'­FþðWú[›®®ŽßnŽßf&“²Õ˜g�D» jPPEÄ�v> ‰C4~ììç*õ·ùá«Zwj?UAA<ºòèô §ÅDl,¯Q¨a‚D$$Ìk™w…ª*K’ÓìâÔ¡v¶@A(x�Œ«íà%MLïüž¯üÏU™¨¹õ៙öÁµãéܶ `íÐC`%b¨ùÈ'î ¤A!J E'âEFîœ8Úß½aïÔU ½4Z ˜XŠÛêðd\“Ðl%;ú±ÂÈ*&¢zGLØÁY"¥ÌLÍ6öÍäËŒÌ{�Šª’QŠQyYP„·¦ìïÿ»Õç¿Óñrù#ÿpù oO|)‹Íƒ1Ø ©Q@!P5?úÉ;x÷/w¶dDÁiœ×U¯N§qk©ql®qx®½g2îÅÈÁ‰çyTvuµÈyšÇ^œ’ì¼b¨‘ ÁÉñÜlûŠ™æ‰Í}ªJª U£c7–—•H˜éÎ}ù�ûýß'Z¹»„ðï-U“r¦y”4bˆ2£Êb¡JB Bl>ö‰;^ÁF;‹H#R“ı«C0½µÍ3q’wš‹MZÜ3síTcY‚zWùz’åb(:wªW¾Ó!•ZÄj «!²ÔlÅ ÝÆò|÷ÀtsOj¼ «Z%R¯e¿X¹•@¦;3÷}~õw}ŒQó?äü_3®.¶›­ÄNÃ8æÚ*XÕ*¨8µž§ê>}îÔ/¾N£Q†…*¯Eoòb)“àÚ×/ßs|ö]pð¦ö¤Ãúror±Wœ.}ÏUéKÏ_,ë­£×.³±Ö$‘Í’$Kl+¢\!‚ˆq¤µH÷‡Å…aµêB­à4mYξø[úàìý÷6?|ïrQö”†bí0“‰(¡,EΜ„ØNçF[ÆÏÓ_žúÅ×&âÎ’ ¨Ô¡uãª7‘meG“ü`ë†k÷¾7�÷8Wˆ:5!À‹¸€¡±~ÜO‰IãuV% ¼„‚V^*E% v2Vk½â\¶L52Žtúå§ó?üô³Ï~¹Z¸qæcÿ`á¦w`8Ya¥KÁª8(¬ñ‰±ÁT(®×ÞÁê"}öÔ/îªÃ¸ö“Ê�ëPˆze"AŒ1•s¦M¿ñÀô›ržs: ^4¨ žA.`ìEE¼hP! …(S¥jâ†ÛåÚ¸\ :bŠTÓA/:õ˜ûÖçV¾ûí3­îì=Ùsç[Íéñp86F¤) Æ«ÚHC x¶‰¯²zr- ®©7WÒgÎü#çªÚÁWÎW5 !R0@„°KwÀ¨h¥Žsžžk_1׺®�MElYZ"µÊÈ«z 'ê€P9öëã|b2ÖMV‚7Å(Þ¸è/œŸ?&ãÉÞCù[îY|Ã[Û­ÙíÉ8/ÆŠŠeò$qÍÆ©�%Ø�TÆZÙº%lóë R¢ÿöôG¾(Glü.·òÚE)¥×'H4@kòíÌÌ6âF·“¨aÙ‚É#¨z﫺®ªÐ/µ×ßÒ—_ì]^›TC*‡�ª.ECšÆÝ™ÆÞC²ÿÊF{õd\áÝ\(ê±ÓM0¢( ÀH½Ô5aª,Žëèšz5 “`,¶¬Y–¤©q>A_wãÿí¨*Ç&ׂñb'9Sx/•!‰ˆ �uW"U@‰Ó)~ÃÛr69 ʉ *\½ÞÖ¼™v›­9ÃY]WN @ k,j�©)u$-·}“ô�Ö½È�ÔC…eãËÚgY*j½÷ôÿ¸? b’dº™·GåÚÈ÷51±¡ÝÛ)í»E¤Ì0"a4*TwÊt ”t§-Gfª7óx*±M†À°…”cQVÔ–Jã,‡ézr{99\o×ÉÀYŠílGZ…ª¢,\šæâkÑòÿf�`KP�h3MâVÚ-êI]�k? ä(‰îòÄB#¢ÊP)©�2Tž-¶iÔÉ’vÄM 1“5$€*Øj 2Yæ'KÅà8õ÷ɨL0@ * X( "UUÆq\;¼Â½ÊÞ/ <à"“š4Ó´ëCYû²®½—Bµ �€ìI«]¸ª†ÈD&1”ƶ™,6)#V "†ïlo€Bm­C”„òp½u³Žºu?�Ë&@u¬óx—• ÒjÀ[»º½B5¾ÆH �vÇ@QD­8ji¨ ¨¼„@õ ØôR諬 €<ŸÍâ6…˜Aeg8Þ0)‰Ù]–Wt¦óý£²Ý CV-v×�‚ÕÀÞz›}�V!¢Ö¿»Þüÿ9 °@w6ØJÜ4Q×ÛÞÕd^ TI$ŒF[Q+a5†þ÷B BL @•:®¸)ô¯sÛ¨‡!1»0íÕ×rQöLÔü_¯ÁX,±Ùm%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-30T16:04:01+00:00šãpIEND®B`‚qalculate-qt-5.11.0/data/flags/XOF.png000066400000000000000000000124661520501070600173470ustar00rootroot00000000000000‰PNG  IHDRq@¢:�gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs  šœtIMEæDjŒS%IDATxÚå\iœTÕ•ÿŸ»¼WUÝÕû4 ʾµA” BÜ":˜DQƒn‰D£1‰K~jbeœ1“èÄ%³d"šhbW@EÐ ¸vÒ@Ó{7M/Õ]UïÝ{Ï|(Dð—ó¥«kÌùÐ]U¯Þ«{ÿïÜóÎùŸs.13rS˜e†G€8ê˜c�s,…àc�ö³äÐP¾(L™¿ìpÌ�gକBì¯mííMæÚ,rk4þ쟳œ¶.Í`€ŽúƆRªwÞ©¹îªÃ@.§›êï|Q`v– ZD!Àp`v`‚$€Ù)éíßßþíK•–Uú¾t†I0õ÷ð�\ÒÓŒYdç,ZxZz;;·Ý»æg/}²„HÂ�ÀÌ쪫ï>ÔéÅâù‘¨J2kC䆶æ¦ vl­3ÎZ)Tûjí’9o^vö’}ð/ëÛÖ]àØ9fÇà8R;þvèúëÞ\þVMè„”[k-£¿¡¥þ~î33Y¶ÌFKßÁ½²Ùo6ÿú�Ú°�ÑÈäâ¯géœ:Ö@Ê‹�»ä?ÏzRCw´¾ÑºþN­Û™¢FŽÈŠÃQˆ@DL™—€SR‘iO´m*p†£òñãË˪×^íØ²µ¡³=yþÌÖ9"¢Ãšš …Í²/åËpl�û×<¸ªu¥çE*¨ô�©?×Сkkßù$q‹S¾¶6Ì "Á,"�,ÀÄLŽ…ÔNîlÛÿ´Ö"Ss¿sÒÌóã@ü×OlYðÔ:%µµœ‰ÄÜ— Sᘕ’ïÖÿeÁާ½˜‚Ô¸ò #ãÃtl Úÿâ ¦ p²³Ž­s!œegØv–��5p–­q.§œMi Ù°Ì¥|çÿÓ`À󸍹-¡”tŒ¬ù­ÙŽM™±ðÌÎç“ÔC4paDDit…ù‰·N fGúäðRgAŽ]†C!@ÆÀ2A2¡ i"(‰i?â8�|{Ùî9WOb‚Ôg,×—S°'©.Ùð^ó»ˆ d�šC{šÒ-CüA»Û‡]û§ +U&0Â�@@&t"Î`b)ó°€ 6épâ~vbE!àoØÐx‚ ÃÆö9WÃÁÉl=ü³­§Ä¤j»ö¶t7ˆˆt -å®î� ?Yx{õ�&/®(ÖzHê¨@aS€Àç.Š$(ÃXI(‹.wêèX¾² ºí`béÒ À0hjêEÆ3gǧʞ=Íà!áIfrÄp$�®ûÕ†öÍÅžÿÐåƒ#:�#¾ÒJi-´RZi­”ÖZ{Jk¥=áiéKRštZ°çÛkΠ¡qÛí«ö ÏœTª'@”= {˜~Æ€ '?4o(33„#«„®·usW|gO¢îëcÝù`›è C&iÉ�œñ>Ç‚­‹H)ØQØ–š;#>stI�äë¿óÊsØ£u‘ui"$‡�àœaÊR: «Ï}ÁD��u•^åEC.D/¤°d�ÑQCdž‹_»pcÇÖ»Ïùðõƒ"²#H8 E2Cœ °„†”B°4éž”ëé¸ûŠÊ'¯·oÇŒóÿüÌÓ<¯‚m9Z«È]üí±€#(ÊÖd³G13˜Á‚dMo͹‹Î­1ûµò r¤á§]Ï 1è—§=rå¨Ë77§Z¸íµMéT¯‚”P„,˜al(…=»:òà•#¦VÅ÷Û�÷ÝûQc«ò}†ÌQ_õ¤šn½eÜãOžgl ¥$d)öÏvlÊìlÙHá?»ç…kVÌÑ1P(Cix¬ÓHÊ@}÷„ï=pÖÝä�5:—¯o\_“ªm z“³‹FcEÞ)#ýo�:hÚ øŽM-?ºmÅŠw[€"åÁ… 8åé Í“&òÊÕ—JëH&d)BÍ~¼Ï;8kIKyߺyó?~@H‚†µÄ eº{‡ ¿ÿ«ó¯u)  \g*• ˜-òót±çغ©åÑGÖ>÷çzc<íyl�s °öóS©ÎÁUáÊ·¯9¶8´i-%‘[×_˜ ËN�‰ä½Íÿźqù�ˆáÀJHglˆ´úÆ  îúê]Ó*¦9¿«;ýú+;ÿô'ï¼Ûl�”".¤pÖ‚ ‘’J¦ƒö±£õ‹K.š0v€ C¥5³!Ê ý‚iFÇ`†â©] îXýÓNѬµÃŽÉ §áŒð8‘,R¥³Ç^yÇ”ÆÚ«þãñ_|áÓ=5�@LȨ’ÂRZK2NZÛú­ªüÝ‚‹Êä…&ÐêÑ—E§y~†sÖI©Þk]{늷܆<)=A[ÉÊ’€J˽¹áêä[_«Ûß D|¥A ä…a§Éû~>åÞyS«•þÌ€fµ¨¢ÿs'.pADFZ‚–'6?þ»- šL£Œ�â˜Ašb=UrÑi�+&Å_8cK å$¢a@@óyçTÎ{ðŒ©§U±3Ì’LšøG—ž�3ZH"±­cë¿}øÈ ûŸt ”Ô®H,<3¹ôlM%¡ …5Ì N ÃÐ;~|þ]?�<çÊI„aZJ%!ÃÔ~±(èÓ#âØZgµô¼Òøú£ïÿzM×êÈǧ¦žšE(î°Æ±:´œ7&rÓ-®½¶º qÎ0�)ÉÌ«’í9„iÆ0ŒcÒBH?þá:{»=0E¨[Å&hÈÐ&‹*ݽ÷L¼qî优ÏÂÀh=–Ìçþ*KÉ¥Ú1�<� ¤"^¤úÐŒð@—ÔF °%' Ùv«‰›ÇWøñ�n@h%•öe.qôåúIr¢åˆdòF‚”’ ÀÒåŸZ’axŽ !`yæ»ùßÿèãm»Þ}«€ A„¬Å�ÿÉ-L‘I‡²�B¨©9hX&H ´½zÚûòÚ÷¹Ç[�Û_ÓáTsÆ‚å ¦ÈB`noí|v‚ˆŒáÊ mþìÕ6ï0®¼­+CÅfNÊ%Enbš¡äAË# BÚP Êo½zÔQÂMUæý_ûGq²¹#¹5š#âœ0ôøÀ(ÁÀ¡›2¶úøA—ü®{ã” m�<(€8ç¦�s:Z&V—`#�0Q kíplþ óäÈQåÈ$šrLrÉ—:J2H�sÎ yÑ�ɤ£þ¶u~Ù‡e¿žß 0&=~‚?fl)À$rÓÕS!ÈX;a|ùY3Ššó‡µu¤S7~çÅ ˆøôœuö0ßÓÖÚÜSÓ\ÅŠøÁÍS€„Dž]‰ê‚0('É¡éš>-úÞª«œHù¹·ôsò>gÄ#E ?êÁ…ˆ[‘0@‚«wµ©C’´u†™sÉßrSkÂP+/pâúk?óûZ•º0M"Øtdpç‡UÏ]öò7÷¥ë´T¡ YÀ¹Lå¦Î9£´®¯ï™yî‚gþPëérØ´Kެ?sK~µ¿ªuÍ¥‹¿µ¡c³'}gCËäÀ†\.tŸå¦Ì64¡R+ÿ•×vN›þô;«»bñÐÂRÀƒ1þIëÝÔM=½‰xñ¸õÉ=,úÆŸkžW2"!­M3B ÿµ5˘þÝé2ƒ�1Ž­V~kkï 7¾zѬÅu­Â‹¥>X‚À¡·=vYMXD:H§ls¬¨²-ßÎY~Í­«¾ß6k�•–3½€ýmö1åÃ8®|²¡avF)%ÈûÓï·L™üßO=U›_T"-‘tŠC­ÒB pâÚ{ÆÉÁŸ ŽHe$'%ùCŽòÓ3^<ïÕ¯(©)ëBë3»~A6û˜ºÏz �1¡´Bè×ߨ™>õ™«æ.k uA¡L%Y—j›JŠ¢D|°2AÛ�|Â3ó®ûþ ×õ6ïΫm$9$ÅM"Y8ðÄ­âЬ×g_³âŠÍ�Û•ô¤�i˜–>¿‹Ù“¾öO¿Ð\oœ©ÉE¢'\±rÿ�¬Yù^£8 ¸² }w‹ˆ¸òÑC[·4‘tåcÊê>ª™yÁñ¯½~! œr—¿uÕKÞ*zFgóZ!µ_P•îlðu©Œ—t6l- ÅÕf_;á†I…'àLÍï—«—'ƒ)1î‰"̰ÆnßQÿÒ¢­/-Ú¹cgÅU“‹zöötìì(:±2>º¨þ�m~^Aiu¼nUó)“*—/Ÿ]RI…Æ×~mP?ká¬�É}eU“º[·°Qy#zÚj .VyR*Q›lÚT¢‹gwñõÕ×O4Y‘8*#ýeÁÔ9'IJÆ2#4fϧMM�i%|WE#Êí�®9Ažç/íj<ˆúdÞ …¸dSbluUIq$�¶¾ï„€ªMÖïîØ¥½�`ëLK$V%=eºkS6ß� $Ó’æÎd29@WŽ/'…b8‚�2K„QŸcêœuu�M�¤hÌèy±hoOº³ÛiM…Z+ÕT×­•$_²c Ó¥ 8¤¢žØ pž§{S½é4KMÑ>oÑEWk*�2y%ù±¼¿S?›©%¢ÃÍj}©¶Y¸u ÈnxãÍ7ë† £µÝ”‹­\µïòÙ¯'ÓÉ%‹.ilMÜtãêÂâÒîD‡ ÃiÓ¢«Wÿ`ÛŽ–oÏzµ©9uñ¬�O-˜åyzÝúækæ¼ÞÒÜ5wñ5 ¬kè}fÁ†eoØö·Ng½²²ØÉSü{î™~Ò¤²Ð8gCßÏ{ÅžÇþ}­ è¼óßvǙ֚,´Jö-¦ÌB×Öu¬ß�ʪÇW®(°î¯-=É|­ã#Æ üÃ󫀸 ĹçT%»äŒóÊü÷o¶ìüÄ…K–xø—I!hÎoìÚM5¶$±dÉ'·Þòv}£Ì�Á6Tûö·ïÛŸ¿ôµ—¾tæÌ™c¡ôž}‡®»æÍ†F‚íÛS×ßpZQ¡f}Mö­/åìÚÙ~°ÕÉ)SJÉpëÿÚЉՅÅ%þ¦M@´ ž˜8~ÐôsJn¼õ”ÎC©×^ÞøZáP‡X¼èÓ›oys×îD$¼ÂxdomÇÕW¼^ß>"²pá×·m¹rËŽY÷ݲQ½)ýè¯>8šï^·´¡‘´ó"åu�É�ׄs¶oí{ÿ”|øAC()§Ÿ1@[krËæ@ 9Þk¨ë¬Ù� E MúW�¼ÿäckË £ žÞ°¿¾«°PW�@É]w}üâó�%Ey^4؈¯—-ÛÛ“.Ì£�M¿ôÒñyq.-οæê ŠÒ3@÷ܶü½÷˜ÿ³{GÅtxË—} Üçí‘}‹iÆ1üÛöV â{¾ üÓÖúôœuúà­[ÛJpâG·qÑ7/º´'‘üÝS;�üsgDîùÙ ¶»;¯°@üâ‘“ òpJP˜r€Ôi­qMM�wÞ¶¢7©�î›pò’%{ì7{�Šž”}M[o€V¿×�!•ìë oŸûÖ:)Åüùoßwß& ´  YZÙ[“ÌôÓÊßY9göåK^~¹ ˆ ÆŽÛçÞ4± °ô7¿¨·ß>{̘ªáÇ=8ûܳgM;cäða¿µ.zËÍc~x{uõøÿJ§Ëû¤=UY:¤$Åõ$‚]»�£òÒȰã˘©O3ØÙÈG1³sNÊÏËĬ±B ":¶¢ñ˜êFæ£v>`+èó6;{Ì3'Xk¥ú|åYg3 qìeûxw¯ìåøŽüÎ1*r,w¸ªç¨¯1þý/o6•ù0ãwòá�æŽÚ[Ÿ± ‡w©èë™ænÞôÿ¯äPîäK#ÿ DykëØ£Y%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-30T15:53:06+00:00qç IEND®B`‚qalculate-qt-5.11.0/data/flags/XPF.png000066400000000000000000000051511520501070600173410ustar00rootroot00000000000000‰PNG  IHDR`@jVåYgAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEæDjŒS mIDATxÚíš{pTÕÇ¿çÜ{÷E6›lò†„� H‚ˆ| ŠAC*M[[[‡µÖQ[kkeª­h[ë{,Šã£ŒµÊK-F¤�@6BBȃ¼›d7›ì{s÷ÞsúG‚´Î8ûG»»ÁÙÏÌÎÜöwó™ßïœsÏ9äTbb|=4Ú Lub‚B‚˜ Ä… &(1A!ˆ ALPb‚B‚˜ ˆ $Ú9LiD F;‡)�(&'E;‡ÿ„_x˜*uMÇX”Sà*ᜀ1* „pÆ8S¡Q% çü�òÿBžð¡EQŠv.“ˆˆŽ ¦@ÐàUD¢Nižå—�qK½б¬tÅÊã=‡xÒ5$åJPƒ Btæy˜2ù`?Í÷®â/‚ýá��÷‡¾R“Q¿§‚sÎOð—Àw˜øG+¹§ï«Œ ïpÎ@ø‡Ñ¶ è; u‹³q¦Ù¤KöÎÊο} Þ¢UFÀw7o†âÀÕçYAœ�PŒµb)l„*cÁ/àgdZ$‘ TÛÝßuä8Ò¾à`A\û'4¾Šº×ñ�áhÀÙ7UÐ…Á®îè·0­�Wþyëa� èÁ˜¤Rû–Gή”/»:3òÊá`gwrÓtô[`=öÕPß A Pü¨}KžFþjšœDüm¼s/æn&ŠTc\§›1`k[^VSÉ1s!˾ 5[iFÑ1Üô L³ppÝd¨H9Š” ¦@Ë8²Ÿß¼zÛÇÇV5(÷“ö0ÎFÒ<¢@(gŒëué4NlÂ?&mc†ÔÏN¯?9r„ß¿í¢öIk´ˆâ T„³ Õ¿âqqèÙçmzoàÍÚ¾/:�ZþŠ„|0Àx��Ô ÎÉù}>?ðvµõ£j4¿J@A€³Ûô€‘)¢ˆšX¿HF, 湂(£†D %lBï)ô|̵&>Y `Aœy:Êg•KzªIЃ)œs,x¥áé�DÚ1ü¯à�ìÂ'ë‘~?O“ß.ÒÑJ-ñ uŠ6Bv TE‘ Šºd=Hôf-�ê�ÕËï ùºñÅOÁw ê.ŒGa$ü4Q¶Z V¡î¾ ìÕ_r¢ÓFü"Ž?U²W¸}ŽQ·��:%Y‘(!‚¹ehycÜÚàÒÀ˜_qüç8t ðôÂf¹üÄ`è‚‚Ž=8³Sp52b ’³ËYç~�£nQÅ»ÒsO�¬¹©7Åde£¯}Ÿ"uɺ�©>è ´ù5X[AEpe£Íƒ‡“ð· RAvÃo‡àA_ø8¤ÒÒ]H.ÎÒ§gÍù)€Çïï¯>g6ã2#�@Q ® ð>Ø1m&ôÉÐa̹üÒÄ9Aýsª†!DƒÄd"å0µ )u³O½ýÎUëô–=¿)^_vzßÁ¢’•£ƒƒ²ßßÕ0½½¦iÅ#· rp¢øàêÄÈYÈN¸»�¶ËwL'‘Z¹Úa­Aï'è¨@Óæ�DI¹×~þ\jnvO}CVQaÿ¹fSFú`K›otLcÐ�´7›Ó̪¢AÂùÝh|�Àú/Œ4ãâ”^"3‹�‹q\•¸Â �‚PJE÷°MïòܸùnkKÛ¦Ÿ=_u|Ž[†;» Kn$)àr-ýþ¦Ë)Q¡tœƒ1.@QeÐø‚‰ò¼ÔʲøqrŨTÒˆ¢Ø¥§P¯Ùh 8ÝÕ;w�ôõ]µnMþÂù>·÷‹7Þrt÷Ì]±|ε‹]v;c\ LZú{¢:¨‚–Á´�$ücPØ[ŒsB€6Ϭs¤48cõöEE�êŸ~o Ñ(ñ[Þõ×  4ÕÔ¸œÎ´‚9qËnÍ)ý–@iog×éÏ>O_tÍôÌ,aØî²¥¿ce/gÔúJ�[önË �¶d0ö-´°W' ʸwËÓ’õ–³ÃÖ‘@Ò|³';sz}ë§yW)E—­½uµÏrb­m×{ïÏ¿! ªÎñ>¬ÿnÇ–m»*êÒ3ïY™â,-M°Ùô:³–«Ýñ{sçÍ«—ôô9ŸÝÝ08âî�%3Òâ㔆]Qäí=Ú½ögRSãVgõºM)ñåc• ?žpãÚßùè_ᇬ̹:÷­�&á�Oy:�ÉIU7ßùOÿÌYºÖ~·¥É&�+Ÿ¾RzKqÖDØo‚ /qN6Û»ã¤Ë+?¼¡èÎÒ9ªß¹}÷É#ý’gÌwéìEóÒ²Rqè¼¥Ó—›*Ü^¨[´lA‡=øò;5{«zKg?´±Èh�’Lºˆå!A :9¨Î)ßÓÕlƒ$hâµwÝ6Û5NvïkŨZazŽyÃʼîAχ»`÷4£0£liæé–ácÇûA�¼ºlî¾?—0Îi¤N8"WAœsBH}ÛHï�ÇhÐÔµÚw}Ü6M/n^wynf|@V«Î }t¤;Á¨ÙX’?+ÃèöȯØTÕ0®Be©™ñë®Ïrø÷íV}Ap>37±dIö¹Î±#Çz ©éÆw¶._¹( ˆÀ×EôP§„¬îiíqêµ¢A'ŽUK“M¯æç'�˪$R_@i8ïH2içæ&º¼Á€¬Ú��%…©k¯›©¨L"zå£ç.«ûžgŽžn™¦·Ü>÷Áï 9ü�¿Vû™¥_éÍř۶Ç&�¡#\;DçèYe\e\#QŸ?X0#Þ6êkê{è‰Ã[·[,½‡ îš–Þ:3Þ92üîíô¾¼ó¸¶ó¹¶W§‰•ȵ–ȶ;*Å�÷´�Ÿ)€Géìö¬¸Ý¤±Ù¥±Ùþÿÿ½Æã>Y¯&–$•$–êíö}�É3� ”#•"”>X¯èëõ|ŽÉÒØìG`²!”@ÛØbKGDøoéÇ pHYsttÞfxtIMEæ3m¼Å•IDATXÃÕ˜åZÃ@E'hqwZ @ ØâÅ]ƒ¿ÿ‹ÐÍ׆¤YÈN;÷÷öÜY# âÔÔÖÕë44¦šRR¡Pœæ–VŸÐÖÞщuu÷ôúˆ¾~)‰(€‡†}ÂȨ�•GZ"�– CD%(�ÁJÐØøD)AÙÉ©i¤¹nvf(A¹)Asó.T‚— ¤–WV‘¤”Z[JhTÂXKlð%ŠœD “øØKln1ØJlïìîÙ'°•à$ °•¨ .$Jìrb$I8¬˜ Ì A‰ßa @©üQNŽONÿ'ýˆÀ/ý™‚4ôTžìÐÓ5xÁA/™võÏÎ/.íÃÞ¶\]ßÜÞÝÛ‡»ñzx|zö8ám õ½ÖøkóË®_Àê¸ú>Y_ì�Ö×›clÅõ5Z_,ê¿V\_ õ5àïëœ*ëk@Y_Yß�¬oˆÖ�„ëÇÒõËÁåøÛ»Pý( ¸Þÿøô¾¤Æ÷¾ºOË_aŒlé%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:54:26+00:00k¢¯tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ZMK.png000066400000000000000000000027451520501070600173530ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÜPLTEŠŠ‰ƒ6y0€‰Š‹Š‰‚‡ƒ]ipl§m€w>yGq5€ˆ4€imfo;{"‚ƒ6€epqd}k:s‡‹${ƒWµc¼fÒlÊr°g±h…rN{3�#„#�«uìw¶oNj€Š<~Zx�qšg•l¼lÆgÆi§`RkˆVp£eÀeÂeÐlÚq±\Âd¼d½l¹t�nàwó~¢lcqxyw‚s¥l¿iÁeÅe»`ÍjÏkÌkÊi¤c2x)‚^k«aÍkÞtÌj°\²]¾cÕnÉhézð}ëzÑlÎjÃd¾b¿cÀd¯[ÂfÚrÒnÄgXk†EoŽeµdÎkÉiºa½cÜsï}ì|ßu¼bµ_¸`ÕoÝsÇl¤l[u†‚Auamœe¿hÁc¼aÔoÙq»b½bºd‘c^r@|%�8vTmqf”hÌmÎlÏoÌnÈh¹`ŸR›Us\Av"ƒ$‚Gy‹c¸p‘p©b¢a’d_j‚ˆac„bJm¨`:g/}'‡0~‚p lxk±f7m‹Fp™gtdcl/{"}!|�…Œ&ƒAtBt?tomm)yF‡ŒTjÐ'Ó&Ô&Ç%-b;åã~WhÜ!ß Ò/g6ñ~WiÛ"Þ f7ÿÿÿÑ»,-bKGD󬱾î pHYséé”z<@tIMEæ3m¼ÅÌIDATXÃc`C02ÒÔx&fV6vv0‡��“f-73åðòñ  ‹ˆrr02ЉKHÍdäàä’’–‘•“WP¤Ô|%eU5u M-m]=}C#cS6=3s K+k[;{Š}ÀãèäìâêæîáéåíãëçG…øaŒOHLJNIMKÏÈÌÊÎÉÍË/(,*N+)-S/¯`£Ü|`(UVU×ÔÖÕ;7465·Ô·¶Õ§µwtºuu÷ôRÃ|èëŸ0qRúä)IIS§%…µ¥MŸ1sÖì9zìÔ2Ÿ��Ãaî¼ù .Z¼dé²å©+V®Z½˜ª¨g>( 88Ö®[¿aãÔM›·lÝÆI“ܧ´}ÇÎ]»÷ìÝ·Ÿ¦ƒÀ�ƒ‡9zL‰Væ‹?1ëä©Ó43Ÿ�ÁáÌÙsçiZö)ÑÐõC0ƒŽ  Ä‰”™ñÒe¸rõÚu(¸vã&PdÁ­ÛwîBÁ½û>‚‚ÇOž>ƒÊ,xþâ% ¼zý޾ˆÊ,xÿá# Xðé]ŒZ0jÁ¨£ŒZ0jÁ¨£ŒZ0jÁ¨£ŒZ0jõ,;o::¡+5�%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:26+00:00„ØÉ‘tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/ZMW.png000066400000000000000000000027451520501070600173670ustar00rootroot00000000000000‰PNG  IHDR`@Òê‚<gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÜPLTEŠŠ‰ƒ6y0€‰Š‹Š‰‚‡ƒ]ipl§m€w>yGq5€ˆ4€imfo;{"‚ƒ6€epqd}k:s‡‹${ƒWµc¼fÒlÊr°g±h…rN{3�#„#�«uìw¶oNj€Š<~Zx�qšg•l¼lÆgÆi§`RkˆVp£eÀeÂeÐlÚq±\Âd¼d½l¹t�nàwó~¢lcqxyw‚s¥l¿iÁeÅe»`ÍjÏkÌkÊi¤c2x)‚^k«aÍkÞtÌj°\²]¾cÕnÉhézð}ëzÑlÎjÃd¾b¿cÀd¯[ÂfÚrÒnÄgXk†EoŽeµdÎkÉiºa½cÜsï}ì|ßu¼bµ_¸`ÕoÝsÇl¤l[u†‚Auamœe¿hÁc¼aÔoÙq»b½bºd‘c^r@|%�8vTmqf”hÌmÎlÏoÌnÈh¹`ŸR›Us\Av"ƒ$‚Gy‹c¸p‘p©b¢a’d_j‚ˆac„bJm¨`:g/}'‡0~‚p lxk±f7m‹Fp™gtdcl/{"}!|�…Œ&ƒAtBt?tomm)yF‡ŒTjÐ'Ó&Ô&Ç%-b;åã~WhÜ!ß Ò/g6ñ~WiÛ"Þ f7ÿÿÿÑ»,-bKGD󬱾î pHYséé”z<@tIMEæ3m¼ÅÌIDATXÃc`C02ÒÔx&fV6vv0‡��“f-73åðòñ  ‹ˆrr02ЉKHÍdäàä’’–‘•“WP¤Ô|%eU5u M-m]=}C#cS6=3s K+k[;{Š}ÀãèäìâêæîáéåíãëçG…øaŒOHLJNIMKÏÈÌÊÎÉÍË/(,*N+)-S/¯`£Ü|`(UVU×ÔÖÕ;7465·Ô·¶Õ§µwtºuu÷ôRÃ|èëŸ0qRúä)IIS§%…µ¥MŸ1sÖì9zìÔ2Ÿ��Ãaî¼ù .Z¼dé²å©+V®Z½˜ª¨g>( 88Ö®[¿aãÔM›·lÝÆI“ܧ´}ÇÎ]»÷ìÝ·Ÿ¦ƒÀ�ƒ‡9zL‰Væ‹?1ëä©Ó43Ÿ�ÁáÌÙsçiZö)ÑÐõC0ƒŽ  Ä‰”™ñÒe¸rõÚu(¸vã&PdÁ­ÛwîBÁ½û>‚‚ÇOž>ƒÊ,xþâ% ¼zý޾ˆÊ,xÿá# Xðé]ŒZ0jÁ¨£ŒZ0jÁ¨£ŒZ0jÁ¨£ŒZ0jõ,;o::¡+5�%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T11:55:26+00:00„ØÉ‘tEXtSoftwarewww.inkscape.org›î<IEND®B`‚qalculate-qt-5.11.0/data/flags/cent.png000066400000000000000000000111321520501070600176310ustar00rootroot00000000000000‰PNG  IHDRz@Õ¸c/gAMA±� üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“ pHYs s s αmtIMEæMÜÀx$IDATxÚíœYl\×yÇw›;ÃrHŠ›(‹”Hí²HíÔbZÖbÉ’åÄ–ë5±$A‚ E�})úÐ<¥i›¢èòÒ¢i‘¦i�´qc;®Ë–-[cE–l‰â*‘÷á2ûrç®}˜á•h-vÀJÊû.p1ÿËÁÁùæœo9ߥðÀîßw¸ Çq�;ñ›¤Û4ê žŠv!;6wFœ»±mŸO¡¢¢˺uÒÇA–%-*»£.ŠUÕalûö:@uu¹{»gª«Ë‹÷·ê¶]ÐA¸ãwxÜ©¡¡íÛUUaöïßLûƒ-ÌÎ&I&²îd:TT”ÒÞÞÂÁƒ[ˆÅR$lû†^VdÇŽu<öØ.‰ ñxÚ5¸ã@(`Ë–U;ÖN&«�§1Mˈßµ™§žÚƒaXÄb)tÝbnqû|2ëÖ-ãégBEb±yÝ Üʳ>7�ˆgø»!Ca%I’È�›ij®çüù^&nz¬0‰=ÔÊÖm«¹ti€þþÑy_dÛ6»¸Ÿ¶Ð×?Jw÷õyºiZlÛ¾šGogl|†Î˃·è--M>²�d*ËG]E˜§Û¬^½”Ç·#çÏ÷‡æàØ6Ž·uß@âñ4ÿýÆü*#ÃSØvÁø‚ `Y6©T–“'/rþ|/X–�(ŠH’ˆeÙd2gÎtÒÛ3BoϦiÍÓ5Mçü/{›e``]7EÁÕuÝäÒ¥þæ¯ÿ‹±±i4MGnè¦iÒÓ3ÌßýíO™žŽ“ÍjH%J+›Ppá×™‹ÿ×sÁ˜ X–�,K8Ô×/¢±±–s纋~YÀ²,W¯ª*cíÚF::º0MA0 E)èáp ›6­¤£ã ù¼q‹^TiÛ¾–>è&›Í#ܤ;¨ª��;×qáB?ÉdvžnÛ6¦i³¹µ‰?ý“/¡ª Þî}gä¹Çqpœ‚ÁMÓ¢±±–o|ó(+W.áûÿèçí·/`Y¶«×ÕUòµ¯aË–UTT„xýõÜUjš‹•qüŃìÙÓJ]]%/¿ü>¹\ÞÕËÊ‚<÷Ü>Ž<ÚÆò×êxé¥wH¥²®^RâçÉ'Ûù�§öpòäE~ø/o�¦Ea^0(*2¾E•ø|òÿi â'?˜K_&&f™žŠ35çúõ†aÎÓ§¦âLEbD"1†‡§Èçuá†>;›dr2ÆT$Æèè4Ù¬æFË‚ �HdŸ%‰16>K2™™§g29FGgˆDbLND‰FS·�¶� îõ<þÆãnݶí ª„B&'c¨ªÂ¢ª2 ÝIJbÑ$~¿�ŠŠRÆÇgQ™êš0zqKž™I¢(55Œ�M#I55åäó²,1=GE/®dllA¨©)G×M|>™©©8Žã°dIãã³…T«¦Ó°PU…©©–UÐ#‘–eaÛ[·®æ{õ-|²t¯çò7šbÔ ‹W²ÿf–6TóÊ+géëer"ê>X]]΃{ZY¿¾‘W_9KW×u&Æ£ÅU •!víºŸ¶¶5¼öZ—/ 21qC/++aûö5<´w#ÿóÆ9.^ìgr2æêÁ ŸÍ›Wrè‘m¼sò"ç~ÙËT$îê�€�––&ŽÝIGÇ::ºˆFSé4±‹—QÙsÑw¡èØLÓb{Ûš›ëyû­‹®?†ÂDëºÉ–-+Ù¶m5§ß¿\ŒªoD¹zÞ ¥e9íí8¾� ö»º @>o°fMííèî¾Î/>èž§ëºÁò¦Å´·o`ltšÓ§;?¡›Ô×Wñ@ûRé,ï¾û1‚$’ìéçÜ×^¬ŒyQ÷�pÓ«T*Ë+?=ƒ¢ÈŒ�Ï+]…ôÈ0L²Y�Ÿÿü<ï�ºÄÐPÛ¶‘$I–0t MÓyïÔ%.^¸ÊÐÐ$–UH¯EÆ0LtÝàܹú¯Ž191‹i~(sºaX\úøßùο�M¢ë—0§[–Eoï0öÝ'™Ì¢i: àXf:^}Wæ¥WŽã¸ù³,‹44Ô²|ygÎt’Ï8ŽƒetI*øÛõ÷/çý÷.‘ËéEÝB’$$IdÑ¢2¶n[Í{ï]"›Ñ°íº( „ÃAv゚ӧ;I&3·èÁ`€ÜÀ¹s=D£),ËvuÇq¼Z÷¯À¼ô @lÛ¦®®Šo|ó(«V݇$Iœ8ñ¡[϶m›êšr¾úµÃlݺš@@åg¯�Å0 EÛ¶)/ñÂñƒìÛ»‘ŠŠRþó?N‘Ëé® –ð̳{ùÂc»¨_RÅ¿þðétÎÕUUåñ'vóì³{Yµz)ÿôý7ˆÅRˆ¢8?òv˱moç¾ ·$Ÿ7Ò«(ƒƒ8ŽÃÀÀ¦iº“,ÓSq&  \GÓ $é†�&œ »®’��q2mžžLf˜ «û:ÅZ¼)½Ò˜ »{˜Á� b±Ô¼ô«8X|åeT¯Ý�âù®ÌK¯JK„ÃAFF¦ñùÊÂ%º‰ @"‘¥¤D¥ººœ¡¡IE¦¼o I‰DE‘Y²¤ŠÁÁI$I¤¢"„¦éø| ±X Iih¬ep`A(”äó:ªê#K°lyׇ"ضCEE]7ðû}Äbi,˦©©ŽÑÑ ÃͶl^ÉŸ÷k¨ª¯4vg¤††¶o;ŽÃ}÷Uóä“íìß¿‰x‰¢@.—§jQ-­M,®«$›ÕnJ¯òyƒ²Ò­­Í44Ô�É+m÷z©ü– 54´}»àû KqöìFF¦I¥²H’ˆ¢(X–…ã8¤Ó§ßïdddšx<�(Ѝª‚itMÓ9ýþeFF¦™�M"~ÿ Ý4,NŸîdxxªX |®n;gÏ^ah0ÂÄÄ,~¿êVÁÎ�ëáÚµ ÆÇf±íB¥ìБ6$ÑsÒwC¸¹•hî`CTUaÅŠ%47×óNç°,Ç)DÖ>ŸBCc ­-Mœ¯sâćB!2‡ƒá ÛÛÖà8ðê«gÜȹ$¨òÜsûØ`3~UáÇ?~×=£vÕ§pìX;�?ñ••¥üàobs‘=H’È‘Gwðå/ ¡±†øû×ÑuÃ52€ Ф¯òѾáåÑŸÂmÏöA ‰ÑÙ9D,–æêµñ›ŒDñ#NWצeÑß?ZŒ¾oèñXšîža•¾þQ²Ùü<=•ÊÒÛ;™3�ôôŽ�Ngoú~Èfóôõ�ræt'=Ý#$iæ\Ìͽƒx&Ÿwëv‡òò¥ Œ£(2�€Ša˜H’H&£ ¨¯¯¤¯o Y äó:Š"“Nçðû}46ÖÒÛ;‚(Š„B4MGUÒé’$±re=½½#8”–– i:~¿B*•CV¯¾�þþ1,Ë& �ÏÒ«t:‡m;¬Y³”ÁÁ òyGð*cŸ7½jh¨å¹çöñðÃ[ˆÇÓŒ�GÑ4˲ÉçMêëñÔÓ{8zt™ŒÆØØ ¹\ÛvÈç ª«Ã<ñD;ÇžlÇÐMÆÆfÈËžšfP^âèc;xöÙ}Œ�N»ÆËç B¡‡mãË/<Œª*Œ�N“(6(æó:~¿�}û7òâW. 266M&—§ÜÔX›Ž ÚضwÝá*nݱxŠÅ‹ÑÐXK.§»éÕ\p�§©®.§qY†iºéÕœžHd(¯±¬±Àíùš+›¦RYB¡��µø¹Ø:$Ì«„©ªÂ²eµƒ~R©¢xCÏå Ï76ÖÒÝu�d2 Žƒ¿¶šÆOàó¢î»ânÝ>ŸÂÚµ 8ÀäÄ,““QEÆçSÈd4EfýúFfg“ŒŒL!I�€�tºPÞ\·¾QH¦² L&ü¤Ó…myÍÚdYBËéÅ.R�P¨ ¬Zuªß‡iXôô ã8¡PÀÝššS `Û]]×1M‹­[Wñù-T¯•许³£ë}tÕ=ž …JX·¾‘Íõ¼õÖ¢Ñ|­¸Â þyÅŠ%lÜØÌ›ožgf&AçåAw*Ë–Õ²sç:Nœø�H$Fw×uWWU…%KªxhïFÞ9ùãã3ôõ�ººÏ'S[[É�‡·pæt'ÃÃ&\Ý=+¯•è30¯g¬P庑>=ÿü~^üÊ!6mZáNp!½q()Qyú™=ñ ;w­Ÿ÷÷ª*óøpüŃìÝ· QnÒ$IâÈ‘6Ž?È#‡·#I…ÏEQ,RdÿþM?þ0�?¾Ûmþ›Ó=~5î˜^MOÇùå¹®_�píÚ¸ÛH0§G£).\è':›¢¿oÔÍ�çôD"Ã¥�¯aè&=ÝÃärzј…ô(“ÉÑyeÕïãÊ•!2m^ŽœËåéîæg¯ý‚+W†Ší¾ÂmÇ*H^¿Ø§1/½ªª SU¦§gY–ÜîY–Ð4ƒp¸„¥KkèìB’TÕ‡®(ŠŒ¦é””¨¬X±„Ë—¿ßW<�RÈåt|>™µëé¼<ˆmÛøýª{z¥iyDQäþ ËéºrÃ0 nÖu6´,§¿o”\NÇvÖÕ•òûWà“Ä_gþßã¾’³lYÏ=¿�¥KkøÑ�ÞâÝn¤kšõKªxúé‡X¿¾‘—^z‡÷N]r[xM3Ouu9Çžl§­m-?ùÉ{¼ýÖWÏfó”—‡øâw³wß&~öZo¼qŽL&WÔ5B¡GŽ´qäѼýÖ‡¼úZ‰xÚÕ•oáØ±v:Î^áå—ßgj&IfxŒžï½éåÑŸ‚›^MOÇ))ñ‰Î¦æ5ÿ ‚ÀìLUU‡C$·YNŸ;o‡ƒd3Z±›ä†žHd°‹¾?¯®‘çôt:‡n˜„ÃAlÛ!™ÈÌÓsÙ<ÙŒF8D·A@E/»+7¥W2Ë—/Ʋlâñ4ÓÓñy>Q–%šš»ïYMLÌÎÓEQ ¹¹¾P`Ñ FG¦oñ©ÍÍõž2›¡¡Ÿt¹Ë–Õ¹?Ž�y/ùv�¥KkðùdDIäÚÕq,¯2övíü=w-ÌÎn|’_Wwl§ð*œÀm+÷µ @o§¢· �Æ|‚§£]Èx†¾Âÿù�ßÚMÏA lë¬1bÞûÑŸ‚àxÿ:`Aàå$ ÏÐ ÏÐ ùÒç^�Áãs@x¥a£Œ-dAöÎqž�^ È‚èÙz! Œ½~ÂóÑ ¯2¶@ðöí‚gè‚lëú½ƒÇç€Ðqüw=½�§N�½×cðø�½VÙ…�ì½å°0�åPè^�Áãs@ˆ^¼ì-é€W[ x“‚gè‚¬ÏÆîõ<>„w>íù耜ì»z¯Çàñ9àu˜,<+/CSY> `‰óìDî¼hò�ÊÞ¡ø™Y{¡ö˜Â¢‘æ’;B1Oì*ƒ)2¿ Tža ù’úG8£BÉŽÉ j§Ÿ)gÚ>ï–×*2eÇWÉ—�§iÓžùIñ�gédˆx\ Ú1öÖFü ¾ò-�ôÈ(À†i9†WÔ£C׊æçÐH¬–òe²cãÚ§~ƒ÷å�N'SÁ¡Cb �X èG­v¸í¨î¶�ó aÝÏ‘å„àS»5.{Ö'ãÉ ¶/�[/•X,×ïÀæ@®¬Ut Œ=2Ó¨ÑÝòr�¦Ë•U'VA#¿vB4ô†à˜¦û" ަb¶Ú}CžÄkºõ!�4š[ä̦Y¼#*¨ƒL"æ‹…­ìdG'šà"㦪²±“Aœƒ}„ SŽ@ÝÇá©"-ɬ<·8Ú‚æP¶HrƒŸ$8ì7étF2ˆQà›8XKŽšÅ1t6ˆöq��¶ uàî½ÕÚ^~®DÄ“0ÍŒÔÅ;pX:�5o× e¡gœe^ð�‹±Ô͈îˈåJÁø,&ú"ÃeB¯­ƒéœ” šHllum²­Ío“ïM]é¶­)›®SÙæò2kè�Á3[*rfâË‹7Ï”.Þ¨Þ0m•›Ø¸8ÚÑÊÁ\Iî-¥$ÛèÆJ˦Úeý ©^5Ù%†GªßaU^Ñú.«²Á°#µ÷0Ék©½‡I¶yI_´ÌœAè¼F5BMí¬žÕ&$�êë=ÙÞ†÷vÞvÅ;=ð¡O¯H $R4(Kêï¶=’à¦ÙP‡ò¬ë}Òôäš”Pã¡ðbªØL”GCqÇ4›Îà¢&·ÞÊ›ê¢3ù/æ>;”,çþNºÙĘjú.�çcÑÍr9—c¤¯jí[Ò×Fž�˜w'Ì¢ú¿ }ó(!ÇHŸ9¢p7hV„#¨}Â×|Ë7„kïÆmX´{šÑH–&Öå¦�éóì—}¢-Ÿ²édû9{-ÊUÑyý_†Ö29¢†󃡽ÌO„ö]0ç mÓØN€è€¡GÄüdhï©ìGBû¦dNÚñú?Oh›gÈ :`hŸ˜ í•ýLhŸ—̉C;Zÿg mõ›ˆS :`h�˜Ÿ íµÊ~(´OKæÔ¡«ÿs…¶øËñ§ïÿK†Ê¯TíWM©ü…_þ·¿kËŒRorNTÏ¢wš ÚIDATxÚí[{pTÕÿ¾sÎݽÙìf“Ù �$¢D>ÊSD…X5bF´|CgZm­Zý£8-uœŽŽÓiUdÐQ‡Q°U©:  hUÏ„šðÈ Èc7Éݽ瞯Üì&hÔÞ»]�üþÚÝ{ó�ûÛsÎ÷�ß9aÒs0ˆ ƒý¿�îh 4ƒ €A�@º„H qKãVòk: Õ�ÿÉ I1ˆf–_öå�ã÷Cg&)„ß–þcˆ,~®:š�¡`;pµpêîSöS¡ìvMÈs5:Ýe`j*iDBæ�¶Dýög"´?p¦þ8oó¢;3½1 ˆÆ½/T^õ»Íå*qC/=3ÚÒÙKOAËSу€LMuûˆðÉŠ7�PuùÈÔ’o)¶â•»ÖVÎÔsM=×üëö«yõÎ^ulz—þTñ&)¦º3lz R¡ŽbÅáF]‹ä¶Þ3£ê�½“êÎä¦VÛB¦ˆPã–)Åô«#9S¹™�` �[¦Å{èù ^!‹†œ¹wfÕkŸN>Ñ–Ý÷kÎC¦Üž“܉=B®_ôÒ•£ëâ1þίŸýüXÁ‚¡}Õ45_îÙƒ ùK7,äL-¿v›žÝf˜ Ù7x…ܸxÝEõñ8ßúà3ŸÕÚt@—Z*æ †¤ ½±º5«F•œ=q4§`åŠy™n¨ÄãÙ÷€'טëw‰ëFýš•ËÛê�æ®Z1O_º‹�w;@"Žº² V>_A„“ 뀩¾×!Ó d ™ê«N�®,¬³ˆ=üÂmpŨú~t÷àÖC$ >E ¡®™sŸY~`ß„·¿œ8ÄßyîÐHŠrÞiÅ+䜧ï?¸ü;_MÌöuõ¥# ¹”Ô\bˆDRSˆDÉ_L ¼FÌÐ5óÛ?RÀ«±î @JÒÑÎ÷Š¡�nhäðC·HŠË ëBÁv»Æ»äÑLæ1cR0ÍüNêôÒ53&óÄ“tÁÏi½¢èk’Âítˆã‘´ [U¶ufq-4ä[†Ž‰Kö R„ßã¯>—ŽÒС!ÿš‹�¬˜óOh�úOjŽÍAˆDÏ ¶ß;w«R¬lü¾P £hèéæH`Ãî©Î6:‰E×l϶ÿt¾KóO=ºx>¿ãªÓYÈ-§†›c=ˆ‘©æŽ¬¦Žàêò-Y>cö„à ¦ìùâø(PÌñE&"‘b{Ž]4ïòM[ôw¯˜óþ‘ÆÐéHÀ.>� ää#Á­—7ß²öã™� Àa醅ûªÇ‰ï8ã|«X„šfV,½ÿõ;€è°îã›¶ÎB:ûW8™æ@J‘]T7qäÉY�?tíØÃ÷N¯úôð%.%`Eº±pÚîßn¸½ªvôå[² ê;º|ή?œLóöº)7E 3-À[EÃOoͱ”;å(¡àV8«ãDcf= m�™é+PR#°»º÷€�®¨“„ŹfÚ�_¾:\Ir ¤bð«ÁïÒî¡v\ÇÃ9½Ô°‹”DÎJ�§• A„=E�£Ó±ÙÁNä!=š )7�ípº'îxt‡"$‹CÔÓÄ}·]þDdq·�šþÑ;²Lùäú±‡  )œŠî„@„! †žO쮟ì¹{Ú.Ð�QCO{43fxâ£óš!¹oúÎ;& ™�£ÃMçõü¿þ×,fÛÆ iuùÛË®Ùæ&ĤxnǬ•oͳà ØŽÀ^Ê{„|êöMKfV ¦ &µ5ï•ýáÝ2G&#Ãov •€}6‰{ã7L9À}ê©¿ÏYõÊÏIHD"p9‹1²,öÞ'S²ƒWM®áúÍÆù~ëVôÆ ì@#�[&ÀÈœÖÏ« ¤â#sZÁ¶âÝ߯"BÁ•djL^ˇ»J‡dvçµ#áPtgÒ¼)…l«>5ü—¯üŒ_vÝG™9­�†žc´g}3äÌ{ûÇ?ÿáuš¯ë¾éU"1¥pdˆ9VI÷ºîHðMC>@$2tÔ R âNúùŽжëN@ˆ©UˆÐ™r6º“•´êSÔö7íÝ„mÚÛÑÉé ®¬³mÓÞÞzO�:DHR¸T»;/�mÚOºèßùÙmDÈÝœ§mÓ~ÄÈ´ÂxÄßcÚ�©�ÆpÒ´wIÓ~ö%?(Óþ7ý‘挫gµ—†O´æ¬«šîŽD°äÚ�†ÛËÆï/Íox|É‹Šðo;f¥»i¤)ôÐ ø3Œ—ÖÜ8a_Um±{¦}UmñÍ—}5uì± ¿ûÁë?8ÔN{Ó^È×ß½qý®©�À`ùkw:|±æšià`é¯Ïï1íwºbÚ;)"HSË)úº4¿qò£�<üjÅÝÓvù'‚e›öSw?¸þöi�­œ0òdVA½tú`•ó¦}Ž?ªÛÏæÒÈpcCG–«¦}(«ãdc³sÏüðL{ „ó©÷pÙ´wzo™BnIÅ,ÅPKliØ»éHËfovµrÞS¾ps„)7&={±¾·®0.E/�§èŒ¢ë=8#2ô²Ë¿ÜjÄ=O? eE~]È<&®¸áý·õ—1yÍcòšW–m5LíÃC¥¶:Œú-“>¯¬)Yüì2òšYºqôø(ž’”¢W@ãÊìô�n€á¾n™(Žz¶=¢þÇîxã÷ ·Áª—n[³©Ѿ;"‚)Ù•z ]ËìL�ÛÝ75aÀ”œûº,Ÿ¯[Z¼w{@pK2U’×T¹·„35&Ôd»î²� ÒâÜ×m)Æ}]NùÍé% Ù%µ¥X¿Ç“¦–™ÝöqMÉÝk—ÒÒ«wdd·uÇ=߸íÂtw[�&ïÍÛ®;xc1/êFj^æéòÆ¡íºÛ•4Ku ¥Cl ¨sêït@ºô ´Å @`P 0(Ð,�&ÄtİeY|qeXIfII* ° ’˜ (1$¨2Ìi‡àKKAdobe Photoshop CC 2014 (Macintosh)2015:07:06 09:17:09�0221 ÿÿ ;  (š¯Lö%tEXtdate:create2018-11-27T18:19:30+00:00,bk‘%tEXtdate:modify2018-04-27T12:05:44+00:00µ³tEXtexif:BitsPerSample8, 8, 8í>'tEXtexif:ColorSpace655353{n!tEXtexif:DateTime2015:07:06 09:17:09ˆV¾ëtEXtexif:ExifOffset224ªQPItEXtexif:ExifVersion48, 50, 50, 49cÔ øtEXtexif:ImageLength800rHŠtEXtexif:ImageWidth1200’ådtEXtexif:PixelXDimension2363>tEXtexif:PixelYDimension1576ÞŒÚutEXtexif:SamplesPerPixel3§¥1tEXtexif:SoftwareAdobe Photoshop CC 2014 (Macintosh)�x\IEND®B`‚qalculate-qt-5.11.0/data/io.github.Qalculate.qalculate-qt.desktop000066400000000000000000000037431520501070600247000ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=Qalculate! (Qt) GenericName=Calculator GenericName[ca]=Calculadora GenericName[de]=Taschenrechner GenericName[es]=Calculadora GenericName[fr]=Calculatrice GenericName[pt_BR]=Calculadora GenericName[pt_PT]=Calculadora GenericName[ru]=КалькулÑ�тор GenericName[sl]=RaÄ�unalo GenericName[sv]=Kalkylator GenericName[zh_CN]=计算器 GenericName[zh_TW]=計算機 Comment=Powerful and easy to use calculator Comment[ca]=Calculadora poderosa i fàcil a usar Comment[de]=Leistungsstarker und einfach zu bedienender Taschenrechner Comment[es]=Calculadora poderosa y fácil de usar Comment[fr]=Une calculatrice puissante et facile d'utilisation Comment[nl]=Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Comment[pt_BR]=Calculadora potente e fácil de usar Comment[pt_PT]=Calculadora poderosa e fácil de usar Comment[ru]=Мощный и проÑ�той в иÑ�пользовании калькулÑ�тор Comment[sl]=Zmogljivo raÄ�unalo, preprosto za uporabo Comment[sv]=Kraftfull och användarvänlig miniräknare Comment[zh_CN]=强大而易用的计算器 Comment[zh_TW]=強大且易用的計算機 TryExec=qalculate-qt Exec=qalculate-qt Icon=qalculate-qt Terminal=false Type=Application StartupNotify=true StartupWMClass=qalculate-qt Categories=Qt;Utility;Calculator;Education;Science;Math; Keywords=calculation;arithmetic;scientific;financial; Keywords[ca]=calculation;arithmetic;scientific;financial; Keywords[de]=Berechnung;Arithmetik;Wissenschaft;Finanzen; Keywords[es]=calculadora;aritmética;científica;financiera; Keywords[fr]=calcul;arithmétique;scientifique;financier; Keywords[pt_BR]=calculadora;aritmética;científica;financeira; Keywords[pt_PT]=calculadora;aritmética;científica;financeira; Keywords[ru]=раÑ�чёт;раÑ�чет;арифметика;научный;финанÑ�овый Keywords[sl]=izraÄ�un;aritmetika;znanstveno;finanÄ�no;raÄ�unalo;kalkulator; Keywords[zh_CN]=计算;算术;ç§‘å­¦;金èž�; Keywords[zh_TW]=計算;ç®—è¡“;ç§‘å­¸;金èž�; qalculate-qt-5.11.0/data/io.github.Qalculate.qalculate-qt.metainfo.xml000066400000000000000000001751201520501070600256270ustar00rootroot00000000000000 io.github.Qalculate.qalculate-qt CC0-1.0 GPL-2.0+ Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (GTK UI) Qalculate! (ИнтерфейÑ� Qt) Qalculate! (vmesnik Qt) Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! (GTK UI) Powerful and easy to use calculator Calculadora poderosa i fàcil a usar Leistungsstarker und einfach zu bedienender Taschenrechner Calculadora poderosa y fácil de usar Une calculatrice puissante et facile d'utilisation Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Calculadora potente e fácil de usar Calculadora potente e fácil de usar Мощный и проÑ�той в иÑ�пользовании калькулÑ�тор Zmogljivo raÄ�unalo, preprosto za uporabo Kraftfull och användarvänlig miniräknare 强大而易用的计算器 強大且易用的計算機

Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation).

El Qalculate! és una calculadora d'escriptori per a diverses plataformes i finalitats. És senzill a usar però proporciona poder i versatilitat que normalment es reserva als paquets de matemàtica complicats, així com eines útils per a necessitats diàries (com la conversió de monedes i calculació de percentatge).

Qalculate! ist ein vielseitig einsetzbarer, plattformübergreifender Desktop-Rechner. Er ist einfach zu bedienen, bietet aber Leistung und Vielseitigkeit die normalerweise nur für komplizierte mathematische Pakete vorbehalten sind, sowie nützliche ls auch für den täglichen Bedarf (wie Währungsumrechnung und Prozentrechnung).

Qalculate! es una calculadora para escritorio multiplataforma y multiuso. Es simple de usar pero dispone de poder y versatilidad normalmente reservada para paquetes de matemática complicados, así como herramientas útiles para necesidades diarias (como conversión de monedas y cálculo de porcentajes).

Qalculate! est une calculatrice de bureau polyvalente et multi-plateforme. Elle est simple d'utilisation mais offre une puissance et une polyvalence normalement réservées aux logiciels de mathématique complexe, ainsi que d'outils utiles au quotidien (tels que la conversion de devises et le calcul de pourcentages).

Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de porcentagem).

Qalculate! é uma calculadora multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de percentagem).

Qalculate! - �то универ�альный кро��платформенный на�тольный калькул�тор. Он про�т в и�пользовании, но обе�печивает мощно�ть и универ�ально�ть, обычно при�ущие �ложным математиче�ким программам, а также полезные ин�трументы дл� пов�едневных нужд (таких как конвертаци� валют и ра�чёт процентов).

Qalculate! je ve�namensko namizno ra�unalo, ki deluje na ve� platformah. Je preprosto za uporabo, prinaša pa tako napredna orodja, ponavadi zna�ilna le za kompleksno matemati�no programje, kot tudi uporabna orodja za vsakodnevne potrebe (npr. pretvorbe valut ali izra�un odstotkov).

Qalculate!是一款多功能的跨平�桌�计算器。它简�易用,但�具有通常��的数学软件包所需的强大功能和多样性,以�满足日常所需的实用工具(如货��算和百分比计算)。

Qalculate!是一款多功能的跨平�桌�計算器。它使用簡單然而�供了通常為複雜的數學套件�留的能力和多功能性,以�滿足日常需求的實用工具(例如貨幣轉�和百分比計算)。

Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface.

Les característiques inclouen una biblioteca amplia de funcions personalitzables, calculació i conversió d'unitat, constants físics, càlculs simbòlics (incloent integrals i equacions), precisió arbitrària, propagació d'incertesa, aritmètica d'interval, dibuix i una interfície fàcil d'emprar.

Zu den Leistungsmerkmalen gehören eine große Bibliothek anpassbarer Funktionen, Einheiten-berechnungen und -umrechnungen, physikalische Konstanten, symbolische Berechnungen (einschließlich Integrale und Gleichungen), beliebige Genauigkeit, Unsicherheits-fortpflanzung, Intervallarithmetik, Plotten und eine benutzerfreundliche Oberfläche.

Las características incluyen una gran librería de funciones personalizables, cálculo y conversión de unidades, constantes físicas, cálculos simbólicos (incluyendo integrales y ecuaciones), precisión arbitraria, propagación de incertidumbre, aritmética de intervalos, graficado, y una interfaz amigable.

Les fonctionnalités incluent une grande bibliothèque de fonctions personnalisables, d'unités de calculs et de conversion, de constantes physiques, de calculs symboliques (y compris les intégrales et équations), de précision arbitraire, de propagation des incertitudes, d'arithmétique d'intervalle, de traçage et une interface facile d'utilisation.

Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável.

Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, parcela e uma interface amigável.

Возможно�ти включают большую библиотеку на�траиваемых функций, ра�чёт и преобразование единиц измерени�, физиче�кие кон�танты, �имвольные вычи�лени�, включа� интегралы и уравнени�, произвольную точно�ть, ра�про�транение неопределенно�ти, интервальную арифметику, по�троение графиков и удобный интерфей�.

Program vsebuje obsežno knjižnjico prilagodljivih funkcij, enot, izra�unov in pretvorb, fizikalnih konstant, simbolnih izra�unov (tudi integrale in ena�be), poljubno natan�nost, statisti�no negotovost, intervalno aritmetiko, grafe in uporabniku prijazen vmesnik.

功能包括大��定制函数库���计算与�算�物�常数�符�计算(包括积分和方程)�高精度计算�误差传递�区间�算�绘图和用户�好的界�。

功能包括�大的�自訂函�庫�單�計算和轉��物�常數�符號計算(包括�分和方程�)�任�精確度�誤差傳播��間算術�繪圖和用戶�好的介�。

https://raw.githubusercontent.com/Qalculate/qalculate-qt/master/data/io.github.Qalculate.qalculate-qt.png The main window with keypad visible https://qalculate.github.io https://github.com/Qalculate/qalculate-qt/issues https://qalculate.github.io/manual/index.html https://www.paypal.me/HannaKnutsson https://github.com/Qalculate/libqalculate/blob/master/README.translate https://github.com/Qalculate/qalculate-qt Hanna Knutsson HiDpiIcon ModernToolkit UserDocs io.github.Qalculate.qalculate-qt.desktop qalculate-qt qalculate-qt

Changes:

  • Add set functions (union, intersect, setdiff, setxor, isMember, isSubset) and operators (∪, ∩, ∖, ⊖, ∈, ⊆, etc.)
  • Add characters(), count(), digitSum(), and digitalRoot(), find(), popCount(), string(), and while() functions
  • Support negative row and column values in element(), row(), and column() functions
  • Support matrix[row][column] syntax
  • Support text objects in sort() function
  • Add third optional argument to interval() function to allow exclusion of exact endpoints
  • Ignore "to" and "where" (and equivalent symbols) inside quotation marks
  • Ignore dot in front of plus or minus (for consistent behavior in line with entrywise operators)
  • Show "Division by zero" warning for all divisions by zero
  • Make display of expressions with time units in time format more consistent
  • Toggle state of checkboxes in lists (e.g. precalculate checkbox, and in names edit dialog) when clicking anywhere in the column
  • Fix parse status and calculate-as-you-type when "where" expression defines a new symbol
  • Fix support for vector in argument of many functions (erf, mod, exp, etc.)
  • Fix explicit conversion to mixed units for year variants
  • Fix first digit missing in return value of integerDigits() in some cases
  • Fix segfault when Calculator object is destroyed with uninitialized random state
  • Fix infinite loop when referencing subfunction in another subfunction
  • Fix segfault in replace() with variable specified using where expression, e.g. "replace(v, x, 1) where v = x"
  • Fix segfault when data set function name is followed immediately by a single dot
  • Fix v[i]=a syntax for vector element assignment
  • Georgian translation
  • Minor bug fixes and feature enhancements

Changes:

  • Improve factorization and simplification (particularly with radicals, logarithms, and absolute value)
  • Add ton of refrigeration, slug, mol/dm³, mol/L, and molar units
  • Add pcm, ppm, ppb, ppt, and ppq (parts per …), and lakh and crore variables
  • Add XAG, XAU, XPD, and XPT currencies (precious metals)
  • Use a maximum 4 decimals and minimum of 2 decimals by default for display of value of converted currencies
  • Improve handling of "to mixed" after previous conversion statement (e.g. "1 m to in to mixed")
  • Improve interval calculation, with interval arithmetic, with division by zero and/or both real and complex numbers in derivative of expression
  • Treat 0^0 as undefined (instead of equal to 1), and fix limit for 0^0
  • Set initial random seed using /dev/random
  • Do not show warning about denominators assumed non-zero when converting to expression with non-unit objects
  • Do not show negative exponents (if "negexp" is deactivated) when expressions contains unknown variables, even if all units have negative exponents
  • Do not show possibly real expression in complex exponential form
  • Initial support for comparison of vectors and matrices
  • Allow use of apostrophe as thousands separator in input, when specified as such by locale
  • Fix segfault with recursive variable in "where" expression
  • Fix segfault in some cases when argument in det() contains only a single element
  • Fix wrong simplification of "sin(2-cosh(x)^2/x+x)"
  • Fix negative exponents always used for units with rounding set to (halfway) down or up
  • Fix adaptive interval display for calculate-as-you-type result
  • Fixes and improvements for number bases view
  • Minor bug fixes and feature enhancements

Changes:

  • Place expression field below history by default
  • Avoid display of completion list for non-decimal numbers, text arguments, and x, y, z
  • Optional custom button column in keypad (four buttons shown regardless keypad types)
  • Calculate-as-you-type improvements and fixes
  • Improve automatic digit groups, in input, for non-decimal numbers and group sizes other than 3
  • Add --update-exchange-rates command line option
  • Fix tooltips for warning and flag in result when expression is placed below history
  • Hide keep above option, in preferences, on Wayland
  • Improve speed of sort(), rank(), and mode() functions (and other dependent functions)
  • Parse ± before implicit multiplication when not preceded by number (e.g. "7 km ± 5m")
  • Always consider x^(a + b) equivalent to x^a × x^b (fixes "x^(y + z) − x^y × x^z")
  • Simplify (x = a || x ≥ a + 1) and (x ≤ a || x ≥ a + 1), and similar, when x and a are integers (fixes "abs(x − 1) = abs(1 − x)")
  • Do not remove duplicate whitespace characters from text strings (in quotation marks)
  • Fix floating point conversion when comma is used as decimal separator
  • Fix (almost) endless loop with increasingly complex equations in some cases when x + x^(1/a) is transformed to x = (b − x)^a)
  • Fix and improve function() function
  • Minor bug fixes and feature enhancements

Changes:

  • Customizable digit group size and separator
  • Option to enable/disable check for new versions
  • Optional compact variant of parsed expression in history
  • Highlight unmatched parenthesis (with red color)
  • New default adaptive calculate-as-you-type delay (without delay in most cases)
  • Improve decision to not do calculate-as-you-type or not show result of it
  • "Approximation" caption changed to "Approximation and Fractions"
  • New functions: reshape(), circshift(), replacePart()
  • Functions mergevectors() and area() renamed to slice() and part()
  • v[i, ...]=... syntax for assignment of part of matrix/vector variable
  • Improve language handling for functions, units, and variables
  • Limit the range of supported arguments in bessely, besselj, binomial, and igamma functions (to avoid segfault and very slow unabortable calculations)
  • Do not try to calculate exact result with automatic approximation for expressions with iterative functions
  • Fix handling of single quotation marks
  • Minor bug fixes and feature enhancements

Changes:

  • Fixes and improvements for expression field below history
  • Option to show expression status in status bar
  • Option to change the default currency
  • Customizable status bar font
  • Colorize icons if the button text color differs visibly from the default icon color
  • Improve interpretation of function expressions with x, y, or z in object names (e.g. "x year"), or within quotation marks
  • Ellipsize long titles in completion list
  • Minor bug fixes and feature enhancements

Changes:

  • Automatically recalculate expression with current time every second
  • Replace edit-clear icon on keypad button with "C"
  • Support non-existing X-variables in plot dialog
  • Improve automatic digit grouping
  • Add option to place percent/remainder button in number pad
  • Add asterisk and middle dot as multiplication sign alternatives in preferences
  • Add output in scientific (sci), engineering (eng), ans simple notation as "to"-operator options
  • Add option to place expression field below history
  • Add option to show a status bar (with angle unit and other input settings information)
  • Improve completion
  • Show warning about default assumptions the first time an equation is solved
  • Show warning symbol when calculate as you type expression results in a question
  • Show warning and ask for confirmation when deactivating interval arithmetic
  • Fix floating point value in floating point conversion dialog for extended and microchip formats
  • Fix updating of fields in plot dialog when expression list selection changes
  • Fix other angle units menu
  • Fixes for comments and removal of single result
  • Fix initial state of "Use E-notation instead of 10^n" in preferences
  • Improve support (and fix segfault) for exponential notation in hexadecimal numbers
  • Add TeX point, TeX scaled point, twip, agate, darcy, kayser, lambert, foot-lambert, and cc units
  • Add compton wavelength constants for muon, neutron, proton, and tau
  • Update calculation of fraction of year (with day counting basis 0 and 1) to match method used in spreadsheets other than Gnumeric
  • Change default quantile algorithm from 8 to 7
  • Improve accuracy for intervals in solutions to equations when using interval arithmetic
  • Fix poolvar(), ttest(), cor(), dollarde() and dollarfr() functions
  • Fix inequality with 1/f(x) on one side, e.g. "1/(x-2) ≤ 2"
  • Fix segfault with extremely small numbers and high number of bits in floating point conversion
  • Fix crashes and freezes in some corner cases
  • Fix value of Planck unit (was rounded to 7 decimals)
  • Many minor bug fixes and feature enhancements

Changes:

  • Ask for interpretation of comma (when comma is not the default decimal separator)
  • Add option to place percent/remainder button in number pad
  • Do not add conversion to expression when using convert button on calculate-as-you-type result
  • Input of only conversion operator (arrow) using middle-click on convert button, or new "Custom" menu option
  • Use icon for "AC" button, and no icon for "DEL" button
  • Automatically set "Use comma as decimal separator" and "Ignore comma/dots in numbers" when local digit grouping is selected
  • Improvements for insert function dialog in RPN mode
  • Fix segfault when closing application with preferences open
  • Fix segfault when removing row or column with defined custom button
  • Fix automatic digit grouping in decimals
  • Support input of base in log() function before parenthesis, e.g. "log20(400)" (equivalent to "log(400, 20)")
  • support input of exponent before argument of trigonometric function (e.g. "sin²(x)")
  • Support input of functions with more than one argument using RPN syntax
  • Add new binary prefixes (robi, quebi), and enable use of recently added SI prefixes in output by default
  • Micron unit
  • Support "to 1/n" as alternative to "to fraction"
  • Data set translation fixes
  • Return exact integers in more case in log() function
  • Fix segfault with text argument containing potential text returning function, or variable containing text value
  • Fix segfault during calculation of (in)equality with root() function with insufficient number of arguments
  • Fix segfault during output of both approximate and exact logical OR value without (in)equality
  • Fix qError() function
  • Minor bug fixes and feature enhancements

Changes:

  • Add support for display of repeating decimals using overline (vinculum) instead of ellipsis
  • Support all real numbers in binomial(), comb(), and perm() functions
  • Add boolean argument for reversed conversion (to text string) in bin(), oct(), dec(), hex(), and base()
  • Add support for units in limit()
  • Improve simplification and speed in diff() function for high orders
  • Do not allow conversion using "to" in function expression (in edit function dialog)
  • Show a warning when it appears as if the user tries to convert part of an expression
  • Add "-" after unit prefix symbol (k and M excluded), in completion list, to indicate that it must be followed by a unit
  • Improve handling of functions returning text string or value with angle unit, in angle and text arguments
  • Improve handling of random numbers in iterative functions and in function arguments of custom functions
  • Disable calculate as you type for expression containing export, load, or command function
  • Use LANGUAGE environment variable, instead of LANG, on Windows in order to avoid changing regional format settings
  • Improvements/fixes for currencies and exchange rates
  • Fix calculate-as-you-type not responding to unit modifier changes
  • Fix expression status for multiple "to" expressions without preceding expression (not supported)
  • Fix integral with infinite limit with unit
  • Fix non-localized data set key properties (when translated version is available)
  • Fix angle conversion for (in)equalities (both sides where converted)
  • Fix default separator in load() and export() functions
  • Fix µ_B name/symbol for Bohr magneton
  • Fix incorrect limit for expression containing tan(x) when value to approach is pi/2 without direction
  • Traditional Chinese translation
  • Minor bug fixes and feature enhancements

Changes:

  • Option to automatically calculate the current selection, in tooltip
  • Option to calculate the current selection, once in history
  • Toggle fraction format action for custom keyboard shortcuts and keypad buttons
  • Fix copy unformatted ASCII without units when unit is placed before quantity
  • Fix solve() function with replace() function as first argument (fixes solve2() function)
  • Fix "where" operator using (in)equality in variable
  • Return x=a*e^(i*r) (with r instead of n) for abs(x)=x
  • Minor bug fixes and feature enhancements

Changes:

  • Place approximate value before exact in calculate as you type result
  • Set ans variable to solution(s) of equation (as if solve() function were used)
  • Option to disable cursor blinking
  • a(i) and a[i] syntax (the latter with support for functions) for element in vector
  • New function: factor()
  • Use hours or minutes as default unit for conversion to time unit of expression with time format but no units (e.g. "0:00:12 to s")
  • Always use four digits for year in date (e.g. "0064-07-18" instead of "64-07-18"), and support input of date using DD-MM-YYYY format
  • Fix display of units automatically appended to expression in parse status
  • Fix reading of expressions from file
  • Fix solving of x^4-4x^3+10x^2-12x+1=0, and similar, in exact mode
  • Fix dual/auto approximation when unable to find exact solution to equation
  • Fix rounding in 1/# conversion to integer (e.g. "1/2 to 0.99")
  • Fix unability to find approximate solutions to some high degree equations (e.g. "xâ�´ − 4x³ + 10x² − 12x = −1")
  • Fix automatic variable detection in select()
  • Minor bug fixes and feature enhancements

Changes:

  • Apply dual approximation/fraction to calculate as you type result, as regular result but with length restriction
  • Add option to add/edit comment to history context menu, and save comments in result on exit
  • Add "Search by Date" (also shows the date of the expression) to history context menu
  • Improve decision to automatically convert unchanged quantity with unit
  • Option to automatically group digits in input
  • Option, in menu, to open settings folder(s)
  • New functions: tripleProduct(), multilimit()
  • Updated French translation
  • Fix equals sign for calculate as you type result
  • Fix segfault with calculate as you type of "-(300K" and similar
  • Fix saving of two's complement input settings
  • Fix erroneous HTML output after format of result with error/warning has been updated
  • Fix case conversion of µ to M and similar
  • Fix segfault with very large integer raised by very large integer
  • Minor bug fixes and feature enhancements

Changes:

  • Show language menu in preferences on all platforms
  • Change "Hide number pad" to "Always show number pad", and add separate number pad when the option is not enabled
  • Improve initial value and clear all other fields when edited field is empty, in number bases and floating point conversion dialogs
  • Allow unit expressions for insert unit action, for custom shortcuts and buttons
  • Set minimum characters to two for all completion with "Limited full completion"
  • Support x without backslash for custom function argument condition
  • Update parsed expression and calculate-as-you-type result if variable, function, or unit in expression has changed
  • Improve support for small displays with low resolution/high scaling
  • Update chain mode to match behaviour in Gtk UI
  • Update calendar and floating point conversion dialogs after expression calculation
  • Portuguese (pt_PT) translation
  • Fixes for overwrite input mode
  • Fix unresponsive expression field in some cases after smart parentheses has been applied
  • Fix completion with both custom app font and custom expression font set
  • Fix input of max value for number argument
  • Fix memory leaks
  • Fix segfault with recursive (self-referencing) function
  • Fix input of negative exponent in scientific e notation with RPN syntax
  • Fix parsing of 1°2'3" as 1°+2'+3"
  • Improve handling of "where" expressions with inequalities
  • Fix definite integral for 1/sqrt(1-x^2), with limits higher/lower than or equal to -1 and 1
  • Fix crash with empty vector in plot function, e.g. plot([])
  • Fix "did you mean..." warning for two implicitly multiplicated functions without space between (e.g. "atan2(a,b)atan2(c,d)")
  • Minor bug fixes and feature enhancements

Changes:

  • Option (enabled by default) to show expression status (parsed expression and calculated value) as you type in history list, instead of in tooltip
  • Option to hide toolbar
  • Option to preserve height of history list when keypad or number bases are shown/hidden
  • Option to change the max number of history lines saved
  • Option to show/hide hidden units (hidden by default) in units window
  • Headers for keyboard shortcuts and actions lists to allow custom sorting
  • Reduced minimum height (one line) of expression field
  • Physical constants updated with CODATA 2022 values
  • New function: allroots()
  • New units: therm, thermie, IUNS calorie, rpm
  • Additional names/symbols for turn unit
  • Use symbol "cal" for thermochemical (instead of international table) calorie
  • Change title and names/symbols of weak mixing angle (prepend "sin2" to theta variants)
  • Return exact negative integers in log10()
  • More conservative handling of infinity in equations
  • Remove n from equation solution if possible using assumptions of x
  • Fix subsequent tab completions after completion of unit with prefix
  • Fix unnecessary parenthesis, with wrong color for closing bracket, around unit with exponent
  • Fix convert button text, when toolbar style is not icon only
  • Fix history list not cleared before reload if there are exactly one item
  • Fix input of scientific E-notation using lowercase e in numbers using concise interval notation, in expressions
  • Fix "bit width" and "signed integer" arguments in setbits()
  • Fix a^(f(x))=a^(b*g(x)) where b=2 or b=3
  • Fix auto/dual approximation with "where" expression
  • Fix "where" expressions with multiple inequality statements for a single variable, e.g. "where x≥0 and x≤10"
  • Fix crash when a variable name/symbol with more than 20 characters is used in "where" expression
  • Minor bug fixes and feature enhancements

Changes:

  • Improved history list efficiency
  • Add two's complement input and binary bits to preferences
  • Ask for the desired interpretation the first time percent addition is used (e.g. 100 + 10% equals 110 or 100.1)
  • Hide expression tooltip (after 300 ms) when input resumes, if delayed expression status is enabled
  • Download button in dialog shown when new version is available, on Windows
  • Support for solving equations containing if() function
  • Support for solving root(a, x)=b (requires rational value for ln(a)/ln(b))
  • New functions: powertower() and multiples()
  • New units for solar radius, mass, and luminosity
  • Use parentheses for exponent using scientific notation (with power of 10)
  • Support integer factorization of integers in matrix/vector, and of numerator and denominator in rational number
  • Relaxed conditions for (x^a)^b = x^(a × b) and x^a × x^b = x^(a + b) when complex numbers are deactivated (fixes segfaults)
  • Fix AltGr for input of operators on Windows
  • Fix (ax + n)^2 > 1, where n is even and a is not 1, returning false
  • Fix setbits() function
  • Fix Number::equals(0, ..., true) when number is infinite (affects replace() function)
  • Minor bug fixes and feature enhancements

Changes:

  • Detection of potential spelling mistakes (a warning will be shown)
  • Add support for n...m, j:k, and j:i:k syntax, for sequence of numbers, e.g. 1...3 = (1:3) = (1:1:3) = [1 2 3] (note that brackets may be required for colon syntax to avoid conflict with time format)
  • Improved "where" operator, including improved output of parsed expression, support for previously undefined variable names, and assignments before expression (e.g. "a=2, b=2, a^b")
  • Click on binary digit in bases dock to flip bit
  • Improvements/fixes to conversion completion and menus
  • Add retry and cancel buttons to error dialog after failure to save preferences, definitions, or workspace
  • Add last result to stack when pressing Enter with empty expression (was unintentionally disabled)
  • More rounding methods
  • New units: LightSecond, LightMinute, and LightHour
  • New functions: bitget(), bitset(), setbits(), integerDigits(), digitGet(), digitSet(), flip(), colon(), and foreach()
  • Support for hexadecimal floating-point literals using 0x...p... notation (0x1.4p3 = 0x1.4 * 2^3 = 10)
  • Add support for "decimals" "to"-conversion (display as decimal fraction)
  • Allow plot grid values higher than 1 (true) to specify line width
  • Improve handling of zero solution and initial guess in newtonsolve() and secantsolve(), and check validity of solution
  • Change handling a vectors in multiple function arguments (of non-vector type) - return vector instead of matrix, require equal number of elements, and use the same vector index for all arguments for each function instance (e.g. atan2([1 2], [3 4]) = [atan2(1, 3) atan(2 4)]
  • Set handle vector property by default, for text, date, and boolean arguments, and for arguments, in global non-builtin functions, without specified type, and enable parsing of vectors for text arguments
  • Do not apply "read precision" setting to exponents for values with units
  • Change from line to point (or dot) plot style for data with many discontinuous points
  • lambertw(x*e^x, 0)=x if x>=-1
  • Use parentheses for number with scientific notation in more cases
  • Fix x and y reversed for paired matrix when using plot dialog
  • Fix saving of handle vector function argument property
  • Fix saving of multiple names after editing of existing unit
  • Fix saving of preferences when a workspace, other than the default, is currently open and the general preferences file does not exist
  • Fix dsolve(diff(y, x) = y), and similar
  • Fix log(1, 1) (undefined)
  • Fix "to"-conversion to prefix and add "prefix" conversion option (for optimal prefix)
  • Fix segfault in newtonsolve() and secantsolve() when equation does not contain variable
  • Fix conversion to angle unit for complex angle, cis and polar forms
  • Exchange rates fixes
  • Minor bug fixes and feature enhancements

Changes:

  • Support for specifying a fixed denominator for display of fractions (e.g. "0.3 ft âžž 1/8 ≈ (3 + 5/8) in")
  • Restore decimal number base after closing programming keypad
  • Improve appearance of conversion menu
  • Save position of main window even if size has not changed from the default
  • Always add result to history (even if identical to previous) if expression contains a function generating a random number
  • Prefer capitalized function name (over name with underscore), when completing function name
  • Return gcd of numerators divided by lcm of denominators in gcd() with non-integer rational numbers, and vice versa for lcm()
  • Add units for mean Gregorian and tropical years
  • Ignore underscore in number
  • Replace defunct exchange rates source and fix bitcoin exchange rate
  • Fix custom middle click button action
  • Fix immediate calculation after selecting to-conversion completion
  • Fix asin(x)=a, acos(x)=a, and atan(x)=a, when a contains an angle unit and default angle unit is set
  • Fix output of value converted to unit expression with numerical multiplier in denominator, e.g. "âžž L/(100 km)"
  • Fix segfault when trying to solve "(x*sqrt(x)-y*sqrt(y))/(sqrt(x)-sqrt(y))=x+sqrt(x*y)+y"
  • Fix parsing of case insensitive object name ending with Unicode character when followed by another Unicode character in expression, e.g. "микрометр"

Changes:

  • Fix besselj() and bessely()
  • Fix display of matrices and vectors with complex number form other than rectangular (default)
  • Fix conflict between decibel units (e.g. "0dB") and duodecimal 0d… syntax (now requires at least two digits)
  • Fixes for title options in plot() function
  • Add additional buttons and button menus to general keypad
  • Add option to show all functions, units, and variables in tool button menus
  • Add recently used objects to functions, units, and variables menus
  • Add option to bypass dialog for functions in menu
  • Add option, in context menu, to display text for tool buttons
  • Open functions, units, and variables tool button menus using long-press or right-click (in addition to arrow button), and add keyboard shortcuts
  • Use keypad tool button menu as context menu and show keypad type in title bar of keypad

Changes:

  • Add option to disable tooltips in keypad or everywhere
  • Add option to disable units and to interpret unrecognized symbols as variables (unknowns) to preferences
  • Make closing of application with Escape key optional and disabled by default
  • Hide name column in conversion list when applied to current result
  • Add temporary option to unknown variable edit dialog
  • Add Microship (PIC16/17) 24 and 32 bit floating point formats
  • Add support for specifying position of sign bit in floating point functions
  • Concise (e.g. "1.2345(67)") and relative (e.g. "5+/-2%") notation for output and input (disabled by default for concise notation) of interval
  • Round high precision intervals enclosing integers for integer arguments
  • Optimize rest of unit expression when converting to partial (insufficient) expression (e.g. 18MA×100ns to J = 1.8 J/V)
  • New derived units: Debye, C·m, Daraf, F^-1, V/C, N/C, kcal, kcal/g, kJ
  • Use international foot as base unit for rod
  • Fix fibonacci() for non-integers and recursive use
  • Fix conversion options presented for speed units (and possibly other)
  • Minor bug fixes and feature enhancements

Changes:

  • Allow multiple actions for keyboard shortcuts
  • Add toggle precision, and min, max, or min and max decimals to available shortcut and button actions
  • Add option to exclude units for unformatted ASCII copy
  • Fix copy unformatted ASCII when local digit group separator is same as selected decimal separator
  • Add option to automatically copy result
  • Add optional value to copy result action, allowing expression copy and formatting selection
  • Always set (primary) selection clipboard contents when whole expression is selected or selection is cleared, e.g. after calculation
  • Support for custom default angle unit, e.g. turn, arcsec, arcmin
  • Append default angle unit (instead of always radians) when converting value without unit to angle unit
  • More consistent addition and removal of angle unit from function arguments
  • Always interpret ./, .*, and .^ as entrywise operators if user intention is unclear
  • Change order of operations to place entrywise and ordinary operators on the same precedence level
  • Add function, kron(), for Kronecker product, and constants for Pauli matrices
  • Add radius to planets dataset and update other properties
  • Support replacement of unknown variables within variable values
  • Fix besselj(0, 0)
  • Fix incomplete calculation in tan() with try exact approximation
  • Fix 0/0=0 equality (do not return true) and output of 2/0 (and similar)
  • Fixes and improvements for newtonsolve() and secantsolve()
  • Fix segfault when MathStructure is deleted after Calculator, and in destructor of calculated DynamicVariable (called from Calculator destructor)
  • Minor bug fixes and feature enhancements

Changes:

  • Improve abortion of slow calculations
  • Fix segfault and inconsistent behaviour in calculation of a^n mod b when n is negative
  • Add modular exponentiation function, powmod(), with support for calculation of modular inverse
  • Do not make any difference between row and column vectors in magnitude(), norm(), and dot() functions
  • Fix division and exponentiation of scalar by matrix/vector, e.g. 4./[8 4.5]
  • Improve parsing of element-wise operators with comma as decimal separator
  • Fix rref() with different units for different elements
  • Fix segfault with empty vector in uncertainty calculation
  • Fix segfault trying to solve cbrt(x)^(1/3)-x=0
  • Fix segfault in handling of vector variable with uncertainty
  • Fix segfault in function assignment with equals sign (e.g. F()=...), when an object with the same name already exists
  • Fix segfaults in some corner cases
  • Fix internal id does not exist error
  • Fix erroneous simplification of sin(x)^2*y-cos(x)*sin(x)^2*y
  • Do not try to calculate norm() and magnitude() for matrices
  • Fix some memory leaks
  • Fix order of argument titles in csum() function

Changes:

  • Do not automatically by default set prefix higher than kilo for meter, gram, higher than 1 (no prefix) for second and litre, or lower than 1 for byte and bit
  • Do not use recently introduced SI prefixes (R, Q, r, q) automatically by default
  • Do not set automatic prefix if resulting multiplier is less than 1 or greater than 1000, with some exceptions (e.g. km)
  • Default prefix unit property (use for gram, and few other units, instead of hard coded value)
  • Option to change symbols used for output of digits 10 and 11 in duodecimal numbers (use A and B as default digits)
  • Allow the same variable left and right of the equals sign (e.g. var=var+2), in variable assignment without colon, if the variable exists and the previous value is known
  • Use Unicode symbol for minus in scientific e notation
  • Do not show multiplier if exactly 1, in HTML output of scientific notation
  • Prefer Nm (torque) over J when the result is a vector with three components
  • Add "amp" abbreviation to ampere unit, and "thou" name for 1/1000 in (mil)
  • Fix unit order for Nm and Ws
  • Fix conversion from ounce (interpreted as fluid ounce) to litre with prefix
  • Fix automatic reactivation of global object after deletion of conflicting object
  • Fix parsing of scientific e notation when the number is extremely large and exponentiation fails because of floating point overflow
  • Fixes for output of scientific notation using number bases other than decimal
  • Fix prefix selection in denominator when multiplier is higher than the value of the largest prefix
  • Fix segfault in multisolve()
  • Minor bug fixes and feature enhancements

Changes:

  • Fix retrieval of exchange rates from mycurrency.net and add alternative secondary exchange rates sources
  • Align completion list to beginning of word, and do not reduce width of columns in visible list
  • Add option to not format output (size, style, sub-/superscript)
  • Add m/s³, m/sâ�´, m/sâ�µ, and m/sâ�¶ as derived units (improves automatic unit conversion)
  • Check that the output of command, in command() function, is a reasonably sane expression

Changes:

  • Use history font for RPN stack list
  • Use log() instead of log2() as alternative action on "ln" keypad button
  • Conversion to any type of expression (e.g. "1000 BTC to million USD")
  • Use current status of limit implicit multiplication setting during parsing of conversion expression
  • New SI prefixes (R, r, Q, q)
  • New units: ounce force (ozf), rack unit (U)
  • Use standard form (sorting) for polynomials
  • Improve consistency of behaviour when global units are replaced
  • More consistent addition of units to expression without units for unit conversion
  • Improvements and fixes for arg() and atan2() functions
  • Fix completion (including segfaults) and expression tooltip on Wayland
  • Fix RPN mode deactivated after application loses focus
  • Fix interpretation of Myr (megayear) and Gyr (gigayear)
  • Fix milli- and centimeter of water units
  • Fix genvector() with for negative step size or expression as step size/number of steps
  • Fix randuniform() function
  • Fix automatic/dual fraction format after conversion (e.g. "8 to score")
  • Fix inconsistently displayed parsing of "7d 5h" and similar
  • Minor bug fixes and feature enhancements

Changes:

  • Add "Clear history" to available keyboard shortcut and button actions
  • Add option, in keypad button menu, to reset keypad position
  • Show exchange rates source, and update time, for current calculation in tooltip
  • New prime number functions: primePi(), primes(), nthprime(), nextprime(), prevprime(), and isprime()
  • New functions for intervals and uncertainties: upperEndpoint(), lowerEndpoint(), midpoint(), and errorPart()
  • Add meter of water and related pressure units, and more derived flow rate units
  • Support for vectors and matrices in uncertainty propagation calculation
  • Proper support for uncertainty propagation in total(), sum(), product(), and for() functions
  • Simplify display of parsed expression (primarily for quantities with units)
  • Avoid parsing of implicit multiplication as nested multiplication
  • Allow use of curly brackets as alternative parentheses
  • Include +/- statement in function argument without parentheses
  • Return values for approximate variables in exact mode in dimension() and elements()
  • Improve parsing of quotation marks as feet/inch or arcmin/arcsec (e.g. do not parse s" as sin)
  • Partial Georgian translation
  • Fix removal of additional keyboard shortcuts, after first removal
  • Fix font dialogs when "Keep above other windows" is enabled
  • Fix saving of sub-function precalculate property
  • Fix exact calculation of re((a*i)^(n/2)) (wrong sign in some cases)
  • Fix erroneous calculation in some cases with physical constants both outside and inside unit relations when interval calculation is set to interval arithmetic
  • Fix segfault in Calculator destructor
  • Fix segfaults in some corner cases
  • Fix use of random numbers in iterative functions
  • Fix writing beyond end of array during exchange rates check in some cases (results in activation of old style matrices)
  • Fix automatic reactivation of deactivated global object if a function with the same name exists
  • Do not convert function arguments which do not allow units (fixes "arcsin(0.5+/-0.1) to deg")
  • Fix prefix after conversion to optimal unit when the optimal unit includes a prefix
  • Fix exact calculation when function argument is an approximate vector variable (fail)
  • Minor bug fixes and feature enhancements

Changes:

  • Fix handling of Unicode powers for units in denominator, with adaptive parsing enabled (e.g. parse 10m/s² the same as 10m/s^2)
  • Fix "+" ignored after "E" in number bases where "E" is a digit
  • Fix scientific E notation with sign in argument when function is used without parentheses
  • Fix lambertw() for values very close to zero
  • Fix a*b^x+cx=d when a and c have different signs and d is non-zero
  • Fix a^x+b^x=c when a and b is negative, and c is positive
  • Fix segfaults in some corner cases
  • Fix potential issues in handling of leap seconds (e.g. during subtraction of seconds from date)
  • Fix name field not working in argument edit dialog
  • var=a syntax for variable assignment with calculated expression
  • Replace ounce with fluid ounce during conversion to volume unit
  • Solve a^x+b^x+...=c in more cases
  • Improve remainder/modulus for numerators with large exponents
  • Truncate number in output of parsed expression and end with ellipsis if unable to display all decimals
  • Improved floating point calculation and output speed, particularly for simple expressions with very high precision
  • New functions: clip(), qFormat(), qError()
  • Replace selection (instead of wrap in parentheses) on operator input if selection ends with operator
  • Act as if two arguments are required when applying base-N logarithm to expression
  • Show padlock (or "[P]") after protected expression
  • Minor bug fixes and feature enhancements

Changes:

  • Variable spacing of x values in plot (unless step size is used)
  • Option to plot real and imaginary parts separately (enabled by default)
  • Updated plot() function with arguments for specification of plot options (in any order after the third argument)
  • Polar plot style
  • Ask the user for the desired sinc() variant (unnormalized or normalized)
  • Support for binary-coded decimals (BCD)
  • Show names with underscore capitalized and with underscore removed (with some exceptions)
  • Additional information units
  • Units for volumetric flow rate
  • Tradtional numbers (e.g. dozen, score)
  • Show warning when log() is used with a single argument, and always show second argument of log()
  • Make names with a single character followed by digits case-sensitive with suffix by default
  • Accept more than two arguments in gcd() and lcm()
  • Interpret a single vector argument as a list of arguments if function requires more than one argument
  • Insert minus instead of executing RPN operation, on key press, when last character is e
  • Updated Tab key behaviour, e.g. cycle through completion items on subsequent tab key presses, and traverse items if tab key is unbound
  • Fix segfault when result is a currency with quantity of one
  • Fix copy keyboard shortcut in expression entry
  • Fix limit of floor(), ceil(), and trunc()
  • Fix plotting of derivatives and integrals
  • Fix randpoisson()
  • Fix reactivation of object, after object that caused deactivation is removed
  • Minor bug fixes and feature enhancements

Changes:

  • Improve resolution and sizing of flag images
  • Do nothing when Enter is pressed if expression is empty
  • Restrict use of reciprocal in unit conversion, e.g. invert in "5m/s to s/m" (= 0.2 s/m) but not in "500/lb to g" (= 1.1/g)
  • New mHg unit (allows use with prefixes other than milli)
  • Always display abbreviated unit name (symbol) with abbreviated prefix (when unit only has short name)
  • Minor improvements to automatic unit conversion
  • Fix display of (1 + f(x))/n

Changes:

  • Add option to show both parsed and entered (or only one) expression in history
  • Add option to clear expression history
  • Do not add duplicate results to history
  • Improved result copying, with proper html format and ASCII option
  • Do not replace *, -, / with Unicode operators if cursor is within quotation marks (apply same principles on paste)
  • Do not perform automatic (continuous) conversion, from conversion view, if result contains no unit
  • Use non-breaking narrow space as digit separator in reasonably short numbers, and between quantity and unit
  • Improve appearance of icons with display scaling
  • Update value of austronomical unit
  • Fix segfault with local digit grouping when separator is empty (e.g. with ignore locale)
  • Fix freezes and crashes with extrememly large vectors and matrices
  • Fix segfault in matrix multiplication
  • Minor bug fixes and feature improvements

Changes:

  • Programming and algebra keypads
  • Customizable keypad
  • Customizable keyboard shortcuts
  • Option to hide number pad (right part of keypad)
  • Workspace (mode, history, and temporary variables) can now be saved (to a single file)
  • New matrix syntax (column separated by space or comma, rows separated by semicolon, as in matlab)
  • Do not make any difference between a vector and a matrix with a single row, or between a scalar and matrix with a single element
  • Support input of functions, units, and variables with underscores omitted in names (e.g. µ0 = µ_0, FermiCoupling = fermi_coupling), with some exceptions
  • Option to disable "simplified" percentage calculations (e.g. interpret 100 + 20% as 100 + 0.2 instead of 100 × 120%)
  • Option to truncate numbers (instead of round to nearest) in result
  • Convert K, Hz, and 1/m to J (and derived units) using conversion factor constants (e.g. 1/(550nm) to eV ≈ 2.25 eV)
  • Allow use of M as 10^6 without unit
  • New ksi unit
  • New functions: divisors(), rate(), vertcat(), horzcat()
  • New plastic number (Ï�) constant, and new "hbar" name for reduced Planck constant, and add second Unicode codepoint for µ-sign in constants
  • Allow zero (1st and/or 2nd argument) in comb() and perm(), and return zero if second argument (k) is greater than the first (n)
  • Calculate statistical functions (e.g. mode(), min(), max(), percentile()) separately for each column of matrix
  • Return the lowest value if there are multiple values with equal frequency in mode()
  • Parse text argument as expression if concatenate function name is found in text string, and fix concatenate returning date
  • Fix Unicode handling on platforms where char is not signed
  • Fix bitrot()
  • Fix segfault in multisolve() when initial order of equations is not optimal
  • Fix segfault with empty sqrt inside sqrt, e.g. sqrt(1+sqrt())
  • Fix incompletely calculated nounit(), e.g. in unit conversion
  • Minor bug fixes and feature improvements

Changes:

  • Unit and data set creation/editing
  • Complete variable and functions editing
  • Percentage calculation dialog
  • Periodic table
  • Show result in expression status tooltip (calculate-as-you-type)
  • Horizontal toolbar with added units and plot buttons
  • Favorite functions, units, and variables (shown in toolbar menus)
  • Ctrl+Enter shortcut for approximation of current result
  • New functions: linearfit(), quadraticfit(), cubicfit(), ramlatency(), parallel()
  • Improved and extended parallel operator (|| is interpreted as parallel if units are used)
  • Merged inv() and inverse() functions
  • Allow nested subfunctions
  • Solve x^(x^(-a))=b
  • Fix pearson() and spearman()
  • Fix a*sin(x)+b*cos(x)=c
  • Fix display of incompletely solved equation with dual approximation in some cases
  • Many minor feature enhancements and bug fixes

Changes:

  • Show result index in history (click to insert value)
  • Remove paste icons from history
  • Double-click to insert history text
  • Add insert value and insert text to history context menu
  • Option to remove, protect, or move history item to top
  • History search
  • If there is no selection, copy the result/expression at cursor when using context menu
  • Options to use (middle) dot as multiplication sign and regular slash character as division sign
  • Move keypad button to last position in toolbar
  • Ask (once) for correct interpretation of ambiguous implicit multiplication
  • Improved simplification of radical expressions
  • Improved Im(), Re(), and arg() functions
  • Improved output of complex forms (other than the default rectangular) in exact mode
  • Immediately return memory on MR clicked if entire expression was unchanged (or empty)
  • Function for drill bit size conversion
  • Fix crash when using the dock menu to show the RPN dock stack for the first time
  • Fix link in new version dialog
  • Fix parenthesis highlighting when cursor is at end of expression
  • Fix initial value of interval display in preferences dialog
  • Fix saving of approximation mode
  • Fixes for equations with complex inverse trigonometric and hyperbolic functions with no solution
  • Fixes for complex x^(ax)=b
  • Fixes for localization on Windows
  • Minor bug fixes and feature improvements

Initial version of the Qt user interface.

qalculate-qt-5.11.0/data/io.github.Qalculate.qalculate-qt.png000066400000000000000000003616551520501070600240240ustar00rootroot00000000000000‰PNG  IHDR„âˆUÐeXIfII* „†Œ”(1 œ2ªi‡¾„ '„ 'GIMP 2.10.342023:11:10 07:29:32  Æø�„iCCPICC profilexœ}‘=HÃ@Å_SµR+v�â�¡:µ‹Š8jŠP!Ô ­:˜\úM’GÁµààÇbÕÁÅYWWAüquqRt‘ÿ—ZÄxpÜ�w÷wï¡QašÕ3 hºm¦“ 1›[¯@}ˆ &3˘“¤<Ç×=||½‹ó,ïsŽA5o1À'Ï2ô‰7ˆ§7mƒó>q˜•d•øœ8fÒ‰¹®´ø�sÑe�g†ÍLzž8L,»XébV25â)⨪é”/d[¬rÞâ¬Uj¬}OþÂP^_Yæ:ÍQ$±ˆ%H¡ †2*°§U'ÅBšöþˆë—È¥�« FŽT¡Avýàð»[«09ÑJ %€ÞÇù»@³î8ßÇŽÓ<üÏÀ•ÞñWÀÌ'éõŽ=†¶�‹ëަì—;ÀÈ“!›²+ùi …ð~Fß”†o�àZ«·ö>N€ u•º�ñ"e¯{¼»¿»·Ï´ûû�ar±6ò» xiTXtXML:com.adobe.xmp ŠúHbKGDÿÿÿ ½§“ pHYs‡‡�åñetIMEç $¤� IDATxÚìÝw|UõýÇñ×÷Ü™½ �@Ø"{ºEZµîI[W­öWÛZ[m]ÕµjkÝ£*Š[7¢²A6!{çÞÜqÎ÷÷G $ @B|ž>¸9çÞs¾÷œÃyŸïR�÷Q#„B!„â¸fÐ–Æ JB!„Bˆã�aW(C5„?+¨ñW¤T„B!„â8ãŒv`sî �”ŒB!„B7š4ð4¤4„B!„âø'áO!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!Žûa¯©AiÕøç±ŒÖO ¯dº !„B!„èáOo|-žèjL›‰6ôà¨ò®Dh÷þ2$&К:¿Eq�&ÔòÍ!„B!D‡†?µqUlê¶¿ö¡•nãZwç–Æ“¦CQû™E^Zƒå€Üˆ ë*ƒhÉB!„BÑqáO+‹âÐíx¨iUM ZcÓ Z±p”6q>Sº# !„B!DÇ…?Àoøš½ær¹ˆ��¥¶¶–ššºtéBii)~¿h}»ˆRà ¤ãŸB!„íMû4f¥uDwß¶D'Ìí»V…ƈ;´ÖAÐ�Ù±uX}þL#Ø,Ê…‡‡3fÌ´Ölܸ‘””–.]JII (…R ʶfWm 4HB!„¢]%L‹å´ÛF ­ÃëseL>ºáÌbó„(¯ˆ¬02§¦±â9è˜Ö&?ˆAÊà6¼°•`°ãÊêð|Ù«_UU^¯—Áƒ³yóf–-[FUUJ©†§ZWóG“e;†ÂÖņ2-ÌB Ý¢¶†ÒwšH×F!„BÑQ“CÈ<)méC €0l 3`b UœÑO{`ÄmýÉ:%ƒ�h7 ÿ¸ K[]/j`gÞ3†Ðh7µå¶½UØaîÙÛâM‚Á ;w²’êêꆿÊ^­ ~sÖ?Œ�8ö�†c•>êVxð•Z‡Q åHåìoN'©$‡z.¤$©­ jtq<§-›@/g¥|K~¼:´ÏÐM ëp¸ BEbÔSµÄKÐ/=!„BˆÝï,féSkšáµ‚UcrÑ+“Hé‘t”‘ �E/¬&¾G,ƒÎíC0dù“ë ”ï'úš=<‚³þ4–ØŒ(–´ŽíwèLëGþ´ÖØívœN'±±±ÄÆÆ²eËLsO!´¶æOíZö@ ê …{j"½Î̤ÏèL’“Cq¸ƒà¶ã-,fë7›XóÅò?ªÆ´jBRØvlŽöìu¨°Ùw}Æ¡Vû٠܃bé’ª)\TާðÐë mé ¹ó<úÚ7ðÁíó)Ü*Ík…B!Nt¦ßĻ܇r·îÞÐ,2±¬¬ ›‚ê•u|þàLøý(†^0,Xö÷u˜Þ½j}?1š3îAlz+?YÏü›V@lÇîÂ…?­5ƒ Ân·SQQAUUYYY”——“››Û¤œþ3Z1:¨:PLô+¢–Éȇ1 ¯“‚yü¸ºoY=*!„ÈØxzœ3Šn£“˜¾€uoÔbÙŽŸãÍH %ûÚ1ŒH(áÓ ñF»nøÞ´Fšœ !„BqˆÊ¿«æ›.âôÛ‡3ôÂØ6Þ¶rO@ qgDqúÉëòÖ°ø«;<øqøHLL¤¸¸˜ÜÜ\¾ÿþ{bcc©¬¬lZcw_>»jaŠ �†(r |hÍ€ ‡0 ?¬~õ;ü{å‹('àÕ/Œ�×÷ç´KO⌛ë©Ú´�íËÇÏÆ0Ñ]¢ )“y…B!„è(™]ÁW�LøÍhNžÒæ˜ÿ+Ñ.MÔ pÆÿfqéÑ,}5ËþµËÖ9nÞ�(ü)¥˜;w.¦i ùñDZÙl�S<ìY”{J(‘¿Š==ºÉAWø(ûí×Pt€ æ´‘4i ƒÆ†�ÿÁ|æ?šGU‰Æˆo’‹<›X­¨@Sn!Y.\ñ }A¼›êñZqN"ú9ðoòâ-°öT\š ׈PBÂ-j¿÷ è›0puw’lG9ˤ~c=õÛ…1º†�ŠÓ 8„eEaâ˩ųs×$ŠvWO7î.v Ô™Ôoôâ-·ä$B!„¢­¸ ì»*f×}ÇÙÇIçö!0Ù4kgÞ3†˜ô†>~Ëþ¹Ž`uççðÂß®–™ µg.?¥°, ˲P{Ußíî˧«ýxßß„ånös]DU6бŸÑ>�h;‰'u%´°ŒM_l¥²P£ZjÒ¨eÝÿ¶1p@2cÓpþ§’úrˆ¼¸'_П~ýpDilaËòXõÂR–¼W‡Ú_ÇK Žn1t»¤CÏÌ"9UaÙ-”®eÍ ‹™ûà6ÜsùŸÓÉý÷|zFDêVi$C™È°¬Z>÷9[÷“þ ;I×÷eø™ÙtËŒ@¹ÁVÏŽOÖ²øù5ä~å'ñ¢1üdz*ÎNÕƒ³ïO'èñ±á‰Oøô‰jlÚMê¯z1hZ6ÝDbÔ�ËSOÞìe|ûòŠ×Zû”—ôöB!Äñʈ0ÈþY7”q˜w< ò>ÞŽw�O Sì÷©ú±–Ïîûž‰Ãàóû1`B6Î;+gå°àŽè°ÎµÉöÃÙI‡ËAhhh«;�)( ðñ¼üzOòл¶"ÂvÀiT˜›Ønnª*ò)ù¡eØö»Gõs+©öû‰ÏŠ%ÞùUNºMêIBt›¾Í§pGwf Y§ödÌ/ƒlŸó…•û � aôûÃ8ÆŽ‰¦jËV–¾VLµ†Ø!IàpâŒlƒoÁF¯³{âòðãûUTUD K¤÷©ƒm÷Rüí:êæ¯æ;w)=&&ËQÀ²YyT”)]êGÕÙHyt0g^ÕWÑ&–¿»žêÍÉÃH�2’Ó#|ríFêÂŒ]IÜ$ ôÈ9+„Bˆã“#ÉÎù¿žxDïñfñ‡l]³S SPż~|g-ïCtFÛ—1ÿúåèN8ê!‡?¥Àá´c¹\­1ÄP( l±.Ü·daKk2e�B×ø©{f%T›ûMÊî®1Ë}Ê”AmõQg™ènTl€­o/!/§’ê÷LP_ôR S§¤Ó}Àìüpîõ^œ§õcÌØh*æ.äã‡7P¹ØBÛÀHÜ@h¢ Ÿ_~¤ßB°Žµÿý–ÅŸSW¨0•†ÿùi éÞ…„¾ëÈû¡€Õå^¢‡õ'RCî‡Øþ½ nÐãº1ú‚L¢ Ö1óîl™Ä�q!ôû×d&�êMöå,}Ç‹Ugá«©#èòcVÉÉ*„BˆãS 8È'�…²n['Eñ’r)HqPÑ##4µVТrk 1Ý"ùì@æßºÕ¹ê8¼fŸšfÁÏápàp8лF!ñù|X–Õ4�5Ná ,#Øäc•F[ S+hÐqוJ)”ìÛtº“Ã@Y ÀnQ»¶†Ð® úI:ñcc‰‹Œ&!=›Í‡ÝMËAÖÝÏÊÂaÖ³qF9`ìž—/À³#pàjZ]ž&•këˆ9­;ýÏH#îähâ]ÑÄg…âßlÃpi”Í@ÙÕžr´)T„B×j'¥ÞÞH.¢&»ƒuõúj&f“Ž=èÅ jÌ@Ch”vŸB!„8^YÕ«Ütdo"÷Jâ ™(j`gÝ;–Øô(–}°†MŸmcâïFsÒ¹}°L‹Å�¬Å¬;Öûü5ÉèÑ£1M“ÊÊJºvíʦM›X¹rå¾á¯Ò‡÷¹ÕûNl¨� nèï·Ÿ™,o ùÐ31’ˆz-÷ÓÓ`¤:q6ØRIE@£¢èóÇQŒŸ�ß㣮6€'§�­={ଆÛ͆/°�ü7,TR;ÌÈhiìSóÀh†ôsR[í§ºÄKý¦íä‡ô$ù`¯ƒÈ®n!aô¾e2Y7ﻈQSIЯ›äT%W3!„BÿävG´?ÄžÉÄß�&6#Š•Ÿä°è«Ñ6Íì?}ÇY÷Žåäóú ˜,:‡`yç€Gþ,ËbìØ±$$$ð /PVVÆÅ_ÌæÍ›©­­mMㆩa?û®ÔþgùÓ5&eKpŸCúéIä.($ØÂ’ºÄNÊSIˆµQ1§�*�"ú²,†Ÿ–@Å‚Å|ö›µ¬l¨ºLÿÏ…deF0Í+C¡”G+’?–Þkã^Í«Kl¤];˜“(6¼ú_ý|;µÙn†þ+ƒ”Ôƒ\µl�…eØöþ 6—û÷Ýo=E?Ôb9€úe¶³%¤Ÿ)ç­B!„‡$ñ¢9ýŽĦG³â£õÌ»y9ìšç¯ri-_=º€3~=‚aÓbKî]ƒet|Ð#žä=33“U«VaJ)òóó %66–ššš†@§&xW­xü¢öÓŒR×)Z”Cþ9§Ñçœl6έ`Ëwþæ{`j\S’4>‹Èʾú°]å a@4!1}°�’�ö$ÐE{‡x(g=%½„t‰§ço#Éû{ ¶XÕª´fÏšáNBzE᮫À®@k¬AÄ;œØ5t†i•°òÖ�x’ìØ{t±ÝÝhÿ�bR•[GÐkAÉ6–ÜU‚ÖMFÓ1"¨g44—­ô‘÷›%䢰%ûåT!„B±�˜1‘œ~ÇâÓcXúþj–þumcðk¸A‡Ò/*ùƶˆÓïÁ�©ý±9lÌÿÅ ˆ?†ÃŸRŠ;vÝÚbbbðûýTTT4¾¶»ÙgkjÞÔç¯æË<MfÂE=9÷~' _XΊyUœŠ��Ý™xçÒ3ü¬yi ùËh› _•ÓKzï0Öt¯'àu�p×I é‚ahnÁ ùo®¡ðìQô½r$;‹`ÓÒpeÅ’îVl_X„g!E•IëÓ�ôKŠØº.a.zÝÙ‹.ÝÂ1ô�: ûñ”[ØRSè~�‹ó- WY¿Iß®àß´WX´Àé&¤‹G¾Ë¤fÆò~Öƒ~×Lä”ÜÏX°°| Ü®¾‰tIñk(¬Rز"öâDFí`öKرLªÿ„B!Nt6‡ w'´r€3ÁÚo¥ÍqKCdÿ0ÎüÃhbÓ£Yúþ~|j=f} sj»¡äË ¾ðÎã¬?ŒaÐy}@kÞ·Ëì¸9¸�(ü¹\.–,YÂ)§œB÷îÝÙ¹s'C† áóÏ?ov0ìžäý`‡GcßÀý•wµŸÍ¿[Àœ0;ãNKaÔ}ç3 o©•B¸ÍŽ‹߬fÙ[Eø=åRô}!%c2Èøù¹\vN!^¿‹ðd[¾«$b\è7È3_ÿ-’I·fsæÓÓ»®ŠjË &;’â�²}n!ÞµE¬ùdig1åŸiäWaK!¤¸Ž’�U¸’÷r¡rg0$³''ÿãRÒsKP±Q¸Œ6~SK·Œ=bnõ²3§€šá=ÿ—pÊ7BÁg_2÷Ñ"æÜ²”èç†1ø‘)œTUEyž��”"â-_O¡§a8G—(RÆïòß3„‚eµh¹Þ !„BœÐF_4ŒQÓ†Ò:†M5 $x¢d?/ Ÿ>€˜®Q¬ød=Kî_ƒ´˜´*Vóé=ß1éÏãÈ>­;V³mFá¾c ­�vâ÷jS7$ÖVUÍi*K†ûˆŒŒdäÈ‘ø|>¢¢¢ðûý$&&NHHùùù(¥]–L4¡»š€rÀ_Uf�-�ßÚßœ&¥oä²á‹�T…+thËïÇW^BÁºr¬�pRú%ÓÍÀWPAYN�à¦RòVÔb϶ã0 ü¥,~p!9Å6¢ãýìø2�â`ØDŸŠ{y¯•54ß4-j–î g[%Áh7Ž0Ú¤ü‹�¬xj#¥eí R±r%–�=Fa8-¼Ë·3ïžå”g¹±ûªÈ›YHmPg'êœ0tY›ß,Æ®ðÍßÊæBMX– ›¡¨^žÇWwüHeJ!Ár¶|]H]•‚`�ÒµUÔ'9 U@=ù3·P\lBQ9sJðEÚ!ÒÀp�ÏWDÞ;«˜{ÏZʼJ�ePq¡P¸ƒ5îÄS&ÑO!„âDåèj'63ŠªâjªKkéWUI5å…U¬Ÿ¹«îø¿§Tv(ÝXA½UÏâ;V£�­Ûg_¡Ÿ‚Ü"jËêÈ{½Ký²²¹m6…z¼ÿ‹Úô[ø+­ Úf±¥Ï:¼©UØívz÷î�Ó餬¬ŒÒÒRzôè�ÍfcÇŽ£”âŽ�ƒÈÐq­ø€m^/sJMꂉÖÆ*Ñ4ü PD_Ó�Q¿L¿þ±ørv°ü½,y°ˆÆ,µvM'¡0¢ ZXµ â ;€Æ*²ÐØ’UóñZ¼«Úbw¶W(Œ¦}æ4è Kë=Ÿ‘`@IÃ:F¢Ñ8’©UذFÒžÑ^ «ºÉºñ”YXºÉºÐЗ°XcíÚ8#ζkÛSc•îU&†j˜ž¢I7@]lbí½ýB!„â„£}³òÈš!Úm'ÎȪXe#áÐvXA×jŒè(( Îh6§qÍ>µÂîk˜ = ²jÕª=iX©Æ)vôÒAöŒøy0~­ ¶&  #ißw¬y?�oË*X7 »MãY[GРض¤½†^qØÂšåyŒÝËì½ ! #ĶÿZ*ÑØwp—¤½^Ó ¡oŸÕC l!{½ØÒû©†ýnq;l-—É>Û™dÛÿ 4B!„â„¡\ {’ܶšÁ!?h¨5TÑŸ�9ü)K[šDm|„Z»&g×M²Å¾;Ð>mp´O Ô™A6yüÔ›ŽÃxàߢJòUÁ^ !„B!Äñå°bQXE$Ý÷§&´ËabÙ,v7Xl)Ö-¨ °b?#^jÀÔŠ€¥©Ú X®VM !„B!„¢�À;JHUX«–­Uššƒ,£öú]!„B!D'Zµ~¤ uB!„BÑqd¬G!„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!ö°(·ÂÞÕÎ!ÌÙ.„B!„¢“ÓZ£‚ 4Ø1á¤;³wùp,Ë’ÒB!„Bˆã‚" ðÝ«‹Èù×ì(‚xê=hKªþ„B!„⸉†Â°5ôö“>B!„Bq�ð'„B!„þ„B!„BHøB!„B!áO!„B!„„?!„B!„þ:NEE‹/Áï÷Ka!„B!Ž v)‚æ,Ëbݺu<üèßùû#“••…RJ FˆP�ǃ×ã!bšAN§“ÈÈHl6Û× ƒÔ××0- 4¸CÜ„‡…Õ}héú¥µ>èr--s(Ë !„BÂ_§W^^Á3Ï>Ϻœ�|:û3¦ßØ·Û-#Ä Ä², ˜ýÙç¼ÿáÇ|ÿí×$t鯹“&pÑEÓtÒI„‡‡ï~êêêÈÍÝLaa!6nd}ÎJJKÑ–æš«¯àÜsÎÁ²¬£¶+V®D7ù<·ÛMß¾}›-W[[KNNN³`—””DZZZãþ)¥ÈÏßNqqQ³à×»woÂŽr B!„„¿61û³ÏXµz ‘áa¼öú› :„Q#G6Þn- <âØQ\\ÌÿzŠ?ù”qcFñÞ{ïÍ’¥KyýͬZ³†_Þz gNœ€Ëåj\O)EQQ1÷ýù/|5g>1qQôÍîIYi)Þz~ßÑmJnš&7ßòKòv6¾véÔsyìŸÿhvM*//güøñ„Ä$à­¨âµ×ž£k×®ÍÂß²eK¹êê_¾k¹"V­Z%áO!„�ðwlQJ‘“³�OfÍj xÁ`�W_ýýúö%** ¥Ë—¯`Ö§ŸšB µOHTJ‘’’Ìå—]†ÝÞ¾Åmšf»…L¥†a·M`µÖX–µßæpkâ'Ž~¿Ÿwߟ�?ýŒ±£Gòç{ÿHBB6›�>}zÅO>Å«¯¾FϬLz÷îÝlý°°P.¼hwÞñ+zôèN0hò—ûïgÑ’;dÂÃÃè’ÛøwÇþ®CŽÈÆåê#ÃQ†Ñ¹`�–‘ŒËé ·®¤Y¼B!᯵‚Á ~Ð8G‡l‡Ïçãó/¾`sÞÖf7ý«Ö¬áÃ�>æòË~ŠÍfcs^ËW¬Ü3Œ�n M7M“ªªjââb˜tÖY$%%µë>ÜõÛß‘“³¡]Þ;&&†[n¹‰!ƒwA(°qã&f¼ý6«W­ÆðC“ Ø¿__~ø!©½=ATWW3sæ{ø®»öj�y·ÛÍyçžÃ¬O?eþÂ%¬Z½šnÝ»ãÞUû§µ&11‘K/¾¥UW×tØuM!„¢S„?˲ØYXȆœ ¬]·Ó´è�Ý‹>}z“’Ò»ýèŒU«V3çÛ¹ƒÁf¯{½õ|óÍ7Œ>œìì^œ9qiii˜Á`C>ÐzWøÛõg­_¯ª®æã�?a[~>G#6ÔÕÕQPXD}½�òêÚ=Oäµ&.*—ˉeY–V4þÌPŠ˜ˆ0\.g‹ï©�ŠÊj"ÃCyð¡¿ò‡ßÿ–ÁƒcÇÇ@±–eñí·s¹ÿ¡G()-¡ÎëÃ6û¾ºvM“+Å dùò•TVUÑ+«]ÓÒöyØár¹>l‹–üÈ÷ßÏgÂøñ�áh }�Emm%å{vìu�Ûóƒj JB®{UÍú 6^´Åö­…�Í>ñW�<BqêˆïµÖG\Ñ!áOkͪU«yñå—ùxö8l6”R‚AÆŸ:Žë®½†!CŽ^ SeUs¾ý– sq8ö-’«×òõ×_Ó¥K  6tÿB“ÿ•”–òã�?²-?C�°¹éç70zÔh´n¸yS†Áœ9sxùÕ×9i`^¸íÖÆÇ4M¾Ÿ7Ÿç_x¹ÅÉ£?ÀSOý‡�¹¹<ôð£ÜyÇ/=zôqqâ®_ŸÃßþñ¥e¥œ~Ê)L½à|bb¢÷¹Ù—Z¿GÎÆ XZ“Õ#‡£áœØý°c÷qЫWO´Ö¬[¿~ŸF�‰Ífã©'ßgÀ—½�çØØX¾úê«}|iºœÖšÁƒ‡ðõW5{-66V!„'œ�;w²xñâ»I´—˜èhÆŽ{D÷¥þ ‹Šxú?ÿaÁ¢%D…ï( ó.¦¦¶–ø ééí¾-¦i²!go¿ó^‹Á@[ï¾ÿ!£F�dàÀ�LùºÉÿ,ÓIJ,”Ã8:O‚¦Iff&C† n6Pö­Û0-‹ø¸8† Òø³@ @ÁÎB|þ@‹á/$ÄÍØ1cˆŽŠæ¡‡aó–-<ñäÓ˜¦Å¸qc�ù÷“Y³()-eܘÑÜró/èÙ3«Å¾™þNåeehË"6.‡ÃŽ×ëå�wߣ¼¼œ ÆÓ«W/°,‹; ;õ±aƒO>ù Çsxx8C‡Ýg™½Ã_ZZê>5árn!„8•””rå•×’–‘qÔ>ó¢iS7n\Ç„¿@0ˆ¯¾þ�×SJ1{ög¬Zµ{ 5{v»�õ9øàƒ¹îÚkö¹‘ mÓB¬­­åÅ—^¦¾¾~¿5�J)ŠŠ‹yý�¤§gìS3t  hiMÃh0G±ZX7¿)k«�/r•±Ífãä“qç·óÄ“O±)w3ÿzêiœNÆ ;f›€*¥Ø±c~€3N;•ž=³°Ùlr3{ÓZSïó£—Ó‰a,^²”ç_x‘ªêŠŠŠùí]ÿ‡ÛíÆÒšê:o§?^Z»}m½œBq»ÝŽeš(8ê}“…B!:$ü5<ýõ±½ øW„´. MÉ�`�ü‚š»4Í6LëŠmÛòyío´úÎíròß瞣OŸlºvíÚŠ2ÚUNJµfŸímìØ18v~vÓmÌývA§îïtȦ8á)¥ˆÃPŠÚÚ:LÓ¤{÷îÜzËÍÔÕÕ‘šš†Ûí¢ººÃ0ˆ�ŠèôÓŸ´ô jï‡-uZo©…@k—B!ŽwZk‚µeän µÏ �ü³;üeee±råÊC¾ñQJñöÌw˜ñÖÌý�:üä©\sÕ•ÍÞßát¶YÍŒišÌž=›üüí‡ó·óþrÓ/~�Ífô °,�‚£Ú´½õïß¿á{°Ë4‘âø“š–ŠR; .²»k·wÏ™¿};†¡èÑ-£S7{ƒ¼ð‹Í=×Úøøx.¹øâf�­¨¨˜3f`Ûõ LkÍÈ#:th³æã‹-fÑâE�×e3hrÃÞþ IDAT饗’�/ŽBˆJffæae¡#Ñ­Ôûî=,,Œ°°°ÃZ÷‚ ¦0oþ6çmi10%&ÄsñO."½�|QJ±bÅJæÌ�‹iš�}ýšŽÔÙð›jòºjüùwßÿÀðaÃ9rÄ>O¼=/Á`Ã0ðxêüXZã÷û©ßÕGÒ0 œN§œ5BtB' ˆÃacÕšµx<ÞÆëÒn–e±|ÅJ´†Á'ŸÔ©Ïe­53ß}�²òЯׯŸv —\|q³åêë½ÜóçGÈìžÚðwŸŸnݺ¡”jþ ù÷Ÿß3Éû–\0õ9h„BœpBCCÛ-«´§©ºÉHOç–›oâÙçžgåê5�‰YkMvÏ,n¸îZ²23ÛíóƒÁ uuµŒ5Š1£G76eR¨]c³¨ƒü2°´µk$Ï=iß0 æ/˜Ï?þù8å ÕÁA­5ç_p!†¡-þðû»˜|ö¤™,ÝãõRPPÐxC š”——KߥDQQf6Ÿ>\IIIrü·Fff�t_}3—yóç‘––ŠÛín @ùùù,[¶Œ°ÐF�ÕâC°¦×…†?ïú»jÞtòØo.©ä¤B!$ü˜aŒ3šø¸8V¬XÁ†�›°¬†) N:i }ûôiq¸ý¶b³Ù7n§œrÊa¿GKý\,ËbÔÈ‘ >y.Ÿ}ñe³›l¿ß�?`ÒÄ Œ3¦Ãn|ç/ZBŸA#oÚ”M‘Mhˆ›Ž:ZëDŒåP& =ÔþVwÿáf~øyÇî ¯’-[·ÕnÇÊ‘ôCs:�\yÅe,_±Šÿü÷yR’Sè•Ý —ÓIyy/¿ò*EÅ%œ{ÎÙd÷Ênñ\^³v-¾zuuuTTT äåmaé²ehK£ ErR)))ÒgN!„ÇoøÛÀú÷ïGVV&555h­ '44ô¨Üµ× ¡¡¡\~ùe|ûÝ÷ÔÕÕ5ûYll,N›JTTäQ/oKk*ªj u»HŒk>U…iZÔÔzZ\/6ÆßnÛTYYÉ—_~‰×ë=è²111Lš4éˆ ì¨š†¬¦5»M�‘Ž~ëׯgÙ²eLG)Eff&£G�nõ¶º\.23R‚Ôû|Íš›Í 4ÄMeuÄa}ê7ß|C~~þA÷Õáp0räHºwï~Xß¡ÍfcØÐ¡ÜýÛÿãñ'Ÿâ÷¼—Q#†ÎÆ�›Ø°)—3N=…k®º’„Ä„ßã…^bÁ¢Å»Zh¼^–¥yýÍ·xç½Ð¢"#¸íÖ›éÒ¥K»kõ>_³óÛ´öS󨦦6€ª:O‹Û¤µ¦¬ª†ˆ��†üU #[ !„' ŽôíHï:tÄ­5.— —ËÕ¡7Üm­G÷n\þÓKxê?ÿÅÑ$¬\âÚ4·ÛÍäÉgÓ·o¾žó-6l¤¦¦–þýúqã ×3rÄp""öb'ŒÏàÁ'øâk·Ó½{·výìv;ðÞ>çÂÞŸÙ¥K¶nÛÖlœ{ °eYgž9‘œKö‡@øaöýB!Že6lä©§ŸÆépµÏì•Ý‹é7ÞØ1“¼‹ýs:�L9ÿ<¾úf7åb(Eïì^Œ7†ˆˆˆ ¸n·»±ßRga·Û1b?ýéOùßÿþ‡ÏçÛg™ÈÈHn¿ýv222ŽøéJqq1Ÿ}ùMómpØQJ‘³1—µë76¾¾m{W]ye‡”KHH?ýéOÉËËcáÂ…ûì·eYtëÖ�Ûn»�¨Cl:  -MhhQQQGµ)­ÇãÁç rxëÇÅÅñ«_ýŠ{‚‚‚àØ±c™2eJ³J‡Ëáp�••Eæ^ý�[Ó,÷¬³Z¬›¨Ò”RDFF¶ê\ŒjÅr�ñ:"„Bt¿ßÇÿf~HF—Ä£ö™G|ï á¯�ÄÆÆråå—qïŸïÇét2qÂx }{Z8ˆÏ9çÖ­[Çüùó÷¹ùž:u*ÇÇq„OUjʆӭ[FÓ[c^yõ5ò¶åsþäI |rã÷cYš„„„û¾’““¹þúëÙ²e EEEÍ cúôétïÞ½ÓÏ1×– à ;;›ë¯¿ž¿ýíoÍh­ÉÈÈàÊ+¯lÓïíPú_¶ÅzB!„íIÂ_;q¹\ :„³&Œg[þvΙ}:6l ¬¬¬ñæyèСL›6�¨¨¨#¾™×Z3f̘}¾ƒoæÌaCn#GŽäüóÏkVÖÑ“W÷ïߟ[o½•»ï¾»YßÄ«®ºŠÑ£G·ë H�•ÓéäÔSOeË–-¼þúëͦ!¸í¶ÛèÝ»w»|g‡Û´¥~¤òH!„þŽÃP“””Ä©§�Btt ññq²–eµÙͦaí`µÖôêÕ‹ÿû¿ÿã®»îB)Ebb"7Þx#ÉÉÉm¶ý{ßx7­6×»¦îèL#ŠÚl6FŽÉôéÓyöÙg1 ƒ &0yòdBCCÛüiéûÝý3¥Ô>Í,wOxÞÒÏ€ÆÑnÛú¸‰ŒŒdêÔ©lÚ´‰E‹ ¹óÎ;2dH›}ÎîcŲ,ŠKJغe+Õµ5h C‡ &>.î ë×ÖÖ²hñ6mÚD½ÏGˆÛMvv6ƒODDDD‡]ô]ì|oírB!ÄñN)EÏn©D„‡µÏt8�¼a›‡¿`0H D©†f{�u.¯£O7®q€…£}ƒTZVƯî¸s¿ƒ©ŠúúzøËŸ9ùä“Û-è :”Ûn»�eË–qæ™g’��}Â_X"""˜8q"UUUTUU1mÚ4’’’Úô|½aúÏ(..á¯=ÀÀ�ƒ‚a<ûìsÌþüs&�y&?ûÙôÆ¥«V­â®ßÝMbBÏ=ûL³šH�ÇÃW^�ÇëåÙgþM×®]Û´\ÒÒÒ¸üòË #%%…SO=•���6{ÿ�;wòø¿ž¢`Ç*++ñÖ×cš&ÞzÏ>ó4q±±û=ŸµÖäænæÑ¿ÿƒM›r‰ŽŠ$,<ŒÚš:Þœñ àW¿¼�ŒŒôv¿&®¿áFêš\À½úc³@¸cÇn˜þsÂÂBƒûM?ÿ“&MjüÎ Ã`Ö¬Yüç¿Ïa³5„Ǻ:Ï?û ©©©r „â„Ò§Oæ~óÕQœGZQÑfá/ RXXȺuëÉÙ°§ÓIÿ~ýÈÌÊ$1!á„y2¬”¢²²’²²rÊËËÙYXˆÝn#99™ØØXâãÛ´Öæ`á³°°ˆòŠJê<^<õ¾ÃÚŸ¸è(ŠJËÛ}rðððp®¸â ®¸âŠÆíï,êwÝüï=¡·RŠŠÊJÜ.W» „‘‘‘Á¯ýëv+“ââ–®Z×â÷[ï«gËÖ|êëë÷ù™iZ,]µŽ!Zž wËV¶n+l·ÚÔ#F0bĈ6/­5õõõÌ_°�þýúЯ__ÂBCyåoPU]ƒ¶ôÏ—mùùÜÿàC¬ÏÙÀ9gŸÅ„ ˆ‹‹¥¸¸„9sæðÖÌ÷¨®®æ¯=@bbûw/,*¦¬¼¢ñï™Ý»ï³ŒeY,X¼’Ìî©»¾w?�Fš ‚lÚœ‡Ëé wK–4cBq2 ã¨�àßÚ$üƒA/^Âó/¾Èœïæ5©9°ñ“içsÕ•WÐû¨Å1M“5k×òõ×s˜ýùç¬\··ÃÑXC äÜÉ“8å”qôèÑã¨mWm�‡?Þ}=³²yJ.Ë2¹çO÷QTZ~Ôkgãñxøð£�0M‹ ¦œß•RóλšÊ„ ã mÃÚ§Î^.­½ÊD)EBBO>þ""#‰‰ŽÆï÷óÊÿÞ<èù ùüó/ÈÉÙÀ¨øöÚkHïÚ­5Ù½z‘–šJQQ1ó.â£�?á†ë¯“ïV!„ÇNøÓZ³uÛ6{â_¬ËÙ@·ô4F�E}}=óæ/à“YŸá«÷ñ»ßþ†øøøã¶ ý�óç/à¿ÿ}–µësPJ‘Ûl™Íyyüã‰'Y²lW_uÆ9*ÛVQSÇ€þý9餓=Ø›&aG©¦²³Œ¹ß}Ï?Ÿx ‡ÝŽÇãáª+¯ÀårQ\\Ìo¾É[3ß%>.–„„xF�%7óÇ�ˆˆˆÆóEkMII ûV•RìØ±£aB›Á AƒHKMmVóÙµkcÇŽfÞÂE,[¶ŒÒ)Sˆ��“cF!„�;üƒAü~?–eñþû°>g½{õäþ?ßGFF:–¥Y°`?ú7–,]Æ×ßÌáüóÎ=¢&`†atÊ9¦,Ë"''‡Gý…EÅû­VJá°ÛY°p1~Ÿ�ÈÈzgg…¿¦›âgi͉|[ª”bÔ¨‘œ}ÖDf}ú/¿úþ@€‹.œÆŒ·Þæ�oã°Û™8áŒcg*¥ðùüx<žÆsØa³Q_ïÃãñ4ëóð€†¾c�§YŸ¿z_=› ËÒx<žf}þ¼^/ 0œvêëëñxú÷#ÚØ©SÎå�÷ÜÓ©Fd¨©©å?Ï<ËŽ‚�­àFkͲå+ùü³Ïéš–vÔúŠÃÉ-7Ý„ÓéäÃ�>áÕ×^çÛo¿#wóf Ãàª+.ãš«¯:f¾G·ËÉ_|˜¿<øpãkIñ1Ü|Ûíû]ço¾ÅÿÞ|kŸ×“âc()-ãô gµ(º§&qÙ•×4¾–ž’@euíq{¬xë½—”Ò55…äää]ׇ<aaaDFFITT•”—•µëDÇì Á655•—^|aŸåšöç³,‹ Æ3aÂx¹(!„8á­_¿žÓ&M9ª“¼O9w2÷Þû§#ÊB‡þ´¶Ô”’ë�žšˆeY„†„4Žàp:q¹\ (øüì,mÝãóý‚�òË_µjßÏ›�ýF6ÕZóõœo9íôÓdò÷c@BB<7\w-Á@�O>�ÍÆM¹‚Aî¼ýV.ºpÚ1ü|>¹[vtìFø«�ÛÚdË4ñx½8œ"##(/¯àÝ÷ÞcÞ¼ùœzê)L›z!!!¸Ý.|~ÞÒB!„h/‡þ233Y¶ìG´¶xîùøøÓÏøxÖ§ôíÛ�.]RÐZ³vÍZ,\LˆÛÍõ×^Í9“'£õá'ÕÝA²3ÑZóíÜï)øí–³1—’âLÓ<&G :á(…¥-´ea O1önîØÙýé�÷p÷ï×±ç ¾×¨©Ç ˜»æ>´ÛíñÅ—_±.g–¶3f46› ›ÑÐ\¶³µbB!„„¿…‡‡ŽÖšK/½„æ-àûy ¨ÿËý 2Ÿ¯aÀ—�›ré�Ý“óÎ;—Œôô#o�±†lGAÁa­gYEEÅøýþNÙ—QìQZZÊoÎà‹/¿Âî°“ž’Bþö¼9ãmPpÃu×5ö—êÌÚz¾=±×óv›�eiü~?\zÉÅ,\¸ˆ1cFÑ-#ƒœœ ˜¦‰Í0šµ”B!„è´á¯ñfG)zggó«ÛoãÅ—^fÁ¢%,Yö#ZkLËb`¿¾LŸ~]ÓÒŽÛ¦��Àáuö4 …·Þ‹Ù†Oÿ CQYUIQQ%¥¥˜¦IˆËAyy9EEE‡<Õƒišƒ\NååQWWwÂÌÛP^^ÎëoÎàÅ—^Áírsùe—0åüóyõµ×øðãY¼ñÆ[Ø W^qù>óŠ‹Ín#,4Œ€ßOuU]RR˜rþyL9ÿ¼]ç§�ÇëÅë­ÇívÒ9š ûý~***ØÓ._JDD„|©B!D BCCùÕM7`·½�ÏÒÛ "­MÚ«¹\.&M:‹Ô.]X¾|9y[¶âpØéÕ³''Ÿ|2}úô>¢° ”ÚïúZë•ÑÑчµ^0h’˜˜€Óáh³mq9�ÜwÿÃüâW¿#Ìí$)>†ø˜(n¼é6Ê«ë=L*EzJ1QÜôË;(«¬Åé´“šwBœØZkV­^ÃcOþ‡ð77Þp-—\ü"""¸áúë0 ƒ÷>øˆ�>™Å Aƒ5r„ôß<‘ÿ! %9)�:¯—‚�;éÝ»ùµO)EUU•ÄÄÄŸ�Ð)Ž—�……œ4p FXÃô4V]¯½ö*矾4MB!Z�™™É=¸û¨|VÓ,díê^r¸Y¨Í:+…¸ÝŒ1œ~ýúRS[‹¡ ¢¢"q»ÝGts£”bÞ¼yäååí·àGŽÙ¡7P ૯çrÀMˆ�#1!G…¿`0HiE‘a ÍHwÿ "ôðš––UVïy�¦ï8öîƒìØYÚlTý�¿�ð§ßÿ˲˜6õ‚ÆæÎÉÉÉ\ݵ˜–Eff&ýúõ•àw‚KNI¦W¯ž|ÿÃÿ’IS.�ú Œ°8N9˜ë¯½ª±ùpgúGåé?†ÍØS‹™‘‘.͘…BˆNÂår5f!€;ï¼ó°²�z¼ï‹ºÏí=qé ´Õ¹ÿ¡WJQVV†RŠØØØNwcRVVÆ'³>å…—^¡´´ ‡ÃŽa�m‚=Þzúd÷âçÓo`̘1DDH“/!:køÛ–ŸOÀØ3æÞtÃ5©G�î-^|kjjÈß¾¯ÇK ÀétBZZ×NW[ÜÒ Z�a0-!„B4ÿ÷º¼¼à�²�2 ß\κÇ6;5»oFbccÿÜÙÄÅÅqÑ…Ó7v _~ý ,¤°¨»ÍFZZ*§žz #‡� %%¹ÍyB´=—ËE¯ž=[}]jIDDýúöm Q»Vg¼vIÐB!Ž�,sDYÈ.ÅØ¶BCCéÖ­×^}W_yE³Ÿ66Ã8¡æÈâX¾À¶Õ{ì>ç%` !„¢#IøkJ)ìv)Z!„B!Dç!9 !„B!„„?!„B!„þ„B!„Bì~_€ºººN?ÕƒB!„BˆÖsºœMŸ‚’üRV¬X!áO!„B!Ž#]»¦5ŽÖy«ùzý!óRΉŒÄvr�AŒL¿Œ�›_ç³mRû'„B!„h‡=Úg}m……4Ö×)'‰IÉD†;°V€òÅŸóé‚ ŸúsF÷RÀPÎ>ý4f>ý5s>=Ÿ~SzÓâ;è ž�Ïqg~oüÉ)„…„îµAel)¨Ä´…Ÿ”B”*wl¡Ô»§FÑpÆÐ#=®…ÍòR^´“òzMxJ7’ÚÇJ+ ¢`+ua)¤Æ†µ0¨Æ__EAAÉ©I¸]Í‹UkMYþf*ü6b’‰�m’º3Ým ±›^gÓæyø2NÅ%Ç¥B!„¢�FÍŸ¦ðÇ/xýå0¡gOzîþ•u%ϼð6K êö;xK b3ïΚÁüš1\0u‘„3üÜ«¹2«ŒY?|Ɇ2‹ëZ–fëÖ¥y cc" ÝkËuÉ\~}QÃî~�õk‹Y5ïKž˜~êžíëÙ“ÌkþÎs²Ý»×›W±àéóéÙó4ÞÙêÛû“©«ü‘'ÎëÉUÿx•…;}ûl›,åÛ™OsNæu¼» ˜À^ݵä«?�¦WÏ[˜³±€½¸ffõ¡�=È¢«X畃R!„BÑ ÂßÊ÷_â¡ß\Äõ·,ã7³æ²aËò6®á«—²ùÍ/¯à×<Ï�þ–š/zÙ²y>³ý”Q?»ƒQ]šTŸ¥ôåò›§°þù™|øÃ:ªZXÝÒÅ|¿u%™É#ˆ OÞwÕ�;²™¾>ûôeî¾öotyd6yyylÙº•%oþ“óËâÌîæ�¹K(o¶.Žh ›Ú»ZOáŽJgâÿÆýà/øóߟdÎÎ=éNë>{î_Ü{åÝôyäjzgÆa´0iŸÍ•„4Ìñ··ÈlúDǰ¤º€²ò:9*…B!„mî�š}š«?æ…çÿÉûÖOyû»{¸`T v›hÒ»ÝljÜuáÃü»G?ž¹s|³>y¾Êr~|ãÞËþ-‹¦¤Ò,!)âÿœ?M~˜Ÿ�ÍÅCº™Õlâsmmdm‰bЀhBB÷¿Ùk¿|‹­ê.æ|òY™I8w…­®]nâµDƒ©7ßÇoþþ§e¤Û;¹{­p8’=ùRî~»ž‡îþ'õû0~ÿŒI¬dö3�óð?f�zï³üþÚK8)Þv¶§Ó+!šÒ ;ðÕÝåÈB!„B´©Ö×üé2¾˜7�9 =œ;é&ŽMÝü’aOaDæ8Î8;Àª>g�§éºAþŸ½ûŽ�¢Lü8þ™-IvÓ{#…Ð{oÒAô‡‚ŠX΂ž½�н!ö³7슞"JU@àÔC¥‰ô^C Ò˦l™ßI ” èÉ}߯Wþpwvwæ™|¾ó´œÌi<ýün¹g4ÍC‚ Hþ�Á ¾þY†ÌÇË‹vPì>dò—¼­lðA Í‚õ(3½¸ Ûrÿug‘Ô8î·à`±ùØûzî½ =̛¼}”ÔcvM‹%ŒÞý�»¾¦ý“g^�À„—ßç™ÛŸ"aÔ]ÜuÓ5´?¡à`%%<*ö�]^„z~ŠˆˆˆˆÈÉvü-yÙdm_Ìî¨TZ÷>ƒÐ:6 Ž %:©1{×ídÛèÙ©:ûùÀ,Iã¡ hÕª>Ô! IDAT=žÀºf4±úßæžúwÒ]eTâ«•MÍâöšÁtw:ð?Ê^‡ŸÓ“1Mê\ÿÏb±Ð¡7xâIÖm©ÂÝpÔ§¸ÂèwÙX‚ƒxjÄõ*\9¸r\|7å#68êN*†GËøP¬žÊ“¼«,˜Çn39zã™Ï‡—ËY¦o_¿þ"Oÿó:¿9‘1Ñn>¿ù&”3î¾{èâ+fæ¨ÑODDDDDþüðgµØü‚IhÓ�G>ý’Ë[ޏ¤€a9¹ëÇañÄd–¹pUGXNÐíñ`ú̺ã�iRµm+9@Dˆ�帳š‰§j >y‹§ÆHã[Ÿæ†«.§‰QHr©‹§y™'ý°ßyÝâêXðØ\îJ°Ø±[¬Xt]ŠˆˆˆˆÈŸþcBˆoÙ÷/{ÉÜ\ˆÑ4ë¹§þ�„˜ÊÜ&Þ£t×ܸeù»ñ¥%¢LrY´tЗþœ8Žk¼ŸIUE?|õ�^õ‰O|ÈÍc/£‰ûÇ^ƒÕßÎø‹n㇓Gþ~Ýë]lÞW‰Ä9#µÈ»ˆˆˆˆˆœtÇßÈ–FçýiçŸÎâySÙ´ïÛeüÂÏ[<'}G� 3ïdVÎÊKK޼áâyL[¸‚ÜÒÃ÷aë�_ðê¿ñ¹´ O>Î�eâ)KgóG¯ùÌç<8öR:EÕLvaô6†G¿~�ò×>fÇÖ|¾úÝN¶äÑБˆP¬®Jùô|ŸÝ‹e3ÞàöÇ&²aÛ>|>/^¯Ÿ™Ï/ ßç�{îgÞNÏ)ØÑh:5Hƒ¼•d¸òqa»ø~žò.á©ûßdqعø,º¤çÁ[p„µȩËùð†óie?| k�Ïô-3Þ-[=ûmš»W³¦´€î HŒ¶éª‘“®^IÃêHeô“w�ë~—¥_ã’ ß!$¸ºý̬–H“øV M;ùÓVZ,�›�OóŸngΞ;陘Bh{7èfnì{¹ÿ¾Ÿó‡ ýûòØ5WsÍðv:$Ñ<ÊL1†5€ ˆ€£¤ÝId”óÈß¾ßDzmÛØî å”Î4Ñ€?ù³Ãø;ÎàÞ—;°kõ\æ,Í98¯Š Q0¨c#‚NEã•a%(z7'Ã�ë–qsëæ„Ø‡Mëâ1 ZöëN�~O’úýŠ*ªš�t¾â::ëèçHb·kyó--BNÁHFÃBónç�ޤ„ÕjqôV®gIú\–Æ4nÔVW¤ˆˆˆˆˆü7„¿jVɆqm‡?rW œŽúwy–ŽSäãô<Ò" 裕Ѥveäè®Ç÷ÕAÑ´=g §*zY¬V:_x%�{§œ­[—ðCÆLRšÎ¢W”.H9E¹ä/µ·V'�’ÏäÚ´H>Z0‘yÿÒ…_Yº‡eëßå¿Û¹§o¢u=ŠˆˆˆˆˆÂ€�_Dúuz˜žî™|µì?TyÿšÐô²uËû<µÉÊÃCn¥Sh°®FQø«›µ>›θ‡Æå›Y¸#ã¯ý(/XļíAÜpö›Œm”‚Ãbèj‘Sæ/º®@(=»�¡g­<壢x3Y•|ÿõûoàŒÂmÑ(""""" õŠSÑ}xnÊV¼V'Q1:±""""""§eø# ’Ô´H�Q‘:hIq…?Qø…?Qø…?Qø…?QøQø…?Qø…?Qø…?Qø…?…?Qø…?Qø…?Qø…?QøQøSˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆÂŸˆˆˆˆˆˆœîlàñš¸=&`ªTDDDDDDþò <^ŒáÏ„¨8+_-ÉgÆ’|•�ˆˆˆˆˆÈiÂÃþ¼ÇÎêð×¥»“î—Dcú|*‘Ó„a±°˜LÖ/ªîöišà3MLõø9}Â_�œ§ _DDDDDDþ(ü‰ˆˆˆˆˆ(ü‰ˆˆˆˆˆˆÂŸˆˆˆˆˆˆ(ü‰ˆˆˆˆˆÈ€Çí¡²¢ŸOÓ}Šˆˆˆˆˆœ.,�ÛSþ,°fþzvÙ¶‰©õDDDDDDþò à /?�¢ùn,Aû[þ¼n/}ú  Eó*!‘ÓĆ�˜6ó[ Æ˜?ÓçSɈˆˆˆˆˆœFjæøú[¹Ã€ xn8o$7÷?ƒæ1þ¼ ÇsÇÜËyã¶ HŽôûà 8sÅB^yøŸ$ßõ-ÿàßöùrXðÅ�„uH—¦!‡½¿ý§Ù<÷ä§t}äZ�ÃÔÏßáîÕ™P³E×/†Gÿv·W‡?Ÿ»’MK§1ñ»E¼¸d{õ@ïŽ�5ìo\Ñ:‡ÅН8‡/z„þ‹+zF`­Ç‚}‹§ñôs?0äÑ'«÷m¿²¢\Îÿ„7ç/czvñþ�šÚ‘G 㮳[ãð·àPÎêŸ^áÛï/ååû‡gµêN…¿?ï§ËÉÈúš·–´à�wÚ“bܸ½Ux­�ùòíë93Àï`°4¬X¦‡ìkøb}>co{�¹­Bñš>6Ï“ §þ ÿàpîØžèÐÚ_ñOz\sßfweTdä!–îà§o?"»ïƒ<Þ-¥vëÕÀ¨ ÕåRE…ÏŸ«_Ï—÷ Üw |XýüqVÿ—Çëá—E³Ù’0† ow&ÞiRZ˜Ã‡oßÏí¯�üìX‡:‰íÚ�‹¯\ϳo~NŸ®cIó?¾ËÍ473uÚÂ{]Íð–Ñ[Ýåì^üW}µ˜A#aw¯xî–Íy‡³¾|¿øg¸«K(ŽàæŒ>o�È—KÎæÆ3þDDDDDþ´ _*‹óYöÆëtøû¢b‚«C^e•ùì N¤yHa!!„ø Ä¿fj nÏ3�ÝÇߺ5 88˜°�PÚ¹‘ mJyam:¥¥U€AHL4g_Û–×ßø…üên‚õaº ÉÍ/¤¼¾CM»6leîç>®¹²5�~|ßCOq9žºZf½lZ¾ŽïFsŨÈF…ìsûˆ‹m@jPðÁ² &(À﷋ŰØiuö?˜tešÇíß.19• G\Í�ªï™³Î³¿ÑÖJ¯]ic™Â' Š9®"4=¬šöoæmkƨúP³ØÊËwòæÌÅôz6#."„ÐØž÷7ÞïÂÔY³Ùêö~­zѯC?Mþ„ô*Ýè"""""'/üU–’½i%«¶ìÃëñ²oó*~ýu+V¬`õ¦=‡Tð½”gOçŵCÔ,‰ ZÃÁLÌ  B-Go­‰kß�v[­ñ\V«•äèHðšǬù×h]çŒgFv9>³~‡å^ô ßó"+ ê÷9Ÿ+�­K^aûù—ÒÍßQ;€åídõÊýe³bů¬X· ¯×W»ˆömeåŠêm~]Á¶ü*ª²6°|år \Õ?â¡4}-¿®Û…«²ŒôõkX±b%Ö¯eýº•¬Ý±‡²â}lß´š•+W°zk>ø 3Y·x"•ޤ‹½öX<Ó0°;œG=6»Ÿ[·&¬ÖAÙ ˆ$.ȃÇ[cÈ`jZ7iÈòé²­ò˜¥F̟ٞÿ=ÇŽ¢ƒÍZëºðîÛÈ¿ÊÓÙ"‘˜š»žL³f­Îý•E»{‘g4#gÃ÷ü¸¬HwºˆˆˆˆüÏ;yÝ>Kö²ìÝs¸Ño2S;¦3åÅQ<³°º>àn¦JÇþ¶ÍìÕKøñóñŒœ0ë·M†=úׄÿÀÿ=éàço"*Ü žJöÎG§ŸÎbÊà0¾ÿ7ÞÛW�<›ÂÂ9|5wÿgÇ]=“q@³‡fõ](.ØÍ’�³4­{�R-+§²ªœµë~æs÷LÓÄâLaÀ™íˆ<æñWQR±‡�yi M±Ô(âtlÂû«·²)š6>Êùs³lÆ{|íͤžÉXê(t+µç¢©Ž£8ð·”P\R#vêM7Û·ìÙ¹ŽÊžgÔj9Qø;a¿dB—¾Ï«™qŒù2‡» {¾ÿ˜qO<ÇK_$ÛüFZ…‚ÏÌfñâ|š $(¼fí߇Ïí#¼x¦oÂJÜ-–ÿÄð îäúvÁX�BL•¿ãµ}É<:´ ñ�5­1¡D7íÈîïÿÍž«’È©î‚é¥Â³žïéÄÍÁþØü\y6Ë¿{“{?²153‹ž~v Kóß™FNu¤)ݾŠ/^Ç««üynöÆt¶KÞ~œ—¿Xqƒ0~KV†Õ ëfòò†Tn˜�ΓN'6«˜Œûì!.ÿ¤�»ï}ˆáÝ#1mAØ­^J«ÖóŸM]˜d«jݬ¬_3�‡V›øØGWììÇ#. SÈ‘�¸²¤�õ‹ç“Þý<Î�¨Õ¤Ù"gáRr6n…Æ��Xf…E yïS+�¿Ü‘xçá—¦C—Ò,þ“½�^-ý[¦.`GN6ÙÔîãêlE‡Ô ¾ÊÜIfÙ4 Ô /"""" '-®ß–ÏC¯¼D¿è ,@Ä7s×¶U\¾`#;¶Ъs8&;Ù¼/ˆ†�Q„Õü¸_}ÿïV~=§ºmÇð°}ã^yoß{™¸q÷pQÂá»ìó¸)]÷ 7NZͨsFЯCâ!­„áD¦à,Χœ£÷û4Ý.Š]îßþ»ª´w¥—’âbŠm&&`Xl8‚9ââ>ï®ÍÌïÔ‚í5¶++¥tׯ”u»š^¡±DY�(FÜyØl@›Ò¿áÃwÊøÇê/¹ªeæßñ4¬æÛy‡9,Ïeè÷Ú g�/vbó« 4<ŠÈ¨¨ý/z\¸wmbqïV4²ù×.§ÔÞ¼üdÏê¦5ÃÈfÒ‡Ÿóææâ ‹!î‚^$Ö‘›]Åùü<õe^ÊéÈ”«ºë8䥤’æç£²¼ôˆåî)/áëÇÞ å–{hÑ.¾ŽþÈŽöÜ|~"ÿ÷ÑD‚Cîä¦V1ø[ËY»j./}³‚=Ö C>a£yóHòs«¨òèf‘ÿm'w³’øÁc8?5 Æä Vºujˆ¥ª_Õ�A_&¾€PbœáR]·ZmØíöý6ÍZ÷ãž1ÃiA&ËW¦ã>ä'++ŠXùÝ\7m;^Ì5CÚzØŽ‹³|»�1æ¯bËû´ #¬ú/æüÇ™÷Þ¥…ZýÚ�[_dãÑ L/�iñXý_Ž qÇÁ4^r=M^ÏÆÍÛ)(®Âj³ía® Ê·®bÅÙ£8«¡“š=2mv;={´‚CCŒéƒÁ£¹¨It­àwT>/~�±ØéiX±ÛªËÞnÃfKfÌ•cy G“×ï gÏ¡?^ŞݻøäíÇxÓu/_1”f !‡·«ZâIrV±¯4�â:w¨Šì%o3ÅuçvèLävÛêç ýÙãõ>I,xãnbÇŒ"ì²›¸oA½{µ¡¡ÃA@�Õ< à )9ž9U”—èf‘ÿm'·åÏô Æá™²¬ ¯«ˆ«÷×&¥&�äGnVE4"ê@ðË_ϧ³²ÒçêQcÐ(âwwè´ÇŸÅ?þÈ�éWÜ¿|È=ßy¹êÚ«iº¿åÏæ'ñx¾ìÐ�ñ�¢ÃYcy1y ¿¼3˜WGóèÓ7ÓµÏ`ÎêÒ«Û‹7g±í®!Úb«+RÖ4ã"ÁZ¿EÔ�ã,)áwëTöþk/•¥…p ô«Êعé;&LÙD¯Á—ód«.4 =FAi¬åÞ_y÷­èrÑ«tL <곊°ˆ4.½|,íÏDI•‰‰•ð¤Dö®�Ë’•�œ ›ZDDDDäÔ‡?À4Í#„ˆCÂPE yåE”Žc}iq).·�аp ôywðÁG_°5²7·_Ô“d‡ÿQâL9E®ã¾Èä–‘#éØ2‘€£•«™Ãžb7uÏ!šÃó¦±6j$o NÁïxzH4mÛE|¡r7k2vP‘Ö“3F­}ß�½«ÑC÷ºˆˆˆˆü�ûSÖù3H¢Q”‰Ë]U«§éóRYåÆ[#@ú|VlJgg™Itb|õ5“E_ÏdAYF]Ú�T‡ÿ1¤€}®�”…§‘t"aÖ4ë—¯,¬É�鹯·ÏóÛGM¯‡ŠŠ*|¦‰#2žÄÆ�8ëÌk¸Öù) ×gAh�=Σӧ¯2iS!•ރᮼ|¾êÑÀgµZ0|>¼¾+ì٬ؒšÐ6··Y;`zÜ•Txj¨�òò,fÿšI¯ØœAû[å*\»xó³e :g0Z6 àX³§fî`‹;€˜àhB ­»~YÍg®dÈØ¡D+¢™xÝU¸½f�kÆÅšµ¿2eq1ŸÛ… ZûâcãÆš$øá ÕÍ.""""ÿÛlÆ�F�;˜<µ=›ER]1¯ÈÏâÓÙ?ѼcwCí¸Ù²þ'ÿ`&‘=F3´{uk�o'‹6dQi‰Å³'›tÉf&ø‡Gè¿6ËÂbJ2¶Üñb’ê›wMU^_=ÛÖ,øÛ[ÐÏò( ŠÿNS3‡®]ëyçýŸèyÑ@¢B솅ô{ٙݑÿk�8HIêÏÙ¿Åø¿�ÆxëuÎM´byLê–X=õ ¡‰iñXw~ÏêÕ i›Ò… ¿’b�ú· _ÖëÌ/»–+ÍÐßf#]ûŸÉ|ZÙ•ëÛb`YL|cî‹cü°ö¤Eì/\OÖ¯¼™/”—’“•yØ.†á Ñ„T±Êí™9à KJªu’<%»øõ‡±Œx„Ëš{w;~œÊR¿ÎôLqbâe_ÎÏ\÷ølZ_p £’kÍ^j²ƒ�;¬´hCT°nvQø;!¦éa'U˜ÕÁËÀÄçÞMŽ¥Žtâs“»»_õ ë‹Aû “óx®<„îïh÷·âZL¯ÛÞßß=Ó4¡q_Þ¾äFºôéAË5û’òJ ™±úcf|÷îá¿WÌmϾȄ.I8¬P–ë"{ug=Ü£~ öam<„ûǘ$;êó) AÎô¹&™‰¿ä3¶¥,øEDÐÀ±ˆ.ín8¸iç[øø‰çÒa‡Ç¨ÆÍýàÇ=~;7ôlT½QO^š|?wSùôÑÚ)×ôº ÂWg(´6Äc—OgøM#xò&H}èg6=Ø�ˆ°$z^Èœ¥ŒI‰ã@úK bÕKw‘öbEõy3é9üv>Ö˜vîïžk‚™—KÎÞÕ\þìrðx½2 ú¾ÿèVúZ  ’Õ›všØŠÖ­ÎíjzªØôãdžÿO'^y³ þÇ1[�ÅŠ=ØÊC�þ�m•6ÀMºòÂ�·3¼[3œµ/gc÷:ÖùâÜðȓȈˆˆˆˆü¯0^jý¾Y–ZÄùO¤eËVÇù1/e%9ìÙë&:9�?¸ËÉÛ›M!Q4L©µ@·¯ ‹íùnÂ"bö/NŽIYážz!ÁLâÚ­´í‰ùûÈ+­:øS~A$FGâ°×mžR2÷æSáö!™DÆ’€Å[ÊšyoqÅSåL�q;©¡�Ìø/Óź…“¸åŽ­<¶àaÎ ÄÀKq^¹e¿M(ƒ_(IñQøÛkïUaV:yåîêUü‰MŠÅóõD/åû2ȬpÒ > ‡ßá­šîÜ]¤î/O‹#†Ô„,³dÆ[Œ{­‚çgÜCÇSd–�¾¯·ï·Žªø…'‘Z;Ty‹ö°£ âÈ•%€¨¤XB ²—ðÔC“Ña/ÞØñ·^«¦ÏKaÖò-‘$Æ„p\ÝYM*+Kس'·¹¿¼¬~�DÇEtØ¡—°è�G¿4�‡^}”nZãODDDDþ­_¿Žé÷Ì'pg艶üY ާQÍ®tv‘ ÕÙÂb O¤qx­x€ÓÍùwœÉðw0¢c*�Ñ�`±•@xÔ1~ÞDƒÄ ãÚÓÒ¼|¼ûgÝ1�h§ó�›øÃpÒ"­+—v›ÄÄÏ7ÓåšöøY¬„DÆrÍPa‰)µ×@ôy)8¬`­8bSir”ï±G%Óø°ò ¡sëî Ž€�¾A»Ë›ïKé'%9üØg?4ŽÆÇ5†®”_–,âç͸õ…–µ†++áI� ¯_¡âïBJJÈ1·ômY̬…«i{îËtVðùs&|0ü‚iÚãïÜ÷5o,ÝNn¹yÒÃ,ËaÛ—÷2%é!þÞ½ Aö?vÎGKƒöœyÉ�3ßäÛœ<*ÿ‹N¼µQoοôöN›ïó ©:Ù?àó’¿z3>œL¿» O`Àtd&îÊí|1ï ÖÆŒâ†‹›`Õ}.""""òçLør€#.…A7Œgåºm¤—¶ ÊqrwÇ[¶‹íq—òâ€ö$Çü)ǘֻ×U‘¿v qQ'°Êá©Óâì¡\ï[�kãvJzv<¹ãâ<•”»JhuÍ‹ü_ïPìØcE¹åGfÜyCH´)ú‰ˆˆˆˆüéáüHjÞ…¤æ]NÍÁÅtføvÇÒcÀ¹')×x ðÈk)Ö_úœÓà�Z'‰ÝÏcä^ÞV¢[qΈVº»EDDDDþ{Ÿ7‹•�!O“Û5ˆMDDDDDþN[Vg(‘N•ƒˆˆˆˆˆÔŸEE """""¢ð'"""""" """"""¢ð'"""""" """"""¢ð'"""""" """"""¢ð'"""""" """""" """"""¢ð'"""""" """"""¢ð'""""""4Ûïÿ wn:ÛKüh�”@ ­˜ôÍ{°F¦Ð Ò¿Ö–U¥…dffàò€gD, "ñÓyùï¦Ïdë¿?b†·?cS,ÝÂÔw§ÐpÔ#ƒ< IDAT4ˆ<°•�òÒmÌÿd6³¿›ÍÎbð§aç38ûÂËØ2‡]'CDDDDDä¿7ü‘Ϧ$uM ¾Ýû(r6¡I³ƒ­~>�›_Mä_sÝœ;îl”eE,x{Ÿ½f'rÂÕt� VTù¯fú|øL°X ÃP�œêò6MLŸÃbÁ¢"ÿsÃÞÝì.ô#9"€-›wà mH|�¾œ^ß–.È£åˆÑ h׆8 2”WÜÄŽ'žcÙÚËéÚ'‹ÒŸˆˆˆœžUX½’gÇ´#ÖqžH£ˆÕk¶â�Œ3>ᨛºËóøöƒgwÃW ûìþ1²/aGܺ„õk6óÁ;ÏâºàQ&ônF¨­îÐWX�KNÞzþù⇼•QòŸ_ —öÍÃC;CHÍžŸÎOŽçº7Ö2òþ·¹÷²N„þEÎ�éõPœ¾ŒmáMö_†§PaÖrž¿ò*&ôçÅgîf`ó$ì@UIÓßÇ¥?�Çf;â`ô�÷òÜàD’¿]y™lËÚÃü¯^äŽåÅ`Tßã yþÊ‹8«uKZ'FÔzãÞ4Ÿ7ž¹™{sFóí³wrfÛ¬'á™Ê Å.Ó祬0Ÿ‚J ;Z‰+¨!±Aùäeìbkv‘m¢ÈÏÏÇ´câoo@ÏÞá¼¾d5Ûº´ cl0¸+ضò߬³ôâÆT5ኈˆÈéÉç£dÕ<^¾ævö\ÿ oŽBlu-.÷fÞyçî[šÃ}†3ûúVû|ø¼V/x‡^¾�Ô#y㲑 Nõçwõ24MÊÓ—0aÊ*�s5WwO©³5Á[ébÍÂ/yì³iL-‰ã�kïgH¤Œ2¾�9…ž˜¥]‡òðßÎ¥]l(VÀI¯Ñ·rmnã'\ÍGÉsÓ9-8íò_ñrn)¡m¿xbŽ–ü*Èüa¯Þð 1}˵õ9Bðó²sËZÖî\Æ“oÏágO·õ$W°qÝ,z<ôCG?ÀÂ1û[Œ ƒÌ_¦rɼ‰ükesþyÉ•\Û«1�þÕi!¦)ƒ®|˜¬¿Š{'¾LóÖãÙ- ‡îÎZùëW^àãÝ±ÜøÌô©~^ŸIQyXRxâŽáôv6\ÍÄÀ—DС�ªù;˜úékŒš»‰¶g å‹{;ïço%Û×Îaô+OA“̹r$ƒÛ| à×ö<®½3€ÍÇpý«Møê¥KièÏï�L'þlþµïN#\x7. &¶ ý»tÂ’ÀªW{FWº¥Õè÷i†ÐöÿÆ2rÊ;LzûuG…Be9[ÒK¸äÊÑ´‰Rø‘ӒדŬ·çÓ˜k™e_šúýV�ËÏÎ`ÝÞ8>yõ^†FXÝ5Фc£RÎÐ/¦ó¸/„„ûΣíïxôïóíà“Ïf3?¬-³{¶#Åi?¼"éó�·r~þ ³l½™;á"º¤$nðÑ2µ9=g¾È Ùs°Å$ðúˆ^Äí¯NÚBSvö@f/ø‘_L§WÛôhpz�Ë}Ë7±³ÐJ¿¸†$q²BWÙv¦¿6–¹=`õ˜n$ZÑ5}lç«©³ø~Ãf&eäƒÕÞãÈðAMXü«¤6nDlàÁ롲i kÛLgð‹s¸ã_³hÙîú‡ìjÕˆ‹¯;Ÿwzüƒw¦ ¤o£‹i寴:ToZ±€©3¿¡Óÿ½Ëؾ ¬y›&E®2ð…Ó²C'z…8�?„lgA†� ÷¼ÅUm‚  ÆÏØ�tn݈ðÈ™Lør÷L¶}3}ä?ÃBXóÎ\~ße¼ÿ÷Ûx÷ìîüó‚fXghú��‡yìÉs�(É/¤ÐÚŒv ÆaO5ЫШ°!Ͼ2vì #3 OQ6r‹(ö(ù‰ˆˆÈéÈdÛ”7xnú^Æ\3„&-kuݲĵäÅñ·rqr1¿?ƒÀèFtì8ˆ[“í,ß:—i?çüŽýð±máÞÝVÁ-úѶe\�ÝHÝUY¼?m³ŠÃxpÔyôHMª~û«�a‘1ôv%�$yùjöæá®±ÏÁ]/cì°�l�?Ÿ%¿,£ô4;—Û·çQæŒ#¡Mç#V¢M¯›õMàöY øÇmç“”rX‹í÷“ŸæÒGžãþù¿°ºÊ�†ñ@üñŒÃ ¤K›žtiÓ¸Vðð‰&­ÍùÜ×Ö…Kxõß»ðzkwOŒh />u?=õóödQaê(ËÜÁ‚Ožbneo.¸raÎCΩéÃç,¬˜Ô«Ø¬ ûÐcÜqF±a‚ßþûÅ?0žsºvfpÃH6e¬cÁ²Õ jÎH:÷¿‘Ç/dÁÄ÷X\éùÝÇZÿðgš¸r³Ø•‘Aæ†ÍìÌ+ÂðV�™¹�6�á6pge²+#‹ü’r|€§hŸ=ÿ™iø÷�Çxúé§yzÂãÜ;º»¾z�Ï~ÉÀãÓÕ'"""§×V¾ýaé Ïä¼]HªývZb¢ÂBkMþRSBJ<ÝÚ¶ ØSNnf6'Zõ«Ø½œ7æþŠ;¶9çtì@Â~ϵs“wU@óž\Ö$�àÃvÌ ((‰ËÎé•«™²¬¯§FÎj£ç%çÒ'à?Lœ½ŠmYUœ65<ßfVf®ÅšBÃÔ#5_ñZ¦M[ ƒ¯bdë4Âêh\«(Ëg§/Œ+ÎÊs÷>ÈûWõÆéw<áÏÀfµa9Bë�#ÀAïömÁô°!s/ûK�Óà¤Åå·r)óyô•%亪t�ú*Ù—õ ß¼¿…æÜÌEi‡=8q{÷±+×€è(’ Kýº^¦¦Ñ#(ÿ#œ^KB º4O%ÅWAz^yfíóÚ´�‡ŒÁ¶á¦ýktø3M“²œ]lÛ¶�E?,g[I,±¶l]¿†µë×âdÇÎ�lÝ–Nnq9&�³ô[–�9ïœA$FW7¢Ú4è1„¡ý°lÆOäx½ºøDDDä´’»äg~Xñ+íÚ7#±mbý¿À/GPa¦�ââB Nd'¼e,]¾‚E»Kèßg}Ò�¸é¦5ëÙìµ0´Q2Áκ7²ÙñOkÅù˜¾rE‡Ôᬱ=¹ðÌæl˜ø‹ÒÓ©ð�ç²2=‡ÝÛ·•Ò™ö‘GÞ.{ÞT¦¬)aÄ€V„%EÔ¹M³n#˜ø÷ë¸ìHÆGâw²²†Ÿ˜&!A�>HÔFh@{λ>�ì‰Ï0=½’“×þâb×Öåüðý¬ÊøëÔë=® ¶L{š¯Ifø…í±ØOi>ÓE¡ $Ì08¹}D;pX¼äºJq¹}?’N©-iž�ËÒE3YYðû~­Þcþ ‹…è–=èßÒÃf²Y^ÉÙýÏÄY¾s× üÚö¤—˜O°JÙ°)‡3™€ Cþ±ñóÃ�#+›=¦I‚þ!"""§�<–mßȦô`ÎÙ‰¶á'ðU•”—–QœX•ÓËžÌuÌüÏO4ƽSŽ:ÉG¡Ë…¡ëQfc7°�„: ÈÈd“é#¶fø³„ÒmøÙ0ñY&/Ì`d»4�õ_ZÀã*aÅ·óˆèt&�’Ž‹•ð¨h¢ê[=®(&}é·<·+”±çõ#!øèU¿ä¨HF%;òË©:jÿ2>Ó•™lÉ=¤éÈj%¤íù\ßý¼·»²þÕz¯‡�_<É=÷ÜÂ5�MfwNI™dì`Ò£WsÛƒ�1áíE˜f}›±Lk]ùËFlÜY h Ù+–‘y‡^†•PgÌIY’à¸TðÓ·qÛm_°£¤˜•ïßËõ·?ʤY_3sÆ ¦Mý„gîÇ-×]Ç?¿ßJ©ç�c5}¸w.eþ^8óÂÁD:Bê˜ÉÄ—›Ëz«>•UUµþª¼¿·üòÈÈ+¢Ðg'1$”�ºv¦Wó¦8v¦“‘›NÙïøµ_aÏå¢(§€Ä6ñ/®Š,²�DüýI”­œM‡¥oòö¤Ï·#-!ªÊضàÞù¹œA—w!ÎbEDDDäTVŽ=žòö•á«G×- �A¡„ÕofÄ‚Œv,�Ž=ôR’û�ÀîzIÏÊæçmYÄ6¦cûõk 2½ìÞó#÷~²†Á#nãÊÆáÇ\+0µa*IÆr~Z¿‘‚â.˜¡á‡/>mz)-JgC‘#À‹ç°Ê¯?ÿF´ê LŸÉ¿Ë/ãâ0g½Z «�FÃîbìÆ,&üó:†T|óìHbB–oö.>¾£'·ÏßÇ�ãž«ºcÔ³1ÁSYÉçoɨé.âýˆHî¸w?aTóÚã¾Ì’ò·¬`OŸ~´ð;ò‘ì^—Á®Më‰k9€¨Ä?°në­`_~!+f¾ÏÓ¥1Ü5æ2ÎŽ;¢ò‘ANR›„2{çwüœ~É�þ·uõ)_ñꕼµ­-×^}/ç éL�ÏGUåN>~äž}æcîè#nÇû\šqp‘ul™»€­„2´…{€Q翦×ÃnÓ뿤ÕÍÓª”�Åô0èâGß#Š�°HBê}›ûpmßÎæŒ½TFйI3’ëÜÎJ³†„¸Wðã¶lÎ/†F!tø#€¤ÖçФ�‹þÁÑ O�óð£¶Çt㲫]Ä,þ…7º�=U`#¾mO.¼òR†÷L=i«Ö‹ˆˆˆ©¢U”7“³F±²^ŸÄs_á¢AMëõ[eE¤o„�¦Mh[ÿ Z‘³�y³'óþ^/gŸ;‚sÒêלâ-ËfÞßð]ÞÌêÝ‚`DZȵIWÆ6žÃÍkÖñéæ]´LÃyHÍ]�ÎÜ©sYn³±"`³Ð´u;˜>—u›LÌXêÝßÌÎyw> ~�<ñôµŒñ÷ñÖC#IkFÞö�Lzàn›Þ€»ÆßǸë×Y=vÈ´Òú’ç™r®˜ÇÄÉß±ôßË9¯yOjÖ­K *Øòïi4ø –#µ‡ì¼"öîöÓ+‘øðSw%»rw±);wuWA£t3Ïþë ãzñõ =éÔª áGyVî :µ¥«÷‘¹½ôÄ“Ä�9Â�e±×v5lË}ϧÊÜ¡úE��M€‘SÌBpX>]½º~³fZìDÇÔwf7•ž ·CÈYÍiTÏA]Þüµ¼?ùnX’ /æ‰!­ ¯g«Ö¦¥3x`•�{Gô [BØquA´Y0täEÌßñ/Lþ’fù… Ñ— Cù[1õ‡üTÙš›­çµ­G‘þ6"šwV‘›kžðŒŸ�QqœwóÕÅÜôúÜháÆ��øuÚó<4§œ›~„{®LDè‰-WnµÙi7x8íwß(¶nYÅK¾eÕ=éwð\Uldñ¬Î…q¤©Y)§¬²ˆ²ò0šF5$ñ^ÉEÛs뫟²°Às ÅB`£¼Xýýq«8"CJJ#´r®Âàd„?Ã0öç£?a8×ð[îæœöQ‡í“3"‘Η^FòäçÉùõ?lcí9þòÉÍ­‚f�hj& î'„&´ç‚„ö‡…ý^ºri»™\öù�<8éE0oáæ>� =Žç•{˜:ù3^^°–œÈ^||Ùí¼5I£I`8Ÿäá­ª€£Œ<=5áïG“Ö,Zÿï‘?��Ÿ-ÚüSÌUQîÝÍ ÈtÜãýLLö®žÏk3¾æåu{IípŸ_q.íãüëÍŒ¥¼?o ›t朞ˆ:Οa±’Ô¢/ßT…óÃ/yxú'ÌÝòIÕ•ùâ¼=…væoWufÅ»‹�p,uUô-ŒÀý•Óì¬,0#8ÑYM£b9ÿÞW â ®Ÿô;¿v�[”ËÐ^â‰Û†xr*·GtçÌ6-øpÊF²Öl‡¸´ê:~®]‹˜ÂYÜm?Êx¶2Š=û(tÙ°û;ñ;…WWtûÿcú+ƒ~ Õ†a°hÖë<ñýî~s=mÛŸÍs#úv„+ÏjÇàÀæ*§"o/�RŸGäç|Ë‹M¡ÝR#ø•±cÓ2Ò˳™þÒíäL³Ps¦ÖœK.E�æ§¢•1œÝ’pÖu-ÚFµ¦�á.£¼Ö›{É*¬€ '‹­ž�Ó6¢c’ˆ8š·JöÒkêœ5Ÿ�íbé|äu MwÎ{oÓÖnekd/¾½ërú$½©Øpd³Cv¾J× ‡?µ¹‰ˆˆˆœt&&nª€ðääãÚÞSUÀ¢¦pÃËðÂÆ"zv— £kJ–zä&Ó[ÄÜÅ‹ø>ÇÎ9½ûÑ+ª~Ïú-'í»žÇǯŽç™3Û’d˜€éó’xæ�|zÏ¥ôpX©¬tƒ=�´è:vÎφ=1…Ž@U•ûw—¦#4œ³îx‰ûºl`É–_Ù×û.žº±ÿI ~Õñ�>:Ó²p!S~ý…íÅû_uWzØ6ç=¸~�ýC8Ê øL>§g\â)½ºlþNÂȨþ  åìKïâ›gÇqIl“æ}ÀUÓ×RPy¤u6B·ÇæçÃôxNƒû­+�Ó,Ô=§�Ű×}ÞL7U/$ÅbuŸØ#%ÿ@Úù?Æø»¶³¶¬’ºç€1ñ¸+Ù¾d7<5‘çÖe™Ò‡™·^BŸÔXü�ÙZšHjlTº1Í_?ņˆˆˆˆœôðGu»LU¹ë˜[ûòw2ÿ»ÏòñnÄ„ágqîàÁ´­÷Ã}/»·®dæ‹°4ňþ�O¬BkX�dF_u£{×Ã>÷n6ï�­šÒÌRG�Ûgb–—S'0çáòwná“qçr÷²Þ ëÈ®7sé~Lzl$)‰¡'/TuÎßz¿Âß®åÎáh‰Û›Ë¯?æ0æú$üýŽyÞM�oEù~ÅY,6BÃ2zÔ%l}êM>š÷ŸöjÏ��êJDnª|¸½ûSÔ�•ˆ˜!<öÆ�C^ßǼ)ϱýÇRοõîïÿGÎujp¢+0˜&PQ‰éõœðoûûµ`P»>üißm¬bT°’²ÜU9ü{ÞlÆ2�½á\}Þ¥\ß·/�o¿€r\•¿ÑL…?ùᣬtßÏÙLe=šÒL‹“­;Ó²q}Z°ãg‰$ (Ý›sôM÷mdê—rÑ·›¡I?¾>„3»7!ô*³e…ügñl^/iÁŸA£S1öÊë¡*{#ß”ú8³eK¢êZOÀãÁ“»—M@—˜¨ßõs¹[×1iÂmÜ>Ç�;†¶dÙ§Oñ�—àN§ÉÓw]L£ä“3»ŠÅEïGÓ²Û{|»þZ§F`æÏWKúsý A8ŽöéÖ0‚ŒJ* òþ¤kÜF\h*ýšGòÞò"Ò³J QD�A¢Ô[H™Å¿�“53�‰išûÔiþ5þI0‰ ñ‡½ù˜UåÀ‰•…Å€è�P0‹êîèóe1cúgÜ>i!¡mùà¦aôíБÔz UÍeO~%¤†a±(ü‰ˆˆˆ«rZáÚÀ[#.á§Ø˜ã^ƒ-?a“Ÿk\ÏðgÅfääì&“¸ºÆ¼¹ÒùbÆdn_˜N›6xrÔ¥9±[N ´ùÜäíø‘×f¯gè°'83ùÔL7YUéæ—Å‹(·4ch»¬uÍØîöáÛ“ @ppð O’·s3?y/LßȘ›_á¡@ü?ž�²}ŒyçY<>xå�KHŠÿý-€†ÅBdã‘\ÑwÜÿ³w×áQ\ÝÇ¿³÷„HMð¢E h±R§^êú«ûÛö­R§îP¡¥5 P !¸ $„�÷d7k÷÷t›°bTÞžÏóððìÉÊÌ=³sçì�¹Ã_¯åÆ¡qý–Âæ1ƒès’k7M˜u~X4+e”ÁÁV®×ëð1™A•cµVõÕÕTRi4`ðõÿïü ° £�\‡4éÞŒ.·›ì¢" ”¸°cO?-gá·sùÏ·ëÉŠÊÒ«Îg`÷¶ø4òÇ•›Ïa»üýÐôMU•âO!„ÿzB#¦òµÍÚÈÝ4ô†Æ2™ 0·¡uȶVR颞™¬lܰš÷RvØ*‘Ç.¿Ž³ÚšjãÃ1Öó1Ê­°W–íèÐ^kÂ:)ÊgñéýçpÏ"Å´›_ã�ÏÂÏçÈi—¾ÁaLùï'|¤»Š‡Þ½�óªuÌî"ZE4s5ü-Aœyá4¸iÞpqk÷Ò¯ë`‚BCO2e�?Q„E8©©©Âª øOŸôRQa­æ`a1è|hsœ‰k8¬Uüý oó¯Ý#h´¦C{ø±’J§W“Š?…ÕšÊ�[àÓ™ž1¦Z“)mXʬ_·’Ö•o.¿�=Ú4é;¢Êig@l+L~~M^g™ðE!„ÿžƒ=Í€ÉlÆÜ¨& úÆ2…˜ˆíFîÁdÖfÔsÈXRÀ¾ÔU,¶é2äB¦v04c†üj²VüÄ£yA<>r­"8uGYáN^›ýºpÇȄ֨\YSɲÐ5V×èõR.7¹k¾eýA_n¾çi^¿¼§ðû�% ˆI½Ã“ÿw)öëùzÉî¹¾ߢ†]É��vóñ—/2÷»J†t�"*úä/mîCD”ŽôƒÛÙ™Óò…�Í^NY¥ý¸Ïp»ÊIݽœ·”Ózc»Ô?=Mqvë`ˆ¦mû–+”rQV��ËýOÙèèÒ¥ ð#KÒ˨²ÕÓ¦î ŠË�{˜ÊBV}÷#ß8LŒ7‚áAAŒ®©\–o߯ê2�©=‡0¨O›&Ç÷¥l!ãp�ã}ðmÆ�²Œü !„Bœ>1ÁÄô›óÉɨ€NuOK,·9ØŸŸºP“â›õY•9øï÷ÛÙe8ûu"´©Gxn™iìТèÙ.ê�ûžÕ”³'}'óú‚gë¸ûÜs˜�Ðßú+7jŠ×±&˜:‚®zs£ QM¯'aÂ�<Ñn(~q] ô¯VOßÐ&Üò8ÏuÓ«{´¹ÆÑ@TÛœ~Õ9|ùÀkìì4ŽWÃkÀ+;·¦M»Ž,É.£ä°Zû´à墠`#ß.,¥kbgúôëBxí% vóÓ¦�¼ýÑO¤EõgÞ´3è^ßõ˜Ô�_y�ë!lü`ú„·ÔòùÓµÏ4æü6‰àúÄwTÓ4Z 9�|Åæô2œ5.°Ô]v§3ŸÏçþL«žýèŸÔ•vž{JÖp #�ô”Ÿ¸fi]:æ–‘= ©}“÷²J*ŠK(6šiß™è&/i©ûò( îJŸèh"ÌÍÙº…B!DËóï@çChï~›¬´u”�SçVÚ—›r« ÜVVüø!ÎÀ0+�….½NgTïvu¯=³å°pár6)®=‘Ä fÞ)å{sÕÒj.ìÔÿ£#iš­”õÛ73·"œî|”+;Gv¼9'Ün\;“ù˜~n?Â|,M…ÔÍÄ÷î{ÒçDµæ´¨–M�!0–¤¤³é÷;ÚÄÛ©a§†öe`çDf§ìçÐÁ�XOëCK–šÛÊÛÙβ IDAT×ó>"ei,w M$Æh8Ú¶®¼4îÛ’E·¤),8ÿFu BWßµ£ŽJJsÖ°¬.?‰h­¥Fþ|‰MèKlÂ?è;ªé0ÆNáâÿÇKR8|k"‚‚êž©¥{—qû²õ\Ù¿]CüКfe{z³ö—1®çdž¾~]BƒëÞßÑîÀUcÇê¬&%å;^:è{¹p”ÒÑs(“{'\ûk\º›mY‰è}íã{Õÿ£‹B!„%#§%ÅÑ©½Žm»×²³`4jÝOÓé mËeÄžµ‹å'«ËôAøÇ÷¡îuvïÞÎò½¥ LËäÞÁÍ»¹¸ÞH`ï ¹aó m+á÷¹\”ÛIôè»8tFWƒ,˜OP/8ølÖð›Æ¤îáø˜µ`î tïØŽ!g_@› ^tëÙÐCfFíBë÷~fUún&Tô¡Cƒ.CÔÅøÖa&ýq®Ë2Óz ‹gwà³ï¾åû»Ù[{k3·bîs�3©• £Ñ„á89*/® åã™”rƇ ýÍÓ£3š‰LGoK+,ºck7#¡Ç2¶<ËqWDCoô!vâ8¢B½ŠxS0ã/˜Ê7}Ä‚½×’Dí»—M­¹éžü<‹²Pä9�WáðéÃÊ™çÐ3$‹Ñ;o:~�áLŒ2¡•g°lûI¾ãnÝcûà8¦@L[±‹m›÷ÓëìitêaiV{j3“f©ªveLž1šnÝe?-„BÑbö3ëî;¹fž�w^|†+&õ¬3AJ£¯QÓ´zGÑŽ¼�Öbòõ.×q>ûXÅÞ`Âøq_þ"Ý{)�£,ÿØìýÞ�9�ÔåÜ ç_ÂýéX4ûQF�‹^kD›7 ��·Ýœl9•r�¹ím.êy5wÉòÇ&ègúGç¡¡9:þój8¸ë;îë1ËÇ¿Á¦÷¯£U€¡Û¼yßqU“Áço>ÆÃÏo㪗>â‘‹º7ºývìHcþ}Kð;$¾!„Bœ:í™xé8†ZÌ{ËW“‘oó:plÔ¿ã/j-:‚ӘϮÚü�±.h—œ9€¶ÿà¯v;4†N×� n?Ÿ¸òÒo[)­r4®Í›šŸ,§Ëqˆßž޵Låá añ1ýãóÐÐu?þóÌÄDbòC“±~ù2ï®ÌnÑ6oÞwÜAöÎ-$ò1†¾S™:6©Ùm)ÅŸB!Ä)Ö}*Ï?=�u/ÏeéÎ,¬®ÿÕ5µ’–ü_%ïbêäɌԵY×&ýc F�FÛ~—ñæXt߇,Ë,Çõ7¹çùöŸgñò§:®y÷2NOŠÂ$•† Æžy —œé`éçsÙ^ú7ùF••°lþ›¼³yÿ÷Ôet iþ/<’r!„BˆSY è#èzы̘¼œ‡žýŒE¥ü/Öå»S™ÿñ;d…�Îù×_J‡ÀëÔßvô½d&w ýŽçž›Ë~«�¿ºþsnùŽ·Þüã¥70mÄÙDYŒòåô0Òc �{9Ö ßóÝË)ý«樦`ñ+<ôØb.zu&tŒm‘Û·èÇGNyÌ\C—1퉈ˆ”Ü !„B´p1` °Õ½æC¤ï±Ñy`uÿC¿ÁW²cù7¬«ˆaÜõ3¸´·?:íßœr ÿH_‚âp>@f6té›ð×�„VìáûÅÉùuãü §3¡wš|1ëÒéiÓ+ʪ9œ��9<†ØV!üU7­°ú…7Ì ã”»¹ÿ¢A´iz±^PPÀî%û1•ZdÂ!„B!„ø_%¾!„B!Ä¿ŒB!„B!ÅŸB!„B)þ„B!„BHñ'„B!„BŠ?!„B!„Rü !„B!„�âO!„B!„B!„B!¤øB!„B)þ„B!„Büo1´Ä›¸ªK)©Ñ€IWCiQ%:Ÿ }ë¾½Ën¥¬¼§@Ãä@�¿Mò „B!„óâÏí&kÉÛ|RÒ�ë§�"Ò¾‹Og|NÌÅ�0µ÷Ñ·WŠš²ƒ¬K^Ãü/Þg{‘Œ¡ .çž;šNAe R!„B!þ¾ÅŸ¢‚´ô2ÚõjK¸ÈΧÄ'Ž!ý<Ïq¹ŠYûÍ[¼¼ÐÎù×=ÆU±a8*0ÿ•·y½î»ñlâdP!„B!þ¾ÅŸÊ!§ØDTh8: cO&öÀ¶´öÿã9Î]Ëùr��IÓ¯`ÂÈžt(w;‚î†Y3?á—-øz°ƒŒþ !„Bˆ¿�Rn\.7šN�^§5ðu ·Û…R�ø0M‡^§C«õn· ·Rp¢÷Ñ4ôzýqNÜn7nå®ûšƒþTl+\®£ë^ßç¸]8ݪqo©éÐëuh¿·Ic_¯ÓcÐ5rhI¹�,gí$jš¦kÐv ”—û˜vGCgП|¢•†´‘¦¡ÓéÑ5cĬIÅŸr»¨®(Ç®4Üä85bô:Ê˳ٛ™�Ó¯†’Jõfüý}Ù™º�@�½ 4üžO ññÝtZ$_¬Iå²g`Ðée�#„B!þ"n r–pÓC_°_çbØ•/ñÂ�Ð PäîßÊ+ï¾Äâ"S�b®Þº ” CÒd>¹l< aÆ£±±nÙ·<ûÕR²�îzÄ]¸Â†óÙ£ÑÍ×|LÑç ²²˜õ+2s~2Ù®£ îv6x:³'%‚¿±e[­ªä0ï¾ö³35Âú\ÁÂë‡bªÕhÖÍŸ1üíd\'«÷MÓ�.=/àå›GN¿Îÿ˜çn¢ØÝ€šO·ÃÉàËŸæùaÑXR^(ÕÕÕXs×p×ëóØVi÷üIodê”›¸qPk|},õ^ª¦Ünª«*Hߺ’×¾úš-UzOQ¬Ü¸ÿ¿WqfP0þôõW�Tnø˜¡ï­Âo5c’xàÚÛ9³ÍŸ\ü9mVv­þ…}r·.ã°³E{—ð˶<6nÙ‡ŠoÏ’%‹Ñ‡vbÄ€î¸Ý “Ù³Ï1od1ã‚>#�"md�#„B!þªÒÏUÊÊo~âk5¸k8Í¥hèx“O@C‡N¤[�Žã_ˤ¡«>À»K7“bÕq}L$~~µ+16{59Õø¶Èô>m¼?_)0ÇdÐv“±k)<ý_Õ´ãÁ‰£˜ztbŪüý|‘ü ­“Ãxüª‡¹uP[BÌ-ÓfJ¹ÉÞþ-wo³âÖ¹èh÷.ñôa¹e¼ßIÚÒMqq&_,[ÇZ—Ã;Ç~´\‰i—È•ã¢pžè Ôd®æúuÁÒ‰û[›~V¡½�_ç¿É¤Ï÷rÉäÉÜúG‰”ºú{xónÞ\=‰.¹�‘í|½Þ·ÆVÅÇ/^ÌM{yăi\]M!‹Ö¬æÂÛï`Rÿsxòš³èê_oXU]Ajy5§'öãÂ.±ž³:íèJŒoóòÕ¤âÏèëOßqÒëíû(wgÚ¹0§Q~0‡  çrn§?6äB? %EùçU@HÀ›·ÕNyQN­ƒìm„B!Ä_ªhïrÞX_xäfhîÆ½682– bOò,{7Ìcîò-ôŒïÃÔ�‰DZê”TÛ«(sè›4‚˧öhxæv³qá—Tö=ŸÆ aP§8ÂLGõE ïÍ]³~áÉÏß¡MÈÍ\Ô3ßh3U¾��\‡[¯÷TUS»�\ÞîdMcgÓo1×m§c¯K¸v@ÜÑ?˜Iì=ŒÄÞ'[’½Ÿ ¦_0–‘qAzz¤RèÃOãçû§Ò¥wâ}ÿxá™=;0ê×Ï™¸p7X¢ùõæQ´ó5zõ!�ÏáÛ Ïd\‡6ø˜Ž–wî*†ôïAìñÌæŸhµ¨5�žs:1ïEÈ/)—�®}†qñ¸>„NÍ6ÞÌ È)¬$0*P]\J)èÞºî³ÚŽAçÒ½|ûÃÏdæV ”ÂY]Á–ÅsY´)%3½!„Bˆ¿RE:s楰Kg$1$P-ÿE{YøÛJVÚMLì7œámŽÒ<ÿ)�\̰kùøšó—ÔÁSøÂHp×ö�À]ºŸwWl$¯ÔÑ�Æ’…óø"O#>,”¸&·™¢¢r³¿\ʺšŽÜyÞ:ø7îr°Ã›ã…•û!¾õìN¨¹Õ“)ŒaCF3fPÏ:…@t‡î 7‰ËB ìßü-_ì²rì¥y&‹/gO𯄮q~:?â;ô㎳O#^oçÝUëØ‘[Œ³ÞüižBÔí>u›y“Š?§­šÊª*ªss8\ZE``ÕÕÅìÍÌ GJ¨ýÈßkNàÔ�«®„ëà2ž}ì>n¿ý6î¸ïa>ÝUClë¶èõÈÕ~B!„â/¡*Y¶ü7¾ÜUƽ&rc¢®Ñ#'gckú6~NË!6¼+Æ$a>vÄf£º¬”|M‡ohxãêu:õéOx€oý§öé};~ýõnÖÈÆZmmö央àÓ”´�ëÉ5£q:›ÖhÊmgç/?ðZ‰›Þ£Æ012´á£v€rdÞ²T¶Ú}¸¥_ºvj\‘£3âïësœÓDuwàìîáà(aí�|Ô1³úèt:üü¨ÿRJ=A}û0ʤ‡ìC¤Û*qx•¾�UPøjÁd:u›º¡ñÉqqxÓB~ÝSEÅ¡]lÍÖÓ3}>_ï²’¹{36sO¾Ÿ?�Á�ħӻc+ z3­†]ÎCm»±bùlzš9ˆž‰])ÚøåmÓdªO!„BñgsS•½‹Õk7�Ö—§ÎAÅ÷‹[|àÏYZÌîõËX`U\2põ¿Ý–Í/ײ²,„;¯>Ÿ‘•?ð�:6¥ø«JåÍ_2ÀÔŽÛ†t$4 13Ò(mMcÕÞƒCÚ3¸gZ·ðbÒˆ U„Ùh‚FÞ NÓÓ*Pƒ MWÏ«íTÕ¸@oÀO¯çTVE�η¦ÓÓvðT®¬Ø¿â+rÖúrÅå°ç“üE.;:žÏƒ"Ñ{­•‰Vñƒ9?~°'â(ØÏWytÚöèÌ>B!„Büyì¶2~Iù�‡SÍ<ñØxNÑø¹¥ÏøTNòó÷ðíÖlðïÅùƒâ�³0\••Xu:‚‚‚[~e«*)Q€RÍ«m�6ö¯[Éœåé:âQ¦$…R²ªÉ`÷Ê�¬·¹è•”HïV­ðiÌËkŠÙ±gkKÝôíן¡ñ~-ÞlV»‹=9‡?:¶ ¡ÑeKU6iÅnˆˆ ³É‚÷À^9¹%.°øa4s þšsŸ¿rŠÊò0EÃG)ªK+ÙŸe¡û(cÊa‡•¬-KYRÝ—Ã1è¥øB!„øw+dͯ Y³9—.Ìð©gÓ·}´×AëÁ_fñÅ6}G�eHÏöM;`v;)Þò /þ°‰‘Sáò¤Xp”ÑÒG¥{ ë–ÍÜb˜xáy �ªim5Š*«ŽÔ‹§àšCu(›­JAPÑc/»rSZº•�¿úž%1ç°ãìî´Ö\”4u¡ vñÕšì6„ò|ßÓèaiÄ‹]äÞËâU›ÈÐEqÛØ¡´1·t«¹©²ïgÅ.+„öct[}£‹¿¼´�ìp¹èÖ¡a�!õŒì•“_æ:š÷S«éÅŸ­Š²¢"¢ÚÅ inªl¹d¹bãcöÚ�œŽ\’ç§Ò~ÒD»Ý¸Ý.2½Áë?eÒ÷¢›iꇔ~B!„ÿ^ÊVÈúŸ_àö‡À׎ “ŽªÒ"~\øqoäÍûÇaññŨ·ã ¿˜Ã½[ãXxúYM)QTü•»f-`eì¶ŒîLk³‡£Å× ›u_/Ïc7ΉŸ±þ#_§ÛM�Ã;¿÷›ý4O1Þ‡ën�Bƒ£Aßøcg—ƒ”Ôíä(�Ø• €à&×TgñÁÛ³x¦  oÞ8†v‘pU5¹uvíÙǦœ":†÷$¡Sïë OÄiãð��Ì>d#¡ë@ÎlïßÂuŸ“ªêj–|ý1Ÿ«Ö<|ù$zù4¸Ý\.'ÎÂTÞX°…ª°n¼:ü4:…ÕWrÛ±ÚÝà8Ä«¾Â÷_¹ RnˆÂc猤}„?cóOmzñçÐð îÃà^¾ètn0@Ç]ñµxý44jöÍçîËf¹xSÓÝ…¡“¦1ª7Œ²ÃB!„ø÷V~. 3×ðê¹3p\õÏœN§¹û60ÿƒwùä»kè¶b<�<ò5r}ÀG˶1í²ËIHŠkÒGV—gðî'?ð�-œ—&�¢]Û S2¡”ƒí ~fŽ]£ÇˆáŒ áx‡¾z“/ ÝódT­{åiíã�Íßñޕ˸kÚE\?z0|Œè|+;…©ß3sU®ÀŽ\Þ·­›RùU°ñÇOy|—•k&\ʤ¸X|šÑhª2‹ Û×±¨ÒÀ…‡1¤]㊛ªêR,\J‘Û—éGolÞ’UeE”VÛ�ÜšÉÜ:g ÖÐ$Þºþ &÷ïPïý÷ŽŠÊËK)·:�¦ÍÁîí+˜ñÉ2"ôãù³ÇrÎim�ób?zõÈ“ÕöcÖ/ŸïWΡ{Ê\Æžy;LéItˆO³Ö±éÅ_@4ƒ&Oò<Œh3˜‹Žs—v½!‚aLÇØ·ìÈ0©¦# &‘þ]"eg'„Bño¯ýœ ¼Àà‰kÇëwdt%ºÃ nx¤-½Æ\@æÂç¸hÌ›�Ïçõ£CS{l%,�÷ïì«ä’Qrn÷OÕÊ•ìæ»M9àÓ†zÄêüÃoŸðX&_p“�ýCÑ^úlÚË�?¼Ï‹¾MV)<}ñ:4¤ØQv§'óÄ—‹ù©Rqõø±ŒèԆƟi#cý|Z´‡]Fró¨´nÖåu.çe²n[&fcC†%Ò¨¢ÚMaæ2¾HWçuòEßÌ�±-Kgsú¬_ æ÷"Æ a‘Ü4 £ºÄ~¢!fG ) ^çì÷Wã™6ÔdŸN<ß»7}»ÿG M‹åÒ+¦{·xuãW,eî²å¼¹h&7W^ÂË—Ž%.¤é#g†?å­éð‹?�Ññ²sB!„ÇЉ>ç]vŒ… ¶1˜jÄû´aàÈ6ôKêÂŽ«j<£s>�‰ k°“³’]~惔4bFqóÄÄúŸºUÛ›º†ß ª‰k7€ÞíÚá×”%,�ñ£ã‰ «!{æÇ|ùýgtîÒ‰ÇûEŸðú3·Óή•_òúÂÞÊ(áìq·óø„þ´iôú:9t`3H&CkÅÎ�DRt@óÆQM^úZ^˶ӭï`&Ç7îýÜîR’¬`‹æÃ%Ã{“àãÓìY2» ¹ˆ]=&säNPʳÞå±ïß!ï`_F ›À•Úãcªç“ŒÁô?ãvö»ü÷Š]Ñ^>úî îyùV:‡«F÷aX÷ö þ¡ÁâÅÐ3§Ò)ÌLÁ‡ßóÕú_è×­=7�êFÐߺøB!„â84�ž�¸N„ p¹\¸Ïmötzz�†>"ž®µ Ç‘×<äc'ëÐ*žœ½�Uî¼{çTzŸÊ¹sY±3‹l»™³ÚÇݺ×:izºtìÏuCV2q&ë·ÄÕ¯†úNVU ‡3Ÿ¹ïÀœ�;H®Ñ1nü|x^_"›p½Ui~_Íù�Ù9.n¼ö..êÒì"¢ºÚÊš @§cè þ„4ò¶o®‚mÌK¯‚€öLê�¯¹ù'íG´&8¢N‰É=Îà’Ü•ÜùÈ'Ü´o/¥¦'¹»0^—mêL„GÅU+Ö.–‡Oçüß>àò/¾ã†ƒ™|pÛeœIƒ³ ™‰ê=”³:¯cñšÃlÍÉ¡ØÖ� KÓÖQn®'„B!þzÊEMÕNæ¼q+ƒ“HJJ$¾ûe|ž¼‘œâÊcfAt�úÖ tíw)_®Øá9Kï$@YÁ.f¾üsJ L»ä,z+'%EEÔúWX\B™Í:ÖÊ ‹Š(()Çêhü Ì�™™¤:L±o}Ûw!®™õ‰. �ˆÄ$NC‘·}›ê{’ÛIõáõ<1cw¯H#ßÒŽÿ^ÿŸ\2ˆÈ€ÆºÎª"’¿y‰;SKhÕ×&@UiÝ6+(.¦¸Â : §­âh¼„ ›ã8³Wº¨®ÜÄשv°ôaJ/_t�ªJÜìÝœÊ6›‹¸Ž�éŽù”l”:|ý‚IˆÆ¦�&É–Ç'ÏaUC·½_?’ÆÞÀÓ#"ÈÎZÍ-?ï ¢ÚÙ¸ÅÐGpF÷X"ôv¾ÚŸCy‰­Ék$#B!„⯮ü°WäûWïæŠ‡kxêýˆ÷3�—±žGö#ëÌ'Y÷ÌdZwH"&¬‡71oñV\íGÐ&2¦aþ 2—É‹™Õ «æ•WîçW=ñ:øú£3šøtÖ|ú–ºžMÊ­Wsz;ßF¬“ƒmYY¤æ–Ó%´3ñ]Û´@;ñ1‡å£Èv»q×Sø•ï]ÍëŸ~Â;‹Üg*OMÊ ¤¶M,Ž5y˹`a&è5vÿú*¸êyž?0›ÈØüm®zÌ�™õðm\Ô7‹W�¯È]»š¥(âú÷§¿¹‘§l:óëöCä¸}¹ºSáæS»yˆ‹?�³b–ðQi&‡Ã1Ï�Á``ÀÈôüñc¶d¢Òé$´‘eXLX(f�†K©fÝBŠ?!„Bñ×r9)Þ4Ÿ§^À´×aú¥£ˆ2ë¨.Í™zðÂŒ{éß÷n~ú^†vÐ(Xý-­ÌãüÿŒ¦g§Ð†}†¦;ø 6u9ñ8¡ÃZAÊÏïq×ör¦L¹Ÿ{a0ûÓ6¢‘£fÖBHc…ÕÀYú20¼EŠg¥5`¬;AŠRTçnâ­O?á¡myŒ�tÏ�ëK÷èæÌ©aŽÈš§:�¸ÞpÙØ»uÌßJ›n“ùæÜÞ f"b"ê=½Ñ¥røvÕ~Pá\Ö?£OãJ’ʃ{Ø’S„-0Š>qí‰ú*‹QO Å‚Õ]FiE£›- �h[JËÈWnÚB£f—-®¨ÀáVtöóColú©ÊRü !„Bˆ¿”Ûå"{ï¤2Šk‡u è脾�­è6|/õœÈà Ÿ`Ôcÿa±NCg´pñ;«x`l8A�8š ŽéHï˜?ÇQUÂáµ&p¹ˆˆíBïÄ0Ïä��QRTNjÚNªu&"Ûµ'¸%ªº’ò};YéÖ1.¶-µçRt¹ øê«¹Ü¿³„±“îæõ)ƒè¢oöGücè•t’FsUc,[.>!m镘„é�æÚ³žŸò\CŸP_Ì�jß¶ï;Àž+ñ‘Á„GE£ÿ¶ÑJ›�üÊ*üõmˆ mäù»Já,, ]"#h£kì}ËIÙ‘E±ËÀðˆ |ý›~åžB!„â/¥3Yè}û·ØoMo8r_èßé}ó!袗I¿à�ñ'MgÄp ŽúUí!®úΰSŠk%V',>ø™ê›rÅIYuÛ;ðÕ·£Ïè|°‡Ó:F½VÏr¹8tx7s–¥�O'¦�Ù c­©>;–óNjÄå±aI$„èÿ¼6êTDÅþŒLrÝn|:u$!0”F�c©rrŠòȪÑÓ#"�„æ^H‰Âá°£4&Cýïå®)d÷Že|’‰}szTݿ۬Vô>>Ç�Ä¥¦ª’_~þ…ý3WžÖsÝÓTí6ÊlÆ\ïÔ­n¬éëX°3›Šà8ÎKJ¤}3seÂ!„Bñ×€#F£Ãqî\®é �FÏ?ƒþ¯YN‡½ŒŸÞ»‹� ïäå�¹Øê›ûÃQCÕÁ-|U¡Ö™>‘ 8ävU³3õW¬IcO^UÝ¿U²s÷.>z&”†rëÄÉœ×ÚR§èÜ—�C‘C1²}<Á!ãL°<-‡B—�±m¢ð lÜõzîü"r Cg u›v´nî⸬ìÛö+?¬ÚÎîCÅ^5lua&«6/à®VPÒª7MAÛZ³Ó(·›ß¾û”÷î'£°GÝ �üÜ,–}ý2W®³Ò¿Ç®�ÿ1Õî¦Åóù2=�ý¹ÅÔžÊÅá¨àÀŽ^úöGÞϱqÁ 3é›Ó¬Õ•‘?!„B!Èé>Ä’-eж#Â}©ï–on§‹âìl@Ñ:)‰Î ¼��«<�ÉϽNØà xp›#…°¦¡­çæW’Е/»�‹G%b1Õ­~ Ë+±+ kþ^’W-e¯ñÄCqÊF¿�I´2ýÉ倭€ÌÕú`úµ‰ Ô·q//ª²q°¸c mºÐ‹ä®ÜÇy�¿Iãøæìî˜jÝ:äàÆyܼ4‹#'ðí„ILèäãuoE[ñj¦Þô#ƒFOäæ^í Òi{MWÆ’¥¿ðÊö.z_8”„¨ ¯ÓT•+›;úšŽ]qͽˆr+@QVv€×?û†5Öž¸ïfÎí>˜Ÿæ­«B!„BüN4èõÔ7©Š±µÊMïa=‰õ®÷z3»ËMzNôùúР©=ô>t0‰�/µñôÏ‹8gg­âMgà’)�òìè8‚‚B ¨ç"9MÓá£×Hß»ž›Ò×â:ñ ->†Ô>]ˆª÷´Õ¦´›F°^ÏIo·—_LI�?£?þ#�»ë ‹2k Y¥Š0ƒKó—[g!¾Ï%d¿Ð™ç~͹³ÖÕ9…µ{Ä ~øðANó ,Èßëþ~šN㌋ŸdýÀTž{c—nÒ×þ€Îƒ§³ë•„‡yœ›óuq_–3qá®7A¶k IDATÛ³î�Y\U ·]|ïœÞ‹¸ÈP‚ZàœMmfÒ,UÕ®ŒÉ3FÓ­[¢|á…B!Ä¿—:r ˜Ó­Ð̘ë\¦Øñã ?É≛nä–áIõN䢔Âa¯Á¥@Ó±zŽªÂápàr¹½N?ÔéM˜�Ç?úw:jpºTÃ/½Ót˜LFôZK”~ —Ó�ÝéFÓ°œh4ÑíÄæp¢”†Þ`ÀhhÜä'.—‡Ã‰BCo4cj©ÓÝ.jNÜJyÕ³é¤#fn·»ÝéÕþšÎ€ÙhàdÍìrÔ`÷ªØ5t&ƒ¾YúŽiÌ¿o ~‚däO!„BˆZGûMæãŒH9Ù�•1q Šj}Ü<5MÃdnʨ”†ÑhÂhlü+ F3ã_Öhè &tÇ�‹¹é%ˆ^o@¯?%ŒN�ÙÜôJR§3`±4c½Œf|þ„üÉ„/B!„B4€ªÎ 5ËÎø¸x"bC¤AÄ?ŽB!„B4Dn©åâ;ÓÙWšCüóÈiŸB!„B4€;‚93† 7˜1Ks)þ„B!„ø_=r6ão�²OüsÉiŸB!„B!ÅŸB!„B)þ„B!„BHñ'„B!„BŠ?!„B!„Rü !„B!„�âO!„B!„B!„B!¤øB!„B)þ„B!„BHñ'„B!„BŠ?!„B!„Rü !„B!„øûn·›U«V±ÿ~O¬¦¦†+V�››ë‰•——“œœLYY™'–——ÇŠ+°ÙlžØ�X¹r%.—ËÛ±cëÖ­«ó¹7ndË–-žÇJ)Ö¬YÞ={<1‡ÃAJJ ‡òĪªªHNN¦¸¸Ø+**"99™êêjO,++‹””œN§'¶{÷nÖ¬YƒRÊKMMeÓ¦Mu–cíÚµìܹÓs¹\¬\¹’ÌÌLOÌjµ’œœLAA�'VZZJrr2žØáÇY±bv»ÝÛ·o«W¯Æív{bÛ¶mcÆ uÚhÆ lß¾Ý+WûöíóÄìv;+V¬àðáÞXEEÉÉÉ”––zbùùù$''Ÿ4W;wîôÊÕ¦M›êÍUzzú sU]]Mrr2EEE^¹ªªªòÄ:DJJ ‡ÃKOO÷ÊÕ–-[êä `ݺuìØ±Ã+WðÄl6ÉÉÉäçç{beeeÇÍUMM�'¶ÿ~V­ZU'WÛ·ogýúõ^¹Ú¶m[�\­^½ºÞ\åääœ0W$''cµZ=±ÌÌLV®\Yg{Þ¹s'k×®­ÓF›7o&55Õ+W»wïöÄœN')))deey媰°Ð+..öÊUvv¶W®öìÙÃêÕ«ë,ÇÖ­[Ù¸qãIsµjÕ*222êäjÅŠäååy媼¼ÜËÍÍ=n®joÏiii^¹Ú¸q#[·nõÊÕÞ½{O˜«ÊÊJ’““)))ñÄ ½ruðàA¯\íÚµ«Þ\mÞ¼Ùkß³k×®:¹Z¹r%ôÚ÷ÔÎUII ÉÉÉTVVzb999¬X±¢N®öîÝëµï©/Wëׯ'--턹jl?Q;Wõ檾~¢v®”R¬^½ºÞ~";;û„ýÄï¹jj?Q_®j÷¿çª¡ýD}¹ªÝOÔ—«úú‰õë××ÛOœ¬Oÿ}ßS;W í'êëÓ›ÚO4´Oon?q²>½¾~¢1}z}ýD}}zCû‰“õé¿÷µsõ{?Ñ�>½9ýDí>½¾~âÏèÓW¬XQoŸÞÐ~¢©}zSú‰úúôÆôÇæjíÚµÍêÓkï{NÔ§·d?Q»Oÿ½Ÿ¨�«Æô íÓOÖOœ¨O¯½ï9xð`½ýı¹:^?ÑÐ>½v?Ñh3“f©§'¼¢ÒÒ¶«†¨©©Q€úôÓO=±’’¨äädOlÿþý P{öìñÄV­Z¥UTTä‰}ñÅ P6›Í{ê©§Ô¨Q£”ÛíöÄ.¹äuÇwx;�N•�� Þ~ûmO¬¢¢BjáÂ…žXvv¶Ô¶mÛ<±ÔÔT¨Ã‡{b?þø£TUU•'öÚk¯©=z(—Ëå‰Ý|óÍꪫ®òúè#¯~âá‡V“'O®“«)S¦¨‡z¨N®L&“š={¶W?ñÛo¿ybP€Úµk—'¶nÝ:¨‚‚Oì›o¾ñê'ž{î95dÈ�:¹ºêª«Ô-·ÜRgßÓ½{wõÚk¯yõ?ýô“'vøða¨ÔÔTOlëÖ­ PÙÙÙžØÂ… ½úô·ÞzKuìØ±N®þïÿþO]zé¥uruÆg¨§Ÿ~Ú«Oÿâ‹/¼ú‰Õ«W{õû÷ï÷Ä’““½ú‰O?ýÔ+W�>ú¨:ûì³ëäê¼óÎS÷Ýw_�~"<<\}ðÁ^ýį¿þê‰ý•W^Q}ûö­ÓOÜpà êÚk¯­“«¨_|Ñ+WóæÍóê'6lØ #-m»zzÂ+jfÒ,¥ÍLš¥ªÚ•1yÆhºuK”‚ãV5AI\u¦�–ZO°´¢gŸNðË.*6\ðªÖõŠš¦Õ» J¹ùã,Ñã?J)¯ç¢n�†Â�PJ¹îÑóŠÚ¯ ]�Si�¼÷‘÷Äó9šV«˜TŠc–ôÈç !„B!DsŠ?¥.w0ÑþV*«*�Œüé�øšMu'r1øXϧ8  :ýIGÃÜvû$¦M;ü|MµÂMIaÕhÕ*²�ȸq¹JX¹fo¬™G¡KG@«©Ü9újEÿ(ºÜNlö,¾øáYæÌÀ…‡Ïž:ÿ6úFDa®½.ör²r×ðêü§Øf7£|ÃÆp÷„iTn{›77þÄZGúµ³)õU ½¹ÿ槪×ãpæòóÒ·˜µc-ÕnPî*âû¿Å“ýºé{´áªÖòÜ·oSÖf:·vôãÝ·²²"Ž+.›Å%FN;Ófódò<²ín\n8ýŒç¸5©f™ÐU!„BÑŒâ¯Êî §ì 3Ÿ¾�ÿ*¸¡ç¹¤\0šÞ]£ñ=Á¨“R•lX™JŸ¤~$D†9ôÊw¯ãû—eGÛ[yîŽñ„ûP–±�¯ŸºŽumîäÙ;&zâ'âpìaþ¦7q¨¦‡)¸YÌO»‘!óml½`:IÁhÊAEÎ^úár>p_ÍÝ'¢Ótää¯äº÷oãñkßäÜð°#ohÍeé’éŒÝ¼ŸÚ]È”�pPNŠ­dÐ&¬'gv,£`k.Æà�ŒmÛ�`](!šÎÃüúÛC|VÔ� “0š-ƒ¥k{rEÙ>ŸxÁš8©°duÎ&‚­Ä>�ÉÑFÚ5Žl~^þ,ÓWmåÚîSéc0¢³e²lIoî,ÛΫ#»ù,!„B!„MÍ¥W<ÈdÇ‘ÂBWUÈò¥ß0dÆ>>½ë:.éÑúx¥›6.à­m~ÜzãPâCM'ý¬àîØ~Ï3Ìyî.{½ù,Ly[ùì…;Ù{OÞrVƒ ?€¬’t.ÍÿM½•®��(W‰a6®Zø*KJÏ£sPÊZÈOkÿÃcÚ],žp5£ã"(-„ßüùfé"†_0�pjسý=ÙYÅ=Cgs{Ÿn´  º|yöVć¡WR$ii«ðé2™kÏ8‹ÈßF ¢k—[x"¼�|�N’ãÌ&zA9Ïîú„5£G2Î÷há¦jH/\Æ„¡Ïsï‚´#±¬�óxlÍ&îõ4WN¸NŽ"ú­6óÐÚGXÒëkΕâO!„B)þšÈ/(œÓN ÿ#àvЫc¶YŸóÁ¼Õ èq Ǿ¨¦�+`Æ×錻ñvÎíÒŠ†Þn/¸ë@.yè >{êVr+9+ÈŒ»�WoŸÐà À¿cú\J×@4@ÓGÒ·ëå\´áUÒ Ü¸Ûº©²bå¾Ã<=q2Cb#þX†°žLîÒ“_S7²±xcý÷²hÏ&B"&3ýô´®UÇúv!þ÷¦q¹FO)…»öÂèü‰‹=íHÓ/æ�å[q`cwNU*˜JüÑ@„�cJ÷£…àv:9tàCJ;<Ä”žC�~Æ0ú$ ¥ÛöU¤îÚÉùƒeKB!„BŠ¿¢37ˆ ½7‘²,• ç‘ï© ©,Êã×ùoó^f<ÿyì^z†‡ÐØËÑ‚ÚwçüÛŸàÍGFòYȤÜ}V£ ?€pŸp¢Âük]g¨¡× 0A®À…Ý•ÎîŠl’ÜÅÆ%èŽN¤¢¡QiÝL¶y4Õ5€* ¤2‹¶]Ϥ£©ñM¦T!«6~Ä»«Ö`Ó9©qºPh”ÚrpêBêN¢£iÞ‰öµÎ‘uºéE©8ø*ÿ÷ÁWøéÔKêÎeCe!çØJd+B!„B´üýÆÕ5•GIþvžùC¬/ãí úÒÆ¿iï\~`ß½þÇßÏÄÜ9Üýr0¯Ü{!�–¿‹¦ih'+:•»Û@\H7ºû…ÓH=æC” Pn”rârÖà‚FÞ¬ÞAvÖ ^^ò�1çqFŸë¹.1MÓØ²þ-JùÕ»¾Öyß*Âé‹OÝ"Ò«:ËÙC3,[¹B!„¢…‹?W>ûóŠPº(¢¿°­<‡¯æ|JÍÀéÜ{Vw¢�M{ë²ô�Ì}î6Rcïà¿·LÀœ»™�_¸�G^…GoGD¨o ­„ƒ>ž_'±oåþ®qwP¯:_S{÷üÈÖþ}èëwüÂõÈ­j·•kîÏ|cšÊö‰÷’r´Hs—QX‘C¹ûäKª×4⃒PƱüߤóˆñÓË-„B!„8N¥Ó$vÜÊŠ¬쿇¬%lýí'¾Þr€˜ÞCé}´ËLKáç,ôkFá—¶’ÙÏÝê¨;øï-gêCP·Á\öÀL÷ÎàÑצ¸ÌÚBM¢'Ä'�I�:ðÖ²YÌË´Õùká�ÌOÛuä�o"£; ÄZü¯.ý‘Ý%¿/ƒ‹Ò‚l>”{ä¡A´5{J«�\Ççù(Tïd{ù‘‘CÜìÝõ9sÒç‘ë>ù$-z£ž„¤Ë‰Ú÷³Ö-§Æéúã�5»ø1åGÒÝnÙÊ…B!„MùsSQ¾—ßÿ˜Ð�€#·jpØÈ.) <á|¾™Ü�À#!{ó É.ÎäÝ×çWsÝwQÊ…®ÓxžœÜ�p¿ã/ŠBoÆÞõ&WǶ'Àï�7 NèÅ…3¾ãl»F�¿¹åÅ·§x�ÞÈSße²Ä×ä9ݲҞK›n÷09À‡¤~ðPaOîxŒ;|M³pQ¥3qÑлé èè@RL43w½Îý¹Kˆ4·ãò+î¢c›x8ôtž™w‹}Ð+E¾‰Œ ?�ÃÖ¢“/¨f¦uÛ ywÐ>n_û_ö¥'`ÔŽŽþ¹óÉwvåÞÁãe+B!„B 9å1Gp ]Æ´'""²Á5£æ0â(Τ3“ ³1œ3/¹šÇ&ö#Ôü{!ç¤ 7·ÛH¤Å„ÅtÌ?£Ÿˆö IˆÆÇtüAH�ÁHXx8fÓ1¢¦áã@PPºÜླྀèv"éžÐ›VµF!íö*ò íG�d@d�†oP<Ã:÷ƒÂdäUc1Z°éÞqg÷é�ÐtzÚÆžFdaJïƒ�1Œ¤¤$FÓ1bƲl\š–àž\3âjýõTÖXèÔq0ñf \Ådæ×–D¿Öѵ�!ˆ„öCém4�_^�Á`Á¢7aŒžÈKS§“`2!7zB!„âß©  €ÝKöc*µ ÍLš¥ªÚ•1yÆhºu“[!„B!ÄÿŠ;Ò˜ßü5õš?!„B!„ÿ$Rü !„B!„B!„B!¤øB!„B!ÅŸB!„B)þ„B!„BHñ'„B!„BŠ?!„B!„Rü !„B!þŸ½ûŒ�¢\û8þ›mÙdÓ+)„$@!½Ð;¡IU±b»ØÎ±W¬XŽxDÅŠˆ‚J‘& Hé½÷š„$¤÷²mžÀÂ&t9�Ïõý|xÁ�ÝÙ™¹&sÏ?÷̽BHøB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„Bü?¥»&KQUT@Q@EUåÌ�UÇkÎGQP©‡B!„ø«rºæ=ß�ÕS×½œ¹>{=|Ñ×*§_{å+„Ý®‚¢ 9Ï5XÍå|ÆÅ—yáåŸ÷"¿Á2.»O¯‡cQåjËv*Ÿ\ÞöKø»ÄÞ´S¼z㎅sÇ� Bôøá_³ðêý’½Ø1í=¾]u›Úð€P°£1$rß;ÈÓëä¤"„B!þj©«Å±µÓùloÏ>˜A#§paÇbÎaÞÜY|»|?µ€ÕêÍ á·r[bK šsB‡�ªò2Öÿò¯¯+ÆEƒkwŽÁõ¡& ºË�'6òN,åéצâ6ø9>èÙ OÃÙŸÕT×°ë·ÏxaiT¥��¼›^>¸ê.¼�%…¿óôË?`Íx„ú%àz¡×3ξ\´‡š†©°QÖ�É÷]G˜Ÿv»sÉA~œñ3SwäaGÅ»U^Ü‹„ ½SH´™k(:ò�]Båé¶æ#x¯Wn®†+ºuQ­+eÕâïycn>7?û"÷Eºý¿€8m©ª™m[à׬5þF 7�¬*…ˆF^Ž×x„Ä�–Ú`äÏZY̾­«©Žˆ"HÆý„B!Ä_-öÙmäfõÚ¥¼3s~ wa¯÷šºò"¦~þ,w¥ò^JkÜtP^’ÏÏ=ÏòïòÕM±h•Ó¯=Â'£?dl¾+·¤¶!ÒE%ïàZnõ_{”»Û„ár—Å6k9ëgüÂE ¬³qî\må!>ó9ŸÒr[÷Ö4QŽìßÀCϽÂS¼Á#­}q9ïu}%gÍa|auVìêÅÖ@O`P$½ÓMØ�†äTÌ–Ræ-]�Gš?Z£T;¥ÇwðƇ/1ͽ'ÿHm�Ñ^ÃÑ=?“ü¯l¶=u Án§Föì5ìXü-çm ¢y;…›P«27ó=:qo ëC„ëeÆ?U¥¤ ›™ —²¸¨1.¾Aþ.ïï ¹dðI÷Ç;A�©)‘Ág_Õq0Q¾³4k=ßìÏ¡åu©øê´rvB!„�à§°rùV&M~Ÿ ž©Äzø�w¸Â¢j1¶èË¢¤t‰ðF¯@]UM½jy{îæuÅ=¡zÀÂî5K™›§rÏ ñDFsüµPz<Íðõú�tjLKŸK_ß»ˆÏ·¸�Šó‹­Š-«V1§½—;Òcð 2Óþn ³Ï¡SóÛIóÑ7Xfö�å|±NCÛ0P/™“Ùdç½î]Èhá�N4züã:лC[*7Ìgmñ©ñÔêò**kêˆj™~*ø¸’–Kb] eÕå ×ý²6ýÊØ}útêJ �Mh®r䯮²”ß§}Ʀ|æÒ,Žå[)›<š-úN;F•±”Ñï­@Ö–¡ý;äUÿ/ vª*¶²hÏÞŠ IDAT‰ŽŒÇ£ð5ɨŸB!„¸v¬æ:¬6;* Z½½N{*¸©v¬f3VÅ€‹Ó³x i41¼?ê 4z\jâ¡W9ß †Z��[ƒvEQÐ(z Ž+nwBý¼qSNPTbÆÞèÔók6KÙEe´ðÃÅÕx‰t•ÏŒ¥¿±ÓÔ…‘ýš³äcçPcµÚ¨­ª$:! �z[çÙ4ŠÄŠU®,¥’&ø:–YÌ¢µ‹XliÃÛƒ¢Yÿ™�«½AÒ¼o5Žhp{šN¾¹‚Lƒ/1¾Þxž;ô¤õ¤Q@lc_žJ?ðõò ÈÃÄîâB̶H ZTµ…Åä›< õðÂí2ÖÃ’¿�1swѵëmôôÍæ¥E—^í5dç®ãó¹sЬG\};0,c]µçLöcÇjµr|çgŒZ»– › ª mØ-|=àzÜ•r6lúˆ÷³ZñE¯ V,{’IÇÌ´éñ&�ƶÀ¤±Pš¿�™Ëßd~>(h ïËý=î$Þtfr»½˜•k'1qÛj*ì Ú!¡Ó«<‘‡çUD¨«ùsq÷&ãžxþ¹§˜N“Ö·ðü+ÏòÌC7“H·a/òì³Ïñ�Û»ž'ø�j¯fÿ/ó©LiKËðPôr~B!„×Hmy)sG=BŒ¯nn­ysþRä•¢öâlæ¼”ÈC32¹ô ›WW#.º«˜‡ÓVÄ¡¬]ì7v¥gÌÙKî¤ô¶ iáΔŸ¿eá¡“œÈËcýœOù4;š';¶"ÜûbË´²gݦî´s÷­=‰rÑ4¸=S«Q0è ÈÊÆ\/Â)uuÔª*6ÎίÚmÞ¾ƒŸVqçÐÞD»ê¯:øaÉgÚŠMhCÚÑ%ÅÿlôÔëñ¨,ãHE¹c—3Êb³`±Û±�y�2¸Ý;wÀºm2£ï#çäI²÷-âñÉÛ¸¾C'ZF_:€Öæ3í—dùwa@F zE½ÌmR©ÊÏÝ“?Åì›NrP"‰�­*ýŒn³>dKQùéç=íÔUîä»Cˆÿåkl¾q$%‘ƒ&s9«í6À†ÙœÃô²l~ž{Ó+cH N$Ôè‚¢Ôr,ë;nþ|ó+BˆJ"1°ºãÏ2lî öWZN«æB–-}œ�k7âObPÉ~þìÎ>L]�ùªJtõÏü) PH^a5¦�<kYeæÚ…i.8.@Õ‰5üºMCÛ»R ö””B!„¸Vjزàk>œQÍK“gãS˜ÉœÇzòKGõ¡¶(‡É‹Z1ôN#úÿÐÍgªÍÂáMk˜½¹–nÏ ùܹ-¼ZÒ7-œ>˜GßÕ3N�$ºú0¸ËÍ$¶ˆà‚“kªvJ®á«¹kèÑï~ú©-/oð2£§‘Mc©X¹„…mƒ¸..#@y6üÎl»J‚c™*ÕÇ·0aæ<â{ÞËàÆî(披Üj;û·±rŸ…�´§é¹�Ô/†Û#¦1yÃ&›…Ó%Ä„;e%»Y¼i »ª¡«ãÕn´OMâ×…KxñÓò¢ÙºÐV|�”Jô%†ýluUlX8‹¯s1rXѨ칂­0x´çµÝHŒŽåÌô•E‡CX7ñ]OK?/Œ¶J¶ìüšûŽx1©ë‡tìÜ›& @‡ïB£Ó�!Ö@Á3,Ž™Ã[}ûszP×^²œÑÓ?¯ùã¼pÝÝ$øø `¥à@ ªfßÇ´œ6<FuU‹wþHïô ¼Ð17-`.`o~nWyðþ± _jKÈ/¯!(= °‘[�G�[Sb.:Yþ囨hNL\ òåB!„âš©Í%+{�xƒÛ¶Âµ®ŠöÝÒHùè_tïöÏ›?Œ¡kŒ?:͵ÿxUµ³iéd>[zˆžý†rcr0ÍÙA‘c;W1vÆzÚt¸�I’ñ²ƒ%5ÿ]ÊW ›òÏŒDBL —k.ØÂWSæãÕönnŽ^«P{¾0úÑ®cgúnÏ3Ÿ�çp—¼QPOîá�ƒÐÛ÷ìd.¶’�|;eU-òx§f¸ê5Ôš¯rí%lÞ¿ƒ >é¼åáô#½>Œþ·ÞÈ·¾æUk%·„ûࢱ�™}€õy•Ýtgo§-9Æü_fð[e_¾ö]¼A¥”)¾å§³H:�¤Ÿ $?3¹[æ0jm%#モÎaZ¸¢§ žÉtö,Y¬Ø²‚ÅUTÖŪœ¤¨ÆŽjW©®=ÁŠ-c’¶”~í»àí(¯ Íš¦žÞ*h†ñ`çŽàP�¹ŒMšÖ<Ñn8 >ž§GHuDtcp«<·kOE5BA‡^ 'sw“gM$JkC-îúø¼âì¥Ú¬]ú?o+�Ú"-À½f,ù+lçf’SíÁgÿÞ‹FïMë^}iß*Ìù¶Îìü¾?Ÿ¨ÎwÐÌ(ç'!„Bq Âøà·ô¶» ·X°i F¤ñÀ;¸çÍñ ªhô\®õLóªŠÝžÅwf³4·ŽAw?Ç æFôÚsfÕq­˜Ï6�^|vš¹¹ jD0S ÐöËyt� & y Óõ³Ývˆ±ã¦²ÐÇ[mpÕØ±XìX,Vlª‚ÝfÅbµbÕiÑiQJçÈ@ôç\¥çnXÏìCÙ¬¨É榧—b:ýF»ªRhñ¦2û=Ú/tç¶¡¯òz×F ÑãáфǞ{ŸGÏ^ÅSux&ûL>ÜãíGÕ¶Õ,Üs”ßËsÇsðRN ¾©¨™M”ú”.Ë \wËk|Ò§ñ%¶¿–ÂÂ-ü\•ÄhΓK4=!1myù•6¼tºM«T³|þ*tQ´ R ¶”Ì£»ÙèžÀ¿"ð¡çÙ ëÆMÅü wÚÅ=Àçí»l2PQ–Ã?…Sàx¥…:»�K~m zêx¬¸,vLo¼�ç>�è…—qqAhEq%>ö&Ķá§9SÙ\´‡ç?íNϾð`B>š+€Wu×¥¢Ñ PIYUjPþZ¶ 3EyZšµqA§Ó 9ï— äqäØ~¬M:ç'ßí „B!®µZ¶ÎûŠý˜ÃÐGâS”Íüá]ˆŒ~�uïö¦ìäfþýž�m1pmÿTÌ5'™³hûCû0jpkLx«Æl¥Òl¦¶¼œZpz¾O­+£ Æ…æF õuÜ‚Zòø�^6×rÏ€@<¼uç IqmûÐp‹¬ìÛf`åºlÒ»õã–(׋n‹]­$¯¢˜iÁV±žŸW}È—µðÄéðg2¶äÆ´ÁdlÇ4…ë;÷À_Q€öìÛ‚®Yk¢/ò)Q-Ó‰Zös7N%Ýk�½O?#©Vpðà:Ê‚ÒHöò¤ªb'; ÝI‰l† 7èhÚ‡¯úp½úðWUKU± ]ÜÑhlÔYs1{†aÒ.ð})VJ*ó9‘ãFL˜ÈÀŸB!„¸Öô¡\7ìKzê|pW@qõ IlgF¼ŸÈð·m€‚ÑÝw×kôecv;¶ìƒl*ÞÏgã?#Àd¨Kðð‹ã–a½‰6E2¼ggÖ}=�¾ùŒU‘AU{u?ƒQ7 $=2�ªRqx-/l61=¹Ã…?Zµ£ª ¨vìö³íåG·p*S]ŒhPPjŠÙ”�GtƓܗâÑ`WO}7â©g/'üªX ÷3½.��Ý]1œïßn£òÈržZ6‡8**5uùÌ:jâÃýhàz*h\HìЖÁ;w3þ·I¼ph#Í]@¥Ž­û� �îÄ��ÓhtE FÅ®žºµRUO}ácˆÿ@†FNåÅ]c(?¹š ­ŠÕšE¡©/ûýÌ™¹UuO:¥¼È7ùOñÏU#Yl¾Š…«<ôp*ÑUÖxdðÞ€= ˜5–ç‹6æêqj½ÔJŽž¤ÿÐ�Iðò ¦vŸÍœŽ¯3ÜPA­#¿l =Ó>§•Ñ몆Ү>üy†ÓçÁGA«EƒBpd^x´Ú m©«R‹gX:ÍBµ(þ„B!ĵ¦1àáí_¯Q‹»·/îd¹ŠžÀÀÆ$ªîÎЊ‚ÖàÃÝÍC0`¡¬ÊÒ üa2c;½­®cü»Ýùmêh櫤NEÌ{Ï>ÁíÑ:�»ÝŠ­¹®Ù@]ø_£Ñ–D¢‡Áé‘«æ1MIß¾‡M'*‹!š·^û')�¾¸\âVWEÑàOkï ßÍW?ü)¥f2RchéîŽËy‡÷„ntÜ8•#U4(x„´eæˆÁ¤xiœnÕšðà#¯rÇŽY<3g¥§'ëLë5‚×' Óé®8ô\ÜIŒŽÄ_ñ R´ ¸î{”…O³ ¯”RE%$éU^ŽöböÂu”¹èOG ß4î¹m:�–ŽcÞÑc”©*v»BFÿWè¤7‚½ W·fÜëãÛà+ðÅ�ˆØò«W[¾]8‰µvT¬®®ZTªŠjɼ±+MpC+ǸB!„ÿïU•ígô»cXPm ÜýÝβ›Xœ_É¿nÊ Ú[s�¸UËÉÂü°zM"ƒðÖœy�Š»¾Û9¯\óËXÞ]²—:7?‚õ bfÿö]l-ÈåÙÛ‘ày±›$\Ð)Âð•­Ž²¼©<½øýÓžf@tS4Wù±<ü‘Gf®ßV¸UÙyTºFÓ,Ò9iW�<ÈŒqc) ëÌ�·ÞNÛW èàAJ]u2ê'„B!„@¥Š ³&òeYo=2œ›ããj³°ü—1<:i&S£x*­)¦ó% Õ†Í\‹9¼'ŸŽB¸Ë…âNYU&ô¸‘޽2ˆu(gÁÌq<öóJ–ÇÇÕ¾îÿí�b­"ÿw¼{ÀÎM½_¥W£?¶Bø™?MMyuF|6ÉF %Ø©VŽoü™�}¸íî¡´;üüš7§©»»<|(„B!„€Âm|»±”Û»ôbPËÆ˜�VG‡7óBk+#WÁRk=ÿ{ÍVÌåeœðõ&à¢b$½Û |&øxÒµOoz ÙRXA•å¿¿+* vòÕ¾†vð?¸Ê‘?sU9Lao©*�±ïäIJç|O¦OY»÷‘£V2ñ›}èãé×%oãQV/Ê'aÀÂ|�r@ !„B!ΟýgrÒàA�¸d|Ï…)¸½hѪ,Ì&Ïfà ýïŒòñåbÃK.4 i8iŠªºáeR¨¹ªœUÉÆ-sX}<ïFÉôiוF…«™°i;>Ñ7ÑÙ³”ùf�S«ÃÝ»}»÷§ Ppä¦ì°‚¯W„¾Ùë|�Ú@]6+L¢Vña÷‰™l¨¨Å¦²g�J¶VG· ;sV|ѰÛ+9Zsˆ%oóÓà›ñrÑÕ�o†÷¢þÕê]¯8øÁUÞö©( F7\�µ”–›qiB#£ƒÙB�%€¦‘&\ÝÜp5ÐhÀr"‡üêLæýðó¶Ed“Ƹ®äÍ7ƲöX1Ú ©B!„Bˆk¯xï?Þw77Ü.øo(ó+ª¸ð¥9%•ÔÙ•ó Üéqu ҔÑ|;ç]ˆÖ€ãxÞhGJd$I‘ajöqÃó¯3zÓ *.²úU¥EÌž»„&é�hÛ4×Ë~v²�ýΘwco>’Ñ=3p5¸œ�ÌÒVHæ±åDtx�Ÿžø…Y�}Á3áþLÜ2’çVÎ ªÃ8¦?>‹é|Çk±IlÞ7Š '­¨(hµÜŒ&LõþµW÷ÐÜ›ðÅZBAY � §&\-(*¢Ø­ þ΋-..¡®¬}ÓfÜtïõ$øz ÁJÉþ•Løzgï$~Dg¼ôòäŸB!„ÿ“\Ãèyû‹$xæ"AÉH ƒþiêÂ?Rw¼MpÞ{>ÝüHï}ég y9;hôiÑòT ÔÆs{Ÿëùîã{ñŠy›¡Í}ÑkpoDëø{èwärÊÿ3#cWþT»�æ±âHÚº<6ÍC¯ý…ŸŽ©äÝÃÑ\#sªD£÷ &­ ‰Í�zŸ©í:v$Þ×ãôp£Ÿf ´nÇžù»9¡vÄK¦}B!„â“[m»„]³Å5Ìv6ê¬åäW{àã~¹¹AG£�déw‚�ã°}ë ö8gífr¯bôÄŘÛÞÌgéñD\æ%Š‘CæãÃË(~…g{^O„«kƒõV4^Çá{NhT]½ñU#iê�Þ u¬«·Ñ›Àÿà)Wþ�† Än lYæ±í¨/÷ëG°­„5óöS×êv®ë„^« 7º¢üü1zÖáãåçü]~ZÞ>Á¸Ûö’S¬ÛH~g„B!„øŸ¤Ú±Zm\jÌJ£Ó]d¾‚¼M¨¶<ŠKTp¥³c³ÕPì@¸Fs_§àënÂM«PWyöÆOÕjf碯x}“£7>DëØ0Ü®èND ~î'Ù™[D­g5ef7·ó(4úz“˨ ªî¸ê5NßÙ§òŸ}î*nûTлz §«­‚›áå…®¢k¹Žˆ4o¼¼<Ñ�³ß´¡M1¬û¹ã{j •…Ô¸4&ÔW&|B!„âVñF>xý ¾ÿí�Ó—©ŸeÃZ݆1»¿¤Ÿ§ûÃ[dˆ?†ºdÜ�­iŒcðÈ^UIÁ¶íìožA”æÊ¾'<³°˜‹J´àé+%[¦óÊ:;ß~ÝZx^EØ­Á7èA¾OKâ©ïóÑÆÆ¼Ú±'‘®Ú¿ìw˜_ý3öJÊÊNâÜE�ÒŠRöú1 ÈHýçµþñ´ý�«WHb°ÕFåÁ=l߸c»'h¦‘[>…B!„øŸe ¢mßáD´¿Ð䩨ªú‹?óÓšî~+X±mí[‡ÒÖ×vöí[Ç+Jxý�X\\ô Z)-Èâp‰ŽV‘! Zêª+È.3ä‡Q`§´ä0¿nÜM¦Ò˜‡¢Nß|Y}�Ol¦YÚÃô¹šàwš¢Ñáý0h/�¡AÒÕh}H4œ�¿Ëw?ÔÒ©y[-'¶Îg™µÏw�F«•ð'„B!Äÿ,S]ûFüáÅ(îQ ½£sŸ™Î»ú*·ÃÕbaùÂxv»�[SáªÌ5_7‘´Ì.ä߂ѕ%'ù~òL›Äàç(u8¸ž‘‹-|4ê :ŸJ*•™9d—”�³o-SØSïfK»Ö‡ôö)4õ6]zV� Ñ·óD�…ç~ëÍ»–™<Õm0-ÿ‚_o~õáÏL·»Eã~ê;ú»ðÌc †ó$b 1­ñܫ̜6‰93W:ÂÛögä }iáoD#w} !„B!€ðæýùá_ÑŒÿö=ÞÙ©G§w㦞OðÁ€Ü]]P€Ú: ›wñf¯PŒ¦S7‡ú¸»’lÊçñ9»qUN} C“Ö·°ù³Ž´hì‰éôòk­v4-G÷,áÕÝõŸ³SÉwKdVRQÞ¦ ET´Z_<4  ‚Ö�¨¸{xËRʳ+Góvu ÿèt3©Š£Î£á÷*Ü ¾èêµ+Šƒ¶ÿ©ûF•1qߪUe z/ƒØØVÿÙ*ªvl6;vUu„B­ö¯{O¬B!„â¿CUUl6+§£ŠF‹Îq· Jyé^xýgz=ô ×µh„þÔ›°Ùl޼q&hé´ZÎÍYªÝ†Õf¿XLB£Ó^xbÕŽÍnÃŽý9w0ªv+V»zêýZ-ZìXlv�Ý9£]ªzêó�í9“רª ›Í½Ó*Äž=»™ýÜbLǼþà÷ü]qÔÔ ÕiœgüB!„BˆúÑAQÐéôJ†XK³? š‡|ýП}Z�î’yCÑhÑkþ@*Q4hµ s�¢ÑáüðCž|òI§Ú<ùä“|ôÑGNµ2d3fÌp´•——Ó¾}{Ö­[çhËÊÊ"66–#GŽ8Ú¶mÛFjj*ÅÅÅŽ¶_ý•~ýúQWWçhûòË/yðÁ�jõâ‹/òÖ[o9¤wÝu'Nt´UWWÓ£G–-[æh;yò$ ìÝ»×Ѷoß>âãã9yò¤£mùòåtïÞ�êêjGÛ¤I“¸óÎ;±Ùl޶·ß~›^xÁ©V=ô_|ñ…S­ú÷ïϯ¿þêh+))!--�­[·:ÚŽ9Bll,YYY޶õë×Ó®];ÊËËm3gÎäÆoÄb±8Ú>úè#žxâ §Zýãÿ`ôèÑŽÿ[­Vn¾ùf¦M›æh«¨¨ cÇŽ¬Y³ÆÑvâÄ ZµjÅáÇm;vì %%…¢¢"GÛo¿ýFß¾}�j5nÜ8î¿ÿ~§Z½üò˼ñÆNµºçž{øî»ïm555ôìÙ“%K–8Ú HLLd÷îÝŽ¶ýû÷G^^ž£måÊ•tíÚ•ªª*GÛ�?þÈСC�jõî»ïòì³Ï:í£Gy„Ï>ûÌñ³ÙÌÀ�™3gŽ£­´´”ôôt6oÞìh;vì±±±?~ÜѶqãFÚ´iCYY™£möìÙ\ýõNµúä“Oxì±ÇœÖãé§Ÿæý÷ßwªÕ­·ÞÊ”)Sm•••tîÜ™U«V9Úrrrˆ‹‹ãàÁƒŽ¶�;w’””Daa¡£mÑ¢EôîÝ›ÚÚZGÛøñã¹÷Þ{�Î=#GŽdäÈ‘Nµ>|8ãÇ�w´ÕÖÖÒ»wo-Zäh+,,$))‰]»v9Úùä§sÏàÁƒ™={¶S?ѦM6nÜèh;~ü8±±±;vÌѶyófZ·nMii©£mΜ9 4È©Ÿ;v,�<òˆÓz<ûì³¼ûî»NýÄí·ßÎO?ýäÔOtíÚ••+W:Úrss‰‹‹ãÀ�Ž¶Ý»w“˜˜HAA�£mÉ’%ôìÙÓ©Ÿ˜0a÷Üs�S­^ýu^yå§sÏ}÷ÝǸqãœjÕ·o_~ûí7G[QQ)))ìØ±£A?qâÄ GÛš5kèØ±£S?1mÚ4n¾ùf§~bôèÑüãÿpÚGO<ñcÆŒqªÕ�7ÞÈÌ™3�ú‰víÚ±~ýú‹ö[·n%--Í©OŸ7oýû÷wªÕ_|ÁC=ätîyþùçyûí·�juç�w2iÒ$§~¢{÷î,_¾Ü©Ÿˆ��gß¾}޶½{÷6èÓ—-[F�=œú‰‰'r×]w9Õê­·ÞâÅ_tªÕƒ>È—_~éÔOôë×�ùóç;õé©©©lÛ¶Í©Ÿ¨ß§¯[·ŽöíÛ;õÓ§OgÈ�!Nµú÷¿ÿ}Þ>ýÃ?t:÷ÜtÓMLŸ>Ý©ŸèСk×®u´eggÓªU+§Zmß¾½AŸ>þ|®»î:§~⫯¾â�pªÕK/½Ä›o¾étî¹ûî»ùþûï�ú‰ŒŒ –.]êhËÏÏ'!!�={ö8õñññNýÄŠ+èÖ­›S­~øáî¸ã§sϨQ£xþùç�jõðÃóùçŸ;õ `Þ¼yN}zzz:[¶lq´=z”ØØX233m6l mÛ¶Nµš5k7ÜpƒS?ññÇóøã�;ÕêŸÿü'|ð�S­n¹å¦N�êÔOtêÔ‰Õ«W7èÓ:äÔ§''';õé .¤OŸ>NýÄ7ß|Ã}÷ÝçT«W^y…×^{Í©VÆ c„ NµêÕ«‹/¾hŸ~àÀâââÈÍÍu´ýþûïtéÒÅ©OŸS«’’<<>???G­ôz½Ó¹§²²²Á¹§´´Ôq<Ÿ©Uaa!>>>$%%5¨ULLLƒZ5iÒÄ©V±±±:j¥ÑhœjU]]�Ñh$--Íqî9S«ôôtG­Îœ{Î=ž  ¢U«VN Mš4!**ÊQ«ÊÊJbbbvªUbb">>>ŽZ ÒÒÒpss»à¹§¸¸RRRœö‘¿¿? ­UYY™S­ÎôñññNýÄÕÖêL?Q¿V—ÓOTWWëè', Š¢�””äè'ª««ÇsýZ¥¥¥5è'.uî9S«3ýÄ™Z�ÛOX­Vl6Ûyk•ššê¨Õ™}Ôºu닞{ ñóókP«ÐÐP¢££�jun?aµZ/Ú§ŸÛOœéKÏœ{έեú‰KÕÊf³�·Vgú‰óÕêÜ~â|}úåöáááWÝOœÛ§_¨Ÿ8s¬_«úýDhhè%û‰ºº:Zµjåè'êêêýDýZ¥¥¥5è'Îwî©ßOÔïÓKJJ®ªŸ¸P­Î÷{u¾~" ÀÑO(ŠÒ O·Ûí”——;ÕÊf³5è'Μ{ê×ê|çž+éÓë÷QQQNýDMM ­Zµrê'ê÷égú‰Ë¹þ:_­ê÷EEEDDD8ú UUôV«ÕÑOœ©Õ¹Çóùú‰+íÓ‹ŠŠ »dŸn±XÎ[«ó剴´´Kö¾¾¾çí'ÎÔêÌ6\N­.Ô§×Ï—Ó§ŸÉõku©~Âb±`·ÛIHHpô—£  €ý‹�`(5¢Œ‰ûV­Š(cÐ{ÄÆ¶B!„B!ÄßÞ=»™ýÜbLǼdÂ!„B!„øÿ@ŸB!„BHøB!„B!áO!„B!„„?!„B!„þ„B!„BHøB!„B!áO!„B!„„?!„B!„þ„B!„BŸB!„B B!„B!þÇèd!,Elß¹•ìJ;(z‚šÄ�Œ‹ì!„Bˆ¿ ùâÿ=3YÅǩӅ�Gl¤+3gÍaWf©ì!„Bˆ¿ùâÿ==M'Ð$L‹V« š=¹«ézæææÑ<ÜOÙAB!„ 2òw Øì%dåeRX]…]v‡øŸ£ ÕèÐjÇi¡ÆjÃC£C+;G!„âoãŒüå²ñ÷Cèü›Û2ÀVqŒÕ»r±�ù×F$'Eâþ'nXeѶçâæÛœäÐàÿà'©ÔÕ­âÁ/ÿÅ�7|ÊÐøŒ—ó6»…’¬ml>l'¶uÁî®(WøÉÇ7¯&/bZÅPÿCkN°yÛì¦HÒÂÍVKÛWíDÛ<†–a�ÐYËÙ±m7¥–z[¥¸Ù¢9M|LgÿB`-aÇžÃWYPUãN‹øhBݮ͓aVs-ûvo¡ öÔžÐÜh�H„Ç©Ÿ[ÌGX¿2 �–1Ä„ýמGËܺ–ãV7¢ã 2þýN ùG¶3%×�[:‡aª<š­Ù¸ø„qzŸÛ©®:Ħ5¹ø%'íïƒ^Î¥B!„÷ðWÁÚÙß3zr�Œy=phËæ¯^ÌãËö�  €o ïßЗë»w¢™ëŸ³ayËxmþ¿iÓfâ8ühpÓ™Ð*Wß F»•C?>ÃüœOuK".úˈU.ã³�¥ÑðOHiPÅb6-ŸÄ럖ñâOŸ}�jgÓ”±|¸FÇ£/¥¡,–£|:f4ã«ì ªŽ@‹k"³_˜°Óᯬ0‡e '1vévUŸz™>€G:wäú›o%#Ðð‡ö ¥h_ÎXÇ¼Õ XP¦œ:nÜ}¹³óͼ: Íy Á[æDšß†Ÿ_º�P_ÓŸþ S¼u1Ÿ½óÞwIòŸ}Ó´j¡(g ÃéÓ*¿kþù5lX±„…›NÐ}èZÁì‰Ï¡¹wE$¿ö(i&@A�–Ò]ŸóÖÚ˜úÔ ¼M25ŒB!Ä_ݺíS=¸ž¹S—Óæ¾Wéè�†*öØÍšÂFüòñ$*'M¢bÒ'|“Ϝ˒­‡¨þ“6,°Åpf>¶�Û¥ý5÷¼¢Å5¢ =ïxŠÂ _³ª¦î v|¿Í�É�~ 錩^¨8|�…ç‘ñ꤅ù:Ú­™óùfÆzÝxCÝѪZK…&‚±�¿Nþ“(Ÿ8‘ò‰“(ÿú9zGœþë€�òŠL®=AÆÃïRüýD*&�gÓ½ÉÞº�O'/ãÄEîwµožÄó¯�fmáE^“½�I‹þàh*˜Dù÷È–Êòßóæª#Õ€ÖBZ笠«ä&í( Îög-“E˦�Ùâ!žèŠûŸþÌ–ã|ÿëË,È?I­z�s¥Z̲¥?óõ^WFÜ'=ùᦌþ4»ñmîSòë:xÑ›¢èÒÿIºîË�{˱©r2B!„øû†?[ +×­f“m·v69†}â®ã»—GÐ?Ì„ÉdÂÝÊÐn¥Ÿ=Ÿ•™9Öý9¦Õ¹âîꎛá/|Cš¢¡ij Ú¶>ÉÄñ;/3ÛÈY·”K ¹õñÛh\/€¨¶2öü…iº¹+Öý™ÁH{-+¦/¡4´ ]{„9 ¯ä³ÛäI”On&<ÜÝOý3¹á¢Ó:nEÕy†ñì‹#y6µ1>|Hoß™[;Å’sp3›‹/|õ¯Ö–pàX5 kZ�þõüóÜÔ®)&7ž·½�oºxóýÖ=˜kkSh(©· aî˜ÙUšÿÄbÙÉÛ¼�U¿fÓÿîî¸þŒ•²šc €¢\ÃŪµìß¾ˆ²£x÷®®øxº9ÝÆ©w÷ ×ƒý˜>n ™Ù§ôQðjÞœôA™ùÙ\Jkmr6B!„ø‹»ê±‹ÚìlvÌŸIêðikÏD íãš5L˜?û»zúVÐK¨©¡ÚÕ·×ß*V‹\\.½âUÇØžSŒÑ¯-œn´S^q„YEØO_AkŒ~D†6ÅÏp6`•–fq$/�ÆI43!HU+8xd?U?¢B"ñÒ^<¨åç"³¸ » ªb 4¬¡îîgŸïóˆ"5:žÙÓ'°êŽÖôò¿øfÕUæ°lÕÜï|ˆÞ�ë'•ªâ“¬ûd&CF ÇÅxöV<ó±U,Ú¼�ø›¦~…tZ—‹Ý¶§%Ø/ì<í&|L&ŒJö?8ò£‹J¢Sý6­–?8rî°¢'ÍRiW5œ¯6߯Èî�—|VÒj³¡Úíèõ ÿP]]�››Û¥WÐ\À¾½¿°½åƒ¼pÎ~¯);ÂþüÜ%¬äp0ûfUÁ` $&<#P”¿�£ÅåØU\iŽIßðÀ)ÎÛÂÁë©íQ´D¤iT€:NäâxÑn²êÌäçïcë^NtE$îrfTqðð^JÌv@½1M[àyNRÌ=±�\³¡ÁTœ<ÄÉJ+.Êw¢±É›Ýû¶£?sû¯)�øÈPÜ]tx4É`HV3Ž^Ot°®Z?'v| “¶_Ïm½åŒ*„Bñ÷ ud—îaÁO‰<ûI Í%.¿Ë³ÙWéN+_O<.5bR�ÉŠY¿²CÛ„�·ô¥‰#ר©<º„‰3ÒôæÁt ¹ø„Å«5÷ ºýÄK§ÃŸªÚÙ¾í;æí›ËË;fàH ^Cx1þ.†uîJ”»¬ääþÎsSï¢ïð2žt …Ì^tKü_fÌ€‹„?KGÎà“ßäßY Áh}¹?öuî4ŒT·3©‰oƒßŒÚ^J¯¹€¶ÔpbéÏ|¾&‘/†%¢ÓÖ¸U­Tåþ΄½=펫#ë˜9¸ÿ(‡1¼[¤ó{Ê*(­ÊcáŠäîqAEƒohÝÛ4ã’OÔ™K)(-EãE³‹|€F£   \á8³Ùfç@öq"û£ÑŸ=p|Z4"º} ‹VïCéÈÅÒŸ­®š�¿NdEq8÷ÜÔ oϳ3´”ï]ËO‹7Ð$©?}:5½øß «Ø3{)Ã^ÅO{öצìþ�$µÄEwf‡ä°lí –oÆY§‡Æ50¬Ý4m?„Ÿj6oû‚Ak?-°ÿ îŒü4â·Sá¯|7ó¶ýƸÕO1«âôbÝz3ºÓ“ éÒ‡ðÓM;·ŽbT®w¤µeͲ{ø¶†·[À;ÝnƫҊªž“â]ôœúÕÖàáDÛ;3xiùIžN‹×Së˜AóhoŽl<mÓäŒ*„Bñ· –Zª³ÖñkçÆ)º‹Þ;ªÚílX¾„ÑÜÙ2ŸKc0)iüôÂ'dÕÔ1âžÁ4A¥öØ^ù%¶ŒûéÈ%ïºS4´nèÎ ™;?çõE¯’òký†v°×pìà®ÿõöšÇ2±ß@LzP FmÈy¦ºWÐj¼0j.²!ª…“Y“xö—Ç9Òô'ŽÞ0O…ù{ø|^'Þ\Ú„i}¯ÃE{jé®Ñ‘„jÈ:°™Š=ð8ÿB©ª8ÈäÏWrïóoÑÔ×Ô0óØìXö®f[j &—sF)#§ü'Œ±4«?Èe¶ÒH©bÙ¦¥,쪕:Íjn*º‰û{´&ì" ;ëÐQÖî;N»Á�ÑÂåì§Y³æñÆG‹(µØAQPOlaÓö2Ƽð³L*ªªàÇ/ÝOì÷¡•Š«øxW0oŒˆÀËtN%\ƒhäEùê•ì¢qI½‘&±©0êIžÎªcÌs×ar5P~`#>z…UžòÕÝ¡—8˜lTÔf²éçdÚ¿£AÑ9gzµŒu;¦óý?ÀR2›G§Œâ«¥¥¹iœþ)y75¢¦,“ñs“ùçb’bߥ«Î …J6m™É蕟õ9îŒ`Ïüž»ÿ�½û�¢\û8þݾ›lÚ¦“„$„^T°" ØET<¢¯àQ±c9zì]±»"à!ô&‚"UzSz•ÞIHBzO¶ïÎûIȲIH°qôþ\——Ovggç™™{~ûLYô!Ó ÁÄöíG¿>ï�Ýýn>™Ò�´Vxý²«‰Õƒ!@ Î –núŠW¶mãêžÛ)êœ*5Û·|Âk[Fbm΃�ÛWÍ®ž¼âŒßÎ'óQ¤�.€“‘¨–€Úl$¬Ó¥XŸ[AÖS]hCÕÝiÍÍI �dDZ�ábZÊ>U!„â¼un×ü9=¸�ڢÓÖÃ\.;ëœÀûÛ¹e0ý‘5Õ:‚Z äã÷ÿ‰uÁÆÌ^±Ëx镯q]>„LJÞB²NÛäÇ" ìaÖÖEœ zˆ·úßÏeq¡X‚-XB㸰˿˜ØûNöìþ†•vׯ^¨n�ƒ¥>fOÂ(¦õ»ž¤È(,ÁZ·¼�»{|�gÿw¬vÔ:•Q›DK‹ ‡£g½!ÚÊÎÔw9|Õ]\yQ‡ê�^¯Â‰C{éÖ6}@­q»ÊJ*²�áèО¤3–\À…w³nÔh6ŽͦÑcX?òYîNÐ2eò fJÇZÇ霊â"ãȾž1å²§x¹{èo{«·ƒ¢£KytäZ®¾ã6úunŽÑg¶-$Xb0¸K)wŸí75–63ôßïÑ:ýK{w!Ù‡vó͇O³Ùò ©¯ßä3XÏ áðaÝhgÐûý  LËUÜØ­;¡A¡D&ÜŨþ7°0s¥±÷óp›öD‡XHjÞ‚›.ûˆKíËØWRÕÿ%Çøe_*%ÍžåÍ�÷Ð*( KPíãÃËÛ³ôÄ>2 L¦‚C1iÔŒÁ„Ÿz] ²óN²hÏh.è1†—w&,ØBXP(}®|˜a± ëŽnã˜rznO*1ü³ã?èœÒK°…ScžWaÂllMJyÖÚ£ƒD“ŽÇYA¥<äR!„â¼vî÷+ôº¸²y3Ô]�ÁÏ^šÎ‚%‹ù6SÍÝw<Ä�]"?m•šÀ–·2â]#ÿç5R•ñìÄ÷x|è-´8×ù-É&ÛQÎÅ-úrYÔÑQCë„ë¸Ê| ëOL䦿n¡z½‡Ù“£çòVjò‹�ã.ò¢pj4Ñn÷¨ÞÈ– …kÚœ>€Ž‹Ô±ÖQD)^Ç4 Ò~$uc(·¾Ñƒä˜¨xµ$ÇêЛ|ûCQ<„7O@uæ�BÔ´µ‚¤VÛ�=ù –O_ç¿›sÚ2�€ÚIÓYÄ®;ørêRú>ƈží0|“¨6áÞúø†ÓŸ¾a$'¿Nãñ÷>¢OdÃËÎa-'sË\ž_šËí7ÝÁ}/$ºŽ×EZ hÝyäçñgï“°Ž½xð™×™ôé³4kãâɯðÙ#×lnäƒú/Ž®ñÄ«ýßJAbâeXN7  K FÕ“«‚ ªùˆ`¢ƒ/¤c�µæ©E6;é¥;‰oÙšâô”ªN?nê�fñ>¬¥™Þ¼ž³Sî8ÌÁ²nô µq }¯Ï/:a ÛŠ È-‚á*Ú…w£móN4í©+zõ͈Q!/]ký%6Ò„}kÅÐàð¡B!„ø  ÈÛÿ³~Úˆ-øbÞzmÂÏåá~*ÔZF Áhúu3k¯ÄáU‹H©óaó�z5Á:3¿ÅMòɱf2yËŒ_ÆÕ€NC¥¾o]k:óG}‡®çÃ\qA³ß}¥0éÂèÞ&�G÷žÀëîUWWÚòÓX·þ>ÛË[>N‹äB5� Ã Š·á¥f­<ÆìéKYgˆeø�þônÕÀÚÑtj�“A(õh4ꦮ’uOW¥Ç`ñkwê,„kô>ëí©%Qkµty)vÁÌŸ{0s5¾7DRa÷Òð€š—;Ÿ|÷ž™Ñ¿k *é*ŸÉé´˜Îõáô**Ùo !„BüÍŸJËÖ¬¼·Ïd¼éø|ÖbÌ—ÝÏ“W$`8—�P°§-`Äë£q^ûûqóÅkŸ1²ÂVu à9Í0x­äe輦DÂÎøk™ÝE¡³‚Õé׫TŠÿÍI¥7,U£"žÇz½Å#÷"\ñ‡Î\{Ä4Ÿì„Ô™üصv‹�µãÅ»×ýŸcs'ò<8ípúv©*T*5EY'k=Ƚ~.�‡“…ŽJ]•î*rY¿tŸØzñßa𛮈nW.ßNžÊKþusoZ™>‘´ Ä‰ÍÕøG”ØÄÄO_a]ðS¤íNaî‡Oòâg>~özñÜ• Ýö“d{]$à¾t}k…ÒˆõR¥ÀÐ~ûÑ> ÍßGQi6‡œuÞ¼ÞžŒ6–ƒCý¯SÕ6û­ÆMäÄêÊ%ÿ€`Î-´áöª% !„BœçÎíš?½MrKÊñÔÎQN2uÉ2ÒòìU-Î-ø)lÇðâË_c»ü^|mÛà£÷ï£|þ׌ž±� �‡&»Æ¶¡}H<›Ž/cM¦£ÖC©¼¶ãì:6‹¥ÎG¸*Y 2ÆoÊfÝ¡ƒ8ª_¬¸©<2—ù…Ù èjÔ—qC+'›ŠÝxÕD‡ÇSõ_ThAæP,µn�‚'�Ã…N¢�QXΈeG÷²hb*í†>Dǰ†GPÕjÍ[¶£ Ü�×]k “Œ©¬œ3¯htØ­ØÝµC�“üâ4ÿRÄÝIÍÐhµ 88zâg^ÝŸÈè[.jrðSÃh�Ô¬êñuG¤Ã+g3§4‘Á×]M“î,+f …9¸õñÄÆžm}R(=º‹iŸü›õ¡ÃH}ýjÎS³ IDAT;\Ä=Ï}HÊñ/xô½©°žíy�Zôê:”Rî>‡u¯ÍBèÕ�ƒ9{2‡Õ¬'1á1D‡†„Q¯¯Š‰tj/N�§Vx $2°}£~f{ž‰ààŸiDh&àW�ñÛ(·â@b{ZøÜ¶5ŸcÙE„D)§| !„Bœ×Îí�Pg$ é:§.æà{ý‰D�ðdžäè‰,œ­Ý¤g¤×‘tX¢" 3éëOÖü¼æ01}ïçöûn­ºÆOC@ËÛøà=#_OßÇ/':•ßð£ü´åÖËîaÇüA<þcú+n§�ًⵓ~äSnÚtˆwûE¯ªíð� R,]ùaÓ‹Œ�Å !ZTÖ�|´é¦³œˆ§UëéÓùYfÍÌ#«BÙµf¨PS”±€OOF2ñæ;Ðk«ÒPz&™-Æ·ñÙó¸ËùeÏwlkÿÿâ§•Ó €2²‹ÊX´‹Ö~ãÿbg%_üžoúF£×€3£€œÃitÜ“ð³œk¨1ÐeÐStözÐé}Oï ½ ÃZtÃl6ŸuÑš#étË~ØpúÄAupW¼ØÜµ‚nÕª®à¦È]yêÁî>›�‡ûD­×[¸è‚»yß�ÀÈ…ƒIÙLÍzÙ>å&ôëFõ“5]/˜Å]óÑoÒ«`êÅôá«lI ÇeÏ“Î]?¶ããZ™z.ã�¤„Ó«•×N¹ÇÝäÑKG¥›wqÏÝï¢1žÞúlG²ÈαÑáŽKÏzJ²B!„øs©>ï8A©L*eÀ}iß¾ ·¹tg2›|±½/¿¼�8­·­Œ¼â2œÞú³fH„…P£þ÷¿>(s:÷|?‘޽Çñ|çß V™C^™³æ [£7�Éo¦\æPáò€*C(q¡ ópj‰�À¤�·˜“y嘂ñÔ<¼Pì–äSîðÔ„M@$±Á�§Ÿ?XqŒÉ½ÁÜò›˜ôñ Ó�WQpe’e5N€QÓ¨¯­X øiÚãµ€œ¶òʭ胈ªy…‚Û‘Gf±“ �ÂL¦šuÂa/¥ ´]h1U…1¤91µVìÒ’LJÝ:,–hÌ�=éÛë"{û4n`ŸÏy™ “£ª¾O1?÷%oíâ?sÞ s Fö¨B!„ç™}ûö2÷ù妅üоhã¹ä‚ëhùÃ(f­¿‰'¯@k ¦™)ø¼ø’ÙeeT*zÂBμ(LM@`3’3á œù�ŠèHß[ÎhÔa$Ąխ�„‡%Ôùè†ê�p|ç^V¯-à†/®=c¤S…><�äð&¦ù€pRº?F�iÏ1ýàU<Ô5üÔ©’šx'sß]ÊšµýHºâÔrQ›#H:ËÀ—J­%42®fê¬ó`Œ ybí�‘˜ØÆœ4¨`Í>Éæ™_ÒüÉ…t 4ü�k”†ÖÛpUïJ¦M]K¿—¯A§½)‚x¿K1Uh Ñ$ÅøOÅ` !ÎX×™Áo½ªs.´z¢#“ëÙ&-$ÄX|Hh|“Gè\ÖJVŒEÛGG]üÊ�eýœoèüàrÚ™$ø !„BœïÔ¿æÍQ—\Í�·vcôT—ãù“¿L¹µ ¸sØp|/y$�~ž”*^ÛY3ã#Œw¿Å]m£ «ˆëÜŽÁ�öeÑè9ää•�Ž—þ“§„²jí\vUÚþôþj*�3�]+?gŒú)^¹!–@ý{I•¥·ßz7晾+›ço°‡p–�1÷uFZ0ìªËˆ 8üÜÖ¬_ò%‹^æ…k,èÕ!„Bˆóœæº¨[Þp…:hÛ¯‘M¾]Ÿ‘¤”8B5x½&¢bÂ~Ÿ6&K) k7|ÆÞ ',cÚŽ·Hîö÷´ŽÇx>Þ„^qQR�F~HoÝÐKÀoy*l ‘qÄ…»)ršIŠ;5f§R©ˆíÔŠàR7êà¢Bƒÿ´þ:nwÓ#¸õöÞ´hñ§Ì{@\sšGG 8ìÇĬû‹ï!*ÒÙVÁõW÷âÂŽ±UË\ÁfÏ"-/�Ûõ&ÁŒŒû !„BœŸòóó9¸üú㯸æï|ËRŠÂ¹ý¸iË ð&ñÆmÚ©I9,B!„Bü=ý6×ü�gT*}¯ùž’¾§ 7™1i$ø !„B!ð× FS0FéS!„B!„ð#·iB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„BHøB!„B!áO!„B!„„?!„B!„þ„B!„Büá´¿~ ®¼c*3�˜�Y[ʱ}Yh"[�i¬y�ÖÃÑ98U*Ÿ÷*z mSâ0´ÒB!„âoËc+ãXÚqŠÊ©#eM-‰ 6Ôy ^�¶�£%.T€J­'ºu{šþ §ÝÊñc)qªð9*W ĶO!Á ÷iÿuì¤KÃÜ’ög9ÖWÜ”ä§s(«ßPP'Ð91�Fõ».ÿüÜý¤—£6…“ŸB˜Æÿ5^ûqv¤dI 92 ]#ó’½ü ;³Ý´ŽOÁ`úß ŠWáðÊ©,âjh凙;é;RîyƒÄÈêy¨È\ÇÈ—'‘¡=õžSKÏ…µã=|óâmþ„B!Äß–ÃVÁÚùtÁ ~,ôœj4Çñ\Ïk4äºr:‹T²aåJæ/ù–÷ö�JÆH¸õN¹â .Œ7ÕB*ÊÒýÅË|ž¥E©Ž4`ëÌŒo_d�A�æ7ùB¥ìß±˜3—?ø Þ?[øs;8¹u—|µÔ TÏšÛߥâÞ0tÍïÚGLgðêwÈ y”oo{™þ ÍüÂ�§|-ÃgÅ-}>áÑF†?�'—%«G°J3�›·úS׳_þ(ä`š“¸Kš¦oN>e­iÕÆPûE(6Ö}xý‘Ûi|úOjÁf£lñB!„âoËít�î‰áµ7'35Tœ¤_Å“#f³3 ’îTøÉÛócæÌ!#¶+¿¾�.A�þóîŸ=‹Ñ*¯¼¢ž@¯b£ÜšÂ'o?Æ�I1N”c6×ül™|7>ymïåá LõŽ*^7e'VóΤµÊ>Áü2'/6fÀΫ ØmÐë>öÝÝ‹è íé ¡ À¤×üî} RiˆÐw&ˆ9|²±„ $Á|ƨ«JM€6�ª±£� δٌÍN`øM7mÔÿo‡?<9ä”èin‰àÐÁ4Ü¡-ˆ­ƒo~ÎÈXÂ"¢ •°'„B!DµÀ` ÿ¼ãvÔ*5Õ¹ÂÒîJž»ý÷mN#Ã{)­ÑV~9t„CîPî»u}âOÎ÷�WÓž`à�c5"©ª52Y—ðV—r[ÕemÇj®)<;�Š*m”Û‚eÙi“…®�º’l9û•uùÇ&2tín»êv}Á“û¦ƒ ®Lz“7ÿaÖl¾]ro¤?õ†Ø1£ÿSü£M<ª3nHi2GÒ«Ó`†¾žW×\Îû“ÐäµÂM^öz&mYMïSèè¿ÐÊJÒ5ûÌW/¤}Ñ*îYún1Œï®y‚þɦ.ü/�ìú/xóU¼Úçs¿¨#QçÏ)üiôF’:^LV컂‰ˆº�ž]»¢ÎS³%0’ØK»rQ²¾ÖºëÁjsâÌÞÅ�s~AQ@Qi�éÊ-ÞN�Vñd¿!„B!þÇx\NV�z“Ÿ}Äw4:wý¿‡!ýn£�ì^µ�Oææòìçýét–iÙ ÒY´t; <¨<.ò쮿óAúvŒA[k„ÊÒ¢Ÿ +áΑãxåhkšë ³’}=ïÞÔ�èúªPlvÔŽ Þ]˜…WQp)*#›qËÀ‡xò²„Ô¼·€Eó³9­/ r•±ép.Å9£xu“ Š×D—[ïf`B ê:aSN–TP¨p:ع /þ¢àlÚ®mÛ‡çﻞÎQ! ŽTªT: ®ÌÛ³€:þ‹ìë?Æ–7…A³¾`ìŠ|”ÊBÚôZÊÉAfòrv2jÉu¼¶ÌB›V/ÐõŒ‘REQÔ¬7w~‹6}ÄÜ_âx¼s‡¦­ŽBîžHZ«wx!6ª¾¹F¯ dëÎÏÉMx�ŒçžE]¼…1ËŸã…e¶RS`¹‰½Ï¼E°û8_;˜·7Œáò„—è›Ð윂ܯ¼æ¯€œ"+a4C ”•P¢kõ±¾]­ÖêépÇ›Lº½z‰z)?¾”Ï¿šÏÄ/µD¼:”Ž‘AòÐA!„Bñ?þ~fÖŒÜ1z ó¯ëBÁüÏygöj^ŸóÇ„Pt²’+A¿øF �›ò’|ÒrݨñPR–ψµÉ´�»’”ÈÀš7—GÅž�»)V¬%¹¤^/ÎÙÏžÜëhXOòRëˆí4˜½“þQ¹ÊK�òÕ磘0þK#^å©öN=QÁCEE 'òòðxl:=”—�®Ò BÁë5“âV~“åhæ¾ç&roÍ]>d®›ÌÿÍ\Ì}“‚Y5¼?aƆG]Þ®�»ŠÞ]."P‚曫vÑjñHîé¿—GZ§ªSÞ•›sžaë¦u(Qè^ײ2ryÏ :²žù;qI‹¶t j쉲.2óò~Z;>ºµ5‘ºúSŽŠJÒ`fÏnt`¹�ûmÇÙ¸ð?¬+yš7¤}   �]÷Ó'Nã°½”^üQáOQ¨ÈÏ ¯Òƒºâ0Ç J0:+HK;ȱ½{Épa=‘Î1�ž`K–�ÔU°ö�ám¯ã±§øï›ÓØpäVÚ‡¡–ô'„B!þ‡¨J4\þôƒtïv1!Zø £û dÁäd{T¨M)ÜöÏ^4æuÑ)ÜûèÜ àuròÈZ>™þ#׎ª`å³·Ñܬ¯ƒ ?ŽçÝ-*žò8ƒ{µÅ x‹w3jò4žŸö qÃî¤[lÝÏëSk´jeCd{ž|l8º¯G0wÃQlJ�F DsÇ]�sGõ ­Ç3n Ç»¿Ê—üöwcQ©TètµÒ‚^OJŸ¡|¡6ñèøuüXvƒ�ºGu†d’ãºR=MµCx2(ý¸¦…™]õ»£iÑ™Dãn¼ dWµæî?ŒÍ³Þgᎋiyù•5⻸­Yü´þ{ºu~“KXƒó¬(ЧU/ :]MŒ %X׌Ĩ´­>]T¥ÅÙ“ëÍ©x”sÜMŽ[Š¢`/ÎådÖIvlÜMZe3š›³É:~„#‡` %''‡¬“9”XÔ?k:BÍÉ´léâБÂÓÏþB!„â„®Yo†ê‡÷Àb–,Yʲë)4·àöGŸ`øðá�#0ŸñÈU@$‰úb—;pyiü0�É«¬UD1œOÇän*ì%Z£hoùuS:×¼ªVkèÜö~&ÌËk¿§ÍMÄ¢©wzJÞJÆoOçæËÿM{sãîZoÞæ·OÙ¿âDËrŠËr ˆŽG”—Vp(+ˆ® †:.øôârºðÔšÅ[I~Ѧ5£E‚•œò)„B!þןk=3ÇmâæIë)°ÙØ?c…«gñʓøóÎÿã__­¡ë•ÿ ÿY®ùóz\8ÝŸÃ}E©äpv&J"¹´C$æáAf²öî"Ýé:ýz�‹ŠÌ_˜_A›#z-(Š»Ý�Ëã­z�‚ÛåÄUë \Q¼dæ±íH­[$`¬o@F¥!ÐF˜NÅo‘]N;v—»æ´KEqãp¹ñÖŽ>ÖB²Nìa�»%íãþ¬° BØœ]Ÿ¥}ö›Œ9b­ÿTQå83×Oç¸ù´‰à||ÀݹßðÅZII^ ñ]bP©=X활T5#V¯÷K”nçIæ=ŸÈkÒʬ (^Ê�ýȇŸ¯%äêÁôM27j¤P!„Bˆó‰ªÐIûaCéÙí2Â�~ç‹Lº~ß�šIºGEçîm¹gxot eÅCá¡ŒÚÆà+Ú (€‹ô´U<öñRRnø?úÆ�º&,$1™«º_ļÙsx#Uͳ·u#TwÞ:îûl!]¯¢oT�(T”¬çÎçWqïð¸¹S—“ óÆ’s-W¥¢( e%Gøð£/ØÑŸ‘}›£®¹8ÑIQa V§§êßz®¼v¨JÉÊ.­ FưHÂ�š&åA�Ûʌϟe}Ò]¼: 'qz…ò²-|ðm.o¾”¯n'~Oÿy¼0x8½ ú?qLÒH«äžÜÛùž_ò{¹ˆ‹ü^ã&ëðfV0ä–Á$hÎÏõõÜß*€ä®7Ó¶Cj• cH,×^Ÿ@P€ÆU©0[7ñÖcsP«T€Š f¹vè£ô½´=¡fyЃB!„øß£‹ïÇ×nQÜš{^xµ)Ö‚â±®{�6c+¨9�.åR>ú8×]Û…]õa{Wöº��‚Û0oÎH: yj$ÎÄ]çéÞíhÕ,…²Ã‡)LJ&):= ¨ ÄTÆ�×¥æ4!ÍyæÚ2¶ïe\Xk'Ÿ“?ãñÅ»êK¬àŒfÄè¯x¾Mp�7´Q/v§íÔ)¨µx­GØR`á’+‰ªŠj•ë¦7è6ktÕÈ¢žööæëÇïàŽÎ­0éùSeÞ:ÚqÛëh÷bs—ã©=_Š›�½î‘=]}º áÖ´õìÍ)Åís®¦—ÊÒ½|·þK.úš~–FfEÁåw?ØÝ¥¸}fDEÁé>qÆg71Â}Þq‚R™TÊ€úÒ¾}‡ßg«P¼”çž ·âôWÓ興oF�FvB!„âïÍëqQ˜“A�Í[3Â¥2Ñ,&š ]Ýá+7óÅöª  RcŽnA¼¹:W(¬œø"“èÃ÷^C Õ©cr{y.iy•§'£ÑG¤ù̃r;'³r)³¹˜k5�±Í‰ÔÖ9*g-+"» Mx2I!§§ïÜ7‹+§¦óʰ§¹>ùT»Çí&÷deÎÓ�XJ³ØpŒ�X~¶²d”¹‰H!Úx:ƒØ*3H+r‡Åh¬™ÏвrJË1G·$Fªµ¤(�<«›àðbLu}Š“œÜ”8¼GV5’¦`³’•[„96‘h½¡Q£”NG9'ó3Q‡µ >Ðp:xÛr8RX†>0Šæa§o`ãr—’™�ƒÎGl ™ÆÆ¨}ûö2÷ù妅üÚçü56bª ŠIjÔ­Q…B!„ø»QktDƵ ²ñØDǧ]ߟ•䩹袒T§�É�Á±´ nÌô�4‹K¤Ù¯øNÁR‚ýïÔ’™•GbT Z$žŽ/­–fÍ[žó療›Ó:Ø?ƒ˜Ì‰´3û¿ÞCËàŸ¶PK"¡ ÞXFOLtKbêè “1‚–‰Mšg½!ˆ¤øvu|™ZÆûŠNBrBȯ[ÏdSB!„â¯E)ÍÂÙŽm[žgüå*7Ó¯kgÚJùÃie!„Bñ×¢ëÂÓ÷u9ç,ˆko*ôg­²„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„þ„B!„BHøB!„B!áO!„B!„„?!„B!„ç}øóxwîܹ,^¼¸æß^¯—3f°aÆš6‡ÃÁ„ Ø¿M[II ©©©deeÕ´eff’ššJiiiMÛÞ½{™8q"N§³¦mݺu|óÍ7(ŠRÓ¶hÑ"æÏŸ_óoEQøöÛoY³fMM›ËåbòäÉüòË/5mŒ7Ž´´´š¶œœRSS),,¬i;tèãÇ�Çf³Õ´mÙ²…iÓ¦áñxjÚ–-[Æ÷ßﳌ¾ÿþ{–/_î×W[·n­i³ÙlŒ?žÃ‡×´’ššJnnnM[ZZãÆ�£¢¢¢¦mçÎ�Lž<—ËUÓ¶f;ýö[Ÿe4oÞ<~üñG¿¾Z¿~½O_Mœ8‘}ûöÕ´•––’ššJfffM[VV©©©”””Ô´íÛ·�‰'âp8jÚÖ¯_ÏŒ3ðz½5m?þø#óæÍóé«Y³f±zõêš6·ÛÍäɓٹs§__?~¼¦-77—±cÇRPPPÓväÈÆ��Õj­iÛºu+S§Nõé«åË—óÝwßùôÕœ9sX¶l™O_M›6�Í›7ûõÕ¡C‡jÚŠŠŠHMM%''§¦-==�qãÆQ^^^Ó¶k×.&MšäÓWk×®õë«ùóç³páBŸeôÍ7ß°nݺš6§ÓÉĉ‹]Øl IDATÙ³gOM[YY©©©dddÔ´�ݧ¯/^Ìܹs}–ÑìÙ³Yµj•O_M™2…;vÔ´UVV2nÜ8Ž;VÓ–——ÇØ±cÉÏϯi;zô¨__mÛ¶Íoß³bÅ fÏží3?üðK–,ñYŸ§OŸÎ¦M›jÚìv;&LààÁƒ5mÅÅŤ¦¦’��]ÓvâÄ RSS)++«iÛ½{7“&MòÙ÷üôÓOÌœ9Ó§¯,XÀ‚ |újæÌ™üôÓO>}5iÒ$vïÞí×W'Nœ¨iËÎÎ&55•âââš¶ƒ2aÂìv{MÛ¦M›üújÉ’%üðÃ~}µråJ¿¾Ú¾}»_�8zôhM[~~þ¯ªuõÕ™ubúôélܸѯN8pÀ¯¯NžubÒ¤IìÚµ«¦­¼¼œqãÆ‘žžîW'ŠŠŠ¬›7oö«K—.eΜ9>Ëè»ï¾;k�h¨¦×®Ç�¯·NÔî«Õ«WûÕôs­M­ég«‹-ò«çZÓsssýjúáÇë¬éuÕ‰ºjz]ubË–-�ªéµëD]5ý—_~iTMŸ?>‹-òé«úêÄÞ½{›\Ó÷ïßï×W6lð뫺êD}5½®:Q»¦W׉³ÕômÛ¶ùõÕŠ+ê¬éK—.m°¦×U'ªkzí:‘žžNjjj£jz]u¢®šþóÏ?ûÕ‰ÆÖôÚuâÀ�~u¢®š~®u¢®š^]'άégÖ‰íÛ·ûÕ‰•+W6º¦×®Õ}u¶:QWMß³g�_M¯¯Nœ­¦W׉Ú5½¼¼Ü¯¦ÿîáÏëõ’ššê³¹\.žþyŸŽ©¬¬äÁôÙÑòÄOø,�ôôtÆŒã³ÒìÚµ‹yóæù,¤+VøtŒ¢(LŸ>ÝçÀØívóþûïûlD6›�aÆùtLII Æ óÙÑdeeññÇûlàðÛ°Ö­[ç³£©ÞèkoD^¯—‘#GúlD‡ƒxÀ§€———3lØ0ŸM^^¯½öšÏÊ{ôèQ&Nœè3[·nõYy«ÃNíPîõz™0a‚ÏÁ–Ëåâ•W^ñ9ت¬¬dذa>;šÂÂB~øaŸ¾ÊÈÈ`Ô¨Q~}uæÎxÕªU>`æÌ™>‘Çãá?ÿù�ÏFd·Û6l˜O¯î«Ú;šììl>øàŸ¾:xð ß†µaßMõ�µ7"�ÇÃèÑ£}6"§ÓÉ£�>êSÀ+**xðÁýú꥗^òé«cÇŽ1~üxŸe´}ûvŸƒœêcí®( “&Mòé+·ÛÍo¼ás°eµZýúª¨¨ˆxÀ¯¯FŽ鳌öìÙãwp±fÍŸ^}àSû�ÇÃ'Ÿ|Rg_Õ.॥¥ 6Ìç '''‡÷Þ{Ïg:tˆéÓ§ûôÕÆ�Y±b…ßÁaíƒ-¯×Ë×_ís°åt:yê©§| xõ¾§vQÈÏÏç¹çžó)œiii¤¦¦úÌÇÎ�;} gõtí¾òz½L™2ÅçÀØívóöÛoûlU÷Uí}Oqq±ß¾'33“Ï?ÿÜg�Ù·o³gÏö™·Ÿ~úɧ((ŠÂìÙ³}Œ½^/Ÿ}ö™ÏÁ–Ãá`ذa>¼¬¬Ìoß“““ÃÛo¿íÓW‡fÊ”)>ó¶yófŸÒê"Vû`«®:át:ù÷¿ÿ]g�¨ÝW<ýôÓ>ësZZ_ýµÏ|ìܹÓ'`U׉ڡ\Q¦M›æW'Þ}÷]Ÿ:ÑØ}OVVŸ|ò‰Ïvµÿ~fÍšåW'j‡‡êùÚÆ�‡/¿üò¬u¢®¾ÊÍÍå�7Þð«“&MjT�8³¯Æ�ïWÓ_zé%Ÿ:aµZë¬é�=ö˜_M=z´Ï2ª®µçmåÊ•>?Þ*ŠÂŒ3|úÊãñðÁœS_eggóá‡ÖYÓk[¿~½_Mÿá‡|ê„×ë嫯¾ò«=ô�O�¨¯¦¿òÊ+>ûžcÇŽ1aŸõyÛ¶m~ubñâÅ>5]Q”:kúk¯½Vg�¨ÝWEEE~ûžê:Q{>öìÙã÷ƒÁêÕ«}êD]5ÝívóÑG5ºNœÙWï¿ÿ¾Ïú|ðàA¿:qfMW¥Î:1fÌ¿¾>|¸O�¨®égÖ‰^xÁ¯¯Æ�çWÓk‡áºê„¢(Lž<Ù§N¸\.Þ|óMŸ¾ª>F­]Óë«_|ñ…Ïú¼wïÞ:kzí WW�¨®éµ@i¨NœYÓGŒáW'¦M›æÓW›6mòù‘©:˜žÙWÿýï}jºËåâ™gžñ©uõUAAÏ>û¬_M;v¬_�¨°ªh9³NL�:Õç·ÛÍ;ï¼ãSÓ›'233ùôÓO}úª¾š^ûÁêçά_|ñ…_�6l˜O�h*Õç'(•I¥ ø /íÛwhÔ›Ün7jµµZ]³à<O�m�•JUÓÑ^¯·Î6­VëóeEñkÐh4>ó¡R©üÚÎ6 ÍÛï=�]Fµ?³±óÖ˜ùhì2’¾’¾ú+öÕßyI_ýµ÷=õÍǹì{¤¯¤NȾçÏ[FÒW²ïiê2jŒ}ûö2÷ù妅œ[øB!„Bqþ«þä†/B!„Bñ7 áO!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!áO!„B!Ä_‹öüš/6kV'ŠJ…Z«Ç„Q"ªB!„Bü…Ÿ·”»6ðËq'�z7é'NÒ¹¡E8& €B!„Bñ Љ¶í¯à¢nf ‡wLã¥Õ»èÛ‡Ä@é,!„B!„øk„?�KpM$02½Ë‹×#%„B!„røsP^ê@¥3`¨¹ƒŒÇí ²ÂŽÖˆI«EÕÈ©yÝN*mvN'+âæî7 ŽŠrì^“£î|[Œ n·�Ê :³“VÓèïû{ðº]X.ô&zµÊ^�6*íPë šôr÷!„B!þÂ~åñ¾‹ìã x⎙½ó(Žêðáqqpý þçÛ¬É-¡)w¶‚¬\¹ˆYKWàMìÅEÍBÁ ‡×LaèmOñýÎ"œçÝbôPš÷#Ú�ÓãýÓæÄíª`ï¦%üûƒ)ì­´£øæ>ò3²|Þç„Þy¡ÿ÷„}ˆGÇ.`WA)¯lB!„BHø«Ká>f¼7žà¼Ä€ËÛcªŽ„¹ÛùïÛ èóØÃ\ѤáÅÀ˜– p'� ¾ƒ+ xgæb2Št¸î.ž¬fÚ¢d”¸Î³Å¨%<º7?3”}ïN`GΟO�ïù™oçã_ŒaL~£�^¥œyS>`ð6“_z“Ÿ_{••Ïƽmÿ—ú#J¬HþB!„â¯éWœöicïæõlÈêÊ‹;Vݬ(lÿ~9½®á‘ž-0iÎuú*›w$Åû^§•:„Ž×þ‹‹ïyŽu·ö$.´ƦNRQPP¡ú=ÎÉÔIêqý{/'õûítürÔعŸÅ¬Z¾‚)ó²YLÊ…=Ф+u,R¦Î÷±ï²  Á¨E±i®dÈ«kXzM/Ú„È£5„B!„ø :÷ÃüÜt~Y> åšt>�r<?2aY6—´éF›ê¡xpØ*±9œxjgŃÓaÅj³âò*”äæ°d×/dÛlT–—’·}»#; ¨ ‰â†^Þš´‹²²¦Ž®ðý^â½q›šq;¬Xm6<>§szq»lج•Ø�§NlUZqqËKÈY2ž3þȻԸ)-Î%æÚ—Ù:âþÝÉ€§Ž�W«"tÍåÄZN?•Ê@TTK:‡TPèôâUd£B!„BÂ_­à“™ŸÃÊ™†n‰NSs›ŽlØIŽ>‰ úv9Ý'Y=òrž9“Ì"÷é@˜½‰YõáÝq#ÙUä&À¤A›¶“©Ó§3æÛïXæ¼€÷nïEó ª zÅ$¼€C.[OQôb+Σ¨¼i§Œ*^7ikŸæþ'ÿÅŽôìªÏTp;O°ö»'xiÄ,Ý•]óúÎÝ’i¦Éb÷¦´?°#¹eÐc¼{}KŒ:MýÝ­ÓžñGEAqÙ© �Hƒú­B!„Bü‘Îí´Oo%Å…«Ø•Ôµïä™ËöãéxZ‘~úåm,ÝoÎ¢Ïæp$ç â,‰(Žƒ¬˜óŽE?È?ï¾›“ˆäꛇru½l$Âԉ˯xƒÍn.³Àï}[M•ZC³îÒaoÖB»„XL*'{VNbÙÁn½w8=[ÕzaJ{ÚFÉÈÜO))„Ô;e7¥Å‡Ùµ#wßÁ™Hû6-ù�îpªx=Û¾œÙI½x)΂^NùB!„BÂ_ ‡÷�](=ÿA¨F:U�W|’À˜HôIP‚›÷g`çÏY°ã8'kÙ5ï3ÖU^É]ƒï"ÙÔø«÷BÍ:’Ú—³þ�‚Ò hô5…ª3þßXjLæV\rÛã|9g¹Ý;¢Û;…o׿Óoð+\–xÆiÀ¶ò“äAáÏCQÞ»úv7ðé·|üŸ&ÿ~áoÇšïù|L¾í*Ú[Lò¸!„B!$üÕâUP¬Åôh×µÎpºÝéÂåtÒ&ÃÁKc#þ’!¸§.c©}›Ó£¹ùÞGigiÚóåÔÁ&“.%;#…ðÃܺQ¯‘º)½êTM‡7m¦À”AþÎØªÙÒÒþæWyþÖ¤†c£&ˆ˜¸[h­<̦eåìØr„‹ox™ÞbÐøÍ¼ž”ä Š÷—QVÚPúÓÓÈ�á/sCŒá÷¹ªB!„â/þ…å(Š—šûÆ(€¢àª,÷{¹ÇiçøÁ�:Ñâˆm|nŸërãµ–ãiDn¼ø®á\\ó¯¦;KØ}o>Õ£iŸéqRz|'òó Ó„Þ¬Uƒ�™¨¨t¡(ÊY²©‡òÒ4(ÀÓ@ò҇Œ’œ@�ö·épçÉ}Œ™:�¢”[ysxW‚MZÙ „B!„�ðW�uTsö+DñxN‡¿àƒƒqùæD¯‡ÌMã™¶æ7Ü5ŽÄ¥£ùyÑ :ß –&~´£ÌNá‘Dõ‰jâh•E¡*¬6%äz±ž\ÂÔiã¿f—'Î⛟'q°Ët ¯ë ¥:^JpP � Žê¹(ÈY Kãx¯ºáÃÙ|ùÈoþ%‹?|OAò-¼pãEËý„B!„øÛ8·££}ë.´ÿq™nûé.mÍBšQzbû”Óáɾo<_/ø‰K¯»—˺^I¯‹Z’³ÿGv,lòG—Z]ß Û™ùýÏUTp:61ûëÑ8/~„kzö¦KÏ^˜ó7²uûìu¾'�#…VbCâˆjð&-â[ a[A!……õÿ7õ¡ëˆ7ý6߯{t'ã�Øh‘˜L�^Áívûþçñ �ùB!„â¯éÇ“‰ éÍ�Qÿb·ÕE§ðê›n†Ó½S “6ìæè íãÝTì�·“fßû®îÑ wå­tž÷([v®¥S«�D6:‚:(«<Ì~ïó¼ÝR_ÇÍVþª–¤v´ ldRraµnaÖ'ïr4ú6îéw3QPšÝÎ�]R™°u —\ЕvѾ‹Ðs"ƒ ›Žv\BDƒ B§3þÛÖª!N¿¿d�Ì!¯ø¯�z‘1g>ÓAñà¶\Á´×Ó!Ѐ\(„B!„„?"bC¸ðæ¾�}‚O„¬9b»]Dò˜ìÞ´�^AFveª¸°Ï3\rc_ÌUïUk.¦ÏO³Û‚«Ä–ÆÝÎÒcµ’¾á*î|‚DS@Š…ë~¶ñ/wåshGÁü·]r'­ªNáT©5tºòi®ÚeÃëÊÇCl­¿ØÙ·i7¹®dîéûçô¨ZOTÂÅL¸Q‹åŒ§½Æ´çé[ÂpÕuæ«¢ šªUKðB!„BÂ_-Áñt¼ð&¦�øˆÕ7Mâæ–UA#¬ ÷õ ç�5‹¹¦÷“\q}+¿·ªÔjZõº›VMù<ÅKyÖfÆŽVó䄘M¿ós ÍèÒëtñŸyL-odPKÿ·8r÷³tí\Bû�¥«åOŠPÉz“ÜÁÿOá­/ã®Ö²Ò !„Bñwô+îøa¤Õ70 ‡†ß.ãôÕ{�´ô&ÿÈ_Κ={(û�fÔíÊdîÈQ„>uÝ»& ?ßîUâ(ä—5³ù.çÞÔŠ@Y·„B!„�ðS"ƒº�°ìåÌ_´•ʪv}x ·¿?éf°*#×o0£;f~ËVSoþÑgqúóíiä.ró×1kNO¼;1Y³„B!„çÕç'(•I¥ ø /íÛw�%"„B!„ûöíeîóË L Aô&„B!„þ„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„BŸB!„B B!„B!$ü !„B!„�ð'„B!„þ„B!„BHøB!„B!áO!„B!„„?!„B!„þ„‡¢ (²^D ²ˆÄ︆¡ÈF(ËHñ— ýMvy.v¯ ½^�FåÁaw¡ÒêÑkëÏ–ŠÇ‰ÝáA¥ÓcÐiPI_q~ózp8]¨ ôª¦m±ŠâÁas huôºÆÿêT–ÆIÏñaåýL~²f“öwýŠn‡§GAk4¡W6§oõA�JƒÁ¨G«:öX¶Ü4fð>AO¿Á 1èÎüNv+NE‹Á G£>¦]ÎSßóÔwR¡Õ0Ôµ¿VÜØ.¼ÞS¯UiõuZÔ }}Å�ÍáF£7žZ†þ;ì'žêijtõºªi*¸Ýœ/Z“ ½úÏ]Î^· ‡[AoÔ£©ÿE§–QCëˆ×…Õá>Î|�Û‰Í鵓QwÞmú¶CSøç{yø©Ç¸²{óß7By=8ív¼Fƒ•âÅårât{«^¡B­ÓaÐiÏŸ_¯/¥‹ß啃­xò�ÐÒ|æFxªUZF½¦¦ÍêòÔ¬ªª¾WÕ*Ýn'N§çÔ<*5:�½¶Á�·Ë‰KÑbÔkꜦÇãÂápWMÓwpjmÇ«ÑaÔëùS7CEÁíràVë0hë;V<õ}�®ªe„ µV‡A_{Qp¹œ¸j½FSµ©ªúÐíràp�!ÀØô}¼âÁ^W�S¼8�N\žÓë¯æÏ:î=cß‹J�^¯G§Q7q¿èÄáƒQÖmÐãqâp¸QéŒuêú¿³âÆîpáE�Î`@ר…ãÁn¯õ}4:L5µ¤~.‡§W©ÚŽÎü^'îêþRk1êuhÎa#P˜öfÉ7ÓzÞFŽÆä–(˜:⯮bt§~,»–€å/lY½>ŸK×0zæbŒæÊßÑ’tm/M[2Fcûò|Žå•–][�ËíK›è?®Ì8zc>{¢È6–¼”x†ÅoöeüÌmäêþn³_D4röb*ú*Úá�Öm>) IšÌ•˜r.äó³p_&“}ÆMVÿ2 ÛÁCJÆÌXƯÜÎ…fËߤ…D=ÎÞÄÃÁ¯ŠŠŸEGæ¡¥¼8t"›Ofòr3‰Ùÿ#Í_^:Wòͱo1cûÝ5ÀlLbõ¬‘ šþ;7s ©WAvÂ5¶.ùš¹Wâ(ªB9ÌÏ¼ÅÆ- tgŒ¼Ìäm'Iïl#&r3®±â÷¯R²î ~•)[ös%×€ELÜÚ3‡�]^gwtÖï7ÉGy¿ï`¹L~™ñ¬M½ÌÒÅïc[Õï>"L=©ÑG˜6ã­’uh(¶£>áד—IÖÕ|"i s9³}/|»•Äû4’hÑsãÂï´П‘»’ÑW#ëëRÎ0å£7èôñbåÖ  F™i§øàà ¥sÈñË?8{+ ]uå2²~Ù‡Ø�ÿ˜õ§“î1Òäfœgæ—Sî®ÕŸý‘k)h¢³R/­$jØhÆl� ¹‘öUÿMa<»Ö G.“Nü$$þædÇžçЕ8~[³€åÙ-Y÷À_HgÿÂ9ä´È„fõ±ÿ«*’ÍŠ�'p¹Îx¾z£mÅ­‡è“+Y´ÝÄø9C‰r�Ü[ùúHÃû�ä• A0pæÄ>F|4ƒ×_y›ñ­ý±þËu?…™»ˆ CecSq›æê3™—ÚžéãZãëæ‚‹¼õÑ·#:³f|6¢ˆ.õ(½¾ÿ‚Ý(¦ôh†«Z&=1'·0zîwÐöu6?e‹¢(�]»—ùíMNLEOy9�³0þ"»Nœáç­9@8]ïÙt�¤\ØÃ˜¯f’Üd^vÆJŸÃ‰khýU &¾L_kj×}’q¯Þäý÷—Ó~áDBýùNô¥Ã¹tޝVm!¹ö³L­äƒ¶�CÛáíå;ˆè3’­^jd‚À­ó±¤sG±1sóü.FÏ^C£¾#Øæ¦@tÞ¿�Íâ£WßâÅ(/¬ü›3è•—xëÍßY×¾ ϵõDño\LÌZn_ͤ gygç§4t°)'uÉì[ô!Ù�ßçµv.(1}r ç-‘lßQ„¢‚þXó5½o‹lוÕ_.GˆB {/ x7CSQÑŠ¿Äü%¿6v6}Z¹ùÛÿ+Ý—EóñË£‰”Ëdü±~m>‹eñ;£ééëXÜ\yÑü8ï^NªÃwÃ_&ÀANnÂAúû¦q¼Õ1[¥¬¬ͱ³7‰>¶’çvDÓgT¯J寕K>cø5'¾2†p7+´)Gè½ø rô£™òDœÕ>ô;ž¬1“Ùxªc:ÔÁúHmz§oųyÕ7L»îÍWm+ïåÌ['Yúã×¼¥oɲѯãi-b,*$Úl@«Ô`а~áÛ Õ÷ä·Ñ¯ád%’—�ÊŠ5Ÿ18úmVŒmG°Êžº­‡ñr¿OùúÛ]D|Ýï�¬ ö/žKFógߢ!¥ºˆkGv’ãØ†m¯õ(6@f¥²bõ4†Ä¼ÃocÚ¬’?NVÚuÞûxÉmG±¡½3*™‰Ø›gøäóiù.ÓžþšÓNÑbæÆÅCì=uœ™[�àQè}Õ Oaçê�\P*¨_íºPȉSg8���à[#U–Œ„|þÕ|Vzödó+Þ(ŒYì9´•¨é7Y7垪]¹¤‘qó«Î%a½+‚ÜôóÌ™õ5ïÚteÃØ§° 8ybm§EóëÔ×y6ĹæM®Kf妃\EZ”7ríÊAö›|ø|쫨¡0�½{&êÛ[sMkÝ™lñ,˜¿�€/³]Sô^z,úKöÆw�ÂÙê¯RþH&)C…³“+r ñV<:»üªl£".ìYÏñ‚:;ÅHq*[tœ>¼�u›VñQŽŠÎ~-¨Ÿýà_‰9´�—\ynN7<¬þÂê$�ádtvÁ÷np†¬Žo_Ž×‹³iZ»xY´ñ eÜà0j¹Ø•º$6¯ïF~öRN>ÖÅBxë ÐÙhJÄF#…fOyïà`<¬@¤I˜#YŸþÀîGèñ ajp ëÌO­â½}‡i[¿µÿ…KŠ©�”ă¬ŒqbʽÒ%Ú³0'íq>lß {µD�Z-žã-¥N¶ªb{‡YG-›|nÏÛÊþô¶„iTÈÿjíïúYnÈíˆ r/ÿܘÇõ³ÛÙ¡ÆÏ-‚î¬6ÈÝšròãÞ„ù”( Fê»(Iøf»^¤ÅÀ6¸�¬åÓoÊàæ~X+Lù�lRþH�•{èФ6í�m‘É×Ù¶s5S¶]ÁÞ³1ƒBb*=)»rb ßÄhøbà^lˆ�JÀRÂ^ëŸé°z/�šñ˜—3Ötz¡7o.ÚNÏæÃ²S?"%ÛLbÜEÖüþ+3ÏÅâÒ´-nÞ¢ra1‰5«~cŸÝãì׋æÎöXÉA4›È-(ÂJUb#C�K³‘œoÔ�P”˜�¸(sxwù¯¬�nÉ¡ [7Ú<Ù•uï.eýÑŒié^£ÇÙÁïçé?ç1<ËîqJk‚Ú¢Žµö%Ú³ÙX€³*›©Ë7s¨K‚k= åÏ‚Q¡à™>&¢q¼l‹Ý‹uQX´Ù,ؼ•­BéìX…S­˜Èª»X±ëb¼âéí_·AQ9³-¿§{ÓÊ7»ÚþNM¸ÈºS‰x:Ú�QƒAf*ÊãØ¡ÍÌTuäì�4ôµŒDyªÉ\²Šï7¥á«Ýð¯ø‡y‰ìÚ{“GmH*$nÖk9wd#ïê›qdtOš:#`¦¹¯ùÙ?2oÕA¢ÞîIp�Ü�uœ:¼•5µxÂåV…¡«"(¤3ï†Ùà®)™SAN2b^ËÏWúÒ´Ö�qçÃ˯ŽÂÞË »;íÚ(˜?´ÓyúÒ5úµl€³çÃ… <œIU,ñ¯61¤Ä“bQbcg�Ù”CL|¢“+£éžcíœK‡Ùx8††O>…¯Ü,)i³É€Á` ¢SÔ�ç&³ù•ÅLFJ Yu‡“ÿżßÑL8cs.³sËF4]FÒÉ£ê3?³Ñ€^¯¿û?cåkƒh*ûÞ½m$ZŒÅÏÍÌ&#z½ƒÁ€Ád*Y�DÌ&#F£½ÁXâb¡'9u˾¡OSOä%’¤ÂÚoW»2>øöŽŽ8j¬E 5ë…ê’@XþgWV“Ùĥ˴wñ¢ü¾�Ï¡‡8›S—¶�]K­|2· o€W‰â S»àZr (²˜°ˆf “Ï0=!˜‰íà v-yS®Â¹~K:E{ùgsÊXßSb0F %ñË7éÓ¬6V½‚½>å ßܪÅÄvõ‰ð,‰m’)±¯E›Æõɹ´—c™%VI‡¦tõáÈŽ?8žñh 1±Ñ„<óg§ŒáÅ«J]³ŒF={·mÀ«ë“t‰lPªøhpV”ÄaET½H…ßQüŠÇ‘“kÂ=­É7QX¢\ 2k¼z÷¤è«µœ�‹ãQ{‹ Fƒ¾üü2[ œÈ/f eÞ3˜,æjIŒžÁˆE´`*y×`4bÐ0šE�™1Šç²ÑT<×-æxV,ÚDp‡üëXÿª ÃÚÉ­Tñ�Éå8¹¸a¯4c4>ˆØR…«²å÷M¼‹Â=’†>åŸçge±kÉ,Z?Ó Õ�:8Ñ&*Šú¡>wOˆPâR‡µ‚<�¶Di‹cë‘DÚÔmB»–þX—Äø)ì|ˆlò$¯«÷²ú¢¶ÔõÕ¬Íårœ3¿ù†µ¯õ&T©¯d Mbï©X¼jEѵ}±â ÓxP?ªï:â÷‹L€Üÿ¦´ÒÊû ±XÝXT�Î9E35—uý#P+ï»Ä“‡ØœnEŸžýiãV¬ørŽöÜ™–j� ]Úw£ž«Mi,™\i‹¿O0Aö9¤çÞý¾Mp$-üTìß´ž5)nîUvo]�ªóH:{VØãd l�ÝJ¿âßUâìì‚­ÒŒÉø¨ÚTާ{�Z6ÆÛön\©ZãA —v–<²ªõ",âzl"]FÌáÐkÏÒ×Ouß_4\ÛÆì½™´éØ�ÎVÆ*]ø ùÙÞº’”ˆ´ôöAYƒñ‘_˜ÈŽýIŒ²�µìJç�sDs:…û‘�|•[9ÿ®�3Wö°ô–/¯·rǹ\p�ˆVŸÌ¶Ý1¼ôx{B|�KÚHŽ}P#Z7 GL½ÄÕ¬šµvö­s¬Ús†ÈîOÑHE…ºË±µsÁCSƘ"SaïàŒ£J�XnPhð.£øˆ6®Ôr°³ć—Jù3åqhÕ.ZÄ̯Vr+'Ÿs»–ðÝœ¹¬:t‰Ü¸,Y¸�¥ë�‘‘·"¦Ü[ìÞ½SÔsô�´†¿‰¿¾„ÄßC'6¼Ã/¿È‰2sÇ\”;Ńxãé½Í£Ù3lèúôK|;¤%¶ ÖJÙkDS>'öocíõ¶¼9$ Ue3“žü¬4¶|9‘¡þøûûã몦ãÔ�äéÍ¥ 3‚€>3‰‹KF ¶÷Æßß�¨öcØ�”B¾îî^te-:¾ÎŽ}W9¸d:�ëòÌÀ>Lþ`nM‡ðÃöSÌ}÷i|=Õ¨ûÎ'=«Qk sËrŒo "ÔÉ¥êÄ¢‰ü„bóš4k@h ?}Q"—.D“’]q±3�žtŽ‹W²Ñ>tgŠ˜t{8¤l„‹·_9]̼ÍåK{pì1‚e^¦º'P\ h¬QËŠ“ˆ&=évÎøY[•ߌG|\m1èÒH-³v0‘�žmƒ—•Je-h6pS㈯ƚrÀ‚žNNX™“I̸»A¶î�>úÑ—Ráôcì¸I¼Ó9kµVòʳ¨šôçY}ɉǂjaeÈ!%-�”´4’3sÑ•3�( d£øÍF Ð(­PËïÖÙZÓ‰�ýĦkÙé]­ÍÚ,bNîeúÀ¼}ýñ÷÷CÝòevŸ½}w›}¹WÖ0¦O+üý¨¥®Íøß“¦-óµ[,�6’¡¯/ãòµ“Ì懓—cæA‡°(žó#¤Ï¡[D]jugîúã†ûÙ”æA«°vøTc\7›óHL�%'°-]kÝ?‰h±�z;–+×ã0T0^é ò¸pî,iÙÿK eG®$àÒ¸#Þe%*ÑH~ö–¥¿ÂóaîhwÅ.UeI“Œ&ŒhTV%óÈÎ$àbç„S9IMÀN£!ÀÅš i¥J­C�&¼;åez¸8ac­BVébmBoqppÆMQ^©×¨5zØs,! ±DÓsðõ nëöÞ¸£ø¨6%Aá�YøúÓx»9ac%¯ÂH–lj«1íÒ4ÐBVzÉii¤¤¥“™_~ò‚€JY1™ŽˆÙbÂ`¶ÅÁ¦Ìÿ#Ô¢c›@n_¹Ê�KÕ×Y4pêà6V_jÅ„¡áXÕàTÈdÌ&>%Kh;:zÈk´Îõ¤¥$“œ’Bjze�ô9餦gQtŸÜr™Å=ÉM̘Í&Ph°«Fë„ Þ™<™—Zy£¶R¡’W/ u7™»þöõ»3´�2“¹Š¹©#îÂ:>NŽ`JÛ j×ÈÅ_Ä Oà ¾.=üQ—Ç‚�žô¤§›ËZ~ÈŽ�ã·µgèþ\ê9ÚcSq,8’ïÏãþ®Ø•Õm{üÜ\P‹i$¥Ü?A‰©0‘]û·q%¸?ï6µ£&=l6ˆIN!YÎc ª?m.ÌÍä\Bc#‚quQ?ô,{(·O•�í¾J{Ìœþm› [1î…ÖXå\aÙ‚±îõ2ýÔöº"ÎÜÊ‰ì† Q¹)Fô%$î™\ž„7è‚ÿá·8q0†È'BPé2¸°õV'‡3âùQD…xWk+ÌMæÆµ U:éˆÈl½©ã‹ý}ÖᡳZZÈM½Äú9ÛèÿöRÔ•ø{ZŒä^ÛÅ7Szðþº§ùvÅl¼r!‰­N“déPbW¢N»Î†Ïçp&b0k~íB.»ÎåéΣ™7.Ã:xc ˆ¢}^*f} Íòʧßbg£ÂÚVNç:Ìÿq5êÆ#ñT8f•7µ�)ƒ�«öõŽ UÅ ¾¼dÎÅ¥¡7‹Èô©¬?z�–mzÓªcPM–tr3’X?k2§ÃßcÚ°„¸+~q—öòå˜��?ÿ5¼šà]�‹Ÿ17�›7n’c–cç@½÷R­-ïÌÔµCps-ÿ7™I¹Ü:¼‹ ÷½ïÛ‡fsö\àÉ6ý©íh‡A£Á;ågó´DˆNeNò´dè1ˆ8N@cMhf2çsòi&º£)ý=yÚ"Š*ÈBÃæ4±l$%#-ž�,¾²Fc>1�«öjºåßfáœÙLÝ­øyP{~êۛqVV½½fE_àPŠŽÈ'›X¦bjµ‚È®ýùäD¦Çë�Õÿ •hIâðŠi7|!¦ÏâÛAþ¨1“w…KEé4#% 4essËö©é4d =F@fÌU~Ò�Þ//gí´g©c_,¼YÌâ.Ÿå÷¹Q¶]Àò¾"6ÞèfyqéÈO¼³Xû³ ±Ã»®JàÆÑ«äªípö®3bÑ“šK\º YÙØtFÅ»/S©ï9}ôwsÂN0“�š¾Õ,NŸØÉ¢›¾¼ûf$Vª´ªz•Ô¤Ûħça!+å6Ûnå0àÙÁ<°?pýÊMòLÅóâä®UÄ„>Ç+Íã¥zø9ö?î,é$¥bWÛ +@Ÿ•C¶9€(‹™„£XuX˃»h­BŸ/Éù•aЂV Ú³æØ/ĵ~Õ…X~ ˆgǽETïû ™Igø yÏj³x�_Åž·ï¯ü=,&ƒžãë‘Ñÿe^méJe‡A†Âv,ŸÂû²/Ùw´'Q̓K¬qE4‹ÊÄ^¥ (‰[ú)—Ö¬çíÇ£¨e]loV/ÕЗظo &´D�’]Záv‹Y0tÍýˇ.:vì>€mãN<ýt«ÒU¿ ÷*Ž´£½³Í½é“Ó.òñ·‹Y�\X¬Áx5fqgjý¢ÀÝ/Š—¦}Áw&òá’"Þ}¡Ö)»øfòû0â&?އÝ}>#S`¥±ÁêÐ>¼Êg�!ȶX,ºzèAuÃǪüÆ’S”Aì¾¶< Õ5…-›W³B_Ÿ7;5ÁM#Dl\ñVؾ߸ ×�tóTZ®^ÞÃïÇn’#x>àˆ�aåÔ�q Ö0wëvj áI?[dˆ�>ÄïÎo*¿“ báÞyœ*J'þúä:eÈHH$)ë&/-ÍeÊоœì㆕¹ˆK'×òìܹLWMbB ŸJÓƒg%ÝbùÚ­Õïψåëe¥@Q·)K¯`1¶‡G�ö%íø*Þþè:Óf¯gðÐŽxÛÇ�é 2ÉÔËÐF@qusÛÌcÎkÏÓ>LƒLCA~V&>�;ƒ•Ç»0©‹{鼊Ͻ†¢É ^{¶1öwÆgdâøÕ�®½ž¦�Ý�Ú�œƒÆÑŸ{Lé\9¹šŽó‚RJ'´ë‰‡�e  äJ%Mû�ä}ÕO|:}º “éßܑ݋§óé W¾x8­"\î§� SZc'ÆñÇÒYœ¶˜QÍ� Px#‰¤/ºÔ®°[D®\¼ÈSaΨ4Õ ù&nß:ÉœÍG¨Ûm<ÝÃî”Ѿ-kóÕšc¬ÚÛ¯¡¸©A¯Mfó¶M¬�7àù ½íÊ“Quøî—3¬Úq¿®�ð¶“1�mÛÖ³"Z�2¨¼²èåì„�y7·²ydÊ_�ÈÊ%/7—ƒiÛ1ÅÕfÜ{ó™¯1®ðöÇ¿1̬cù°ž9ß»rˆ&#WnbñIˆt LUaž9J™¹)èĶR¥ÌÀ‰õ‹H~f,cZ»£RTi½ãÄþåôùí4ÈP¹2¢kjÙ*î«*Z(º½‹�Æ`ÜŠD…y°÷ó¡<uŒ7?Hƒ»v&5è B4Ö|ºÂ\¶nùƒuòNÌy<§?ãú"“Žø“ëùì¸�÷‡?N¤ƒŒlm坿Ý>ÏÒå+‘·Á€úÞhÈ­Ùoˆ@^P¹AÅÑÆ…hƬ»ñšÊæ ¿3/+„�žm‚›FF¥çwùùUšì5j¬0V[´øÓÛør[ Cû�¡™ƒ†ª]´Œ\=»“!‹Öo@°¢U‹Çéêf‹PaÏ0›2ùyþûL‹5ïåö>L”£vüß(<ÔÎ"Z̘EYA©yE¸x¸c±h¹�œ@Š•7~J &³™ C&ýåÍ|·áÍ{ £u]'ä2)ÒOB¢jiÅ‘&�ÂYsv ›¶:¡ß³�֯Ϣim¯Mi¯ÀÎü�™Y­Wµ WckûÿU Ú[k™·Å™±Ÿ´ÄµÒ{Ë,鎰ò3=Óöu&²ip7 Þ~šr %=&òfLjÅ@‰w`+ƿܿµI|˜QŽÅ£§ ¯ônB¿ §–âø;±‚û’HYµk¨²¿'SþmX<³) E� Ùlßú3W,"5ãFõk�ëý;¯F¼<{s^z‹I—7b•y·g—óÉ3A8ÛÜ¿5•vNÔ wÂì× ÷g—pìhW‚º�å<o[Ø£q×3&K~� ±©ú.)1ÿ?¯]ÃÊˣǎ¡£—M‰ÅSÀÖÁ‡®}úrxÞ >ø&ž vJd‚�ø Öž¨2ÃèŽÍð–Ë©ëbÅü”yÌÙyŠ�ͽ)çŒ+šHM¾Ì‚ï¾ç¨o–ôk�WEÅ_P¡¶­KǸƒ$ZL¸U£»g]Ëü?ö’®­b¦‹fl£FñÁàúÕܹ›ÉÁ Ç‘·mE›>OàkW$PÛºàm[e̤%]à‹9?ñÎÌt^›<˜všê…xñæE\Æõ¢y—N„:Ëœ»�ŽoýÁÛ}f³ÛAEí.ïðNÿÔX÷-huI,ûn+Luùf`x¨þ÷þÍdÅìâ�•×4t(Í‚œ«>-̼ņõ¿qÄ­7?÷¨�メ«÷¢("SªPÚ:…ìݲžùgDF½Ö�HG뇊uE@.ÇÊÁ©ÊwŒ×w2}ÍAZvF¿†î¨ä ¯RùSÓ¼ãsœkÕ‘â̶¿¯˜ÏÇsSH4‘‘wÇ„RåͤiËx³øBNâ,ãõÍËHË×1µg‚Ò óÀÊŸh1»ûGVŸÏEŸ•@t’ß= øfŸ�´„[d ~,œwAá@³®OåÏw?nÅìÚ†àgòór‘¢¼|ôca>¹9¹Èìì±±’.~��P…w£¹Í2V¯ÿžƒбN0êM…ÊGç¿îœDÔÝbé«iÔçuZ4p­|�EÌ·/ñ{hW&¸¸c[ÝŠ,šp ÃöÓª[� n$`*Ê-ÕŒá~;8–q+¬Iƒ+P•Bi�£Ã�¶t _ÿñX}ɸû‰ˆjJ¯:5ñè—cïÊ�Oß$&ôqn|´ƒÏ¯ƒ“̓­w2ë¶Œêþónž§}Ç o])7¶òú²Ë´ìñ?´ªW&Lùù+ DYhÀˆXF9úÿ"™›Yyû7 Ô«zqÀæK ƒ‡­B­@©IO�#ƒV%'§|Õ�ÉP™L~oŒŒ G­±C]"Ý:;6ç³I¶,Xòs6·¥Ý€Ô5¸€Y®TѨ×ó ¿|”—viùìƒ4 u¾7³ZéТ ¶þÈÞýšOZö <õE)“U:÷ŠÊ %º‚\RŽ.gÌ=ƒGNੈ:ØWl['†�™Nã}«Xt&gï(žiÁùß>憗û»æËÔv ù Q‡VòÕ‘DlœBÝ¿I+ßaw-w„2u‘Ée‚ø““Ô´"2d2~‘´ñ¹›ÈE�YãÔ‚W�wr:YGß@Š=:,f´Ú›,ú~W-Œõ*ÝýeT®¡(QÊ-EK厈º[ü0s5½^¥U#·êç¨ Gcs×°èìØž/ß´fÆâE|¿½-{W�äD�áÐõ}~j¯C[˜CV2 u¼È×^@Œ…yèLZôfei›*ͲFù‰‡x{éAÜBš3û©'¨g÷ç¬0ºÂ3L�µŽ¼z�æåLQ^.E@vn>Z³}aY¹¶Ø*Œœ9¸ŠW÷Éùjf(f}Yz„< ôFŒ&y¹9ä(­±ÓXU~:ªP€ÅŒ©’`ФÌlô¢€R)çÖ™Ã,Þ°ûv“ic«'7§8ÔP Ãl1’_�Gv^�ºä›L•ͦæäQh² PV¾×š2Ï3}ÅF® <ÛÔ“Âü\ ½.­YD¯- ;'�½j  ¶¶E}G´ptäõׯc^°„�[wÒ-¬~²»û¦½Ãݸ§îcø=x?ÛÅ©È`|¼y˜3ÀVþ™‚Ú]F0¡ Ä\Íâƒr^{³NÆtö¯œÇÿ—x©­w °7·oãZR2i7Vðöþ奧‚L‰µ�á§éþAÆÓïþʰ(…¤ÆŸ&:Y�½gn.e’Ü EùÄǦV›-P®qÃÏÇÛ?ýê…"âw®bŸÅÛ�ÛT§ŸÅ I¹äXŒ˜¡šÀh™¬2J ¨H ¶®2EY-ãfrµh-ÅÉdÕH§‚M‚0ï8Nvb<Ô ¨Á÷ $\ÛÏÌQŸc3m!mb¾dò*¦oG�Ûƒ¬½rjw}–ü×öÓ¡gn 87¢‘[¥5‚œ +lŽ"w}?Ÿü°“°§Æ0³©_•�þnaíx;¬]™>KcÙž\ì\šüGçÀ&¼öJ“2…Êâ�åéX‚‰p._ÖÂ"} ü=m‰ˆÊŒyCÙ õöñÂÝ*¥ª¢ÉZ…µÊ+RÈ)„âxˆ\Nn^Â;×ÜøpäÚ†ºU;-Q”É}£_\[ôfj‹ÞÿcM,X,ŠôÁMY­öެ2AYoÄl2¡P©Ë!BÉf]7štèk0Šì\ññõâö…K$õ§N ~I——ÃîEÓøêfrdã·_boý½Zû¡T<@IƒÓ:t;Öì¦×ÈÒçÐö%²J0EEæbãE™…ŘŸÁºå³ø�6|2®#M|ªä2gwżîwgFbôq~Mõ ½¯ÙCÈî2µ!�G0¿óÝg™)ù Ñ‘¶½U”=(6èM�æûH•º#?ÿæÑm“ŽvØØÛ£±¶ÇA(?>dr{\í ¸XPÒö¢™Â„ÓÌýe ª ®|ЧîÕ6\…E–»kiÅ=n÷ö1©kÛ‡¸·VÀÑÓ/gŽ_ºLj¯àj™ÌyœÞñ+“Ÿz…@x÷)Ìž9œ†Þ¸ØrhÁ8>IjÈŒii\�[ƒIOÜ©M¼³í6OvÌ ÖµÿÔîH<|ˆ³2)ØÆ5‡ï IDATù›¶,-#l(ÀÚ~�Ì«Ýy¡çh‚Îí#ËdÅó¯Œæn6h¬A&ÒkÌ ˜ÎÖ~Mð¨x¤)�yûà™|’sùEÔËĤ›É*ТPÙâdk"úìQ–'êà·©üös¥Ne *9#fOd„}WŽ3‚ oo"2®s1/ŸHÑ­ŒñØBN¡“ ÁÍ£òàü×c9r+–½¹±tR&àFP€�5¬�Çï¿1æ�UÌie[éœì¼ òpfÝ…+\ÎéQåuy‚\�Ú3œnÊUìKÉçñ�‡ ÿ òÉÊKEðhŽ Ï+"1AAXÛò•Üëwàå·cË‹ º‚x¶.^�¹óó<Ѹ6^ÿÊ+m%$#é1{Y>ûkœûΠµv.«#*Ø÷è™ÉH8΄=ÙXÍ[6¯­äô”¾„¸ý¹¥ÏŒ9ÍÜåÛh<â'šøV¿ÊÝ"x&ïm~:9œf!>8XU¡v *RÏŸ%š¶4(³d‰BÛ÷]¡y‹çѸÕÜ�¨¢¥\\ñÒf’aÒa,‘׫#6-TÖhœkÒxbÎí⛉"±ˆÉ}#Pæ6fáäIL]òS‡?N¸G�µ?ljµbD£¯Ø~ùîÒpk<´áC‰Zጓ9žt¡‚è’r‘ïWn'â©×Ù »ò�1“pý<näÑtP3|ÿ”c!-ö*Î'Õ{P9!^³¹r¹·Î*¬Ô¯Y*ø„ÓÓpœóII´q¸ÛŽº\2SâÉ󉤅ƒèˆ¾¸‹o/;òÅóOå{_k³]æ¶Ex0W�?‚{Õ| t¶ç§3Ǹt©�ªvdV&Es)=‹V¦lw׫¸k±ÄÆöL ìjð‹bIöÞòÓÐ' º´¬Eþ õdgeáàç‡K ZI_�ÇîïgðéIw>w8-ëÚéùŸ~ö†‰ØÑ�š yѹ[c~˜³‹_ŽĉÍ©¸×�LÀÕSFj–ƒž»F S§®âWc ¦=÷á.ÖË&C!gOnà|ÝǘênóPÊß½v8=çO®c¿OgÆÔr.KŸZHVž‚j<Þþ¬jâåÆúsg8žÑšv®w×cîeö¤óœŸ+%èu©ü±yEõ{0¶[clïÓh"7¸|S‰“\}Ï~�{–yË7Ñ`è�4õ{¸¢ëó‹ÈÉËÇÁß—jó¬`¡(a=·‰ÁËÖ33Ô�ý_ ¥søÞýb‘�)ü´)†CÆdSýÚ��qŽ¥;¢ØkO6¬õ§w‡{ýì~§ý=™Ys3“øuÕwÄ7~…÷šzâèì…UÃOéh(o„B¶­_ͪ {^z¹7-|}±WUªý`å\��ÎËYq%�§ƒjau'£u^ {.Æ¢qlB°·-Žª~ êyïúqc½·&0¾×ºÖ«Cm�¥¼½=–²âJ }#Ðܹ'¤0‘c—¯‘¯ ¡~¡î^A‘|ú†T844Rø~ñÏ$×ë˸–áøù[U½ÎsIË-ÀÖ>ßûÄ&ˆùI\1xð´£åC^ùð—¡�œ¬4Ü||@°�_”J´¾mìÊÓÚתMýJÆYQž†SJc@ †—ÙL$$þ»ä§D³uù{XÚ-£‡Œ‰™8mø”Ã;Ñ#Ü» xÖiÏ’ä$ÌUYÞEAiƒãŸ}‰´.•3»Wq.`?¶òº¯"cïÚŒ×>íJ»³ðÊ5òÑØ(rd²D¶þqŽðîÝð»³LmùŽ/¿´cÂ;#©'È@Ëêųùö�=#?lJ¨»‚ûš¦]ìÑØÈIH¹B,­ñ·ˆ2…P—-�s&)Ÿ' ”\ ¬åò…SÄ;Õ¥ƒ·+Jd2=g�íå»�§qwmOpÈý¢ÇŒÜ¾²�yS?Â0è'>~&À¶1cf}ÉÜ1o1CS†?Np •p¹ÆšÀÞÃYøÉ7LQðÜàÊ4GN6ÔnvŒ3§-ôl׳éüé=ÒÕbr°vB%î”wNwty\¾t+ÿÔq± ÜŽ;ÌŒ…k8íñŸ…»<øø0j‰½t†<�ÆÔ÷T#b"=õ3üÊZÛ¶¨ï^ÎÇQor9Þ–:Î8üÍö…M0}ë ]ó·1 ó@mÊçêÞu,ŽS³Ïv±XÄJÆD±rlH?Éú®ômå�ÅK+ú‰yÇMŒJ-å�sÖYV\´c`Û:%‚z6ë~ý�ù3yqH~NeÇ]ÉÙiä‹u¨øwÛ-­iÄ‚}˜½z3ŽÏt§¾‹ˆ!õ8_/ÛÈ¡ÚQÌrsÁJ°�›|š”Ìíä‹F!T>ËxŒˆ)7¹„ mÝ)·MêÒ8·g§|&ðSkŸûš9Š Øt,�æ­Zâ«¶ "�Ÿ™Ìšßb]ŒƒúWƒ,‚xí²q½iÓ£;á.rÂçï¢óÄ5Œoö Ü]ˆð%ïô�¬Þðb2�yñˉós*Œ»²ëPÁ-~^¿�¢ZíÕ±æ�nW+ˆ¦•ÈúYÉ´Ö¢õ‹ i¯’«m*Û?òˆ>¶G½+á ÑØ¡jñƒ]-žz¼=¶,ç[GG&vðEaÊâÀ¾-¬¼žC×ݲV£ð ųÝ ^ÂÚ*—� šÖ/ž÷Áƒ§{¶aúo+ùÚÕ•©]Q‰ùœ9º�OÞ¦é�W ·®|¶9¸ùÐØíÞñ ×űÝZŽÙ'�Æ QKÆ¢Žœ8‡WDs]¬YA*vüÎ�RhÐcuK,—÷²!/„ç›y–ö“éÆ.>_±�¾ øÔÝ ë‡Ü$~KÕÍ4�Ô “Y0‘‡ƒo¬U5qÝKŽzÅ;ÿ’�ø�c&/-‰mßâ²ûTÞè‚£• ÜÒ¡• K7m£cà¬ï—Z@ee‡»§ÝÿK)«œ«¢�ØkGXö£’©Ë[ájss”ÌÖ�ÆÏÍâû‚w˜ýý$Nmt.Ît%!«ÝŸ9Oˆ¥ßöž0‰&éÇyëÉÕXÌÅE\’†îƒÒ©Odi¼G‰n[…y·Ð?Ö,›ÎÀ¿ ÷{–µ_ ÆÕÆšÎý:0âRº."ÅŠ˜ô‰Ì›¶œ/äŠb«¾`!ˤ$Ô-œ‡÷¥Ñ}³t+ñ©Åëó7ãä∦ôôJŽ£[Þøq1Y9ÞÔr}€�Yáá݈žï0-êT¾ò;úºÔºNÝÄÜ.²Ä]/ŸëIÙD߾ɤ^e¦\,ßV¶­^ä§¾�°ÁBaÜž_´ §‹ƒQ.`ãÔœ#Úãb-ðq"Šè’�1tÞϸ« Š˜d thÀ#:ãQÁÿÔ{ƒ[Îuhíñ®Uÿ¿c^¡²¥ÅÓø(w:Ëæ}Ä*…¹hAk¶P«ý+|ÖÊ … ´E:SÒ9yý;ž�¢}˜¢±€ß—/fáoªb±I0¡•{Òóé><ÖÐï>qà•ßQ‰YËÎ?ñÃ*yI7™(P¸Ñ­K/žjL¹ªˆY¤ÜBÑô)Z©þ~94áÝ™Ö+‰©[60bêVœ• šŠÈt¬Ïš~]hXKƒ š±$Åq!ão|ùNVŠ{6 '×Lzï9"KŒ0†k1ÖÅ#8ânÿˆFnß8ÊK¦þÜ WÛûïq¢Eϵ=?0sͯ8”$:4XÀF!§Û�7hw#i—XÛY†BQü{¶®>4tË6ÝK%ú€•ê>ñºf ·ãâàÒEMÝ…uEƒ‰LEãfÏ0iP+3S8}ñ¾ ýi+h©¤/Þç=±ø]Q¼ÿü‹lÚ›™1K˜ýëtö¬U ˆf d*öÏĦŽ÷QnÄâR•ù!™RCh£§Yz}>3ÖÌâèf%2ÑB‘ #ð±×y¿¥ ª‡©»Xa&Šrone⯿cÇšo¶`V«¨Ób(3 (-»Ù�ÏŽŸñëò»J:z¢O¿<Ý�(›‡6>¼òçàK—燕þÓ3 +¯¼Pó?—+ìíôf;Rž‰ÿ8K—m  x2£Û¶Ç펿ƒ­ -ÇÓýD7ó-Dýey\ä89×á•Þ.x+îÝôÌz#Ù7âi7ùEê¹8×0£–€m@=†O[€_Ó\MÌGDÄb²&rð3ÔV«À¬Æ­Ñó¼­oÎó�=N�_×­µ `AéÞ‚û5-—°Aaʤqθ;W–û,”^y¹÷9´&3f›”JX)±kó,®ýÖ“4¸1öNÈ ‚[óê“—3õÅŸ‹äÞÍÚ¦.¶V5«¡LæŒw¥ 2¬5þxk¼'4ÞÞ´9‹÷nxPUG;_‚[²ê×u\I¤Sqú5æ-«Ú•f‚E J{ä2@i‡wÓ'xE{†<‹ Dû€ú<Ö¢!žªêlj»wCÚ{áW1¡‰J�kdw&d%Û,C@@ãLçvÍñ¿GÏ)âüÎ(üƒ‰pýk†¼L�OíHÞÔ¸bSÉé’£»£GO&äàa.eêAp lÌãÍ"Jcçd* ! ;󭯥RwQ°ÆÏ¡ÄeP´ Í8ÅÊí>Ö›G¯PãÙó]~hð$[×$W�#ˆ`[»!]ë×ÃÐÛÕeì({Zw~ ‡¬0üO]Ag1‹Ž´ëý8 |]ËÄìÚÕk]@%.ÔV6nÏË3gÓüB:fÁŠä€Ì·5ݽqòÊiRÛöÀCVªZ ü,ª±ÜÑÚD¥=-š¶¥i`M]½lì챩DΖÉøùû?ÄØ�a×i+æ„àVÕ]rJì5mü k†è炵\@¥±§e«§ÐÊ+•Î6ÅHáÞš×{&p2M,®¾LIHÛþtó«~ýQªÔ4l1/o›{ä+™KsÆ<ÇÑDcÉï ø·~–žu÷®Ú˜ÛDï>J‹W?G!“ý“P@¥tc@ß6ø:hî� —)ë:’A‡ù­dŒ +ÂÚö£Si �€Ê¥._÷°C^…Ï�ÒÚû;b´1—­{¯܉ˆàò{\ÖµÛ´žü"õ]]jpy·€�­/Ï€Ãñ„Òþ+º´jM¸OÍ‚¦…ê¥C&S`õ�^‚LŽ[`¾Vêªh.>ލ€K·“‰Õ1 ´ŠïËm mÎ`½w�®ßQZÙÕjÁžêû¸(+ñ‰d°‡¦úØãì}ÂóÒ8Üw#9߀h‘áÕ�aÞhîÓ92ÇÚ¼ÝÞß ‰ñlÜk3ä…×pÝs„[™ZD‹ ×z-èÞ0ð¡¼Od2 MÚv£®�3wD¥�M{Ž1êÓäYŠsXÌjBÚ·¥CmÏrk‰G£ŒJÖs1C[:'åJo: èDÝÿñjá›zKÅ€\z}Þ…ððI —��øÏ¡K�å—Ïû°5h.?¿Ð•Rö�¯“6a“_ŸŽÝÓóxwP]Ôÿ¨²ïbꛣè¹�‡ü£Êþ°ˆ–,|4”Ïý™óêsÚÿÇb!D 'fòÔ¤fÌ›@Ç0gäÿô:r8µv#–:ò˪±„Û¨ùÇØº yœÝ0“�KœXµb4ávÖüìô§VñæÔùDMü‘W;xÿ·æ ùìÚü3³¢#øiLœå2$þ=\¾|‰u“vbë€Ô³ÿyÔ®Þtíõv²;É𪈎µOkÞz®§v¯æLÂ?IóKäÀ†µœ³ÄkOý'?€äý¿óíiž¼þöÿÁ xAF­úÏ1«ã~;xƒœ¢A�TD´{ŠaÁ;ùagü}ÝÙþ>˜ÉÉ>Â/_ŸgÒ”îiÔÿ Å�Ìhö¬_MN³I<×Üë¿7 ²É¸�Fd‹Pd’zðoFê] A‰oë®<ód뿛ˡ´C¥4Ôzb2/¸_á§Õ;ˆÉü'”¹�ë×w²j³‰—?탇ãd‹º¹—_ÖŸ A�Áô�t࿚ÿL®ö¦ÞÀ›Åw{R1˜þñ jÏHú?=ã¶ü¸;ùQj£!žÕ_þ†ñù—èÔ0+ù@õ3äpáøï¬¹Î{¯´ÄÅú?�¤ñ¦÷°ILiì†\ Çúw‹<’Û§„„„D %ç‚ üËê$ðÏ©Rq�ü¿ªjÔMÅWº ’ÐUÜ|_çßLÿ“êôß�ÿ͵Gâ¿AY·Oé‚ ‰;ü«Îj�þ› �$pþ›ÛâŸ7¦ÿ›ãQ2¾Hü7�Ü>%$$$$$$$$$$$$åOBBBBBBBBBBBBBRþ$$$$$$$$$$$$$$åOBBBBBBBBBBBBBRþ$$$$$$$$$$$$$$åOBBBBBBBBBBBBBRþ$$$$$$$$$$$$$$åOBBBBBBBBBBBBBRþ$$$$$$$$$$$$$åOBBBBBBBBBBBBBRþ$$$$$$$$$$$$$þíÊŸ(ŠÄÅÅ‘™™YúÌd2C^^^é3�NGLL Z­¶ôY~~>111˜L¦ÒgYYYÄÅÅa±XJŸ¥¦¦_îwINN.WŽÛ·o“žž^úÌl6Knnné3ƒÁ@LL EEE¥Ï ‰‰‰Á`0”>ËÉÉ!66³Ù\ú,==�Û·o#Šb鳤¤$Ë•->>ž´´´Ò[,bccÉÎÎ.}f4‰‰‰¡   ô™V«%&&½^_ú,//ïž6ÊÈÈ ..®\9RRRHHH(WŽ„„RRRþ”¾ú?öî;<ªjëãø÷̤÷Ð{Gz—f媠bE¯¢W±]•fC¬Ø{CEQA‘.U@zoÒk¨¡¥�Þ“)ûý2d˜ÀWñþ>ÏãsoÖ´={�ÙkçÌ9YYYìß¿‡Ãá•«”*WG�-U®ÒÒÒ|r•��ý§æ*!!Á'W)))¥ÊU^^Þis•œœ\ê\�º=ÇÆÆ’””ä3GEs•ŸŸ_ª\¥¦¦úä*11‘ƒ–9W…st¦\åääøä*==½T¹Š‹‹ó™£ârë•«Âí933Óg{.š«âÖž’ruêö\–\]{ sUtí9Ÿ¹8xð`©×žârUtí).WÅ­=%媴kÏÙ䪴u¢¸\ûÌËÊÊ2€™1c†'vôèQ˜�7zb›6m2€9räˆ'6sæL˜¬¬,OìóÏ?7ÑÑÑÆétzb�?þ¸¹óÎ;½rÕ¾}{óæ›ozbyyy0ãÆ�óÄ’’’ `V®\é‰íÚµËfß¾}žØ¢E‹ `RSS=±~øÁ'W/¼ð‚éÖ­›W®zôèa äùÛápÀ|ûí·žXzzºÌüùó=±ÀìØ±Ã[³f�Lbb¢'6qâDŸ\ :Ô´lÙÒ+W÷Þ{¯yøá‡=»\.S»vmóñÇ{bÙÙÙ0Ó¦MóÄâââ `Ö¯_ï‰mÙ²ÅæðáÞØìÙ³ `233=±/¿üÒ^¹0`€¹í¶Û¼æè’K.1¯½öšO®~þùgO,99ÙfùòåžØîÝ» `öîÝë‰-Y²Ä&%%Å=z´L~~¾'öòË/›.]ºx�£gÏžæ©§žòÉÕ7ß|ã‰eddÀÌ�;×;xð ̶mÛ<±uëÖÀ$$$xbS¦L1€ÉÉÉñÄ>øàÓ¨Q#¯µ§OŸ>¦OŸ>^¹ºè¢‹Ì|à‰åääÀL™2ÅKHH0€Y·n�'¶uëV˜ƒzbsçÎ5€ÉÈÈðľþúk‡Ãá‰=ù䓿¦›nòš£+¯¼Ò 2ħNŒ=ÚKII1€Y²d‰'¶gϘݻw{bË–-ó©?ÿü³O®^}õUs饗z�ã¶Ûn3 ðZ{óÕW_ùÔ‰Ù³gûÔ‰-[¶xbëׯ÷©S§Nõ©ü±©S§ŽW®zè!sï½÷z­=-Z´0ï¾û®O�˜4i’O�X³f�'¶}ûv˜ØØXOlÞ¼y>uâÛo¿õÉÕ AƒÌõ×_ï5Gݺu3/¼ð‚O�5j”OM_´h‘'¶oß>˜]»vyb+V¬0€IJJòÄ~ù埚þæ›oš:x­=wÞy§yüñǽra† æS'fÍšå‰9rÄfÓ¦MžØÆ� `Ž=ê‰Í˜1çN|öÙg¦råÊ^kÏ£�>jîºë.¯\µk×μýöÛ>¹?~¼'vìØ1˜U«Vyb;wî4€Ù¿¿'¶páB˜´´4OläÈ‘>uâ¹çž3×^{­W®®»î:3xð`Ÿ\}ÿý÷>5}Á‚§­«W¯ö©é&Lð©ï¼óŽiÓ¦�W®z÷îmþûßÿz­=ÕªU3Ÿ~ú©O�˜>}ºOMß°aƒ'¶yófŸš>kÖ,Ÿ:ñÅ_˜àà`¯\õë×ÏôêÕË+W�:u2o¼ñ†O�;v¬OM_±b…'ãSÓ/^ìSÓüñGŸµçÅ_4W]u•W®n¸áóôÓOûÔ‰#FøÔôyóæyb±±±0Û·o÷ÄÖ®]ëS'&OžìS'Þ{ï=Ó¬Y3¯µç¾ûî3>ø W®êׯo>úè#Ÿ\M�:Õ‹��7€ùã�?|êÄ¡C‡<±9sæøäjøðá>kÏÀ�Í-·Üâ5G—_~¹yå•W|êÄO?ýäS'–.]êS'öìÙã‰-]ºÔ§¦�3Æ'W¯¼òйüò˽ÆqË-·˜'žxÂ'WÇ÷©ésæÌñÄ:d³uëÉ~é�?þ0€‰��÷Ä~ýõWŸ\}øá‡¦Aƒ^¹zà�Ì}÷Ýç•«¦M›š÷ßß§¦Ož<Ù§¦¯]»Ö”Ŷm[ÍÛ7|b>m>Ò”¹ùs¹\fÏž=^_4‡‰‰‰ñZÜrrrLLLŒW‘LOO7111^ Þ±cÇÌž={¼&äÈ‘#^ÈÂŬè·ÛmöîÝë5áN§ÓìÞ½ÛkcÈËË3111^ 33ÓÄÄÄxm ÉÉÉf÷îÝ^ M\\œÙ»w¯×"xðàA¯"\X‹—ËevïÞíU LLLŒ×«ììlãµð¦¦¦š˜˜¯QBB‚Ù³g�×8>ìU` ›¸¢_¼Ýn·Ù³g�×R˜«¢‹[nnn©sµ{÷î³ÎUÑ/Q…¹*ú¯0WE•Â\ý"Q–\m¬ sU´ènÏE ba®Š~±*ÌUÑsZZšO®K�«¢ ê¹ä*##Ãg{NJJòÉÕÑ£G}r{V¹ÊÏÏ÷ÉUVV–O®RRR|rï“«C‡�·\®=¥ÍUÑ9*.WðÉÕÞ½{}ruêÚS˜«¢kϹæêLkOa®Š®=…¹*ºöæªèÚS˜«¢sTÚ\�ºöW' sU\�(š«s­ÅåêB©Ååê\êÄ¡C‡J]'.´š~>ëDisUÚ:q¡Ôô?»N”6W¥­eM?›:Q–\ýYu¢¬5½¸:q¾júþýû‹ÍÕÙÔ‰Â\Ýž‹ËÕ‘#GJ]ÓϦNœ.WgZ{JSÓK['ÊÚüYŸ6i²ë¤sÓ»ÝhÚ´™„ù‡Ø¾}SÏ#ô@¤Nø""""""ò¿@ÍŸˆˆˆˆˆˆš?Qó'""""""jþDDDDDDDÍŸˆˆˆˆˆˆ¨ù5""""""¢æODDDD^ðè! IDATDDÔü‰ˆˆˆˆˆ¨ù5""""""r�ñÓÈy“{„)³f²dO*ÆåGõ¶—q÷µ¨fYXš5ò‘o§N§Û¹îæhÈMeÂ7ï3¦rú¶®O˜º?‘¿”û”ó'ª mª—#ØnHÛ¶uˆM*ÀéÒÔˆˆˆˆˆ¨ù“¤Ü¼$oÍåúªQ„Ù5"""""µ³;ìÓ‘ÉÎ%#øà‡Dz}ú<ÿ*Yö.Ò\.'ØìØmHjÜ8�.,?ìçp£ÛQÀ‚χ°4êrî¿ózꆖLþŒŸ¶¤�2EA´¸ª;w_Ñ’òÿ¯o4‹&2bT¿Ö‡Æ‘¡¥þÍÞžõó·t=iåéÔµW5 Ãfâ?ôS6Ew ÏÝ·Ò âìæ>';‹™¿|ÄœÃv lA\uk?noà‡e•5!9,û}*VÅ�ç.¶ìÔlÜ�ÇïèD¹ômü4ò'v:.¦ïÓ·PŦcWEDDDäÂu–]—…Í?˜¨ráøŸÕ÷aC~ÊAÆ=õ¿nÜOÁ…Ñù‘wh¯x„ñœçð<vMÊgë,®¸¬uCRر{?‹ãÓ1aaD…†JThA~öÿß“¥7©Vññ#shõÐ Ô)CãP¿MWžëÿ4¯ö¾™œEïñü¢�d¸*Óã±áüe ÿØNŽû,æ„eü÷Åçøz§›òáaD††œº›;>~“ñ«â4eopÇà÷ý)X¡¡ž9� %4Àïø{ŽlÆ�]/&aù/Lžs½*""""²³ÛóçÆEW<ÆWœ}ƒ‘}`,½?Ogâ}晪lÖ®\ÇÒE‡i<èZ¿” L^²Ž6·½ÏÕ¶UùdçÙéÚñ†Üß•ªá»t»2Ø=n8½¢[�:—õŸ,v B#"¹âšñÛïq8.iDTè%ü÷Ùåô¿‰.­êÓ \`™šJ+%‡ª—ö¤o›ötjx|?¨3v5á_ÅãKÖÓ¶au–/ÃæìrRPP@Íf×óÎÓ×]ÂÝì­nåñ›ðÚʹt½ìAš„ëI""""raúkŽ·´lØl~ذ°lÖòÃCv›»Ý:‹C e±uÕ2Vn©K÷«ë{Å“² ¡�Áen¶Î7מy¼?3˜kZ7¦jX™I\ü!ö§eaãÈçðöÍV�Æîoÿ Ê5»‘żÅôÍ)8ʸͪq1{^çiüì5ÚÒ»S=Râpåå”í óòÉÍÍÁN”)ù , u¿•È)óX½m¹Z3DDDDäu–»1rÙ·sß{Œ»_úM¢Â°Ò³lò×̵ßÎà[ê±câ{ŒÝ‘�Ý‚ˆ7òüƒ—b·Û uß~?…Íâæ0?|<”åUËS©ö<ôxÊÆí&÷À4Þýz%¹Æ†ò?ÄÓ·5ÄÏ^¤U4Äí_ËÏÃ'“€+ ŠN×ßCËÀmŒûe)�ÿû2·ÔÆ"‡õs¦0se7>s!³‡óÕÊ$¢Û>Àów6ÅßžÎúS™î¹¢‘þ€IcÓšiL¿…|»…; 7ôìE—µOŽ7%޽«¦Ýg$-ËœÅv?¢Â 3׉fÄf³•zï˜q'_Ž*UýñþiZ™™é*~æg[ÿÛ|ÜÛѲs­M¹›œÌeLúr�]úp}»f„žØjr­eæìI$Ùsýƒ÷aË8ÆØq£É&〰úÍy®{K¢Ž¿nTùŠ´îyƒ'¬æ±Î7€Ýâ¶1yÂX¶^Ëó�\†½¤Æ:¢Õ‹iÌ‚¡ÈcrÓS˜ñÙ+ìlÜ—74&ò4Ý´e <:—Ûíiè}çÜÂ?¼5·]½žá«â¸¶ùE‡iá‘ÿ™æÏM^Φ|¸—›ž;± ÇY@êÞü꺔F>ä·‚`B]�»…_~]‰±Þáù‡/ÃÏ8ÉËÉ$=+p��™Az°��J¸O<Ϫ1ŸòÞÈŸÈ®Ñ�ºapŒ…ï÷%ëØË¼üè•Ø“ËÑU_ñï‡Gã_¿u«”ÃnR˜2â5æçú±ÎR"þó‰ñºÈLŠeÑ/Û¨Q;S&eRµ¢?~ù.ÈÏfϤÁ<35�z¢°ΜL־؃õG3¬O3ln¹éideçáp9ÈÉL'ÍmQÑáÂp¦'òûG÷ðä ÚÕ­JX�!7{îßÊ?¿B÷Vu ° ñX&«¦,£ÅÈHŠ69))Äç¤2gÒÇÌ�å�Â#ZóÌ‹½¹44ŒÀ3ž-3‹US'òåè5\öä0ú\~|Žp»Š}ëžOxñÖÓ7C¸71oË!ª6¼–ê�…M¶�@¿æÔ¯ô?,iÍåMêˆ;u7+~{�IW1p@/j`a5hÍ ¾-Ž7³€e³c·i¦ÂÊS½ÑuÔþe {ÝièG||2K&¼Å’rþÜôðe´(ÃNUGA.¿oØÎuÍúq|»,XïC†ñsï6<Ú­6—ð†srÉÏÊfúŒèºÀŒGx>|ò6ÚT®HH‘9÷ ¦IÏ;YýÝrïîaÁZ9DDDDä¥ù+�LÆ„§Y0ðÞГ:@ú¶¥|øÊ3ÌX>—.×uâòšíé÷r;R×Äè_WÐ÷å·¹±m}ü�w�úc*ß}ù2¡·Ç+÷¦u4À!~þ.ÏM›H‡KÚsc›²ãçòì£#n{'C^}”Nõª`7N’·Mæ­·‡2+ÕFwïÁ‘sl3“–Üëï÷åâ†'vß8ò­Ûƒ7ßiO‡‹ªã¸³�1û›®ï÷5ýz¿GÇò-yêËátœð/%Îå¡w†Ó»î‰îÀä²gÌKô˜Ì+ƒ‡2 gÊ…@vúv~x»?�|¼‚�êQ52 bؾõf®¬eÇ*z¬k@ºw¹–ÎùN `Y9,Z²ˆ›_ŒcØÃ¹£y4A§=66ŒÎ·ô¦  ��ÞDð‹oqG§R,デ^ÅÝû}ž=Ã^0æpZ•*×ñú œ=8Œ]ž¡Ö�—X™x 7;Ø´ð}f§váñǤv؉“ÂØløŸöÌ­ÁT¯A5ó+¡Ec¨R«7üŽvþmi^–£iéìÙ0…‘‰-t[cª†oTC‚/áÁ‡q]õ« 9͈ yÛ«ø´îñÓ Ù¬lÖnZÇ•ƒvòÁ3ƒy¸MUB=`'°VsZþ<—CïÜHm‚ÑÕ+DDDDä»ùÃElÝ^~ž¶‡>·?ƃ77¡\Ðñxhdc®¿k Kz|Íʤ¹%܇;�}�ZÑÄæïý;Çðôº¥A‘@W6oEý?â“…‹éXóFEŸ©ÝˆâŠ^2†·ß~‡Ü{Ú°môç¸ïùŠç{µ¡Zd)Ò—šE¾Ó�¨ZõN픨P¾m/ cÁŠõÔÞ¿‚I«Â¹¥ÿ}Ô�Š(Ó‰[*— ¢ZM?ÒÓNÌaùzt¹½^Ù6³ìc¬[ù+'&ðè“÷ѵaNÜÁU÷ö=ósDÖ ëµ5èZdίíÔŠJߎbüÄ)´«÷8—Gžü˜ÙÓ²ÎO¤7F놈ˆˆˆüÏ7&Ÿ¦í¯ ~„w;P¥RÎŒ\9@¹’Ÿ•GÁÞ�ÄÅ…3aØ[øù�lxÜî¶Äů ƒ,2ÙŸN•F-hÕ¹Š÷›°ùV™ >'æ7F5¡YÇʧô«yÙ8™f퇣ë5i»�^ÊáÖ376Çb9�‘ÂîU3ññnÝÇ[˲H?Ëž¸�ìOsŸl+…n�é·|\Ô´5÷Ý|o|ÃÁÔTêGW8c²,[º÷æyó/Ýt5Glãý;›R)¼”ù³Àf÷'0Ô÷Gm¶ðZ4nù8‹&¼Æ/îj\Úgík”+óh'8ØIzúÙmbÉñÌ™ô_'7gÔ‹7Qµf¥“{èÎI5k·e`�mÌø9†C1 оp[±a·Ev”4\jþDDDDDÍÆp¼‹8…³À�q9Nÿx·�ü‹kºIMYÍËoN'üºÛø¡w+ª‡ø�çk Ú Är»p:N½ú¤ —Cy5g×+rJŸèoÇ].ëÅ?=F• ÿ™A Ÿ�¤øÃÝ—KËúE~ÛårâÌL%«4�0†ìy¿ñ�_7–|ö—·9q…=·{A9Å�Ø[`$å‚+rý-O󀛨TâËæb³Bˆ^Ãa㤠g¸Î†�ôØX¨T‘�!øŸñÍ8ˆß¿‚÷û¼‚ëžøîß Ù9}Ÿ¼3�àßçߣ :Ó“øcs�–Ô<9w>{×�gâÜ}t¸~k—,eÝŽ{¸¡ed™›¯c©¹ÄM¥JPÙ——¾‡/?›F¥îÿæ±kZQñOÙ"Ýì:”€3 ˆ ¨¢{¨�ä:w³«-/� “ˆˆˆˆˆœê/û&kEGÓ†£Ípœ<@3¼•ZÜÈ5³ÆðãŠ?HôzD:[Ö¬'6 ‚¶—4¹c ³žABrNa—Bæ¦Ìû!K ,]S‘“ yÙÄÎ @ö–ÅÌ7œ%^½q ÁþáÚ2HŽÏ:ù>*¶£Gë æ®˜Ï‚Íqä¹O>";)žu�Wà ±7¢YÍ}JwQtç_VÜnþ8˜Uäµ Ø±åF.ÝÃ�MêVîL6æs`ëÞ}x0Î{?`P¯‹©I—»bÐ[1áµ—ùeE¹gØñJ­Ê”‹ +9žü"áä ™FÝþ"�§üH˺%·‰©ñ1c õªT Ж•Í[60#¡6_½u=Í"ŠÜÙéµcîEùà(t𧈈ˆˆü5v¿u�¯ðzu6 ©ï_̱…þa´oP‘›çñáQ-é·ö ^b"ó�l¡^‡rô¸¢ÂkpçóÃhYó%ž›8�­ÀR¡=OŒ|…KBNBj\Ê‹KgññSCù}×¢jsÇSŸq‹kŸHöú][ÕËnåá{·òÑÌUü:ÙСÖ%\c ªvžµ‹¶£_eèÌ©Ø-ŒË¢Q¯¾|ßëZ"B�ωµrÔ¼êÆÌYŠãÚ›ñ?ÑýUiPŸÚ¿mdúš˜Âv†ºÿÌòkë\ŠC>ý(_µ5�+Ù= ¥§-ô‹¢q«Ž€ ëŒ]KÿêÚ˜O8À¾}”5›IS&»fîê~ Á'òyQO:F?Åú�i]·&åCJ¹Ù¤¤�¼ú7öM”ÝÈ'6éëßÍ+-Ã(¹«rc¡Vp*ë׬aý©ÍŸ«€ú•®äv—›‚عÌêt+wU®JÐiÞo­ŠåhxŒIì;Ñ@:¨uu_6vmH…hï9/È/`ÙÌ]<Чaåt‘¹0YŸ6i²ë¤sÓ»ÝhÚ´Y©hÌñKX6Ëó�Ý7 Û©]†1¸�Á²¼Sä’XÞ�óºíD£VôµŠ¿Ÿ…ÍÊaãüyê_#¸+f)5<~ ºâÆ[äY0î“'j±,Ûñ˜1X6ï3s}=˲°¼Æìö:tñÔÛ.ÿ•!C>£Óû“y´mÔÉ×7Þ—�À²aû v19ò×òæ�ÏðÀëôíu)‘6÷ñ¹÷z…sàûþJÞ` 8´i*ý»Oã�µÑ£FEüL*«ÿˆ~ãZ°àó[ñ?ÃövšÓÞX6lnGÆ>¿cºóÝwpQ¹Ó¨˜9/fÛÅ�°ü}º½Ï—æò•µjˆˆˆˆÈcûömL<�Бgÿ›?˲°�ÒHY–­˜/Ï'¾TÛ|÷zìU¶ÿMOÎá$35§ÝŸÐ°0þn-¸q“Ÿ›IV„E†h?×:N¼ß€¿çû-q#Ë##3—åODdúµŸˆˆˆˆ\hŠöyÁžµÞnëÀóo?È_­Æqb×”= |6•»z]N$Ößø¬Œ~„GGÿ�ÿIÀF`H$�!çë ý �.wndADDiÅ‘„ ÷’e–QÍzóá°ÞÊ¢ˆˆˆˆˆÈØ4""""""jþDDDDDDDÍŸˆˆˆˆˆˆ¨ù5""""""¢æODDDDDDÔü‰ˆˆˆˆˆˆš?Qó'"""""¢æODDDDDDÔü‰ˆˆˆˆˆˆš?Qó'""""""jþDDDDDDä¼ó;çg0n²6McüÁ ô¸ö2ª`ÆÈ…„t¼•«šEž¼[A&{ÖÏfÆ’¸lØBhÜéj®¾¤ÁʃˆˆˆˆÈ…ϲ·Lã•9»±YÅßÅæBÇž�rK][‘‡ås0v%#Ç­!Çnü¨Þ´3wôèHÕbžÃåt°cñ¶„và¦N ùËÞ¯›Ì¬Í|;=‘ëº_C“è²=ÞøXvê5nNí Ï�š²†GÙ­w¿Ä˜_F#û9 )vÝ2.ßJVçÌÍbÑäQlªÖ•¹Ï>F¯F¡eÞûX�—Èâ9¿Q§kW.Ž¥¤w’™Ë³—ÖåšùÙÏ9 gµç¯ ;ƒÕ3ǰ5ÅÙÙ‘�Dʯ߳/*�Ã;vp”tFߊ_•Vô¼êb*F„R¹²Ï? `D`�U˜{ùÊNOeéâ4½æ Gpüë;·ïd[J úv©K”1xöYÞ-‚�ò.eîÛ�)W. ¿có´ÎmïQì’ÉŒŠoK³K›V†Çù‡ó¯û_¥Kh$ÑAþÌXéGYFbÜ.ö®šÎ¯íx©UBKêÈò2صt»2æâ ¼7öÜ›¦³jþüCÂétÓt¶NùŒ¸€Ëé÷ß«ˆJßÉO)©Ûu wµ ›�ÿ~¸è, ýÐfb#Úq[•@Ÿc‚EDDDDäÿ“‹¼œ|\æ4­ŒeáB`Yº·ƒc{çíôvÌiV�`¿Â/þYÄ¥&�Þ %ͳ¶óú{ß±&ۆͲQïâ;yçÖÖúŸØ+fáïAµJ'Z‰ópÔ eÙ°ÛÊÞ„Xv?"+T:ÑÈ•ý‡ùqKygöan¸õZZDùSÜŒqp8aC/൧ÚS3â¶óÐ/ÙÎn¢,üƒ Ì!5=Ÿ°jµ¨€^9•¨_;˜   ‚üKdò¡,]°…7]K�ˆ0Ôû‰ˆˆˆˆüuÜ®C »½-aaa%ÿ×¶'#ו­ó*ÈIaòÌ•ÜwE{*W ?ù½?;›Ìäd6g¬æÉ—¾æp•–\Õ¬W4©ÈªY_rï·3Ø“ëüÓÞ¯eQÌÆ?YAs_B@“kèÒ©v‰¯�¿™�?ŸMÓ›o¤}ÍŠøŸ§QžÛ _œ©$¦çR©UM““HiDË §{ÚmÝ̬±#Ènó0÷_Z‡°}ØDDDDDþJ–E·g‡1û wÉ­†ÍŸªµÊö¼i»fñEf¾¹¨!å‹¶ ùœYYdÄäÓð¾GéÛµ55RèPaWN^ÍM[Sç⺞‡÷—ºk-›â²0æø^¿M1±I `Ù¢EDƒÁ"(º�[×ú“fØEܶŒßž¼„’^%;a/c~EF›óTç&Tð§ãüŒ ÌÍŸq»8¼j*ówgaÏO`ý¾xü™Ä�»Ý$ØÅþø@&�NÅæN³Ž—Ò¦a•“/R�ÌÆ•ó˜6eÝû"w4®Nt¨]Ÿ4‘¿ºù³EѺK·óü¬G™¾ †«š\M£Ú¡ÅuÔªÚž;¯hy¢ñ(G‡®Ýx|æG¬:–ʵκT:÷«““´ì;º>ôµO|θw<ÿÿö—æ0áOjþòR1cñ:j_ÿ—V*¡½N;Èìi?2-ïb>¾±=5 §Ì:ù¿ç²Яì…�ªm¯£WkáU3Ø~¤2ý÷fª:SX>c?®Ö÷qË•ñ÷³ðôœ¹Æ‘žÈŠÉ_09¥5ϽðåËG ¾ODDDDäoÂ�£Àq†³ð[Øü(í‰6]{·2/ÞIÇËZRãÔS�Iyw�r$ X›5³—˜GA>çáuP·÷‡dÜñþ‰žÆÆòÏŸgLbK^ýßTPŸ-‘¿Sëç:Èwý›×– °„¦"¬n2•‡;–¦ëp±jû^RýkÒªIEß›ƒÃ)W±*a;c‰ÉƒVEv š‚#ìŒ� uû`‚ÎÓOÄü‚B :ùwH`Á„†…•élŸef ñG?q3÷Ü×—r‘%÷B~ÁQtlÓ‰¦nïS³¸Ý66H!04‚š•+áwvûÿξ‡vg“–‘Htµ«±,HÏLegrzV òé@�Ik9?—ëþÛ™jüDDDDDþv,+‚N>Ï·½7úŽŸ IDAT]%ZhÙ©Uµ”O˜˦½±T½†¶QÅ=c­jÕ§VÎX¾™×‘º5£z(�ŸÈÆ• îªÅÏ5ªåaÏ«qg±mþbêuá‘j• *ñžþ4hzƒš^VLc¾™c}Mx×›xö†ŽT:Ûø¬ßEVéq†F7DaY.r ‘P�ÿŸ�%}ûç%²vÉlRc‚|:a+¤W^ÓŽrv›>u"""""Eóg+G§7�·çË�KâhÂ1"ÚU'²„ûTlØ�G.[Ï�S>Å$\G§ àÎÜÃ;ówÑ÷ºéR¿âù8Ⳅ¦Ì‰ÃåþÓç5aû"¾ÚÍýv¦ZØÙýîÍí6 Æm8—Ÿý\†Vãê>ý±…„b·,*ÕîÊà�¡¡¾ûeó†P[>»7,d·Ï¬»ð«v-ºµ5"""""ÿDz HwÙ¨_«zÉw Žæ’ž}YyÑ îý|&«ì6l–�;Ê vQ„—Ð,Yv¢BC°ÛÎú(y�–n?ÂÏñ}úù‡P5ЯøKÜeìä§9ë¨ÓêV®ªÆYw;–��ЂülçtÂëÓæ#Mv�tnz·M›6û“ºj®ÓürÔ²lØì6]ëODDDDäÂ7n·,¿3îã1Æ�«È^8Ëv†Ç7N·9ë µŸOn— 76›Í·4îã}Ð9�ÓŸëøë”å™¶o߯ÔÁó=ù§íE=¥Qµã§�z"""""ÿ3,ˆ½”GöY– ¿²4 – ¿¿É•lv{É{ô,öó2N ûyx"µd""""""ÿÔü‰ˆˆˆˆˆ¨ù5""""""¢æODDDDDDÔü‰ˆˆˆˆˆˆš?Qó'""""""jþDDDDDDDÍŸˆˆˆˆˆˆš?Qó'""""""jþDDDDDDäïÆOS """""ÿ,Y¬^²œýé%Ün°…Ô¢k×–T´Ùæv’¼k³w§a·,°ü¨R¯-]šV.ñuV,]‡�´¯ræa¥îg乃+´=;7'<Ø»-s¤ngê²½8«è¨ÃªqyÛ–ÔˆôWó'"""""ùl^ý;nKœrK�ÛÅ�ü\Út~œ»éû\ÉLós6maFŠƒpÀ؃èÙ­m›V&¢hf dîeÔ¯ÓõG"÷Þ×ê ÍŸ“CûÖ3ö§ñŒ�M&Ói°psÔÁÊ5—pèx²¡sÅ®§ÿØY8ìþT°['ÞƒÁ4ü7Só'"""""r\9ú<9”ûÍ©­ŸápÌ:Þþz<í»·% p¯Ÿ;•©c¿çÃÕÉÜð¯ûXÙ³3ÕÜnŽDæ¯MÄ]äÜù)¬ßú;o|1ŸøÀv[UøÏÇã =û»RëòÆ»/qUD(v[&«–Lå¥Q¿óõ„†´½§=…-�3¿¿êmøö�G¸¶aèñfÀ²a·ÛÏzVÔü‰ˆˆˆˆÈ?Œ…ŸŸo«ãÊKgß¶¹¬kr#ïÕ Åno3÷naɦDºßý/\Vïø�ívüý«sã•Õ‹t~N’—ÿ@û©é¼Þõ6. ÝÀ›‹ÓK1;å«v`è�JTŒò÷4¨—u¾‚žëv0sǶҞ6'n9œ”DùÐpB##ñ;�›š?ùç3n2wòý CjJhð‰&Ì•ÎÚ�›Xäß–_;Õ9COi#¬qV× §iýê¤.=L¥iþ¨Z¡ºo8(˜Ð  l§ì ´,‘�Á‡œß)Pó'"""""¯>ÍçpÍbú0Ë*Ósº\NÖ,œDJÓ®´ªS™€Â‡çd“qt?õ;^OäÑ•¼7s3Ž7ÕéÒ‡»áy)ËFpµÆt8ñg²9Ç7š”DRj:êÖ§Q‘p|j:Gc�0êÇáÌ0`  ~Ç[¸³U95"""""òiüŽÎæ™—F²;)·Äû—kËSß½LÇ2üþ-ïÈb>ßDŸÞ-©vò Ÿ99ùILÆÊ˜ÎýKâöó# 7�Ÿ¶¿N|�{yâº&'=�ïÓ�ÍêÍ›Y•R‘»îoGÑ�|V`$í" H:²Ÿ$Àd'óí†ý$Ý~'÷^Õœëì£æODDDDDþ>ü£iÖ®3Õò\%µMØ«^¦(Ÿy¿/Á¯z3š4ó>ü2»ÀÉ‘´t&&ä­[ïâÑžSàèÞýî{¾\2‡VMЭŽÿy{‹.WëV.àÝY1\wïSôªäuû·?÷ŸüÛ¹o ïMšJ¿ ¿Ñ¼N.¯_ñ¬.Ø®æODDDDDþ6¬Šy oÇóúœ9‰Y°'‹ÖW_BÃàbÚI·ƒÆ-zðp�¶x¬¬Ö†>=Ú3|øŽà¬Sçü4OÉ{˜³~#–çq÷#ý¹¡^þgèäüê]AÿÞa|õ¦N¡uíŠDžÅ`Ôü‰ˆˆˆˆÈ?X[×o%&·&Ov®IÐ)·ùÛ©B‹Æiywa‘5¤]ÎZöf§“ DŸãHïZ˜ٓYYñV>ï•ÊGPÊÇÚÃêдò1¦Æ;p9Ï®“Só'"""""&îw†¼3žØôŠ?°ÓÞ”ÿ~ú,ÛKqðcN<Ûöïƒ&=¸2Ô÷æðà@êV­Î¯)©8MuŠPéNKåh@ WxŽï+óèN&Mù™ÃñÑ%•‰*Ëõú gûâËѤ«?ö³ìâÔü‰ˆˆˆˆÈ߇=˜ŠÕjbE9Kl„ü‚Ë—z�Yr\<;÷¦Õ-ñ/®�ŒŒ¢R£8œÎ¬nÕ¸¡j‚gnW®'±r5T«AY®º`\2ÒSÉó�¢bX–#ƒmëåÛè^,îT…ˆ Ó5­ù¤¤ä\.Ϫ¹iÙ¹œÏ²jó}ÕPÔü‰ˆˆˆˆÈ…Ϊtž»ì<=[‡S²úP%î¯i§øsĄѤqGzÔû‚g_û†ìG{ÐÔ²HÜ:�gçìáú[ž¤Y�²]p/'íc>Ì®ëÞbh§ZX¹ìܲ‰À�¦lض™ðSÏcÙ‰®T›†U#€X>ùdµoéJKËÂ`ጙͥwÐ÷†û¹®z‚Ïr6Ôü‰ˆˆˆˆÈ?“+ŸìÔÃ,¨ÁЈ’÷¶•¯Þ˜‡|–æÓ?çÖ_Ë öf|þÆ nª×Œê%íf4n²œ.Ü^×ûs‘]p�e™­X'œ ;ä¸ÝËHç�UßÑí÷bÎbR…zާ«FÕh\þ½_~¹ðE ²#_‘k+× JÄÙ·pÖ§ÍGšì:éÜôn7š6m¦ DDDDDDþŒ›¼Ülraá¡ØNyˆ‚œ ² Ü'þ²Nði.)áÌË"3ß…P8a�'šKw‡6ÿBûéÁ,¬'õ+âv»ÈÎÊÀá.é¹,üC>¾K07+�\g‘ŽÒò#$2Ìçd5¥±}û6¦žGè�Híù‘(ËFPHx©›¦€�Ê•áO¿ 0¢ƒNí7 Ù±qÜТ+aÇOc³Ù �(ý¹BƒÃ"ÏúÐÎÓŽW[„ˆˆˆˆˆÈùá2i-y°vÊü½Æ¦æODDDDDä|5XþtêÚýo96›Ò#"""""òϧæODDDDDDÍŸˆˆˆˆˆˆ¨ù5""""""¢æODDDDDDÔü‰ˆˆˆˆˆˆš?Qó'""""""jþDDDDDDÔü‰ˆˆˆˆˆˆš?Qó'""""""|óçt:yñÅ™7ož'–™™ÉO<Á¦M›<±£G�Ò·o_>ì‰mݺ•�‘‘á‰-\¸�矇Ãá‰ýòË/ :Ôëu?ûì3¾ûî;Ïßn·›W_}•3fxb¹¹¹<ýôÓ¬Y³Æ;vìýúõcïÞ½žØîÝ»éׯÉÉÉžØÊ•+yæ™gÈËËóĦN�Ê믿ŽÛíöľùæ¾øâ Ï߯Þ~ûm&L˜à‰0xð`–,Y≥¥¥1`ÀvìØá‰ÅÆÆÒ·o_âãã=± 6ðä“O’��í‰Í™3‡—_~§Óé‰ýøã�|øá‡^sôÁ0zôh¯\½ôÒKÌ�;×ËÊÊâ‰'ž`ãÆ�žX\\}ûöåàÁƒžØöíÛ0`éééžØâÅ‹yî¹ç(((ðÄÆ�Ï;#1Æ6l#FŒðÊÕk¯½Æ´iÓ<±¼¼<žyæV­Zå‰%%%ѯ_?öìÙã‰íÝ»—~ýú‘””䉭^½š§Ÿ~šÜÜ\OlÚ´i¼öÚk^¹1bŸþ¹W®ÞyçÆ�ç•«çž{ŽE‹ybééé 0€mÛ¶yb‡¢oß¾ÄÅÅyb7nä‰'ž ++Ëûý÷ßy饗¼r5fÌ>øà¯\}ôÑGŒ5Ê+W/¿ü2³gÏöIJ³³yòÉ'Y¿~½'Oß¾}‰��õÄvìØAÿþýIKKóÄ–.]ÊàÁƒ½r5qâDÞ~ûm¯\}ñÅ|ýõ×^¹zã�7øõ×_½r5hÐ V®\é‰%''Ó¯_?vïÞí‰íÛ·�~ýúqìØ1OlíÚµ>¹š1c¯¾ú*.—Ëûî»ïøôÓO½æèÝwßå—_~ñüíp8xþùçY¸p¡'–‘‘ÁÀ�Ùºu«'vøðaúöíËÑ£G=±Í›73pà@233=±ùóçó /x­=?ýôï½÷ž×8>þøcFŽéùÛår1dÈfÍšå‰åääðÔSO±nÝ:O,11‘¾}ûràÀOl×®]ôïߟÔÔTOlùòå<ûì³äçç{b“'OæÍ7ßôÊÕW_}ÅW_}åµ=¿ùæ›Lž<ÙËÏÏçÙgŸeùòåžXjj*ýû÷g×®]žØþýûéׯ‰‰‰žØºuëxê©§ÈÉÉñÄfÍšÅ�!C¼r5räH>ùä¯9zï½÷øù矽rõ /0þ|¯:1pà@6oÞì‰9rħNlÙ²…�zÕ‰ øÔ‰±cÇòî»ïz�ãÓO?õª.—‹W_}•™3gzåêé§ŸfíÚµ>ubß¾}žXLL ýû÷'%%Å[±bƒ òª¿þú+o¼ñ†×Úóõ×_ûÔ‰·Þz‹‰'zåjðàÁ,]ºÔ«Nôïߟ�;wúÔ‰„„Olýúõ>uböìÙ¼üòË^¹5j}ô‘O�3fŒOMÿý÷ß}êDÑš^X':ä‰m۶ͧN,Z´È§NŒ7Ž¡C‡zmÏŸþ9ß~û­O�˜>}ºOM_½zµO�(ZÓ÷ìÙãSÓW­ZåSÓ§M›VlM6l˜O�?~¼O�X¼x±O�ؾ}»'vðàAŸ:±aß:1wî\Ÿ:1zôhŸšþá‡òã�?úÔ‰9sæøÔ‰ 6øÔ‰¢5}ÇŽ 0À«N,Y²Ä§NL˜0Á§N 6Œo¾ùÆ+W¯¿þ:S§Nõ©égª…5½h�X³f�O�˜>}:¯¾úªW®¾ýö[>ûì3¯\ :Ô«¦Ö‰ÒÖô¢ubÓ¦M<ñÄ^ubÞ¼y¼øâ‹>5ýý÷ß÷©?üðƒO�øí·ß|rõÇxb >ubçÎ�>ubÙ²e>ubÒ¤I¼õÖ[^¹úòË/>|¸OMŸ2eŠ×Ú3hÐ V¬Xብ¤¤Ð¿bbbN['Ö®]ëS'fΜÉ+¯¼âµö|ÿý÷>uâÝwßeìØ±>ubÁ‚>5}Ë–->uâÈ‘#>uâL5ýçŸö©éŸ|ò ßÿ½W®^yå•RÕô~ýú±ÿþÓÖ‰åË—3hÐ ¯\M™2…7ß|Ók{>|8_~ù¥O�˜4i’OM_¶l™OM/Z'Êʯ¬0Æ�žžî5¹…NÑÄ»Ýn’““½Þ¨Ëå"55ÕkCu:�¤§§{ÅòóóÉÎÎÆƒeYžDØl6¯qdffz-ZÆRSS½>¤ÆŸq¸ÝnRRR|ÆQtQ,\ð‹nX…ŨèkÊSÇ‘žž^ì8Š›£SÇqêØ‡×¡Â…¶há/\XŠºÂRÑ\ÎQÑq7G.—«Ts”ŸŸïUÔ sUô¹ ¿ø�M®\.W±stê8‡O®òòò¼¨ârUXNGJJŠÏ6SšíÙápx}:]®BCCÏK®ŠÛžiii>Ÿ«â¶g??¿ÓæªðKiqsTší¹¸9*n{..W§nϧ®=§Giruê8 מS·ç   Ÿ9:S® ór¦ÏUa®Îô¹*úÅètŸ«SsUÜ|”eŽŠû\�ïµ§èk–´>Ÿú¹*ií9u{ÎÈÈðÙžO]{N7G¥Y‹û\}þ’Öž²|®ŠŽítŸ«¢±ârUÜ窸\¥¤¤œqŽJª¥ÍÕ™¶ç’樤qœ:G§®�ÅÕô¼¼<Ÿù8×\}ÍÂÏÕ©õª´5=<<ü¼­�§Ž­°^�Z'Š[{Š>iמÓÕÒâ>WÅ­=§nÏÅÕ‰¢_²Kûµ¸µ§p;:5W%}G=5WÁÁÁ§ý\®=g[Ó‹û\·öý®\ÒwÔ’>Wg»=—æûWquâ\ú‰sY{Ê\'Êúµ4ß¿Îô]ùtkÏ©�- ëÓæ#Mv�tnz·M›6Ó¾P‘ˆíÛ·1uðé3îž¹N8Ña³sÇcÃwSí�TÖ®ÜÂ’ÙßòÌòøãû¸áºyã†4­S‘Ò´€×-fÕ¸ÁÜùÁjO¬÷ x鎎4®R¶¡§'³í�™¼?n÷§†5fè}=éÞµ+-#ì'î™ÆšUKyÿó¯˜xÌy<ÎݽžâÅ®ÍiZ#R[�ˆˆˆˆˆüÛ?§ ò èxóŒé^?»å¹É?´âÉûeÆ2zò8’kÞʆQí‰6gâ ú|:Žgy ûÏ�4.†ö/u3c¿|•_²;1iýxÚ•×êo¹í…AŒ®òOõîBùRÜEJR Ÿ�šC­û^dwƒhüíl[¿�7ÆŽdgfïßÓ‰ ¤°`ÁþýÎp>°Ù0X¸b~ãÖ¿á­¼Þ¼yç5Ô�ÐF$"""""ÿàæ/'¯€„´š]ÞŒÚ5+â_Ò¯�†.½ßæº&!úÿ‘a•žüüŸ8jŽÞÊÎÄÎÔ+_íô{ÿŽìfo’á†÷å¦6µ°îʃxvÞB&>LJ6”WAcÃ? €"½è) î�Š<7ä}êשJЉ;Ö¬@Ü‘C|óÇ2þèщkËÔæ‰§ú` Ä¿ðÑ•{3<~—ì8ÈÀŒ<êFi+‘¿½³>á‹1àrÛ ¶c³NsÇè6ÜÚ:’�ÂÆÀ@H�ªX'Nã>ó‹…`·p:ò8ñ =²Ów³3Ö�†Õ«z|@»¾{”›^Á–”Ó÷»µ«6 YýjžÆÀf�¦JTÆA�gHv‚Š4~LjÍ2T ðÇn·´‰ˆˆˆˆÈá¬÷ü¸\dø‘·‰åë°„U¥Mƒê„øŸ¡)2�™œŒ‰ú¿öî<:ÊúÐÿøû™}2I&�¬��°¯‰aGA Z[TÄ]¯¢¶ÒZµÖz­þ¬­öV¼­»VkÕ¢¸àjq/àÆâ‚ȾCÙ3Ù&³=Ïï¢lCÀ{‘ûy�“?˜ùæ;ßy2sïól~’\^ìßõbùC¸à¼‘ÜõæÌé9�nÀòç&pÞ-\9zxë!š€£!%îÀŠ5QßÔŒ=.� ïÁ‡•o[Ãû™>øòRÝú‰ˆˆˆˆÈñ¡hŒšærŸu?�[æî ¾t-äϧüˆ‹ÏA¦ãàIgRÊëo¯eÚÐ3èžÝé»ã�t†ŸqÉ·Ná¢ç gêC,ž:�.¾=¡YY¢[V"Éi‡ÿ~ª¶oã³õé?îrúöjÂX ïÏŸíM&†a°aÕJÒ&]Ï•}sèìÐHDDDDDŽóøKÍîÃîšÍBã.Þ{ý\9åÎxfN)hã˜R Ó,á™'Ÿå]ç®ÿñXrÝß}èdù'¯ðÐË/a�ù;N?‹²wÿʳßàž{ÂLýùuŒJ·a™+X°²žìq™t¶Î;±¨.ÛÎ?_x†M}¯æÉ“2Øç&f k–Ìœ�ì´„Âd}²„Ñ=óHtৈˆˆˆˆ×ñgw8IHØël¸ÄDξø*Ã�óüÒe,;³€®½#*F°r³^›Ëg�i̸úrÆ¥}×Ë›T¯^ăwÝÌŽÓþÆÓ??‡ÝýÿÎè�OñÀc�p÷ƒqüá†Ëè¾z1_6%svAÉí}±fJËÖóÀCÏP5ð|;s(©¾}ËÑáÌäºßÝÇ/ƒ�_Ìã�ù øÕãððeç18Ý®‘ã7þÚäËcH�lfoÙȆm0¢WkøYAÖ-ÿœy ?ÆÈÏï//¢«»/mØ\ú_uó_‰Ã±'´²&üw¤tâÖ¿â=Zð-_‚}ÀO8uTûŽù ×W²qÕ[ÜüVWþt:#‹ú“îlk¤�m¯+Úd ý ·uIbõ¾Æ’mÃè›ÖŸêODDDDDþOÅaêšB`K !~Ï£ë?ŸÏÝs×1ñ‚éLé�†¯½¯Ú&¼a%åE“éi¸‡Í;èt¦ß±“_N¼–ú\ÃÛoL$«=ókYþïÙüvk÷]1‰‚¼äÃx�Fbýyàš ̘r-w^4 wR'šfͤӓu{ƹ²¹îÜ3ømáh º(ýDDDDDä‡Á¸ÀSVS^€³þ<ž~ýú·û›ëkظe�‘ÝgâY8èÔ-Ÿ^)þ½Š2Bé¶Í”T5p°�{$tá„üLâ\‡Þ Y¿ù+VíjÚ³7ϰ‘Üm$ý2÷Œ)ýzÛ"X¦�ôAýÉ÷'pA3¢tËjŠëcm_¥Ó°áë”Eßüt܄ټn-»Ã|ó†-�üÁ}ÈÐgGDDDDDŽqkÖ¬fÞÍïãÛæïø_â;QP8ì;F9ÉÊëCVÞ‘/:±{!£ºzLÖ aßyÁ›ÓMNï"rÚõª.º÷) »>3"""""ògÓ&Qü‰ˆˆˆˆˆˆâODDDDDD""""""¢øÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?ÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?Qü‰ˆˆˆˆˆˆâODDDDDD""""""¢øQü‰ˆˆˆˆˆÈqÊq4&‰5VSr�”ìÇmk¡¦¢›¯I¾ƒOßXSAÔå')Þ­¿‚ˆˆˆˆÈñ ÚHYU1 ÀÂîK%#щqÀ@“æ†ZjÃ6ñÉ©ø]mÌj ¬¶‰˜e΄dRã݇܋iª¥:h£SŠWûOueÁ¨ÕZJ>º¤$b3ý~wÕ†ð%w&¡Íô QYQG(fîþ§+�Ìäxì,Þ"n ²ª Ë OB )>ÇQýóùl¦Iñ�ól`8×\0ŽÔÐ:ž»÷º^p;S Ûš¾‘-+7ðïWŸ'iÜ Î9)W_‘¸Pm«¾šÏe�ÎeU –ÉàÉ7pß„!Œî�º's,‹ªM˘ûþ«\õêr°Ù ½'w\0ƒŸ�Ê#5ÑóíØ†Ú 6~2‡+Ÿ}‡åµ!0ã˜4í2n{ còým¬Â¢¦²„Oç?Çã»ðèÍ“èÚžÅGêX½á+}ô1ÞX ¦ýÎäƒ '2pXRÛø•p]_/ŸÏ­ï6pÓo~ÅøäýëØ°õî¼ÿ9žÛV – C¦òÖOÇqâÐ|öJâhÅ:^_ú.çÞÿ&Øm×™+κšßž^H^ºŸ£•€G<�E=«7Ô“W”EŠ(©¤..�“{ÆP÷5;Ö²äÓ,zw)[­ Î×A§"""""?|‘_,žÇu/|Ș‹gòr?'Få:}ùE¦ÿs+OÎø9£2w�Õ¬ä‘'ãaïÉî@WS¢IDATüëžkÈ��R¿üE†?ýßÀ�\?®‰. %Àš_âÂç¿ä¼kîæ¹,/Í»6ðôœ§™^`Öõ1þíÊÜœ8j;–Vaék"""""òƒWU¾“·- i¯ùÃø^${mÐ-—ÑZV?û o.^Nÿ)'àÇbé¢ùÌnÉç�ó'ó£A)Ø §]ÅË•wrÎüEœ>$‹!)qÔÔlæ…w2ô¼?rÈÞtöXùy¡6¾´ˆ×?Îð3z`š›¸ÿ¯/0Ëvº @Qv¤ý­ÑPÁÊÅ ù(~<¯_1�>~/Ð�ë.Œ±õÞY¼¾ð†÷<—>0cQÞ{a&O,-e{—B&åÖ°È¿pGØþØ Ì}÷#F˜LO`ççñÄú3'_Æù'õÅi+;�wUô�µ�3Ç`Zb&Gãd¹í{³b1j«¨ª®¦zãfvÄL Ljk‹ÙX\AÄë…ª*ªë‰ì>àÃp’3r*·ßûg¦åà±ëK"""""òÃ×BUí×¼ºe×�Ö‹DokbØäŸ8’QI.¶Wì¤ÀÜÌ¿WT2´çFì?—?™Â ¹ekBaÌX„ÆâϹ/6šk‡g�äÙ=аÙ):�´8v—P¾WÖÄwÎâW×ÝˬËOgb†ÑîÕWÔÕññÊ�üdÒiôIð~;Ÿ·ËH¦ubsu9µ{Æ;ã28ûÂ_³ð– (è–ÒFP™šKxçó0w�>œd¿çÛ9==3¦wU5Å”ÖX²j+Ѥž ¹;ü —�Ô¡?æÚ„-,ßÙB4ztþRÚó ÙôŇlot°sùT˜™4–~̇w±lÕVlÝûðñÇaOêÎè!ýHŽw�Ôó4.ïÙúû†¡ïˆˆˆˆˆÈñ %²³˜Õæö°÷>ÃH§g¦��jjê€Pe!“üü>äí—%^W3ŠYS%ÖÙ¤¡´£ßIäÄ%ì3'‰)d%xXY[NYÒ`³åsõ•ù»Ÿo¬ ýµ¡9´ƒUÕùy7Ž}JΠw×LJ>¯'¨�¬NØìÆM™Þú|=m¾�#ÜTÂ"g?~–áýϜ tOO¤i} 5ÕQHªeG]iY£(ÜçFW*}³Zx±´‰XÌÇ‘7T‡âÏé�ç„ñS8�0ËšÖR=…s'ÇQ³ŠêMÅ$�>™Ÿôtê‹ """"r̲6óáüO¨±l &{B6CFœH·Îm?‹Æ¨*-�„"0ö?¼/žÞ]ýlù²ŽÆ@”ÆÆ¡™¾øýÆÙˆ÷$Ñ33Æû%"ý}¬-Þΰ¤Ó±9öŸ3•îé^j6TRYdÁ&0c„êJyË™Èm¸ :gu¡kc)Õ uDèD» Ç41KKØæ�§³ÍqÀžÁ]Ò TISM$¨«oÀ•Ÿ@â~ã¼N;½ºæòQI)V¬7pä}u„çüURVÙ„¿O@su€:£'wÑWIDDDDäX�¿pKïÝý+^ &ãè«ø¨8dDÆbQ\©©¶£sÁ”ÃŽ?Ë4)_±€E[š¯aùNƒ·½Í[šÙºæsž"Þyû-l}† § G}³DDDDDŽ9†aÃá<²û¯ÙŒÖ=Tµ»ïí·¿ÒšZ¼Ž ìNð88 0#áÆ#1vÕñ{ à Îí¡>Þ}Ͻ}R0@YM‡Ý�ËuÄÃí�–‚Xì�3ªkØl·c³FÑ€Û ¡0-–Éþ«ßYSG̰áp¹ÀaÇf· ‡Á>Wô Ec쬮¤WgÆQºfÊaw™a³“5b2ްØüáJ>.:ÿ âCå,z±”µ½Ê#Ò¾½r�ˆˆˆˆˆ‹,Zšv°lárÖÁ÷´Ù| ,BvrÛÏÛ�vÒ²²añF¶EG“‚k¯óܪ)©4Éö'“”‰‘düNƒ²â-T“Åž#Ic´D+Ø^™Ã¨l.‡Aßì\Ö.ÛBUËPº&Æï™3TGyc˜”Ä42¼G¸ lÜÉYœþ˜ÅeNî¼ûëߨ^QEfB"§Ã˜Ó†=;›üŸ²¤.H¯L?îo7nˆÕ x½~’;{!Ù�?ÁGEÉFÖGRèÝó· Ç(.�1¬ › š·}Î;ë«q¤ôâÔ�¹Ä¹?Ú� óë©®/Ç•ž…Dzh 4²¥ÄKA¶]ÌSDDDDäÍ;yùÒÉLž4‰Iù¹yÖG”âpMn|9œÙ¼˜—7†ˆíµó¯rÍbÞ-30»=ì@j>…é^Vl[ͪÊ=㢡 ›–½Åì´BÆ'zp:$1pã,(k ¼×œ[W­dÉŽÙ½úÑõˆ·�ƒÎ¾Æö òʧ‰Åb{åÎ:ž[¼��é9deΞ?qþÎËÙÌó+Êï½øòµ¼»²„Ì´ÞôIÙ䦨^ÇŠÍõ{ÆÅ¢4¬[Ä»ºqzN»Åš’jò z-]ÏgÍM˜iÝo§–&UÕdävÅ0Lšƒ»(1»�ëucÓ7IDDDDägÃß¹ˆ™%Í47üç³G®ehΡbÇI·.}¹ôä\æ¼?É­—Ôô&g0fÒÅ\|�Û︆«£&Øü\:d7_9�®ƒ­ÛÂ4cDÌöƆŸ“ŠNå¦@�{æþßkQ0ctë5š~r9WK;è!±–i2Û1W…CÎäîš&þøÊïIx6 ¦�!ýŠ˜~þ/¹²ÿž³ûœi#øÍ¹;H|wcoyl¸ü\|êO¹åG#è–øÍ–‹°iå**’z1Ñ—Ø¡ð5îð”Õ”à¬?�§_¿þÿ#2³b=Ÿnª#=§=³üúÖ‰ˆˆˆˆª7±`mÓÂ2=ä DŸxÏ�ñ S¾yËË‚Ø —/�ƒ{“ÒÆ”M»6òÙæ]„c¦ÍGŸ�ýÈõ{~5Ðp _­Þ@­•Ê�¢î$´{ñ5,]¼–@$†e™xssb^Â!®ebê•”69é^P@®§­!å,þj ¡–eÃß}ƒ»&µq[ “À®µ,]_†�Íá£Û ƒéîÝ™ëV-dIc&ö¦s\ûϳ[³f5ón~ß6ÿÿNü‰ˆˆˆˆˆHûD£[øãíS›=�: >›óú%îsqšöÄŸî """""r sس¹éÖ;1[Ï›³¹â°uàB+Š?‘c™áÄçsñ4º0§ˆˆˆˆˆÈÿŠ?ÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?Qü‰ˆˆˆˆˆˆâODDDDDD""""""¢øQü‰ˆˆˆˆˆÈñÅ¡M """""ò?ÀŒŠD1­ÖvÜ.6Ã8`¨e™DÂab­c ›·Ë�¡ø9VY´´4Q·z¿ûçko{ÿ¸)Ì›>�7¯¾ˆ;Ò61øÖ˜½¡bŸÑÛ×ý‹Koÿ ¹gñòÕW1÷²IX+^`Ú#¯ñuu3fW¡=""""""ß+âÒùË­·0hxwÒv Ɖ=S¨¯y–¹¯.á´[Î" q3³_ü�¤¢ñ\uÉ9 õ{1h¡GzŒKïx›9C†Ó{l/�‡¿ íùù^yè‘7„SFôl ?;IÙÙtOïD´±žÚÖGË7¬`i­�1£OeˆßÛzŽŸ‡ÝÇqÓhm,#ŽvhŠ?‘ï•�ÓáÄaßïr-1Ë4qz<ĵ>T\^CÈÑ…�ý3÷‰5·ÓC¯¼‚¥;E#Z…ûi‹e¬Þ̺â0Œƒ†�'9…ܼ¬o®�“S·i k‹k4y½¨£´¦–�Ií´ßp§g×l¼¯”²>%“Ãß“§øi³Ï¢Ô¬}Š¢“ÿtÈa?ø�‡&¥‹ÍØ+ä ì† ,“˜ Ø÷úåhŒHU%k¼â Cñ'"""""rÔX&-u¥lÛÕ|ð½q¸“Èì’Ρ1jfñÛÏpï†8®8ÿgœÕ?©�Q~2’üXÑR¶•F™ëÚk)&Á†tíO–Ý¡ø9zñ¥zå£ôó_‡vá³¹ûç“s°fˆ’5ðÄ'7^pcr=èfPv&‰æÖ®ÜJ(·7îÝ ¡¹eïý{“N< »ËÙ¡·£øi‹á$µèJJ®=tTyãétˆç#Á&V}öÛs¯¦ Ý�eµq¹–ÖC9S cB—�xvÁë ΛÆ�dãˆVñú˳¹­¥? ÌÆïîØû""""""mÆŸ�+>•¬ø#›&‰±©t'•<ÊùŸypî̦ËÏO|)—Ÿœž,®¸ðÇ|ùà›ÜõàŸxÜçÁF”òh2�M�ÄÐ^iØ�Ž­Cñ'"""""ò=²;œôt÷äÚÛ¼7Ÿe÷�éwSœ$äMà¡Ûz0ïõ(�Ø0lNò†Lâì�ÉG´ÅŸˆˆˆˆˆÈ÷ÈŸÄç\Åíþ ƒÄ¤|.¾$ÿ¨®Ã¦?…ˆˆˆˆˆÈñOñ'"""""¢øÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?Qü‰ˆˆˆˆˆˆâODDDDDD""""""Š?Qü‰ˆˆˆˆˆˆâODDDDDD""""""¢øÅŸˆˆˆˆˆˆ(þDDDDDDDñ'"""""¢øÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?Qü‰ˆˆˆˆˆˆâODDDDDD""""""Š?mÅŸˆˆˆˆˆˆ(þDDDDDDDñ'""""""Š?Qü‰ˆˆˆˆˆÈQ�?ÃÐÖ9žìÕyÃn°}û¶Ý�X–6�ˆˆˆˆˆÈq~Û·oð{âÏ]ÇŠÇ6ñUl£6�ˆˆˆˆˆÈñÒvwMÜžø³×:ˆ«MÔ–9Ný °Ø®c¾·ZIEND®B`‚qalculate-qt-5.11.0/data/qalculate-qt.1000066400000000000000000000030041520501070600175540ustar00rootroot00000000000000.TH QALCULATE\-QT 1 "18 July 2021" .SH NAME qalculate-qt \- Powerful and easy to use desktop calculator .SH SYNOPSIS .B qalculate-qt .RI [ options ] .RI [ expression ] .SH DESCRIPTION Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. .PP \fBqalculate-qt\fP is the graphical user interface of Qalculate!. .SH OPTIONS .PP .TP 8 .B \-f, \-\-file \fIFILE\fP execute expressions and commands from a file .PP .TP 8 .B \-n, \-\-new\-instance start a new instance of the application .PP .TP 8 .B \-\-title \fITITLE\fP specify the window title .PP .TP 8 .B \-v, version show application version and exit .PP .TP 8 .B \-w, \-\-workspace \fIFILE\fP open workspace .PP There are additional general options (not specific for the application) which can be listed with .B \-\-help\-all .SH "SEE ALSO" Full documentation at .I https://qalculate.github.io/manual/ or in the Help menu .SH BUGS Please report any bugs at .I https://github.com/Qalculate/qalculate-qt/issues .SH AUTHORS qalculate-qt was written by Hanna Knutsson . qalculate-qt-5.11.0/data/qalculate.icns000066400000000000000000014566501520501070600177520ustar00rootroot00000000000000icns]¨ic07%h‰PNG  IHDR€€Ã>aËsRGB®ÎéDeXIfMM*‡i  € €HŽw$ÊIDATxí� °fU‘çï{¯vvDh¡BP�@YfT$iqBÃÛ œ ±£i�iG#ÚœW¦U—±1T0XT@d“)ŠÕ´XŠ’¢özËä/óüïw¾û¾ï½{¿÷½¢J¾|ïÜÌ“'Ožs3óœs·ïÞ¢ÀÀ ,0°ÀÀ ,0°ÀÀ ,0°ÀÀ ,0°ÀÀ ,0°ÀÀ ü5[`h3îmyÚc�=æí»ï¾¯9`xxx±¥½¬l÷¡¡¡m “¶±4ÏÒã &Þ߉‰ c¹®œV¹K¦¶Om§¢úo÷g�Œ#Öİ©1l0Q M²¶¼o@Á·-=™6d\KCÔ„�¬å&Ƈ&ÆŒ7j¬MãE±f¢_cxõx1±|||ô�›†&Ú8>vÏe¹ù¦Ï>þíõ^=Úrè™Mð=�ÍL7m ¿á oØm»í¶ûÏæôÿ`¾;ÔN~Îáì%Gs‡æó,ÍšWÌÏ­Õ/s´íÜyPD€ç‰QB#b• Úà b˜X ¹õ£ÅØ-ŠÑk]þ­w-ýçe&a±â éY�Ù t�¼ùÍo>|Μ9g™ãO´<£z‹‚ÿj€ÃIr>4upÓ«êW0Ý0¾éÊUãk¿|ø½g_czÇ, }‡ÙtqÄ/Þa‡>kÓûÉ}ïu2ÌÃùÌÃà {k¢2”Ó�Ì<]yµÕ‰bãÄØ•÷¯{øœw<ôéû­” @Iß@kk¿²§slÔŸ¹ãŽ;Þµ¥;_;î±ñè¦mÙWnKF¸å‡LÞK˜Ñm g´Ú‘–À¹ö�HU|ezÈ‚rÎqû-ÚçöÛö»ðMе©¯>iunÆÔðî»ï¾ðÈ#�üòܹsÿÉ 0Æ7ƒ‚CŸÚ³˜3<âÇ#fõ9v 0’ÜÍ”Œ£‡céRËÁZß#Âéâ!)zryîl$�‹6#_¶?×–¨cOáñû��®»òÖõn²òVä…pOÛ~Àðk_ûÚ�÷ÙgŸKm­WO=yŽ*ºÂ€³;Ù 8 ßy·wÒeÌ e@$Z®©–W)�€=Âvγf …¹Ã#û¼íþÇ0ïŸýtÕ�kŒ5ã èÇt2¼Ûn»-´ôoæücÛM´åçÊ<™RØ»® Ø^vÚ²ÂMåLb•rº¬ViÎuã ’­Qv zÈÑÛïÙ©;½½qfì¿™* [s_óš×|qkt¾õ½e\7päeo’nw°'—§4A4¸câtÎø~Zg˜*ˆ%µXN€P%íD[4 癹Ãs>w÷ÿtñÅ,³3òáL*ÓE?à³Ó¼Ó¼ƒ[é†ñ‹?F@wvOr¨•#ã)HLÝpŒßæ1gµ6*§ºÂÔÖ`oµ¯+ Á‰"ˆ¶žâ¥û}ì|«Æ9kµZªMÍ$†<ðÀÅóæÍûdíÖ¶@A·œmì¢]XÑhx�Ý‡ß T¦ºÈ‰—ÓuËËõŸ`IÁ#Œ¾�G¶;ïâÅçíodÏ~ìµ"û0÷E/zÑÿ´mGg¶V`l•Cž½Ò0tÏYFØ $ î\—ÕK¯p'ýÞ9“;ma#,,æ¼ÍÞÿÛJ¹ÀÖ“/{ªd��uÔQGÚÔÏÕ½­ÒÀ˜ɸ¶;¥ÁÅÃKŒBv5pYÏyð­$Ñ`§3Œz×+쎴ŒpýÒ#¬¶Á¢-8úê—ÿË ÆàŒŽ‚FÐKÐÈÜE‹�Ù¨¥-UØÎrO8-ƒW±ßá3Í�ÿ´k9Ïiɡڒ·“pU7yêCW“ÊTWò»ÍÙùï­.m–Þo¿ýö°Ñ¼v¼_x§�v*^ö²—»ì²K-•¬‡/~ñ‹ »»XK~*!Ÿ’€ �Ó }”&çÈ‘rBŒzäK@7�Úð²ÔN'½ˆæõEo32ÿ¨ÿ³×y…7Ðq×Íõ€îÏ1£¿×ðŒoìØda’ž8à€â/xAÙ‹¯ýëŵ×^[æsÇ¿ýío/Þö¶·Ûl7÷»ßŸÿüçÍa²j^£;-#ú�™äñälwP'4E5):éq¾xÔ­ò*žN::ÃðA ÷>ÕŠþÁ7ŽÔ##§†^À®ôÎ=fjµS—ÚM¢âÔSO-^ýêW«V­²¨js>µO9å”âúë¯/6mâªg læ)Î>ûì®=´˜F|ðÁ><úè£müi3v‡§gÚçЪƒP&¤Ñî³Ä-ë³_X! Z'w“ú&ÝÂÕö,ïm¤ŠZÀÛ�,<ÊØ,“X’š5€m·Ýv‘]ôyÝÔj§.]·n�;÷¢‹.*Ö¬áŠfQœp îtÕ´vŠƒ:¨¸ùæ›Åò@9묳Üù6l(æÏoÝn/u•j<ó�Qí ·.Ot”öw ä'k‰° §[%97§U+0Ë�Iê�hŒj ç¸hhÞ'ïôwºdåÕëL[í[ÇMï̱kþo°i÷´ö®7Ë���þóŸÛF÷C=T¼éMo*X«W¯.î¸ãe‹“N:©8öØc –‡/|á ÅïÿûbÁ‚®ç?øA±dÉ’R¶.q÷üf÷†¹ÞîOQCWœëU¸S"pà{A»P`§S"€Ëæ81�õD´d,ã"!0ü7óvøÝÿ{ú—�e 4�FÌà\xè;lܸ±¸óÎ;‹Ã;¬Ôm7—Jú•¯|eqâ‰'_ûÚ׊_ýêWοÿþû‹/}éK¥L/„Ð*Æ(c`PPñŽ�aEy£]Ô+Á¨‚ qó!eU757Y_’“¼{Ûu¤v¼Fƒ vY¸¯¡FƒºéQ㈭Á{yk³°¹çž{Ú´¾ä%/ñaûí·/Î8ãŒâºë®+�ß&8“ŒùZ7„ü[bPKá ÀmÎr“#N ÁèA(a§a—ÞµÌ4 Y°Ó™N×ÛÆêÒàší‘¶ÅF4 €Æ3€ulOom6Õ)ÜŽ5 ‚€£ýõë×ßúÖ·úß*²; ”Á»´" LÐ@·rË3Ø °�x�VOu¢8t•k|Ñ¥>RòåìáëÛÐ`À‚áùœ7 €&3»bù ïšÚë;úÓŸþT°îçðîw¿»8ä�CŠo|ã~ýs�©ÄÌãi4…SÜYV"f–;È!Goçt8ery8ßJÍÑNS›™Æ°'SRbhËÐ~`Ú :I§ö[ås‡Ü7ø5µ I pØ:ÄcÛ³céÒ¥mº¹>ð›ßü¦¸ûî»ÛøýÊø“ߥ2�¦p°ùÖÀ6)ëbÎSÙÙÝ–˜âI¦…q$ÐÍ¡ÑB]d†À9\fá¢H#Ÿ66åæÿÙ}œûÞ{ïM»htt´øîw¿ÛÆ›µLòPŒ:FV{¢]x-P4tv˜d¥gºúÖš‰0#ÄŸËçƒYMƒ-¹|Âжˆ’¢ú´ÐôÀöehÑ´Zg P Žt­`j§­êÆ´Q…™‰éÎ÷)»-$õpvY_•…ÍhÚdQñ¶)J´7ž@ºÁ^fºÄ#o€o@ãÀh4ô­6p=€SB;Ø�kýÒWÅn- ÿ†Ãð« çÁs'âÈJrÇ$§ÈIÂT :ˆëI®;ao[})å[:\õÓdñM¨ñ’é7M��Ž2§ïB»Sþã�?ÞÆÌ¯´ô!ãf—#ÍÐîT0 Îénåè¤O´3'o4¶ÃýVNóˆÑ4 =ÂÒ™c•%y›Oû¦qXäÎê À… NýrxùË_žgûJc»0¸QUƒO2pÈ&{{½V}Ëz`:�tŒëOííu�š}ÀQ·Ä)cæ� \ƒv€€˜š7u&ÊGÙ”=È ¹xÚi§k×®-ìyƒ²ä¯àNçlŽàÏÀ6apµƒ1é¥6:C¶\£­ˆGÉbضhç¡ÂË“Ňq A@oE¿ åúK¤)#`R0ˆÖ1‡ñ££¨® �gÓÛ4hju…¾Ÿ~úé\h(>ó™ÏøŽª"�‘ß*¿¿¸e;\Bb+ a¢€±œUQÀ´ÑÁuGE9²èoávçG‹Èª�¨×®Ÿ¹ÑÞvt?¶Q\kÛ8lGf%Ž;s~nô<ðÀÅ#�<Ò¶ösò¶|¿2a1�]J¤�pJjMæçt*VاNM£9)­º(†ˆVy§ú’­‡›-ö} à(Ÿ+~×\sMñÛßþÖ{^½/0[ÈÝÂVFÍix–XÃ…5'Üi„ç¼ ­¶†­išhˆö'ëÓr�DÔ¨»muõÖ–ã�3Ï<³à2ðw¾ó�²^5ì1´²,'ìáÔI�yùtt˜òD99žéšÚ�cš n­Ç¬Á±·°ëAúÀNg˜¢6fË™èg·xÈæm@ç}�¼«m°yÎà=ïy�?ø¹Ï}®íüŸˆ޽±GÐ ûÅqÛ®½êU¯*¨ÿÌ3Ï´ñ›ddH^DboúàZ·¹œPƒ #WMUø8õú1f‰§CN¸“à•º[é-ùIú­¢ëO $ßM_'þf :ƃžŒö?üð‚µÿ /,ž|òɼÈo Uïʳß"þð‡ý!�•õ 2š¹K³u íe CW“EDȆvŽ\ûVeIÞõ-½“ô%9× m}pœÓ’ko­V®Ý#µª4â Ÿ�üãÅÞ{ïí§w¬ó¿þõ¯ ¦ô÷½ï}ÅøÃ¶§~ríÜʯ üñþˆ3Áyç�WÜ~ûíÅ�7Þ˜W鉎>,ü”C'gúø‚Nã,w-åNHR™´Ε6©)±ë` Y cI—êÓ {'QY]4Ø�þ5„Y€ý÷ßß�O¿8·çi^pà 7—]v™Ó�6·Þz«Ï*c`¶àþg Ü"ž9˜ÑÌ€þ<€)“ñÑëO˜¼;<ÃÌá4¾R£0.k<µA­XpPŠÃƒX¼À±­è¯„ˆôæ5¦£g} è¶>ßrË-ÅW¿úÕ)ûÇ�!žÌç?õÔSÅ\ЧçbôÈø´…SÂ1æ,û£,Ê[wQ&tÔUå0‰ÚÂN{môPOí £±ý!8üç´¤ŒÛf=¸¹sùå—< ð˜÷Ï~ö3¨S¼n½¦ü+_ùJy�GžåãüóÏ/V¬XÑ­Z#~LÐŒ<�báNj°àîaðû^ f7ƒGÛ•À ³q$«&LIyÎÒ³ºõö¬õhÒy?­«�=öäy?˜K“�c.�±Ý¶É¨ðªÎèÑÞ�ªqª€ù‹>Ž~æ}ݨ‰Ù¹·ß¬ ϵ´™’Ifp·l¾êö0º½úûágŠáígùàÑg­+j1aCþ>reÓ/Yãå½Ùq°`7ó·¡sdO èšÀ¨ÄÊ¿»2¬ g¨<¸õ·ª Xã½=)¬ˆ-\)î¥Ïûðü›!ÃÑfYElÉ>;À·$£YÒð:€DU<É¿“êH2aW`±«òU…êgUnŠüó>ܶæXf€‰4Ø�7[x• ˆä�ªý]&Ûxp¡;ÉAZÉCÌ[(z¼‘“þDw•$h£Q¡”“| ü¼F5'<ÀàÇ÷Éþ“|uŠ˜Kå±N—2Ê$—°ûÓènŽSUá²c%£¥ÒÕwj^ã¨ÞÓŸFÿ–_œŒÉØrgÈÎÂU"?¥ó˜¤WÑœž¢jߊ¿Õÿk ÌÜù½ìcuF¨^ú�N'ý€hðlÁà:€[¶ûó3*=Ù¦ÄðŽœ<Îé(•,8§£4�Ãåtaøj œÓ”Ò¹zÛÆ3@=µ[‘”[’À ÷Ö°¦Gÿ1>´œ ß€è�!—K2^C´a Z>IŸÉ8Ï¥©#ax¢“>êµ5‹._a#9 kÂó>äÌ6L˜µê $R°Ô±·D…©ëí‹1Éá¦Ur³Ü^qÒåÛ×@¯.)«5œž‹ôYŒçª¶NcÊù ,èr€‰HØw\¼Í°»1Y«ò8³‰ÓôÄ@}I8ëy”רör�Z¯¡}+‰�aKÂ’ÂL½@`qƒç›a£ÖÀš—çý¡×’¯ßµ^f€úÚ·É4xÌ€r>�Cʨ¥ £¯‡u¶W3Äú/çÒ­4¨Ö�I‘ ë%š‡YÃNmvñXbì—Ó­×h]Ì¡O¢7\ý°½�‡÷2ψ, eT‰6<þäZoOlpÄA@Îã!ñ"ËCÐu·½/"îû/„é0OþÚ¦ýð\ræåP$~0Ý#äuw¸›\ÛÚŸ„p8 ,¬þ7%‰*ªz´ZžyØõÊ©!W 8÷s4šÑKé°º‰ŒHô7 ×B�ÀŒa7ÈRÖjbj!~"öº×½Î?Atž(æ�wÝu—ÿ|¼ú ùNuêòbWXW¹„9t i�“ʙ�Ý?ÉN»Ê¬;©Ì8nGMëÞ\´] ¸ÒÜÞ }ê›RÀFa½mÓhõ¾žþ®R¼ö…—?ë `¼ –ŸŠáä•+W< N@ðÓ2„@!ñûÀ«¯¾Úß% Cum¤N�;‰‘Åy}ò˜ éÚxe¼‹FÎÀ O¢£ÜGtP„YŒáTßu¸&ßH�°Ku™QÆð€0�¼¿®©þ¦iµYïë7$IŒÂ/‚ßúַưÞþýï¿xöÙg%æxùòå?¿âŠ+ŠéûèºÀý– i)¬À š¢I(:I&uX2ey ¢q˜Nõ²†úvFýë_ÿú’ùÇ?þÑ[7¦®ºêªò2(yá _X|èCšôÞ�²�¶pnš'çÁKö5,ZTËI-³dæ vÚ6ÂF„ó+„Ë>¥¾Ñ?ZöžØXŽeÀ•Sµ64ë`óV¬;{î¹§OûêNgT³Ö7¾ ’ÿâ½ÇsL“dã(ÚLë“NJÉœï4˜„÷„¡„)B&pÐ-''Ï[iKÞ…³Mµ>Úà9FÎo¡d�¢^¡qÔ­Õ½ó�ï, DÙþð/PUnºHÚ�÷ÿWuTÛèbã®ì0h3Å ZT8†29Ê=‹@xÚG#z4*‘Ä\�Cc»¾V¸P*Ýíí·j„¶²¹òÍgç^ ö¤ÁVŸwU•~|û‡�Oæ`_3ͳµi;îÀäX£KW´TÄoòœ—~ùáAdþ*ƒ‰é™™CÓ´hŸML¹d[>nkQÁÔÒ—tw•o«^+Óx Pt×Òž„¸�“Cþ&ðœß„οJ½j@ÔÕå¶ÄAî,«%ŒßÜC�ÝÑŒnûÃ!îœDÃã�ºÂát9ß°¦‰'ý4™þr�îtS)ìêcÓ’7]Ô%`=h½ñº{r�À:Ôø%=Õ˵3½zG×¹k˜÷z7œ™Ï„ó¡Á–Âø-‡»q~HE @§€¨bWkeeôRYú�ôvÐm ìtʸ £Éæê`¸ˆ˜ªb¼öCÑ4 ›&7òàƒFki»pá¢×)[Šªk>o#ë p05mø`P7fÎ6†³� (ö™ÐòÂ8’ðÎixžP Fo†�¶ê¡ʵX•h‡2ïƒêßå[úû¦iÐ�Æ3@õ“otú¥/})ûØð®Àê÷øŽðL€>•‡PÉ ¹¡Ý »|rDI« œÓ’ËyF»Î„sÚëæ²©¾±Ú„vÅ‹¾¹o¼Û^PcÓ8Lgû‚^£Þêyß}÷µIrk·WàV2³ˆ€—IV¿7¨²éqQ# ù–CÓôo®bµõ²„=SÒ”ÉîÂHˆVy;N-·f“‡Ç\’æ“£m²¾œg_Œk?2ö:SošÀ„]»otáG?úQÛS=\¸QOÝÅÉ¥< Àq—\r‰²ÍqöÑ—ªÃÂi<'Ýá¶Èˆçt*­ŒPd¢�.òY “µQ˜s¡é¯0�´Làí„‘ÓC/°fzµ“%–-[æA ’]wÝÕôP¾.Þk¯½Šƒ:¨ÿéO:iv) ëéŽ@jY£â,†®&/u(@À¦Ï³�s:ärY¯\Í@pÛI^‡Ù‚ÆC�NŒã Q}Zè%Úßë>m-�_þò—ÅO~ò“’qÊ)§”O•Ì)ü>øÁúí_�üŸÿüçSÔ¨Sd4;Æw¸)ÔªN3‹šI#É™à¨'ìÁ¡`qפÀÏô†c…£¡6Ëu`Kèv:é²+@!}MØÐh1Zû ¡ÔšÀ¸½ªõѨÚÛ‡}ó›ßô¯�s.î¹ço|ã§¼§�‘=ôÐâ£ý¨4‚«€< Äçäg 1а³j&ŦSrªºãÜI&˜æ}�î VàÓ =­¼·�`¤5c¸>Þèf]“ ™q{ s™áÚð±�},Œ•Õà5ðŸúÔ§Š_üâþòè“O>¹øÈG>’I´“ïÿû ž$âÙÖûO|â:ª@[�GÇðö kvÑ’hžÁ;VÑä„ÑC>a9R�íàœ¦ �,8R%à\†Fˆ[Z3¶Ž/møª4½úèj‘×ã€òÀìñrp˜_K ${'g·†Sé¨Ô‹ªC¼n*sZŽK˜ú "É:OuÔpy‰ çâfçñ]þs>Ÿ2»`3ÀZ{*ç÷¶~ªŽL‡¹pÑ{~ôÞ©¯”牟*pé˜ ?3¹xTÕÙÊãÆn ÷„ëm~° °\N æP‰ BtˆORª–„Èéj• «mpÔmõgõÄú%W<};×Ã@“cÚd}Ùd£ø7dú �nÕ?ýlWÆu�å5�˜­Œ²À! ]‚ Îé$ ÑÐLñJ9!ÕàœN2 <°Ó&#üäÆU|p‘Ñ3k�tƒÝÜhŸr¹Ä¦œÆ—„Q0tZª·’§ª?“27dyMÀv49U˜=wç%,§æ˜ös£HªJÚ ÛHV:ò6¼‚R2µüÄ�VÞüo&²ÉR£hz @w6Ù�5–Ùg^¯µûfËO _|qí?<êUNù¾øÅ/VÙó½þ~Ða£_Ž�cª� ”yPX¡hÉWñtòèW�j[*“•w’ztõÍÿ}Ù%÷˜ 3@2ªÕ÷Œüuö«�oÛšQ—¯½ qÏÚ7¿ºzõêÖžZÍn9Bn`Û»Žƶ…^§Ä\íòùœLu¯ä pNKNU¥hÉÓ–óàS)õ ¼|Ã_®{Ó�Ÿü_ÆåÃÉ��þQôÔe½á„•W^yåùvmà6˜[`YK�ŽÂêQî´…YœÓI‡Ëd4wáù›È“·�×ÅHT¤Âyb$¼j|ÝÒw-¹àÜg‹ œ6áƒFhC0“ 89ê\m§j�Ûïõβ ¸CŠ·*ìþ´ YgÉб$à„ôgNô?0µzÂå°Å*)ùñºÓ6qžŒƒ�ä¥ œÓ*¯]·ôÜÿïÿ¾vwþXûùÓ¤ ïú¡û£öKŸõ?üð5ökݽìêÝËÔÀ–Ž[¾k1gx¤˜k¯‡™cÇsí ¢#|@`Ïpð°2pÇD¸P¦?Ëø˜á �åuZe\Ÿù?oZyÃßÞý/g\»êî­œ©¿§#ÿh%¶ý –ƒQ»U¼Ñ.]o?³‹DZÇ›^gÈû¶YèߨÕ>biȃ`ÄVÅ9–G%çuq0L~¬ÕW_5L ®xÒ#L¹ÊÆìªë]k–}óˆ;>þ‰GFWò5íg,ÍØù´Ñ�@»Dp0²É½Ó~ r­ÝÆÝËÿÞÓx[,ö¸ÍÃÐÌŒRv L„#—o Àƒ'£%#ç‚sº,Ïê¸.“[±iõíŸyìòsN¿ÿ_¸©{Êdù€cïC¿€ŽäA°Ñ.ë®´ÇÁ¯²;y÷Ø5þ,ö0™îÖ›ñ®ô¦@ÀÔ�ãçäK@EeL×­)™â¶)Öî®Z«Ö^{ »ÖÚµkøWEWºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz ë�®ºèz`ê=03u‰«_ |.á‰'ž¸a¿ýö{èüüü³³³gff²eOse/–………=³í F[Çb´9«›3¸Îà¬ÁR¦Õ«ÌXUe]¶�×�ªGVYŸp¶ë‹øfA&)ï½úÅ‚ ÃL Exiº³RéKâ\Bc%Zð,XÅŒÕ[Õ‚¹J=ïŒÑ�èí¨óÍyÛœ�52MÁA]>æømQ·0_lŸ™-¶Û~›·îÝnB·ó ÛLƽóÅü½3óÅ=Æx¯µ»gG±ã^xûüŽm×n›ÙqÍeÛo¿îW¯z×fÉÑ»ÓÛ_;}‘�ÀÙç>÷¹�™››;ÙýÛÞh�s¸Á‡PgËÏ]yÛe's–¶ëfæŠYË&[sàög#œáë¼~Îê,ñzú‡Tf\ó”î©IVç) ¤�¾¢±-<ÕÃe¥á@/µöÒ ¤Œã¯ë³ä6š¯›Ÿßq� ßÛ:?Î'wüÛ¸ê‹Û\`ˆ,Õ'ÚNÒžÙ©|Âüb!á�M ÿL ”“Œö`[º’zàw~ô4KôuYò“øs–ôüÙ0kЭ  y—€p+)óvÂëH]žø%K¹Xù’#X×r6ïXXøæ¶…çn/îÿÿþí¾ ¾ý®k?þ€µ¡Zª%bÍÃÞ=º¶ÝÁ_~ññq6løu;Ê¿ÚhÝ»2¤~ç²§[¢ÇQ߆?úÛ9M iFà €ÉT†xò£¢0c°9¼­¡YöÔf ý ¼´‰¶®Ä•³ ÚQ$[üu}δ̕™¼ÉfŸÛ¼cëÿü½Ë?{Þ9Å9ó®z' ¢'—ÙI+ÜfŽ<òÈõ¶¼rݺu¿kò¤¶iͨg˜µ#<Óþõiê¿ÞŽúq �ì ÉòRI‹ƒÂ•�+íô¸¦nßbùwÌï¸Æ.2üÝ…Û.úÇ_½ê÷š#Ä}ÿÕn+ò°hKîsŽ×ëw™ÛpÚ…�þðŸX+YeèÊ—Õ4Ð1³§žzêIväÿ†¯ªŽZù]Õ¬ÞÙ)yâˆÏÀÀ^¨vƒ0 ãÆ Ø“Ì2•D¢L˜P·@ñ :žÁL·ª±ÜmAµËL•ÐÊVç Rä+0Ç£¶d-›×õÁ‡^tQ î9»ëûè¿{­mi&àU+½Z-}:÷ô§?ý¨=öØã ûiK‘Áœ’Ý•?Í<°#E¼‡³áÀW½› o*:Ú—Gh«Ó‘²'›Ô ‡(A‚½9‰mšîë€æà²Gº¤IŽec©Û�,a‡)“—ûœãÒç¢$Ø6\‚†Ïì·nï�œû¨÷<ÓH«f&°ºlÖîó`/åøûŸëZ'´UdOzZVñ§€Ûà´HvT¾xgJ«Zy’-tOÂ=©rÞÔœ¤¦s<¨òÓ˜ãI�(éhãú” 9ÌyÀ{”š<7'ÁÜoáÞĦUîSæ«tÚ+P6¼a¿3Î|Ļ޲«bXé@}¹áàƒ>ÝvÞ‘yvx;= ûý¡-]ˆðwìO´¤ Ö—�çGaƒà$�`Žk'{¢:›ñ HXDäÅeAíAœVRejäu9ouâªÀ8~ü¦(�Ýo¶é[h/è²&ðß~Võ Çîú°~×!¿²¯5'ÿd†¡í—Õ0¬³Û}o´ßî󲎮´ÜÄéX )¬�7B t�T �¶À%˜'Ë0ro‹xd¤E80Í€)á »£­ø­™·Rà¡H~ªÎ™Ÿhu^ßž’ÿöTå‘/Ýçäw™.^-‡è++9àøìñǨ]ô{׊õ@§Ø“+R�ŠÝ¢ W‘h%õàÎ4$Ún$§)ÔQÄ/܉ЃË1œÁ(d:æl`*€,ù ‘û#þ:Ìyr¼Î§íiú¿×Ü®oüü‘öD“½¢§+5hŸ­Ûÿýÿ»uÂ>êä¶ß<ç¯#9pÞS)ìȃ¾ž pˆæÜ9³ážT :n{]°Ìc"!¦ÓM±…;qÀª¦ŽáÂä§�#)ÈŒº|¥sÿ‘‘Ëv&ç Œfò[ÐkòF†�ñÝ#w9ôýñ’YŸ`…ôv×+9¬;õÔSÑÞ×÷Êv]î´Õ{ÀÏc-` fp~PvDµ§J-À]Žhu¡¶­ä:ŽûóìR;ÁAüÍÅ»NDÿ%Ì«œw’•tmqŸ”ÿ‚.®ÆßC Ï}5zxo"«‘c‹½wá)Ÿ?ê�^o[+v*°ûjöa{Ø»í¶Ûû ïÊ ÷Aé±�Ô�ÄNH«ˆu;Sxžu9>©?y›Ö>͸.á |¢ªdæø0q}t¹t=p•U@œŠÿû­ßû]ïÛøÛz+µz!ä·°^©`îÑ�~ô[íÂß#Zð±S1®;OVמ@N£NHÂ%Ï“Ã6”Ææ8PM˜�µöÎc´aêÂ2”KAÂÓ¦�†k|@øPy´K"Úk i;T@Í~7 š·‰f’ër’(Tz1^;ùÚ÷Ù»÷ßl{EfmtÍ졇ºçúõë߽ЭWºtÄ$‚•DžT¨J$\ U‡ªÓ€@.€Ï UyR€K‡tÃãúA¬Ôùê´a ¢Ùðun”á®+Á—Ò´ÔíqñÈ3 Ï F¹<ƒ{Ìíòš÷vÚa†¶~Ap%€u�yÌc^k]¢º²ò=À°�ï`¸¶B ROR€-ª²Ô"§9o’=.AJy‰ßÀÀâò­Füu{iM¥Î]´&¯ÞðI§ËIý¥ §9o©of—“÷zÄÖgm„úìàßý­VE‰ µ7Ù�ž´~™ªLt²X�¼U‚á€uòDÉUòݾÄ#è›JF`–,Èt¹�z—Ÿ Ë5>ÁAü9M2s¨¶ÀONËqÕ㸠< ó'± ÂçC‚{Ïíþ/Ûói|Š®ÕY@ÛÀœ½Ýç;÷~weuô@Ü3[,p# ãœ@æè¯@ÄráÀA Qï<Á=At•)i�×WhGIí}ÓVi³¬rÄV <]ÜÒ¢n?¶@æ¸|C�Úä¸êëµÎŸ v_3ùÈpšA{'Ã>o;äe/1´Õ€)G[…nX·×^{½¦-…KÕco.Ž8âˆâ�xDqØa‡{ï½w±ë®»·ÜrKñÅ/~±øñ�¼TÑe;›Çw\ñ„'<¡°g! »ZÜxã�Åyç�W\yå•%_Óˆ‚’�CÀú½k[+ÐíÅeb9cdW}³LµÍ“ÈÅ#?%Û®°”Â6z+âuá®·ÇŽŠ=lî‘/?Âà�3´ÕåÉnAñ½ÔôÕ6ûä�µ¿4'Šbÿõ{ÿŠ�ÏØÂKE†ÒT ÍMI¯ä¢g�%Ò^Ï|æ3¯²�¼_UµòA÷ÈG>Ò“ñØc�-?üpÛ™ƒ»fÇŽÅßüÍß]tÑ’ ·_=¯yÍk {ÕÙ@ÿú¯ÿZœq?Šl¾ü.Ÿ³7ÿòe ¹ûß´ã o žÍ_ >¸Oš·rJú2Ö䊆 áJ;Ü�úæËŽÿqÇ�ù‹O¿ÖTm³E–4¦¹­]9wÌ1ÇúèÂf!ž„öî�%Ù‘û¤“N*¾úÕ¯NÜž6ï|ç;‹�7NÔ†A‰A é’.ùy0³ò×�q­Öp&AQV(Ðëñ ]4Z0‹â”B³)áqš2{Ö4¦ÖpÉVu}ŠM;?]H Øï6© þ²ƒ ¸=F+íésÀ -¡˜‰‚”¬ºÄËú%ø¿ßÜžü(ît[4�8#M¿´1ÐO\l´·|­{úô]XœD{Ëpq 'X ,×_½Ÿoßpà Å]wÝ峦ÿ'Ÿ|²Ÿ“�’l3'¸¦ðGôG…=ÿ0JdO�½¡g»©�~KRØ*Þb®"8 º“|1ÉZ¡½¸ø*j™lè«4()©®6’"XOpè¢E{Ö¹}j):‚ËÖá` Ý0äyHªxC^’3;òú&ðÖK‚]lúü”&œXŒL.â}ãß(.»ì²bóæÍ›þèG?*Þò–ÑÏ)qÍ€£:ǨÂÅÃ?øƒ?XTò#ï§?ýé(±S­«±Öåù~$ AË„â½Uò(”7õ„ð²v•ü^ŽÞ­¤Û= !7 Na™çhÔÁ³Ý¶€l¦)�CÛî—ïlåjœýJVÁhXj/m™¦ÿ»Ì¬;òÿ~Èÿqð_ýìôkLŸL,mž6ÒÖmÀY»¸vœM¹Ï¹¢…+ìßýîw‡&?Æ�þùc¯Ä3­å¨ÉGálóö‚M®òŸyæ™ÅÅ_<´)×Î9眡õÓ¬ˆ‹ ÆÞø3 Šê„(�ò%O0¥… ±ZÑPiJè®dæ´h„÷ñ[Â;Í ?ň�Tð‡â~¹o ‡æ5Ÿ`ôE/?mò¥n/m+íùVxuãýö^ÇrÐÊíÀ¶fs»ï¾;N­™röÙgû��Q30›V^ñŠWO|"?ù.Š{î¹§xÏ{ÞÓ3°<ô¡-^øÂO{š}žË..R6mÚT|ä#)n½õVßnkåÁI")3H®”4²ª#�+\MêGdNÈ= SRŠO¹=8 «6TÒ.ÑØ„9;…/q§Á,•}ÖÞiI?"\¦#SàGœ-¥²H‘/I¿øaéÁSûÖïË©2·©fAM#¥éã9xÌÙùÿãñ !¡Ì8šxÑqä‘G©)üÎÂK_úR¯¿÷Þ{‹w¿ûÝ~Ÿ?oð“Ÿü¤øû¿ÿûâÓŸþ´?opÿý÷Ð{w!—¹|Ƨü)˜m�á·E�Ÿ —A�"õO ð�à¬RrD²M_öô)í’LçGí’<á@/¹1F`“ä¹O¾ÕÄéGâð©!mkþȶýðÙB©ó7åÿ®3ëkê8"4~ éÀû g¬óÊÆZ)$íÕW_í ³ù�C)lfSlÙ²¥‡åÁ~°ß*$`¶mÛV¼÷½ïíKþ¼GýK/½4'µ‡[t/اÁfì9€ÈKÿ"°Lˆäñ$P¢ BW†ô%õ$N’e¼Ž«=ä �ºœ?áaBl¸¾X?ç÷„¬Ét’ú]l#³'h¡@¶UöÖôËVAä¸=IÁ”ü·÷�+ä¦Î¼ÔIÑô š,t‘ÏlŠË¯�ÖTwŽøÃÞã´7½éM…n1~ò“Ÿ,.¿üòžUµa¡ÅQÒ#,áþÀrqf±2 ˜ã‰?Épá9.qÊ4 <‚ŽÛ¶ â•l@%¡ 7 Ø,Aß@˜ãN¬ÑÕ‹¯„¡#|ÏñÄ�ËÈqµO6ºÏòÛ }�yÿ§íúèÝ�MBÕbê°éƒgì–Ön¶#˜ºõ äNÁ¸R˜öÛ»¼×¾öµ¯�±òõ)Ìx5˜‡œ¡'ŽÑËPÌCRɧ„¤˜µE†Ë�L «ÔÚ{�ÑJ~DÁOò°ÐT¼¶øÔv“‘OçKy4ÉõÓž’äx�á%ÂU_ò:b«šýaF‡Ì>y�sýµö^þÏüò§<ÌØÉO¤5Vš0ž·ÿàL£Ž4ÑCW\q…Ò(Ù7n,«�8âˆâe/{™oßvÛmÅÇ>ö±²n5#:Kç+Á*‘D‘L$±ê±› x$Š ¼. ·‰•­ãÙÒ®\Y¡ \ ìüJøSG4ƒ¾ZBp6½"Ñ z)¥~ÛtZ’ïö"ÒdÆbÚâuÁÝ×å· zh"èÍ=ùCçÃvÙÿpX‚£¹uÓ€ûgÓá�͹Мäû¸îºëF*Ð À.rúy?Wó ®äÓ~-¾ìøÊp#’S€&8ð}„xà$CóÄH�ÐðF÷À7hb¼²¡¶•¼�ÜâÄä¤Ó1.8ÍmLlà*u~÷9V4ŒM04h’‡¯Ž»×aÛ´üк=¹°sÌìø5uP÷˼8ÀÏ÷_þò—ÜÖ£œuÖY+wQÏ-˜|Erq䟷Hö„ð³È·EŸ'8u‚Î+[Ç_° ×óÉ×à±eXÒå0“…L—k‚0c‡ 8u‚â„O80óÊq`uGBG||Ž¥1�H� r°[¯Áƒ% xH o 3YÈÜcv—�çÀ~ÿßÎs­ôç”Ë$ðžýìg/~ñ‹]ówÜQœ~:�r¯•’ÞìæFÒxP�µ9ÍÒÁi¬*š/‰FÒðG÷ét‚Ž‹`°#NVý‹tKŸs:?²*x$o% Ã/Á�]ÑDÌuK^Ns›Lv ]œ•�‹ñÝÌ\+_jú6 ÞÛìrfOƒk²L2¼êU¯²;úŸøD±uëÖ5ã«'ŠÙ.û=5ü0‡ ¢ãKž@¶e›3v#>’­Â¡QúëEój[™Lç�¾C~$LÞ>ÚЂ.&‰RW'ùy}uT ðÊîàëµ·Ÿßmr?]£­ä3ÛÂsûšñß~ŽÍ/Õt P9�S,M_ÀpÛkwàˆ>î©<%Ï…^X\pÁSÜ=Í‹ò¤²ÀÖÑ)í°¤Xt>‚¾‚‘�0"#’’Ã)PÙñ%T ÂUÉZª|d„ÎЫÁaRy²9ƒJîsŽoè ò[p¹þ[?qÐŒdÚ”hM 8‘œ™’Éí‹™dÀ?Üó_›E‰Ök0¨ûGgít¤¼âË“DI˜C8Å^†H §nPQ[ɤ=xž'’9¨}�V—G½huÞÊWú!Sm�ƒ8Å.[ûí_31ÀÜHirÀ`÷Ì®0�Y³e’€_Þ|óÍkÏG;dÙ;�}:�ñ„g~”Îq›¸@þh)8(!Ô˜ã.$I \ÉÂVž Q«u®#ð°¡J¶Þöu~·«K{OašÔ Ï9| Íûo6¶2húýe¾ÌðTÓš-“ ×\sÍÚôÏΩfâQ` ü}`‰â´”0J('&>xòƒ’Ñsx½H–ôÒN4x%[{Àe—pÕ×aÊß/’r®Sô–Š Ý²§—/ü�ꤓmù-˜ÓÄŸCÉÚ+Ú8h�ò†ËÀ›ž`N¬é¿Íç·£Ê�8ªzU×ù€²0%¾'WʘۄÀ|�?Š ãõDI‚9¸ wàÐpO¼·ZAgTz“Ý‚â Á½kÕs\\JÜÜçÇW¶�üQ_†ÿs 3»¹8÷ iÍ”¦í¢ø­k3>4.•�ÌS�£J<ì8ŠcõÖáGGOI¨d2�@æ G;¶�üQc# sùV“AOKAtÃ-N] w] æ¸óe²­!�#©tß’|ù€pðPº�–ç§Ý€ë ÃÒÀ�;(Éì—½î«m»m5ÿMn³s߯adskóo¦gšs¡ûƒž�76©¾QÙeøœ¦‰ ö MÁoJvx� øiã�,H›„;žç'øtœ6YB8ŸÑJþ„Ëo›ÕË ²Á½Rµw~デ%Ù#}.Áh@ô öØŠM´…'AÇ�í¼Öt¢Ïyùyf°¦VÍ€¦g²zMÏpbÜu~l_;–¿k r  8ú‘Ê=ð�7ŒôHš [p�ÃUëH”8 %¹ÂÔXzu„„,Ú$ò±ÅÒ Û•ÁAúd;0Ç+]½OôÃ`þª%Xok#$ûÜýÂÏ #ho6¦ÄHÍôKÓ€Xó3~ 4h7|HdÍJ»ˆáŽà¦Å£‡¤­üy‚Cˆð$˜ã©Þ“Äp`ŽW퓬%ÎcxÉï&Q9¸¨&57&Óå¬ndØæNضìÄ^ês b]$rh´ÅëÌñTŸûœãUû$ S\%+ÄÚ}™Yû@C ¥éÀ]0‡ZÑÓd½èE/ò3JÇ£µ¿xfÁ:c¯ÿ!f‰nÇí éã¥Ï*˜ãN´r¡VÌqñæB w#Ï“*Ç© ƒ+h"m˜qÁ@ÇmSЫ\&¦¤ö˜ä8�¦Ðdoˆßsœ&‹ ³`Ž‹9b¸ûÐÜV€VŽÌvälE�ºuÚ�#»^ï5JöQG5ªzuÖƒ$—~H¢T ¤D‚<S0ç …€¯ ·©[ÁÛ×L±Øå9^AǯgýÚqLP²äZt%TÙ)ÂU§\H á0uHJßÒ`¤ÔÛ;Íõ{uB'[¤ÏÅx¿¯•}!¬Êy¶0( î²ñ;¤ÞJ�½æ�lôJÉNPu²gYþK¶+jnÕÆÔWÖìðÚ×¾¶8øàƒ}Œ{Y'ƒYSÅöG~OB2ao¸'z‚¼/ ?"ÇÐл†_<1Hh° �*œºAõ1„îºþàO6©ƒ“½Þ;½Q@pOÈ=)�G0X½‘¡ñ—Ó7;Ñ/ßz½®¶ržAþå´�a&ùmZÐé‹Öò·ØÆÀÎ^“_ïå§¾*ÿðÿ0öqßµv@èÛÛ"¸Ë¨‹„ðd±x²@�X N*‚Ç‚àApi�,!? Ëw!Å%yƒ°%ì ]è ¹�ÃË’'¸ÿ ÚVØ0Çgé+:ä· Û—lNê\8²B^àØ&¿'ð?g…½‘Òô 'ÖÜÀ'Áßð†7”�~î¹ç_ÿú× ¾4ªðíÁµVÒñßÌ®%“ï=É8íIA|Œ 8(Á{OÿH4hJÈà©:º-ééÝ€h’¼.`ŽKiò‘E0mö© éTÕ�D3ù-HMóþ£¥ÙÒô€õôo+W4§ÙU¯ýë‹}öÙÇEÞxã�åûýƽ¾›@�1M{š’å Xf ɩ䉴ˆ8JjÁƒ+Ú*�{iðÔë  ýϲ©„žY 6£äWƒv„ü€’+ˆÜHèÉå…oð[Úõß i¼´1°S×Ô àYÏz–؃Þç¼ÿø@ù±Žqo ¶/ <´VJ¤‡¶_KG{7>%´¿(4ðH %A¤4¥‹ðàóÔ6I{¹Sïø”Þp ã&I0É•Lt H0Ç¡9=ƒ°÷R{-�Á`v8AþÖ!•Ѐäe´¨_ô�5*9ÀÃ×å· e�ó4¼je0ÖÌÀ�z~í×~­ìvÞðÃ×zTn¿ýöâ–[nÑæ@¨×‚¬\•D jâšÀj¸“ ¥¢�æ¸ê“Û¤å‹ 1¾R`Â˶HFN*ž†mñÙB‚š9Ö�œáòÂêñY~ †™H(ÍM8´(’ œ`™ÈÉn¶5´¥gY½Ä-¼7¿ùÍWó)¼×ÐG:'9 X–!-6&ax@MªÙJSu�ÿH.€‘åE1këÅ�áÁ\AørZà$O•Pe.*WB-ëTÄúëò¤[öÈ6à ý´Ï—œ'Ú„Uò"G´ð>éC–lÈm YÓð_ýÐÔžoNCôF“ò§&û%/yIùAПýìgWý•�éB LýÉ?<µ µ5!ï»� hcÁ­àWBÐ\ ä¨ÓŒBKˆdi$QÙs\õ’-}ý ˜fîAe‹øÝW[ ýa—l–÷ÀðUpeüÇÆfK@³LIúGTõà¼ÿýïÁÇ:•q€} ©˜ôý<`ôÎw¾³øÍßüÍú1o¶0ðd/S?mFb�@ßÐw41dJ*B#y¢.ð@`ËùÓÈ£|�:3ñ JGU7œ?ü“‚àŸ|À©’\hm˜>|¥„ÏòC0*Æà«ûŸ¨�‚n°îݰaCñ–·¼¥üD÷?þã?öœ÷×÷À4¯üê¯þjÁóüŽ€÷ ¶]C‚˜� ’–lÍIB$!¸^Á¯Ä@†d�׋êÄ�ðRže€Ó úŸÕ•0ñõðg´\¶ô"‹"ùî–ÑJ÷¨sŽXõóg>ËoÁÌvùƒÙ‘‰-QÕ‰ß}áÙ°A¤¬s9ú>ä!ñn>û쳋óÎ;ol—�›Lr!ðÏxFñœç<ÇþèG?Zlß¾}¬Þ©3ÈöÇ¿E/ÿé†É˜$eŒ°áøL4’ŒÆVwJÈŒÚ$_ô¬M]–亼?vQ/ûÂ|K üî ÁÄ'è¾Y�`ð™ç7èMéœöüOÝÒ(ø¹N>ùä⤓NòNæ½~“¾ÙwÜ…ÀÇ?þñ=Á_ß‹7n,N;í4'á _ðO‘×yZÙ¶¯N9”�‚.;5†–óª}Ûþ‡G�®×ÌýùIzaãÆ�?Þáç»\À»úê«‹¯|å+ìÐh,9GydñŽw¼£X¿~}±cÇ؇sûI ¼|0„o+Ï{ÞóúÞ$Ä[ƒ¸è·ÿþûû9ÿ‡>ô¡‰�az–E·à&ßSªGÜè©øÀ  Ï>êò,ËqÕ©=u¢eÍò&9ž'):ó$d»¯^4*êL›ýÊ1¬/�8°}j8P‚³UÍŸ²�X¤}JþKlƒp§;ì°âOÿôO ¾ÒKá^>×X¸¥Ç4û[ßú–ŸgŸrÊ)Åk^óO~x™ö�›ÒÃW/_|qÁSƒÃÊñÇ_œp ®’þmo{[¡/ æ3Ÿ)®¿þúaÍÛ¡{Fr¡�Â:È)ýIDŠ x_B�h°ÂbëÔ²¬‚ÅK0$eˆæzD@ê…‹½Ô�lðæ¶*å'må`f5à²@ï&¨~ßOc×’™#nÓozB‡4¸qÎë+ù*‡°K4Xm©´WUbO ¥=þg*+…ÓÇvšà¯xE™üõnâÏö³p¥�£¾Ê—¾ô%Ÿ%h{1ð‡?üáÈYo}ë[ ¾Èu=dÄ'ÄнŠÎKùUàlúÙ‰£?˜?`™")•˜^g4 Îh›¢Ù€×T›–deü{;d«=Ìž¬!.Ë?-(%güeÛ¤#ÜGÆ®Bo./Ù›ZʶÖükñòvš@GÕq]’'ÿ÷¾÷½âSŸúÔ¸&Cë/ºè"Ÿ¾sqXáéÂc�=¶§šï |øÃ¶ƒEŠìžÚö7ø­ý#CãYÑø<ù• õ„Pbâ]ð„OÂU5ǃ«ZDZJxç× S±•i:ƒ„�¡³êgÙG?X× ú^y’-êp¹þ‡Í®íìoç(÷Ýwߢ¹òÊ+ý¼9oïAç÷¿ÿýEé½û÷¼ç=«æ Â-oâ�~Ü´0’ƒ&eâ/øW}J†äÑQà*ðSÔ.— N_,¿Úý!z¥?tÈÞ¨n_½½ä"G2ä·à¤þÀ×dÙi.øMZ®½öÚâ¯þꯦrñíßÿýß'Uë_úË¿üË⦛nš¸MŒþZpSD°ªDàFr(y,W“óDÕ­úïZ›]ít@³ÝµsJ_°»öEz{?x t@Œ �-j«>èË4,%�!Rªÿ½ø½õåMþ4ÅîPLŒhh¥5VT] ^_ç3ÒÀ•ãð÷%|�!<Ñðå-zV�ú_ïìÍÓÛè€éõåš”ÓxK~å­Aγ#ì#ƒH8nêJ€íŸÇ`± „6F�e\ÕCw|lÄeH@èj…Ü`Iº²Í^þÞ‚{c¼i\°G Ó‡N R<¡ÍN o;g5àÕÖóÁ°(ÿiŒñ ÿ5kñ [!;ñAj¸t@üÚÅÄ :ЈQ BæþüH€6ÈÃB)•K—âX% ¼‘ü‘ È6p ^´öz¨ÚëëU«‰Àô”µ@Aˆ± yÒ� àh¡–ÀèÀvž5ý@©'ð8ÿ•è‚’áÂ\^`>Óù-”ú¬®•�ŠÕÖ~±�€³À&ø¸&à#†¦`'ä¸@Ç�ß”|â�¦‘(I¤�¢,ÞfFê‹€ƒ:"ç>ˆoš´n0ÍÞ\³²,ñ9÷Ä&NË÷˜?étÞg}îù¡Ê¨‚0dx5`ôµÜ9òUp¨ÿ:œÇ)€õjòßG]ã¾ê/ÛV“†{ª›4ÜÁ«^¼™ª ]Är:!𣺟À“Ž`%\õŽ­F•ÕÀ—­€ÂU× ì€fúuíHÍŽ^ñ‹ÀMQ«ó0&>ÁpPAš¬hƒC|ítÌ$–Ê×ñþGº3Ó¢ ã�Zz=õü$F,‹§–Õ};Cã*¹Õ…�Ýí²uPâ6 á èK 40"GÒ¡í e)þ«éäP$�:p`Îg›�•î@c]»VGòr›OEi¯a Ðy¥ zð.IÁ/©;”Ûe–Žñ_üÕ£OÔCôU…¯Du3€•èõU¤“¼çŠ3þÐt:áêÏ3$Ä‘_0¶wJ�ÃGzÉV6ħßÙø³Xÿ�ßV‚ ÞS ª_�oú¦÷Iìf}]òsF ÇýÏü·Èó_ÜÙ¦Oç�–8T—¢S¿Ì¿GwödžäÛæ‹.ýAÕµÒë ›íã-‹õŸÑÐ ×Qiªë©l.�TÎf"Öhé€F»wõ ×QHçîĪÓ0�X´€ô[�$•‚¾i3ê½"ñ®Á�fV¿cÓýÅm¿ùEk¼å´W²€”AòSªûÚCÌËbåÙhÇìG¾×õ›ÂÊ&ô ²oÿËþ™À`׃¾J7´ÐÉ«Y…’*‚4¦ô‘�íþŸ½@Á ‘è†+áIÇU>(“B-¡ê 'YÃä÷µ—’!PºaËñ>ƒ|ä£J‡*ÚB—Ï!¬¤å²s9Þg?jÔ'I%rš,ÝÐdï®Ùt˜µ_‹~N�üÈã’bÕùDÈ!ø¨Ò'CŒXΑ…ÃhEŠûÚ�hj $ömU“gtdûaØ ð¤¯ÖºÿÝèFWÝÐh÷®~áÄ:ɯ÷øAÍÞfv‰Ø¯r©˜Üð„HR¢õä‹ÑS¾”¹HâPRó²Þ‰ªìÙHD@:ÊRí› ²­é{ùØlÍ ÷Ëùs%ÞgJ „'[÷.ÝÐp¯vñ$�'�Û @9Áo•üÐ|Qî$XÏ|EžŠ¾!Z½#Àyj æ›V‘ò- Ó%™ý È9<üa|àÃøûG“MS5¨àUF é·…’`£þKWhllÝ �uílÁïÏø¡>l®R>¶ t»`C™BdFÆx²YeO–µ‰ÓØËXN‰ª Wò½Htj v‚š ” �T™¡"õZk Ò“ ç»á2Ëù­qÉæÛ¡eÿq¯éÒ M÷ð*—ïI�›Ä‰äáb`Š~ƒðpy :Š‹ä©Ž¸¸ZæÊ¿#á«„rÝÖHq�†—2œ�* 䯪Ýv51r)Wò¡ÕK^—ÌH}`œcaoƒþ×�m`»èÔµ&’Ä$˜ øH ˆ|’£Jz«³J%¡³ÃŸhÃ|IQ«d” µ¯`†þaü²H‘­¹¾¨‰uÓünC¦Pvz}é,}E0kÚÚ= ØX×®Áþ¶ŸuÝ·Î=ð�A<Ä‚9¯p%"0ÇU_‡9OŽ×ù†mË`ޝîC޳'ç>ŒwZôVf»îºë´ìíä4Ð$¼¿Àd{¢—Ç¢j0H¹¿(탒P´A‚T'OŽj³ši²]pœ?âs¸”_Bg´2ì¾;ŸèÊjí¦ù:êw±7?¨Û¼ðD‰Á#‘:oÛ$GN%’𦎦«Íÿ¥ôqw °”^ÛIÛèj~~R2 r™„§s܉¶R[`Ž«¾sž¯ó ÛV¢=ù�QPƒ”à ¹ÎÄ -÷9ÇÅŸËÈqÕ×aÎ#¼Î3ííVfÓ6º“7݈#¾Í<ƒ,EÒ}6‚š…`r'ÀªÌ"ç0H]ÜÔƒ9.Îé^í+ÑØèm�d=çÉq·ÃÔ)9¨Í…/s%]‚ˆËqé’þºMø¿L—Æ6ïfc»hçgà"`ù>’Ü“:ïITÅ.AO [ ‚xb$¨$´feâB]�úz©f$v"£'|Àd¢ÓÔN²€‰½„ SAð:Nsœ•ƒú Çgù-Ø„ÿènºt3€¦{x Èç]þáÏr r`Ê3ž&iXê3‚ß�JJ *Y€*9»ó¤Já%�)pܳ,ÄÏ.5ýü!O Ñ6ÑÐQkP·_¾h`Xl½ô º:3ÖíÈ|L¨³É¤扭QØ �vïÚÎÛ~‹œ¦¼éä.©âè?ã_ö[‚Ä#vSŸûÖ1CàGA:E¼/Iö3�R‡K2n6Ë“ø¯>Á-R‚®RjDûªßÚp½�?""Úð¨Ó±èˆ‹€i2H§Ý5 )hü˜¯”a€«áÀ# ¡„˜¿Ë>úœ3ÊÁ¡L E¿Œ$KÁ¢Á¤ä/µG­yŸ|éÏ“»Têòëüý ¾JÞ¤þ—üômÖ?d¿û–üw»ä¼Œl¶2˜“-»Õp¯íDâ @Þ0kçý33¥e~$‡9ê ‰>þ}i7§€öAž‘îØj³‰æÐD+ª±�/l“ôû¶­\&VàÅ/Û˪l ð[þ‡¼è h”þú~}É%çƒ ­ûµ¾ɉÝÛJÉrõ9c°7²ne°¼¦NæææŠÃ?¼Ø¸qc±×^{{î¹g±Ç{”pûöíÅæÍ›ËåÞ{ï-n¿ýö⪫®*n½õÖFvTsB-ùí¡: E‚?†k‹B ffQÏí?Â5¢Sx5¾C¯êÁ9}PˆGÂ#2BÞkHÂÒ9�l$Š*´I;·/ÚcóÙÃÌ%(’³™°%âMõ.×ÚH¶€Ë¾„—õHoÓLn¸´24ìÃTÄzè¡ÅÑG]uÔQÅ#ñˆbÆ K’{ç�wú@på•W]t‘KÔR#�uO€8 …üyu§ð$¶¤T‚D:é„�ÜäºA@Ìî:��‰ ™y{‚FzmM]jß›°nZRàGnÃuG^à‘ð!/ltíø–ó+¹†}åo’Ù Ù´ûCzø-{®¯Aý8ÿƒ§Ùu+€uòª�<êQ�*žûÜçÀi”ýöÛ¯xÊSžâË+_ùÊâüóÏ/¾úÕ¯ «±�Ú)= ‹ceù>Oh«õ„&n€s÷Bo¯$¢^| ¢)OHi®`’ïYM{,ÓQ]Â%8êÓ”Åê±>è*.3áÈqoAMÐîvˆÙ©‘Ú R!›�{Ùþ#£éÒÊ`;�Ë«ª<æ1�)ž÷¼ç7nj×}÷ÝW\xá…Åe—]æ |×]w÷ÜsOÁwöÙgŸ‚dä#Y<á Oðíº õë×'Ÿ|rñŒg<£øÞ÷¾W|ñ‹_\}§½eÄ› vÄ‚fÙ»à_µ�TMòæGLŽ} Õ1Pr KdÇmèE•‰P;ÂFÛœ_‚J7�ÒglRƒð¤Î s<É5ÿ‚–jö´î?67\Ê®h@²ù"Ⱦ¿þë¿~‰uÞ> èX´H¾RôÚ×¾¶8î¸ã†¶ýéOZ|á _(.½ôÒ‚óýq…Àà´á/x�Ãø·mÛVœqÆÅþçci�þ¦ï>¦˜³k¾Ø¥À¹™¹b½A® ¬³“ÿu sv À × R¢ÉÈq 8®¾?#ë+MûäY‚*)�#å¯Ì¬ó÷J‹qIM¼®–ðýF¯„ºüú4®~¤ÿfØ�ßù?ù 5SÇ-¶¤Qª×†ånµ2X®‘ÓjÈ!‡§�vZqà�I²éK_*Î:ë¬bÇŽy9*rðïþîïŠ'?ùÉÅË^ö²bï½÷îceFÀàÃéÆé§Ÿ^Üÿý}<íÛ*¶üxΔ×3ÃVþO(Ç_n_=à©Ëe DMïïá!X£4Å—0’#èÉo€Ò-š¶sè.!¸©©¯H¾[•Ûc¶ì�ͪ—ml Ä×Åø/™M¶vóŠÎËåW~¥ ¦öúЇŠo¼qPõÄ´ .¸ÀOÞô¦7{ØÃ¶Ãî2|ä#)n¹å–�øÁ.;ùåò˜ pí`XaòÖ·¾uൃamš “;Ú9lÊ¥P•* (ª‰ N óGô�ÚJuÁ] •<%eØ|!\ºJ~NÐo0B¬‚´Š™A@pü(a²-÷78ägâw ÐDlÞÿZ÷5²ÙÊ`�®kĉQB¹µ÷êW¿z(Ë–-[<ù9ïŸfazÏþòË/*–‹ˆo~ó›‹ÝvÛm(O$WoÊ¡5%Žá|UÂC…µ–y’.’ Åi¶¼‚ÔÐ^°Gu^SAçËhÔã… <X„æ¶;É1êáØ+ ©á· ütŽ)ûŸÌl´2¬Ô €{û¯ýë ìV>ûÙÏNíÈ_×Á5…O|â~ç ^§m®K¼á o:;_“Д%_?SҤĈ­Ž¨p(iÁ ?¦è'îIDATë¥j�$™§¡ËõÙ– :sé}\Tâ�;<¬$@‡ðH§$Õ‘d100$²�'ƒ'êó$ J5¨°½X~Oàr� ‰ùºn]ÿbëÍÂ$~ þg}–Û«/¥G™Íû?ÌòéÑ›di+ÀCúБWþ1†wpkn¥Ê¸»÷¸ÇµfžÐ.šNKN_PŸ’ÎèÐb›Ý¬¦¿È9TOÂÀW(´É6J~5ˆ¸žåÆLr#9CrYr¯É+ý”¿uØ®ÿft㥕SÛô\ãe’ÄYÉ£?pÍ5׌í‡6gÑRz¤$²Ôò½e+C¸%è‡=ˆ @#‘3˜Ór|ÐQ“úJ–+´mäæòÏÃ'—•Ì�9ìÅk ú­þPy $Þ!Éž^s’ðÜ>×Ýè@<·9¦Ä\úšôÕüW“°• IrÙÜþW¦ýÈï8}õúI~lÄ»Ú+åžÒ©–ôlX¯qs‚³Ê1ã´�5>ä¥XÜ/1¤K%_ÔK7�2Þž1ú’ÿU›ÑL~ëFýW'¸oM­ZlºÕŠ3ƒ~‚[ï8Þå·’…ßнG‚^‹øm@[ êH$l …ôÛ@l\‘èUÂ÷'`•$HëO˜ŠF}¸&+²sxÂ˶�Y×Z*}‘¾x-aªVp �ú•ö?ìŸîº­kÓµzˆ´IŽœ$àJ’’÷ð2Ò6 !GN´)¥gí4‹„Ô–Ððh0’ƒuH ©´¯(Â�ƒ–ü¼=ÇÅ+I¡%ÒÜí²5|àÃøå«´Ã.~< ¾ –~[•ôI·ì y’^É¥_Ÿjæ>±ñÒÊЖ3“Ìxx¥Ë$ƒÐ$¾LÇ% Òˆ¹H!R ¶-�mÐâV¡ÿ ڜДJ  ã.ÄjIþ�'h®JêÍOˆ#9M \¾m“\AtQ}Ãl­ üÎí¯hž¬æ« }жÿÉØFA+@£$áL™‡½ì#׿V€QO2æþ,'A”$™§MJ(¿�+ž  ¾úSò§Ô0SÓÀ‚Mzä‘ׂ‹}.½®úž¤³D34Y Üùh„o¡Gí�Ǥ©ŒãW;A·›ÒŸ<Ë6ÑKóÞ_È(Ëšƒ­\ˆ^hÎ $óàÌ<0öuÞ +]æçíÊú˜2É,aŒˆETG[öø+«tÀr2îp˜0ÜŽDMIF"( \¹D²+§ ÷¤‚–‘U ¯ãªG¡ÚÐ: ©\oý¡Zø°7ᇋP{¸í¥. *IA¿Ûc��ð[[üiź¶…ÒÊ À:lòì-ÃéI.ð�úyð2T/ªé$ߘėE)ÊAM2S<Àë±g¡HÞ(™�Ž“@žĪâU0 ™1¼¸Ç­Q™TŽÃdE‰ ¼‚ƒä÷Ò*[Jûdg©/lˆvøÍ†ðÇÍ©‹�:ѼÿÖQ­äL+€uçøC^êóå€I’f’ä[Ž “´�djm`ÉAÊzà—¸…ICºú¸`É—=Œ!hJ°‰c¸ËL0ð”t´õö¨€‚JDAãPÜ8£'Î!šm ›Rê³:×gÐý³:Aø„Ë|vrlqy JŽ |° ¾ÿ­ß[Ú˜Û`¾0þÝÚì€e–IžðõŽ€eªŸ¸ù¸k<­¸˜·O¬x£0)ãïà¶Ÿmû›k¯f¾éÁí‘›´3í)ÖÒp† 2�’eäZɤÔô•É«zx¤ ö¤[É6 —ºü V뺾ª&°Z½{g´&ü·>dȼ«3�í¶f­Œf“<å÷ =h:=·D)Ì@x[Ѩ2‰£Ú/®ÎÂ×#8&éØŒ NÁMà³P �iz@Ç­NPrSë2Y\Vm¥£=0ÇK6éX¤È‚NÁЯde+ÉD'ŠÌñRWªP\_‚Ž[[AÉtyÆ+HûzÉ}6¾Vr¦�~¶â ßãWößÿq,�Ö£_;z˜¢v€êxÍ­>~øÃqªþâ˜N]xi¿m{IГMI€è$£øBt´±uRU&E½=Œù!½âñ:’<ÓG²¡Ï! ”LwH“V¯´ Ñ4Ú:tJÔ&´ÔÕ†ÿóÅ|+9ÓÊ`ÚÊ)Àu×]Wðõ�QSìaïê×NnpÀcUð‘‘ÖŠ%Ó@1¨�|pº! xO~'3DQ*EúÀ˜ §–ÑJþ„«)9Ž./’c.#¨©JÚlS¨šÁo¸È,Ê„F6@À§Ó„ ×€åõF/å�'à¯×ËÁåøoC[+9Óô)}`}¾ÐÊÓ7Ü üÑ�~ľZx÷$O °ÌŠÃ;l¤~-xÓM7�ä™f%AÌG?¸ï�Sçnß}ž4$ŽÓÌqê|19%4\2€,ApxÁ�?“OÝhþ4#0®jr_µP"}Ax’Ë Çubw†—õ™MƒìËiàþ'8@Þx¢O¦ùVr¦éŸÙÑ­=€ÿ•¯|ÅuŽZ=üáUÝhß)UÎ=÷ÜQÕ�Ôé!ÛSY*-Þ@XFɈþS¢‘d‰?AÚ� ‚žpÆ"hyéE0¶z×u}ÔŠ^—ŸÓÀë%·1ðÊg¤…ì€Ò#ˆ,á@_ðÚ¤-Ïÿí‘31× ŸâvÀ‚=øÒÚÀÏmüã�ì¢I^2RÀ+ù‘ϨSîb|ÿûß_¢ô¥5ãÈE‰`Žéz¢Ýßਭ¢& ¥›· (9‚´¨'$I-ÒƒQ¢Nh*õöÐEËqhüõË ¥¼ä+6ÊNÁà‘îÁö´éÿüÂŽÆ>ªþ6=xÄ´9àøUûØÇú¯íFñ4Q÷Ä'>Ñ¿´;Löç?ÿùÖ^&8ⲓ"H"¥`$»ßs™œÁ¥AÃ�zéдh@BRª„ïMÈà¾îko✖Œ>©üd¢ v&'L+aXÑ;ÀõÒØJ�šVP~ wðOj_è‹õŽ¢�ƒfÓÞXlµw €B®|ë[ßXøDøJÌx÷ÿ°rÅWßüæ7‡U7HOAš‚E‘q´Ž ÷!"% Sb%PàiI6*‰*IÃëS“¨mè ²h¶•Žà w“tÜX{ÛJ¾‚Ãï Ò"§å¼Ñ>d·ãÿö…Ìše8Æ5RZlpo#Ö�zÆg7ß|óPŽç?ÿù,ÚáCÙ¦VÁË>‡½°„;ÿôOÿ45]‹d]àAàÉE¼) ,ÐýO.¸d¡^UÿsÜ—°Êu„î°‘ÙKÌ`°+|p[Òþ•~6†Ÿ%t{�GA [‚íú¿cÁg•3fI¥éÀ{Үη÷ŽÔKü0ècû˜ÿ@hPÇ‘Œ|¦»�ÂÃ?¯zÕ«ªâ‡AÿøÇ ¾°"Åö�?§íÉR…¿¿o’¼)ajÐSÃh¾“ÝxÎÄ)A‰\$9�â�«ÞYS ð|�Èñࣕ¤ƒ¥äO0Jþ`/õËŽ£ã@oĬ‡‚ãá·à >€:0ÚUBÉ}Îñ¼…ZšˆÿXØFÎT¢ah 49DŸ˜öŒ°}¬H^¿Åz9Â*¿üË¿<ô¨<ˆ©´—¾ô¥C?ûÅçÉ.ºè¢¥ŠžB»ôðO abŸd"RHï0¨£-Ѓ?Ap% 0ǫ䉤ÒÙ[DCÐ*RØ{•ájŸËtIgRç|àØXå‘ò)`¨žÀ£mƒûðÌýNõC´¯�ÜVêb™Üÿ»·ßÇçªÃ·¢™U“{OÛ'¸~ÒŒùã¥rný¡}hà[x¸*ÏDG½§¼†ÑÏ{ÞóŠAû pÎ<óÌ:ïÏmÖÔ6 ~~[&WiýV¡E±ÿm!?S®8-—žãøL–@Ô’(@_Œ¿„†{]‚�'~crѤ¡Ï"ôAë­¡þ°\™ /Î<ÞFm�¶ SÐõ[[AT[-Æÿ[·oºqi©IšÞfÀ¼=ÙÆ€3+R¸-øÁ~°¸óÎ;ûôóAÎßû½ßy{®¯Ñ„ÙÙÙâE/zQñ¾°�›_ú}øÃ.Î>ûì¾ºÖ žpqdOÙ¿³÷à¶×£uðyÄ'IÁëK$¡y”ÂØ“ ¹é_�–œ¦=¥”SK@¯3šŠ0 Ã… ¦KÐmˆÊ`6¼î"Âí@Ÿ§ôžö´§ù‡EIÐÅþ$—+ý\Wàã¤õŸ3ûøìg?[|îsŸ+&y-ß8<å”S ~À…¦Êñ7h¹1S ÖŸs3s‘üvôŸ±_14Ì9»3+J& ª!e‰36a¬�ó$˜·-5Jv ‚ž¤«„4b`�% 0%-5-¡‘ʶ’çí�QíáÉ‹d‘—û°ÿ·ó·¿ãš�}ÐTñ80° €6~ D÷Í[2Ýh?ÒÿÝ.c^L¡cŸõ¬gùóýã~ ¹çŸ~ñíoÛ“ý~á ~ ÂÛx_üâûzRyj{Úi§õ½’ŒçúÑÇ׈‡]ŒTûò�Ãg>ó™ÅüÇ,ª].c"œ©¼ÍÓ4¦�ŽÀ`qôeÚBbøiŸrËÐØªª`ñB¸ê&ÑÀÅ;¬½tKÁ {2‘:{zÓ>qe fÐ }&{˜x¯�¤ŠQ0§�'Þûw<À@’žE½aèôKÓÆãÄŽ­[·^fGÜçOß…�¸qãÆE‰æ‡CÃáWA± Ò„Dô¤³•` ‰‰FVà¥s܉V.Ëè@Ç­‘ ܶe§àqý¤Üˆ äÕØÝh¥}†¸}%¡(®ÛêçÿýÉØ%ÆÐé—6¬f°í‚ .øÁJü2p)ݶػmOÝ—âÓ 6Ý"Ê"ÎÊ#ž7âæ¸ôèÈë2=ÒMv‚=¢Ã€h–©+Ðq[ ¢Šh:n�Ûè¸ËKB]ð2åys ª|]„ÿóŸ»í|’šd½1λ¥Õ·1à„®lµ‡`ÎZš©í¶úy™x¯ÚRr0è¨X�>%ïЀ®ï" æ¸ø”+ÀW}æ2 w{Ìm«7º]“ç|¢ h”ëÈñ¬A’,`Ž«Aî³áwnß|Á?¶xþ�­¦ï{0æ_äÿj†?73 <(EhœâGdæköçÓ‚:·”9-ÇCÊâ×¹ pé²PÁëülç ƒŽóà( E0¶zÖ’-}´—LožµwÙˆ4ZŽ÷Í6.Ýrýçm“Gu0«mmcÀrvç4Øqß¶eVǃðX6¤ü<Íø­fñ�Ì”M)˜Àu¨àWBЕà*‡Õ÷S"A“ä(qÀëò¨ƒ6).¼®¿‡fÒ-ùu(ÝÃü«Ûë*³þÉõßòÇ×�þÆ£é?³æœ›æS/Mß�Á8€s÷ßqÇŸ>ðÀ_•Ë�ÜBâE Ó.<Í·˜Âç¼ì½‹i2o“¿À‚ÔîD‚±²¨ç? �R’�õ£ A{%Šp ¥^Ôj]ç¯j“\ÁåòË.Áº}uùâdŸÚP'\üuùõö9ÿµ÷ßòÏßßrõ]ÆÃ @ëM¦¾m»°µÂ�øõ�½–ŸCì¡�³ìø¾­iï ì�ÿë�±úÌëì<€´m£Î9�º k– Ay‹–ÃzÔùÇÕç²ÀÇñ×ëëí§½]÷§.¿nO�_õ6ÈnÛÕá'nùÚ¥&ƒ7ñ# V�ú ^÷ašÛ8¬Þo/¹Û~ž{ú4…w²–Þ& Ń”þÖyÒç<ΗÍfîáW0É€�Š0`Ž—õ‰2�×»À—‰+qñå6å¶J~æ<9^çÓvÎŽ^Á°aiþßøÀí_²ä¿Îô0…d–ÜÊô¿Úü:€é½Ï~,ó1û…àMÑ••í�Y{ÈÀñ ®žÌs«40؆’O ÇYƒÓàq>[  Ðñ”0id §�¦ü‘TŽ#yZ`tù©…ðT/[JûŒÍi‰½ôÐQ \ÀR�td²JùÎoI¿#΄ðg´ÿöúï-yÙ0)õZ9ò›/mŒlŒp[íœùû±Ìß„Ýz%{ÀÉÅ�ýxú?o9ï:ºÕ–V�þ8Òæ€>zÚO n±Ÿã~Ùž 8—Š®¬PïȺ÷OL goù){�…"[‹[�I˜±Â¤{ˆ=n« :nú ÛsYÃç<9>Œ½æÿ=Û·^õÊ+þú“ÖŒÉqôoíöŸL]‰ œà¸} ë¯ìÄô§++Ñ JÓ/«È�ܤ�ñäG³IÍôä3f ã–D‚å@¢Är¾�ŒI2KÐk´‘|ÓViÓDÆO†�9®zÁËÂ]8d¯uè;¿aÀ¨*aj2Ôå™Q¡Ã �,ü¯ÛÎýó»¶má›Ä«WÿexÛzÙåŒtLy6_yå•רéÀ?Þ•ê�8WåÊS•�$P\‰‹«Rä8ÐËŠ¦ Ñyµ±oÈ:nÌ‚4¤­ ¸d£e+ tÇïÌ‹X¹m.7ì ;‚šëÂV_–á¿Ýöû×ß¿öSß1QýÉrBnÚNY© Ÿlþò—¿üqû©ð�Úq¹ÓRï½42R‘5Áá�žð< ÿµbGÓÝú5tRèC®vrÞ³Å~¯¿É¾‹÷_ì®ÀÒÞ¤aBº²´ Ðç-�çãq@OdE¿º=¨€‡\É!\õuXç·ìŠA€$N‰)˜Ë’ü|Pñ93.¦¤›„9’!™9ÔÅO Æ :N{hˆ ´„ÈÉiâÉaÎޝÖÏ[Þ{ãçÿËyw]v³QVôè�IM¿ã }6kÏÜo�‘½Lãy6 ¯ר«ŸN<ÕÞ  þZ†Õ6=9D£…)$�hàåtÙ$¨U Â/ÞAí©¯DP€Ž»<#$}òBeð¦¶n¤KAPB€,5µÍZÖëÏ»çÒ÷½öò÷ÿ«U‘üºø·"çþØGY vÐW,¼ŽûgöáŽÍö޽§±Ý•f{€Gv¿`!ì�ÿ¦€ –I Â˨¶„ðüH0ǽºgbÀW})Ë÷¼ù‰eM’ 2 ™*Y4ª¼x¥a‚3\(Ðñ\ž±yX¡j¤}’k|Æ›û|ùÖŸžqêÿôÃVCòßc ÓîûË{CÛ/«n°.˜±Oy]i¯ÔÚÃ~‘7õï´ßÅ«[#€O÷Yû?ÍÒŒ@³](Ä;¥bùR]$Ù<¡<[*|”ð³sw·'É Ú ª%¸K�–ŠË6Üõ¥C4ñ ‚7ÞÇ9'^ø‡füà9’ŸÛ~q£Å�•*«eÀv»–™Ë/¿üûv=à>{ÓÎñFÏv¬]™VœxËAéü¾šî—×Ò)€e²šæ” N2ÈG½€�SA� Îxi;m(‚Ãpê]Nç×í¤©ËÁ¶’ŸFöŸôסê㑵Oþ9=“W¯Ïmp÷\W¯þm½ñ³'^øGᆵðÏ}ë¼Eîù›e}eµ¾ l&p… ?¶/÷<Ýv^wa°o÷-ŸðÔ›ð}’ôÌü`~ÎÏiAœèW�ž@–J¤H@~;0ÄQ $hC rá—|Øœ&~ÉJúúÐùÅlp¿s¹®Ä!·×pŸå$îv šòQþÛ}…goºøoŸýÃ?û¨ùI|%ÿŠ^ôÃͼ¬¦@v1-*§FvMàFûmþöþ€íçÃ{Š©ƒÓé�n:ЯòÜšæGÂÛ¶½ˆAÀƒ?Ò¡Gi_’,$QZÆ%Âò÷¶N£&% e±ô;MLÔ'< k+[a%cB¶¦�’¸WVbª YSG‘í“Û†¶½Ø±ù7Ÿû__wåÿ·1r¾_O~â{U”Õ6¤±Ý€r ¸õÖ[ï´Û„çzè¡O°wÿï¿*zn'1âÄ[âã $?ïàÛñUà8úƒs;Ðo $Àµx~ضvÚ #.4ø)J ºhŽ‹æµ¶r ª.ÉËÛ’‡ˆ<©ÁiSA8*Û÷‘«pœŸáÇÛoŽ»yøà’leÈ} Üôîë?÷»ú“3¾m”ú‘E¯øËÌ®¶ÛÔŸx`hÞ>òqŸ})÷+v‡`ÞÞ×÷XÛ‘«Ñö¼o×îw8Ò[ 3ðÇ €m‡F‹S»+k{†”p–‘\‚dJÂq<0ªRu ©A· [%àP½ÆÙ«z &ƒìsÁµÕx~Ž¡/øûã[oú·W_öþ?þ—;¾uµmsÁ�£ý^¿âÛªV¾¬Ö$R'1ø`pÞN¶Ûo~xï½÷ž³ÿþûf_>lå»pm[Yºgçû$C€N |`0" GQÏ>Ç«Z$Œqö Õ”[<@db‡’´Ò1Ã.ÊpûzÛ.�¿ßÿ;·ß{Åûoüßÿõ×®øÀç~¶íŽÛM G~ÝêÓ?byÕ•Õ:ÐQ ,ùL€Á`Ç�wÞyÏ¥—^ú5{VàÚ½÷Þû±vm`£we =ðÔ›òã[íìá›\i¨ŽÅ‹+)]fŽ“2>!e0LJI¬Óó6à„— ¼Â�,ÁØÊ×Û¶ß{öÝ—|ø”ü?ÿýìM—^guJ|’EŸñÏí…¯æ ·›=åÉo�ó(–y{¡Èu¶|Ñf3öéñ‡[m0zWÑÜð+ÿ–¡éã\Ÿ@lÇô?ðú m`ŽO®^Éd©'ää’à?€,NÞ0n{¤wÛ�·ÞüÅ7\õ‘?þ‹þù›v•_ú4å_‘—{ ³w]{`Ïj¨S„0`ñ&ã]láûÝ»k±™À~'žxâ/Ù`ð û6à�FïÊ=ð»=Æ:”éþl±aŒgÿy ¨-¶57k ò{ ‰ž~8V: É�k”˜Â�ƒŠdk0A�hKáWÛ‰åÕì­�G,l¿ç’-?ùü»¯?ó³_¾ëB^gÇQž‡z´p‹�§û8Xáä`G­bµ”µ2¨¿°—Hd à¹Þ2Ì@ Á`WKþÝìÛO±‡ˆžk§Úf ṂŸçAáí=ÖŽëqËo½�p=@§àù)§ J*ëχ6¨°s¨)ƒlÜQç¯ •,ië“_ãïÛ¬é·sù…û¶Ý¾yÇÖ›o~à®+.Þü“üÃÍg_xþ=—ßimu­I‰Ïô>_˜êóf¦ûfk_)÷M_ÍÚ!à §$:ƒIÏÌ@¸ lÛæ;ì°l–pˆ�2lÏd´ýl`ØÝî.°ìšàn6P°¬·EƒŽ]7s8kñäýi¸‰÷R""¬6øö§ñ€Y› ÄGB¸#PµqDG{ µ«ûªÁC�£¤vÞáí=ç½<óó\0­3;Š…ùó¼gÃq‡¡¶¶oŸŸ¿oÛ¶ûìâÜ}Ûæ·>¿eëü¶û¶ÌoÝt˶M7]{ß-7]¸åº›¾|Ç~vËö»IpÝnVÒ“ÜZ4°­£½.Hc—ÛfpM–U ‹èU|Ñ¢*á�õAš®)µHNKy@£®^Ñê<Ýöò{`PÒ‰–Cðú¢ÛÊ‚Jæzòk[>µ‘Ìå{²ÂvÆ€•O@È@ D×  ABI_ߦݰŪ¼P¯’ã¢u°¹P¢Kƒ¶sHÂR€Ð•À@%´€’ô9¯Úymñq /;{ÐÊ?A JzèƒpñQ¯¶uüç©s_W®dÏm‚¦ºpÁA‰-Pñ‰( €@ô©ðø �ÿãñŒŒ!€$ c@Ä$„äö¿¾Uë·÷:ûœÓ§ûöp{Ÿ®Õ½wÕªUU«ªÖ>«ÖÎ>M“%#�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd&G`a29©�ñ<ûÙÏ^¼ì²Ë޶–co¼ñÆc�]^^>Þà‘F;¶½Vß»°°°hõ݆/Ù¶Ë껬\B+[Û~àÀp/Ƨãs„¯mƒßôRmqW|ÞVdjÜ$;©½¦õt·ý×<=ܪngÝg�¯¦�XmxyÁ¿üD³,­Ë†r Ex; A^Åþ€ñ0hrH½àôG67Îh³!tØñZtÁçm—�gÁtº úfayÉ*fHÛÑáò¡cÁÚ¼³ÐúèiÙ�ÓáÍêý! ÄG• {çF ~p·Ì¹°¥Yt…Ë7“mo6’×——o¾iÁêÖéMf™á 7™7›¾l®¿yyùz3ñúÅ…Eƒ®3ë®[^\ø×Åååo¸yù›{vøæõËÇ|cÿÇz£ K˜X)LBY2Í�þè�žba8Ë&˜ÛX>Å’ú­­MÛ‰†c[3„y)¿c å­~Âg ÉlÓ<òeI¡“Ò_@Drîú‹Ùö0Æ^ZJv 91ÑŸpà¤Òï¯Ï?£}Àþ_oá¸ÖÆõj‹Ñ5@[]c´«o>°põîÅå+olŽút.&4;‹6哳³‚°S¼ý¡ú¡]GqÄ–Ü÷Ûv¶%úsì,ãöæ?ÛQ;%ég�g^þƒ��QZ*Ž©`—á‘ôíl•k-FˆšA«/y mÈA[4§Ç Þ.]kN ½Ý—ï/8°M´Î£SpRéˇ߱èqþþ¡§d–|ßþžxk{kßVú¿ÐÜlãtU³|à“æÇ77Í7-ßüÉ£–ö~è´�<ò}[³>ŸàÍ2§¸ÿýïæ®]»îbîÝÙ&™ íƒ~'ù<Ÿ%#àø™O\äI;–]÷$o It’ú’Õ¡@c!Àäáõ‚/.[Ë¢Q¸èN›Ñ•„© W›ՎL]fò[Ö »{%uÂ�”~{P»ý,~»To:Xø�=�YöÎjï, l&ÿÆùÿ)sëo>pà,/üãîïþÛ?�ýé§}§oOÖ‡�ø¤ ß�ôÀ"` ÿTKø÷µím»¥mY2S#ðT[P"©—to‰lÉÎìI“œÝÇ_œíƒwíAsy¸LœÒˇN«wëOÀ]w½Jþ:㟕�OIÕå×È/Yà¤2GþßhCú¡nþ{{háÍçüsï_hž]?1Éý¤ “�Üž&6Ížð„ÝW_}õE6)éß1ã’XK~æw÷KøLžÄIú–¹HãK‹ç¿/ XDWà‹EBȶ _8Xs/ÁöæX‚KàÖ™˜ eᡳn옥žºHVgìëÖ7Ë¿YífqÇE/Ãñÿk÷X^~óu76ÿ½Ÿ~ÜWåBÂaE Ã/¬]°öîn“ß4ü¡¶ 1KFà`"À3ÉŸ¿x zÐã|~´Ín˜ WHa$þÀ$Ó û*DÂM�cú¼÷.�޵ÏHÀ³âÕ_0tÖLñoƒíQì´@óoƒûëÇc•þÛ•€å·/7þäêæ†¿¹×Çžòí¾ž¬oßÄ‘¼}íKËJøÀžaò£m{”‘ÎÊÀd6"\àdž3~¿xoøR›ÚIè–úíž¾?èg‰ž³î¥Ký.ctûc¡ µ€À6 J"Ôg'´Ñ{êcò½„îFÍ¡÷×õAýÒ¿bà«e̳úÃOéèë¦._�”1}N £}ÔÞ™òÛÞÿæÛ¶ø››–üÉ_}ü ovÞ&`˜·uÉÀ6žK/½téºë®ûq{bÿgḬ̀-Çk�×MÓ,’xûd¿j‘ÌIò¤2ê’öÁ=÷ÆÙ?ûþ-€~<”<�”Y µ/?«>+�Î’_kûZýY+ÿší±…#4m²V}³øgøóy»EðŠ»éÆ?øþ+žøµYº²ýÐD Ê¡‰ûн^rÉ%GØWôþOKüÏ4Æ<Û_1ZÙ¸žè€Hòv% Ü¿÷ë%á“THîíBÀ eÁ`m:ë‡/ä#))³t¿½ï×ZõõåûúgéëË÷ùûíkÕß××—ïëŸÅßoïË÷õ÷ùûí}ù>¿½/_ø¯³£á•7ÜôÝ|Ï'¥ÉÄê¯/œõC�\’°OìtÁÿ ÖòÓ¶qÆÏ‹w²d65õ€HúJô±`oÿ €YæÜF‡ÇùÊBaS�n•“K˜Â”S„¯nÁѪ,2(ÿo>Ð,ÿ÷›,ÿÖùŸxÜ?Uƒ6Øèσá¹8ô£¸`_ß»ÅÒÒÒ/Ú%ѧ™9¼R7KF`K" 9 Üö6#Ì/ÑC£p€[œåñŒ·hñ´o2~ûÀj\Öן ®°›q yLrʦ÷7Ƽ*ÂzèÊò³LØ©þÛBàÿµÿüy—?ö£#­Þf…+Û7!¹Ø„ ®R傽™oéÈ#�|¼]ê¶Éœ´J¹dËlXXX- œ³þx§‰_—öWZï uÒ_Ý€~Âì»Át$ž~Ûjê’-9…ÕLõ�`«º4�kìɘVhœ{픾þ¾†õö×Ó¿½ý·+^ySsïìÿØS¾\ÝHÖ79qY¶> öTÿ,ñÿ–u}þÖwŸ=f"Oõo�¾Ë"ÀÏì£^/Hÿö’?[Ä—ÿâ RÝ×½ÍyâªA—<•qáW’rÑ‘jÛ$ö1BO~f»õ1RÔ·:èëažPéË÷Yúúúü½ö^uÌ�1Â,�~{ß¾öôÙÇê}ù>C¿ÿ>¯=ªÿfßø­oþÝ|ÿŸÈo ”e‹"ÀdÙº,Ü÷¾÷=gÏž=¿o—Jï³uÝfO�Éð€½ðÇÏàmêí¾0z q »"·ô€X6èÛ“û[uì„ÖíµŒ±ê”£’¨á#Wú Å»=¦É™æÎ î¶öÿó7/ßüsç~ü?ýUqcÕ£:Óíd˜�íqdO5onì+}‹ö•¾gØYÿ¯™Wù>þ¹Úa;òÔËíE@œÝûž³üX 01Ä×þ"­û·¬�„É{ô5Àxê¿~† nDTz §M¾Ó¦�Yü£íý¯*—w ‚Qþ.ùOë¿?–£òãýÙóí–•¹—½’�"|Z{HuûYü£íêH™ÿÍÿ¾vá_Ÿr×�>ã+¸äŽånÓ" ku›ÖA*nü¬ÿú믧%ÿß¶xdòσb[E€‡ë(|ƒœ9×.Éz] “É%�ð"ᢱ„¡.¹*1k¼(? Ý@%Þ€J‚(¯û ‚F¾,9³…aLÄ!ò8ý†ßÐ"Ht´à {J¿ÿšæ kÞÍ¿ÿv¤üÄ ËÇ|äòó_q)!,Ûš#•«‹€Ž¨Õq'×Z" ‡ü8ëÿUÌÄ¿–è%ï–D@_ô[6ß’´â€=à¿ÀU.ë“ä㯽ào„W ü*‚_A�éu…¦dªD;ÚNRÖY¬s›h¡qeùàÙ¸½úN*²e–}+·÷û[»~Ù±1°oO_ëÚí[›ÿ–›ÿ~íÂ7&¯ô#¿qõ¼°q±¬5-<èA:å·¸ÅÛ-ù?ß2ù×ÑI|E€ËØ%ÑšU,tE@gÓ@&û€LâÔÚÛÞ¼K€8e‹½- „iŒKèÀÐiÀuÛÞH°Öº¦ë™è+t…\èGw½©­ãy$)£þ‡ÏŠÐ=(Ð]õ’ÔÒÿˆ¯ÆœØ _ÝøÛC§9aùØ�\qÁ»¸ *áͲaÈÀ†…Òù'ÿxÀØÁþ£ÜccÕ§¶ŒÀFGÀÙ’™°=±ä¬_I̦ëHÄžàlʰ3þ¼½@ûn·ûb£*E¿'TÕD}±AõÄ€¾HEz,áÄ8@›¼…þÐ îöè’nŸÑ‹}Þd8Ðq¼D¬çkxÏB‰–€®Êê‚Hµˆ¶¥ÿ!âàãhÁŒñ!îðk/D³WN¿ùç¿â §±c 5˺"� €u…oDØN;óš½ÔçmÖròHkV2Û4œñóÇ?…y—3{æbp ã0Øl¬¿˜‰гaç³ZÇ/9©ŽdiT¸ ±ÀÒ�wa$tÀ#èü…&q8w„¶P¦Èf­Uï`p¿üq>“?}ƒwþ”˜Àc˜#î|‚È=¥ÿŠƒœWJ  ÷±.Ðñnü—v-,=÷Š ^õßßzÆoMXm˲È@n@M÷û�´Kþ/3ü£2µd6?<°h×Z™9³·{øŽÛ}}žü§pÏߟ Í&hÿ¦3´á�¾þ'hÍ–=ã,Ü­×Yž’+0 ½‹ ˆ<:RŸ¥žºHVýÍÔg¶D‚�þ[ÓJuVÿ³Û;ŸÂÎôÖøÛÂô“ßm¾óãû?ö¤O”±ÕÁRu⫌@^Xe ¦°1ð”ÿ©–üÿÁðLþS•äm�6·b‘ä[¤a%k{ Ë.³- ”�ÛmaPpAèÂ��w OŽ®+ΤýƒŸÑÄOÄÀ§µ¹TŒ714`$ãÀQ)µ‚u_ê5n·AWêZÿ½Íh-Á½Û ïÚÓÿˆ™-«,HŒš �  F ËÀÀ_ã8ç°…Ãßû‰ þè�Fwöº=ñµE k‹WÍíßÅ_|îa‡ö.k¸CݘxF`°‰˜Ëý$-%Ë»àÏvžD 2Çô7 üñ!Ö+è¤Ý>_; ^WØA«z_zb(¸÷]á´…]E†>(Æãh›Û[ ¸ë,0t„<¾wþ›lk/ h B¨Ÿﺄk¬¸¬QCÜ“rÒ¶¹’ ¸Oº­Oÿ-TU,,6·Øµ¼ço?zÞË�ŒHže�ÈÀVØíplìa¿ïÝ»wï; ¿ÝÁ©I©ŒÀ¡Ž@|Í�kû‘h,Qr�ߎp�¹vgaðpèÓlÐØ<·Yö<°|`d’v6×á̮Ϲ]Ü¥B¸UýQU¿Â£“ñvÙÐÔ¹l@Oè˜HWô‰-±sîr‚â)ÐYƒ¡³5ÐJñ„m8pRÂÆ �îÂé¿Ç€0‹�­á«ÿf×áK»_uùüTSÒF�YV�\¬>Vâôƒí~÷»ß½ìa¿ÿψù³½ŠLÂFÀga›Aãr~$3›“™—=±Å�îG>ìY$ÄDÏ€/û3 ÝØC½‹�íÐGñOTáE·÷m�?ðò+¸ öQÂÎ83/ê¼M]8_‘�®ÏEºþM—÷ïÐúrÛ‚{Â*0üZÈtº›°—q@Û�txk´éö"°£ý_ØÕìzÑåûÿø99¢—e-ÈÀZ¢åO?óÿ?vïÞýÿ˜(O¤fÉ 81g’d”Ôü5¿Fî|™WK‚rVKö.SXàÊ�É;¢�mó„Y ãF4´�½ñÍ-,gÞ£ü´Â0»„ Eb„Ö-X¤°@(üEÖ•€‡:‡àôÕAMþ¸¾•Ò—~k„§’ ½ÑÙ¨?¡ˆßèÜí˜Ä_hòǪ.áBá7 æÝ[üòû_ùû—6—’Ï"(ÊÜψ@.f¨jö�•}ÍïÇìÌÿ/Œ~xÕ–hF`˜à¨&9qöj Ò{Áq*^öcˆ%"Ú�ј=߇PàžèL:N[ƒɺÞÂo8<âœÄïÉÕøÛj};Möôôcž'kGVcÊ‘q£BV¾×ºÕzÁKqÛ _­?Îï]¥ÿwAûfÊ“}ÿý^bᬣ­P'œ�\L L�ì—ýmy�µíêµg5#0Øx·#œÜå ’äUáí½½Ý›�!|fa iWg«Ô)‚àè¥H?�¨)4Å2ÌŠd�¶éìv*¿ ­a×ÓïvA“}æ‹Û'Ÿ0šŠp oÎà¶ŽØ.þô?"¡ø¤ ÿ¥féñŸÜÿŠçZ'y%@ÇÜ ˜ €²f>ñ –ü¿Ï.ûÿ�áyæ?;fÉ1”XÖ'©± ‡qFåIŽ£ÞŠ?ìOÚd|#B÷+Î4ta„¬ÐæŒG÷¤ ^è*®Ó*Óäk�5.Ýtô ;*}†ºn E}K¾¦�#KqÀúh§8ŸánK�꣆ðRW™%O»tÖ¸tÒ½·w;!<°®oÉCW)"ÛÙû�Êÿëã¼â™frí…’»ùX’‰.¹2½Ögý¾z0&å� + ŠŸWxPC'8B„Þ“w FÖøTý¥ËJ@‚ÒPAC‹ÿmÂv»lç°°‚Ë÷‹ºj[�䥦ոÚÑE‘~áN´]-cxís�Oï¿(’½hA”W��ÿ÷4KÏûø/lqRŽ'ÔÈ@�Qœ‡—üœf÷üÿÞð[Ž6g-#0ü(ÇàÉ2IÆ7›4mZÝsžÕK ò&ÿpØ € Ä%™‰Ç#³Ö„?Š�µ¬+%Õ¬n ŒØRøP¿ÖNÕ²EaMªY%žþ—á´‹X{–w¿ì#ç¾ôÁUtKÔÈ@�÷ÏÔ…^x”½äçõ6)žÚ5%–˜¯x7—,«€·WxÄ'è2ªLaè5ëjDØlY»hu_êßµZbŸ¢á°È£ ºi-°Æ§)Lÿ  …Œ˜û¢*ðiñŠ€»R V+’më)ã¿tÄ®Ãÿì}çüÞ÷ÉJ‘Q²xr0~ ”ëY<餓^jÍwgIJF`>"@"S¢2Ä�â÷Úy·Ðì眤GpŠÏD†4%�z’4Xãj÷Îà-¥tåfÔ¸Ú;ýFA &Á Ò œ´¡W<àò_¸�¦·ö¹Æ]ÄËN¾¤ÿØwA�sEóc€°)f†ÖCXã%ºÝ`i0aN°¦½'ì:ê¯ÞpúÿÍ»Z4t­ºDâiÉŒC$ üªŸ‘Þ5%–˜ÃØ,©ƒž¹Ôßï?š»ä© Ü(~öe0¾"¸l·˜„C—&dô‚K¿Ÿ :©œ6 ýS€lÈ †.é�ÆšÖöQä¼ÍìôDãŠmç°è2\²&ü V`£v÷ÙqâPt z?Å×ôߢQÅBñ=$ã¿°°ï¼#ÎúÓK›ý|sK¦ø¸æ.“Žžøÿ!;XŸ7©1i�¹ŠSb) Jhñ›€ÝŒiùÎæt’y̡ഠ(éRIS:kˆ Ðõ<4y“k,lÇ&Ù%è¶Z› ªû¶As»±—ÿÛŽPPŠP`�·íîs§OºÕ/|àÓJú‘Ùêñ·_¬üá_ÝÿÌçXï\ñ®‡wÚPízÞè†ÚŒ{ßûÞ§Úÿù]ÿ..‰Íy”`å&I¬Nèš1á#Å�ð“œKÚƒ�Òò¼M�Öà R bZéË[¶š'íÒZ’pHôö½ ë}¹}]bvZ ¬ ñ {à—¹ð€‹5à*}û% t.cq¶(è˧ÿ7þ»–~áŸ÷ÿÑ�Y¨f ÛŽ†¹ˆáç X8묳vqį5ü¤}T¤ó;*íYñ¯=‘Ù'ÄŸ 0�Q“ø]vŠœeÇh–ä)ÈÎõ>’„‹l�`CÙô½l‘}þ¡.‹pŠ ãe1!þšÞ/}ý´‹ÖçõzúaÙã¿pÄÂîÿöî³~kŸ¥+aßÞç ææ…ÅsÎ9çö�¾Û>Òõ%Är®ÉÝbÐÑ# Èáþ‰;’w\bçvAŸ)%G ›ËòÝ"y笒3º&•ºÏ/}P€“ú£Mr5î¶ôd¤£†ðI¯ôº¾Ê‡ôÿÐ�¿§·¸åa·|ùþfÿ’��†™¡Ú±%1ô _|ñy‹‹‹ÏÞ±GB:¾##@RçA>¼MçN·§1cÚœYðH}å’¸IÓ&ÀwÅ«ØÕ2àÌЂ�wýu‹‘°½–UWÈP€#�¯^€ò»ÀZw0�ú<ÉñMƒµ xØ|ðö×6¦ÿŒÏr³kañ^qþSŸháÕU…iÚ°Ì5}§/ü…}ûöí>üðÃÿØð|Íï\îé\?$nžüWúù€Ñý¯œÉÂÙ,:{Ï HK´ÑJp®>Öé.ÚÅ;M>úŒ¾Ã2áÑO�4ǵoØÒÑ�<µÁùä+q¨ðà÷}²¡öEüã´ÈÒðJú? bB‰‘ #(<ø{ ¢*X˱xØ}Û¹¿q†«¤a—�¼Ðçliÿþýϲø]vðq�®ïÐh‚Ôä:éž»½8fX�Q¤6?ï6”š~,ȯ�Å€ô ºh»@Š�"µz/Y`�‹§¦�£IPZ‘éó×4ð~™Å_Ö¶8°¾mó¾ ¬e;½²XãG�Õ:j\<5 �‚“´÷ùÑ#x¿¨ Xãâ®ÿ Gžºëä?Ê[qDã¹Ó  ïu¯{�o—þÿóNs>ýÍ% ýèÏ‚½ñG‹EÈÏ”J*pžr‰Ü Öî× N}& (ô^…«Ÿ>ì'ÚEs¼´ú q A‹ �Å'‚tP”V($‘�K1ºÿŸ üÂ�5NÛ¤"_�5.ÞZ‡ãðÑÈÎ6|”ß‚â Á"‹+ÞV`�{#»û¿»Y¼ç_\ð´'™Þ¸' Ý9e§^Ѐ/yä‘/²á>lç yzš�À¿ìcÿËö´Ÿ/|:Œâ_ ô:)^³>:œX(>ÊSõ,ítë|FJFÐ¥ÔÐ6o+P|‚“øc‘Bwñ�ÓœÙv=ýî4ì,v ªATôÅkøXIÿ#$«Œo?Àû ÿ½Ë‡ýÚkoûl¾ñ¥‘²y'ìÄ@9üšE{áσìÒÿÍû §�•"Ð^ö·ÉÕïu“Ù<»ÙGÅ`{Fo? è ²ÿL ñÎÊ î:‚¨FçèO讋>ËL# ºÖảƒ©üÑK·ïÉ{ƒhW‡¹ÏV»Ý®ÊœvUÖ¸78ÁôÒË,ýÎ^ ÚVÛ 8 ¢~¬ôä½]´1f#̲¯²!ì1§7 Í7úW™¥ßøFü‘lÑ·ÑþÛU•£ïx‹S~źݱWvâ€ÃqáV·ºÕž]»výW*Y2;7–Ôm&Ô™-‹�zvºMÀ>wÛN ¿b€4ž!þûÀ@#°Q£6²¯/k×xË$ÙUêk“MIÞ7x+oˆël ¥±íq ÇÂAé”A :^ÁQÍ^«}®ñ–µÖQã-CY«½..Å=]TתÏUÙ(µ‚“Ôýø~¨ü?|qÏzÛ9Ï=ÏÌÛ‘‹€�¶à�c[¼Ó�îô›Ìn?á¸LRF`E faOìxmU-¢ê„vBo¯ŒDl± h› QÔ,܉Æ]’°ÆKó¨“D�·ŒJ6ÀozyÕvSìѱ}Þ�ú°ŠÐ)úkŸk¼5·‡Ô>×xËVÛXã-CÏ ¯ÚnŠ};Ãÿf—=ø›"½ �ÖN@vÒ@‡ù¢ýÌïñöºß_Ú œ>fVŠ€çJÂà쿾 &Ž �ÓÂWU¶éxhmÉ4‹E�vu¬qÚ&”:I‚c‡àÄ„8AÇI¶k|„©«Ô}ÔxÇÑÃj�5.¶ÚçW{¦ÿâ q\Õxôâ©1·×ßÿ=·á½­yÇ]ØI †Ÿ�Ùâ 'œð‹O€�%#°£#@e&, ¼NèƦ˜t#‹i¦¨Å�ô¸\ÑÉä|P4JêRôy†ûÕˆueB±ºOÙPðƲ¹»ÉÅ}µ¦Iþ·~ËFãë÷�VÑÀ×\¤»Ø›þÇqK4î‚ÄV±®Ç¼Æëñ?þ°cžwjsª~1pÍC3T��²ÐG|ñnw»Û‰KKKOꀥÝ��ŒÉÌÏø#·[v+uëDù„3}M˜šD�×è<ÐN¼Òcìc “¥…·³³Mx©ú„mx«Ÿ.[#BÄö!‡ �‚b„�¶Áû››�6gfEª€“6äœgŠ|¿: Z¸¤K}Ñê4ŠóN£ a+ü}¿U÷®áÑfhÛ‡¡Rœ´Áëô®á±m×òâþê¼_øQ«í¨«;e`ãêóÙâ1ÇóÃ÷BÈ’ÈÄCóæ¢ez›¦=,eþô‰ÔqÛÕ“ê‚}€ß°@y›`ÌÉŠ©tc³¥†ã@C-¼Ö N“ Ø]–�4ùf»‚@/0j£{µk\\}{¨×2+ÚWÙ}¤ÿ]"8ÛiüOX<ògmìy@‹ s w€#�mñÜsÏ=ÊîýçÙÿÜÎéØº"`ŸÎä5I£Ëqƒ$:>E~µ Ð—íÌŸvžþç7(8Þß© Ȇ¬ ë1AdgñKè[‘Á6×_ ô y¬¨ Xãb¬iàýþáƒ6­¨Ím5¾ZG­[ò³øi—×i‚-4ÜÛ œ¤_ýÖ<5>­½ß?|Цµ¹�•íô5©¿Yü´#'}tí8Ð6o+p’~k)»/üß·ÿ�‹Œ¨¼hÚç»pÏc'rñ´ÓN{ŒÁ¼÷¿F<}\U4IúdŠ„b�³zp.ÿûLè³*—q¹Jô@⫃ð Ïy w�VªÔ¸h‚ýIz’¼x'BõS`¯Ú& õ3K?|â¡?á@J¿=¨Ý¾ÏO‹d;®“]‚“ä;î XÏá^uÌÞYúûþõùûí}‹úü´C›Vä·à$ùi²N—î{ÕUùÒ®£ŸiºÞm‹Þ‚-5†Î_ÑJgþ< �˜‹ØoyË[î±³ÿ§Î«£éWFà`"à“,‚z±Ï„ùŽÐ?Hef°éj:4± N²E{'/=!/=‚èXI_¿�¾~õ#ˆ.pé®vô�O+j_r+Ù;K^v ÎÒ×·³¯_v öí….Z-Û׫zÍSË®ÖÞYòÒ#x(üß³´ûþo<ëÙç[ßÊ�+ŠÌp¡œ®³-gùÞÿOØý¦Óf³'GF`çD �”Iñü›'~ƒ Üë'ákr Ô�Á‡œ Vx«¯Ð¤Ãû(4ñÔ�Q ~°…~(Óú£­Ö/\6 .ù>T›øÓÿ¹ÿ…3?åvh�ÙÖqšô6/ó¾`ððqé°ÃË{ÿÛü`Ló¶>$5îß),Óë>?u=I.æBð¸bÏ ÀƒLQá°ÆÑ³š"€lý[ÓjÞiºÝNk ÛGuª�¢Gz'éìëƒG4ðÚç§m5E}Ë&tƒO³�’™¤_¶M“W?‚kÕ¿úpYvVð}Èþ¶°û¡Ï=íQÇ™Ê�qàãÜœ98gn¹;>M¶x÷»ßý ;[¹ë<:™>eÖ>$œÁ“Я¾ ò Ÿñy¢‡hÅ~y€Â"5àJ8ÎWø]hÆNÉdš|¿]|‚êÈF—)@ßl×BèÖ¸ô×4péVð�OãGf¥¢¾§É÷ÛÅ'¨¾e}�«È5 o¶k!ôk\úk¸t«?øÀ§ñ#³RQßÓäûíâTß²‡¾ÀUäÐ7ÛµºÓû‘#ïr©UÉ�óœ#çÚ9[ðè£�~$ck[–Œ@F Š€æG?ë·ŠŸ"8|¶ó¯úIÆ’~�Iø.e û¹ Ãã[ñ�M¼‚_ Š8ió~ݨÐÒçgò†æ“xù´ƒ«HXãj!ƒë/°îKüøLñ8}œÄ/¹i°–ïoȉ§ÆÅ‡9àÀbZ �Ÿ�cqÕ‰j,ýÃ(ýÞ„p)óìÿÑ‹G<ÜÜÔë�èl9?'p^¿ ÁbõfïýYúÉ9¯m寱ÇÛœzê©Í‰'žØØÛûiåfÏž=Íu×]×\{íµÍ?ÿó?7W_}õ¶²¹oÌÉ'ŸÜÜö¶·mŽ;î8÷áˆ#Žhþýßÿ½ùÚ×¾Ö|üãßöö÷ýYk]‰Â/õ[Åïç—¹Î?D¶9ò‡Iü´ò�ô¢åˆ^]Ý;°Eúk|mZ;ôºŒÈ–}ةָ’!ÐÛ¬Q´ ŒÚ× %Ò%(’í§Qù?bc%,º`_Ÿè‚]?V·Iµ ëëX[_Óÿ ±[íøïjvÝõOOÿ…³ýÙç]nÒsûm€y]0â~ùæ^÷º×E‹‹‹û d9ø�ØÏ:ë¬æœsÎiÎ>ûìæôÓOoìÊÊŠ õ¨Gy}éK_Ú|ýë__‘w+í!Í]ïz×ÆÞ ÙìÛ·oÅ®¯¼òÊæoÿöo›|à+ò ½‘·ùùi§ûËöÉ!Áëd�+K6y: ¢2WÀ�F›p~*Øë3‚¢Éx¥U«X¿lÃÌ‚ ¢«ÆÝÁb¿÷#¼ÈÍìO±RzòAœ¾Ÿ©¿'º*þb;¢òU°¦¹êöÏìo†¼÷±Ân¦þžìªø7Ðÿ ¿Ý#Ì„çØ¦€FºgÙp«U¸†ëDÏr|bãòÍž<à/±+�îñduF¸¼·oß¾æw¸CsÁ4·¿ýíûå ©ÉÍßúÖ·šç=ïy ÉôP–“N:©yèCêÉ_—/WkÏ;ßùÎæå/ysóÍ7¯Vd|OÿäEña±Ëø|l–¸œo{»àWÀ�jm¾ª¶�–NƒÒá&㻆_Ò·pà*JŸ½¯n*VdÓŸþ¯güo^>ð¹ ?úsw¸¶¹ö‹ûM¶áUöŠ#µm9ç­àóÔ.;C=òž÷¼ç¿~̼9¹þØ7%<áÿ‡ÿðûÚdÃ%þ�*_ùÊWš_üÅ_ln¸�ÏÒÖ»Ô<èAj~üÇü 1XüÿðÍüÁl­ñ›ÜÛÓ/¿(.ûÛ§Æ“¹%{-<í}ÉS=ÉÝÚ î· üª�h&¸�àf�%$£Šæ |Tk‚p`ÕTªfÚŠìcí®¤ÚõÔÏä¯D'¢³ôÍj3 'ЫÎbkï=K_ŸV}–¾Yíc÷zÕYìcí}ûgéëó[ýŠï|þ‡ïwÅ~—¡,Xý£enÊ<Þ`š`[ü¾ïû¾»Ìä¿ÂázÔQGy²¿ó�ïìÉŸKý›Q8û~ô£ígÑ›¡šNžMxúÓŸÞœyæ™ÓXVM·o“4úЇš÷¼ç=«–ÙöŒ|R¬ø%û2Aú ~øñ¯ËüÁf³_uy¿<àŸ6o÷' \›W‹î®½kòöv.­çÔ ïÉcc}{A8°-’i ¢6Ašj¼øßšE›h•𕬠“ðI4W"»!V¸ä Lÿ·~üoµxÂ�Ø ð�'ùkDªA2ê€Ë¼-4@~¥ÒÎhï;à±Ù4Ó¹wO¿Ë]îÒœwÞy<%¹i}ÕŠð°yÃÞÐp5`+ ¾=íiO›ù¬ÂZlá*Â<-ô�!äúú!@�‹Ñ˜íâÒp³½^ŒÜZAFM—ÂCØze¿–‚¡ŽI”¾¸÷«>a.�"×Ñ%SúâcýµŠ Ògè+X#¿ü u鿆«î�ÿ#víùa¦_³�C]ÏôGn°õy[0l<ý1„,�'A%ýóÏ?¿á²øVú¼ä’KšW¼â›Þ5ù=ùÉOnvíÚØCü”SNins›Û4_üâ7݇­ê Š�_Ú ©}„øY…{üÐØžgÀƒ§ƒ~¡g0‹´iQ Vj#Ô(šÕÕ�àdJ×*;½o[0„Çt cCf´&:¨…Ž âé?A(1Æø/Üçèïùág±y•Y�Ųº81l0o ǯVڽ߼üoÁ8ýôÓýÞþ¬Ãô›ßüfsÍ5×4<±ÿÝï~×–»Å-ná÷Îy8p£ ÏسÍ»Þõ®�R9¢ç>÷¹Ï¦&:㹉y*|h(ÌËK:k·yNÉz$± qIšÞ°dµø~@›Ë­µ›)¥ß§N5Dgç@Š¥ raƒ7¿Ó¢®ÅÁÁ&èÐßÙìöTúe‡`g…ú/>Du‚}£íé T9 †2þÇ.u±Yþ§¶é6€�âÐpÁ<-mKö•5îÝìøòÑ�~t,7Þxcó™Ï|¦¹âŠ+|û—ùOücŒFàù~{Ä#±a÷Òùþýf,xÆà±�}ì¦�ù+>ßùÎw„ÎôYÍ®¡×ÏèÅdÍìçÉÖ*‘¸ùžÅÞþgéO·�™Tú Öû3Fñ÷Û©SÇùãþ÷ôÝ-bBOœÍ�ò{¾“‚}{ÆûÛe_ôÑéëckÕ'½‚ãý§ÿEhtú DÆ]´þØP׸ j¼ö.íù¡S›£w}¡ùÖw+¶I*G›§Ág옓¸ÿg;½\uÕUþV¾/}éKÍ'>ñ 1ÉŸ³üÕ¾÷Îwà?ýéO7ÏyÎsüm«‘[‰‡w ðÆ=Þ¸Q…¯.þÔOýÔ¦'ìýêW¿ºQfo =šèܘrvÏd©„‰_‰8¦Qd"ù#+·øêBü\°%áö&½t 3^\ÎxW’—šNQ¢„sÙ:}ÔÚð¥Ž�pñ÷ÛcUd­¬Ž�-¾¤ÿŠØ0ÇßÞzqìožùÄóõ™ç_fÃê‡8Ã˽ÌÓ@³hÉà4›DNúàl„ýL>< _OB£—Û¼çÏà—2×W¸ªÀ3 ïÿû×§¨Hó?¾ê‡ÞÍ.\=a14OÅ®²Ùǘé|`ßóç‰;øÙ8¦øî?í>Z}™äg°-®³¯X& Ó;#¯ z+¼Õ9‘ ÀI«ÄC»|pÿ­N_¢ÑÞ/ÎWxhëó/X›÷QÛ\áéÿŒ+2Š•`‰q¦Õ5¶›1þûv�Ä å‡m“zu7ÍœAлEü Ì�jd=(‹Çü÷OåÜ� k™DW  ›«QXlDá{þÏzÖ³ü7¦éÃ~›`#Þâ÷Žw¼cÕWO¦Ù³�èþÁaÂ-9›º6%LìåûO–¹Ð‰Ï“Ÿq¹R€Œø�Çê5-p>|ñ'8i3²Ó�^Ê™µeik@Š`ÔFöØA™f�úÝÿ—-}ðÕu‹¬ 2}þšxú¯8IáÀIc½-ëC0þGí:ò{Íò¥¯…[›ŽÌÛ »ÿÿ}—mkþÿøÿ£ùÙŸýÙuÛÇë…×[x8‘äÌ1“ßõÄ[_÷º×5ï}ï{ý^eÌoØïCø;Öú­�|ýë_¿^³·•¡ˆro/ÐÛm'é¤]m­¾ŠF{¿ŒñW}Ò¿û\ ¸óˆ.ú–醦"\PtAÉ)é7æ[=þ6‹·ÙsÜÛ_wíÿþœ ¯æ®ØàË<\Ðç¸xÇ;Þñ\ƒ{?2ÛØžàe;ë-ü ?°³Ö› ö°‡M{÷»ßݼìe/[õý~®@¼ò•¯l^ûÚ×6vì4§Ÿ?sÌÃ~_ûÚךøÃÍç>Çg~>‹xÈ,öÏ jÿ+€xÍ"À‹g"ÛÙ™¿'?{&€Öe› I÷¨A :Ä´¨ W3ÙQ´àÝGå,˜¦IgÄè�˜)«Ï¸ãìŸ+n¸ó�Mã÷`PÅ�ê–_}…:k0|Á^¤¬À^Ø„Okw™j—þÇXxˆË!ÿ“w�Àm€wÚÆG¢Y« ´ÌÀÐ3>({÷î½ý@Çb0fò“ŸlH�«¹t¾’SgŸ}öJÍÛø…§>õ©ßjÈ퉗¾ô¥ W)ÖZ¸Äÿ¾÷½Ï·µÊšß§12T$u’岟é“8!Ûwü úÍOÃæì6!›0ò^5$Ô× J´¶@+LŽ_\1U]+ E¸@o3¼P½‡•øÝ·¥`Ýp zݤ¢‘Ìì4— ?Üçhï5w®ñÖ0Õ餯{ã q’GnЉDïÈᩱÀ‘ÊYü®Çø[}†¤ÿU€‰«±D´7Àý䋇1a)ù·a5Ú`K»¸¬a8ƒÁÆýÿ³î˶7Ÿ{é\_o¹ímo»¦Eg¼ßŸ3ê—+¯¼²yñ‹_|PÉ¿¯kGÕmîSJÑ„ç‰G‰Ã f<¦É˜õÊBÀ×Á ‚Sm¡áõ„[éw6 ‘�«eÑU–"Ÿ` A£É }SÜÃÝ�ËœßfSø°Op’}ÖIhdX!šús6Û9´öô?bA&Å·„ª�—DZÄÕp¨ã ðP×ò{;»Rúã±Îñß³°ëLÓÌÇA 7CÝ âÈÐ ƒÐn¹Øšáäþùz‹�U³oß¾U«yðƒÜLúö—ñŸÿüç7óú†¾Uè ý«�ò!"‘+ÍAˆÄnЭ�IU“7üŽÓH%€':Ÿä¡1Ù×m…0k‚neÑa[±Á¡ãè°Mú…¯d�§‚ÃC¿p'ºh«Ñ'Ý@ßL¸…Ei1Ãké…8øqeUAâÔÆ®Ä³ÇᇯlÂ�Ž[ƒ º(‚à´QÄ/܉….šñìiv�aÕ¹Iþ¸6 ü 0Œ‹–TX¥eÙäð”ýF^ⳚÂóüo¿ÜtÓMþÀß¼=�ß÷ssëþÑ)]t—¤™X}1PM°$ünÂ,¸Œ³EÄH»OìÖ¨ Þ'ZÛ94ºtk\íè/E `�«}íPʧtˆß l‚µ¨‘½Ô4Wi»Ö¸qC¯}®q— •Î×¢4 šþŠñ_Z\<ù’cîÂ�Ô‹€™áíæeÀ à‹=´púð†axá _hþíßþm݆Ÿ~úìá²ç:š§<å)ïûÿùŸÿù\>�¿îÀ®R�Ï^%ë–~\( ŒA9¯ûÁ% øv€_%€Ýã Aàžà.ú]‘ã¥]g{Z xG¥CpŠ (²ú•“T¿‚­\%ïÂõ®èkí#ЀlAG£Þw¸ó±S_@ßl×Â/íéÄg@ãÿãÇÿ·˜üêȰÚ@ËЇç�wÞI6Œß èàlg³™xyp½åôÓOŸ©â1�yŒo¿ÏÈ ~Þò–·ôÉY_Kì“ã?Qk�ÄHæžhI\|ª zž2œ7B£Ýy ͯA—)P4 ã4£¬-tBÖ¸Ch«/ð6_˜nÛ{j›ÔÖ<Þ&ЗÌ^ú¯}®q—)<5î¾]ýšæôàãÊîãæêAÀ¡/øLQøø-Úâû¨dÙšlÄ€­ôsÃw½ë]›{ÜãcñãFü6A–õEÀs§þUòk+>YVü¬×&ïzæ�„æo´$Ü&Î’@ýÊ€“}Yázœæ˜íà£~ï×ð6a\ítî]�cv�n§p mž¤ ÷?Ag€ †b¾‚mÃWÁÖo¨Ä¡ò¿•—ž¥»ôlJKŽy%°Â_ë¬qéw_�踙'ˆ�­íêßá1 Øø„Ùÿ‚�èHÿé±ñ?zéÈÛ•Hq¶A—yXh ìki·ôh Ìø�x€‰nß¾}=?î¸ãšÇ=îqcm|Í�·üñªß,ëŒ@™øm<™ð~’„'‡Z$޲ÑèAÇ{üÞì4x;Ûñ��"XjŠEÑ–þ+^u =¶CAB¶ÇiÑ(ÚÊ } ¨û`Ø€ÕY–-Š¿®÷©O}jݽMz­ð½ï}ïæ{¾ç{Ætó}ÿ¿þë¿£'ahY,κãí~6 ÛŸfº~ódyxÀ™lÇ¿Íâl®­@pŠ`ÔF÷³p(G¦Xð É;4h[?�5h V”¬•�ðÕq ý¡^ÐqÓ)è²Vt3È^ü§ÿs;þ‡/î:É‹ú ‡Ò`Ë<,øLú–W¶þ8܈çöíÛ7b8?ÔóÈG>r„F…ñ¦¿�øYß1å;•àI“¬e§+\(ïþ§(Á‘ý�‰ciö1w|�ÿÒÂ"W™9šú[ôa�yx°Â~‡ÄgX#0pk¯¸âŠu{pÊ)§øƒ€ÜN`BxžÐ~øáczÿæoþæ éAxð§ÿuLÏ€´ qü—OÜÛì]º¾¹žƒEî ² ù @=ŽÛ7ŸØâÃ�[óîýÚL&Ü}ûö9é>÷¹O³ÿþºÙq~5ðïþîïÆèIX_Èm$±HY\ø·$æ* Åð'f:¥yo7A8ÀÚTâ"±pPÎt•¡8„·� !ÁÛÉÓ xØFBöÍÛÃïmGñì’vx�$›éò]Š3ôàÙaEö¸îŠÒ·Ÿ¦ 9ÓF[hìËC…­àéÄäÐ�¿M»v«{ßZ7ª äàÊ� ¶>–GŽ1áÖD€³ö«®ºjÝ�±8ᄚ‡?üácº˜øøÊ_^ú ͺ ž=Å�\ôbÔ*qòó¿^µTh<àTA,9‘Ÿú®ÓùBG›Â<—†œ JAh �†£Ûõ«:´Òõ8]x_@Ûú *´híl‘}}yø Mã÷–`p®ÐýzßÖ&¶v}ºÎô?bë !4Äc„óí?þûwŸr‚?¹³ú-}�¼0_Äçj‹ Ïœ~úéëê•ït§;M¼ôÿ¶·½­ùÌg>³.ý)<9äÇH¢|„â Xªe5 É}Á Ð�géÜà�gB†„g¿H÷?éóY¾Pã}›Ô0lãl/øÐ 6z¤à‡ü -X¦éç—pVÿôGŒW!Š=m<‹Î]ãN¨vj 8«ÿô? [=þ'ìºÅ1eÐ8ÊQP ã€ÐyXÅø sÌ1‡YÜÙ²lq6âA@^øs‡;ÜaÌr~èç/þâ/ÆèIؘDò"i‘þ™ÍâíJl<ÓœqøýïH¬Ü0@Jê¼2-A*S,ª@IDATÇ‹B9[MóJoWó~XÚ%wT…:ôºVÛÅ"EP Añ ÂEP:_×§l¨aøj<å/,©õžþ{üo±´—ƒ©ÁŒCh@û¹Yœxâ‰Z• (üóaêF<¸k×ä‹Q¯~õ«ó…?›~˜�´˜Íâì5Î?»z ¬¼=Ã"®X!©òN’!xAϤârÖà2E¯hÁ¯Î¼ƒèG}¬‚¿NÚJô‚1w£$ìÆê�h„-Ù%ˆ}Â��‡ÿ¡«èzá/ãòÒ#ÞZG§»ëoeþôŸ8Æ¢Mã.8:ÖÄ™MÇÂÊã¿wñ0-è`ÐeÈ €¥ÿ‘Gyì GbÀÆóK|_þò—7܃Ë.»¬ùà?¸ázSa?‘h8—'ÉÇd'¸®øI³ñ�„4™:lŸÈ§•iÅ+ˆ\ôÓ×�üˆ.—E~t«yj¼ã£õ[ãÒãX°¶^JMëüŸf_mC�O·gmú;=aÝG�w|ø�þ…(ŠÅÆŽµ�bu888䀂í£lï“Ï+ŠÈ!€q 6›ŸùýÓ?ýÓš”øfDÀsÒ¢§>>HTc@g$ú Dba�À”Q’£5ù¢�³Ãýƒ»kq¤àÐÆ‹úŽ~Y�|C‡ôÖ¸ø$ ¬ñÒ;à*ÂÕ}ì^XÒ1H`pp}a÷îݹ8„‡ßF/Þô¦75üàO–MŽ@™Â”Œè�¤…Dõ ÅåýÒZ¾ïs¦±{d&mÈA�¢~€5®ö>”�‘.C�hÒØÁ°Wv;]]Ë4ˆ¢…`o_ë¨ñÂ&ÙVŸ!N¡‘sWPû\ãEû�¯éD€)&¬zŒj¼„R¡×°„‚Ò8 Ô::|Ïâ.6¯µMm>œö ½ƒˆøœ¹‘ ü{ýë_?§‘Ú^nÅ,Æä)(æFÍma«¦>î£(yÜOÉ £ †Ð«¥Á¨¶Ð´èµÃëïÕ�?úT"ìËN®Ë3Ù —hãÒ ¬ñŽS²Òׇ}ýŠsú¿š|ÊXGíø/-,‘kúƒ¦Át‡²ú  z.í!wÍ5×4ßúÖ·6Ĉ׾öµò#Cb̼+i?A‘Ò"eÅD+×ÅrÀŸú�¥BLÆJþÈj*·Í�q£Úa�Ko—l•(ií»ã�…õH¿]ò�trJât³§…n›Õ Œù<¸ÙO*ÒÝõ×ù?I¾ö¹Æ;Ýò5ýïÆ]1é¢$Œ±£”QlÝxı9�Ÿ1ð?à:ÆßdÇ_SªNõ©˜Ù#ærT°å€‘°l}e#®\~ùåÍ{Þóž­7~‡ö¨'Ñë ˜I’¢¤EudòŒiÔ8â,îîÖ@7�ëûÙÀG÷¤¢þ¼/Ÿ +L`<w´IúúünZZ{d×äÜ·§M=ÿ±"6¬Hÿ5õ˜×¸Úû°oÚEï�gMï—>ÿF�ÿ®fä @|Xú�¤>ô€‚¿`WæfU6�cgÌÌ�ø: W²lm<±YR#uÕ—ô»IÛ&_’&¾b+y饾=àÛiòúFâo¨ñØŸJ×_ôC´iükÕ¯~Õ÷4ý}{äx?ûÄZíë÷—þoÏñ·#–\Ó¸: 'ùzû;Bð5ŽÛ‡-¯âqÛˆ+öB§CìÅNì>’ø‚½Ñ�$D2÷_þ3²'ìhö\—4#Núr{À–-ÄcÊ‚©@j<7X¨cü$Vé@�z é+xœ\±8 Š3´(¶û¢\M®DÛYýxÂfÁ1…?úï&Ù";鏯Óÿ2Òs6þK�çÏ;å`ÓÇ =ö†‚ ý @ç¼Іâ�!W^yesã�7®«ÿ“O>y]ò)¼¶(©ùTí5W삾ý�'c¢ý‘öÊtî¼›õ౺ŸÝHò-4`-kÕRjªo@%aA(‰Ù:¢“Ð!(•T¢zò·6A¤Ý¾ÝFø Oð•„y |¿jY÷ÝäÒÿr¤Ø˜ �Q�àÁÑÔጿ-ŽõÆY }¸3ÀýÜ,,ö”Ã|˜Ì�õ|úÓŸ^—3·ºÕ­š¥¥¥uéHáÕG@“t+QòjÔcº&-2�ûU�2Q3Áû;ÿWœà[­Ž(™{¢œ� $'è:z ĈE[„Né°¯?ý߬ñoíÐ ú@+0;ö†z;c¨ÇÎD»×{€ä›ÛÜf¢î$n|,‘e,-Z± —è•8È3J*à\ðÜC¢²�[‚È„ž€Ž£Ýèµ ^AÇM§ ý;Ÿ ²wÄ+sæ ƒé÷´ÍÏç ôE 6ØŸì‘mÀW;ÚÜ^ƒàØÚBÃñ9ì÷ˆ…އ‰ú�)q�ß‚éÿpÆßÆv7‡†mƒ/C_´`¬O‹æ¸UôP8eù?ø¥ûÍ?«[û²­˜zrµŠã씟øõb�º}½Æ!ÉŠ” �âв‰Ž‰ÛŸ°&pXœÍv‚�¸ âQ”\�.ç Œ5ú†Iý9RþaÇ ç4™è;`�L¼otº’€“äáóþ Öø4{¼Ó Œ¾ÓÅ�F ‚{¤2Ðñ·u/¹¦8ÔBwoh»yJšó°˜Úñ3fï 7ÜÐ|îsŸköíÛ7Ö¶Z™gž¹ZÖä[gHà Uòõ:S9ÙÓ;_õãk~0Ú¾0X,ðdz>Úo,Ø/@Ÿÿ…–mѤ�d@h%’G$p'±EIÄ≦X�@£¸ÙÞ·W[šjp9O!à·ÓмøÇø{ý‡Õ¡ÙÖÙ“þG Ù—RÇz ãß,.ÎÍÕæ!'M}þ8²Àçi1S>-Ãë½ pÚi§5Ó~x˜Ù¾Vû‡ˆÄf&údͤì'Û—O˜~ Ð9ü{|$xž- H¢b,аŸQ÷…·gÔ&ë4’8|º¦£…“ôI¯A—-ün¸ážˆ ôäì꣟Iü®®ô.è¸ÛëJÜNl­7ùÒúç:¼'Ô…¯Ö¼ÒáœéŒ¹â$XÃãf4Š" tÜx°ÍÿÅåeê¾6|PeÈ €~ sÐ�È!ª¯w`?ìÔ°Ȳ`SÒѤI·Ž<ÀÊÀ¶xO@Ðh÷éÖ Åq¢•vA§MÚ·«öÅSªÓPYìj¡éö ½À˜Üé Ã&ó»iÖtÜv‚ޏ¬5k¼@‚OÍÂ]ÖE»í£¸€¡­@ÁKs¸¯°”-ý�XLÏí2þ¶ÑŽ<•mÛá/ºÞÞ AÙöAŸw×» >g�uÖ¼‡iÛøªÉ[œóqŠ„è,£1I8ÕÛÃì6ñRµFŒÄ0‰’DG ‰:Pº ô¾JïÆJ=É^t9�á¥ÕyœVQB£(ÑÚê¡yet‡]”©öu�¯¯Þí´–bïD/mSõ‡o­½ðâCÑçÝ^¨Þæ´Š²n]È:ÚIŒ¶‹¯Àô?1u|½ùÉ5C_´G°MHy �Æ¡ExÐz_töÙgZ'vJïž“ìë|æ¯ç&϶+ÐÖ°L£qyr· ’Z¬ ·{ÿà¬\Q™@•èZè*`4>ßl×BÚ åêÄšJ› [ÑDœÔN[½Õ<à­-Sì“îVæ¡3Ììð^?âw׬Íû¡�ºOoLÿ‰‰JÜt€÷Ç«¦Õ¸ÇÕôÔ4ðþÖ×G×. ¬q«T¼ Ëæ&×Ì�#vYfn3vè º<îq�köìÙ³.nûÛ¯K>…×�¸'m2L|L”�ؼg¯Câ{ÿö†@®€�Å�ÿ 2V�òýJŬդA}½tvP…* uÖN;ÄI¸hN*cíb,p†}ãNèD¶ÐD\¥“ºðôŸhXB'Š·ÁiuL'á¢I8©Œµ‹±@�ÏèÕfiŸ¤qÛÓæeÀ Ì‹/Ûþ YÉÀ»Ýín ÛzË 'œÐ°}ýë__¯ª”_)|rJ‚_¶Ä½È\g_ýóâb܇â_4^Íxœùó€`}ë@WBÁŒ½&T%¼±„hòN =ºíàÐH,N¼ï"/\íE*{÷µ@êÒ ¤Ì°g¢¸û⦰ ‚¢O�3ú {M[q¿¼¿ÐŸþ¢ñ_ögÊ¨ÄØ u?OgÍù À!> IØœýoTɫɕõp&Mòó¯Å�÷žê÷©vúéÙ´ú; ´ºË£“$[Ú¥“:T=@=($ÙH‡7ã¥Àð­³Ùù=Åø¬-$B¸ÛO”7OrÆ&[e?º¼˜þGìß¡Œ¿�¯F² èpÁÜ$Íüà¡;o{ÛÛ6}èC7ÜÞ°wïÞæúë¯ßpÝ©°D šÊ"YFâ"¡“° ùšÀØý*oA%üö¾@ž ð„¯ùri°V ŠH°è xŒß´hÖKôSõçm,ÜfL1Üþ” [GÂ×Pkñâ‰ÉÕ‡,:(®¯²×í"ÆÒÿ¹{óe9¢}”½Ë[ƒ¾Coˆ ÚjOdRÎ;ï¼æ�|दæ;ßùNó‚¼ Yï" ûáD™e³’ zb‹Og${¾P¦h£ð†@^ IpAÇ+µ>é/Ðÿ¼À¶Q½Òßi Öxá£Ê´þh£_õ¥þk¤£†È:�képñ ÇÛ‹?ÂÛöž¼÷‹®ô¿wb1µ¨ XãE€8S¦Å›¶ƒdç¡ÌÍÀV�¹ØÂ#’{ó\úŸö}Å+^Ñ\sÍ5ÍÇ?þñuYuÆglÊí…u5OÂ6Gr¹?&K.ý“ôqÐø÷¯ÚDix¼ Ìµål Vd뉴 � yÖx!÷À¬ ›3COº«ºmpMØ®JŸàÞ7-¨/Üå­V(¡ÑG·M¡;`Ý·ë� ÏM�ŽIò[ÐÈÑÐÉw4§» F+ö8xù«m�ß‚ò[U!/¯‹¯F…|Lÿ‰…EÅÇÀѹØÍË€ÑÉÀ’^xasÑEMìí _øBóªW½ªmûÄ'>Ñâ‹äm€ƒ�Üêåbb‹t¡ µ¸*´˜=AXâRâaNvW�ò †TâÁn§±cƒWP’²"TTÚZÝpð’Á)‚à’Ö8mQjjè „÷®]Qˆ6jÁºÀÛ"c€ŽÛNÐx!%PZ�a„®�Lÿ‰ƒ‡µ‚/öŠn‡¦A"ªq^�'5dlÈ �±Çß&°\lÁ‘xüñÇO}Û?ôâ¿x䇀¾ùÍoú­€õ˜– €õDou²qI8&N�å(©“޻Ą>›�ÄÒ ÒP@Z¨w ’²1‘ Ö¸Ú]Üy ºàÑ�˺®5(1�w 9,™ž ¥Wp¼ÿQ:»Wç_è 5Þé¡gtEï¿óü¡¤ÿŠE1(›5þót`¨ û:þ¹<™ Ÿ6oGbàmGuÔÄN8óÿâ¿8Ö¶Þçx%ðÒR~Éc,°F°¤dŸ(¦O?×ñÔM <@bâ=ÿšTƒ»Ÿz"yiaæu ­o®ZB;­ô<’¡ [æ´ÀàìlœÄ_'ÙÀÙËfé }]Ÿ�îéýÉV %¬XãÑÚß×�§ÿŠÃ¤ñŒcO£g7F“ø7wüû£9ÌúPcÑÎ+c!ÙpÂ}ï{ßæ‚ .˜¨—{þÜûŸTÖ{à°Ã›úUÃIý%mmˆ‰•´5z†Kj„Ê$i’öRñdgµB¨'nÿ…@o ±ÞbÒV‚tQﳨ‘júðÒµ.…Ã"ŽàïíÕ¬ñ[W /¦Úg:\M«¯OPÃ4˜þG‰C9–†9þ 0E0jÜÏÓ`nÞj¸�£ÛÜæ6ÍOþäON4�§ýyêZYï½y`Zt×O'aóà©ÕS”ß?’˜ôéÚ*žÜƒhÛ’ÁiØÐMèJ ã�J‚†ûµÔÇñÀ×ßÔ¬qñÕ4ÃÝÎ7>ÁÖd‘[Å6SŸì˜é£ê/ý�¸�»àØØ+n‚u,ïšføÌñêñÏ:j}fù<”¡/A 0¯{(6~Çå÷ŸþéŸnöìÙ3¦œûþ¿÷{¿çßûk,„�x€wdÙ¤ا'îûÛDj¸õ¯LÀ>·“1 î÷óq«/¿†]> k’„Ç… E…Vüp^Ã�’ô>࣯(µŠWû8”,°Æ gMr<ü7cŒaÒt`-lU/5ÍðôߢRâ0iÀ†;þè2îÃC_y ;™_¶å‘ô�‡<¤Ù·oßDÛþüÏÿ¼¹êª«&¶ÕÄõ^à—õpZ­7ñõE |xLI¹@l¯ »\0l±¼�¹Ü7kƒ¤[`íB‚Dé|�5NJk\íÖêíQ‡\@¿ò`2‚êW0äJ?Sô…}®¥†àL�1­Íö7±À÷Fß…}mßµÏ5.{jŸk\í#:1-ôå· ülmhuÕ¶‹‹>÷Ùñôµãß�ù°±¹IšvàÏ�/Ûé�"ñ^rÉ%Mzï{ßÛ¼ímo›ØÖ'®÷AÀ#�<²áG‡²lp<�£3n�&º+‘ £Å¾Þw ÎþÇ�/øø§'2ä:ZÐI¢´•Rç¤W»éˆ2YŸ’Ÿì¡Opà¤þe‡`Í2’Öxè“nõ‡ðiú «�À­–þ[LJ!Ä…[¸Ù?JÇ:žŠ½Æƒ6ðiü'Aéÿè˜K�`§;úpÿ›§ûæ¹ØàÃñðÃ÷Kÿ#“Véã+_ùJóÇüÇ«îq½WèˆÅÈç>÷¹U÷™Œ³#À|&:0ZÜM‹\e“¯½ú,¾éO"÷iÓ¡~€×[k$ÄÒí²ÿ* g«šÈM;Ý´E•€gèÔñ&\®d±$Ú¤=à¡O|‚][Ç/Ã$ÉF;¾Òq€CrûöÁÑõ²Ø’þ+n£ñ!6Q6þÝQì.Ȥ9ܱÛtËó˜Ç4·¼å-Çúùîw¿Ûüîïþîš~¦7Ÿ ã¶!øÉÔþ" —ï÷{6#�1qcƒà‰×æõ4ZÑB@ÉšæI`leañ Â_T9[ŠOð`ô�&-4†ÞޝûX |¯aØWˇ­ØFIÿ»8ÌÛø‡gÃßÏË [bL¶…w¾ó�›ø�˜h ÷ý¯¼òʉm+×{`³¿ P'—•ü˜×6ùlº- øp‘æÁ¢V IÚþ(\ DÒttl§6%Ññºr¦/d£÷—> �# Ö¾�V5O�‹_¾Në>úŸVÔ&{Óÿ2†í‚p8ã?mŒ‡FŸ—ÀÐâ¾­í=öØc›Ÿú©Ÿšh#÷ýßúÖ·Nl›E\ïà˜cŽiN9å”YÝTûI'�Ô¼ð…/l~ìÇ~lâ·Jé@„õ#ˆžà �»öN‡k®»4Üù ¬e§Û7ª –gñ žþ{1þ£GÞpk󰨧¬áŽÄ6±œ·ýÝñŽw³†ïûsßÿ†nk[-áßøFó¥/}iµìùÎ?ÿü‰ôƒ%òŽƒ§?ýéÍÉ'ŸÜªà_ûÚ×Úú<#–‡¼pYÛ²Qàm‚·Ý ¯æ[m¢²ÄÌm’Г›á‚ÖÐâÐ<Ñš|MO é—ú´¢`�‹?–ž­_¶~ðÕú…�wF‚vž¢×e Žïéÿ|�¿Ž±¡ÃyX } ¶�ý¼íïáøD{xÓßç?ÿù‰mk!®÷ë€|`#Ë#ùȦ¿¨à+;¡�«¸ÜOb÷’é´œ¼*‰’`ý €AO�‘i“ É‡5¾Ú8ª¯i »Nâ΃ f/}MêÏ“²µ¹½–ÔÇä‘­6”PŸ¦°¯¿D¯m¨qÚVS¼oc”MèŸj¿x�¥Aª²mª|å»üœ¤°¯¯î\}kœ¶ÕïÛ�lô'Xãj÷~àE¦t Hµo¯tµòëð¿t7x� €ÁáÆ8°{÷îæ)OyÊÄûßÿóþÏæ]ïz׆t´ÞÛü!÷ë7¢Üínwk~äG~dDÕG?úÑæíoûmž+žØË+4l¾�I—é´à>‰FC³lW¼n§>™ûÌ@™¸ëÉwjüŠÍà¡;lP?‚ÖQÛ7´I[‚§_h*øJú†ð¢O>‹Áû6†¶½²{\w�uß-Ñm`r‘i@Û¼¿ï|Nÿ»X(¾}X��Æ]�`¬)>æÀõŒ¿kþ.Ãà ñà�xÄÄÜáiÿ?ù“?Ù�>Prùå—¯[×þýû×­ƒ‡ ÿøÇ�èùÎw¾³¦wŒ´¢gý¥FÒT‚³Ìä“(4›0=Y­hînͯ(Ào¥ž€�Pïú3²÷áBÑ?¼Ø·"èxÕý`� 8EÐù�:¤GЛŠ>úô~+è~ýÃ]w�ußð:¿),]�‚ô?âA؈· 1¤µ@�“`4EMñ®Ç@ã.èüì¬ %=‚ÑPjØA¿t¼þ.ÃÃu{p×»ÞµáÞ¿|ûÛßn^ô¢5|ï£Êµ×^Û|ùË_^—º;Üáë’çןñŒg4Àº¼öµ¯m¾úÕ¯Ö¤¹Ç•ƒ˜n—m‚£,ð°ŸœÍÈ>‰ÒÆ„¨ Úø|ŠÖDé‚ìâ�.cm‚È :n¼‚.ØÛ©m¿lÖ¸Ô(ù¶ ÂÀ§ñ›1! ”�º-• ¸�¦2fo�¿ÖQóJ¾kž_ís�«=ý�±Ù”ñW�s0ð\¯ù¼^÷ Ox˜>4¿ÿû¿¿) q½Ïð“ĺ=fø*|Ë�çê‚M«}­q-7xœÌA¢2àIÄð:qàŸ×á±…�ãJ�̯à¶à[èaóW ƒÓ&è|â7h¥îGz¥·…,7ÐU ø[¾b|‘4:nm‚Î/Û€®Û�Â4/Ñ_Ø©~'ÊK�`úq%>.VACgÆ×Æ0ø»q7)—Ó8¶|®?ø7uüãü>ƒƒw€ïÕ?ëYÏ;Fãë^÷ºæ#ùÈÁ+_Ar½Ïð”~ÿÁ½ºiâw .¼ðÂßlxÙË^ÖNH#�; ²ìÙ»LÈL %�õ'P&Û YPài's»ôÎ:€ºmþ³j$ŽÈ¢«à.-A+¸)«¨¦×kë––½¨'oøFƒh-S…ÔJÀݧ±Û ”ß‚®E¾'m0‰ý‚è-8Ðñ Ò4JMÿ#FÛhüc�½ÏÀ€†o×®�ûé.ÿÜÏýœ÷½‚÷½ï}ÍßøÆ>yÃêë]`ÈÝï~÷5ÛóýßÿýÍÃö°19žqØ)_ûsÞr’½÷Ïó¤’›nÀ«üéГ–MÃU"óE�3v -¤LÂù ' îýØö½BÂìË·ºÐ)½‚®§ôé^pñ“vÁ=ýî2ÊÁâ# •—AéžÖºàÚ–þwqÜøû�0üÝÆe”áÇbÛyÀen^ÇK²;óÌ3›½{÷67ß|sÃñ\qÅÍ?þã?6þð‡Ë¯´­Þü={öxò?ãŒ3Æ„øªgÛYxÖó4?Oð¿æ5¯ixNa5嬳Îòo9h¢‘Ì?øÁæïx‡ª;Ú4ì?ö£äÔ>íoWâ|‹$i…ïýûËìÇ‚,�EêŒIœæÂ#Õ¨´Òf»˜ëLiEgШµr•:®4HÏ,€ëÙ…�Që­î°Ôe«nt…Ã/+K¼2Ç7:HàÓJÝ$\ÐuvùšþÇxÌÅøO;.¶)=Ût`HŽÏ|æ3Ç~—×ÜúÖ·öíž÷¼§_ýMoz“ß¿æe=³ ‹ôNº„þïÿþïþ:\ž†ßìÂ=÷õ,XÄ<ð�ô[³l½Ýín×üüÏÿüØWù�¢µü¢á¬~†ØÎ‚ˆäS0/ô1'ü Îxò3 9Ϫ‹‹à\�º¿ÐIñK€0�,\¾èAŸµ‡N*”AgÇ@ovåÆ]cˆÙ[ÚÝvõ¨Ã úoêXÿ=}îXÅ_b¡þ´ rhýcF1¡µG683Õ'á@J¿½O�òâ_¿Ãôß¹�Æ?uØû¼° Çï„NhžóœçŒ%ÿI¦wÜq /³á-}÷»ßý¾Ï?­ð¶»ÿò_þËÄäÏ•…¿øÅë~BZß}úÇ>ö±>iÍõ<àÍ©§žº¢gþ¿üË¿ÜðÜ@]˜L_ò’—4ßúÖ·jòÄ•.-u–ÄÀ.Ó•I×&^ÿå?O’‘Û|2öˆ™¬¿KÀ2YÒ´À�5®ö6<«+¡ƒ.BcôäHòwº~éKüNEÖº‹^oí‘,�Íx[H?˜Y`�;¼h,ýBSÿÂ�¯X8ŠgôP¤/ý?tã?{´†Á‘ €m8NOzÒ“š£�>zM–ÁÿèG?Ú¿¶w饗úwú5ap¿ÿAzPó¿ñSÜç%8[Uè+&ëƒï‘g"xŽaÒOãûÅ_ÜüÒ/ýÒXò§Ç¿û»¿ÛRÞËÍ•$‘EZ) ÏÒœž(éÆ8ìu¿…š6èŽÛŽ[ž, sh Ô“d�5®v¤ZÃãx ¨cWк5V×âÐqcÁH¼‡EQ´´Æ=òç=û¾h ŠËh›k*¼¿¡Åy¤Ñí3y`ñ[Ðû©h΃œdÐUúÊoAëÞX]‹Cù-è6Ãä:@Œßí Øù�þÅÉ:¥ÄßcÈÄÇÇžÆá—¼°ÍÆ�»™ty~µfòK~~ðƒ}»þúë›ý×õ¹Ò„ÿ÷¿å_�ãÌûª«®jöíÛ·Z×&òñ>,lÞüæ7{Bç�§�vš'ÿIÏ8 äSŸúTó—ù—õíD"S¤†E´W“x¨G‚ ܪñ´IdðpU`ɸüwŒÙ§M£SØë>}‚®$åúK?´Ç¤ÜA—7z‘ò¾C§k+ú»ö v{ò%¦”¼i@aô$ŸÝf#‡¿ÅW¯‡®à.eU�‘)W’Öó þ�Ú1€^J\ÒÿˆÈPÇ¿=ž4®†¹Øfƒw—»ÜeÃ,â~?ÛJå²Ë.kþìÏþl%–MkãÆ}ûö­[?—÷ò�‡ø6K nupË#Ëh"!Æ�,Ha‘¾HŠ$yjFÚFqhè´¿nÑà­¶óŒKe,ÁvüUB(:‚ßÅ\Ø,~8êþ´¥Ý’ôy¹ßBÈ U�˜úIŒŸжH+âë¸i/6Ë‚÷ÿ|ò5*��"µÑ}èët ë,€Ÿ>U„móS³ wŸ ‡K°ÆƒÓ¹½]öO×»dÅ�½Aë{uôOçwú¯±‡ÄŠ¢h ëF Z�ÉwÁß¶oáøw6 ËÀ6¿µÞû?XóùÞ;¿{¿OüO³‘Kñ[ùê]®tlÄÇÓü"]I*lWzv¸—ù)š ë³~x(‚^©tÐ|@p$£Ç�f_caKgOèf_ÓL¯Ÿš÷?Aï/ú–þ軳§¶qTwô?¥hv¥#ìEJ6Á)ý†\ú¯8D„êQ¥ŒÆ’ØRzñÝÂñ�þ‡¿ÏÀ6CÞJ·Ù…ïÎÿæoþfÃ×àuyÏ{Þ³%&¼õ­omÞò–·lI_Cê¤;‡c:OpøÃýl°¨?/`tÿ1 *9ÂO mãú$O_àѧø;K ÄZÙG�N™Üé$úˆ~FÏØCR:¢_Ñ"1�.d·`ÍSûŠJM«y;ùô?ÆE#c_cjUTF„;šÆQ0bK{ï�ÿèwøû\l³1Üì¤Ì»~û·»¹æšk¶…çï|ç;ý©æÍ4æýïóêW¿z3»¬nΡ8“g’¤ø„ìgR^méL«õØcò¶IÕ.½2a×:j<4ÍÞ×2¡[}D ¨iÁË»Ëæs¿á@Û<‰(ûCrt�…¡l¼¸>#k\œ’•V袉g%(^Éãxq§ÅÕ­é?qð�@�—€ù®ñŠXÆqªÖ0¤Ñ5¹Lóɜáæ`›�Õ'?ùÉM³ˆäÿ;¿ó;þü¦u²FÅW_}uó�|`�R«gçë†ø‡¸é‹ŒÕ[´½8™+ã�?CÊdɤ(\—Ò!(ÑãA\n×ÔË—ë‡cÊ• o.Ènr©'ØwM‹F÷²ÈFŸ%ß·×ù«Rë÷8¿`-‹^ߟRúöÁ&Z�C›ô—þ—1Ø¢ñŸ2Œƒ"ç`› ¯÷­'­�2�äÿ‚¼`[~÷ý oxÃF¹9¢‡äÏ‚g5oHÜA�ïx¢aâÄw’§ãŒ–62žlüþ:o´7–«ÀöŠâÈÙ+>¥”Þ]¼ÿ‡˜xj\|ø®ä�ûbE²â¯iÁPŒ›à-ë¼¶«}÷¾ t~wÝwé¿Æ]PA¬`cðþ¬â©qñmõøW¦ÍÀ6:Έßõ®wm¨U<è÷¾pÓ~Ýo½Æ~ö³ŸÝð÷ñ¿ýío÷‡3ù¯<:~Bj»øE@›B ×[ý"y²‡‹M³·%YdH”LÉ vM~E!dFpM«qYXÓÀIª-¤C+JºŽ;%,óVÛ ‚x²(]‚àñ¼Áy 5Wà{%F+ ñG,¬C|¤ïÓšaQaj¼­Àà‹„^)4!7Øe= ¿*MN+ýã74‡5^Ú½Ã�û3jQPŒ¥^oVõ:Ð z)SõG_Ád{TQŠJ·Áð©ö8¿ì2éÄbsÆ?†fèû\lÃäe5Ï}îs×ý —ÀåW~¥áûþÛ½ðí¾™°žŸååÍ‚¿þ뿞Oû¯e°=¡ ÀdYÎpI†® ”Ä£ª„I�DŒŠÈl~¡œ±�F+ètýA )à ÷�ˆT›HbF)ú•1]Àh è¬V¤Áí+p‚ÿ°Èׄ¢”FÛœ&œ*´RÒÿqðøZµ@�aƒƒÝ„Mmj+0Ц¡@Û\ @pÈ‚àT/ ­}´Ç1¯qDzŠý®ç ÃÈâûùõ›=çœsÎ3 ÎM¹îºëšÿõ¿þWÃ+|yµíJ¯òí;ý�o|£yÕ«^å?—»_+ì÷°u¾žø¾÷½¯ýµÃÕêá*Wð<Ëê#p÷koO÷Û'JoùÓ×út¹}�_´Dæ¿þÇý~›'ãò|ôoŒ‡ Éw>IzS™Pc–5 [ÑB§Ó\ÈêÞTàjä[]Zñdkøjõ�ð»‚0ÑíľŠNb@8±8“µ¸ AøDC@8Ð6ï¿@× Ùê­úò}ý®Ïd€Ò#H÷+òÓŽ\�5�-ý�¸Z_ø¥×ÿ®Eä»eãµ¢ V;r†¢øpÂÒQ#•ü÷ùÛŽ¼ä’K>;Ê2?5^ç{ÑEùoðëvǼ}¾»¡ãM~|­�3ý÷¾÷½ ¯÷=To÷Û¨¨Ÿ}öÙÍÝï~÷æ¼óÎkN9唆ŸA¦p‰šŸ-&Ñä#iþéŸþ©¹âŠ+ïïFÅm­z~îÓù€öyÞ.ó/Ú4FR_´õ54Îèietì~¾A°äíðÍ^„¿d‹„‰…é¡iÓ¤Ú€”?‡¼r�7[»hÎ?s·V…}ƒft0‹½×ý˜¶¾|�_¾)ÿ?{ït[VÕwïîÓÍý" —p³!B4˜WSx#LbÊ¼š˜¼šø)šª”ù�|JÕ›o1)R‰VÊ&oÃÄ[4D#Ä*4¢…€Js‘‹È­An tÓM7Ý}Î;~ÿ1þkͽöÞç¹ì}ÎÙk�9Ÿg­1æ˜cŒ9æ˜k�1×e¯m_OWΪpjÐ ½œÄ>é~CÛT~Â,ãç·žöûÿÏ3Âþ»b»;6~‡�EÀµy¥jt|ÞÒ ༞»Šrü¨ÏßøÆá{´yÈCVüÊm<è–d]E£®pW¼%�Í…±²‘üû{üí•ý¡Ò¸HWyv \Á8ê¾?)�§ýÉ:bmÑÌÅÿx¿Ö}Lð“޹î fg1µÑ_Ѩc„²JASŸ�u>à@·›&ÂÆ>ÛT¨ú(FõxélS¿�OèO¿úÑé¾€UtëŽþúø�{þ=¥s†}0ÃÙ#è‘øÙ®—Â7®åk‹ëçÈø™“29òëuJèZ8áÇ/Fýb<íπʇ•31꾿òA;½• 3Û¡ G®³|q%8Í^ÂÁŒ¢…€ì©ÃÆ\d»û*vÉ„pÁ4“š¥7 ŒV›2i÷8~ìÈæÒ‰"uš]ôñ§ð_É=ƒÃ¡–ï@O*öí /æœ#|•çÿ${gÐÞ3˜¤nb÷À•ò±˜KþJƒq¶O”¾á†¼Ý¢8ËÙl,Æ[²³-Ͼ áâ!³$ ƒ¦–‚¢ ´dÈvŸ1oO˜MÂÍl+%¯„�I õÅ^4Õ¢¯u¨\�n)ÁÀ‚g`¤Á}Ds6ÕU ¬ïHþaþ¦4�Ÿ¹Ìí¡0[¼/f;uÝðî�Ã{€àÆ}}Jä´ˆ=4= ¬vÁ ² ÿ*‰™V” iËd ¤lO ã.4¢^ú6ù×õUÆEñ¨¿ú� Û¢©º�m£RbÜXp”¬ùRßhohÝôíaH¿ëönŽÇ>{�»�ÿXç?giÞû¾˜÷üuë»öò€òx$&R–’y àü<göT¸3 TFÆ‹ûJ.`ÈÄÆò 6%9ÕØ‘Ì Lp'VÃÐ*MÀ¡¸qM¶ÚeXàe`Ê1¶lG”&«˜&dì+«Sû üÓžòˆf}üøÚsž~YÂü³Ø]Jé €¥ÌdG÷À9<@,S"—lTœ%]¹8ÐWëë}u6~ø¦x^€DJHtB”ä�m+`º¸¥�Øœ„ÅR †ÄÛJ~ʯ÷Äå =�X"-ȱ¦YÐó ©ç‚€[Ø‘ãa ¶7­N i‡/o}Œü©£8-ÛèkÛ!ÛômŒ'‰µœØ´g°mП¶Ûø/Å×”W¤§ãg*Ëü�ñÛ#å�Ì»æ?è­þ”ó¬�¢î/�Çò+½Gƒ�ÑQÖÇäÈçãa°kÆH_ÌxòºéÝûzÀ±4ϵkDB?ÝÏ"µVuÊ÷ÿ ¦|ïßa¶ ŽÆ §vìc�.ÍYG7öÇbÞÍ€|ó³³zük_9²vì(<ðÀmw®>ùÊ_ÜH°‡žëc üäã-�/x)–5œÊGp�W”$4ó]_Ì|»ùÝûx€äJr'õ“lù]Ÿ›¼*�b²o. n¬ÓÕl®+Q!Pú!@b¤6|à£:(ÅpŸÜi‚˜¶; ¯ëS}w”ð¼vþ§Ç›¹áIÇÏT~ê“ڧüs¨÷Àf©ÛØ=p…<@PËó÷¼ü·ûë'¯�\3€:Ñgð-’{>óÆÏÿ\.‡�·Bº�õ\EPòRh4 ÞF·ÚGš¸·´§Žd&À÷rÌð\{ž?ÿC>ŒO�+×ÓSkèÚñj>CøÁmý1{ú´¶ñyï¥{ {à:õ€s¦Îñ#²)¸±§1þõГi£9êCÂ'oT�Œ6 Ï8Jè¤ÝÐýÆê­ÇUÆ�l²á¤>zûñz€ù¦kN Û¹N¦íóïãÀÇ‚aªMý>^ZštV÷úÈvÙ϶þmÇœa¿0çÙë¶wìé�È×*yAŸ/ùÕYwÐ3½ó LÅh4Ë8èš…Û.m6nO‹G%Å VÍjÕÖò7Lá¾?Vxž ±³Å1ÿ­>—NÞ´™fµüÃ�æÃ°þØ^¯¬cÎpü¤ÎyÝöî�î�ó{€³çˆjä]d&öñ ËW@Ý2*%oÜòÕº80«ÏÐA1m›�ÛNË¿MG§�Î:Ÿgåwr¶øà�:æ¸Ê �Ó„ŽÇdÛ÷ ¿¤_XÀ$ö!tìãÝÇ�³bßúýû<‚ÆAÐí ˆ>ÓçÌ*XÅ]¼[í¡ƒhw�UPšƒ32->Õá6ÃMþ ØS¹^?\•ùç(ôq`\Gæ¦8)†ÜÇ™a6DZ²�Ò¯,d"û0ºÎår2É=þ”›C õ±d¸sÐs›‚btèâ&‘ƒä]ŒÙœü�±I® pëÚ%Ý:Åã¾€l֢ƾ;hzbwUæßÇ��Ãp†��øÇ´cñÕU¶£/®²Ã{wÝGå�Š�mòæ‡}†ÀH’î�sx`&ÒREyTfþ}„æñC?>Z¶yg½Í²¶Y�Û¤çOë €ùÏaA÷À^pØã ì…¨dšv2ÎÚp§`ä¸Vp!ý4cètzo¨{JˆN}à`lWòÐ žº2‰„l0ø'{i·vð^ŽË97ž¡„‡žÿá`©h<Ž}D­û$�=Uã±fî)4Ǹ]×7ÇZ¿0ÇYë6w\– z@_w’ò—”F&vPtÐ ¦�2ò€e7DÅü$~,ðµ!ÔËÑzà¤ùÄð}çßÇAÇ^Än·cOc�Æ€-n‡æ±O›[Ý2_Øó�»ny÷ÀÞ ”e`®lªº ˆ¶ †k|’ðyxf_Ú9#` ’-N«ar&MM´"\0ñµ¢±«ÆŠu²Kíb¯�<ï†ÛæópóO/írc<ŽiñÑ80ÿŒŸÌ.=ˆ }p7v%Ýóô€"‘Wù5j†³dh„<¼â7øùÓ¯§¸cg8 !|]º‹�&Cp^.4@NåŠ&dë.yRzeüVÎN¼ÖÈyg®®ìüçqÀ±ÀÑ0ÀÀ9Z é«6ÑàÕ±ãcÈÁ$n`êj¡ˆ3ßõgf>�Ýüî�}< ”I¼#4WÐ œœ_ý#ÙG ‚Þ tÞp!dเíQ Ïš[áf»T62–N›ø“=•'1åëõƒ7ø…¥×ì�<ï†XÆ,ç1a;÷Ÿô;gëP‰� õWýªÇhP�Å E4-ʶú˜èãW´™ïú€™O`7¿{`û8“W @¢WB)ÎÈíâÌ(xÚ÷/Åj!ƒj0(QRñWxT iÚ(оA–œ!r� …GŸ†kW ŠO��÷20™`l:V zÞ aaÎ wÍ¿uÀ¯¡ä¢ü®EŸüUß�H~Aú‚#!Êç_ú€ùÏaA÷À¹=@0Ëþ"°Ý_$’Ø9«�3kA…<Îܽˆ¸ÊYÒ0 ¢CÏ�Éã,\Qp•E A,Ö™»:¤¦&t¢b< Egw ”Þº @;ê{9R0§WaþÛÃ˸�'-luLúÃW ®¶‘´�ŸcpI‡Y_p ôÒ=p�z` fý¢B]I; ñ‹AàrÆÊ„¤|ž ˆÚIè, xa�=Ö1¸®ⶂôAÎs´è>të,°"ú4Ÿ\¼ýžÕÿ¿wŽÚ1Ni* ë[†Qt+6Õ7e²ª²Ú<c†3*dÜÊOêoªÞ²@•)C‘w�“ØwØsñ ÷¦­èu×Ûúp[Á³Î¿Ì Y K‹K_´ÇSá«*ýçgÁd»ßìîcΰ/æ<{Ýöî�== Ð§]„ÅH¶7ÆMA�ù„^O%0N„ÃJô$c¸†¤¬Œ:*AÃ/´"¨¯b·Ú£—j‡Ô–“øËìÁ΋·iuçO¼}0Üv¥��3øôí�ßaOkÛVü$}'µO•îÉlã?i>7†¯ŒË1TóbðŠ Í‚�hñjö8>á_›h–?»R0™“ u¼ë°~r¿3†ý€O^7½{à  ð‘Ô#ܸ@PÔ™RÀ|F ‚©£`ˆ(�ÑQ2G�ì­í}&lñ�ɲÀØÄSð4ü²/ø�¶Õ0i›!}Ʀ> ¶¸øà¡‚£ƒlq7wíZ|àlu.ž‚§á×Xƒ?G†ê?¡ìF?ö[Zlê£`‹KŠ!8:(Ög\ÄÍ];†8'úÄ4àiø¯èø#ç�ô+óž¿n}÷ÀÞ ˜,ùÀx `ä zòŸöøóÕ€ À“è_gjÃÛÔ2úýêÞhó}ש¨šc‘2ðlãŸèújÍlñi'm‰6�°Ï´©œëè¶ ¦µÐmÕφ~†WclÅŒ»ÍWh_xLý}üá9ûdp¢‘-°æE2Ѽ1?E3Û ³#õÀ즬Ü=pXd®E@$“IB”:›ç2*ÕØñ  Ëè¶�ØCþ’îD{ÉÑ×!S S1ûªÖºAWL‹æÍ‚ZRMÆõ—mKÀ� „^÷AÆ�”i4ÖÒg¼�?ýµá°p¤®Ÿ§C7Ün4­¬ƒ“æã¤ö©=îìÜó¿nÞk}0ÇYë6wØ>ËÍš‹â¥Ï‚Ô]4ú¾2uÒ^ÆN¤È…A!ù 7“ž™T,±3 ]Yî©F“iâ®vuT’&Ñn¸µ¸+Cl¯-4G(ñ }Vl˜ã&úÝð©1„8âkz ר'¢L&Ï™D»qO�dÚ�]m8™¯Ôç#‹>+6´ÃñÝv6O¼/æ9oÝêî�ƒxÀ ^1®œÎîìúÒ¿/ÿÓ”[þnà°(%’uÀ<ɦ±ý}VÁx�¡998aN𕹳”ÑôqttœÉ$0Îð�dã9ÀÈsŽpnáÑ¿¼%w¶f8guHYGê RÓT±Z`‹«=‰•,¢jè~ ³OÚ×z(M œŒ�lÒUÉ–äº6×Ä9ŒØ(†àëÜPFš*fÞ¡ÀC‘M¡ 6p³ëìY´ð}1Jÿd×ÇŸ¹ó?qõl«ý Àl§®Þ=°¿2¹(ÕèL�3R»9õ§LB‚Ï[ôªöz ÈCyIÏ”ihJ´)›)ÙmBªÅl(–F�¯$Ò>z‚ú�µÕ/¤(wMwòÔ¶¿Wr�ÊÅÒošU¶úN2ÐvfßÖ4ÚÑÚ0 *ØúøÃGåù®ñ‰ê5­Ï3ÿ>|Ñ9÷Ò¯Ì}»ýÝ{xÀÁL =ô¸Þªä^ÿX2Šj‘(5^”A5!ZÂp”ß�™¨-v�^P¸(Å8¶Ð d£‚[Øâ´m+î Øâæu"²Ác¸�ßr»`+.; «Ñv£cÊÏX¡Ù(†à–•Þ-úàiËT?m¦�_ïãÇs/ý ÀÜg°Ûß=°‡œ HÙþa/¬Öÿe=S <™æFFɳÒló+ƒá·~áUqâhi-ï cÄ}-ŽP”†´†“è”�+k_ÓÑ §ºaï&Ãi_c!æ3œò»_Cµ7ÌF ‡Á „>þ5ßMü>õ÷•šÿ:œª÷yƒ~`Þó×­ï8ˆHèW‚Ûpþ^‘NWWÒo¢õ±Œø ?6nÅ|ÿØâ[™ƒH@§[<©›{' `‹orn§´}´øvî³SÛ1·ø.M­ -¾‹¿s‹ïâŸÒÛ>Z|ÊwÞz;æߥ¯µ¡Åwñ·cnñ]üSzÛG‹Oùæ\ïWæ<{Ýöî�ƒx€ÌÊ™üúý{çw®�ÞIì¾�I~Lú´¢ƒ²¾0iëÎ÷² %ëH½EÂM†É¿…ñ@$÷cxèþê‡,Nô@Ûjˆ}ìvǯþ®d‡óûøÓ!Ç0ÿ“©™mµ/f;uÝðî�Cx€Sv¶LêY˺ˆ¢s‹ _ý ÍØ8p[ê½Ò ÓV¦Íi…i­Eähm± ô‚Y»ü~š€á6m›¤u_©ƒÇÚÇï#x„̇§VsN=á@�¢%vòÞsmx²Äñs,æÀñ»º[Ø=p| ˜MÏÚ}@A²²Œ„WA´†’A ŒU«Í�Òr‹ÛЕö$Éøådá-H™^Ë›`Ø œdOûG:ðSÑIöÙnCi° T&¥�&ó¯Ä^Jé €¥ÌdG÷À9=�I<ƒï…¸&È%}Ò¼\褮ûûÐâOmA¿!áÅxàh7äÅÄv 0MhS󤿒>mÔ[8•Ÿò³‘­0ZÐBQG-»ÂµYwˆKwªm5Œ¸tGµzßèoª]m™Ž§�?½c?Lý7õ×µšÿñhgsžx_ÌsÞºÕ݇ó@E4\îëëªÉ <þ`!Åçù?�Rµ`Z[¨-vŽ”È™,<*©k3a;nðGCÒR£qëÃv:-ÜúCR<ù.Ã_êvÚ] *Á‡JéXÍÂé�J”i»í4Üà�†¤eÆ­¯�?�z¥æ_“6ó]_Ì|»ùÝûx@I#8ù ‹„CBç²?ø�‘ù3¹DcœõóÆ@øóœ?tk øáÓâAd®  î,#fÊsÑ‘2P}v?ÈÛX e¦UÕd Ú(Ö�Ù!¾ÉŒ˜¾+�¸këc#°acfMK:|çñ3uø5š~0k)¥/–2“}Ýçð1´ýñžLb¥ˆÆ(—â·€Y è[•‰Å¼óÿ&%øÌ�¾0fRI³S!‘6ùqÀ‡õ�Ã�’鸘êŸòºo«÷âdg©ñ{!�~pAÐÂ}шH.�Ü»•¤œeh5nyÜPâ}ü£ÿÊ%;ÁU›ÿaå»Ó”Ù4ôÀl¦ªÚ=px I Õ‘ànˆlDB¬\W‹ƒ"ÙG‰6/Ëbå@ò¯äHp¬˜=èVãfÂSÁ[͉ »ƒŸ.Úb9CõCõoUU�ž Ë ´19Œ ¢&Èà@• t›ùÕ?ÆŸè¥ù©>±Ò.å±³l¦üf3´œaù²ü°KñÙæ|q¬GCM°qÁ"[yÏëp<ˆ8ï]_Ì{þºõÝ{y@ÁŒËú*y¸ùbě⿳’/c'ý†@p¢!ZòÜèø8@ô)³siq‰!§ ÏÁwg@F¬Ñ7=£g1C„„•jADUZùÀ©b÷P|b®XÒÉ-Ù@-ÒÇyæd„Ãʉsœÿœùùîû`¾s×-ïØÛÄÞ¼®%€Îøk9 ³#ÎíÇ<^€¾ªgÈxÈ Ï Y.§Åèhá�) ªŸÀÝ¢¦1P©…F…‚lr!B7ƒtÓT/Þ!ÁOäÅîJ©µzõÕÚ3]PdÙoªèã_âüçÑå£dÞ°/æ=Ýúî�½<àü©„šT/båÑøªß¥Õ²›fÂLøyMàÆø  ’e,nˆÛð£�¯ *IS›ð)}A’°;Yl‹%¦ 6u“äC&ŠÔnu¦©1vÒWÐm¦‰Ç`”Iµ¡¿:HŸåXÅϸ£q\€ôñ/qþǧ_u˜Ìz׳ž¾n|÷À~p²$Ù¬9‹ÏÄV‰šŸ„鯨‘èã/Þ!ä.*ñ)ó†='€YÁªd‰\ã‚&í�”u…ÀÖURMR&X3ÙvCú×Z£™|¤Bâ�E+ýÁ­Q³`¨¸T=ÙÞX�üØ8ª³(ÆwµKÊ*ÅŠúøó8(çøjU»ÙÂÕ˜Ž¡¥”¾XÊLöqtœÇDÏhg¯ùg²ã¹€øWòì6ùèŠô)AD„“_—ÝÕuµÁM 3 ˳g®&P²ÿ„"`€D²�=ËŽ¬mãÃЧ-*ÐQ¥Aƒ�ÆhÐ@/&5>4>èKƒ†þÃl }¶xvPÑÔÇŸK°tÒ\æ¿_àÀî¥{ {`È”š _'û•Øœ@¹ Ü£m/ˆÈŽFŸz© aK™$\q­ånñ¡¡ˆCMR]ãßè’֌ڌ7 Z“ züCƒ¸­‘.Ø*Ú�÷ñ§ëjE¥¹›áü¯±;æz&ä~`&ÕÍì¸"ˆÆ}{z¢?¢rÝÑWw—*É)Õ)�Å÷ü�)c$Çk€E3u‡¥4KQ¶ûì/—4Eh�l› ’†ÊD~е³]F…b3 ¤Á§úhž–vH0ìÒ7•�Ö'ýõñç\Ï{þ§“<¯z_Ìk¾ºµÝWÄñšŸÒË•€LÄäJg5*�A̬Èâ@í•$‡Ä=ž2oÚZ¼4èa¹¨ B0Þð@vÙH˜Õ.RŠ«•5nHîÖ®ƒ|àk Þ½7²ÅÞ´œmdûøu€ÍoþýQ9ý¬-g_íÔtú®‚†d­óïX�ü›§|˜öݨEI?\ÐWÿâ=œ k †�„;ŠÌC“q eÒ>M˜ùLBõì´›&ùén¢OBóŠÀ¸`‘-Õ�È´?óî�§§µrÿ¤½�?Œð‰üŽô\ëØ‹úÕžÿµ¹œi¥/f:qÝìî�Cy K¦nr¯©pÞ"àÕ¿3áÃJþ„‡õDð(@G»Ûr‰Ñ\âgN–à'tk�P2igÚ‹è��~ÐêÁÿ×Ó.£Ai¨žŒ£LªÿYlLEޟП٠ÏÚÿYù74Q0©n°ÛÎSÃÿ¥»ï_Ýû ÷ƱÀ¡Ô\õË 'Í?ö汜J¦Þ×�Q·´àذç„ñËnúhí¿Œ½shê €9ÌR·±{àŠy€ œ÷ð  Ä6'lª¦åד½XóÆADfS^  бÁ£Kó¡o¸Doœ@K± Uë!ÒG‘΢©Ž\4 Wè�—ü�O|øêQÿï7ÂÚËyà�Ûî\ÝófB‡cBæ1o5§Ô÷�ÿA§�T êÃmÄŠr’=q° ·¹¤ÓÆŽ««Ù‚¾˜íÔuûà�ˆe\ñw,¾ˆ/Á�6ê�ð©¨}dú‹‘ñ/DM· ‚=¹+îàÉk ÐSÖ+„Q?BÑíü‹¯äÑ] Œ×Úýê;UõýQy€äาó¯ƒGÇ ýD-@¿Û�á6 EÖžÒÈ£ `²ˆËíiÆH_ÌxòºéÝ{{ ‚z@ n| ÀÏ(t×=PÑ2ÅàC�A&jäG•• 3 g‘‘u�1õ-•(Óœü,6ª]}"Wú“Ü÷Gçæ'çÝo‡ÄÄCÏ».é¯ã²˜ñyšƒ•£>¤.·à¤5íξæ¿×gzþÃЖô3Í ™’>Œ9x€$ì¤L„#Pêí~a|ÍLêÉC[ò+ƒ®ÅÂ}­ !l0J hJ`ë fý'ÜÆŸRÍ^Ê›zG�ÆžwÃmóy°ù§“Ø8v }ÆQ¥ãØPÇ4%g>Có�c÷4dI €=]ÑÅ»®Oè‰ÈFñéuÖ´çLœfÞùO�…ûµ#`æ}[ÅÙh!\RØgð`Tà ‚Ãež· ‰‹&ä;léåH=PóΤ3çžwÃCÎ?Ç�¶pŧŽõUm¢�ÄÜV||nã™m1·"x\Œ‰é š¹�ÝÞ£ð€S'i9ß � Z/ŠÆ¼¼ßˆÖ  ñz`á¼&x|u�õ0(çcC�Mƒ— ðú KN°pÁ ΰÕ>„ïdX_BÀ�D/ÇèŽ�«1ÿydäq ãg8ÚÆä_‡W¸)¶>nXŒ$ÍZhç(óqe½®£§ÏfÓbf$ÿåÌÊÙæ°swìå~½Ï½ÃDýàO@>]Jóàê-e2ƒF«€¦Cê%²±KM©1Ó98zؤ»`ö“[W Êæáª�t[Ÿ*}wôð|3ÿ>Ñ—Ú‚·Ç”�±‘òEU%vU•¾ÀSïÑ;÷T.é À¥%]š9Õìu¦î�x ½/Ïü9# Þ69kãjÀú|†?‡Wx3púê@¾RXdiImY7žRÙSʳO�yÖe~ÓÔ^‘×öˆ§‰Æß)Û÷Çã&‰íÊÏö’ÇÇÇ„�Õ\b$u»oÜ–•÷¡=·Ì+Û¥çHíWæ8kÝæî�{ ƒ¤S(tĹB0– Ž ¬ ©Ýx#‹°¨äÙ€”á4Ù�úZÌý¬÷Ÿµä35ãnOËZ}?x†°Æ³¶Í2·%Öòj[,ÙÒÀ™Ã<òŠQRÇcžVÖúÖ©§á%çŠ-a๜ët»»®¹x��‚§’z†ÏÜóðŸ1ÌÌ�›Î•.å“—.ô"! ¯ Î¥�ÏêsxÖlñlÝÜûаÅÍÙêHÜstxLðì[|—�휷¸ù[‰�G=øHêØn øu¬‘ãÛǸ!äØ(Àq!»%,4q/0ç{!Ó‡Ñ=pu<�¡�{ü™Ô}æ3P_pxµ]ëuôäGPÏ nšd\+àŠ;p`JŽPüþHcOÁ­üƒI÷ݱyàªÍ?GÇxö?&p±EÑñx_Jó¦Å§!�±ËŸÇæßsس˜€füè"Ý×·"±*è2Ç ÙP¿˜«*ÄÌ7á²|¾°èúV?¸âÐZ ³Ÿª¡#6Õ šÏPü}wܸÚóïc¯ŽŽé(Ô}5AÓ€ Ñ4ø+([\²[vm’hñ�ÕA~ tä8<G˜çÝ0 kç¼ÅwÙÜÎy‹üž`‹ ëH«£ÅG®<æ9²s£Å´‘kÎØ’sž‡n{÷À5ñ ^á-f†6ÎõYŒ…à ÅïÙ"†0ùãö€ƒ7¤’nƒp‹«Q̉¥Âwûº lª¾e :z9RÄ‘u•æíø;ÁÓã vÓ¶‰Z·á6ž¹Ñ³ˆIYÖÒlnGR·wžˆ¼©ÔOR�h1PKˆ€'ºŸúW<�]%` ~R�&;P[Üzג¶10&Òêo— Ü5½zÕ=põæ¿=¦Ç õvã€>Å0kk{ë6\kœie1/ ÿ£zéè8ƒfºüß|z8³§(—=¬JWŒÉ˜dÎ…àèœ~c ª Fc|0sîæ¢AÂÃG2?šZP„,�rÖL_¤SÞ¸´a¶öýñx Ãó•žÿéxO:¾Æ”‘d.v_�Êã�ãvÚÓ|ëKY0Væ;Ýòî�«íb™Âsì×DàYÿ‹« ñŠ_’ª^õ­ à±." ?uçY¤ ¤ð�‹Š « ;Wž€ÓBxei@ã)ÿÀ‡ïXÝþ}¿2ªŸ`6w»ô„9ªÓ€¯ñ‡°Ç0Õ'³lRÈOù§=LõOÛ§òSþiûT~ZŸÚkSÓ{SîÃ�ÿâ—|fßeoî9á¾ó?�„†¤ÈEȃŠªØãc‚q¿KL3ß-fàÉ™ù|t󻮪u:×wvÂãhß°å9�n¸ÄLê\ à�ÿ7Ý� ‡ôQzÄvTèQzÔ2¶µÚÇöQ&ÚﻸºÿŸ Ù6 ,팪“ÐIöLîtâ˜cOÖ·=¡X~ôÔvlj�ü~™ñÌoüžWCæjÄs<íq°ŽOý¿ïø§ý¡ZÂís47êbáøþ€¹}ÝÞkî3B¹?¿L“ïò'öúw.‚ë#I,X¹÷~!. ¹R ø \¨ -ÝÐ8!'î ž ZŠŸ”`§íX1ÒÐA�’3O™#;lƒùÒ¶ä7¾Ë^ë5ܰ_ã£ûFŸh9@÷ÝÇoÿàªùÍ?ÇþRÊ’Ë™•¥]}Gï0+gÎèISàœç+ÉE†ãìßOú;1fÂÎÇïœï¹B��1hãC9R ¶SzLµT²Ü• �,Ün`–u}¹˜áÖDö¹M¾µg«½a“K&|¥t'!=b-}üöÄrçßÇÁ|ábœÆOê|çcV–soøÑ�~ôê1�yŒ¶Ç>ö±«G<â«=èA«›o¾YÐø<°úò—¿¼ºÿþûW÷Þ{¯à]wݵúüç?¿ºýöÛWŸûÜç´ÁÓËÕó©Kgùññ‰×úè¾~¦d'IŒKÿpÅF‚æl?r¹àôIêã6A„úàñUqéc‰<%5[j ³ÎG~Ó�6ÙP6 :CÛÆ"í±¾LDX^¡‚nlhT#ÁVjüt^‹‚Lø¨H}Ù´~FëEˆÔ�Uÿ%—F0¾4ÈöB7MÖ•!}üéÍk5ÿíÔ–Ì.f“riüàÌu:Ž×nùSŸúÔÕÓŸþôÕ-·Ü"H¿p!Ïeù�wÞ¹úèG?ºúÈG>2l_øÂ¥¾ë™xÀ©H =[¤œ!A‚“„ò«~‘øã,_9+ÈÈ‘èùók„õ­€¸$¿Z"ù“+×׿îqb=!‡n„†2â|¾“»ÌŸ4ê–º´8šh²F㻌…!96ø'ý[ÎжÙ~Æ-•ZÙ"÷îúS¾�ßþKÏŒþ:–ù�~œ´™c‹YÌ|ŽÒü§<å)«¼à«¯ýÚ¯UòçŒÿJ—G>ò‘«ç=ïyÚÜWn½õÖÕ;ßùÎÕûßÿ~]=p[‡ûyÀ¡Œ0Ë/ü9©£ÕÉs8£'›qðõ?�¸ap‰KÿÜ&ŠêÅB(ˆ–\”g7žpK»d2I E_fÐj™è•ņ vÑWR6r´ˆföàkùóŽGÙ[|ƒþ°%‡˜íêfìnëÎñ•v¶Oûëã?Êù__  Ó,‘%-êS9Ëy8£ŸñŒg¬¾îë¾N‰ŸKûÇP°ã›¾é›´qûà�þè�Vo{ÛÛVïxÇ;VÜZèe()eÎ#1)¸TjTr‹3úx�q Ûé/8ª�œ ? L ê"©��âܤЅiI±l2d[žUŸ†}Ø”P². £ ýÕ©š× Ðb!ÚðíŸ!�Oå5~y@îÚf™ŠÛ”ÑÞ>~CåÏc™ÿ~`óX>J}êŽÁ”yÙÀåý¿øÅJ°O{ÚÓŽÚø?øÁ«¾ð…Úî¸ãŽÕ›ßüfm\%èå<ಔJt7ú©>H…CS. N''I¹BÞŒÕÏ À((SH`HÖGSœjÖ¥3pAñkÙØH¹v¾Ÿ>ÞRþ\…$GfˆA¿ú6MôÛØ“ŒÝ‰7X€pŠuó@S+ …ºM=}üá¤ôg.¸¨–q_àö]»"C{S<××zþk4�eóEû€ùÎÝÞ–óÀÞ·~ë·®þâ_ü‹«‡=ìa{ë»Ú õ¨G­^ñŠW¬¾ýÛ¿]·þçÿüŸ«�üãWÛŒy÷§•a7ó=÷ôÇ�Lbçº?aú‚5ï@¦FÍBÀ¿%0ä:É¢à@ B¢©¶…�ƒ’†wMž’'‘Hg1 +ÚÀ°E_ð»újù½˜°ý(7�.Í Jƒ{¬–§É4øekAê„èã¿”O忱:Ìõ0½ø‹öâ¿&óýϸ,iÐßpÊ‘'ô_þò—¯¾íÛ¾mÅõ¾…'÷ÿø�ÿxõ‰O|BÛ'?ùÉÕ¿øÅÕ=÷Ü£íâŋꇾXh<á OX=éIOZ=ñ‰O\}õWõŠD¾OáÙ® ð¼Â[ßúÖÕë_ÿúÕg?ûÙ}T^?²L9÷rrÖ¥oêüó`€ZؼߟςäYòá° ÃìëY‘hR1„£Mp%aIu(Z ¨_ô§f�.[C±ûÏEÊ´¯ª·ÀvÒÖâtC=»Ë~E+‚xoeÐ1”h°ÍÐÌgØÇ>Ávðº­f_Îfþ‡a6È’³qúµ2”{—ßð ß°ú®ïú.}}o;xZŸûð<˜Gòçë}—+wß}÷Š�Kõ·ÝvÛÀŠMO~ò“õÐßK_úR- †Æ3"èzÉK^²zÑ‹^¤Û¿üË¿¬¯žQÍuÅîdJPޝÑÄÙ< ¶¾ÙA|Ú¥x@ê[\ ·¥$¯ ò½rtèG�à%:çߣRñ=3ÁG[4gt¦-E†Xî1w»ØItAQÿEpCAú†Y´ð²‡ãkkÚc¤nè¨ôÜ' ÂÑ™Ücc&ýMù=.C÷ÝÇŸþ»ÚóïYœ3\Ì >˜õ©›ót\9Û÷¸Ç­þîßý»«?ûgÿì^�|èCZ½éMoZýÁüÁ‰Iÿ41m,ØÞð†7Ⱦ¿ô—þ’žI8ï·nºé&=Ïðüç?õš×¼fõÞ÷¾÷4¦\·<ùÁ‰4é”×)©Ô3< �ŸöOÎ|ù� Ž&»E­] UºhÁ¸Yœ áhqUÆ>ô‘¯¤,eÁ›´T=íß<Ù:Z‹F•Ó$`úÐ8‘Èñ�FÚ¶Ô8í¿�Ÿ¢}–._Û{® ÓÅ ö±ç:ô9ô37šÃq_À¡4¨5ål¡:0x}IKiÍ;ÍÃüZg‹,f“<Ìãlgã þ²—½lõ=ßó={]îÿÔ§>µúÅ_üE�ñ_!3¥–« l¿ök¿¶zå+_©Kûçí�oüè�þ¨®üÂ/üB¿°Å‘3Ò7a-Ï| Òy _±²šò¹–ZÔ>Š™^4(8J2°üHRÕåzR}v^]4Û=d 5-M·`AöÀ‡o<Ûݯá–á—…Õ"³Ñ‘uõ¶Ùž©¼m]ן}Ãkº!�õñã„òäÌçz<̱¾„€'Ã9Îñ™‡üþÎßù;úÿy;¸ï¾ûVÿãü�õ_ͯÜñÁOÿôO¯žùÌgj <7pÞÂè9ÏyÎêÕ¯~õÚí‡óê[šù.mܽ�d:&¶Ì…ÔE#vÃ;ÕƒW/ é|Ðz²tòh%V'XëR¦p*/þ6ŸL 9«±¤LùÕI³;I¿û1”™î”~ñUœ-ú sÚßTÿ`h,þò7f¹éü¦~dÆQ�X¿ýiRŸ·)Sÿz íl_ ˜ê›c½žÖ™£éë6DZ/—�0ÿÉ?ù'{%ÿ?ýÓ?]ýëý¯W¿ñ¿q;oÿÁ~põ/ÿå¿ÔdŸ)æÈ�ýØ�íuE¡qï"Q…Áøã¥À#¸µHVüé?ð$e�Ÿ¦ ÁRµõ�Û€ü¡ËPzƒÝIÚ ÍgØÊBã/%‚§®„Ök(Å“�Û€-n6'z`ú$“ÿØÿh³eZ˜6ÚÊ>~|ŒOÒÛuï;øÿà諃çvÌ ·N�Z|Œø#¡g[ ó#fþ ÕQã,8„3�ŽÁ=5Z6aºÑ80û1DÅP•vëÚÐÄŸaÚ%mM:¸í›BúNþ™qóYÖú’«�?ý0úÎþbúÀÇb~ùD3—^g+çÆs Oï1ÿš‡ì³ÐÑ¿€ 9ïxÿ÷ÿ÷g2çÑó«¿ú«ú*Þyd¯¦ /úÉŸüɽèûú¯ÿúë~@@$­óGaá7QÂg®«3Éd‹Û3˜Z&¦t dÔ:PÜ¢æêÉ),mÈD™ºÇ¤©*Û‚PZÁ­=*ê—³ùØdgAðÔ™|úç`n„ÓJÃôÁHƒžcn¥éÁ-m«ˆ±kµäX¡Ù.�9j@á}üƒ†y¿Fóïœ;ì €¹Ï`ØÏ[ðøŽÿúå˳ Œwêó*ݹ”»îºK‹€}_ýË"àoÿí¿=—aÜNRP~ 0RÉ26=éïÄ9œÝgb"Q 3Uú™�‘GíÒüµI0å¥d’2óø�„‡2$¿‚Â%” Zéc„Ñ÷$AÒ'4 ¼†£œõ˜'aò�´’®eˆ5Ø®„ÝêW1T¥]ŒcíãoËO£OŽqþsBç½ï €yÏßêÙÏ~öêðW.ÔÛÛÎ1ž÷¼ç=«×¾öµç�¼¶"\ ø©Ÿú©o%ܧp;à[¾å[öQ1[Y§ ¥'’e³©-ê/å R¥ mJTAã…M°“Æ„:÷ YCéEýC±>`lj+(Ù ”T$CªtG‹!8̆à’-(\ÜÅ(¨0äfÛ�ÂC›!šsÌ Ái3ŸlõÑS?>vÑìD~7¬y?Þù÷æ 美&­ôç=g¶žÝüÐýÐ^÷ü¿ð…/¬þëý¯ñ“¯ó|„‚W óýþ“^E|’s¿û»¿{õÜç>÷$¶Åµ+{Ù]¼õ�?Jî!&¨ ·¬Õ žÀÍà-–üq vA€.ʨ×}�´­×º ƒ?’ªä �&CLQkAáð¥ŒÁ"A%çh34Ÿ!ü*†Q)m‚¶ÓP¾PŠ>€±¥m [ÛSñ)ô‰1tUiux܆| 1€ÇaØÇ¥ç¿&iæ`î €ÁýñÁ?9u¹úýðÿðŠ—ýœ·°h"ùs&=çò'ò'«×½îu{ �³XS�üã÷Ò3;aI„ <Þûï[ú@ÍWx;€’ªI*$Ý(å$®„H.¬|E+‹¥~u� QÚ ¥W²ØÔØÔwAÛa(1ñVü²/ð´4ôÄXDcœlð¶xµKwàÀì§’Š0Ø*$õ�Vÿ¢‚»D—*@º§R0¹úøí‡t 506ÍAÁœ|˜¸R|†Áweç_=Î~·˜@$³æH˜ý¼œ8€¿õ·þÖêéOú‰|—cxã߸zßûÞw9–Ù´ñ ?L´OyèCºúûÿïïu;eŸþ¯‰,±µ‚¨>B$'>J  ‰ë‡€@c•@³b²×Û"”'Í\1uCrÃF?R’„] Š€,A…sá"‰o¤e?ÅKEÊ ‚! - £i3�$mì¯T„Ò‡,Ec-èqÒ±BTÁ>þœžò.…`(Dó>ú3ÛrÎ[ÜÇ*†9.J*Eà�ó_ªç³¨é�û|œÊ~~펯üíS¸tÎûö—T~ögv¯á‹§>õ©ú©ä%ùåòcÉKÖœõ+¨Æ¾Òª¹8ˆ3S‚1Ášä�ÔùŸEƒ®D'¦)Ñ]Œ†µÈÈ(œ r¡[¸u!³mÃBéÃÒ7oÙ¨$ÐânÇÉ—mðh0…£Zã@6d ¥'ø 1ÞÀ>þr*¾Ï2ëù÷ f—´˜çMì3@{ØÃVßû½ß{F©MöŸÿùŸ_ñ†½%5¼Ç`ßòWþÊ_¹în I?œç+Ê�$ZZ$?]Þ‡.*YôAñ)Q’,/³åt†¦Aö#9Ô"_ŨUB6Í<ëвÀ_çÚYÃ& °ì ;6„Ï8ð[;æd[�[ÔOš©NJ;柰íªöñ§g¶Íÿ.ŸÍŒ¾¤ÀÌ\>sÿú_ÿë«G>ò‘ç.©?ú£?Zýáþá^:ŽUøÿüŸÿ³úô§?½—y7ß|óuóÕ@%~ò\9Ýû�¤>^Âz$2’écøº dm<€è˜(}&¯DéÀ¹ ’$is²4nþЭv`÷”M¶- û5L¹JÜ,T´I »,ôCqS{hƒVÅXŽ=‰¦©6Õg½»à´?øLkuUÿ}ü9_Ç0ÿ5%³KZÔ§yös²s¼ãßKÿ(ŸÓ÷ýw:cGßfø_ÿëíh==ùYÏzÖê/xÁéæÊÌýå%ü:ËW2ŠAdAÀ-€|�vÈyéßPß%`’XƒC=ÔžÊ]è¡ìÐç¾�`wq_î [Õ²ô•ñê_ºwè·Þ©>è¦ à mãe!ò”FO«Ï}ÛXÁ]ÜpÛf]Ö¯qÓWúÀ¾(ÿË·�·>¶¯ç û`F3÷=ßó={[û�|`ÅSóK.ü�Ñg>󙽇øŠW¼boÇ®€t¡ÄOÐ'ßTBWúÑ.¯(‰ÀO[B E‹ƒ�Up¬5é >C ÁG)~é \ý ·p·[7�­µÁv¦ÚÔo~jÂ�É0@õÁPBo]ÞÆY[Ø4ÀfüÖ�,¸t€£½ põ«žé=ù ƒO¶lñA_´I:‹ÏÐã6LµÙ—í£&Xýª�>þœ“šp^Õ<.!Õ1OóÜK_ÌdŸÿüçëµ}Í}ÃÞ°¯Š£—ç*Àÿþßÿ{o;Ÿö´§­ðû¢‹I5òË ñ’D宂Ô3édR£ 3‰?`”|WÀzpÌt [ý)�¬ jˆŽÔ”œ6CóÂ?-n¶øÀW¶*Ù.ž‚‰—ýtÛè‡{ð*�D†:Pò!fHŸAxôÉGm?ÝRª{ñ�ïâs³sß;ùÃV`Ùm(Ù öñ_~þ·Ï]Ì Ü:ºg=;�ÿÎïüÎ�m§màÞø»ßýîӲϚï­o}ëAr<„ß�Ú‘™£dbä%ò�’@^Ò“�¾%àÄ|N‚!�·*hî°j´9‰"»–@›¤„!â/h>ÃVš6ëÆ&ž‚²Óv3f6Š!((¸�¿¥�Û÷�,ø®â6ó·:¤;d CQêòت YxZYë£gáÀØÄSPzcx†Ã¸ûøÃCYä›@�ö“!þ2.h¡™ÃÅ,âÀßýÉ›ù$}í×~íAÎþßò–·Ìܧ7ÿž{îYÝzë­§ØÁÉ×o¹å–­ó's–Ê'G}‚2ñ�ÐÉ ÐáI>¡=¥*ÁGPœn¡I4 CU&;VëÁÑ0„�bØânÇ0ð4P¶ƒ3�ÃÐã14O Ýlqó`›ôm»Úb´†·!æO‹ÆD ð‹á0î>þÑmö�í*Îÿhļ±¹.2š¬û~m�c¦µoþæoÞÛr÷Ư§ò»¿û»îK_úÒƒè9F%™ÀÂ2ÓÌuÒ/ógbÒ"¡’ z(†YÑž¬¯MÉ,p'8ô‚õG¢æˆ>þ ‚«R1Œmªßý¢Ký•~ãnG%ø®â6óOõ!'{­àû+º4föØeXã–¾ŸÔZ§:«Žª]önû¦pj¯ú.ŸH6Ô–æ5à6 ÛT̲×R¶u‡}ŒUzrÔ³¿‡8w8×À†ßãÀóá¶Ñ6gïûÎsž³÷xðﳟýìÞz椀·Þ}÷Ý{›ÌO-óêå%–!¨“øù׿?&>^$üLPèY@ (º²qwð] £=«Ÿ¡ ©þÉÉlCÐÂÓfµ4j @6%›‚ø­DúRá.{­ÇpS_ú53¾ñ]þœóüçÑ6ÿýbq�-rð’—¼D�kßCí]ïz×¾*f'ÏÀ‡xÕ1/_úsîÏÍnü§1˜dƃ|@Ê¥ø-€LƒU�_ö£@k¯@ÎàHªñW*[\ ¬Ä0;YKèƒ ! >M- \iư:iƒ@&  ¹¸�|à’­>Z\# :07”ާúh5MœÅŠ ©AzÇÊØûøqÙè‡@™ Šçä˜ç_†.`·„€Žš8hÚ�Ú¦&‡ÀïÕ¢ðòŸë±¼÷½ï=Ȱ_øÂDϱ)á˜wýgBŠ�Ë·d$I2¯ÿ�Îs�GÑ>IÃ|ôÚÛN¸âC‰‹?¡@áRP•ñìy”id²M(¬ ýþÃp Ã�!&Ø`nȃ±s„->¶�6hä 9Ù—ú†©/uÓ·Jÿè‡ÙÏÍéÌÁž¼\Ÿ=|ò“Ÿ¼zž°÷8¸ þÑ�~to=sTðž÷¼ç fób %å°‰3“£ä£DbKœäžx²Ð¤ÄrÃ-€ BÓ­‚RÜ&`ËŽÐú2ù} ›T‚†è°n`&Þ¤‘˕σÇ0ùÙ§ë1¬–Ãøå˜àC[õ™öf’ÏExÚ°{RÊÐǟΘãü7Ó8ct1 €øòi]Tá͇(ïÿû‡`y}sÒÁs_øÂö6™g1¾ò+¿ro=ǦÀ 2ÒœL£ž‹�1yæW ÒãG,kc‚Láü™×Ϙ[Zâô�¦*F�±©­ ù ‘°¨l–,ÉX-R� „1!Óæ…B+‹Ä¶â¾€‰¯�'eŸ”Ò]ü­ŽÄûøíùRs06µ4Ÿ!üí&~5ç æ_³Èûü'¤Á³Ÿýì¶znücûعe— xÛm·d˼ �Q×{>Gµˆd‰ÛêÀQáv€[¡ç’;$ioì$Ïs©e„›SàϬúTgëgØ)‹eèÊ3qÔ½<&‹LÚ‰;‘£Óz éÃx¶·}´xòOÙ,(<Ço{Caû!kí>u¢Æc»üx’?y·Ú£¾<†q±ÂØûøsNí‡õ¹Îãk�6ÎÅöùigr¾øRžÁùÎÄÄrÔC%œ�üãí×WõPã?Ô|›÷ǤNÒÀºü8÷3ð©YÁ“ ‚ùCBÑ´ü‰  ¸T�£|]?jUÑî/%哇d¶‹?¹Ï¿Ç.Ê)ík�nÃÒ^Û=Â>þôÅ)ý;mG7ÿ>Pòp™ñ~ÎßmZ›„X¥­Õg<'2�ûÿ<}~ˆÒ¯æ ÀŸøÄCLÇqéˆ��~ì'¬"u_ŠLî§ý14?TNhð^�ýP8ó%ñëW¥'*| ÕXÂàþd’$Õž nÊZ²Ét« h.Æ×%š‚Ç2ð/&U­${�¸|™(˜TO6/ìnúÛ>š˜ƒÁˆ3w’–A‰ñÒ8©öñ¯ÏÇàö�ÈÔ�;gÓ0çÀlœ|CŸô¤'�GlCæÞ{ï]Ý~ûíôë‰ð‰O|â Ã}üã=G¥$b ‰ˆÄKÂÈì§ý“š‰«ùÞ´Å=~$ôz`äêL¸ÒŒÚà–Ê §Ÿ,yå�„gIã#�y�iá¨öäpl=uŸ"ðz\Hú¨V'y…Ã6´=—DY2‚AlVÖâk´±ÒÇŸ38Ãù÷Ë,Ϻ,f—Ì3)Q‡xú=Ÿÿüç×uùÜç>w�ñ?üá_=ô¡]}éK_:ˆ¾cP’÷õÉ[•NãctÃ*ÏòÓ¾Lˆ,t¦¯EBæ9RK�\dbË{¬§ý("Sýª3ã–_oŸ&Ì\¬ä¢ñ³&ð©¾ô‚mH�9Ò´gÝšÓô§A]f·©±íoÄáËþFÁƹq»iØØ­÷×ÇŸs�~ÀY^ü¥¿Çcsûüo¸w†„¥<0C×_ÞäC�mâ øË[zü­| òþûï?ˆ¡‡š—ƒs%•dâ´žïûgð£lžñ_�öi2ÊåA&,ôä5Ó؈»=Õžðä}ê5b94`Ž¢ àë}®×Ò‚Ôd°/BÂOÛÛ>Z|Oò¹žöfÏ-îö12§+©#­ÇÃmö´}‚§u†ô™øhO;æïãÇGë>>Ýœ;×’±‹)‡ºÐyHÜqÇ96ø:à’ŠÃ|›üœð35Åž«þGÆ´qÑ€ÆÜò™a³ÅÝ>…™ŽJgh¶~óY0ñ1(cQòšÇÜ)1R™Å¤YÿºŽ«FÊ˜Ùø3Übߨ§�¿õmzc›¿Ý’p.ó¯Ã›á, ,i°€é‡ðèG?z¬ì�õ@:ïP~xЃ´Çl£( —Â>ÞëÎÉœ°¬@®é«P$LbKª ¿Àÿ�u• ƒ8º2Y‰s-�fR•"éLŒØÐe˜z×ùÑI‘në5ÔxÖùS+ÙCê¼Ì‚Cc­±ãþ OûZy(•[Úl²]†âY·«(i]¶õñ§Ò¯ëþJÿí”þ=äüçLÍ¿˜gâƒéÏÏüg%Fð�‡<ä ãà!À^V«/~ñ‹qáæå ÆDIDO—@ùݯ΄Np�ÐËÓ~Jm$³ú¡GxêÃvªù\B6‘,võ’¼ â» ?œØd‰©½è°Íà9î ôñ§;Â;‹˜ÿ\—jLsß-f0÷‰˜Ú¨3Íûî»oªúº¬Ê‡š—c™„1©U¢ŠËý$HúÿÚ_¥<%æh¼Db�¿\$¤œ ,ø#ËFqòmnpï,'%àtú¥fÜíàÙ‹û5ôbHa ¢¿�áIü–µ¾¡ë2§�?Uöú\®ßº›Ëüëª×ÖÌ�ØG8g7ß|³Þ¯~Ó•øa˵Ôq(?,m D^ ;çÇÉtœ­LöqU€³ÿÈ­°“ôX$Üï/¾å “0òë ™ï¸@H|�ϼíü-Úä‘z­ódý“žðO´GŒ»ÍµnÿÆ‚`bÀ‰ýõñ§³í‡¨çüߨX8sijˆ×b&åÁ~ðÁŽ¥C%¾ƒt�ÊüðÍ’Š“Zeu�ÄBËd·ÈöñÉ"yò#?ºÌ_—ñ‡+±в!ø}á$t +u%ÿ¨9á«ðQ|Š«êÅ‚ù§íº´. ”tDQÂoo9L ²­Æ¿mD¾+Cÿ¥W6Ââ NZÛ®>ªÝ¼Ö·!ßÇ?‹ù__”päÌ·,f0ß)Ø´œß±ïå°8Ôץ簣;¿6’G[œÇGðå¬þÒê¦Hó*‘�œ´¨û’¥Ûàoèm‚DÆ’�_ .x†±-'$¼i‚´-N ¨Z ÆJæØ�êÙ…@ó†q,­|˜7ߟ6¿Úö‰¯"¨Íº³»�CÿÄ_ƒ§ Áoø÷rþ‹ öñstó?Ï ëKZ4ÕÎDcò¡ÎVQ¹´KÖ�›® zȹ¹&˜tJìÕY~@Î|u†¯—eØ…&, xà­¨­]ÐõÌ@H‹§Y@8 «[{R'pzNr0 y'C™`�Ñ®QvŠ¿pé@¾x‡k…ÑBt»Ê ;jÆ §öL|¦•²\|X½mR&Ðcµ½Óþl‡aù°ü{µæ?�“™ÓlÎr·¤À,'`›Ñ$ÌÛÚÏBë €ôÖ¡ü°´€"»J†y¾•ñ�‡ýˆu\ÐÙ¿%dhñL±—³Á#yéÍ€Pôô{ë¨MÕYAˆ:�âd\ñUMˆgké ËF€”�\45ÆNú Bc! ZŠoplðklcÿNĆ؟I¼öñ§O6ÿ^ßr ͽ,fà 0÷ ±ý$šC$­Cè°Ms†‡z®‚· .©(÷j—·ã€‘HýU?FÊÃc4T’§]@’#lBëÂÀŸ|NŽNàˆ'­ñh²Š°Á�5ØQŘ!Fù,–ÍBÑ-ÁÔ¨®dc L|y!zMù(PÛØÇŸ¾ÀrKøÉ>„0Óù¿´ {´‹YÄát˜w½r`A¹ë®»úà€óÀ7+Q÷Û CÒ"Vç%ìKñ�³Î¦qXÄì|ø/ÎòýÄ?«q*¨Ã¨„ÇÒ”—°‚?ü.#žKŽè³îHòä Ûèô9ö%”XÑx†$!ÊØ{Td/ü™ <A5ç½O.6íSåKM '{ëãŸx}œ��ù¬ãïØçÿÒ�7,æ!­Å<ÒÒâH[L9ÔØô+yHÊ‹[„{2oU2­„NRT¨Èåÿ\8±#SÉ÷¸aF66½,H¸iÀØH††�~‰F3|(®ƒª±«ªÓR°ôkD9*�nй†H:(¥ûÀ�²/qÆÎÅ0+Ió¸7!Áz ¥?inŽšš�*4PŠAÕØUUˆi)XúûøÃiÌ%Å0kë{y/HåQæ¨ùI|:ÿqì/&×,é Àb&…ƒôP ~½®—Õê·8<Ô+…�fNt$©”z’?0}ß¿ ôíÛ¼¼<| 2â# ™È+`r>QA´Ú“Z”â¤ÛwTò,fŠ[·ËgB;Å>Ñ¿Ñ.¦f7å¯Q¥eæË‘ªcÆàæ5¸1¢h5 ´l6-Y“ ûøÃ7¸9Ë‘ÎÿÅK‹¹ÚÜ>ÖŽ Þ~ûí±è±�}ìAôÌ]É!®°([Úׇym’Óð_Ðt�\‰88y3`|EU‹€Hl ÏȱE©å@æþÊøáûDN=Òù³s²¹˜@8‹™þO}êSú ì»ë €ôà!Þáÿ±�}lßé8:y]®¯øK¼å^4[ZA™›ù¬¦[R›î!òÞ %¶X0@,}‰¬¬5!ÌmB5¤LÚ�œ0§÷ä¡›– &û‰¾ZÁŒöª½úEtb�G¤lö·ÁÍÌ@IDAT\¦Id}·aOŒÛ48�£ôñ§Ž`þ“kæ¾BM|>sY†ûG>òÀÞåQ�zÔŠà–öõµ³8†·÷}ÅW|ÅYD¶òÞvÛm[éó&Æy{$r gû,Ú+$AÝ}0 :6¾`èÛy;!=½SÚ�”ÄŠÀŽŽOY”Ü%Rú¦ {œ´á‹Í}]4ýMN0ƒ9¸iRŒ—Œ¨�Wk4×øšv�Yâ}ü‹œÿXî.f ¼öyïâs¿¬+ú§ºúò—¿¼÷¬¤–öögu WA.\¸pV± þ�~ô£´¹HfºÌß$?]ˆãFiVÉ�3¡BóF²Gß q*£ <è†-M[µ(^<[<[‘AáÁg¨d�J̾Á�4ü‚p56‚K‡a3~�w Ñ¥ñ£¹¶ºwöW6(í˜[<[ûøåãp†æ_£ù�7c°`Zg_–²`"³*c0|ÕôP çq�{*¯ÛòøÇ?~ï±3øÀöÖst H3ù�ó¬>c›#œ®!¡ÏÁøbÈ“uÀ‰; Áº!¸»!<ÈÜ–0‘ÁÉ7Á¸Û§Ð¬@ÆJ6}Ë.ìˆâÄ î1zÜS/´A>ê’Gx*´¹ÉW}ˆ¯±{d]A�Û0uõñÛ8Õ8pÛ&÷³s ߪckç@x4·sþ/.çd³/tDçî}ï{ßA ;D<ˆ!×HÉ!Æÿáxõ¥/}é�à vK²ªæ„“÷û+°òð_%7=Œ ”¹”Ϋ€3‰epW1DwáN¤èXK Ñ{`d묺 ø"Ì’^�Ù(†àæ@á ,0%- (~hð€7œ”m¨ô�ñFä†lÙ•èh£lGG´£CºK_!XcI(¾fÌXÖÒÀÛ>ÀSgBáî'`4Š€ð'EP8üЊ¿ÕÎX =nÃaÜËÿbN6—°Ð‘€E=Àçî�ï|'`ïrË-·ì­cÎ žð„'ìmþ{Þóž½u£øøe¡¦®ûýYK«…ÌcKÁŸôn!€“ ¨Aî Q 5Já@mEP�5|†Ûø×hèÆ°‚àê×PúÓzaƒÇð<üØ–:ÒÎ>þÆÌ~.¸¤ù _ˆ™=¾²˜U™]Ë-€C|ïü™Ï|¦U^—ðWn½õÖEúNi2ó®’¹R#‰”�"˜‰r|Ð/;÷ýàƒ‡D˜ì%7È–ŽhW7•x£É©µ$,}Ö«V4F¹ŒþH6Ø«D8º3)»ŸJø¡ƒ¿LN#¿e�ÚÔÝØüëWò'ÁúÉ~�£4‡�•?å½À5/�ñeApùÑP²ö«Z£…’ý$Z¸õ_µù8oŒ‘E³Û-á €œ÷h·àqˆÄÃ3�|ä#gwpÊà'?ùÉ{©úÄ'>±ZâWqJ¦ÉLjDcg’'‰�v‚j¾À–†Yˆ'¾ea>CdŒÙ8ž …�áÐoÉ¥lÊ•U¨Œ’ö+Û¬¿¥�c«!8c5§ Ÿè/v©­ö�aÚ;Žy«¾>þEÌÿÅô @\LôŒËRG.Ý;ãyØiúïüÎïìl;KÃ3žñŒ³°/†÷IOzÒÞ_|Ë[Þ²LBöm$ù6)ÒÆ?—ùõ\¸”D \0¥ª¥Ñ8P¥ld2å:-jê« 8†Â«?Ù,»é:¥Â,C*�¿´7aÊ…¬äÑ‘’†kÊhŠM,ë“&æMû!¯ékÇÜâ;äûøÓøA¾8’ù�9]L®YÊ€ò=õ9Zà}‡x'À3žñŒEùå´ƒyÎsžsZÖ­|<ðÀê÷~ï÷¶¶-�¨³g«[¾ìÇI+oì+aCÎt+õ)7F`Ö퀠9ɶÉwðSð©[¼Z™·üÐwØ“vcZrb«ì+è1¢cSÞzÐ�†à)(¼’´úhp1ÆŽ±R´ˆÙ>þôƒýhXŽÐÜÏxþã›/í êÚÜö‹YÄ-€E.8 ~ë·~kïãêÙÏ~öÞ:æ¨àk¾ækö2ûíoûAžÃØËˆ+(ì™ÉÑ5bÚˆsñŸºJæÉL¶N¾“[|# •NÁØ—¬`‹ Ž¥î„Ûôµ4p%à‚N<†t1åoiiÂÙúŸ.(dCøØö•ºcߎ¹Å†³õßöÞÇŸ¾ÇžwC\<õWKË)8�ÿc±»˜\3÷@F&w¡W80‘„žþô§_w/âå?_ýÕ_�Ÿísì9›ûõ_ÿõsHÎGÄRg±a6y‰ëì3G³®QUŒ„ŠLÒ8³ê_¤f--ÍtÔl³¢yšÏð4ú¦Y'Jë1µœ…äaŸÙb�¾ÝÕÞÇŸÇ%~ð¼⳩?OëÿûWô€¼wD»ø‘–ÅLÊÔ­¼ð×~íצä3×_ô¢�YfηÜrË^¿È˜¼‘ñz(\á&(:X2f§u_p»ý�LÎ>]Rƒk—ƒ^@hñQ‹ Ó¶É¡™²n£­Ü”hƒ|‹�œ–¶xrœÜ_+Óâc—Ã<Ö>þðôŒæ?n8×xÒ™æ¿Ü´UÛœ¯´�ãçÒßÒ2+< øéOz$œ»Þ/~ñ‹Ïá¥áÞÿ¯üʯœ[~~‚ãÙ±mwRÏ'¢=žT"�p�1‰ Y8,i𡹀¡Kl ½˜0´D ­7{È>LK¾uýiFÐ`µI†pe;ƒuý›h»¥"Å0këûuûúøñÎüæÿ�àOf‚ý Ëœk½èÀ!ÒW}ÕW]7·úЇ®¾á¾aí9K…ç.®�³ÿŒcœ�‘ܨ9ñá¯ñ,˜ Á:\0)ÿÓÊ™›r^Êo�‹hMÍ#Œ^”¶÷Óé7 2˱è¦mê—Æ â�€�„FôJ�¥âmè ¥RÜ@tµ4peØÇ?×ù¿ÿâw3»K(KXð‰ºtÏ=÷|q r¹1üþïÿþêïxÇåX.ÛÆîz¹ ð²—½lõ =è²þØÕxç�w®^ÿú×ïj^=òRãø()_Žý‘²Æ 'Á`LŽÜX, Ͳ´y šZ>¹Q€-žTöæMù€lØ`(ӂͰ$ª#t±ÉØ‚Ó\°ÅÅ×ò¦|êÇo_¤")}†è6žòPFZÖÖ÷—çïãOÿ\ëùÿò¥{ï¨yó„­OãŒjKXhâ¬Í“2#÷ŸÝÔ;î¸cõ³?û³g, ~ø¿ñÏ-?Á¼àç¾Õñæ7¿yõ‡ø‡sæAlÌ{ù©Ê)Ïý%•�oü»!¾ëžgþ qþ­3w OþSÀ]ÚËú-îö³Bëò§ä_°MŽÖÛö Nar�eÁ á«¿Hã“ñcÅPx)Ï>«}½CÉœvgÝ@þúø9*ÓWsþïzàÞö Ài§ï(ùæ¾ "Q.}êSŸº.®0Ø·½ím«ßüÍß=WùŽïøŽÕÍ7ß|.Ùc⫯xÅ+ÎefC«ŸÿùŸ?—ìl…ü ÒœÄ ZU�]\àLŸz»!J�_ ä›ÿœÝ¦ºÂUÉÛ™<}‹ ÛÕeI€OvKµƒUð/H"Añ§1JÖô?ÝZ ²èÇߎ¹ÅQ¯ñÌ®F e­ˆA«¾[š%FØÇ?—ù¿óâr®6Ï}�ŸÛØß~ûí÷Ä*ðËaáÈ/üÂ/¬ÞûÞ÷žk”ü.·–XXÜ<å)O9óиïÿS?õS+¾ry}•º¤ƒ&}‘è‡4–Y-$±q#ÛéŒ+h\¸!¶üùà1 oO ™TÇ3bú&ÙÒúñ|Bp%ׂbk’2ú3_ ª`òçØ¬ [žÄKfDiÏ*Ûñ§;ðê6j}üøB“€/Tñœã[ã@yo€ÌÍ\æÿs÷Ýí«ÍyàjÌóÜÍuÐ:~ÀãÃÈ¥™ë¢ð­€ÿôŸþÓ¹¿ø­ßú­«‡=ìa‹ò‰ÿÛ¿ýÛÏ<&î÷ÿûÿïÏíË3wxTˆùE!&;ñæýþ¤ù@„íàÉ�Žã€AU*,½Ò8É|H !¯Š:— ÁÅ_P|…ÃÁ&[ Jµt'=Ç�~Ì´þJC´ P|(ƒ?7ÚÒ¬ì1jâò‡¸¡T¥xì«´ÄÀ5ž‚·a?¾Åï Á寂òSá9 9ÏàÛæÞón˜zc¶¤¿4h~Ʀ¦‚žwÜé”ûÔý_`PR�%.dn»¹.ìg&�¢Éˆ×_7·4þÄOüÄêsŸûÕ3’ÿÿð¯¸d¾„Â8~à~àÌã‰H­^ýêW/ö×þN3·ÉbIáTUgöÄÆ «%ÔÅ™Zí¡Qç ¸ùƒxòÛI3µU’Å/¸åá-µ§8|lCUPDI…ØÔ8¨nqFÔ|ü™?Å0ÇüÐêϲ@m±` ¡¦ø§Zq±£Ac-èqJåôÞ@šJ{Âø08Ð��qjLÑ6À²£�?|Nb“¿¾ûžÛ¸á¡ù—¹/˜OD,/}jþSr¶�üÿÝ¿ûwçz_=¯Éý¾ïû¾³ux¤Üßõ]ßµzêSŸz&ë8«øÏÿù?¯Þ÷¾÷�IniÌ™dUE}}¤×'+Â^ø‰DÁÏÿš…3)ýP@%�d>úgøhJwö“IœVCpú ™§hB¶î’'5¡+‚Sáf´¡!yFYëS#;˜bƒÏ0e³¯>þôS”3FÁq”t îÏyIj¹49f0ÿqŒ>ðsŸü�Û‡A�ƒdp³+s_´GØ*Îæö{UÞì¦/ þÌg>³úÉŸüÉÕç?ÿù3�€—å|Û·}Û™åŽI€ûþç_÷»žžøß:g Ê‘ÜHñù?$D>\JzÑÀý¸* P;ò3_·r[ MŽï×hJ˜ÁlèE…!fÐ6ÀÌ©c«á˜ wÂ7;º)@õ솥>ô›;û§&;¢iÙu $Ç2òÓ-™F|Ð×Ç_>«ù�Oã˜ÀÏlá»ÖÄȟѶ­´sÞâæ½óߥ>sïê^>‹(s_0 úLcpÝ]ðQÈ[ë^õªW­x’ý¬å•¯|ål_ij õ¯þÕ3 ™ý~æg~fõÛ¿ýÛg’[$³’c~ˆø$]$‰q+€OU” ¢i?è—%ÓäŠöL˜’A®Ã$X¯Â|F}B~UI°àJ´�+—LœDÚDß°�þ¢@si“‚ì CÉóCJõ„©ÚØ�ã.si�éBb'Ö‚3ÌFŒ‡»4À«ÚÇŸî8æùÿò¥û8Éd½º†SŸMYÂÀξ®8�Ûÿæßü›Õ‡?üaûäT�Uöþàêës—[qŸJÙUdzùË_¾úkí¯�©ÇÏ~ö³òÑ[Þò–3É-—9R¢É5¾Ï¸Þ :´<&HðɃ/H¤EÁˆØy; ê$Ù’UnƒÍÜ«Ø €VUäİÅÇöh^Û”ý¤ýà$Cpú2”-¹‹}ýÑÀØ`âb<0Оœ±z܆Ûô¥ñ’@Zÿ,Ûûøsä¿Æ'žwÜ“œxÙ®Æüß{IW™™x6ŠaÖf¶_ÂÀ“qéÞ{ïýäÌüps¿øÅ/®þí¿ý·«ßýÝß=“n.çrýG~äGV|Mð˜ËCò=ð÷7þÆß8“™ï~÷»W?þã?~]?ð·é°Œ_$BB™jõ‰R~ƒv©ÞôçÜk¼` ¾�‰R· ¤ÙÍJ£�îÕ¹!ý–A@ábn$`Ú£CT´ª£ªÒêhq·Ó]1ÊéÇŽÐ)<”Ò�Á«¡Çm8ôÑ"­‘àôoH¿ n³W¶ VöI4p żÕÑâ´©Ð?H¿_Ðã6Dñõ8þ/]ü2—XËC‚xl¶eÎï„õ$à|áwÝu×Ù¯Ïvêv~ß}÷­^óš×èJÀßü›óL¯þ}Îsž³ú§ÿôŸ®þËù/«÷¿ÿý»;¹F-Ï{ÞóVßÿýß¿úНøŠS[@Ðâç”õW5ƒÚ©%¯ÆL$®üó}~öºZôzË_ |Ê dÁ�I†j(è¯Нøñ¤ô"«Ó;(ëxRÆýIüZ´ CF ÉÛô…yG‡’VÔe³d1 ^“ Z¯aŽ'.¾ºª–+ØÇÏü–�p•™ÏÿÝïõ€)gö}4PŸ]™ówÀ8´¸‚ÁÆBææ83¼ð´§=í‡ï%<ð‘�|dõÎw¾suË-·¬õ¨G�Ú'œa¿ä%/Ñët?ùÉOîõÛ§îôÆG<â«ïýÞï]qÖ�}§-\òg1Ã+~{ÙôÀK?ùx%MžðWâŽUqZI/ð¤e"ÍoijqŸ€`ÎHÞ×Â!¥Ô‰äù„�lÃ@7tè2M|–­Ë‚½¹ðÈ¾×ø'ú•pècC§á6ýk´SÙ†¡—3eg£m«àÃ@m;PM}üƒOÖ|Wî=†ùßÝ·ýâk>ó[ïŒùâ�a÷Çö@lXXV6£ÒŽ3²:MÅv0$2ÂÃc{Äßû{ïíñ!Xà³*¼£Ÿï28×Wú.7X¾#Ï rxZþ¬ßû'8ñ+„oxîɥó[n¹eõMßôMzHñ,?bÄ;8ëçg}ù®ÿ! ·Hl ¿ÍÀK™æZ~äž±ö†ø ‘ÂãÅýñÇžäÏ;þIšà-]2,D�šxáKÚV"édW¨tp[™ÊOùOjߦ³¥í+ßêÚ†OõOy¦ã™¶Oå§ü'µOõMëûÊOõMëSýÓöéx¦íSù)ÿIíS}Óú)ä_ó©ßú¿ôO^ÍýU~}–_ »/6À,¿0ç[áó!”0uú¦RãGp~.�s)$“ñ/þ…Ìåòý�ýØ�Ôt—¿ßúÖ·®¾û»¿{õçÿüŸ?µ~û‹_übmïyÏ{Vÿý¿ÿ÷Õm·Ývjùó2~Ý×}Ýê[¾å[VqEçL*HöozÓ›V¿þë¿~Å®\ü£ô�VæÏüÙż}úÓ3þö)—ÄcŽ9»"yóAÒYy]÷ú#ks’J¼½!߬´ÏÇOçä Äè‰kb„Å8�ý 4ª±ÑR܉Ã4•ä];ôÊG…¡Ö½‚ÒY4)ØÒÀmìiõY÷ûl‰»•ú¨Œê³�²…Ƣɞ“ÚƒÉ�À?€u÷ñË;ü{B ¶x¸ûuŸ}óŸÕÉ>(r*p–eî œÞNÂ¥øŠ×‡æ¶h�~¤‡ËÝ<ÌwèB¢ú�ÿñ?®žùÌg®¾ó;¿sÅýþ³”ç>÷¹JþWcÀÓý¾*r¹Rñö·¿}õË¿üËü.ÄiDÎÍs–çÎÝÉUä\>/á“\´ˆ‡þD�ÄàÛû2'}Ùš:¼ÌÑ@[RĪÝ�X衊iQuÔ4„£ÅÇÄœòìyí°µe /ª›yÈEhì³äaüeºÚ„kFÃAr Ø!Ò?µ?;y=VCÚ[|*�¤Ç,ÞòEÿèÓÁg8ÈdÃ=çÿ¾ÕŸ}Óïš¾˜žf[æ¼à³âÏ‹qžû;îŸøÄ'^‘€�Ò~ðƒzqГŸüäÕË_þr]^ЃäæË‡>ô¡—m?Tãi¿‰ÀK�øJ÷û¯tyÜã·ºZ>¸ÒcAžýש¥ß÷¯OWœñ“óv@0Ä'�¼+©“ç”$¡èŸ–*Nž@ÚÀ“gš_OJÀR¢V·!_šÝÛ�¼wˆ}² a®„$‰Š:Q-Ñ A¢ Ö6ˆ]2ª�È`ÙQŸ`(‰2aèãÇ'éÖ-î\_ÞÛôÿÔŸR’SŠ¿%;LHÒ’×û/~ùÃA�…­¾ã̰֠Ìy`w·r1¾ øA7Ìr¦ýÇüÇWÜü�üã«ÿößþÛêu¯{ÝêùÏþê/ü…¿°zö³Ÿ}ÙŸ ¾É�‡ü|�}›øñ~™¤Ïbæj–¯ùš¯¹šÝ]…¾ò2>q¶ÏI_ûÓyqLñr!àœš‘ *À½¸prèRé/«±w[£$h.mж- É hŸö/=¶yx ªÍ²Ê´4bܨOvB3텣ĥÁ§ýgã(;èëã/ß6N<¢ù¿ã�/}(¦™Ä¿ˆäÏ!»¤Ÿ£‹qù÷CœAϹ¼ð…/\½þõ¯W€»ãˆE“žàïW}ÕWi!Àm‚i¹WWv�ýó¢£_ú¥_ZÝzë­+ž•¸åe/{ÙµèöŠõɇFgñôPÉÑW†EËÄO½Ý$ÂN‰+Î^3ÃeÒ ª.MG.Qß‘`•oÑVñ_êR$FÝ„`LZ Àdaø©G1ÌÚú~­Í²ÑÚ^r_—L½âqÆ [öñ§/–2ÿŸ»ÿ‹Š©n“?‡�7³‚ÃgVVoëI¸ô®w½ë}q0ëuÒ“ž¤³ñÍa^y Ñqõ�‡ùF´\�+<±­ð£=Üç¿VÉŸw<ýéOßfÚ¬i$±Ld‘èÏ{ùÙØðáŠÄÎNgÚQç¥?ø6É=J‚ nýœ Æ–¬ Á¥» 8-†âŠ�!ˆqà¶�D,l”�(t/%ßÈšü QÌ Ô² ݺ Pý4cn}1ØÖÇ/?é8˜áü¿ïKw ^DuÞeî €á³ÓÀ¤\Œ—ÝO½ÏþçÝÎúÜ•8 ·}}îj,v]¸–OÛsåƒ-¹(¡Å�Jè5X]¶�OÚ¸ƒA œ„¦@Î�ñQ“f‰®ç^ ›ú+N1×"£ ­¡d‹Ÿž·mØ}°»ð[‹û¶¸™s¬£>ëvßð�ï*}üé™™ÎÿÅŸþÔo�8ù·Ó¾kÊ�ž>÷öDµøÒ—¾Ä‹f]ýèG¯þñ?þÇ+®\«rl €óüÐÑ!|Ç\ðŠäe=ýŸžQ"�ONžÛF-¢s~�êì9Øœ•�i‡?vJ’TBÂ<-¤…zrd|`6Œ"}…³ÀPCìµÐ Ñ\4LŠl Z¨~=žÖ4°y @mE³½â)Þmü- |ºµ}z܆kƒ Y òëa¬¢1f�Û0Y×÷}üé�+0ÿñà‡~çŽ÷Ý(ÇÔT60ûžÙ~ Ïàr&ÃÃU€[ã,rö?tÿØÇ>võÏþÙ?Ó¯Öýæoþ抷ò]ͲíRûµ¼pµŒõë¿þëWüâ ‹€%>8|µ([ K¿>å£HM\þ¿‰ïþGÙ Ä0WbÒyà>“F†®-›XKá Þ\ôrù"ýÁbýânÆcMîoʯöàwû´7ë5œòÛr Jÿbæÿöû¿ÈI¥s Sï-çz¦û¹/< †š øžú;®å™ó!�ÞÜÇ›ðØøÉ_ÞÏ$ò¶;~Ú–‡ø8ƒ9tÙö  ò•Aú½Re×-ú¼gá¼{áÁ~°¾ÞÇ+“Ÿò”§¬žúÔ§®žõ¬g]öWjüWS¯“Užkr&ŸØz2#Ù‡Uñ”·üa»PÉ2ߘV[5'JC©hìz’H%Zx9p™„¼Æ�•¶õd e³¿¤eëˆ[ÇTÞ|†'ê«ÅGztÎóÛ½Ÿmä†ãCˇÄìàÜv8áI¹ï¿ÿЋ^ô¢;âîNÿ|k:bÈ¢æ6œ_ÉÀÃÎ[�7Ë?ÿçÿ|“Ø){y€3ìúÒŸ$¢›*£˜vÂ7¹Œ—üBñb�5'Wt… Ú ·%Htî*ÈYã@JÚ’ý%e�c½¶-¡§íè9�|ÆwkE_ö�ã5”2i¹7í7ß.ØÇ?ú Ù—@ʵœÿ·ÝýÁw„ |<œg|aÚlËž°ó™¿“ùb$(Øèå xàJߨuà åºWI2óE|ãN�^hüñ‚`œ&Zs6ÏC€mÀvÐ6LG;f[<[Í lñl­>Õ6X%;Ì�FðíÚO–§÷›xÖÆÞF´·#hû¶=©ƒ½ËTºicß»äåó�°=É—TðÖk5¤§“䓇}–)?TÓÀ­ÈÖÚN1ÌÚTªi#/2–3„Ó}ó/iæom°VÃÓÈ'û,î/nuÝýªÛ^ÿÞ zÐ.Ú.,:¸„Ðn,¸óÎ;{6³03Cû`fvs½ì\Gĸžðw$®ËÚZ MÁ7h�”z±Ù-ÜI%*¼Ð pÿÀ7[KG«aÛÓ.~èÖažº Øâæ)W䨫CÓ̳[«Z|�˵¶ÏßÕŽFø€Û´·:ZÜú¦°åiqóy¬šûÿ¿½s ¶ì¨îûÌ!i$!!â¡ UñJ‚‚�€AØEìÂN\ù�âƒó%_\ù�ªT%åW¥R¸Ê€y¤Œ—MbR!@Ù@À"±UÅö!„€àÁHBh„æ!ÍKšÑÌhfî�ç½w²~«û¿Ï:}ιçÜ™;3÷ž»úÞ½×êÕ«Wwÿ{ï^ݽ÷9§(™túi¬Uäûµ‹eF~T:у³mD^öZ*�CóÇ·<ûÏ<µÀ$IÉm¶5Ÿ† €«Cºšýî·×TO¬¡Êæ` uÖ˜ªú@i'~ô§çÔËð©AÔ?¨á®¾k‚³?ç/X^dþ_¨&mѲ�|«§¸œÉ(m8o'QŸˆTêm3âÒV!O«u�¼êG›=@#_Å-‰6"ßê)ží/H\îþßqê‹ÉηT>öººlÍÑiš¨ƒ|ÀÞxʾà©5×#k ÂsÀ S£ÞXЬÍ*ÚP¶Ñ¶øÁ¾ørÕ§]dì³ ‚;ýÎÓ™HÊZ�¾;ÞaHD¯çöU9O«ÓVÞ"*1Þu*�DßëdúPÕO´VJ¢ê':IýJîÉÏÙþ‚8L‚/}A¨ýs¹úÿ í7ÅËê?w¼CV×)^&}“{Kþ{««ªÓQ›‹ùuÀ8ÿèX¦±ÕÝŠî2ï/Å ë¼Q^þÃqê§�I€÷P3øà\yï¿Ê#µý]AwûZÂAGÆ»ó®TŽ\´–ÐOšüž(Y¿f‰�«_¨C×®hO<4ò*kœ}ϦŒ� gûÇAý.*ˆû¨ „F¾O)D†ôω…Ó;>}ð¾}¦%ç��ASÚÁÀÚc§i@�Bù.€}s\¾p®É‹¹�/^„[Ò¤^ÞÓ ¿:òØ )Çî£��ܹCùÕ Ráݾ寲¾áÑ3ºÂÀIÐÈwŠÊ �|§Ð0¥"¥B¥z…ïòãv:A0ÜØ"º\{²=©ùj?Û¿zûï™#ßµ+ÁýI¥Zdr…x�ìÕ0-ð§3:çoüÂÖ­[ÿΞOž"1ÃÊ!�€•Ãòò[2/Äç�¹‘ê¸fÄWXD%Âã×Ðcñde‡Àe%êv݉*N>ø”y¥·´«¢Ùˆ|§§ªA#ß)¨ðZ!�bÌœ”<ÑFäIó3U;B<ì òb›#¯ô–Æ6G¾Ó‹uŒ|§ Âkå™/ÒÓ+r°‚`^fSÑÁû¿ÝAí>\>óO€”Ãrß7a(‚â<¹ãAfâ5 J(¶z|áÏÑIÀ{Q•F[ƒ9GHT(õ­u‹+–ùÎzkOvEQ”ޱÑFä;{ “í/€€Ã¥èÿÓçæýöîÏo±R5€NÕ$`Z&º­èótÜþýûÿÊh†DàbNòÀ쨉L™ûÆÙÙÁ>¼Þê÷ìvg1I`À-¿üW_ À84œWœ¨ØèÔ"¯tÝ´ÐÈ+½¥Ñ¼êå ˆÂ·úÄãám6ÔlÀC«½Ž" eÀÇ:IJLÕC”E^鱈È+½¥Ñ|¬C¬›òµúÄã‘í/xŒêÿ'Oø›£gOð»ãšÈ·¨»õš¥Ó2 è:I6ÿýïÿ{ö•¶‡L–a…¸˜/æ;+ÔIšá†ñ÷ù4¤õ]òã ¦0c#EtðîtбYCœxÄÕ&´ð6Ùp'„hVj›DU©.ƒ±0`/Ö�¼Qc[}âñð¢Mæõ€D�UÙªOK±…L6={È�\²Âgû…ƒíøØ j‡ã]©ó&Ž¢nç"÷ÿ—ŽlañÈBÒ“Fñ-Ô– Zbkô‚ò‹wá'ÙŽmˆerIË[é¸aØö·¡Ñcê ŒD¡<àGƒJ¢ –¸h_¼É2ûв%óáÉ5�üt5(ÉàÙí Š‡JdKö[¥¶¼V¿MoóË®h«ßÚ–_yH–JkóŒ+¿-¯ÕoÓ‡ÙG6ííßúè·ï>üàAkª|Htþ-,k:^oÅ5݆XyÚÃÁÄæJ;6Ûq�×Ù³åßõ®w}yÓ¦M7Zmù»<µï¿ï¿çß¼÷É/ðñ¿Y;æì`–Ú&Ú0ví‡iz@oh( “âó›yûuÀGŽù‹µßeÙ‚D`åà†á7}l ð}/fÕ[ŠÁ·ï£~ö€\'nþž@1á9ª¹š»&Œ!ª4þ”¥cNyŠif¨ÕÈ£…Ë/;¢äì·‡¤нR—ÈK#¶9òJGU¶êëy¥cOyŠíl‡óëÿCgf·šóÈìÄÕÿÔîLÛ€þçÞ㈓>Ë9¿eË–»lÐZÛ{¶Ö� ‰ÀJ!€ËðG¼Øgþ)yKD&g玾úäÅÑ'ÄÇ£“RÑIê+]hä•7Êœ—^­J7!±º8oE±Ñæ'�¨yéD¼`‚r ' O-±¥ÏÒ…F^¹¢ÌyéQ–Ù~:¡à ~Ã?âñ@çëG·~ÎÎß}FåµêǯpLM˜Æ �C'Å €wè�ŽØG¿25½— I.�fîÐ-¢¸3DìÐgüKQxÄ8üÂÏø#F^& å;¢s,ù&8«ðZ®Û0:Ì^”ÁSÑZ5—©äV¹d®C¹¨Ê¬Tz¢¨©ýPÒD¥'ŠþØ@¹h-WTvD]­ê#ãÈö÷p8ŸþŸ]8µóßoÿÓ Ûèü§võÏ54�n t‡:ô¬}"àÎ*3’!XßÎ c¾ P õÐÖAŠ[‹$slòÖ’å'†þ°8Ê"ïF8©2µ\×1:L¿Qw3’‘³œÔA.·|ÚZBiw©cÙ ZßZ¹QíYnùj+4òµRÙþÚ=“öÿw�o»ó솳�¯0Y8Æ €:\¯y:�u £‡žåбg·oß¾ÏÞøk)%MÖ=6¬ñ2_qê8N�œí(]x÷Pó‹g21IèŠ1õÈ�Êuœ·âEU•Žš‘è„#ßÙW5¡‘¯ å¡&=tÄ�È_ÍŒ$²�ü¨ QÇùlÿŠõÿÉ…ÓûÿÝŸÀ/¸Ÿ0*¿!?¢ÞÕ=kR>­u”œ?0ê�ûàƒ~Ò¹ü•À5yÉf¥Wigbr”^FõïZÑs3•t[ý£àév"¯¯þ‹¬› C¼+�w[•ª\јM¼Ò ‘Wú C¦b¤ífð5ˆ•\Ó{åYË\V3ˆ¯Q·ê2ÐÐlj¿‹íϾ¨ùN­Á×ûÜe#:H}eôo�>ôñƒóÇy?L¨v�e¹+jZ˜i�Ð?tšfo}€]»v=}èС/LK'f;� A€qÐ�¿9In=ÛÆ¦Vóeõiw¤POô»dô´8TЇr”‚ 5Þõ+-v«ÌT=´ùJùök¥j&Sò¼•:ßØÃæ’!fªv0Š8&ÉF”Ágû Nà°ŠúÿÈüìO~ãñ?ùºÕ*:|õ®zÓDÓ¦y@/ÑiL´ pÆxïäxàóö…6ù#AH†õ�ã±É�Ý-î£ðöu¸sçàÑ„QÇ×�x'C9¡¦w¼3½ü1ßRù& fW²¾²ªýÒÔÇ£n£Vµ¶ßÛ^Ûïü€¡*hì¹T2"â¡‘wÅl¿úúr÷ÿgŸ¹ÿcÖ%rþòø - k�M™æ ·0Gœt;G�=þôÓOjúº4[”LŽ€¿µnê~³Ôm|ß‹š-WŸ$˜®üzðÈ)5î_VˆN7òՈʑÃPÙªjð]ˆ6"_¢ÈyË,Ú ÅB#ß•w¡Ì@…Ì dΖH¶¿ @À�ìa�¼E ˆvŸyö›ïÛíŸûתÕ?¾ƒ Ü%6Eçiž¨›è<:RΟžÏòî»ï¾»íן�bÒD`Ý!`w‡F7Vûðþ „Fqól ,VM×1½2'°LJþÈ+}€F¯ùªE^¶×�ú–µò¨¢dˆÏ‰á©CG½öEVÍ[æÊ©�D% ¬’½&‡rD _b^î°òö×®þÙ%ÆWÈŒºc*éz˜¨ãèÐ8 è:~nnîø¶mÛ>’�UÒõ‚€œ7‡Ü^ùä\äøåÜ¢ƒéɰ£—�Úä;ðÅö¥_øöì�L¨ü¤KÖêN/5¥Ìò'géu5^¿JUÇH…Í(ý6ÝëmöT·Ÿí_uýÿãÙ]þ‡{¾üS몾… Ååü50Ñt‡õ2Ð}'t>?ñÈqÖlÍGÓ}±gë�“ê-yqký÷i~,ü ­§MP~(8x=`»€ƒ j¬œù(É£¿Q¡5Ÿ¨ÛsRÍ¡Ão«¥yèTç¬ú`^u„oƒÒ¤ïö¢ƒ¯õ÷6×úgûA©„qø]Šþ?¶p‚­ÿÏX�4þk!H\Ïþ©p¯âĦ4¬— €º�N¥“9ÔñPŸØ£€OÙ§öX5aÓÔ´dò†p-t_A™�ÅŒýdðѼàíx‡Å3$S�ÀO¿¸üzŸµrff“ßÚâæ¦èdv»˜O)«}cfàÜÉè6*iÜVÝŽ@pBžÙìiPÉIè(ØÐ«ò= Y â ÃFmä½ÝœÛ+ žßNÃò–´Þ®õ�2ç«}#Ê3©d1¯·½¶#Û/$K?¤$Ž�÷×Z‘ŠöéÕø�_zø}|æ§ÏïÀpè%À80ñú ëqÐön¼†|"ð¤…Ûn»íúÍ›7ÿÃV9ã‰À4!ðÖ:p‡î +ޝ¿îÌPË‘fî�»ÄfŒa��Ù¸ÉlO�™1'X†blhPvÓ%›ØÞÀßIúå…|@¯”Ìž^©§ÛIy(› ¯´Î^�‘Þ†ýP&†Ý9U ïú•b‹²eC¶‘)ˆ•\Ty¡„l¯Ï—ÓÿGí¹ÿ?}äCï5zÂ`d€ãg ½üÔ‚ÛØéÜÊë-¨“õ(€ÙŸžqApœ½çž{>~êÔ©‡×8ÙÞõ…€;œ–1¾¥�—á°PÎue¯»†ñÑþý[í"zêB§úõ@·!#Ø«|(¢“¡Û­þ ÎS™�zȀ̈›FY-5øªîið£ôQ÷¼Î=!†©eui³‡ò�B�'Ÿg$s�G&¹hÑè?gû xÒÿg7,Îþ§�ÿû}Ož>xÜÐmÇyâñ¹?½¹®Âzœ¨ƒéìvÐÍ í{NÞÿýÈ \I§9-»6ÚŠžgËÌ39gÔ?ãïNK2Ó¨ñ≚ fu•—¬-Ä3U[Æ£:T]u�Úá:•N¢OÓÜ!qž:#ãÄ�]Qç-"ÚOY^ÉÆwùÅC žXiä=‘… ÙþÑÅëùÜgž¹ï÷þϳßáÅn9�ñ,üÖå‹Öî.ä#€Šî¶.w§-|fgg¹hyÉK^òN›…>¯§š\"0¼Í°å¹=LÏ¤±ª/z�ò ÀÓy `º%¹äàÑ@(j#¾he�”ü•!¹¸Qâ&µ£¤*=Ñ’Xóbƒ@>Qx/¿Ò’²ä¹æîªëP*iÙU†ÊEŽ�ŽŸí/˜Ïß×eŽu…¬¼ÃŽ„å÷ÿýÇû_ÿúgò׆<»º8þÜú7bÈ @D£Þ²&b„óã™gž9rÕUW=þ¢½è—m�xõ㕱5Ž€™™2òò€´�S÷aÙŸÿskóçþPâuP./öË&�…ü·oŽÁeÕA Ø@]N4òÒ�²È+½5ˆy6²Iì)ß„4Û_@¿ýÿà‰�wþÚ#úœu…ë2ÐÁÂŽv€G]–4ýa½;4Ýöñ"@¦Ã'ûöí;píµ×>uÓM7ý“š6ýWF¶p] àsøz Ð¼Ý >(ÛmP>Îßþl¢À÷8•ÃFÆŸÝ1îÏ-]Š"䎩‰~WÁ#³ƒ»NÔØŽWºdP }Ó•{²¢àçbÇ3„86 ¢°^áBiƒ'W™GÚ*ª³ìˆzæš™vêhäkºlA èJO…W_飭l{”6–¨_WWôü°SG#_Óek…Û¿íÔ¾»qëïü+G/§ÏêŸÃßñ2º®Ÿý[û=¬÷ €ph©_¶&�Ù½{÷Þo¼ñ�}<ðíUÞæÉx"°æ¸ã™›½Îîíj÷•½½Éï>Û.œ=�G›ØÚw¾NLæÛý&k' ®8æäÍÏK�•w'3&/Éäã}ƒóÍ?PM•S*Í.#@UôúÖr'š0 Ð/p{Ùþóî¿aý¿ûÌ¡ûïøÑoÿÁü†ÅøÌ¿uþëö­ÿþ+°|ö½•e¼ ÀÀÁ¨çü®]»vØû§Ÿÿü翹¨ä9XÛøÀ®n<ÎßFã²ÊÇùÃÛŸ?ÿ'ÍB‘qCØ“ƒêÀ|§À³›Üò¡©ó5¿rc•3Ý. 㑹½¥½¯õ€^pàmùÄãëßåaol:6ÂÑ–O]C@— :Н6i3º¯ÑlÁBýÿÌÙ£¾ã¡÷~àØâIVýz?“‚tþ‚Bi½õ6Ìlß¾ý±—½ìeg¯»îº¼t–LMV?o{ÆÞ0¯â¾Åo\Ý(ÏöK«œº>Y¨ï ”GÜø¦Þ_ôœª \IÜuçX'‘wÇ; ]m‡?à Ûßïo.Çæ…R]â…–Çλgh[‰ä7ÊäÀ™ñž§Rxô:j|ÏFáÉï¡Kã#ba‹ßݶÔ0Xe�]•ÓÙ¨ÊCȲncƒâµ ÷ªX\”¶P'щêgê*¥~Ùþñý϶ÿ;¶¾÷ƒÕùkå�ó×óÿÖù3ÈI€��¿ãº“nÁNÐ0¤sÌìܹs‡= Ømï¼ÝnÔı*£kß°+Úgxsæ=‡^Vþht+ÓqGïú–ç\y7 ³ar‚;C&%Ú9KmÙ"ïs Ò14·úÊ+{^,ykyÅ�R>í2!ÿ•:ï•ìÔKZœp´úØuvzuïÊÇ^èàfœÂV^úÑFŸn¶? Øc[¼ÀññSûïyÛ�Þó_��;‰ã�+ÿèüãWý‚î„{e­.×ò{º6>õÔS{®¼òÊmöÁ_´�%¿'`ùXfŽËŒÀö¯æzP¯p¶ûñ^PþÐ+ï–¸¿ío_!ÈÀ¬É�(Ž–QV´k&fj ¡G‹€<)ê|9Ù½š^©‹¼@K1¼cRN âå�ûl”JÄ›]Ù0QÇ{U©Ž1…/õÏöLúºàk+B�Á¤ýÿà‰_ø…­¿ó?6,âàµò×3(29mý÷UÇÒ×uÈ ÀÒݯ‹ETÚ\©~ØGŸ¶7‘ºùæ›affæj)$MÖzàƒ®]Ò¬þõ ·Êï9x.zpð¾]óîpqÊès[j¬Ý5îÀëÝ#^×%­î¸°Þ¤1²Ë<’2ìgz¾Ê®ú®î2W*i¦„Žë‘Ó•”Þ£ˆ½4QKÂ,²jÞK÷·è‹¦Ù"iǰüž†Ê}Oq®40¡À¦&E-Û/Sïk@*øy¸Lq´‡÷ÿŽÓ¾ùk�|ðw¿slÛ³¦„sŸdå/ç¯K¢”ç�tPc]DÐÈ·7Ú'¶ÛóѽøÅ/þyÛB½¦UÈx"°Z(_\º�¿¸,†á28gŽS+Ž¿<(N™´òàÀ©eð˜ïØ îV[év«X¼h«-g %Pn‘y ;¾—Þ:`w;%³�íõd�R`õûËЗ:ll«xÑVy\ù%½Ô‰¼ØQ"ˆÂ+ JˆúEÒÔ¿ôí·gN ÷yô“¿üðû?õÜ ­îõŸ¶üã3ÿv寱º¿qsr°¼ A´=¢¥�ö^Àá½{÷~;4è&û1¡WÆÄä�Õ‚;úu?w«æÀµ‚/N¿L|b` 8 œ=·@Ïñálp„¤ñ8€t‚(ù ?©ÃÔWyå6¬æ¼Ì—òK™=g5Ìá Ó¬o•XµcYE:ìLû¨´´µG±QdÙ~ú©‡Å0$‘_<¹ëûÿò«>K2IDATý¿µóÓX”çù¬ú—rþzæŸ+j’�€IPêבãG*>Rio‚ìè–„Žãë‡ •y•eðýa¼}Ù)´èŒ"ßkö—ªÏêo¿­úŸüÈî/¾ÿßnÿÄ7Nœ;#ç.ç¯�ùA‘)]¿ì—+.�e„œ,¬ªM ñ@]il7àlÝ Ønßx»í\;Â^Š�K†Àö)_Ù›ã�C/W‚#/»Äp:ö�Fíóÿ/ÎÆ_ô4t옰öÒ„^ït·Í„–¤FÉä…F¾ÚS’ÌÓ —I;ð â•Þ�ÞùÑlÁ ÙùÎíø‹wnýÀG¾qìaVýí–¿VýÑù£ƒóÏ/ù9¿K0¿ øð¶úƒïÙõùoÛªŸí|ŽaÏû‡9ÿ8îvH&3¹0N㴢Ç�åÀ¶”}\pÁ&?±¿fŸ¸Æ¾7àU–g©‘a\ù™žœo?`_d9;‡ŠC·gý’áì ì Ø+Ït� C™8 Ôä@y]qÌ©+ÓK§œåí�_ó‹¶Æ{ÞɱŒÈŸ¯Áh£ðë«ý‡çç¶}tß=ùWÛþÛ]��Ü{ÔpŒ«~=ïÇé³ú�oúkåÇÝóí†u�/'+ÓýñB�ã×D@Ti^êÜÜÜ){,°åÔ©Sß}á _øÒç=ïy/_™ê¤•D`2x ÷ï.Ý:A«üâäËtÀíßþ:Z'–§÷%Aeò ¢ØïÌyœŠ“¬u°zÈùC‡…V?¶©Ô‡¶Ô¶Ñ8¢Ã,ö˰¯:IJ¤Ûy¥/—Æ2bÙk­ý'Oøâá-ûÕ‡?ô‰û�=ú´á€C�«~œ?Ž_Î?>ïGwèxjò ËD`ò«}™†×¡ºFFEŽ+êq¥QŽ«ê!ž­ô˜ˆÍ¼á oxÝk^óši�î°#ûÆ@Épqø�[_ç«ûÞ ·€SÇÑhõ/iÙàB/:\­.·<Ðó \ò|â@—¾xèåm}|žAÓjuäüG9àåÖ¹-oÚÚ|áäî{�>z×»ŸøÓ{Ÿ]8οžß·Ûþ8|JÓª_Îx/Ï…AÉSÎïN�’Æ_„f€§&8v<Ž>Nâ$^“Ÿ¼úÕ¯¾åöÛoÿõn¸á�6(�ž!¸(0ÀÑóÇxº©~y%N_� º› Øåy¶x4€Lù5¨´m¹´Íß:Ä6}Ùö­-râ€+~R‡WáÃò_pýÆLˆ.Øþ%jÿ¡ùÙG¿|dË_þÖŸýþ†½±•s‡j•/ª7üIS9ÿtü\p+t¯®€©4Q¦PFE9øaM 4Q`àûq¡ßô¦7½ËüsûÔÀóMž!XQÊ ¬èqærúîÐmå½iÆÞú·ág·ÉÓmª`W¶¯ó-î»är™å;ÜŒÔP‚x�ÞãhÉÕ;�·×+ÃsQ)v &ÈìPý\oúÊ«öPF ã뻼 Èx{Öž•l¿a½¸çÌáïöà·î²�õñÝý8oœ¹¶üqî8zrþš +çÌ:ŒÍ°t×þJK}€­&rìÚú—ã�TiL|`tƾIðÊ7¿ùÍoµ Á¯Úã~c€ô ‰À#ðnÛ`%é{FõçÛþæÌ‰kÅÏÅ\ø2@‡¿2iè9ÿò)€A‡ÛV{r¢ž†£¸ã‘šôÖ¡¥Ñç¶<•]­dlWØmy­½åÖo\þµØþcós»œ{ò¸ûKß¼ïØ£‡ ÔÖñËùËéG*Ç·ûµê§FuÕ@ߥ`2¸3\<„/T»8v­öåðGM4Ðd`£}|ð†7¾ñ�¿dôWlbðš‹Wõ´¼ð~ò·:r¾ä‡¿O�úо8~ß4ÓçÅÃr;a»‡i\²aéãð¦ŽÚ¦÷ü“Œxë°Ý]ÈËZºòj‹¿ÕWÝ nÏó,c‡`LûÆ•ç….qR[¡„qí¹Tí?µpæè¶“ûï»óÙï|ãcû¾ºÝª&§¯ÿR«~í@‡9~:£tˆ1V9¨•µšÖZÀYG;ÀÉ3`2ÐRÒt0 è&ÆÏ¼êU¯ú{¯|å+Þ¾Xè-öQÂÛm€ÁF†D`bÞýÐíufj—¥90Ûð/Nßx&ñN¾[í3ð&|9�]�¦?c¨„aE¿Ò¶³­‚¦ÕTƒ›®W�þ È@þ1õmÌ™pXI²�²x¨…ij?/ôí<}à‡ßzî§[~oÏ>¾pç ÔÚ²‡¶Ž_+|­ú—ãW^ì¨ÛDM”a¥(WæJ[M{ÃÖP&rêPíˆj2@\“¨&šH¸­ë®»nóë_ÿúŸ»ùæ›ßbü[®¸â >ß•!XvX™ò"Ÿ_HæÔµÍÏJ³8|œ}ÑÁïxšïWóàP5a@{ŒÞP‚x�èãVÄcó›^Ž6L8:¾NÚò=O8]hyã|[þZjÿâ†ÅSûÏyèáÙ=?øÜÁûð¥Ã[ø¶>šÄÑ®øåеªÇáËÙÓ®4Md{ÑËóEA@÷æE1žF‡" Ì¡8q¨&ÑÑk"©Òч×$@[~¼â¯¸ùÖ[o}­íüƒk¯½ö5ö¸àÕ6à\mé�Þ`K¿8ûâè‹sÎßS‰ÛçNŸ ÏòÔ‰€ôËÄ€ — Ê8^âãd»bn8ûBãðì[ºdžO“ƒ:!(¯Ïø�H“_-“§jªcÖlûÏ_8µç™3GüÔÓ�ïøãÛþlÿ½»ìçxqÚ4—C;nókÅ�ƒ—“—ãUZëø-Kg>Ã%@@wê%(*‹höÐv" �“×@KIÓÄA4Nà Øß¸ÉÂk_ûÚ[_úÒ—¾ÖvnµG·Øq¼ÄÒÉŸa"? ‡^Vý¸õò °°+àÎÿœMìcîô™˜×+“»ˆ=Í.;s”®aWž|&6ÄC í ¸U@�‹·ªè˹C Ò…zh<òX}å«t\ù�ºU¿|‡AWŸ5ÐþS‹g�Î.žÜûìÙÙ½æð÷l�ÛýÄç<ðÄ£'Ÿš 0Î^TÛõÑéÃGG/‡/§¯¼²+j*.%ݽr) ͲúP@ãD>N´úEÛIñh^‡±…¿òÊ+¯¸í¶Û^j/Þbƒ—ÙNÁM&»É&/´Ç7Ú¼á¦Ü9®é q@ÏüË~€]ŒÕ¹C‹Ã7gï²êô ’ò@•×GÈ< züÞ,…6½äê�ÞK¨\›¿ÑpÈ– OÃMà¡Ñ¨Š1ƒxè°0ÖžT�É/:,´öZ�6£¿xnqá̹…çæNž[8}xnñä¡Ãó'?}æÈ�Gçvï½ûè�÷<2ûÔœ™U ÃŽvµ¯U?Î=N´ê—Ó•ã—�¶Œ¶e¿Dt÷Â%*/‹�€úÊÁ(ªCÎ}Ø„@²Há5�� ¨ìª (!Rñ�ܾ‡`³ý”ñ ®¿þz{špíu›7oæ¸Ö& ×Údá:›(\mÛÈWÚdá*x;®²‰¼íû·Ëx}àíð:Užºº¬ê©n]ù0K÷ºÙÀî´F=Éò´lþÅ“·Zçógø²²Zû—Çáo`eo”t|[ü`ïßPóx;žÝNÃb†þš<ÆõtÉcAYkÔË’�á !“+4§ƒýú² %Ð6É\Pòû‡ ¤c ¸¶aã´fB¶El íWï‚ÅÌA›E£æDísóç6ž[X\D¶ÁDh..,n0ÙÂâÙyóågçO/lX<}faá´ñgæÏÍŸ>yæôÜÜüɹc§OÌ=3;wøäìì³'Ïíxnß±Øvôô¦<,EI‹G\éËÙ‹Ê™sþQ&=åÃ>ŒF<Î9òŠC£—³E¥óÈ–ìC ¢%–çU�@¸«¢ÆVBý�GtÞrêròã¨ô[ÃìSÁ(W|)J�|m&;�6OÆ�ÕŠÀ$p˜ÎR2¥EÚòÄuDç ¯ƒtøèÈÅ�¢Ê U~•%ˆ–XžW“ Ä«®Òë¼Bê3h{ sæLÐÓ„`”ã�yÑW¼-CqSéÊiË‹�’!Ï�¬†9Ê(ÆK)|ŒË9K®x¤ð“؉ye7–IŸ)Ÿa#À`žaí" þ‹TÚ:q9ÿ˜&�–³RQO�L¼ «|/T6¢,òãÒ£nò‰ÀjD`œC•åâ‡Ñ(ƒvÈq“&~Rª<`«<ðÈ"/YÒUŽ@®«¼ƒ–Q½Ø—â¡:0�£'Èá+}9”üÒ?ŒF¼y‡…Qòaº)KÖ2£æ0¹d¢´[bplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-referenceTiconÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°µ¼½¾ÀÅÐÙæé$òþom,¶ic12g‰PNG  IHDR@@ªiqÞsRGB®ÎéDeXIfMM*‡i  @ @FQB° ÉIDATxí[iŒTÇ®™Ù–…X€±°)âXæH°ø�$�ebˆ�Ì )R¤ƒ¢üˆòPLdÅü³c„àˆC!¤HÖb lˆÌb0WÀá,ذvÙk&õUu½yo¶ßìÌL”P«~UÝ]]Ý_uu¿~óÞ=¥§xê�§xê�ÿ_$º}Ö¬Yµ©Tjf"‘˜˜Éd3ÈvzqªàTRŒÍ_�›NUÉrªä”ȱ-b›bÂdp—fXê`þ�³÷8{•u/s££í”Ù?òó¥§E±ˆKQ˜3g΋l{hZ}äU]ñÅKT�ªäTEIþ˜TÔ°ûJ×µQú—#?ÿɱ ° =B‰Ù³g¿ÉÀ>JðèX&—/6ËÆuP êÈѤ�‘�”œVž(9x¦öý7aZmä¿â€ÿ ™L¾Í¦Êò›ë~-Â^©S_²\�Y‚?ÄaÎ/‚8Ce¥‰ÔÛgk7~À£éÒ ]9 ñòË/¯dð?ê>´Z¼©¹õ�¬•�‹lzÐAB¡q–á,”�—ð˜ëG¼·Òš2÷R>$fΜ9‰7»5Þ–�¨�ç“I—ئÈàξqdQg<ÐC[ÔIM–#[™*YsdÄ;CÕN+Ëò9€±§Ö±êc {oý2xÌ. \ ³\tê yè bô“‰DYŸdÕïX+…f>Šs@rúôé£9ô§úYÖß°aÃhÞ¼yôúë¯SïÞ½­JøÄ‰iÑ¢EÔ¿ÿHy$ƒ“¬åHEçLØ)aÙ4�Ï"Qš(™ú×Úߎf/Ö¸{v²¤¤d¶öñ²²2âÛ"555Ñ´iÓ¨oß¾rÿÞ¼y³¨/^¼˜Ø‰¬µµ•¶mÛæ3£³‡‰ŒÓkNQ9�‚«Á*МE.pŠ´0OÀ·í“¨–zNéHÎø€æ%<#r•Ãy€Ú¹s§µ··Ó’%Khôh8šhÆŒtóæMZ¾|9�9’NŸŽ?ŸØX5 šqXËÊ2뜵ÙWG¡ÞY'²Œ�QHy¥€X;8Y¥høÂÂ0H4 ¸Ô×ùD  áÇÓÀ�iß¾}ôàÁ:vìÝ¿?¯€pÏÆƒ8Æh,aè�Á_Œ³`N ìA�m§(9ˆE8­#ë^ÿ"šy2˜í»wïJgË–-£­[·æÑΩ’!exÒÒ<:E.2ƒ3 áËâs„qqúÊPi²X vZa×ì ¡P:w~òÉ'²/ÚŽOþ¢j³§íP¦wã¬3kœ])³rãâ:i“Jï� .ø’(/ô.\¸ êýúõ+¦ëˆKÈA–Ò�ìêu£äZ¬q[çÆÑ«É®^ƒWÁ¬0!ß&(z=ií2¥¥¥4eÊÉ :Ô§[€uÈËÀ%o’r8‡‹8IÕY–¡ºz'kYmŠÀÒ yòd4h�Èy/nÍ –Í)¿ÊàaÙuºÙ=�[næµOäã)nˆm�cïܹséÔ©ST]]M6l Š@8¼öÚk4aÂ9áwÓ¦MRw‘9bt:ƒ ^C×ÓXÐÀaB}ŒF¡RVRUx.\fzÆ‹Ž€¯¾úJÚbf7nÜH–GáåË—åÔ‡MËÂ"Ã:óq›Ÿ0� xè"ƒ‡å‡ÙŒë-û€&ô§e¾žµ¬èÀZ?räáø‹A‡ ùµkמ,*Âõ^Y¦3ϵbŽ/ü€”(MòÍ+%-u¨fû6ëb ƒSH´tPº*%­B”¸+Ú°ÑÖÖæ1•-*<7a˜:ËŒìñãTóóqY£H�o¥ûú"pˆz4ð¬×BÑKÀkåêô`vm·w“Z´e³�†&÷ëVø }“2Ì‘ Ò·õ迨ñ­#\žA“M+Úk뉛¢îžž¥Ò¯™m÷Ä ››ŒG×· ­ýìׄ&ÄŠ¹@Ês ¬Ò¡ÎɆMr¬ô`è=vk?—ºÀ§Þ@£pÓ°œS•kùXäþ¼åkü(Ê€Ûî�m×6,ÆÑ_XÎíßÚ‚ƒô.�µ§¥ÑëÅ&ˆ�¦Óz+´Aã¶Éàa9€„��ÙNÎç´Ø@Ûo‹&i?y»Ñ–OH3‡ä •@ç”Y‘?üóEj9z�kµ'Jȱ'K¶ôÄ '=…d°€ºdH U̱`jû¬�è(ÔÕ!Ú0,w6õä€1qÈ&ÈcµƒPúÎCj?§óˆó”dî¶ÈÜËCrq;±žþyyââxJÄïƒ×®]#û‰,®ãl9£æ…ŸI§yð–Ä2´üå"=ÜsQdì sŽ8‹ó¹Gã ‚œ¾.ă++ÑK·ЫW/zå•W�¾{öì¡C‡ñF–&ü"ôÆoÐÕ«Wiûöítýúõh�9990bŸ 5™I»Í( ¨¬€px8;D‰Zó8f[YN·A¶[¨ªª¢•+WR�=hýúõtåÊ•Àà�7ä‰pÕªU´bÅ Z·nݺu+¨÷ p˜Cɢˇ<m.ÑÂm,D¤6<Û&�6G®[·Á… RŸ>}èÀ�ðfþöíÛò^ ¼¼œ–.]*KÃêr9 ¸…µqÑ3`ྡ6ÐÈñÀ®³/ö<—¢€ÒرcÅÂ>Ž>,UxI‚ý!Ž2öÚ‹�xsˆâ‚s £Éê0¸è‚»È ¸xCÛÅõ�ò¢€M„ß¾þ:zV— wÁ#qcc£äà„xÂH-ìªÙ¤s pú'z2Ϧ£m&·S§;3¾ïn8?ƒ�š››eÎgüÞ=þމ ¿ÅfÀf:6pŸ¾Õeõ5²NC+8ÇÈd¬?勼HìD¸Í�°Ú€:)¹‚ž=õåRÞMÐ…jîﺳÛïf\p° nKÆq‹q !��ß Û˜cÀÒ_:MÓqìømÜóm9ä¨Hwˆššy1zþüyŸŠ–1øÀneÎ^}.‰µK)àY9 :Éçï+]¬í]»v¡-ágï8š4i’ÜÛ÷îÝ+/Lâô ”jTË6=82¸9ȸj"2@àH€o\Ûª[Ò^,¬û,À³ôM>œô…R.?~\Öõ«¯¾*'¿�>úHA¦7nÜ8â�«hÇŽôñÇ[q Ç:f�ü0„Ȇ ®Ä‚|A¢p–: @AQ®íÕŽÖëõa¦ ë6°®‹‹€ ïòÞ#@ƒlõêÕôÜsÏÑÔ©Ù/iÆ�/J¬Y³†êêêDïâ(ÂŒ�àM:‹¢ƒ©S.™œ‹{ ähAÔh%xSºX¼ð�¡˜æ]¾¾¢¢â‡9}¾ûÁ«/{€µŽoŒ°îñMK l–8ìÞ½ÛTr¸žÔÓ<}üYJÀPB »@8ò&ƒƒ0PH^d®Ž5´7žd†Ïc:©ú€6|¤­ãÓ¾¸ìDxß~çwéÒ¥@·ÉÜû~ÞŸÑ@ØÚVhj΀\ÐrΔŽÈ–ÉV�b¨~x¿þ3ï]ÍLi�zŲ¨âôì‚ ¶ñqö{áJ�mã²r¼Æç0 DŽÀaº½sÇÿhûæg/P¯’Jª)Á·Â¾ád-éçit€³5*¸é ò�ŽûòéOñ¡ç NMœ"Jù"æÛ95ó#í;£F�z�zq@X_Ž0gXY>ŽA¶A�Á̼ͰÏn¤.‘ißÜP÷ÖkæL�Lû6ÁÀ'Nœø´¡¡á]_G�®LÇ$»»3šëëË"/nS ;òßþ}îÝßüsÛq‹rúC˜à›üFþðaåUÇòc!Å£µÏ`ƒPàÞl6%J€ˆcZÊÛ!9¨‡èqú²åvݬÏ×nâH€%úœÒý–ËrL‹¥¿÷?Â;{m_àû¢&Û²Héû ý©ttdÒmm™Ž¦æŽÖ[÷:š¾l¹uv÷ícÇ6^ýðëáØ‹ƒ Ï40䥮€FÐ)å„gÚ^.Á!¸×áîÀб¥QˆMVï6D&d„6f¸…ã Þã›>‹�©ÐÁB@ øÇ(8 y8upô µÉªÝ"B‚ 1ËŒ„õŽ<êò‚çú¢ �H˜yKß&xîV(× ˆK¶o9Õü¬»³e3mí�çïíÑ×Ú ›C,ÿè{zjñÔÿv8`Âw¦ÊJIEND®B`‚infoGbplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-reference]icon_32x32@2xÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°¾ÅÆÇÉÎÙâïò$û÷º}úÅic10r‰PNG  IHDR+ƒsRGB®ÎéDeXIfMM*‡i   ÓÝê@IDATxì½ �mWyßÙçtß—–@HB¼z#AG6âê ÆÆr™L‡‡­x&eOyHb3¶L%Nbc^•”gp0‰g\vìI%1ÎÔL ¶•a\H�“JMl˜À#ŒîížïÿÿÖïµ×Ù§Ouß{»ûü×½{ß^ë[ßZë·×>g}ûìszmÍÉLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀLÀL`• LVyð» ˜À�!0¹çž{ŽùË_>qäÈ‘Ñëó¶¶¶ŽÅ¶�9™LÖ!µáx:�n„-óB®W:òY{ä×å¨Wü„:åëdëõ’2üëx­-«Ž×*»�ù�võa_êCítä!Á>$�GlY^Ù·¶,GeÕmlYÿÚj[6ö�]±gÇæø†-RW§ö …ª[ÛU:LX¿®«<FêüK¯lGËe‡ÂH3õ«¼íÊ5�`³ïÓÏþ‡×®m©—[¡?$’ônÊeöN÷O�HÒ‹÷̬÷Û·ÿXq�p+la²D+[Ñtô›åe$¸hyÜÖ�L–AVþp„¬ð‡Ëƒ])§]˜Ê^õÑ–6xBA´¾B-LJ_U¿øÃ8Ò $Ö·¦[›è@ú†?¶—0ØÜšò%o“Ç?M²?h}BýiXÇŽ‘˜¿ESŽÇaþòœãöQ�ý(í§¿ÒtØÀ/í²?Ù~xߌJñÊvBa;ÑÛÈ´‹NLå°E«ÑàÚæ&ã(< z—Øš! c*¼â(ôiô&œÓœ}‹®D~pØ ¬�E§¢ýÓ‘s*ÜžÚœNNM·ÖNoN6OEoOMÖ6KyØ…Íætå[§77·NM×'§NomžZŸnœŽŒÈ�²õÍSQvzº¹~jk}óÑÓ��~ôÄÑã�~ãÑ/~í¹ø¶?g?¼30�}Jo7N&`&°çn¹å–ãç�wÞÅëëë‡ó‹#»8ÖlO€Äñææ&ó Çv~lçņàž~Ø�{ê‘w<6¿^'Ø+ï‰%‹«+./Ä[�‘°G45ï¢cü…ˆ®ŽÑPQ©ñ×ùîì‡-̘‡YÐ¥ú¦úmµ+¹È~A¹Úöøt(}þqdîüGá£q}-&ñ£1“¿w'ͼ­Ð£lºöÕ¸&‰;�Ä-æGÂÓŸÆ”|$òÙÜš<²yzí‘�§ÿôKÓÇyñý÷☓ ˜€ ì�yïm{Ö€™€ ñ)ü�>úè±ð¹2Fu¥dóÒŸù ðC"hw2اÞóï¿›A º×ÆÃ}ø_}[�cA¾tÝøkë·§‚/ȱÔÚ·6m}�?ÂÔ@ ™tû§ËPAJÏáßž¿ae´ÓÐ�¿¶~kßž¿…þƒ¶þ>?ÿ_‹ñ?}Ž›[ÿO<ÖðÙõµÉç⠄϶Ø&Ÿ�Ç>{ì˧?÷Ìÿøú¯7Cõ¡ ˜€ Ìçœ1s† ˜Àa'ð®w½kzÿý÷?=WÇ"ãy!¯Š1_:ƒ}è±]xØ9x|&°*ø@ìLÀùÊå11 Íš€®½Ã¯/]ˆŠñ:Û�£i�¿.z…]$õ=�ÞÎXÚ¾ÏLŸô×ã÷ùלÇÜ‘¾óÿOb26¾0ñ¹øÚo„ü¿ãk Ÿ9½±öðÕÿç÷ÿñÌ\u† ˜ÀÊÐ{ãÊ Ü6�U%ðªW½êÒøþùóN�:uMÈç*àÏ‰íØªrñ¸M`Õ¼ãáW”¯YÇR V|Ë�)R|G›Q4Ž¢¤ PÊ·¬+û°LÓbÉj4ƒ� çÓ'}ÿð™¹é?¾ñM[Y¢ÞzØBÊ6õȈ$’©½!�v”'›ZªL7{ôCm ÚL€¶È>êÈê/J²…DRÛߢòn¬sÆ“^«½Ç'(¨Îá5Ã;ìtÓ†U2ÒŒ}•Gƒ»Eõ•/qþ¿�}8ìŽ' >×üÃÓÓ“ÏœÚ:ýð5ŸyãWtÓÅ&`‡„@¾r’Áx&`=�Ûn»í‰ÇŽ{I,\_¹Ï‹íê"ŸØ[Y3XUoyðæøí4„Þ‘"ÒŒ…ë%ÃîÈŸdyÙΣÇNÏ\»øZÁgâN`ܘ|&~Fñw/<~êß]yÿ½_ã9òÎLàÐÐkù¡�b«H?¸wÁ¼0Æþ’Xh½26|¢ïd&`£Þúз0Á ·SÆÏ“E@θ Va3ÅïØóÿ¤|:?¬×~bc<€ø™÷uú‹@ÿª›hŸO°ùôAÛ°ËeŠž&È£ˆ“Š-ähjJøQP>jßdÊ’ ý�ÏÈ@?Ô”KWfÊ£®ú{ðÜ•?¸ˆMíÁå ©¯¥ÿj[<¶#ÿŸ¯ƒzþ×¶NÇ$ûTÌ×OÄŸrø½õµ�ÿýÙý‡'kïŸkp28 ðþád&p°Lîºë.<¾Stû/Ɔ`ÿ±‰ÍÉLÀvD྇^F»Œ±3gpÎ=?‘G„‰…‚v~úÇ|Zùå‚Y•Õötãsý"+ÐW@É 4Šõ}ru’e´�  ¢ñtJö7PIE�L„t#f2¢A“1cåÊ©¾(`îË¡Ÿƒþ6ãköYÿÃþÏø«úÈá©ï�HÍpg2fì=~Ÿÿr ­­}5fïýqµ}bsmó÷6&kŸxΧÞðŸrbyo&pà-ÀÉL`˜Ü}÷ÝôïˆEáËC¾8¶‹öw—Ý;0�ýNà¾x1±‚fç8Æâ ?-ÎeB—‡²¨Ä?ÑN™åº!ÐÉú‘ÒÕ.Àg; Ƴ øSÛ’¨ _ŠÑ‘/=½ ÷m€ ŸÊƒ¥êB"¡×ÊcÆ‚�lU¿ K@ݶ׺S_ ™8þÐ!#µýiÛkËY©ÚµþÛþ,ë¯rMµ­ïñ—sçóÏù×êçNomýn\uÿæÔÖä7¯{èõÿW;‡|l&°ä;Ïþé�{b&ðC}± »-q·Çám±]f0&`&°—ðû,#àžà1ÿH äš"'¿��ñ£f–DYh@ë'd™vùHuí±ÛDÌx*,iÿ�Y;òK!‘Ú€—�4–rXÁUZÏÚ/ô‡FªÔÚWETÛþ´öË–·þùóø1‡|þ÷ÑüÿØó¿§ä·¾rÞ7>þbÿŽ@{IûØÎ)½7žÓN¸qXu÷ÜsÏúŸýÙŸ½8ëǧüúñ‰~„¶êp<~0�3Bà-qvþW8‰Oä#E0�ÿx3ãhø}Xeâïþ–(éíu; ¶Ap »ú™Öâ̓ô�ötÅ�Ÿ‡DB¹òpÜÜ dúÈ›¨�ö7ª¼±räÕIu³w³þj[èËÛç×<þ$ìó¿¯çÿ£q=}üôÖæomæÓX¦|{øØLà,à{ìYjË͘€ Tî¸ãŽË"à¿m}}ýöX¬âSþK«b«&`&pF ä�f•ŸØ—OäKø«<, #JíŸ È<Úa¯|ó°Ïp>ÃZþò¢¬»«I_ñ#ƒñ5Ò>%€›È…OxàM }º Y|)ÈÇq¶”’åUŽÛ¤º�Hè›òp,}§åÑݾpÐd´Å ýWèÎãÇI‰!Ž™óÕðjy³Rµ[È?ÚQ¨&©­ßœnÔ€U‘íÑlýÿ•‡Ps܇güýÓ_Ч>ë¿2Àsì� œEùJvtS&°Â&'Ož¼,þ4ß÷Ä›ý÷Å?ÁÝ­‡W˜‹‡n&pàC”²` ÎÀ¥Ý‘¯�]ŸÜ£› ÖCf5ÔÂ?Ç?ÖiKÒ–ÁS4È€&ñuÚÇ7 0¥”}¾<¦·ô¿ÓO¼Û€*œ’B3ÈLÃŒE7'd±¹(`\Ôžúâñçkyµ|}þ‡7´Ú¹;œí(æ´|ÛúË·ç‡/Ùä£qeÿÆéµÓ¿ü§_úÒ¿xÙý�8v28Óô¾z¦Û±XU“[o½õ›Nœ8ñ]%èE€ØXU· ˜Àþ!Pÿ€Xøç¿X–#:çQöy�‹w–Câ_ئ�üä>ô?râ“TÜ0à§ù¡ãO"¥uÙ³®jç |ÐOHñ“VÞ|¨/ í+ÇÈ…Ç,…ZØP¢¬±�¬mS€Ï4 ß�H»m/ê«�p'Icõø}þ1fæò0OPˆ´ÛùžpµêÔšÿ_ÿ¿ºµµùO?~âÿêÞûñzÎþ{g&°§Ê;Õžú´3Xu“øNÿôë_ÿúÉñÆØîŽíتCñøMÀöÝP¤ÀÇø'ã_š\ TßÃGÉzæ2 ÏÑК¹Y¯Ô/v}iä‡C~úÏŠ½†¶t$™^°ôùˆ àÑ/å¡;m@ÍÎ*h*íî¦}´Q'ù‚D¸”‡céóÊa³LÒX!‘<~ŸÍ ̇}8ÿ¿×àG¾±uêƒá�7þºˆ~:™€ ì �Çû^º7­Û‹ .“Ûo¿ýéGŽy} ÛS×ð<0�ÃD€7•GRà­Gð±ÞÆ'÷ D•;~Úˆr†­Y=ŽPà&þ¡"ì é¹ø üŸ?Šäví øÓð¿sØ(©ËámQB�¾(ȉÅIÁÑNÛSÛ�Hj ’I}É⮯óìÛþ.Û�?¨‹9TŸÿnNæ„Ü~¿ì|;ÃóÿwOmm~èKßøêG^ú‡oûJô¼\TÛ�Á¥&`ó ”·¢ù.1Ø–ÀäÆoܸòÊ+¿+¬Þñ÷÷ú·EæB0�ý@@7¸x�@µÀ©G''å ô·»IÐ=Æ�\ÔÆ¿¢•U…ndI–ɧüdnìq£@õ©•¶"_¶òSŠ»`Fö²žüH¶ûnýÉïN墀«õ³×ýÝkm{üÃX˜ïb2Æn¯Ï×^ûëóvy+$ÒœñÿY|ô±Ó[¿xÝC¯ÿDñ盄… ,CÀ7–¡e[H¼n^õªW]oš?ßS}sÈ« ÇLÀ�ü@|× î µûÀ½ Ì3W èGÊîc^,Ã3ÀO >=7H§ÏÔùjÖAèù/þ¹0){–%UØ,ÒpûÛxBÜ�>fü¡o tøG¿TÁ‰tH¤eo0쾿l¶ÛíÞŸÇïó.çÿÚ'N­�þûÿöøé_¹÷þ{ý[Ý•mÅvF ßawfk+Xu¼^îºë®ëcñö¶ØþJ9±êP<~0�ƒI@¿€`T‹�>~@�ïëyþ%€ˆQWy¬Žä­÷Õüj"€N©×7 ੾Q° å6Àmë¢o²iËp¬2H¦a¼»tŸNú}ëQúš;ÓZÿm­EíÍÔ÷øëxß翹ÁÕίEÇíüZ4·ñ÷Ç›[[ÿè+§¾ñ‹/~øÞ/»rÑnSËE&°âôž¿â<|Ø–€ÿWÄBõ±Ýº­µ MÀLàÀŠüÄ×8s…óX kÁ€à_z–çò�·¢ ke@�#øÄ‚ßç×Â_yð„vä�ÇÑ*Vðùù[ÙBÜ,ˆ™šˆ”ùÊ+&gU¨mH$ôSy³7fÇÃJÝNœ ‘fíå{¼½ÎÑYS¶ïÏâñ ;ºØ~ûö†ÞÎÆÑöýY<žaÛoßÞÐÛÙ8Ú¾?‹Ç3ìãbû™öÝ\;ýK§Ö¶~æúÞôï‹79™€ ŒÐ;éH‘³L`¥ t×ÆÝ‘b�úΠñÒ•&âÁ›€ *x Á%ƒýX.ã÷üùÕ €ÎŽ528GX›á}¾\¦Ÿô'{Èî¦B˜éÖle©zÑílÊo è¾æ¥e±_ÚžcÝ»¯ ÌÇãÍ_z<åë;ýJÂâ€ìñö|oêyüù$ÍŽÏça=ÿk[§7·Ö~ùôdëÝ×?ð†‡Êìò�€½¹ÌìåÐûí!’‡b»"ÀkÆïk_ûÚw¯¯¯¿3ÞPoØ•GW60�}H྇nŽ ŸÔgR  É=^ à#e^±ãù \òÊãÅSÁ<>¸ÖMÔZŸ†Ÿ’G»æLÜ(Pd8(­ÃÿDŠ–H³¿ì°%å�»°²§äp6úDq.Á5élÿ‰¾wi?ÃÓãçüßq@>ÿ'Ìr¦çëLûþüÇ}€­_}lëôO^ÿà›>™ Ëä.&°Êú÷–U¦à±›@®^È!¾ãÿ=ñÃ~3®508¬ø€\íxÌ%$–ÿº9 \Ý @©~ðlÒOȲ—Y†ãüMÈÌË€žzõÔü©xn}¢|gIÁýx€ºØÇnë·-쵿Ö{¼Ûöv[¯ûÓú[t¼Ûþï¶~Û¿½ö×úo�wÛÞnëïuZ‹ŽûþÇ�€_?µ¹ù£×=ô¦J-:™ÀJÈwé•FàÁ¯8�îˆ'ý_ á¿<⋱N&`&p¸ èG#Îî‚ø6`×2ZßÙ_/ŸÉë¦�jò†Bwúbèð²6?Ù/¯´ îÑNÖ�=oÈ“r3G¨³ü'þÃs·lýeí5Ö”hã½a_Æ�d ‰4¬¿|Ò‹öËÖ_Ö¾ëxÿÕ�ùÒãïÏ9(ùü÷s Ú²O¨ gZÔ?3ìC§Ö¾öã×?ð–ÿ·”j²�}d+@¯0N&°Šº¹Ÿø?3 ïŽí{D—¿ŠP'Ë��ÅþY,×Þ>:ÿ_Ùš¬ýô—�ýù{_|ÿ½�–Qb0N&°Rò�{¥†ìÁšWjk¯yÍk.:uêÔ;cÁú¶`rÌ\LÀL`•¼•?¡5í Pº@¿ßÚcŸ�ìw�ý4êÅJ¯¦¬Ãï|gm,,dŸŸß£� ä_=dÞPù¬•Z.OpÓ mq¬ ÒµvoËaS§Eömy]zã¿9\‹ñÇ@¢[óúÓúŸqPµÑ¶=Ò¾Çßðjy¶ ÷˜ÛœÏÿA›ÿÿisrêÇ>ò©?úïßµö.]´’íäñ± :x s2�U!Àù~ã�7n\qÅ÷Æ¢ó¿��_º*ƒ÷8MÀL &P Ì»�›7~çrAvú4�qg-ÌúœÔѦìk[•æ ”¨.•8Ž›ô¢Ül`Ü ‡ Ó¢€o¡ƒskz"rG©­Ð:Ü‘“sgÔv·ΞµZ‡ œ[ƒ¶»ípö®­Ð:\èàÜ´Ým‡³°wm…Öaçà÷¿~ú±·?ÿÓ?ð;]N^mÕ¡U8|pE8™Àa'ÐÍóxÜÿUñ?¾ú°Úã30�íäW°PƧøý#û¤Çå/à4?ÉÏöèçS°Ïú¨“µ3œ‡eï;?ÍÏ<ùÄZ;ëàÖB.Úó&Cxà ˆò„ÁL Zä§Ïåöª›ãÇȆþv[¾¨7‹ü·õ—µoë·Ç‹üí¶¼m¯=^ä·ömýöxQû»-oÛk�ùß­}[¿=^ÔþnËÛöÚãEþwkßÖo�‡íÇŸ ø¿~úÑyÁgÞüpe #'8”ðŽçd‡•@7¿#ðQ,&ÿnl·ÖÁz\&`&° ýľ¶÷Á:^<3Ï—Ñu㱆˜Æ�=ñ¼ŸÌ«.e”C"õ%¨£ôý1ÚÉ ø‚nD ­J/>Qk< ôð©¿ {õ·{BÜÉÜ\¿Œÿñùöo¶!’ÍléâÕ…;�ßç?o®a>xþãšHà1'=¶µµùó|êOþö·?üÃ_¬lò¢ª2¬šÀA'�ïÒ}î¿ tóúäÉ“ç=zô'c1ôÖ0ÉÕäÐÖG&`&°’êßЋ¦‚v#ˆŒ=Cï,Ïð<óU’2ëcØD=Ù#¨ÅÓY'uXÁf+nàÆËp#•b©­¯ä ÔAA),žiØåÁc[޼: äÅöu]èmý¶¼m¿µ–c¬ Êè=Ì•—ž·¯?ÛŸ¡ÿ¶wËÛ·Úþ´åmû­ý°\cå9WbÑß Ù¾þòãYä¯O{ÜÖoˇã[Ô?�¿?ç ¹ÏÎÿ6×¶Þzõ¯ÿ§ÕYÆp2�CC¯XN&p˜tsúÎ;ï|ùúúúbpÏ=LôXLÀL`/ð@D"zÑä÷ôc™›Á| È»p<óœÓ–��u©ÎúœF�2Õ~Òß×€†ÔÉÒ¿¼aù¥³³«m³p¸é0ü„8?-E^&4¤:Û¸=KE·ÆŒ&¥wÝ]Ø�%Ççñûü{þ×OHÌ^ÿ[k›ÿü‘µGßò’þÏòÒ[x©ÙÀ�òVzzê.šÀöº¹ìOý·åR0þ`‰¨˜÷¿€qÿ>ûç§óa_�üq¾ð5ûhAa<>ñW ™7ØÃg±–D]4ÈvY»’G-ê ˜¼9ÐÄÀ·¯Û½UÀÍ6iX¿3*©íù7 †õ·¿È~X>Û�SÙç_Sz8_Ï?Õ“ÖŸ�o³3_ x�ÂǰþâöÙËgûs¦æÿÚ6'›÷]ý©7üJT Hº¥ 8;}'õÿÖøÔÿƒ1úç¬ÖLÀ–$pß§_Ëõü‡»4å! ê?³ïµ6(Ô+¯Æõ v+ñ_�çý éV‚˜c1ŸÕô\@–d¾JŠc:Ãn FŸŸq&9†®R§¨lïÆÎ5•¶ýÙö†ö}ß1.¤áx2¯Þ{ü=£Y^-ÿšôÙó±=϶þ¢ã¶ýÙöZ˶¿½}ÛþLkQ]6Y¶½¿¶þ¢cù†D:èãßZÛúg2ùÒ[^ú©ÿòÿËå°*ݪ (åÒ$ዾ£”Ö(C`_F®›ùI?,ò&Šq7ðÔS¹!€Ài&@iâ‹øÄŽý€KhS�ñ£|q@ÓzA¿Ôh[öxú7ô׎¯í_[Þu¥ ×ã÷ùÇ•æù¿÷×0ýØŸL¾|ŸŸ˜}ÝsÎÁ!PÞYN‡ÝÓ•'ÐÍYê¿òsÁLÀvA€O”WTü™?™ëå{ÿ($Ç>þå^/¾ý÷ùÑ8ÃýÞ&Œú”#øÇo èûü˜!Á ÂþyílÿWèzî® �Ûº­¸¬}[ñ1Ì€Œ¤£î°t,Guu`3?-;žeíç·<¯d8B�ßçÿ€ÏÿÏŸÞÚzË5¾þŸÅŒÏ‹:§~­Ï»œo眀ÿ,Ú9?îÀ´ò™ÜqÇ7]xá…ÿG,(ê{/Ѧ&`&X€#êÇ ëfY¶nƱ‚eØ 0ÄÆ5.th[ñG²�UöÈK›Þž‹{Ö£!,Ø?$¶Í¼ô¢úñˆÀÀW¶ˆ›¨•R¶’(Q_RæØJ1-ÊyPú>ϾÅ!ÛQ¿àDŽ$sÜð [õK2ÛËqc زfJè°•Ìzý˜a_çɯdúW_ =~œ;qH=Ž„ˆÀt0Î l}þs^æ<óüÌ«H—­OÖ>úðuþåß~Æ{/â”Ê�.ô*˪ ì?œöß9q�f äŠ)ó'wÝu×›666>‡þ¡¿YVÎ10�ÈOßaÞ/ðªs�›�$nÐyñj<�æãúˆJñâœÁ|úÀI«à,ߌ:%/2r!ÝKØoê¦B´‘�Zô"”Î?û†�Ôaˆš™‘ãÀ,g¿: ³HêõÒ ÙÃtùË>äø3DÐçôßÚÃgÖM­×Õ¿,G¥éN²$ä˜õ—$é‘c -Ý¥Â<ùϾ«8¢’$õÒ Ù·ãñøAÉçó@ó^s¦�/ …¼>I×üÌòÃ6ÿc<÷\uþÅŸøƒkÞ÷b„ºÄ ¥÷H¬™À>"à º�N†»2J@stróÍ7»ä’KþA¼ù¼aÔÒ™&`&`;&ðÖO ×ìXÐó«öå{ö ŸcÝž ý ¦á”ß㉜ün–É‚_#(åùÂ�où£”·øõÜ,È|þPt¶5Øf¶Óa�„ö2�‡�޼ñ„ÔMŒe»ïüGqçþÔÖ<ÿòœ½ËV”‡úÒûòk³dh±¨ýEåhs˜<þþ,„æóïùs¾¦Í^ßË^_ë—×ÿWOo�~ã5ú‡¯C>Ú¯Ö÷kÇܯ•'€×W­�&·ß~ûÓâWþ+^¼ïZy2`&`{@à¦Ï?5¼ÄË,_i»—[æ!d×b%úÁ¾ü>—çƒMg‡Ut©� )Ãд�®›Y=o<°~êÇÑkÃwüËç Ðh]Èn Mæ 7¶a@<̃]›¶·Oߥ-¶£v[?:.FìKß7õW7'ô©?ÆÝß,Aï=~1I¢õ9íÙ‹'ίÏ?H�SÍ ó©ÎËœáÞó¿g4Ëkäú?º>�Þó–K_}ÁóŸöäßþõÏÝ_ƒ¢õ‘ ìxp2�ýF ž—ø•ÿW¬¯¯ÿÑÉK÷[GÝ08¨ð#€ ˜ Äÿi<�*B-$QEÓÓ”б¼Xö�}±Ç_ ˆ%°ê#þž"ê‡d�®Ú(øÏ' ¢éhöü$>{‚u ÝÒ§ôÈœ  Ã@yY޾d£u¬Ð³c‘W%µ™Iµ3#‰d�Îò¦õE~Ûõ i¶½Ì×~Ö>oØÈ?¸«Í1M÷ÚNÎöÇãï¡AëoØZXçB积›'|ö|†Eõó­;é¾”Á©õïóîæܬûø'_ú¾ø+ŸÇ©á Ê]­WÙVMàìÀ3xN&°Ÿ”·3®Ë&wß}÷;"øÿÍè ƒÿýt–Ü0�C@ –ªeI ‰O™x+dÀŒ¤äš62ÜÇ+6Ï�º :D¥ó�L¹y÷Ý­ƒòJ¿é;*†Î~„ÚØŒ@XSØ ¯·OýË *üt°g%(‘è´ÈZga7fµŸ~ÑŸôŸ}ìÛÇX³/ÉìrüÐÂ?ÿ§„Î$¨‹”>ÐNêj ÓQèiß·�~!OýÃX¡C憺?(d|ÈZ/¥%Kü“kÏW¬u¾|þ=ÿs.Ì^ÿ1£n¹tëâß{àº÷ýÅÐë‹°Ösâyo爀'ã9ïfG h>Nn½õÖ �?þáx“ý®QKgš€ ˜€ ìŠÀ}½,‚ÈXÀ†ì± Å üã§,ÃRJuŸÔ3?åÏOí‹eôgíõòi>ê±½(GƒýS¥MµÃjñ¬ÌºÖÙŒ1/Ê‹‰”²‚bä Q^ÌÚ÷>f­ûš aS§…þšþu]QàÎÔCømýÕmA÷ø{FàÑòòù/7¤t�t³Ëó|¾ôsˆå±ë_-z}ÉëÿÏÛÚ|Ûµ¼áðIÕ%3×{8üÀ9€î&gà)ß•BÞvÛmמ8qâþg89ÃLÀöŒ‚¬Iñ¯ ¨—µj–f9F™ÊUŸëZôðK[ÅÔá;þA‡Ô =ÛìZ‡Mö{ê¼Q|…>ó‰,ìÃ)lÓ¾—jK’í†Q'CÏ1e­Çåå_?æðƒÑÏ"iÅ%ýìøa9–à©ó_t¸Ä–}O Ýã[HÍŸÿyósÝó¿\ó¸òÔ9¸þ�m¬Mß÷™ë?ü‹½ê¿:V.í¼Ä!�LàœÀk‡“ œKšƒ”ñÈÿwÇ¢òCÑ¡ Ïe§Ü¶ ˜€ vú+XŽrqÖ�üÕO€?¹GÌ¶Óø~?ãWÔc ^ØÐ£¾�Ò§ô8Î(zG¿€Z8£ŸØÁwd"¨A’‰”A|ÿ‰?ÚR^Z ÷ Ž*ÃRô½bµ…E‰ãG* =ª/�cÛñ kç¸eƒ2é�H­�ßç_s"gÈpïùß_CC2yÔ^î3/K^ÿ§·6ÿ+k�½öÅÜûGÑ‚^ÐX­gãÞ›ÀY PÞ:ÎBKnÂf hþQÞu×]o‹¿/ý³a¦üÙÎ10Øo�¯ ’¬ƒû: ÇK1I¾ —<¿Ï�|úŠRÿЭâjè(ÇM´�O»×YÍF™|¢�ÐaޝàG±*Æ�ÔÁqÐ*¸Q@=[Ž6¢‰ny %2èeM€8,îMQµ¢|;3ØNÕÇ”¬èPEÅc‡i ‰Ôö×ã>åŽóÙþ|©.$“Ï?… 4vbÕó/®ÿ?þÒé¯ÞñâO¿õ�B¤‘ò"OÝ{8+òöúYiÊ�˜À€€–=”ñÉÿߌàÿ½a¡ü�±LÀLÀöš@¾Ü"˜Ü,kPœüÇ%ih!±!2W€õ*B~ä)ôG}Š'à63Ä3Øb�`¾Rïý‡A´C[Ô#ô#%Ž‘XP´ÔÕ~–Öå4c�Þ2­z?½}¶….”7þA²_½ÔX;­tz¸¤»^"ù)¡Ã§d­#�vÐû  3rYHYë,dyj�»ªFq\YåXQÃã÷ùïæ½çÿ^_ÿO¹xãÂß~ðÚ÷¿¤\|y÷$.A'8+4ùÎJcnÄ‚@=ç&7Þxãúå—_þsüßk:&`&`g�~ŸÌ#QFPÊÇû‘Qiý¾ûçÓQGŸ@ó“û0Ç'ûXÞ½Ì+4M¿ÙRæÁ7ð—³í8@°]þÁßzù@æ²½cp­ÀÇÒL#ŽØȬ }�˜ÝïÐ9U�Êñç8aÄ%Ç3åá¹ö/2Ó°`WŸwæ¯ úÓÖïó²= Æãœw�“äÓ쇧göüVs5}þñúP] _±öü½þ¿zjrúµ×~ê�ÿªÌBI6“Ó‡&°÷ð’çdg‹@=ß&·ÜrËÑ /¼ðGãß{¶:àvLÀLÀ’À}ŸŽ�ÊB^7,Q3Üà w,MUΛÈŒ<ÔÍdÅ!Sx`=”!áFÁÑ>ü Ù‘{øè|•%p¶_õ£ø¡3Tmô(WÐAú riÆ_ôIy¬Ž~É'2¤ïÐ?Æ×Õ©¯¶ YܶÏÜ~7cÎ=þêÏ’çg†gËÁùëÏÌmAý…í7ngì}þÚüÿÆŸožþ«×?øÆ�•S›>_ ›“íC8ü€3Õ.G h™9¹é¦›.ˆàÿ ÝÁÿ(.gš€ ˜À™%€àñæ&‚éøÇ?ã—·JÃã€Az‘üT/êå�ã�§ #,e»¼ðÍÇý£ "ñëTa”¶¼‘:dÞhÈ· V��§¬ƒÖ‹:Hл¿HŧS�ŸTè6t±€$‹(–¤¥\CÆÆúE¦Œ¯ïŸÆ¯öÅ ²ÖUξ£1†ZW¹Ç¸=_0Ò< /œŸNUî‚U'k]Ù%Ïó?¯e\ë`‰H’倂E{sý=:™~ä¡ë>ðl Í Z(G&p†øÀk·õ ÛÚË_þòKžô¤'ý˰89°ò� ˜€ ˜ÀÙ#�+^Ü|‘Æ÷üqæ¢8;’ c[›±@†d0ÊE0Æ“eáLYÎú}jÐaÿ±Aeü�²È¢Þʨƒ[ÖÉ]ìw¸@‡W¶“cb¿#Oýgb,�lCm¡ÑH@# =ëIf=ä©>{_ê_ÑÑl?$6¸—,MuØ0ê!©>�à0ÿe‘ŒŠ]eÏóÅeôÙ�ßç?æ¬æ­¤ç?.\�)±?K×ÿtc²ñ ]÷Áw ù²¡y¤ª7™á½ ì%ߨKšö5F@/b”'Ož|ÊÅ_üñ0¼iÌØy&`&`g‹‚É jµÜìÕÒ”s‹Õ1 q¿Ù‚È2 cE²}V;ö=Žsü³7Ò r£}è²GG˜§Áz±-u*¥o¡sì·d¬Ç€%I-|y»rèóϹÓϧœ¯AgÎüVIÎÝ8Ð|æ%Ô\ÿÈ“?Ú¯Èü?2]ÿÉÏ\ÿ¡¿sËÚ-x‰¥ZWž¥ ì �õ=ñb'&0N@/^”ü?ïèÑ£ÿ&$Ï7w® ˜€ ˜ÀÙ"ð’/>• n²]Pˆ(‚\ô"ƒÝnaJçÀòûüdË#ûaŸÁfJÖN'é/öøÏ߀gf;Y/ôlrà§óÏ:´€U¦êŸtÃ?ùŽRéÅ+Ûfp�:±!À€o&KÛ—ºð3zˆü’ØšBË:’4‘-$Š‹_HêÈF^�ªC�ßçóÉów$p % ^c™‘7Êõµß®ÿøÚÓÍw]öÍO¿ôIGã㟃ÐÕ-‰Q8™Àžð{†ÒŽzÑ¢¼óÎ;_tìØ±ß‰ÌÓ;š€ ˜€ œ ±ÌTPÉ2^­3€ÈEt®˜Ëº�(ú»þ €È‹ï÷ãƒy&IH¹¹µ7 2?@G(‡Ylè'ô”œë†CXõ>©¢"²òÆ‘cˆ>!PÆÿ"»vªöX. ±©®üÉ7‰틬ëFž_Ù%VÑ�HêѶäXXõ;û¢ÏõÏ�_ç«>‡ÿžÿìú�¿¤òý¯[»ã£ï»ò�óE„¯bÔðÊåd{JÀOì)N;+ôbEyÇw¼`ccã_GÙ%&d&`&°?Üôŧ±#øÑ=lü‰ Á¬òJwQÎex Ü/ƒcØëWþiÓˆöÓ7¾2"�_ÈOjù'#�mE;øË!¸äE¦Ò>tuTX¾¢;hKíIÒ‚ý ‰ý)²¸g {ÿêê±MÕ/v�hý5í©nï/Ç L#tHü¯$õ0’Lû¬¦>k¬9ú⃎Š]ÓÖS^˜3IÆ�Ú‚¤Î®…êŒ%Ô­ýI/öµ�Ô=~q NŸÏÿ‘ë?^û®yæñ§¾è’ó/þØÇùäé˜+ºJ%Ç®Fç™ÀÒüÀÒÈ\a½HANâ“ÿçDðÿ/B¿xA=›€ ˜€ œMX€âHÄmüº´Ÿ9(Î^ðëý bÊ«<~ܯNp×'†¨¬�<Ôƒ§ÌEŒõvQ‘ƒGJlqȺ\,gÕOɨ6›ä.ÛúÑóÐ6$Iªy ñÓ Š?Ú« ,ÚÉx޵ ‰ f’¡ÏôÅCà‘S¥¦¹™úáÛã„`† I’jøü'ÏL�˜s._ΟmwÍI[åqÂeílâŽ×�ÿ—>\~ù2”L[ïM`|`ð\u†€^œ '·ÞzëSÖ××ÿçÐ/Ÿ±t† ˜€ ˜À9&€O{ãÅ»H’µÎ<”ca*Éh 2�[D’¡ô²»1ßñ gü©A$þ @jeA]tևަà eÚ©o�Ù§(F`ƒ î%³©Ì‹l$ôC’zJ–¢¬O«Pá;R׆XÆÏ¶0´C‰Â¢CfÕ^¢ˆÆ)k=Š2Õuj]ÅmÂÆã„„ çB:’d¨>ÿ€“4ï%É- iCµ�o˜âžÿ9§0¯Îðõ¿>™|ßû®ÿ«/ZÊ7+»seÅßx<Ô\gŒ@ý"5yÙË^vɉ'~3 Ÿ1fì<00�sM@¡hô#µ8ê>�W×b¡;Áb¯ðE²Vô =ƒ­ ÐG1‡øÍ@$ü R¯EÛOI_ÑÖþrÛ/5о’tHlUÿº&ÚX>äG²É¢Iì:JëcEe(°-ãsS$VIµë&Q‰mB†BJÉKm˜çñ'Xq¨a‹×ञ]ØCHn±ëd(ðYû÷ù/“9ÀhÞK‚’d¨õ)©uÚÕ¶dŽº¡P‡„RòRæé¼Hî¨:”·lKY]»‘Á~D|ÖþÏÂù__[ó§¯ÿÀ»¢åvD:Ž"'x||àñqs­!½ANn¼ñÆ .¹ä’_ ýº¡™�LÀLÀö �²¬ŽumÚåUœŸÞëåB72`Ü,ðõ:ý¨$6¬™‹ÌÇÏã òøé>ò‘Ôh W¹a“7ò&ì}çŽqˆÅ:’ð°alGìë,šÄ®“¡À]3~æ¡ $Ø"±NHÚY×…�[õÚ¤²¹ömƒp ¼P=þ$êóßÏ{Ïÿr�è:‘¬.dq‹]'C©¯aèH’Ða‹Ä:!i_d]wîõŒÊU*×ÿÆdã¿yðú÷¿5Jê`¨ãª’UØ9ߨ9+[ŽЋ_ö"ø?vÅW|,Lo7w® ˜€ ˜À~ €[/àìO½ mÈ0Ì KTŠò|$8*AGd�:ð��6¡F%ò‘7huÂ,ë 0õþDdÐ"øFb½=mŠ�ìiWÐ ¶¹èŽÜNÂŽ‹,®™YL‹ÚC9ë‡dŸ¢V'C—oHlH’Ðùß­½Ç‚Á< wç:òbóùï9xþc¦äœHmñõy¯ÿ£“#?û©ëß÷W¢k˜¹H­Ì\ïM` ¾°,›Î¨_„&×_ýzÿÿ$y·ÎX:ÃLÀL`ßèÖþ% ê¾P�[¡óÅž»ø³<*1¸Â§ôÒcˆÅ5ùՂȆ亹<�10ŒY�2íCe„™õj›¡ž6�9Æ�®dEÊÞ{±…¨3¡£ž$õ8�ìÆŸXµÊ 0ë6 Ã$õâ~iÞïØjBÖz±hüÓ"òæX]Àõ%©Ç�d5ÖÎ_•çñ‚‘,çyJ`‰I= %ÇÎ'�ë�œAÖz±iüÓ"òæX]Àõ%©Ç�du®;UžÏP!ÉrN�§–H�Ô£Prì|Ò¸ÛMޝûÀ\÷ wG޼¶²3¶b;!à;¡d›1õ‹ôɳžõ¬ÁÿkÇŒ�g&`&°Ï”O¡ùÉ|yEï?�ïûŠ"˜r½ÊOú•%,` õâ²#k³r #n(7 ÂGè8ÆÆ„²øÇÃâþ»'à…ؤCÖz)gõÐ!©‡�$íÑ ê)¡R©ßéTzS5‡º¬Þe„!3æT€_”ÿsèõø;p!_òßÔï|Í)çÈ¢$õ°“øF[Hð�YëÌœí| iØÚ@9|J†îñ�ÂAç]’k¦â&Y³Džò%£œçºHêQ&987:_ð‰YëÌÌ& ª9(ÐûŒ¢Ã‰…EB‡OÉÐ}þƒGá ó.%cü6ΛûÈ'¯ÿ‡ß–5i5r¦˜ï� ,$à Ù`„@û¢3¹ûî»ßvo±u– ˜€ ˜À¾$P>Ù�…9}Ä"“dd1 �Ìxõg(«ÕþSÿò–yÝ"å0ŸÄ2z¤[î³²ûVà>ëe�(AÝ0¥uè�µŽrnð }nRdw‘,‰Jvãï8°JzÎêÙõØ©]IXJ‡¬õôÒ�¹ÍaP'ê£)ä±ÉJ§ÝˆÿÒL%èN¸åQåÏã÷ùÇlÁœ×¼—DþpúäœæTŠÝØü«ój¾"i®{þY$�Ø×ÌB'þÉäÄ…“óõß]ýs/„E±meçŠ lGÀ7¶£ã²1í‹ÍôÎ;ïüáøéícÆÎ30ØŸÔcާRfÀž+ôx¹/+tüz?Ÿò/¶ÈÇ›�¾2À%*l•<„äS‘�ú̦d²²×½äé §*¦)ò‘Ç>ÀMÑÕ_Â?Œd(•P„Ê4¡ÞßxàâX„´²ÖUŽbêT £b‘ìƒtHD’¤ÞØ×y0mŠÑ‡j8ô¥~eŸ¢ê°íPš ty4A[åüsÌ·d©c¸Q;’tt %RÛa6;Ê4ÙÖ¾ö1âm{üÛœž÷I $OU‘©{þ‹CwÝïÏùÑ…þÆÿö¼Ÿ{nœ]^‚#2²œL`{¾°=— ´/6Ó;î¸.Èi@IDATã5ëëëøôßÉLÀLàè^Ðü!8ˆ„`½‹¬&À(¶Í¢SÂ0òPC_ȧP€üÜÃ'«BÂäC"“†0èR @"³ô$ìª%Šl!cË¿,�²Öé3Êë¶ ³šdiy]*ãçØ(I¢=Yëj�~*‡#Û®Ç ÙI*Ï1�m)®Ç\ëê�Ç ðç\ç]’¼ûÓÀCŸÿ¤š÷’Á±žóµ®ù6˜ÂqÀùWd=çÙ÷g£Lð‡ÌH3ô§ô ²Öå¿nó°�ÿ˜ÆOºìÈù¿öÑ«Þu2&°�êÝu©z6^=z‘éäÉ“'¯ÙØØøP PÞêQñˆMÀLàÀÈ`;Ð’,•'8¦xi�6^àù@‘ ¤Ó.vX�#…à'ýÔ·òÆ=§žO¤íDuÂ6µlrŠyÄÛ 8 ßN¢: %¡#I†š-¤„Þn0— ô®.|Ä–]H ½ÝX;%�26ú.²ÖÉ©¶-õÕõÒÿ˜žÿÝõ'{uýÇëôso¸èiÿøÆµÇéõÁe‰ '#àcTœ×Ð J'o¾ù拎;†?÷wakìc00�@ ¢B¼¨OðÅrµ ¹12ÅM‚Ðq“`³HÞ0ˆ2I¾1tdМOxãa¨>…Cƒ4…(�ðB2žA³ì‰V·¬4E/‡Êî$:M›ì|i§4"Ë:wð–yÔœJ™.¢?¨;�[2+Óc8 �Š„®ñS–qCçÀK·4~4�:’é+óXuôvCgi“�.픆BdY_/\d”H¨&™.<þžCÂñù/“sY²Ì{]œ›%Ïó?^Êu/©ë^TÁL’dc' út2½û—®{ó;‹9²hRÉP�L`œ€oŒsqnO@/(ÊÁñú¥—^ŠOþ¯V¦¥ ˜€ ˜À#P^Ý7#²�Ч>é×"“(Ä>$�ošKþ5¿R/Ä •ð³{`wÂYÐp—:|bc*ÁlÐ7vŒyð‘IäØFÿQ‰�ã):ë �m �öE²°«¥ÐYVd öô9]ßbÔ!cƒ É1w .“WzSšñ_·ºÇ�[HÉÁçs6Yä\öüçõƒk°\7¡æ|Áœ‰�¼ŠLfˆ|HZôvMš¹>ÏÐõdºþ㟼æço�æÙ»"Ñ›ÒI¨N&0KÀ7f™8gœ@÷âr×]w½#L¾sÜ̹&`&`�BR¡ÑY|êŽ0¾ã_/^õÂψ-;”— Πw)Íð¬`Œ­0¯_x§m©•Y¿,¸¥CR¯$땾°Oe± =¬ÇC[ìØ£ ÔëÚ {¶‹zu]øŠT÷©Ö³%·Œ‡}jÆ?h/ÊX£ØK‡,ž:É6ê>…NÿER#É�Ø£�AÂÛE;Ø�$C­ûTë´Ãã�,ãF<©IZF™$ì¤CR¯$Üv})ýcC—šÐ°ìÔ÷9öhcП°c»Åž^ä#ê>ÕziÍã�sÈÏO‘â,IË(“ôùïY€ ¹ôrzÁƉò;×þ½göY­ É{g¾0À჆@ý:Ã×�Ûo¿ýät:}WcçC00�H�ÿ3Åê›*$Vâ%Aå#ù² ó ž },Lã1€.ªêå ?}á‡ñ½~ù--v«T4µ6¬»ô¿t•p¶ô¨µo, mt²TQ»8¤½l0¶ÊôøÏ$6ØK²nH¦q1 Á$(�e’ê‡$ìõé>d­§³‘=:ƒYõ}âÙ�„]¤º=öyžö�î‹„;IÖ�É4#(yüIÂç?æEósPóP ê9_ë qd¯¹YÍEÍg¶ƒ¹ÅjGÞ8w‹Ô<–„?º/:Ê$e'™ÆaÄJ!‘ÎîüÂSÖ/úØßÎ[Ï‹–×i¸’ì–w& š(:¶4Ћ$·W¾ò•Ïiï¨äCç'Yü/ôE2»ØCWŠâ.á3?¼�è+& ëM%C…\™"U³¬ðT"ÜȶÑ�ñOÈå²Öá©k­g©z“Rã–ŒÊi&©JÛÈR£ç¶ÊCµº�ÐQ&YëÈc~´-9Ö”!É^:3cWשõ®¼(h›ýgäaÌ·d±ÝN°.ª— ¶ÊƒÞöe_±“®ñ ÏÌ 9Ö”!É^:3cWשõ®¼(]Ñò0flÒS[¸/5<þ U³¸ö|Á†ç·ØK×ùôù_<ÿ×'ë¯{ðú÷¿%"¶âP�L`–€oÌ2Yõ½hÔrrÙe—ý|€yÁªÃñøMÀLàЈ‹ýý _ü£ ’ŸF•@|ðÉTep[-Ò±äg]ø.Ëú­øÀΦ‹2Ȫÿ°A‚5íCçÓÑVC_Jß$e'ÙúC¾l!ke£[icŒ¾"ÕA¤Æ-9æA$òL†Î±9Öß:�¶Ñɱþ·öhKyl·ŒÇã °ÝŠ�Ï¿çÿAºþ�NŽüÌï_ý¿µ™Öq˜/?PœL|Àó`;x_œÞyç�÷Å à_ÞÎÐe&`&`�ƒÊè6d†¥%ÐŒõbæå˜ðf €’AlH î£7XV¤Öšå§ÃSüËï0˜Ö_P &ßh©k3‚cþuΑ Ѳ—D$ÉÒØúÐLÀLà€ÈÇósA‹},Võ$uPȇAW‡ª�"­+µàENê🌲.´’Füç½´ËZé¾ÙøŒzØàG’zK¢],š%¡£¬“¨ÛÚWyµïyí…9}B"Ád­3sd¿Hóü£´í–°÷ø}þ9‡Ê $ÏÿÕºþ×§Ó—þðùÿÙÛËËN?’dy¿Ò|`¥O7x½(ÔrrÕUWýDX<»³²b&`&p¨(XÕãúX#2¯  ù)|Œ:²¢,J¡D‚MGÒSfYÞ$@�¬‘íÄAø _Å$oÐgöŒÕJ›Ô{xÝ‹”­eð½  Ñò”¤Aîd£Ï°…d[áK²ÿ<ÿÉ�Ekꇤ*íB²/Q_ýóø‡7€Öç_³>ç<™€Ë6Ì+Øi~asÎÍ™ÏjI¾aϼ9öázW‰} êßa˜ÿÇ'G~ì}î{¯�a!ÖRpªu;­ ßXÁ“¾`È|½½ýöÛ¿-^ß¼ÀÖÅ&`&`”>UÆ >¾Ã߯3CÒ*R ã>9XÄëlð½ýÞ›æÓÊsÑ�’ôÄ7å6j9²Tžì‘¯¼ZŸW¾ètÕ“DÛЕ²õØÐÓ3´^—M�§1¥TµD;Ûµ‡2�³Ö³Ýž…|ÊVå9sž 7ÉEçcxÎësíóŸs®fâùŸ×ìY¿þ�]v좾êÊWá)^MmH$É<ò~åøÀÊ�ò™ëE@/Óç?ÿù9räýa©²™JÎ008àðiZ$‡z@#óQV6hÐYƒ7 aA«(‹ ‘�’òy]üx nDeåE1-°ïýã(m²ÔÉsZ¥ß´êõl+s¡+IïÊ|‚ˆ6‘ÔŸVÂOö+ÛÆXÒwj½>^ßõøÛöP®¼´Å^¾z=µÌ_ªÜãçùâÓeÞS/@Årlóù÷üǼÈë<¯åþš¯_ dSçÁ2ëP‰];ß�¯<èYC¾�ÓçÕºúSçÕúúÚôE?sñ«ç}@Í ŠÓŠð €;áÍpuñë5„òéOú»Ãî™�­MÀLÀØùŒ(†–ázRo8Ê07ó8õ‹ÕÔQÞçõ‹YäåŸñK/¸Ñ�vý ´ƒ#IX")/uf±®Ú‘+G]”§ì}£ �Kõ¥Ï+‡M�Ôv¶‘%ÊÑt•·í Oíi¬êoú�—YYŽ}&YöíxüÉ"‰&ïœБ$k]ç£ÎƒÞ¦–7Ê•WëýùÈrg|þÅÛó¿�Ê+ó¥ŸQÒ4ê9Vë*ÏYŸ>ŽL7Þùo¯}ïóÃN¸QºÓ ð €>ùeèzà Ã+_ùÊ[âÑÿ{�ÅLÀL`5àû® Òc¸xd_ OH­¥«¬'Ó/\õf"[Õe~¬Lûã´Ì½<é‚dø�ôKÙʇڀ¬u•ë†Eʬ }^‚¤yþPV×–Yë°CªódSËÚ†fj -Zõ˜k½o#Gëñ'�¤)ŠI¼Þûü{þc>ÒëÿèÓ‹>pòÉ'�Æñ¢Z_µN+B w]‘{˜�ú¢‡>yÉK^òMÇ�ôÎÊŠ ˜€ ˜À¡$€ÐŸÈov�ôã·Ê3ñ.€rFEÇ;òð<ìS/d2|À ¥©gpŠŠ¹´Îü¡5òÒ_Ê\˜DN´ÓZâ[ö-%ûTòBì(Õ~Gý¡Ëè•:¯Ðç¤ÖÌ”—z%…^—;¹ž×œ|AbóøóF8ð<&â¹H.ä'‚~ç��¦�ÖŠ•—zùü�½ô—Ö<Üb ‰ çFÒçÔÊ|¥6»›N¦/|ï%÷Ô_˜‡z¶²s%ß8”§uá òÕ"_sõ"0¹ì²Ëþ»¨ùŒ…µm`&`&pà ä:0ßúÅy½ÄB; Q’?ðׇ0Ð�ô&2Ôû›°Ó"]6�¨ 饕½ï´Ä¾j+eŸÛÆÓlàSmÔÕp<§:Ç W{rÔ’Å»Æ;ö¥ÈZG’ƉÙöøø³Æp_û¤;ÉTØHW þ‘ Ç6ÔÍ> ûŽ:H·¤Î'Yõ‹Q²/EÖ:�0?s=~ŸÏÿssý›ùÑß¾ú§¿y›ËT—«å ð €8És†X¿GOo»í¶ï˜N§ošcël00�CFoØðc{JXœ×I6Èׂ�æ×V}í¶f‰¨‹›ZøÃ^ºü·5yË€_M@I¶6hG�µ^EU&HnqÔIÙ9&Ju¶ ýíe–fÎXíÙ¼º‹ÐáA2½ežj¶öÈWmtYë,̱Bõø ±€˜H’y4Ü« 27ŸÿžCÒñüOÙ3~T_¢ÐQSR^$ᡵ¯ó /2Àu�Ô\ÿG¯ÚxÒûËW`Q7Yë¬ëÝá& ÷óÃ=J�®&P_ä|¸ñÆ¿éèÑ£~ô¿¦dÝLÀ9|‚«èÂ37-=‡ƒW9֌ݟ”+&|SißYà­ÊƒŠö°è�^3“ùñUð32Ê´GS{dTIŸFCR7’¡d’Œ#–YëÅrF¨*d­w†êd­ƒ:«ÖçÕ§Mì Gí»Š©Ôcи%Ç:ÿžÿgúú?19ö#Þß}AL>\�º %»9iåpð €Ã}~ëÑéâ®åä¯xÅ�ñèÿjCë&`&`‡Ÿƒ÷< y78¢s½A`ôÒ!»¯ P)+ÔIØ3¨ƒq$†ÔcÓô=]ÛŠ_¤wÖ¯tGêÿü`þvkk% ƒº3¡ó°HêGØÿ¨B�ÊÈvH]R‡/ú«d¨½¯úIH�[²ë—úPµ5·ýºS¡ó°HêáKrÌ?ÇPïÔv�êBR¯$«5öƒ< wkdåèÃ#û—r¬u›µÞy­3Cça‘Ôé?¬ËxXO}îœTŠÊŠ}íƒz˜J|íпǟô|þ“À>›ÿG®<òÄ÷ļæË~3ÕÓžsß»CIÀ7åi]8(\àÜNœ8ñÓE_XÉ&`&`‡‡@E �q�r0ÆÔQ‚XÆâë l:{½›t5Ä'-Ós¼á„]úÉò-<ê�TÕ‡.ÿ,ŠJ°Bžn@ðë寀ò`‹ºL�¿’K?гߙ[z “�T¿!k½3ZÐ^g7OY²¾ÆêñÇÙðùç¬,˜OšëžÿzeëåØ%Z_óµÞÙ.àÝÙÍS–¬¯s½W×ÿúdúòû¯ûßÝCOê =Vï ;R¾pHOl3,]̺Èy×ïäÉ“¯‰Gÿ^ÞØúÐLÀL`è ¡{ë>e=rd¢(%¢ù¢Å_÷ ­Ž.ÂŽ æÎ4‚÷öñˆ?*ñ7à,i§ˆöÐáŽucG™vj²Öአu‘FüÁOí²¸Í¼¬ÕµÅLÚg¥·§¶çøH�[RãîäHë1׺šc]õ¡p¬ýÑe©·š¡@ÒŽ»PólÔ.í[ÞÈTôÆÇy9ú0äÿ”]?QõêºðImï¸?ðQù£ËØAR¯d¨ÃLÚ¥ñŽÛƒ´§T7ºÇp Í{Éîé'‡&>20X%uÌ‚¹z.¸K¡Þ<:.剨 ¸ïý/†ªË걃OþÖ@èõß �œF™ìS‰ãøÓ|ÃÂ^�ÈŒ¬¥<ù¨%�Ed­×6µ^ÛÔzmSëj{^j¡‹ ¤Æ-I·�ý ‹Úc…j·È_eJuYûEýiüq¬‘—£ÏÊ¿ Æhx Î d Yë4Ù-ò×VYÖ¾îC­ËoãÏç? “ý4ÿãµøÙû²¿öŸÇ)㇂!u&qkÇN‡Œ€o²:2œú"†ÎíYÏzÖú³Gì�e&`&°êO%ùF;æÅØ%ça€=mbQË'²3#Íé,ÞlЬ}).ó[ÌsåY~l�à먨6äDÎêʵ>ÖÐã±oý¨mHlêäNÚoýµÇµ�Ú·Úƒ½ú½µ¯ó ·iYû¶¾ÚVê>Ö¾Ûz;=®}Ô¾Õü¨Ð[û:z›–µoë«mõ§îcí»­·ÓãÚGí[íÁ�ú½µ¯ó ·iYû¶¾ÚVê>Ö¾Ûz;=®}Ô¾Õü¨Ð[û:z›–µoë«mõ§îcí»­·ÓãÚGí[íÁ�ú½µ¯ó ·©ØŸ¿qìG?üŒ·?!Š‘So¨!¯Ð�ß8d'´Ž.Þú¢žÄŸý{âÆÆÆ�4¶>40X!xô±5’x—€®w ðDÃÕ`šÒ€Äøäµâz!øÇ§^²çM�â7oôþÓǨ[|Çaú…EØQ©d¥Î)α„Übƒ�d­«Ði$É<ìUYë2¢¯8Ø©ÿÚõØIŽ50c_õ}hÛ‡=ò k}§ý‹jƒ´lûh”}RàMN*µ+…Å]FeT©sŠ=þ`„¤ó N>ÿ+?ÿãõÿ /9ÿ¹?³aì)̧CJÀ7鉖^ö§O~ò“q±ãŽŸ“ ˜€ ˜Àªˆ qRù]µî+ŒXˆà=BxkaX>™g%Þ= Æ¯¤hQ9dÿù(?n°÷á·ø/†¬È?IÇw«¬ùƒ�tVœÃI2�ê½ú Iî`Ž6Ùn%Q±Î£Æ’›J™zñ‡ºH,/²ÖY»þ³~TDݱ ™Èï ¥CΦº�·ä /ªº éÏã‡dÑK"ä¹ ²ÖwÈ·;·ªßJЯ à˜ja ë>R�ó+éó_PiÎãP:$õ`+œ“çáœÿÇ'Gðמó·ðDp}@“K”œß8D'³Š.ZHmÓ[n¹å9ëëë?ØØúÐLÀL`åÄ 7Þø$Æz÷¸>Þ5�Xùaʸ=v\cŸaÆ ð¡ÓrB“3æÒn,@a•h¨{*>cëž.`ð=’Ô$š†m‘y£¡ô é>à<ípD�J¥ïÔû»âžn˜'‡C96þA€&?’¨¾�¿®ï;í/ì<~ŸÏÿþºç5�ë"’ôÂgáë ¯ÍØíðzÝg×ÿÑ绿 ¦ÙP�ž8¼;||àð�ÓzDõEÌ û‚ .ÀE~¤6²n&`&°Ššgد7 ’P°Y´´èò2¨ïkEMV.Ÿ”ñÝ&ÖÂÈÆJ7þkÝQæÍƒÌïÊÂ÷@TJÿXSG{ð‰î*=scßõ­Ñ;ƒR©¬qó(Ç_—tæKúÓø‹{Žy Ã± 5oJ Çßq��$ªÝã²V¦%ÏWâôùM3ÉÇÃ3�„9l%œV xþ“rÞXÅÜ 6çòú?2ÙøÎÿåÚ÷~k9K:{ÙÉÁ™S–åA'àý Ž÷¿z™í_Ž_ùÊW~[,®^=^Ź&`&`«D@A=ž,S†¢wÉ€‚_ñç!ŠCçšz1î>¥@Vþv5×îé�(Ö×à¦TòP„ÄÅq‘Ãþ¢?4édm¿oý¡!æÁ—•DVÑ9ŽJïZAÿ‘ªqt•Ñ(vò ‰­?uØÉ'Ô¢CbC?$뾡ÚNRëÏã/Œu>zI5ãZWyw®pžÆ6"_I¾ÕÊ «.ì*ûö|ùüžà£çü¶I-OÏÿµµË×/þ©+×®\lš•’Û�tÑA%àõÌ-î·.\ÉõãÇ�ÿÔâj¶00X\8Ç;ú€ Xï�*Ù,+f”+›¦ˆÖÃsñnIŸØó͇þûÅzZÃ<èö�_æà¦Ae'26ö³Hê‘-‰êª 9¶ÁmBr¹‹Æ¡C;ðMAI=l%YŨ_RÛ>²•'›¥¤|C²íèP‘·$üª-ȱ ui’ýÆø C–±vY%Rã–d½°é$Tø*²Ö3÷qì‹?¶:ÇZ¤Æ-©v%=þ<5päyWl8¿’>ÿ˜:É$µ•˜ÿq“÷Æ_¿î�ßCFl¨™QðXºå! €;=N‡‹.Z$H]Äë·ß~û_ŽïþßËïLÀLÀVžÀM_xZÇÁvü]hþC&ƒÅ; >ýç¡+(‡%ò8¨%lâŸöW„ç¸QmdB{HY›þà Û*ù4­½±BîJÛì t$É<ÚÕ^® Ç6ŽÍbP;JI¢¯ ÊÙw¶&j .™7Ï7 é2¤ %çÕY"_® Ç6�¿`÷ùßá¬òü�¬4a¤CösI×Z—ÇÒ‘ ÏÀõt²qãW¾ñ¥÷òëÿñôX«#yÎ: üÀ=qsº�¯$ù*~õýÈ‘#þ³s 9ÛLÀV•Ö‘ ¾€Az.Põ‰/ÞFòSß­µMåמú>˜$qPžãçM‚Ðqã€vaÓÛ÷Ô$Úá ƒ�Óʾ«÷l0%t”u²Ööż*c½ûº?9ä¸�ýÁ˜5nÉAgÔ¯Êg¶‘ãOY¨›)¨Ò¶‡:ț׿â>Çõi'Yµ ßc öHóü·ýÉq{ü>ÿžÿºî%Óõ?]›^õCWÜóýxià D/Ë¡Åa!à‡åLÎŽ/·¾ð…ßúsfMœc&`&°ê6#œG ñfÈPðÎA=¥�Íßî›äçøÔ;8èR:�o8ÜÜD�n&äM‡6ÀíÚ Ë­p޾äM‡ìƒR¸�M:䨯ñD‡“]¡Ž^ ©«�Øh_$t$ÉÁ�Ö•jg4žõÏ>F™úÊö¢žÜ¡ZÝì�d_�¹ÖUÞÊ…þÓ=Ç^e^ºÎÉ ®TúÚAE¿ÿì_5ž…ý+4®z̵®òV.ôßô�ö‘§á¡z—t �?�C}² °:‹&±ëd(Àˆs&œ¨&ÄÐQ&I½ØãÜûü>…I;÷ÅUR\%É•tË9Rø*òÂõóþÆMO¼éhê)âB�• ;¾pNb‚.J]¨’øôÿ¿><ÃôHLÀLÀö‚Êç"1VÔhcaËÀ²0, ¹:Œ…"¢þ(Àaî¸ïï|#Â.l¸à„!�‘y¨)o d]«€O À¢Ô‡©+ntŽìÐw$ÈZÏ\ R6Ež â"5ÉAÝâ†e¡CÊNrÌ>\3Abƒ­$ë•<A/ d­«¼•õ˜k½³k:@›ÈƒÄÆþ©qHŽ�§î³ì$ÇìÃ5$6ØJÖ¾Òj8f�?©ˆƒÕ²>çµÞÙ4'€6‘‰�ç£H�GɱóYŸ3ÙIŽÙ‡k&Hl°•¬}¥•Ï¿Î5d­‹O+ës^ë�]shy<÷k“§½ïò¿öºÒÔN›ì\[9|à`œ§�ö²~]àE¿ü�_ý¿n§lg&`&°:ðˆ}.½s®‘×ëC|x¯E9íçcì%ßЗ­ê¦Ì·£,ßZ›Æj:ÿ£(*Õ~d0¡ù” s1 ÓñêöÔ?ȱ ¶²©uÙÖyÐÕ"$6ØIÊ�$ì%ÙBRg’pœcOI=J.ò�òÖ¿Ú‘¬mj}^9ÆŠ‰ v’Б$óhû½l!©‡3I�¿œë`‚s®ó.¹=Ù,mùг$¬dSëóÊq®‘ ±ÁNR~$a·(É’z8“ôù/ç<˜ì—óþô¼·_¿vÙFœW\íÚtšqìtÀ øÀ?�¥ûõŨ rzìØ1ú8αGa&`{JßÏç¢>Öwü®}H.ÊñîQ-Ðñu~þ€n�ªO÷ð|b�…+|„È]äçwùóq|¾µÀÅM8h+6þu}òOô� “,U‹íD­¾½ÔÑŽ1Ê$á\zWŽ˜W²¯¡Ïó‡|Øï´c¦O޹´UúV÷}ÛIB7‘Jw³8.}Vß Çü×yÔËxä�}-¾ ÃF²Öçµ'[•{ü>ÿ˜ ˜Ø8犤Žl”í0Á$·Øu2”zŽÊ¯$êI‡¤^êÈ!û Ÿeƒ tÙKßiù~Ÿÿñ%¯gøº¿'Ð NÄ™ÐÙ�Œ,§ƒLÀ7òÙö]¥.Ôé­·Þz{,²nšùÈLÀLÀúÅ,‚{ëý§ð S>‘/+`}’ÏOñQŠ…0Ëz’‘Õ'|‡?Žä eèz£Bm$½aÁË¢uÄ.þóFÊCg»¥!èJ4¯ü!_yÐe«ú‹$GGÿØ©!IxÜ>µíÁZyÐÕ7Hl(“¤’·¤üHŽù«ó Ër'[X•:³Æ- �Û§¶=X+:ÆŠ©qKÂNc…¬uõu·ó‡røS’­ê/’¿ÏΙÕ�ÿO˜œÿÃO^{r} ¾¤j]—™å"àèdÍéj}Bï¶øôÿ‡æÔq¶ ˜€ ˜€ ðS{~ú,úOátåÓ�ŒÀ¢œ:˜!O© ر`Î’üfð‰§Xj†�åÓÿð¡@ f²�“üÀÌÃ�ƒÌ‹ Q†�](²®;æ�¶¨†º%I‡ßúñkÜ’p�v$ÕoÉ1°U›ª'©z’°“‰Íãï9øü—¹TÍÝv¾ÔsHóNóN:äøæùŸ\À! ‘YJè¼&‹¬Ù�³D�ž9ôEõkŸ´�¦%ÏÖü_ŸN¯ûÕkßq2º[ß@÷{8r:�ðý§ƒO@#$¶é·û·?:�~ÛÁšG`&`&p¦”Ø’�9>ÑŸlés�üzÚåKì´( �¹ îCÇß@™¾KfvO¬‡ÊãÌ*%¸A‡Q†r¨Eç"·´¹òæDz “RÖ ª.ôeSÛ~[¿îc[†ã¶þ"û¶¼­/Ÿj ø<~ŸÌ¤Eó%­v¾óW×nçk]½­¿È¾-oë˧Úñü?7×ÿ§ßô–8ÿ§¸l:85µŽc§D@ïô¨ËîjE@ïÈ‚Þm'NœÀEëd&`&`£ð#1ð/ÊçöHX¨ëeˆ<~26ÈÂ1Eì° ç ��|ô¿äÁ ³¥qÖëêþ¶Œ‘�úz/µþa§¼yuv“¯¾¨3tHlH’ÔËÁ¢q«œ¾¢ŽüÃôyIcU}Ø)o^�Ýä«/ꆲ µ“hG}QÿIúòø}þcNÕs si,µó 6ʳßm^Ý'Í{ÉãÓ£¯{Ï•¯"ºPmhR—t§FÀO°6§»º(§W]uÕñ���˜cçl00 .ðâÝßáï—ˆÊr]Ç}ì ¹@„ŽýcAÑ–¨�Ÿ,äøJž˜”' ð›á-¶¼‰€Ã®í8H{<�ù¹Íþ)�ªrÃÇvå°©Sk_—IgWË�|C>ž´£öªÛöÚúË–·}nýµå8®ºÓ±õøÇH-ÎÛï ø²ç·õßÖo{ØÚ·å8®ºãóß¼ÞŒñÚ.oG¼+àíùkë/[Þö­õ×–ãXÝ yâO¸éõkŸýð{"¯€ØP¬WÃZ�l§ƒ@À7ÂYšßG\tƒíÚk¯}uä=i~—˜€ ˜€ ˜@OA7¹�w.,£H+;Yáyý2?Jõ€ãoB¨ÈCâÍ…�Z°2;ÜEˆÿÈG‚�âÇ3 7 á8Ÿ:€�íã@ùcºòÔ¾Ú“ÉEåð#ÕYVª/¨'_êϲþåK>ÇtåµíÁ¾N‹ÊáG6u½etõuä iYÿò%)tVüÕym{²“\T¾lÿä·–u_Ûö–õ/_’hgLW^Û^Ý/è‹ÊáG6mÝ�«/cí-ë_¾$ásLWžú9–•Ã�lÆêï$O}�­|©?Ëú—/IøÓ•×¶û:-*¿`rì�—®]úÞ/¬}a3ê nshÖž­ïWþ À~=3Û÷ Ÿ’.DœËiüé¿¿®K00˜K�íc ›¾ãÏ_ç/ï0Z<¢¾}éÝãûx" êóÉ-Cra[¤~,A~qC!D´…Mºê)ý’.I›p!‰>I‡ÛTÆ,Yë]y˜°ÎGRÛ|0/d­�õyð-Y벯ój]åèt%é*oeíz=æZGËÃDRmÔ²m¯s­·ýÐ1|CW{ÒwZ޾ÀVIºê·²m¯s­«?ð }^jÛ«Ç\ëm?tÜöùÊ«uõ§ÎƒŽ$YëÈÛä[þê1×zWN¡ÏKj[mÕc®u•·²íÊ•WëêO�I²Ö‘7¶É·üÕc®õ®<œBŸ—Ô¶ÚªÇ\ë*oeÛ”+¯ÖÕŸ::’d­#ol“où«Ç\ë]y8…®7|Ÿöϯ~Çw {d“™å"à'ÐÉjº:sÞ|óÍόśÿôßÿÏÞ»GûrUõžµ÷>'çœ<ȃ�„Tæ꫚­e;êtL¼‚‹ø;Ô$Y§\D_-/\�RYã5ÍíV»Z¶"OEÅ+¸ˆ¿CE’uº+p}µ¼pAtJe�×4·[íjÙŠ<¯à"þIÖér,ÛïáX$žuü„ ¢D!­ñšæ†ª]-[‘§¢â\Äß¡"É:]Žm ÿ°ÿ´Ÿ1Ù¿±�³.Òå ÜÃ�œeìè>]Çîiú§hÚr ®mõ´Ó|rÖõ’I˜Èd2�^HÄIüýgú¨±;ôÃ'â1|>hôÑÉ>ìÐXˆö6* ¯ÓIäuÌZÑùmG)”Å©˜ÙΟFð#.+DAE¶àw9­ô¸­ UÔ¸s†,èÂúŠœÀÐé”îYüÃzù>«=C{ðA›Åßks¶?ºAq°£ ÇSYàPžãzƒM<5.žšžýOf�gÅRñËñ¿ýóÿÀÊþûµ‹^øºiÊF÷eÙAÈ ;¨³*W‡“�äŸýô߬xÍd2�ŒÀ̰˜f!Í�}O@ô}“Ђ›µžÝþØ?ITI¤:ùná·ËC"À _$°#×_êÀ]�²ÕBøŠcñRÃÀuY�£º6ø‹‹®Å]¶] ‘@ù&ˆ†Öä¦lCyéDG­O¸êÑ .ݵMða©[x¶_q°H–p F_C´0wý^úR±WÀ ®EüC8”—Adk}ÂU�>pé•-à´"×€�gÿ+ŠH£Ï‰cö‰ãžxmÓØÓx$Và*ðPÄ_à O?ô½ÿ‹‘É5+©v""šeäȯŒ¼ƒîÕMU> ó˜Çü{»ssŽˆ 3�Œ@F #°^|ñg ýÇ÷ãcF‹Añø�+ãŽ>¯ö³ÂÞêuñ¦Q¼:~àˆ½:jÍníkaÉEp}Ç¿U‚¬©q+Æã_M€‚:×[ ùŒF¤¸Pæ�ã ÆQ/ž>5ŽT'8Á#_Šù‰z÷ǨÅùÞºktÑ\v µRA=~ôù°ŠVaÁ¡Y‘ß‚Aíï©›É3ð·¯lS#@ ëîD{ŠÏÈÀo›TpŒÒÁqȱ3c„ƒà¯¡»™m[D¾´ÇèõC9_ü‘ïÙþÖd–>Ëþ÷�uüŸ²ÿÄÿl¾Ê6.ÈÍ2ÊgÎoSîÆ�¼0®þXÄ&Úp[=tèÐZD8y2c�ÀI'�ÔØxnì…–¾�p Í=÷ÜÓÜ}÷ÝÍW¿úÕæ;ßùÎØ›°cýãñïSN9¥9xð`sâ‰'zü‰ûwÜá[Æ~ÇvíTÇIüãíÿ]bÎÛþÛ,ª’òÄÅ>yüe¬ó| V±wY«‹'´F»Þ#ÀÊ‘§$ƒÉò¬6ü\hàR@”š½#FÝÜ«èØ|~¼¬cWbä´h?¶ë6ÔxTH†„®€áuŸ?hŠÃæ·§è/`¾þlöŽfnÍebÒÍûz×øN™ÿkGWòÿ^úk�{ú�ÿç‡i–7®¿Ó‰ OÍ£ÑE /Œ®KvˆIÆêjõ�xÄ©¶�ú‘…%“1#°äØWVš /¼Ð·sÎ9§9óÌ3›ûßÿþIøg•#vñ–[ni®¾úêæŸÿùŸ›k®¹fkÒçD€ä뢋.jþð‡7\pAsÞyç5çž{n³^üï¼óÎæºë®ó¸êSŸj>ûÙÏZ œ9æ²zŒ°®‹ûEꢻò¾ª³]›ô™ï~§ž6øKÿô‡%U-OøSðÝqƒG,™åî¿?-™úA9rôH|Á|ò‹ÆŒKåbC­·¾•áÇbZ4©î-°%Ûò‡€.BøËM@ãy¨Oº͵vÍîö¼ýøÂkAkoÒ?ù û9¦™ެ! ª­ëéo}E?¤´40ÛOP"îÄ"û?l1Æ}¼x˜ÚãÿÌ!NÄ%Îu*»yþ_pð¬ÿÉZúÿÙ–? Xº'‚8óíDÏ÷žÏê+ 'þר~äG~ä?ÛÝÒ?Ü{!Éï„Üï~÷küàûvøðaOú¹Ë¼妛njþìÏþ¬ùÄ'>±êv½¸ßû½ßÛ|ß÷}_c›SO=õ¸Úü…/|¡y÷»ßÝ|èCjî»ï¾ãÒ•ÂÛ�ÿòé'ºQÒy³úV±c¶Že¼ÄŸ±Yýª'õˆØ—J]…d¹,€ d—uÝ›¾U¿ઌÅ>ÆÜì•“kõ;Ò\¸°Ç Ex¸´õöÇ+?Ô½Ùú†ú‡ÇÇkïxå7ÛŸ¡¾yÇÇëÿñÊýÛl}CýÃããµw¼ò›íÏPß¼ããõÿxå‡þm¶¾¡þáññÚ[GþHsä–§ýë½üææ<ŽÉ?�Òfh–1G`Ñ�Â1·a¯øF_i«/ìû±û±ÿguuõ‡÷J ²�ãŽÀøÀæ{¾ç{Ú¤ÿì³ÏÞr‡ÿæoþ¦yó›ßÜÜ{ï½[nk'à‰‹ú¡j®¼òJÒb³ÛpÛm·5o}ë[›üÇÜlÕ©o #ðK×>Ñsõø`±$Ü�Hå ±e\<P’{«ä®–žð”½ð;nu‘Èã°QHêY Ï*)½AJ�Ü»œÑ‚Ãí"ƒ³‚wȇmêgßñFªÄP‹C ¹õå�­Ýżõ쵬�Èt˜s¿[¬SçÈÏ÷'Ûßõ9ît~üú½²Qþ�¹ìÿápì‡wò¨ß]ñ›ßCƒ}…óåû.m”¯õÿMwýÛ3ŸzÃÿ;‹Z}@&�eÄ`ÆdÙ ¯Ø”ü×ìnÞ¹öøî§ÀmË’Øöp‡ÿŠ+®ðGÉö°‡mI‚¹H£ø:ÀoýÖoùûáß <ôͳžõ¬æ©O}j³oßÖãëø@ó†7¼!û`‡ .žˆ–X (¹ç£Ft’sŠ÷HÚ»$}õ(E&alž¼»‡Dá´å ¥ó°z‚oTø !gñ'ËeÖV�áSK½�@,A�[Q6hoà ÅF}Þ ?U?Á¿A{Ù~’6‰E¸Ïƒ ß~ƒýq|ÆLzƒö²ÿ»>'ö;½ÿ¿}äÞÿñ°Oþo/±¦|×6=  ŒŽ2Ò Ë2ÊlÕGã(»ƒ�¢ŸÔWžøÛ1pŸ=þÿsöøÿoîà¶¥ë;,$’yÈCšG>ò‘ ?ßå×B}ÙM¹öÚk›W¾ò•{þqt^ øã?þãÍÓŸþt¡ßvöË—¾ô¥æ¯xEsûí·o§Ù´u ø/öŸ,mro¸ßu7]zÜ¿MÌ}ÅÊÂ5>Šà#y Cl…IdÎg¨¾*PXC¯‹™f.X¼üQZ_¬N¾yÕ¡ÚùZ\ËÌa}pu{ÉnÿÀàD†³Åþnz{ºP96W¶¿7 ³ÿ™È~ðñ3›>_çŽÏ�Žç�ò¸ÇúßÎö_îÍÿ׃¯ºãº»,rõSôŒ¶APópL`gè'mºÀÿ}¶ÈÿK[<=aüMHwrx„œï޳ñÒ8Þ?ÖÂ×^÷º×�Õ½-÷‹ïö¿ð…/\Ú“4ðæ›on~í×~͹aËœŽ9¿ôéðÄ›Ýý�D¼ÛGrÎP,k~hñUjKB/öù¡„”ó ø[K$­î�‰µ%øœ²ÑaŽºí¯¦íjÖ…(Cö¡ºT,—eèð°As¼²ÕÍ_~õÐáaƒæx8dª›#¾üê¡ÃÃÍñpÈ>T7G|ùÕC‡‡ šãá�}¨nŽø"Õ7ßûoÿó•Ÿþïï1ÞiO /²Œ4[ÿLèH¾ƒÜbÚª€·›Ý…=Ãg�SeÂŒÀfF€7Ã?æ1�iýèG7—\r‰ß¥ÛLý[¥‹ÇÝy)à¿üË¿l•‰Qêå§Ÿ÷¼ç5OyÊS–îßáÇ›—¾ô¥Í¯ÿú¯Û�á\,½Cf8à)¸º‡Op ExU¯ïô{µÑ=©/õ\(he\AìâMþ«þè3üR¯ç÷•~hGÍHÅåŽø1|80àïVFAeH°¦�»¾U'ÚfÔ£c½"[3Û£Š�ßv"Ó.§Í0¢v ÂVã’�¥ïxëg¸Õ’çéoZt~Û•Co‹ÓZ�}Dm¤¶Æ%;KßñÖ÷½™<š§¿mhqÐùmW³ýR�Édh�¢¾„Xã’�Ïã­ŸáVKž§¿íèâ óÛ®Ž¡ÿ°vÚ°öü¥mܘäñ"¬(ËS#ecòÀ{eÒ'Mª®Z‚ö4cÍïþOÆ+)Çð<ÚOÒÿØÇ>¶9묳ŽAË8D^ð‚øOÕ}ûÛ߇C[ì/]|ñ‹_Üœ~úé[liqõ|=䇸‡›¿ýÛ¿]\(9·=åI{OÐ=!×úMË8ƒ¬äüÑ|OÎYáYB¯•háóŸ¬ Þ†ø ;¿Äà¼È» �ýc½¦ØEŠŽ ÃGuìQÖÓ-^*jœãª`C>@î>@�¬`M«ñRïúª‹ºPlK­«%DÍ;¼¢‰w=yÕ "SãÒQ`¶?û_cž!!<Ç™€š;‚i^h9ÿm> ·V�ƒ “"6<ËÝ,#‹@^Y‡,à“Ë7û½n&_–ŒÀ1G`mmÍ_à÷¸Ç=Γ~^· _Yxö³ŸÝ¼å-oÙ ÍY· |Ïÿ§~ê§úrlå9ÏyŽÿ2À]wñ5Á,£‹@I@YÜv¹û0+�œ6qðFh}gB˲Oø~?ŸT<¯ø2ÑxÃwù�æ,n½„&’6¿Ø 7� ư…JUïÇÐEs”Hž¬—CTÖüμÎNzçêÃŽl W8Ð jSH;ký­Lôý�£_zçúë^ÍÞI�à\}süó¶Ö E¶?û?ÇÿŽšÿöD×o>üòËÿÓÍ¿ùI;sp!@gWN$:ã�gaòÀ;¥r©,œ®�‰¶f?ýweÅ›hF`¡Ø…#ÿ?¿ÿ¨G=ª9ñÄ’ÛiLO{ÚÓš÷¼ç=Í×¾öµ�æúBþò¢¿½èE ý8ÖÂ%û™ÒæíoûX]ÜÛ~Ù'J|ÈXZg »¿ÔOK8*”Ä9Ú=šOÈãü@ô_QlõÁpÄýkÈÛAw‘Að„AOòÑgný&„~·gëËá(%‘­¶hL{ØCTW @+à“@/Î`˜ä ¹¢ R1 ŸF3Vµ[ñouyµ5â„ï%V‹>� ?Z}èè\ÎöÇøÌþg$ZaœøDô£ÉÝ`<9ƒh¬i†k¬ R]ãCùÿv¬/˜�dþ?øÐÿκîS¶Õ_ ×u&54Ë#�ÆØ+}Ÿ˜HÛ“ŸüäGÙÂèÌ>ke¦G€¤Ÿ·ö+éóKü¦·`ãTÚü?ñÍë_ÿú� �\âþ÷¿óò—¿¼9ÿüóGîiÓüÀü@^i/±àö…µùGòïëý:Kç“§¿+ox|‘œ‡ŒRAñ×;ñý’yåa»åë*bí�!£É%‚Q�Ž(•øtBÑ'ø)‚ЗB*+| ^µÆM(à ªÝ‚Q�íW Ã7ÑAñŒ>Ëþ/c×â“ãßb¡EX*|0|&†W‰â±ƒáÔ¼ŒêåÏÿSÖò$ò«J´pK[;µŽ=()¹•È [ÝÍ×­‰µjwm¹ê–%#03$À¼þ Ox‚¿È�;Æ{­üàþ`óçþçÍ�wÞ¹kšÎËIþÏ8ãŒѦ³Ï>»ÁçÏþó;Â߽䤒v¿`Ë5O¶ý¨}Ôði£E©¡Gì ýYÇ /y¦ÒÇÕ~¢Åƒ¸›ß[Y+àfÏÍ "»ŠŽéEn:„¹Ê_Ú"}¡Á~·Ü ù«u0{…×{+} Á!î•ÕÎcjÜmû ÞÚ«x ·ú¡mÈkÇjk¶¿Çb¥˜@Éþ�±ª h>°rü32|Àäü�sS{>Ò¹N'8Â$ZA œª…Ÿ°²ïûÿã?tò[¾ö÷ß4šž º>{ÕbÔeAòÀ:a˜HÚX­Øo±sÕ-KF �ýû÷ûãý$ý¼Ìo/Üéï`pÀE^D÷®w½kP³3/¿üòæe/{ÙŽûÚ¿$‘Æ9æbe‹AOVKƸùl <†@ZÓ¿Ñâ‚À”vY],°Y1¾x~Àqž;¥u>núƒ,ÎV?¦Þ³$W©¬p­8»¥kMéðV¶èÀ‹ú‘Û�§2dØwGï-¬C_ï„k{V­‡m°@ï«ïÚZ佺ÂÃËÎ\‡©&l´j%[ûS3ä¨ ùþQ«¥EÔnAIJý¡„H¡¬ã]úŽìÿÿ~jL;Qs X@IDATµ)ãÆ§¤ªDóñD ·nàÕ”oõÔãq�ùoç„ý/xÀø!»À" im•òð%÷ãŠ@^WÔÞhM@{ã÷™öýÿGÕ̉ïݰ¿âŠ+š'=éIþ"?~.KÞðîw¿ÛîíìÏ#^Ôø ¿ð 5vZyà¸Ó\Þ3þòãé9H»ØToDû÷$Î2qOˆ=��ðøŒ – ôöÔÆE4pžòRø%+‘HxÂuñü?sSäŒærŽW>ÚqÔta½ãw–j'Niò+qtþ¾ã\©vt¨¿mF1èö W{dG0äI‚¢ ýSr  Ùþ~„úGÃÞéÆÒ¬øª³ÿ-†9þ» ËÜÕ ›^í¹Jã«�È…à¢è(²g‚°�K^¦Ä?¦ùÿ€}§rCòݶán½É]#g[òÀØzd¶?í¤:÷Üs¯4¶ÙÏFÎÖ‘5»,ç�w^ó«¿ú«Íð€]Ö²ÍkΙgžÙð3y×\sÍæ)ÝfM�üã›_üÅ_å›þ Ř~žp÷�÷“h³Z‹{õ->ýÈüØï —Ä5äz¼0_XmŽ˜òxq`èÆNØ+zƒÜJúý?3Â3¥ò©^Mj¡,âþp$¿„‹cçñ·Š¤ƒ5ÎqU†ú«*GçÙ›&/ ÔnÁÐßqlTÿ<þ¶­u›k<h÷òD°­(È<{’D¬�ÇQ¶¿Åy£ñ�ÇŸý_ Ü:ÈÂP½"8¨öpR§)$\üCˆ¼h�ÇÑÆÿ‰«žj>‘“°Õ_ÀUІWå~È$rݰ®Lm>Áì`>þ¿nÈöNå׿þõ†7Ëú°—f®Ï0âZîüïääŸÐžzê©#ŽðÞu�Å#ËHî&‘ S:Z,8õáµìãÎ{ý@Mð°]“w§¼ÊuW\€ŠYù\¡jwwZ”°Õá’ÂÒœV?õ¢ yëºÎùÕ·=Mš|Öø,~ùÒÙÓ…”éòÙþˆdöÿbãq8¾ˆžhÓÆ¤êºñ˜ãŸX,:Þê9_ãÓb m2Þ;wþ¯5«ç¿î¢ÿzy.…MpV’¾ÄäK þ:¦™4MžžrÊ)köýÿŽêÜïõ|ûÛßn>ó™Ï4—^z馄â¶Ûnk¾øÅ/6_þò—›¯|å+Í7¿ùÍæÞ{ïmî¾ûîæ¾ûîkøz?<çœsš‡>ô¡þ&úöñÞMñbó•ðëümÙIå±�}ló’—¼dÇÞùW¬ók)ŠÄø î®ãY·píÿJâQüx$•ûy8RU-\µ\Ž¥mè .*¬ùWâ£�½¸Þú¨‹Z`ð†ñNƒÓtÖ|²ÞE[Cø$¯qxÖ+ÒœV†öæõ§<œÇßµUxÑáCÿ¨-8ƒ·ns�ó^‘®lÿô( ã=¯?Õs‚óø~è"^LÎc–ê ºeºSI]jòÀRÿ®qM"˜4‘Vþð‡?ÚŽï¿®dVî©\}õÕÇt€äþ†nhn¼ñFßnºé¦cz[>¿õÎ#êÏ|æ3~žnŒ…_@°¹Ó\uÕUctoªO¼8ï—~é—v|òOãî¸ãŽ©mLâr#@ò¯·ûó3€Ã"0^æIðQ;ê¾›¯$ŸïëwK~8I顱xä ƒ5SÔ_Pv«ÅîB„ô'Ìzw€é(ƒ¯,°Ó+ýÎRí&¥»‹ °E}Ð8îkç84 Î㟴'h�Rû:Ÿ}é” ÁIélÄ$"&H�ª˜Åqðeÿ//ÅnV<c e>ÿúáUw­Ý~R:ÇÄd±þÔ¸”,�rÊÚ‰| àU¶AÙÐ,c�@^kÏ„_šH‚«öÀ•ãv9½Ûîp€ß»ŸWn½õÖæÚk¯õíºë®ó»üód©çBÂûÞ÷¾æø@óüç?¿yÊSž²ˆØ¶óð(ýN¹ÀÛþwÃ�uòí·ß.4áˆ"Ð-š-Y·—û­”»úÐùÐÄå¸�ãx‹èn­'}Ô‹SÈã…G}hׇGñ�D=Q€ŠÐÍÅžiŠŽç)$^ô©§‘„ëåŸòM0äÙG]j�¶…�d‡ú¢-D) |¢AÞÕgû#&]D³ÿ»XäøÏù¯sçáÛuþÛ¿ºï ?~ÿï?ôîÛþñ»fžS¹Þ S˜»Å.Ë8"�ÆÑµõd�Î1jemmíq³dÚ\ýõþhûðíð·Ür‹¿øîSŸú”'ý<Þ¿•…Çë_ýêW7${< 0¶ò¨G=Êï¦óU†1— .¸ÀêoØŸcöyžoßøÆ7æ±dý’"à,åc&>|Hé#ÝØ9¦'è.âU‘°£‡tÈÕ�••HÛýëAj_ÚC…R˜ž<üf@4.Hõ|AV>ù‚Zy9�×ã‡Ñ(╽¡ü�&%®Iyé§ìu²A‰ q!CþÔp(?ô·æŸà/mÍöG�x|²ÿsü3Y¬ çÓpþL™Q&%®IyÍ{Aq£ô)»}þÛÙ~ÿ Nýwßk>híg‘Õ…¢D$Á¸"�ÆÕò†‰3uËŸÿSˆ*ßùÎwšOúÓ ?µöÉO~Ò7îôouÂ/ûCø¶·½Í¿ ðÄ'>qXµÔã“O>¹yðƒÜpAd¬…¯P¼üå/÷÷,ŒÕÇcñ‹ñ™eœèÆJ–#I�„;jõaÄ‘'ø¾œ^ Ü*=Õ·dËßòo�;÷háКAŽüMx »ºÎ�ˆ6��Ès,8„Uj\´Ea,ÐÑ[kéð¡}:¡´~¢<…À±R}`W:|¨�ÑÄßqwuðPæñ×âûlŒÿìÿzÔu¸Æ¦Æ_Ž‹DÎ;1ňàüwÁ�ûóåÙÆÇDý@7�?%%çG /lq€7I=3lÅa¾Äó:}“t¦š]�ßýÝßmî¹çžÑ´èµ¯}msÙe—5g�uÖh|‘G<⣽ÀŠÿößþ[sÆgŒ*f›á ¦²Œ/žô‘´šk¾Œc1Ç¢¶ME#ñ¦®¦Ò%øü48+=¿[o²q� ø�æ²ÝÏ ú‡ ¬¸Í@{ÇÎã•¶+ LðÇûÝ¿J¨ xIlh^'t´¡-jk«ß ”ö‡oð‡¶ÉöGœŒ¡øŸ_($+›^_éƒMº‹H éÆN¶ß"–ýß':ÈñŸó_ç<Æ„ðí<ÿÙÏ>ÆLsZ›¶ O‰¸™e‰Ðgõ]HÓ3"01�ìek\]Ë’˜ˆÀ˜’œÃŸ7½éM~.›À€1–ýû÷7¿ò+¿ÒœwÞyctï¸|ú¾°´§QŽËñ= Ì�{k%®@ >õjM¸ê¼Þˆ.Ñ Ô� -Âã €Ø[šBÂm›ë,PúC®Ü‰µƒ°cHü»Ÿð°y]��9«�Å/|A£~¸Õm®qñÕ6j\õ¦Òu)ðP€5îDvºÐPµ_q˜¦¿ö Üõ ¢Î6ÉžíWÔï‚ê³ãë²_ñ(¶÷)ñ6Rö?A(…8Q/áNd—ã?B±‹çÿ�•e�$¯Ô4ªÔ¸h —�¼°ÄàO1­ ROá«öó\]Ë’ØøÈG>âï “³]tQsÚi§�É%÷å…/|¡?11:Ç6Á¡÷¾÷½› %UlU´pç-ýQJrn�ô¡ÄÞqÛÅ÷û»úàé’§ú8.(-àeƒ––[àÃw2±uÒ_àC‰ǃ„ùD›""O€lØt»mûí¨Â©[d&œ&æ4€ÓŠÛ´ é†G´iü4µXãŒAÈöwqP¿ zÜ«>Ïþ×¹  Æèz0ǹ@ç翘mÄdVñ1g•Š)|¢Í’éÑë9_ã=¦î@žÙ°%èvÿûVV/|Ù¹?yf—»@á†fKòÀXz¢ó£ž(š8í@>ÐÅ)±�¿ø‹¿•—Ü}¼âŠ+Få/L|Ò“žtÜ>}õ«_õ .üœãXÞºÏ{(øuˆ,㌀x$éü `|øÄB�ã¸,Y¸�5+ WpŠÓ*È×¢.Rx^à‡t�Åí!³Q”«ªîÚ†ŽN—ä�5_Xè ×›�‚ò·…ÒYCcqy E‹u×ÑÆ¢Ä„ú9›ûb<­�)í÷§#Œ‡R·jûŒG:§Ögû³ÿGŒÕ)ãUc§�e<éØsü„RrþÇiÖx¢–í©'>Š•qšï¡Éc‰@¾`,=Ñ÷cx^9óÌ3O°>¬Ï–G�qG€Ÿ(¼ù曛Ç�ÆÑ‡>ô¡Í?È‹j—_ó˜Ç4Ï}îs�Ù~yá¯ÿú¯›¿û»¿›øYG^(ø°‡=¬yä#Ù<úÑ�nøšÁv—w¼ãÍw¿Ë¯emìÓÆo¶[å*€Aއ…tž”:îÄ ÿà$µ×– ²žÓ£³$º–ƒ´7¢]w1¢…µkñ¤µ»÷ïu&ï–íW,“i•¬Üaqû*Â1^̆žJ¶HÀå�ôJVúDŸ ‡r½8àöLXöœf)$ •¿Ùþhö;¢{cGãH.ð–{0žrüçüߌóßÙûOåÀ_–áÆ�«7;ôÒCnòÀöÇ|#5qVííå$ÿ6"œ¼�1D€äô/xÁ\q¸0†rá…6/~ñ‹=é8þéŸþ©ùÓ?ýә߯çîûûßÿ~ßxÁ ¿Êð´§=­9÷Üs�Å܆e>ô¡¹í ¦À6FÀ½Gù˜) ½' ‘âã5*<ö¯”d]o臋ÕO(É@ÆsÕIà¹o÷jèî‚Bx·�¤C´5”Y™H˜K²®»æN`”lã¨o«hØ+´¨åÀ8¼QÎþ¬Öå%ñ³ȱ—VÙ~cP›áÖ²ýÙÿqqˆ8øøÈñßÎAâ‘óƒ0t®ÓxŠ Æy�xÚ¦sU‹žÿìE€¼ÑzCC–‘E û¤™c{Ð�z²Là'žxb>þ¿Ånh2wÛ¹S=–Â/pw|™Å^èÙ¼ìe/kØø5=^°øGôGÍ«^õª™Éÿ°mwÞygÃwñù‰Á?øƒ?h¾øÅ/Y6õ˜ÿ½æ5¯ÙT�©l "@Rk%úÐOZ^/þôatôè_Ñ5ÉnCÎ’˜èZ¨7Ý. ÄŽ±¶´":Â.{´Q†Ž ÄjÜuÂS|Ö¸ê1é8° ‚A@QjÛàÔ:—Úl°m¡I‹ uaÂÛlv¨ëÚGØlþ^º]�±×m®qÕÓ4Ç�lÛí„°�íïâ ~$|uŸ×¸‡6D=ÞÍþ/c+Çœÿb –óÀ”ñ¢q3 ú´J�·zÎ×¸ê ¿ãÀ‚nåü?auߣNjNâº-ù¥[® ¡YÆ]\‹?{Ù�áDaò°ÑGkyÈCþWû À8n]îå^ʶo8<~Áø¶aá-à{òŸÿüç·Hûújm7/}éK›Ã‡¯Ï8¥öÖ[om^ñŠW4Çó³z$çï{ßûšû·sN:é¤)–Ž�tíµ×6¿ñ¿ÑÜu×]Ç®$%·%ßÿÕ Û¤›;ø‘ ö“U‹í"Þp_<:à½q×?Öy¸ÌÇ tÄ? ˆG\,`üÁn˜=a@ PO  ‡¢=P‰ªp`Ôw™yEÉÝL}j>øf[~p(ù¡=|’ ê„‹XO (еp'Ún=ù�Ìö+ŠÙzpn<­?\Ÿ÷¹a8,ýQà4;°ËõÂ�”a}ö?!Äœ :܉¶[/~Á1ÿ<8W~ ÄûÜ0fÿ{üJ“ŠEíày‡Îø¿ß{ûU·�¾ôZDزŒ$y`$anøéÅ Žé¾¦±vùå—ÿvRÜ}?n�˲û#Àê'<á £iè7¿ùÍæ£ýèRüá;ÿO~ò“7lûÆol^ùÊW6¼ìo3 @¸@,.¹ä’czaè_9à ƒ»ï¾{X•Ç#ŒÀ÷Ýv¡¯iý{úú2?ËÒ7`YŒC�ÕŒâ N¿xPh®¦,šý_0"¸KNµ_ �nƒÈQZbý½†;‡ÃÂ#tTz\Iˆº®Y+ND¨›!uE�tÖÐÄ[ðá†bh2à.B3"›lË?x�† ¥& ShÀÀûú©vÅŽtº¤¿�[PûN—/3å+ùTC”ÉOǽ2ÛOŒÙ<¾o£˜sÜ# ShÀÀûñ¥ºî@éšÙ¦D>¨ßQ5W¾â‘O5Ìþï÷�ÇÖv@6Å^ýCìsâ¿“ûÿ`sà£o¼í¯?i­¨“o–ízÍ1áöG ß°ý1_Ôb{.µÅùi–ü_º¨`òeÆ��üã �®Ë#ï[Ñ{§ÆV¨�«ó±�}lóŒg‚·¾ +8–\�˜áJk®°Ô:j1Ž¥FxË£ Aãm™ Íö[¤,6ÙÿeÄ0Nrüws¤Ì¯nBÆxÉùã¥=ÿ×çÎ1U)#«¢zú¾“øÊòÛlƒE[TƱNƒ¢%\BòÀ‚¾ŽIM”<ÿüóõR�uD³*#0Þð.<þñ�…“6§šC‡mëcêçœsNós?÷sÝ‚tÁHlUò_›çâ Ø.»ì2ï'àÅ_ÜØÏ�Ö¬-ÎùÈGš«®º*ÿ6*; !-é¼}µ_'ßõ·� >…”4îë@§E»ÊËãßY#¹0’ Ûü{©\L( H5km2ï–¡–b2,:Cmà�ÉCs.Ô²l”ˆð²”†.Ø‹}·Rásù±±ç¨áRáÕ•;Ñ~ø§ ªÔ¹;¢Å�Éz ÞúoÕÙþ*àƒfÿÛøñ˜hÀ2È*|n¼œ>솦TxµÑ�^÷Î_(‹€ø‘©ñáüÉño=TΉß�3ÿ­àÝ«�&gèeA¦¯ìFàØsACÍÖ±C»kz¹*fvjxä~,¸+D‚û‰O|b[Ây '4¿üË¿ì6bp;’ÿ¡?×_}ÃFá§O?ýô†÷°ñ½þÛo¿Ý·ï|ç;CÑ<Þ�ˆïÛÇÚÝq-Ï ‚ò!ÄÞ¿&à‹zh~ÿÞk¹X|-w‰‚K:ÏãX+OeQ ‡³V„#þ¤‰?U$ýq�'üØ­ ÈIÜyíÀ s:.:¸v׫»àÁÑ߫ΡUIH ?ú±éÇWñ·xáÇË(ÙQ‘“ çC®èäØë ä˜VˆÆq«¨(tý¶+‡Ùþ)ñU{ü;Õ©?Õ7@JöŒ-¿èDþ?Ÿ¤ì°|ìc‹­>@–ì?_Ø® /|á 7ühýg>ó™æw~çw6ý±ÿ�„�$ŸfÙ�`QOÂC:ïù¹g•¥­†kªòA¿`˜ñµú‘uº9?¢‘?Ù�ñùcüЋ�Õ�‡�‹èR‰ THŸê\«Ñ‹lqjâ¡é û’3]•~¯¤ª¨ó:ðÂãjÑÑևɶ=Ò%h¢’íøü(ô˜½N_Ñ=C>ì×üû0 [fû#íïºñÍþ/c´ßÄšA+1þrü—éåó9bâáiã¤x9µ7ÖÄP²�¾½4ÿWNúßÏ{Î_ùÅ?ÿœEƒQVo%P –®ÎdOêIÒâkkky`<}”žcxÙÜÍ7ß|ŒÒ›/ö =hó•NÑÈwëŸøÄ'N©™Múò—¿Üüæoþ¦¿7a6WÖdŽ/Z¿’Òóë~¾ê%°ÍÓ‚ÁIâ�Å×rÔ—ûÛ¬pù´²ÂÝ}•Kþ9ò;ª¦€*¿ËZ޶·�àŒ‘ ãaS¶ugXãE]àÀýAaÁk×í´¹m7ÊU„á�^ ãq5ŠÚ:ÞÚàpš‚⢷½jÿ,þºÍ5.wta ÛoÁ¬û¦¨îóoãW÷Qé÷ìÿ˜uhÚxÕ1®q1ÔB5®úÿ â° çÿcNx ¬ú €a�ëX#"á6G /lsÀ0§ÓA ó €¢–,;"ÿú¯ÿ:?yó½ÿÜ*§Î;ï¼æùÏþ†Ôóˆý¯ÿú¯7wÜqdžä’9#°Ñø‡Œí|(‘-Ð×ô¶ƒGÅiv•ôŸây|»À/Vaægý<§÷ªVªdئ:üÆ…wÌ* —»»°• ¼%¸M;ʾ ÚQ äCGQˆðQY ãqhûRÐM‘=áN´]-Tãª/âÞæÒnµ¿'[øÝWÔ– Äi"x[­Rþ`Ói0–~,Pr‚Ù~‚Jœ³ÿ ‡�‡�°gl ÖxPûBÓäø/ñ3° çÿYOçÆ¥�" ‰„ãŠ@^X~”Sko¢´´³Ï>û$[œ�³|7ÓƒŒÀñG`LøN»Í¯ãoÔ |ïÿ%/yI\´ð²Dû߬Ÿú[ÔnòíÝøÚ�(ˆm‘Ðíc¨,ìý‰�/T )9`k/¤Õ }“…]:£J‰¼Õ¸R«ºnã/Pv�á…„TÛ„„Ö7↬NÐu¬q¯ì“œÅv-¬ñ"Ž]êeŸ9¡®@ð;‡5NE¬@6xâ—²¶Q{U!8 9‹íZXã…×}3\þfûK,, êwA Sö?ƒ©Äa¡ñlü9þcÜ,/‹­æd u;Í#ð¾/“ºÂ(²¾Ù®…5^êe è›íZ½@COlN¨/8'e3�eÙÈ Ëî�°ßÍš˜ P}¢>|x{žSGÒ‹]�ë®»n©ßi†÷ÒK·îÛ5Ï{Þó6ü½ÿ?ù“?in¸á†¡›yœØ’xŠnŸ4‘Ä› [À•´Ý“üÖ(ŸF, wNª¶ù#é^çÁê\…tràI¾ô¢ÛJý­lņ¸È Ì(Z|ÙÐ)Xô;MâC~è¢9^1Éæú ÷¶ Áy §Ö84ç­ ú(‚àòXãÔM+58º¥Wù!Msœ�•Yþfû#ÆedÿÛX!/;@ tŠê}|Ú1PãRÐùŠã´«ÔM+5¸ë/Pz‘ò×4ÇÙYÁ 6×W xŽÿˆÉŒñpõÀð€-˘"�ÆÔ�/:嬜xâ‰y ‹Kb;<üî<¿?–²UïxžÐ\yå•jæ;ßùÎæCúІd’9#p< ÁÖÿHme˸^@c ,~�·|:ùZ_‹hcñ'Ä ÁIþ¹ƒ{0}¼±®/¥ þnðb“…vø͈Ð+ýE:ê8ЂT¸d èúM‰`4&d‡í—=ç-²àAðÚ§§Î‹˜�5>£Ú}²:µÇý°�Ã"#;Â'XãAí›ÄüP¿÷¹éÈöG §Ç„X�WpJ÷eÿ[|(ÄŠ�"èuÐjÜ+#¾ T± ǧëµ�C­Ôúë1_ãÁ9_Žÿs ¾Æ½ qö>)œ"®¾(ýsŠ¿» ŽiY–�¼°ä¨ÌO›$+öÜ—T<‰fv|®¹æšÑ´a+ž8묳Þú¿‘òñ�¼yÇ;Þ±‘äÍlJÚuÛ‘ÀÚ h/ ijêd}ÕßíD=LQüÎ>(‹FÛ"‘7©‚û&àO 9½Ì®¨p€¯æ‘âò�ºî‚¶‹O}r:¯* ~‘£Â;ŽV' 5^ØÔ~`�·ZŠ ÷Üý4.tBNÑßê2Ô]4Ç £Û©p¡…7Ûo½UÅ¢„gÔ}R㊧w]˜ýŸãŸIc¡ �nn2Ö|ƒÜ÷Üüß·ºvþ‡.áû�Š€ !̲¤ä€%~†ÙzR8n¶îåN$9#°•øÔ§>µ•ê7¤û‚ .hìW66$³³½°³yñ‹_Ü:th=¶^ÝW¾ò•æÿð#1êÕäAF`‹#@¦mŸ4‘$Þ>®_-ÍXÇ’¬ÇwôŸð¬$M‘às×Þ…\®}: LØÞêQʱAÇÝKþMO{šŽaÇÐñ Y¿rà‹îÐcŠ]_øTüv�•¬ôÉõ)Ð)¥Þutܪ�ß(@ß„©°"hè´ö·q€¯§Ãø­øm-:á§Ý‚¥ÝÙþìÿv¼ÚØðñÊñqRAÆE°ÆËxsY†˜�AÇ�Gv;pà°7v©‹ªÚaŽÿ6qмô8õbh„Zé�^ßñÍÿµÝÿß_Œge3�eLÈ ãè�iÄiù ãè ôbó"ÀïÛßsÏ=›§ð84ñ‚>ÞÔ¿YåYÏzV³‘¯ðÒ¿ßû½ßk¾õ­om– ©'#°¡ðAC‰õ»Ž 89v†û}_hëÍŠ©ˆB�%Ÿ%_†ó+,NƒB©—.3¬ä'XÇÓÈ„°¾ëXã�—òhv·CAGã]Sõ Ô¹,4ĤGÐH=šóØ®…5¼j3°Ægé¯}¬qLG8ŒílÿÌþªcXã%˜:Ç «ú]ÐcktA…}³] k<êë>¯ñ�A¡äK©}¬qÕO8ì²æ°ûÐ*iÙk5Þ2ÐV Pí”_‚ð —=NŽk 9-L2nGu’PãE]Øá@öªöƒ  ¢ƒÖ¸ä¥ heè¯_(1½@µ[°óÁ²¹vQ†ú²ý%ÆÙÿݤËñ¯é’óŸ„•Þ9¿Ð¼‚ó Eç;7�¾ïäá€jD{î—�¼°¼Ø¯gÙ?‚®¸âгíý¤õ³.#°#píµ×ŽÆíÇ·/ðGÿù À¢…þ½ÿýï_”=ù2›OíÓxôˆ©7ÜCq†ûb«†�Áë�´‰2ôÒ>A—3::í¿@’õÀQçŠZåZ1b¼˜µ«òÏuâOµ)YÖ¸x$~D’\ãð‰Çeê6×x±YÛ¨qÙBé–MÚå4/ÑÖhm�—jìRª6×xíC�‹gh_~Â'—©Û\ãÙ~ïƒ:Æ5®x¡bÛÆ›®dB´¥îó/ b-ñê¯}¨qñ íËAøÄã2uŸ×x±_Û¨qÙBéníY³œ–í/¨û¼ÆwOÿŸ´vPhT=’K#,3û–i¯‚bá'Q�à xBl´5ÿnBð)IFÞT— Íñ½ÃI¼­x;ìèei·x¨.~%΂¡¤Ú»¼)5èýàÅÎFý“AµÖ��ê—_‚Ùþ®Ïé¿ì¾eNx<Ê@Ñx„Ö+9þmÌäü_ïü·oeß…6fx,’3c½i(A£”³fä~{"°øóªÛãÏ^¶2œ+–�³—’mß½àåw7ÝtÓ(xµtsËÙÒMIó´eÜ‘&.¬ù¯ š�óšÌªéPÒåzY†ÒÈáí+G`*uí‚Ûõ8ƒ/¡ÃÒBT¡¿@µCÐÈ­«.7�ßl8?>MÛ\yQNt4ðÌÿì°…†ÓæaûÛ8À[ÚímrÆB+¾x½ë0­Ù~}‹öŽf ã@ó^ÐÈ>^Å'è|6·sþÈÁæÁ*�§:êoÏ<÷ÐéÜh–4\YF�¼°üŽ˜61 qwôìå»—d¶&×\sÍÖ(>­_|ñ1H5Í‹^ô¢æä“O^XöꫯnÞûÞ÷.ÌŸŒ�­Œ�øzni�ã%C·Ó'‘âCHÐ?�´¸ƒ·$œî›U’¸v‹åXp“ìÖ nx¥ܬ|ÖòbÌy?6ù?X‡ƒúæJ:…ØB¹ûê� |Q~ÔÊ_pt ºÓÎ`t mj?PmD|Xp—dƒWÐå*�®?v¶Ïögÿ38øè�IH9þ BÄÁca1\$^ÒrG—`/Öm«ç¬æ½ âÃbê¼Ùà¬u¹Qô»‘€5®úžO¦h$ý¿öS§_yšWm†ú10Ë#�–|3ͤP©'ˆãvÈ ŠNÂ]��þ€§=íiÍÃþð…ûåÎ;ïlþø�ÿ8>˜–JÆŒÀFÀŠÜ‰o?‰À­°g1Jrm ]ÌZ¥?%`t¢+~AN+2:%ê�º�X¸;Ò‰Œmqá!p›$F‹ <Ñï‹Y˜ì?vÍ6÷¯@poV ÅÓ‰ù­¦kcaƒVÔ{xèžôÞðϱ/ &ì_e`bÁnõ¢…^2RáÐlêÏö«¯€ŠQÀiñ"²C+êÁ©¬cíÄšaJM3¼–©qÉ«¯�5®zWè:ÙÙ&¼Ö:Á³ÿ#懸â9Œ—Õdÿ{€ˆD^2Ĉ—`;Å™“޵øû/àIf"OÖ¸s·œä;–w¬j =б9–†ÁÉãÝÞÀBÇ?L–ܬÇoÈ^ø÷Ó?ýÓ’yÝë^×|ík_Û�L2g¶2þ¾­ÚHÌWVÙ[ñE aÕÜ„^¿À�Çú×´Xä+öÇ¿˜àX¨ááøøãQþ5³ásÞÍÄ e.^h&ï�ÆŽ šê¨àÊ€é ˆ”ã¶óX•WÛh;¨”ÛT qêÎG:7y2fòÒ+ú¤#ê�V Ø^és_Ý!w�C—Rä+0Ê€#Ûoa±˜x"þÙÿ% Æ ±)ã'ÆkŽÍGx(çœ_´Û¬óßY'ÜO_eÆ€6Fh–%G ŸXr Ì39TVìÅd‹¿V\R 3;$Üÿ¾0 o/ºè"à"ÎðÉ£ÿüôߢåþášøÃ‹²'_F`["@r›¥µ†øf c%¹‚8ø÷¥2«fû·åsá+[Q GÁÉ?xÔŸCĸP¸ÛöÅå.  ÅlÀb;û�÷t ´'ÑÆ#ÈtÜECèŸØðzùÃzÝ~d½·� +¦ÖØq=„Dw Ƕ ã¨‚†dzýŠƒú]�Àz< tœ¸ÙÿlÄR|b3%N¢ÐŠ  ‡Rô9â´BpÃ�臷@Çãª÷Í0 ØtUÐ ªÝ‚j· v�t9höïU8‹Á©› ;ˆ"+‚~€JÑçˆÓ ÁE bÞ�C¨^Ü7Àüy[ tU&˜í�Ð×;±ÿOZ;IOøhi»¿ –�¼°¼ØËr9{Ú™/Š:tÈnœ¬<@L 3»1cùÀF^ø£?ú£Íå—_¾pwÜvÛmÍßøÆ…ù“1#°m°O»)o KÿØq¨¹/¼}iÞyãlvOYâÇ"¿,Ô=!¡ÊVþ®Çpý @»À§Új•\DºÁâ6hîKåÉ �§mÃr$Åüõÿ€Ž*èúì …5޼°îm-°¶í:�©uN�¦²^û#Ø#&]»³ýÑmŒ‰sÙê>pÜb-èq‡�øÛ¿ƒ ºj |- ^Ä G·`mÛå¤GÐ�b¶S�ý_âçg‚þü׸Ô¸lcL|ËV÷�ú]Ðã^ú» È€K¾×çôTáW=} ®‚n ÐíX�`O]²"¾WúÿÄ•ø*3¨7B cð,Kˆ@^XBÐ×1© ±rÞyç�i|këðfUF`ÇGàºë®M><×›—Ísžóœ¹|5Ãk^óšæ®»îªI‰gÆ[ÃÆ2ÖÜa!Ëÿ,nËwðUÏâr·ˆ]±‹¶„°O­¸Co(+_à£ì¨Ýñ§™$áÔu¸hP¼Î Û,0ì[âo?ÍÉSñ>ãlu‡/H»«Ð©.ЕÂ\lº ËÚèx‹]îöC¯ ªºöƒÓÖ¿',˜pý!;Ë »fö€lØTûÛv»Þ�Ù~âà±°°z ³ÿc`iÀ—1©Cr14‰ñç$ bŽÍ{AB™óŸùUÎz ŸÿNXݧ'ÊHsÀIL%Nh:J¸mÈ Ûêu ihR¬œvÚiùÀuC–•»!×^{íhšqÉ%—¬ë‹ý*Góó?ÿó O ,Zþþïÿ¾ùÄ'>±({òe¶5ü € ¹<Ë;§ù'’¯öŒbTÛy‚Z ã–Ið^²þ<ù7³'ÂVï(wð�ee€«î‡@`<žP**Øñ"‹K;¬ë,Z• +P®ÂuXÁií÷v»B|è|ó &Uq.h±:Ñ~h­;ÎOij¶š`Fc”l?Føâ�®ªß�ìœ-©ir\ øpü{hÑÙÿŒSb¡ñJdrüÇy b#…0y¨<>¶S!| ó°ƒ×Fq[�7çÝóÿÊþYODr¿´äK—úÖ0Ó½.~|ðàA½8£®K<#°«"Àãñ¼ïŒ3ÎXz».¾øâu}xæ3ŸÙÌã©ж7¿ùÍ5)ñŒÀ¨"à/Þ#Aò…»]°„fÅ®Dâ/õcñÊ:“\¨Å+w÷ã¥~ѤRm²h‹…«'HVÁ×Ls‘…ÓM•'àýäS+~Q"xB§K–$΂Ýu¿‹»U| ëág´+ê�bÿ‡îHèHC¡'+ÞþYõá³Ú/ÛEÜôÇñÅ™*û^· ~ã…Sí Q³QÌx[ oý�›…A¸ê³ýœìÿÿ9ÿý„´]翚}z—§36•-á6F ŸØÆ`O1UOM‡û÷ïÏ S–¤Ý�±¼`½^xá…ͳŸýì ÿÕ¯~u>ú¿¡ˆ%ó2"à¿ÖgŸ:Gý·þÌrLO„ l�2&øìØþï%àždRm»úŽU¼Ý)WI1‡Vx)`WÝì£p)B8Ô/ �* ãÆ+èr _\•á@XK²ìµßê"‰¦]Æ[„c‹zݱƒÕñ"á: —~CÃ&ˆWn˜KÚ¾ƒj·`èo«‘Jó\�ÓBOT€PðR�_àò�6¹Ïë¶J ¦eû‰Qö7Êè%&6ÊØ|,èc­àJ�‹’N�x‚³·÷±n”2¼]�ÓB_T€Wex©vŸ º¯�6aɬ»LW}öÄgxþÛ¿²ª'"%Øá�å~Û#�¶=ä­A?•”£‡´²oß¾ü @ªDvsÆr€GûÏ=÷܉Póè?oý.Z>ð�4W_}õ¢ìÉ—XJJÎÇÒÖ·/.Ø]Òzq •E],Úí£ÊÖ̱H~tøf-t¦xÀ“|»ÊÀ‡Ko×í6ú F¯Å޽òÏq”¹N „œæè Z0p| _Ý_ä®8u-„í‚£«… Ĥ@pµ?Ú^ô™×[ë+“öL—Û3è¶l×A …¿@¶°PíDNºd?úÝè�Ø š–I°’í�>§·éA�ì�I‰J�1b0~ʸÊñÏ ëæX�æY5g}¬Ù®ƒ ¸Ý9ÿíbñ<{¿O¨LL®,#ˆ€>òGàÊžrÁ?^¦´º×Y²‘¦(I»/c¹@d/¾øâ‰?ãÏh>Áë9_ãÔQŠHÄÔÅvìü_ùÉSŸX?àa¡‰ÞÐÜ--y`i¡Ÿ0\O;_¬è{3ŒIÈì¦|þóŸÍ£ò_|q/´çŸþ†ýç'ÿ¾õ­oõôäAF`”àN¼;fÐWñ½_|Z¤E¨­V�Ïù’$�ÇþMÚ-€z%ÑÑRîR€ñ²ÀBà{8�“¬ ö(¨Ðc­/pì…¸B$ 8U-4„¶¸>ƒÑ®Hf W�Ök¿+Áˆ½‚»ÇC?”¡¿®Æ˜Z½·µ@µ[0t¯¯ Ù~¢ÉÉþ�!˜ã_óËç¥� ÍÏœÿ â°Ýç¿ËO¼@ù “5ËH"�–ÛñÉŸ`xÒÛ€Ó—ëZZÏlOXÄŽåç/¾øâ¶Ñ«««þè¿}§¥ÍC®ºêªæÃþð<¶¬ÏŒ$Z�YâÀ“÷VxdŸEs»`6šã<šoìzD?îjÁ¨zêÐÇœçÈa¡·4¯1 ¶)1X¤1±ˆïôÁ%ÝÒ'@ÇÑ„]x  ݾùS`pSñŒ6 ‚Ã*îã�sØN¾¬}s%¶«iîs¡¹Oξ¢+6ˆÅ ¯ïï†ú²ýûìÿÿš÷‚í¼·)äs¯Ìû˜CÝ Ìùï'4?ÑlåùïôÕ“N£+ª3šðº3ªêD·#y`;¢¼˜ MŸ–|œ²˜Xrev~Æò5^¨…öÓŸþôfÞOÖ‘¿ë®»š×¿þõ5)ñŒÀ¨#À‡�~È/–gvoßˑ茔”džåB@hÜkä”´ÆÒj\Íq!� þ¡…« °´«M#–â uõ`ÇÅÕ‹ ÐúV-þ"ë"e×J-w[Ôš®BEz¢ývuÊæÜE:ÚŠÜ W;šè‚¥)…ÏTXÑyGí¯iàÙ~âqP¿ ªß�Ñ{Ó%�šØŠ¶¶YhÀГý¯8äøÏù?9|¶´óª>çÕ8³ê¤µƒ÷cjU›¡åÖǃ’û-�Àâ·¶¶Ü•4PE€‰Â„É’ØË€ø‹YXþäOþä†bÿ¶·½­ùú׿¾!™dÎ,3,Ô<áñ·úw)É7©q—„[]½Þ3§�"h BÞ|jQ z•¡¼'€ ˆÆ¯PŒ®ÎpìP„)a�}ܧ1’²¨G¢þÉ@ªv‘š¶X�V5�’h‹'(j¯ìsŒÅ ÎŽ?!Òá_ÛÓ|÷»ßm6ò¸ýVµíÒK/m®¼òʆ_X´Üxã�ÍûÞ÷¾EÙ“/#0аˆ‹žˆ»ù+MüÚE$¢±$ô¥`4{O€ýÅ!ë5qö›$vž€Ÿ¯¬Ù_4bÍž�‹}Y?2Õ+V‰œ[3…õ‚³[+N_3Æu[ÔÓH)t¯ÅO:æ<øÕª€-YÕF0Tªýh¸“Þ€\‡€H \>Zß«­@Ê$QÔúïlí.Ûý™ý¯AÊx‰˜Ä ÑØÓ8R]ðçø�xåü/ãCÃH�ÑTá퉧E4®Ž6V׸Ps×x+‘ÈöF .­o¯Í´ÖE`8 üøÔSOÝoZ;¶Ä2»;÷Þ{osÓM7�¢‘Ï}îs›Ë.»la_î»ï¾æµ¯}­'' %cF`àÌÏ_äg 6ÿ�/ô“[ûzÎ>¢Œ×ß`þ;É`|�éã Ȳ™ZÑ 3TI-d¿ÃÔU;/‡¡Ó°öŽwÈ¢+œpIPÝF¶ Ü,8�]©l¡xÖãG7ra/tEïtSá”_‚jC@-œ]¼×¦®­ð¨Ý‚á“l…tí“Ú-í€Oqè|‡G|‚Á‡ïÙþˆu7þ»x)nÿ~Ÿ¨ßÕ‡Õï‚¡A¼Àì�u`�›ØˆšbÖõE×?9ÿûó™x-gþï[ñ 8@é:-Žs¿¤ä€%ÞÌÖ“ ‡Ÿy晼0#KF`OE`,_8ýô�½ó½ï}oóÙÏ~vOõU6v÷D€ïü·ŸF†WKÄ�Ä��)«5à?ígG<À_'SÅÅ.x) à C‚ÔÃø¥×ÃÎV®®×!V�ˆ€•Àµ¸²q§WPw}C®¿W� ­‚à²*{ÁÏ]Óà‡#h`“%ü ßÿ¢Íj· |ŪÁï4G½ü öHrÀÝ÷å—`§£ÃTdC»`XЍË^ðgû/"1ébZc¥;}Lžý¯8Äð¶!«Ç|�· >B9btƸÌñ?îù¿ÿè¾úêR}t'AÕ$Ü–ä€m ó„‘zÀ ×dhN>ùä|ü"dIØíË€�Äù¶ÛnkÞþö·oD$y3£‰€'Ùeaí‰�yM ôÀY\²ÔæÉ ‰aàA�tz”X sŸ?x¸È <ø"Áïdº‹ a>ø‹Âð‹þ¡×½5xØ’~jký!-ä£<ü�¶†_m»�Ê }=Úd}íS�Ëž‹·:iƒ7Èa�û¨—ÿÁnžyýCùl?ý™ý¯ñ˜ã?ÆqˆX0:4ç˜9ÿ‰‚ÆK‡6ŒO}NÚ·²ªœ†€j“`Â%E /,)ðë˜]±‘é…ë°eUF`wE€ŸÔ•ÿ�Ò²7¾ñ�Í=÷ܳSÜM?3½è.%‹7æZàE]¡™Å°ßi+‹bR嘯õ"¹ÃµŒ %Õê ¶Ëén= YhˆÅ6‹HQunp?‹Ñ¢Q² ¬ñ¨ïlù°9Ñ~#ËmÁEìÏzûÚGðh©ì‡¤|‡Àgû?ԇё—- õšT»Ã7éÖxÔÎß×2à¬} MÙþˆIö?c²‹E7Άã‰Ñrü×1«ñ.~õœÛÜù¿oµ} 3—ØÒ#�¶¿ º3Rß6tßìEhù€~lòhDàÎ;ïl¾ô¥/혖~ìck®ºêªão:šFÀï;1>~âŽWÁö‘ä Æ]� r�>8J¥ƒza’ú×€ióµ»= [dö“¿b?>‹VÝÝ7ÛV~˜on"øû:ðº`ÇÛÉK�›(üà¡OºgóG[ÃF�O×9K´?ðõÛZ¼�ކ?ásí›üíÚŠ/j·`¶¿ŽYKõVÄ‘£ìb0?^õ˜¯qETc7â™ã?ÆqØkó­Y~ E7é4hncòÀ6{S:S:Ëþýûõ¸Ì:"Y•Ø}Ø)_ॅÜýÏ’ØéÐÒ�¤‘¿ø0ŠGá#‘´Ušõ1©¿sð& €¥ % ãv´QB'oûwè/ø“^蔎_v�Ú{œ½ìƒ/(Á޵BNá³êá©Ë<~lQdUçL¶ëë‹Z,L,ð†DŸ¿Oãhh~hÀZÖ½Ô´WýÖ<5.¾¡}Žë >ñ€×:¢Ýвý¥&A¢5ŒWŸÆ‘b«˜_p`k;ôRÓj\õCXóÔ¸ø†öå‡ |â¯udÿG_ïÍño_«sšz�0P²,)y`I�/fë‰ÐžEmñTO–åz˜Ö3Û�k¯½v­»©w½ë]Í­·Þzì R2#0‚(寕X ’ÜÇÂ]°ss° ‡ÓtúÁËG<íG™añ×Õ£­«ï' ý#×dNْٵvº©©}A'%l­§?ø´ß(mS>Ô}ÏjßFí ù¥[6i¸Ê�ºhâ©¡ê€5^óÔ¸lÉþ¢Ú,}µ�¯mÔxÍ.ݲ /¸Ê�ºhâ©¡ê€5^óÔ¸lÉþ¢Ú,}µ�¯mÔxÍ.ݲ /¸Ê�ºhâ©¡ê€5^óÔ¸lÉþ¢Ú,}µ�¯mÔxÍ.ݲ /¸Ê�ºhâ©¡ê€5^óÔ¸lÉþ¢Ú,}µ�¯mÔxÍ.ݲ /¸Ê�ºhâ©¡ê€5^óÔ¸lÉþ¢Ú¤¾}ͺ9�Œ×Æ߆ä€mò ô‚b[Y[óÇetœ0#°g"°žøÊW¾Ò¼ûÝïÞ3}’ ݽ A� -Üõ±$8ç¬navœÔ°QââV†ü\¦ÏîHÖújœºé¥³YÛïx¥ÈæXãªGR2àóÊ<ûù¹ìs6¨PmQûê6׸êQ/™�©©‡ôw.û\†�óøÕµ~p`�«õ’ŸWæÙÈÏeŸË°A…j‹ÚW·¹ÆU�zÉ LM=Ü ¿sÙç2 ¼˜Ç¯¶¨}ðƒk\õ¨— ø¼2Ïþ@~.û\† *T[Ô¾ºÍ5®zÔKf`jêálíWcê¯È@­¼Æ§jOâæG /l~L�EcoBØùÀc‰bÊìø|õ«_m¾þõ¯�º<úÏW²dvCÚe[|1µ,ùZª7QßßU{W›²t›Uth|œé®$ÿq?^>nÅvΣO?þ�nÝõ�ʾn„)ÔQ‚§Ã…E}\äÇnÀÎÛNsŸ&º V†ú:š,v0x;©‘. mÎR ã¶t„ƒzC‡3€X.žšFmÔgû#Ľ~2ž]ŒCÃúý‘ý?ˆ¯‡Ëhíð5Äi" !Qv†ÒaÂÅׯŸì¯ìÿ%Žÿ}?xòÃN,WubMK|›"�¶)Ð0³²ººzÒø“5#°«"0æ¯|ô£mزdvWV'¾P/¶õ�~Ñ"¹·ôóM˜¿@IDAT–oý¾›ðj1®˜Õ4êÄ‹Âø‰A%a;3²�&áâ… ˆžÀ��S+cq>AY]p}Ò ¬qtLŤné¨!:¤·ÆÅ“íÏþg,äøÏù¿ÈùJçº/œQºsb�/:žtnÒù¢5ÍCN>ÿä�ê"‡jZâ[�¼°…Á=VÕ¶Ø:x¬²)—Øéë×¾ûÝï6ozÓ›vzxÓÿŒ@/±ê²ÔØÖjýX·xc!ÉsÐÀáÕÏI…BIc‹ÔxG¿g¾hF¯k´}ð“ —‡œg2aFB6Ñ)�5NÝd‘dxõ¢ÅQ­£Æ'uõ¥¥qáê,D<Yôw‹öޝãW[�5¶Ù×>ÖxÇQcÒ,/©-øj5^k©qIKãÂ+žh7”YèÏöǘP܈N¯ºÏk®(uÕ¸êûPš§[ƒ·ÖQã}=ÝÑP£4 Â)žìÿ½6ÿÏÚ¿Ce¬Ô¢>�udX“Ç›�}›®1n$šô~l4Q6¢+y3»"×_ý(Ûñž÷¼§¹å–[Fé[:•8–°�d ¿p逸ßÓï DbüÈ kÏ ùþÒ~èKË«O:c ¥ˆCÿØ«(J6 Ë¿~Â`n·ó?êåõó ²Á!î•ÕNº�â-Øä·`%Ü¢u]´OQÀ“Àkž—Ÿ‚²=ÛŸÖèTDzaªñ¡Ð|{òUp¨!,tÔl×çŠ�b¢(u±TßÎï阥G0<èì ¥æÛ“¬àPCXè¨j+�‚œhN(´Àå§à|¤c:”A¸j|(5ßžÚ-8Ô:ªÚº7Újs276ÕXÂPã]XÛ¶Lÿ¤ß6ói¨Š@;ò €**‰î¹|îsŸkîºë®QµûßøFóÎw¾sT>¥3�ã�I¬Ãìçü|ݪ»°“šãÑü¦9b±P^-wEC’'ÐíÚ�~qÁ,¹=,RÓI ¯ààâoô>Ë0ðþ>l„-ðð§@÷#ðh­;¬ ÷µ�À«ð§ïcÕÖÒ~êûí™l¿â0´Ý×�í§Ïê>¨ûF±£Ï)@ÿ£økû#p8b nöÓJm£¶=K^}ÝÙ3NwÒžý‘ u,Ÿ!ŒþT¼ë>¨ûFRô5Åû\ý.èý�ýãq{Æÿ‰k‡òƦçH`^X^Gèl6̓œ(Ó¢’´=�#GŽ4c{ à­o}ksÏ=÷ì‰øg#÷PlÝ‹g~ÎOKë²pV²b‡±ˆæ=<ËR0{»³IiñކÀáÓ׎ðS�FF+s;¸ ŸÅx:~tÚ…k¼RR¡uRŽ?-ô«A ]“úðƒRû>F4� �§û£ö»Ý¸ºÒƤr³E‡öd»eèµyÒߎ/0ÚJ)­ÎögÿÇX 9þcf”8L;Ÿ ç£Ïúr^Ò¼œ&Ÿó¿œÊx;¸v‚ò?ÍûÉ)vq¢­‰nOòÀöÄyh¥ðCœãC�<Î쥌é=7ÜpCóÁ~p/…?Ûº‡"Ài}Éw=I ùZÀ’GF2‰C›PšTÐ}i\"Vœ©»`|ÚGmÇ/{Àï͠㟿@§]q°ª«ý ¦Ú÷‰Öâ[ùC;806¤:{Ò%ýCÜÿÐüÐ$7äÏöG숃oDª— Ñ]|‰_]T¬qñ ûÃû=û?ÇÎÿö¼·‘óß¡Õï0Õ4A5ýnCòÛäL0øÛ `¿ +e ˆ&KF`÷E`L¸û¯Åàî‹t¶(#@‚Äïì³ [³¿(ºÃÝ�<$õžþZþË…¥Á�õùùÊü|q`Õ˜cÑØ¸�ÐÕ%`ÕÇ +!¡s¹òñ(Y*5']GJA–: E¸ø¥K/À• W}Q[t+m½äÛŠ‚̳'9ÁÐÞÙjÛamlK…fû³ÿ5æ}씹ЎëN/pÞxlÇX‹h° †6UkÜ Š.8ÏžäC{g«mGŽ…´wúÛü?´ºøró6çé�ØvF ŸØÎhOÚš5†eR2)�]�o¼±¹ï¾ûFÑÂÛo¿}~¤�ÍŽ‹ëXR[¢]ÒúŽ·@'-×GX$ÊÝR<Òv%Ú@ñˆ&¿µhç;”ðA‰ºi5S¾xµšZ�”ÐÞáNœ²“-`�Oau’"Ñúc–Àµ'_�5¾°=.X”6O“Ïöw}^Çbf|ËxÎþ·QUÅbf¼lìQrüGc>Ë€ØhÜ�K=gk|ȧctSÚxïòù¿ouŸnl2‘c2{r·¬ä€í�üzß'†�<ò+Ûß/iqD¸÷Þ{››nºi�x≣ð#�ÈlE|±Z>•´Àå°[ Z²Na T¨,Ýøî?GÈÆB9ªlï,×åì±�æî¿óè<® Üë·b;×ë5^[`�#¾ʯº·Å'çžä—l©.6Ã6öÑ%>äŸãžËKfš|�¤Õ¸üÉö×}^ã¡:¦àþ'˜ýïA"&*ÃxA ¼›ÿ`9þ‰�â 8 /«Œ¬ñB/°ÆKuï"ÍnœÿV÷“×tP O¸´ä€¥…~Âp=1t¥l‚) �½�±| àŒ3ÎØ+!Ïvî±xO’m VOЭý‘$”W‰“åe~VXœ’¬÷’ èö-Ò…X“ÒCó¯TI=:œ× J|­ ޤÇÄ»b g/À/õ¢Üÿ‹òýÖ÷XãÔy½éÄÄP?uj‡ã• Ù¬yÝ7lV:Áe XãÔy©Û\ã¥zè_¶ß"�ýó ›íøÊñó,çÿ¶œÿÖŽæW›Ë©z4 /loW”Ì„ÑÝ®æW&B”„½�±\8óÌ3÷Zè³½{$¤¡±‘Ôó&O}O8R&¥G=‡¶z>½Ê'´ºpØ}¥ îò·õ…Wwİ¥;cŽÃXxü�ž°D"^'»Ò'Yésq%Êv ¶ã/hu ‹šWú' Ú ¬ñÂXë¨qéú 4 ãÆ(ˆzÚ,˜í�q©8Óaçv�ÿ9ÿ·ìü·oe…'›Ûá¦a—pyÈ Ë‹ýT˧œrÊ V‘OfL�N÷Rî¸ãŽæK_úRsî¹ç.µÙ˶¿ÔƧñ=îà¯Ø®Mv=™°‹e[I�•г–SBßÞ¡/ ®'Ý&Ë—Ö *IS‚�~ù§PÇßDc´#GìL§ÿÕºMÎù ÍA+ɹ—Ľ&õp ö»Ä¾§Ã† Õ@|Â.~à°-îm6 eØ~ѼÒvCûÙ~‹]ö¿��‘ÿõ\+Q©H9ÿ5R&áVŸÿÖúO6ç…€É.ØvJ&šÛòõ Þï~÷Ëïÿ¯¢¬ÝC¸öÚk—ÞÚóÏ?é>¤�­ˆ€' ¶óÄß—d‘ü‡­X9Cöª’¼²PôÅ¢At;ˆcKÆÀIÊ"¹�;þh©ïàG-•üÂ![�àFÑe Ã�¢¾Á^ŠóîöM†¶�ù£úz)®¿ÂƒZÒò0Mm½@Ƕ ¸Û/0ì†/XfSLÖkp†®9ó¯Ö�-ß`/eÈO[¡ù£úA¶ßÃ`A"ÈXö‡ÿL5ÎW5õ�y—ó_qàì³Ú} Œ¬ËŽ@^X^”OwÜ�8°y.¥åŒÀ¸"0†¯œvÚiÍÉ'Ÿ<®À¤7�Mˆ€ßÁguæ‹Û.iÖÂM0ÒÇøÈRËÝ}lq| &_(+Ñd�ÌŸ'¿&Ž>ÿ¤3;‡@Ç[±Ð†hÕ®Üù\_Ÿñ Ö‹uÕcÛq mÎS`�;tôè¸I z{ÜnÐz¾á£mA?À8¥8䆻l!ƒ—êðÏŽÑá›p`áDÁ—¾lö¿�Ó9þsþû9bÏûšÕõr†f–mŽ@^Øæ€sì‚ò¾6¹š_ËP4îùŒåE€^xážï‹ À.Œ€e�$‘ÿ©?hU2éR%Ó?j/P2É}$­ž}Z}Ô9§ãþK¡Å®[F[›ØµÅh[–€sX’•Z·3c Î²ÒáE_è²z³í8��"èhÐhû°ý®Ýv‚ Â�¾á+xñ¹ÅK}­œ"èу¿Ò�ÓœÙ+|~ W=6Á�Å~ �]¾Ùð_‚`�CóÍt·°ÆK½tI?*ÁÛ‚o òT»[¾Š¿G]]Ø”]Aã“/òoÀ�lìk\õøæ8°Æ‹¼tI?*ÁÛ‚o`Ñ!¨v ¶|�&º :±%(»‚Æ'_äÞ€Ùê6׸ê{mÆD —.éG%x[ð�D®‚j·`ËWñ÷h¢ ¢ [‚²+h|òEþá 8�­ns�«¾mkñÝéàE^º¤•àmÁ7 °èT»[¾Š¿G]�Ø”]Aã“/òoÀ�lu›k\õsÛ¿rt­¨ru¨´2 �ÚÜoi2ÙÜÒðn\¹]`’dÉd,·Þzkó�o|£á.ü2ËE]Ô\sÍ5Ët!mg6=,?}½ißÇ×ým[önë2¡ÎÀ*ÍŽm1x´Ð s_X½r¾�DÜþ|1iUú‰?x㮃ñÚKÿÐï G-L òsƒ.k¼hG†c·U¤^Sp·�Ë¢NÜ \õ…è€Ý�ÿ�èíp&Ãýûû êsyÑ£Ráî¿ÑÃ;�b«èGÎ}/2Ñn"Ååá)ÇÞ>ÃÕ¾a{²ýÙÿeÈôƦê|ÌÁÀ¸Ó˜äØðÿ%&žõÇS;ïËü%„-ÍPŸ¿RÕÆz�ÌÿÕ£M�Û�Ê<¹ÛþäÛó¡ÅÞ$È Ãðäñ^�Àžà@–ŒÀn�iö‘’i|³…l@Ž µM@y‰Œ‘�új®,dI(ü�cÛøš€'ÆÞ&.˦Ý6-ˆý%ƒEV)n}”¢×�œÏHÐQQ`�Csza–Ζ« ¿ŒIþ¡Ã“jƒÒÙƒò8eÃ^Ý~osÑ©ö zC€}Óéˆ~ t<ÛŸýϘ` Wc�±á㣂†N”ÿ’¾œÿœ—-$œ“ØC‚S=¨spÚÖäÍ͉I·dB^XrTæý½f¥¢%šØóÀK.¹dÏ÷C`7FÀ–x±Êó·ís „�ÖÖ «ý®_Àw«þ†PÒ TÄè }±΢ñˆÝÕW‰Z;2Qp-}qiú€Zh±Š•šŽmAÇÑ­ýC?ÅNýÃÖtš"÷CPí4Q×ÝB·4éGèxñÓù]4â6¯ýø˜í'¤]¢~T¿ výžý¯ñéc¨Œ%�{AÆ«�õ5îM,Ç¿Íù69ÿã\Wâ óžà´óŸ�Äf=q^áÍýöE`V‡lŸi‰h¬ì³’!ÉdºŒá?h/èlî¹çžÎ±Ä2;=¾¨õûõþ^ H²…Ä›‹/D¢PÍ÷ú¸«ÏBÏ®”zùH`4—[åÿ’X'ª±-$ʾ " H}’ºu?9XɺÏáú< ,rà’'Ä–Ãb¢­ëL¶˜Ë®§OºÑi¥mKñÇÛ%›3ê[Ÿ\C×Ör¸.Ú›ë¯|‘ø´Ž…¹ú²ý¿ìEÃñ˜ã¿œëÖ{yþÛ9ŸÜ†SÐz§!êâë£,w[�L6·2ºÇ ÛNªÙ'Ç·Ù½øÜç>×Ü}÷ÝÍÁƒ—ÖH;‡nÆp1biAHû.|_÷H•”“ð{±1ïõvèuvLg…æÉ½%ù$ŽZÓAó#x ÞØÞ@9ÊÏZ\ö�P+Á瘿 KúýýÈ—ÛÁƒ°‡šHþ=A�ÙsÜý‰cÈЧ•Vo©”n Ó_ZdÁaÂìôÊV‹Bs{†Ë›a½|ŸÕ·gF²ýAâ¤>PìC÷ t»ìÿ˜µíx´ÐhŒy”rüçüçÜeã`ZÑÜÓùÈyÖ9ÿ™žø˜¦,iK‰@vÈRÂ>Ûh¾`vl²foF€ß¿þúë—ÞøK/½té>¤�ÍŒ€'A¶¾óò•užRÔvagLN#y­6†Zò䀋îº ¢û¨Ûð�/²4¤@ÇÑ �E$¸+)I}Ñ ?d6Š`”#ã‘^Aô7ù \²¥¨ýu›kÜåÍOÉ#é8•ÏŽ¿Ä�?®Ã ¸·¹@�üÄBrÔ�òR�*ç4>×Y øp“mù¢�Æl¿Gк ?îuìñËþ÷1ìcȇ`5?ËXmǯûø…^Æ¥ Gš83ólð "Ô¡F© UÎ/XôCCç´M¶ÝwlYWÉñOÔè‚Íÿ««+õ×›»@+à ·=y`ÛC¾¾A;Õ“d}æ¬Í쑌áÎ{¾`� ¶=Ô̲ìµ2‹=-‚mY` a?*0ðÂa·æ=ágqŽ\Y zØœÔbÝhã'ÿ iAÉ»À¡‰»m1ÕÐý§ݽ�uø°%>Ø\g¥Ín XŒú¡lmóºÁ�,ÁutÛ†¶|P† ¾ Ûï>¹!?8Í1h/ø Ý:ÎöGl¼Ï-Nt™ãÀcA?$–”_?’œÈ‚Tfÿ{¨4Þ,"9þ™‹3Êp>3÷Òü·��áÓͽéW…m½bIt3"0ì�ÍЙ:Ž#vRÈ Ç¿Ý�À=èA»3¸Ùª=OüÉ#íÏq[zégøÚäÒ#*쟄Èà;ð¯ kU¾b±ãÈ XÜÚ;xêÓÅ\0ÔžæaáK±WºÝ2‚ñºØ€9h$Z.Qì|Ü´�”á#öN¬è¾ø6¢æîrÎ"‚¢Åz�gð‡ÿE‡ôVmÁÓ¢94x\PTüwXl´¶d³‚´›z %Û_.kU}c1â“ý_æd‰�ÆN;ÆrüsrhçcÎ/6&Žýüw4óÍ8õŒfŸO,·+8×ê|+¸¹.¥õŒÀø"pà 74÷ÝwßR{ÀÐÜï~÷[ªi<#°Ùð„Ü>}"�$W‰Š£¸8@Z΂˜÷þÅ›�-T UPivßäÂŽÑH,<¹0VASËË=1<’³Xl¢¥ó¤S/?�l¾8-P¶Ý¢Ø+Åëœd-0z­#tËjXþhG-+}C:Â7Ç‹ ÷Aí4_X¨E¶àP7ÇCýuÜ?Ó-ض{¥Ôm¨eѺ³ýЉxeÿ‡zìh< áp|2�Ædã@Ððÿ!â y/8Œ-Ç„�d«ç°÷�ÅVÐã 3ñ.¥îÃZVúÐ6‚üÇ>þWW×È7q sBÎ$\JòÀRÂîF§M~ ŸX^Ÿ¤å‘FàÞ{ïmn¾ùæ¥{—O,½ Ò�MŒ@»¨3�þX¿}*9­,Ì·õŸXY‚«M[‚³À49ÿ®¾#%IRO�áè¨÷7"aYÛâçGFËO£L-ˆQЏa¦Ó)±`u;8\ìá¯ã@6ê‘-8Ðq¯F&XCxÑ ¿û_ô /õ¡#ôÖx'_tካ`‡K‹%XˆQ€�gûï4ú!ûöxÍñÏd‹1’óËÏöÒ×i¹MLYë…,Û�¼°ý1_×¢½ðlÚ$YW&+3{!cøÀe—]¶B�mÜ#èr$’úØ” ’>�+ÿ%Í�´ßS+—©Cå2…ÀÚ:–×v±€6{.”ÒñRc›;cÚÝ íH„­Æ¿v`OøÝ0£µ~Rç2E¡sƒ}N�"ÞVÞL8Ííº÷ G¡©-à‹qÏÒ ßŠ¿¥ýá‡É@hÈh7xë¿9¢6…O}N­ãmåMu¶Ÿ Hf£ß‰¿ª 'øâEܳ4¨o€¶eÿwqи,ã>ÇÿÎ�ÿ6“ò+‹Ÿ<¶…3/lK˜7’O,«äÜ[¸îºë–Þà|`é]�lb<±ÅµW¿‚,´ý®µÃÊ SHÍõÝôHØ!–$Æ`¤>vŒ¼½-€ãHý«º’\y⣅¾ r�ñ>;¶zHl®»@ñµPzÑg".¨p—‘Ò ví7Y7ˆ¸K"]¶eGÐùŒWÐ,*&@Ç�WÐco-/h›«*0Ôâ—)cÇ6àïѬVh.Rá­¼ô˜í�¸õ» áóx Ö±W‰4x‰¸÷µá@õ»`¯ï$_ë,ý®qj³ÿ�ó ^=š1ÒÐÔ#Â�Eƒ-ÇÄd³Æ¿}äÍMÆàˆJ^‘QgàŠM¶œ$#ë“tgÃü ýTgÃOfÉìŽDjBVBJºj`±T¦®J4|‘ =t¾6G¼Ð0»SI ËlÓ‰udÑÖÓë/øC}Y|s¼d�Ómó,~b}¡3 J9P¥ÆE› %W @&¦Éà§lN«W�|�. •ñ$D,*’� \ò¢93»�¹ü­à $Û�Éþ÷8äøï¦Ø´“ó¿;GM‹Ïð|48]™Hæ6Óâ¶DZ>°ÄàW¦ËÁ)yQ¦ L¢Eà›ßüfsë­·êp)ðÀ�Í…^¸Ûi4#°Ù(÷ =‰g}Ë ¸¥ù-x'…Y_à ´Í9ýBFs‚¦ÌÑ€þ¨¹/ Ñg´¯1ÂLU�à¼[€»O\ð÷ 8ƒg×i•@¶zA NôéÖ¸WöIT»¾]�é¶ßí£ÖÕ<á@¶Z¦mwñÓjƒ§@ç¯hÔKÍîþè~š€ ËâXãN쓨v}ºžlö¿·ÁzLûøcXÙÀ‹p [Žÿ.{`þÛ�“¼`£~L%“Í1õ†ùb ž¼(3²>IwÆ�‡>ô¡ oâ_vá=cx!á²ã�öw~H°cíÉ>îü„^õ,àY¯o}Çšjž†é'•Ääÿgï߃­Ëªú~x=ý@7Ý4Í¥ƒý´Bs±!FTHbYŠÁ$x QƒšW)äj%š2•ª¤òG*&11‰r)ƒÁK4ÑÄPÒ EÓ¨¿€Á¹ØMriPhºŸ~Çç;æw­¹×Þç9g?—³×9Ϙûì5ÆsÜæ˜s®3Ǻm䀩qî*ÔŸº(°ÁG¥áwljÝ1�‚ÒÏþÄ(îÆ�’¶ß'¨�$ÒÕ�:šÀؾæ€bÿYÖ� iúð{ªäcc0ÞÌgü£n/âÇß&_íŸúœ�Ìã3»¬ú?b±ðø2^ã?'Ô¶ã£æ¿D ðØ‚r÷Pùæ™E`•l.¢Vœ¨Ÿ\ GíT†áòË/ž÷¼çÅzÅ«ÝÝEå‘�|äåŠÀŠ€_(—Ïô·ÄR‹`Ön-ÏÔôã1�@À[½pöõM Îiëj~ðŠÐ7Ø&¬ÍB¨`Yâ«þ¡+tl¾;”´7áÆ²^'ħe’geK[(@¾°.É{\86�|ö•® Y¿mU¦›¬!º(†¹£íÈ¿Bƒš2ÕþŒáqLZàVýBqÿ>õY@ºƒº{\ªÿ3Hóqï}Å2åøOð±(ª±§`f<ðØ÷¸7”ÌŒ…†–¬¯ñ¿Œñ'�¹À�Foõ¸z¯6‡�:#s¸ñÞ×ÚÉ(û2CEà"‹À³žõ¬áꫯ^D«ë—Ñ åÄùˆëïX†‘tGš­_�o²ÂÒ·ñ“¼û1d3«‡­ÉÔšŸÊXàóÑ{Ä<—`ÉïÀJ|´°�º€wÇë¡û±�Ì>ñ‰Ã“žô¤Å4ú�|àð€<`øøÇ?¾ŸÊ‘ŠÀ¹E –¢±6�Ü<ó@)c!ßþU9Ö¶ÝÎßXÉ;³$’ mà$ Q¡»”슔& õSB¡§ßB¿Ÿ‚ƒËëeÊÓ)Š´¦» àiêDÝ„›ææ£HƒìËV�YŒX UŽ †n-HîQºªµ„ÊÉÕúçÚ«ý-â]L=´}Ó gݵϨ'ôÕÿ»mÜ;ÉwpöŸ5þç#Êqì Çb�.¶ùb¨‹›ÝHXZ'Ñ “q NLá(ì"�Wý¿ë»¾kqQ¸îºë†7½éM‹ó«ªl]í�LR 6·ê“hû_И§F]¥kX]½œ'V2pxɤ°Gqo¢E"1¾S O.œ�5Ú �•ð‚¹ÁP «åøÓÔ¦¡?‹“˜Ø³OÀ(¹Ÿô‘ýyQÞ0ƒvgâ"wÕhßÛî^ÀÂ@ vLc_¡±Cu₱ï¶Vû3@ÄÅ1QÀ´qŸ°ø²»G<‰}õ?cl Pâ5þ5’fÃgmºNó¾s’Ücã¹¾G¼�Ûü�ÙU¹ÍCaWä:°«È¯ÛmGÝ•ÛdÖ¹ŠR¸H"Àbî9ÏyÎpï{ß{q-æ=u`qÝRm]­�yæ„>¨v ¾V¼SBp÷ÝAÞÓñÉ[úóÄ Cþóbá›/ô Å}-ò=­ Ž^£Áÿ'­ºÉ:Aq²æ„Á¤%¿ÚÔÙÕÊcgí ú~ 8Ù#6€”ðG¸ü‚`ï³~n^ÓàVéü1iOXí�ÐдêÿŒE�ÿœo5ÿcv´“„C|¬Ž¥Cûø>ì•ov^�žrØ«CÁôEkâLƒ�ºê“‹vhTÃû<íiO®¿þúž´œ;ªTŽEbѨä4+þe’ž Èiíu®oD®Þó+™€øßZK~ƒW:c÷ô‰êK%±ßfÛØÍ¬¢�PÔžW]ƒàN–€|à7”,ÆÑŒ¯}f[šÿ¡ Ëâ3D]P¡µZÉ€�ò�NéoüANUÔ7š ¡)Ìö°›XE¡à»ak74h+8�u†c»ÑѪög‡ŒýGì¿õoñRôoµÕÿ+b1Æ/bã1EÌ›a�;ž)œ!×XoP¸ª°Ð c—Œoò'dËX7ô¸7¬ñ1£¶˜ÿwÇ3Šwm�º`1]‘ŽÄ¯úda}Rî^õ¨G ý¯ÿõÃ3x–êÀ9¯D�LRÂÖt$,^Û‘€Çš-—m\©ÏgôƒIWôYüÁ/žGY- r½—õq‡A÷hÖ°Èn:ƒŸ+ý“>ê¼GmÖõúG›Q�åj¨Ú�¤Ñv½˜Rĸù-ë+ªºò¬¾`?~µ»kÿ~þÍýa-�Ay˜>74Û²…~Ée …Îííמj?�_ý_ãŸI·ÿñ¢æéLÇ'ýfŒBÙoº#TO.ü0"PÉæaDy ñO¹n“Ù"^Åz|"pùå—ÏþóÇùÒ[Æ#'ã§mïºë®¥»ZþU6FÀI¶né�¥˜“ag¢Ú�Eɽ~€¤³ãÑÅ8ÿ5pj³˜Ô €ÅtÅèH�CQÈÅ�ïú®ïøÀ™&óŽ‚S§N ïyÏ{ŽŒÏåhE`%¬å#i$¡'Ùäy~/èÉ%µ¨‡�‚?øIç)J:þ‘¦ÚØœþÙ@òÿ” Y’G–• ó>;™H>îÀvK0p‚"}�cdS1½A'Û‚ðCG•ù Í ~œm±¬¡üE_³§äž»,aÞ>%]|çõÒG,öòßô«ý«êÿ6¦ 'ú8v7ÔíG²¬¡Æk�ÿ1ÞãüßoÌTýáF Nn¼{k{vë@¥Â/Š<á Ožüä'¹¶ò@�8rÝV;ñ_(Óïüw¤<êDs]÷Ÿj:9D'Ÿ‘D�G Krµ¢£éÂìNðÇů1@šº¼{ ïi¼ÊÈ�Ò�s­6E6 $Ò+o² ¦ÁÏ•KÛeß8pc1¹Aé¢�Mÿ<¡ž'ìs�𛇺í¯(çjõ¿GV ÌÿŒœ žëžŸ>x~×üßíñ/þøˆÊîq肇�z à!üæê¤Ì‚T,Ç'÷¿ÿý‡g=ëYG²A¼³ JEàÈF òç\0³�/é‹"Z«#q§hAMëµ[dbJÖc)7%çS‚ŒŒ^ô×dûú­ÈG6´ýÓ¼H0ìó­åKây%7O:$~ÛYŒÏKkG¢�¹1”õ¬À¶>¡k„­ÝJ⛿$óúã ¯!xZH¨�ÙYJÓ’ò±×¬ÊGéI·Ä™j«ýD­úŸ�QãŸqàyoȼZ+žŠã| D´$äœõìK�Úkú™§è÷|­ùß"±Ýñ/zk�S„]D ’ÍÃ�ú¾ƒ?~&©î8Ü>)k;ŒÿDŸ÷¼ç W^yåÖ^èŸqÈï²p€ý±0¨R8j¯Š…ã9“2ei×1¾iU£ÇN.”#éªžë §2|ºu_ù.h'ôNt&ÞVá±�æQz`n�û`éL`ì$0”t»ÊO��cRüÂ-'�½ÑvÎeÍkù˜éûÔ~¨½tß~ÙG6>Ž×\ÒÙž´‡LjLl�¿ÚŸñÊø¸ß «ÿc¬Õø×œÓL"YçØäÿÍ5ÿwzüó�amöX@ê€tBs�õß{.Ç¥ò¤"pa#ðÔ§>u¸þúëÏÊÈ+^ñŠéŸûYi8w!N\|Þç}Þ¹+* �D “VÒÎ)Y…¦dª]íÊõsÖÇ„kµ¼Ô¯Ý¶ÒØ„hc/õNº3�åŸ^pÉg±®*Ù“Ö•ú㛲 …G­¡lêÄDÐê‹6ðöOàÒ)ÙÄÇzÙÈ"í%>Õ7ÿÂç`m¾5{tïU�¡H6pô‚�úCV4i MQ©0¾Õ~b—qp¿'% Žý^ý¿çøòXÇŸb[ã_ó®‹ÅŸiÎFu›› ÆžævƒÚ™m�¡H¶Í{ðQ?c7>mÖ»ùMgºVÙaêÀƒ¿Étü£ª›S´c�‡<ä!÷~ë·žU»n¸á†á×ýׇ[n¹å¬äϧP=p>£Yºvß®�ýL &hŸ"Ê:–¦±£Œ¤*è¬æÆD‹½¶˜å²A±¡‹lJ0IÐXôöeÜwÝÈ/B*eVe{=ûá´™â÷ØVÌ4µ†ðÑVñÝAÛ룘F­õã²l¢¦é¡HMƒØ5L>šð8·E‘/Áoÿh8°5u„¨­ögÌÕ÷îwÃÖgýXP,ƒîøÒ‡àêËT•xë3õ5qnøªÿ„§†} øÙõEˆºóà@¾ÃÄ“Xý£2£�aî­lãE‹¢BY›DÀÿ™àJ¹@b"Õ € Ç>ü|Þ ^ð‚�7éo[n¾ùæáÕ¯~µÄÞþö·o+~Þùy  JEàHF åâ$é,”`°èUcr/ÛåÄ%k´HÎËUyeJz‚4>,�³ÄOò^�ØER' T‘W· µ¥#µÚãGÁá¡äÛ ‡&�dÓâ„[ß¼Þ¾ †nÉ6˜2ö%}ͽp!8ù¢ÏP6[[­oôU|ÁÑùÞ·jwZÁ>ò†½.ëŸû;oŸê›Ž—¯A—ÃÖîô n>öHIZîUû‰#±Ø+ž}ŸõøÔAmã`5ÖŽ~õޏnÞŸa¼Òð»?Œg4“nšx"ö#¬ñŸ±kqȘåŒÏ±yaæ?Z£äá%ñÚî0u`‡ÁßÃt�Ø#0E>>xÆ3ž1œ:ujëÝ~ûíË^ô¢áÎ;ï”ìNÔ[wc ,%m)ÆÂ˜[ú)±&Ì/Ëeð¤ ��Å"å@TÆEŸve,jÀUÎ"<_h˜ë? eZÀ']¢ëÅ‚M¾í<8,&äçÚ’–ôdÆù»†�d1Œ=ÚJYo¿ÒɺýÒØô©ÍÒÔe©µ•6»Ý†Ô£Ë°Ç¡¥<Þ¤ÎÔ{Ò=¹ M6LzîÉWtê/¡LX¥Ú?Å!Ç}ôJt}Ç8*¦-žôIöKöUö xT °Ç]�.ðÔ>á®ïu&5¨lÅhZI¢iì…U�Âc×°U¥©­þ§ ¢Ôüo1`džÏñBÿ12ȵ]Dê%€‹è†'êÀJ8jç¸E€+æóoþͳjÖ+_ùÊá#ùÈ(ûŽw¼#þIÅâ¬_�µ‡ƒ\}õÕÃøÀá¶Ûn;ƒe¥"pÞ"�‰ iNþüÐï¡]�W9Çr•L"¡Ÿæ“$1™K$LžžF’à É`2ñÉdÄtô1�3éOy왆xIiæòJjÆúI0NN�†p+bG%õ¡‘âöùX"{�¿bê63õ´ ™L}óúNT¨Ú£ÿí8†�”¹¿Õþêÿÿ5ÿ�êñ/�j:´Õf!¨ËèŽë*±ø¨FÁc�{Ýë^ÃóŸÿü¶ØÞ®yoxÆo¼qEèSŸú”ÞpêÔ©úaïpR£NvÔËÞ¹G€=¤ ¼Ô/pýô^ì;Ï·7“ŒŸÖInÑ�ZÉdòì65á‹=sLµÔd £“mªJT)i†%Šp]4J‚õ´ê–ÌçIøç ³h¡¢•5i„yr ×—¸OàQú€gn«i©f²”-M¾¬k-Š�”_­‹= Bè~çÝdÃuC³N"4{jlµ¿úß#&†Ó„¶A2�õñTãß1É(y®×ü'>ú¸œ´ŒT�{ÈN…í:õÀ®{`ú·/Ob±Q'evß'åÁŠÀw~çwŸó9Ÿ³µö[o½uxÕ«^µQŽ»v]ê1€]÷@Ù?ÛpEé4I=+´ø’ð;Q:]åçû($ÿÐ"=>hÉ‘W¦ØZ"ñúÑ�>Lse«"p^#À+•ÞFž@:@1LC±Y+·ýõ Ip~àÌÔUiqTÇZU%`&¯T’Äa+‹!{Æ­QþuúáIÅ{ÀÔk˜6²Elù ×0mÀmSûÍŸm޽Ö~éníŸ$ímú“ÚÒŸL΢¾k¿ãà¶"�Î,M^;½þ‰câKþÔ5Å7Û‘ír» ÝnC´Pg(YÚͧÚ?Ž{�ÿê�œ~|N4ŧÍÿÿ—vÜ3ô¼7ÔÄ;–ó?[VÛeD ®6^?ø¿ù~ë€ý"TõG.÷»ßý†g?ûÙgå÷þÏÿyøà?¸§ì;ßùN-Èøgº«òà?x¸êª«†O|â»r¡ìVÎ*,ÓIì¦åº¯ô³550×à‹Mœ.à„AÖ;UÌÙ7-as>fÒ¿ÞÐî€ëd|¨ÍG�žôeCÂ^�ó]Ô¯ú¹‰¢MžO-˜ëWSÒ”¶ÙSݾ„˜o>ŽÇ™¼ Ÿ6­fj¿)†Ž1�’ќ⎞ô5ëçÞnâO_m³ùZ¬¿‡SlÌï–Š=6ÕþŒ„ã—=Pý߯K�ÿ‹šÿ퀱Ýñ¯;À4ù»Ž@ݰë˜ìó_‡o�˜bRØ1‰ÀsŸûÜáÊ+¯Üº5o|ã¾g*Ÿüä'‡÷½ï}gb9”ºz àPÂ\FÎsœ�ó“?×ÿŽœ,fòMŠJá‘ð”%5õ¿¯ ò΀IG“ š9�MmR)^öÓ¢±I3\«üP¦’¾ Ÿc©­“Nðäw»¨ŸäRf?þIGꆿÿö6ÝÖ„pQ W÷RGÖUû3«ʽÕmö§{ñlú³ú?c˜±ËÑé1<�õŒRÒ“ß=4‡–M}9žkü;JŒÞŒ‰Ç±÷’#÷ŽÛüw[ .!u` ½ÐùWMê@�B�~žúÔ§�{Üã¶nWý¹ú�Rï8H”Ч"0� ò\jær�…þT&<ù¼DõÈBËD¹IbºR–¿ θz6¥i1eò=Ö„?a¯Ý7´¤¦ô=}«Är™�^NI�ÛívM²Ö‡%pù;“þIÇÄ9I›ô¥�½üɶ³Ív“fVá\?~A›üKl/{ÔbÁü–�ü�Z…åäïõWûÃ)Rî•UJR«ÿ‡“ìy^zÌ{ô'g�ÿŒóo^\äËX4ÌqÉ6�ƒSœ§xgÝáÍÿð ãU�:°ÛÎX›q ËØmŸ”õón�ÿ;çïl­‘çýyîŸçÿR–ð~  JEàhE€Ec.u+~$è ^¶(¯èçr“t]KÎø%‹ù“‡ŠI7/„Þ/@Y~˜Æ›òatáƒø©Þ£øŸ'°Ç'v mÇp]"Û�¶ŸµG:¬Ëz Ñg1â%ý©þ_�wÆÆ‘›æš{€¸eü¿9œë£Þ´Ivo}æ&—aÚ�|J_W·HQRzÂc‹?û½j/ë¬e²µ·¿Öc8×Ý´ÍíO›µ]JêÀRz¢ù/•©;Ö'åÎÙEàäɓà _øÂáÒK·¯%oüçÍÿ-Ü�/d:¨Äùç»æšk†+®¸âü+.�� �öz¿˜C¾ý?Óu�,ë(<ÓßÒ~ík¨—àiw¤yþ\¦-5ƒ_0˜&Í–èød5äƒ9—’Ó ä,k( V ìñ¦Þ¼)-ħ…²ëL©ô,9šº z+à4°� Ú俽k®ômîñV]íÏøNñK,cLÝêwâΘ´Ðó¬Ý~TÿgĉC�ÿœ¿ÇyþŸ÷ U ÷‰@�Ø'@‡]]�vÄËÞ…ŠÀ7}Ó7 ×^{íÖêo¼ñÆá oxÃVrKx Ïu×]·•ßÅ\ØuòŠKî„Âc?áä!¼””É„%)Iõ‚]5ª@g,Zã÷ì9y€ø$5¥¤–›àd ÒIÉÓ‰³ÅHûêdÂB�·z¸Üžå­gäO½ieUBªÆt�ñ…Ç0p‰4€hæm¤ ÐÉ�xJd[«ýS$6ö_ßç=>ögvQæËÖpÔÑx³.9'{“„Ä[ïM= ×R›T“Ü�go¢¡úŸXL!P]üF<#–½Uã�‰M¬Ån¡Ç¿ôS^›…D N,¤#ìF�p$ å<â�žþô§oÝ„øÃÃ+_ùÊ­åXÂ{êçϪëJh‡p¢„$�,ÃÁ 'צº–ä\á�Zvr©¬AÉÆ®tCŽŸ€Öb\  ,q¶|áN(]PÆ—&g�º‚ °ÇE<‹M¯Ã:{h߀ñU[œµ_þH]lš ¤À›´tˆ6R`„ÒK\Ȇ |”ƒò'÷ÞÛ¹>ë5´o­ÕþeÄ‚8Tÿç8t“N `Ô@k£G±m¤ È—b˜{«[×”Uz}o®Ïz í[kA�ÿaÄb›ñ¿ô¢ì0u`‡ÁßÃt=°G`Š|4"pÙe— /xÁ †K.Ùîðrç�wê¹ÿÛo¿ý¬úö·¿ý¬äΧPýÀùŒféºðˆÅm¬á¸BϲVx[t{9œ>P Å0øãd�ÝW^_¦ø$öùð:Ò’õ¦5npu‰s±¶äî¾�ªE·9fÐu@á¡ËpÔ;éχt�ú{�=YÃÀÕÖÝnѯã_¡™nh¿ 1E]ƒ=žÔõmÏãvVû[¼úø6an¡¡ªz"8²†�WÿgLˆƒÇ½á§.^+4Ó Ý/†„šº{<©ëÛžÇãÞ°Æ‹WßF"Ì-Ô#TUOGÖ0ðíÇ¿J{mv�záÜîû€Iቬ>Ù}Ÿ”ç�¿ûwÿîð =hk ¯~õ«‡›o¾yk9 p€D„¤aWåÚk¯8rЗîÊϲ[ÈDŠ®5!›8aÇ¢n|  ÑĘx&èybOñ‚õÅûÌC~4Ç�±Ë �qzFŸ>—øÄ/>a`NÇ]R&^6�&Hµlõ¦±;/®¤2m¥^ö›¾ÑèÌÞZ=üþŸø¾í™©Þ—ÞüéJµ?‚áãt¥ú?ç‚Ç3qqL6ÅÇ|†æFÙO|ΰ6>CG¯z_þyÊ‹i³¦Îï¶Úè~ 0Ÿ!¦:|?ñ}Û³ªn- û¶gjº°}ùñÝN#aH™×»­†æsŠ7´À2"°Ý%ºeø|¼ð ÚÔ–“›ˆE«…<þñ�¾ò+¿rkW÷ww¸á†¶–ëxÀ6/ìeÏ΋yü¡JEà¨DÀ˵LÕ½N›¨nǘ¸ÇƒK´3[ê¿Zl¨‹o®/IÝÛcø ˜'·~ÃLö£Nú‚Š®7ß~P.¦¸\‚ߴͲ}›{<¹- L<<•_lLlP�ú~Á-<Ä 79”ÊÓX�oâÝ@ëEz|k#õmîñ¬îu$^íwªÿ»±NP˜Öø¯ù÷xßûT5‡�ºÚ|¨áÞßX\½Œ;+ýÏwþâ¨,%÷½ï}‡g?ûÙ[»sÛm· /ùË·–Û$À]{ØÃ6U�Çnºé¦C³W†*ç’ôX®«ðßÇI¸QIè[MŸ,Èú¤;™… ]º'vøp€y}B@'bM¨|Ab§½ðOjc#}Ò8-¢å“FA‘ŒgKä¯ôµú`QÄ,(ñMþ‘¼âö÷ÿŸWôÙŒ!zzÜmlöfî†oy÷Ҩ߲†ÈÉ ý¥¼1ÌJOµ_q¥+(+ý5ÆÎñLž½¶Ù/žɵ¢ÏýdK�Ïìͺ«ú¿Æ¿Ž™Çwþ×õ潎-»¢W�~äý߯Ðx¿îpD ©<ç9Ï®ºêª­|¾ë®»ôÜÿ§?ýé­äöb®÷왢W6G€D„Kò|„+k!sñ¹¨U2Ã&’ m7%TÔJa ð‘àÇ2C8Bþ7'•±AGÚF#ùº@´�l‰ë£(*¬Æ0%¯œ“ú a“/ÅpUGê± „6}‘…¾Yߤ»ÕKià@;jˆ¦Ö8µ_¸“ËÍú-º‡ºÖÖÎuü¬öïÙ_ëñ¬þϘlû÷†ŒQŠa�·ñ+e�ï1`kükræñïâ˜ÿý`Ñè©Ín#Pwì6þkÖã X“d-*EXz¾ú«¿zøâ/þâ­Ýü™Ÿù™á=ïyÏÖr{ ,á=_ø…_8Üóž÷>ûÙÏîåfÑ+ ‰@,Bã_ ¶žÓ�…è%'|Ú‹ýtõ’Kâ_SÔk= ð�2á ÛL>ƒŽ éç_[Úãå~¼H0“cQ‡¦Âõ‰°§»ÝI2¬‰ëN8£Þ´”ß´µnë› |k6RÞæX T)Æ%’m£&¡MBíñ}Úv¬ö¼êÿŒÃÿžóšZ1ö7—i:ކӨj\“Õs0ç½ç<º�×üw¤Ûg»æ*¸œÔËé y0¯¾æY¹SØ�¿ðþÂðmßöm›+Ï@}ó›ß<¼öµ¯=ÇöU¼àýïÿö‚çQâÒK/8 P¥"°ü°À%…ç9}Vl‘Tè�ý‰Oë‰áôé|“ÿé¸E?Í™€x�—mM}’ŽE É ÚR ‹ÀN§`ZLCÎ=,*M6” (}h°÷í² þ´�Ýù·çIy²ÀO}½�·½9̶NviƒÛ.†Ž�¡fµ'hÀøÊ‡7ù3·_íŸú¢�ÍÔo}Ÿ÷xõ?1êÇX�OñË8y¿�qâQã1ìqoèqo8úÚµ,°�{ÃMþÌí³ßñÓ<ésßç=^ýO|ú÷xÆnµïûØ:曺´h»�@�Ømü™5óR}2�Hí/6¼ôŽŸü#éݦ|ìc~ìÇ~l‘óÖcU1V"å“3 ¬@IDATɽÖÖíy}p-î‚󳞂º¥ŸîÈ«ôFÍùE4“ùР³þÐNsE®‰�=¾Z(†!ø(æM…èj_8dÎÔ:Á�R]Bð3lš1ÝìO²©Ïíæ—„܉ƒOP¤ÿ“žÜ—y¼·»X’=lR¼“ü™Œ´8`(êM¯„›2áÁcXíoñ̸¯êÿW9ö= süåxL¾ÿ;Àœë†Ó¼¯ù.Ç?F]•åD ’Íåô…=©>q$ .>ßð ß°õÕnžûÉK^2pµþB”·½ímBíV:ýèGoÅ_Ì�]E€Å-‰< =Åw8�‚ì$‚dÞx¤§¤Y!A²Î¢™bžúô²¿xÇ@.aq�8œ”LF:¯"Ÿ‰p.¾“[j„æâ<ëßÌoNÉõ^ Z·loßöæ`òdÂ�~MíÇÊAý“ÊàòÅ/ÃjÓqp\ §~÷8Xç¯þÏùXãŸ8ÔüϹäã2óeŠ ø…8þ1_«,'õ€åô…=iËï¬,3Üæþõ_ÿõ[;÷s?÷sûÞõ®­å*ðŽw¼Cÿ¼úÅâAeÏ?ÈÝœì¨RXtâê|ÜÔ?œl çɸүÙ§æ�ó¥ù™òó¾¥ÿ\Ù× #ñJ¡®©¹¨ä¤üØÐ Éj£œŒ§ÝXd*Á—tÐÉäZ½îˆÝ”G 1²à°%ž ô©ßañq¾¤ÁÓ™ÉÝV·7ÿ\ÿd«)H­ÚnÒ?ç·/õûnsêÇ®iPªýSŒ#Õÿ5þcŠt~í7^æókk5ÿ9úd™b¡Ãs'8Õ™»àn#PW›w[ÏMaL+XXl.»ì²á…/|¡’Ümœü½ßû½áþÏÿ¹�ÈÖ¼ög¶ó÷ŸS§Nmí{ T;¤ôüÒ­ú�ûÿ\³‚ö"<þàå.�”bQML‰Ã_ýœ_À\(·ÅŸ~â/HQÒ^.¥ÞT—òÁ“‹wt ©„‰SÍ¥Ù�’õ+XÈN 4‚ÍØün?0ýÈS{zæI¸™?íc` òM{ S~Ò‰ïÕ~â—qp¿R3Å–ÀVÿçXÏ8xÜÇŒ—áz¼r<æ˜ß<ž- œÆ*¼›ùƒ­Æ?AP¹8ç¿[_p ¨»ïŽžU*G*ßþíß>|îç~îV>óÜÿøÿ¡-·Ýš™»v]ê1€]÷@Ùß?y^ù@0ç½¥-AeÍNâ :hñË� h±¤Hš)Ã^W$ÞñÉGBx�A'ÐÃöÐ+ˆ4ï( LúsÚŽ¾7ýò­Ã‘MtL¸ùÐdàû/Ð'“_÷¯÷<“³„=žº­×W‹}w{æpn/ù³ ½¬µVû3Ä�/12ìcw¶ý3ï�¾Ï{ülõãcÿ�ÛëÛ�x�Ç�ž¯ñaÆj­í"P'–Ð éC�XN_”'gˆÀ_úKiøª¯úª3p¬W]èçþçë=óˆÔ~E`=,xI6NÄ­ü¾?Ò%éSÂ�rù+™ ’¬÷‹åP£3:З L^å‡�\ñ·=ٌǒáäIÛ-Ù:C²¿Þ’õ{ú=ý±m _ÔöøXDÕË·)¡üom5Oëñ½êi3|@¾i+aâÍ¿M�Ý@“ª ó‹¯Õ~b¼©?ú>ïq÷$û�>ªþϱZã¯ñÔ�±÷xêiàãüßpØ*Ò#PïØaðËtEà¨Eફ®žóœçlíö…~îîÐÞpÝu×i™ÿìç.{ÿ÷¸‡Þ_p}_vd—å�Ö¡áÒéøp RÒLzb}š9}ì #ÍŸ äy~ KX6äÒ.¢yG’Ö®ÖÖÞ"P'–Ð åCEàˆD໿û»NlSÞò–·\ðçþçþ|âŸ>ð� ŸÿùŸ?¯:´ý+®¸b¸æšk†›o¾ùÐlžC\±àýzЃ†W½êUç8í*›#à+ÿÔ’hStÕ ¸²ÀÍ•,VôqeÇ¢:eX0+‰—Ž”Oy5úÒ¨[KèƒÎ])ßnLìtòÆN<„–É'\íÖãÈâ·íÆ�”ô1!ûózhg*sýè£nÖ—¶Í— ¹ÄF?÷öwÖžhyµ¿úœ“5þkþ¥ã_öj» Ô €uF¹RXr¸íÿK¾äK¶rñ¶Ûn^ö²—�‹Ý­„Ï‘™Çvy÷ùÈG¹Ï|æ3‡/ÿò/Wôÿé?ý§Ãoÿöo?ýÓ?=|ô£=Ç)ñ%F@‰mK.µžlI4‰FŸpžˆì^õ,ye\IvÔé.`|(úuíµl% ( ÍÒ£}¸S·“hd¡ñØÁx‚bŸ„‰L¦Ó6: íYh,¥A·¸©Ø7µuƒâØbGµÚº€céTÏõÍå‘Éö4éjÿ¾êÿÿ5ÿ9ÀtÇ›¼G |,jðP޶]pðòE8SNT*ËŒWƒyñß6åÎ;ï^üâŸüä'·;o¼K¸r}Ô^øÔ§>uøº¯ûº•>xž0üÐýÐð-ßò-¿nPå8E V±^¼;nÇW¢ ®æ¢udÂ>Ye‘­d5y€JÐZf¯“âM$ï,,õˆAÃáS-‘Ñ`ZMã©ÓÁ ¿×±ÚÏÚµ-l‹ÈÇ Ù_êÀÇÒø¥[xl I[ ÁS_Bé U†Mü Š?ˆ†Z\££Ñz^dõÅ1ðVÄ8°Ç]?‡´›ä›þ&”ŸQg˜ŒÚ3Bà6HÚ¬ö;þÏêâ qcÕ�q«ñÒ ¸Ç:°ÇÏ^\Å0v¤¯ÁOÆõm�ÿŒÉ’çÿz¯e—¨;vý²]8¸$~œ[·Mþ^óš× ïyÏ{vÖ·¿ýí;³mÃ�zÔ£´�ÑBÉÄ…ÂÇ=îqÃw|Çwlôîž÷¼çðô§?}ø²/û²áý£¤÷ld,⑊€Ö±èf�®d=÷ºâ‰ cœÅ¹êã8ÄÏyÝ€gûO¶÷�9æ#ýbV ÐíqŸ·ï9hÊ1•ÎØRürâ ²ï:`ß|bŽ�hø ¶LcßöÕF³"þÎÇ9ÿ¶õ­4l,nÿHèÚÓ·k?û�¨P·µÚ_ýÏ€¨ñ_óßÇÆÃüx­/Ûßæúæòãqï€Ç¿Þ—Âw�º`7q/«�#�¯ÿú¯þð‡oå/·�¿îu¯ÛJæ|3ó€÷¿ÿýç[íVúîsŸûìü1„ƒ8ü�‡¡dßöìû¼ž¾Ìùû:ã}LöÓg™½à¾ö¢ýò�8Dq»‡¹üÜŸýêSë´�óO5VíŸb1�÷Ts0lßxWÿ×øçØvlçÿ™/.l×ùŒ@õÈùŒf骣\zé¥Ã ^ð‚áäÉ“nÕg>ó™áE/zÑpûí·XæB2.á1€G<ⲉ礛Eé÷|Ï÷è�ÿgRD¿þÇÿø•t�‰¯êŽfH2}5œdÇ_¤à'Aäë>eà$žä�O>B‹Ùør€’Ÿ�MšP–ˆì°C¶vRŽÝÕ“3„�ìq¡a¿Áqæo£|êbàv¢OCöŒ7|í‹MÏíÑÑöj�ìÛÜãfëÛÜ㮟ù?ì÷_t°?¶­os�ohû&ûs{Õþê�‰ÿ›h³ ÛÏù7[?çzÜõs8Ÿ�ì÷_t°Ô·Ÿó=îúœÛ«ýÝG îØ}”�EF€çÁüàoåÛ�ÿø�·ÜrËV2’y '®»îº ÙÄsÒýÍßüÍÃcûØ}uüÂ/üÂð¡}h_¾b8zàŠ>Ùx¾•?à%í„_[ì9Q×"2h’ßüi¾\zB½$6±dÔð@£]?ýçE$u × ƒàdq ¤è½�󞊟��}ËË/×wòðôŸ­CôÐ -ˆÚuûªOmE§Zþ„4e<û©]&V6ûù?÷×¾;>ûɯ‹�¹>Ú]í¯þ¯ñ_óŸcÅ…>þµÃìü°Tû;Œ@�ØaðËtE`©àÍï_õU_µ•{ÿëý¯á×ý×·’¹Ð̼àøÀÀ3î»*÷¿ÿýu…ý#ùÈ®\Øh—úñb¿ýÊþá¯}ík÷c«ú£�Hšùp 8oögßÉ8 C>wó“|ñŽˆ»UŸWõ•³ÕÜ*Ñ ’’ó€\ÍWM®�óîÉ4±àAï‰QgìÃÛtsá¦B¾9i�jŒ�‹RíÏ7N^€Q,+cŸ¶š&†F3 ‰†=Ñ€Qš»‚ìÏõíwÇ€bí6Háj{öÓ_í_�!\)ô›û,*Ü×Õÿ9~çã•ØiL:ˆ÷†Že�Eh¿ùYó?Ç™‡SÁÝG ï­Û½åAE "°€ø'ÿ®¸âŠ{óéOzø‘ù‘�çÄ—X–ð/\JáÝÿïÿý}_ú‡¿¿ôK¿´è.%¦GÕ¯áõœ¾òq…ŸDI‰4þÚ>' Œß‰‹ÚH2&A#Mæ _âÉ7&ðH6ùÑÀ—b(á(’kz{ýªGÛ� pƒ~ù ö_>à#º‘i8�/|†–é¡lÀÓìÉ:ºÂ†ðâ—l4(Û §Í|)†ÚA/å€úÅ×ñKWÈZ¿|�z·A>„ÿ@ùÖpÚìvZ¦‡Øc_vÑÑlWû«ÿkü3¦q <æˆáÅ<ÿ„Ú,"uÀ"º¡œ¨,#¼ñÿ‘�|ä��aø£?ú£ÃG?úÑË6ãN|Ñ}‘ÙZ0vföx·Ã5×\3£®ïò.‡_üÅ_\¯(ʱ‰kRR7y%�Ñ2®ÄSÚrµá™$za¯·ú;ù#ÅŒ?h­8©D7üzÄ@�$ÏÉ'•@棡ÙúFØÌ;ôÈ@ì0ìç?ÌÖ>˜ÏÐ~õp¥yJƒm¯Å!«V¶öeô7j{|…™ªôÝÇl›&Ö™>¢„Žè&~ùj›ÕþêÆ‚Çï Ά£vkü{–3Ùjþ·A‘@Û<5tÌŽWªô±h•³UùH¶¡²H;‰@ݰ“°—ÑŠÀò"ðÿâ_Üú'ÿ¸Bü–·¼ey�é<ò{:Ò¡£W]uÕ�’î íØSžò”½Û�[ÿ_þò—À*Ç7¬×HÌ•Ã$!åÿØd£ cOuP%¯Œs&³±pfñ<ûªÎ‹êÓò:ô±è×I‡€c ^ÑÙHWB’'*†’±nñ6_Ï6ЦlP_„fíIÒÄ'ŸÊßlÍÛ=î£Ü>‚²EÍKt¤eEãhíQ[¯öWÿ{Ün/žo5þÏr>o{¼¨ù‡Ó8¶¶ãÕd�R×Ê„™Rpר»î�²_X@ô  /|á µØ<¨;o}ë[‡ŸÿùŸ?(ûNù–pÀã÷¸�ÆàÔ©Sóžõ¬ùÀ‰ÞëPå¸G _üG&K9Í ‹q%뱘Ó".6~d@É)ÌN¬ ­@uœdˆ †<ú8q …¡�’ágã¤8õV}AôqRBºìQò$)üÒ?~6†kö~›Íà@[1ÄŽt5(¼Ó�ÃØQ[ôBÙp“?ª y`�K·õnÐ/ߣ(ÿ:¸É^ßɆNC·Û0ªRgƒ½ìAýÇjD4â /} Œoßç=îzú@¸�õñ¥¾«þ��Öø×üìâ0޳n¼õsXc'Æ•¡ç½!CNü ö²ŸòEU�:°˜®(G*»‰Ï„ß÷}ßpï{ßûÀðB»—¾ô¥¹h9°Ôî—pà ?·w¡"tå•Wßû½ß;Ð×ûÿºõ¿(�ú\ðEÒߊîc.ôb—%~À‹=%ä,0# Z$‚–‹D(¹tŒ´F4N�Ôxáˆ=j0�àÇ~ûe™'OhÞT$ÀyÑMÚŽá�ô]-�ÞÞßQÏžúÜì6Ù­Çp“?ªk¶…‡Cš1/}z|äÃOÊžþF�…ª«ý­ˆÛJ9ކĨ8Vÿ�q¨ñŸc§æ¿â0Î#ŽGU�:°˜®(G*»‰Àsžóœáa{Ø��ßqÇÿÿ÷ÿ~øÔ§>u`™]3.áïV¸ì²Ë=üóåîŽÏùœÏÙ×¶ßú_·þïªcÁ@þkÔÈcâê;¨¯´'yl#u'âù}®Ã+q�1ÕDGéa¯U0îtâ@„�S]$UMb-Á—3Á—Ž`(O0Û hœHÈ+¤ø̽#à.Á«lr†)g=èh‚†!hU@áè@aÓ*\HlÖ:šyÎm[m eØoöä3>Íí6\±mÈQö”·ž°ÑÛN©•j¶;}b³ vTÙ`�‹ñ›Þ·ÛÛ ¯ö»ßè¶4±Þo÷ pcü¬M�áL¥jÑA76} Â…Ħ©ØÓóím[m eØoöªÿ3Çvüï5.Š~Á"P'.XhKqE`ùà¥O|â·r”Ÿ…»õÖ[·’Ù5óŸþéŸüàwêÆÉ“'‡Ç?þñ‡îÃ3žñŒá �ü·ÿö߆÷½ï}‡îcÜMrm� 6(¹o®èª�ˆT€tWµ!iÁÞzÿ݂ݿð�O¤:y€–¼™?“SÄÆ‚<%�’œð !otbÁ< ŠÏÉ‚tÉG�Tk(S±1´�Š?ýí�>àu|[û{ÛöÉÆ€QÜÖ&½BÓŽœ lùjÿ¬?"NЉãÕ÷�ûݰ…•8›|"tLBgöªÿ#TĤÆÍÿ³?þŪ²�Ô €…tD¹Q8ì<ùÉOH·)¿üË¿<üöoÿö6"‹á}ÛÛÞ¶s_žô¤'ªôñ7|Ã7Èæ{ßûÞá¿ÿ÷ÿ~ Þb:&`çÔ4’%%Ú4-ðñJ|ðç,€ª¼ȳüqã~J“P×`òC Z”䪗FM£'MÛà™öå±N4X_Úo2ðPÌßûN1oì‚=Ne®Ïz »öÓ¢ÔÝ`o{äïtÚ<ìqL«ìk?¸Ìƒ€qÛë}p» ÅÏ& m¯ö+c—Çs«ÿÛ˜cô¶qoØ�=Ç­�iJ@©ñ?‹…‚†¸:†=t]r­ó÷}àyo(Ù&¸ãùo÷ î>u`÷}PT=�yÌcnýߦÜtÓMÃÏþìÏn#²(Þw¼ã;÷‡+ñ<�å�xÄðÝßýÝ2õ™Ï|F?çX·þ(\džÉÉ¿ÿ¶XÔ24p]Ҧõ>›¨O® “’×ó§º`“LÖúŠ¡®ÿ7Ùñ%€DQ4�(!‚”3쟸?š/ªØþe¾ FÐj Ñf_€›¾³ö#¢v'².?ç—þÃÞÖ(ßû'‚f_¨¶\c=#¨ögxœD×êÿC¾CámÇãmçãY 8´â±i¹9¿êküï9ŸÝ@}c3Bè æÞ™·‹œÿgv¹j7uàpã]Ö.’Üã÷îsŸû —Äs³K+}èCõÒ?|ð�þÁ?øÃ=ïyÏÙúéŸþéá�þè�Ä[LÇ'$èã•~šåEc�³Æ^v´* ·ÿs| ëzóÁc¾€�§;âE±¯"ùÀÄ›\à`H$[쨉/�/‹aC/Œ á7ÞA4J_ƒÂmá(=­ç•7äá鿽�lA( 9—ýô·È…Ò�hº ‘¥M†}[­¿§Uû#*/Ç¡ï÷qsŸôøXßõù&yóö<à*†±c[{òÓïðWÿ+ŠW›àô¥a?ÖgB×b ÞÁ¾oÆøjbÝŠñ±¾ÙSŸt¸ëç°·!ô†œË~úÕïð§þwã .!Ï–àmùPX`x³úõ×_?|É—|ÉÀU×ûÝï~ãU^ɼ,ïcûØð®w½kà*ôüÁhMyÈC2üãü�‡+®¸âÀæ¹:üÃ?üÃÃ'?ùÉË,‘ñOþäOô€Ïû¼ÏÛ©{_ûµ_;¼þõ¯�µF·Ø8�ñkßÿýß?\uÕUÒÊÏ9Þpà â-¦ã]i�f)¡�õ¦–¨ŒMÍ 2Ru*S éøéÀøäsþÔ¤Pb’-õ‘ÈóÈ@ÈÀ%u%Ÿx’ÝI[M6ÞûLUøjT 6v(–5”|Ð�”®ýÚ�M>öÀބ뎆$­o¯Fžù'ªm­KÅŽ5¨3,��ÏCt,ÈÏôWû«ÿküÇÉÃ6u aš0W(³é•ó'èž“5ÿ§cJ ×9ÿˆ{•ÅD N,¦+Ê‘£�Ë/¿|xúÓŸ>üµ¿ö×öüy5þùpË7ßk®¹føê¯þj5““¿ñ¿1Üxã�Ãí·ß~(Mðƒ¬äÿ ‰¡�zùË_>ÜrË-Þ=Ò�÷ìúö¿ø‹¿xxË[ÞrÞcɯ üÃøîò8Há¤ý[å"�@[s…Þ¹ªHÞiPI|K0É?}�>… ´ÄÔh„3ùà 9N8¡æ×°‘÷$—“~xЭ}٠ƀÚÇ—æƒzË8�2«—�MŸê›o2¾�-!0�„1 Ðg{Ao–“ƒ„�bÜL3ÿ6²ËßÛj{3ùýê«ýxųu@�´Ú£?Æ~sÿÑ Ä¼•êÿO�Lj‹C©mÐÓlündW�ÏøÛÞL¾Æö‡â@ÈfñYÞü_Þݰm¤]´ N\´]_ ?—<å)O¾ýÛ¿}¼Ò¿­.îàûßñz©/_»�o©'ùÿ'ÿäŸèî„m|}ík_«“ÛÈ,™—;0|f—~þ�¿ñ7Îû éø¾ïû>�«ƒ¶í?ý§ÿ4üñÿñAÙ‹ïF SœX.Æzò‘,ëYÙ�+ôD2 gÑ9%ðÉõ°° y¡ §>u’ØS�µp»h¡;)‰•\(NW°q‡“¡MÐW£V®À¯è7§azë´ª)¨$Á³M™˜386+6Ä9ml ŠqCѦ�lwžðHÆ�Y»ÝjÿÖêÿ6cúñØãkУ˜q4…ýÿ5ÿ/øñ��Ve1¨‹éŠrä(D€ä·~ë·$pç£ðø'¾â+¾bxÓ›Þ4üâ/þâðþ÷¿ÿ|¨uðûó<¾íËçxéφ§²„÷ÏG=êQÞð„óö‹ $ÿßó=ß3<ö±�=pwqÊQýE‡7²Ï'J°•ØG¢}âdÊpF€„"ó…xŸ 8‹d’‡HV'¹W~ÚX©óä¨ ˜úÙÉ$7ÉÒÒ˜‚2ÚCrœ�½÷¼âÌvK'6ñ!Š¡v$�/<†�_41£IVÁÙ› LxÊ6ˆ°4>ÿ"#dùÊ¿‡ ­ÕޏøzÞÆ‘m�úñjF˜Xd|$~ÕÿâÀ—bè4ºÁ< aN¨¯d[\—ÆÁç_dÒj“ïÇt÷5þ»x+>ĽÊR"Pw,¥'Ê�EG€çõ¹õÿ° ?øWÿê_žô¤'é6í7¼á Ã;ßùΙ?uêÔð¼ç=ïÀ/‚ë•ò;ð\ùÿЇ>Ô“�Î €¯ùš¯YD›þÊ_ù+Ç?üa=ú±­C×^{íð½ßû½?ù·MyÍk^3Ü|óÍÛˆïq�@[ïê%}Zs5îÐbØ�&-FþbÅë·ùç»Xü¶¥±Vñ1lIŠOŒ‹s/®Q/;è�z‰æj°zbh$H/ªõ"·€Æe³ÒÌ�ySZ€)-ÐF��hmMk­­#—¹AFÑ¥ÉOíJ²£:¾~N]5ÍŽùeÍ·ÛЦÜ>?ÿ_íÏ8g|3ÎIYÝVÿkˆÖø÷„jóÌ3ºæÿŽŽ«Ó´öv�:°Ãà—é£�g>ó™¿á~Ø…+ù¼€ï>ð½'€öÝï~÷@²Þ—S§NéW ¾üË¿<Ö˜^6öûã?ñ?1,å ùþÞž¿Ð/üÏNËù“zÆ3ž¡þâýº…sÕŒC~Jð[¾å[žýߦðÈÁë^÷ºmDŠ÷8G@‡‰¼­ÿd¤¬¬•OrÀX| Çöt _ÉüÐÆö(%DztoApÇ‹##Ó/�™E9wHsP  C¨Ð£ÐI–�ÕQ-»X·}ËaOÏ|,„ËÔKªñ°ï–d+³¾ç—p2²�B¾i¥ßäõA¥ùI¶ï­ýû& ÍáÆ.[Õ~Çœ¨g€ªÿ‰ÅcÈp©ñ¯¢9º>ŸµšÿyÔèiã¥èrvuG·V9Ì4‚c‹ãŸŽ]’«ÍR"°Ýêq)^—�CŒÀõ×_?\wÝu‡hq³©‡<ä!Ãßú[K_žç9nÞàÎ?ú‡=ìa·”ŸK!1ä÷é�{ᮀ_{íµ‹h*ýÇI^ øS?õSí·ÞºÑ/î yüã¯ÄŸ_uض|ìc^ö²—m+VüÇ8™\æ­ü§c�ÇíùܲϘì×{Âa† ˆkû¢qÂÀü Ù:¹g!©‚’à*igZ`æ�Y'ùàƒ–W¼SoE�[*µMÝRŽOìfe“‡Â—ºæ@k>Qôk� 6®Ž[íQRÕøG[­AÍœµ7K¹¨–�fÖ ²´´žL{Ɉÿ`Ù~ãÙfôUû«ÿ5>Æ£‡±8Žg ’qü0‚jüç cþ(N+ñÊØÕügTµãMƒìs¿š—«�ßø�߸HyßßóY¸³€ÇFªTúä[ù¹ ¯¿O y.~Iõ)ì‘ û-þ§#¡?é]ËC~Œ`”�Im&ºy²Á l= ­mŽ'˜ù]‡¾õ‚W”„- jïYçš– 6þ”´Ž´ÙÓré;%L©%µšÏ<ì§5ø³dÁœ±HöçoŠG`ß«ý„Ä½ìø»G¦šêÿ~¼³~~74oŽQGq‚ð™ÇñO{¡›“Y ²/^ÑÜC)Ÿsô ühéK�ÿŒÆÑ˜ÿù2ؾÿ ßuêÀ®{ ì/:Ü–ÍI€ãZøY¼÷ïþÝE÷Fø÷¾÷½º~¶WÔ�Òx¸ñƇn¸á(¹\¾Rtq:Ö�$ôñ#}ñMˆy®Äa\ñûù}'êÓ2nJ¦�€RÞ÷�f©Òp1‹ zšÉG �‰Q‹üú-¨ÁgÅ5OHšMi‡7˜gWØ3CÁ%½H»ÁîDz:ê›í'qBGe™ùD³&EfÖ¢.O†)k –b—qh Õ~B¥1²!^Š 1O†êÿV�ÿ<äË ÙÆO¤n@Zó?EH(1vÎõø—Šj»”Ô=Ké‰òc‘8ßWb—ÔHÞ#ÀÏýñløÅVX òÀq/¼8ò¯xÅqofµïl#k:’kß`¨51 ¾(‰ÞhJªÚÊÐuAs+9d¥†¨iìÊ¡ce­ÝØùf›0Sw¶É§«Ga[2ø_ñ4˜|S�~Èjð¡“�$7É'_òoü´ylwà.NÔ�ioj?Zæúp^Ò­ÁjKlÚ®$ÀS6Û îz|nò¿÷!ñj¿ã ¸Ó�gˆu{ !Nþêÿˆc®ÅDHlˆ-˜q®ñï8Lã¨�¡ TŽ¿6¡½Ø´]�=ð”=žóŸ0TYNêÀrú¢äUbÇWÁ½`ì¡Æá5n¾Þ—MõÒßmæüx‘Űó+*æö:U�œ# É80uYG#L,‚MqOö5{s­«Ú¿9¾óø(æÝfÏê�{ÃÿŒ—ýÆSŽÆ¢eŒoŸb3 F?Þó¿®7{,-V�,¥'Ê�EFผàgïx!Ü]wݵÈ8ïÊ)ž•ÿÍßüÍ]™?¯véãù‘©>>¯Q½8”±¸õ•yp>™�‹}ýMWüýL¿É,{Á•ü7œèå/ xQl˜Ä]¾6逎¦¤sòÁe’Ÿì‚%Ý0å'šé†ÖÖÃl)nmþ K pó'Û�ÕüÂeÚä‹mºÍ}ûMKž”±¶UZê…f_Œ'ßþõæ3¬öç(ÛÜûÙïÕÿ5þ=ßÖ¡ç"°Ç““yæâ¹~1Í·½à2"P'–ÑåÅB#p~"ï�þè�†ú¡ª·Áï1ƸežG¹ÐÇÿæßü›êã£Ü‰»ð=r/J�Ð_r¢¿`Z°ruÊ{`>a`"4'‘4Å8�—*ãÈõuÈYÖ�zl}B¡§õòØ¢ô4ðùǺÓZ¶ÜÅø^õæ3œÛƒnZ�Ïýð>vÀmÏøTŸúðб0„§·Ñ㖟ù=d ¹·?ózóö>ôø^õûùC½}L¼Úï8¸ß ¡S {Ú¦�c»WÿB§ìU¯ÊncÛ¶E•i=îú9œûC½i‰Wÿ;îwCè}Œ{œºMÇv¯þ…NÙ«^•ݦ÷¡ÇÍÒÓì�ë .#u`ýP^,4Ü"~”ËG?úÑá_ý«5|âŸ8Ê͸ ¾ßvÛmÃïþîï^PRùÿñ?øƒ?8·÷U\Ș•î�\óiÑ焞ŸÞËÅ[.7ÙjñØ®Î{açc[‹JÆ4x|Â@�ûüÑ¢“\ÛÏ¥‡ùݹ¬Í=ëp�y�|Tß`�»~ƒUr@}Q Þ :(ÀMú¨C§‹qÛY«W›C†6·v�°é±ë<4¯íõ>ö¸ëç“ÒQíŸú}êNõ9ñÏÞŸ’QÇ‘:Å$Šñ=ë«ÿ3N5þkþ·ãŸDm�:°˜®(G–î¸ùæ›—èÚ¾>ñlû¿ü—ÿr8w1ìÛØsdxík_{Žv#Nòÿ/þÅ¿8‰Q¥"°mÈH÷óçü2ïÐn$ÚÀø’¼ Æ&ÎL’H™(М>5‚hÜâʳþª;�î&¾g§æf›i·Š¡vPDI…}û…K}Ú€¥§%o£¥’ŒoàŠ±n¸�Øô2à$ž†}2jþô‹½ôO€Í¸›8:¬ÇPúÔtmÔïÒ[íŸÂ«@Nñ%vÙKOvEÛ#Þ)Ieͯ@«ÿcôÕø× pØÉñ5�°#9ÿÕªÚ,%u`)=Q~,6ÿçÿüŸÅú¶—cò'¢+ÿùÈGöb)z�w¿ûÝÃÿý¿ÿ·£,åÏüÀ Üþ_¥"p6 ý §ËçôSƒŸMåy|•zN5– §ƒ6}2Eƒ?=Ÿè±˜¿ûD³¤2¹sA›:„c'>ü%HÜ9g›ù®M_™^K hS0-&Ü?�vÔv·ÛPZ§ö»Ý†´0ÿö¸c…àö•òÐÛùÖž¾‰Â›jtë Ÿ™E ÅêÒNÚèmÛxå7H”jF°ú?F‹Ç½¡FU�Í×6sîx6åä­ÍOãæèç ôÄp3\™¼9Ç©=N÷4‘s"Å0ÐEÎ9Y›¥D N,¥'Ê�ÅFà·~ë·ŽÔ‹Õ¸*LbøÁ~p±1]¢c?÷s?7.z—è_ïwuÐÇúЇzrá�­"�‹É¶�o‹ÇéªSò/@~Æ÷Ä)¤²°l_ýjÁKM$ Ü´äæÙþxÉ_£™7W°Ö{aß�&PòDEèŽ Ð²¸@}±Þ>p��Å(0¾ªkÐ2=¤½)�Í _¹›V%ßµ›@vÞþ^_¶5y¯ö;c¿ÓQÕÿr�¢ RóŸYÌ”%ÿäQm–�:°”ž(?�øÃÃë^÷ºÅú×;FbøÏÿù?¯«Â}Pˆó¨ÇoüÆo�{wl·ÞzëðÏþÙ?—U*çò'ØÊ£HI»$BÉk3�©hîp ?é¯2%®dë$dÀøJ�h)£„7tç+§ä·©— ò‘°(!ï�vÑ?ãÀÉ—ô3où×p‰�·’¾‡½ö �í9(gûj·¡Ûm6£{Üþ¤< ©K<Õ~Åmc¼ˆµJõ?£+ÇsB�{CƶŠaì$�âà8(^]̉Íÿœ‡>~i¼m8þå@¬í"P'–Ð åÃâ#ð_ÿë]ü‹ô>ð�TbxŽ#é5¯yÍ¢û™—R’ü×{α£K¼E r%œìFJ¯Ûz̘$L)Wlò=�?öµp–Æ.ÃsšÑ3ÿìÃÛ jzžø%IÇFw CB´ûW:&ý¶ äƒï†ýÕ¿ô€­e�S[}…¬§­ò¦†^gⓎMüøBIï§íÐöh¿O¼ŸàAôãú§ö�“tƶ pò}âŸh›ìY×AùÕVY«öWÿ×ø÷<Ð1€¹ØMÏ‹aþÓä*ˉ@�XN_”' ŽÀí·ß>üäOþäb=üƒ?øƒJ ÏCï|ò“Ÿ^ñŠW´øyPxU¼á oÐOý1«TÎGHæXxr‹¾;²s%�¬LIÚr…ª=Ý4þ„‡ ü±¯{f9I_ÒôÖì¨>+F¼‰çI…Ü¡NjµÁz|†ÚM¼©+mIІ"¢0¾Ö ¹Ñh³ÚDCà1Þ騠¯÷)ñÕö£-)ÀF< &Î6lø ÞHªÓnã U¢¡Rjcc(AM�êŠÜðj„¨ÅÊ�)^ oñÚ#žî‹ìx«ÿ3&ÄPœ F%1Ï1,>�fhí«êØŒ»‰OñMÙq<÷}&"‚Øm ú>9è†îwÃ^<½ìú²­é“Ûmx±¶?"WeA¨ êŒreÙ¸ñƇW¿úÕ‹sò�o|£^ø÷©O}jq¾E‡Þüæ7ÿãü�Ÿ~Çw ?ú£?:¼ò•¯+3!5Ù¿5(7clÀPUIŽm+²¸ÕÃ,ZS 6KZ¨ƒ[Êg›Ãµjõ¿æB�4a=÷Æùˆh&0Á=?gPS56�<ÛÕÄÍSXº›JáQk(%0®HX2á–òÇnþ¯F£öv�{ìÀf™¬Ùðsq—_~ùðMßôM;oÃ]wÝ5üÔOýÔpà 7ìÜ—ãæ/¼ú꫇'?ùÉ;mï%xéK_ZïtØi/oã$×|ôww\ðÂt¤Mí_ìJBIHcÖ:7ðFc7/žg ‘ªÄÝÔ’X/ôÚØðä-ò¾!h’oŽÙ‡àœ\eÇþRÙü‘#ÔÇ~üµ³�ÌŠë€QÒ~ƒIR»ºnåöA bc›ì«m z¿‡ò7£¿ oñq» m®‚N¶«ý�êÿãxŠÑ€ɳt£~ëº6¨jüg¼‡§~î�sÝó­æÿt "^³ñԵ—�:°Œ~(/ŽP~á~Aω?ó™Ï.½ôÒ�xÎóþ\&A¬rþ#ÀÙö—½ìeR¼‹“\õÿ/ÿå¿èå“§ãÙè*� �1¹Ž1O®™oúïnWŽ•\Ë ¢68"¡HÎ�Rp°>'J"v¥;ŽÔ BæåQÓkUÛd?¨èiåîÓùŽñjA‰�æ�ì5»âC`®‡H½*cƒ}ó´:UšFøG�N–ªVgû¶c8÷Ƕú„«S�+Ev·°?·'?ZP,[賕@ì“HQWí�‡(ÛÆßr†óþp¬«ÿ3¾Šñ„®aÛÆïÿÒ…ÏÿµN/Â.#P'vý²}d#ð«¿ú«Ã[ßúÖá¹Ï}îðÈG>òÐÚñ™Ï|fà.„_ú¥_À«\¸�xs’…·îó7ópÉ%þ‰)lò¨ÉÏþìÏÖ‹þ.\×–æ­¡ÉÙãs ‰ ùb¬!óª=»-9êaK(©Q‚u‚J�ƒ¨9åòÄ@ãkõwT­Öª�5}“µ”ÅýT`î¶;z~9ÐZ‚Ý¶ßø[C²Aâš1h76#Ãû„mÒÞü žÑß¾2ð•öÇþ¼}ûÕ�Ž4‡ÒÑìÌõAî}Yã�JÙ4ÓŒA»±RZÿïy…Xj‚ÙêRjÚî×¾ýêGGšCl�þ�Ïì÷¾¬ñGeµ?bè Í¤ÝØ)Õÿ‹šÿ9æ[ £,NózÏM >ÓØ7¼Ê""P'Ñ åÄQŒ?ÃÆOî}åW~åðµ_ûµÃCúÐ Ö n÷'1äªðm·ÝvÁì”âõð>€ßÿýßžõ¬g _ø…_¸Îp(ôïoþæoêÄNý¼ßyh©8P¸`Ÿ�âÇjM‹µ%m;ZÍE®0Õs— /îó•ÓQ¬”¦�]½P¤é”:soN%„(Ÿ1!É}ù Åù*?µ*"÷ Tã­`�䙎„ìÏÛ¿m½Ý2Ä/%_Í>6V ŒrªQ�7~ë1$2Õþˆ•²)^AsµâOh[<Å›¶[ý�ò˜W˜"0óì×&ŒûÔ;?;8Jûâ: ÀgZCaw5H�ÿ. ›âE4ŠqørwYÇ¿t«¶»‹@»sà"²L¬ùÆŠIß“9sÏöå^òKŸþô§¿Û/ûˆý*G(Ü ð5_ó5×~é—÷¼'Ýzîå#ùˆÿ׿þõuEøÜÃyN¸šùØÇ>vxÚÓž6|Ñ}Ñpò$SøÜÊ»Þõ®á·~ë·ÔÇüA•ŠÀaFàûß�ï¸P†�úY@9Á^ÒØ=I²…<@Wæc¡Écû^T2?HÚ©—$õÁàghaU�äÇ½ÑÆ‰¸Ã†ÛÿO4;p냤B’…-ʘ�è.éK[ˆõâè_-2$ 9Ó&YtPÖô­²O¢V7ê ©È[;g¦Î ÎùgõÕþ8]1!”YxÕº¯Ý?«ºO¸çÃ¥úÎÿ1Ö<¦ºagt>ÀL7œà9ÿ¬~ióÿîÈvúÿýÿÍáÖU¾Ÿmß;Þ_žuäËÈñ$ ´Ê…Š@Ýp¡"[z/º¼ó�ïøÞã÷N�:5<üáñˆG _ð_0Ü÷¾÷.»ì²3Æ„Ÿw»å–[†÷½ï}z¶ÿ½ï}¯n??£PUZXLòØ_ÞýpÝu× �yÌcô}ðƒ<\qÅ{>&€ìÇ?þñ�:ôïÛßþv�•O|â‡æªlŒ@¬IIØÇ—ôÅÒKI“ÖªªTýxm>êmã¹àÓ’-j8 U¬O¡ñËy@xs¬:Ñ0;a€�’6i�B)iC4ôD1.û—aW£OÜÞœ‚4ã÷‰ŒlõˆÄÚt &©Ó CÓ-(‰‰&þVß®™—ë«þ6'šµ�WcF‡‚nhëýŠW†j5žÕÿŒ�6!fãeë¿b� ©ÿšc5ÿÇê–Ç¿<�œ£©¶Kˆ@�XB/”Ç*wÞyçðîw¿[ß_ù•_ÛÆã{ßûÞúÞë^÷>ûÙÏþç®//}c¿Êшï_¸é¦›ôµÇ$Mô+}|å•WŠL¿ÂK¢_ýëH\Rr}Ÿ)½_(ÿf -»â�qÎ�wˆ&¾ PxË?s± _|T‰ÐX™¼±‘ºð<¾b{"~‘¯Hþe/ôë䂜˜ðLêÐDi•¹sÆ­Üí$&[X‹¢v>¶‚î6‡æ(R Š‘-Ûø• Ÿ!r™´6qì"Úìc¶Ú?�/Ç¢úŸAâÒã¦m†ZQe‰ÿ>Öx‚¶ÕüϤ¦�Ïb¿…kÉ)-wm}—·ú‡B/˜3[–¬“ ËI„[° Jí‡3Jþ•c3¨¦¡Et| !jCÜ' Œ»^LÉ*4…�§šl³¤�ê¬Ç¶pÛ 9·~ã@µ;ð íO �èþþgû'Ów·oùU{©'uàDµŸ(Tÿ·á­±.¼Æ?#'±¨ù¯pLÇîvüŒãži/èûÿÄX›¥D N,¥'Ê�Š@E "P¨b´Ö�u›r±ÐͤòtKª½øeawb8õܶ/û$Ǭ�­Ã ¸Ö€±ÉR�|”HŒS?ÚH¦'H5\<êEI¬§÷ÀJ}J„åD þ¤VíÁ»6/YI¦J¢z@IDATÌœ–™¥CRA“Iò™Æ�±�BûÛª›Á‡ô(›g| ZwkPµ?"±È>'ZÆ3Þ W²t¡Ì:ÄŸ½ì�Æ\ýÁ Dt‹ŒY�ÿŒÉ4'ra-~X$ÚZ¦¢gº±Ôæq6ü¤ îE)âiaÔšWHý,A—_TÀ„Û$×ÉÃ~6eJ¸u…-¬$„cVš¼œ¢*›ÛéGgúœ’­ý-¶mýÙî¾ýö)¥­+ùªýÕÿ µÿžUmZ�Ç�ùüò¼7¬ùÈÇ?ÞU�:°¨î(g*�Š@E "p˜ˆÛúcU|’„6ÌN·Ý·äU 3‹·L6ÈÏ9a GøÏGùIE¢P9®°3¹ÏÛúã…~$ÛñSNxOž8){cÃ"±%è@éÓ#Q•Y:–FÜúÚÙ„T¯~`@ŠE�Ú×6Û jÓ�=ø³ýN¸Õ@dS]úi!éŠÊ®ýN�4�™[' a«Ú¯A‘Ñnñ¬þoZcqŠO�ÿœÛ5ÿ—qüç©fom–�:°„^(*�Š@E "pÈÈd8_æG¢Î’Y)k$Î'¸3¿-!Å‘ pÏîhinðæçî¸÷ÿ’vÂ-íÐP…“p¶ôE�¨" ˆz*@I5rî„ðªÈPàÍ`Ò»C`~·¿¹ì¡1vÆ…ìŒÁm±‡¨O~y|OÓ•©ýRGíØœÐ¤æ$�­ÛŒãÙNh”Õªg;ÖCK£ªß�Ö<µ»Ú_ý_ã¿M¢Ù©ùŸÇ²3ÿòÈSÛ…D N,¤#Ê�Š@E "P¨nHÈÛ=ö-Áu–˜ f&�lOÆUçÚùÈ@p´lÕɱd­‰Ä›&;‘£*¥�u´xÚzúôݼ|�÷8mÍdkÚÇO˜%Ýá©ÀÉ©} †(æ%ùM�ÀÌùçõ™8O ´øÑ8k³õ©1dØnøèëfÿÌ ¤` Šä®È�™©MÉŸ1I¿Ü†& }Æ]g«ým|íÑŸÕÿÓÌc Õøo îã¥æŒÔtÐY?>ùXTp¨Ëè‡ò¢"P¨T*‡]¡�”S·ôÇúMWo”3çbN/Œu$®Øg >=2 [Þ‘Kö|Œ€u_h¼�G tu,‡—t�pâÁI)üã‰d㣵$².dïÆ4Xitp¼9„y �“ù7;9aÞ˜ÊD³ßp'ôio²1ׇoÒ��øB›dßkiëƒ×TŒ7ûªHBg ªýo÷/1Ú„›6ï¯êÆÙì„X�ÿq åtcŒiö‰n”ùxºØæ?�rUYVêÀ²ú£¼©T*�ŠÀ¡DÀk2ߎOú¨t½å–ZÀ6O”@F½oá×r®Ý®Ÿ,N¼Ηæ;PØ=Ï/ø°–i- dé²4µÄî X[@7ZJ7MêyÃ9ºõ¦s “z¨_—Hj¿u|D“²&f&hcÉöà=ež0b/kR(Õ¥�âcŠq3j|¯„TúÄÛëËVI_µ¿úŸqØæQ�ÿ˜} Å� ’££AÖ65ÿ»�äk:ÀP•‡žÆ´ÿñ¯ÓVè"P'Ð åBE "P¨Tv�þ%|y~zAâÉú®_ã‰Â:ZÔ¶à Êèaqí’•0xSŽä>zöcOÏø‡|{_€å¹»€ŸD·î>�þ� 8• Ƕ“fÙjþ˜?Om81G~‡�IŤV˜+âGêO6ÚÑZ�Ü3{�˜Ì±ÕI�l±hÙî©ýÖ=ú;³7¯OÅö‘¶Tû3Fô‹û*cÂ~õ¿gmŽ™ÿ5ÿûøÇ<¬²œÔ €åôEyR¨T*�C�À˜˜FI.î4�êLQÂû™ ›žÉÄ”ü·Ûú9AÜö9> ]"K¯ô(Ém´y–O·—¦O„%í ›ñ“Éëꎺôø(‹ |gÐ'žiãäÒ zÊSŸööKÀ'M‰)ž­ýPæòIKÞÜîãoµ¿ú?æÄÊ­ÿÝò\Rö™OÉ4nkþçñõ|ÿÆÀ²³Ô €�…¾ W*�Š@E`wp¾ “-YÈer,Ž•×fêÍÖtd(ù†þvÕ9j½0Š?øòÄivž8�½”êÐa)”X«• Ó‹U³’ÐŒZ$Ξ¯òBXO¨Û 륄àL" ¦¾Ñ›Ð—þºý°%Íb)ï6­óc?u4‹kíošæú!ZwÏgÓß)¶Õþ66ÝaÑïÄÄñZ�¡‚ÛH­c¯çvßYݼÜ7†ëüÕÿŽIzŸñ<›_È8¶)Ÿýäþ¬ñ¿üãŸû½à2"P'–ÑåEE "P¨T5ñN>e9S‚î+ü$·SÒ“¯ü{ÎÕ}½¸/`&Þ‘àt)?.À‚ˆ÷èW@»äÒ“ icIÏê?¶Mû“îäÇ'¹ÈËbìDQ}ƒ"hCš�Ų@Êš¾ ›v�z¼n^À®Ýlîšæ½}íGû.¹×ÉŒ¡„ÔÂÀÒß鮋lÔÖ�â6ÜT°oÔÏ~+[ÖÏÛO?âª` Ž¼á¼ýëöñ ?ðŽÒ”¶Æ­qñj?ÑX/ÛöïZ¼gãcê›ìáCïÿ¸[èÄgî:>ó¿Í�½Æ¿�M@Šfó¥uµêw}’“|>ÿÖô…aÓà7n}sùyÿ3Uåûd5U�:° Î(W*�Š@E "p˜È´Šô±„cµ–+¶\ðefD‹%¦z±!R G~ÔÐ�I‰ô]úyžŸä,mp!1[°¸ÑÿçÇ›ùñcÿzs¬]ÿöºÇþ<ìÔ €ÃŽxÙ«T*�ŠÀ‚"@Bςٷùf.ëØrÙ€ðP|?j”œCe‘*ØpñÅ}üIÍzh*ùÆAÙe_jÃ/ày¼À‹Ü˜ê’ß~%ìi‰§TsWvÀ[>ž•ÝÖ¶€M2€ÍiÛIE'¶ŠÚTã†"M¾¦®Éû6±O¼«Fj¯"PØ;¨ó<2œÏ·¹üÒæ¿Ûb˜mšŽ ¦®×g —Ò~Uçq¯ýÝE NÉì.öe¹"P¨T*;�€“s'ö'xð^i|uœ[õùä2¬¿¥S‹kjAZ1<w¸ŠG „Ç-þ@¨|sž°—õ’·§õød/1tæ7õÃË—…²¡͆H&îöÓ&¾ÃôS”¦ß8�Òû˜>$-}s›ÏÜþÔTÛŠ@Eà ðüZ�sGsþûBÛ�g»ò8dZÖg„–Üþô°¶K‰@ݰ”ž(?*�Š@E "°ƒ8¡Ï;N+& f� �O¤Ñy‡@@Q‚îJ½“èäÍ{LƒÛ¸ïèTHËZkíõQiYC|÷"ØøÿŸ½7Ö‘dy¾†îÎ $„ó70¾—ÀC<ïÁKð6x¸HX¸Hô ¿Yâœ'3+»{zf÷NwÍÜ“»Syª²&¢ªºÇýÓ“=NlÛÜ÷w´÷8¦kŒ+¿öϘ4ø>ÿ-¤ì� ð¼†eâuoz\¿»[ÛÞ¾ží½®Máï¿ÊþdýÛ�éýx=oÓc|Ÿÿ c:ûOB o< ø ‚@Aà™ Å“|~vðÿñ€F?óFÑ�æ›üŽ>È P?Lœ ]ÈXÈ—ùÚ/†o ¼[Œ@J^ãYƒþiRËz¦NŠMésˆ’IéG²©ýÍñÑ{ð'õ¹]}Ïøš®±Ú`•­¼û=¨y÷…� p�úÙÖ'­-«_zμþ×ù¬× ðè3µžéa®˜³çmúÄù3¶lN�@Þ8ÅaHA � ‹’ßÊ#ùy~–Ûªê+ˆ™\²¸Ç¦ ï§ø²¿í`Mç�Y£ß -ö}ã€qu?äÃÏÆ£om¶ekâÝ}<è 7Çz­íöš`šN®ÅjÙî÷wmÌÈ‚@xßmýûºa V~Gå¬óßãÌþóÈ €çaŸ‘ƒ@A < ¼,Ö«*ž…« X'—ÖA¿ dü@ju­Ëd³¿ÔoØü#îUÈ×Mè£à}©¿à‚úçü�ûy“€ xìTÝý£|àíŽVc¹h¦.êrŒïúÜ|Ç4ão�Žë¥ÚsŸé[:ì»�c÷üá×2û>Žå‰¹74�7ð,%¯%Ókvïé{�}{l/ÛízäµþÞõWÿÎxŽÛô ó¿CdÏCÀ7óŸAFA � ŽnóËüŠ"ŸTr ȇ>ù¥~`)ÐMÝ(!ßúaßR{#…Œo€¯{rªœ¹Ço[èXÏ´FÐ8¦ËxÃq™RÛ¸ïoÓ÷\AW¾Çuì7ç³Å7�\tD‚ÀuÝèëÀº¶/ÔZ°ê¬üoë¯k~åÛáG×ÿ]ýuŒž÷W˜ÿ-|#<¹ðxÌ3bA �S €‚܉#’N%Ã*ÂGbŒbÿ�tÖþD^ÿg1["ës9§á†�Û v½¾Ö_ WøÃx¢]ZyLPêu쌉�V¨M=öJÝgýÕÇêÛ6»>æJæŒ4S²’9>u_Îr´uLóêÉ6�ûôõ¢ÖüºVoÙ­:à±æL½þLác×ÇZ§ kÞëÞ´ôm ºò·âYuVþ½úŽt�õ–ýª³ÚÞŠw×ÿ�ùߊ%òç ��<÷Œ‚@Aà© >FqÍWúy€›Š‰�àb¯äz•ÿG¿æ%„%‡v©£9IÔ|ãf¬á¯lê# hü²AðmŒ�ÐMm8Æ�„úûÆc™Êg‚ûîñ8Že»³Ú·SO^á"(MÈCÌIOo–]õט݈ÇãšN§á‚@x‡µãµ~c½íþlkz†õ?bÙƒ­}÷™BeåÏvýóM�+S‰èIä €'Ÿaƒ@A <çÆ(èQçj«ˆÌ[ŽbÏè]”«.vul›9$£ª™[§ö‘2I�—‚yÜ€z6knÙÂû­'TsäæìãÁgS'£¦¶ñ5]y g³ÅC–agŒ×ü æµk¬×½©×½é5¸Ö5¿ò×tß%óZïxhcv¼æAW¾�;VЕïîKbß=mНý:ç•¿è�ÇóNõ¨}>¹ðùg„ ‚@§C€¹!Kz”Ú•'³dW˜~šÄ¼MÝ£zü ´©�j呸:a„'èbßI«¿s}–�Gr>hñøgìg<ÕÓº¦2|{k]Е¿eµê¬üÐ_“ô• GÆs½™€oó?Zg/�?A`]Ã+Ë窳òC]ó+?ŽÌo­_ÊÕÃÊG¹½·Ú¬ü-‹Ugå‡þ:ç• GÆó?J³÷Lrà™ègì ‚@ÏB›êŸ›ø¾`qÑñ×[zø3€ÕC‰D(B†·Ôì»Ëy •tȹõZ½½Û¸¬+±äw ŒX̔Κt®¼�ítÕYù]Ïû«ÎÊ»ßÉ9hÏ{Ð1“¯ç ºòvwI§íe_$A \ àuzÑQ÷�®ü5]ÈV�•·þg¯ÿuÌ•÷ø«låÝ¿ÓUgåw=ï¯:+ïþßœ¿ÍCŸ�@¾àùÇ � ‚@x8(1QŒ¢PïOàsRÿU?U«—%«$ò{>±ç У^ËØß #nØ› f Kïa||€Ë`Ú8é„’yÓUI+úœ¼š¿¥›µYÏ}+¿ê’÷¬Li0µlkÊîUwªŠ{«o×Í~‡õùÕ׿¯¦8¼×øk2èžuþˆ-íä €S†‚@Aà± wT™é2Û´âpá Qó³‡e ZÿYÖÛf™Æzso Œ²¶tÉÓ¾ª�h‹æÑ÷¦Oåk'Æœd�jõ{LŽ·òí ã Ýï^¿¬ooÿÔþ¶çô� àµþ]ÖÿG¯gŸÎЧ#�O? � ‚Àsp¹mê[ãijüúa ͤ²ßhžzÐA!í¤³¦âÏ|¢�WQ_ÛJbñϾ(‡�튺ðg_C2ô°¿é·J‘.ØI{Œ‹ãÁt*/{�ºÇ¢æ{<î1¾Önþv<‡ÁjçŸü7fëX»Yöƒ@xÇõ¥Õ«ë€Wµ©œytå{¨uM.k}h/²Ãµâf¤Çø>¼þ·x8ŒeÜ9ú׌Î8ÿ›¥ãÁäÀƒÏpA � N�@猳ìFTN$g„*âQÔCÖïp§ÒLP›°À—�Sê_¿^û;¤k_êW¹o]XÎÂ8éùHš zø�S¿« JOŽ�ñRRêMåèÍ­5AÉßógßc<Í_qjÞàµçoª@<â›a¥3"€Õƒ5£¥ÕóÖ?fâk�)&lÞý_`þ;í4äÀiE A � ð@*gDÚˆdÿÌ“KÅ3 si¾øO†åÌ…mÙ�ÔôÇ�J3ü¤Ê”./GƒØ~Ô·øcôÓ6°’åÔ´dR*7´~裩ü½=ÿ£3!+Ò•·â*[ùîßÓwˆ-“Jûoý� î!ðÆšY×`ñÔl*«³®D7¯uÚS^Í´wWr†ù¯ñ„:¹ðôC�‚@A <=¤îB½’H H �Hβ<¾$ðGý9ô€÷ �‘WÏÃå,4_)„î*µ&éÅó’–Ì)í´›‘9Bë˜Êïn©e“ƒDRÏ^ð©©ãÕ8Sf“–ékŽ0eèßÚµùo*Ù Aà6Z—îת֚[yõ¯ñ'\ÿ¾&TÈ{¼¾2�zÞ¦·f8½L~7E–í9È €s‡D‚@Aà¡8aij$ô±XGJˆ^§�?J*¨FëURyŸØ•\É`{h¥B¿2â(?^dwÐëÇ¿W ƒ° *ëXŠÁ±€ª™jÏsÅzMgqà^ôƒ—ž=™B*^cOž&×665M/² ®"ðíÖÿ×Ïõ+]ÿ®´Ÿ†@þ àÓ ÏÀA � žˆ@%˜³œŸe2"Rî9·³2ø.‚aábY}ÚÓ³ÿ—zgw ðž:ðA}4à ÷~…ÀóZ:ÃåøÂÅ?F“Ý´Ÿ2rÔ‡8nµcŸæºÎ\3¹n [!áþ£¶=S)Ô\ñ'ÇóËüåÁqØohïB ×t½¶M¯Ùû¼îD±}æú÷µ`Æ(ɘçZ²eÎ+o;Ó3ÌÿZ ‘=�Üxö9� ‚ÀS@¢‹WúÕœ.ª°?J«€­jü¥> ¦eð,ÞÑyýtq/ß•J;Q-j¿{Âj9F@HÀÂ%›ìTXk”·tõÂ˵oA£jÌ‘^«i½kÈ^‘`G/Ší!¾eþЦ·’ÙÿNí ºiA ÜG`]3^Û_yýûŠƒ™ûZŠvq}¡tnN;ÿb¸'#�O>>� ‚ÀóÐëý?Y¯7fI«Øªd®¬I)žè_K¶sè‚€>Òzêï„ügËàiõµúÀMÙKC¶æ¥éÂyµ¯_ûN¦­/: pxµÎ5ý‰ÆíÊÃj¶ã8�Û»G¾w¦ÏpA ÜF`]1ßcýû&#ælþk^ÿ|Ý¿}ôÒóhò�F<ã� ‚@8xHϼbÑ×ôaO©ÚZ�”³ô%×7¨¨U‘Ýõ>oðFA9·LS­2z˜ß)€¤?šzÆ5eèñM[CoµÁ,ÐäQ{šËÚ#ë™J¶²–oð]zŠÑ¶-½žèÊ«—ÍÊ£bBR¯ˆ!=Ž×Û*$�·ЊúNë_W]/ÌkO8HfL¾Êüoè³È €g�Œ‚@AàI¼°bÅà(Ø‘R‚ b”û,½;ãœo”´dÔ>æŸ*‚K&�¯*¤Û¾ ežöë/ßT�?Œ¿²·skƒZÚñ5…-ì&…¾b‡"]Q€Îyk´žQ©®7T¬ËgÛr”öx ‡¶ ÑñAOó‘õ1žqóí9$�»híz}b﫯ÿ·¯Ç æêëàœ·¤×®7ϹþÝ=ˆQx ùÀÁÎPA � ΂¾dOåGA�oÜCëoÞSú¨DÚ¯â#í4϶º ð?¯ï´_ðZîðÑè!™õG0„y�ñRpƒ ú?æ7ºk¡+ý#õES‘¾( ÚбvÈ˰øÚ£LÒ�þZ­Ç‘­t4„yëiг?ݤ˜I½æèˆvýx˜ Þ‰À\¯»V¡×(ûj‡+³ìÙÖ¿b½=_7L5�ÛúÏžÿ¼½»™ì? �ù÷YdÜ ‚@Aàá iÄ’3|ÀÅ©’Iï!¬.^Ç+ü�¡ISü¶‡'ëÕ1¿zíØÏtÜ܃'%±�é5}/o”Ô‘™.ª4é‡û6G÷ÁÆ&UìÆã8Kå…ÎÞ±12ÓÚɹfÌùÕ\µ§ñÁ[_ýï(*A ¸þVëׂy}ÐÛCºféêòÕ®9MÏ…@Þ8×ñH4A � †€¾„¯ÒLüOþ±[ÿ(›¡¨\Uß(YKé(ž& !ßúO¥Ëj¼4ê?xëÀF{å šì!sÓhÐ󲙫vÝ[ -(´,þnaˆbŸýµÞ$˜.ýöh5�Ýî9(; ‡'ðÃãæ�߀ùw€3�—ÿM½<¥� ðnjÁp õÂ1¯Õõ5׿¯ À@×щ‰gWó;ûüsE›‡í$\Þ8É�HA � �€ XÕ¥•EVÁÛ5*içÓJ®Yà"Bd›HI•€â{ §ý’ó‹ÑÑE4Ͱ[ÿœº‚âÇãÛ­ÞJ¨@àÙº«Öˆ›Þdm™=©G`@c ëæ\*ðim£(cæü5gÏÛ”#Ѷ¼c‡‚…ë9ÑWwi «Û¨:Ó‚@¸‹Àw[ÿº\¿€x®¾>Ë®åëÉ ÝÍk^ñôkZ{º6ýáõïz`‘> �¼ð$à3lA �g"€d¯êتÏ+±O¼‘ "ÝS·>}B/>ã�$v¤°�?ôÕôüT{x3²yÛ@|‰FƒÝhµÃ Â7ƒµ†;DÙU±€¢íOÜáM r+€xÎ4¨ eØÑØŽûæAÑ4QîcƒA«I_û+†ØGãüÄ^l9× iA \E€ ï{­]ŸûŠ‚kË¿þ]=n> �Üxô8� ‚ÀóÀ—¢ E¢©/D’ ×*Úk}Øã«ý¸QÀÞî/©‹j¸.{íö¥G¿Ç]þ9@ß ð¦RîbžI0b¬tZÍã�xJ̸խ~Ê u›¼ü–KëcHè·Ê~áb¼ŠÃ2y‡!œ-cxXЭû®ÿŽku>�`íV×Xϵ§5>×ãamîú¥v¶õ¿Î‡×\D¿òõïÆ¡‹ø9äÀspϨA � žŽ k²¯�£ÈFíéâ|N°rO¼ußà%¿9€´�Äñ6€o ›þQwøf�”K _6øƒÅ>L4&¬é¡©ÆÇŸ"äˆìâ`ôý‹Ipu±ÙÎû E—\HhôJsá`ʹ–.([‘ñ–D Ìk~Ôbkõ1v�Çâ*c|(Ó :‡qqöqZC€ë±L¼Ž°î,»âÉëÒôëןŽ×=ð_õú‡k}Ú¹È €s�D‚@Aà!8'ÖzHÝ@²Ü5x±]¬R¦Õõ�_ó ¼µA‚Š›JV¡õÊÈcq³A°lKþ¡‡>6*i|~Y^íóI9#˜!1ª69KBƒ@¸�×S­¬¹j\=½Æ°ÿu×_@¾ðõ¯ EÚIo÷�$ž„‚@A <�%iægü¹?ßðÓ&„Â'öHBë‡OÛ)Ô>’;è®IžŸL¡ þõ‹õ>@çè¸éPwY…J¢y©lhÕ9nlñîñŒØÚŸ±Xç?bÒ€å›c[­öhÛ”0Û Þ‰À÷[ÿóZ°_o8ׯtý{ç1ŒÚãÈ €Ça�‘‚@A œ¤—(üA»\Ÿo ñš½ß:e! Yýc±_.ráÀ2Rª±˜fáŒB¾öÀW—n6HÆÂ·z!÷gîa­/×›ÞÖ'`Õ­8è[cYÊÆbº8Ó›@ŒñÜ­yÉ/u6¶Ø(”¬0RàÕbW¼æÁÙ“ýåxή†Á8å‹t*»A ÜG€×(«ya›ZÞâS¯_ :þïpýÛAvŸŒ@n<ùdø ‚@Ï@€Ip Œ'û*¾«$Eâ‰â”´:‹B�%l¸/T´Žž�¯‰7xÚ—n*è øò$�²òÿ5.(š“qSP<ó+º¿L' š¿Q ïOÈJ»¬0˜ Ph+8«ÆxD¹‹}ìv|ÓVα:AÑv 1‹u_ôkìëóo‡$Ù� ð°Îz­Aû[¬\j|ýh¾/¿”“_æŒy»�nþ¹³éCsš§9 $� ‚ÀãPÎŒ"´ YVÄ•Wv¢Æ¼²6H2­çŽp s}’m± bú®[ÐÁ‚âÿOð5.o>L#öqlŒ[¾B§³`ùb¯êqؕ޵¶Ï‡z=GêÃ?Ûc|»wr=nw ÕV†Ÿ½ÙoScÄù—.â¸Ã¶ôˆoëÿßÿíÿü×ÿóßý/%–cÙÇ>ÔÕým>tcÙ5÷yJÖ²kú”9ö1Ÿ+ó_Ç»ÐÏüsü �›kî_uÂöÚÁ©ùÕ׿¯u œÎ\§ë›çj*éØžnþ=�`˜§#�O? � ‚Àã@N†¿€[ù�dßÐgò‰ŠéçkýÓMdŸ�•ÔÅ¢óSøÁŸ  ªXþ¥�²ɬûk<ÝòI;¸Å[í}¢î~û¿(ûu|ÚZ�…ñëüŽ‚t׿6Ÿ.ZáζŒM͵çϸì£õmŠ~Ú:&ëÚþÿ«ÈþõäêÝOÚöå`öïóé¹�ø`³´‹ùïúöÝñðxýÁü1´§ºòC¶�eÏ™úÝŸù�jΘqw;Ÿ÷ã ›¥}ûã_' ç8N˜šü8ÙÀnxíúƦ¸žýÁùïuhŠXÞZÿ¾Ö�ëWÅa™ª­cD|÷æ£Ìa¤�üŠO A � þ�° ¯D’õD%¸l�X2_¬�“_öÖFÚ¯4K&H>/•%Å Ò5ua×Ú¦µûúŠo¨æñPÀðfÄuÿ?LΛòéWù6½6ûýÕ}ׯ õ›®¶åâj3& ä9w8(uÏÛ´D˜+èÊSxe#mÅ1™2¾òmzm¼u«-|ÐwmLÁP¿éj{%4Š8gúÊüsüqâà|½v>®çüÊß>¿ÔSyž®ç0ÏÏœÿ§[ÿ·ŽeäÏA o<÷Œ‚@Aà©°x¯‚“ߨ�bOË@»±hgÎÞÅ8 ”È#ÉÆ©a=ú°qé•LOüao¾úÛ'3÷Vy©÷JŽññd EŸ�uÿN¦©k‹ÕçÁƱ٠Dz¾c'…!b´MïÓìÐÜwÓ_uÐG+˜·=|,<‹ëtŸeØÝ›‡5åXPZ|l ˆ>˜o}Ï5óoÔ cBIã4ð½‹g)ÐGnÞ~àtá}¬I»Ï2Ž¿m|M9VÛmªÚ…"Ƴ�ùŽÁsÍñoô cBIã4ŽÙ]póö§ ïcý]�?®ÿiçB oœëx$š ‚@AÀ9ŸÑr§6 $⵫bŸÇ_‹r>Ñ["…®ô˜##ó«ÿæ;®­ ;Mk]Eà�7*çSAt•¿«Oá tå)”Ø›öÎåü‰½ìóm××Éæ¯LÝ5Fð=g�Ï9XVý™�Ñ8äøëä2<©öó BËpzuºò´ÅF.E‹ç¹ÞÔç½é°y‹ÙüQÕ2ì86Pü Ït廟13~衵þàÉÈìM{ÇZ?™?A >î¦ éÛdÃómåô>�¼ð Ô3fA �'#À\¹Šk•êÆYtqý(pH*¡›²’² ˜–JީĤ‘=¥&�JÛ^öJ²Çg\—郞¿^Pù· ‰'ýÀR¨o}&–jpTnЬ;ÆClãõé¬[�cŠxý”Žz=á€0'*­n�Âö,d ^cs^ˆ d‰wð�UËü�oã @ŽÇÏØ5^;ž>Ö9þó|3&<Á¶�Ï{SbÏs¼sþ8'½@›ïëæ'×ý?zýó‚¶£’ýg"�ÏD?c� ‚@x",LY-!Úz1p$þ%%�º¹nu» ‡œ"M­?ëáéÍßè�!H9b=Þù4GyÅÇÖñ«Ó 6ôS±lÃÖ‚7¨uMßPe—Ç0-`<ÅÛߦoL¯Íÿ8ŸrÄ›í�ØŸù ~ÀbŒ%™Ø{ÿ-Ú°Žãõ–.ú<(›™¦Œ§xû…Ø1ëãn ûù?Æ ÿ2Îño °-Lrþóìç–Ï7HW^Z··Ö5½­©ží|Æ=;Šƒ£EL™µ¬ßý!OG 7ž~@A �Ç#à|š €Õ7rl=m‡ìí9_ë‚:ù[ò<æêL0kÓýfM&Ù_s/Ùú©èñ¯´?:¼�–„s ˜$[)�_ôKÉ> o¾Õ‡o»£ÏesOÿ^?\­¾ž ú3ÿð�½À·À$†µrüq ¸ ¼ºk�kœó°€Ü6Øß›ûÚý…þ½~øóØàsþ7æ´16×Ú¾æÙÎÿkqGö4ràiÐgà ‚@ÏCù!ŸH®É½óMKN‘™Ïçý�¡QTñèÎü™(À_xC7ðj ­’ã¯s�ç ÃùT`åülj¤eˆsÅçÏN­zµÁ`qpßo·þ¯‚áÈ €‚�¡‚@A œ �ñ¹}6 y&¤Š©ª?€Œ—€2’Ò.øÆÀR`Ñoõ¹x‡_~ñ_Q €õ„FÕ@Íc<¼@Û‡¾øê†äÀ Ö2èÃ]4žlkïݰ8¶¶³==(êɵf�‡v8GgWö¶øvÿ²p´µgÖt�Õfô·MæO( ÏãüÔZ6�[Ž¿1)‰‰N0á™ó_hdýï—#Ÿ57©××M…t<�Üx4â/� ‚À‰Àëû#±­¬ß…·CÄ>–Ò¸AÀêÀ�諃 žo'”–ì×_¯e]zÜ/ßõ¡~hù&Äø�îБR¶�u 5ŠÖãÙÔñ’RA±ÉúeÀ;�omîúÛØÜÆÛ¡Ìx·h. 0‡úÉü”±­v÷xmÇCV··wý�ƒÑäø˜>(`‹ˆ KÏ@«»rþžË�¡€- B{ë¿{¾nÇãrÀ£ä®¿=€kçÿÑeöžŒ@n<ùdø ‚@ÏB@ùdÇõH‡¹¹ Ê- ñ�UË»Ì7¥*±Tï]~`௟?p“@<>0Z?BrÂO5Œ]: ø+öÊï@w; jñ7Â�ŠÃ ð·ÙÚjoÖ&އJëFÓï°´{•<+Fõ“ï¹Aã"¡.5Ëèa›à>üÖ­A×­Ã2m¼3"ŸØ×¾ò¿ÚvÁ ý’wamS猪ð[‹6øÆ¿RBÑÁýRôŸÉRm!c`d©(Ū›cBn™b(=ƒ‚=ÐO‹Ô?Çàþn^B‹Ð9­Æ¦G¥�…–a §üÍùSSØãݺ¯Äãh{ÔÍ`÷¨,ãø»y -B?tí’úÛ¦GÍü\Œ DÆ-Ç?翯ÐY ¶õWÿH%«ñøZ»•ð¢_C\-˜PDY�sjò°»=/AÛ‚¢}4a–ÕØ"LxêpßÞ5ïeþÐTŸ-àjò ’]+3ÿB°Êñï5¶œCÆgVέ.ߨÌúïµóY׿y)Ãé—vrà!!� ‚@x,k`åz"¯L�ÛQL©2ê¡T­Ì¯ô3_D‡ªWN�ÅWÉð�ÿ•7êý�R|-o¯¯„ŒkÛw0$%¬PêVBQìÛ½)Š�-{*À¸¬g:œ´:ô˜ü[Á¶ ˆcoõÁ´cÓÄö´šû&…¸ àOACÀšN_=<ÕVucšùçøçüÇòñ‚l¾ˆ×‰é¶Üjb}—�¸Ø¦?v•¬½k¹V·YÿóšXöfl×ëß®“ýç"�ÏÅ?£� ‚@xHpQÔ£Xdž‰me¹Üí¨”#«¡¢lüÄY7ö)”UùÕ—ýéíiÔXN¼ÁÈù»øÁ8¸MðÓ¸Ü�úy¸ð°Ökz‘ ÷8�C·O¸Øõ7uhÔ�G‹tqP¢µQ³6õÙÏÉ{¼.b«cÏдúE|ŽdúïÑ[àÐ@Ù6JÿKø»þ¦^. ñ¨`3ÿÿåâI67ù|Éù�“B˜ÔöîzæúZ–ï½ëÅX÷Yÿ€·±^”tl÷ëß8O‡F˜g#�Ï>?� ‚À`\™ lóxMÏÝù‡û˜OãÍ|–¼]‘¢oÜ0è„›otüÐÅtFÁß}”É[}Þ_ã´ÛÒ•Ò�·§ÏÚ´šâÅ8CPž\Us|Zpz®]�ÜÇΪß<_Ó/Y/ãÕ/.ôácr°Ë�å¦ÖEƒÜ>±O¾6Ý�ù79þ8;ªíçsŸ=XelErþcÕ ë5|üñœ¬„­¯AÄçW_�ª§ñ¼ÐGW á#íœäÀ9�K¢ A � ð¹Tv†/öcc¶§ŒÍ‰ŸîSô‹Oì•졤ÐЃ5^…æô!w�£ÁG½P>n%¨ÁÍük=êç7þwE§ í¿ÒÈÝÿÈNé¾ôFõà�ÍQ F�Ç"¨úv}õËLFÙ¸ÀD¬Ê1ïþ`]mSÐx=t×�}Z¶Ž�2lÜà—F-0ZmŸOKEj»…s¡¯þÌßøçøã¤©ÿ}>û\Íù¯%µ¯§¬�/o]ÿ„\¶gA 7Îr$GA �" /úGQZïT¢�¢{&p*PQ@Ž'ö|S€ñéé>«ƒ6AŠÏëw=J7x}¯úÃyöׯ_ è‚Â7"Ö7`ÉÀ@Ñ(;øk²RÙtŒcY{8ºn?ŽÇº hMÝý¡Ÿ2jƒÇ›¢Éß,°?}/ãÚõa ;층.wÍ›B¸ð{ü{¼T_ôÑ¿Êv{Çaºûsì³?ó&6Ç¿×Ä8Arþÿ“Ö?®ÿiçB 7Îu<MA �‡ 0r²µÚëJå[ÝèšR7 ð¤ÿåEOòiÛ¯ë3Øø©)÷ËJ¿êožŸç·AûGBÐ L C¨9  S6$¶èr‚kÞê(ġ킜|탎¶îذ©ÇEÛê}<*-þ|;EH!l�í›b_ã‰bŸÅoSì«Í2ÿưÐ~ó7Œ;~@Þ‡ŠGA€�cz¡_ý9þ…”h+Ÿó_xø¤ºw>ñ¤››‹õll›îçã…þá`L¿áž‡@n<ûŒ‚@Aài8'F©á§û¼ €d�ßÞ§mäŠÅ8D?¾ ²?Û#ñ³¾ŸêÊ7 Ê}ÐA3ÕNÛµ½bò*Ò]ßvôU?åÅþž�bà7 ¤Ž‰–=v'>ÍÜWÛû›)mWýæÝOpâf¾)È:>ÔV[ÇiJýÚ´yæ_à/s‚×¼j›åMAVü/ŽçÖïccz¡_-Ó€ï8ž¥è°`cß´wGS�œÿ¯¬�/g:ÿyÞfsrà4‡"�� ‚@x~ ïd Š %ô“}”.àAýÌ6£Ÿ6õÆ+Å/mð°™o¸ˆá÷ ÔŽ?Ó,_¸‘€ña­­\¶:9â”Ì7<4(U›R@áàèfq'ý2† ÍoF8¾‹ñZ·ÃA¸˜ª(Ts,Ú;nïú/u»¤%Z¾ˆgÓÏüûpôñ$† ¿Á9 Íñ'R9ÿëñ"æAÑöóg,Öõ£æõÍ?}ý_G%ÒG"��D;c� ‚@8üz%µ¬]™¼ŠgA^qê•Ì$¸ z$¼¶í”˜I2ø±_Ü(ãùxòW½Öß(%|D@ µ,j‡ÖŒE _èC¯ÿN7#êdœ¼ŒTõA@å¦TØ6=dÀÑÀà šæêø¦Lä–YRÔ>‘ÙË‚70`³-¼¥¦˜7øÌ߈lØåøëü'0N`T?ךåMiVü0¯ó�æë9yàåtÝ«Tsþk©sÍ:à+€d˼³®{ȾêúÏ_ð‘=Í €ó‹D‚@Aàa0ÿ¬Ñ\¦kàù”&¡*Pø ˜2úz²ß™=“Ó…‡W4|Ž%¿¿à'_;Ð( %Mª×F}JŽ»p( è¶{*š§|ìý–Q»6› ü’�ùXo¡k\Æ ”펿­û">úX(Áº{Ïþn?üT›Í óG–ãŸó]u^,¢kOÖ¿®O~l—^‹ŽèfïÙäÀ³�@ÆA � ðTêY~=™wÍP�ý:ë-·Pšëc.œD�(£˜<ÌË^hWîHŽÝÙ¥› ó#èQ ˆÏͼ)ä¾mrï úž°2 Ãü…·çeе˜²Øt�Ï®AÙW˸éþ8¿{ýô:qÍüunÞz‚šã¯õØp~-'ä¶;Ûr‚çüïEYÐS`ºò†öÜCwµ¹Æ_“q,lª9¢g¯ÏSQe{ü ;gˆ%1� ‚@DÀI»IÞä+c3E!€òÉÉ$öÖ„4;‡R žiõ÷¤ä«Ïtµ¥3øk†~þV?Ç…Æ\|c ü ™’ï�ÿÂX³¦ðV54Е§²êÕ†´úí”|u˜®¶Ã_3¶Ç.x7óîç¸ÕéñíÛãÁ¼çZ;Ÿyü=Vè9Èç8‰"� ‚À“¨â½2G$ze¿žô×ãÈðê>E”ëú^¼°¦Ž³ßrêB«m=)[ùÏzŸýµÃ$¶)ß7@ݬkê×·}s72,³¿­Äs«yþ hеL’£½]™ÒÆŠmOÙ-è,úcg.¼YSÏ5ó×ËñÏùï5Áeå…bŠõ¶ðëÒﵞõ/d>åú·ƒžý§"0»>5Œ ‚@A <äÃ(øñOhþ•ù9Qfع¸ÅM˜ÌŒÚ‰3)¾ð¯xú†žÇ)Éë¯WöSA\ûSHLè›6GUúD¸xPü ™Êâím™²�âÇsmwƒJóí-bAs|æ)¤\ (R\´›BG3]ùi/Îþ3ÿœ 9ÿ³þ}Ý3õ5ã-Ú—+^ûÀ?êú÷VLé{,yà±xg´ ‚@§@€‰_E‚b[E§Ëõ*®(W˜LQ¸––þ :Ë¢dkmÐE¡Í› ô,=ôs4˜‚+eú¦´eÅK†Ñ—üVýƒ¢a¬[MÅQùº6lë‡1,Vwî³9õœaÂØ{þÚ—£5¦#/ïNÒé¿ìÿZ<òxô{ô¹jùÌ_çGŽŸÛ ¶íRIg¨ôsþÏkÙTÖ?nÀÍ뺯K¦Àìȯg—αlŸ‹@n<ÿŒ‚@Aà) %SAêtI¯5§kÔi='t¸ ÀþVZAOÄ~|ÛÏü–• ^ózÚo+QºÅ—Öçðç£8Z �ƒµ¯ï�X;Fj­| ¶Ýƒ#÷™ŽlÖŽa¿ðã+;FØó‡_ˬ>ÆB_uÂ=(šù÷i=S9ávlÖñ†°÷™fþ�ÄhŽÿ8;öÓçbßçzŸÎ\{–Yyõ–ó®yàƒÓΘ¯·¨OSSê®ÃçÜgúw¬ÿ7†K×ÈGžz† A � ðl�€ã#õÇ¥U˜ƒ%ú1:ªÁºµC›j× ¡ÝIÈÖïÉ%½8!µSQ$°NbM[ý@Úˆ³y ¯l>[Òs]ù]ÏûžkæŸã¿ž >?vúÙçóGýïñ­çüÊïzÞ_ç¼òîßéGãûlý=¾uÎ+¿ëy�óÊ»§Ÿ=Ÿ�úßãóœwyöŸ‡@n<ûŒ‚@Aà©à5ý¿~¸èV(N8 wª!‹+]üdaZ¢õ³ì¶Q:ûUQv€Ÿ+÷Z�úÑ…?GŒ Z2ö¬Ú�©Ñ¦XÄ~ÄÙ¼´.·ÐCû,}Ïtå5êåvÕYùKMI2ÿ‰ƒ�»ézloá·ê¬üߥ¿Õ¿åÕYù›úÝ�9{Þ¦Ÿ1ŸÕçÊߌÁTÃ\Þ5Ÿ�êË=çîy›¾'¾UgåÛíYuVþBÑq}t>Õ÷8E=oÓ÷Ä·ê¬ü­ù¬:+K=ææoéFþò€çàžQƒ@A <ï?~è•þñÚ~e’Nò ‹ñJ3Ýß)gËѯfª½*Û«˜Çh 9]Ÿ8L_Ò~)E©jÞt`×Ñ«´¯�y]Ó�¥ÆÏ£¯ü�ûLïê·ƒuÎ+¿ûô¾çazw>ü»õ3"°ó•ôñÞÇóq4EÿÊÿ±~;Xç¼ò»ÿGï{®¦å÷xÜgzW¿¬s^ùÝÿ£÷=S\ÿÓÎ…Àúûø\‘%š ‚@AàÓ˜IY?}g™®áüT_OðT”ã)½ wØîOæ§?èõ¯2Rë 9eQßYªå—“›i,Þ4€OøòS$Å#+Ë.}\J›ânûKµ!™ó¯H{ Ó#͹s@IDAT¡ô@ÆsÍüë<êƒiúžÃ�ã/”rþã:4±¸uîx­ƒ®ü-ýÏ–û\]ù÷Ž»ÎyåoÙ¯s^ù[ú‘=òÀ×;f‰8� ‚À#€R[ŸßWÑíâŽý¹~?ÁYe*É!wÙXèw�|N ’W~ìàÒlH� ö× RFëäÏ0¹Ë8NS¬üî`ÎjY¶ë>bßó6Ř+/Ï”öoy®¦ÔÿÈ€oøþ�.mªxÞïÉó6¥ýæž·©Æ[­ß0þ„.ÏÛTñ¼ GnJû7Ì=oS�·Z¿aü ]ž·©âyÿ@ŽÜ”öo˜{Þ¦oµ~ÃøºŠØ'ëãu›õ•›O.îƒ@AàŠŸ®ßªÆ¯`²ª¢0__Ó¿õ”^7 TÈCõá‚ÿ8”n¬þVþ¨›½ ‚@Aà£ä#E,úA � ¾ þ€ž´_ÝžEü¨Öëi¼«xÿùÀÂ:kó¾Šw<Á—>à‚þhak}ñŸí!]ykÝ£#ÄxåïÙÝê_}¬ü-ýgË×WþwãZ}¬üïúûl»5Æ•ÿÝqW+ÿ»þ>Ûn�qåwÜÕÇÊÿ®¿Ï¶[c\ùßwõ±ò¿ëï³íÖWþwÇ]}¬üïú‹ÝóÈ €çƒD‚@Aà‰¸$¿^l£…»>Ó?¿‘ÿ¯ú3{sQo�*Þ§’GÈÖ$Ò<ï osj_›øÍ]Ū˜WþM£7:W+ÿ†É›]ž3èÊ¿iô�Î5Æ•ÿ€‹ƒêêcåJØYç¼òpñ¦êãÊ¿iôFçêcåß0y³k�óÊ¿iô�Î5Æ•ÿ€‹ƒêêcåJØYç¼òpñ¦êãÊ¿iôFçêcåß0y³k�óÊ¿iô�Î5Æ•ÿ€‹ƒêêcåJÙùRäÀ—:\ 6� ‚À߇€Ší½L¿ô| ?ŸèïškñŽDÑÅ»o ý¾y'”UûWÓºé «[7 œ8Ÿ`'èÊÀÅ©zÎëü-»æØs]ùkºï‘­s^ù÷Øþ:žkæ?Ïcr ßõ˜¯ü5Ý÷ÈÖc¾òï±ý;t<×ÿæñÿ;Ρøø3ràÏð‹uA �/‰€êm¥ÿØbßû>!üé>¥ˆ�P|+Þ²S·n¨¨·DÅý>öíså÷‚:��Zßv÷šG]ù[vkѵò·ôÿnyæ/D]0æøçüÏúÿç\ÿþîëiüá;|Ò‚@A �.d‘FÎ"ØÜŽ×®@ñ�Í’Z{}CÀOìé¿+tèy¼[7 ¦/åø˜Àí’þ¨«X-Þ-{xŽM¾6vk*ë··‡9÷@–]³´oЕ¿¦û;2Ïtåí sEãœA‡iw:.èÝkž+èÊß²³oŽûãÝòkù:ç•w™ù 㸃¯�õد{t=æ+ËncåoéT¾ó•·Ÿ!Ác_,�»iƒããbÌÞ¢ë1_ù[6öÍq}0n)GþòWž{ A � ðd*sv±Ž2ÁÿÕÈÙŠÿ£^Ù— [<ÑÿÁ¿àä6nèC’ˆä�"°ÿ^n"àMŽI¶�.*Y&Œó#Öœzïå—)|³™ÖŽÙî9ÅÞq¡vš:õ¶]ÊÖ�}›¢oåW]ðûxеl×}Ͼ§išù7j���œ¤õÓø�,» î$>×MѳòSSœÏuP´œÿßoýëÈf{rà,G"q� ‚@x0È·]Ú#»Wb߯ø#–tÎϤüÅ ºº Q…j ¹×þ…€ò̾ºa€‚jåìš:~t÷x/eÿ«l~ú=ŶsÁ�!ÔΛj€V@Ì=\t$îEÛõ=ŽéP"£ ln5ÌÑ!Qg`Ûu؃îööåx2ÜdÊñÏùß+x[ ûúÚ×iÖÿ¼æ›/_gLÇ5l6·Ú~ýº¥ùóÈ €çaŸ‘ƒ@A <�ÊÔPöóÉ|et?‘¹u#»dyLêJWÏþ‘4‚ß 1wÁï7^KþR2»û ;ÈêgŽ(cî—.Š›×Rzi�5…_4ÓÞ!Á†±– çPûP· ý²žÔ}·ôaó‘æXMiëAkçw �Õ—çm*ÿs€{ó±¦é=ý�̺ŽÕTñM/™¿Î=Ÿû8Æ(7ÓU&^G.ÇßgðZ±÷Îg[™ÞÓæi>n¦´õ`µãcýO9þËÔ?ct?ß[ÿÄ!â:� ‚@8HÊT@¨ÐF|xMI+Ô¦NRQ5ëm”þ³¡P÷“Hó¼9€¬zi’IðÚà?Ó^ünoW +¿¸?°N¼AWþ ´ì¬:à¯Íÿ8›Å¸Øÿ‹£ÖÜÜÑ@ñ{ÓÕtÐÖ9¯¼z/·û| aÙ¥öìƒNæŸãŸó®¯{Ókëg]³+M2¬u4P¯{Óköëš_y:¹²ñZ÷z†ŠeWÔGŸõ?ûø_‹!²Ç"��Å;£� ‚@8 ?~Ì4`&žÇÅ:“NfÀzí,dJ�ÆbZâ}£À/;h:‘ÿúª[J@—7 ª�·àmJÒá‹1u\Ž1¢™’ïÁ1ç9况uÈè³ÕÚÜUÛ-VÙœë-{?É]yº^]eþG¨  ã‹CDÔ:MAÖc¾òVÙ�&|åø7¦9ÿyšøœÓ9³Ÿ1�Z&Ü ñùim]ó+¯^(4ºò-v,öÖó¿Ã 9ùÀ BBA � ðhøyþ_¯•”ÖKö•1öÇöGL*+ÙDá>¿À¯º«HåkùxÍ¿¶(Ü6•ìWõõaø¥ý±ö°‘‡zÍ¿3X<‡>ß@¢Ûr*rÞ«™ÅîF%ä–¸áx°v4?š÷pÖÝýzn¨ÓC˜o?̬ žþšb›Þ]û2…:!#ÑçùapÏ*æÝo]ûÛiæŸãÏs¤Ï/ó>Oî�0³.øœÿsÍ›ìßÈXšÒ¦¯‰4/€Ñçõýèõ��r¥� �Ü8×ñH4A � ‚ÀLñÔYe7¿¬¯FG¢È„±#ao%q.ÔYû—‚ŸžBM²6¨Œ•>º”E‚�gü¶çÝŒYèC~ˆ›ˆ�ÛÎV×›3fÅGeè—.žœ9óóiš4Wûµ@ü’¨t=�©ƒV¸š€e¥c7¦0[ybS‚ž¢°.{�iWÃ=tácq²ò™Ž¿ÏyžkurøœÐ>¶ÇóçpBú¼2Ýui½l.NÐê³ ¶­jŠÝ•Ïù¯cñOZÿ}J„œ�Ü8É�HA � �ŠüÃ|I_³ ,NùVSwjuxÕël¾(XïE©¡â>TáêÃЩ1Q¼¢ßEìKRF#tèæd¼qPÚÇÝ2ž?ð- köí»»wó†Ð®æÁänßqü•®Í÷öñmgúÑ‚èÒ?0Ïüsüsþcùz-€¢íëb/q*ìw ΡۻYÿÆ¥)á+¾áƒ¾´¡ÎæäÀ9ŽC¢A � ðx:3Ñk÷/Jv+sÅieqJ¨•X;uæÇªOAÀI  Qd}å�ßü_3·JF?Õ)[å‡kò8ÇÄ÷È'í©DgĨÃ1Bh[)p«P›åÄÌo”þJvÕGÉ�ó‡ñ1 ÝlÐShöÏÒ*:Ú­5®q°þ!–Í€ñ–lÕYù1×eÌ!ó ¥¿Ú¿ê£ä™#¶ãÉñ?¾q€ó§^Îÿ>]@–µx<{ú܂ʢ³òÛå†z^“á o?¦Ûø¶1…-cº¡ï±@ÕŽ3x×ùoÓÐS 0¿ýçá$ˆ ‚@Aà0׫<Ž…?l^c+DšÇT¯D&±àëß €LôW}�ÃâA™,–žê£Ñ?}kßI¤©¤<ÆÃ†¯óÓaícL;.žÍ´vì‹ê=ÖêôOŒ.taݽ&Èà9ï¦à9þ6ÿu|ó ÔÅ·ø½q®%ämœù`ļÑÊñ§�Ï%Ð>]5L¦4ò¹ºòíq�Ïù/˜€~²þëªÞ8€áù×ôÚùÇþ>·BÎ�@Þ8ÇqHA � Š^ÉwöϤ­:ȘðW�_Ù‡–t‡zÿõ¥~eÄ$âzeù 63Y† Þ Oò�B÷h³ððÂ'þÕ¡˜´/ßÖž1r ðý¦Eï~ º£õ‡úü“­d<¡6ƒœÿ…MabHÍßZß÷úÇ…ì�ëŸÇ$›§"�O…?ƒ� ‚@x•¬éé<¾å¿“å.ä]üë!>²:~ *qD6M–…÷ê•Ü@—{¥‡= „ÿeiŒ1á¬Õà£q[¼4eßNX§>Œ«ÉHûVEÛ3~ÊØÃ�ýš2œòÙÖ¥ƒXŸ í+: ±eÛëc�_]ˆ­l/rÏß°³=|,ͱ‚²íwËJÁCÛÝn�iY6E»ï®mÀÌ¿€|'ž9þ<íæúé]Ÿ« çµ6ç¿e�ö׿υÐs �ç8‰"� ‚ÀS@±¨2ýJþÞè�ªù§ùJ@}9_?ÑçSÿй« zÕLNôUàτ֕3\è?üÊA9Â�ð¯¨X:”SÜ0@Õ+ÏæI5�‰]ó¦{BÝ&ƒ\ôC€ÖÔ¹y?'d= d'4¼Ü8ôìºüã&€ì\|“BTž3w‹Ìß`sâƒM5cîC3µÕïíE¿›êøð0Èd7ÈñÏùïsÂ'ÕF}.BüO[ÿøu‘v.rà\Ç#Ñ� ‚@x ÊÌøÿJ`ñ�þnd]¡”ê.<¡÷7üC**ØK¥õAìiòýQ¸*EÜPÀ¸ÐC=;îÔ>šeâq‹B‰3öU�Í‚Ù÷@G[xÚÂÎ�ÕG¾u>9ÿu"‡3¬E”íYÈ €³‰Ä‚@Aà�è)¾ zçÑxþÎâ�ÉuÓ 5û‹çswW.]´è¦A+Ò o ¼Ô«ÿí˜îŠ÷— Žq<ßÊT˪Ç+mŽ� ˆGÍÔ&+¥z @Ñ8^Ókê÷0¿¥ß¶#ÁÞGÜ`ìžÐj�ŽÐ’øõkÒkú-3Éüû˜çøó”Èù_ׂB‚ëˆl€lËsᆵ_þ샀ïÜ ÚÃ�Ë› flTèû‚ò-×Ï;ääÀ9ŽC¢A � ðXXoöçókdçÎ[ˆh¾Â�§þ”Tn\zzB.Ê7àw®<2–=2fyp­;ræ2}­ïðÍŒÌÑ*º­}ÜXÛŒMRø\c‡ô`±ð¦EèælŃÚÖ&Üï ­�ÁìC¥MÙË3W»ˆO ²)Ý…bgLعÒ6s>ñGè ³õ3ÿ¸ 0;Ïÿœÿ8²þ±PúúÓ”ûxý;^Œá1íÙäÀ³�@ÆA � ðT,â‹ùPnwÁ¼T��óU w}�KTš]ü—>M\|*,a•´¯¥S<íKŽ×ý]«ó ºù ¡«Áx(°‰‰¶Î-¯[ Tìñª#žæíä¥ ,PM{Ï_;jJßö±øv7ûkˆ[þºßA[Í”áY‡xGš7‘ê€�Lï"›@d^æ%pì 8óH9þ7ÏWœ/lMy>ù"tó«]¯�›þ¶óѧ¥iÎÿ‰¡p?öÕÖßWÕT²=¹pŠÃ� ‚@A <>1®!õœZ &JJ4?ÌwÚ�§óü<>«x–�•¡ªX§lêÇ <ü(ù—TÞßø€�ù¹9by[†~þOèÆMD FzE�1¢—s¥=ö.´%\¶ §6 h[T÷ç̘»Ú¦£'Ô™Ž¿ÎHž9ÿ—%¸-˜¬] ˆÃ¸þýù4>ˆ@n|°¨� ‚@ø°~­ÊÖ¯A£àvU;úX£Xè±h£wõi®×ÙñèÅÊ‹=°�çMÝ8Ü0XÒ 7Ú'ý±/—x»xUøM±=ßáè]‹AÑï�û2P·ˆó­V„c÷®„Ë–ãÕþˆï8€0�79¸¦No¶‡š•À6Ÿù¥TÜñ±E#^Å7žM¼KyŽã4‚‹'Ì€²ÏAªï÷h ½œó_7Kÿ¹ë?a²ÿlràÙG ã� ‚@x]iùU ûK?�×+úèC­„d¾ìVQ®$ßí�2¡(*`¢Ò/­×2{Qâ sXêsþS2vÐ7†fÍ`QÝ-€>ýµl¹ epf™•Xxƒî$Õà°Û…ÿM°ÌŸ˜ã‘…,f[ùû2$eSýÈÑw‰¬¿…CåÃGó‹½Ì¿Ïq „þßM�ã_ø&À-çÖ?N…¾ _½†óDÉæYäÀ³�ϸA � žˆó3ñÅèÍþâ+aC²Æ'v|ä×JyÔDÊõK—9?hD h¥�Ïÿƒ_૸µ. J¾P½€x$åÖc´Þ‘@ÃA‚E%sAet�¶é3Q-Y'¬CÍŒ]Ûô(kÜA@*–|wÞýP_yì¯Í±÷üåv¸*ƒw_;Íü ’Â"Çž(‡Sg;_rþk eýÏóeåpîø”�üw®«¿ðOG 7ž~@A �Ç#0jKU²*–¦P¹h¨äùŸ‹VÔUzò/µ‹'ó/Ô|  yÁùñãÕv}8àQ>Å}Üß�ã—ãß7sþó úÿöë¿×RÈ9È €s‡D‚@Aà TåSÅ ê•õ•þQPuD¼1 æ—n}9_)0i]+¦rå: nð5ÿòÁzhtZô´ž ¨‹XÐç¤7 Ö›æAG[ý›7e¥Ùê˜Çêx†O3ðc–íÔcAnÞt•qC¡ô,ƒênÏxk®ã†Aó™Ž?Ï—õœYyŸ>wsþ®¬ÿãõ{\k?óú7NÔ0g@ 8ÃQH A � Œêy4=}2-¡‹ÓÒAŽôHœYüW!žõwó.®Û) dL.¡Sâ/PÃú_.ôcžz2E¿C`q ÓJPé¯zL‡tEéþÖ8Â>(ÕäsÇ¿UF�R”, !Ò?™Ð‘ü¢þÝ̃^û�;ÈAWÞº%^ýeþ¦ Éñç}ÎÝËú×uÈ8¼çz³^óV~\�°Øp]êFßÅëêwe<èi‰Ê¼¯gÞWo¶'@ oœà $„ ‚@�G@Ÿ²W‚†ßEÅ¡(­À^ëŸ þm?&‡J•‚ŸOûñçûðÚÿòĺ|Œ·0Zí(„H¹bûp§u›² .ž:æ»~zWïVHÂx«—s¨Þ¡ìDus ¹B­ªß2˜³ÍÁÆ› +&@jØÃ`Ñ—ƒ7¶Ömšù×q(,rü—óOoûüAOïŠËù?Á:<¬GƒÕp8ˈeíà|#ªr“õ/L µy²]^ÿ–>«‡>�Üx.þ=� ‚ÀS@9Úÿ™°á ½ V–õLÚÀq¯b,JY%Ï¥«×ô/C‡6_чû¯µW¥ñ¯Åë&‚n,õH�ÛòÅe™•}53 hZFAËš·š©”ÑÙ’"|}Þ ›¿1�ÞvV*Û²Ó “p#ö=^Ñ¿7^9cQÒ7Gþ£ÿòßýõŸþWÿùæ5»A \Cà?üOÿÇ_ÿþ¿ùF——µéX÷_dýûZ0n8`"óò3yÈÜÞó6}þü—àoèSÈ €§ÂŸÁƒ@A < �N*ùÙ„P¹D]Œ"ãÄ+×  \P—]LD}Ó€jë¦Lø€%S]«$�¼]ÉùrÃ@ãáó‰èú霾J&%í› î±Éá½1X!3ȰSíâ »¤ÜrÓöcøÙÓÝ[|¾ÛA:ÇF hû ƒŸÿÙò×ü_ü;uf‚ÀÛüKOô½‚½¶½¾v㳯\æp%EÃu�²|½ëŸæ‘íyÈ €ó‹D‚@Aàq0™üñ×keÉ?ë•}$œ£à®(�dòÑ}G¤ÜOéñ_E+Ѳ—.„‹rñ~ þú_½1PûÝÿ³2pð�ÉoÙ5C‚·ª“vè¨ÿ´m�‹r(t?nJ0�F¦�®úÇX;@†Q]Îèã< _…:õ»`§“}ÓcQ GØo‡{AO9|uÿýd,ûA ¼…€¯ Ðùë×§¾^àÚò•¯¿|çö­˜¾‡"�/|(Ü,� ‚À9`nYY% ÝWT¦õrÕ²è뚚ʈ…»t¨IU³~ À<5ºø†±GÖQ<Ç£ŒÃ–#±‹¼ pŠ«‹½MWÞýKÐtÈñ9%p Þ”y> ­g =ŒaÊñJÇzl¦µ³Ïý–Q—ÆꇦŃâ‡7š ë—,-�w €5Ó Šk½xPòìBg7³7ôåêxýã’l}z±�ÚñZ÷õý–Q×ë´~hÚüµõ?®¥3l@W~ääüóÇ<ÒN�@nœâ0$ˆ ‚@�GOóÙ*�d Z䓨€¢X_“Y|d³™ìB�é­L‹Òçtê†Þ  Oö9Æa*‹‘þz}å->å ô‰Â3üoÍ¢zÄÞ7#˜(ƒ/3�b Ožç€åÇ>ÀÓ}Sðè3µžéA™;mFõÃHšzÞ¦ˆ‡O/›š‡<-�w"€õõ�Öÿ›×\WÐ@{ަĠăB¯ÚÓ¯ #Û“ ��œä@$Œ ‚@�D á¯*ïñ�ýà™ .Y"êb4ªþ+²¨ÏæÏNÚ!ýYúÎKÔ¼ö©Wüý1õð‰1Yà÷/P¬;Œ‡¢¿%”+:xoÜ�OŠqk¿vÇÍvךèƒJ›£C¬$/Y÷CJZO¿ö¯¾Ûú¶þpSƒ18 ă€4À®ßÆ� ð^°¾¼à¹€kã寵÷uÖ?Ãç|‰äLO‹ŠvE:ÒÍÎÛÐÏzµ u‰¡?_$ÄÞȸበ¬�gü.ô©WBXØ žä£ëbU›9 ú�HVס€./Hþ¿?BÀÏâÃoÏÕæcP Áq›Ò÷K ”;È¡¿ z€ŠMÛI1emOëÚô.û(£õ”÷nHï@à;­_Q0mß,ýÊ׿w¾¨<�Üx Øïª÷/$ZiA � > (Ôõ;Çï`O?èCªTÔ¿š˜d;;­Š¬þ$`øtå¦H`[çµiéÁ5‹lØ×ˆk_¢’Hæ� `Ö¶®öe+*µ£¿ý†ìV{yÂíñâ [õTc€-&„ý¾£À¾â�Ñîzº‰"¾¹àù{®Äþë'-�÷#À5Ý+çb=Õz¦ŒëºWgÀFMÖCòôõßñúJPáñšÐ3ÚÚônõA:ºrœoþÆ9ô,äÀYŽDÇQ B~ïŸì˜$œ ‚À·D ~ی¸&è¿„X¬.ɤ’Kêh¥Q•.o€ÖlMUÄ–„jJdiV:ö«› J`�¸šBßà�À kù³'Ù"V·•gŒìh)~½ZÉ­¦¹‹J"©ùM½|µ„´íØQû˜ƒC®½þr|Ç9�Ã� ðÇ%㽦 _lýóí¥ÿë_ÿ|¥{ã¦ë¡äÀCá¾?X=%È÷aŠFA ü!z^¥j%™zr¯²”|?±†DÒI1,nð•þ¢~º�’ö _;È_Q\óÏþÏ~lÀ7ÕÞôOqmp³@Rih¿3b5EÌ*âåÔ1�²•˜¬ºKTŒŸòqzòBým£^Í]{�ߣÂ+Û…~uPføXø6Ds»a‚@x¼v•ÞwXÿ¼ž�‹„nžÎ+ÐŒ¯pý;Fœ½g#�Ï>ÛøõK9BZA �OEÀõ'M”ô* Ç3~•Ã]@÷GÿG�[oò×—Õ  VÛKgûFŠwXüÂc'´pë� ÀüCæ/„ >\Ô«x/8ª7Ò×¾ô¤?ú1ö D¥Þ~}αÊ`/ .Çs|íð éP»G³q÷ý­¯¸�(�­0­®×/¾þ×ù𺷼Ápy=µk¹žÕ¯‰º-üÅõò!×?zrà GáC~ëñÈ^A |ø•ƒ×í•@bHô…|ó3ýCR�(Ü­Îy¥x”ÐàäE}2üÅ@ÚW‡>ÛOWÚPY7dßÍï/õ£�•“E§Ç…Ô<èeCBŒfzY@Ôèo¾1ðöx{Â�iq¬u ?æ}j$A ÜEàíõ¸›{Ý›žcý/7$ëÚ󕯸֧� �Ü8×ñ¯-�,¬„‚@ß �®‰Q�ÏÚs&�–1ñ¬Žûµa*W&É�ס8ÆŸýÃkõ²ÃVét[íð§!· ¾çè²ñx(ùáÁâu:tú„Ä6öe;EÀ!› ;è­¶vyìÛþª‡˜Å7´+>á6}îͳÑå¼oÅy—hÍi…i½êúAMvÖ´ÚWXÿºB(`óšÝ¼–ôt¾ÄõOÈg{rà,GbÆáõ<%á‚@A üÝ0›¬$¹~ë v×7ñ_Ä¥¸?  ·ªh­LÚI)’êÁƒ+Ç?~èëþð‹mjÎ1\"«OZØ2ÚÃã�Ð ¬�<‚¢¡€ÅÖ¼¨æGO@cy¢Q0Ð×ÜÐvø]˜á¯Ü­<#pQ?æ¯ÆƒTûòï98~Ø¥� ð´üæzš×„¯»þç%WHÌMó¢@Ç׎sÎ_Q½ç(FçQèwù£FË8ïA­L A � ð©Ìt²^õçH ³LŸÉ'ÒNòàðO¿¨fÊíôÔ»°]_ÿÄGœ j|ù3ï>ø‘LWâ‘úZÃi°(¤û"�Úð¹&Ì“‡žçm í£ôr¿ÁÐæ–Õ¾æ1çsí–€c”9ö”dcÿ"á–Òa{´?tÕŽg**ϺÁÍãh²]ýMMõe‚À¾Ùú×5B×óãṚš…?ßõoD~ç ¦ûQè¦ü£FË8ïAÀYÃ{t£‚@Aà·À/šõä tìoó×ÑàJß ])ò ?‰mãé|©9�}Aw� :ZÙpúªZ&½î§–-M�å¶bUŒêqô¦‡þôÁ90æŽ}å{‚Žtå»»ç<í­3úÃ� p¬ðo³þ¿áõïîŒÂÃÈ €‡Aýî�f†òn“(� ‚@ø8‡/ÚëÂu/>QJ¯¯ùû#�AotÖ-ÊßbÕÓÔ_,ˆÒ÷>Ô¥~}Õß  «ÚÀ3ß,€:ò¯FÐYÜkç3ûy«`ŸI™vó|8Ï»©uVzWÿž¦^2ÇǹÓáõùÃê5¿Ž>�·ÀZÃÚÿ.ëÿx8^`´7¯Œ˜óÙçÿöÑKï£ÈG�øýñ¼ÊïkF#� ‚Ào"€RôW}«¿^鯒¿}œHÂ)5˜PC�‰5 TöH_׿ìzš‰çÀi…©Åí\ãd‘%œ ‚@øn P¯·£¨eíò–e|MY¿–fÉj9ôT0 é±èï"1À[ÿì)~ÃÉZº.¸U´£³tê‡:íƒ7ø›å²u‚’Ç ã¦E{´cèUØ_ümë-~[Ö~ kìîù�oL¯ÍŸ6RÊ6�� ð�Öÿr½è«Óí«¯uÔ™çÿ‘ãÝOG øtˆ?<À’A|Ø6A � Þ�€Šk¥—à_ø}Ô­�éב vï«äG&úòKÅ=^ßWe/J}'¤å£Ëyê詾d‡ K£ÍWúkœú^}4cã‡mf^1¶p!–›¢kåUvu߈ê«þ6þ¶»ÎŸžmkºŽA…mc=Ó­;»A |¯]SØ®üæËëΔê«þ¶à·ÝOYÿk,_þúÀÒ΄@Þ8ÓѨX*9Z¯8'‹.á� ‚ÀwA€¿lªxezF^¿‚._Fó¯&Ð*à‹àOü!ñE¡NLXá©“=ÞD€žm©^ý×›SDP܇àÍÄÄŽòA_¦_õ•:=î ×†[uVþš.e«Çç\‹õ¼M=ÿAo:}£ƒ“~£?]A \ ð]ÖÿzM"_×Óq=ŵ¨Û…~É-³ÎJݺò«Î�÷X õóé׿ÃàÙùrà@ý—ùÀŸ Û ‚@x/|2Ï|®6H‘Ô1!´‡ÛE(Ìôf€t§&¶”þzÚÏ‚ü;€ÒÖ[Ëöå[„1­¼µ.(Ò’‚®üPt„ õC�¦àóo]'ÆÃÇ[̸”V¾mì‹ø¾Ç¿}¼5fú‚@8 ð]Öÿz [ùÃd—�Ugå‡J_sxS²¯{¾BÿQ׿O˜g#�Ï>—ãç·þ%&‘� ‚Àߎ€ t¸õÛã·�>Áw[º|åFÎ)ao¾ \Ûà&o”+Žöª·`î1ÁOgõ±ØÐ_mÊßÁ·”ïn}sT|yå0'OТæAW¾Gºô‡Ð<éR2ºòmðyÅy$8ë‡� ð¼6AűõÏkH_K®]Oî€qÚù߉;Ý�C ßð8¬3RA �Ó!À$¹£b±ŽtI:Qij€m™ë×QGÖÂ*Ö‹ª|• ÊêþÉ? zöÜ)â?7X"}Πü¡¿ÚX»‡-·ªŠ_o2¬üÁöÚÎGý96Sø\ùm Ì›Xaªª@™1VüiA | �e=á6×–ãÖü@ÿ½þìÛQ¯ü6‹»ëß¡šÞñÇ8?ïÏÅî'Ïÿb¼Ž@Þx8äw\—û]å(� ‚@ø]�ˆ¢á�y úW’ÊúÁ?'´ºI›Ö¡�6]ª+q®núÌ%/üKIùHÌ1VûÚÎä�ãuœˆÑqšÒm‹]y s±µíßåoàžÏy�¿e»¯ì� ðN¾éú¿w=9\óNzý{çŒÚƒÈ €ýÞa*À·)¥� ‚@øTPh«®×S{ ãiû62þœúñé(Æ[or-è$>_é·äKmnõç�ŽÑ>ÞÅ1(ãD ð{ë†Àtq•ÛýAɲkwðÍȾ@WÞjõg»Ð ®#à5u½÷(]×äʵæž}ƒ®üÔ8r«Ï•·ÖêcåÝ¿ÓÕxؘ¾Çþž?ô{Œ]ûë+M2û5K7òç ��<÷›£ÖÂbNvS!A � þF"WÕ¸ z%nÅ|�…{Ó�¿å+ý|C¶¬ð„ýõ�7 �ð™'Õ-‚ëÆ’×ú‡¤ÐSA,CAÙòcäkSý¥ ŠÞæ×ärå‡?Ø]iŒqÔ?6MäŠv�W=cŒŽ—qÁ±�VÛLJ�eè·ÓU>-��!°®%¯5ÐkíË­ÿ¯~ý»v"{*¹ðTø¯ÞÙÈÕ¾ƒ@A ü=TQê_8H”Ô·íáÚLœk}Ý3úËúHº� Â>Xÿ5nÀ+o”ž“o�„Ñz¼.’)ïÀ@´oAS{ Øs"”qoÄ5â“ø°�³oq»ÆÞÝ¢c=øG<Ý,7…xå­gzo<ë…� p�o´þq­ð5�³õµÅôË]ÿpÚ™È €ó g¦ç‰,‘� ‚À·DI¦žá×ô*GcâYŒPVÖý[‰Äy y$£µ{®ª]7 œo�ƒ8£�œk\� ?fPþ¾ô'1”Çl¾‘P»p«ÖÔñ3ÆîZ‰}1öêØõmgºÚ’Ç”{þÜç|àHš»IçöÞx¯i.�ÛpÍ|—õß׺[×'ÌõK]ÿp­O;¹pªÃ‘`‚@A <�×J%âi~SŽŽ‚›UuW´ W~±_‰™€Ö[.fKpÑ^ÿÒGð=.ê¡Äñ(›µ»‡cªˆñ+i¤;ºàîX|oÚâAöÜ1Z±£™R¿ön%ÜñÏÕTÎÜ;üÚ?‡ÃÄZù°b’ ï%PÖûVÃ� ð^ÛÐùòë„j뜮ñ«Œ½9Ûü{:kˆáŸŒ@¾ðÉàÊðk:q¥;¢ ‚@Ž~Ù �D¡�B5'(ØCAì§7E-‡­døA3O¿�A±•%£šÆCWõy<ꕉǰOX˜·ÿU~oNŒAW~èyu‹ôCÙ¾w¼‹øÊeíŸã‚ï†9£�âGã‰Ú—4² A࣬k~凯EP®Al°ϳþ×ë€yЕóÙ˜uÎ+?Ô0o4О·)ô1†é{Æ[uÈ—OSŽÁÁ²9¹p¦£Q±Ô‚ó²ÿ÷Éh~6ùÀg#üAÿµx½²?hõ ‚@ïG@ÎO¯è3q„©³äúM¤‚E8žé¯ )Åߪý =ü¶B¢]rÈœ´²»_^`­7 Ö~ü%èÂíŸõ¯}4žÆU/¶¥)ö{p߀-Å¢êÅ­5Ì�ã!06õòSÞ)·Ló± Ô=/SÎñ·;ùžz÷úWŸà=–â€$-�#Ð×�¯¾þ}­òõæ«_ÿø†Ù‡f >�ÜøLtßçÛù µk±#·J A � ð©8¹Ä³wÔ±þås×·-Q¡Š ô‹ ýóEBi÷¯´únû3üðCÞ3¥Š‚wü¬š{\ô£Å—*!®>úÕµò¬ÄÑgÿæ]l”¾{G¾ãßýKiÙö ì,Cl-�î† ={Á¯ù-7PdžmA໬ÿº”øš‡é›_¯y+ÿ®9ŒÑý|ràó1þÈKªð³è� ‚@ø8z�_E,x±ÚŠÓKiõ«© zŒ@ ÿ¶ªJ,žô#!-R�’ÊIç Ä|ã`PôÍ‚×oü¨/#d+½í7(tcwãÍ(I¢yú»[`—br½ Ï%#˜�º°Ñ¾å¢ §æ4„Uý\�ÏÉ»éïÿû?þoýŸÿõϱ² Aàm^ÿ÷ÿ«ÖÞ÷Yÿ׳š>¯W†Aœq»Ðo,€ Úeÿ¼¦É%ôæõjò¾Îi¨ß¾þi�lO„@nœè`t(Zmç‹+� ‚À7C@Où+q®y‘Ç·úÏd\ýgÁß §JÔµx�M…ýü–é—·zŸíÇ‹ }*–3ûåÍø.?L=+³Ô]câ{ ·ŽO¥êßZØ@6›ySjÌî�“¿[>§Š‹1ÿ«ökRó¯¡�Ÿê›±h®è—£}üý¯ÿþ/ü¸íã_›¿uA/ýOÙ{úW_Òÿèü�å:¿¿wüÌ¿×ÒᜟGíŸ~üëìk0L±»ò+öŽÂlÕ™ü¾þŽÖºnX}X÷²þÓg; ×ÎÈf3oJ�³{ãäOó˜]ÓÖs½Ööx.çÝȃ@n<ç�Œ2WÜG¬¢‚@Aàà— ŠkQ‚¯D¸þ)Y.Îy³YHõ+ê¥nèOüuaØŸáG‚HûRÓ|ÙøÏþ±¿Ý3™tÒê!…6ô3¨X¥RQŒdØç$”=åúkRì¡Ú¢íÇkúÇPœrwï ²5»[±õ˜×Æw,š†V|h‚–ì…>ŽKæilÇËçBŽÿ<©rþsiõf_ÁÀɲâŠÍúìï¸þ5ð!'A 7Îq æú�œ#¸D‚@ß?…GQ�Wð‘äá¯0 ®ßJ~²�}çÆ¬Ak×_è¢__Ë_d-@ñîâ‹_ø‡ÿèLºxÀ¿üøÑìðcȾ‹-&žðU]S[‰é› :\”‚Ç(_ôľã½ò² ˜1´C’T´¶žÿ, § �–]úWìGÖžc{~ž«õå/ó7>9þ8ï}ÖymäüŸëEXè&Û5| ӺÒ5?–»SêÌõ ›µùHX㟶þW,Â?�Üxîo�êëÁ[:é A � ð‡èy> s|AKãú „_B*ÎñÙ{4IP†“ëª �ÊÎô;¾ vª Àw°UÆæä ûxOE&8$ïÅÎï@yîÞcª‡=ü |Gƒì•Pÿÿì½ûÓoÙQ×ÿ™s2·d’É=dŒÉDÈ TDÄҤĪ e…”âb)?h•åø‹D«ä‹¥$e�E — E*#!$ÂL2 ÉÌdtœKæÌ·_ïî÷Þë³?ŸçrfÎy>ûyN¯çÙ»{÷êÕÝ«×Z{¯^ûòIš:‡î)†1ŽeWž0g~–¡ø2YPIú HÝ´"»Œd?¼)`©�à?sSž9ó(%¤'JZ· (Æ�¤Ô=™Ÿ|™|y v® PÉuôá çCv™,@A×j�½]ÿnÿè!Œ’{J‰TÔħ±^®ûÿ|þÃC9öÆñ˜ø|~8_ãÿ)^ë´*ôÀªšCÕíóåÊìksÚgå>Jöœçñû.x”ŒÅÊñPß ÐS�#�~"À¾å'P£—�„.ðœ '„ÎÄÔ4ŽaÔd•JF JHd”`lKɽ#/óU €Ë«rƒ´àk]þvê+Ÿ”YÆúCA0ÙÏT(ñ”èºI;öÚdÀ„$¿ì­ztýíC¼i|;€îö:L÷ÿê( zü× §ÎGÙSŽ;ÿ¹•ÿܽpð&Ø6 .øŒ£Ní� ã�Ë—/o^þò—oî¾ûîÍ«^õªÍŸù3fó¢½hóìg?û uä©‚—½ìeÚŽ2äá‡ÞÜwß}›?ú£?ÚÜsÏ=ÚX èÔ¸È P÷ê3.Œ9šÍ e§´®J5�ダX'¾(G\, H‘N¹­……,ªw h‡€5ÕY/8nMš¥Ë9³ÒÌÍ€9¬© ê ^ Øl‚Oõ˜&´Y�yJ›r½_–§ÞØ’®Àu9Ooà.Q Z·í£\JÈÚg½’¢rûä-k?¹c)_¬°”ø¥ýnK`²uýiªn÷Gu‹i·ì?Ýÿs¬öøwYžÿêÄ7õ Fí�^8t ,ôÇEÛ£g‘Ó‡í�õ{€IÁK^òúûøyŒÿ<¦ç>÷¹›×½îuÚlÿÿù?ÿgZ ð¢ÀC=äì†í�sã‚R9º›áNBÇ‘žÄe•r —ß ÈØ6.Wü;xvt { Ö]žà®ÿå ºÉ¾|Óe•Ë�3W> ˜z8ž Kz(‰K%Œ@’ð‚d…°„�¦‚‚y,Ñã¸ø"N„‘l‹õ+»lÇA‘4™«:¤ìšý4É›<³Yóºþ´gúOí.¥ºýéC±•ºÿ«sôøŸLuŽ/œ_ÔW<~Ò_`×ãüW#·ÁJ<Ð +i›'m�N“¶Víþ¯ýگݼþõ¯WÀûí·¯ÚÞgjÜwܱùê¯þjm–Åë¿ÿû¿¿ù_ÿë òzA§öÀÚ=Àņ ’ÿIù.?“Áš Ùþ@=¯ˆ4¸"+ƒ øI@¶( wøSnRüþ?¹ù:€øT,?#˜:æòLD9BæxG=¿^9uÉÜ °£šs"+$Ta² ¼ª-Ù)#íMÆ”�üL˜3hçXÕG\É[ò«^ÊLyf3$?ñÒgÞ¸;ïúwûÏý±ûù¢Ç?§£<µÅ e:Ÿ­ôü'c{· ôÀ*š¡�hœ0 æÎ>AÿßøÆÍW|ÅWœ㯓¥Ïþó7oyË[´ñÁÁ?øƒ?Ø|ô£ÕÖ¯ \'§·Øgî�˜CO_ýi 䃦ÀTk0&Ú/W0õÇ9 ³êδ¿˜Qm DÅã.~”¿¬ï@&�-Ó… ?>Bx%¾P2ÝóGÿ€h¯»U°nMø#'‹Ëö¼CnáU„“2ºO‡Y× ê�ošŽÑ3èSžì(ù!o›V饺=öóPÿ´ó’bTï„ K~æguºþå®=þ�š"=˜ÃÁ:vÛe»)è¦%ö¿“ï¸þ‚ŒØºýå¾…»÷´O8«ûuº}+!¤]¤ñŸmMÍ:­Å½°––(;â$�W§•Ùտܨà û¯}ík§ ÿyÏ{Þ�í�cj�¯ü„À;ßùÎÍg>ó™i1€Wzˆã¼Î:SÔp'žGôÁ»ˆP3š‘†MÁÇüÔgÐÉ«š¤º\Hòkªrârƃø 'Ð"‰\Jc!"~õCTcIN~u ~1¦Q:öÝàù¡¹œ@K²¿ Ça�t•Ð žöL¸óe[•�€ïð#g�wº€‘22&Ц- ¡E}”Yö�wýi9¬ÛŸ~ÁbšûG÷ÿºå�tÏ4¼56=¦Õƒ‚a¯žBæsE�¯zü‡¿äSv‘ì;ûë„ó_Ï{ÒmkÚ÷ÀšZ#l‰Aree&µ97°^óš×lþÒ_úK›¯ùš¯ÙðÕþNWï�W¼â¶·¾õ­›?ýÓ?Ýü÷ÿþß7üà7|K S{à�`R–agMꘜÏ€^†Ù’–áÐ�­AóDÒx‰K…² ­–† �vÊK.2ˆ;ùU„y˜àZÊœQºx¶v¥NLd W4vN#žÞIÉ‘ïàd 8L˲;ö—/ºþöíŸÝþá˜ðI÷u��ñÔÿyþ—ƒç+�ºä!åÒ“òt–‡»û,�Lä.äMç¹Ý’M9�zà@Ž/µãl@¤Xýß¡ÖÄÖ~£y€¯ãÓ7}Óæ[¿õ[7wÝu×�VýëZß¿øÅ›w¼ã›ïüÎïÜ|øÃÖbÀ§>õ©ëª³…·ŽòÁ#¼ƒø¼ûÌT/èŠ,#'SD�§+å°ÖÏø1S̉uÜÑ&ÿ 6ù+�ä"@rå² ý@ýj¥>‚ÛE Û�ZîÐùS¹ä/±URÒ$g�WÅ\ÿùÏŸX®ÚÏÔzd¿Ânà3ö‚€ïXOdf³âñ„–ð%¿äŸ�×ú>L9Ù»)…_L|ë?S`æÒšû®?‡"¢Cá>Úü{ʬ`É<âgg›Š0ÜÁÍ` yB�NOòaÇÆ‘߸ ;ë²=ɶ ’¿”&³ñ#ó]&ÙeŸ¼€ ÒRžiʌݢ>; "\Ê,ø»þƒOðÏ2Ùw÷¥Û·úB·yïý¹ûøê"�ÿ}§i‡ò@/ÊóGë=âêrt�Îi<|Ã7|ƒEçΧÃ{€o,ð½~Mà7ó77¿ôK¿´y衇oX[pa=@¨�ñ.“ñà ÈGâJD°�¸÷¯²~A òEV™â×ĕП{ý<ÖÏýCÆóÙbŸ ̆!Ø)A»-~žOÅ �O‚q�K}TWäš¿pxÕù!QéP4D*Ùy°½ïÀ‚�¦‰Óe */v&ŸÄO>Ì‚à�týÓ¸ãªÛ7üç2{ËWÛtûã�Jî¬> YôM³*9£ øcgòIü’Ì“¼@ºÿ‡gË!îË@ç=Ó86~êüj›Óött:¨zà îßUw`}zÛÍlJ{àxà+¿ò+7ßõ]ߥŸò»â®›~ì _øÂæ�ÿø�7÷ßÿæsŸûÜæÿý¿ÿ·á1yCãüôÞÍ7ß¼¹ýöÛõ±B^a`#¨¾óÎ;7/{ÙËôs…üdáÚÁàòåË›¿ü—ÿ²¾ÃðßþÛÛ¼ï}ïÛ<òÈ#×ÍÏ-øFö@„åÌ‹ãÏɪéaÍ=�®ûðÊÌÇøóBåüœ—gì “¥ Y÷îãÕ‚à�Ðk�[g¶@âòço@Sà]“ìé™ü“®Å„•§™R>J‘‘ ¹$�À¤&ñ¬Ù2öô¼3®:‰²°G´a·°OòE3Ï åUoóPÆx@ÒB~׿ۿûŒù¹yôÑGOdö³Ÿ­¾Ìÿº×½NÛ¿yÀÇÿú_ÿëZ øå_þåͯýÚ¯müñë× í�S{ "k…éŠ# Ö3PžkEªI‡›.R*냀¨ ç+Ð3@å’ÆY0dÇkè0MºK*xþ,a”•|d–V)ÖAG~á¾d2Ñ FŠ‘o»E�m’ Â_ŠæÚÁ�…Kžì ¹¤Ôu–W¸(`³ø…1Í `_%Á~—ÝðŸP¾ë_¾ìö§·D¿Š~Ôý?ýîèñÏøXÓù¯N|ꬽ[ƒz` ­0ØÐO Îhôšx€;Þo{ÛÛ6ñ/þÅú­ík"ö áîýÇ?þqýþ<ðÀ3–yÜMÿÃ?üCm¿ñ¿±áŽûÝwß½áoxÃ6¯|å+㺹ž‹‹üjh|ï{ß«²ØÑ©=ðŒ=ÝÜ=�ØA¯ìx’|ǹ"\ÈÉ“Ê`æ.¾‚Öi¬¤°\"‡/ßãGœÊO¼P29àÍ;ÿ,>Ô¯„Ç3ðä½8yaŸƒhËš*3$�w%ĺuG? ÄñlY¥ßuMÿvý»ý»ÿ{Lhh²ó˜œâ<¯Èêñ?»l:×úÇy¼Î?éIgBOÊA|Î"k'¿ø¬Æn¢Õt� Á×l¼`Év¹¶›²ÝÂö®w½ëÿ‹G™ßx§öÀ3ò�Äs™�»ÉkH®¿û»¿»ùÀ>°ùÄ'>±Yc ûÜç>Wïá³`ÂÏö­-ýÉŸüÉæ§ú§7Ÿþô§×fZÛsÎ<ð#zC\Œr ÷ù+ЦÌåøpa)—.¿ïT T½Ós¤,Ÿ9©5»žåµh”'ÐÏ‹"Ü*�ÂÔò´ª/Õ‡‹CºØqLÀlºñ) N³s›jB;‰X XãB �+ØÃ‡wô-¤M¢IZˆß!,ôíò§ï»þÝþîƒô ãÝÿkÀy(9þ<’ t1{ü?³óßS7ß´yÙo}ÿW…·yŒ‘í‰ÚxÌ“;ñ›1Úh1·Z �®—èñ�ÎÆøší¤€ŸŽÀí[ÎÆ¤ÖrQ=p÷Ýwo¾ÿû¿³–ü}éK_RÐÏÏÝ=øàƒçÂí\ð_ûÚ×êÃ|_ûµ_«'Öb8ßGøÕ_ýÕÍù/ÿeóÄ\G;µ®Þ?ú¡¯Ví‰}^�?Ô dóÒ•?GÛÁ~òâϹÛ%Ö¸C˜õ§P¤ËqD€’?ˆôÒ1è‘:ÑSÏ|Ì¥ÙEYLÐE²‘î ( í$³¦µ‘}‚¼K…“m)q©ß¶LÚ åOÔw‚½KýKy]ÿìIÝþÕ3NèOËþ3{Ï#t»G-û_÷ÿzbCç ¼‰ßì3Ž�O=â�ü'´×Òÿƒ ¡;ÚN�·,’ýKýWâyó^Øõâ!)ý À!½¿GwÜa8jôïánR{`Û<ÎþÖ·¾uó7þÆßXÅãþ­�zD;ð+7] ‰ûNRð鉀Ȉ4¾€J‘U ÄaòMP+AËŠÌ7MGÉ?Ü’¸µ³D¥yÉ2ÕÁ„­’X±˜Ð#ŒJ–Pê.HYã•?ñÂIúJ&Ç;ò TÐuíúÏ~±O‚âv7,¦-`�ŠØí/¯¹»wÿ¯s˜²ÕsöŒO:S��çpÕîùo:«/<Ù‡‡ò@/ÊóGè�‰ÖÖ5é¶&·v<Àîà~`ÃÇí�þôOÿtóž÷¼gó‘�|äЦ\ý?ü°î¶³˜ñ7ÿæßÔbÀ³žuøÓ'vü'ÿäŸè�¿ø‹¿ØO\“Ö¾±„0Ñ×=üšŸ��'yLjuQŠÁ8÷á3e Ož‹šç$xfQðÏ¡›cö#6$å³Oé©�Y\è¬@sKceWjÂîÇõ§5õEêæº"À¸å/ᤠ¥¤°]²UŽ·ë/ùA*m›—ú�!Á©>Ÿdߢ:Qr[A×?_×èö¯»è0'õ/÷CCuSË £vÿïñï§ÔN:ÿùüs§5xàð3Ø5xálmðôá(­'åU®é7¨˜XÛ·}Ûæío»~ ï�nà+üü~=�òÕ|Áÿ�6_�îÿûÿïæçþçpóa¾oüÆo›«‘tíxyà;¾ã;6_ó5_ÓO\;·Þ@’nÒ‹——ó˜þiU^úf^MRC*2X\Pù`™l×_úv–+ud¢Â™‰Ï**£€+|?²m�õn ²ºTOò9¸·‚}¥fe¶ôU]ƒ¬zIfÑRSúb’pB}&>#'ðïØ#3¬ÙBf˜uvûÀ×õOŸtûϽähl§¿U_ïþ>|�Ÿ< gLÃM|«=ÿÅbî�æÝ?–òÁ¿ñ£L$Þítè'ÎÂ˧ӡ«DLtNwµ8�ÌæºÀàÃtß÷}ßwðwÒ¿ð…/l~ê§~jsÏ=÷\`oï¯Ú}÷Ý·ùçÿüŸë Œ¿ý·ÿöÁm�àŸŸ||ùË_¾ù÷ÿþßoœ�ívjí� Ò3Ÿ@›ÄÞÁhbÜ…g�‘ËSü�h**ÞXDpYèJõò>ïù#ë2‹y•cí@)'°yÉ»òÔ•I†u'mÉrûöè¿…ÃTz@G™ÊZð»,Ðü#ÄVË0Ý4XîÒUUç0}ƒŸ,ë(}Ö±{Ôq׿Û_}ªûÿ×å9{÷|:)2²<ÿ�'có4<¨zà îßU>=î·›Õ”öÀä�¿ö×þÚæïxÇ4až2ÎùЇ>´ùÙŸýÙ wÄoÔĘ}ÿûß¿ù½ßû=-ÈÜ}÷ÝwÅ×ý×ë þå¿ü—›xààö´ëô€î´ÇÃù|Ì� aΗçYsRr&wE|d] ’zUË\ù¾~N4##äñø>|HäpO0ýAkóˆD¢äÌ_„|l²\Ã%ó$³jÉÖ–Ãk<áî×r —ò ›&yQÑ’Œ»¼iÊŒ�Ë¥ß|GAË5\ò-åwý»ý³¯1¾»ÿÛG�?�+Ãåx‚nšüÙã:çáÎÿ�Öå�Ã=3¼.?œ…5̼ñ\$8P�þ|V|Õûíñ(÷ÝqÜ©=°ãîð¾ó�ïԇ蘰*ñÓsþ¿ð ¿p!ßõ:~åûüàõkîÏý¹ƒÿ Ãóž÷¼Í›ßüæÍ§?ýé^x: z”yÓ¿x»–Ó)%¦²÷ëB¥ð€óMÐò'ü‚R¼Lz…Æ®°‚q¤"91†‡IòT>K±ô�üCyŒ5ð§Å‚º{>-’§@•à#e‰ñéìªþÓ¼õ}o||4¯íÝ ¢&¦Á㧺þHÓ£o�kƒcóºýsl•»5¼ì“pÜ>›v¬_+Ó¼@þÜ×�¤‘&¼Ç¿iÏíøïWªç¯ôëi [âÓ­�¶ä�Ûn»móƒ?øƒ›7¼á õÈg?ûÙÍ¿ûwÿnsÿý÷ÔŽ5*çÛï}ï{õ4ÀÿðoøFÃ!?_øc?öc›Ÿû¹ŸÛüæoþæ!MiÝ+õ€îþ—mà$b«|" 0*yÑÑ0É9eW�“÷¼ßŸxÉ)\ØÈ‹y¼–þ¹|Ú€lú€`,¨Ìd¶!5 Ky. $�”/¦qg=SwÚ`y#\êE™Ï<>¡óŽ´7ìèúÇb’Û…víö�.”9©Ÿ”O_ÜJösÁîÿô½ÿôÒ.Ï_[}IüKJÚó•öЖ´~{ G—�¶Â’üÜÛ¡ƒÿÿý¿ÿ÷æŸý³ÖÁÿ ½òÞ{ïÝüø�ÿ¸î¾ŸÀzݳù¹Âw½ë]›ïþîï>øS ×½²­àª=ðT<œIâÂ3âIK*øÖrZ0ˆI±ß'È’F´R‰!2ŽÈÎÁH�%w”Mž'—ú.@ñXBBOÄšß¹''l#¥�Y–ýþ¿ÑFpê:Á \ÿQ–åϺ£,©¤H+¸µ“—rÀHÉßõÏÞ”¾9Î_éµ£÷Ýþé›îÿ9Òf?x ŽÐcÓãµÇy‚óà©ÏG�ÆÎ9{ôÀÙûüX�1�|U:–¯3o¼ò•¯ÜüÓúO7wÝu×A+ýÛ¿ýÛúÊXîtÍð¥/}ió?ñ¾“°†ÄOEþƒðþ¡Â5ø¢mHäņ *ÂJÅ—P�¹àd16…ø.·ôŸâ~äò˜®¸R&�û#›;øÐ¥/ÞëOóBUÎeJ1±Lí„9'�Ç}Ê„;ÿÒÞ¬8É0ËY֨ôY«sS^Ê�ê�\9\ï‚X€F÷}Hæ†Uà™2o®TÓŠe 8È_ÚÛõÏVJ¿ª½&¯¹­ÝÂd˜6cÎMÒBùG›ó×íŸ>Pÿëþ_£¯Ç?#.ÏCyVSÿ˜Æ^#kð@/¬¡.úϧ UmôàKÿÿøÿã ïs2ýê¯þª~cþÉ'ùõ–N§õßJàu‰_üÅ_ŒybNBO[özðñ ¯&ÜrË-×C|ËCxŒ;?­ÎIéhÏ,oš3wk?ìËO9³�¶¸/e­àÏ-íͺŒ¶Û¾%yFÜ|# ¼ë�쇹­gÍ´}í;ÒFÜí—rºýíOú<øQÉ9ö_ö×îÿÙGÓwé{t:ï(þe>}6yCZöã”k˜øú׿¾žA[^´¢LÜH|±ß)'wã>(1{Ô¤2R‹�ùÏx‚NòÓ&ˆzM ³µõl:¥Pb\@†Óˆ[‡µ&ÏÌ[�4DvÐòñ†Zà퇜Èî. `†¤³ð: RZ—pw�\¨–�jëL3$=…ï‘OjHî²fâOªe@.¼ë¿í »oÝn¼”'cgb˜[¶ÎnË'%euûÛ¿¸|Nòhî÷&|Ýÿí£ô{ûkÆ[ãø/ˬĽ°’†°q—p<#šÜðówjÿþßÿû›øEˆƒÕœ®øþÃؼï}ï;˜ Iñ‡?üáÍOþäO®fàG~äGúI€‹ÔÁžF]”ð$@|¤¹&Ø¿=ÝFPçåÄŠ«”.TÁsbïŸ{R®hzM ò™ºÂƒ0ïT°š4¾Cà0i–š¶Ù^JO½X6Ó„‡‘†i{pªYbÉ/[T"mM�Øš9”— É ë #'¥Úª"…£”’ލ?\–b˜åõ“¬¤íÍÛºþc{…—Ô^xk·¿tûg�wÿÌ£èŠÝÿåƒÿÏüüGoê´ôÀzÚ–äÌÉG o8¼æ5¯ÙüÐýІ�·2ýüÏÿüæøÀ!M¸pºùˆâ¿ù7ÿf‹¯{Ýë6½páºØÕW(füñZ~<EÁäF˜DÊ€ÉA%ž<ÄQ…Ê zR’/Ÿ€‚¬ä¨>hä2ÉöðÆ¡’,¡©Šë0vu8e )6ð£ò•10”9²ܵNxrÀˆ½©+±åK̾ (FZZm】Nª é0vu8e )6ð£ò—òºþé¬lûnÿîÿ:ëÔy Ç?ç.<2Ÿ×8·Œg4ã3Lj噈3R§µxÀ×ðµØÓvp¥Ó ë�»ï¾{ó£?ú£¿3Ë;ÿïÿûoØv¸žÿèG?ª×Öð=ÖÐß®§¿[öñÐgg#Òæƒ}DÜð�¤ ¼îX“É+ºP#A¨‚Hí·Ã‡ñQ^È©uYž$zr™yL43ŸIŠð(g¨à9ì1 ãRfAk˜ál2ب«aâq$ZZËXÿdQ–sZK© !]�´aw�l¨ûêŸô”h{sq#76Õ¹`׿۟>ã~¾Ý ÕeEsʾNw ÎØÔ× ºßÒ«»ÿË éNå“ô3éóÌÙn�<ÚÞã[(À7í”ùÕvj› <¯ã/uZ�zà0m¡sǪ�Ë;¢H“/‚^ñŠWlþá?ü‡›[o½õ Õá«õïyÏ{jÃEWþ»¿û»›Ÿú©ŸÚ¬a൯}­ý­‰‹Þ櫬_ÌL/ùËwóù¸ÓΚt ó”Gó™€òåÿ¤8¸|NVá ÅÄ6d#~~Ä¿ðÈõÇÍ­"é’'û2IimLž+Xñ„˜Ü¤Ác>à`9i”8„·k ”näÅ_Ê’páªsé·=Á!H¢Þ†^<™ rà?}’íÁn}]ÿô}·ôRõÃîÿöCŽÙ1/=þÓ‡<ÿ�þlלgá�^8 /·ŽöÀ øŠ¯øŠÍ?úGÿhsûí·ŸÀy}³?ñ‰Oèkÿ\H;]_°À‡×ðË,üÀüÀ´\ßš·ôµx€»ÿ¼£Ÿ?Ó—VMO(`†Óip}ù/a†ý�™B8\‡—�™eâ¢~"0‰AŠÅƒÈÊ'ŠXå3`Ž .tñ4¤™+1¤òG¾¡y U0rg¸ $>ËKëÑ*Í®@꿳!º#…”PxÕ?؆#¯Ë�õOñ²d�œ\oC×ÛPÊ"ËÏCl‘™i©‘‚?S6PZC·áNÝ]oÔVR…ëÚõÇÉx÷$>ø �uûgÄî÷†r]zP^ËþÚãß~ð¸7Ä_5 j 'NçÓaÒ�‘r çyÀãÞðš�ÿPÝi=è€u´CR)¯ 7­áÅöÀ‹_üâÍ�ýØ�mî¸ãŽƒVô¾ûîÛü«õ¯Vñ~úAq†Ê?ò‘�èÎP呪¾îë¾nóÖ·¾õÈüθxÈ oÝ3éÎúA#Í—¢ ¸Ä¦Ç÷ ‡+y(;ßÓ/1ú®8y|c@“S”Ä©%¡pä¦âÔGá ) ( ¯`âT¡+s†{ä#]6 2Ñ=>€pý]÷%D™ë. ޶bsÚ=C×ßpª7Õˆ:k“¯ŸÊSÏÔ“òÑ ­6�� ™AæÖõŸýÐíŸ}/ý�½Šî£D¯ª¾�pÙ÷Ýï ç’cÿ,iSÿ¥BË?ÚÌý“>Þý?¼À9¿Ö¸?÷ãŸöí´ôÀá›Bç¼2㩘ìŒÇ‡·®-¸®àq>Ävç�w^W=' ä‘G6ÿâ_ü‹Í£�>zkç_cð­…~ðƒ×XêÓ÷¶·½mÃB@§ÃL÷= ׄ“cMء뀽pøÀÐÖõ§=ÓS»퉗»ý³¯ißý?�Ñã_çB��a¼ø¬—°Æ–FPœw8Á).Hœš&žbmppøz~pCÚ€ô@\à‡Ô^¹èøÞïýÞÍË_þòƒWóg~æg6<ðÀÁí¸Q øÙŸýÙͧ?ýéƒWŸ‰ò÷}ß÷mîºë®ƒÛÒ\p±ñÏô=? ?”èŽIž.GLö¸kZ˜OÕ“º 63O�tô#~Î/C¬¼¤‘ -n0ËV‰È‰ÄÄ;’Ö „G¹€P•;ÃDœA)äe Û ³d˜ žÄUgpñ'œê½¨?LüÒ3˳ý®¿¬p=¢”l/˜xÕ'ÍŽƒ¢«Þ†Ê� /;! Ô–…wý'?LíÞí½#S÷ÿ1Óxîñã%|ÂÑ8‰“Œaœp²¿<ÓóŸ{_Ã5x ÖÐ Û6äYi›ÖGÐßñß±ù á/¼f¿ñ¿±áQôN‡óÀ—¿üåÍOþäOnzè¡ÃQšýTÊsžóœƒÛÒ\\Ò»ý4ÈÏ 1Dˆ÷ø”FnÌ /E¯8´ÕýëÖs”ªo /… G44ÆÒÀ ç?&žhH)éÁ üé°ÈdŸ¡$ e´ ۦ䇤z…. d+­u”w’¡™Ž”¶›RÆd.Ì)—:»Þ†‘“>LhJúB cdÃô+<(ùé÷´°ëŸ~˜Û�¾³?ñ*¸=œ¾ìö·¿ðLúl7¥ïì½È¯þ Ô†wÕ?ÓãÝÿg?xÜÊ» ‡ê0vY*Û|nŸõ�ÿÝ^Ò”Cz éý=ºcðj\ïÉjÒò?¿öö·¿ýà5â½ÿw¿ûÝ·£ Ø(øç O<ñÄÁÝñ¢½hóƒ?øƒ›Ë—/Ü–6àúy€É"“L®: êy?_ôÔ)<Р_=æü<- j€(-<±À¹kÄI²#Ÿ/w>2Íï¥K5Q|@0›2ÈSB Oáu²ŠF1��¡2á ‚òÀ�"'N�§z“ïTu²ýÒ&<”•À„�»~ÀŸËG1ËDBé:R¿M)u:Œ]f°µê#ÜÉWEQ–dC‘“v¤~Û ? Êã•?ÖyÄ»þöMƒÿ2uûÓ�rŒ¾Hï�QXu7Ʈ՟EÃ¥r+~¦Lºÿ§/ðƒÇ½a¸H>/¸×ÿî«5¾åyѪŒWþ8æ�Ó�Öã�^XO[È’˜$锵2³Úœkè�¼à›¿÷÷þÞ<὆²¯FÔã�?®¯Ð¯!༻/2ï=÷ܳù¹Ÿû¹UT‘_ø®ïú®UØÒF\'èrC¨�A½Û×Îsç¼±g—õkš�êg¹ye2KÆjZ»|@ÓEᚇÇÄ;MH5ûÌ_ �]š6F`|/ h@_& '… R,Jâ…NÁ–êG�b“Ì^ùPɯ\IMXì\×£ô©$ÌGH°#õ—M² çQ6týÓÝþÝÿ=î e'ŽG�¥à àx.¨|z|@á$ëD}[¥öH¸!Ç¿<×»•x VÒƒ>S ¤F/Šø­õþá>øÿñçúOÿisÿý÷_×^˜züÖoýÖæcûØ*êómßömýQÀU´Äõ3¢~@Z}æOi:0­c,ï ùYµ›¦ õ°Š™]”É_Ð…-dÁ®Ð„äòèQfðNØ…aˆ¿x�ãÀ€Î3_•Ý'/åP0¥ ©¤ ºò ¢Ÿã‚c½U”ÝÒ~¬- øBžÊ‰&l·—Ž82$'ËP$“¤ 4OÁàïú§/ðC·?}„n”Pô1’û[÷ÿôÅãI¾:ÎäyÜŠïŽ9¡wkñ@/¬¥%ÊŽXѬ³êÊ ks®‰ÞùÎwnþìŸý³×DÖ3B€ù�|à™ˆè²×Ñ|�'4Ö�¾ç{¾gsûí·¯Á”¶á:xÀwè‰3hsbî)1‚Oða‚ª,ÅG÷HL%‚ê‰+vª(»”¥Ð¡Xt_M¼%w�=Q4¾ @¹ÐP²�çWÙ`9] c”€±éÒ[|¹�6‚/·­úSá…ç!T%Ê“,}àÖK¸ÓÕò»Ü‘в�±IWAÛ0BÛf{—°ë_}ÔþÄñø3GÂ…ÄîjÛójù­çHˆa$Û;À±Ý�£|Ùî>FŽl´œ’]‡“*!±oAp˶>øÀ�®–ß厄–m{hF8ھܺþ'·ÿ‘mчð@/ÂëÇèŒVŸ•Žáê¬óè�7½éM›·¼å-7�ÎýÇÿønGp´¾øÅ/n~á~áh†3Ìá'*ûU€3tøªÒÅ&&²<ŽÏ|–]>ôšaAš¢ŒšŒ^“b®Tú.@ç÷*Ïã�”w ‘ÌR|àÈ1'ŒÜ²)ŸØz]@Œ{v’t å.ä«ô’¢iÉ }É(Û "o¹YPræ:ó6mäµ´ÙNpÉ(8âäíK#Ï5‘O½IÀª·¡má¨S¶ uîúwû�}bì+îCtµîÿx!“ü(pÄ�¿„#8¾4´_ )»äi’͸'Kž!r–›u%{ßø—ÀޭĽ°’†°ý€=q± _TÿîïþîUTê×~í×6ŸûÜçVaKq´~ý×}Ã7Ö�¾å[¾eÃ7:], Owú·&pÔswÇò€&wÁX óÂÓÅib(WeðÏü ýyZ@Ú (Òª ìª çdã8é„mœÐ7O•M¹![Š Žu5ÿHïný'Ÿ(3‡ìè_؇½Ç&ËÆ&ymã‘e�#nžQ¸l-ŸáˆCo×òƒû½¡üC3…¯œÜ“ÿ#Ã4ó - ›Ê´Ì"k”oÜ<£Œnÿj«ð§û7~·¿Œ;ßm ñ)ŸfŠòN;þ� ÓÌs,´,`ÙehGˆ¬Q¾qó¸,�M¶‡ÏpÄ¡‰÷¬Ç?êt–˜¯Þg©µuµn0põŽ;î8x­|ðÁÍ{ßûÞƒÛÑœì~íg~æg6O>ùäÉÌgÀñ®w½kÃ7,:],èî|T)¿ìs¿šïª–5©¬ûöUñ§6ñ+€%Ïá5�Ì»öüù =1À¼3~A@:¢ÔÖo%“E ʪ¼Dç±jbZª�—¾eþ Ù%dUWMŒGÜ꘦²¬A’‘h›F8N²÷È/a“8É“ÈØ�•);¶h{òGÒˆ»ømñbÄRÕRXÒŠ"%�÷m]ÿô ~Øãßnu¯¹ƒ©Ñͪ?‘ îdüˆü²-e†c›ŒxqX30ñÿöƒ<"‡Åí±„öéìñÆì�^8pìQÏô«ÓòÀë_ÿúÍ7ó7¯¢FïyÏ{6�=öØ*li#NöÀg?ûÙͯüʯœÌxü4àw~çwž�¦Vqf`R5=  ™mÞ©—~MèS~~…Ÿ÷ý¹6Íåtµb7o êƒ!ƒüX:ˆŸtÀOÁ¬é£ä#7iÉ_JPdY*ÇÀ/ž-ZäËŽ‚¶É™Kþ­:s€Ã}ò¢Î’çº#ÓαM#D–x@¿¿þâˇ8âGäwýÓWøÁín8ùqôg6ŠÚF»jû{ÇŸÝþé×îÿÑ]¢¯Ñ— =&GH§È :þ³ê½_‰z`% 1˜Q?¶kT˜›1Ѩܓ՚ÄêŽIêöOWtûçÂ}ñöÿ©o5² ôÀ*ša6".Ì­:]ü­¿õ·6Ü9=tb‚Ñþ;t+<=ý<±ÁwÖ�.]º´áU`§óï]lbÇùá¦x®_�‰ÞÙl"Œ ¯P܆š$†<5¯ ŸèŠWÄCè¡OR᢮-±”§")›2¶wY©¬ ¬EPÉ-9¢¯l-yO;lFÿXÿ—m‘?Ú<âÎÇ6áB@Óv [׿Ûßý`ÿ‰þ¢>ã1 U½i·?ÑïÕÇj À ^ÉpÄ�Ÿºâ�ÕG %w Amq——\dU’ŒÀ�lÝÿÏ_ÿw[6\‡z·Žv˜¬ˆÛ|Æ›¨�œG¼â¯Ø|û·û*LÿèG?ºáqòNçÓïÿûWóÀ]wݵyó›ß|>ÙVoy@ï˜äk2M`î €«“.GÀخģü†ºJ);&㕯 WáDÈ·ˆŽ?ñqòE+èdm•½Cà˦!2Ä_p´Ãø(|ª+•s½ #_² ޏÊR~±IÐ&}ƒMØ7ÖyÄÉSB©ä.åa4 ì VÃ,–å­ ‘k™ÒáºG¼ôKö¨¯p•-ž·lëmë<âä)!“T²—ò°Ðõ6Ìb]ûÁm0BüjŸÊÇc›�xù_¾ý]¸Êψ[¶uÚ ilóÏÜØ#“T²—ò°Ðín˜Åºýí·Áñ«}*�m>âåùvôwá*[<#nÙÖ‰-�Öå�^XW{`�υ볬-:µ¸Cú½ßû½«¹SÊcä�ί}ôÑ ‹kIo}ë[WÓ·×â“ójïÜ{âÌ]ú˜nWE4îúó @Bà……sãÒe\h삦…ƒ@) Î\1¦ì╦*£ càÀK±ùY8ÙôŽ“ÑiÒ)£$lª¼ÚŠ–Vé+d‡ì6ŒdI@mØŒ�2†*Ç#ܱ7ÊŠP ~R•³¬£äïÈ DÃ6’a ÖÔV´®ø_á—‚àJ†qPÍ6ç8| í¨ö‘ Ê×&ÿnÿ#_4’u·x7|q”wüí!}ÞýÞPîÍ6µÿ9Œ ]†àJ†qÐíŸ.QŸÇá[á@ü\m%ßá·Å¶Ó^)®÷+ò@/¬¨10%V�‰VfX›sUxÓ›Þ´á €5¤O|â›OúÓk0¥mxà5Ö�^ò’—ôSkhˆgjCMâp×L¯¦Å9¡“ü9ˆáQþiB­9`\®4!¬©C§BµHø4±�i¤&�ð ü¾ðõ!äž¶¥°©Ec#µa¸ìÉÜ‘_T ÔDUyUó&[Z4Õw¬;2B�&¹Ô��d(t¶¹Ë-Ù«\¤¶„àðÚ.C•e ÚÐ^º”ø”°™ŒM² Z®a²%×èóá/û#ØíO_¢�¹ŸFr_îÛècæQc‰^ÇFž¡ù ásÏVŸ/~á¥O<ƒ=ê÷±¹ú½¡å&Úa�Û|ÄÃ@åµÁ<è³,à¾-Ù]‹¬34´ºÞ†£,xH.©:sŒòÃåà§®küˆþ¢þy@õÇÂUn,‹,ó÷ÿô›Fu�Má5LL¹òwÐ&Ë­ì &0„D2ÔmBƶÎñŸ&ö~è€u´ÃdÅͦÃFΙÖv÷ÿ—ù—Ï™ÛÜã<ÀÏ®é§û)€ãZëäÅDÑ�ècmNÜ·'–L+ Ö�ǬóR= Éª&›»OÜT¿È"“Ñ|¯Ÿ)ëþ€"®}5y„¾(Ÿ0�±o˜?ëpÜÙ>Ù4">aY‡€#>å‡0Ë@nM§�ž /äÉd;Æ&Ùß¶gg¼IËò‹¬#’mîÛÆ:�¸ykàVd#ÏP|]ÿjÓðŠÛÝp�ÓgéÇ}þëöO?â÷{íΈo÷$ù4èÀ}ÛØçGܼˆ´ pú: ÈFž¡øºÿ§¿èóî÷†vœa°Œ¾…Üéðè€Ã·Á–1H8Çt:§ø†oø†ÕÜýà�6þð‡Ï©'Ûì£<ðÁ~ð¨¬3§óO¼t:Ÿ (�é¶î$)¨wpNœÎd.ò5Y4?æ—“sÖ©s|5á–œâ×Ä=Šò4|è1î >O $_0ÂÃOKR^‡i×3ñªd«i3v@Êv™Ê*�4áÅ+?.y-Ç~ãÀ'o_>u…È&�…/ì³�§…’ÌGÙƒëqh¢‡m†!$m-xšúQÖ|#n{BxÊ .]…/ìÃÆ«Iè!YßhÃ>ù#Mx׿۟¾I?ª~oè~m8ö­£ú›y�#öÿ«¿Í{ý=Ð ×ßÇW¥!Nu+媊5ó <ÀEàmo{Û ,I~çw~G“ŸÕÔ†\|êSŸÚ|þóŸ¿&²®…žðäùZÈkgçOF Îsã^?N3¦In�ÕÖÌ‹ù;v½š .�h=I°-:›&Èdi¾]Á'Ç!dü^€m+“ó£BI¥€rà.¿©ýú£(ø”òD7mbš—ޏ9\ȆnCáQoCùžü¢A'ê`¹[(oЀ{7jK^ýIþdy-äI�iKÝq<ÖyÄÍê¢@6t ïú§OÂnwCüC2ÔÁr·p°xƒÜ»ÑîÝþÕûË¿S/ç.ü)w›¶ô}�}~ÄÍê¢@6|o(üö×½á:<Ð ëh‡ÉŠ8Áû\1Ñ9XÓ»ÿxì·û·Ï‡ãÚÊ«öÀšÚ–ï]¼æ5¯¹ê:t�ux€àZ�ç‡9ành"ªè<&¢"Ä•I8W*m8@câªrU²I°‚‰^Q çŸ‚›ÀS_–1튾�e íÛÆIsN¦+€]ü‘ …—]“,r‘í?ã¥sɲ©®Gݳ¼äGsjŸ!ú�«?2È7ñI~Ùåãц®?ÁT·¿û¾  §/Cs?"ÜÆ+Ÿ>O>� Ù†cß›å•lt (’!x÷™~Ø7¾GÚˆOþ­vññØnwC·»!zÕ–%ƒvw›�ø5lôvZ�z`=m!KbæYaevµ9Ç{€çšîþóñ¿ûï¿ÿx£;÷Üz€×¸¸¯%}Ó7}ÓZLi;®ÒÓD\óyí2H§{ES? œsœ&”•ä÷ê}LéáQaÊFâ©%ªTðä¤×“Q ž¬­“ïpEô÷8œÄ¿TÃÄI™¹O†Ky–k8Ö|¹ÁgžQÖQš©3)k¿¿þ’C�]oCHå[ ð®ÿä‡nzV$�ƒ<:v¿ìOîW†îÛË~ïcøÌ3Ê:Ji÷ÿ{üÕ/š~v耳óõ©4éCH§âl¦5yàu¯{ÝjÞýÇ/kºC¼¦vº(¶ð}‡O|â«©Î×ý×on¾ùæÕØÓ†œÎŽ'�¼‚¯·‚tæ§±5Á'[ßн¼á‹ÿèÇ÷ÿò¢À ŠnGK*n)Ý2öHØrT:1 ˆ‚Löɰh`n!±lp`c˜r*ð.ûÓ¶ ‚Ìg¿q ÛqõǾäI8âûlE{ø�?é,èzî“!“¤·ë?·ûìÿ± Ó�ÝþöÃØ—Ý¿—þ‚nZöç”Í�^éó@÷ÿqÌ�8^Ú—ó¤5�ÿ}v7ípð%ÿp´æ¥æ3à2§�Wë�·¼å-«±íÉ'Ÿ\Õ—âW㘠fÈš>xë­·n¾îë¾î‚yøâWG�çÇ''ò9Ag ©A+8yž¸¢À” )¿˜ïæS~(Rüˆ‰’úƒ ÿ“xPʲ‰9A'¹¸ì@JÉO~Ëœåï׉ÞíÍu²<ƒË€wþ޾Á欶•� QÉ£*Y�ª>±+(ö°ÏÐõ6T�"s‚�ïØSþ-®ÉwðíÛ°Í2\oC 5d3¯e©hÙ~É×õ·¿ºý»ÿÓ4ö{üçÉ®÷«ò@/¬ª9tÂŒ3F§óä�Ûn»móÆ7¾q5&üãß<üðë±§ ¹>øÈG>²ùò—¿|}„? ©ßüÍßü4Ju‘C{@ò‹ ª~�–‰j\�˜·jâªÀ}±í¥áhlóX¶P·«ºž@IDAT%06µEAµUáÝþ×®ÿoù¿î�g܂۟¦&/ÄÅd‡6e6²JðÓ·ÜrËjlãëÿ�.¾{ì±Íþá®æ|¼sç�wnzè¡‹ïü RÜèF�Îû3áH1– Ç\¡|‘"—‹âù*”ÏÇÿã3ƒAO—ë]ƒœÖçÔ>÷u—9>ø‡=È¢¼db_•’l»&î°.óÃ.Ñl­äQ�Ò»üUéÈÈüä™ñ¥¾9'1Ìëo\õ–¥}Ëò–uKO*¿´g)?jÂ�®p×?Û¶Û_]oÙ_¦~ßýšuªÑñr¼ML…ôø?éü×÷›—}æÐÇÝ"‡n�]ýuyÚÍhÊ:=°¦ q‘úýßÿýu:ª­ºæài�µ$&”o~ó›×bNÛqࢣ;ó9‡dÐTðú#@Ï •Çÿƒ96&¾9Q&HGif(À\¿,¤±,\N“üàO„ÿ¡¥¾P²k]<ågIãÀ·Ü\TÀšüƒnšyFH½IYÿ²j¨Ö'ëžz )™80ñÚg†p£Á0që.Gî(?ŽÈªd<íH¢iEI�#žœ»û®·?½¢ûŒF�{CÎH1¸§9öcDÅðJÜã2iŒ<�> Fh¹á[p§qü»î ×á�^XG;LVĉ'¯B¥‘5{àÅ/~ñæ+¿ò+Wcâ}÷Ý×�ÿ¯¦5®¿!k[ìYÓbØõ÷þÐÀ$VÕˆö)¢Ï÷ižÊ•[Lcý&€È|@) W-±ŠÆ.'цú5€$k¡Á—9 äÆÞ¸òtœihÏ2 Gœ¼}ùðŒ[ÚÇ>mÅ6p`âÌ|Èš°—ÝpŠUH Ð#GŸ(PÏ‚£ #N½9ÞWÿ,;×y_ýFÚˆ�:F¼ëO;uûwÿg\ç85d¼fpÞãZ°ˆÓ×µ>ÿáõNëñ@¿°ž¶�%1à4…X™YmÎX[À³¦;ÂG¸¬É×Ð÷ÜsÏæ‘GÙ<ûÙϾ†RŸ¾¨»îºK¿†ñ¹Ï}îé é’gèf„ ù‹úb?´Œõj€‚UÍ¿‰»ó|ñŸGú1“Y"ì\Õ„1©ºƒ/éÉ3R•«�r,äl'.‚B§ •%{7Ì`ÎArÒMÛ–6¥—’Ðcš“=s>VÚž,“œ#>ë¤\Öß\sž)GCë1´mGÛ»+ë8}'Ës]»þx6ÛÁ>I_�þ5nH_éöïþŸý`·¿$åè½Ç½áÉãuWÖÜwóN–ç¾þ4Çÿçú]KšrVè'ÎÊÓ§Ôƒ0G×)ù›ípàD¼¶Ÿ­íŽðáZçÆÐÌéâþàVUÙ×¼æ5«²§�9ÚÌÉø)¿ü™¾8ˆ«Áù4Q ÄW$‚~e“Æ%‹p=¡2AM fÍý‚–<è4or‘3T²A\&JV ü†cYJì߬+§¼àD_sRoË®bF�‰wÿ·ðÛ8†GÜ㿎þ…g{¼Î2\fªEÔÂRùÔ^»ò®ÏøŸ häà考7ÁŽyUÞ!7amxÕ«^µyá _¸³ø"ü'?ùÉÕØÓ†œ�ÖöÔG/œM»_ -ž@NAÌçcZž¢kÂ9N: Ü=Á×tT<Ü×ϧ$‡ âfähbY0gÀšEs�AxdN<™C†¤H&ò‘ÍF2¬£ÅŸ²fùi7:²»Þí 4|ªEñ»œ!¶$ÏéìC ˜ºG�T¡Í•NNíÑÖŻþø¡\9ÁtTú×þJ_vû»e¿íþïñÛã?Ï_>q®²å¹m8ßGG²ï2ïé�ÿr¬ö~ èWÖÐ ƒ 1°¶¦CV£+ó_=_SúÔ§>µyâ‰'ÖdRÛrøØÇ>vZN¯â«¾ê«NÏÜœõ€‚)Ù°"BKÙb˜‡œÈ‹#/OÓz‰‰aüe¹ùòåc.ið³xp™Wêwù¦ËÂSVN<=M±!!nQPNË !ƒ²Éƒ©iuBŽSFÂØk2;Ã]~ò(ç䃄ù6^Ö?9¶å#ÏöZÂlËL1fÛ]Êš–<Ûòpö•»¤kÉQÔ>7œëm?$ŸyÄÒõOW¥3äKyNÇÝþ9¾æ·RÝwì´íþšNt_,—À}·ûúèFÿCwhtè'VÐeg…§â¤pôt=¶¶%á�µÝé\Û£àÝIÎÆ_øÂ6<ðÀÙ(;…~ ð¥/}é)8›åЈ)|ØW21×¶7 Ì`~²ùÅ]°�ê3• 0˜7¾0¨ fùŽ@°&N1z ò¸ ÀsƒsfÇr‰;°p=04i²”Ò±�³>†æ3œùŽãŸeXæ6tÙÔŸuÍ:»Þ†a�lš¡ëÜõïöw_ˆÞµÝa²»Ô>ûnôÜÇÝÿ{ü_ÝùìjýõtÎ[]¶ì�^8pìQÏl¡ÓÊ=ð¬g=kóêW¿zUVò›ð�nL|ö³Ÿ]UÅû)€U5Ç1Æpwžˆ y‰cÒ`_<í�5©ª�LØJ²ÍÈZ®!¤Â'�Ûõ™å”<ñψ—¾´=ë,<êj8Õ»ë?µGú«Û?¤/ºÿÛÑIv’†\P�#>32NI5^5æÁç÷†� ŸÖØžÊ[NAñψ3þCK§y ¿°¢ÆÀ”ð¾Õ±2ËÚœÑk p|ðAýÜhcã7Žî»ï¾UU¶ŸXUsm XÌû˜Òi§÷ý™1Ž£…'ü²S*&ëìIä(Œ¯À�9"‹ Šóƒ_ […Gy…«L~bÐ ^$—<ÉÞ£\$ /¨º"PµU³ÎûË'û\&ã¶a.a3åH̬†0ŽødLÙ§Ìô¬ÖÝõOÿtû»OÐ;ö%w®‚Ýÿc¼…/zügg¡[̧—�tÝÎ;ššp(ôÀ¡<„Þx ÒWÿ#8š¼¬-ÀY[¸†6º‘lX[ûó€—¼ä%›Ïþó7R3œ¿ºÆ$0Ãë4]wå] &Ë‘+ Úâ®¶&�Aó‹W *Ș畔g Rì4ÿŽ%nžPA^˜ðœñ¡@ícWAp.dþxWl¶ ^Ja3�dX‡#$_º+_Lóβ ‘›ºKþŽº�ã k3ÈÞá‚hìHðš‰cã™oÝ]ÿÙ§sÛìúkÇŸ.fØíßý¿Ç œi@0ˆ¦ä±eÈùÈç 1mŸžBLÈ9þü×77'ï®áŠÚél<�WñtÅ;ß b:û:z€Gÿ_ýêW_G W/zm�€_} ºÄ3ñÀç>÷¹ÕýÄ+_ùÊgR¥.{F ¸vR ]9-$/&~¢±ç˜;á�Å! ¼pÁ?yš-š üðU0XŸòÄ[‚•9);! â?>PëMún@±È? ȆC .Z€S¥¥<Ë5\ÈW]ƒ¬zOPv Ô2MN9xرÁk¸Š^,2�Dp—µ<¸ÀO›–ò8·…ü®ø'|ÒíŸ> ¯xdç­þSýÏ](ß‘g} ¼ú¼9šÄn˜Áe-&ðÓ&) fË[Â…üîÿá«ðÉÕöÿÓ6Gó]wôÀuwq+¸hxõ«_½á#€kJ½°¦Ö8{[ø€ÚŸüÉŸœ½âc4ò@§u{`œòúÎòHË ´'ÔäxL�Ï�ý¼©“�>y¤™&Ôs~`ÓGÍ ÜN*;lb�ÁñÛ¼G±JAÒjÅ€'uÏ­$à¾m»þbU°�X–wÙ%?tÓÀI†y´µW€KðŒøÓ1]ÿtN·Ž¼á>±·Û¸/÷mî»@6’!ø²ü’Ÿ|ÓF^ÊîIcŸñ=¬{I®k·ÿÜîöÉ^‡�m¾ÜÜv@6’!ø²ü’ßùðvZƒz` ­0Øï÷�#jÈit-Xã�Í^XKï8œkë½p¸¾pZÍè9-óeÇ0$øR4M ƒW´œÔç+” \‚Ÿ'†ü^,Hè¹<ò³H”±Ü€i�í‚cà#Þ�ž¨R2ù)“”ÒÈ3œøþ(­r‚ È+x}²œ2ÞT˜ÝþtµòŲ�§±Gu ^ ëmØõ�6¡�ºý�ì¯WÛ?§~�_ÙH†y´µ¿Zùây@áÑv†S;íÙý?ý¿žñLgØê}pFX×mÌ3ªt«i<¬í7Οx≠�€wº±=°¶ïôÀùè�ÈóXÚÄŠ6[HÌÙ£»EÓWýÅÇœ.K0÷SÐ2'ù Ny “öü@ÊÕ<:)Dú‹/µ—,©�Á¹C » v•«,ãCéE!甾ÀäkY,—3ÐQ i»‡ÈµU…báX|ħŒ"N¯M”}(Øâ‡0'²¬ªñ¡ôÌ,Ì9%;p«GFàu¨zƒwýí‘…;wñkzLY*6ûw¦¹ åìöOÿõøw™ãL™0÷4÷¢Eï›øfRAœû§äÅn–—‹´W7þSCï×á�^XG;´çÈk l¾øÅ/ÖohŸ#'¶©×Ük[ZÛ8¹æ¿3j�I]êTÉÅœêåt/ƒòÌÑDpdDÉ5Côô�…~AÀ |/€—T ¹rŸBr±Á 9Ô6­L––þ…ù,‹ •@¯Lì!§ê�–“ÒÉòB²mÞŽÀmû·�\t^ü0%!Âö—8*ÿd{C^×?ÜŠ_ON'û3dtûwÿ?²;m�ßí#w�‹;þO¿PpòXlŽkã�^¸6~¼–R<=¹–2[Ö5ôÀÚžx衇®aíZÔyõ?¹¦tÇwln»í¶Í£�>º&³Ú–Ñ1 õ|5õqZº})Ê0ZðüÀxצés2{9¬”ÊSÖ6áÝ\ú° ´DùPD|eÑn Æ�û“9 .î Bݾ£í%Q%¢”å•Ö:ÔÑ€/¸Ëöy‚¿Pª~®UÉÀ~y8 ljc výÃ7ዺƒ,rX£=²Ïvû�h@å±ô!T;Îp¤UöØ›ïþïÞu£�ºG§uy ÖÕmÍÊ=@@óÜç>wUVöÀªšã`Æ|éK_:˜î£óÀ½÷Þ{TvÓì� y*ÀÖ�yíñÓ@žôûŽ=%bî;åžÒçB€§·s` …ÍÁ¿ƒúŒ Ò‚9øO}ì)AIÿ4árÂì`-˦=¦©øÎ.e;rYʃnZÅj—™±´íd}ö„!2Gܶm¿u§FÛ–{ÒÞ£Ëg-æýñòºþÝþîcÙgºÿÏ£~Æzü»wä¹Ûç£ù<ãümOKö>>€zàN_¨Ü1‰Ú:^ðöá�=°¶»ÿ¸cmw~ÜD7¬ú‡~X¯‚\º4p‡uã¥ÛÇiÏÉl†�˜�Aå0Þßû¿¢ÅCäæä/Cû|š<%rsÀ?¨I#/ƒ×"kÔ–A^Hyä'Ç ¬ÌÐín”§âÚÍòrúJLKËæ0}[ÂIúf‰m—N©¦Á‘uÄæ9�øL5f;žd�u¹TJ™�ºþÕï»ý«ƒuÿŸÏB¸d{�4ÞʉØ.Ýã>O.jäÀè€7@«?_Xã{ͽp¾úÐõ²–ŽE€;ï¼óz©¸j¹k/W]‰ ^ Ê�`(¢ÜÇtM3Ø Áoz*Bú‚D­à<-0à³£�‘áDH„@IW‚z)Ê@�6§ùŽÿD�²OÅšøt<35µ$Ù80sF¸�?%'ÿ2Ÿúñ“…@%¿/  ?ë°¯þ©7훭ϳe%·Þ°Ì,¼ü¥½)×>™µ¸vûø»þ³¿–þéö�>Ôý¿Çÿ5<ÿmŸñúèÐè€C·ÀBLâçëõ"¯ï�—½ìe‡7baÁý^˜Ø‡gä^YÓÀ _øÂ3ªy«yzÈ Swëk¢ç TO”P_•€óó%ó÷ å¹t�U^Ê| ÷Ç b‹?•QŠ-—6›ËâÉ<Ée€–P¹'èi�Cc˲]S½¥�à'u¦Ž¤å~®q˜ëo¬ÜZyp&eGY‘leÚ÷~þ®¶ÑéhìÙ„ÝþÇ/8¹ßnuNtÿg {<çÈõ¨ŸÏ=þÕYØyN„Fë�^8¬ÿ[û9ó@¿pÎì3wm߃¸õÖ[o°8oÕezÊãýh3Có£ûzzúš|ìÅQ—ñ r!a{Ž—W"‚`@wÿ‡'.GhÏ}£4dPRúÉrP¶Ž\+Ú¡�ð©´lMÙi9ž…&Df&øÀ�â/¶$÷,‘,K›±mÊlAê³ßàO<ƒŠ}å»þcÀÕíŸý¯û¿GX�ÿõŸÿ†Óg£÷@/¼ Ú€óä�ç?ÿù«3wmAßêt´¶¾ÀG3;­×9u®wû#xÖ]å0—à4CUèÔ!Ñ ´µ­Bx2(PÁmðø+&'+’~ñe`/Y™åâ(UTù�<•·= SÖLKUXBN 'eGð«‘g�Ë�ZÎ2äÕ•j�ÒEÛõÏœÜc-É�ú»Œè‘!—Cj³5”ëúÛ'r¤<é6™ýjÿÒ^ãBrÍßíŸþr�ëþ¿½@×ãßc8Ÿ«Ž:ÿÝÄ»\�Vå�^XUsȘ$ëk“É¢[n¹eÂׂðÞw§öXÛë k/ÝSF¤×Cýqåñd.Džâ1ù¿ _ý”AëMµ*8ˆoèCÏõ޼¦…È d«ü¤…d"4@|, æÀƒ»›i;m•JÄ΂ÍåÈ]&ÙX<äeÀ]:ãXºÂXßQM«RãÌŸå8^òë7±¯ê¯’ÂSÒ‰úJa¹v�ð¹®ò,¹±uýÓx¢Ûß}¼:Ìp�tb¬ÒÕ-‹?Ë‘Õý?Ï>_ôø¯sÑç¿�¯3Õ¯Þ½pø6h ΑÖvG“‹Ï—¿üåsäÁ6õzz`m‹Aý Àõlíg.›@žsˆîáëÖ�ƒKdÏA7ÁÕ•§xR~îÞÇ+^ZNý�3PeBÆe•Š2Q\æ(p‰W‚–¥c/ýY'h X˜LÚ¤T2oÇ¿Ö8Lû“¹Ë´À KwfOxÚƒœ´Íõ–Ô�¶—ªCé3¯ê/Ié{Wh·zÛú%Ýö‡qÛ%™]ÿrGxcÛAËö »Û?:S9̾”÷¶û_÷ÿ`öƒúÓtþêñ¿<_Ê?uÅsñë1óÐLWöþÀè€7@«?_XÛÍþÏWÿ¹ÞÖ>öØc×[ÅUÉr×™3;¸% çM~…6ï´§)ÌØoB‡Ÿ Ÿ”ecšg†`nx«$a¼¿›€òŽ< §ˆ 82§pe 9ƒeOºá!ÍÁ4¶sœ0óÒ6¾d®ã°M®³ˆ[;øÆÛB3-òu; ÉE�u8Â%¾�&»ö/8¬éü§YïVã�^XMS´!çÁk{àñÇ?nkÏÈk[ºùæ›Ï¨æ­æéz€€^!fìüg¼ @;%ÂM< g™D½ùŸ Ã1X$ƒßý‹Dp¢Ÿ$GŸŠ“-™ÉSH?�-w–©|•šwÃØç x÷gt¤Ò'y®ÄÆb�Å’’/+f9ØG²îô‘[òàõW±’F^ÖÕ¾Mþ¤MòKÇËÔõïöw¤otÿÏsÁöxšÇ­ÇòQãu:ôø×©æ™žÿBˆOy’×»Ã{ ß[ÄE¼É–GÖu°¶'žxâ‰u9¨­9¨ÖÖÖ¶`vÐÆY©òib§5‚¨šðb®.GЉ™&Ç„:þôW©  ôd;ñפ:x¸ã9äe�À ‚%'©ì…éÒ—r‚$Ú•xj”ÎJ±Dmä”À¾’VÓÍ� ÉiÄM+¸  Eø±Á¾RF�êÂ~]äãGñþmY—¯¥c˜ (·Ú–¬³4J_×?ERÛ>´áž\Ó¾Û{EŽ|×ý¿Ç¿Ï9êÛ§£<i3;ÍÞóß4ÚYƒz` ­°}‰Z‡EmÅŽ¸›éÕä�ÌÖvÇ÷@nhµå�µ-¬mÁ¬;ʶ˜ªé®4PæVL;QÇÉ¿N‚ÿx¯ss)>þ§‰a â)þˆ^õåò3ƒÅü°’¬3�¦Ð5- å›9ŒÕùwJ\N²ˆõÄ“TtQV‹ÅhÛu¸˜À.ïøídG=T¯Š"—\ÛækÄR¿ËŽuñ2qȱ »þÝþŒ…îÿÓ¹¦Çÿtnõ¹c-ç¿ùì>¶Zã‡ô@/Òû{tÇEÿˆÓûæ&�©Öx7³_8Ó.°zek[º|ùòæYÏzV¨r¥=‡�€‚ÀØÁúÀš†ùºÛ|þF€îîWPO~³!©®`úf€#˜åûCð?é¬â—|$¥]SÇ Þ‡«#<ÐRoÿÐ&ý‰;?²2x‚£åsl|¬¿iÊ_ê+ݲ Ûf([8(…Ò»£ô/åc4WhÔ!©]ÿnÿîÿß “/ ”w~döøNGg}þ„Rõîà考7Ap^<°Æš­-à;/myQí\ÛøùÒ¥ühÜEõù¹®WLDñ±>Ö¼íàS‹TRytC}5 ‚úiŠ-&É€YòÈcæ‰Égìø´eJ'dl‘§ »¡�åÇ€œ"Û %„ -nH`²-²E„VÉ�¶!z5I–Ì`Âf±¨à°pAbg æÒaY–/–1¸GîPÞõ6TyRÆ2™’ —®ø3|�H ÷L4!°¦ß »ý»ÿkÌM~ót™ÿ1®øwd¿8-Ï‹5֬ý°Žvh+Î�Öø8ó¾sДÖÄ5.­Ñ¦ Û®²b þ#@" ŸÍ�¡�i˜ÜM�wð²@0ÍùÀ5Ó‹B�;æÄ Pä_ŠŸ Ôqàúù@ò%+¨èA#ñW0é†Ûre£8¶ÓÍg�$MÞKž"N˜ô›GTé HrýS܉ò¦r.�ŒwýU×’¯ü’.Û«ÌNýðIøÆåwò«®]ÿnu=úJ÷�ü¡4ŽÇÅx™Æ¢yzüO‹øÎçJà”t:×í£©€—–§Ò�ؽpàXª¿ÂW�:­ÒO>ùäêìŠþ²:›Ú Ãy`m BŒ™î£‡ë§ÕÌE‡‰]Þ™ç(ƒÍ©|�ÀÂLö|:!Wž�3q®?ÊÃG¾'�ДPÉÊ ~ pùV@” ,ˈ Z|�° íÜ�+=•VÓÐм`€Ô1íä—}£<ÙcÆÂàªdÁeÇØ‚sJ®eMõÇ6‚¶’�8’!ˆ¦ÐEèúã|Rq[—»ýÃ/öIô£�þ­Þ5ïvòË�î¯;CÿœKF3P¦šc'[ºÿ߸ã§C4áÐè€C·@ë?7Xãûö¼_Ý©=`¬ínûÚ$짆ö@Lë5ÑÏ»ôÌN À�2ÍHÀº‚®`àZˆ  çý$û pÈF@B9âäðæA–5�#J 9¿=E+ø˜æ*/»‚[ùESñÅN º±ƒä`& ItÓÈ.Þ¬� NÎRŸžŒ ;ÅM¬u9‘†ƒ©®8ƒ,tö/íU~X $™·ë¿ßrÒ°[ú³Û¿Æ‚ûã¢ûž¢ßôøÏþqÍÎ>q c²ÑÃz £‡ÃúG{\̇)ÂNvè�53|d­S{ÀXÛS*k3öUÃð€b§ ‰yŸ`Ü_Lùð~ë€tª(W«¿D¡ÿ ìw€ ]x@/HJ+eü!¹�dGÈvrYËÛ0Ì$h¤á`“¶W^X1•Á~Ê”½K{²~2\&ËtÊX%åÀ«¼øy*ä<lï–úöÚÛõÏ6Âuöµý/Òp 3F³à»h,`Rç± B�»ýÃÕG—ý±û�õÉ?Ñkè3îrÐÁ+_y|L'qއ´ô÷Þþºæñ?Ô¥Ñux ÖÑmÅ9ðÀŸè¬�ƒŽs†&®mA¨ΰñŸ†*–›ù)?å!c xcnÊãÕÌI™Äš„Æs9)ÍY«øb'< º{o)éI�àÏIk==ϘøN€‚°´Ä�v§¼*‹nh¬Éä£'É+>ì@ }–¶}‡KõB¿í v?f¯âËrqLÉ—äØIé»�W�¨KŸü™ÛÖ *eUù®ëßí_ý�~â P.ºU÷Æ�¼QãrŸá�È Öã?Ïå>UºN翹aäþÞ­À½°‚FMˆ¸O_#¹ñx`�ÁÌÚ¾4Ó mÂÚ„Ö8fn貨¼&ÁHrç´x˜+ÎshúìžV•ÖÜ:°€šXr)ޛ⩲¼À�¹5¯ -”“ˆ‚žc]@‰|ŒLÒds2l±¹L¬ �îP¡o( òp»˜Êλeùûd+»,ƒOH†Þ¦�Ѓª©~°‹@©¢#n°§DCëëú‡¯ÂAsûÙq —íc·ÿì0õŸèR³ÿª¹›ÕؕςÖý' ãS8»t˜Ç½á�6þãDîX=¨Á¡=Ð ‡n�Ön<À ›w¬×ôÞ}/œ›îs&†®­?¬ñ©™3iˆs¢„É(ÌÌ<1�'ôL^“š\æÈ;ú5¯U„à»i[«öù-�È á<À+ü€Þ(|ù¦ËÂÇo8b“l‚ÿ@ôjBXÇ�'ÍR€`€¥1SéÈ"–<ž²Ì.ÎÊ£¼ù î4ðŒ)ôÊ#“þÈd§³=¶]õVì2Mb‘‡î’À:‹ßÇ/›Í�ÜH–¸”•zR~e 6Î-J^ù¢ëŸþ«¦\”á]ø½Ûî¯rËзª÷9û•ûz÷ÿtÒ¾ñ|‘Çÿt"óøixpôÀÁ›  8O  YÓÀšl9OíxQm][xôÑG/ª«/D½˜Š>õÔ•¸;ŸÜ˲ÂBæíA×Ä=‚C"/†éùÍócWÐ~Å�¡ñ™’ò…è�UÉŽ¸?DÄNº“¦ã`3Ì%({d@vJDBAiÂØ§þ ÂãP²-ƒc‰�Ù“?êO¹Ì¼t¡ê¨ðªG�dmµÕgZ–/Þcð®ÿä={t‚n‹nÿêŸÀæ ú—(ênÝÿë|qÊñ,õøÚç¿8ÙeÇTïëÝ<à§ùÖ`KÛˆ“Lÿ®ÛŠ{ÂÚîhÞvÛm+öV›vÖXÛ+=ôÐY» õ]•ÈcàØS!iÍÓ8˜òäWÁDðæ]û(Æ‚€¸|ÙÚ3Ç þüò ‘˜vWè‹ÑD�Ÿ4UiôƤœœ„X±+²MúƒŸÉyüÉ&äb[Ap4O°ødMñ¹,�¿üO.Y…ÑP̪I0T’ŒÀ'y¡G4ÛŸìÊÔ•L|†§‘�-ÈÊ®¦�m¶Ýü. ä/ÿ‚‹¿àXÖò°}¶,˜E)yeŸl \ɾ®¿\ÒíýE}a†s¿Ê>…£–ý‹> Íý™~¦~JS?SçUIJ�}x,‹ ÉvÃ@’¿àX6m‹ %Ã]û°Aò&{¢€ìª’¼ÿGÝ×÷;ÚéúvßO¬¬éã7³¿¼2“ÚœÁ�<òÈæùÏþ@9,Ê€.^uñ8¬5­ýÐXÛ<ðÀ¡]Òú�ñ€'¾úÀ81¥LœSnÒ ø ócmÈd˜iîM—¢x”S88ïû+“ò A»Ä�}‰«ÅˆAÐ+:o‘KÙ”—yèK½Êܳ+­Ážå%cÀ¥œ:I : xNêa«|ô» üa¶’¡ó&þÈ-Ù²ì1ò°u¬•=RŠ�ö®·!#Þõ§ŸÙÇ8§p Ó€Ûï†ø/Û°Üín¸”]´že!•¾¥¼nÿîÿ7ÖøïŸwVû €•4Ä`F’ÁkC|ðÁU™Äß[n¹eU6µ1‡óÀÚ¾°¶ñr¸–Y§fÝi‹IètבÐdbSœSœ€�ûðùnè♪¦û[Y8Jë~Ÿº’BƒÔ;ò³Ég¦ ÈLŒ#p8}; ôjâœvOËŽÑ¢R$)Ys]«<²´ÉÀIœ$‘Y²£lÁ4˜ëÏÜ©„c³`%¹(�Mu.(<ˆ†áµUAá!Ôð4 ’·ë�ä‹ÊÏj§¹½Ôdó¡I45ÖØx‘¥”¹ÙU�†‡ˆ�ˆ¡f±ž³ȃë'þÈ‹'’à1?wZ½À�ò2¦—²(»€¯^'@N%ž˜%"y% >âºÊZÄwYË'Ï4Ð¥<Êɺ€J ¸,¿à_pË´eý·ëJlê¤ï8{CC×?´p�úkxÐ}T}1xÜå–ù8Û¼éøí½øK§sŽå&é,æ�ñJ¾�±ÀV»ûì´¨^·µÅäÃ…ƒ–í«¶˜Û?ÎãÛŒÝmx/¬ Fb WÉF‡¬ _ã;ÍÏ{ÞóVæ¥6çPXÓbГO>¹ùÒ—¾t(W´ÞSx@wç5'®É]FíYÒhhšÌñ‘>øò5žÐ/,'„ð*1ùË' òI�àÏg2;òrÑ  ÔÓ¹@ÀÓQ¾>*˜K2"Êÿ2@Pö<áÜp§æIò%/èÖA ã@’|‘uÌcí'ó¢@ò8 ¨ì ,ËïÈNÑ\BŒƒ£ì]ð»¬íµÃõwý§6Çg;í³ðO5‹›§Û¿û.8ÔùÂãÎðÄñç>7€Ûùÿq%èØÆM¹Ø +i› ýžŒ�±B¸ÆoÜyç�+ôT›tð=ˆµ¤Ïþó1ÿñ¬x-VµKÐBØ´Õ¼ WMà#ð�'Ãþœ€òȶlìÇsÂÉÏW�©ò±{Šg^ãzÚ�¨’lá8xøc²’êîÝfH9%#ضs)gÍÕWQ'Éx泟¥õmª³ -vYVDäÂ;ÉG u-Šq袆»XÚfèúÏ}Gm{Š[PmøÔ&Æ3Ÿ}·öy¼×ý¿Ç¿ÆÄ)Ïñ:WÇ6 œ¥^XQc`Jÿ àÊda�4GÅ«®9^däpM?Kx´ÒÉkZøìg?;ÙÕÈJ=@°S�¬§öõ­¸2¸‚ŸàÑb¼Q%¢*…VÀ ‘$M,ñš€ž`¢úôê@pç"@je/Q艿é›Y«ü´àP¶OÛ"ßöŽ‹PÒ�©¤ÿN@˜LÚ³;Q^Õ–ƒ¶ô‰„,ô9HwðL6žP?ÕÛ2`éD{ü³Ý¶)3~¢¼©®.Óõïö§/T�^ô7çlõ–àéþϸ‹tÑÆÿ¥þ`6ìzö½°ž¶°%½JfO¬üóÀ‹_üâÕX× «iŠƒ²¦W>ó™ÏÜmÀɘ&à Î㈉çÌͨîøiRÊ;ÿÀ'§%Àëe„ÀCFòͯ 葲H¥f Ð+@˜b€Ì¾šÇÆ ƒê¶´ûô¾Ñ߯'Ùo ÙŸçñíݱMŒÕì{`5M¡kÑSñÞl’õ´É^Kþè�þhU ý ÀÞfº!‰Ï}îsWSï^XMSiHõÔk¢é ¨¢£œv"@wå5­à)‚îâë»0ðmW)‡éjq £|J#Ј\—•>9!J‚˜ç;‘–ƒƒ/*\m—¦ðK|MÆ—=R˜x1`…kD‰]};Áe%©êw”¾tRù$ŠvýÓòCø£Û?«ºÿÏç÷‰ÅHËÃÅxëñ¯Atfç¿+7M >ãîm¦&ž�zàì|}*Mqqë€SyêpL÷ÜsÏæMozÓá Xhî'¹�_ð‚¬¦öý ÀjšâHC4uŽ�ÂÔ˜{­P}œ0~%Â_~Á ѨÖ<æÐ–�ñç�ÿ)@ º¿`š‚ÜÁ:Ø9CL}S6ö� .b覉-v–DZ’eÄ�_u˜_gnò½"`¼ÊȦÀÓ¶`¼òKA²ã/õOÞ‘Ÿ¦òpn•�ŠîGÌ[Ðu,Y¦é0v©gä…YXÖõ/ÿÐîø§Û?b_¸¿A |ê¿Æ+¿ %€µû�ÿêtŠè&ý@±¢Ô +j Lé'VÖ {Ìa`M‰ �oðzB§×ô�µü"ßÊxøá‡oÜÆ8G5Ï_ž�ézMä'HLÕ_BeÅN½&ˆ•4ù'ÀŒ<ÎJù¤@|ã&>  GùƒÎÏ:D¦˜îô+£´(ÚOA,z°ÇúŒ—�Y$K‚;d•5ÈÑëGÈC’3—ìŹøj’¿Ì/û¤ƒ¼¥>Õrª]É¢ŠYå ßr±³dŠd¼ø'ZñwýÓ_Sû,ýµl�E~·÷ÿÿ>û$4ë=ÿ]Ùýàtj›¥6v–耳ôvœOCÝOÔmØåË—7/zÑ‹6|u½Ó�ë^¡/¬!õÝÿ5´Â)l¨ 6ƒû!ðŒ¢žàqÙ"ö$ò¾~ªæñ4q>'*|RÀšûK~ ‰Kà¤izmÙÐyv ƒ^¾4>öè’*1ÆSVJ÷¾Ø–éT(³ :x·Íâ� Ðü 9v¹Qxà{ËÝåe_”Ÿì#À$´ï,ŸºR:a°é(!Åd_AŽ—ùÐÆ´äïúWËtû«›ìí¿ô÷êDÝÿÃø£ÇÿxZ™ð½ý'rÝt~ ÿ•xxlÎ.bƒCz ç}�“- â €^ØòÈú{ì±Íý÷ß¿yùË_¾ã^úÒ—öÀjZã0†¬éU¾“Ñéx@ÁhNú=Qs€Ïä7i±/>޹pqÇÇ5A&lÝ–ãoø €+Áǯd`±Ù\¾é²p=@Yä '`J‰�¨”8˜xÐ]ü‚SeuXö@�„Ý`¾ð "“ÌHÎKîà‹<Ѫ|rÍûý‘eYpéÎØ8>0Ùù;hê�=Ô‹òÚÏ�²Ö©ü®¿ÚÜþš|[í%_†£€òxl[~ŧÊ�óºýÓ!Ýÿ{ü_Ëó_< :Æ6v5úÂÓµþÊ[ç®âbÖߨuËê(k{ àe/{Ùê|Ô�­^øÂž­Âc´}üã?&·³Öâfa¼ ŸöS(”�ìCw°TPT�©x× ®‚P¾Ü¯,*® ¾2 �êBt[Y~K€2²¢§2•~ÑþöÞ=ؾ«¸ïÜúý$!ó(Cx„ˆGEJ< H&6$.Û�”í'v*þÃN줒ª8.—ËU3SSóÇŒÿ˜?R•ñÔ¸;.ˆËElcHRP6˜‡ÁXÃKX"!ñz£÷O?ý^wúÓ½¾{÷ÙgŸ{îýýî=çÜ{{Ý»w÷êÕ«»W¯µÎ^½ö>û@·Ãmh0ã”ùÑl±ѨÞ>ÉÇ·„Ÿà?:àº>ãôºèEFÓ/[�ŽS�2%á�ßµt= ïë[Þë7~—Íø3.ý½-Ø4ÑÌp� $ø'øÑávt}Æ#8£Kö%¨v ºÊI�ϵt= ¯öý^ýoc¦�=†3®ò™191žz>æ@H5þ?Lø û¼4èþ¾àù_±M8|sε°9}á–ÔÀ†uÈs6m€'*mlÊ'Ožìî¸ãŽ£Ý¥õ¶¨ã®¼¯ð|ulK=z†{¶- ¹ ßsÆwíY›Û‚ÛDðd¸2H¾�4:O dšÊœÉN[v‹(tbB³Áá´üñÞ탛(¢„²·2Á\×åon?8<‚SüˆöºŽ$Üd¹žVŽ nG‚Qä�•öFÁ^.t%á�7ÛîzCAµ¿ùÁû£ú¿Æ¿ÍŸ+i,ø\3ºÏ´ÁáÌsMü>-™‹JÂ�vøœoð(ÎóhÝÜÔØØX_Ø�Ž�§OŸ®I"gl0üÊW¾²QÖÕÀFuÇZŒÙ”1Àܨ_3]ËصRy–º„‹ýBXRX¬²9ÐÊýíÿ¬e­áþqÍ,kãßk…–|8ÍûBþ�Ÿÿæ+›?î‡æ;Íyü)\óun>�æ#sõ(Íûü¯Ø†�²A©žØ Îh¦äïÉlžue‘{€wÜÿýã�¼àcK²lÊ;)êñÿõôÿùhe:ógwòYÀj+ˆl6 Èǽå0©Û'—e9ƒ~Ài8�¿×³õ3Ò‡øË¨F#áð€a^½Ý1#oI¿6 >_8£ WrN4µ$EÀ´Øö6»MQëâ)üMJ“ÔÅ�v“€­Í‚^bfªÝ‚j— |!(º Ú-8iqµ?ú£ú¿ÆÍÿø¬l~àsÃÿûϽýûü»è¢­©Ø¦}hÆT­ój=P«õ÷”6&@? ê €)m&í _øÂÆöÔ§>µÛ¤ï€oŒcŽ�!›²pË-·!¯ð¦Ú‚�;ñ ê¹ãO�釕Î9’ˆ´CA¶óƒ×E¾$géal&påÓp掙×1ý)��ƒ¶a4èþ'h9l€æ‹[ÇÑ n�óš0ƒü ¶œÓàõ£ñ».êxÕ€àÞæ]�ñ†}ˆw-.�†xíÖ`À¢öS�rÁŒ»L—k²Mr´µÚ�ÂÕÿòƒ�»6ó>2Óø�§Q}œÆØŠ1NG¶ ë1Á™ºÆäµ�]Pã^pj|gZÆ]¶ì4ÉÑÖÿø!|±Yãâg}üÔi}¨ €õù~R³MÜ©]²IÞ"®×7ß|óz iñ‹_<¢Tö¨xàYÏzVwÙe—­½¹<ðÀF=³v‡lº,=Ô CY8’ül§( ‹w-,�ÉN¾]À"œ¯ X]ç.#ªøÝx©ë‹ !Èíó­¬×ݰÈ;gïà)½;šÒ¿t£€ƒ$®ºÀŒSfI~P›‘ï@;�(>ä4Ýj¶ ÙS©YØûF²�^?ÁI{­œÔó7¼Íj·`0:¿Ëju{¹È±?g‹V‡\ðfGµ¿úŸ±àcßJ�ßB ?Ôü÷ωí>ÿl·¾àŸ°›sªw¬·/†ÕL³Ã¾;ÛÞ¦´^ÃJûr|ík_ëNœ8Ñq÷}7ÝtÓ&˜R6¬Ø—_~ùŠ5N«ûâ¿8]PÔ�ôßgQa¶¸ÇZ;õwYàBj�bîìsg>ž°RË“"0~½€º¼3Àe¸TguÞÀ¼bÓ›lòwô#þFoføY–�Y�:'ú |›�¢5)½U½v jÐmom ähOH Ý$Á9þVWå™·Ut ûÆòçùƒ] v~;…-XE§‚}áÍÎ�–Q»{AMà\{¬Nµð·úUpÎ_Õÿ1^Òø“¯fÆb+÷ñìãÒK‹Fw*h$ç·“8|³Ÿ×øÊÉÿú¬�Aó^°wdsèÜx¶:»™ÿ¦«6¢'6æ\O¬¾+˜3‹Ò–} žXä� £ó¢³/}éKcU=°1]±rC6åñÿn¸aåm/…çï_Ø©_$û’.䉯�a_LCNwùn?Á?eÎk EÇá·?Ö�@ê þ™º‹´’&×å_ðo\0›žþ ÁÅ|‚޳à…fÐáζº�²ßè¡ß�„{›’}ÔQ=Aç1m=lm ÍâG&¸’t-”oŒ.ß íÙ º=Õ~|½_ý_ãŸùã@ó^°æ?ž1ÿðY¨Ï•ô™–?‹¬ØS¦Å<‹ÏžEõù¬ƒOñÙ5|þ¥—Ò-Si}Š·h{à�ÚØ'î‘üTÖ.Ù9tb6ék/|á WÑäÒ±�Ø„¾¿÷Þ{ëçÿ6pl,3‰»æ¶2ô…[„œp²Xd1KÆ�2ЂÓË[€m¬m�I�¡nÔ±úV?žL¯ãZQB4<ê’ >Š÷2CGü^ì§&×ëe|à˜ÁÌnOÀÖVAµK�6�3Í,oÎãÆ‚Y Z»}‘ n"�†è?ÀÉ‹í$8Å/¬öãóÁ'‘›9·>¥Ï9èkAõ» ú]9½ÏÕï‚­ƒ JÕÿ1&küÛ¨:Šó¿[øõf}Xiª\‘ê++rôNÕ<ùä“õÀN�µ|<ò|êÔ©îÒK/]»5O{ÚÓºç?ÿù¿PPéhyàû¾ïûÖÞà믿~í6”»ó Q`¬ZV¶ˆ�H�K+6øØ8�/l[-˜Œ�ïñãå‚Ȱr~ �×¼îУ' ¨ï66^ÙK}á@’äI¡y-5Û¬¢Æünl”¨†Û¨ŒƒF ?5´ìXÞ2û\n˜*³úÌNÉ„A8�´L~µŸ­þ¯ñïÓ… Ã$ h¤ñ|b´DŒñÓˆ>ïc<5�Æ«ùßÜ1öçøóÉòusSƒiC`=°žŽhSf^ù£�>úä<µ(›ê�“'Ov7ÞxãÆ˜wå•WnŒ-eÈj<À 9Ö™¸Ø×À:{àéãpº´¨ûâ�ÚØ·ž¿Ð|� €š çï•׼öÚkW®s‘—¾ô¥‹ŠŠ~H=° wÿo»í¶Î>»©‡s³"ˆ¥… ( ì#žVÀ!jpÆ¥‰¸¡”ß.W îcÙþäe�JàQPñˆûÆä ñ´WŒu¸8ÆòD˸Êco9±v`¿ 8IÐñh´û!|1Û~¯`•¤[ú ‹–q•�!@›j?vºŒ§äeZÆ{=´›? Õþê��{AÆ�æ?°ÆÌNù�™Ip˜ëm–y1¸’p•�áQ›ÿ§·Îä››8jp–œVp¥¨¯¬ÔÝ;RfŸÑ[OÚÏúÓkGæÓ7¿ùÍî[ßúV÷¢½híΨ'ÖÞ+7`6êîÿÊ»}Ïzp`‹{ƒ¿á¾!`y°þh¾AÊYÀF \õ¡/Ü£ »ÕêŸHR@Y‡ÇêÐôkäI�Äb]´ ø™ }Š}Ÿ�ATw¡<ãžoõ4 ÁâœQÖ23e²S0„ôÕÄ+¸Ô^É4IÕþäŒÞ³�,õ'þKƒI¸ R¦ðL MÃy¦L¦ †ÀžY¼‚Kí•A“TýŸœÑ{6�¥þÄÕÿ½×ä A ¦pÑÎl�{ÂX*èï=¸~¤žXLY°Ý£2SüE[³6å)€g<ãþ€5»£Ô¯Ð/yÉKV¨m^?…¹I_ƒ™·°(‹<Àr˜ûó¾.³ Á÷ð@ Z±i!„oÐÈ Á¿’ßõò …`‰2^Ø~í¶ïð# {8³uà9%i’ë2�êƒ l‘·< ’ÑuJŽà´¬Ùúj›ì£Žlv¼µ•@ƒ#ÓÀ£õòžhà’%ùØ”�‚ð/O³öGÝÝÈ›­öɺÖ>³O)·9ã*¯ö}ž}!ÿ„c¨ßÕ³=Tßkü×øgüíßü?5ûÀöC³JWâ�ÚX‰›w§Ä.޵°;—­�ûsŸû\÷Älp®?½ìe/[¿eÁJ<ðÔ§>µ»üòËW¢k‘’�üãþ"ÌEåEß\DP¡°›;è,#)àèC+ôÇ÷[뼜,tµmƒ ]âσpT�‹OC¹M_üQ$�’„%¹<’/8•YÒ0 ‘<Ñþ�!mÙ–V�vó×Úïõûö‡Uƒu!ª’Ú ŸÄb»Iu6ðEI²BÓ¼üq=É’ü1¬öWÿÇa,iœ ÖøŸ›?5ÿ/èóïLÅ5ã�èµçk`í]àŒ¯úµ°ý²c+NŸ>Ý]wÝu;æßOÆW¼âû)¾do�èkë0‹_ÀØ”§_ÖÑþƒ®3“j‹B€qÀÉ8ó‡ú�!ž0D̸ê2´àÖ mm gØØ<€¦@ô˜IŸµE«-z@IDAT!J,:óû´([gõÍÒ"‡&ùc¨²¨7†_<^—À�¿À{™áCÚÞÙ®ö#kÜ~hJc~è¢Ïöú$ 8õ‡ ñ„¼Ù³ÊúºÕþðcõÍ™½öl?5v�ü1®óXÓ(¤ŒÜ®rJ"3Ô,³Ãу~†KÕ=þøã‹ªd£=À²ÙÞÎì6Æ‚[Ëîy³c!ôþI€~áMàªà5ð�$Z”BÓãýàZdKÜQO”X¤‹O0J%{Võ%Cp�6`* î D¸Le‹ùg퉚¢ Á† ÊgÛ3èÊe‹ù%»Ú�'£† &|¨>›õläT¶¸?gk-çŸí�¨-ÚÐ׋ûsVŸÆÆb~É®þ¯þßüñjëtÅ5³S|í¹ÚX{LPeÒ-›M¼ï¾û6â§Ð.¾øâîå/ùf;«¬»`ÐÏW]uÕË9_gÏží>ö±��oõª· ÏË‚ s¥û]|…$<ðo¸1EpÛQ#øUÛ¡ñéî?ù gÛ²÷¨Œ`+,’ÓÆª8²$hÚL(K]�ñ pŠ  VªÎT·=ÿò€±™Ó[º¨u8eÏ,m°%ú$z°Ú~úlÑx|8ëÛ¨-_þÝž?úIêÇÀCÚüyž_õÂÞ¨1ŒÇY[û†1;[·Ú�ï¢?f<ü*? ¾ü;Șí y;êVÿ‡Nž9UqÍü´_+%_ù×jÈT>|² �wšÝEÎ?—1”¶ñøÀ>Ð�9sfív®ûÎðÚp àÖù¤Ç 7ÜP?ýwÀÇ‹Y¾°%ªw ãra8äàÓ¢–òX ³ ¾ P¢â«Ô§†ØÜ]ä_0ð e®ÉOƒ|éi5$ý³åa«ôEYX4ð![I¸ô‰˜e-â‡.`�ŸmH‘Ü)~Õ“=³ò]‹Ê%[öþˆ:IåâU}ÊÀ•ÆüÐE Ÿ*—lé‹>ع<ê©N–…ݤ¬3ã* šúÿÄ¹É ŽJu^©j`¥îžS¦™IAžµS6窃Aà·Ð7á;ÑëþnøÁè­ƒmå«_ýêµ5€¯º|ä#Y›þR¼W.;~ŸÆ_j²U¢‹ 9îÃk¡ê/Û¹li+!jÄÂÏhM&ùa@Z8¢34¥á–SÝàrKA]ž#“'Ér„¤€!?ðÉÊÍš�r##Ë̸ä�í�.x®“qÊ( Z´~À£tê,Ù@êÎËKÈó ùÌ•qqŒí�.x®“qʪýÕÿ1&jü‡òœð 2wÒÜrà?Áùù5®ž92>æò™+ãÁñøÙSÜØ¤@…CÕÂÖâ�ÚX‹Û·UºUïØÖ?_øá¸;yr½{8OúÓ»—¾ô¥ï«2ðüÑÝ{ï½{ ©D¬×¦Ë†üR/JHÛ’m =Š­\k:-.ÛÝ{Õ6Æà!,_Uwv-غDÙ4¯“ììP”5#{{2 \¼ÀŒS6Ÿ²ŽŒœc}È„¶Hþ˜I¢�g›2N¥AfÖüßýçß¹îÜ#6Âô�6l‹èc¾Êï±j`�zâæ¿Ýac²T:x衇:îš®+0¾éMoZ—úһǸúê«;¾°êÄû,Ö9ŽWÝÞ#¥�¸Ô[Öõw͇ö—§#H·*l 8cÐpr$ô ³ïñCsùŽQj©=â?hAV½‹:ûþ¿G,ÒG93ºZA㼓2BVà¹ýj­ ]iƒÒ™aæ�;ø�‡‹ÁXÀŒG)çY}¹Í¾Ì;HØ«ö‡wðCø¢ú_~`¶F$—ÇøøÈ<”�ÿšÿg»­º©ÉôذTÖ!˜súôéÚØÀ~9_“ÖýU€7¾ñ�õ2Àóí¼ ªGÀõæ7¿y-½ó�ïì{ì±µè.¥ûçî­û÷ëm�Ï2•@‰Å?8�Çþ�Ã%¾@pNÀá9¸xU›zÔÜêÎÙ!¹A�ÎÔâ€s€â-ô9—é•nAWm…‚ð!/�Cö…ƺ£Í,ÊuhÒfÿNŸ;3ÞP§¨³ ®Áµ°§›J?I0r-ÿÄOÔ€”â…Æ‚1B~‡†‹F« éâ®·K-dÀOÒ�?~ ÝØ#I¡Ãëa‡A3´À‡¤º¡�a™Ú'zÑ3àÁ'A‚è\í÷IáXå¢��m&Eë«ýÕÿ̼÷‚>NFã�ì0|(õó r}@Æ›`Œ{h5þkþïöóoëXÿT³W ¹Ù�<Ê*­Ðµ°Bg�TåÁž'Å–ýÄÖx·lTµ²Í|àOþäOÖfö�üÈ�ô ÒµQŠÏÛ,Üþá?ü‡ç]ÿ|+Þu×]Ý{ßûÞó­^õ€øcª¾ðwŠÇàþ@ƒ°À mHº¤Å–@,íîÿ9£Û?œl"XaAD„úàJØrÉ“Ä!;��»$ã€Ovj‘PAK†.[ÂÉÌÈ0í.* øøðƒ:ËJÐ,ôlÀŒ_æEòC˜÷A£Ô%:­§~µ_ã`¶ïÂcásó›¹jê€K¶S¹süêW¿z-ºKé…{൯}mwùå—_¸ ]H°_#éþàþ€¯$í¢V±,غËâ_Ôz!mèï&Z”ÎA/\0ÚAÓ n¿€ðc|_Àu´ Ê”E°‹nêÁ'½Èg£€ª�{uØLH,¸É ¸ÛŽ|¨‚°›Lh’?†!Ëx¨Œ=ôZBí‰6CS™#~jBÂ’&+ì Â�ð¢; xˆ N‘ ³¥6ÓÚLGRÝžj?>Á·SGø¯úßÇL8ª�)wš�{÷ž ©9 ²àæÜ„ÄHœŸ¦(tÕø×¼<ìóÿTwf»—C¨°•z 6Vêî�)»÷Þ{ë €�¹êÀq½ï}ï[ÛãÔo}ë[»‹/¾øÀùì¨|饗vo{ÛÛVîÆê�wÞ¹r½¥p•°Å¸½ŒO�&pQÀíA§-î §¬–-æk¡ŽR{ÉŸžð¯¸®(޵—ü¹,¨A„ŸM$:¢^ÈVàM[ÁÉöÐpÙäp«�úÁ)t6o#¢î…üföš‚)Ú žÛ®¤¶Šºh�gÈ´2/oÐðjŒÏêÿÿ5ÿ×ûùwúÜÙñךù¸ª´fÔÀš;ÀÔç‰à¸=.~Ò.ô§ÖoZY°×à7Ôÿ÷¿³Mž½½TÞsŸûÜŽ¯T:XxË[Þ²ò7ÿóâÊ�üãËQeí®=àA£½¢�ä�¶]Žü‰}+˜ˆ!Fl¡l Fý’eµ 2\ŒC¯k<¢E »xáçÅ€@Î�5.»óõ­Ôer’ü€’+5eKH$0v�àNøÝ« =jOÈŸ•!žÌ?Ђ·9ÈÚb%ÞfA$º¾CßÐfø2-ð¨²9#…öUûÃÚ ñœ\Df‰¿¼?Œþ®þ—f}çÎl>Êþ’ߢÜr ©ñ�/b(¦Ï?s ´a¼ sþð}ÀÀƒWÞ�í“Øl„¶ ãÿäÖiÝÔœ™�ƒí…­Ãµ°Z¯/ü™nñýlÆj»fuÚì%�ÝïýÞïu'Ož\�Ò¦‰`ò™Ï|æÊõ–Âóó_ÝXõ¦Í×¾öµî]ïz×ù\µœ.²ŸéÓÚ<s¢)±€ä.¾—A³B½Àï®ú²5¿¾�z½H_¸øÇ¯DÁÔ–÷4•\Yò6èVpŠì!¡·Ý„‡],�‘’l�½¥àoÖ Fæid ›úDTî¼Ãe��Wk'ç‹èvè/tU¨ D‚‹jÐp6â ÝArP&xÔE7‡khÜÛÔ xØ0ã”y¹ÕT»õ¹/˜u-Òm6NLsóì$bz�Ć89¬öWÿ3”5|XÛd¨ø˜oÐqF“30®¬®• ú¸¶1'Xãð>q¿˜ïñ£æ5¨y/ˆ_åk`ÆÝéÎÐ0æ¼æ½à†Ïÿ[§Æ_è›UÈúbýcÖ>jÂLyèÑn¹å–î¿ý·ÿ¶ò]}õÕÝË_þò•ë-…»óÀßøÆ•öO¤üîïþn÷Øc�íÎÐâ>¸`…j‰3:‡_„œlxƒpø"¿Á¨¯1ô Òvñ¢�d›ñôrÈù&€*´—Úz×¼Ô� ‘¾Xv!qŠ�lˆ2-œ�‹BÐq; ¼ÁiZÇhq�Ëí·"JpvÙ f¼qDÝ,/H›Áûö[÷ƒAì¢X0ãnsÞ§lC“6’©ö‡¯ªÿ5~b¬·yàc-F7C*†U�ù!<ÃLÛn¾ù4ƒÉ“¦æàÏ£;ÿ9sBñLr O€ŒgK¶Îž�{iF./ü�xà¯þ꯺?û³?[yk~á~¡ûÞïýÞ•ë-…;óoüÿéŸþé�1ï—}ÞtïxÇ;º»ï¾{¤•ˆƒãÐ!Õcú”Š®ÈÒÂH , Ë´.4‰(‹`\¿àeFè¡_ý"È@„isQ®Ãõ„m°ñå/7è&«‡ÈEFƒ�¶XE¸­˜q•ÏÃàÿxžýHQð­€ ð�¶8n§Ð>ÁØ(öíG'łޛdÁ¾Ý­MÈÏmθڕۜq•ÏÃjø?ГÑŽØ©úß°ûAã^°÷î3ü†×jüËš÷‚‡}þ?pêQ6bÀÎÀ¨´&ÔÀš?RËd˜™¶ ¿oÄSÙCê�}èCÇ*Ó3žñŒî_ü‹a‹óúX¥ßw¢‹¯iüâ/þbwÉ%—ì„ý‚yX´ýÑýQwë­·^°¬pÐ<@ j—þýˆËø˜ÆâÕø¾º�v²aÀêžÇ÷=°÷ 5dPß¿Õo�›ý-pØË11MìžÂP{"�wôºY€ánwƒŽSà w1§^ƒË…Fƒ H0lÐæDø(·?lž �½ýVä/þ‚{´ 2H!+ôƒçöGs¨d‡ó7ØÚ �6«Ý‚.xî$åMžgí¤l‚Õ~ùU0‚Wü«þŠ�!ú/6è󨰩þ¯ñóJ~8êóÿ«'gøÄ©´FÔê=ÎÏŒ{Þ¾ƒ;5aÖcmiÝwðÀ_þå_¬à¥/}i÷?ñ™TøxàŸü“Ò=ÿùÏ_‰%,hÿðÿ°»þúëW¢¯”l–<´&ˆ´Ã¿�o�Ô€C oü� ,‚ÃÀy¤ŸÅmFQkˆâ½Vì¿3ÁÂ#`¢4_ÃDQ€€–ñr�¸¢Àó�g–™t±f›`ÆØŽ"ü ²FæÏ%:FU(ÞdÄØáâ®¶9 f\åSí÷J˜e >ÁŒ;1JÚ¬lí¡GôI@µ[�–ðßÃù¬·–ðC´»Ú_ý_ã˜÷5ÿíbŸzÿ§õ³Wp礼`.+|Ÿ=PûìàmÄo7à·N�:¥ ³�ˆ*:Løïÿý¿wŸøÄ'VÚ¤ÿñï^ñŠW¬Tg)[ì�7½éMÝÞð†Å {XB0À�~ò¯ÒÑô€‹\‰XÉZ´¢åÁ=B ñh@p‚žp>x­8¢8H�û6ƒ—E0ÙÊŒB€éuºÞ!à²l‡Û$Üë6¸›ÝxÀ#XSëm…jÌ.£AowÃ]0¸ý�÷ö5¼¯��©Ümƒ{ÔþhíüÙåÓÌög¢:ê{yÕ~ùXýc$ü05^jü×üç³hÝŸg·Î=üåS÷ò³æf�' pw†:­Æµ°?ïDËÌ$¨ €�¸ìðñ¼ûÝï^i@Æ�¥_ú¥_ꮸâŠÃçÌÖ¢×¼æ5ÝÏüÌϬÄjÐüÇÜ}æ3ŸY‰¾R²¹ˆ O¼ /BO[‘1Z¢9Í2t8>ä|±iYcžûê.ÃhþÔ€»#ë¤É$X¥øq7¢—eÁîzõà�õdÂ)Ä# ¥LŒ`FÚ>n?í" fÜÛL‰±8œ8”*m˜j`½¢I‘!øÖã�?^O¬·oÖ¢�‹�d_{íµ+ÓÏwÎÿí¿ý·Ý _øÂ•é,E³xÉK^ÒñbF=ê;[º·9ÆØ»Þõ®îÓŸþôÞ .iϱÒ÷+_ˆ“…¬%_Ð6x¬†øÝx1÷ÈÞ.[þwiEÚOÚz‹cÆžÕÀèã3*I¾PF¶%¿—aW¡=ä3‡|Áu mð… É [d“7ÝO4×�áúw³Ü´vGÚŒä/þ:žìw=­ý$:D‘Ûp²~jsµ ѯl6UÿÇx®ñ_ó?>÷䇸ÌjŸWýçå0‡öóóïÉ3§ËØ'Ÿl}ÊxO,du¨ €Õùz‘¦ÉI`¿Ç}Ï¢ E?Üà"þž÷¼g¥¿pÙe—u¿üË¿¼²ïžîÜ]ëxãÿ¿þ×ÿz%/ý³w‹tï|ç;»O}êS»3²¸©<ÄõU™¿°ÏZÙÂY ªä*ewï�, Šã€< ÐÀUî‹OøìE£Ð¶ü‰gòú~›ºä7÷õl«[B~Ná®ÓmýML£„*ScIµÉe€ÑV¸¢ýÑVÇ›}Þ†Ö~p×+ˆ¼†»hð`r˜q•‡OSû­ŽhYÖâöYK‹Ë½XêgÔpc½8d€ÒVÁ¾ÝP«ýý¸ÇÞ­ô/‚x¹á@Ç«ÿ{?Ôøoã£� Æ‡æºæW¦ùø‰“�ã�¹ ¦$|qyp¶á˜jï &p¿æÿÉ­Ó¼Ï,>\BxÎ7 ,¢gžÂ÷ȵ°GŽÜC1>9n¿ýöûM¦Ý:©tT=À/ð˜¶ßA[�žþô§wÿîßý»îyÏ{Þ ´• ÄL^ÁŒ‡Ÿ­Œ?|Þþ˜ëà@C{è¸+§_övþ?~öÉEO`EN­…™Tø~zàâý^²w쾯dï8c�߃v÷äÙ;–RŒ‡ÎÜ©%pûçÿüŸ¯äñ÷~ï÷v¿þë¿î¿ ÿ•¯|åÐùs“tÕUWuÿê_ý«•ôë½÷ÞÛýîïþnwß}lÆW*$Øj�¡^ê´%`¼àÏp6X²Rnh\µÑâ2„±Ð<û{]×F=û¹@®t¾Ù`DDäd,Nó‹!O �kLât;š=È€W¶¹LìBP³O<^6qš“×dGh°M2-+¼/‡&cÞÓd °%µEùH¡× ªxçì­öWÿ·¹é#FcµÆ?­ú¹ØSdn>Õü�ù¤ñsžŸ�ž{büÀàôø„ËùÂWè�z`…ΩÒ2@PÅ}Þ6jµ.¯aøùϾû�ßù�îĉ+ñw£y'ÀýЭDßQTrÍ5׬ì±ÿÛn»­ûÿá?TðÚ²6[4ÉÂW�7!¬¿  Õó Zx[ðòÐe ‚ T‘CrØ®b!›@>¬ùÎmÅ{À)äY)2}ÓÁ߈<¯ÒËíeb‡Âïv´º"5$߉¢Y¦™ëÜÛÚ 8I°exÅÈ4\í–}0; ÄR´= ãÔArì�/ûö$š³a$ÿ9à¬ö·þ2ŸôÉ|å ˜q‘ÍÝjxõ?ã)ü q/è.“k�øOÐpë : [ªñ¾Àî |…!ÛqXçÿÃgû÷™ÑRRk±Ã MxÁy 6Väèj4!(Ö¤Þ�={¶68 âþý¿ÿ÷Ý·¿ýí•4ýøñãÝ?ûgÿ¬ã7éùo¥½ñ~}ë[ßê/üßïÄ[þÿãü�+Û<Úïö”ü=ö@¬ømñ .Cº(õkw#€³˜�Ç÷�Çpÿ£€ºá „pÊ�J jf+HE84p ã#È;HÆ‚P—%˜u9“36¬ñ£þféŒÍØ�\A×�ê¶DÓHÀ8L’ãÀ&»AÙ%8eŸÚï¾2Eˆ—ÀI‚ž‘-@;\fƒSòáéë^ío}¤`}å@;ªÿ×á�{AÆ‘yÆ�ߢN�ÿ6¶pó®ÍKÁ©ùyTçÿ7Ÿ|0?`›KS´9¦"ì½ê+{ïÓó‘85¶l@ß�9™Uç�yÀ^ Ùýæoþ¦æ?ð?°’Öýƒðº¿õ·þ–ÿ2Áƒ>¸�‡Uɳžõ¬îñ»+®¸bß›øä“Oú‹$¯»îº}×U ²Xª*�v(ðø›…­Ö¸V Z<%à«^‹ø�`?{¹$‚îèóÕ‚ãöŒ~Ü6UœÎîò”gÑì_M@–ýï…4z]…®žT�¢ÖÁ¾Lü^]šš,Íì¾­m�M~«cr\v’ç:�1‘d»ÚO]ÑœÝåÖäɧ@ÒµðWï‹Ö=êwÁêQò—g›³ ׸Ô\¯ñ�s,Õü?¯Ï¿[ÿæø…æù3|[çµx`ÿoA­¥Y¯”O]Ü^ÕA€�¿üå/ÕSžò”ÕDz¦°Òæ{À6…:¾À{l|¬äîüsžóœîïý½¿ç:¿õ­om¾“6ÐÂW¾ò•þ+ «xÁâ7¿ùMÙ_½Ãa†™ôú»ŸkÍï±%Àz—€ß»RyŲÍi³ë@çs&.j‰ßÙ#ÀpÚnÙ¼yÐó·Ë!b@]_ƒàý;œA–à%µ: ¦ûÛ D÷|Þ†¨sÁüf‹dȆ(Û\9fÒ €÷:™·µgìg©ö7oÀO¤æ/õEõÛ02ÇÔøOŸmŒ“šÿ{7_vöù·õ«_ûÿýÈÙ“§ÌûgÛÁËÍÁ�ôJ ZC*­ÎõÀê|½Mš>ìE€õÀN¼vy®½öZÿ:À/ýÒ/u¼¸o¿?øs?÷sÝk^óÿe‚z`g§o~ú§º»úê«wVá¸XøþÅ_üE÷þ÷¿Ÿ¯]€¤ªz”<à/æ£ÁvÕñ ÓPÝ \Š"Ð=fwï=æ²Sâ©ç�FN›¼¨/äî¿óZ}—¢û¥Ÿ}ÁÀj…äñÁ€-�A¾êç\À—¤è·4´Ã2ª ´äm5<Úl=]`0VªÒÀ7ð2œ–}¹}ÝÔ)X’°]´ó’ßdx]N#}ÕþOC¶§KªÿÛ�™Ðò“ ãIcÈ+Ì²×øoŸ'ý†Ôøói45×Óü?Ûm=ôíSžn*>ØZ¦Àú=PO¬¯ø¸Ô¡'ú»ÿVvü…/|á³-€ø©õ™Xš7Ùá×_}÷7þÆßðÇôWaësŸû\À6§º;ï¼se?Q¸Š¶í¥¾ßÿ#?ò#þ–ÿ½èE{)zRÖC=Ô½ýíoïøÕ-8&‹XHxý=<Ðz[ FÀl—%þýî¿Q´Ð7¾(§†aÇ( ^ñ3šN06+‡æwðM›h[‘¿[¤-’ $؈0àºóéìxœ-tSî<ž š3ŒؘÔÁà$AÇ[#8¼~ƒÎ<:Á.‡fIÁQ´ 9£Óu³ëküÆÖóK†K#Ó�s›3ÞóɶfOµßü'ŸŒ|鞥HÞ†;oƒQ2{†=Ë´Tý¾ëÇs�ÿ6&ú⟠1ÞÚx1—õþÒòÑD¦! æ9Ÿñžo4×1ÿOœ{òößüΟ¾Û,×ÝÁñÝÿæ5¶à*ó™s"xråĉsô"¬ÊqÛƒk»òðÓ{¶a;v´G×¥€;¯‘œ×Uß#x¯ëÄ>F–äu7»‰é�¯)‡œ×ç[.?*º~gÙÁ´WììBšá@K4J¤)Â8`'OôúF“s$«±ó6çÝê¯ö‡ïñiÜ?Nó’v;xÔAãâñ€ËW¿ zýêÿÿm¸�†W‰“ønÇߘÿw?ùð­­´ŽC)ã¢\±j`Åß¡:MŽ- ¤j`‡N»P6Ÿÿµ_ûµ91÷Ýw_÷¿ñsôM%€ñ‹_ô»Ñ|}_ À/~ñ‹»ŸÿùŸ÷—Þ}úÓŸî>ñ‰Otßýîw7ÕMçmwûÿÎßù;þˆïÿþïï.¹ä’󖵛мØï“Ÿüd÷gögÝO<±›ªkç}ó›ßܽá o˜³ãw~çwº[n¹eŽ^„Uy ¢S.8úÞ=¸Ç:@7ÃÎ=Áðvuâ äõ¸¬ØR?D(Õ2[y`hœÅäSÎëØ`’Hà@Q‰SWàã2ĉ$áò[£yY;Ú iP}‘ÄUÿOøMnÙ3xËä1œqw~:yß!# Éx/<•÷4«WãíãÿK'¾y=a‡x΋\DÏ<…ï¡j`�y�¢414 <úôé;x{¥õy€ßoç逃r·OñÔ�"ãOþäOú÷ÑiÃ*_EàQøû±ó¯üÞïýÞ*Ô®DÇÿðwoyË[VòË j�ÿg>ó™îCúPwP}aêî¿ÚWp�°�‘&ðñÀUGã´}~\$¬çìiÛ S€¿&`rÄNÖþü;üÀx¾Àj# =Y€LŸO†S�-ß&h¶8.Ý#þÙ!Dõò$·'«qFP[›zo·hð/Ó7. @U–‡ÌœÆõ[û¶g·üú¼tÝÕþ¾ Ô7Õÿá’ñx]6ÞÆå5þÍ�T†ŽýÙ¼†ŒýwøæÿÖ»îÿôÖZœ¢ÃÐ>iæAÈxÏPÈþz 6ö׿ˤkRäÁ?C³;}w¬êQîeÆÕr^äÆÏ¹ñ¦õƒ–ßùÎwvÿøÇ»·½ímÝË^ö²•5� ‡W½êUþ/+< ‰ŸA\ÅÏ.â+ÿë®»®ûà?x`õymÈ›yìŸ[wó=Dä*ä Ò€dyaM§ñ5õ|çßqV½.`(óÍSê[tá÷OXÖƒ{Uòœñ¡ËÎQÖd%/öSSì¡;*‡ùÈïí™)Ž õ$‚zà­~n¿ØòÓ Â�CʸQsv,ŸBו™2>H Le‚P>’ïÝg4™7*ªJĘÁ "8«Íh^í—ñJÆGÙ±«ÿkü3&fÆÌhüPÜ'• R�ðÑøZ÷ü?½uæÞOÜ®G±n|¨eîe ®Îµ°:_ïDÓx"l=òÈ#w<ïyÏÛIÝâÙG<ûÙÏ>�rÉ·¾õ­î·~ë·º+®¸Â¿¯þêW¿ÚÖuéâ!Æ}€O}êS»Ã²ÀÓ û�øsÇÿ°|…¢6ö{Ôœ§üvŠO}pê?ÚG„ñ^`eòM]è-ç•lÀÊA‰õ=Ʊ_ªè9Àôņ@<€˜ñ§ ñ@!u@Þ·äš[eušu.ǃUê‘0R2<ïÔYƒÐÙ’WkU‚[½†±<É^ ÑX"Ž#¿éëm[PY¹ËÉ«öã�æáq©#釄{µT�žbdö=6–GÑ\V« Í’jF.¤8»—ÚiIýeåÕÿáäÖÛîÏÿm 2Æ46ÛxìǺ¤ópŠ´ÛñÿøÙ'¿a5qß#Á¹Œ|¥z 6Vè줊AŸ§Eš(3ðë–^úÒ—¦ª…®Ã¼Äìk_ûÚ:Tï©NNþ{ñÏyÎsüwêðpßßð=ßó=zó$wÀ~nð´Æ§>õ)?lã/«=Ð8s‡M J›è�᱌'âμ]‚,ˆ�Åð¶@Ô“йHé±þAR"ø£žóñ5K.i±é”¸ÂÓ_ ]m«wÑ1·)6 â ðâî‹z—‡ •Š�¡Êrž10ÜÚXd Y Â<ïÔYc�$¹­NcëmÉ6%¼iq©Šh!¶ÉmuÜ^Ã¥­Ú¾¨þ׈�? ªŠ/ çÿi>ÕüßÓÏ¿ÇÏžü†1†Ùp0Çyh•Öà�ÚXƒÓ›J&�>‘g®ûFï'ˆýÄÚ#¶0yÈ&ó¯Ð^ŸíGNóW\ÑÝpà ‡¦Ý÷ß÷ž÷¼§{ÿûßßýÐýPÇFÀ~=iÂÀaI{½@Ðqë­·ú ùÅsv·ô°¥—¿ü凭I‡¬= ¸è ô+”]¢ÚÕÉ7 'åÂÅ;x Ê žg’‚gƒˆÐ÷ÿ],ŒíëCµް÷rdÞG�CІ«¾ä=Á(&Â[çCFp{yÐŒH"ãu<7®Þï Èžp u‚ÃÈc�¶=�œÜÚLù¨8Ì5zß*ˆi¢‚óUû™¯Â'Õÿ —PÃÑPzñhxÕø—ÏÂ?G}þßæ‘;šG˜Vùh*°nÔÀº{`П'ˆpJù%€;ìMã¯X [µ^ùÊWúo®¯Zï~ëã'Ø>ò‘�øñ¢½¨»úê«ýgyñá^¥Ã²À]ìãÇ�ï‰[}ôQÿ?~)�͘Üj`ó{—5}@ý¾X#ˆ4üœ­áØpÈjŸrRƒñ@tdÀý±Š[Äà4Ûàâ-`‹3�c‚lOÁÿ§ŒÉðìX_ psÀìxÓ7èPE“ÒÊB:C¿ËßuÀÜê&ñòòÆú½½Æmê*�5�/èV†Ñ†ª­ÕþæAÆ”úpÂÿî½êÿ6ˆbüÕøoó¯hìIŒÑ,ëTH^Hù@©æï‰î;§¾{Ç�Üf4\Ø»1ñºbÔÀŠ>R75òÄðr~  6Fž[q–€˜™ïÒÖDÛ8Þ÷¾÷uß÷}ßçW]uUÇ×.$– € }'�õßtÓMÝç?ÿùî«_ý꡼Û?'l˜¬òÅ“cý•_â_Är™±�ßpÅH–�E°—¶²à¤Ä\ß(ðœ�´X6Ý¿E`8Ï´°qÀ ÿsv:f�@í"ûj@þU�Їž8✶ÂÌaéè t˜½¦!³8ì$ÁÈÍžgÊ$§A¤ê1ûÙZ‘›“Û‡?šníìQnГÛo¸ô™B—Ùš#¼q·BGu¯'¦F’,²bK†3eÕþp�úžFWv]ô<¢Ò¯Ômý[ý¾¨ñ¯ Ý> ŽÈü¿þ‘Û¿Þ¦‡¦P8³fœ‡Vi…¨ €:{Ušš9¿e?éö�úí6Þ[Qo´?Ìr#‹sÞw w°ùñ’—¼¤»òÊ+ýxîsŸ+ÖÁÃ2vÏgàá‡ö€ÿÆotöwëv乃Ïôº×½®{ÚÓžvðrX[`Wb–ø–> U[¤¶—ø±NõXÈ $/³p(îá;!‚#’¬n[çF¥�î_0v= ÍYŠ‚nÁ–eÑÕHèa+¡æ†r¬àdIxË1�}“ÁäsÎk´šMµéÃ’›Ó çAëõ9É–€ ûR9*ÿbÚZ» ŸiŸÑÕ>÷�ø]4ËÎ¥jÿè+1bÌOáQº£ãF­þÏ´áã²ù(×ÈCæ@Ÿ[£q­ …—g6PF|5þùì9œóßúöÔ|÷cw¶iÅÀ1¤ê¼VÔÀZÝ?©|k2[œó=|.F,ó}ɯ…»³ñ¤€#î2k…À¨Ë¦@J–ñ{úvð. :HÎ맨§Äƒã‹ò€Ž«Ž×¶S³Ï¡á.·Aéô*KøÑ?Ðõ¿àŒ.Öx2¿êµroxk¿ÛÒÚ/=‚®'µ™:™æøXþ’ö Úu‚�–ð£cÆžjõ¿ÆM;Ð,å1™ñ(…¡Q�vøXlPãLÐ9­L°Æÿà |â~IÐ}œûÄp÷oƒŽ“àNøÑ1Ó&Ëõ¢‡ƒ$hh¶éá³'¾èå!æñÑŠgM±àjÊ~ï½÷îØG‡�ÑÞYÒ½õ­o=lÍ:”íñíµÕžî–^dÑ·_Œìä.¼ÊXéùwúÛB§´åæŒxœŸä¢­¾?5�h*s&;±áëIt¢ÏþNËï—ŽÈ´Ãík½=lJ )©=ÎC[’ pû÷�>Á\¶Éä�± ·'p·«UÈöhS˜ñIÙ1†´ÃmjÐÛdäÂg)ëËmÈu%ÏÅÛ È�`®‹ÜÉTí·TÿÛ‚ÇÿÃ<Ìó1ÏùŒOÎ-ˆLFR› yƒ»ŸƒseóÿÎS|a°lÆÒf‰µ Ó _¡j`…ΩZ4øÛtÖ´ö§3·ìE€õÀÈ�ëÈò}öŸüÉŸ\‡ê�ÒiãqÇö– €Ý¼€ øQÞxÛÛÞVwÿwŒ<úÿ¦7½éXZ&²QÅņ@�ŸCîÚ�ãžt†+è�rç€Ë¬C Nž€Lùm�m”`V>x¨ÝGG£”§B7¦˜¼¦H0jqŽE¨d B¯ê£ÏqàÄa…a!ºš¾ÿ²„L’d w¢�d�>ÁŒ÷åfƒ—cW³GЪÎÉË4pñz›‘Ñh²o i+4osÓç8´$¯k|’KÑÀi ©o_ÃÅïmÍåfCµ?ú1÷%>$�ý™i๎��F“¿Ç°ú¿Æ¿ÏWæþ.æ¿=Éõäÿs×ŸßÆðbÜYšZA®óº=P/\w “#[¢‰Í'Ïw¿ûÝÿQ/Ì.Z/ÎSìRðƒ\¯!kÒ¾›¯Å_8ªwÿ_ð‚t¿ð ¿°¦QYjwíû óGó[Epg>ß�Øhà 6œn‹C.RÜå ±Q�ët8� r¨+=–w9.”Sè‡ÆÆAÈ»–ÁøÈIÂÅ!=úY2/oº£Æèležtù†K¾Tä­ $ü®»—NL'•‰ßíhí÷úvr­ŽpésùV6#¿ÙF•9þDórãU›É o­„4›$»A—o¸ìñv�¯ö»ßªÿkükŽÏN¤È©Lóå°ÎÿÇÏ=ù¥ûN?ÄwDù¨è?.&p•…ƒê¼rÔ+wùB…š,š9¿u‹%«É�šJâ�Ÿø‰Ÿè~ög¶;,�¸ïÆ­»Ù8,þÙÍWŽâÀË^ö²îW~åWê»™HÀÛîsµÕš]v,"Œ‹P{Ž[ ç£Ù›F§Zï€�¼êÒ4]°¨£ÀµdahrA½ž�€!ƒ²‘w~áQIÆþ\êÌ»:…ÎA¿ä æö«==$6mj[–Õa<ž€jwƒ”xý£þlÏDeIÚ ETÁàÝÝYu%o ³�à´µ‡†Ã_í?d_ö½`>òl¾¤Äý×`Ô¯þ—¦FxöqÆÃÉ»?gàã#÷x�ÿéùÿéÇÆßÿ»r÷�S5öÅõÀ¾¸õ‚„æÉÂúÉóöÀ º¾vñÅ_yAÒ«òžz€G�¯¾úêîø@÷ÉO~²;*?¸›ÇÛk`O‡ÜÆ ã ^Žù÷ÿþß÷EÑÆX-öW[Í`Yk¸e"V¨yñ •ÁÁ9AO@§Sf|Üaro�²Ð4@#yêc¤>/ÎVÞ×l H§jŒï¸Ñ(¿û&%©î:'ϘDƒ_¸ô�!mÏ¿hÀ©¤Í”XfGÆÇu¤KvTûmLªÏq–ðêÿñЙÌÏ�'\hãš$\ãm kü>šò—hÀ©tPçÿ7NÝ“7úÆÚ¨¡#H³ÁsZ¥y 6Väè%j4 4”§šð­S§N}±6–xr żž'€®»îºî¦›n:ô/€;jO?~|WOz…'ž÷¼çu?øƒ?èß÷ÊSž²†™W*/Ô Å]Kë@_ÜÛN€ÙG8»U$Lÿp;´`¥Œä2@$Ǹâ U?‚rx¬!>Ý8÷²MAòH?µeC@ò^Þ yOÍvð�›øÍËM�t�ôrhv„5Nš;m[¶[ùÕ~:Á^ýÏ@[6½¼ñõ³Æÿ³Ÿ_ú,‹O7¦Ùù}þýùƒ7òÂrÜ«�¿1NdùJkð@m¬ÁéKTjbö;h�=öØÍv·ímKêWñš<@@ôS?õS~Ü}÷ݾpÛm·u÷ÜsO÷ðïɪýQ»›'ž/½ôÒÎ6°öǘHå€ZøïDÝ}÷Ý·¶ÅC�ÅWt/yÉKºW¾ò•Ý _øÂe;íݽ�ôÙò�ËXõ�{ü[Õ*,ð÷Ð>‚úÔÉ �EdË÷AT^4¿ €H.n1¯¢è×Y²¢Ì$ôò¼²�ö&¡“$8@åÏ€f±Ù¹³mäÓ×µ =’+H»Á«ýòˆ9#ûngݰ�Ký.Xýßf`òq�ÿaì \8°ZÁQ˜ÿg¶Î=øŸîþÈ�Ödš›¼0ÎC«´FÔÀ�oª™$}†ä Þÿ†oY ù‚ÌJ›ï�ç?ÿùÝ[Þò?°öäÉ“›<ð€ç ˆŸ|òI?ÀR€Ìï¼ï&ñ˜øAj߸m»ùvÎy_O†”Ä&�=]Ô ôi/öÓŽ¿ù7ÿfÇçÎ3ŸùL[oë£ê ´¬ìÜκËwý[ßÚ•GݬÞV0„,èàzá_\Èà¶-�-ü¸¨ùmëœ?)ÐJí«†µ»KÐ8úd¶ì'‘2‘:£þÀô(§þ²r¿sLÃÜAîmHH¶m¬O–íÔ‚ð[lŠ$3èvú–µoYyµßz°ú¿ÆÍÿÌñÏôö9<ó!”2Û}M}þ=|öq~­Œ�J31L]èx 66 ÌM–l 4Ð'ÑÍ7ßüU»óö„MÜïñ’:\vÙeÝßþÛÛ�côÊ{øi¼ƒšv³À…õ×~í×jSËî£ä«¤¸ÍÞc7’¾²Y@ŠM�Ù»þ¹ˆD*8‰?và-@IDAT¯ €éi'ú)ÊÑX (Çæ‚6(ÂBI ª#u mÙtÙœJÈO”K² Ô)| åH–ôÁ%Z–4Ô^&}ûòjxÑò½úƒ>ÈiÜ?ƒ·wÞCÕÿƒ¯ÆþûWœ‚ôÅ>E˼*¯ñ¿ÿãÿÞÓåïÿk*ǸòtU¥5y@×ò5©/µ#h¢æÝ³söØõY;nÕ©ly`ã=pÐ_¸›_ØøÎ(Ëò€]i”è±~ݽ‡E‹çÀÅt‚s%0JÊìŠ� YÔº¨¬ Ž¨ç…žC_PCRl¨|€Ò#H‰p`’d£"dÕ.A#ÍÐD¤|œÆú(-ãƒ=²+ ²)>Ø–S>H&yYGÆU­ÕþÁ·ò7>W¾¨\|‚»ï�èoõzÀ¥/÷‘ú]�»×µ9óú‚“3.{2 |œvoOµ_}¯~Ì}£þÂßàJ€_TrBƪúÿË'¾£ >òuÈd™-“ ®Ùµ°æHê59òd™ÃíQr^°Q©-Q¼*Í6f\åÕþêÿ 5þ5ïg&o›‹Ì!pj>Q¦9˜qÍ·Ls¼1ûœ7Üùa°ÔX"ÓçœsDxUšm̸Ê[¯›Ô†YÁ>·ëî¿V8sÑÑÚÖ—+_pÅ®®+V\ê&=Ÿ@ÃÄ�)O¢sös€Ÿ™¬YÄòÀ{ 66¸sÊ´#닱Üm T["œCçf_é÷¤Å£Ó¼¬Z>_¼¼²üâÅ÷LC„øq9;gZM¿ëäñÿÐÍŽ€82—aEhÈö4  D4CU·—ç¶4ƒB|9HœÁ$ è¸�A¼% ªU‚Ê*2.%.«ÉÇNÁl»øçàX ¢še8îM÷Ó¬qs‚ƒ Q@Çí$Rí‡àõ» Ì}žñðîÐUø”£ú¿Æ¿ÆAž»/sf’�p'^øüôìÉ/ÿåC7ó=O>Ü¥%æ©/S¾àš‘M!�ótò¶ZQ/ß§õ„VتË2ÉCØÄӪ̀j¸£ú¿Æ?ïmÂÔü0;À”¾s껟tR|¬,ú¸*¨bÁµy 6Öæú^ñ¢‰C.óM€GyäI{›úgûÚ…”€ú»y àèŽ2±<àˆØ1‚Q¹„GVI ô'�« þ¾€ØÃ›‚äI øýE~–×Ï ê¢¦7ýK�WjËà™ÓÁ…OÖ´b§ôkO „šúv˜0pdö0$8­¡s lhõ¨ÛZ0JÕÆ¹Ê™&s‘îv5~é$;æÏ4g_ÂPíw/EŸ›cÝÏ‚Qä´†Îõ…׳Òêÿí5þ5bLÌ œ„ñte\¦ùÿÉG¾´ÝMÍÇ/y•Ðõ|•:K×öÈ“¼¿û/Ü~Sž‰V©qÆ|�¶;ä.ñ(_p ¨ €58}‡*5Aû'n½õÖ;Ïœ9ó�Ê)¶òÀÚ=pÐ7ê+kBeÀ>x€…¼÷v•!ྨ½ñÏÕ¤�>O„Âߨ^¤À@U)C®?îo•Àµ<ìñÆL>êÇ»Ü)‚GÁ20ã­~oJe” x2TÙ>ñ{ûLŸ· ƒM�ÓèËMÊxor&f\ ûÜžŸf]Ò?‚Õþè¤êÿð@�ÿÃ;ÿ¿òÄ]»yü_Ÿ£OŒÊ®Úµ°j�/Ö—'x>ü n�8qâS‹EUIy`³q¹? Ê�‚þô:ù”y ¯ñïNp?l7þ;sòËïýîu÷›+§õF†Ù녯ѵ°Fç/Q�' øÌäºé¦›>g»O,‘QÅå��ðÀA~ 66b•ûäÝÝaÑ�¶)2Ü}\y,ùwÄÓ9¾)@ ‹Äcñì~{„¨Ûª{l#yÀáÉ~ 5%è§‚PûÝA8¼®Xƒ`T/8u–ò$ÏeOñB[Æ?ÒïM6š» •57„†9yÆä4˜[…î^¿+‘˜Ð8{žÓŸtÌrFn¿t5ó«ýæ6óEõø€ATã?¦’Ÿçæ“ –C8ÿï<ý7#i™Å*‚¸CÞ¯´!¨ € éˆd†&Ñ"è“êÑG}òäÉ“ŸKõ -l¬j`c»¦ ;ÂP žï¸÷´ñšMK8]™,ú‰Ç‘mwšJ¬o)k"nU@ ªÐ2N>'ñ#‚¯øÓÈå—$(!‚¡)éïiQ2{Þ-¿t5ýÞVÃ�j·`¯W:f5ï,§ºjzÁ›~®4æ‡.šx2T0ã™'ãÒÕôWûÍ9æ‹êÿÿš÷‚;šOynMáyN‚3ïó\TÝ1?tÑÄ“¡Ê€Ï<Ï:۸ǦO>r+ ö�pê@8I4Á Öym¨ €µ¹~©bMš<±f&—mÔ×–º±6Áy ^¸ #¨lØøÝKV\mX ú‚Ð2‚m ßÈo–Øj×ïÌ·¬^ Ø/ó ›6 \4=dšÜøQÊAâ„À³¼À<™ß«‰,8ˆë‹C§e¥7Ì`ÆU±Ù9©o�XÖ™qñ¹,ËìT~–á¸�1abJ($‘�mi(ÌøNí³ê3Iº€rI;•Ÿe8n'Á)sü¦K4éT»á¾Sû�•“t3.ä’v*?ËpÜN‚S æøM—hÒ+˜Û G¦¹­Fìe�KIEÀŒ‹ÅeY(¹‚S² Çí$¸#þd6Œõ# 0ãÐd—à”>c›In›Q$�BÑÀ]Vƒ’+Ø3¦ B{y†8­'Ì*ð²Fʸ‘<�õÃMâ„�× §ì36~þïÿøö»ùù?Iæ8%ãVTi“e8óTÐð¥ŸWðS¡Íor»�ÿ·>~çøçÿ£"U–‚WÚ ÔÀuF2… “M&Ñúüc�=ö©^¡å��õÀAý@mlì�*Ã.ئ»îØûšP2µlk�r-åœd«U§ié•M« ÃY̲?À G¾ó4¾y`8bØÊô–…|X†ºÈ�A—èF…¼$ÕfãòçnÇkˆ>ÿùoïg=ý}û}ך~Å#@fÊøÀÄ)ôJkô@m¬Ñù;P=ž4y¢9n_øðäKy`í¨ €µwAP˜ñ@,ÂãQ|ÝåWïŒiê�ý•ÍjFYS˜÷ÀAݨ—Î÷eQ‡|ÁÙ þÃõ¿·�+QKþ¦Ã�:¼ "'ߥnd�¡�¢j Ý´àePc£@6¨I(�Ý‚;Y`«ž †�'塼¥¬#ëîåŸËkü•KôuRÛñ¼lC¶MÆü²C°Ú_ýïcDs€�¾`@æ1–Ç^?ž¨Ný–„/*¯ñŽZàn¹±‡cæ>È}£ c~õƒà…ÎÿOÜñ!Ó%ó�Ä&‚Âs¹L+¸!¸xCì(3{@H�¿òšh[�<òȇŸýìg¿l±ˆ*)¬ßµ°þ>( Êcx@o«A�ì}^8úrÎ ¼Ì b}Á;9ž Ðâ“2-J)sÜhlèéÇ�Ï‚ûî\V©I àúuºo_È6Ðëƒèº[=Ùê0ñ9'Ñ™”øÁÛ ù3ŒCY–?…4kKk“‹žÚŸõ Wý1¬öWÿû˜Ðødì‚·1<7^Fã—lîQš5þ‡9>áºþ³A~v&ÿ‰.ˆ·Ëü?»uî‰ÿýŽ?ú„µYq‰~A<¡cÊ}EÛÔÐ LÈ“G80O8Ço½õVÞ@Y¥òÀÆzà ¾�;�õÀÆ©2l<@ÌpÌNÞÛ³÷Z° reñ �x”ß¼Þø>©ÇõÿPf`³Sg?U�> ëi¶¸m!~F~#yÌÓÄn‰ ƒfÏ*f\\ÙpÚ:Àh·Ú?U?ÓBG´Ÿ¶«ý‚è룴¨V�+ úa§‚@o0r³g•-’?¶§Ú_ý_ã_ŸG{þß}úÁÿï¶“w�°O”¹xÄh~•ØÎ~Unm¨ €µ¹~[Å‹&�v×f&ÝW¿úÕïœ:uŠßâ¬TØXÄ'°™Ÿ0¬T8´°� � žc¶*ÈÁaßn#OrÃ:W»O«4|= ç6nVˆÆ`hðÄ“ÔéŸpyÎÚŸ¼¦ GOl:Àº\lÂ#(‰²Œ{{PMU;H‚àVä Èáü ŠOЕÚ�.AÇ-+ÿX¾ÛÖxÀ#˜ES—$Y^Ïu5miuÅ“áRù®%ìlMéý0e�L ípûtÜŠa«öã…Á¿Þ7äÍ1¸Qœ$N™ ã©ÏÕï‚”��¥òC¼÷ªœ¿AÙ!è¬Ê훆ù �ÓœÙðÁÝ>A# ZçÜàJ’åõPío>Ÿõ…ü3†KýÛí}ƒHüÛ úAÐY•1xýc·ñî±™8Äò¥8…Û ¿‰öäp} fYν!Õÿ³¾�Æ0÷yÆ{¾Q8�Ñ€Þ æþ<}îìƒÿóíïü´É±ÒþP\RÁïàÍGj`³ûh» 63á>ûÙÏ~ØW'7»9eÝQö@måÞ¯¶oªüý¶ºîÞ¶ÜæâC¬«ŒÝÇí¤ª= ëLbS€Ä]|JÑã4êD¥ÂÀD¼€06àõ…¨Õ�’�ìœ\¦€S¼âɸx3 \-rÀ'(9‚ð/Kâ:nÂL[' m‡i,_z#žŒ/*—êfVµ¿ú¿Æ›CšG‚̧eI¼ý|³‰å´6ÁÊü¿ýä=~ï™GO[{gb�–×ÇÅ\æ¢*_±j`Å?OuãÉ”'žã÷ßÿc–>zžò«Zy`ß=p7êûÿû>,JÁ=À÷ëuW^º/Jy$Àþµ@%×,T9¢Œh6ph|}@ålÄÏÿüG€O•ûÆ€Õ¡>‡ëgEÒ6"è‡áüzHƒ¾Án·ÝÊátÜê *0D&e‚_¤O¼*§Íàj¿ëjºO6aßn“˶JÒ—mœ’ŸiŽWû«ÿmð´§=mãüX•öÒÜÉ'Ò…ëN|[0n‹yÇ�¾°� œ¨6çÎ þäQW Tõ¯¸ £<ô„áçìÑØT×Ð>‰˜ñža—H–!™ªýÞ–fsÆáO–µÈ xI’±ÛúYGÆCêîÏYøøPÛdïÂ/ž,k‘%ð’$g·õ³ŽŒ‡ÔÝŸ³ ðñ¡¶ÉÞ1„_Ó¡»ÿ,Õ|mÊwñ�î Tƒðú¢µ]�â'úȰº3Þ‰­?`åþ.+w}3¯ h§žNÞßsàN_�úºM¾ìº^«'8%B¢]�1 Ïq Ëä-ÓŸedÞ)[ ežŒï”™½c9´•ämÒnAC–ÉË6‚�ù3-ó¢s*ežŒOñBË<àcýð@[”h+ è‡�zhÈ2yËôg›2¯+�8ežŒO°:)ó€/³w,‡¶’¼Í@CÚ±LÞ2ýYFæu¥§Ì“ñ V'eðeöŽåÐVÐ;õÐ�eò–éÏ6e^W:qÊ<Ÿ`uRæ_fïXm%y›�†8´ãŽ“÷}ðŽ“wó¢ñ©ØC´vuð€›Ù†¦Jëöý[is=àóÏÌc£œ$çk—´ãRƒù¸äÿãü¿Yàò?½Ò.<À‚¶¾]8l—¬Üõ{ôÑGwYk½ì|mÁ¾R³^#±ö'NtgΜ9Ä-Üì¦ýÊMW™�± 8nŸ,ý+�ì.>¸oÌ8­²øÜ÷? MËóËT,¹cp2/Ú2®PgÔAf�Cµrߌ@¿1»MÍFd)¹if�”¼äÇåÐrZÆ¿Ûò,{ Ûs¡òw+olÓnõ/Ó7–?Î/«¿¬üBå�ëWû‡9‚o–ùYùØ¿ãü²úËÊ/TÞ¸~õÿÐçøf‰ÿ·þ—;þËÏý§{>|»±žü"4.ägí˜Ú0r¥Mò@­l7©7ÛÂNË ‡&×$¼í¶Ûþäu¯{]m˜£v“Pyä‘ÝT)ÞCîÔJå�Ãì¿{o—^¨GíY÷ßé÷;.A,¹9Ÿáq翯åtxœ­ñ©Ô¿7`»ç´±€$¼ƒ‡áwmì0 Ñ ·zZ¤Ü{‡a IPºB”Má™\Ógo«µEòáÊø¸–ä NÕ×¹�¼lD¯tJ®l!/\P<‹ dI>|ד\Á©úã:’—-‚è•NÉ•-ä… Šg”,ɇ/ããz’+8U\çBò²E½Ò)¹²…¼pAñ,‚’%ùðe|\Or§ê�ë\H^¶¢W:%W¶�.(žEP²$¾Œ�ëI®àTýq� ÉËAôJç½gþŒÿß0ù“1‡Ñùô¤ 8>ŒTi=P›Ø+³6µeI?©˜d<°h"ž»ùæ›o¿êª«>{Ùe—]3+ªrå�ò@y È¢�#Š$‘Â�½1,’¿¬\r¥8u ºô�aµ¿õIë0÷¿áò~vZsøØß�EoÝ[ý?ò¾!É—‹ü»¬<¤ gù8u ºô�áaÿ�Ÿ}òë¿rû;®7Oi Ç¢™gúàpjaí�z`£»gÒ8M4M¼Ixíµ×~úE/zÑ7íûË/ž”RÄò@y Ë¼Þ´Ëe“x”•­èFÚÛ;RY—«aÕ‡c#xfüÄ‹âD�f>˼¢´Ëe“x”•­èFÚÛ;RY—«aëÿ¥••cÿç�Ÿû]³ ü%ëã’võZ2ß7§ò/1õ€—øl ú|åMÁ¾¨NFåW?ò‘�¼guuõÈê(“B ( �]†s?ýLŸ¿ùßf1Q´pÝ Û™Úú�烈`ž¿­{ð ÏÄÔ¿#!�\ØÝ~xþW©�Ô,6ÚüÛøŽ¨Ão£yò«2Øx=0$ù†fÞ•ñGŸ1fçL¢ÆfŸÆG¿ƒ:�‰l�LrQSmŸ×Ùª{ˆ7!qEÇsAÍ›e+muj`«¡ñöå-Ÿ˜~çߊ¸ìäÉ“çžyæ™_wQÒB ( �ÝŒ$LÛîÒOC´–Là–õ÷´OÉpà/ôkq‚RôΛ>#˜2nßPʘnR'ºÈë„Ç„”ið¾üÐ4Yëæ¸õÔšëu8ßê£=j—Ú&JAžx…';¡¦iå½aÆ{ÙFåG?â¡lª;üb²àf÷VÄ4øê¿p"jX6¼ ¾qüà¡¶åc��M+æÇ>ŽyÿÀM80>²ÿ���!Ã:6ž² >�AÇÑÇšíæ$+â üÅ=ÿϯ­œü‡�üÇ_·ê8ÊÄŠ/t³QòLÍ̲J[�ZØâ(5�*o9ðïy�¨«ýèGÓ>ÀŽ'?Å…@!P1w·Ùhž­å‰*‘÷I§íX(^ü‡”ŸêãߣÓ¥O(Ÿžº:X<@æ¦&çk>ñÅ ~)K2Š[žàÏàm‚ö/{xψº¢ÉŒ�r?¼¸H[¶ñÝnayÚéõ[AooGñ‡¼¥ÜDxÊŠÊ�(åܾQ盽÷Ýëʼn9Gé�oõ¹/ã¡cf²iE¦ˆtce]Gõ^¿3~fÃò–rá)+*?¢ÕÿÀF88v ¯:þ6 |Ü1ˆŒ¨ñm¼ùXÂÔlÆ6ÌdÓŠLéÆÊº®�á™qoòaÜ÷”›�Ñ1novPç›ý¥:þ÷ž~ü×ï>uà„5_ÿXœ!=Õ6tYLÑ­‰@-lÍãÒ·ŠKI'™¨N@èøïòãÇ�Ÿ9räÈ»T¸h!P…@!|ˆè®>wì‡Éæ<®óB-ˆoöLHýë>S6§,*˜wŸÙ†3Xdþ´Aã“ÚmÝÆtá#Ê#“�¨{ÄŽäöÓ“dŸ0›JÔíº�tÞ/€°$Yä¦÷Ò öV¯ËZýÑf+3§Ájûõt'ÍÈíu¾¹ZUý(êøû9 ±8ŒOCÇeÀ™f¤{Áö5þwìù¿²¶zæ­�¾“¸AñE[�÷��FáófÙJ[�ZØêGhº}ùË'ŸNÒL‡Öžøu{ÀÉiW•+ �B ØÕاÈ>^´G„i¼Þô¿—;î$>eœèq~Ëð2?Sûýy¨Ùø»=;x|ÀÇ]|ìã=&I«k«1¡¦¨E%´!hä½î”ÄCmó ¹ÑÑ€yÆžöPŽ`{Â{“³m«/ût¾Õ5±7�—c‹)¢9ØRó{Z 3vw�¹»0wÿ­¤ø¨®ú߆Ç&«ç¼&ǼŽÿ‹ÉxNãÎØŒi�ÿÀF8 ç½�±8!ãœ�ëÀv;ÿï?óÔþÈó³^æ˜~ˆ+š®]}¦F�©˜J[�ZغǦo™>¾�ç“nÑ ºrôèÑÇŽûµÞaå �B (v/L`×,ðæ~½Â@�¬=Úϧ ÁûŒ†Èí\Ž $Ï(ÌT¨¸ëOùQÅC9q=ÿ¡}è—VVVž+à �B ( �Œ@|�°ÃE§ø0Ñ,”€>Û£Ñ�®°ò°¡<öšÔzYŸtbm©UèOˆ·*¬/44u¨Q/³Y·ö6ºoÛAÙÂQÐæKuFùé}6Éü´Õ&rÞ³W{(*|®$óè,©¯Õÿi,ö³ìYÛµlÿckd|�`NÙ$óÙfS¼+¡ãAaÉàs%™Gg©Æÿ‡ŒEH٠̰gmײÿ_8õø/ÿαÏòëaS1„åÇ<¾ vK59Ônk#P [ûøŒµN'™(' ¼ND�¤ þ�Ú»N>|øgÆ–¬( �B`w"0Üù·îGÈ8x ŽÌ'’1¯dÉ–‡†i_˜Y¶1Í.‚Ö�ÁõLÌb¢jöLXã�mòêîÛÂjÄÞ¦ ¥ØÂ¡•&Ä”‘ ¾K¹ŽÌfj;4óƒAÇd›ÌËLm�f¾és2¯âÕÿj ¶€E‘¹Œiæ§™Œqæ«| 3?tL¶É¼Ìr›2ßô¹ ™Wñ:þ Ô:þÓ×B �<¦2/½ÑskËGþ×~òŒU¡E€œW¬àc#Y²ä¹Ø­ˆ@-lÅ£2¿MùÄÒÉÕ )ª“:œÀwÝu×{Ο?ÿÈ|÷¥) �B ØMø£ý­ÃÃzËç÷ô»>|üμE#{yö!‘‰Q•Uü…X>˜{æ:[ÕNd™°c�Aþ†é&ÔG‚²¹ãFáI¢ð½}–Á÷i‘}ŽÂZ¿Õÿ©ºz¿Í/ª¿×Wÿ'ã@Ç]Ì{¼²lì˜,²¯ã¨ùÉm@ƒ—΃ŒÝ¶‘e™WÙ,ƒ¯ñÿ¢Çÿ‡Ÿ¿÷ž{ê´¡ÙÇÊg êý¦£St P Ûà �4±?éÈçS¼<¿léÀ�?9â¯D…@!P» >8HPè Âã;ø®À$R ¨b®Ek|ü¸ÎòÐf§É}6™¿°ñ²Ü«œ ü)s°æ[³�C²ÙGæ›éLÀ‡Mttº¬ì{š}f~°Ã)0ˆöL÷h#fÙGæÑ�%õšyÙf™—¾kž×� Û1{•Í6™—¾ØmªÿsñÍf~À³cò1ϼ̲�ÌK_Ç?��{Ñ1¼„›h¶É¼ô;lüŸX9óÈÿ|ß�ü¶uOñ4ßDÌr�$/t�õD¾Ò6A ¶É�JÍÌ'˜N>Ñ|‚æWüªý"ÀÇÏœ9ó‰ä¯ØB ( �]ˆóZüõ©" âE±MüÚª=–O´ƒÌ¶�§lJzªÀiX…V¾Zy¯¯hÎ�Äy·wƒ¨“. w3{9€f^†* Íü…ÒËÏ<šëÌü`Ÿ…Æ{¶Ñ¬ì;&÷9ó2Ë>2¡ôò3�æ:3?Øg¡ñžm4«ûŽÉ}μ̲�Ì_(½üÌ£¹ÎÌöYh¼gͪÁ¾crŸ3/³ì#óJ/?óh®3óƒ}ïÙF³j°ï˜ÜçÌË,ûÈü…ÒËÏ<šëÌü`Ÿ…Æ{¶Ñ¬ì;&÷9ó2Ë>ŒÿÕg?ö“g÷,Ÿ7µÅ =Uœ�mòZt!P Ûè`�4U'ŸNHQNXmùdöùž{îù Ó#¯T…@!°‹ð€Û&ˆ¢ºÙ˜ƒfå’íƒÉ“ÊT^Pª <à4j±ڳ彜‹ãÅ*�\m“ÍTÝ.œÝù‚„‰¡™,»ö»\22â¡¶¹�F3ïvÙÖm`—Ëd~^Ñl“ù9ö¹Ï™̳�ÌË ËŒÏ}Î|õßËX ¿E4—Éü¼rÙ&ósìó1Ïü`ž}d^Yf|>景ão€e¬„ß"šËd~^¹l“ù9öù˜g~0O>-ÿø?<ð³ÜT¼ ª8ÂcÓCwˆâ¾Ò6C ¶ÙKÍÕ §“PT'j>�á‡Í±—¾7ù*¶( �B`—"À\P“D} C1èšÐòþ�ÉT^ßÛ÷Ÿÿ“3ÓSWÈbŠoùç¹|»&ù—¯©ifÒrɼ)‘ÁŸÚ+:f¯&Σ^¶ù•ÑQj 4ó­õ9÷_27Ée2ßÊOùÑoº½ò;‡nÚ_nSæ›õµú‹0qˆ2f™oøÕño@€Í>›¯ÂuÝ´¿Ü¦Ì7ÿ:Ö/õø·kñê�>ù^¾<;H&JOK¨WB¬ÏK^t‹"P [ôÀ,hV¢õ'¥‚QNÞeÛ ~"âŸx‡�ø¼ì£R!P…À.E ÂpåŸ&ú„E¤È¾©÷î‹`Ý£u91ª' ßgLð“7ù›xHL¬5¹æ;Lˆ)ç?�غ@È©k˜07™ox„Ÿ—¤köžµ]Ëzc]Fåê·è˜O76Åà ñÍ6ã�y¹RŸsÿ%s›Î?ýŽÿ@@ü¼úUÏ@gü™&\º úì&Õÿ:þ÷¢Ã JL7ž\#C«ñÐÌ˃Æz�ÿ@\„‰c$,¡`;§™Gì…T¾OÒ5{ÏÚî᳇Þûã瀙çxaˆLî1CÓc£+D¦&®´Ý¨€ívĦۛO@ñœ Út÷'ðêSO=uäÙgŸýÅiw•+ �B Ø-ð¡Áìê7”YAž,Z–¤Ÿ D…IÜÅϦ*„õt e¯ 0—è£.7ðZ£¼—t›(8¼k@2Óʘ$3Q¦Œ¨jm†N¼š(:i”—íÔVØÍp"G¢�HbÑð4½ÏUf^V* uÞŒD£!¦PAg#áBõ¬êøÇ8ðq£qdÔ“Æ4óóÔæÄÍp6â0‹2ßÜÍ�\eæe˜}8oF¢ãí /5þ°z±ãemõôw=úÎw˜«#ä¸!ËWp tHu8û¼äE·0µ°…΂¦õ'y� ¢:yuBO=ðÁ~ð]+++‡ÔSêB ( �ˆ@ž„ëÿŸútEÔžˆég€�Z&È•òÄ4îWÇÓ±`ý¶è€ýàÃÃBQ¿à>ì)%qP¶öp€S=œ J™|×ÞÛ!¡†Ë°õ¤æ 2©d‰�£i?ô5jv�ddäzðgms�c#‰&VêêÀ:î¢]ÃÎ�½ñuü áÐV�³ÒPÔ Mì0^“ ¼û$ߎûH}r=ø³¶¹ŒãÆFM¬Ô5þ_üøÿì©¿ø�c_8bðrÕWœ šeŠ)8Dð¤áÐE¶öÛ �ZØnGl¶½: 3Õ‰+ªZÔå§N�:kOüԬ˒…@!Pììùð`²í“õö€Oà}Þ¦ðQïæ–÷—Ž€„•û4Ý*óEá·¨ž»ûü‚€'YÆ=·6à—?œÈ$SçCííÆÔ“¨ez{z‰,hh[ϧËâÃ6¯¿ÑÖ—5µ—�Ÿ—ä{¨ÏªtY4"ŠE3œ÷úŒ‹ºÂ³dÈt(n&.›Ó Þ>ÚQýއc*”x`Æ“coØêxÌqDàI¢‘›Þû±6ÑPŸUå2ªTµ¢&Ò±V}x“ ^¦Cq«ÜeÑ0L¦ÔÛG;¢ ¹mQ0•mþ¼nãÕžG‹àI¢‘›Þç:Ôoѩδbê«êC,|ß*¯þ;H“‘H�Ø# º¶çìêùÃëÁ{—‰rœ�o/ Ë[¸˜SÇa€©´½¨€íu¼úÖê—œ¼NVñ ú{êvwÝu×ï�;wî9(Z…@!°{`Î1?œMÛ§JLÁ!¦ŒLóœƒú6±ÍuJD G¾H`lÜ}4�Uãk °SÖ°§ŽU*‹ÚZÛÂc2‚ è‚÷*¼@¶“½tQ.ä’‘£¢C¿‘šxÀ(LÜ®ßÉ—ü«ÿN›r^ÿ©ÑìKõó꿨ã_ã?Ί±óEç�h¶É¼ôœ{$¨ÿqÞó·CÎÿß=ö¹÷ع£g­‹ŠúAyéžÏVi#°·½šèÚ%<ÈkCÆÜ®ÝÓqyŸßk_¸÷Ö[oý‹öXf�«T…À.@à›¾Â‚ð¸[O ÎŒn¿åãCer‡ß ÉMéï zõYGøâÆ›?|ª<*í·— ¸½×Øö­÷`|ØD*»Jy• Ϫg¼45LÚ6Sµ*Íü¸»…R\¬[ßBëTÿëø×ø�s¾Îÿ¸` ‡§ÎýÈŸ»çŸýŒ]Aò¹ëßo’kÊpbª”yÉŠn&ŸÆÛ¤ÁÕÌúP'©Víò <Êßwß}�:tègf<— ( �B`Ç"À‡…^æwÝm†gBäc*r4*çY—0µœL2á¹[&™ìB9Õ羚�æÂËõåÃ{´+óòÝSÊ“ ™ïí”ëè;üXÿU¯Êdª¾B3Ÿm2?[ßú«ê†f>ûÌ|îsæ³MægÛ3©/÷9ó¹ŽÌÏÖWý�q7>~ò1È|Æ4óù˜g>Ûd~öxÔñ�ã±±ó-�ùÌgŒ3?‹÷¥ÿç×Vžÿ?üìY[ˆFc‚&—^A¿(MWó�­´]¨€ízäfÛ­“²§:‰ÇNtt®ÿÀ>ð«õU€YPKR…ÀNF`_zힸj†U°®Àÿ£ïwê£D¹„‚ÿ <6;|¯ßüÉ�(øò~€áÑz›_â¿Ø(€Án^’/èØF9Ù9ê‰^ ŸXL÷&tÈæÙOæÄXåÒÔ6©[mË2xõšytIj¹ü÷² >róú“{ ~‹ 'Ñh__©d“ºÕ®hC” ˰­þ×ñ¯ñ?9&gÈúœÎm�_=¥4²ß>ú™ó{ÇîæÅc1A/SŒ�œÌ–ɇ´öÛ�ZØ6‡j݆Ž�˜ùį“{æEËËË+ŸùÌg~Ðj9·nM¥, �B Ø0X³×þjG€®@->R&“J³Ptn¶,Hð”à¥ýÐ(�]è�«Œô�agF–bQ.ýC�ÈU#4óèf“|Oê‹vMJ«aC6æ=%ð؈?Á�Y–yµ‡Ã+aC‚fÞ…¾ËÒÌO,2'ߪ�ðÐ(]ý #~‚�p TëøÇˆ�{Q0ÓØš7Þz=¨†ÇÀ7ðÏãsÿInÞ ?ÚË÷¼öäcžùyÞé+)z¿=Ïÿ'–žûðw<øc°n pyVL0FÑ ¾žšªÒvG ¶ûœn’*ð׉.ª“}j!à�xôàÁƒï˜vY¹B ( ��ˆ€>0âƒ"{Éè/¼’¾Ç¯‰xüz@¶0û©lÜ&ðGLN‹á3Œ5á4±0à/°Ä  MÀ‘‡g8KÍÖiæCëm€¥ž�l²…¾�½›Ô…Éà£gAáщfYÈ'A‡ú-j&f„U£™éP7¾7²Q »šTVuáG2øÖZ§Ñ?õs t¡¯þ wQð¬ã: ‡ÿ,‚Û³d�þÿý‡æG,—ûéà?ÇÒgšO]<öùVK‘í„@-l§£µ~[ó ¯M'±‚þyÔíì«¿f_øâúU•¶( �B`' °Ï&ËLÐõ˜>|^AûùžOµ5ɶ²|ØDpI”'x7ïö€+xs[+ %éƒjº<š¨½¼¬k¢ÕáemõATï5ENÍ<²ØrŸ3?)—˯×þ1QçÄâòê+4óá[mžPõÕf²Ï}μôô8øà&|õ,2fð‹Ž_�g”—§Ååó1Ï|—ÉqW¾Ž�ÿŒ…yçÿ{Ž~úÇ~ïøçŸ5“y1râQÅ ¿¼Y¶ÒN@ vÂQœî'*)Ÿ°:‘urs‚kÅOÔOz}À."õU‡±v…@!Pì\˜0’ÐýŽâÞF-7 3wæ¹óÈ{ðÒ?%Àž÷šÏ/'“t…BC¦îGb«-��²îlØÉšùÁ`“Œ÷Ý}E¯ÃoHá}rݨ·Ùú=ж ¡þG{&ÇZHY’û0šëˆò“RnØí²Mæ;³ g'­­þà¨äc£ãű®ãç¼Æ½hŒÇÀ.Fñì­ñ§¦ÆSc³hÍžÆÙ&ó³–{ö<±tôÃóÁûÓ)`¾¿Þ&;\k“kU§|ÑmŠ@-lÓ7§Ù:1uŠêd^ï„töU€Çí«?3§Ž…@!PìüƒàÕƒ›ŠÂëSÄç}“UÝÕ‡ WîÌS Þ#`‚!`�Y# ìùeìáIð$ÑÈY¾ œØŽ€Â…’Ë@Õ"”?êU½¢^L¾TBɼ¬[™üDÛEÝýÆÀZ¿Ee'Š�x(I4rÓ{ï;6Ö¦ÌO[Mrô•å/ê êí4�h¶Ú«ÿ€ì� Ôql¢Æçcè8Öñ¯ñÏÙâçÿÒÚòñ¿÷ÈOÿ°µ´�tóOT1€ìæÚ¼§ì*íj`ç˱žèä…꤆êDïO|än÷¾÷½ï7Ξ=[_Cµd…@!Pì4È� ±ñ¡! O’ÊÝùøn¾ËI°){(a2ñ•} ÀÊÛ_ 8ÝÆø°™ÔE ü£€ú Æ»] ºà]×hðíé³ô:ÝEÈÐ÷[îsæe—ëÈü<½·Ï댶ëm†zÊAfë7À¨~U�óÖWQÚçv¢f;co!«þ×ñŸŒÆÄØ–Ç|æe«±8w|¦1(›LMícê©Æÿ‡Kxþÿ¶=úÿûǾxÔ*×¼?Ó>ÈqB>œð$ÑÈÕ~[# Ïÿm݉jü:AóÉËIM>ÿýE ¿,úÓŸþAû`¨¯LÁ[™B (vLþI~7Æ"$¢Î!@fÔïJÃÛ†ØUþ˜?ºØÐ³Hà†^�½h°ÕgÅ"¸‡IIw¯£PóíÄ'ãõØ.àpSÉFÊyóLU¿D£´ÌRë x¨o¶hæ›>YÂ\·}ÂÉ}õ7~!Q_[{Ý^²‘ÂÕÿ¥Ž��÷¢~.Ú¹#Ê5@¼ÎO?Íl95¡ËEMþRœÿO.ùÃïxðÇï²êóÜŸ¹~?ßnþ5[�ÐJ;�ý;´_Õ­éyƒð®U&È< AäE�?zôèÉW¾ò•g®½öÚ7ËAÑB ( ���À›¾".ü6k�òA`ö àÔ÷ÁÇG„øè¿M'Sb+hSFñ|�ø$ºù‡ßoZÒÞ}¾4`uQ_”ðŠ­„ž,à…^¾y ÿÓAŠûK²1=69eø~Ù’ꆎ¥ì}oŸõ^Wë³úO™Œç¢ò›Õã?§™ö˜ÒÛÕ(¶ä•úú$Íþ�õöYïõTÿop°�$ ¿¿Íêñ™ÓÌñ0¥—F±�VÁͶ'¤“}ö7fŸõ^Oÿ‹züÏ­.ÿ[ýÄ[¿|öði;ºá§àzÞ¶œ_´À�«´ƒ¨'vÐÁé 'lÞXÌ[¾(ÀϬ ¾ÿýïÿÍS§N}pÄw‰ �B (¶;6çþ¼õglóﺚŽÉ;‰àKŸÌ»¤Í5~° >žh¦¡Ä�µOà/Úà‹&wæ ?ÆYâ‘…Í„º;KóôîÇ ÂmE6Öwdø•ÏL½8»–h&©5wà�±�úœû/6­ø¤ý©ÏÕÿÉXÐ1Șe~ž¾Žÿô­ñÏI·3Î»Ž¬þì¡»¾¯{ô_ÁþØ\?Çðº r*‘|x[û�‚@=°SŽäx?úϾvÅwcé2ÍO ÷¢'žxâSwÞyç·îß¿ÿúñjJZ…@!°Ýø&{ y.öññà»w$ž €%ÜÚ»/‚®½öÆîT¬:ß:ÍÏýy€lnšeóˆ-sk÷2Ì$ÍMxÆÞt”²‡BÖöøSûB3™‰NÚàZÝ1�ǶOÔàí3 OÍ<2ÉE]ïm4Ô¶èë¤>lå{ñб„›ðáî^ö‹üUÿWŒÁñãÑcžñ„'‰f™ä¢®§tsêC«cŽ�xOd9Õñ¯ñïcÄN /‹ÆÓzçÿGO>ðÓãÁ¿�·|“O ý�ÝøÓ"MÈ[¶Åï j`Ì‘®Ä'ÖôçÙ<r¶~`ï¹sçVlûìm·Ýöçí¢©Þ (@IDATsùH=%* �B Øf|Ó!¾áºOF�÷{îöI ,ðÁ`3ðà',�øÄUåéºó(,i!A xæçQ+¨�š›ÿ©:�á_˲irÓE{ƒZÖí%›´ ±ÁÀO�§°%•…’0• ž$šywéÚNï•QõFO:bŸ}f^uf ¯¶Ík/Õcç´1ðAã��ùÆâJâÝeJF6ÆJСßÂaÄÞË4yæå3SøEí­þÇñªãÏ´ÃØk4˜�1ÖH‹Æ6ƒ™w—,Mé½2ª½´çÿçŽ|è[>ÿ¶Ÿ°æ(ø×}ÿPÉe—ïüë²bf ´ÒC vØéÎÔ5©éuÍE ŸƒÿÌï=räÈI{Àc7ÞxãŸj¶F*…@!PlWÞbOøLÏ&©qÁ·ûøöIà ¾Û…&³x€¯I®@�…ƒÃ ‰ÀÊŽå…¸k¢—pY,0a¦ áAõð¶š™†·ÖVÜ[ »àíNø½ 85¯¾‰‡6]ÏÖ‹ô�UY?©Ï’(üzåÕ Q쥅þhN¼ïÆ‘qŠÂ’¨±ëùÃt‘^}­þ×ñÏc�±CZoühŠF‰õ÷ ýmÃñråÌcß~ßü“£çOœµÞÐëî~üg9 cÁ?UÚÁÔÀ>¸­kº&ŠæKÍÛTð/Ýã�?þä«_ýê—]uÕU_—�_…@!°ýð—Ú•p[ì5ÿÄy¤v|(µ‡rŸÊ>bDËã$УñE&Õ¡j²X jBgOð6Ý×V$¼†¦w|a(‡dœ‡¶€¡QÌú„©FáI¢ð}€€,'ŠÈysáÔys&Šc÷Ý(¼ê†’°Íþ¦¦ _AƒŸöï8Fi[ïŸ:rÊm€'‰Â«-j²œ("äÍ…ªwg.ó6Uÿ[Û58fŽO�§)€MX®¢á”ƒÐ �xÑF9>}ÂT6ð$QxU K‘ ú梎¿°00@…'Ó(¼°¾¨3ž^X\˜ž4øiÿË{VN×�w~×ïÿâ3f¢»úúÚt÷_yÙh ÿ €õ&A+í@j`Ô‘.ùõ"Éu YDóB€óøÂë^÷ºÿö²Ë.»-ù+¶( �B`›!À“»mv‰· '�é3Åô‡ö€ç˜¼¶þyÀï3ZYűSßS ž`.K9(i¿ùžÌo£r¿ c¶,L„ ún‚ì6ówÞ/+ìþZÛå[ýu/4Ü+3ÚìE±ë7Ê ÛhR_¡$ÊJ&?¢è¥³G¿(Uÿ M¯Ž?çdœ?mƒ'�7Æz�¶ßù¿öK‡?üßÿäo~Þz�{‚ý>ðïòÝÿ62Šìø¤¯´óЂžÂ³iµª Faèó+ËËË+øÀþ…ѧ­\¥B ( �mŠ€ð†>Köâèøpð¼Éˆüí}F[¤`xÆgŒ¦‹’¨cÒŒVh×2™n Y,/?Ñš’I· ¼/GZà‚Ó¹=;g5Vm�:¯öÑ6’(¬ ‚ŽÚSö­>·1ê|¢îÊÛl4ó®œn2.I¢‘i¹VÞsÆCƒŸÐ¡`+BùÜ&ç­í¢C¿«ÿõ†ðÛ:þ1è K�æ±6šÇ|æ›�†*4óóÊ»M�ÿ �ÿŸ9uà—ÿî#?ýaÃrSóùfÏáì7‹3|¥ˆ@=°êœ.�^s›mÖÁkÓ\My§gΜYZYYù­·ÞÊK_6§¾…@!PlaüWxõ¾&ÚíŽ?wÞI„ŸÁÏ;˜šÎ¿2àeâ1·5C·wÚJ{ḋ¿Ï_ñ�Ò¬¼,l܃ ᪗o5êõa¾ñªäM±Œf©øŒæ…Ü swÞ3…E×hæ]8²s«:j/ß�F[ÆÛg¢Q˹}£(±�Œ|Ÿ¤ƒ’h“ËÔ>sàíÄQ«n Í^åFûƒ2%·±  £ö]Ñ–êÿØñ1YQË9^�¢ÄB2ò}’nÌ¿s :w#s–�aæûz”w« :j/ß�zûŒkŸ9·¢–sûFQb!ù>I7æßÛgDwrÿ-ÿÔ·ÜýÝÿzeϪnä‰ê^ÿ€ôPàóõÜÆ NÑöÊï j`Ì t¥]uKòyC!›,ŸáŸyæ™c7ÜpÃá믿þO ÞŠ) �B Ø6¼Å~€»œ¾ÒËÄžÛïíÀr1Ù·ÞÀ3UÔÄŸ»œ"lVÖ¿¯�ööÏí| <ö§ ]¯¯à)ìcQÁ3aënpß–\è5¸Ú°˜P/Ðï0bZ«⡤^/™+Gv½}ç�ffæ:ñÞ†1wØXjÝxg¤5#7o´pÊd¦µ¡úo d,êøÇ(ɘld@õö5þ'ãŠ!ÖðÎgÃG²|ZŠw]+—yé£ðÄ÷gÖÎú«_úÁ·>¶täŒe ä ú ìü‹j ÿØçàß²•vµ°›Žvô•ëiŒJŸ©Ï›ý ÿ²¥;î¸ãÚ+®¸â�î­v…@!PÛ ­ÕŒ–?ÿdp®õ™ ý{ü.ly{¿—B÷í£$ûHÊO,Ü4J™‘/&Øb1> *ï#˜¼;ùX¼æµ¨ÐÌ»rûÏ-ßìDºxÆÛ$ÙL}j±ê•“õ¨: UÇDGÊ©î¹íWÝÕÿ:þy,´±´pütcn¡ýTm0KÖùͶ">ö5îEG lª=j‡¨ù[X¾«s¡½|;½ôý_][]ú¾'~ý­¿qäOZÓôgª _‹ZÀ&þtU(ÀWÚÔÀ.8È]óe·Sy}¶Q~”>üðßµ—¾Ñ^ x똳’…@!PlMü%€<ÚïW÷¸[OÆÿLæÁ}»ò{XŽÌÿС 8�4‘·¼û ”b^©»øþ$€IÜg£±�Ðì­¬¿hÐhþÜGxòš½-^Xî'”"´Ï¿Ã�a«Imr}˜»[b?P³o¼‹á›IpØ»ƒV(óóŠbãQ‡ÑûÖ„¡¹0.cÇæe¥÷gB¨ma4ø(æ n'ZýÇͨó #K¹Pæç•Ʀއ€oI¸Áº ¨ó¶ufw�ÿµßzîÿïÿóå_ø”ÁB0Ÿïì+àïd£;ÿý"ƒb¥]‚@-ì’ÝuS×R‰Ég™ò éêêêÚc�=öG¯}íkÿøþýûo–â…@!P[ÞÀ”¯…‡ÞXÿ¹>ãöµÐ>>l�[&åmç�¼åu§~âÝ£¹i‰¼¾Ûïï@Ë¿Äûšk÷nŠöµo_ø~ÂO“rÊö’K¦üfh®^88mŽá7šd꾬ÐfúC™ÍØ«MªSùÍÐ\§·Ùv…±Tý6²o�†V`3Ç“²›±W{T§ò›¡¹Nøÿ/Ùø¿ëø=?ñ×ïÿáÿjGa^ðŸòS þ=Ú63 Êv!P ;è`n²+~ oeòÇ‚øLe;J—––V>ü‘;î¸ã-¶pý&ÛQæ…@!P/þŸÈÇwŸÔÛ´Ðã8»Úx‡º]ú‘Ù#ú¤É]|rÜÝ� Þã‡WY£$þ`šO×›ŒúôgÙà)0Y`0!ÿ.sÚ¹°eh( ÊÆôVÔÝ®·G-™óÍ·lî¯Ñ¦š"Ùž$šydÙ¿cIm�f>ÛNùoÙWÿ·Н°…²ÕñŸà�Ç øŒQÆ.ëá7Œgs¢ñìeå¸9ÍÙ|ŽÀïÐñÿÉÿ§¿pï÷¿ËXük@�þ+ø‡‚NÞ”|¥]„@-좃ÝuU—NQÔâÇ(²yÛžS§N-;vìc·ß~ûŸ°·=_ÓÕUÙB ( �-†/$à&ùãùvÇ=îâ‡Ôy›zޝ Àû„Ü oö�†þ‰ÊèƒdxR™OÔCçuRw“»½íb1Á¤í©=5@;7œpÆ”:¶I%yÐ`ïŸp}£®·�Êà�$¹õ÷ÞoÊP¨”Œ’ò%µê‚¾�„ù�ÏL¥“Ú’¾2Qý7ü“~�'bdM:ÖN[AÉð!_P¶þø`³™”}Èg¦½ï« ¡Î[e¢ÔÛû“ º‘„/’Ó̇¸úŸpÈXëü4õ—N?ñî?ù…·ÿ”±zœ_4û™×Ýÿ>øÏ‹Tœj![i7 P »á(Ïïc» ÊC×ãÑM¾ú¶{Ÿþù3§OŸþÄm·Ýö?ØÄðÊÁk1…@!P[�oò_`NÎ%=~†o¸Qoùƒ`¸ão¶�›Ò- nh9ç¡0m1Á•|` ójº§Â�ý¦Ž¶8ÓüD9ŠzP’ ͼ+'~ÂoD�šDå’h«v þ¬¬úï~¼ÏøDáÊDMÞ\}EjË@#ØÃ+‰…f¾égÚëf2”Q£ 3þÌUõßAü§Ž¹ä¢pÿÀi^¨iPyhcjün{÷àI¢™G–m縣Ⱥ)û0ÞûÚ¨óÞ\Ìóß•°�}õ¿�µŽ�ÿsþ?½ôÜ'¿õóoû�Ókçòs௻ýó‚ÙŽÿºrˆ®{ù*åÎC vÞ1Ýl�˜V�æQéÆôYà˜½ àÞW¾ò•Ú&65Æ@°R!P[ >=µˆrò2?.æú >>!š­]éȇ•Ùà‡?[†GÏZÁ~�_kþù� aË¿²ä½|Pä úÝÎô“¶y-&i¶Î‘iÌíe©¬ÚMiø¹ Se¨ÌD)$¾éÝ—ñî¿ù�ò/_š~SN²ì ß–TÖýµÊ$ ßO·Ã R¸Ó!JmÆ’5ëi² }Su˜­ûjT~EݱúZýœà+젣Njò¤1ÚË0«ãpÍÃÓµi·àøLán¶Žo£ëÁãÇÿ‘ó'ïý3÷|ïÛ�?~ÎÊên>�?Á½2•ÚþÔªÍX]}a+í6*8ÛmG|¼¿#ƒaÖ�ñz ëöeÇKwóEsÐßó þEóB€ý ½Rª|ÑmŽ@-lóx›Ÿ¦:£^¥Ï´çÉÛO<ñäõ×_ȶoiòQÇ%, �B ¸ôøK-�$þ$�4òX¤¯¸Þt:ÍÜË8må͇ëí_$hè.¾ìÌ">1ðcÌH]fU”¶¸b›yÂÙdÍ�—õ¾¸-í˜Ýð/ø¡¬¦ÅY–ù¦Ïm€A³oÕmš¨†D’è<¾óM]¹npð„]è>Õ7ÕßÓÜFoƒÊÎñ7ønú܆ê¿aߎ‹cé<;ŽUŒ=Ž‘’é<‰’ã‘Ù–1ÎØ×ñw;�aÇ‹¸Ížû~’�㮲[düŸ^=÷ôwÜÿ£ßõÑ>g=Ô�ÿEÁ¿ô¢ô†²PõLÔD•v3µ°›�þlßí’8•È÷2 $“~ŒºÝ£�>zà¯xũ뮻îT* �B Øè%€\Ò *ö­Ù}úvu÷`ÝxÓÄŸ?À£ýþŒ¿Ëà€`ÖmÏÄÛ¦škþ2À�Áë™ù xö�‡úâ�/>Dcò{O™ÊFµ~Þô6Ûã@eeŸõÆ{õ¶Òþ ¶ÅDPÜͤìOJds’%Öù§}’�Éþ3¯þô…² :ì$#/j}ú�´ú_Ç¿ÆÿE=ÿ—Ö–�þ½‡ßñ�ßsì3‡ìlÌÁ§?çôCuÇ^ð?ï*aE+íj`·é�õ“�~’häb�¬—K–©ÊÈvï#�<òÀW~åW.]sÍ5ß eÑB ( �—�xA·vín?_Ü·¬'üŒ‹¬îÐ7� ÃÖïè›XÔËáÓe|ŒŸ}؇xyv¥Û³óØ´éôj•}æ= •_Ñp;ôû>¹{«šy¯¼7ÉS&Zy³q?ÍVmÝpûZ›|�wzÄÝýË(ôTµaÿ­]"¹Ï™¯þ ¡õ)˜Õñ�1ïãÇà¹ÿq®nøül§ö¹µóGÿÉc¿ôÖŸ?üÁÇ Fõúð9àŸÇ«Œ¸œj3v£g8¦•v2µ°“�î ë›fó(^ÑõzÕÖËÝö¡‡º×Þpô+¾â+ޜʪLÑB ( �KŒOD wÞ™%zÀÍåÝþãn›ÌÛìÞ'ø.÷P¾µ–K<æÐ°q-ö&Ѻc®é§ýT¬OEñéÁ‚¾n0ñ4´Í=¹3¯‚jb+jÙ)YsL|î•ïv”#‰Â.²Ç6oîÜdб$ߢ�=Mš M�l]ò!;Qê%»¨?n䦾[h�ß¼©-бÔÚ1`ÜÙWÿëø×ø�s^çý{ìÿï>üÓßõÎÃzÜN)ò¢ øyãÿØ[ÿ± ú9ót–Šš¨ÒnG vûïÿÑ�­¤“LyhÞÐ+ïü�ºöÚk¿á†¾Ù&5ö@¥R!P/o¶¦†<–ïw›­Ù•Ûïæ›ŽÉi„ò¶‡·@ÝS“8úa8ðzë?¶Ø¨Œ¾@UC`o\^lÀŸ]À¿nåe ͼepS\Ѩmz/”ÄTX2Lïhò  jXx9ò* µÍûبú+й'l•Ä7Š­7Éhöåõà×+ šyéõÇíÔgÚ :’ªÿuüküs^sÎY²óÞÏòâ¡¶åsVç½(æž°Ußè‰Õ³þ—/ýèw½÷Øg›‰y‚zþ=Õ"€DU:çìV#Šîf*ÛÍGý¾ëò´žU¶�ïó*+ùÞÇ,]~ùå_ºù替Õ.Ž—É h!P…À¥E€¯ìçN¼ÏlÛk‚ÿvÕ&Ðlª�™ŽI­ü¡.ú>ÙõI²—j_)0ž“SO|ÍŸñ‘°—Ÿ2öÇ‚�ý yDFŠ=õZÆý»x›Œ4U¿c�,¨¨ìûÁ i¨¸eÍEç)Ý_P7§"Ɉ§�¥¾}½>¬æïqeš�û’Þô»ú8NÂp ¯ACoR£àË¡¬ãϘJc}d|;n>>ÃÎaLeÆÊ{™uv:vN±ÛA㟟úûK_úßý±³ž¸+˜%øWÀß/�Ç®üÛ‘ñakê�ÂW*öÔ@ ‚õÐG l”•*T›äÒyþ©§ž:ho’þÜ-·ÜÂ"ÀËV* �B ¸´|3Oؼ�ïçë%|à´fø]y&Ú\ÒE]\æ™�kR¾Ÿ_ hzdð,øÓþv;Ñïì7}×Ôé‹ m-Âí¬,>¼nçMéÔ„^¨é&Y‰ÝNw/¡$o�ñî“2Mr„é;÷nk²V^v¢½?Ì\Ö ÄC³­ÚCÜ7´ÙˆbO >„ÑN ðTd V úø ï| „«èß:þ~þ;Xàgã«Æ?Ãc&94~�hãÌ,2\â¡ÙVã‘slŸ^>ö©?ýÅúöã§þrð¯@?þðÊkq@T 1µžšªR!Ô@�„õàE�Ç÷zå3ÍüžC‡9{öì'n½õÖo¶‰àU^Kí �B (.<É.ÏþÊ~˵+µ‚K²Î³J`‰à›˜;oSM ã݆¼&ãçM¯¯xpaÖÒ1eußí+Q�YSÆv}@ë¥�û£ °ºâ?(¼O‰ES¹�•ª4Æ#³Íû,Š@uõ„ ì‰í B´‡?—qKÞj…G×ìBÄ>ÔÐÞ�²`*}ìíGýšOÄ�ÛšŽºø'Å;šMk2Í^}Àì¼ ë¶ "hÆíµ'ÍœªQ¯–z³˸Ohæ›Mødß ÃGk eÕ†ÁeÛ¥ôÁ{ÙD½½æ,p¶¶cB°±äþuÿ­]âU7”äe«ÿ�'`·cá¸7ì\&-ãXB3/[ÇÔ¡�� c¼ëøk 86ÌÁ“Ę’ØFc¬ïžñÏ™'ÞóMw¿í‡O¯�#�Ÿüën?6™×]Ñþî¿.¢ìÅB „DÑõÈ—j}ìÉ>ëzyô²Éz—?~üÔáÇÿðöÛoÿú—½ìe7Ê h!P…ÀÅE@OD°È}r±žÜÍGf¦d‚A|Lé#hgáÀõA×ÛË/>BG¯|Àý6™•ÏÔ@ï ­~‚­"¢-jþð�É ž¼¬qFI؇?Ïeñ1–TÔÿ25>êJyü«=ò‡LI<Ô›ÒÚ·^ýÕp­õñÎØ ïáX×ñwH£6æh¬®7þ¦Æÿ‹=ÿ?yê‘_ú¶ÏÏO­îYUà®@>ßÝŸûG†­(<>Õy³l¥B`}j`}|J;A@Sщ&æ/Êgý<~ÊöÔ©Sçžxâ‰ÞqÇo´E€[¤,Z…@!pñàW˜Ì­¹UÇ…›Áƒ­�š%Š–ÌãwêpçI”‰ MA~ÌL'wðÃOøöÚ­œWbmpCÝ{M€�·¥ùo–ñ|Ðà£qQ÷l€è�cŠìu@¨³Qr^¼Õ…¼Û¼¨É $ÌåÎóî`ãw0£ û–¨–|ëtôaøž´ DŠ~·ræ@ÁÚÐ… ÷íþcg{ÕÿÀ²Ž¿;=­ñ˜¼Èóí®ç¿ðþÂ=?ðËvÒ- þûÀ_  þUž&i .±WS³¬øB`@ (ŠÙiº1e=OŽQÖÍåí}Ëö3�zÍk^s›ýJÀk¦¼W¦( �Bà‚#ð͇^9øŒ»ø äãR�ßÒï¦M) äÑXòf˜!ÜÅ‚‚ÙHhqAwóõ± 'ȇM³÷Bf.,gN‚â_üF�e\ÝÌh…ë…ÇÇ@�×× a?‘a¾ƒ†>ÕgÕÝŠ»�¼›jŸ+„�5f#þÝjèn0�æFÿŒ÷>µ~{�^WÈ…ÉÐoáPý¯ão—sºÆÿ¥9ÿW×ö,ýæ‘�ýÐ_¿ÿGÿ«�¢ ÞçÝùÏ�û÷�¿îú+èåÌoW‡�¶«A‘B`�Z˜Å¤$ë#Àd³)—™ËŸ?~õ¾ûîûÈ«^õª³×\sÍ×[%Ùv³u–}!P…À:¼Å€`1÷ñ€¼˜\‰±!�ä²ì�|ã‘ÅÖl·Cß矄½šÔ}¢Ÿ$l|±ÁDþµòÆÇS̓÷�ûq-ëžÔÖ6Ö‚…S÷†‚Ra}¡ŽØú€¹daK©‰Ý„WyáÔ Í>(¥ä :–d”>·zœ3Þÿƒo^ZÖý™_¯®ùw?.3# ½ß¢Í >lëÛ—eî×|ˆâO<4¶�Qït_¼u3þC:ÙO—1Þæ ÎS2û(nªÿqLêøû ÚJãÿôê¹ÃÿìñßxÛ[ý…O[ã6ük@T‹*/ÚŽx»°Å‰îÔ®X�ZX�ÒÍC€�àͦ\f�Ͻ?üð—ì«÷ÜtÓMßh¿pÅf+*ûB ( �Åð‚7‚ýá¼EU\ =øö+5ùxyŸ\í-ýxWмíÓüáñ�e»›oSÕý-yÀo,>| © øÞ”£M^ž6 ¾Ì¤é%£(>T—ó6EßÅ¿SþPãK4ø¨3j‹’¨Cóí°×^m‘ŸE5¾° ê=r>*Ü‚ª]òYýçŽ�ÿÉù_O²1¡¸˜Ó6N3?eûóUçmœ“~Ƶk…^øùpéØgÿê}?ô¶ß8ò±§ÌA»îàCóÝ}xû=Uð¯²ø¡GºõÔT• �õ¨€õñ)í|¸*n6­W&®²ÍãÓO?}È~%àC·ÝvÛרbÀM›­¨ì �B (ÖG ìÒk³Þx$ÞBoM”¹"· ~¸p›�/˜`X00™Oš=HŸæ©�;ú¹8Ž;úHc¢\ì­¤OÐãMcþñã%)=ð^·Ë½ƒË&«o^RBdá¬ÑIðHå [aa,æž5ª:3¥Ls Ûü�®ËÕƒë9Õ ¾T‡yj26á'zê ßìņuȧô-m«þ+x®ã߯§Æÿp"qºlöüÿìÉ¿úÍŸûîýØÒ‘³†¦‚ÿÌk øób@¶ÏwýáIº„ˆ†´ö…Àj`@¥^Í1Ö5ꔹLæ³™ËOœ8qúÁü=û™À¯¸âŠ;³Añ…@!P/ÿÀ* ‡Æ…¹û6­Dâ/äƒ÷—ýM t×÷ùqçÚâÓSW{Mfÿž† 8¼û4ÖÛàõQO¥j~ð­-ôq—ŸMíž žB0L�UÖÛ7´AÆá›Ü oõizííu…£mj£ÊE?ɩϓöZ‘h‹êNm/a4éßÄǘ¿ê?˜Õñ÷q™ÆR�ÎK/áù¿¼¶zæŸùÃüŸ¾ôCÿyeÏšîÖç@žŸ|ôµ�e¹Lþu˜{JÏ+B 6SÍA Meæh׫¬¨¬s~ïÊÊÊÚý÷ßÿqû:À‘ë®»îMöaWcVH- �BàE ÀÝIj9û�`ÜtdÙYŠ`Ü‚.ãU.¾*úàÝÔmÃ.žØË£ýí—† Þ<¹�i>\‚6Ýõ3¯×” þ&/1SÌFv¢Þ~ú¢Ú¢®°Äë¤ìXîÅÌFûðhð’¡�ðjïT›Â¤õ´e¼Ì,¯:sðÕÿÀ¾ŽÄ€Œ“8‡mìùXjç–)bìLhX0ÖtLÊÖø�sp Ï2¥Àtöü?±rö‰ÿûË?ÿÝßÿøo~Ál´CÌàçM�¿¨t²‡Ê;o–Õ%l¥B`ãT0µq¬Êr�tI7‘jÕrD5#rÿö ÛbÀ§o¹å–ÿÞÞ põŒU �B (6…€^HdËävF¹èN‚o‰‚ãúñVl˜úEZwü]öqŽÀ3›-OØ'€O [™ðÁ>>Y à�zÚ¿OsiãF+¼©„o4xúà¤#cÈããLÁ×XûÌhÎæé#  nêõŠº¨|3oíÅzó)û¾ú/êø×øŸ³çÿKG>úí÷|ÿÛï:öÅgí TЮžÀ^¾~QÉe§ù¡Â¼Y¶]|à*›D 6 X™�"³•QÕŒ0fK3bŸIeéŒÏǵwÜe_ ¸ó²Ë.{U6.¾( �B`sèS·¹ð‹¯í"oy˵Þ+QpµÐ݃OìÉGËW(Û ¼úØLa<:%�…o²áWšAøozòRd&[䱨€uŸh‡l¢îÐM§§÷&ê´#Ê»¹÷n^û„‰úïîhC÷šUEóhD’À•öÍóm¯þ [èXªã_ã_c$Æ £ä…�ÿ6ÄÖ>râþŸÿ“ŸûO<»üü’9RÐU Ÿ|ñü{¥—�ZxI`ß‘•êÊ)z¡:)NOŸ>}îK_úÒØË/¿êª«Þh•H¡ê+?…@!Pì x S.¤q7Ÿ§Èy é¼çÜÎÃu»âN L‡a” T+çœåHñ�jSN™ö6sŽzÂk�½˜µÈV|’ÞüÆ„åâíš<¢ëõØ.h”‡Ÿ$2)àví¢ÿjg£­Üty/0w§¶«ÿ”•¬¹kx… éÆìçV’ÕP­ãïç“ 6Æ[ð1†*Óã7ð2)š6kü�•ó¶nÐ¥µå?}èýÿüo<ðãï·_à¢à_�¿è¼ _‹Øa£EùÁgÞ,ëyh¥Bà#P /º*8‚×ÇE‰ ™Ræ%[Hm"¹öÀ|–Ÿ ¼ñƿ־pÍÂBeP…@!0…ïð@“é¾=žŸßúï_pk‚€viw³¸k“`Óà <Èð<_ ˆ;ü ÿ?{ä£ßñÀ�ÏOúÀ#6XØ0ò â èØÏ[È6*[Á¿Wéâ"P ßÝè}2#™î½>I§¥ã¹ìƒr}r=?hïxß­·Þz�ýJÀëÌ(—ëËT¾( �B !à¿°Ï‚t›ØrñTÐ7T]Rãî½çÌÖƒxׇClÃGãüûý&ißù�;þ–÷ºÌÆËM–xB JºÂëÀóÄÔ3oÏ䜋 þÂÚOî(«®‰ÿ¨ÔH³S{šÁÛ9m;±�rä1S�J~Qªþ¦uü9·&XÌ7Ù&óëÛ×ø«å=+'~ëÈ'~ìÏßó}ÿñÑsÏœ1̰+ð'�ï-@û»þ²Ï~˜û’'i,ÒÚ/�ZxàUѹhvÓÌ»xõòEùÁïÒÒÒ²ýJÀ'ëi€’b �B Øo9ôJ³‹Gôý¼—Rð@(Ûîà· V�f¬+Ðð|ÜÝ]a±€5†¨§ùFݾÿ�_þ ž�‡i Q “‘¢Ä„nñ¾9Êó1õL|I–m{³hÐx Ÿù1[dšù‰}nSæ'ës¹ ¼úª�Û,˶ë{�§Í}Îü|û¨³ú_Ç+�{ÑßÇ¿ãþ{û�<ýÛ÷´“(í ä× þóB@¶‡çdÄŸ¨±Îg _©xÑÔÀ‹†°ÌA@3ˆ9j療>?¯ìŒïö4ÀûÛÓwZÁ›yÎJ^…ÀnDà-_Ñâi.—qù…‹‹'�Hˆ Ð÷¶ïãëé€ÁŠÇôýã‘ýȳ�äA]ËÅ=+Ý¢Âlvò µç^4Þ#>§Euü�í1þ—÷,Ÿ´»þÿæÏñû~îËçž9mmÏ�zÈç Œ×?¢œ¥òkì0'¿(`Q©x�ÔÀ ®Šm}Êm¸À& ÿzàòË/¿÷†nøïêÝ›D²Ì �B`W! —ÆE”{ì1÷ Ü"lቴù'ï¬KCghMÑor\X"wîáx|ØîâÛTÖ\d6Fe·—Ÿ ô;ýÑ=%àþ0´äöÎFY•^?Âo•Pe½|¢8žâ; £ßQ dn¼�]®ÄxÀUu.“+ì%ÈeCߺ_ý7h‹:þÂ!ƮƔÔ�'R€×T2�zrã Æÿ‡§Î?÷‰¿ùÐ�¿ý‡Ÿ|、k þàëQ-HžËÈ�üêöÔª¬T\8jàÂaYžæ# O,¸¨õyÉ¡$]ø"7½—N~”¬žzê)Þ ðþ¯üʯ¼öÊ+¯¬§dŠ) �B`‚ ¤ØêAûÉ�~.Ø ˆá±@B9– �D)§¦p{·€ÇŽ nrWßó&s½—pµÛÂ…Fï«fáÚÉGÉÌG@˜]ð=mÐÇNô0Z)^mžSqt£Ø0“lN‘i±Œå@m©þOãt±rà.Ìũ²'‰z¦ßõ‡/ ôVëä{jKÿu@{Qªó«+§þËÑOýÛ?ûÅï}Ç�³‡¹ëØ ØE îÐ+Ð'ð_ü«Jz¹†êän~,Äz€j Kd“2Ö&7Š'ûy—ý°ˆe¾5`†d›ÌÏnP€Úó—e™Ÿç>ÛÀËwõ±/¬$+!4óc¶‘áCÇhÌ_–e~žïl/ßuüÇëñÂJ²±ÒA3¶O�;úÉ¿ýð¿ûžÿïÉwçïú>Á>A{7_ÁÿÍ *Ûþ:°=�Õ¾¸ÀÔÀ´Ü­‹ÀìUvråUA]üÈg>ëÇäÒgº×ž8ÈÓ¯zÕ«.·_ ¸Ó&§ºÁ•íŠ/ �B`×!ÀK#çBÌ¥1yÂíj2¨ý™aL•uçn~\N‘D(o¶^®•iˆêi‚ú»Ô}alWóìŸJ<Ͼ5N¾›»H¨‘ä5åc^'â¥7•ë¡"á—Ô¨WoüXõax�÷¹~øê�†šx(I4r/n/_�nÑñfuùÈ»�|â'þÜ=ÿüg9{(ßõ§Å ÞÐk`,èG&}¶Ç‡6|æÍ²ž�U*.*µpQá-ç#tŸƒE¾àeƒ± ¤ ö¶’”§xà�Ï<ÿüó¼É’½#à«e1…@!PìR¦¿@ð¯�ߦþ-à4 âÃ&.ãðíßÌ<×Ê¡Ÿ,&àCå¾}ø‚�×ea¾»cQ!”±^Ûx 6¹³�>l&Nåàà£ñq6³Ÿõ7©#üä6d~N-ÙÄyÛ‰:C&oøqƒæP¼l¦õ³í­þk47Efñ¬ã/LÈõÇã Ø3æ&p»± nÐ\‰—í´^mƒ¿þø_ݳzöã'ü•¿|Ïü«ÿøÌ‡4oÌ- ÔEs/>ùý"@üã ™üAófYOÈ*�Z¸èW#èÊ=¢šå‹aæe8&“.ӽǎ;yß}÷}Ø&¶wÛK_c?xS6(¾( �Ý„@,Ä£ö1IŽK³O©ýûý �Æ‚òvÕ»@IwèݾYz `׊xð¯œîæëa¬é§(hßû÷›|€Úø8€f~ÞG6$Ù‹wa“K¶*·1*<§ð²yí]ä7·1óóüaC‚fÞ…�l#þTnc´ú˜×ñ8w_Šñoµ®=xæàûÿ·‡òû¾÷±_ûøñ•3|wŸ“¦þÀ+°WÀß×?/ `«rÐìS'¦¨©½^h¥Bà¢#P âª`šqŒ©uAÌ4ó*#yñPñ²›¢|æ‹_üâû®»îº'¯½öÚ×Ù¯\=eP™B (vþ+L»¹õn—Í!8·\Ü�W�`ÄS!lýî=!dHdCÏ…x?r³Ysÿ*…ÿé�/ßý ^e¦ F¸ vMûˆVnlÁ†×`µD’lcz«‰—‰Wµv#íÅÄ ÙWÔ£¶É#RÉÂbs{• QV²Íy’un³¼•_Q•˜¦Õÿ:þ—vü<üsÿü±w}ÿßyèßÿN÷’?¢À� ¾úü‹² …€l¯ _T~¡¤ž†´ö…À%@ .ÈUźhÖ€‘.†Y¦ÂÒÉ®Ï�ÙI6F×{ì±/?üðÃÿÕ¾pöꫯ~½MH/3,Y!P; `‹°š‹*�§ßn<ÂÏ…™@›! oWëI9…¯¡`ÏÅ:ÊOdZ œC}M«^f¢©„ž6Diù :ex�2jÏ…ªoÖßæî€R¾ú_ÇÿB�ÇE§Éìx�œ£‹ÊŽégý]ºñbåÌã?ÿÌüð_¼ç_¾óS'yÎÚÇ%ŠM�º‚ÑÔç _<4/È>ûSPROCZûBà!P —èªf]4k•±.�ÊCu?F%˶Èú´÷üùó+¶p¯=ðþ›o¾ùJ{QàcFzµ·¯|!P;�·æW"çÒ OâBÜ/p1EA§¬ª<åŒoWñaÁ½ ùI¿ð¯@ŸJÐF’a/‹þ ¿Ð±Ôê�So�Y4:i‡jóØË°uTŒªœè¤“ú&²ÞÓFò}ªÿ0Öñ¯ñ?vþôç ç¡ý¬ßñ÷ÿÂ;þÌ¿÷Gßsô3OX9ÀÓ–ƒuð9À¯;ýä3¯E-@ñ-ªz J™—¬h!pI˜|Z]’ꪒB`.y,Âç�Y#y¬àÙൽ¬ñÐÌ£W¾/+Ÿ¢^ßë^÷º¯úú¯ÿú¿}ÕUW}£•­T…ÀŽEàÜýÕÞ7R�‹{ûÑ]¾£ÏE‘ˆÎ/�Æï]s©ç Ð#åÝþL=ðájêî¿Bú¨S¾¬_ˆE—ÚÔoͰ¿K™¨{mÍ‚ÌÖŸÊÓ„6e_€o¶­}}ªúR¤¾=Õ; uü·åø_][[ºûÔ�wÿ�‡~ê]÷Ÿyò”IN*6çPmÿðy^ â3•­|ˆæ:Ì…®°S¼ jW\JŠ*[�~†·ÞÌ'ëà•ß,�êûÑ£G�ß{ï½4ágí7\vÙe·MT¦( �‚€Þ Çóds!&îUÞ»K@Œ¼õÝuÍFwç�6$¶Ø·E—!w#Û³þ:©‡:IQOdöûBDðá1l˜{=ò+ê5OüF‰é½|EkfýO[Ïæ(§E€ìK–¢}Û?m­þÂBÇo­ã¿õÇÿêžµs_8õø{ÿ÷‡æ_}Ïc¿òGG–O,ÙqåòÂF�.š~öù§?/¬ü«.«ÊëʾR!ð’!Ð>n_²ú«âB` �ËLáÙ˜1æMwöóÝ~Ýõï)6Úð¡²ò§:úÕ_ýÕw¾ñ�oük×\sÍ·˜=òJ…@!Pìx@�*�6w›#`�‹�¿©Ÿ»àüypÝŽ'âr(y„QØM‚J]0õÈ¿ �ïÛ»ßfÄñâAʒ܇—r=5àFÜÑ.ÝE§ˆøywÔ7k¿ÁfÌ5£¯ ð½}–“ln¡M(6ÛŸÍÚo¢)£¦ê+”$, "m¶?›µ±m¬þ_¼ñ¿¼¶zæ g}Ï?>ðŸ~ë£Ï?ẋWà Èu‡^” ~l@‹™*àÏT~ ªC”¡¢A-ЬR!ð’"WÞ—´ Uy!0Š€Æf¦ðÚ´‹*° þ%“M¿ _Ô¯ºö¼á ox�-ü5{*àÛšÎH¥B (¶/Ÿk¾t‚’ø³‹Ÿßyo�8VñïzzG³¶@ÛˆümzëO´à{²¨€uøR0O¹�4yû €ü¨ïßg‹,Jx­/`ðÆu;pPPŠJü¼õÅ�‹Êo¶=]w6�Ýl}‹Ú¿¨‹Êo¶=‹ê[¤ßl}‹Ú¿°¾vÎà‡Ô/Xm¶=‹ê[¤ßl}[¡ÿç×–O~úÄ�wÿ£Gßùî»O~ù0v›tìñð9˜‡×÷ùE³L¶*'_ª‹¼}Q 2øJ…ÀKŽ@\i^òfT �QòøÍÁ¹‚v¨zø9à/*•SYùî©×ÇwÜòµ_ûµéúë¯ÿöúùÀÑcVÂB Ø&°@�©Ýý·)k^PWdÇD߃x³ƒ×…Yw÷} Iìãcÿ>«§+“Ÿ0ÀoQ>øiÿäÈ#‰‡’úd0n}ßÛ÷Wx�ìÙ/ ˜•ŸÔ4ÎÑoõ ñÕÿÀ«Ç·¨Žÿô&=^ÛyüŸZ=û䇟¿ÿ¿ü_¿ó÷]:|¦�œyS .J ¯€~,ÈÏ ÙNå Ô!ªúLäòLá+[}–n™UC �4N3…ׯ 6o î{šƒÿÌSV ¢òG𪠺Ǿpå›ßüæ?{Ë-·ü•Ë/¿¼Þ(• �B`[!ð�w�µ—ÀßÂWîø3}5žä<ÚW�å…�ý\͈À7JØEÔìhIŠ.‘ï·¿ÐS —ÕV�yˆ÷D�ÂÂvÈZs¬îøŠ� ©X�zó];á‘‘h�ÚY7 o¤ñsüG™É¾÷'ßPÒ"ýÄSp‹ìlÕÿÉ1ÑîèÎ�‹:þÉöÿÏÿÜ{Ž~ò·þÑ#¿ðé•=+}Î`CÞo æ‘÷�ÿ¼ ;ÙCå[õdjjOÈ*[�ø$Ý’M«FSä±*šƒsxm ä×[èuÊËG¦}]jþ·¼å-oºýöÛÿò•W^ù 6I“|ªñ•) �B`«!Ðÿ Ahü‹‹`V—6‚s’/ØôÖž„ ¼õí�î)zwõ[¹V^ ƒÎ}™�Q,}3Pö&v:–hŸЋ‡^Œôbë[Tž~«Ï´_ü¼Þ,òw¡1x±õ-*_ýŸó:þ,–×VÎ>xæàüûCï÷O¼ë±vjpZô[Òsà®àŒÎ þsùì7שÃ%Í;UC[ûBà%F€kl¥B`» �Ç«xhÞrÐ?o!@Á~~@²\®÷§º�“”ßk‹¯°¯ü�7ÞxãŸÛ¿ÿ+B]ûB (¶&,Dní³z?ñ×Ö0=üg Mc Øâb7¡ôÊ M»#òïVV�>óa_ 0™Êpù”O-5 v¶¸à�<þÌ’¦4÷�›HfîÀ[{µ`ƯüLJãÎ$éè ÄÈRï?¤“ý"j‹êŸ” n³q 1éAß¾Mû«þ×ñßÂãÿèòÉû?rü�÷ý“Çåƒ�œyú¬�5 þ±-è9pÏwðûàÿÅþjƒNiò• �-�Àä³tË7µX äq+JPŸƒ÷E  þ{*ȳ_Õ3C-øßû ßð ü«¾ê«¾ýꫯþ&›ˆ±ÈP©( �-…€ÿ €µˆ€œY+Av„äÈ´ÆÉ…/¾›�Íð./6œ[ð  Þí­ŒÛSš«¤{ÑÞhóŸë¤\ØF[( È×è±Í _ Š‘‹‡’hœ7-ñ¡5A—úú;õÂÕ%ÿ‹Ú×ûïë_¸ PýŽ9XÖñïÞà˜líñ~måÄ}§ŸøýŸ;ü¿ûS?ðhkrÎÙà^à¯E-Ì öó¢€Ê@µqêÂCµë<”¤Ó;rµ/¶0úìÛÂM¬¦£ä±+š7f§äsßùóòÙV>2•ï\§x«fÏÞ›o¾ùº¯ûº¯û“¯xÅ+¾íŠ+®øjd(*…@!ðR#ÀK`sa#úž¾ãO˜ÊEËöèÄÝo9f»Qµ…ò& PeC‰NSb^HÐÊ"~HQ&˙ΥQ�×¾{»Ü_̱Ù#�¾6¹@ÐÙwÿ¹ :’fêku«/ÖkŒYAѯ6‘ïØ„Aضúfü/hß"û¾~ªÌiQ{²-üL}Iæ¶Õÿ:þ`üÛOø-=qîè'?tâÞþÓÇ~哇—NœoC�!H‚jS@žƒtúÈÄçà>ó,ÈNrùÊ4×gE†úáIj[äj_l†Ï®mÐÖjb!0†@Ãâ¡Ú˜×ÂçÀž _tÞ€äÙ®÷C^u©()Ë÷ÜvÛm7Í×|Í·ÙW¾íå/ù�aRûB (^¾óó¼0’¿ÀÏ&ðºóï/îÒÈÚŸófª·ý3çÝ¿wòR?ɉ±�¿ð틦Øk_1�4Ôå�*þmkÿÁ##ö:iÍtB‚Nñš‰÷úÍè}Mt™–ˆ×ÈÖK}À=ëýþô¾ûþUÿc,Ôñ�‘Ò��­<þí˜-?}îèçþèäýúþÇó£�9¨7ùÓéØF€Ž<êâþ ö³e•ϾûºÍÌë…’ÐW*¶úìÜv ¯Ë™ÂçMÁ;2ø~@2þ=•^~z*¿¹ÎÌÓdò{^ûÚ×Þzç�w~ËW|ÅW¼Éž x£MëkS©(.ßiO0{%8� U ÄYÈiÐpçÞl=Xga ÝÍ÷²ðæÌ}™ Ž=ðç½–ÉÛd ÕËbƒÊ ™ÇŸ‚èð·þÙB=éî$Ô{4‘C2�¤k¥£ò�©øæÏ;(™ëm''˜Û½�·`0Ó^|¤4³``ý’ 3ñPÒŒ?µ­é«ÿS‡Ç1Ë;º:þ ?§mÔÌ9Ÿ6;þíe~§ž|¢ÕÄÐŒATyh˜+àïƒ÷à÷¼l%Ï>ÄçºT?̓WʼdE �mƒÀpmÛ6-®†óÈãY<4oÌ2É÷ÁûF(—m{?ò-jæ^y4ó{làJ{2à�Û×Þtíµ×¾ÉÞ!p³[Ö®( �‹ˆ€¿À&ô¨[EÆO¾�êHF˜®‹—r±(@óâb—6ç=H`¡ fÌøÇ3f¾:àI‹Í¿ñÇj°5Ê�§|+=ðš…÷o{�i×Û/ èú[Ô¾N?0YOÀmN€^ý¯ã¿ÝÇÿ±•Ó_~äÌÁOÝuüžOÿë'ß{Óá$�ÆÐyÁ9:é=Å2ö¢ód’g?óê6·C{ž|¥B`Û! ÏÒm×ðjp!°y\‹‡æ�¹)ùÀ+°G¦»ÿ™—¾×eâå;Ó\¿U1´G–…®€Û[¾@\K`‹Í>¦Ø¤¶à¬y�»ý“'ÜN¾17û!H§PwGÛ+‘lDOµÞ t–ú€Íøá%íéd®?©œ•jiQ{_Í~QÿéÕWýg|ÆS~€º�Æt4ÕñŸÿv—ÿôÓçŽ}îîÓ_þô;Þõé÷ûü³ »8âTèyòæPñ Ô•WÀ¯@^ùy�¿ìDå'ûU}¢4^)ó’-¶%s¯eÛ²7ÕèB`�ï1ŠŒ`½§Èr ßçÇt’a;¶å:àûÍDƒL<”§®²§¾ž§®¹æš7½ìe/«§™Ú…À‹E@?ˆŸþ#H'ï©tâë±}ìÐ0ŠÇ~¿]ú˜ó"¿¶$>|�)%“o·or+¼�ÂF±¢üí'°ò¥‘‘¬AI:€íý-ª�VÐ6µV¼ÚKsz±þ•ÏuÁ÷íëõýBõzA`Þ=¾»õøÛ]ý/?töЧï:öE2ë×jDIDAT{´ÿ½÷Ù]^´§,:%2•J@®|Î ì¥ÏÁ¾ú�ÈäOTþTŸ¨U5´³çÉW*¶=ú¬Úö©sÈc\zöðŸ?ýØïzö#|ìù‡Ž%Óv2 Á4ù,Sž€\Fà£?�Ž•ïëÊíÉíïyò• �…ÀðY·£zU�)æ#�ǼxèØ¦àÚo þ‘‹Ͳ¾\ÎS'ùyu›jJ§üEFÚËKíW^wóÍ7¿Þ^*ø:û•�;m¡à6Q žJ…@!P8z€?žÏTØ.x;«ðœ‹�ýµË‡{=Ò�ÜeŒÀYPbøòE»‹OÒÓ¯˜˜Žröç>¬˜üã—¶ìc‘Á’<(w�+èq‹é� c ÿ²q½|5{‡Ãã¥iûúåéÿfÚgÖ^ÔS_¾kßfýË­è¢öWÿíX»ñø¯îY[9¹rö©ÃKÇzØîîÿщûïÿ¹ƒpàÈʉó?�fxà•ÏTò1J�Ž\Ázæ%S€O~ŒÏ2•é©êFNRJíyWÖ®؉ Ÿ5;±sÕ§B`òØÛ¤C×ÛÖ[ȺÞufÙX�‘².$!“.ÓAå•W^n_¸õ¦›nºÕÞ%ðjûúÀm—_~¹o6Á¾F†E �B`÷ À„[—s€~¡ñÇø#@÷€¼)Ò÷òó~þOøÛþ$³VA;¾ ¶÷ÛW<è6û}û‚˜‚›�.„xôrØâ»ù€zêâ�NöØÉ©x(©×‡t²Ÿ±7•·±™ˆoî&×ù×b”´¨?½ûEö­Ö éê¯þ¢Â$ÀdLLP›p»àøŸ]9÷Üó«çž<²|ò‰§—Ž>ùÈ™ÃO~ìùŸ|ïsŸ9dßåÏßÝ.íëѬƒ×FðÝó’õ{Îç?óØôy•£ø\Ÿe‡qjåÜ3Ç–O=qèüñ§;÷ì_8ýèSÿåègžxèÌÁ3 ›q(ÉDÑŠÏ´çÉ÷›‚ñ1ª }=:/ÐïËPo_Gß¾Ü�ž'_©ØÔÏ‹íŠÃ\�\>4GÐæ’£“ž`90ð¢èèóA%>Óy Øäò9/9t#›™ m•=2y%ñÞÇgŸ}ö8›)ï•�Q·±�+ìý7^wÝu7£=Ip“=9pƒm7]vÙe7ÚW n´…‚mÂE*[l!Pl²±üfƒ}ùQ9å3…Ï�'‰ö¼+kWìF&Ÿ»±÷ÕçB`>ùÜŸ)|¿)8Ï~,/ù<¾e#^õ©Œäô"ËÈËJR^üzIe#7›³‘ííýí±�½·ÞzëÕöõƒ+ì½—_}õÕ—ÛS¶†ðò—ÛWl áò—Ûâ�èËíiƒËmƒ¾Ü.³íe6I6²Ï~.|¯Å1{�’·ØMG§Sz“{^z›ƒMéñƒ®é÷šÞÛmò¾ýëÊûr*ÞË­¥Þ¿äE �‹‚ÀëO^ï~56UI?{}+$óÈv—‹þlÛ\ª3ÚP½¹|ñÛÈ•q‘¥#v¥ *E ÜXòŽÆÚÓÍ™0äæ é�˜´É÷¬ÙÛë-·¶b»ãVŒ_5›å×å¸g}–e~={éµ…~’°SʼdE �]‹@ÿy»k�¨ŽsÈçHÏ“—,à’K–éz<ºõôøÍzÕ“åY–yº§¼xQäâ;ôKº^/»yò\.Ûγïm^H~½:_ˆ¿*S…@!Pô\¬`r=¿cºE²¬ã‘Iž©ä™‚yñY'ÙÍ2xmò5¦—.Óž'ÏFʼò®h:ñE �B !Pæ …ÀÆèÏå3…Ÿ·õ�{ìS®—å2™—­ê’Nrz”e²C.^T2QäJâ{ÚëÉËfL'Y¦½}։߈�l7J/†Ï�Ö]v…@!P[•²•ñ¹È¦×ç|æi·ò=•.Ë{ž|Þ(£ =˳LüͲžÏy|+ßó¹ÞÌÓ6ò$ÑÈÍæ%/Z†@M†k›C ?gr^^Å‹öAy΋Ï4óø /™ò™ö<ù�lf6Øõü¼OÖËû2óò‹äÒ¯Giï¥J—²®KÕ§ª§( �—‚—¢/´®õÊõº>O¿²lŒŸ'“<ÓžË#Ûȶ‘ ~#6‹ê¹­ÈH’õ¼+kWG &ªǪ, �� ПS9/Úó’‰RWü%‡ŽÉ7*Ë~Öã©?ë•E'~=šuëñèHò¹Ùü"¹ô¢½?É/$½u\Èö–¯B (v9 ¼XýÙhóìzyŸ§ÝY¶ˆ—~ŒfYÏ“Ÿ'“nŒæ ^ú�ʰ³UŸå/çÅCIØäÔç³®øB øÿÛ³ÜÆq ÷¿õ‚%8”-ç3­§ÏÀD$EÉö RØ»›\7¡´xB ÿ¾jžqŒGqÎ_óÿìOÿQàhŸ¸Åi¾Ö§8k9ÆydœcÔkÜó£¹Ü3ÇÞ›õ:îôdÿ•Þ\c$@€�û\}�Üé?êés5¯qfžãT˹iŒZ­÷xšÏZãÅ=Žé¾÷Fžý=î½±gÖ2®c�§÷5‘Ç‘×ýȾ>Wõ¯Ž?£gÖü¹Ëºòéý×g6C€�û ä æ§îà™ýWkz½çqµv÷ùžç~Y¯ã*®kzOä½VûÏ✟ƨőû?²?ó¬ ø°€ÓÛžÀE�é7Ùk™?3NkjmŠã¢^ç²¶3Öžç~µqu>j=_ÕVë³~4Nç8ê7G€÷è/¡;W~´fšëµžÇ9k-ãÏæ³ïhœæ^©å5å™OcÔ⨽Sþ“þ¾€‡Ý¿oL¿Ñ^«yÆ9ƹ2þôxt®¼ç¼†ÚÛã)¿R‹Þé¨çžæ{íj_/'@€�ïè/¢gWt¥êݩ՞+ñÔ›µO�áÕ÷®µô̧̞ž:'&@à›<à~¼ÓxA`úÝöZÍÏâœÏ1.mŠwk«õGõ˜‹£žcÊWµ¨÷£ïÕç{~µ¿¯— @€ÀϘ^R�®øJÿÔÛk=�s×Ú³ñ´î•ÚÑuõ¹Èã¨ç{T| ð#<ðþȯÅE¸$°úOõZ[ÅqòÕÜN½¯&�5qÔó=*�ÏUýjOíÏxgïì5 @€À=ž}AÝY·êÙ­÷¾£¼ÎÕ8¾…š¯â+}½7ò8êÞ�ŠOn#àA÷6_• %pY`õûžê½v–ÇÅœõôù¼�^ïùª/ë}\­ï}=v]ßGN€÷xåEvwíÔ·[ ÕÞ{–Ÿ­éëó›»ZÏuFn&àøf_˜Ë%ð�Õï~U�SNsSmÕ›—ýÌš³=sï³quî³uæ  @à÷¬^„¯œí±š_ÕãÜÓÜn-¯}êß™Ë#ÿ€€âàKt Þ(pö7ál>.å¬çÕù+·{v®+{é%@€�ß%pôÂ|EbgŸ³ž³ù¸ž³ž³ù+÷¤—�› x8¾éç² |£Àîß�ݾխ¼º~Ú÷{NçQ#@€�û |âùÕ=w×ïöÝï[qżUÀÃð[9mF€À ðŽ¿3ïØc¸4% ðV�w½ˆ¿kŸ·ÞœÍ¸¿€‡êû‡î€Àoð÷ë·~óî›?GÀ‹úÏù.\  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ÀøVDÉ“@6IEND®B`‚infoKbplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-reference_icon_512x512@2xÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°ÂÉÊËÍÒÝæóö$ÿþ_§Ã=infoGbplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-reference]icon_16x16@2xÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°¾ÅÆÇÉÎÙâïò$ûic11î‰PNG  IHDR szzôsRGB®ÎéDeXIfMM*‡i     ¬†bóPIDATX åWËK¤G¯y茮®1¨„¨ÈîTÌâA0 !¢HÖzË-æH rØ[ØËXÄ §˜Í =$¢b<T𱘸a”dwÝ]|Í8�ïKýª¿êùf2®&9¦¤¿ªî®®_Uuu÷Hô§@~z{{/‡B¡�@Ͻ­œ[q¾žö?Ùz‹ªÂ—¥ëº.ñ:±œt\÷�Aî3ÿî±ãÞy}ó½C™ô>9ôõõ½ ¿æ¹k~¥çÉo½IÕáDÆm�æ 8änÇ3‰wÚÖß_S›A†††*Øã{Ü¿0¸¬e� ×€ Y<)g1èÒµh(rï‡×a :L�x<þ!;pÕt³_¤ô<‚ À•‹Ì •ÃJ�;a ^­�G>â.†¬!–o`@)‰Pgg'ݽ{—ZZZ¨¶¶–nݺE===ª"\¬äŒd;�çÈ®`“2„L\ñda§§§´¸¸HíííÔÑÑA±XŒFGGý*"#ˆ°™ò‹1|Eä—ÿ"n°$ûºl#pI¬ä}677ʼn¹¹9Ð ·j‚ s”cë0e¹,`æ!ƒ%ØšL‰NÞçàà€JJJ(•Jå͘.¬ˆè"\‰&•½®(²ÌNY,Í€Y�÷pEE…ŒÖÕÕåÍš.²/Q"âó/ÑŒ¨1tŒjjj$êææfš™™¡ëׯË6444Ðüü¼½h°À¤Ù[Š y‘Œjô¢ìÍAÇ£‚hll¤��Ëd2455EMMM´±±‘nl"rƒk2àEY(^� • f`aa�ДÖÖÖ­ ɾƒ¥=W¨äíFqºþ„œLlQböw Ž*t@'/Âq´ì1==-üøØ:/})BxQ€L °NcìAúñ�Ü—TZ–——Ǻººn„ÃáÚ��Õ·üÌ×�5_ëÍÄk—ZzGNb÷Ó_ޱ(h døÈm¯¬¬Üä­Ø³+. ˜ p\,àFT9¿»‰½ÏcßÞœ{ºö+›ÎÀ¼ü4öpÒ>ÜcZ¬ªªrùß³(+æÆ¿!¹¶ œeŒ½ñäeºŽ’‹PBÞ~3z&à¦Sçè©ÿí—Ó�ïß½ÿÅgß<þ?4¸I¢�?Á ÎÞKÜ^ôd8©™bñÒŒHO¸=áö‡'KúY¶ÛY N)è¿V[ʨÎä”È_V¿¯˜ÌØYÓIEND®B`‚ûìs$õinfoKbplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-reference_icon_256x256@2xÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°ÂÉÊËÍÒÝæóö$ÿic14¢‰PNG  IHDRôxÔúsRGB®ÎéDeXIfMM*‡i    øµ…@IDATxì½ ˜mWQï;»{ï���wBIé¼! EDA^B@¹^‚rnä�Ѝpàz<ŸŸrô¨DP…|TPôAPä%ƒò/Ix¿ BÉî[¿ªñŸs¬¹ÖêÕ½»{ïž«ktÏY5kTÕ¨ª1ç¨1Ÿ«i²d2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�Œ@F #�Èd2�ŒÀä,L&'5#0�ûßÿþ‡õÄÝ»wŸhðØ›o¾ù¸………cXVVVŽY\\<ÚàV·o‚ìn[öTPø¢Ñ´°O fÙÂ<ç?ÿŸfEúW [°ð)Â�P�B“¤…íã×Ûþ þ~ûýÇ왡¯/?k»j¿ñî·öö�V|š-ß±í�~£Õ|Çb~£ql¾mËõ ++ׯ,,^¿Ò,\¿°°ß¶›oš¢ëVš¯ÿ×W¾¾{eñk¦ôÚf×Ò—šë¿ú¥s>ö³ßže[Ögˆûh–Œ@óÃ?ü÷´D~ÖM7ÝtKä·¶�œjÛ·¶„~ªá'ÙBÒ?Ú–,s�ß¶ À´„_%°‰Û¾aùjÁÄI¥JŸhÎ>Ú‚ª€´Š#=ù¾€3U«~{}þõj»˜S)tû�Yø%›_|ÑæÒŸ±H~ú敕Ϭ,,|zÏÂÊ'››?~æûû…1‡’°ã"0mßÞq�Ø ßã÷ØuÔQG�·ÿþÛ[’¿Ð|¾­-gÛr–-GÚ’e‡Eà®úþfqaÑm » �Ä»è—aHðvÖix\ŒY´í¥‚/¸œÕ\2y›ަÐÅZI|RXÇh/A÷åûüš|'•>Ÿ§//[�^úÑ œ%ß·¿'î'éðºƒêÿÂ7¬í�¯¬ìÿ˜MÊ®ZiVÞ¿¸²ðŸ>éôßóŸîySßÖÜžÏL>ræÓ×åÕ3žñŒÅw¿ûÝ,--ÝÅ¿‹ìw±ñ|ùìž%#àø™ÝÍ“vLºîIÞ’è$õ%Û†-=gè¶ít›¬XÍ¢Qìú4EÉ Hé'äYõ.T­fòÓŽ’¶ÉѪ’:j„+Á÷ëá©Ë,~KšÖŸ¢±'0ËÞYõµ-à3ù7Çÿ­©š+ïÞ¿pó»WnZ|÷m¯ºæ Í3¸]‘eÎ"Gæœ9µSÝyàxG$îií= ~¿ÅáØ�‹ô{mx’M(‘ÔKº·D¶dgö¤QÎîã/Îöc ú ¹<\&NéåC§Õ«�'à.É»^% eVB4>%Õá—,pR™#ÿ¯]iö¿eÿþ•7Y÷¾é¼<ú}“üMÚð"0yÏž;ÒâK/½téú믿Ø.çÿ߀µåôˆtú€#ð3ºØÎà#e{'é[æ"�/-ÜhœýC£9ë‡/& Ð4!´ê^‚í'̱9–À­11ÊÄCgÝØ1K?†ÖUþ>€„=š ÇôyëÑÎ�ÕÏHÀȬVú†~ cí™2ÑÐ+HYÿ„¥Ó�ü˜¾Š6±þ øo÷>oo*¼êæÅý¯xËa7½éñïyüw°%Ë0" }sÖî\+ô �fî?Þ–GÛrË�Šô|3#ÀNæý¬ži€áKmj'¡[ê·{úþ Ÿ%z’ØÒ‚¥~—1ºË0(WÊd™4(‰²­É�Âà#Ûâ]뺡³æ úÐY—~î0fï:èLûÍùŒ]Â�”™ò={¶¡ÿ_0¯¸iáÆ?¼à�ÿ”»äžåj»F@ûÞvµo§ÛµxÉ%—ÜÇÎÄ~Ê–K,K;= éÿæF@WHâí“ý–žâjIžÔÈv�F‰‰�%±’ðáiŸ0Ú¤ÒOÀ\amÿzi³èzõÍâ—í@Ê,ÖË?«ý~ý6òÿf{fà5v_àù/ÿÀ'ßðŒ|€°ßUÛf;'Û¦+:Cìu½½öºÞc�ò$[ÎéjËlnô @$y»P’·_( Ÿ´Oro'>Q(ŸPÃmL8—�©Bÿ ÀèSóð(iá•pà¤2‹¿_ß×Ñ×ßçï×÷åûüýú¾|Ÿ½õ}ýëÕ×—ßìöרÿ£Ö�¿û™ë¯yá=¯~Æ }™Ü>´È À¡�ÝúÂE]´÷·¸‰ÿé¶œRW&žØŠÔW"é+ÑÇd€¤Ó&þþ3ȹ��ó•‰ÂVØ:®S74a`8m|BÑO ãú†F‘¯ƒðÿ³öÍ�ßøòu×¾ðâOÿ=´ Ï•½98ôÝ™‰ÿÐ÷Á޵ &$r¸­mD(˜_Ò†Fá ·8‹änPãißdüö�mq\.¸Êj½—Äg�Á®ÒÔ”ª�&ÐÕå§4Ú’w¨ÿ9h÷€C�L¾YwèíÚ 0ùZ´‡ûegý3ü¹¶äYÿNèùmæcœŠÅåx¦:9#‘ƒû™½cq óIƤÿ(ȪDú×Ö(�wð© ¸i”ÊQAß {hµkC´`Õæ �Ò+X4†œ�/ö|z{R&y´‰Þ/£öíPÿO±IâsO<æ¸�]uá�²çbÙUn”¬¶·vh# öÃ:ÛWúžkÃ�wh Òím�'ù[¤x=¨ó› ØY?tݰ�ü/ÿÅj»×½Îyt^Q'Tœ…_´ñͶJyrŒÐ“ŸYO›uQÛj ¯¯æ�„÷åû<}}}þ^}osÌ�1Â,�~}ß¾öôÙǶûò}†~û}þ^½mÚU�÷ÜØÜüä ?ð˜6md9ˆ G²¼�øOµÄÿë–ønÍfü^ì³¥ ð €}ð‡T¿hÃo÷T¿ÑÆ&q. w¼ÀÌG‚4Q`wÖÛÛ ‰3f¸×Uáå!ü5hï%¤™ ñG2kP¿Å,3Í�Ù¾|Z™©ð ùo󀕗}õÆÿúÿîú±Ÿµ/ʉ€÷ÏAXÑÃY¶> öŸÅo}ë[¿`‰ÿ—­¹üá�­�y¶°†<é*û�§ñ’Ü-™“Î"ÉGr÷·¬Ž Ìw¼ÎòH÷Ö@¹r`I Qz ǵŠ6É8Õ)ý4ZoÇÒÈk„ã‚Qþq}ÑÊôõ¨üx{ܾBÇêöÎn´½qþÑzµ ¤ ßÿæ+ +Ϻòý¯}Ž}]�ßÀá,[�Øs¶°�TÝ,<à8Ç>×ûb;P/Êxd¶S˜PxˆÏoƶgóœåëÌ>¦1!ˆT›,ZÊ*t’—””Øœ\FÜxìK­ÎßoLÚÄÅu«ëëËÏÚ–n %ýïÇ;âÒ­#þö �w\óõ—}×U?óQÂÖÕ'¶ÙÐT}³õ¦¾½–ìz~Ê.ù¿7“îÛ2$A?ÓÆºÈT¤vßòM[Ù?? @"«ñ º˜­³�âCwÀW}pwã»Îd�5.­].ýa/8†²P�»¨NZàx'ú"qc‹ÕLX\¢kÎ6Kƒé¿Ç"b»þþ·‰çEGí:ò½¾àÅ?uis)?‰2qϲ9ÈÀnNûZî}ï{Ÿ¶wïÞ+l »w¿2·3Û%<`W§ül¾±Oþ¶?dcnÿƒÉ>îùÇ(zEŸâªA +$M’@$Òq�û¯ÁÅ8O�,/]JÚë×?j“ Ù@M_$tlQbïÉ›�L|ˆ E–‹{ýö©­ôŸx¿ýû›7^·ðíGw~Z˜�lzÉ+›RŽ\¾ÛŸÃ?üß2ùonpSÛVDÀvY2–-‘°âµ<’?‰@‚óäè˜ 6Qˆ¤×Áý®$TµV*ý$[Ø€J¼‚“Îø�ÓÄ_ð° :¶tÕ®»ÛŽ�_fgë�¤ ¿k¢Ë•t/¡y+�¯�‘ü© èªB Qj¢áîO�ò[0ý÷@—~*á³Nµøßû˜fÏ¿}èÂ+îcT˜‚1Xr½Áä`ƒ¬Ä}ç´o÷?Íh¯µåøª.ÑŒÀ¶�g±üyF3+I¦ûcð�$k{6‰ÐyÄÍ™/Řmñ�>Û‚7ø;µ‚à±Q U Mòð8-´ºˆ¯àc¡úFh—Mø ¼ƒ¥¦HŸà«øÝ£Éêœ\Þ´ÓL‹›d«BóÁ8µÐ W!ÆÒ j>ð–_8Ðñ ÂV´4˼±€÷ÿø]+K¯½ê‚1¶ÖÞ»×¹:ðh7:p )Iîv·»yüñÇ_aø¥’ŒÀP"À—í‚EÎì«ÿ¸´OáÁ’e"¯³¤Âe~¿B`xÇ·ŸEÓÙ­Ÿùšž8#'‰Æ°CRUrŠÄE�g.$ üâ-â&º¦é7á‘Òoo¦>k?|´ß3gfû³ìëÛ“þÓïêsºNx×ÿû÷¯üå‡nþâ£äÃOÿ†1hG�9ËD ¯@Ð*öÌ…ûÝï~gwÜq|È"“œD�[m¨5Ä2"É9–’ŽJ¶ÝoC- �—ÄÅÂ$  ½PpAèÂC¼]ÂvÜuÍ /´ ´…"èc«à)Òa0ÜHlÄЀÑvà¨.ê[X·¥öQ^Ô¹¯Ž»ÎRgxË_po¶Â»úôßãi:Ðþ7ùKÏß}Ë~Ï¿ÝSº/ËD '´"â;Ÿ%ÿ;íÙ³çí¶c^xàªR2#pˆ"`ƒ1—ûIZJ– v%À³ž­<‰ô¤éãm$løã Ö+è¤Ý>^;Í�¾ÑP6½-Ã�ž ®„]ÓœÕn¸·Rô^ôùtÂp ._ 8¢ ;]]k/ èjÁ‹zß š£ã+—u‘¢Ç¸�V4¸°­Ê¦ûbxØ1Oÿ-D%.@ Ð…G7ûÞþ¾Ûýá�l«Do<üI™�œÌŽÑ$ßéì«~w·äÿ�ÆpÒ$¦¤e¶âiÿÆîíG¢±Di8êÎ\�Qà Ü“«±‘ÏHRûWö� ÒÎæ:Œ ½E*\I´®v…O«—½±Ù€žÈ ®öÝf£ÅtÀÖÂ�¶À'¸3 ^¨î »@%jAétÜ!—DÊÿ[Xü–ÏÞNE]0l {hƒe‡ùÒK‡ýã‡nÿGw·`Ò)]Çâ,kŠ@NÖ¦&ßÙìa¿îÚµëuVsÌHmndË2VHŠ$XÀç Aaò|ÅPË$AIÈ_ý³ ´âÏ,tWLH¢¡ ·Ö�íGTáE·Ûa�?ðò‡4¸ÊX¦ÞŠ:gSlHvº>éÚ7]a ÐÚuÛ‚{’.ÜY §ÆVo-〶8o�àn§`ñšJú¿rÌî•=¯{ßôÀˆ w½Â“p È À‚T±ø¡j_ö{„½;ýWF?¼ªK4#0À°K—äh(‰Ìßÿ/¸mÆÁ䉊ÄmOF%AQ½À•+’w>ÔCFe:ndACÛÑ_Œ¿…ÈB/Ðñ"—s‹ UuÒŽ‰Iš BáGŒ¥H50«uˆÂÒ~ñÇÅÀK�…2†8ÀZ]òCÐåXYA�/ð�Oå�árNÛDp‡øøÍž¿úàíþè ›Á,kŒ@NÖ(cóc‘äo_ö{‰mïZ»hrf¶iØ«ITœ½ƒZ‚ÔY¦'£uW"�Æ‘€ŒU†Pàl#§¯¥®ðÀG4Tú½Md¬Îið°´ú—Þµò{rE­¨étÚýÖJ´éÈZì ›ñ9äÁ‹žÚpŠ ¡îO�ò[0ý'0%^%žÂk1Vœ ܵgiÏ‹s`ñZgÉ ÀÚæC†Ýó¿Ä’?¯úU‡ñÚ$WF`»FÀ¾íÑžƒ-Y*�)�¶gôVá4s$dÊa`2<7èGE•lÝßÂâ89¥ è>å0Ó�ÀƒÉÖ’-º�Çð©ü­à‘ž~· šì+±h'˜ME8Ðg»Å&ˆLú‘S|éàÍëÿÅ=‹{®xÿ/¸„^(K´—ë©È ÀÔд¾3ñÀŸÝó¹Qw·5‰d†Ëú$5:9Œ3*OrìõVü�@`Ð&ãº_ p† ¹  #d…:g,8º'-ðBWq�¶1M¾ÖYãÒMóà@_°£Òg¨ëRÔ¶äk8²×œ¡�zŠó6j/Û*³ä©—ΗNš÷zƒàn‡ „‚Öµ-yèà*Edû¿{osØËÿý¶ù` ºlÌ ÀêòCá¾÷½ï�,ù¿ÊXóžÿêñÊÚÁE Fx?». gÅžè× ÉÝœ*ÉD—^I õY¿ÏŒI9ÂÃÀŒ‚âgÇÔÐ Ž�¡÷ä]ƒÑ€5>Ui²� 4TÐÐâ›°Ý.[9,¬à2ÀýbÛµ­FòRÓj\õè¢H¿p'Úª–1¼ö¹Æ§·_É^4„ ʫʂ·ÿ‡ïÛµçUï¹íóóÁÒ­«�œL�Ž6÷¹Ï}βWýòiÿéqÊšG@9VH2¾Ø°Ðæ®D.*)È«üà°ˆO J2úÖ�PI@(ÖÉÈ•�’jV·ÅÛ+fc‹/è©ôIw+`uà* °ÆK½X[qÓí4o£0�«Ô>¸OVÑBÆ_ k§jYc¡Ô¤šUâè±&ô;,•tF«¤�Úç§ÎŠX�Ž÷Ûƒ‰öTh‹¢öÙth J· ÁZÖØ(5 \¬@txÌÑK‡¿î�·{n~,ˆ¸¬Rr098¾OÝùÎw>ê°Ã{… Š'NfKjF`øðnn,ب Þ^à(°mrã´Ÿß·8Aúm#Å ÒÑbRS¡lùÀÛ¢�) ½j]�›cô­nKí»VsfŠv÷ÕM!»°À(h81€¬ñi µŸÓÐËB٘ ÞR-_ÓÿØo‰¥bbq>ñKǼâÏ|úQ%ÊŠžG:W�œŒï åðjO>ùäÙŽ”_ø�QRæ$$2OJøSÎúøæ›˜ Í~.ÀI:84šÆv°`Oüß×>ôó¬ñª¤dæ,Õpª„æ ݶ¡Ý '¸ DâV"·¯ÿ•t©¤9)Jäa �¥Õk4pŠ 8¶Ê.A—µJA8û 6Bs»™pð_`Û J ¬ñ¶Yê ÖºÕ.uàÓJú‘9Øý¿wq÷³þýüçß×ZW·Në¢GÏ @×å~Üßã÷8Ížø©‘—ºªÄ2ó’ª’-^’Äê„îtÏ`ÁÛò#[ÒžF×–ßdÀÛiž Å`uõ� ™ÒV“h�`ë’|[蜽•Ûg4 ÛxÛ>›•ˆ|úâìá |´-è¸ñ Ö²RIè|ôv�(è bZéËã«Óð=ý/AR”bsdM¿S€ôiÁ .¾¸ï¥oºíå§ «(Ah甜D_k§Øuä‘GrÏè¸�³ ¤§;=íYñ”@0�FŠá¢;.ß ˜"ç1ue@öQ×pl®—j-eÐVBQj×VÜc•}ÞNI¢Þ6u•ª>?U¢Ul-ª:éŸÅŸþ—¾Ûýo{îq§,û¢ š ø‚«vÁ¶ow*’€ngX´Ïü>Ñî{íÔ�!ýÞyPB,çš‘<- =b²ßÆrΩÚdíT�økŽW>ÈoAtõå©s]ÀJ]“ ¼”iíÓEv÷Û£N:j\új¥£†3õU>ÈoÁZ·ÚÛjÿwÙØþ²Û=ù‰æ+yOÍâúŽ-9ˆ®_¸×½îu®}æ÷Ù;vOHÇwdHé<ÈÇ€LoÓ¹Ó­ÆiŒ˜6f\i%’@ÈH°Æ]ñVµ xèîFj¬T{àÑŽ`4 lÁKJNp-ò³Îà¥HQÛa×(-¶V_÷åÃÖ·y P~ îTÿ�XÚýì7žýìsKHÏŽ.;}àÇÆÙgŸ½ëðÃçÿûvôÞ�Îï¸�Ôyò_ékä-ÎDù+grð‡NZQ²ã™i‰š%xWú)ŽÑ"IA™&mR¯?á!ƒ&Ù ­‚¡7¬‘t´Z£&äᥴ¾‡Aê¥È¢¶C/£úÆ%à�–Žwš|X Ÿþ„‡lmƒ´ †-ᥤ£�Ð5� Î_ù,¿kËi£n{šý�¯’¨µtmO“Kå³ìµA~ º?·}§ï=ùŠû7gç­ ÊNžh?[:çœsžb;ö]ÙI²dvR4@jpÕÃmu ìÃÀÝèìiŽÁÖ$íâ Ò�ùu#0�^ÁÐ7XãN[IXãb¬iàhœ¤½Ï�ÑÀûEuÀŸæE@x'ñ�ú<ÉBiXë¨qqÕ4p4 NÒÞçG�hàý¢:`�‹o¨þÛ¾~×ÿ}þŠùÁƒÞ„Já’k;îä �¼`OýŸj—þÿÇŽéñt4#PE@#Ÿ~ôgÁ¾ø£É€Ø|�P(©ÀyìvÅ' †úõƒSŸ ( ëWí—ªÐO0TŠæxánõâú A“”¸Ü­+Å'ئ'„b¡À/ÍŽfE÷ßj œÄ_Ój¼Õ×Cä+°ÆÅVëp>*YÙ’þGgLêÿ}‹{þÇënûŒSK´ˆÚŽ,;uP‘féˆ#Žø_vöÄŽìýt:#P"°À/û�4ìi?Ÿ p„”læ¯ú6)ÞÕ¶8±P:|”§e.ÙɶaµÅù ”Œ K©) -^W ø'ñÇ$…¦â§9³­zú±Éik´¯/ŽZÑÀÇ z)kÔß*C©-é¿Áã ~ô¸*ø%^«÷ÿÂËK·þ_&·£¯ìÄ @9üšÅ{ßûÞÛ~Ìwž\evhÚËþ6pú=Þ2€z¦2¼=£·ŸôAÕŽ ]1 ™q@y†*¸ë¢*#²è¥ý«ÐÆWëpÝÑr.ë,bBq¯¨ Xã=¶vs–}¦ÃÛ-ú\¥ÓŠú‚{[^YµK#³ô;»+YH®ÛWnCúqR,Bã%X¢sj¼pîYØõco½íåÛ&yqŽù;q@¯ÒÑ»öîÝûœ‚CË’Ø�°¤n×—u&Åd T�nG‹ç.[i‚àW �‚æQ3ÄhŠ`l�¬ëËÚ5Þ2Iv�úÚáƒX�t]¶l sBÛ䎅é”Aô :^ÁűQû\ã-k­£Æ[†²^{]\Š{ºØ\¯>We+ Ô NR_ôãû!òá–KG?g¹YÖ�¬œoÒN›°Ë±ðÎÿe6˜ñ›ÑY2;81 {b' ¶©É@l:¡ÐÛ«#CKLÚ*HU w¢q—ä¬ñR=ê$Qã-£’ °Æ[†žA¾i«)ö�èX‹>oGm؆Ð)úkŸk¼5·‡Ô>×xËVÛXã-CÏ ß´Õûv‚ÿK KwzåùO»ÌB´#¯ìÄ Àâòòòöàß/·ÇE"�¥ öœý×W ¹„„£IBàÔð !õÊ6µ-™j±R¯Æ�5NÝ„R'Ipì§ÆÖŒµlÖø1éÖøöQ�“ô×>×ø…é†8¨ß×Ôý¸–>9rqß/ÿܱæ90Múœs»½“&b,‹·»Ýímðä¹íÕt,#°ÖØá ¼$ ð:¡£†ªtcÄÔL8P“gFÈJ=(×xÔÀºØèmxÛÖx�º2!8©}l¨—°CËâB¬&÷Õª&ùï:CW)µÏ5®úuCé.öº¯†å· ºë6k¿…§ÿíþpòe§Ü�œ  €"½î.šÀN™”C¦Y¸ÍmnÃÙÿS‡ÖQioF`+"@2ó3þÈí–Mʶ5ÖŽ‚†p¦¯„Ñ&x�Îómâ‘cK˜L-¼ž•-ÂË&º¼}t‚[ô ç7¬ð{%¸1.ÐoŸízq¤ H4TmK}ÊÖÖžž|¿}”­4êmÙªlz{†«Ô9 „âü‚S)(FAØ ís�#ë<ðÞõZ{P]/ðzsSäûíÓHЊ€·i«²)]jCm½8¿a…3ý?bqïSŸxÌ%\`GÒâÍÎój§LèC:uñ‚ .x´�­Üjž;5}ˬ'>Ú±²²h™Þ†iÇÛñÖÇ�…\°·ø�›”¯ BsQ_ ×€ÎU‚À�Á(ˆ@­;ôMòð1P? åC ‹5¿ U+ÕMÓß·‡ízANvÖºÔDM‹6Òÿ.ÑAÛ¥ÿ—,'<îÔÔWÔ�s wÂÀÇëEîýï³³¾•%#�èGÀo�h5@G¢õd½¤]ªWìÌßÙ ò”úšGêàa Ks¡¯HK×4þZ‡ó”ö±„Åõ8I¿U�”š§ÆÅTÓÀûíÃmZQ�Ûšþo»þ?jqßS.;ö|~ÇÜ Ø ŽGF3¿÷o[žý‘,‹€'2ƒžœˆMËãQI1ÆBOv~Å .ýÃLQá°Æ‹ª™@6Yú ¶¦Õ¼Ó»�V¶�êT5D�ôNÒÙ×�hàµÏ5NÝZŠÚ–MèŸf?:%3I¿l›&¯v׫~µá²¬¬àû�ý?a÷Qä Ïs`Ab¡ã|¹è¢‹N·oþßoˆN¤Í�­ŒgðÜp¼z À£j�÷DÑŠ'|^ÿ3œÂ$>pW'¾]hÆJíL“ï׋OPmY(‚à2è‹­Z½À—þš.Ýj>ðiüȬVÔö4ù~½øÕ¶ì¡-p¹ôÅV-�^`�KM—nµø4~dV+j{š|¿^|‚j[öиŠ\úb«‚@7¸ga÷ýþÏòSNg³Z¨ž»2ÏWÔyKÇ{ìc¬ç¸¯“%#�¨" ñÑÏúmÃß營­üU?ÉXÒ2 ߥla?dx¼ohà”øjP¼ÀI‹·ëF…–>?ƒ74 E\¢À§ÎKM4ÜõX·%öî™&Iq;Dp¿ä¦ÁZ¼¿ 'ž¾‚å· ó³²b,é¿G¢‹ƒoÊJ³ôí;[9ƒ=©ìM^;W+~a‹:lÑ>ü³×^ýûoóèä¡öÉ&VÍ­o}ëæÄOlN8á„Æ~Z¹Ù³gOsýõ×7_ýêW›÷½ï}Íg?ûÙCmæªíßêV·jN;í´æ¸ãŽsöíÛ×|ó›ßl¾üå/7üà·½ý«:·†J%¿Ôo~?¿Œw~Ùjä,Á/ý“ø©ÝoË¢�—û};tuß yé¯ñI´iõÐë2"[*t°³YãJ†JšÈŠ&�µ¾V¸(‘.A×_oôÒhèŠ+!“ô«-Á¾>Ñ¥£†u�Lt}³|Mÿ#(ÄN1Q˜êxÖýÄÒÞÿö]Ç~ׯ^yí•7/;:aÖA⃇ó: cüÎ9çœó6+?qð=uˆ ±Ÿ}öÙÍyç�×XL›3Î8£9úè£Wµê'~â'<‰¾à/h¾ò•¯¬Ê{0+oq‹[4w½ë]»5Ô,//¯ÚôÕW_Ýüõ_ÿuó¯ÿú¯«ò ½’¯ùùi§û+vä�à5Úq`Ɇ?§Ad(¤p5ÜhÔ ç§‚}Û™¦¯4¯– jé5ñË6Ôà.ˆ®w‹ýÞŽð¢cf{Š�Ò“âôõLý=Ñ5ñÛ•¯‚5ÍUϰf{3ä½�UV3õ÷d×Ä¿IþÛ5­/?éa÷¸çµWþ�™A.a"0w¥ ×Üø†O,\òßsÿûßÿ÷íõ¿ÿwn¼;HŽp)syy¹¹ýíoß\xá…͹çžÛìÞ½û€Z¿îºëšßø�ßhH¦‡²œtÒIÍCúPOþø·žòÖ·¾µyá _ØÜ|ó|�OþðÝâ`±Ëø6K\Î7Œµ]ð+àNµ:ŸUÛ¡Eø‚në7ç™Û &Œ™ý5¦ßìPÖpá>ÃL�=ü’ª„×Púì}ukP±*˘þô#ýÿ�ý7¼øxÂÏXÌo´…Ÿ¯±³�se^¯ph-Ú%êÝ–üï?€~Ø&Ú›žð¿ë»¾«¹Ó�îÔp‰3 W žüä'7¿ø‹¿ØÜpà ›¡r]:ìÐæ�|`ó£?ú£<‰¹ûÝïÞØ­¤æ÷ÿ÷×Õö¶g¶áÌï[Û¸FBçî髸­èF`ÍT€1ÐÏð�ÈÙþ"— (Ì‚1¶…)c Ïå–B0ôz›cò³ê1†6ݨh9ʘ=Až¾–`�€Õôy½ñHl¬½ô;÷ÿ¾ÅðܻûêæÚ›¬¹  ž4t>Êò‘~½ú§éäÙ&g�µñO@\|ñÅÍ{ßûÞæïxÇ´æ†GçH±¢„Αãøá_—ùƒÍFÀêò¾’wÑÁø#d!ˆ. M�§‚5Ípɵêl bmº­HØÉ´„ Q� U5޶¥Nx̓ŒŠè‚Ð'á“h®C B¬pɈßòÙ9Ó‹HÄÄÃÉJ1k ¢:Á>?¡§®t�=sÒóÏúï=àã¿ôO¥¦ª5Ê”y›¨k9%Y´º~xúhÓ]àŒœ„—»Ü¥±ŸFö3ÛMod‚Âïÿþïo^õªW5_üâ'Ôn> ß~ögvæ³ ëi™«ó4ÐC ÈõõC€£1úUFWdBN׺¤î•ÝŠÛûð:,¼¢ù&u°´ú ñ«Ap{LAxlŒµSE_K+Õ�aS©qÑåkú_ÅÛ:£�·%¨~„^ãâ+P}½•ý¿oq/9äé¶ð Ö¬ÖåV=¬²¹£ã¡÷�òåû¾ïûî`Þ­½I‡ÖûùcOºÀC‘ôûÞ[¿4/{ÙËšo}ë[ýªMÛ¶Ï>7—]v™'›MSZ)²WKçfÀhFR÷"P2¦'õB4?ÀJ<�A½? Ð@/ÈÐé—ë5„" ^Ú@^éÞÊ—6[Pä$ïtÑlCÍN¦tµ­žÚžr™=Ú”±!3ºÕZÕ"²[ƒÒ‚PBDœDC·cÿÛC±·þ‹3éýÏ_{�›{«<(Ž ÌÓ@‡¾ŸýÛåÿ{ ·[6Ïò3Î8ÃïíÏÒxíµ×6ŸûÜçžØÿÎw¾ãËuÔQ~7«ðŒÁ�ï|çæmo{Ûf©Ñs¯{ÝkK“?�ñÜÄ<8Œjö»è6&Gî ãtŒÔ�‡‰C|`É`¼ÐærOo|ï*Kƒ®Ñp�¦Ñ†ÚÒH;ýo?atÙ$4†Å�þ~Ÿõíëó÷í yY+û:·úò}ýý †ó§ÿÛ¾ÿ—;ñÖ÷WÚÂU€¹º 0Oë?Ä8îíòÿ÷AØéåýïÿXn¼ñÆæãÿxó‘�|Ä—ÿüÏÿôÄ?Æhž|çá·‡?üá›v/�÷ï·bÀ3?ù“?¹egþŠÏ·¿ým¡s=aÙõÔú9hN7ÈÌÚÏÎ-sq‘€Ô7’ìë> `òüÆŠê€éRúõâç�É�u§%°þ>Ñ‚ct-;ûöŒ·ßù M²UÛ5\¯>éo?ý�˜(BD»ÃÕ×¾ÏzÍ�õÿ‹ûÈ%ϳ…æÔ †¿Ìã`ÑÎ\w[ââ €_®¹æÿ*ßç?ÿùæCú�˜‡äÏYþZ ï½óüÇ>ö±æ™Ï|¦ío-r«ñðm¾¸Ç7«ðêâcó˜-OþØû¥/}i³ÌÞz2Õ¼”³{’¥î÷Gâ×Ði™HþHÅÀʽn!™@µÉ„ßooÒJ‡W�­ü^y‘™&?&´ AA×Y%¥ Á¾*�ôŠ�â$þ~}ÌŠ¬6ý÷PÎKÿï]Ø}Ñ©ÍQ»?Óüƒ¦v‡þî2Èíyú>>ãË.Kw°Ë´Od�l�Ñ÷w×¼å-oñ Ÿ¸Ý¿Ÿ«Xë+ßøÆ7&<\·Ñ³\uجÏóŠßÓžö´~Ç=þpõä%/yÉÅp=í,Þ»~å6þÞ?9‹ôÝ&ñØ*Ûñ! ÅEû�Æw¸J@:×7�õ �Ñ»‰ÁèhÓƒÒŽñGB ¸5ò "3 ‡6iã/‰Ú}®pø(ÒÝŠÇ'6ðmê„ ÒúB“Ç9ýLÿÛ¾~Ø™Gœþ·¯ºöŸ?oý¨ï¨ÛéÚÁ–úX¬f¸ŽwüY´×ÜîÑØTÛ‚Ðê’þ�N�6³ÿ÷-í!§pË\y†�xòŽ\wÊ6ÇÛcu›Û¹Vóì'i÷ØAsîZ’o}¸é¦›üŒz}R“¹9?зýù’á¤Â/÷ñãC«M.xâ�ÿø�›§>õ©Í?üÃ?4«=ÙÏÏÿʯüJóáxRsƒ¦u#X$&?£"AÙâuÛ'F<óØ Vû#91Èò8Ã/�É€dÛ¤‡îiEu@[$ tÜÛµ ƒaC©‡,Ά 8u‚ŽÇ&Ô(ël_i â“¡ˆƒÚê|HÿKÄcż†ªÚýÐq‹µàÁîÿ¥féÜå#–ùNºïRµÙCÆçá!@:„…«<x¡��>zÈ�²ÝmgÀ�ãl´|ýë_o¸¢°Þ— 9û÷¸'üö·¿½yþóŸß`ãZ göÿöoÿÖ¼þõ¯o®¶_+ä3Å<ìøÑ�~´y÷»ßí-úÛ¿ýÛæ¿þë¿Ö¢np<ÙC€~–ïÚ=ÀW®ÄA �³þî�ƒ >ÖžòÝgømÕÖ¹>Û.&áž7'Ô»¢j¥þU‚eôwšgÚŠtÜmböl� þÂîñ»ãoõ¢ÛÆz©,ú=+ƒ—¬ì~”˜À¹ª¶ ˆÈSk¥kš3ˆ{úïûY ÜhtP h�nÃæYüeã�h›>C6Òÿˇ�|;Óò¾Ð4ÒóFf™—[ô1Ë¢Ýÿ§“²la¸—Îeñ�–ÓN;m]“ß÷çÇŒú…³÷ç=ïy”üûºvÔ¶�¦R•ð|àÕÀi�A‚ƒË`E‰š¢£$N®(x¶ô£ÒVa2!p - ‚ŽÛJ0d ½¶D]@ñ F¥ésŠ­{«p ”ý‚ðË©iö™òPÏ:°NhÏÙl%vô‚OÓ_X[~÷»èMÿ#â%„‚` A£ÊË&÷ÿÑ‹û8¹ÔáàM—– æa@Ghá €ë?­l÷:Ãß÷>&Â+|epyyyÍJüà7“Þà^ÿoþæo®zÍ�ì@F&Vœqé¬ÔÃ`Ÿ½ÒxàµÆ&eâÙ~Ipžp‡ÑÙ;È&º]o¡Áë‹­ZhH±¡=Ú©sZá¬ye�‘Û$EüÂ�X袭EíPÔ^k;4¯é ›é…8  ÿ÷6»É-õ@{Pø1ÀõwOç÷ýÜÚmÆ1 Ü3W"#7Z�'2c%¹ÁÎB…Cp+6‰©÷�º1�àÐl‘.%Ìš&½‚.ØÔ�‹W Ƴ¾"Y`�-% µÿŽOaQá<¶ja�—æÒÿn?¨cá1+}Þ¢±q¨úÿ°¥ÝËfŠçÙ4t¨£~è~h—±g“Nº3C°ÿÓŸþô¦<wÆgÌt÷ðÃo~ú§zâ}ÿ—¾ô¥Í'>ñ‰™:’ar|H- 8^ÿ³1YÉc Â×ýà�0_ýëM�EÀ[µ°ÆK½x½=5Tɛ˭øä¢@¿ò`r‚qe¢ØîmºÈˆ|¡t¿)ÅwR‰‡)‚ŽÆÆÔTÔ¥ÿ,ï[µ°ÆKýÀú÷ÂÒéf99“¡Ú3lk eèu„C{­ì–6ìh_ ÊlÞÍx-îŒ3Θé÷e—]æïí÷ùÀOïgÙ@ìÈñŸ¨5ÈRœý{¢eàæ¨2èã´á| õÎSphí¤Áp—«hÔy=U(k �P€5îÄÐZtº¨ëEOØ!Ø·§¶Ií÷aÍãm`mÉáÀÒžà¤ö\¶ð‚»¯ÊoAÓh¥ö¹Æ£Öõ��éÄ‚8¨ß'õG?þl×KÝGãýo½Ú÷ó·ü‘“ºQÏÐIÃ,CŸõrx4‹öq—åavÃ0­ÞŒ Zíç†ùí�ïû¾ñväU½¾ð…à Ü6²ÚÇlRg— øt09J�ûaÉÁ©´àÆ*>A|0.œ}CГ£Õ Â�VAo½üMÑ�O^€˜�x�5î|F¯ã ßkˆ ÛÓÚ[¯}é?C—Äßvìÿã—Ž"Ç°ç° ¾ } Žphßz?eð=2 >ùÉOnÊ“÷gœqÆD¯ûØÇNüùáW¿úÕþóÄ…’¸¾TÃØè€kCƒÕAóDçxlÓ4^ ô‰¤Ãa±¢   ê¾Ðç ¦C0ôHoˆö°ÛaÀo“2bV­…­àáB�ûÐm¸ÁÂm¿Ûè:àélÇŠ`Ù P,Šºô_ñªcè±µ ²íØÿGîÞCŽ!o²çh)ý<<0ô €"îaoä@9�_×ã‹y-gžy昊üÁlîxÇ;ŽÑyßÿ¯þê¯ÆèIØ@ÚF‹³n>ÌAE:Õ(×O`…¡}†ÀGocVum6¢Y(‚±5ºFŽ"yô;M8Á9àòÿÂã hx?� é4+JÖJHøê8ÐþBå¨ÿNsݦÀ6\D[d«ìwsÒ‹¤ÅÉŠ`l�®=~FRüê˜zg8¼àeÓ•ƒ—·¢ÿ÷.ø@-bÀ ËLihË~>h÷ø�‰•K½x%\â ØŽɬüº‚Š+ÜPêûúÝ-[O±k­#Ú+¼(®¿Àº-çÅŠ`�C›ÐäôXý¿{a×ÉÖmÊ;†·Ìç€Õ 6¸åp»b˜–ä#Ù°á§œrŠ?Èò0 >îq�köîÝ;¦÷¯xEó©O}jŒž„�É‘ìä÷«I–¶‰ÎfËP‹|àß ÉjÿÂþf‘þxßß¶ýyÖlbàj YjÑÃÐ0SîIݶ…«¾(‰¡~x 4`ŶxU¡0.< õj+ÚÇ~ê€O¶nC1hÌÞh-|�½ÄA ‚z»ècSmÒ‚ðà¿D“¾€p§ÿ]LˆÇúW³t«b);‹v$¬dò€º·÷„Aö€�æåm¤0à.//»Š{Ýë^Í\0¦ŽÄÿš×¼fŒž„�E€ÜF‹”Å…KX®²PxõÏ 4¥y¯7A8ÀÚPâ"1qPÎ4¶n¸DÈ•ØJÐ�àíä©‚ FOÂæD@gª‘rÍâíQǽ~6 —ßÿŽÄÊ OTÂÁ6Ÿ Ž Eè :úb¬Ö¸êû°æ ¼;K¤�P0pô¢% V²NN£üÑ~ØèZ ŠÎº-Úž´„ÏfOùsnKÑJÜ÷Ú·¨_×<é?�±=úÿ>ÇÞ•Î$@IDAT\£«ã7 ÊÐ'ì~˜Ú€¼ÿˆv¼ÍxÐ>â4Ñú—¼ä%ùÁŸ‰‘ÙL"I‹‰³X�µvg›ºàõä>¿É5® ÄY«&ÁV H°Ô”*%h¨‘´Å'Yà¤3âÕù뤸yࣅ† ô‚‡þ�ú°%â »±P80ðÎÆÐé\¬&–qyé;vQ¾º�Z6xÄ'#dñY~ ŽúšþGŒµ/¬Þÿçì½¥rM0v08lÈ‚OñN°�›¹>ظöÚk›/|á ›Þì•W^Ù¼ç=ïÙt½©°�H4¤~’¼N$ ¾òg$[àR! wØ>‘k}r„°J´Ó×�üˆ.·¡4Zá5O�Ób,´S·'\õî�ñk[�£Ô´Ù ´¶¡Æ§Û³>ý�ž°¿n£Æ;>|�Ï5žþG\ˆ?±Ö}A¬(5mzÿ»t$¹FAE°:Ûƒ)CžÔAæÀ£kBâ7›q ¶˜Ÿùý“?ù“š”øVDÀǼEú44Æ$€Æ8û…Ac†Œ28Z•O¸`¸�‚®�•#4´WÔ0pôË é¨! ¤·ÆÅ#Y`�—zµ•ØáqšøÑ ®"\õ0ƒ.k«²éˆh¡¸ðJß( _ÑȧÿU|ÛÀ¶îÅÓƒ]hà’]kŸ«?ý®"\õÑÆ¾¥=äUŠy�p&Þ;KKKÇ ²æÄèÍž¼öµ¯møÁŸ,[�2Œ)ÑI= ‰¶ƒ—÷KmyÞ‡Bc .Ö~HN€È• S;À‡kR‘�‘.C�hÁ6Ê’Qšm©i™ƒhÁÜ[¯WŸ)s}j G¬}®ñží¦|Mÿ#Mx‰ÑzûËÄjñ6ÒB&볟&רsÅý?Týx³‡\3»Ã¼·¶÷j被£'oÂ}ísŸû\sÝu×mŠög¶)?2´)ÆÌ» cv�FÊŠD#×Ųߟöï‡^$%d5”ˆÛjãFµÃ—Þ.Ù*QR3ÚvÇKk¡ÈŸ’¿bHwò}~lð? ÛÖÁFÐÐÙ_·]ëîÚëüïä:ùÚçïôÊÖô¿ëwŤ‹’0úŽâ}hëCÕÿ»wë@×Ù2r`PGíÀÌvs ¾–Ænä€CÜ‹›qફ®jÞñŽwbOvNózš¼€Û�¶$p޲‘äY†`db0Ó× »¼ÿ¡¢*Ú¤×I²ÆÅË€OépàªïÃ>?mûÐï š¢†ÏÐÜ÷zòPy±BFr‚F)Áõv+<Ú_×>׸8±�â>T¸êû°ÏŸþ—Èm°ÿík€Ê5Ê?ÀA–¡Núg{ß {`ŽŒÞŒ×¹’�åàF ;£ŠÏý¶‰£MZ‘Ì|øtZ ¤XÉG(õí'تNbžDIœJ¤†S"�::–0©#iɾ>ÿzõG+ÝZmOÓßOàò?¼Ÿ} ~½öõÛKÿ·gÿÛ[1äšI9¨Û¹‚M~ùz Æ—N #ìX[ÿõ˜áø1–nÆûžÃ\ÄbXND_°/ú‘„HæþËF&‰�>ë§Äjäö€',›½” „)�M[£+¶A»Ë¸0�XEÓv ÑvK{æBrû„ËoAZIÿ‰Wõµö—¡ôÿ®…]äº^Kñhx`¨WÆ"míácÄ$Ô\}õÕÍ�7Þ¸¡6ou+~l+ËÁŠ@$°2({"�¤Ì·ý}€&!–qN7ГYkd$B§�ˆ@[œ§ÀZ¶kSAhŒÄ 8paM¾-Â�5Þ2Œ"JÜ@OæV-(¿Ýø Oð• „G øcxX£?8:|1›Zh¸×NÝ‚~ ÊoAç¯}®ñP6¶Æ P~ ÊoA· ý�¾mã5¹ÿ­—ç&×ÌàsóÓ)cGò@üXÏÇ>ö± YkŸtæyŽ éHáµG€�4ÉÔ²%��œlñ«%Q!㿸j‚«uuí Ë¢¶=ù«'*Á*yµZÂrd,Tˆf¨ü�~Ò±ã@÷€Dí"VÛPË¢6Š”GƒÁÓMPj5§¤û°n£n;´§ÿCéûùk&žwú}<´í!Oè𹙕ɩ!Â�Þ ùŸzê©Ct}�6[&óøhfÑ/Q{º¬4Ž‘¤¸*àɪœ!q«€AˆLè è8ÊÑ�^ôÜzpo: ¸ó "[pG|£`Î\áb0�^€¶øù|�à‘t;{d°Æ[{MYÈXµáý…Ïî“{oF™Åa¢>êKB.tÊo·´ NŒ _�¦ž`‹ ü Òÿn?ØÌþ_XYÑ â="|PpÈ­c‡%ŸØ»ÞF'¸°¼¼¼ <Ù&x®ˆTé‰Cõy±¬ì×Óýñ€ Qñœc‚+vCÜ!‰­Tz²‡§@ék¡óº&ShyŒ)pR‚¬iÎëMx h =‚¦Çµèvš~AäÝNAä î6îEÐ6\_�¡»ÐذÅ% t|†>÷›FÌFù-XûZÔ{|ÀÝöb—‚¾>x¡M“OÿK,-Lké/�§ñ.-,)×(´Dz�eè�ŽØ£�„‡.ýèG›ýUÒ8K–——D,e >‚ÙÃÎ6IF±áÛö�m‡$�EEµñÙ¨©$âÏ @²Ä„ Wc+Á@LÒ ÞÌ�]Î r†[tÜ)Fƒ^êZhüÑv@OŒ…æm¢Ó•t ÑÛ‘Úƒ§Àw>è…×[)ù£íô_qðpy<=h[�[‰£ãí;FÈ5±C¸#Ã] ý-"_Žë…ÝÃí†ù±ü†nh>ùÉO6ËËËìÔYg�uÀ²)¸¾�‚í’f$>ÛQädßâU¿øíÓ†‰Ba0Yà�gü ´ßX°w¤ö£Ïÿо¢ÇDÈ�|ECl{ƒ a°-N"õÂÅïf££.ƒCÙF«ó”müvZÕF%uF�5ýöÕŽà¸=éÄ\$˜>Ôþo•kÔõõn3(|èWÔv,¯¨SÕóhìFoœ~úéÍ´ŸžÇxJŸü"±š>X{2ŽÃÊQ£ë×�Ãßc‹$»bÏ0  Fv�‡ýLÚdñQ8Ðq“D�·Z ¸ó cœeVÂÊ€Ž£×+lm¸O ôälu‚â„ß‹ m:îöº÷›ëE¾¸ÝExÄÞŠVóJ‡[�þ{ �£`;#y)=ÖòÓINƒ×–-ëÿÆsMݼLú  ¸í,9h£qh‘�Nì§�&YBÆ”t4hÒ¬ã÷—ÙA|' h1ØÆ@ëì ½$D+í„ 6œ6iÜÆ� ¨(ÐGrôûÐíz�1¸ÓV០ÑÉÈ·• #.k•À/�àSµp—uEQ�É^\À°V àQ;¶F=è8¦@Ànôžþ[´Ñ�sÎ9ÛÇ¡y¶Äs’½Îg>znâhò„Ð'¶½͸<¹Ûé� ù¤Áîý£€9€+*¨] ]ŒèýôÊh;” <JŸˆ¼ñÖøZëÅ'Xëp�µM5>¥=7ÏVÅÌð“¡MXÜE£}A¯Ú¡®@pt‚÷í­i5žšÞ_úúZ[¦Ø7¦óÐfvø„¶\¶ð{;´aHÛ&ˆÉA“Bd¶¡ÿf¡®`¬J�‹¶íáÜœ5Û@´Ë&Û>à;ÁÀG=êQÍž={)ãÜsÏÝ ¡Ú6>ú±ÃxË!ä¯#6ômêxïß¾¸`j2:“ÿÀrØ!î6W¦•ÂëÕžjýo�ãÖ gGTÌ;œÆJe.š„ÃPItp¬^Œ*Sì+Ö˜>5Ø©n±º*ý÷ý¨Û¿,8Љl´C�(Tªþ_\\œ›¼9tGêÃ)?çÍ¡]]tÑE ËFË 'œÐ°|å+_Ù¨ª”_->ªF‚[±Ä½j¯þyñÑ6î�CñWm€ÖA·`#0Ö·t… ÌX÷ª E¶•uÛÁ!Õ&ïm—„,\õ®ÃSF`¡¯è…äíÈö {ÜØàµÒ7×(QѲ9 Ìh/ýW�#€Þ¯|õï¡êëÞ:×hw˜ÖËÛš¾ÊT}[ÛÝ7ŽNtGôâ6 ›³ÿÍ*y`³"¹ºΤH~þZxyº_ Èó”Ñy×Z<3`ÉÎ*t‹À?ŒÕâWl8ÕðÐ^±I°l® �¥¸ŽHþà$„‘äPô«-µÏÝsÇ�`²‚®³Îèõä è _Ãù-èòÅ.áѾµ@;^G“´‹îIËæªYŠëHÿ£ÏEÿï¯{0úd ëy˜øQa–©�vŰÍ&ü�üã›}û6ïW™Ï;ï¼ae Öǽ{º¬$hx$Çp">ö %þœÙx}ËDÛ'ÿ‘/‹'GÃõgHL ‚ûJÐqÔá,èV —¢68äÁKBôºjЙ¢&H;„Ùm z N*ÿås"ÍeeSÓ‹²Ç8ö‚1!ζ¡l §ÿ–ØC(‚±5ÀõÐo´!·Û®P¾?Z††Üÿþ÷o.¸à‚M5;ÜÔpNVf1Ç còÇIŒmƒN·M¸KU½�‡�þ,Ù}ÿ]ãª�A’c|.¸—:< ìôÓ²iõo hÛ.�Î2ÎJ—óy=¼ð© ˆÍÒáøE)0|ëlv~�C±>S…�“ÊDyðX™@ú?·ý?'ξKÏÍÀFý“ŽÕ¤maN;í´æ¡}覷À·?üðæ[ßúÖ¦ëN…%ÕQÉ2 �äÍçÆîWü0£"uØí·ïòL€'i¿§`°�;ƒµšPDB�˜@M¯¨'^“Uã·Ä,šµ2Öž×1 (¶ŽM$㈟ Ÿp„mâëOðÕ''š/¤ÿsÙÿíŽRö›!ƒy™Ép¨ÅÑ;äÞ í|±ï‰O|bÃÇ{6»0pçU€ÍŽê¸>l$Y2õ+–Î-¡ÛŸ’¦p¯åŒ˜äÎï õW K"WF•‚!l¢®E£ Ø5Y�`ËWñ�Рc» &B(Ðqg�)Š&òÇ]ÿzþ»ÏF+ñò¦JÀñµ…é¿GqûßónÖ~4d8/ú`ž|Ì>u饗Nýjßg?ûÙ ûqÛÛÞvÃ:RÁê`�öBn,¨ r-�Ä™oþSœßdøåÀà#÷R'1ðv¢-ž ¬“«'^ch“oI°®Âð©EU@ôâG�àþ'XsŠBç7Üy+Ytøx)}~ª Maïd ƒ·mx±ÌäºI†Ç¿ùKÿ=„�XL-ªR|«>ô>%Ò[Óÿs“kæÆ‘©;IVlYnw»Û5—\rÉDýßþö·›ç<ç9ÍF'9˜ÞM'zróÁÕ1p’Œœn’=o”e¾È„’Ôœ¿@É ¢G8ÐñJÆ“¢k -Aßè¯4YÖxᣠʴö¨£]µdq ”Ž"ë<®¥ÃÅSë¨ñ¶¾'ïí¢«´ïö>µ¨ XãE€v(ÓÚ£.ýWà,%ÖŠ?qWüjHìæ¡ä`zñøÀ½y.ýë é›pÅW4ŸûÜçš~ðƒýªumŸyæ™[r{a]FÌ3³å.÷3¸‘*⬇m›%ÐGÃã;%×”³U†O(Û „¬ :)ÀwâØ*l}Ò)èÉÖÚÔ™¡à˜2#hhº�.oú±½ØßÂbcØPìu“mU6]ŸáÒG›N™X\�ÕÎ#Ú¸@´�þþ¼¯ T¿ ªßÇ£Ùõ�ú ^pïó öÿ¤ö†HË À{mØü“?ù“þ¡žI¦¼ùÍonÞþö·{ÕUW]5‰eÍ4ž-ÈŸ^s¸ÖÏh#¢?ðç‰�§ùíŒÇs” µ~&jÎŒ8b§©mò3 ÁüÅPl°èu踭Ë@!¤� <˜Ôv@· N³CuÒ§]A·ÅMGƶX\¾@Ã…wá�ňŽ)¡;`ݶ땎]§ûjº�ò[ÐÈQÑÉw4§»=é¿úÃãDß”¿ºÔï‚ÑŸôšq[˜}^ä½Îp`ðu�6)‚¾1«y˜DÏÌAg Å…ïýÞïmîv·»M4÷ÓŸþtó⿸­ûЇ>ÔâŠäm€�ÜÚåb`‹áR*¶âª@Ðt¨´Ä¥�— 8Ø]Q€Í3\R‰»œÆŠ^AIÊŠPQikuÃÁ_H§‚KXãÔE©©¡3<Þ›P¸vE!êØ îÐÞtÜV‚ŽÀ (É€Ò"h #p…dúO<¬Œx±Vt;<0ÕQõƒðºÿ]JÍt*†ÍÃ``!¶¹ÇüÔ¯ýñ@Ï{ÞóF~èÚk¯õ[ñ:'‰ÞÚdý²¨±úੳ�2Œ’޻Ą>�ÄÔ ÒP@jØî&$#dc ®” ]´à yÖ”¨ XãQŸðŽ J à]BK¦'Héì´�…´ |ª¡ê‚{œV}´Û¥øàOÿ»xF,ºþ ŒH³tµAÙÚþ÷¿Ê Àà»ðà9ÀY"_û;òÈ#'6Ê™ÿg>󙱺�>À'�—–êÏo�5‘„ EÀ’¢�™ ´~®ã9¨K <àÉÚÞРÜý¡7’—&aR—Ðú&ª&´SK›Á#¹ ºeN ÎÎÆIüã 7RIðJ¯`èëÚìtOoO¶)a}À�Úþºæ<ýW&õgì{ê 8»>šÄ¿µýßïÍanç`˜ývH¬¾ï}ïÛ\xá…Ûæž?÷þ'•�Þ8ì°Ã¦¾j8©½¤­/1°’¶FÏÈI�P$"MÆÙ³ox²3ª3�&.ÿ…@¯ ²^bÐV‚tQo³¨)ÜJ 鈭Öëq�Áš©ÆÇEˆô3Õ>ÓájX ñS }˜þGàˆCÙ—†ÚÿÚes0ðPë3Ëç¡ä`zq‹}àòûOýÔO5{öìk‰ûþ¿û»¿ÛðÞÿ´²ÏðÍ�,[Ë`hÀ_ý+°�Çí`Ì�ûýðÖ—_Ã.†5HÂㆢB+~8¯á@É zðÑV”ZE�«~JXã…³&9nv¶>+¹©¬…‹¾‘6¬>ý�˜‡I6èþWŸæ`ØýwP¬ÈCÒ,//Olë¥/}isÍ5×L¬«‰½ À/ÎÛ+8u|nCsI¾å9°½@e¹*`Ø¢ýè�S ø˜nu�t Lox¢ôÞk\ÉÕ“‚7XDÁUï­­®6Pü�EÃi˯@T»‚Þ~«9étE¨ Û\7ÎP�Ÿ,Áb"#¹é‡+Štmq]Ö¸ìr%Vß*,¸ê]©ÑJIÿ#Û¡ÿÕ'C‡9zn±ý$Þ=èA[yç;ßÙ¼ñ�oœX×'nôAÀ#Ž8¢áG‡²lr,™Å°7À»+$?.í3 °×ûöÇÙÿØluñ™`%bä:œ¤‰™\G])ÊmÞh�æ›â�¬OÉ_öÐ&8pRû²C°æ ÉÊ ôˆÖéV{è‘ á—üœÜ>.˜TSÔœp'²Be²>µ-{àŸÆ/¿á“Ý!#Y”þOëï–9XÍͯÎA_l;öîÝë—þG­bå¿øÅæE/zÑšmÞèb2òÉO~rÍm&ãì�/â,€AŒ3ëxã"rµ%û `¼éOÂð´á‰ƒd£ßà3ÁV ±4»â¿ Ès$’(žŸ´1’Mo•Pa©\l‡`§£NxÎa+%-äÇù»=øecpJ6ìÅWê#p]°oŸk,múÒÅ­ëâ}ÑÁÁô·C¸C^å€!÷ÞÛ~Ùe—5·¸Å-ÆZùÎw¾Ó<÷¹Ï]×ÏôæscaÜ6^OÞžüIªåý~Ï $pn`,Àɇû�V4¨'‹'�±D2õöJeÍ_T¡Þ꼃â¤Í¢¢èf{uý£ 'n!@ ¹HÖ¡ŸŠ�Ê÷ÂËv'6`e½ö¥ÿ·!ôX:üuN†ß‡[âÁ÷|Ï÷4w¿ûÝ'êæ¾ÿÕW_=±n5âF¯lõ›1ø¯æÁ|×É`›Ð}j©“I–Úú€m&LŒOYÌ·FWªS¥�ÑÚ%åI ˜V�¿´/\ú"q�¸±#’±`íÛ¨UÝVÍSãâßå}g‹Ú‡|ZQ�øÓÿáöÿ´>='C뱃`ï±ÇÛ<æ1�™Ø÷ýßð†7L¬›EÜèà˜cŽiN9å”YÍPýI'�Ô\~ùåÍ�üÈ�L|ÛနDÈ’�éFæŒ$æ—ôIÐÐ z²rÜêË©0¶p4x#¹!Ê ªáÉ�Ê•@oÆôˆœt}€—M¶w„Õ¨ÂH¸q&x$)¨i3®†a{w†�ßN3ÈzÁk›CÖ¨éÿ\ö»Ë É ÀÀ;p+ÌŸöµ?Þ÷á _xÀMnt@Ã[q€/>ýéOoN<ñÄæ¡}hó›¿ù›Í9çœsÀ~M0W±Ú“lÁÛ|j‰ÏðÅE. Âï‰Í^ Y[æÊýšÖ�Ýwò£ Õ“/)µ$bt‚‡îZWÕD…†-�}jG=Á:…wõ!Ûª¬›4Üù ¬e§Û7ª –gò žþ{Ñÿí>2p$'ïÀÍ6Ÿ¯ýÝáwSËûþÜ÷¿á†ÆêÖJøÚ×¾Ö|þóŸ_+ûD¾óÏ?"ý@‰|ãàÉO~rs«[ݪUÁ_þò—ÛíyFüDÛ´”N†sWIJJLN7*Ÿæ-€6QYbæ6I ¿m´°Æ[}¥^ ÞÛ(4ñÔcØžVT¬qñÇä³"¹öÛƒ¯Ö/è¼3´óTö×>×x«/ý�¸NéÅI°ß?êWÁºÏk\õ[Ùÿjcè0'CïÁM´Ÿ¯ý=ìa›¨‘/ý}êSŸšX·âF_äM€Í,�xÄ#šþ¤‚g˜¬ì„bc±ß¿'±û?IŠtZN^5ˆ2Àúƒ>@DdFÏw#z¢ÅÖêkµt�Ò­„L;…æ<Ø/°¨d^AÉ ª�¢„íi ûú¤Û±•ÚÖ¸êgAoÙôÛ÷ÿ¬¾J}N†ÒS[lçîÝ»›Ÿþ韞xÿûÿñ›·½ím›bÁFoðk„ܯߌrÑE5÷»ßýFT½ÿýïoÞô¦7�Ðæyûø‡„IÓSjÁ=éEE³bW|›$I1àÉÊ�ö™«ƒ§N–ÁP;4•èº[Ac2à2Æ#81ˆRÇ€¨Úø|ˆÖ@邬â›.cu‚È :n¼‚.Ø[©n¿lÖ¸Ô(ù¶ Â*À§ñ›1! ”�º-• ¸�¦2fo�¿ÖQóJ¾kž_ís�«>ý�¾Ù’þW�s0ðܨù|^÷q�{ܘšßû½ßÛ’„¸ÑçøIbÝ�3| Þrày‡º`ÓZ?k\Ë 's�¨ x1¼NøçÛðØÄÀq%HÆWp› ð–zXüCBàÔ :Ÿø Z©Û‘^Aém!Ó t(>Á–¯Ø_$Í€Ž[� óË6 ëv£0ÍK´vªÁ‰òÒ#˜þG\‰ƒ÷‹…UÐЙñµ> þ®ßMÊåÔ‚-Ÿëþ-íÿØE¿Î Àà»ðÀà½ú§<å)cgÂh|ùË_ÞüÇüÇ�+_Er£Ïð”~ÿÁ½Uš©âw ¾÷{¿w„Æ› ø‡ØH#•;`cųw�@Kë  ¶A³ ÀÓævé�yÛ¶ø� ©N�8"#ˆ®‚»hԭব¢š^ß X×´ìE=yÃ*Dk™*¤Vî>ˆ}Ø^ üt-ò 8i�I<àèDoÁ�ŽW�ªQjú1ÚFý�4èuNÔ}»vmÞO7pùû©O}ª¿ûÞÁ»Þõ®æÕ¯~uŸ¼iÛ�`ÈÅ_¼n{¾û»¿»ù±û±19žqØ)¯ý�9o9ɾûçyRÉM·àUþtèIˆá*‘ù¤À»„R&á|‚“  ÷ö lÛ^%aöå[]è”^A×SÚt/ ¸øI»àž~ w™e‡`ñÐÊK� tOk]ðmIÿ»8 ®ÿ}Gþjó2Êðc±í<à27Ÿã%Ù�uÖYÍá‡ÞÜ|óÍ ?Äó‘�|¤y÷»ßÝüû¿ÿ{ù•¶µ›¿gÏOþgžy是úq6¼•…çða#OóóÿË^ö²†çÖRÎ>ûlËA�dÞóž÷4o~ó›µ¹#¡ Ãþc?JNíÓþve ηH’Vxïß?þc?d ,Rg âT.Ùl�6ƒVêlÃ.æ:S@jÑ4¶Z¹JW¤�gÀõìBȨv‚‚VwXê²U3ºÂá—•%^™ã‰$ði¥®.è:» ùšþGÌEÿOÛ/¶)='Û´cHŽ¿ð ¿0ö¸|¸æä“Oöå~àü}õ×¾öµ~ÿš�õÌ*L"Ð;éú7¿ùMÿ.OÃouážûF&Lb.¹ä¿U1ËÖÛÜæ6ÍÓžö´±Wù�¢�öÔ?VLˆH@>óAcð+0zò3 9Ï6Á¹4Ûþu@'Å/Â42apù¢}V:Ù ô:;zµ+76øhCÌÞRï¶®I^Ð~›PÇÚïésÇ*þ µ§ ‘Ck3Š ­=²Á ˜©6!Rúõ}‚”ÿú ¦ÿÈmÔÿÑ©Ã^ç-€mØ'œpBóÌg>s,ùO2õ¸ãŽkø˜ _éû¡ú¡†÷ù§¾v÷+¿ò+“?Wž÷¼çmø ýim÷éøÀú¤uo?àhn}ë[¯*Ç™ÿÿüŸÿ³á¹�º0˜þÁüAsÝu×Õäˆ+]Zê,‰‡+]¦+ƒ® ¼þËž$#·ù`ì3Yÿ–€e8²¤'6h�k\õlxÖVBM„>úèÉ‘äï>tíÒ–ø�Ь5­ÞÚ#Y ‹ñ¶�v0³Àw>xÑ*XÚ…¦ö…;_± pÏ.è¡H_úèúvo ƒ#'Û°Ÿžð„'4G}ôº,ƒÿ‘�|¤¿¶w饗ú;ý0¸ßÿÀ>°yö³Ÿ=uRÁ}p>‚s° mÅ`}à-òLÏ1LúÉb|¿÷½ïÝüÒ/ýÒXò§Å×¼æ5Õß÷rk%Id‘VJ³4§gJº1ûÜoღºã¶âÖ€'KÃZõ$Y`�«©VÆðØ_jß´f�Õµ8tÜúX0/ÆaQMm€ñG‹üy˾.ƒâ²FÚâš ï/hqitûLXüôv*šó 't•ö�ò[К7V×âP~ ºÍ0¹ãw»v~§ÿD±D²…N)ñ÷Ò±Àñ¾§rø%ol³>äÇn&]ž_«™ü’߃ü`_¾õ­o5_ÿú×=A®öáßÿýßôWà8ó¾æškšåå嵺6‘�ðabóº×½Î:ß,8ýôÓ=ùOzÆ%ýèG›¿ø‹¿˜¨o'êø#5,ò@ }ȇÄÃv$¸Àm3žö/‰ ® ,—ÿ.€1û°it kݧBЕ¤\i‡ú”;èòF/RÞvètmEWÔnM¾Ä”’7mP-Ég·ÙÈáoñÕ·CWp‚Œ²M�‘)W’Öó þFõˆ˜@/%.éDd¨ýßîOê×Ül³Î»Ë]î²iq¿Ÿeµrå•W6ú§ºË–Õñãòòò†õsyÿ!yˆ/³”1ñàV·<²ŒF b<ÈD€鋤H’gËè@[( ÝÏÃ�ö×M¼ÖVžqÙK°•ŠŽàw1×6‹Žº=OÐÈ[Ýci:J]Æ×ÙÓitz‘-êÂÛÀg• Mµ=ý Æ,¤KpgmØŸþÓ7[×ÿêó!ü°Íz�§ýV¹Ú>óK2äWÞEyï{ß{P›%éóq#ÞBÈ U�˜úIŒßý‹ºH+â븩/6Ê‚÷ÿ|ð5*�…"[£ëÐ×éÖY?mªÚâ§fî>—`�§s{½ì ž®uÉŠ{ƒÖ÷<¶Ñ<�ßé¿ún+Š¢)¬ë�¨u&_[û¿³aØXN¶Yÿ­÷Þÿ�šÏ{ïüîýÁxâš�\Š?˜ŸÞåJÇf<|8ÍŸ!Ò•¤Âv¥'`‡+ñq™Ÿ¢º>뇇"è•jb€Ž„`´Ò¬k,léì ݬkšéõSó€àþ'èíEÛÒmwöÔ6ŽêŽá§Ín£t„½HÉ&8…£Á�Kÿ‡ˆPÝ룔ÑX[J/¾±ÿ£ýá¯s°Íú�¯ÒmuáÝù_ÿõ_ox îP—w¼ãÅ„7¼á Íë_ÿúƒÒÖ�éΡÀŽÇþpEÀäÇ þüyÛòª’#ü”Ð6®Oò´mŠO°³J,¡•uè”Éõè¦tí�ž±S'ka[@é¨aÍ^ë¨ñÐ6®‰hC„ñ‡uò-ô§7e«šVãQ�nŠlFo´-P-‚u¸Ú¯äûp£ú°8ÚOd•Ú‹àÒV²ŽRû\ãQ‹nŠìÞ¨½Ò#½Ñʰ×9Øfý·ÕI™oüÖoýVó¹Ï}n[xþÖ·¾ÕŸjÞJcþå_þ¥yÉK^²•M V7C$gòÔ€ºgŽS¢3¼ÖW¬Âë|PµK¯\%#9A賊x�üѦ`�«^C;ИÀ�¶`“ ì”ކ4º&×gUÀ7º(Ò)܉kXõåqZq§Å;ý�¹ÏV댂éôQ‰ý±œ>¡›Õ_“ú| ݺ­Yr°ÍºçÃþð–YDòÿíßþm ~ËY§âÏ~ö³Í¿þë¿®Sjíì¼nøüç?Ë'k·h{q’\â�?CÊ`É@)\—Ò!ðÊY;úåV¥^¬„Ë•µ�M/‚e³­n— FÑàœô'û€þzœÉ®EÞ”F4]áj«Öîq*°N.-¥}^Ëf �£´òwb…«¾Óÿ2=Hý¯~2Ì À6ë=>ï[Z›eÉÿ9Ïyζ|÷ýU¯zÕf¹9¢‡äÏ„g-_HÜA:ßõäÃÀ‰ïY|K0jÚÈx²ñûë|!о X&ÀöŠj�C) E0¶FÖ¥uc™üâ�‚>?>@Sb„ßý*­ôùûúÜo'Zò»ÀZ¶¨ñ¿½í�5öÇ¿/Ñ ÄÇ`Ýxÿ/ÄQ¥ÏŸþÜþW? æ`›õgÄo{ÛÛ6Õ*ô»üòË·ì×ý6jì'>ñ‰Mÿÿ›Þô&È1“ÿê½ã眶Š_´b¸¾êÉ“5\,J>–d‘±äme¿Á®Ê¯(„Ìh®i5. k¸®>8¤A+à*€ŽÛJÄd�àèô¶œßW� mƆ[àx`T„ŽpV>hÀuèx‘6à¥¦Õø´úôŸ(ÙŸõ¹ú]�˜yW¨n¤rkû_½6l˜€mØüÈ ?–³å+_ùJó¬g=Ë4h3ôm•¾D¸oðª÷ûùÆÿM7Ý´UæÎ�^FLKäþmM�ùöP†S&>¨úÐËÐLq·ìç¼V N44öô‡Þ�v±Z4ÔFÛ†Ã+;]©7劽Y·Ðh@Ç­JÐãñÊ€5N�«‰ú©í™Î輿Éi@+è¥LÕ7:JZÔz�áSíq~7Ü›u_�ÞÝÿº µÏ5n,Ô{{†]1�jp[a.ŽAüp£@BLp¢þÒ¦3ÛJ¢Eýöò_Fæ`ö«ùµ_ûµ ?¨Ç%ð_þå_nxß»Þ~àÍ„�ü,/_üÕ_ýÕ|Ú=�mƒkŒ³ŒÈå —dPáJ ÀJ JžHlå:üìÜ8x]Pgê‚Ø„^A×4R +AGTQ êD."€RŠ~·Æp(œjAgµ A*ܾ'ø‹üw=A(J©´ÅiÂÙ„VJú� _Û,УDØà`5aQ�ªÄ Œâ�i(Ð(² 8‚ކÖ>êcŸW¿ "=Å~×s�…ndò‚ýüúÍžóÎ;ïç ÎM¹þúë›ú§jø„/Ÿ¶]íS¾}§¿öµ¯5/~ñ‹ýçrÆk…ýöt›×ßõ®wµ¿v¸V=\åà >ƒgY{.þêmâé~;¢ô•?½Ö§Ë­ ü  %2ÿõ?î÷Û8é—eK3ñ…Àx˜�|烤ו5FY£pØŠ:�æB¶íU®E¾Õ… O¶†¯Uß¿+ÝNì«hà$d€‹3Y� „O4„mñö t½�m»U?C¾¯ßõ™ Pzi~U~ê‘+°Æ¡±¤ÿW‹ãåŸås-"ß) Ÿ¥³Úž3|Å»{–Ž©ä¿ÇÈûl9âAzÐ'FYæg‹ÏùÞínwóßà×íŽ?þx;¾»®ãK~¼ÖÇ™þ;ßùÎÿŸ½7 š-;ê{«ÏénÍ’hIn ´„ÔB²#,�…/b° c9p09�1OÆŽpàa?9âúÍØ†°q`û2˜� 0D€1BÐPKHhhµÔ’zϹùûgþ÷^µ«ê|CÕùNí:k}ßÞ™+Wf®\¹ve®=Ô®¯÷½Ro÷Û•×_ð‚,^ýêW/^ô¢-n¼ñÆ?ƒLá5?[L¢¿å–[ï|ç;·ÞzëìÇ»+¿�TÏÿý�¯Ô€Vœ�³÷sÆHêçb}Í�3zZÙ'=°h‡ŸoœW;|A‹áŸ�EÂÚBxDhS˜t�2áç�wRs´›&þ#w'U85舎bŸt¿¢m*?á÷X�ûx¼rR…SƒŽèå(öI÷+Ú¦òþ}?¿õðìw~ÏsÃþ{b»76~‡�EÀ•y¥jt|ÚÒ à´ž;C9~Ôç-oyËðƒ=ÚG?úÑ ~å�6t˲ÎШËÜo dsa¬l$ÿþ{e{¨4îÇUžÝGW0ކHî\î'¥ó´?Y‡@¬-š¹8àâ×z � ~Á1×}�Ãì,¦6ú+uŒPvC)hêó±ÎçèvÓDXÙÁg› UŨ¾/}ƒmêòýéW€B¿ :ݰJƒcÝÐ_ÿ~Ï¿§tΰ/f8{=?ÛÕRø&Õ|mñÁú92~æ¤LŽüz�ºVNø,âë}ñ´?W*VBÌĨûþÊwíôV&Ìl‡‚¹ÎòÅ•à8{ #0в§: sq�íî«Ø%ÂÓLj–^50ZelʤÝãø±#›K'ŠÔivÑÇŸþÁ|%÷ ‡Z¾=ªØ·ƒ¾T˜sŽðÏÿQöΠ½/f0IÝÄî�Ëåb1—ü•ãlŸ(}Í5y»Eq–³ÙX$Œ·2dg[ž}‡ECfIM-EhÉ�í>c^Ÿ0›„›ÙV6J^ !“@ꋽhªE_ËP¹ÝR‚�ÏÀHƒûˆælª«XÞ‘xÒæêˆæíã—Cò8Hçø˜ –ó«+&³™?ļw}0ïùëÖwlç�ˆ¿^þ(y†?&6èäD_' ¿GîB4žȃƒðAz Ü!e1’pš@£×ÒžíRË[—JrÛr³éþ!93ˆ(™pr¬Ôm?0ë >«LZ»_/Ÿzà“ý}üÃüM'h:?s™ÿ:<ÚCa¶x_ÌvêºáÝ»÷Á�ûú,”Èh{hzXí‚Ae!@þU2­(AÒ–ÉHYŸ@Ç3þ\hD½ô­ò/뫌‹âQõA¶ESu/ÛF¥Ä¸²à(Yó¥¾ÑÞкéÛ)Â8�~—í]�}"öwÿ¾ÎÎÒ¼÷}0ïùëÖwlååñHL¤,%ó@Àùy Îì©pg@©ŒŒ÷ ”\$À�‰�å"@ lJrª±#™%˜àN¬†¡Uš€Cqã’lµË°ÀËÀ”clÙŽ(MV1MÈØWV§ö#ø§ <åÍþúøñµç<ýróÏb÷PJ_ÊLöqtœÂÄ2%rÉFÅYrЕ‹}°¾ÞGPgãç�¯�çH¤„D'Dé@ÞÙ¶¦Û�kšˆÍIX,µ`H|°­ä§üz_A\¾Ð‰%Ò‚kš=¿Á��z.¸•�9Æ`{Óê´�vøòÖÇÈŸ:ŠÓ²�¾¶²m@ßÊx’XˉU{Ûýiû¾�ÿb|MyñHúq:~¦²Ì_¿=RnÀɼiþƒÞêO9ÏÚ(êþòx,¿Ò{4øe}LŽ|>»fŒôÀŒ'¯›Þ=°­Kó\»öAt ôÓý\ R+aU§|ÿŸ`Ê÷þfÛàhÜp`Ç>éÒœutcp,æ] È×=ÿÉ‹Þøº‘µc{á�Gn»kñÉ×ýâJ‚Ýõü3XkàGoy|ÁK±¬áT>8‚k¼¢$¡™ïú`æØÍïØÆ$W’;©ŸdËïú\ëU�“}sap®NW³¹® D…@釉‘NØð��ê Ãe|p§ bÚ¬OôÝ^zÀón¸ÛùŸoNä†G?Sù© �jŸòÏ¡Þs˜¥nc÷ÀeòA-ÏßóògÜî¯sœ¼ @rÍêDŸÁ[´HîùÌÛEý°/‡�·Bº�õ\EPòRh4 ÞF·ÚGš¸×´§Žd&À÷²Ïð\{žv?ÿC>ŒO�+×ÓSKèÒñj>CøÁmý>{ú¸¶ñyï¥{ {à*õ€s¦Îñ#²)¸±§1þõГi£9êCÂ'oT�Œ6 Ï8Jè¨ÝÐýÆê­ÇUÆ�l²á¨>zûþz€ù¦kN Û¹N¦õóïãÀÇ‚aªMý>^ZštV÷úÈvÙϺþmÇœa¿0çÙë¶wlé�È×*yAŸ/ùÕYwÐ3½ó LÅh4Ë8èš…+.m6nO‹G%Å VÍjÕÖò7Lá¾ßWxž ±³Åw1ÿ­>—NÞ´™fµüÃ�æÃ°þØ^¯¬cÎpü¤ÎyÝöî�î�Ó{€³çˆjä]d&öñ ËW@Ý2*%oÜòÕº80«ÏÐA1m��ÛŽË¿NG§í�N:Ÿ'åwr¶øà�:æ¸Ê �Ó„ŽÇdÛ÷ H¿p“؇Ð=°�t?Îvˆ}Ë÷ïóTA·+ úLŸ3«`wñ®µ‡¢ÝAVA9hÎÈ´øT‡Û Wù3`Oåz}O Ã>v|<âÓöÅWglG_œ±Ã{wÝ{å�Š�mòæ‡}†ÀH¦²ÆÑLÉOA„y„ƒg«arÎ}ßœû vû»¶ðA­y‘¯4�Éœj¦ZxÀ0“šWÆ«^6d¨Ìs%§itÏvë¶Vz %{²®1àfp§>Ê›†ö^ö×>"|L¤¥>Šò¨ÚÍüûÍã‡~|´¬óÎr›em²>×IÏŸÖóŸÃ>‚î�­<à°ÇØóQÉ4ídœ´ àNÁÈq­à|úhÆÐéôÞP÷”�ú ÀÁخ䡪ÆcÍÜShŽqº¬o޵~ `޳Ömî¸  ,ô€¾*î$ ä/) ŒLì è L+eäË4nˆ6Š!øQü,XàjC¨—½õÀQó‰áÛο�ƒ<޽ˆ]=nÇžÆ�[ÜÍcŸ6·ºe¾°/æ;wÝòî�­=@(ËÀ\ÙTuÿ@m —ø$áóð̾´sF>À@$[œVÃäLššhE¸`âjEcW�ëd—Ú'Ä^ÝxÞ ×ÍçîæŸ^ÚåÆxÓ⣠p`þ?š\ºú`'nìJºæéD"¯òkÔ #$fÉÐyxÅoðó§_ NqÇÎp@BøºtM†à¼\h€œÊMÈÚ]ò¤&ôÊøµœ�x¥=�óÎ\]ÞùÏã€c�£a€�s´@Ó1Vm¢Á«cÇÇ�9‚IÜÀÔÕBg¾ëÏÌ|»ùÝÛx@)“xGh$® 898¿úG²�½0è¼à|ÈÀs9Ú£&ž5·Â Ìv©ld,�6ñ'{*ObÊ×ë¯ñ J¯Ù;ÜxÞ ±ŒYÎcÂvn?ÿèwÎÖ¡;ê¯úU�Ñ ‹A‹hZ ”mõ90?Ðǯh3ßõ+3ŸÀn~÷À6 öq&¯€D¯„*Rœ‘+ÚÅ™Qð´ï ^ŒÕBÕ`&P¢¤â¯ð¨Ò´R}ƒ ,9Cä  �> —®Ÿïe&`2)ÀØt¬ô¼œnšë€^CÉE†y]‹>ù«¾‘ü‚ôGB”Ï¿ô+óŸÃ>‚î�S{€`–üE`;_$’Ø9«�3kA…<Îܽˆ¸ÊYÒ0 ¢BϹäqˆ ®(¸Ê¢�…‚ ëÌ]RS:aQ1�¢³»Jo] õ½ì©˜Ó3˜ÿöð2îãI [“>ÀðUƒ«m$­ãç<¤Ã¬/8zé¸J=0³ˆ~Q¡®¤Ðø… p¹?ceBR>ÏDm€$t¼0ˆ@‰ëÜ aSq[Aú ç9ZtºuX}šO.Üqÿâîÿï]£vŒ“Eš Èú–a]‹MõM™¬ªìŸ6�Ƙᄠ·Ç€ò£ú›ª·,PeÊPäMà(ö ö\øüi+zÝõº>ÜVð¤ó/óBèÒâÒ­ÃñT8ǪÊJÿùY0Ùî7»û˜3ì €9Ï^·½{`K(ôia1’í¹¸)¨3ŸÐëàé¯f‰pX‰žd ×�”•ñCG%hø…VõUAìV{ôRí�Úr™=ØyáŽûwýÈ;ÃmWÚ 9ƒÿðQ@ߨñ ö´¶­Å�ÒwTûTé–üû6þ£æseøÊ¸C5A1/Ö¯¨Ð,ˆ¯f�ãþ¥ù‡f ñ³+“ù7ÙPÇk°ë'÷;cØŸ˜ñäuÓ»vâI=¢Á�[E�)Ìg*˜: †ˆé% spÑI1ÌÚÒÞgbÀ˜, ŒM<�Ã/û‚h[ ƒ�¶Ò‡q`lê£`‹‹Š!8:(Àqu׎¡ÅÎVGàâ)x~�5øsôa¨þÊnôc?°Å¡Å¦> ¶¸dà¡‚£ƒb}ÆE\ݵchñ�s¢Oã}ü鯇…#uý<ºâþp£i¥`5GµOíqg§žÿeóæXë €9ÎZ·¹{`ÇðYnÆÐ\ /}¤î¢Ñ÷•©“ö2v"E. Éo¸±˜ô̤b‰�ièÊêpO5šLwµ«£’4‰vãÀµÅ]bx%h¡9B‰¯è³bÇ0Ñ7è†Oň!Ä÷XûøÓ[¸Æ>e2!xÎ$Ú�{z$ÓîìjÃÉ|¥>ùkôY±¡ Žï¶³yâ}0ÏyëVwìÄNðŠqàtvï`Зþ}ùŸ¦Üòw‡EA(‘¬æQ6}ˆ•èï³2Æë ÍÉÁ sÒ¬äaZv�!îD c0¦dëÛ:y܆iÄæ½MR0¤€q`56F}Ò¼" áB26Jà}ü釨{Þ 'îYqŸ=™³�?ç_ú`þsØGÐ=°…"½GDc! »ü‘U.ÆÃZ(âÅÕ€øj)„¯÷�‹[LÉD;¸òS%©ŠÄ£f:L[bZ©X‚†WÁTnG@IDATƒR$/,—\ñùÏœõ¾/f=}Ýøî�í<@2îù÷÷¹—_z+ êAÀ A†¤æNÿ| ¥ôÀ¡ÌdG÷À–PB \ðË|HhJtÐIþ Þ,¢%²›ë^4‘QiÓ«þ¢½òÁʵìáQüê¸éOüa ¼L �e0väÛÄϘS} M0(´­RîΪ�>þô1~ 5Ÿö¥áQüÃä–¿Å_ýÐz<%ÔUŠÜón8åæß ©aÖû¾˜õôuã»¶ó€â_Dd»ºÀY+/ÿ!áCçÜ^�SLÁ ðÀž‚\Ð’@A2EìQª7Äw\5”|° òþAÖ:&Ö·«+ëDÕº{ÈÃ*d-&‰M �mQ_3 ÆmoÑ,ãqÚÖ>~{(}8ÔìGÃ3š®zJé €C™É>Žî�Sx “TEÐiÆ�4–\® �& ¼6èÄÝÔCR�†R7$SIžðæbSÍ TY!$�›¥×<�—‚ÔŸýŒ26f…=í Æ¼Ší¡Ç:$�¨ûŸ¨Á“0ùS tÓÄá Pí}ü‡4ÿšÔ™ïú`æØÍïØÆN�yþI,”‘È”ä”ÑÎüb!À©üS=L‚q)9Šä <©†™sÁ`^çH‰ JR�º 8ó@0nØÒ·îÊ¿²Í4X)K¢UñÌky1Û(dƒ_ÕF‰e¥»�7 ÇAúsþóÏGàPJ>¹s(£éãèè8‘H`œá;ÉÆs€‘çáÜ£yKîlÍ6pÎê�²ŽÔ¤(¦©bµÀW#z*YDÕÐýfŸ´/õPš8Ù¤« 8’,Éem®‰s76°Q Á—¹¡Œ4U̼A�‡"›Blàf×Ù³háûb6”þÉ®�?r9æâêÙVû€ÙN]7¼{`{drQªÑ™g¤v-"rêO™„Ÿ·èUíõ,@�‡6ò’ž (ÓÐ<”hS6R²Û„T‹ÙP,�_I0¤} ôõk«_6HQîšîä¨m-®ä•‹¥ß4«lõe í2̾­i´£µaT°õñ‡�Êò]ãÕk2Zÿžfþ}ø¢sî¥_˜û vû»¶ð€ƒ™zèq½Uɽþ±dÕ"!Pj¼(ƒjB ´„á(¿3/P[ì½ pQŠ'pl¡ÈF1·,°Åi[WܰÅÍëDdƒÇp¿å6ÁV\vV£íFÇ”Ÿ±B²Q Á-+½kôÁÓ–©~ÚL¿ÚÇ�æ^ú€¹Ï`·¿{` 8A�²ýÃ>^ X­þËz¦x2ÍŒŒ’g¥ÙæWÃoý«âÄÑÒZÞAƈ!úZ¡( i 'Ñ)!WÖ2¾¤£NuÃÞM†Ó¾ÆBÌg8åw¿†jo˜�ƒ}üK¾›ø}êïË5ÿu8Uïóý À¼ç¯[ß=°�Ð ®·áü½"�®®¤ßD?êcñA~l\‹ùþ5°Å×2‘€N¶xRW÷NÀ_å\OiûhñõÜ'§¶cnñMšZZ|;æßÄ?¥·}´ø”ï´õvÌ-¾I_kC‹oâoÇÜâ›ø§ô¶�Ÿò͹ޯÌyöºíÝ;ñ™•3ùåû÷Îï\ ½“Ø}5 “ü˜ôiEeya ÒÚ�ïeJÖ‘z�„› “ ãŽHîÇp×ýy܆©¿õéò@l‡á®íYîmý¢©í{ÊÒºÇm˜ãÙÿñs¤J9˜À“ŸüäC™“>Žî�3öÀø€Á­½„ïDïôîän(þÊ ¦�±ñ½»î�î�Szà`í*ò”¾èbÝW­ÚäMÒwÝÐŽiÛZœv-´RØ|g=§�¬3¸Já³Pã¾<{�s’é㿺çÿr«ý€ËáÕ®³{`&hÎJ¨a÷JÒ�Rº/ÿ“ˆ´•¯üùþ-CnõQßeq¢ÚVCì£fm·{/<<~õw9;œ˜ßÇŸÙ‡ùŸLÍl«}0Û©ë†w윲³eRÏZÖE�[ùê_hÀÆ�ëRïåN˜¶2mN+Lk-"Gk‹ÝA ÌÚ¥÷Ó ·ië$­ûr-<Ö>~Á#d><µšsê�‚-±£÷žkã%öŸã`nì¿«»…Ýûç‚Ùô¬ÝW$+ËøA@xDk(T¡ÀXQµÚ( !·x± ]iO’Œ_Jf^ƒ”éµ¼ †ÂQö´_q¤�1eŸí6”Û@eRúøg2ÿñJìC)}p(3ÙÇÑ=pJdÏà{>® rIŸ4¯:©ëþ>´øS[Я‰@x!ÞxÚ5y1±]LÚÔ<鯤OõNå§ü,Fd+Œ´PÔQG˦pmÖ âÒ�j[ #.ÝQ­ÞWú›êGW[¦ãéãOïØSÿMýu¥æ<ÚÙœ'Þóœ·nu÷Àîè"á�йì~.2&—hŒ³~Þžó§€n ?|Z<ˆÌ•tÀ�eÄLa.:RªÏîy ¤ Ì´ªš T{Å2ÄWùƒÓ7%wm}blVìoL¬iéãO‡o<~¦¿BóÏfJé €C™É>Žî�Sx€ÚþxO&±RDc”‹ñ[À,ô-€JˆÄbÞù­|æN_3©¤Ù©�H›ü8àÃúÀˆaH É¿t\ LõOyÝ·Õ{q²1áÔø½�@?¸ hჾhD$—GîÝJRÎ2´·¼n(ñ>þÑå’�àÌæXùn4e6 }0›©ê†vìÞCRCu$¸k"‘+×ÕâàšHöQ¢Í‹ÂòùX9�¼€ð+9+fºÕ¸šðÔGðVs"Ènà§‹¶XÎPýÃPý[UU§'è2(mLエ 28PeÝf~õ�1Å'zé@~ªO¬´Kyì,[„)¿Ù -gØÇ_¾,ÿìR|¶:_ëÑPl\°È–AÞó:"Î{×óž¿n}÷ÀVP0ã²~„Jn¾ñÚ¸Äï¬äËØÄI¿!œhH€…–<çˆ>av.-Ž"1dã4á9øn Ȉ5ú¦gô,fˆð‚°R-ˆ¨J+8UìJƒOÌKú"¹%¨Eúø/íÏœŒpX9qŽóŸ3?ß}_ÌwîºåÝ[{€Ø›—ÀµÐ-tvĹý˜€Ç+Ðõ,™á™�!+Âå´M#¼3eAõ¸ûCÔ4*µÐ¨P@�-B.Dèb�ƒnšêÅ;$ø‰¼xØU)µV¯¾Z{¦ Šì/ûM}ü‡8ÿytù(™7ì €yÏ_·¾{`+8*¡‡&Õ‹Xy4¾êwqqžì¦„™0~^8_T²ŒÁ5q;~ôñ5A%É!ãbj>¥/Hvç#‹m±Ä4Á¦n’|ÈD‘ºÀ­Î45ÆNú ºÍ4ñ¸Œ2©Ö‚"ôW鳫øw4Ž �>þCœÿñéW&³ÞõÀ¬§¯ß=°�œ,IvkÎâ3±U¢ƒæ§a:;}üÅ[ „Ü%>eÞP¢ç0+X•,‘‹b\¤’²®øÃºJªIÊk&ÛnHÿZk!“�TH²h¥?¸5 ` —ªGÛ[+£“GuÖÅø¦vIY¥øCQå_­¢j7B8‹ùç:”Ò‡2“}ݧñÑ3€ÄÄÙk>À™,Äx. ¾À€<»M>º"}JPáä×ew5D]mpS‚ÇLÂò왫 ”ì?¡ ‘lgϲ#këøÅ0ô©D‹ tTiÐà£14ЀƋIÍ�Í…úÒ ¡¿Á0HŸ-žTG4õñç,�4—ùïW8°{éè8dJÍ„¯“ýJlN \PnŒÑ¶DdG£O½T…°¦L®¸‚Ör·øÐPÄ¡‹&©.ñ¯tIk FmÆ­ŒÉ=þ!á‡AÜÖÈ lmÀûøÓuµ¢ÒÜÍpþ—�Ø s=r¿0“‰êfv\Dã¾=‹=ÑQ¹îè«»‹•ä”ê”Àâ{~È”1’ã5À¢™ºÁRš¥(Û}ö—Ë š"´F¶ÍIË e"?èÚØ.£B±PÒàS}4OK;$�?6é›ÊNë“þúøs®ç=ÿÓIžW½/æ5_ÝÚî�Ëâ�xÍOéåJ@&br¥ƒ³•À fVdq öJ’CâO™Wm-^ô°\Ô!ox »¬$Ìê?)ÅÕÊ7$÷ƒkWŠA >ð¥ïÞÙboZŽ�6²}ü:Àæ7ÿþ¨Ö÷–³/övjºaÝgà�!Yëü;–$ÿ&Â)æƒ}ç´H é瀋úê_<# ‡³¢aiÁ°’p'ãA‘yh2¤LÚ§ 3ŸI¨¾ƒ�vÓ$?ÝMô©Ch^,²e¢º²™ögÞ òô´TŽâŸ´÷ñÇ�>‘‘žk{Q?ëù_šË™Vú`¦×ÍîØ•2±dê&÷:�:ç-^ý{!><ñ§ä_ÐAxXO�t´»-—Í%~àd ~DA·Ö%“v¦½ˆž{Òõ‹Gý_Ͼ„N¥¡z2Œ2©zü'±1yDf3%^‚mÔá.R=PûÈô"ãŸ�šn/zrWÜÁ“× §¬W£~„¢Úù_É£»:/µ7úÕwªêû½ò3ÈÁqyç_�Žú‰Z€<~×;Ãm@Ь <¥‘GAÁd—ÛÒŒ‘¾˜ñäuÓ»¶ö@?ô€Üø€ŸPè® z2 ¢eŠÁ‡ ‚LÔÈ�**f@Î"#ë bê[4*Q¦8ùYlT»úD®ô'¹ï÷ÎÌOλ߉‰»žÿv\Ò_Çe0ã1:ò4+G}H]jÁIkÚ�}ͯÏôü‡ÑGÐ=Ð=pZ�„�”‰pJ½Ý/fÐ̤ž<´%¿ò01àZ, Ð× Â“¡Š d¶ž`ÖÂuü)Õ쥼©wto<ày7\7Ÿ;›:‰�c×ÐDZaU:Ž uL#Qræ34ŸáÞ8vKCú`Kvñî�¹{@'HD6ŠO¯³¦=gâ4óÎ ,ܯ½3ïÛ*ÎF á’Â>ƒï£ª_.Cð¼ÕP�H\4!ÇØaK/{ê�šw&�9÷¼îrþ9´…+8}p„¨¯j­øƒ$~àºâãËpÏÜhýÀÜf¬ÛÛ=p<àÔIZÎwd‚ÖK�¢‘·þ³×Ë‚#ÕŸNÁXŒòbÔÎùØPgSÁèe2¢Yd¢$ƒsìdI‰ ãì3¤'„ƒz/ûèŽ�³˜ÿ<„ò8È£ÃGÛ˜ü}˜aQËÏb$i¦ÒžÇxúÔzç8ëWöñÓÒmê8Cðë}i$z‡?ˆúÁŸ€<¿¥4.ÛRF!3h´ (`"—Űª�šR£ÓxB䤻`ö“[W Êæáª�4[ߤ›^ÝSx¾€»™ƒèKí ÁÛc |ºAIùjQ%vU•¾ÀSô„fõ+'tXgï84ä¯÷å™?gÄ;Â&gm\ X>ƒÏðçð oN_ÈW ‹,-©-ëÆS*{Jyö©3ϺÌošÚ+òÚñ4ÑØá;eû~<À$±]þùÏ^òøâØá˜ð±šKŒ¤®÷�Ûò òï>$L‰¼’±^zŽÔ~`޳Ömîر2H:…@Gœ+cÉà¨ÀÑ�Ú¹s,À¢�gRb„Ód?êk1÷³ÜÖ’ÏÔŒ»=-kõu|?<àÂÏÚ:ËÜ–üYËc¨m±dKgþ óXÈ+FI�ExZYë[¦‡”œ+Ös�¹nw÷À=À |<•Ô3|枇ÿŒÑa†N�+]Ì'.^èEB@^œKŸÕ§¡Ölñl]Ýûa+`‹›³Õ‘¸)æèpŸ<àÙ¶ø&Û9oqó·:�:zð‘ Ô±Ý@ñëX"Ç·�qCȱQ€-.â�ìúà@&²£{àtÈÐÆ=þLê>ó¨¯8¼ºŸå:z2äê¹�ÂM“Œƒk\qLÉŠ¿YT°ÀOÁµüƒI÷ݾyàÌæ?�¨<²ó*@å•ȩŦã«`‹‹k<þS[:ÓÇݾ¹ö´öôÀi=×åºÂ‘XüH¾Ë—L3hæ;ÿÁ¹J BÌp#+Àç[‹î �`õ#¸8 Z‹aöÓè=ª4Ÿ¡øûn¿=pÖóïc(ÜÇ覔îôžíyl5 ˆ:ö|œï·³�g]_ÏO�«{à`=ÀåU'B_{fŸçÝ´G8T²Ž�Lz«kð²x.Ïñ3�6ØoðÜ G`U€&N7)½ÕÑâôR`Þ4ÄC¢{®�->Œ±�ó&ˆ� 2†Ç‘Ÿ¨ á¢KßW˜gIè €YN[7º{`w ¼ /ù‰—I?õçb€ÌžÙ=/ïg[Ë…º¯&ˆc�!še`‹KvÍ®M->°:È„Žì‡âó¼†a휷ø&›Û9oñ�ßólñ�aiu´øÈ•Ç—úmd:ºˆ#ëŒæÿ$ÇÁôxÂS¦­óšu®ã™­/æ6cÝÞî�]z r¯R?98ôj1PKwCÀËEB=õ¯x»JÀJÞõšà!‘‡°%°Å­w))¬Kc"­ðvp©À=QÓ«gî�³›ÿö8˜/ÔÛ�^<ølì-í­Ûp©q¦•þ" ™N\7»{` ˜éò?¾J„Ia/sE€3}ý '£1d¹* n}%0iŽ¢”†(mqêm!Ó®  Æ-3…i ‘VKÇ÷ÏÇ¿Åã9g ƧóîúÊüs s,Ô±l>CtN‹¯{ ôös09ž:Þú`˜ÕŽt\� žeò],Î;èE$å¤\ñ4�å@É�HÔqý�¯ž&Ý€_éÇiBŸz—ÀlÚ¨ Ýt»iÔY„ÈYIßÉ'æ¾Û#ÄL­™›]Ï*SýS‡øX²mS~‡†–oÖ&ÍöÀl§®Þ=°KŒÉ˜dÎ…àèœ~.Õ£1¾ ˜q½ÎÜ£Õ‹ Gzn¡ÚBH9i¦¯ Ò)oÜÚ0[û~<À„ÇR-@ÎaZ¶ëùŸŽ÷(ýØ”%!üÐúXËc>Û.¶œý¾/f?…}ݧ÷@†<‚É=Š<ëaq>^ñKRÕ«~�Üc]/!“AÆP„ó,Ò¦M’fA %áQ¸Œ ~YZrƒ‹G>|çâŽoÿ®-æ\/½*2 ø+ ,D°ÜúÒw#aÊ?íaªÚ>•ŸòOÛ§òÓú•ÿ…æ›ÇâÊnæÔ›˜„†àù’ÿ‚u´iÕd§Ç³_Œ5íoŽõ¾˜ã¬u›»väBžÎõ�†ð8vp1îïóœÀ5לbD®ðÎÿkƒî@Š„Cè(=bÒuÕz”µŒm­ö±}”‰ö‡.,þÀg‡€�mÃÀÒΨ:àeÏ4áN ‹mÑr€î»�ßþÁUó›ŽýC)}p(3ÙÇÑ=p €3­ëî¾pÎó•ä"Ãqöï'ý�3ay@æ;®d`ÌÀ•#jæ û`¾swÅ-çÞð“žô¤Å“ŸüdmOyÊS�üã×_ýâºë®4þÈ#�,|ðÁÅÃ?¼xà�ï¹çžÅç>÷¹Åwܱøìg?« ž^ÎΤ.�åÇ™r¤óLèAc9@¢ƒ–‰?*$hÎö#'ærÁé“ÔÇm‚õÁã«âÒ;ƒ3A&7¸“ê2œž�Ãgqâ5Dÿ¨3°•DÚ3,\Ô/–W¿ËâôPmioî³ú×øé¼™ð± õe6‹;vø�6ŒWÿ¶c�‡ÏcF‡ñQ?ÔV?<ÖßÇŸþÂé§Ë3ÿÖ¯Nf¾ë €™OàY™O"Ö³žµxÎsž³¸é¦›IøçÏçùâ®ì¸ë®»ýèGùÈG†íóŸÿü®Ôw=8)¡GàŒZIPé'¸#µý|œáë{•o$zþüa}+ . À¯–ºüžIлG×G˜ ,z¬ž-#?‰Ó;öþªÿWý}6óüòÄ͸Ö3ž¼Ëmú3ŸùÌÅË^ö²ÅK^ò%Îø/wyž°xñ‹_¬Í}quà–[nY¼ë]ïZ¼ÿýï×Õ·u¸�ʳüŸ“:Z�<‡3z²‡_ÿˆ›¹ôÏm‚ H ^,„‚hɳï âÆ®i—L¨)(}™A‹2Ñ'*‹ 좯¤¬$ˆhÍìÁ×òç/1޲·øýaK1ÛÕÍØÝ0Ö�ã+ÿllŸöW8g?æy�R“6SÐ3�¸ËeösŸûÜÅ—}Ù—)ñsi v|ÕW}•6nüÙŸýÙâíoûâOÿôOÜZèe ()eÎ#1)¸TjTr‹3úx�q Ûé/8ª�œ ?L ê"©�•âܤЅiI±l2d[žU‡}™4R[Z‰.5Œ�m0@‹…Pâ€oÿ ÜÆZ^ãÏ>ÕcùØþ_†S÷Íeþû€åyìµ™{€Ëû¯xÅ+”`Ÿýìgïõhõ¨G-^þò—k»óÎ;¿ÿû¿¯�«½œÆu»Ý9?ÕªüD?´L™um’Ê «|z1Vƒ[ØÏ{_÷u_·øão,ûØÇn¡éʈ>ñ‰O\¼öµ¯]|Ã7|ƒnüÚ¯ýÚâãÿø•1f®½*Gå…ðÌýÜÓ2Z\í'Üq™?’-ÉŠw Sãe!àßr�d‚Qp ŹÐÂ+›)ø%_p�‡‡J”I–¬hÃ}!�^ }µü^LØ~:2 ~ó‡Òà«åi2 ~Ì� eJˆÆ>þðKùÔ¾ªjº Éy5°Ãt>ѳâÏ ûnæ¿l™)è €™NÜ6fó„þk^óšÅ×ý×/8£Þ¶ðäþŸÿùŸ/n¿ývmŸüä'wß}÷âþûï×váÂõC_,4žö´§-žñŒg,žþô§/^ð‚,HäÛžMàªÏ+¼ímo[¼éMoZ|æ3ŸÙFåÕ#[ÁTçøƨëÒ7ÿ<à„Á4ï÷ç³ yÖŸ|8,ã*ûzV$šT §yˆÄCDö2Aõ;ö¯ëA“­pž‹¢ }euiï6Ã)¿»Ì D´"H.ðV~Ú�mnuüÈR)}+Ðm%`]‚tþ¯1£Þx¿ýN|�‡&Åm†4·8j¨[~­â ¼•AÇŒK_ÌxòNj:÷.¿â+¾bñÍßüÍúúÞIå[~žÖç><æ‘üùzߥʽ÷Þ»`ãRým·Ý6°bÓ�7Þ¨‡þ^õªWia04žA×+_ùÊÅ—~é—ê¶À/ÿò/ë+‡'TsU±;™é.†ÿÎ)ÁÔ7;ü"éÄ3z8�oÄÙV°E LI^ä{åèÐ�9‚J>ÜYñS�SgÑv±£mETµ>œÑ!;ܺY�¥R „¸ÇÝ41¨ÿØ%ûÜ«»±¡Ì‚î{´‡ãk+œ“þ†ŽJ TÊáèW­i,Bú~&óïYœ3ì €9ÏÞ lêSŸºøÿà,¾ø‹¿øR«¬ñ±ø�ßù�Åÿñ™ôW¥W)Tlo~ó›eßßü›SÏ$œö[×^{­žgxéK_ºø™Ÿù™ÅûÞ÷¾ÕŽ;eð@¦«H���Òâ7þ”H#ë!(áñÓþ‰Ã™/ÿ²ÁÑd·È£È_%TãÀµÅ‰Ñ¦Weìƒc‡d-X¼IKíÓþEmôYÓ`MéÓ¢£ô /ÙøhŽo4rYã´ÿ>þ<Fÿå< {Ï�¡ç`‰Á>æÐ üŠÎÿ`Øl‘¾˜íÔßðW¿úՋ׿þõ[]îÿÔ§>µøÅ_üE�ñ¿ç“sr5�í7~ã7¯{ÝëtiÿäZR‚oü“òOt5à~áúÕ€5Ž$“¾•¼•¨ Òy _q¸šò¹Î¯ù#åeƒ’ Ã“ÿJî´�‰rø¯u¹šN™\bE§’¤t§¼i)`Á‚e/I`h7-î×°˜–€5Š(5A)uê[WD¬It°uYÿ¨ÑtC\ÓÇ�Ê�3Ÿÿå£ažµ¾˜ç¼Ëjòû®ïú.}�ÿXk˜zè¡Å¯þê¯ê¬ÿ,¿rÇsÿå¿ü—Åóž÷<��çN[X½ð…/\üø�ÿøÒí‡Óê;49Ò[&Ú¸{ ”„å:mÔESƒP<Á«—w¾ (åì'o ŠóhAé¬þh§Þ©¼øC—ùÒ¶!_‡èrS~)ovGéw?†2Ï�Ò¶s…$ eÚßTÿļäïãæÓ~6œúoÕ¿ø|œõ[?š¤fw”~Ûaèθðp(¥žÖ9”áôqØ$ÌþÏÿùVÉÿŸøÄâßý»·øíßþí+ö}û~ðƒ‹óoþ� Ã¥^ò�[ ?ð?°Õ…t7KV…ÍnÆx)°Æž—²£ÉŠ?ýWÒSò ?L‚¥jË;·ùC—¡ô»!’´šÏ°•…Æ_J$O] ­×PŠ';·[ÜlNôÀôI&ÿ±ÿÑfË´0m´•}üøŸ¤·3iÛïøí(Y˜¼#¼ÜóßÎëœñ¾˜óìm°�'ëIþ_ø…_¸�ãhòýÑ-~ðp/¾VÇ· þÇÿø‹ÿüŸÿóV—ñyßÁ?úGÿH_<ÚWaשS#ŽË²ü‘г­ ÐNÈœ3d�³àÎ@n8÷ÔhÙ„é]ãÀìÇЉÀ0ù/½_Ö–6¦æ´`�Ö0§i¶±…ôM=Ç5âæ±lŽÝã6\åÇzdÇb<­Ì±ŽýÁ×Ç�w�W–½yyçÿxí?W_ìÿ�ÈBž¤ÿÇÿøoõ½~Îøú§zÁåÿ}*ï~÷»?ôC?¤:­]œ¹ñ-n�øŒî´ºAŽ ©“ù!ÎÈ0<ý" !ábLö„“è f1¬êp2j&8ËgbuàNMË sIÝJeªßý¢ÜýåY<㪜�ø¨8mÈÑ­.P¦ú�³Ä¨cÄ蛲ɞ>þœíôCzr_çœÕyc}0ïù[²žú|÷w÷‚§àO[øêûms¹ý´}GŽýüÛûoûØÇŽÃ¾‘‡¯CöE@&#²–¾ï_Þš&(V\àçºa97Ìopÿ?“Û˜$ájiàsÃÄႆNŒ†c²Œ¦,I2³dØ¥,,©k´Ð–ÒËØ76𤶸ۑO-ik«1ÛR¯ôUî¿¥µ¼iMÚÚÇŸ~È9L�±O¬æ'g?'¼&^Õ¨¤.ûßzÖv=ÿt}¥/ac ¼¿ÿ;¾ã;†3™Ó ë×ý×õU¼ÓÈž¥ /úÑýÑ­èûò/ÿò«~@`$­g°ŒpY—ó3ˆ²Ï{ûdrpX¡¤L&JŽ'ÌäY¦d+4JêsOr¡N0.Û‚P[h Ô• œÍsV_4 [êJ>ýs 07€g‘¾@­ªiàæ¥éÁ-m«ˆ±³tjLî>~ÏË>Ï¿gpî°/æ>ƒa?oÁã;þ¾Œyš!ñN}^¥;—rÏ=÷h°í«Y|çw~ç\†½s;I=ù5ÀHG$ÍØxùŸ(_ ÌTš‰©ÒjÑœ*ýÌÀÈ#>%áPPÖƒ¥MŠ‘ðÕ–°ÅÝKJæY8}Œ0úž,è šú \òG9ë ŠÚ¶xö#éê10¦÷LYð� ü}’ ÚXúøíIæ¸�óß×ùçq¾X_ÌwîdùÍ7ß¼xÃÞ°8¾ÞÞvŠñ¼÷½ï]¼ñ�o<…ä•áJÀ�ýØ�-x+á6…Û_ûµ_»�ŠÙÊ:)-‘,›MmQ¿p1o�*]h#HóÇ ›2`'�•CÖPzFÿP¬›Ú J6È%ý’ ¥» 8Z Áa6—lAáâ.F1@…!7ÛÚ ÑœcNN›¡ødû¨�žúøñ±‹f'*ÀØð»aÍûþοÇ0oØ3ž?^tóÿá?Üêžÿç?ÿùÅOýÔOÅO¾æ¥Þ¹¹ƒW óýþ£^E|Ô¸¾å[¾eñ¢½è(¶ƒkW&ö²1ºxë”ÜC"LPƒ·jµ0¸È±CðN¢øÛº(£^÷‘g˩׺ ƒ?’ªä § h°€ÓXP8|)c4I@PÉYì¹P0Ÿ!ü*†Q9Ò^%¬è[Ú–°µ=CŸCW•V‡Çmèqz†}ü—{þ=Kó†}0ÓùãA¿ïû¾ï[ð²ŸÓ.�’ü9“žsùЇ>´ø¹Ÿû¹­†ÀY,‹©n¸a+=³&á‘'ÙÀã½ÿ¾ T4_àíJª¤“¸RN&K%Dra-à+Z‰(Kg·dEº×FE} Ô`›ú.h; ¥Ø}¿xàii艱ˆÆ8Ùà3lñj—îÀ�ÙO%Û§NC� :(ÀOª†"º§R0%ûøí‡t 506ÍAÁœ|˜¸rÉçÁwyç_=Î~×3�¿ÿ÷ÿþâ9ÏyÎVÖ¿å-oYÜzë­[éØažaà‡‰¶)�yÌcßû½ß»Õí”mú¿"²ÄÖ ¢y¿<¬¨€Kž×�굸�“Y1PÄut�8!qÅ@xÔ È  ƒ¹ $a—”HQÎ¥OMâiî{€Öcˆ&–ù5t¸dË�cÌès©ñË�ÛÆÐ)àqô#‹~Áq¬"ÑgÐÁÝ*\x!èãOŸà6Š¡ðªg~$<ÿ]_Ìpùµ;¾ò·MáÒ9ïÛ?¤ò³?û³[½(_<ëYÏÒO%’_.=–¼dÍYæ ’Je޹8ˆ3S’I‹äqÒù_ÞÑÅ4%:‚(Œ†C¤­ ¿åHdƒþìgÐQÁ8õT›ìkpó”%ÁwûÔx4˜€ÂeT쪴´µú‚Oã+~ã›ú[ykÞóïAÌöÀÌ&ð±�}ìâÛ¾íÛ¶¶úçþç¼aï� ‹Þc°mùÆoüÆ«îVÀ�ôÃy¾" Ü¨d[‰<’ .ï“7Á�<ËázŽ€äG²<Ææ'ô�->È¢=UŒZ5dÓ̳ -+ƒ«É´eεµiB§³v|µckÇÜâƒìDÿTý¤™ê¤x¬ÀŸ°mªöñ§gðƒçÝp“ÏfFï €™MØ·~ë·.žð„'leõŸýÙŸ-þäOþd+û*ü{¿÷{‹OúÓ[™wÝu×]5_ Tâç¤4›îýGR/á=²ɉô1|]²6ž @B‚=Z¨g3/°Å-[:¥[ê³ú“M!cè~ Õ? tµ¡)u€e[AøZÀ)† "$lñ"¯êó86Ái­ àC¡Iëã¿òó¯¹9€]_ÌhyÇÿ¶—þïÒéáÛ ÿëý¯“Š­ð?ÿùÏ_¼ìe/[¡!2™úËKøu–¯d£ È‚€[ù0 í�¡� X߈º0‰­Á¡‰ê �åGôP6èkm§‚»/÷?…èOé×ÀÀs€Ù/xµKwà@6d ­Ç°Õ MôÆ&ì;²Ð/hÑç¾m¬à.mŸ¶¡…­Nõá±[¼ú—îê·íÛ:§úÔc/v‰f�‚ôK©þ§úZ¡�¤B%Šƒf C“è@þ(†ªLv¬Ö�¢aŰÅÝŽ-ài lw‚ôr4•ÀCÀíSx?¶É?ms «x4ê>~¦ìP柱Bé €ÌâWõWom%�Š{ãWSùÃ?üÃ� ÷U¯zÕNô죒L`aÙ�Xd0×A{¼Ìì‘ô´H¨$ˆŠaV´'êkCÜIrš ‘Õ_%mx¥¯ä—tR�N©ö©~÷cˆ.põÓànGø¦â6óOõ!'{­àûúø—HšŽ€Ì¿§xî°/ö|yßÿ _øÂ­­äÁ¿Ï|æ3[뙓Þrxï½÷nm2?µÌ«—± I�ÿÚòŒ6âð� Ê$üLЙèX@ (º3rêN8¼†ÂëìÛgä´é(Cªr2Å´p±6¸øbG`Û·ú)aõ#®ê+p··2ÖÑBøÌ“zúøíŽã@6ûÊ>d®EËYO¿ƒ?s-ÌmÍï5O9qÁ|#žØå�÷1wØ{>ƒ¯|å+óC°¥�ï~÷»·Ô0?qÜÅ«ŽyùÒ_ý«u~8†Å`äR.Æod,­zü²Z{‹�!°¡T¶¸X‰aìêL,ƒ eÏ4A8Yµ…Ô¥›Æ¢äU'ÉW"tX— ¶ÐbM†©íÖgH‘Š‚-®Fví˜[¼°‰bÛúø—š?gW~þkÊfú`ϧ�ß«ßEáå?WcyßûÞ·“a¿üå/߉ž}S™ïúÏä)‡oÈHÎÄ óúè<x탑E�¹½°)A–âÌ­êD B•Õ3Æ–ÖâÖ�-ÂeÕ˜,œ@±Ü…ñP4. yꩇQ�çèF|lmÄžÔ]É(ú�ÚÈŸºÕ);›’ÃM‚hIȾ[ùåþ¦íaaöÕÇ/È÷�sn.çü³:k¤/öxún¼ñÆÅÓžö´­-ä2øG?úÑ­õÌQÁ{ßûÞ�˜Í‹�±8?’L2©1ÊLHÙ–É="jÐáÉ¢‰3þ†[A$IéVA)v ¶Ü2´¾Jºî›ª…‡°!z¬ÛŸÜ d£‚[Øâ´eaT “Șàö™öfB®$eß›�T/íÊHù5pU0pU Ç*›(<+}ü9GÌõÙÍÿÒDζÒ{»Ð57<÷ðùÏ~k³yã ¿ð ·Ö³o œ #„Ê4깓g~%0ŠƬµ‰²ˆàoÏVSn<›¥-ÛéMUŒcS[Aó"aQÙ,YôªE œ¬�› ‘l‹û&>ŽaôŘ‘�âou´¼CŸ²=jÀØÄSpzîÊÌÿ0k³Fú`�§ïæ›oÞ‰uûØÇv¢g®Jn»í¶�˜~˜W2ëx¯d)oq& R¯Ž ·¼P€îWØxέ‚u Rj›]&hDò �IÃ6 04OBóŽ|#ÿjÂu"_¯YÇhËFûÂnÉ…7pX,Á³¾¤í}üý»×ó¿~NçFí €=�1‚×®ÎÇ?þñ=åÙ˜µ«ñïj>ÎfÔÇï…”�…3\0ê#îgàS³Zƒ§9ÍŠÖ åO9ɶ½Ô—õ£¦Qí.ðRRGò�Ä7ñ'÷é÷ØE9¦}­ÑÂmXÚk»GØÇŸ¾8¦‡£mOç?–Yïó»M³ž’4žûÿ<}¾‹Ò¯ìæ ÀÓŸþô]LÇ~éˆ3WýØOXEê¾™ÜOûch¦D'4xÏË~(œõ’øõ+�Ò΄ÕXÂà©$ènO7e-ÙdºU4ãËMÁcø�—“êÔ$.]& &Õ£Í »åŸ´ýhb#NÜAHZ%ÆKã¤ÚÇ¿<ƒÛ7"SndœMC_ìéT=ãÏØ‰e<ðÀâŽ;îØ‰®¹*¹ýöÛwbú 7ܰ={¥$b ‰ˆÄKÂÈì§ý“š‰«ùÞ´Å=~$ôz`äêL¸ÒŒÚà–Ê §Ÿ,yå�„gIã#�y�iá¨öèpl=uŸ"ð¼_‘ú¨V'y…Ã6´=‡Ó½jACØÖáK´±ÒÇŸ¾œíü3ß3/}°§¸‹§ÿÚç>÷¹=áÙ™õÙÏ~v'�=îq�[<æ1�YÜwß};Ñ·Jò¾>y«[$Çky–ŸöeBd) 3ýà#…yc)�‹‚Ll¾ï~¼±!Ó$Ô‡FYnŸ&Ì\¬ä¢î“&ð©¾ôÂf{–­9NXu©²ªq3rËíS{ûøÇco�õüÓçÜK`OgpWg›»x~O]tl³øäÃ?|lþK1îj^.ÕÇÙ¶eZÉdA4Në§ñùžþ=Ü—K…åd”˃ÔAÒÊ *¸ÿŒ»=Ç ÏñJê³–1øcËÔs¦ ®)£Æ¤8ù[<ÇÑöÑâ)›<-žÚ³çyÒöÇ)£µ©À€ëìiûL z6•íiÇÜâ}üøhÙÇÇ™±ýçé €=�£]]è €œà;ï¼s'3Íש8Ì· Ï ßI’Kæ\åWòtêȤ[ûÓÿhÌ�=¸)ÆÝ>…™ŽJgôF»i)k½ë^êK¹uü£tr&OÚ¸,‹ŽèPpyüòD´-Û—:<Ú·û€j|ÊçºÇšÚûøñ‹}’¾gp9ç|¥ÓoëøGéäLžœ—eÙÔw©ù×tÀ®/ötŸô¤'íIJ¾H7îÊ×_ýNæe”d)8yâßW†¤ÅÃ~lüñ[p ¿Àÿ¹øËeAO'NÃõ 4%¤(v©1!8Áß0Á2è E—ÇÑ?íÁÉØâ¶ ÇšcnÇ/?„eÈ€�òÖ“>Hû‚vLûúøóHÀžwCôÐC{:³5kW~ØÕ¼œíè7÷6&µJTq¹ŸIB?ï_û«”§Ä�I¬ñ—‹„”ÓB�ÅdÙ(N¾m î�ErÁ°,ŸzF!§_(Æ Ñž½¸_C/€Æ ZñÅoYëº.súøs.íÿô¹\¿v7—ù×U¯µ#˜±/öpή»î:½_}¦í*ñí–+©cW~8´€y%ìœ'Óq¶2ÙÇUÎþ• I³ñ†Àø»6Þ Ðž�Ã;&fã™� ððŽ >ñA>Ùœ¿e@›<Æän/­0¥ôNþ‘öŒ.¶š –í_YL 8²¿>þô¸ýµ}žÿÉá1Ëj_ìá´=êQ�Ú™U»J|;3è )Ú•øá›C*Nj‘••_I­Ð2™Åíè�IžüÈ�.ó×eÜá A,”’ƒoЇ¨Ð²5“àNøêƒAµ ü¥Œà¿œ`§íº´o]b§/ ¦ÍK·& ÙVã“dáj§ý—Þì'Ç%žÁàkñõñæüÇaá#�ÃfÖå�¼€ü ¢3¿cßËn=°«¯îJÏnGwzm$0޶8�W"åòæµþ¿I‚•à|É¿òspŽ·ô6Áà…Š|ðX^Äv‡"XK¡úª$ ›ä›þm‹õÃS]�†€:OH•…ÿµ@X'¯þ%œ|ºJàôŠ8VÆcÝ)kíïã?ÄùoŽŠœû¹îip0“²«³UÊC»d}¥?h»œ›+=ú'wé,<¨Îðõ2 LÛ¾@r%Á ¼’¬üt=3ÒâiNÂô5${R'ÐW|¿iˆ{!a(б)—ÍÖï † +UÝQ7n8µgº €Ï4© µ}ü8¡œë¹R&ÐsíùšúÛó`(½Ö‰º˜Kd�ãÖ·«ù�E²-W?sÞÒ Odæ<e;IÆó¶Ãé €ôà®üph E2шÒ×ò|=ãûA㪀Îþ�(!C‹gˆíœý †XÝz•°Î¤ƒ¸áŒzÀW«OfMf!žS¸Ðý~(MŠShHÖW�V‚û ^µ‚ӚǖInë6Ä~%ç‡>þôå�Í|æíÁ,âƒñŠ0t…D³‹¤µ ‡àÑ]=WÁ[©è£]&ÿø`$¶¼“–Ÿ&þƒ‰Md¥æ¢çIªù[0˜?ùœ‡Ï©šÑÛx´ÁWøƒm�/1C>Ë£I‹�°H�O4Õ’ÐòOŸ)`¨Ø&ˆLè±MTKcA@ЕúøË'åùg\@¥oËgá6•dj_/͹}LÅð 翱2m˜ëþ`q�̤p0ÝsÏ=}°ÃO߬ØE9¸ßV’±:“åÅs¤ãO¨ˆ®ùð_œåû‰V âNbŒ? 8“lòˆFÛPF<—ô“]÷?|ȶ/ÐþÐ;ö%2 K4ñA_¶Æ¾Ê$A{,‚Á"Ýå$Víc¼ô‘ö×0†þÓ ¢:”–_Oõ5ØÛÇ_þM—­øë Íÿ…k<áÃTÎ9ˆ‡æð~|Xæ² ãÙÕØô+xswÏBÜ |“é«’©ZÄ8¥ê€\þÏA%zÉ„¼(õØt@¸iÀ؈›†�~‰F3|(®ƒª±«ªÓR°ôkD9*�nй„H:(¥ûÀ�²/qÆÎÅ0+Ió¸W!Áz ¥?inŽšš�*4PŠAÕØUUˆi)XúûøÃiÌ%Å0kË{y/HåQæ¨ùI|eþ¯¹æ`rÍ!\ð ̤p�îjÀ¯×õ²Xìâg„»z¥ðÞÌ �Ž$�ROò¦ïû—�¾}›—÷ƒ‡¯AÆ' …Lä09ŸE­#^ÑâSR ŽìÕº¤B¶„ªcÉgB;%0Ñ¿Ònµ†SþÕhŒ9R‰`˜e¬c ®Œ¨äûøå&ûØxÆN÷²Usì@ìSÐÀ=°·ÀQíÈ´eÊ?̵-‚¹ÁÝ—IJ –V}vàvún~îÍÚ®0¼ãŽ;vbÁSžò”�è™»’]\ aQvh_æµ †úy__ÐòÆšX<å_QÕ" Úž‘c‹RË�&f:xSñŠ¿* +•hn­:¢¥V!h¯AŒ8´±4¸õ:€»¿Q(±£ÚÑcž©ìPoúìjh¶%ø=Ö>þyÍŽ“kf¢‡†{gÇq¾È§>õ©�ßéÆ]¼ÃÿcûØNædŸ”èr}Å_ò,çðÃC| ‹ÅM€|Ö?Ó-)�M÷yo…[, –¾D–ÑØ˜Û„jH™´Oæôž<í¦¥‚É~¢¯V0£½j¯~�Øã‘)«ý­p—iYÞ­Øã6 NãÀ(}üéùAîÉcÓqu>ä¶q7ñçiç?ÌûÕfpH“Âû‘�|°uy⟸à¸CûúÚIÃÛû¾à ¾à$"kyo»í¶µôyã¼=#±‘³}í’ n ƒ¾�ôÌÆ· }ÛÀÁŸpï”v %ñ„"°£ãc%w‰”¾iÂÇ'møbsŸCMŒU<©.˜ƒ›v ÅxɈxµFs�¯i÷˜%ÚáíãO§/æ?ÿñ΋ƒYhÏÁzt°*@IDATå`.Ë0ŸøÄ'>øàÖÓB�:´ß°?©S¸ rþüù“Š­ðô£]¡Í�  Ì®I~ºÇ�¶’W2YBó¦3.DcÓmÑСŒ.𠶸ú‚§Ú!ßf¢¶¸Û¥;*@áÁg¨d cé�òÓ£d�É0ÀhHYCl€§ ÇÜBtQ—NäbSŸÆ›>ÖöWíJ;æÏÖì|è¯�?ýÍœ³Q Õ\”ÏŒc †‚KÖ0ôHcApo¡ë`rÍ¡,bN.̪Œc“×ï*á<õ©OEåU[n¸á†­ÇÎ||àØZÏÞ)PÀ#öq¶ÊË}b§‚$�@Ùl4P§\H`Ô‚el ¤à0Tð4Œ� k.�Á‘1L]Is$niàÓ-Hi%t°édG4Âç1¶coqx©òÖÃØÀQRP¶Ɔ=†à}ürºüày7L_Ö|Ê™#^Õ3›ÿXì’kê`b’ç[eÀ ̪̇ӭ·Þjt+¸‹¸•WXxãÿð‡?¼¸ï¾û®ðH.C÷$¢*`¸y¿?ƒ¬o(Ññ-€`Tâ*È¥t^œI,4D2Ó†^ð*Ó„ŠŽ¥½Ko¥€ä¤TñlqhÉKwc©+mM{+ñ2f�Û0l ª Px´Âßê'e*}c¶cƒí0 �¶ÍöJ6Ú�lÁ1@ðäOŽ5†-n}Ÿ2`9nCéw?ô¥þċЯP8ü´«œ±z܆a’”Phâ¶W²38å`rÍÁ,â Úþzùp¨îò®w½k'†ÜtÓM;Ñ3W%O{ÚÓ¶6ý½ï}ïÖ:öQ�¼òÁ™šB¸î÷g-­N0�-A&$*<;@ª  P ‚ÜA¢@k”Â�ÚŠ  k(<ø ×ñ/ÑÐ�a•dBÙ¥?í �Çpàc|È™§ ù áÇ6CYZöÊØ�lApÙVpÉvhQ4Ö‚·á:þ%Z�[}0�ÃPzÇqy†§áǶ«qüqÕë`rÍ!,ôÙŠñ~>D‡T¸°‹ï�?ïyÏ;$·œx,»¸pË-·œ¸ß9(Ý‘(‘,”�ÂM#ÙÕe~8¢Bb㾿I¦ø ƒmYG´«›‚àÕÛ�p‘…&(}Ö+*£€WOàÀذÅœ>[üe¿`ÉoØÊZŸzq¥ št†~ìí¥ûK؇02èm ¸ôJOXW0¹£QRÀ(î [;Ù,„�1ô¸ [Yému‡ E<Á±ÍÐã6”@«^ˆç<þ¸Úå\ÓL¶F<»Ý!,ò°ºxñà®ÏòaÚEâá€'<á ³;8weð�7Þ¸•ªÛo¿}qˆ_Ä)™&+¸GT&0ÔØ ‡�o°åÉ$@Þ ?ŰÅ}ÿ&a* 4 A|¥#õ¤e*£d?š>“¹l¥ØjÆ ä�b(|¢O¼Ø;üYWŽ_cAGð¬ë¿¥‰·�ÿ æÿ‘Ì5³Oþós_ “ÉÒ«2Æu0åþàv2–ç>÷¹;Ñ37%ÏxÆ3¶þ à[ßúÖ¹ ûØö²ÈôB$ù6)ÒÆ?—ùõ\¸´GK%ï<«ËDIS«Oòâ�]%XÁ¯vóZž~À�«?Ù,»£ÝpÐQˆdÒRÆÃ_Ú›0åB»ä³G$Á†bèqLÍöEJX6µ¥°iâhÇÜâÕ¡y-¯1÷ñkî÷iþ/,isMNtÍáÜÀ܃¿ã)탻ÀàxÀ.Þ ðÜç>wðÕÕ„¼ð…/Üj¸�<òÈâ�þè�¶Ò±ÏÂ:{%Ä*±åË~œˆºZ �¬bƒ>œÕ*,KLIT·‚æ$+9ËÛ‘lU€-^í­L‹[|è;lI»1+9±Uöô ѱ*o=è@C�WØ*¿ÚñEÆJÑ""ptôñ§ÖùsiÎg<ÿ1Ç“k溨H’Ÿ?í‹vUV¤Ãÿûÿï­róÍ7o­cŽ ¾äK¾d+³ßñŽwìä9Œ­Œ¸ŒÂN�™]ãã5â\ü§®Rù�Ö!ùNnð�€V:cïÜ lñ�Ák÷?ÂuúZšì!cWý¡Ö‰|ÊßÒÀ‡1gr�°•kì¦ õ] ¥uüaL–>þYÏÿCëŸà`™]™ëG·�W”溋$ôœç<çª{!/ÿyÁ ^€ OU8›ûÍßüÍSÉÎEÈ Rg±atæ&‚[€YטêS™¤µEnp³ ³�!|Æ�-žJ’#ñ´"yÌ}r}mVrŽ^ wÑÿh·­m\§¿¥µø¨'å= ÉÃ>ÿàKÚñúëãÏã?xÞ íGC{t„öyBó¾ðWÚƒ¾ÅSÅLös^,¹8w-¨Âã7~cë}é—~éÖ:æ¤à¦›nÚêWy“72^ …+Û7KÆì¨æ+n·?Æ«áœu»¤×.½€Ð⣦­“C3eÙF[¹*Ñí9- lñä8º¿V¦ÅÇ.…y¬}üáéÍÿƒ>˜\3÷Àð©‹_i;˜IY4xðÓŸþôº¦cÓ®¶À+^ñŠcûfÊȽÿ_ù•_™’¸>ž{�Nêùd@´Ç“€J¤Ñ®3U1!ë‡%M34�[Ðz1ah‰Zoö�}˜–|ËúÓŒ Áj“ %àÊzëú 6ÑvJ9DŠaÖ–÷Ëöõñã�ùÍÿ¹h'syšgT›û � Øò¹‹„ôE_ôEWÍm€Ç<æ1‹¯øŠ¯Àu§*Ùô3ɳ,‡°Àñã×î<)³œˆãýÎw¾sñ§ú§Ça]ËC�½Z®¼úÕ¯^\ýõkýpñ®»îZ¼éMo:ŠípÚ#eŽx¦|9>ôGªK,œƒ1ÑLf²Xš%dió@4­rgP�±œ¡ÄÞ”Ï3f Ø›º G½£þÔq‰½Y�ÂsüaMØ(†àS ¶<-¾¾ÝcíãŸ×üßóð}äšöÀ`²gYæ¾>©qŸüÎYÎÀ �~ã߸¸÷Þ{O(5²Í×|ÍâÚkéW Ç±ãç¿ú«¿ÚÕC||ÿýû¥’%è¿ eÎì—úSÒ‹7þE¼ã‡‚ˆ{NÀÀs"5 êC)ÅŠ•->0L�–§Å“Í‹ ýÊ´`3,‰Ò�.6[a𠶏øZÞ”OÝãøí‹T$¡ÏÝÆSÊHËÚòþÒü}üéŸ+=ÿw_¸Ï¹¦�Øå©œImÎ ZpõÅØž”™¸þtfÞyç�‹ŸýÙŸ=�pHñÓÀ_ù•_yjù9¾ìe/;õ­Žßÿýß_üÉŸüɆ¹ó^~ªrÊóCIåcv.R¯þÏ3Pnòä?šK{Y¿ÅÝ~RhÝ@þ”ü ¶ÉÑzÛ>ÁIà#L®“,4|õg2~ì¡ /åÙgµ/w(™ãî¬È_?Geúá,çÿŽGî&×ðapiqÓfç¼°ƒqþÅxgþgL8tøö·¿}ñ»¿û»§æßú[kqÝu×�Z~Ÿùêßk_ûÚS™ø©O}jñó?ÿó§’�­ÐRèr#,DhU5vqY€3}êí†(õ‹±ã›ÿÄÄTW¸*y[ “§od{ú,%À§ »¥��ÚÁ*ø$ˆ¿ øK5}¯ÛZ ²èÇߎ¹ÅQ¯ñÌ®F e­ˆA«þ[š%FØÇ?—ù¿õÞO�k˜Ýœö@æZa ßÇ[wÌuNc÷/üÂ/,Þ÷¾÷�FT¿ À­€C,,nžùÌgžxhÜ÷ÿ±û±_¹¼ºJ]ÒŽA“¾HôCsx‹ Æ–7žθ‚ÆU�kbËŸÓðúšIu<#¦o’mÆÒP“VH%×À�t[�à™¯ PUPxè5t-t0ñÊ’4h·ÇoHwàÕ­:—AM�3º�%=@ìêãÇwé|�‹ [_Ú¿Wjþë®·L®™û€�¡íŽ;îx >Œ÷p] …oü·ÿößNýÕÀ¯ûº¯[<ö±�=(W‘ø¿á¾áÄcâ~ÿü�ÿñÔ¾þ\zÞ åKüeðWážAͱhð¬nèO@Ï»¡æTêO6ÿñC@÷¼çîO<@·Íè<Ë\ydŒ>×dÄW?;’ãaÀù‘Y|ö³'6Éÿû¾ïû\2?„Â8¾û»¿ûÄã‰÷G,~üÇü`íï8s›‘,ö ­y¦3{bc�I‚Õ’íµ‡?WÀÍ'ô‚§~x3Y¦¶j@²à·<|¢¥ö‡��b¨ Š(©ÛÁ�µÀ--Â�úƒ�?ó£øæ8HVÅ|è�¨-v $Ôâ´B+®"c4h¬=nCÉ œ€ÂHSiO˜ãÆú²Ùv þ¢m€eGø*œÅ†o^YöÂO$Œsœý gRú €Jú8Ò,¡r‘q`&OCº�j(Žèg€d¤ ª²²KžÔ„~¬LNu„«ýц†äe­O�ì`Š >Ô;úøÓLϡϼ˜ÃA©#c¨'uFû9/ìfO/ú¤‰WüË¿üËÅ�þè�.>÷¹Ï�xؼ,çë¿þëO,·OÜ÷?ÍøºßÕôÄÿÚ9#ïEáRvý ‘–’^4ðE?® èÃ;ò2_·r[ MŽ‹-M 3˜ ½¨0Ä ÚH²-š�5»äÆìü¿4$³@õ* K}ô9*–½Q•ÑÀXeo@pÆ:À@ÔVP²…÷ñ§ÃZŸ¤¯æ?ÿ÷_xÈ9F‡BŒtÖeî &�¢Éˆ—yr’zíykÝýÐ-x’ý¤åu¯{Ýl_ij ûoÿí ™ý~ú§zñþÏÿ9‘ÜA2+9æˆOÑ…Ø®áV@}²2‰FàB>èN©¤Z8)¸D…ÇÎ0ëEClRT0 šmà$gp`â$hÙ7ìÂ�±Q Á§ %ÿ òÁœ80… Ã¥0£k1a¶°O,fØÇ�g˜¼‚àrbAšh+¾�óÏ…ûÉ1Xª‘40Ðù•¹/ð¸'ãBÜϽ:~¹eÃqÆí€þá^|øÃÞÀ±žÌêü oxƒ¾>§Uûz¶½£¾æ5¯Yü�¿ówNd×g>óùè­o}ë‰ä—9Òd]>F̽¾�oZ$øä�ÛÉU¾ˆÖy; ´Ž>él`ûாô±U��”” ,–+|l�ÑÒ¦äKûÁÛ¤îd¢>Ñ R\ò†AW[ÁÄ‹?ý¹0ÄŒÕÐã6D÷T_/‰Ø…¬Ä �LÁïãOwÉ÷òOÎ>‚–�ùH/×üß{ñrŒß|=ͻ€`"xÐU½Àwß}÷âßÿû¿øÃ?üCªÇ.\Îå>ú÷ÿ÷ëk‚ǼŒ�~ô£õÀßßý»÷D½¿ç=ïYüàþàUýÀߪÃ2†EÕ§H5}š*ˆ~ñbÅ;’ÖX$ŒÁ×·20ëVAªÍ@œR«ûF:õ)6¤_…‹¥ƒOpÑPÑªŽªJ«£ÅÝ®þ©Ðý*“$J é@ © 8ì†ešhƒþ)Ò N¿†ô/#®³·�‡åœà ¹®`ëZ1Á'oög5àMþeB§ðPzǃw“cŠÃšç çüNØœýq2.Þwß}·Ïw*vgyÜ YüÌÏüŒ®ü½¿÷÷Nôêß¾ð…‹ñ/þÅâ'ò'ïÿûwgÔŽ4½øÅ/^|Çw|Çâ ¾à Ž­‘/?§üë¿þëùA>¶äÕÀ˜¡’àÈ•.ó+±ÅÐÕ»áÕÀ|â dÁ�†j(è¯Нøñ¤ô"Ë)[•7Íð(~-Z‚ÙÛtû¢Ô3ïèPð.>Ñ`¬2ÈR7¹ Û s<ÑÈp)ðÕÐUµ\Á>þp‘}„»¨Ì|þo{ä³äfÝS>Ë2çï€qh±qƒ×Ú]Ç™a< þ½�÷øÈG>²x×»Þµ¸é¦›O|â�íüøÊW¾R¯Óýä'?¹Õo»Ó#ÿøÇ/¾íÛ¾mÁY?ö·pÉŸÅ ¯øíeÕ¯úä Jš<á¯Ä«â´’^àIËDšßˆgâ>Áœ�¼¯…CJ©Éóé$4Ù(†�®$èÐešø,[á•zsá‘}/ñOô+áÐ%6ƆNÃuú—hDz/ Co,4²08h[§jÛ�jêã|²ä»rï>ÌÿúÄ[~ø–{þ‚§­ªí‘€>˜ÆY•æpœ•Ý‹í,`¸ŠAFx\l�ÿžïùžwœÝnxG?%¾Épª¯ôIxÃŽïÈó‚ž–?é÷þ Nü á›ßüæ+réü¦›nZ|ÕW}•R<É�ñŽÎúùY_¾ë¿Ëò„'‘�{ÅìËäññ!yó!ÒY©{ý‘ä9I%Þ^“ï VÚç#§srb®Ä51BˆbH‰ci Q��–âN– ©!?èÚ P>* µî”΢H)0À–nc�«Ïº7ØgKÜ­ÔGeT˜m”-4MöÕLîþ鬻�_ÞæÝµÁã+€+'2ElìÍl?÷€'€IÐW•#Ù}tn €ö˜áGz¸ÜÍÃ|».$ªÿú_ÿëâyÏ{Þ⛾é›Üï?IyÑ‹^¤ä žî÷U‘ãØÈ•Šw¼ã‹_þå_^Äk¡�#rjž“<pêNÎL�sù¼„OraÁÇC¢îÛû2'}Ùš:ºÌÑ@[RĪÝ�X衊iQuä4„£ÅÇÄœòìyí°µe /ª›yÈEhì³äaüeºÚ„kFÃAr Ø!Ò?µ?;y=VCÚ[|*�¤Ç,ÞòEÿèÓÁg8ÈdÃ-çÿž |4´*Ïdª–¦+ê³+s^´`üb|ÇûC'¹G¼�3öô§?ý²,<Ö~ðƒzqÐ�7Þ¸xÍk^£Ëë×_½›/ ó˜Ç\²}W�\f?Ná%H|¥��ûý—»<õ©O]œ•.÷XЯ„P‘¬¥ß÷/bœñ“óv@0#yVR'Ï(IBÑ?-Uœ<�*´�'Ï4¿•€¥&D­nE¾4»·!yoúdÂ<_�P$*êDµDƒ‰‚ZÛ tɨv$ƒeG}^€¡$Ê„¡�Ÿ¤[׸gp}yoÕÿSJIN(þ–ì0!IKâbqçÃ÷~((°x t §>«2ç€íÉ^¸çž{n=ÉoV²O�3í?ÿó?¿ì&}üã_ü÷ÿþß?÷s?·xéK_ºøëý¯/n¾ùæKþTðY$?p—ºßÏ�÷ð“È$}3gY¾äK¾ä,»;ƒ¾ò2>q¶ÏIR{€,Ç‚@®Ø³ðNñ¹�a!¡RÜ‹ ·!Ç¢H¤¿¬ÆÞm�"~•¶?Hë ÐdP´Oû—Û‰<<ÕfYeZ1nÔ';!‰™öÂQâÒàÓþ³?�q”ôõñ—o'îÑüßþм3¼¾+SÇ©óüÏ Ò@—fâ,ðý¾?;³¹Ì}ùË_¾xÓ›Þ¤7/#òÀèùž ñ~Ñ}‘Ü&˜–³øÁMgÿ¼èè—~é—·ÜrË‚g%®Dyõ«_}%º½l}ÁtO•}@aX´LüÔÛM"씸b¡�.“fPui:èp‰Úø†«|‹¶ŠÿR¸£¬Ä¨›ŒI+™2âf3¤yZ–ÚÜqA4µ—Ü×ÉŠÇ ƒlØÇŸ¾8”ùûÝä{Ñu `øìûž)äs¬-’§ÎW&;ìÈyÏxÆ3t6¾#u'RÃCt\}à¡A¾‘0-gq€g Ö~´‡ûüW*ùó‚ç<ç9ëL›5�$–‰,}ày/??P løpEbg§3í¨óÒ|€ä‡%Á·~Έ…cKÖ„àÒ]œCqÅÎÄ8pÝF"6ÊNº—’odM~�(æj ÙŽn]…¨~š1·¾lëã—ŸtÌlþ/,.>ôŸ>ùfrËp8>û2÷@;Z™Å3‘úÐÜgæ¤Á]Žñ®ûúÜY,6]¸’OÛsåƒrQB‹•Ðk°ºlŸ´!pƒ8 M�œ â£8&Í]ν@6õWœb®EFA'ZCÉ?=¯Û° ú`wáÖ÷ lq3çXG}Öí¾áßTúøÓ3sœÿ{/<ø¡O>øYN,§W.5å›…½¡Ï}`Gú3èEÀ»Ü0Wø¤'=iñÏþÙ?[p5àJ•}[œæ‡Žvá;æ‚W$ÖÓÿé%Òøôä¹mÔ":óa"¡·I0ù`Œv�æìºxái7ôH. 8Ã%å´E�—b‘¹“Æ"C Í%Öå†QÒÀì {!ņ¤¡ðh3da!>Ãcð[¸ns_Ò<0�ÌÆ�QÐA±®>þý™ÿÏ=|79ešü5_sÞÜ3LR¼æ–Ç=îq¯ŸóÄ`ûSžò”Å¿ü—ÿR¿Z÷»¿û» ÞÊw–eÝ¥ö+yଌõË¿üËüâ ‹€C,$$¾Ú?”5 –Ô˜ßÈóåãHS\þ¿–ïþGQbk`ƒ sðQtF¸Ï¤¡Òµek)œÁ› —.Ò,Ö/îf<Öäþ¦üj~·O{³^Ã)¿-ª0î>þƒ˜ÿ�>ð™[bN½2ý›Mÿvs_xZxáöÛo¿å†n˜ƒÿ�´‘7÷ñ&<6~ò—÷óI†¼íŽŸ¶å!>_.=Rá Ö=ÀC‚|e�~/WÙt €>/ÇY8ï^xÔ£¥¯÷ñ ’g>ó™¼Rzñüç?ÿ’߈¸\ã?K½NVy®ÅqbËÉŒdVÅS~Üð‡í|%Ë|`Zm}Ôœ( ¥¢I°Ë}H"•hYàåÀ%òwVÚþÕ_��”Õþ’–­#nSyó©�ä¥�?ý0çùÿƒ;oõ€aL7Íóws_Øçž­ÐÞýîw¿ÿ%/yÉÝñ wëŸ&³ÔÌ ·®ä-»‹3ã˹ˆ«7îj þ«õ¯–ê½²½8î×þ(Aòº¶0Úi'|“ËxÉ//8Áͯ²0ȯ ¦ ûL¨|03ü‹tÉ�y�äL£ž¶øª”eŽåÚØ¯û?©üØ{Zĸ­ƒÞ)Ö n[7ÙÏ¥ÊQòî˜eyÄ˵Ñ6ÛxRù鈮Öñ?¼xøîÿ÷c¿tpßà:”g‹’?0’ÓÃqùúí{Ù½.÷m€MWv?’®‘ î‹øÆ�`HÐøãN xM´ælÞÏ 8‰9馧�¸€-ž­æ¶x¶VŸj¬’æwßëµ-O?î7ñ¬�½�:hoGÐöm{R{—©tÓÆ¾7ÉËç!a{’/©à­ ÖjHOGÉ'û,S~¨¦�[7�­µœb˜µ©TÓF^d,g§ûæ_ÒÌßÚ`­†Ç‘OöYÜßçºïí÷,ä�ÿCŽ1ÏÜá!,˜coLÐ#±]¸ë®»Þ6÷ÉÙWûû`_gæäv9@:عŽ&ãzÂß‘¸.kk14ß AVPèĪ5pS$•¨ðB'Àý[Ül- ­†mO›ø¡[‡yZè6`‹›§\‘c¯M3Ï2l­jñe®ÿ¿½ó�µìªîûüÀ?° Æ€ lJ¡TPh£H‚©ÒüQ5‘ÚFªZõ¤ªý£J¥*•ªF4@R I­DQKEh,R‡’’òK@ ° óccc�Ì ã±=¿<¿gç¬uö9÷^åb›‘UŽEô Ã¬G‘—½–F�ÈKOcõ¹¯ J&�~{ù~-åb›‘UŽEô Ã¬G‘—½–JgÏüa|Iç[Œ§H[[mªò³¸&CÚ¢½ðý©š‰)êlS4YcºêJÛñ£?=§^.ŸºˆúGu5Ô }v‰]ö¬.2ÿ/TÁDÛ´ìA#ßê)/g2ÊÁDÎÛNÆ‘J}lfXTz¢Ã:äeµ¯‘Wÿ³'h䫸%ÑFä[=åsü‰çzþï=ù0¾Äo,�âc⌗NNé~fû˜Gí‡�L鼬ën_Ê€¦F½°®A™æÎÙål³-ñƒ}ñåªO3ºÄ5Ï»;Õ:V½ÜF6:ý¨ÓKôzn_íPƒkjqÐ]�"ê.·®c²¢=^ßûdjPõO´6VšÂý�¤¥öäûÁ &Á—¹ Õùy.ænùü�ßyò/µ^dà“±þv:Lº»ÿ:Y‹ö»w¯¿îN�.å×ãü£c™~´ÖÿtéKv¼Ç&te”üpœúi`¿xû÷þšfuj~q®¼Ï_åU.›uû¦T©³¨ëEÆ{Y¥Òuýv×Ôï³Ùê’·¾x‚ë_èC7.µAEñÐÈSFgßTúÆmŸãwá$êø¶»?/–¬Õ%?d~öιÛJpþÚägb ø©L³² ð™B&È'ËÜ¥‚¤k‡À¥\È×nž&³TÞòÇ�s1åê.ªv±”c÷k£íܹCùÕ Já½!«_enÄ+¸Š—Û�[âv;TÄÖöjGJ‡J÷ ßÕ7Æít‚`˜†šT6¹=ÙžÔ|µ?j‰»oÌnÛú'ÚtÕ³Ú_¯´‚Á µç¦l•YÑ!ý�†ùÿƉGð!Ñù¯0¢!ƒ\ç¢Y ˜EfL–ö‹q÷ÛgÙ/í�ïó ¾ÝËàR ú\Ù´«<ÿÝÕ˜kw½Æñ`€¬DõzÛcñe…Àe%ëvÝ)+O%øšTy•·´ë¢Ùˆ|§Wûè}�|§ Æk‡<‹1Sp>PêD‘§ÌS¬Tí`ñ°�:ÈkŠc޼Ê[ÇùN/ö1ò�‚¯�ó¬íjÖÕ\V+D‘ŸÔžìŠR/Ø�cŽ|g¾aâ˜#ß©Å>F¾SPãµCžµ]ͺšËJ…¹¥…£¿µûã÷[®ó)ÆËϨ…¢<¥ûY ?“âÎßè"? `�¾¡Â¤kƒ@kƒãz°¼/ñÛÔ.áûê€]ùÌ? R6«m|_ÀPÅyr6Æ�ÊäkB•TlõøÂ €÷¦*�¶kŽ�¨/P6ú#ZûVl#ò�õ֞슢(c£�Èwö&Ç_‡Ë1ÿûç�}ãŒýô˜µš+ͱ¸Þ²:Å�1a|nsÑ~@æ®õÖÙiïÏ¥ òÀË}t˜ûÆÙÙÆ>¼Þê÷žØ™E�À·üò_¹øêŒCÃyÅà@#ˆN-ò*ç¤%A#ïÂ!»h^}€²‘Dá[}òqó1› ê6à¡Õ^G…6àcb[¦ê)Ê"¯òØDäUÞÒh>ö!öMõZ}òqËñ pl*gg�vúR¾˜ï\ÞIç¤ñ÷ùt93ê«tgH2…-v¥ˆÎÞ�:5ÄàÀë ®6¡…·`Ãeì¢Y©l’U;”º ÆÒ€½Øê’D�mõÉÇÍ›6™÷J5Vm«?-Å2Ùôê¡>rÉ Ÿã´ãc;¨mŽw¥Î›XT8Šº�K8ÿóË ÇþÓ“Ÿàã~#iŸ‚o©½5nÒ,L“Óœ={öÜÉ“'??sµn†p)W2¸üÓÌE–�¥|~êIÄ(\m8|]ÈË…˜zVÑR¼`‹‡–­<2àƒÞ9¥n±Ùk‡:ÈTÀ>K´ìíÀCa*_¸Á}Ô‰¼4Ûþ��uVì_èºeÜ¢¥0Ç_A2Ð[¼Çâ[' ¾Ù®£0È+-¹þ½ÊÊÜ”2Évž=ðù#çOΙtXÐohŠs³ØiÚLÞÂöíÛ?SeSj íÛ…^àÇé«OШ«vu1÷1”á¬Ú!`³µ7®}õC4ö1ÖÕ¿qúÑFÔU{m‘K&�HU6ª?mù¸ö£møØÇXwT{ãô£�¨«vÛþ"—L:‘öÊ–—>´ÿ/ñî?ŒÎäÝ?cŸ¥€kI+š¼…�;w€ûJqî/� .ÁõS¿ÈÅÓ/ þ€ñ.³½ê"Ëű\dË2¶ä%b(:q“´ÔíÑaè,èH6L¿•Å6Ôf¤Ø"/ûâ£NäÇé·å²+ÚÚ§¿ÈF%ê‘T_¼ 'ØÉvCä±K^öÅG�È�ÓoËeW´µÏ��JÔ#©¾xN°“í8†Èc—¼ì‹�:ðÏŸ¸ïÿþö^k²ó!Æ+ '+Œ‚âéI³òk€Bœ‰ÑÖ½`²…½{÷~Ú~ÞõR\O”ŸÝ½ë®»ÖS—V싽S±bùÅ>ðÀ›vïÞ}1&.k] ,/k{kÝ' Ëþå´1¦^„c;åÑ?T ýj KöUÀ[­²_@©`ÅðÃlxq-§> ]]”‹dpïöÅC%²%û­RÛ^«ß–·õeW´Õoí «¯:”‰‡ŽJ+•µuƵ߶×ê·åÃì#›õñýøƒŸ¶aÊùË�0KÚ€a&R=gb, ‚ñ°Ø\aÛómã·eùYàëÞùÎw~Ê~ÏþUÆgJCàßþø�þüÞ¿íÏΜ­õ[ÿx¦Ï§ì'µ�Z®ê‰nqçï:›MÇên©úPO.™5Û:˜Ö•J½ýX}Ù†’.²½b¤·oÛï•n ÿkÜŸ¶ýKÝ^;¾¶ý¶üR÷§mÿR·ÇøÎ,Í=}ë÷ýŸžßtþY˲�¶�(Ÿ�0Ë:âŒ�î4K�˜ M �â£&ïüáÇ?…R¦D (pÂð›>\lIð}/¦ÕSŠ‹oß‹~ö€\Ðä¬ TN#_,�ß«Ðxñ§íxñW9U§X' Aëû •«/;¢Ôì·‡¤—°ARÄ»ÐvqÌ‘Wù8ª¶ÕŸØçÈ«{ªSlçø{8¬nþï?õħÌù»¿0[8|-ýãOHšÚ’›òý¬š &)Läùûî»ï3¶|}dÊç,»Ÿ¬¸ À‹}öçŸ�W±Bdr|îèåM^mqB| 0:)Õ�¤ÃÒ…F^u£ÌyéÕ®t‰õÅy«(Š�¶>ù¸E�ÈK'Êà” =Qx’hÉ­¼—.4òªeÎK�¶lËñ3 Í»(¶ø‘�Û¹¥óG~u÷ñòŸîöc€Oa›©4‹ÄDÅÀ#ºS§N�=räÈÇgjs0‰ÀE  +Žž³FygÈØ¦Ïø—fLÏÅ8üÂoñGÔ'X(ß �c©7Á^�×v݆ñÐaö¢ žîˆÖ®¹L-·úÈ%sÚ%AÕf¥ÒEMㇲQ&*=QôÇ&Ú%Ak»¢²#êjU[Ž¿‡Ãjæÿ‡§w}ü©sǴܯ @+m�Ÿ�4‹¥�Éó»Ñ{ï½÷³¹ 0;pŽäâ(.œÆþ| :6 ꦥÿÒR¹0,/—UÑe�µMnõ±äïTúSW<4òÅ. •«íºNզߨ{eÉÈÈYNê /´ýr™ñ–h­Ž©Ð¡ý­�£lXù…¶¯±B#O�H9þã$îþ}ןµrü¢øù“rð³3±ŸÅ@ÃÕ)®Ì[þü³Ï>{&WQÒDÀpß�K¯oôwž£ £• 3òžj}ñ“¤®S�ü¨ºQÇyk^T]騉N6ò�}uùª0ÐjÒCGüˆúÕÌH"[ÐÈ�ªuœÏñ¯Ùüs÷ÿĹÃg {?¾".ÿ—HwÔÄL±|V�š1ÐJÀy[ø\®LñQ›]_Sü¥}œ‰ýÉQzտ뎞“ª”×þ¼ÜvÔõ»ø÷‚Á>ê¬„Úæ¶*U»¢ƒ•«>MÐFmBÔõû¦åí8íúú&ùÚ¸l÷Ú³‘¹^­ ¾f½šËª�–4ýs[9þÑóÙà78½ãÀU|'�ÿsË~÷ÿ9³�ó×� 0/ëð3“f5`‚˜0¶ø [8xðàŸ ”)Øèà³Üù›ä„ѳmpÑÝ|¹û´Á=%Ô }ÇG©èePe+ j¼ëWZìVÙ¨úÈe3ò#ì×NÕJ¦äu+u¾±‡ÍS¬Tí`q,’�(ƒÏñœÀaÍÿ·Nmÿ“æî_A@\þ׬ÎݧÞ@ðÕ¯~õ ökÁ�ÍÔlæ`�U ÀõØ¿äÇÎ÷Qx{ÎKîÜ ë{d:¾^ÐÉw2�“jyÇ;Ó«ë­T `0»’õµUí�¦?žuµ«uü>ö:~ç UAcÏ¥’‘�¼+æø5×ÏåüŸ\:óØ?ä¿Á¦DKÿÜ¿Ž†:s³Cf9`–˜8½ Ð=0+ó�=ö؇ªŽ‘L‰ÀÆCÀßZ·as¢hßW‚ÃâÍòk÷M€¦ë>Í„P]È�í[= AI—YïL­)™eÕŽ†Úö¾Tuø.©îH{E³+¶Ê^e„AÙQÜ5»jfl‹BŽ¿ À<À�œ�±xnZþØ3whaÓ‚û3‡óW ¿!+«žÖõ\q#L “IÀÖMöøÃÛK�_7Y¦D`c"`g‡®pÜíÃûg§%4Š›gQ`©jºŽé• p¡18�%<(õ#¯òŠAÒˆ+z[LŸ¼FË#Šu3µÁ‹o¦ÝQ¯Yúæm²c`$ P¼ ‹½m+ƒÖ¦:J•8æÈS64E#‘¯ÊQŸã/¸ƒÃjæÏÜ᯿oÏ'lPêîß ?�ψG‚eg/ÍzÀŒ1‰Šæ´ Ð?øÁ>b¼éþB÷Ù;.sD— ÝAysÕÃhÀ�V•ù‹€¦„ ‘; JÉÅàÀmÙÛ¤r¿ÆUºÊ—¢5Qt’‘Ç)V�Ç™‹Â“Dá[ýÒäâ �®§jCô>˜ ZþÄCkÛ•Æ¶Š±ží®=S‚çß7UÑXo¯ÒÈ£F’ªªçø &à y†—fº°¼xö=OþùGL/:ÿ u÷F!б U&Y“~~Ïž=:ôg(eJ6"8³âÐì3üÆëÛÓÜY‘ïþ �¶;#»í*N‰zX(vœ ¼ìû…¹ t¡¥NÏZiQ}R}tà{I¹¢QrÅuÆ’ž~?u"/­¶?Åñ)礜4ØÈ •+]qCÅáèâÚsÐE':ØâœØS“G5ýø’!xpƒÉ=˜Øíp›XygV±+=¥Íò‡E8ï£óele¼¥o‘/úE'òÒ‰2·™ã_÷ó¿°iñÜo?ù¿wnÓ‚nåüñ Ñù¯âˆ›¾*%Ð9 U èÏéÎ�;÷ìß¿ÿŽé›Âìq"°z8!ÜñâÁHÕñ–LÙ»Ó´r}%°tù âè±Ã2�è°·²Z¯¶¡¾Õú<‚èC°ô0aê†`úî�êí™LíÑ—á¸ë¸E‡5©2(›êÊ^ŽýÏÿ·Žo¿ãOŸ¹g�Íoßõßò 4�ЙO%`"5±q€ƒ@‘à¼= øìÙ³g4ó³žL*î4ÍÉ–/òƒ–;dŠ9aŠSå~lù ÇŒj�SÓ*zÒ§v�§Œ ]ÑÈ«¼¥Ñ|œà¬qÂU¦zžeW}%yŸ�¢ßé×þXÇè\±WiÔU}úì<´ê‰¢O�¼Ú“®ÛR_z¢Ñ|Ž¿¢»Êù?tþÄ�þÉ£È÷ýËùëÚ/ç¿a–þýx²ÝF 3節ø‰sßýîwo_ZZ:…r¦D`ÖÐ %qrtŽÆØâòЍÿE?JªCçG„¼n9ÉdO”¢�T¯çòÈm}Š‘É!¶”2w¦U�~VcH€ [^¯Ö‰¼‰J}˜!©é®wÌeµƒ¥í¿0BÇd–.jmñ£Y…·/èêæ]AW˜{ëÿÔ¿ß}çíö™ÿîZo5pþø‚ ·üocÞ�Ç”‚&_«~`<ùä“ûvìØñ�ªc$S"0»pq-w8ñ-½ Bu Èü:mg�>h”ûo/áæÙWÈÁC½$8a.ΞDÉp&’ Ô£¬RçM,ŠZµÐÙ'·6@ ™”¼¾íb�ÈÓÇ¢ƒR�—Nì<¦EÕŒ¨ìˆbÏ“¨W,¢¿áp çߎۥ�¼ç_8ºmŸµÔw½·ü†½ûçèÛÊnƒ¥z&ú¨Ås ì¶§Ÿ~úàÍ7ß¼xÝu×ýìÃ&‡»Áø¹7úR>®¿œ ѵov)~®ü e¦Ç™bÊ[œn5J™•nÙb×rj;…ë�ª‰xÑžVáTJ¢-—Q!ð]¹‰UG6E©¯²aú”·i@?´IûœT ïú•b‹¶eC¶‘)‰•\Tu¡¤ÿêæÿ;§ÿè¿Øñ?¾dr“Ç‹ÞÚÈk@0›hã¤üoœñ2R&šM«,ÿ´Qáü—¿üåOØ·~ÓÊ2%3‹€;œ–1~‡�—a³TöDÆ^XÎNû÷o \²Sˆì2Ô…NK°P «¦Š½j04¡¦Šr³×Ý¿T¢‰J�G™7me¢¶"*8…§LTz¢]G°_“8¨óµ­Î cÆ SVP •QLŠUŽNL9~GÝp³y4ð¯ÔyÀªsâšè!CÇ6¦fÏü‘oþÒÃl?ò§ÇíÒ?U6TÚˆÌD³ñܧ}€èÐ{)ðöùùù',Ÿ)˜M¸bšã%@–û}Éœ‘Ö (Ô?ãï×T9UÊQa‡2Ęzùt•—LZ=ZmY=T‡ªãXIÕÁzÎøIõ½kŒÍL8o;Qg°‹ Úg¬Îû¸4ÖÐ?ŠéuØH¢ð^Xiä)ó$åb ¨û¦£j®N¿Hµž3*=ÑN/è{k¦_Z³c\&vá«ýYÿ©Å3OüÊ÷ßn#Ô ^wm7™îüñRËnœ´QÍ0ÏJ@» àÀÉ“'OmÛ¶í}öRàqUHšÌvp�¸“wQ‚xVÜO˜ŽËl¯:’¸[Âq¢Ã3µ‚ÆáÈ>ÔyÛ‰:ÓÕ¥ ww‡ŽôD‹@FIÔ…§Ó¢€(zôOÔx¯]i±TûP:Wt»†-Û¶G%dN�Ïñ,Àa¾ª¯; .lþç—Žÿ‡=ßOçðB·®ëñîŸk<,»±ÒF| �áxèT%0òíèÑ£§-xàå/ù/ÚÏ•måÌ'ÓŒÀ[y`K¹òú+€\hy¶oƒò;|£åóÿåìÏý‘™åèùûÆD™‰Ç&Ùw;\ìíLtY<#££ yéGYäUmÁ£C‚FÞ…�l{ª7!ÍñÐ×zþíË~NàéOýæG|}—M_Ïüã €–ÿ9:F!ÎäôªeЛ;]�À³yðÌ3Ï¿òÊ+¹ñÆÑÖÄ „2͘Ã×K€îàírèe;ŠÃÇÑÛŸ þ¨*‡ ÏŸ�-l\JP¡ÉTègŠÈŠnG-Ûñ*— jÉÛ¬”6£¬d|_ìxaÈõ^™�µW«w$öyˆ½Ú¥Òå>nQôÉLŽÛA&÷#ÞõLN‚¯il¥;Œ¶2³9Öžņú<Ä^×WÊ|³]G#_Ëek Ç¿¸¼4ÿáƒ_ù­ß}ê³Y+Üùãôù±76xdéü R:³¾S¬€b{?l+%ؼoß¾Ã×^{íî—¼ä%¿`yd™�©Gàmoò1¸Cµ£ÞïâíMþâ»LÊê€%V¶²´ï| LF€@™ð§€Á…cvî€ìâïui°ò�Cœ ¾ô�¶WQÀê²Z¿Åt<‰’Æ#³ ³¢ðþH½RªzÝàÀc?¼ßŒ'lņ›ºØ !ö:~T¹ìTÚ¶ï&}p–Ð#‰Žâ;{El9þ6%ËŸ9úýßÿµ�|�¡$篻-ýoèÏüsxµ)€~Dtj÷KË)ê§á–,8pýõ׿ÍNð\ h‘ÊüT!ðÖƒö€y ÿc9ß>¸¹®”gû¥Œ»º,�·‘ºãç3„–ŠfÙWAÏ�ºÀ•Ä Pw˜vB#?òŽ˜f9cýÌ üJg±ôi]¼ô{Œ¤üבÑ/þVÓ?Ú#ÑÆˆÇùÿ(ÀLnsg‡ßÂgŽ~ïþÕãþ+“¬äüãÝ¿f}„ñ�!Î`òyÖef‹Å{ìqÀ®¿øÅï°51œÃÔ\g”—ÍÕ{,Ë÷û›c·Kcqu…Òeò…–Çλ‡hÏ©o”àÀ�—ñ^§Rxô:j|ÏFá©ï©+ãÓö6¾lZ¡Û–«¬³«v:Uyq[ŒUö+?Òá66h^wáÞË‹2ú$:QÿLÝS¥ô+Ç¿òüóÌÿÎC÷¼ÿ×vÞñ ÃŽ;|½ô§gþäõ‘?½õŸÎß´| ÂÐ�‚:@D¥ òÍ<xÞóž÷ðK_úÒÛìDÍO¡¤S…€¯ØQíŠ=¼9óžC/wþhtwþ¦ãŽÞõ­Îr} gÅ1pgèNµ@"g %Q.YŸn{Öõ}Õ•=kÞï�ºýòqÅÎÁûØØQXHG«>Fê«umhßlÄÔ7&+hõ£�>Ý„±ã[¼Î/-žþоÿ÷žß|âÿÀ”¸óg©¿]öGïü-›IäÝ«�˜œÖËÀ¦ÍöóÁ‡ï·�\=¹‰ÔLÖo³G¸BÿÓ#€z„û"¿]u¡ü¡WÞ ,yÛŸGV¤à@'ŠíF‹™š¨GêÑ"é€éƒÿ£øš- ZÑ$5Ó£í‘D5Õ™oôUZ¶‚…úŸã—r”%fM`FêÑ"~>Å,JüûÎéüÒâñ÷?õÉwß¾÷ó[é¨eÿÖù3%l™*Lv(´ Gªo‡:~úôéïXð3[·n}ÑdæR+Xè€_t¹´†G½»üžƒç ç1o`óÝÿ\R¹8£W¨±È‘Õ³G¼.ðˆákqÑÃD'0>$7oeN‘‹¯ú­}ôJ[¥Nëð½m·Á¸K?E1ß¶çe./úÅžõ?´/õKÿrüšOa e6Qáe‡ÏØù?µtæ‰ßØý±wÿ¯ƒwÿÔ´[ç—þuçŸKÿðà.€ALZI=½;q›ß|ìØ±g÷ìÙs÷-·ÜòJû¾€WwšÉ$ë>€£Ó]>Ê)-^åræªOóÅka½´EML¨]Q•‹"/ö •\2L»QT»âsü›ž˜?tïßðƒ¿}ß©GT<Û�Ëþ8žùëΟ �¿�0*e0 ™~y¹BèJÑ£œš¤Íö›‹�<òÈ·l%à¼ýŠàßAæ%¹KÖ1¬àyÊŸuÔx9qÉ Èz߀„\wûÐò€(CFÇ$’ ü¤(•�/Yk.1:HñPOØ `§dKÔ÷^�¶F×ï3Wšpκ ·ˆ½RÚQ$j{D÷¼’×cç6|gl”ñ• EíhÌhˆÝÿ^h`–Æoƒ_úÖÉG?öŽßû‘ã‹§qúÃîüqþùÒÏ„)€ �25�×ÐÈG ›wíÚµýª«®z̾0èçìNâªX˜|"°Þà9ü-ö�Mq8uîè·:ÅIáP\×ÿˆ ÚîY˨(£®ì¹/*rοˮg�«»¬ÔoïÀ‘™Ê{”ºnUÔŠ0‹¬š7‡hwù.-ýGÃ몞¨›.šÕ²ëE}T¼Ï®kíÔ¾Ë!S&ý𺕺M×GÉ…ÅVµáÚn<¼„ˆ…РX¨o^î–}„˜¥Ýjž‘ÎÄøÏ//žºcÿ×þË¿Üéó㮾uþZ@žoü“¦ &EªèéÜŠT¼,mÞ»wïû �oØjÀk®¸âŠ›U�4Xo”¯®ÇâÅÁ°ì�3Ç©Ç_§DYypàÔô<ç+rºƒ£Åq)‰•\Tδç`K_Ô~)/2ê`GuÔŒ(å*ëÙëÉ(oÓ ~ûê´ðô!¶ØZ¬¸V±TE[íqí—òÙÿÁ…ã÷ÿêŽ;ÞóG¾ò¸áƒsæüuçOp�Ëþí�´B>€ÀQ$‡m·îì·_<»}ûö»íc‚'_ð‚¼Ù. Ïa/ʼnÀs†+åû¬Êݯžÿs §_‚ Lˆ³bÃÙsøËṜàÁËx@9I”z…‡F¾è î£NáÕ^9«9o³ð¥ýÒfÏYsøÃôKb«ÄD±­ÁžJB]ú•QlyÕniÔ)üÆÿÒ¦¥s_;ñ“;þÞƒÿù#��Û{Ò°‰Î¿ýz_‚‚tþí4A>€ @¢Ò:þrE*gŸúîÝ»wX0ðí—½ìeþ7€Ï\eJÖ ñ%ÀrGOתƒ²£™¿íoN ÿV–øCLžZÛÔIDAT``úªÛ9ª¡#”3,t¥;ØaÕ;Ö9ç¶ŽäÐÂ÷=g­Ó—~ÁCW Ú¶&Ë—qûêûð;øaö4V(‰1IV$ýûiÿÑ…S�¼k÷Ÿ¾÷}{>ù} ¢ãg©_oùÃsç/ç¿h|¾ðg \HÊàBЮËéÈ6êàÛ|üøñS�>úè×nºé¦9ûÁ7ØE2W†c™ÒËŒ€€yŠxGïîÏvqÇÅ{Z1(�@©I±[q[ÃWÚ¡¹I¬ºMJ[]ÚDËFëìK¢IväÜ«-…#÷ãû'Û2ѶזK¯ÐñöÕïB‹~Á(ò½ñµíµýYßã·oõ;wïÉGîü»¼÷¿=pfÏ1Ͱçýºû�/û¥óï?´&Îe01TC9£Æm^ÑíÁGŽ9òuûYáìEÁ¿f:C]'w‰ÀåFàmö)¿³·CQ½PÎøfq<ö�æ°íóÿVª%j!ÐŽdÉ&=¨Í‚Zx½;0™ƒÄ {rr‘¯öT$óxQ—¡ËF�¼Ê[^aÕ»ÁÚpXþéÙgîù×»þøýxêÓÛ7-s×φ“× ~ñ~Ê pþLŒ6c3MŠ@“"5ZO4®HNMxO¼`üŽeî·ßøëöåA/©EI�ËŽ@yWoîÛ®Ç�S² —çnißx¾»B§õâm|qü½º (Š3õÔ®c­Ù>B§ŠêPØÓïúf²È£5Q’©Î¼1.SV"?‘Õ ¤ºÐaªÒ Õ:–²�5þc §wüá¾/þî;ÿÐç~zîà) .ùÄ%-ûËù·×ÛÉd&C €ÉpZI«uôä90upBIQoÓÁƒ?ôÐCe裼 %p@¨à@u]qÌ®kÓ[/ίÈ8UÆ'tõ1¿hk|ÍÕiÄ6"¿:kó 8þsKóG¿tì�;~áÁßùð7On?`r7¯»~ëüÉÇçýºó7±_[¡™.�•ÂÑ 4µ¡ÕË5”UвñŒÿ Ûø‘ 6¾@›dè°m½æšk®¾í¶Û~ÙÞøgö¢à‹M–)¸,¼ëÁ¿eíçîÏ÷ý~ž;ÿrg_œ=îŽÀ@²âøåì Ê—-Õw ” €Dˆ‡®&Ñ9|ꋇK­¾UïÝ`ÃZ5’ÓR;R*’•ö­ý¶?Œ[cÆŽø�<þ¹åóG¿yü‘ÿû?ýè—öÍçŽG®7øqðl äôã’¼¹>ñf Ódp´gZÀR�€ü°@@Ael¬Ä\•�€!‘é²!ðïxcuìæÆÍañ'ÇŽS/ù ˆGZVˆv‹ŽÔå¾:°ºËÊZ;Ì‹±í�Ç ­º�Öá¯u{0¬u.füÜñß{âQ9~;ŽŸ�»~-ûGç¯`@Ëý ZUeÒù›Vw¦^l«³[_xB pì äôµ"óÒé�·¿ýí¿d+ÿؾHè³ WŽì¹F€GÏ×TîàI½»}ܺÈ ,yn¡y4€Lõ»“ ¹¾PÒ:àÖ!¶ål߯"'ΘÅC'IDª3¬þE÷¯ÁoÇÿìâÙ}÷�Úñù³ó~ùàü©èøÛ»~99~¨täü Ôì3]4:W/ÚPèC\µ¹S·<›‚-÷c‡-Ó%B €KlcV8C¹žú5Õh\hÃêo6ç¿åÍo~óo¹å–Û^øÂþ¼}‚à&“gJ&F€O”Òöæ x‡¿û=»ôÆG~—oå…Ö€ÀZò7ÿíÈÞbú[, €zâÎ9ÜÑËùCIœ pPOãôÚÙÖ �ìT*Û½îô õǴߘ7œ.ÎÞ´ŽÿÌÒÜ3;ÎîÿΗO<ðíßßó¹íse‰˜qÜ£tøºÛGÖÞñËù·¦>Ó%@ ;÷.�í49ˆx órÝírô1PU¹ ¨>Ôí¾á oxÍ«^õªŸ¹þúëßüüç?ÿMöÝ×v!%‰@Vpd¼ÈÇAÄ]¾–ùµ*€¬¬p¨áð)!`  ÔÁ¡*`@{rÂäÅëªÞ:ÐqÂ@ý`û0�S'¯à£m}TbÛ_S– ¯×´wÁý·úªƒ=ñPÒÅög­Æ?¿´xÚ~•ï¡ÇÎìûÉWŽýøÇ9ðÕÝt·nrúrüZê׿îîcWЗ c;»ð™.1c™.?à®-:r9y¨œ>�”—Œü°@  Xxík_{ë+_ùÊ¿i«¯·�¾Þ>Qp«]t©›)pxÀEܸ9óâè‹s/�:'ïå%@(¬Õ©�€ôK`@¡Ë ´ç2Ç9¸q|`ÊÆ9àÆÁ¶q ½�Á˜€¢éŽUž¾ñ/mZ^8¹pæÉýçO<þø™}�ßsâ¡Çîyîö ¨ªºPÐL—�©—±Élª" ì¡l1УœuëüÛ @Áõ©§ @Tö7YPð¼×½îu¯´�¾ÆÞxµ­¼Ê‚‚›¯¼òÊ›íb~µÕÍ´ÁˆŸ�C'àŽŸ?¿³7L  ,[™} À�~ |À޲-^f‡�9J×0™|&°Š‡’hOA� Ô8xåZ}ÕuÇÜ:ø±úÞ‰Þn\û=Í Ø_Çã_\^½ëÜ�=ß;µc÷'}w¯=ÇÇA“€@›5TwíºÛ�Ž>rüª'ç/Ûj šé2"Àù•é¹E@se“ãÖ~ ((hiÔÇFÜd;RF­ü¦›o¾ùûÉâ—_wÝu7ÚjÁKíe×X`p£/¶ÀáE¶½Ð.À×P)Óì Wxù�%ü²`�9è¾U;\ЬÈý`µÀÀƒtë#¨§Æ¡·y "ha5›�N[F~Œý‡LÛè·§Öþ€=ÓŠÄC‡¥±öšñ´íµ6[{my[¿ê/lZ:3·´pòìâÜq{^ôØÂ™Cö»GöÏ;¼{þСïœxìÀ='·ók{$F£‰�TÎZ'®MŽ}%*](v±#ûÆvmÃgºÌtçÂen7›D@sÕ&'�»Ñ´z±>6ÉGÛôBy(©¥�̃+ìƒëí£ˆ×Û÷\wõÕW_k«×X�p­ ׽Ɩ“¯¶`á*6㯲 AüÆ{_¡¶ÙJ±SdæW¸zyÛÕ{t2ÚÏt‰øG{n5Ðù3ð¹³·»x2râ8üMÜÙ¥ŸãKýä�W¦Ïÿ¼ºí†%Ä\úkñÿåq‚W—.ÔR“ˆ'B%·Ðì öë_hÿë]Öì‚ËK@kAÉ’5ˉ±ðË ‹KË Æ/.oZZX\†_Z°¥øó ‹‹s ›æ–æÎ/-”mqáÜÙÅù3§çÏ�>»xöôñ³gΜ8ÿìé#gN<»óø¾?9¼ëÄ‘3ǹû&UäúxÉ ÚPˆŽYÒ–Ÿ$�ŽmfJ6rÊÃÆÝ–­”WY¤ð1�#–LTŽZeP9~ñÑÑ«,ʤ‡Mx6Ù‡’DK.÷ë�¼ð®›©X±#š§Há夣#‡—“�²V7æ£Mñt �¶í˜GgTž2’Ê[Þ Ã.êq²‰ÀL °’3Œe‘gàʯD)‹å8cRtÊâ¡+mröèˆ�õh�|Û¶‰º¾ÀgZ‡äÅvNʘ.iÎ"…g“£Ž4:xñÒU>ꫬµ©|¤tUùa<2:$Ñ’ÌKž4ØHÈikÌÊ‹"]‰W¹htÎâ#…×Fñ-UY¤jêõõ‰|¦)@ ½ OA—³‹�8ðÊ‹—c–WYKÑ•LõD%§ ’‰F™øH[~X ›™�YC‡9,µò˜iË“�2œ·d‘F¹ø–¢/™êÆ<ý—žD>Ó"�Ú)œ´º¬ùE^[›—|Åá�ªÓÊ•_‰RF¢½˜Ú|,K>˜UZÇ9*/ù0Š,Ê•»èÀ%_‰R'–“'!#‰–\î§�¼ðNíÔMÔñ8¿-¯|¤“ð4Œ^Ô•lEF’~É æ%mõ%OšL#ãœf[>*/ù0:NË#žä%SJŠò"ÉýL �Ù™˜Æ Dœ÷ÈcHyÑ(‹¼ÊE)#Å|äKi¹dI�D  0ÌÙFYä©¡|KcY䥇Œó‘/¥¹Ÿi†] gzÀ9¸± ;&.FFƒÃê�íH*$�Qy˜übdæ�;ü¼0oܹ_‹‘_Èñs!ºkÑ·´‘L3Ãú¨ñ\ˆî()O�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�D H�uŽÀÿjí�°�IEND®B`‚úÚ�˜k&ic13iÓ‰PNG  IHDR\r¨fsRGB®ÎéDeXIfMM*‡i   gêI@IDATxí½ ´.Uuï[ûtô Ò#è9¨€¢(¨`Šš(‰};MŒÝЈæ&ŒÄÜû«o{ŸZ{WÍYsÍ5ç\«ÖÕªæ«*Š6µ-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-ж@Ûm ´-жÀdZ`f2n–�—¶½–Æ®œ[a.~”»b‡®×9ßîdz§ò¼ÅßsmÃZ >äÛýxlæyÃ|,ùü]¡S«Ž¢ì4x-Ú­ëI%åù!i×ÓÔ9€Å‹'¼¶sšË¥—Søe—–cgÎëŸ/ìÀ5ÙÌSžò”öÚk¯#Ö¬YsèŠ+]¹rå!¦¿¿Ñ}gffö›››ÛËè¶Í²›ñ«�®±e¥-ØÔbìÒIºáU%Š9ÃÀŒ5”$Ú#!ES¹âSi—KFqñÊGÖ‘†øÏüÍZ¹YÛ'³㎹ÙÙ­sÅܶbÅŠ-&zhn¦xÈê°Éd÷í(Š�³Åì=³³;nß:»ãŽ-s[n¿gö�Û¯~è¶[þê¶OÝmv'_°MÊeyÈ9šKx­}·„«P†®º@óE€_qÄGì~ì±Çžh?É–c à�5Ý£ Ì/­ìbÌŸ^}ª�`3Ū™•ÅŠ™ÆÛo« ø+gVyþJË›ñf­Èhø›1¬õÁD}àî«ìÈÒz­¼|CIÃôëÚìÜì®Ù6·ãÚ­sÛ®¾oöþàöÿué76þ`³™c À¤(¼c«°ØXª)Zn©Fq ìl•`OüŠÓN;í„=öØãeøS¬£œhrŽÚmJ-ð'W=Ó€¾*?À_i çÏ€Fí�ÊàÀ�§aD[ Ìˉ¯ u{Ò•-(i¾ö£Tµ®ûKv·nŸÛ~éC³[¿·~ë†/ÿÎ ý3+á3ŽDQ«Ï*£KŒëÜ£K+xbÏMÁWžrÊ)Çî½÷ÞoZµjÕKm'¹´ª5ÙhÿäêgÐã¨oÀýWräç/Í|@è5H;@€¬àf 6 ·ut³a€—.Ô„¢i³°a[úuadak›!üúÁÙ­ÿëÚ­·~æµ×ÿÝÕfÍÎ*Ê�ÈòeaΡtì™Ep¼—=&zèêßþíß~™�ǿͦö§.Àþ.U”`…á™ö¯NSÿÕvÔ�S€4 øÀ`Ml]] ¤‘ÄC§! `ê1ÎWëì¶‹îžÝø©Wþòÿùò]Å]ÛÌ^>3À¼ƒº«©ÝžŽ=7Zó(Vh ü‡?üákN<ñÄWí¾ûîiñØÑLµZj�?¹ÚNì�)þ*;Üú9¿ÏÒ©€Ïl@0Z?ˆþÎî ß“ÄÇ®ªч¡»õ+ã°_YëïðüˆbG1{õ�Ûïý‡7ýòÿþÒuņ­&Í�BSºŽ=5¥Áea§ÀÏ•÷•Ï~ö³OÞwß}?jÀ?.ÓmÙy´€Nâ¼ß@n@×L`•ƒž�€™ð§éé×;ÛmTVØÀŽdózdUÙÞYƒËoŸ›½âÚ-·þ§—^ÿþÈBâÔ@§Ô2r´‹¡�¦9 ôPõ1dzÿI'�ô¾=÷ÜóÃ~nÙµi'[à从ôó}¦ñq€n­Íñ~2 ¿Ù $ÑØ}­rМ—…Á€« ôHØPÛJ&¡Á[Ä.cÅ"ÝÞåM¡GrI.>¨µÉÁ­Úïß|àé¯.VüèÇþ’Ó‚zR¡º|*¶§98bÓ"ð¯zþóŸÿ2þ?XÞáSÑ‚K<fÜèèkìÜfÎŽø+ÒE@Vq=Àd½nàÓ�;š©~ÎÝ Êm§~%­™;Π&Ÿá°½îxëçõ·‡n»m놿|îuñeóµÝ–%1˜Ö€€%ÆUG}ô'Ÿ|ògvÛm·ÿö÷±¥MchfÙfÊÛ}Ìâèé3óã3?œÆ½XdeWE^ƒàB”m²Hø ¹/£�ð%§S‚?ùpv ¿Ü:¶Hº#1ê `°ÿ¼þ6Øgß•{¼òí¿ø‰»Íîþí>tå–ðé•Hìô‘iØË,õWÙ²ú©O}êQ�zÔ£þîî?˶Û4Æ8ù®G¦sü€á ;úóð9÷Ÿ±…{ÌUÁ§€ˆ#¸Y„–Ý\–ó¹�B’ëä|¥�¶¢Ëˆ‡²øEEct›0ôꪬôÝ’Û ´ƒË¼E°ƒ… ¡Ñ¹&F»yz̉{?úw�Û}í·ÎÛø£��Ó·Å^�¦D‹³”S~.ôvØaXã¶WøØS4¶=Çsµ&ëåDøÄr8åÇј Ð´/Ô¤Ø3ÊB…Ç–¨ìŠâƒlQx¦ó¢>µGÅd¥}ôÃ`”eËeÀÖþl³¤dQ6Ñœw=/šò͈âõ¸L*Š#ÂƒÚ pìóö=á‚sý·'›€ƒÚA;›ÀÄ‹›¦i°&g�yCù‘ßÎ÷_±ß~ûý‡É^ÜfZÞÞ9Ú ë»;Þêm²tBà�àz©9ò£2|GԔ̌„½ŠI’¨ó¶!êÉC2ß)Â…Íyd,Ž¿Ds^ùÝæ)vÝž‡WÈeÎ']/èwZ¯¿=Luð÷Xûß9æ¯0U~7BŸžºA`Zö ñ8ø_ð‚ü±]ìû¬móã›65ÔÑhyunÆ$¶43vJÀxàÛ  j‹ƒ7Ñœï—HÐ °¤Ü¯¨Ù´”0å| áÇyÓ%ñPÊŠº‹M´g¼™ Õw ¥ÞV¦_ýr¡3·Ç‘«úìÅÇ~ø�­ÔTÓ0Ф,%øŸ÷¼ç½Ü.ö½?ÉŒ´©©àÈÆ @ß6ôØ–ý±aÀ½B0vri1U¶ÿsŸûÜ—Úo÷wrÕn=©ØéX�zaH�zJ@÷^Z0šƒ% v¯s/›Ê©Cä2xâªhpLÒO�è+¡G’~�*Ï•’ždu]ßSý÷˜ÙíE_?ú}/5_‹>,Æ 6Æ÷ªuëÖío/ïxÂ6-N Ð:ð1éMÀIGj"¸”‘_‚ŘŠQòuÞ%•~.s>+C9â(©[Y2“$•½ˆ]GUé×i /óÑ ã¨ÿQ«zßëö<Þ9É©€�¯õø&±=é€]Ìâà7ºÚžñÿ£‡ÙÒ¦Ejÿ€!ÍÁltÖ¸€O'è#ÉA™ñ!µu^Èx·’¨óVF´½ÉSl’Oµ3>ew‘š;3™êà\¨Á¬«° túÕLF4·­²ã¬¿½jí°¿8ìUôýE½58逶ħ_ø{Æ3žq’½Áç�Û´x-àçñÖãéàðþÓßp KòÍ9ß't�ê<>°DÙå=Ï}%ýÄ—æÔßLÔù—êC™<bÃH¢9ØK;5}—KV*ULW}°�Õ¿•{½ñ‹kßS¿5X˜7É€æeñÀ¦ý»ÙÛ|>”¶'PÕÖE¿ Sz?NÔ�Ä©cG'f# Jj¢u9ßÏQ]ž—Éùºž¶Ó¬ÀF) 'Å#j:9hs^ŇҼŠÎã‡R¬œÉ¨±yÌ9oY#%»;xü^�þСÅÞ»™þ¢\œô€?–UO{ÚÓ^a¿î{üH Õ*5Ût^[|J e³”¥�^ˆÊ1OQìd6zïÀ”•s�D{êׇ}<ˆ�&Óø€ xhO{^>ʺ¶“®ëÛJ´§êJ‚²P^4Ùé°‡ :J¦»ffåãÿíèÿÂït-|äZÒn„Nj B,~£kì9ÿ?o¤F­Ñy·€Žø¢ì*�ÈAeU@¢ƒÓ‰{-ÊsP†Hu>6ËøÙ’ùöâ*huýº?7œé—Žú1Ò…Ú’×5ç½"–ïþUÌ9­ÇƒY·„-7匭TŸ#Wôç{{óºz ‹T£‹2Ø»ú_jGÿ£«Ukx^-À‘ß~ó‰¥n*¾PU=éxçÎ@ƒÉ\æºæQÔÁbÛ¢ãú‰ærÉrY/{²+šë¸�äß+•ñ¥½äoÕŠUGŸó˜ÿÌmÁe9Xóyb°ñ‹vôs’µd‘[ :휽ÀaOÙc€uf Ù·ƒ'=#ž®Rߤðn/é¨3D�$Äw€ä2x·Ÿ¨Û5c¢£NÀUYhÎ�šOôîWÕ0;¤Ò^âG©ÿ‘»&t-ÀXo:hciR3ü°¬²ïðk_éyfc5j Ï»˜xG¶:NàéÌýC^Qœä2øúB÷u£ðØuÞ6E�íN”#¥ò¾i«´Yf9c«„?§Á§‹›}JÔã'dМW½ð£29¯ü:Å­ë§€½®™}l¸Ìè3kžùñGžÁ“°šL›8k2¥ªûð£ÿ�ø†&ŽÃ¶Ý¡(Ö­[W<úÑ�.ì{‚…½z¼°ïëׯ/¾öµ¯×_ý‚ݬ^½ºxò“Ÿ\œp …µIaƒbqë­·]tQqíµ×.Øþ¨Ô)ÙQ쥘þÛÃ@.0ðú,g�'$Û,Á£²9ˆÜ<ö­�ò«ÒÉ™ö ‘É�t=F|ÕË×p»öUå;f4l×í).Qé@=ÕüÕ6»ì �¿l½¨ÿI{?îÍÏ{lÑKE«†‰ƾ–ƒ±N±ïG~£\äØóE/zÑ%vþDÊŸ B§{ìcë`<þøã {ÿ`êˆÝáíØ±£øÇüÇâ²Ë.ëÎQò¬g=«xÝë^W<ìaëYâË_þrqöÙg÷Ì·ðÏø4Ø Þùg/²ò7µ]ƲÊ优7÷~+ð¸£iØ^bÍŸd¸%Ñ{%sA³«ís;n9úò·<Õ¼øÁv ,GydawEŠg>ó™å)ÇÆ�‹O~ò“Å�wÞÙÏl#r•;tè�Ñ‘+™'ðdÃe¦ =QÊt𩼀[Ú¨M9;…/y—™­®ø¨>T‡¿`ýÌ'¦½ÞØ_`ý�ÚãP°BÇ;yÙæxSSAçË »ïý˜ñ†Þ¬5f MÊÎØÃÝcÓ¿J\Ä{ùËytQ<ðÀÅßýÝßù}þÜ̯ýëâŸøDñïÿþïþ¼Á–-[ dó½»�Ûܞϱ³ÆPo ÈHP~& €Ê6o4R'e+»Äæå:Ú”rÉ&å=/Q¶=&|°Aê4ŸÀ]‰‰«Ã¾i0£)5" rÓë¡: •x(I%å¿®_¶EÒ/ §@Ã] Bn¯åzÔïbw:–À�{-ÆÆ”š�ûTÆÎÿû£EÚSDí 7Üàõ Ë^bZØcÍŃrÛ¶Jp€ß*¤ÃlÛ¶­øÐ‡>ÔþJ»(8ê_y啹hr¼í¡9û4ØŒ=}Ñ@c÷ÿÙq‘*0Ðá=‰¢ä�8Ä�Hd±�=x§ˆL7dI!É ¤nýJV*¸¿ˆ®~ÎïöQT|^(ó•â)+§Ø“¾b«â­ù—]цê¿ÇÊ54xMšXá ©Dó°ø`÷ÿ�jÊQSv‡Ý†àö6ã÷ÈÞñŽwºÅø¹Ï}®øå/Ù¡3UÔþ&‰÷$ÜÄ´_Äì^’vµx–�Oö48¸†�eAGÔyÛÅEX�PÔ‹¢„ ‹;‰w†UCÎK!—å¼ò»høwýw+VÓ©7Fq"G],T€“¦’ŸY·nݶC&s_kŒµáNÁ°T˜öÛO/Æõ�oûÛÃL,~~ê^¼,º[�ÉHÚ“Dšt=h�ÊBžhV¶? ÊRy÷e|©�ÉA‚âJÔ§îÆCóé|i�ðÓÀàñSŽ”Ê{žñ¥~â•_ê:c+â&¥øÇU{]Øþo8øù¼:8�w\õ?pÕ~`&EàÔc÷ªÉ€X½vààq>){Ã~™wÐAùùþ+_ùÊ‚Ûz¤óÏ?ñ.êͳaGþYëÉÞù(pôt3FGO‹:?”…\€Só” ;)­ÅŸËr¾ÊŸ\ý÷œÙ Ìè jŽ35y° ÚFÙ%y @C�2¼öµ¯õ# úŸýìg‹Í›7Ã.‰ä±Α�äÐHà,!×®Ìdº¶9cOáÈ*™ÛêÊW϶•ÙÍŸì”%@+ÝÊ>2·W~uTè{¿xºõ=¦¤_ñÑ6ag�½h‹qÔ·•k–Å)ûaÆÎ‹{ÿð=öÒT¯9¢{*OàùùÏ^\r ?äZ: |X·u`5Ý[õñG U=J ¾~„tknO6E£dn3ç#w¸}÷îq„®‡Qã­êëë<¦œ5¾�¯ÿjûùŒyI-\�k|ÛMœ��(Š}Æòä-�2 à�îù/Í$àDô>-ïQ‘8:³sãÉRÉTJ¬S²$øz7Éeðõ¤²²Kyxu3ôe~XªÛC_²î²ªë$êo3;[±îàûHšp§àíÁ²Ë~àW†wÜqGŸfžb±:í�Àå4Þá¤C/;1ã™)�|Æ`kJÂ÷„ÊBsÞ�$KÁcWÀ­´Äá‡Tù ßQVåDC/×÷8(]Æ£¸ÔUC›u¯4ÉúÛ˜ò *Þ+¨Êš¼@h |Ïƹ¨ÅG™Üxã�‹ãN;·)þÜL< Œ v˜.Ìå xr?q>çÑ’ $lk&!šË¤ŸS|Ȧt%óí4HÈrPöTçyG· ÐOkP)jv"E;S4޾†Ûô‡:|™j€?Õ ‚?dîÞ ºÌíÄ:®—øÒ?e³|ù€Ç–¨û0Ý’�CÊ»cx×O:Æ»QSóíŒRWdPþH¢±2b`Qle}Ì¶× ðV¨¤Å ˜‘KÌå<ÛcIM ]�Y¥øøá’NÃNÖ®]»dëWv_:©Õ‚žæ�–Ž o”Å»s¢ÒE�Î[RÊ$™3ð‰qx@š¨ó”A†�Ü–é¸^’ K.ƒW,Pl‰Â{%;r�:ïú¦‡ ~D�w ‰Âç>á;b¦l’9Ÿ×…7Û.Kþ(ï2£öí‰`¦É@õ¥ªM_kÀG£iØÀOƒí‘çFchÊ8§©¿¦>ï]ÝÜU€xM4øèôýâªJ'KæÄe8Ë&~„Ä«"çGµOL؇z|íå/¯CÎWþ:k:Õ…žÊUe*®³´+�\k€39–*càš�ÀYV³±”¿ P§ìU:YrÉAc Üy:¸u ãé­Þ‰må§~¤2½tÄ 2M×õß󈆽4ˆ”å“-œ» V˜Jö�Èì�” Þì»*QÛ‚Qøz@î”fÑAíõ?ôCz·óÙ·(è“eŸwKÉJ¥œq£&€æ¼tT8ô Œ‡²ä ÊyåcÆË„½tR`¨‰?S¬Jn3•qâ¡ØÀo¢½â­…‹&æû'7fÙМW †Úâu j{„77ž&LÙTÓÆ+Ô„Žìz½× ûÇsÌ ìéÌ󾻇_ 4&Ûm¢Fjà»2uæPÊsYØcÍ«Åb p„fš^ClÓMªS�¤Ÿd˜C¦+ƒÎP6>CCß�dÒÄ«ûéßñí¬Êc¥#^H†6M¬þ<œ1�4‰€6dY’I_óág¾Ã¯ ·‡ž Þþ»d’õižàUôü*p…½Œ Ž$(× � På^M{Wyàœ�£šS·Š¥*i0ðA/ɶʣþ£L ëúÄa²2.Šå=ç®C†%Îk\Æ*Š’� ¥ŒíPJÛÉG=þ֫ɲ¢?�È(caOÊÏØ[èõ¯}q衇ºÝa/ëd°àÃ"K*YãÈGúˆÜAgrz¢¼/¹ƒÐ9¶:ÿ”õ²I?P¦�#h¯üèî9º}Í觘ÔÀè‘¤ï…ØŒ?¤ñPTLO4TqR鋇:ÏÆªµ…ï¬uµ¥<éSoø�¬ÿD03'죥˜øz/?õUú—ù—¡�û.µÓ boðN OÊd%€� T®ëXµ2F]/V¶Ž¿èú·‰eÇS0¶Ö‘Êö+ÿu?ØÅ¦qP.·<º^6�O€Ä–ón5 hÆWñV²ˆ%üã#üLºþeS5Æ4=D�j,üæ óIð·½ím¥ƒï~÷»Å÷¾÷½‚¯ J|{p©¥tü·°k`ò½g2£Ž%Ó¥Žqt ZËôg9þeh¢Î›XÔUÜ(+%À6¢|ø6›¶™óÊÇzØ�!€­�Áu§Nëä×�$+ýÉoØj¾þîGa†Ó1¯›Æîä̽õ­o-öÛo?wxë­·–ï÷öúnuŒÉE»óžÊD2¿%˜p¢?¢AÉŠæ|¿|†ôbXÀvâ Žh›Aö«A$€Žÿ�É®(–‰C´w¼�öÔýiøëW¿ÜGΓâõš©¿U ñÔ=šø¹Ï}®2œ,ÎûÿùŸÿ¹üXǰ7ï³Ï>-•0±Ž7ú €ÑýËNî/  GŽ@ÐB† ñ±å]<ÉÄW®îSzã Î›ÑdW%ܾ­DaÄC�ϨÛï�öˆ7³ª´%Uß:%´‡½LùÒÛ¹ú›“ÆS;Ôš˜õüáþa)å ?|­Géî»ï.Ö¯_¯ÍžT¯ï™9•BëÔôk:¶Xã]„,%?8£e¢œW~2b›”aq#¦WL|YËØI©6`ølÁd>“H¶òDw Øéo/êO~7¼.vý#ЦÖí�µ,·ðÎ8㌂«ù$Þëßë#�£œdf§šuð”7i˜ F÷(~Üòþ€àB¹åE1�_3À«(z¹,x“:PS“‹ÐœOÙŠ$h·=ùV<èÁ÷ÓÇw¾ ñð*«€�KVÙ–?Ê*ÙÍm# ¹IçUÿ²!cÚ kÚ—½ìeåAó›ß\õï•–Ó…@ðÂÇ¿#YG5†.ï bÃABÇ�Î[Ѫó ” €‹.³œ0ZR,ËSÐêü¿L%ËmËz�¬ïuµUÐðqE¼^g¯=´è­ê­v¨|+ž<Æà+áǤ©ÈA'Rø�Á!êÐ1P$­&H;¤V]·®ú¨çýùÈG >ÖÙ+ ößÿbÔ÷ð€Ñ»ßýîâÍo~ó"ý˜ˆ·[7ðÎ2º¿ÕÜ{k€ºçûºàP›€�i˜ î°¤^¦‘g2t{êËQ¢¹NÎWj�B'ܰ$ÚB€§|ç4ÞúWq7ǵ€µíš5kŠw¾ó�å'º?ýéOwœ÷×›œ×þàþ ày~GÀ{'�€!�˜D‡v\–#@©�~«�|þ\¯êü6d ¾ž”'ý:€ ^nêWI�ïÒÏd¹mùEŸ¤x½Z^“%%Qé‰zÕ5jv$3;øTL½ü'%Éuò²Š�ºº½Tÿ²`ƒL;Xãrô=ì°Ã¼™¿ó�ï]tÑÐ&6 åBà)§œR¼à/ðG‡?õ©OÛ·oêwì tdûãßz4ÿé†�1Å‘“Àm<�·WVG%Vx%qÉœ‹%cCº*_§¹NÎK/� >ê4*fÞ¼‚F€E{ë›×'¸¨·hîKþë4�ÑyV–¨3 IÔùÔV²ã ¯vùà9ÏyNqê©§z3ó^¿Qßì;ìBà“žô¤²C÷Ú‡k×®-Þò–·xÖyç�çŸ"ï¥×¸Ì:xu `Òz¤5ÇŒtLRÙA­¬Ë IÔÙ�˜•uGŒ:n½¤“¨ë©6eW4÷•òKŸÙv>XÐ5¾Kßlº Û=’ò yY·«¸D­¼×!QÕ[ÔãVÿ1Œ[´K�üã‹7½éMÞ¦7n,>üá—÷û‡5ô°Oöûy0ygžy¦ŸzÜrË-Źçž;Ì]sùÖ™é”Líé”ôßê}i( ß;¶€h4ï¼€Š…$êlÈúÆòÝ.z T‰:ÀL,JxžDÙÍyW´•ÛNžØD§(eÄCY¤ e¡Î¢“¨?15œ&ñkÀ†«P™_»vmÁ�wøù.ðn¸á†â[ßúVÁ;4Kû1�yLñçþç…}¶¬Ø±c‡?ìùý¨ ]>·û¥ÓO?½ëËB¼5ˆ‹~x ŸóüãyÐéçgArëÐ\ÔQßû=�;%´á(#ÏÀQ¦œWžÊ“'™±RÅFÎ.Ïó,S2¶ÅCI”u™oÅf#á×x®‚MÔí£dKÊNs¥²äÖl»,Pãe,ÅW�HÅD±œóõú‘ßpZ6ÀGQ¼÷½ï-øJ/‰{ù\\cá–ÓìýèG~ž}Úi§¯{Ýëüè2í6¥G¯ž.¿üò‚§û¥“N:©8ùä“Ý/:€þOÿôO }Qø _øBqóÍ7÷+>¹wÀè…\è#±q‚?ˆDQ¬wXò$K6ÒÜí2 O8fŒåhï›É‡x©×cðâ„Ö¬lx+3Ë‘ ýÖ‰ÂUˆ;âµ8\–âñ29¯ºªBäIfÊ]öÌ•T–;,+ÐQ O -›àU¯zU þz»q��gûY¸ÒÎQ_éßø†Ï´=ú‹_übà€­w½ë]ß äº€2âbøž†¤óR~¸ÂÞ @8úÓD¨: =Ïz84l•'#žSm–  ýN£ì` s1@Àü´À (ùIÁ'rêtøJe+{)ÞT”ြ4,šÉKƒ‚ç�³þÃC^°Æ²tTÖ"9ø/½ôÒâßþí߆é›Ùe—ùô�ÛˆýOüñÙ|gଳβƒEêÙ¹“ßà·þqô„Ʋ’Ñásð u@¢Ô.t¢Nâ•�4çC«ZDZ¼ë'°UZìÃgÈVÅ‹4ç»õ# NêÎðËFÔ§TÑ…Ö߃hxegË#=ôÐCóªÈµ×^ëçý y{>ö³ŸÍËï}÷ÝW|ðƒœš/ÓYyoðno+ht~º0Ý=þòŸóʯSÙ�= ^ }’Êå6áI¢ðóÕWYh¯?ì!¯ü‡Åùýã«——QìȆê-:j}Ðk2-›€ ~£¦›nº©ø‡ø‡±\|ûêW¿:ª[ÿºÐûÞ÷¾âöÛo¹Ì$¹ ¨Î*yçxP‚wåŒW~�bËõ“Ql’ñ.aEŒ$hλÐV]öMÉe} (6Å�.¼â¯|œÂóŸóʯSâr}K]ñe2WX„Õ²¸•¶iÓ¦¡MÈÏyÿþïÿ¾xðÁ‡êŽ¢pÝu×ù‹B†ér!’‹”‹~ѯ¨:¥:¯õROÞq­£ëE¡Þéý—eCmñ²‰ÊŽ(FÄCùæ¨û³é|IÓÔ^ç÷½Ê'Ê—,ydfßmuÞÄ¢¨zÙDÃN#þˆEÔyǺ¯Âå„ëïÁ4¼Z6×îºë®âø@ñÆ7¾±X»vmW³ñ”Gë/}éKc⎠qm�+þõÄEÇóÏ?ßïõÏ÷4¥n«‰mº<`ˆ7å:ì�àÆ1¶¶ Íé8aÚ¦hк¢à‡×Š'Á:›A)[’ EžSâ;Ë•åMœÛ/¯ ê²¾bsŠ=KVÝKä¹=c•ᷠţ+�²ïñQ4 ¨˜(â<>Å-:ßúG�Í®ËØÇè†ÞÂ¥d®Œñ…Ó½^ò’—Üht"‰Æ{ùx)·Ý˜pÏþŠ+®(î¿ÿþFcàû€¼ô�Cñg 8ês¡p\³�&‚÷u§ØÎZQ¬²·¯´ –ðöijßæÄùª$«¿Ø ²ö®.fÒ�@œº•ø …y%¬¬ƒ JªÐíȆ+ØJ>ŒK¾}Pñâqô¯â¡LžT6ù˳àëÙµx†ûë2�­;#ËôåƒlñN‹âˆŸ½q�I™Ö2]ÝjË[ôÓMcž–Í @MÁÎgš?ìÍ=Ò'ez?mSüaõ£r„ò@êxšðD`Ü&§ct¬‰Òƒ/è¹&CÍ’ÛM”m7Ÿú<Û‘°Ý'‘•á¿Û^ðÄS¨ã+¼Tþ¤©x»T°QfâõïÓ,ã/»`œ�³«Øš³»3LÚV¤Ž‰‘&X“EnÕ*Ý€æd­€T÷{ñ;óË›üiŠÝ5 ˜ÉðJi¢ª¼<¿®a¤� ýjB¿ ð5…¨ ÃNïÔhýû9íÊNKÛ`§›nyäˆ9ÃÇ@¢·;å<6º} Àq›PWTógÀ,æhSd@ð¾ìƒ‹zuÐðq›=ˆ\¥°*IÁW¶Ù©±Å¬€XÂXìèô¡£$´Å õm/Q 8!µõl(Ì«þ&øŒFý5kñ [a;é!j8µ@à <íæéÄêt°ÑG­2÷çG@Ø( %(—UŠ#`tü�èÈ6p°Gqèù¯-Ë-efvãÖâöÓ¾àUµþÑÖ:V@ƒÄÇ> _²ÉµP;L®­§ÖÓ!k€:!Á24ä Ö�£„JB£C·|Ö´©àaõÐEeÃ�¹½à|¦ñ'�곺 ¸l]L[ øÅ>:œul:×|$ ÐÔÙéòê¸Pç]ß ”zÒ�¢”dѲHó¯?3#µEÐ^ ‘ëˆï¥7NY;gk.Y[|Îð ØôÓò}VŸt:ï³�®êù¡Ê¤¢(d|5`t•\ÕU´oýu8�SkÕTu��üª½l[En©vÐpO½y?2UºèËé„À�ê~ €N:‚•tê+6� ÕМW¬ â•× m€fÚuéXÍŽ^ñ‹€èšÞE-Ï»)4é‰FÕIó+Yï.¾tf”HU×áõ¸3Ó"õÓ�\Z=µü(A,H§Ô|Ë¡pÕ¹Õ‰�œi.·éžH ¾¤‚AAƒ(vdMÙrH;Sµ�(퀒ì‘Íõl³±Ô^h¬i—Šá/·ù”{Íè–ðÑAƒº®zi¢Þy�—¥Ð—ÕåCUí¥Cê/}ŽêÑ&j!ڪ⣅ÚÀb´úù÷\qæÃ .§»ú³À qä�nÛ9¥�ŽÃGtô8’-ncSŸùÖßõm% ã-•¨ÚUÔõÆz—ÅvÐÕ$»˜ŒûŸÕÞzžÿ¢Í6}:ﲤ¡¼Ô;õË7é{ïΞ̓½bÛl±õçƒ?¨ºTZ}n“}¼e¾õg4´ÄuTŠêz*[ÁË ™Æ³™DÆ5šÚ Ñæ�~ã: éÜ�¾ê2B§/Z‡ô[�tH2E}Ófä{FÒ5^‚Í,ÇÆ-Å]oþš ÝrÚ+[PR/û© Ù]åæi¾öl´cö£º×ý›Ã*&üôŠo„ú—í3Bý€Ýþ&�Ú`�<Í.ªè¤1¥¡¬P¥BYäªs+e¹íÜGÎwÅ�µIr‰�&S;4ÙºKŶu:_Òýœ Õ#ÔW]O‚œÂJ] Ä„åY<Š–äH´«¼éH¦±o+³Ÿ=“cÛÃFÅ'µÒ¨¿ÝèªmÞé7N_üz€Ô¼ÃÛlÀ.û5@.ƒ D¢ˆ’¬/&Ox)±pH©x™ïBevl$!$eÉöÍDÙÖô½|l¶�×Ëõs'ß” ˆOœxý‰¡áÔ 7ð´›$¶€0�ß2­ó#óEØI´ŽêŠ=%|�"´zG€ëÔæ›–‘ð†ù’Ínr�~„|?ýîÄlSTjx–ÉÂ:Æm!%Úhýå+<6¶n€Æšv‰¶ÎïÏø¡>b® ÛttÞCe¿ž·5=3ã`³Ì–¹IÓÔ˾œ€*„ ¼PO2� ¨œ¨&å€B!ef¬D�Ñš‚ü$êx7^a¹¾.Õ\`ÛL¸þT¯éÔM·ð”Ûw¤Ž p<\ L½ß(:\¨Ž…Ò<Õ—ª–XéQï|(÷m $÷h|iÃ)ÃHOý*ÛcW—veY=åy)ŒÔ¦9Dñ6Xÿz° l·@�ºÔLL:3>=pT ·<Ë]ý$ëWç°¹›¨l¨¬tE»þûé+(I±æþ"'ÖMë{ ™CÅ!êùeeiëH¢YÑÆØöIÀÆšvéö·ý¤^Ñ}ë¼>0HǨ:±h®+^@„æ¼òë4×Éùº^¿mÅÍùÅÒÏë�óýâÉuÄ÷Ó—|"3€Ýwß}\ñ¶vhïï0ÛôòXT  ûóòÞ „’õ2¤kŠ}ÿöYK©YúÆ:÷à¶â¾¿ùžç�Z?½²ÞVjkyÐ`£í Óv˜pƒO›;:etLC¹uFú£f1 ÓÑ»†WÃ�¾oãcGÄKFL¾fE±ÛiGJkIÓ9û:°0;jý½¨µ(Û„m5e2¨Ó 9A¯Á”MðôÒšžêˆ÷ÿ—0®àž.·3@øGBèÀüAmñþ›¨÷W[‰Â0l”tª[`ô଺;UBS›0sЬI4"À:ɽÛðº�4ÜÀÓnÞú¢ƒ:àê�­B¦†ã,eR¢žm¼º-Y9_muJÑ[ª‰ª ´ó­¿ë§Ö¦þØ [?ÉÖj€hû]zM‡‹N'�ï¸%|4�:«:h½÷êÒµ!eY´óüë%Ô–¢4F'-:É6kO–E—\X%â}ÑuZ·èàO‡>tü<•¬Ãa½€m (¢=T–¤hgê¯!@´‚~50ü’ü4«l½f›¨�4Û¾Kºß>#RsÜJ[ɆÇ.ðú–î�‹¢‘óe§­º9ݹêânré¯ò:çüÐú«-ÔªÞ€e{¨�DËŒ™vÐ`ã.ÓL9ãè”K~:~êŒ:ú�zD\*í1jœ ®¿fOМ5€1èµÀq¹˜Ð/K@{¿de5d!‰Ël�ÍyÚ*ˆdˉæuÎyÕ1¯Î+¿œ=ÑŽ¶¸N¢Ò/ubÚS€†v)™�£ÿŒ!Øo Òù³›úÜ·Ž? Ò)B6 dtÜ:´�©.i¶8G©ÞôÁ¾þQ>ÔI5P;Lª¥§ØO\L“Al¤ˆR�Ÿðªƒ2  ©á ?‚™Ød³÷ÚÇA_pv98”Ro‹l²�ž@Åv]£V¼K_esÐ…�X×í×õ£®9@S|)^Å:¬þò_÷ú½-’=�*š"³Q¾mÞé7Nä}+ì¼fƺ�Ò��Õâ·ÞMÿ¤_@꽩C;@°Gù ›m6Æœš½^€›5]ÔHn&ù÷m[¹M6,¡7H_±{¡(akb Ô[õ'[<”Ô�ßí/UÉõ#`cëõ�\_‡å¤n„íÔj^Šºû\1ÔY·@�f]¹reñ¨G=ªX»vm±Ï>û{ï½w±×^{•tûöíŦM›Êå�(î¾ûîâºë®+î¼óΧYdà·‡þ½ÓYW¤óÇ€ Ö ­G2ˆ|nÿU_½@ÝY½×ld]<�Éèò®m¼´�ó�€EE¤ÀË@Ä©7i§>3—�È~Ìf�E’í”ïb+Sf'^ñ!'>åc}’õOQ7IÚ µî#ñˆâØc�-Ž9æ˜âÑ�~t±fÍš�j÷{î¹Ç‚k¯½¶¸ì²Ë|�Ø)C*ä}Ý;xœ!^Ýetx@Ć- €NMpÒ ØäºAPÂï>°�™ ›€Ç¢£-Zs—Êg€t3“ø‘ÛxÁ‰0øÜ^ÄèÞ©[®/p;�øÊß$³éþR%Ø´…øÃ:¡�·þ¸l:íòÀÑG]¼ð…/, ãHûï¿ñ´§=Í—×¼æ5ÅÅ_\\pÁÃ4& �àa\+Ë÷x‡¶\4iC\»“zy× WG/é×)ÏMö-’޶A]RÊB�ÈM×}"!ÆD!žÐ‰V“JMæ›É\…h¸,Ù�íd¨Û^}†�üJÑŒåRUïd߃w‡)ºæÉ.;wÜqÅé§Ÿ^¬]»¶o+?ôÐCÅÏþóâꫯvß{ï½Åý÷ß_ð�ƒýöÛ¯ì�}ìc‹N8Á·ë†V¯^]<ç9Ï)N9å”âÒK/-¾öµ¯Mß)‚wÎÎè¿è3ÔÎùAMAýYvÄäØÇp•¯Q6±/±ó¶á>i-e&AíÙ¹¾ •ï¶pS‹5¹èáÎs×É®Õ/d½ã¼­?17œRMÇê…¹$�’1‡æ‹ {ýÑýÑ�F§"ñ•¢×¿þõÅ“Ÿüä¾ñÜvÛmÅyç�W\yå•çûÃӆßýÝßõ¡Ÿþ¶mÛŠ³Ï>»øáØOeâòwüô¸b¥]ðÅ.®œYY¬6Êu�Uvò¿jn¥]0ÊuGSâ0˯ЩnXGlå ®Ë^ŒtM¡{2W×ï´ãª þÆÇ %)3Ù aµ®Û¯@Ãò»dõ7Ÿÿä�Ö™·M¶õ©Å+^ñŠbß}÷í*ÌŒ€Á‡Ó�/~ñ‹Å–-[ºt&/ Û–°>o[L©½óÛÊÿéÊñ—ÇWïðäå¶Ä‹â¦ó÷ð¬PšÂŒìˆúÙ Ä´:|K–ÇRê{|Q5ò»u& §k ‹ Ú+aW1+_¾Ø/ŠéùÔ_6›¤»ÌÀyùïÿþWbjÿñ�¼¸õÖ[{e�,»ä’Kü”áïxGñÈG>²g9bá.Ã'?ùÉbýúõ=u&%þðOé�.&Ø_^ê£Î%¡'Û╟ÔJ€¹>Ójû‹ÔI£\Àº}·G–sþý¦;žN먆oÅW·¯¸DS�%V¾ž¯8EÝ߀ú—ŽdâÒoƒ¦ÁôÓŸþôâ oxC_ðsïcûØ‚Á¯ºb�Ù×ú%f!ïz×»z^;èW¦ 9Ø0è° Ká*e ££(?h:²@":×Ê íj°¨ì ”Sè�áÑužSdFã4 ¢”Š™APxêQÒZ^ßÐP=“¾{@&¹h 1ñGõ�ÚJy¡Ý£>¦ïõq;µÂ m.û€[{¿÷{¿×·ù|ðA?çýãLLï9Âÿò—¿ìk–‹ˆgœqF±Ç{ôÕ™DFtL:ptÍð™€ãÑýC/:>))IDATQ×ÈAf|BçÝV”#—$ê¼—1vr[™^‡>…,!c¡¢G“ù9½ñžDG®ÓàY£§EÖÂCäM®þp³ëe=poÿ­o}kÁƒ=ýÒ9çœ3¶#Ý×>ûÙÏú�ƒzž¶¹.ñ¶·½­ïìDzMRÿP¾h1 @рÒɒ麌2^ζDñáà ¼•Ë[÷S·O,Ȫøb 1 ÒT\4ôVú•,”;=D]'[ÿtcdÙ<¹÷ÇüÇÅn»íÖ·ñ.¿üò‚sö&×>÷¹Ï ìÈ�yÌcüB“qôµ hÀ¡Ÿ?ïßs`^œŒP/dRQôŧ|Œñ%ÀïzèJQã`éèŸü‡,EïAD1Šúf¢ÎST1ÍÂJÆm&êñšŠ(zâ¡,$Qx�5Qx×Ïíe2ËGýqÛdZ¶·äö°‡õm;îñá _è›?Î ®|ÿûßhò´ÓN+8à€�:�dÒQͰ¿ÀyëÄ<@·T>cã[ó\%à­¼d˜JsêA ¤ƒÞ€a"·'¬BsÞõr]l{õÁ¶E§hidŒÊBs^&†Õ_z Òe9zè¡Å³ž5ø=ôßûÞ÷ŠûÁ¦í4ÍÓ€ƒ¦³«V­òÛ‡�¥&´EG4Ĭð�ztÔÎ)Ñt‘óN êD�wÝDUNÔkV+ïy&ƒæ¼Û”]Qédöi_ÊAs¾´W�ßt=A“Q•É)ºl—‰XHPòD{ØCuPyϳòò‰~ÓiY܇tÞOç`˜dºë®»Š+®¸b Ë'=éI$Xx™©³ü´ŽäýÙæ¶-0é—q–:iNéüêÄðn-QùÅ�ë& /Ûò‰¼’ eqýD]ÏñgúR  üˆI¾ ½–ýøÇ?~`ƒÄ 6 Ôi"ó /jöÔSOª3n:�? °¤�bF@Í_"p0Rhiêü‰Ž: r™óYÊG ¿È4ñ¡×½6HºÊ±‰Fœ„”ÙO&(å%m% ã1& ïö ;ÍÖ¿»†ã—,»�x.XZ¬Gq¹%È3ü¼¸_bðât`”G�ûÙ˜�œŽíGw{Ôgez€@gç�ǃ|ˆ0¸$¹�ÅÀÀ�ÄFr,†Näç I5¨°=_}p9È„Å|]�¿î¾ùa2?†úgm–Ç8’[Rã£\Ðë°V)_IÄC{-ùy{ÎKW–ÂKuôõ¸,ôàûé«®ò޼ô©aðШ«hYoË’?JÃ+ž°'ë•mIºý)'h^çà‰­Ù´¬€Qf<¼Øi”Ah”ºŒ§ Öèˆ! ÛÖ‘mÐâV¡ÿ‰f�_€4 Î»Ë4,ü‰ºNÈܕ܉Z(‚DQ/ãö�ƒ&»¢ø"‰ú†×.Îu¢þ¡§¶ˆü¸Põ‡Ÿtý#æf×Ëf`ÊÜïey.•`ГŒy}ÊÓñéî$Àå°I€ò_%`Å“äW‚­ ³œ†ÍzàÉsá¥�?·�ߌW~è €î+Ñœw=““´ÎÆb¬×Ëë~(ËIÔyÓ�¶°\•Ke¢d¬=v“+^Õ,«°™Ûùú{0 ¯&u À.%û%äÆªÃƒ3[·nú:oŠÅN³³4Çà4Ê,a°…ùäF檟¿˱d€üð&Œ\Ô6` ¸7ðƒ~àÈyô]–‰•�Üy÷g|ÒuŠAÙJù(ǯɬø~o"v7¡òðØ#Å {5}�Çò –&Z{>Ë�6¼šÔ  ÜMÖg” |ƒ~Üdl¹íQ¾90J]r›;Ϩ3ÉžQÚ´½nr€H£lÀF»XiðPç H¢UIÍ™ŽÞÐà+>ˆ¨²_ñȪXˆÍãËhø1=s}³õÂ�%¹ õÈsÉ~æ³SYÅÃuæߢ‡éy‹Ñc–-h¯E¾=ˆ+êM‚f¶Kc¬ÿ¤03‘Àšl›7\ëQžò{øÃÞpƒÍ3ámEƒÒ(õT~~ytfJÄÃÀêØ.2Yd¡’’Z‰˜¦uÞtDeG4•{}ô£#‘®äOÔ‹ä1À×ù†²àS4ük8c+•5[®“hΗ~Ÿ)¹?ãå�<—¡“숪”¨läTuu:3ÌL⊘µÉÜvU.¯ð¸y¾Ç7,xà�ÃTÍÇÿ°¶˜ìPï¹ÕÇ8 Æ< ÖqæJ^tð2~::)Q:?y׿Œª™.SrÀ#¯VÅýšÿ.}â0ŠÇ¥ØœwkòŠD<4üSVñ»Ìsb¥ºM¢þv €ƒf^ý,’ñ±“ˆv"_ÀøÕ¯~Uðõ�ASì~ïê_“¶tÐA V°\>22±dži ¿4AQ�ûs€–O‡w𛞃 × ŸÈ#K¡÷vè®,?×…7e'¢uû¡’t|#Ô5‚¸¾­¤Ñk€pp'?¡¯Y�¡Íä’ɼǛÜ(v(ÉuõmÙM´Kßä’¡OR[¥ 'Ô߆R¾ÔxšÈ)€ÝöÚÜxMÌ·¯ºêª�®x÷(O 4²€Ì#Ž8b`i~-xûí·Ôg&�˜�~Ø''¦Îѹé®1�v0±ÅQÚ¨ç'™/Ò…ÚŸlHߊ%paKTvE)C…'O4ôâh lcQô.¨/I¦xòs¾Ì¯ÕyŸx¨/c¬¿í‘‰`¦éÀ{�5þÄ¿ûÖ·¾Å¾˜Ž:ê¨�ùMfò�‚Aé»ßýî ìFòô��uï JÁ#‹÷*ïàdü‰ï:‰Â2Qœ©ˆZ1O¢±Õ¹®û#W2øºý\_OÄKJ‘WÕÙyÆdÔ)&êå2™ë` Ýô'ÛPR=>Š÷«¿½Ž ÌÄ쥛Y59ÄÞ¦s^™fjP³ÊÏm¯¿þúš´ss”—†t–Ï?òt Â]ŒŸýìgãq6¢Ž\¤èØ1EM’�Û B¹#K‰u]/TvD)ÜÕá ÞáK€T€`,”J#A�òäÊfÎ#“]Q,“D]?Õ•§¨+—¾{ǃ÷HÍ×G1›4å8ùir(£´S€‰¾�ƒ|JOxÂü×vƒtšÈ;ñÄýK»ýlå+_™Ø«ÀC…¬k'0W]?úœME¥jTà - ~ÔËŽ†* ðÌ£¬dÒD¥[–7. ÷%_æ{„á§—Ý¢ vf'©‰†¾pï”±%ÛPóê…ƒ�]鸆›5>WN«íÅŽ‰`¦‰ Þzs“¸ð£ý(oÏžO„/Æ,€wÿ÷K×\sMñƒü _vƒòè°êÌ8 ÄÑ::}ìÒèÛL‰éè¡)ªR­,…,¬v棓§\'ç“N:‚Ûhef"шCqÉfnž E£Þ!“~.Ëu)“ü%ªz‹Võ’OlŠ�òáE²Øê\+o®Ø>ë@½ :‹-`«‰@á(Ø9{¨er/àOÞÏ>ûìâŽ;îP,]ôw~çw:Fë.…1 xÙg¿–pçâóŸÿü˜=ŽhÎú¹w‚4 TÀÀ:¼ÿI·àþ<¾ßNGChÎceg~HòǬª©¼¨ë¥QAþÙ Š�ŒRp'àe‹J»æDë¿ev˜)1äa5°jr \¯€ ÿ6? úÌg>ã?êÕn€‘ÏtO"ñðÏk_ûÚž®øaпþë¿|7`Q’í!Ÿä;Xªîï�Þ7oJ�:4LõmkQ$ ¢9Ÿ—PI4óA"çÉ#UÖáøÍ‡Ð6ýÆ)|ׂMän›RÌz‚Â{“$Ú« ÐE^•¯"Dþƒæ|^"xwÚQÿÍÅ6a&B •±¯›Ô.sv„»sì‘�`�×oñ…^ް½Ò«_ýê¾Gå^ú;+{ùË_Þ÷³_|žì²Ë.ÛYÓc(—þI]Ÿƒ`2b}3úGU€Qm¡ÞùÍÁ‚…Þ P鈌 ^!QnÓB€ö²AzÀ¸ �DC?b¬WvIw–ë/?�×ÕêÕ[m@µC”¯ ÊeðQoQXêWÿMÛ·€™<`×÷ª© zNª€�5š�;þ¡ö8·þøÇ?Þó-<\•碃ÞÓ?ÔÁ…ÓO?½èõ±:ι瞻HçýyКÚÓ“œ8O¯�#­ß*4ÿƒÚbU()@Ôƒj¶ÈFØÅ…ƒ:ïfM–eI¥ J`/ýy6Rea¸õ¡Ã|‰â7e5Åz}Ðqº#è›Ú¡ŒÙdâ±ï¶à Ñaõ¿uóÝÌ@sie¦©2 ƒ öWsl÷¿ßfü¢¥{ï½×ï rÈ!KžöÜsÏâä“Oö_àÝrË- þ%Þá‡^¼ýío/žò”§änœçqe£_ÿú×]y‹!8é7+m°â«?å¸|çYÏ•Ì_êÛäЩ¦ñÞÁƒF†­Mæœepà¼a”s�RSÒ�l×¥~âÙ-)°å†Â>|näKj¢)ž0‘ê“ÊÊ^iÛ}È~Цëÿ©;¾ùÁ_¦¸K3ìˆW¾ò•¾=ìB×.½ôRÿ*0áv Ÿ§ôžùÌgú‡Eè|’Ë•~®+ðqÒúÏŽ™}œsÎ9Å—¾ô¥b”×’ñ�ÃÓN;ÍÀ…¦ÒIwl;k¦¬=Wά ðÛÑÆ~ÄаҵحY˜ ÊE”g(`¬œë$š—-=ÊvIƒŸä«¤ª 0£d¥�Òz§ ì¹n¢™ZÉbc€½¼ó©¿=tï®ýç�˜u~CÓèÐô��h_ì9ýíG:Ã?Ügæ“hØç>÷¹þ|ÿ°ßÈîÅ_\üøÇ?v°ÿÖoýVÁï”xïK^ò?B�jOeßò–·t½’ŒçúñÇ׈û]ŒTùœò�Ãg?ûÙÅ׿þõy•ËmŒÄ3•·¡ZÓaÊè Gß´Æ'°yÿ·”Äy¸T\��Es€0¥Su:;<;^;ÕXç¡$òHPé‰zYÛÕ8!êk«®shì(€/Ôý¦Á‚A¾ãh� [\?QçS9l�rü¤êÅC·‚•‰Ì&q à#Ù%—\r™Ý Øj;p �ÛD@Üv{á _Xp5ß¿à—{�_. *-dà)C.Ž’¸øÈé ñ¿³ƒ×(¾zéбyÿ,ïX™z<$:<]žá þ¸?§Iwˆ~¶¥£üäÂ7%€vpšD|òýä›HÄ‘Ç2Ïò•ìˆ&a© ØÂšê%Ùîç¯^¾4œ˜hÃÊâŽúô¨¿=pµõ}7}‰'Ãò€BL–ÇGšˆ’À½"<ðÀf;7¾¢ÉëjÞý¿víZmî]Èð¨G=ª`Y*‰€:&Tõ‡€Ðà?;©çy¡�õ¯©ì¢‘Ô�²í€O”mRXCT®�¨ë@JÝöͧ mŒ‰TS�X¥N>¶J¶ÙtýœÝ|Åu[oçe ùñ7°Ö,oܦiê|ñÊØu€�ÛQSö24SvË£[BIì4ÖJq=À·$N{ÖË•Qôkê.dÀÊ¡ P,Ê@Ø]>—¹Bmå¶LVš3g.é-[¢ŠS´fª÷&vH#Ú«©{,ÈÊøŒñøJAQ¬ß±ŒäàOÞÊæ$‚±¥¦HðTf‹Ý;_ÓNç{`ÒS÷qµG·èa¬­Cz§ôn™\„õÿî}W�Ç‹Q°“µˆm�959h·j4Ûa·Æ~a×Ü6æ:4bnW™xãÙžRg¦»é¨Xïyoß]ß2Íyé +МW~�æ6Œ÷xÍc«ë»]³çz’õ(”ûÈùª!’-hΫ@^gã·În¿íÏnøô/,›@¸ÉK«äØh“A*x�hÛí9øá/í[õvÞÐ.3°Žç¥§øÑ3óµïÌÔ‰9¯Ö¹µh/@䲜ßÙ½’Û€—oÅ“Ç_×g;_t\‡Š²�Dc«c�’üQV1¸ËEO<4çÉë•~³í°Ác¿Â‹ðÓK},²&¯‘ŒJm·{îg�%ò†�ìJ3{!°õûèùþ• ®Ô�ëT�_€`—À+‰ï—/7:L8H¬¼ü`ÇeÉ`ÝyÈFÕÇŒl¸IÅ ÍyϬ|Ë~�Ê7TvE1!¾_~‡O³ñ?ïù!ØÐ ÜäÑ¥ÈÆG&q€ P¯ØOúÓkûØÇþÄn}�åmÜBâE ãN<Í7ŸÄç¼¶lÿçšüõ£sÚ�H8VÖëùOâ2v`ýh‘�¢Ø’ŒmñÐ^©®_×Q9Ñ…êSž$Z�¯n_z¢QºZ+_ϯJ—û»oǦŸü_¿:çZËñ¥QšœˆSÔÆ5�š™ PUlû† >Øa‡�møÐ‡>„ŸEMŸúÔ§ÕÿÎ:W'è,ŽU¿¿ÛvßË�œß*”¯¼ç2ñuZ×—o(©žÒj=L¿ž/»¢•¥ŠËóÄ‹VZ½¹^ñ"ë—êúø‘ì§›nà�puòÀký¼ÌO^ÔçWz4m šlûæ7¿ùu;ÂÞ0ZñV«é ªãz‡Œa � �D®ãzY¦3s¿¢Q.¿¯/KМWý(K ÝTy®”ô$£LS«ôë4×Éùºž¶søÜgļsõpvë ¿wÕG¾n~ò_þi ÷�ЦÀ¯E3*¹õÎ;ïüD#5j�λVØáÝ�ê�ºz2Ï ±÷,Aèä¤èìÆ¸~PW`åú¬ì^Bâ¡Î'�¦‘Åt,%›°¡Ôy• s¨`¶JâS¾Çg|Ÿi*æªPÅipŠ�‹àÐZú‘�ÌVi?ùr]׳•¨1QŸ ƒêÿãû¯ûÄV{{¥¹ÐV°¤ÅØfRÓ€¢f4Ó €)ζ /¼ð«öˆ.çÔãÌ(åeKúÄä<´ÇâöL^Ú[@ý/¸ç²÷ÿhãu¼¦ºþw-ciR3ê¢v£‚œçøi€Ñ-özìoØ‹2¿m|›&Ütt>ú1�:¨Õû}‡ÙE@í8táñʯӺ>ógdPôEs[²Ÿ*ù`#?]ö³A(/+{uª‹ŸP‚uÞã«:nÝ_³bÊi]_õ_¿mã·ïšú†™Ï�þ:÷— ¼7ž&9¨24  ¶Ø]�¿nŸ PM––ùX×s�ðƒ€ÄC5P†æ¼—±�Ë£'@G'Éœ±•ƒ+ÑœW~Œ¶UL|o” /aä� ÎgƒŒÇLfŠËYV–ä.¯sΗùÔË Ø:ã•?Jý7íØrîùØ_›ï÷Fuõ_&–&=hß0h` ´Ù^£µá'?ùÉ»ìzÀÝ«}ë(€bí Àö”èçö‡Ì{~:Jrteq­Ds¾_>fГ¹.ÀX¦Ç�’->H$ÚsÀ0µ< ÛPç-6Ñžñš®Ê€ÄË(�’0õ†‡¦z‹º�L&¹(ùÛçvÜý_~ýùw]|ÿÕl“—~Ô§ÿ¨¹)£I“T)*Ù5Øg¼n²WqŸi;›ÆiÓZÀû³õjõ:ŸŽsÞæê–¡\‚MÍy Ìä s^ù€Ãù¨’Os›Á§ÈJ„ãØsˆdh’&4xÕ´’(Ç�©QÆPs¸ù“ëÏ?óÓ·û&³Ýüîv’«¦> 2ß:hÌÜvÛmwÙ«¹½ß~ûý–‰ý4_k­þÈ-ðtû0—ÿìS é#  ;'ˆ‹‚Fáù3 !#9 ¡y°+(Ê.hÎ x]:>¨ØàQ0V.d�z#oÑÛ<£êy¢ˆR]Ýßüê?ûÕ{/}Ï×ý·‹ÌÌC¶0èü_S<�XsÓSš– ¯ÎŒýºïWöZìöÚk¯gZF¶ rµ–G (ü> Øn8R7uÌuld”½æ€I4O·åye£�Ì–ÜGî› „'ô£ë³¢\Ì@êTyî3/ÛÇ^i;åç1ä±É^ªÿ¬=êû�—]õþs-:€ÏøuîÏL‹òjìäÒb49IE>sÝu×]e3�÷Ýwßg[CNâW‹Ì®¶zúù‹.5ðO€9à9êÇ‘¥Q�õnÉgðÖóKÖ/•ò´×µ�QŒõÙ'ËeÒ¡‡È¦çYçq}ôBIÔ·è+ßõÑ#É6Ô?AHÞãMõFÖ¯þöõæ¯Þó³÷øÿ‡YüZ8÷çGy7vòi1€¡µe&`o¾äÀ|Ž5ôü¾Ô1Ôz«@ œ|ûÁŪnMóð6#°«:pÔš ðt°ØxX†s9À½¬ËÈIå á£uý\æÞÊR‘ƒ¾ë¹x¡ŠCÔ Ô�ºl÷«¿=è³áSwœÿ®w\÷ß¾gå8êkê_?^m˜Ö l»&p§=#p¡½?àéöýê#~õ½ÑnïT ß-~hÙ–LÉÛ D°7 ó�xÄ:›¬�†@—K \ä]÷œóxþ˜ø5¨ÉâTÀ.ÚL=l â@‰wÆùàÈJÙ%%'Ô#A�¿R?x¤žÉò5˜ôŠÍz®�ƒ„jóúƒëÇÖ{/|õÕþ³¯Ýs)/¿Õ”_àŸŠóþ¼¦q àCËÅ^&ºõÊ+¯¼À¾ sƒ]x²u¶½òŠ´üε@œßWçûŽ! ?À‹�€]â@O†¯’ø Ý€©@ ¦¤Ê˜eÛÛ˜ƒzNâ;\DVϵbé_g±�Óï]ÿÍsÛîüÊ=—ü×çýâ½gݶuÃFóÔkÚÏyÿTùÕÓ8[ ü:o/½ÉN ¾bŸßÚÛ¾Æû8Û‰UR­Z:r <ýŽC‚~Ô÷k6-´S 3iÀiÀ|Z{šóý‚Ó®„æ|¥¯ 9_i æò2ðt3QJЇ²�Dc«¾6 s×o¾ãK¯¾úß}Öo¾y¹åçS~ÝêÓ¿©?u™Ö oç®Á€ÙÀÕW_ý;øñþûïœ}ðáy�–½¸ àWþ tñèÖçuJÓÿêô ·¬!šó¹Î`^à‚²Ô9¸t=74r¾®7®m{¬÷ºOÜþÍ¿|íÕþï·o½÷~³›Oùó[}‹z¯P}µé,Fžz”AŠeuZø¸ènZlØýÔSO}�]$|³}p�ÉÛ4�ø³ËŽ+VùtE±fÜŒÝX‹m­\a�r§€ÐÓCÀC½BáÅë±ÞºÙÖ`‚Éêºl+¯Ÿþ°üºÍz¼õñHñ<°có�ÿû¾+?ýÆ_~ì›Û=`×Â…>ÎõY¾nõé@f¢éIÓ:ÐBù @ïcày€ú@À€°†�à”SNyÞÁüêÝwßýD“µi„`àœðƒæ2ò|1=�ÀM³‡tІM`ïðz8óh|ú~¡öëåëÛ¶mºô¢�Wý÷7]sÖÛŠmšÞxñ~¯)?-5uišKñAXꃃÓ'<á �¶ôò}öÙç4;=8ÔämêÓ>HG|?úûßf6,¬öófšôÔ“kø·½e]É3õ¡ûk–T}[d“pª_÷�Í<Õí×õ‰å¡Ùm·ß¼ùÎ ?wçÿþŸ¹ík×›�ë(�àëBŸÎ÷MäUƒN]¢ŽK!§Íê3Í rºòÄO<îˆ#Ž8Í+>Ñf ÇÚN'¿M©μì 6ªÆ­¿Õv Àõ�Àç§\H(.Ú+±ÃjÏØ¡äÕf ]ú®U­dKÞ†éW%7Ì¿åï˜�ݶqÇCWß²må߸ûgþí¯Ï¹ÂJ3�×ѽÕ=Ÿ0ª±Ó™bOLglõ¨+T³�|FPŸh[t¥}îk·'>ñ‰ÇÙ#ÆO°oÿ­µ»�²Aá‘6(ìWw¶«lŸ9à€#? _íÙ0a¼¡6ŽÚ4�x 5€ÕÛp(à‡”æ¯Ë¾Ù“,b�6 ѳÛï{`Ç–›ïݱéWë·ÜwÓO6ÝxùGo9ïŠÛ¶ßÔ0ëˆ.*ðk[ÐkèE-kz“@5½vGFÌŠ»>hVP‚Þtsž|–¼ÜŠ#�<òavñP;e8Àf ÚgË`±Ó‡}íéÃ}ìââ^6HìÎbÛ»åTc•QfØ#»ˆN^Zé�×íGù;3;û·jè¼9ÀgÛß.�Z5;áTAK�Еo3¢•Д¬ñ™ýÐÉÖIÝ´ìê ½ÂÈ^b8;3»cnnfÛÜÜìv{žië¶Ù[ì G›í·÷›·îضÉèýíØºñ�mݽaëwß½õ¾»nÞ´þîl¸úö‹Ö_q¯YpE¾¼>h[e $*òd’öÕ’ 8 ”ØóE À¾ŸSô¤£2¢¹½œÇ­¶áIl·izZ ^DñušƒW<À†×�SåI¿nszZcÄH–C'Î� �Ù ExQÉsªr²W§4)2¥œGVß–^K›iÀ—§|[| ÚÀðr�æA=Oåð-{ðK2-§N«º@ó�³-°÷â¥/]mCIÚïÂ$ßÒÅk€¨$>§xQ l‹Ð%Ëå*'Š/ø%ŸÔÁ—|E² äupEQërå‹¢'J­óž™V¹N.oùñ¶@?ðårñP-D!¾ø¤z~H— ðU™]¡ÃªŽ¢Ô^‹¶Eëz’CIy~HÚõ4µÀU/Š\À/šË%Ë)ü²K»bg®×9ßîdzãó¼e×–a…rÐS½|»_×[†ÍÒY¥¶Sϯ=Úöêl¯iÝÊÞ+Æaù½Ê´²¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ m�¶Úh[ ¡øÿF'UÒò¿?-IEND®B`‚infoKbplist00Ô X$versionY$archiverT$topX$objects† _NSKeyedArchiverÑ Troot€§ U$nullÓ WNS.keysZNS.objectsV$class¢€€¢€€€Tname_assetcatalog-reference_icon_128x128@2xÓ   €Ò !"Z$classnameX$classes\NSDictionary¢!#XNSObject$)27ILQS[ahp{‚…‡‰ŒŽ�’—°ÂÉÊËÍÒÝæóö$ÿqalculate-qt-5.11.0/data/qalculate.ico000066400000000000000000010760761520501070600175700ustar00rootroot00000000000000 (–h¾ h& èŽ ¨v  ¨00¨Æ'00 ¨%n6 ( \(  #!=W')'EgVYW•/Ó¢1æz}{²[ë¹pà’•’®²¯éçëÿôôôõõóÿ™™™ªªªöœœ–ˆˆˆƒFΞ–xˆˆ£öÜm–ˆˆˆƒ&Ín–xˆˆƒùmìfˆª¨ƒ&fffzîê£öfFfxˆˆƒÌÌdzîêƒöiæfxº¨sfæFw‡‡ƒölÝ–xˆˆsfffxˆ‡sö™ÉÌ»»»¿"""333?ê«€€€€€€€@( / B !!!:Q;R;T>U###;U:V;V;WBZ%%%B[>\E_((()))CaEeMMMNNNOOOQQQSSSTTT“)Γ*ÎUUU”+Í“+ÏVVV”+Д,Ò”-Ó”-Ô”.Õ‡8¼”/Ö”/× -ß\\\ .ß .à¡/Þ•2Ø /à^^^¡0ä___£3ß¡2çaaa¡3è¡3é¡4è¡4é¤8ßddd¢6êeee’Gº¥9â¢7êfff¥:ã¦:ã <â¦;å¦<ã¦<æ¦=ã¦<ç¦<è¤AÙ¥=è¦=é§>èpppsssttt§Nåuuu¤Qßvvvwww¬Qê¯Tî|||€€€���¶^é¶_é„„„¶`ë………¸c采‡¹eì‹‹‹»oâ���‘‘‘Àvæ»yß•••–––˜˜˜Ã{ê���©©©ªªª®®®²²²¹¹¹¿¿¿ÂÂÂÓÓÓßßßäääëëëïïïøïý!SUZZZZX\\\[V*9`oYoT62@@@@DH Al|`}W4,;;;;=PEup4y_4+::::."11117O.eikkkknrrrmjB ê«€€€€€€€@(  n&&&¨(((·(((¾)))Â)))Â)))ÂB`ÁEe¿Ee¿Ca»Ca³>\¤+èÿ¹eìÿ¹eìÿ¹eìÿ§>èÿ¦<çÿ;U°%%%³fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ”-Óÿ¶`ëÿøïýÿøïýÿøïýÿ¶`ëÿ¦<æÿ;U°°VVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿ”,Òÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¦;åÿ;U°°VVVÿ˜˜˜ÿ„„„ÿ���ÿ‡‡‡ÿMMMÿMMMÿ”+Ðÿ¶^éÿøïýÿøïýÿøïýÿ¶_éÿ¦:ãÿ;T°°VVVÿ\\\ÿÿïïïÿdddÿNNNÿMMMÿ“+Ïÿ¦<ãÿ¸céÿ¸céÿ¸céÿ¦=ãÿ¥:ãÿ;T°°VVVÿNNNÿfffÿëëëÿNNNÿMMMÿMMMÿ“*Îÿ .àÿ .àÿ .àÿ .àÿ /àÿ¥9âÿ;T°¬TTTÿNNNÿ©©©ÿ²²²ÿ¹¹¹ÿ|||ÿMMMÿ“)Îÿ -ßÿ -ßÿ -ßÿ -ßÿ .ßÿ¤8ßÿ;R¬Ÿ\\\ÿSSSÿOOOÿQQQÿOOOÿOOOÿNNNÿ”+Íÿ¡/Þÿ¡/Þÿ¡/Þÿ¡/Þÿ£3ßÿ¤AÙÿ:Q�d\\\û………ÿ‹‹‹ÿ���ÿ���ÿ���ÿ���ÿ»yßÿÃ{êÿÃ{êÿÃ{êÿÀvæÿ»oâÿ’Gºû) 8d a ž!!!« ­ ­ ­ ­>U°B[­B[­B[­E_«BZž/ Ba ( @ #!@ZY!KNLNQO‰)Å^a_¢1è­Që|}Á~èš�›Ü°öÄÇÅññôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ""""ÿÿói™™™™™¨ˆˆˆˆˆ!ÿÿ6ffffffWxxxw‡…ðfffffff‡‡‡‡‡wuÿÿffDdfffWwwwwxxðfnîkî¶fW‡‡xxwwÿð–k�k¹–fWwwwwwxðffæf½ffWwwwwwwÿðfmÔfn–fWwwww‡xðfmÆfn–FWwwwwwwÿð–mÖfn–fWwwwwwxðfféfÜdfWwwwwwwÿðff›»´ffWŽîîî§wñfafffffWŒÌÌ̇wÿðfffffddWwwwwwxðC33433Ww‡wwwwÿÿcC33333Wzªªª‡wðCDC3333WŽîîî§xÿðCN´>Ó33Ww‡ˆ‡WwðdDKžF33UwwwWwxÿðDD6Í333WwWWwwwðF3ë333UwwwwWXÿðD33ëD33WuuwWwwðDD9æ™33WWwwwuxÿÿC3k´�33UwuuwwwðC333333WwWwuuuÿÿFC33333UuwWWwˆÿ9d4D333Wxx‡wX‚ÿÿ™»»»»»ªªªªªª/ÿÿÿððððððññññññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôWàÀ€À€€€€€€€€€€€À€€€€€€€À€ÀÀÀúªª¯ÿÿÿÿ( @) A0C 9J !C[?]D\$'%@^E]>Y%(&A_&(';[')'B`Ca?cGiEHFFIGGIH… ÁILJs,¦†"‡%¹ˆ&ºr0¡KNL‡$Ä'¼x1¡LOMˆ%ĉ(»MPN…)½‰'ÆNQO…(ÈORP~7�Š)ÇPSQ†*É‹*ÈQTR‡+ÊRUSSUSˆ,ËTVTUWU‰.Íž&âVYWŸ(ã¡,Ú )äX[Y�-Ý¢.Û¡+åZ][£/Üž/Þ›2Ö¢-æŸ0ß\_]ž.é¤1Þ£.è]`^ 2àŸ/ê¥2ߤ0é�8Õ 1ë_b``ca¡3ì£6ä¢4îbeb¤8åcfcdfd™BÊ£6ï 9ç¥9æ§<Ýege¤7ð¦:çfhf¨=ßfig¥9ñ§<ègjh¦:ò¡:ô¨=ê¤>ì©>ëilj¥?íjmk¨=õknl¦Aïlom˜LתFènqo­Ià«Gépsqqtrrus®Kísvttwu«Mñuxvwzxx{yž[ÖªUç{~|«aÑ­Yë}€~€ƒ�±]ð�„‚·^î³`ò´aóµbô½g懊ˆŠ�‹‹ŽŒŒ��Ž‘�»uß�’�‘”’½uðÀyä”—••˜–º‚ØÅ{î—š˜Ä�ä™�ššž›œŸœÈ…èăðˇ렣¡¡¤¢£¦¤¨«©©¬ª¬¯­³¶´´·µ¶¹··º¸¸»¹¹¼ºº½»¾Â¿Ü°öÁÄÁÃÆÄÅÈÆÆÉÇÈËÉËÏÌ×ÛØßãàâæãæéççêèòéüëïìïòð÷úøúýûûÿüüÿýÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ ÏÏÏÏÏÏÏÏii‡Œ‡˜‰˜Œ�ŒŒŠ•”––––”‘Ž‹{#ÏÏÏÏii``<`<`<`<``7bplllppypyw†ÏÏR@RjÏÏÏÏ99iª¯‡¸9,DII>I>EHOHIOR ÏÏ9999999,EIHIEIHDIIIHJÏÏÏÏ<<9999*DHIORHIDODDjaÏÏÏ�`<;999999*OOOOOTOOeT~—'ÏÏÏχ˜›Ÿ£ª£ª£ª£ª¤«««««««§¡��1ÏÏÏÏÏÏÏÏÏÏÏÏÏÏ Ï Ï Ï Ï ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÿÿÿÿôWàÀ€À€€€€€€€€€€€À€€€€€€€À€ÀÀÀúªª¯ÿÿÿÿ( @ ;s###š'''¥&&&¯'''·)))Á)))Â)))Â)))Â)))Â)))Â)))Â=\ÄEg¿Eh¿Eh¿Eh¿Eh¿Dg¾Ab´@_¬A_¡=Z—)=p9 zIIIähhhÿsssÿvvvÿzzzÿ}}}ÿÿÿÿÿÿÿÿ ZÖÿ´aôÿµaõÿµaõÿµaõÿµaõÿµaõÿ³_óÿ°]ðÿ«Yêÿ¨Vçÿ™LÖÿp1¡â) ?v ;GGGënnnÿfffÿbbbÿaaaÿaaaÿaaaÿ___ÿ___ÿ___ÿ___ÿ___ÿ___ÿ___ÿ‰1Ëÿ¢:ðÿ£:òÿ£:òÿ£:òÿ£;òÿ£;òÿ£;òÿ£;òÿ£;òÿ¤=òÿ§BóÿªLòÿq-¤è 9„YYYÿaaaÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿˆ/Êÿ¡8ïÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¤<ñÿ’8Õÿ4L'''©aaaÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿˆ.Éÿ¡7îÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ£9ðÿž=åÿ@]¤(((¹eeeÿ___ÿjjjÿêêêÿêêêÿâââÿ^^^ÿœœœÿêêêÿêêêÿ¯¯¯ÿ^^^ÿ^^^ÿ^^^ÿˆ.Éÿ¡7íÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢8ïÿ¤?ëÿBa³'''¼fffÿ___ÿiiiÿ———ÿƒƒƒÿÁÁÁÿ^^^ÿ‘‘‘ÿ£££ÿyyyÿ’’’ÿ^^^ÿ^^^ÿ^^^ÿˆ-Èÿ¡6ìÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢7îÿ¦@îÿCb¸(((¾fffÿ___ÿ^^^ÿuuuÿâââÿlllÿ^^^ÿ^^^ÿ¥¥¥ÿ¸¸¸ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿˆ-Çÿ¡6ëÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢7íÿ§@îÿCaº(((¾fffÿ___ÿ^^^ÿÃÃÃÿ¼¼¼ÿ^^^ÿ^^^ÿ^^^ÿdddÿýýýÿtttÿ^^^ÿ^^^ÿ^^^ÿˆ,Çÿ¡5ëÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢6íÿ§?îÿCaº(((¾fffÿ___ÿ^^^ÿÚÚÚÿ¯¯¯ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿùùùÿŒŒŒÿ^^^ÿ^^^ÿ^^^ÿ‡,Æÿ 5êÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡6ìÿ¦?íÿCaº(((¾fffÿ___ÿ^^^ÿ½½½ÿÇÇÇÿ^^^ÿ^^^ÿ^^^ÿqqqÿþþþÿrrrÿ^^^ÿ^^^ÿ^^^ÿ‡,Åÿ 4éÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡5ëÿ¦>ìÿCaº(((¾fffÿ___ÿ^^^ÿmmmÿéééÿ‚‚‚ÿ^^^ÿaaaÿÈÈÈÿ¶¶¶ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡,Äÿ 4èÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡5êÿ¦>ëÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿgggÿ¥¥¥ÿ¢¢¢ÿªªªÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡+Äÿ 3çÿªFëÿõéýÿõéýÿõéýÿõéýÿõéýÿõéýÿõéýÿ¿uðÿ¡3éÿ¡4éÿ¦=êÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡+Ãÿ 3æÿ§AêÿÛ°öÿÛ°öÿÛ°öÿÛ°öÿÛ°öÿÛ°öÿÛ°öÿ¶`íÿ¡3èÿ¡4èÿ¦=éÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡*Âÿ 2åÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡3çÿ¦<èÿC`º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‡*Âÿ 2åÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡3çÿ¦<èÿC`º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‡)Áÿ 1äÿ¥9çÿÆ‚ðÿÆ‚ðÿÆ‚ðÿÆ‚ðÿÆ‚ðÿÆ‚ðÿÆ‚ðÿ®Nêÿ¡1æÿ¡2æÿ¦<çÿC_º ºVVVÿNNNÿMMMÿOOOÿMMMÿMMMÿMMMÿOOOÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‡)Àÿ 1ãÿ«HèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃ|îÿ¡1åÿ¡2åÿ¦<æÿC_º ºVVVÿNNNÿMMMÿèèèÿµµµÿPPPÿOOOÿåååÿºººÿOOOÿMMMÿMMMÿMMMÿMMMÿ‡(¿ÿ 0âÿ¢2äÿ«Gçÿ«Gçÿ«Gçÿ«Gçÿ«Gçÿ«Gçÿ«Gçÿ¥8åÿ¡0äÿ¡1äÿ¦;åÿC]º ºVVVÿNNNÿMMMÿQQQÿWWWÿ‘‘‘ÿsssÿîîîÿTTTÿqqqÿMMMÿMMMÿMMMÿMMMÿ‡(¿ÿ 0áÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡1ãÿ¦;äÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿoooÿËËËÿÅÅÅÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‡'¾ÿ /àÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡0âÿ¦:ãÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿÎÎÎÿžžžÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†'½ÿŸ/ßÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ 0áÿ¥:ãÿB]º ºVVVÿNNNÿMMMÿMMMÿMMMÿNNNÿñññÿ¬¬¬ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†'½ÿŸ.ßÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ /áÿ¥9ãÿB]º ¸VVVÿNNNÿMMMÿMMMÿMMMÿqqqÿùùùÿjjjÿ���ÿƒƒƒÿMMMÿMMMÿMMMÿMMMÿ†'¼ÿŸ.Þÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ /àÿ¤9áÿA[¸!!!´TTTÿNNNÿMMMÿMMMÿjjjÿ���ÿ£££ÿMMMÿvvvÿ¹¹¹ÿPPPÿMMMÿMMMÿMMMÿ†&»ÿŸ-Ýÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ .ßÿ¢6ÝÿBZ²¤RRRÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†&ºÿŸ-Üÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ¡/Þÿœ4Õÿ?Y¡|\\\ÿZZZÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†%¹ÿŸ,Ûÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ§<àÿ›BÊÿ8Kw-HHHéÿeeeÿYYYÿUUUÿUUUÿUUUÿSSSÿPPPÿPPPÿPPPÿPPPÿPPPÿPPPÿˆ)ºÿ¡0Ûÿ¢0Ýÿ¢0Ýÿ¢0Ýÿ£3Ýÿ¤5Þÿ¤5Þÿ¤5Þÿ¤5Þÿ¦:Þÿ­Iáÿºhåÿz4žè *kLLLãwwwÿ‰‰‰ÿŽŽŽÿ”””ÿ˜˜˜ÿšššÿšššÿšššÿšššÿšššÿšššÿšššÿ»ƒ×ÿɇêÿɇëÿɇëÿɇëÿɇëÿɇëÿÇ„éÿÄ€æÿ¿zâÿ»ußÿªbÏÿ|8�ã. ?i'd�!!!™!!!£!!!¬ ­ ­ ­ ­ ­ ­ ­BZ­BZ­BZ­BZ­BZ­BZ­BZ­D\¬C[£C\™=U�1 Cc&àÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿÿ(0`  $/ A  7N #!=Z!$"<VC[D\$'%HdE]%(&A_&('?Z')'B`@[CaFhIaGiEcA?f'�FIGGIHt'ªILJˆ&ºKNLz.§„'¼LOMˆ%ĉ(»MPNƒ&Ç…)½‰'ÆNQO†*¾…(ÈŠ)ÇPSQ‡,À†*ÉQTRˆ-Á�-ÀRUSSUS™'Ø•*ÐTVTš(ÙUWU•)Û–,ÒUXV—-ÓVYWŸ(ã–+Ü€>¦ )ä˜/Ôˆ4É—-Þ“5Æ™0ÕY\Z‘3Ï–3Ρ+å˜.ߢ-æ™0àŸ0ß\_]£.èš1á]`^ 2àŸ/ê¤0é^a_¡3á˜6Ûž6Ú 1ë_b`¢5â§5á`ca¡3ìadb¢4îbebŽA̤8åcfcdfdœ;à£6ï 9ç¥9æege¤7ð¦:çfhf¢;ê¥9ñ©>à§<ègjh¦:ò£=ë¨=êª@á¤>ìilj§<ô¥?íjmk£Cçknl¦Aïlom§Bð¯Eæmpnnqo«Gé©Eò­Iìqtr£Nàrus±Mä¢RÛsvt£YɳOæuxvvywwzx°Rë£[Ôx{yªUç®QôµVåz}{³Uî{~||}}€~´Zë¯[í‚€±`à¶\í¯_é±]ð�„‚ƒ†„³`ò„‡…µbô†‰‡µk܈‹‰¶pÙ‹ŽŒŒ���’�¿rë�“‘¿xã’•““–”•˜––™——š˜˜œ™™�šÆƒæšž›¿ŠÙ� �Ɇꠣ¡Æ‹éÈŠðÉ‹ñ¦©§§ª¨¨«©«®¬²µ²·º¸¸»¹¹¼ºº½»»¾¼½Á¾¾Â¿¿ÃÀÁÄÁÂÅÃÄÇÅà·õÅÈÆÆÉÇÈËÉÊÎËÌÐÍâÁúãÄöÐÓÑÑÔÒÒÕÓÝàÞßãàáåâæéççêèèëéïòððóñöðúñôòòöóó÷ôöùöøûùùüúûÿüüÿýúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúú úúúúúúúúúúú=uxŸxœ¦¦¶¥¶¦§§£¶ª§¦ž­±³­±³­³­³­­­­ –múúúúúúú$xxxxpppppBuppppppBpp:q‰‚z‰‰z‰‚r‰z‰z‰�¡¡“"úúúúúúxxBpBpBpBpBpBBpBBpBpB/[rrrrrrrrrr‰rr�‡úúúú$pBBpBpBppBpBppBppBppBRbrrrrrrrrrrrryrrrr€%úú=ppBpBpBBBBpBpBBpBBpBB8Wrr‚ryrrrrryrrzr„Múúú ppBpBpBppppBpBppBppBpB,biirrriiririirir_sr€búúuBpBpBppBBBBpBpBBpBBpBMNrr|_rirrsrirriryrrrqúúúúxpBppÒñññáppññðñ¹pBppB5birrrsriiririirriiiryúúpBpBBÒÛÈÒÛpBèÒÈå¿pBBpBMNii_iiiiiiiiiiii_iir|úúúppBpp—p§åÈBpÈÛxpœBppBY,Niiriiiiiriiiiiirrr‰úúppBpBB¯ñºBpBpÒñxpBpBYB,Niiisiiiiisiiiiiss_s€úúúxpBpBpññBpBpBxñÒBpBpBp,biiiiiiiiiiiiiiiiirr‚úúpBpBpxñáBBpBpBéñpBpBpB,biiiiiiiiiiiiiiiiiis€úúúxpBpBœõÛppBpBpìùpBpBpB7Nisis^s^isi^^isiii^i‚úúxBppBpññBBBpBpùåBpBpBB,Nss^yii^si^sississ^i‚úúúúxpBBpBåõ¦ppBBÈñÈpBpBpBMb^_i_i^irni_ni^__iis€úúxBBppBpáéxBB¶ñåBpBpBpB,Aiiinr€|€_r|rriisi_núúúxppxpBppÇÛåÛá¶BpBpBpBp,bViir�‘‘¡¤�‘¤�¤�^s^i€úúxpxpBpBpBppBppBpBpBpB:b^sf¨ùùùù÷ùù÷ùùä^i^syúúúxpBpBpBpBpBpBpBBpBpBpB:Ns^^©ññññññññññÞsfV^|úúxBBpBpBpBBpBBpBppBpBpB,NfZiiVVViisVVs^^n^^s|úúúxppBpBpBppBppuuBpBpBpB7P^^ffsssff^ss^f^^V^^|úúB=$$=$=$=$$=B$$=$=$=$0>_ffZZZZZZZVZZn^]]sn|úúúúB$=$$$=$$=$$=$=$$=$$$$,b[^iZ_ZZZZZZZZ__^^V^|úúB$=$=$=$$=$$=$$=$=$$=$7b_VV�ññññññññññÞfVV^núúúB=$=$=$=$$==$=$$=$=$$$-A_^s¬ù÷ùøùùøøùøäZssn|úúB$=$=$$=$=$$B$$$=$$$=$,>[[f_™ ¨�����¨��[_VZnúúú B$$=$xññ=$=¶ñá==$=$=$$0bVVZf]^Z]VfVfVf]V[f]|úúB$==$=È—Ò=$èñx¾$$=$$$$,LVVV]Z^V]^fZfZfZ^VVZ|úúúB=$$$=$=BÒ=ñÒ=x=$$=$=$*>]]]^]]fV]V[Z]V[Vff]núúB$$==$$=$¶Óñ¹$$=$$=$=$*>[^^^]^VV^VZV[^ZVfZK|úúúúB==$$$=$=$áñx=$$==$$$$;bVV]VV]VV]V]VV]]VV]snúúB$$$=$=$=$æñ$$$=$$$=$$0D]]]V]]K]]V]V]]KV]]Zgúúú B=$=$=$$$=ññ¸==$$==$$$-bHKV]VVVVK]V]VVV]VV]núú@=$$=$$$$”ñÈÈB$$=$$$=$,?H]]]K]]]]]K]H]]]K]]núúú B$=$$$=p¶åñx=åéÛ$=$=$$'CXK]K]HH]K]]K]HK]]Kffúú=$=$=$=$p¿È$==Á£$$$=$$*D]]]H]]]]H]HH]]]]]K]]úúú ==$=$=$$=$$=$$=$=$=$$$-bXHH]HKH]]]]]HHH]H]fcúú$=$=$$$=$$==$=$$=$$$=$0>]H]]]]]]]HH]H]]]K]fSúúúú=B=$$==$=$$$$$=$$=$=$$'1HgHgHgKXH]]HXHXX]HcOúúú$x$$$=$$=$==$==$=$$=$$->gXAXAXAAg]]H]g]XXH¢)úúúúœp=$$$=$$$$$$$$$=$$=$-?HgHgHgHgH]g]fHAH]•«úúúúú ª¶ŽppBB=============7Sn�n�n�n�n�gc�c�¢½µúúúúúúúú 6x°¸¾ÀÈÈÊÈÊÈÊÈÊÈÊÈÂÇËËÍËÍËÍËÍËÍËÉŽ·žJúúúúúúúúúúúú ú ú ú ú ú ú ú úúúúúúúú úúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúÿÿÿÿÿÿý@_ø/ÀàÀ€€€À€€€€€€€À€€€€€€€À€€€€€€€À€€€€€€€ÀÀÀàðþªªªª¿ÿÿÿÿÿÿ(0`    8 W †###™'''«)))¶'''·'''¹(((¿)))Â)))Â)))Â)))Â)))Â)))Â)))Â)))Â)))Â(((Ä=[ÄBbÁEg¿Eg¿Eg¿Eg¿Eg¿Eg¿Eg¿Eg¿Dd»A^µAb´Ed²@`¨:W–5NƒW7 A'''©LLLäbbbýoooÿuuuÿzzzÿ}}}ÿÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿ���ÿÿ¡\Ôÿ¯açÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ¶cóÿ´aðÿ²_íÿ¯]ëÿªXäÿ¡QÜÿ‘EÉýu4¤â>\¤  @  K@@@Þmmmÿtttÿlllÿgggÿdddÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿbbbÿ___ÿŠ3Éÿš9áÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¤<ïÿ¥=ðÿ¦@ðÿ§BðÿªHðÿ¯Sñÿ¤Máÿd&�Û E+++ºhhhÿfffÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡-Èÿ˜3àÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ§@ðÿ£EåÿGg´ïÿt(©ê 8rVVVÿbbbÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡-Çÿ˜3ßÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¤;îÿŽ5Íÿ+?j"""–^^^ÿaaaÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡-Æÿ˜3Þÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ£8íÿ—9Úÿ;VŽ&&&¯cccÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡,Æÿ˜2Þÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ£7íÿ <åÿA_©&&&¶eeeÿ___ÿ^^^ÿ^^^ÿ^^^ÿ¹¹¹ÿôôôÿôôôÿôôôÿÍÍÍÿ^^^ÿ___ÿñññÿôôôÿôôôÿôôôÿ’’’ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡,Æÿ˜2Þÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ£7íÿ£>èÿB`¯(((ºeeeÿ___ÿ^^^ÿ^^^ÿ^^^ÿ»»»ÿ½½½ÿ©©©ÿ©©©ÿÄÄÄÿ^^^ÿ^^^ÿÕÕÕÿ©©©ÿªªªÿÉÉÉÿ–––ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡,Åÿ˜2Ýÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ£7ìÿ¤>êÿCa¶'''½fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿwwwÿ^^^ÿ���ÿÒÒÒÿ™™™ÿ^^^ÿ^^^ÿ®®®ÿÂÂÂÿoooÿaaaÿwwwÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ‡,Åÿ˜2Ýÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ£7ìÿ§?íÿCaº(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ………ÿúúúÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¨¨¨ÿëëëÿnnnÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†,Äÿ—2Üÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¢7ëÿ¦?ìÿCaº(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿäääÿèèèÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿfffÿûûûÿ¼¼¼ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Äÿ—1Üÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¢6ëÿ¦>ìÿCaº(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿnnnÿÿÿÿÿËËËÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿêêêÿéééÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Äÿ—1Üÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¢6ëÿ¦>ìÿCaº(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ|||ÿÿÿÿÿÉÉÉÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿéééÿøøøÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Ãÿ—1Ûÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¢6êÿ¦>ëÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿfffÿûûûÿßßßÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿaaaÿüüüÿâââÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Ãÿ—1Ûÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡5êÿ¦>ëÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¾¾¾ÿþþþÿ~~~ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ•••ÿÿÿÿÿ¢¢¢ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Ãÿ—0Ûÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡3êÿ¡4êÿ¦=ëÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿdddÿÓÓÓÿâââÿoooÿ^^^ÿ^^^ÿˆˆˆÿòòòÿÀÀÀÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Ãÿ—0Úÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡4éÿ¦=êÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ```ÿ™™™ÿÉÉÉÿ½½½ÿÉÉÉÿÈÈÈÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Ãÿ—0Úÿ¡3éÿ¡3éÿ¡3éÿ¤9êÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ±Uíÿ¬Kìÿ¡3éÿ¡3éÿ¡3éÿ¡4éÿ¦=êÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Âÿ—0Ùÿ¡3èÿ¡3èÿ¡3èÿ´]íÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÃøÿ¡3èÿ¡3èÿ¡3èÿ¡4èÿ¦=éÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†+Âÿ—0Ùÿ¡3èÿ¡3èÿ¡3èÿ²YìÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿÞ·÷ÿ¡3èÿ¡3èÿ¡3èÿ¡4èÿ¦=éÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†*Âÿ—/Ùÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡3èÿ¦<éÿC`º(((¾fffÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ[[[ÿ†*Áÿ—/Ùÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡3çÿ¦<èÿC`º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†*Áÿ—/Ùÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡3çÿ¦<èÿC`º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†*Àÿ—/Øÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡3æÿ¦<çÿC_º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†)Àÿ—.Øÿ¡1æÿ¡1æÿ¡1æÿ²WëÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿøïýÿÞ¶öÿ¡1æÿ¡1æÿ¡1æÿ¡2æÿ¦<çÿC_º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†)Àÿ—.Øÿ¡1æÿ¡1æÿ¡1æÿ´[ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡2æÿ¦<çÿC_º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿUUUÿPPPÿMMMÿMMMÿMMMÿMMMÿYYYÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†)¿ÿ—.×ÿ¡1åÿ¡1åÿ¡1åÿ¤7æÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ±Téÿ¬Ièÿ¡1åÿ¡1åÿ¡1åÿ¡2åÿ¦<æÿC_º ºVVVÿNNNÿMMMÿMMMÿMMMÿsssÿüüüÿßßßÿ[[[ÿMMMÿMMMÿ���ÿÿÿÿÿÆÆÆÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†)¿ÿ—.×ÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡2åÿ¦<æÿC_º ºVVVÿNNNÿMMMÿMMMÿMMMÿXXXÿœœœÿwwwÿ´´´ÿRRRÿMMMÿÔÔÔÿéééÿsssÿ“““ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†)¾ÿ—.Öÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡1äÿ¡2äÿ¦<åÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ```ÿ©©©ÿTTTÿûûûÿ´´´ÿMMMÿjjjÿPPPÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†(¾ÿ—-Öÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡1äÿ¦;åÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆˆˆÿ¹¹¹ÿÿÿÿÿ���ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†(¾ÿ—-Öÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡1äÿ¦;åÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÇÇÇÿÿÿÿÿeeeÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†(¾ÿ—-Õÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡1ãÿ¦;äÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÏÏÏÿõõõÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†(¾ÿ—-Õÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡1ãÿ¦;äÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿPPPÿöööÿêêêÿŠŠŠÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†'¾ÿ—,Õÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡0ãÿ¦:äÿC]º ºVVVÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿuuuÿÿÿÿÿ¢¢¢ÿ«««ÿ^^^ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†'½ÿ–,Ôÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ¡1âÿ¥:ãÿB^¹¶UUUÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿdddÿˆˆˆÿÃÃÃÿÿÿÿÿpppÿSSSÿÁÁÁÿäääÿ½½½ÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†'½ÿ–,Ôÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ¡1âÿ£8áÿB\¶ ±TTTÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿbbbÿ“““ÿ›››ÿNNNÿMMMÿSSSÿšššÿxxxÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†'¼ÿ–,Óÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ¡1áÿ¡8ÞÿB\¯«SSSÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†'¼ÿ–,Óÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ¡1áÿž6ÚÿB\§‘NNNÿOOOÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†&¼ÿ–+Óÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ¡1áÿ–2Ïÿ<TŒjRRRÿWWWÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†&»ÿ–+Òÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ¦<âÿ’9Äÿ. @d0HHHíjjjÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†&»ÿ–+Òÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ°Råÿ{2¤ì +&&&´yyyÿgggÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿIIIÿ†&ºÿ–+Ñÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ /ßÿ®Mäÿ²bßÿHc± 7>>>Û���ÿ†††ÿqqqÿdddÿ___ÿ[[[ÿXXXÿVVVÿVVVÿSSSÿRRRÿRRRÿSSSÿVVVÿVVVÿVVVÿVVVÿVVVÿVVVÿRRRÿŒ1¾ÿ›5Óÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ¥8áÿ§=áÿ§=áÿ¨>âÿ¬Hãÿ³VåÿÀsêÿµlÝÿk*ŽÙ3, �RRRãnnnýƒƒƒÿ���ÿ•••ÿ˜˜˜ÿ���ÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿŸŸŸÿ���ÿ¾ŠÚÿÆŒæÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÌ�îÿÊ‹íÿƆéÿăçÿ½záÿ´pÚÿ¡[Èý�@¥ãE]œ*#FxŒ  ###ª ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­B[­B[­B[­B[­B[­B[­B[­B[­B[­B[­B[­B[­B]­GbªE\ >X‹:Ow%E"ðàÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Ààðÿÿÿÿÿÿ(          "$%%'''()))))*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)))))('''%%$"   "%') @444b===�BBB›EEEªEEE¸GGGÆIIIÓJJJßJJJßJJJéKKKêLLLóKKKôKKKôKKKôLLLýKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿn'¦ÿp'©ÿr(«ÿs)®ÿu)°ÿw*³ÿy*¶ÿz+¹ÿ|,ºÿ~,½ÿ-Àÿ�.Âÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Äý�-Áô�-Áô�-Áô�,Âñ-Àé€-Àè~-½Ý~-½Ý|,»Ïz*¸Áx)³³u(®¤q'¨•f%›}V �_5M?)'%"  "',,,L@@@„FFF³IIIÜKKKøKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿKKKÿn'¦ÿp'©ÿr(«ÿs)®ÿu)°ÿw*³ÿy*¶ÿz+¹ÿ|,ºÿ~,½ÿ-Àÿ�.Âÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ�-Â÷}+¼Ùv)°¯i(œ�HgJ'#  $,,,LAAA IIIãKKKÿKKKÿKKKÿKKKÿKKKÿMMMÿOOOÿQQQÿTTTÿUUUÿVVVÿXXXÿYYYÿZZZÿZZZÿ[[[ÿ[[[ÿ]]]ÿ]]]ÿ]]]ÿ]]]ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÐÿŒ1ÓÿŽ2Öÿ�3Ùÿ’3Üÿ•4àÿ—5ãÿ™6çÿ›7éÿ�7ìÿŸ8ðÿ¡9óÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ 8ñÿ 8ñÿ 8ñÿŸ8ðÿž7íÿž7íÿœ7êÿœ7êÿ™6çÿ—5äÿ•4àÿ’3Üÿ�3ÙÿŒ1Óÿˆ0Íÿ„.Çÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ‚.Ãÿ€-Áâs)¯¢KoN%  #///RIIIÈKKKþKKKÿKKKÿNNNÿRRRÿVVVÿZZZÿ]]]ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÐÿŒ1ÓÿŽ2Öÿ�3Ùÿ’3Üÿ•4àÿ—5ãÿ™6çÿ›7éÿ�7ìÿŸ8ðÿ¡9óÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ¢9ôÿ 8ñÿ›7éÿ”4ßÿ�2Ôÿ…/Éÿ‚.Ãÿ‚.Ãÿ‚.Ãþz,¹ÄP sP#  .EEE´MMMýKKKÿNNNÿTTTÿ[[[ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿœ7éÿ‘3Ùÿ…/Èÿ‚.Âÿ‚.Áüw*±° &/  +++BIIIÜKKKÿNNNÿXXXÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ—5ãÿ†/Éÿ‚.Âÿ|,¼ØD^D  +++BJJJíLLLÿWWWÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¡9òÿ”4Þÿ‚.Ãÿ€,¿ë@^D  ,IIIÛMMMÿZZZÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ›7éÿ…/Çÿ~-¼Ù!2.  FFF¶NNNÿ]]]ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿž8íÿ…/Çÿv+°±  222QMMMý[[[ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ›7éÿ‚.ÂüL!mT  GGGÈWWWÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ”4Þÿ{,·Ã  000KOOOþ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÏÿŒ1ÒÿŽ2Õÿ�3Øÿ’3Ûÿ•4ßÿ—5âÿ™6æÿ›7éÿ�7ëÿŸ8ïÿ¡9òÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¢9óÿ¡9òÿ‡/ÊþL$mM  FFF YYYÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÎÿŒ1ÑÿŽ2Õÿ�3×ÿ’3Úÿ•4Þÿ—5áÿ™6åÿ›7èÿ�7êÿŸ8îÿ¡9ñÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ—5âÿr+¨œ  NNNá^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÎÿŒ1ÑÿŽ2Õÿ�3×ÿ’3Úÿ•4Þÿ—5áÿ™6åÿ›7èÿ�7êÿŸ8îÿ¡9ñÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ‚/ÂÝ  000JVVVÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ1ÎÿŒ1ÑÿŽ2Õÿ�3×ÿ’3Úÿ•4Þÿ—5áÿ™6åÿ›7èÿ�7êÿŸ8îÿ¡9ñÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ¢9òÿ‘3ØÿH$eN  BBBƒ\\\ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿœ6éÿi*š�  KKK°^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ{,¶¬  QQQÙ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿŠ0ÍÕ  !XXX÷^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ“3Üö"  +++<[[[ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿš5çÿ@$X@  ;;;_^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÎÿŒ0ÑÿŽ1Õÿ�2×ÿ’3Úÿ•3Þÿ—4áÿ™5åÿ›6èÿ�6êÿŸ7îÿ¡8ñÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ¢8òÿ 7ïÿ]%‚`  EEE}^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿn) {  LLL“^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ|.¶�  QQQ¡^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿƒ/ž  SSS¯^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ‹3Ϋ  UUU½^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿŽ2Ô¹  XXXË^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ“3ÚÇ  YYY×^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ•5ßÔ  [[[Ý^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ™5ãÙ  [[[ã^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿÀÀÀÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ0ÍÿŒ0ÐÿŽ1Ôÿ�2×ÿ’3Ùÿ•3Ýÿ—4àÿ™5äÿ›6çÿ�6éÿŸ7íÿ¡8ðÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ¢8ñÿ›5çÞ  ]]]é^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿëëëÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÙÙÙÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿœ4èå  \\\ð^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿáááÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÌÌÌÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ�5èë  ]]]õ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿØØØÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¿¿¿ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿž6êò  ]]]ù^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÏÏÏÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ³³³ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ 6ìô  ___ú^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÆÆÆÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ§§§ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ 7í÷  ^^^û^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ½½½ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿšššÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ 6îø  ___ý^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ´´´ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ���ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ 7îú  ___ý^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿçççÿ¼¼¼ÿ¡¡¡ÿ���ÿŠŠŠÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿÒÒÒÿòòòÿòòòÿªªªÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÿòòòÿòòòÿáááÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ†††ÿ‡‡‡ÿ���ÿœœœÿ³³³ÿßßßÿòòòÿòòòÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ÌÿŒ/ÏÿŽ0Óÿ�1Öÿ’2Øÿ•2Üÿ—3ßÿ™4ãÿ›5æÿ�5èÿŸ6ìÿ¡7ïÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ¢7ðÿ 7îü  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿ¬¬¬ÿdddÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÊÊÊÿòòòÿòòòÿ¡¡¡ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿrrrÿòòòÿòòòÿìììÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿœœœÿðððÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¡7îþ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿµµµÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÎÎÎÿòòòÿòòòÿ˜˜˜ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿeeeÿòòòÿòòòÿòòòÿpppÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ­­­ÿòòòÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¡7îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿñññÿoooÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿjjjÿ™™™ÿÀÀÀÿìììÿòòòÿòòòÿŽŽŽÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿìììÿòòòÿòòòÿÐÐÐÿœœœÿkkkÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿhhhÿíííÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿÚÚÚÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÿÂÂÂÿïïïÿòòòÿòòòÿòòòÿòòòÿòòòÿ………ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿáááÿòòòÿòòòÿòòòÿòòòÿîîîÿ¿¿¿ÿ|||ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÌÌÌÿòòòÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¿¿¿ÿ¬¬¬ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿsssÿÅÅÅÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿèèèÿ¯¯¯ÿhhhÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ’’’ÿÕÕÕÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÇÇÇÿwwwÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¡¡¡ÿÊÊÊÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ–––ÿëëëÿòòòÿòòòÿòòòÿòòòÿòòòÿîîîÿ¬¬¬ÿgggÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ€€€ÿÕÕÕÿòòòÿòòòÿòòòÿòòòÿòòòÿïïïÿ­­­ÿbbbÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿfffÿ¾¾¾ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÛÛÛÿyyyÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿaaaÿ§§§ÿïïïÿòòòÿòòòÿòòòÿòòòÿòòòÿÕÕÕÿsssÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ/ËÿŒ/ÎÿŽ0Òÿ�1Õÿ’2Øÿ•2Ûÿ—3Þÿ™4âÿ›5åÿ�5èÿŸ6ëÿ¡7îÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ¢7ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿjjjÿÖÖÖÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÎÎÎÿgggÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ’’’ÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿæææÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÎÿŽ/Òÿ�0Õÿ’1Øÿ•2Ûÿ—2Þÿ™3âÿ›4åÿ�4èÿŸ5ëÿ¡6îÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿlllÿØØØÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÖÖÖÿfffÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ“““ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿíííÿ………ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÎÿŽ/Òÿ�0Õÿ’1Øÿ•2Ûÿ—2Þÿ™3âÿ›4åÿ�4èÿŸ5ëÿ¡6îÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ¢6ïÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿlllÿÛÛÛÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿëëëÿsssÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿíííÿ~~~ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿbbbÿÒÒÒÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¡¡¡ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿfffÿáááÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿäääÿoooÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¶¶¶ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿãããÿbbbÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ”””ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÎÎÎÿ```ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ†††ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¨¨¨ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿbbbÿäääÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ   ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿaaaÿÝÝÝÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿvvvÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¨¨¨ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿêêêÿlllÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ›››ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿØØØÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿwwwÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ²²²ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿÝÝÝÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿªªªÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿâââÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿiiiÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿˆˆˆÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿºººÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿhhhÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿœœœÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÔÔÔÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ËÿŒ/ÍÿŽ/Ñÿ�0Ôÿ’1×ÿ•2Úÿ—2Ýÿ™3áÿ›4äÿ�4çÿŸ5êÿ¡6íÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ¢6îÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÜÜÜÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿlllÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ÊÿŒ/ÌÿŽ/Ðÿ�0Óÿ’1Öÿ•2Ùÿ—2Üÿ™3àÿ›4ãÿ�4æÿŸ5éÿ¡6ìÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿsssÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÇÇÇÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿqqqÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ’’’ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ÊÿŒ/ÌÿŽ/Ðÿ�0Óÿ’1Öÿ•2Ùÿ—2Üÿ™3àÿ›4ãÿ�4æÿŸ5éÿ¡6ìÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‘‘‘ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ´´´ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ```ÿïïïÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¯¯¯ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ÊÿŒ/ÌÿŽ/Ðÿ�0Óÿ’1Öÿ•2Ùÿ—2Üÿ™3àÿ›4ãÿ�4æÿŸ5éÿ¡6ìÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¨¨¨ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¡¡¡ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿèèèÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÉÉÉÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ.ÊÿŒ/ÌÿŽ/Ðÿ�0Óÿ’1Öÿ•2Ùÿ—2Üÿ™3àÿ›4ãÿ�4æÿŸ5éÿ¡6ìÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ¢6íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿºººÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ˜˜˜ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿáááÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÙÙÙÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÊÿŒ.ÌÿŽ/Ðÿ�/Óÿ’0Öÿ•1Ùÿ—1Üÿ™2àÿ›3ãÿ�3æÿŸ4éÿ¡5ìÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÅÅÅÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ‘‘‘ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÛÛÛÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿêêêÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÊÿŒ.ÌÿŽ/Ðÿ�/Óÿ’0Öÿ•1Ùÿ—1Üÿ™2àÿ›3ãÿ�3æÿŸ4éÿ¡5ìÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÊÊÊÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ‹‹‹ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÕÕÕÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿðððÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÊÿŒ.ÌÿŽ/Ðÿ�/Óÿ’0Öÿ•1Ùÿ—1Üÿ™2àÿ›3ãÿ�3æÿŸ4éÿ¡5ìÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÍÍÍÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿˆˆˆÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿØØØÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿbbbÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÊÿŒ.ÌÿŽ/Ðÿ�/Óÿ’0Öÿ•1Ùÿ—1Üÿ™2àÿ›3ãÿ�3æÿŸ4éÿ¡5ìÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ¢5íÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÈÈÈÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ���ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÝÝÝÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÀÀÀÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ’’’ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿãããÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿëëëÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ²²²ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿŸŸŸÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ```ÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿáááÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿœœœÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¯¯¯ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿmmmÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÍÍÍÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿƒƒƒÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÅÅÅÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿƒƒƒÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¸¸¸ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿcccÿíííÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿàààÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿžžžÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ›››ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿÌÌÌÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿmmmÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¾¾¾ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿuuuÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŠ-ÉÿŒ.ÌÿŽ/Ïÿ�/Òÿ’0Õÿ•1Ùÿ—1Ûÿ™2ßÿ›3âÿ�3åÿŸ4èÿ¡5ëÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ¢5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ›››ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ•••ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿäääÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿáááÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰-Éÿ‹.Ìÿ�/Ïÿ�/Òÿ‘0Õÿ”1Ùÿ–1Ûÿ˜2ßÿš3âÿœ3åÿž4èÿ 5ëÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿgggÿíííÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÃÃÃÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ{{{ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¬¬¬ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰-Éÿ‹.Ìÿ�/Ïÿ�/Òÿ‘0Õÿ”1Ùÿ–1Ûÿ˜2ßÿš3âÿœ3åÿž4èÿ 5ëÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ¡5ìÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿîîîÿhhhÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ²²²ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿuuuÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰-Èÿ‹.Ëÿ�/Îÿ�/Ñÿ‘0Ôÿ”1Øÿ–1Úÿ˜2Þÿš3áÿœ3äÿž4çÿ 5êÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿpppÿïïïÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¡¡¡ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿcccÿæææÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÂÂÂÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰-Èÿ‹.Ëÿ�/Îÿ�/Ñÿ‘0Ôÿ”1Øÿ–1Úÿ˜2Þÿš3áÿœ3äÿž4çÿ 5êÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ¡5ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ²²²ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿãããÿcccÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿŸŸŸÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿyyyÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿeeeÿáááÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¥¥¥ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿgggÿäääÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ³³³ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ………ÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿpppÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ···ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿàààÿeeeÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ¤¤¤ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÑÑÑÿaaaÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ���ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿ|||ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿ¼¼¼ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ³³³ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ|||ÿìììÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿ’’’ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ```ÿÀÀÀÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¤¤¤ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿzzzÿèèèÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿ›››ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿaaaÿ¼¼¼ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿªªªÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡‡‡ÿêêêÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿïïïÿ™™™ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Èÿ‹-Ëÿ�.Îÿ�.Ñÿ‘/Ôÿ”0Øÿ–0Úÿ˜1Þÿš2áÿœ2äÿž3çÿ 4êÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ¡4ëÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿ¨¨¨ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÄÄÄÿhhhÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿaaaÿ¨¨¨ÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿèèèÿ†††ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‡‡‡ÿâââÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿäääÿ™™™ÿaaaÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿˆˆˆÿ×××ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÏÏÏÿrrrÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿhhhÿ¸¸¸ÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿáááÿ¦¦¦ÿwwwÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿoooÿœœœÿÖÖÖÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿêêêÿžžžÿ___ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿwwwÿÅÅÅÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿãããÿÊÊÊÿ···ÿ­­­ÿ­­­ÿ³³³ÿÄÄÄÿÝÝÝÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿíííÿ®®®ÿhhhÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿrrrÿ¯¯¯ÿäääÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿØØØÿ���ÿgggÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ___ÿÿ¬¬¬ÿÍÍÍÿëëëÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿäääÿÇÇÇÿŸŸŸÿsssÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ```ÿuuuÿ‡‡‡ÿ™™™ÿ¨¨¨ÿ­­­ÿ³³³ÿ···ÿ²²²ÿ­­­ÿ¦¦¦ÿ”””ÿƒƒƒÿoooÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰,Çÿ‹-Êÿ�.Îÿ�.Ðÿ‘/Óÿ”0×ÿ–0Ùÿ˜1Ýÿš2àÿœ2ãÿž3æÿ 4éÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ¡4êÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ½qðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ½qðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Æÿ‹,Éÿ�-Íÿ�-Ïÿ‘.Òÿ”/Öÿ–/Ùÿ˜0Üÿš1ßÿœ1âÿž2åÿ 3èÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ½qðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ¡3éÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ½qïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ½qïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ½qïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ½qïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ½qïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹,Èÿ�-Ìÿ�-Ïÿ‘.Ñÿ”/Õÿ–/Øÿ˜0Ûÿš1Þÿœ1áÿž2äÿ 3çÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ¡3èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Èÿ�,Ìÿ�-Ïÿ‘-Ñÿ”.Õÿ–.Øÿ˜/Ûÿš0Þÿœ0áÿž1äÿ 2çÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Èÿ�,Ìÿ�-Ïÿ‘-Ñÿ”.Õÿ–.Øÿ˜/Ûÿš0Þÿœ0áÿž1äÿ 2çÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Èÿ�,Ìÿ�-Ïÿ‘-Ñÿ”.Õÿ–.Øÿ˜/Ûÿš0Þÿœ0áÿž1äÿ 2çÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ¡2èÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ^^^ÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Åÿ‹+Çÿ�,Ëÿ�-Îÿ‘-Ðÿ”.Ôÿ–.×ÿ˜/Úÿš0Ýÿœ0àÿž1ãÿ 2æÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ¡2çÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Äÿ‹+Æÿ�,Êÿ�-Íÿ‘-Ïÿ”.Óÿ–.Öÿ˜/Ùÿš0Üÿœ0ßÿž1âÿ 2åÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Äÿ‹+Æÿ�,Êÿ�-Íÿ‘-Ïÿ”.Óÿ–.Öÿ˜/Ùÿš0Üÿœ0ßÿž1âÿ 2åÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰+Äÿ‹+Æÿ�,Êÿ�-Íÿ‘-Ïÿ”.Óÿ–.Öÿ˜/Ùÿš0Üÿœ0ßÿž1âÿ 2åÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ¡2æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ½oîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ½oîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ½oîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ½oîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Äÿ‹*Æÿ�+Êÿ�,Íÿ‘,Ïÿ”-Óÿ–.Öÿ˜.Ùÿš/Üÿœ/ßÿž0âÿ 1åÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ½oîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂøÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ¡1æÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ½oíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂ÷ÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ½oíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂ÷ÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ½oíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÂ÷ÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰*Ãÿ‹*Æÿ�+Éÿ�,Ìÿ‘,Ïÿ”-Òÿ–.Õÿ˜.Øÿš/Ûÿœ/Þÿž0áÿ 1äÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ¡1åÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿOOOÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿcccÿ¬¬¬ÿÙÙÙÿïïïÿòòòÿíííÿÑÑÑÿ™™™ÿTTTÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿcccÿ²²²ÿßßßÿòòòÿðððÿáááÿ¸¸¸ÿ{{{ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‚‚‚ÿìììÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÞÞÞÿrrrÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿpppÿçççÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÆÆÆÿ```ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿbbbÿìììÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿ‚‚‚ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿTTTÿÞÞÞÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿäääÿtttÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¤¤¤ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿïïïÿ‚‚‚ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ™™™ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿëëëÿrrrÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÂÂÂÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿíííÿvvvÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÞÞÞÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿèèèÿkkkÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Âÿ‹)Åÿ�*Èÿ�+Ëÿ‘+Îÿ”,Ñÿ–-Ôÿ˜-×ÿš.Úÿœ.Ýÿž/àÿ 0ãÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ¡0äÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÄÄÄÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿçççÿhhhÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿmmmÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÞÞÞÿYYYÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¡¡¡ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÝÝÝÿ\\\ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ   ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿåååÿ¹¹¹ÿÎÎÎÿòòòÿòòòÿòòòÿÆÆÆÿPPPÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ]]]ÿæææÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿáááÿ™™™ÿdddÿRRRÿŽŽŽÿëëëÿòòòÿòòòÿÏÏÏÿSSSÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÒÒÒÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÙÙÙÿ___ÿMMMÿMMMÿ|||ÿäääÿòòòÿòòòÿŸŸŸÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿmmmÿÖÖÖÿòòòÿòòòÿòòòÿÑÑÑÿ‰‰‰ÿQQQÿMMMÿMMMÿMMMÿMMMÿjjjÿáááÿòòòÿòòòÿ»»»ÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ]]]ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿwwwÿMMMÿMMMÿMMMÿMMMÿjjjÿäääÿòòòÿïïïÿnnnÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿgggÿrrrÿYYYÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿjjjÿçççÿòòòÿòòòÿ™™™ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÌÌÌÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿmmmÿìììÿòòòÿ×××ÿSSSÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿuuuÿïïïÿòòòÿïïïÿxxxÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ®®®ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ–––ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†††ÿñññÿòòòÿ¨¨¨ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ———ÿòòòÿòòòÿäääÿ```ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿØØØÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿdddÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¤¤¤ÿòòòÿñññÿvvvÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰)Áÿ‹)Äÿ�*Çÿ�+Êÿ‘+Íÿ”,Ðÿ–-Óÿ˜-×ÿš.Ùÿœ.Üÿž/ßÿ 0âÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ¡0ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿ¾¾¾ÿòòòÿòòòÿÏÏÏÿRRRÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ]]]ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿßßßÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿÁÁÁÿòòòÿÝÝÝÿUUUÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰(Áÿ‹)Äÿ�)Çÿ�*Êÿ‘*Íÿ”+Ðÿ–,Óÿ˜,×ÿš-Ùÿœ.Üÿž.ßÿ /âÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿYYYÿàààÿòòòÿòòòÿ®®®ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿµµµÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿVVVÿØØØÿòòòÿ£££ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰(Áÿ‹)Äÿ�)Çÿ�*Êÿ‘*Íÿ”+Ðÿ–,Óÿ˜,×ÿš-Ùÿœ.Üÿž.ßÿ /âÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ¡/ãÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿyyyÿñññÿòòòÿòòòÿŠŠŠÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ®®®ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿŽŽŽÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿfffÿ———ÿRRRÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰(Àÿ‹)Ãÿ�)Çÿ�*Éÿ‘*Ìÿ”+Ïÿ–,Òÿ˜,Öÿš-Øÿœ.Ûÿž.Þÿ /áÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ«««ÿòòòÿòòòÿëëëÿhhhÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿØØØÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿfffÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰(Àÿ‹)Ãÿ�)Çÿ�*Éÿ‘*Ìÿ”+Ïÿ–,Òÿ˜,Öÿš-Øÿœ.Ûÿž.Þÿ /áÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ¡/âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿRRRÿÕÕÕÿòòòÿòòòÿÖÖÖÿSSSÿMMMÿMMMÿMMMÿMMMÿ]]]ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿãããÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿlllÿîîîÿòòòÿòòòÿ³³³ÿMMMÿMMMÿMMMÿMMMÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ»»»ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿšššÿòòòÿòòòÿòòòÿŠŠŠÿMMMÿMMMÿMMMÿ®®®ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ”””ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿÈÈÈÿòòòÿòòòÿëëëÿhhhÿMMMÿMMMÿØØØÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿmmmÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ```ÿçççÿòòòÿòòòÿÕÕÕÿSSSÿ]]]ÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿéééÿOOOÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰‰‰ÿòòòÿòòòÿòòòÿ°°°ÿ†††ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÂÂÂÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¹¹¹ÿòòòÿòòòÿòòòÿÙÙÙÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ›››ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(ÀÿŠ)Ãÿ�)ÇÿŽ*Éÿ�*Ìÿ“+Ïÿ•,Òÿ—,Öÿ™-Øÿ›.Ûÿ�.ÞÿŸ/áÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ /âÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿWWWÿßßßÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿsssÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(¿ÿŠ)Âÿ�)ÆÿŽ*Èÿ�*Ëÿ“+Îÿ•,Ñÿ—,Õÿ™-×ÿ›.Úÿ�.ÝÿŸ/àÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿyyyÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿRRRÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(¿ÿŠ)Âÿ�)ÆÿŽ*Èÿ�*Ëÿ“+Îÿ•,Ñÿ—,Õÿ™-×ÿ›.Úÿ�.ÝÿŸ/àÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿªªªÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÈÈÈÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(¿ÿŠ)Âÿ�)ÆÿŽ*Èÿ�*Ëÿ“+Îÿ•,Ñÿ—,Õÿ™-×ÿ›.Úÿ�.ÝÿŸ/àÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿSSSÿÕÕÕÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¡¡¡ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ(¿ÿŠ)Âÿ�)ÆÿŽ*Èÿ�*Ëÿ“+Îÿ•,Ñÿ—,Õÿ™-×ÿ›.Úÿ�.ÝÿŸ/àÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ /áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÂÂÂÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ{{{ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Âÿ�(ÆÿŽ)Èÿ�)Ëÿ“*Îÿ•+Ñÿ—+Õÿ™,×ÿ›-Úÿ�-ÝÿŸ.àÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿèèèÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿYYYÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Âÿ�(ÆÿŽ)Èÿ�)Ëÿ“*Îÿ•+Ñÿ—+Õÿ™,×ÿ›-Úÿ�-ÝÿŸ.àÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿlllÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÜÜÜÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Âÿ�(ÆÿŽ)Èÿ�)Ëÿ“*Îÿ•+Ñÿ—+Õÿ™,×ÿ›-Úÿ�-ÝÿŸ.àÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ“““ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ¹¹¹ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Âÿ�(ÆÿŽ)Èÿ�)Ëÿ“*Îÿ•+Ñÿ—+Õÿ™,×ÿ›-Úÿ�-ÝÿŸ.àÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ .áÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¹¹¹ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿžžžÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿßßßÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ‰‰‰ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿaaaÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿžžžÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰‰‰ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿìììÿcccÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¯¯¯ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÄÄÄÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ×××ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ€€€ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿYYYÿñññÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÏÏÏÿòòòÿòòòÿßßßÿTTTÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ```ÿ×××ÿòòòÿòòòÿ¥¥¥ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¦¦¦ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÞÞÞÿMMMÿqqqÿðððÿòòòÿïïïÿlllÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¿ÿŠ(Áÿ�(ÅÿŽ)Çÿ�)Êÿ“*Îÿ•+Ðÿ—+Ôÿ™,Öÿ›-Ùÿ�-ÜÿŸ.ßÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ .àÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÍÍÍÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ½½½ÿMMMÿMMMÿ¦¦¦ÿòòòÿòòòÿ×××ÿSSSÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¾ÿŠ(Àÿ�(ÄÿŽ)Çÿ�)Éÿ“*Íÿ•+Ïÿ—+Óÿ™,Õÿ›-Øÿ�-ÜÿŸ.Þÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿSSSÿîîîÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ›››ÿMMMÿMMMÿSSSÿ×××ÿòòòÿòòòÿ¯¯¯ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ'¾ÿŠ(Àÿ�(ÄÿŽ)Çÿ�)Éÿ“*Íÿ•+Ïÿ—+Óÿ™,Õÿ›-Øÿ�-ÜÿŸ.Þÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ .ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿyyyÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿzzzÿMMMÿMMMÿMMMÿjjjÿìììÿòòòÿòòòÿ………ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¤¤¤ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿZZZÿMMMÿMMMÿMMMÿMMMÿ”””ÿòòòÿòòòÿæææÿ```ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÏÏÏÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÚÚÚÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿÂÂÂÿòòòÿòòòÿÐÐÐÿSSSÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿWWWÿðððÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ²²²ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ[[[ÿßßßÿòòòÿòòòÿÀÀÀÿPPPÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ```ÿpppÿ\\\ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‡‡‡ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿŠŠŠÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿoooÿìììÿòòòÿòòòÿÂÂÂÿSSSÿMMMÿMMMÿMMMÿQQQÿŒŒŒÿØØØÿòòòÿòòòÿñññÿ»»»ÿWWWÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿÅÅÅÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿaaaÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿŠŠŠÿòòòÿòòòÿòòòÿÛÛÛÿ‰‰‰ÿyyyÿ   ÿáááÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÆÆÆÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ .ßÿ  MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿVVVÿUUUÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿtttÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿßßßÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ¦¦¦ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿsssÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&¾ÿŠ'Àÿ�(ÄÿŽ(Çÿ�)Éÿ“)Íÿ•*Ïÿ—+Óÿ™+Õÿ›,Øÿ�,ÜÿŸ-Þÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ -ßÿ .ßþ  MMMýMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ›››ÿïïïÿÑÑÑÿªªªÿ‚‚‚ÿ___ÿNNNÿMMMÿOOOÿzzzÿâââÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ°°°ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿ°°°ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ™™™ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -ÞÿŸ.Þü  MMMýMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ   ÿîîîÿòòòÿòòòÿòòòÿòòòÿïïïÿåååÿìììÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿwwwÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿ···ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ›››ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -ÞÿŸ.Ýú  LLLûMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿXXXÿ‹‹‹ÿÁÁÁÿíííÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÕÕÕÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿNNNÿ¥¥¥ÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿ{{{ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -ÞÿŸ.Ýø  NNNùMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿVVVÿ‡‡‡ÿ¼¼¼ÿéééÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ‰‰‰ÿçççÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿÐÐÐÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ .Ü÷  NNN÷MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿPPPÿvvvÿ¤¤¤ÿÏÏÏÿîîîÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿ   ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿ[[[ÿ®®®ÿëëëÿòòòÿòòòÿòòòÿòòòÿòòòÿÌÌÌÿ]]]ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ /Þô  OOOôMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿQQQÿoooÿŒŒŒÿ���ÿ§§§ÿžžžÿmmmÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿSSSÿ‚‚‚ÿ™™™ÿ§§§ÿžžžÿuuuÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ 0Üò  OOOîMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ 1Ûë  OOOçMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ&½ÿŠ'Àÿ�(ÃÿŽ(Æÿ�)Èÿ“)Ìÿ•*Îÿ—+Òÿ™+Ôÿ›,×ÿ�,ÛÿŸ-Ýÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ -Þÿ�0Øæ  OOOàMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ�/Öß  PPPÚMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ�3ÖÙ  RRRÔMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿž6ÕÔ  SSSÈMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ�7ÒÈ  RRR»MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ™7λ  QQQªMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ–8È­  VVVžMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ”=Æ   [[[�MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ•BÁ“  ]]]yMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%¼ÿŠ&¿ÿ�'ÂÿŽ'Åÿ�(Çÿ“(Ëÿ•)Íÿ—*Ñÿ™*Óÿ›+Öÿ�+ÚÿŸ,Üÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ ,Ýÿ�G´}  aaa\NNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ¡/Ýÿ�Gža  TTT:UUUÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ¦:ÞÿX6m=  ___öMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,ÜÿªEÞö   dddÖMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ¨JØØ  iii­MMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ¢Sΰ  ppp€SSSÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ&¾ÿ�'ÁÿŽ'Äÿ�(Æÿ“(Êÿ•)Ìÿ—*Ðÿ™*Óÿ›+Õÿ�+ÙÿŸ,Ûÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ ,Üÿ¦8Þÿ˜R»ƒ  \\\EeeeÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ%¾ÿ�&ÁÿŽ&Äÿ�'Æÿ“'Êÿ•(Ìÿ—)Ðÿ™)Óÿ›*Õÿ�*ÙÿŸ+Ûÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ¯Mâÿh<ƒL   uuuáMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ%¾ÿ�&ÁÿŽ&Äÿ�'Æÿ“'Êÿ•(Ìÿ—)Ðÿ™)Óÿ›*Õÿ�*ÙÿŸ+Ûÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ°\Ýà  vvvž[[[ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%»ÿŠ%¾ÿ�&ÁÿŽ&Äÿ�'Æÿ“'Êÿ•(Ìÿ—)Ðÿ™)Óÿ›*Õÿ�*ÙÿŸ+Ûÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ +Üÿ©@ßÿ¤XÊŸ  \\\EwwwþMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ ,Ûÿ¸`äþp?ˆI  }}}È```ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ¬Fàÿ±aÙÇ  ]]]J€€€ýVVVÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ¦9Ýÿ»håý{D“S  yyy³{{{ÿRRRÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ£2Üÿºdåÿ«]Ô³  ...!~~~Ú|||ÿWWWÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ¦9Ýÿºdåÿ¶eßÚ:$I#  UUU6€€€í€€€ÿaaaÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ ,Ûÿ¬Fàÿ¼iåÿ¹gâìr;„8  MMM5}}}Ú‚‚‚ÿyyyÿ^^^ÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ§<Þÿ·_äÿ¼jæÿµcßÙt<†7  +++xxx²‚‚‚ý‚‚‚ÿzzzÿhhhÿUUUÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%½ÿ�&ÀÿŽ&Ãÿ�'Æÿ“'Éÿ•(Ìÿ—)Ïÿ™)Òÿ›*Ôÿ�*ØÿŸ+Úÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ +Ûÿ¥6Ýÿ¯Láÿ¹bäÿ¼jæÿ»jåý¯`ذ:!J  [[[F|||Ńƒƒþ‚‚‚ÿ‚‚‚ÿzzzÿoooÿcccÿXXXÿOOOÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%¼ÿ�&¿ÿŽ&Âÿ�'Åÿ“'Èÿ•(Ëÿ—)Îÿ™)Ñÿ›*Óÿ�*×ÿŸ+Ùÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ¡.Ûÿ¦8Üÿ¬Fßÿ²Táÿ¹bäÿ¼jåÿ¼jåÿ¼jåÿ³_ÝÏŠJ¨L  YYY?rrrš~~~ã‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ}}}ÿwwwÿpppÿjjjÿfffÿcccÿ^^^ÿ[[[ÿWWWÿWWWÿTTTÿTTTÿPPPÿPPPÿPPPÿNNNÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿMMMÿˆ%ºÿŠ%¼ÿ�&¿ÿŽ&Âÿ�'Åÿ“'Èÿ•(Ëÿ—)Îÿ™)Ñÿ›*Óÿ�*×ÿŸ+Ùÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ +Úÿ¡-Úÿ¢/Ûÿ¢/Ûÿ¢/Ûÿ¤3Ûÿ¤3Ûÿ¦7Üÿ¦7Üÿ§<ÝÿªAÞÿ¬EÞÿ­Ißÿ¯Màÿ³Uáÿ¶]ãÿºeäÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¸eáã«YÓ�ƒB¢B  ZZZ>mmmzuuu®|||Ú‚‚‚ø‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ»hä÷¶eßÚ¯]×­¡TÉz}CŸ=  LLL/bbbSkkkwqqq“ttt£vvv³yyyÂ{{{Ð}}}Ý|||Þéé���ô���ô���ô‚‚‚ú‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ‚‚‚ÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jåÿ¼jäú»iãô»iãô»iãô¹fáé¹fáé·eàÞ¶dßݵcßв`ÛÁ¯^Ù³®\Ö£ªZГ¢TÇv“JµSl9ˆ-      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ€ÿÿÿÿÿü?ÿÿÿÿðÿÿÿÿàÿÿÿÿ€ÿÿÿÿÿÿÿþÿÿü?ÿÿüÿÿøÿÿðÿÿðÿÿàÿÿÀÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿþþþþþþþþü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?ü?þþþþþþþþÿÿÿÿÿÿÿÿÿ€ÿÿ€ÿÿ€ÿÿÀÿÿÀÿÿÀÿÿàÿÿðÿÿðÿÿøÿÿøÿÿü?ÿÿþÿÿÿÿÿÿÿ€ÿÿÿÿàÿÿÿÿðÿÿÿÿü?ÿÿÿÿÿ€ÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqalculate-qt-5.11.0/data/qalculate.manifest000066400000000000000000000006151520501070600206050ustar00rootroot00000000000000 UTF-8 qalculate-qt-5.11.0/data/scalable/000077500000000000000000000000001520501070600166465ustar00rootroot00000000000000qalculate-qt-5.11.0/data/scalable/calendars-dark.svg000066400000000000000000000012361520501070600222440ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/calendars.svg000066400000000000000000000012361520501070600213250ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/configure-dark.svg000066400000000000000000000013301520501070600222640ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/configure.svg000066400000000000000000000032151520501070600213510ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/convert-dark.svg000066400000000000000000000104031520501070600217640ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/convert.svg000066400000000000000000000103761520501070600210560ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-edit-dark.svg000066400000000000000000000010131520501070600230420ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-edit.svg000066400000000000000000000010131520501070600221230ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-open-dark.svg000066400000000000000000000006071520501070600230660ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-open.svg000066400000000000000000000006071520501070600221470ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-save-dark.svg000066400000000000000000000012311520501070600230550ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/document-save.svg000066400000000000000000000025011520501070600221370ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-clear-dark.svg000066400000000000000000000014671520501070600223270ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-clear.svg000066400000000000000000000014671520501070600214100ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-copy-dark.svg000066400000000000000000000010261520501070600222020ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-copy.svg000066400000000000000000000010261520501070600212630ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-delete-dark.svg000066400000000000000000000023371520501070600225000ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-delete.svg000066400000000000000000000023321520501070600215540ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-find-dark.svg000066400000000000000000000026761520501070600221640ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-find.svg000066400000000000000000000026611520501070600212370ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-paste-dark.svg000066400000000000000000000011441520501070600223450ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-paste.svg000066400000000000000000000011441520501070600214260ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-undo-dark.svg000066400000000000000000000025731520501070600222050ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/edit-undo.svg000066400000000000000000000025561520501070600212670ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/function-dark.svg000066400000000000000000000027271520501070600221430ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/function.svg000066400000000000000000000027211520501070600212160ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-back-dark.svg000066400000000000000000000110631520501070600216120ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-back.svg000066400000000000000000000113451520501070600206760ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-down-dark.svg000066400000000000000000000022341520501070600216610ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-down.svg000066400000000000000000000022271520501070600207440ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-forward-dark.svg000066400000000000000000000110111520501070600223470ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-forward.svg000066400000000000000000000112701520501070600214370ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-up-dark.svg000066400000000000000000000022301520501070600213320ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/go-up.svg000066400000000000000000000022251520501070600204170ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/input-dialpad-dark.svg000066400000000000000000000033301520501070600230400ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/input-dialpad.svg000066400000000000000000000033461520501070600221300ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/number-bases-dark.svg000066400000000000000000000101771520501070600226770ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/number-bases.svg000066400000000000000000000103711520501070600217540ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/open-menu-dark.svg000066400000000000000000000007461520501070600222200ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/open-menu.svg000066400000000000000000000022441520501070600212740ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/percentage-dark.svg000066400000000000000000000016641520501070600224320ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/percentage.svg000066400000000000000000000016641520501070600215130ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/plot-dark.svg000066400000000000000000000021371520501070600212670ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/plot.svg000066400000000000000000000021371520501070600203500ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/qalculate-qt.svg000066400000000000000000000221421520501070600217650ustar00rootroot00000000000000 Yaru Icon Theme Template image/svg+xml Yaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu James Yaru Icon Theme Template image/svg+xml apps calculator-app qalculate-qt-5.11.0/data/scalable/rpn-swap-dark.svg000066400000000000000000000053001520501070600220530ustar00rootroot00000000000000 image/svg+xml qalculate-qt-5.11.0/data/scalable/rpn-swap.svg000066400000000000000000000052731520501070600211450ustar00rootroot00000000000000 image/svg+xml qalculate-qt-5.11.0/data/scalable/table-dark.svg000066400000000000000000000027251520501070600214030ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/table.svg000066400000000000000000000027761520501070600204720ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/units-dark.svg000066400000000000000000000045011520501070600214500ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/units.svg000066400000000000000000000047351520501070600205420ustar00rootroot00000000000000 qalculate-qt-5.11.0/data/scalable/warning.svg000066400000000000000000000030011520501070600210260ustar00rootroot00000000000000 qalculate-qt-5.11.0/flags.qrc000066400000000000000000000132341520501070600157750ustar00rootroot00000000000000 data/flags/AED.png data/flags/AFN.png data/flags/ALL.png data/flags/AMD.png data/flags/ANG.png data/flags/AOA.png data/flags/ARS.png data/flags/ATS.png data/flags/AUD.png data/flags/AWG.png data/flags/AZN.png data/flags/BAM.png data/flags/BBD.png data/flags/BDT.png data/flags/BEF.png data/flags/BGN.png data/flags/BHD.png data/flags/BIF.png data/flags/BMD.png data/flags/BND.png data/flags/BOB.png data/flags/BRL.png data/flags/BSD.png data/flags/BTC.png data/flags/BWP.png data/flags/BZD.png data/flags/CAD.png data/flags/CDF.png data/flags/cent.png data/flags/CHF.png data/flags/CLP.png data/flags/CNY.png data/flags/COP.png data/flags/CRC.png data/flags/CUP.png data/flags/CVE.png data/flags/CYP.png data/flags/CZK.png data/flags/DEM.png data/flags/DJF.png data/flags/DKK.png data/flags/DOP.png data/flags/DZD.png data/flags/EEK.png data/flags/EGP.png data/flags/ERN.png data/flags/ESP.png data/flags/ETB.png data/flags/eurocent.png data/flags/EUR.png data/flags/FIM.png data/flags/FJD.png data/flags/FKP.png data/flags/FRF.png data/flags/GBP.png data/flags/GEL.png data/flags/GGP.png data/flags/GHS.png data/flags/GIP.png data/flags/GMD.png data/flags/GNF.png data/flags/GRD.png data/flags/GTQ.png data/flags/GYD.png data/flags/HKD.png data/flags/HNL.png data/flags/HRK.png data/flags/HTG.png data/flags/HUF.png data/flags/IDR.png data/flags/IEP.png data/flags/ILS.png data/flags/INR.png data/flags/IQD.png data/flags/IRR.png data/flags/ISK.png data/flags/ITL.png data/flags/JMD.png data/flags/JOD.png data/flags/JPY.png data/flags/KES.png data/flags/KGS.png data/flags/KHR.png data/flags/KMF.png data/flags/KPW.png data/flags/KRW.png data/flags/KWD.png data/flags/KYD.png data/flags/KZT.png data/flags/LAK.png data/flags/LBP.png data/flags/LKR.png data/flags/LRD.png data/flags/LSL.png data/flags/LTL.png data/flags/LUF.png data/flags/LVL.png data/flags/LYD.png data/flags/MAD.png data/flags/MDL.png data/flags/MGA.png data/flags/MKD.png data/flags/MMK.png data/flags/MNT.png data/flags/MOP.png data/flags/MRO.png data/flags/MRU.png data/flags/MTL.png data/flags/MUR.png data/flags/MWK.png data/flags/MVR.png data/flags/MXN.png data/flags/MYR.png data/flags/MZN.png data/flags/NAD.png data/flags/NGN.png data/flags/NIO.png data/flags/NLG.png data/flags/NOK.png data/flags/NPR.png data/flags/NZD.png data/flags/OMR.png data/flags/PAB.png data/flags/PEN.png data/flags/PGK.png data/flags/PHP.png data/flags/PKR.png data/flags/PLN.png data/flags/PTE.png data/flags/PYG.png data/flags/QAR.png data/flags/RON.png data/flags/RSD.png data/flags/RWF.png data/flags/SAR.png data/flags/SBD.png data/flags/SCR.png data/flags/SDG.png data/flags/SEK.png data/flags/SGD.png data/flags/SIT.png data/flags/SKK.png data/flags/SLE.png data/flags/SOS.png data/flags/SRD.png data/flags/STN.png data/flags/SVC.png data/flags/SYP.png data/flags/SZL.png data/flags/THB.png data/flags/TJS.png data/flags/TMT.png data/flags/TND.png data/flags/TOP.png data/flags/TRY.png data/flags/TTD.png data/flags/TWD.png data/flags/TZS.png data/flags/UAH.png data/flags/UGX.png data/flags/USD.png data/flags/UYU.png data/flags/UZS.png data/flags/VEF.png data/flags/VES.png data/flags/VND.png data/flags/VUV.png data/flags/XAF.png data/flags/XCD.png data/flags/XOF.png data/flags/XPF.png data/flags/YER.png data/flags/ZAR.png data/flags/ZMK.png data/flags/ZMW.png qalculate-qt-5.11.0/icons.qrc000066400000000000000000000116751520501070600160230ustar00rootroot00000000000000 data/scalable/qalculate-qt.svg data/scalable/calendars.svg data/scalable/configure.svg data/scalable/convert.svg data/scalable/document-edit.svg data/scalable/document-open.svg data/scalable/document-save.svg data/scalable/edit-clear.svg data/scalable/edit-copy.svg data/scalable/edit-delete.svg data/scalable/edit-find.svg data/scalable/edit-paste.svg data/scalable/edit-undo.svg data/scalable/go-back.svg data/scalable/go-down.svg data/scalable/go-forward.svg data/scalable/go-up.svg data/scalable/function.svg data/scalable/input-dialpad.svg data/scalable/number-bases.svg data/scalable/open-menu.svg data/scalable/percentage.svg data/scalable/plot.svg data/scalable/rpn-swap.svg data/scalable/table.svg data/scalable/units.svg data/scalable/warning.svg data/scalable/calendars-dark.svg data/scalable/configure-dark.svg data/scalable/convert-dark.svg data/scalable/document-edit-dark.svg data/scalable/document-open-dark.svg data/scalable/document-save-dark.svg data/scalable/edit-clear-dark.svg data/scalable/edit-copy-dark.svg data/scalable/edit-delete-dark.svg data/scalable/edit-find-dark.svg data/scalable/edit-paste-dark.svg data/scalable/edit-undo-dark.svg data/scalable/go-back-dark.svg data/scalable/go-down-dark.svg data/scalable/go-forward-dark.svg data/scalable/go-up-dark.svg data/scalable/function-dark.svg data/scalable/input-dialpad-dark.svg data/scalable/number-bases-dark.svg data/scalable/open-menu-dark.svg data/scalable/percentage-dark.svg data/scalable/plot-dark.svg data/scalable/rpn-swap-dark.svg data/scalable/table-dark.svg data/scalable/units-dark.svg data/scalable/warning.svg data/16/qalculate-qt.png data/22/qalculate-qt.png data/32/qalculate-qt.png data/48/qalculate-qt.png data/64/qalculate-qt.png data/128/qalculate-qt.png qalculate-qt-5.11.0/qalculate-qt.pro000066400000000000000000000103531520501070600173100ustar00rootroot00000000000000VERSION = 5.11.0 isEmpty(PREFIX) { PREFIX = /usr/local } isEmpty(BINDIR) { BINDIR = $$PREFIX/bin } isEmpty(DESKTOP_DIR) { DESKTOP_DIR = $$PREFIX/share/applications } isEmpty(DESKTOP_ICON_DIR) { DESKTOP_ICON_DIR = $$PREFIX/share/icons } unix:!equals(COMPILE_RESOURCES,"yes"):!android:!macx { isEmpty(TRANSLATIONS_DIR) { TRANSLATIONS_DIR = $$PREFIX/share/qalculate-qt/translations } DEFINES += TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" } isEmpty(MAN_DIR) { MAN_DIR = $$PREFIX/share/man } isEmpty(APPDATA_DIR) { APPDATA_DIR = $$PREFIX/share/metainfo } TEMPLATE = app TARGET = qalculate-qt INCLUDEPATH += src win32: { LIBS += -lqalculate -lxml2 -lmpfr -liconv -lintl -lgmp -licuuc -lcurl CONFIG += c++17 } else { CONFIG += link_pkgconfig macx: { PKGCONFIG += libqalculate gmp mpfr CONFIG += c++11 } else { PKGCONFIG += libqalculate } } CONFIG += qt QT += widgets network MOC_DIR = build OBJECTS_DIR = build HEADERS += src/calendarconversiondialog.h src/csvdialog.h src/dataseteditdialog.h src/datasetsdialog.h src/expressionedit.h src/fpconversiondialog.h src/functioneditdialog.h src/functionsdialog.h src/historyview.h src/itemproxymodel.h src/keypadwidget.h src/matrixwidget.h src/percentagecalculationdialog.h src/periodictabledialog.h src/plotdialog.h src/preferencesdialog.h src/qalculateqtsettings.h src/qalculatewindow.h src/unitsdialog.h src/uniteditdialog.h src/unknowneditdialog.h src/variableeditdialog.h src/variablesdialog.h SOURCES += src/calendarconversiondialog.cpp src/csvdialog.cpp src/dataseteditdialog.cpp src/datasetsdialog.cpp src/expressionedit.cpp src/fpconversiondialog.cpp src/functioneditdialog.cpp src/functionsdialog.cpp src/historyview.cpp src/itemproxymodel.cpp src/keypadwidget.cpp src/main.cpp src/matrixwidget.cpp src/percentagecalculationdialog.cpp src/periodictabledialog.cpp src/plotdialog.cpp src/preferencesdialog.cpp src/qalculateqtsettings.cpp src/qalculatewindow.cpp src/unitsdialog.cpp src/uniteditdialog.cpp src/unknowneditdialog.cpp src/variableeditdialog.cpp src/variablesdialog.cpp LANGUAGES = ca de en es fr ka nl pt_BR pt_PT ru sl sv zh_CN zh_TW #parameters: var, prepend, append defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 return($$result) } !win32 { TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/qalculate-qt_, .ts) TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { qmfile = $$shadowed($$tsfile) qmfile ~= s,.ts$,.qm, qmdir = $$dirname(qmfile) exists($$qmdir) { mkpath($$qmdir)|error("Aborting.") } command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile system($$command)|error("Failed to run: $$command") TRANSLATIONS_FILES += $$qmfile } } unix:!equals(COMPILE_RESOURCES,"yes"):!android:!macx { target.path = $$BINDIR qm.files = $$prependAll(LANGUAGES, $$PWD/translations/qalculate-qt_, .qm) qm.path = $$TRANSLATIONS_DIR desktop.files = data/io.github.Qalculate.qalculate-qt.desktop desktop.path = $$DESKTOP_DIR appdata.files = data/io.github.Qalculate.qalculate-qt.metainfo.xml appdata.path = $$APPDATA_DIR appicon16.files = data/16/qalculate-qt.png appicon16.path = $$DESKTOP_ICON_DIR/hicolor/16x16/apps appicon22.files = data/22/qalculate-qt.png appicon22.path = $$DESKTOP_ICON_DIR/hicolor/22x22/apps appicon32.files = data/32/qalculate-qt.png appicon32.path = $$DESKTOP_ICON_DIR/hicolor/32x32/apps appicon64.files = data/64/qalculate-qt.png appicon64.path = $$DESKTOP_ICON_DIR/hicolor/64x64/apps appicon128.files = data/128/qalculate-qt.png appicon128.path = $$DESKTOP_ICON_DIR/hicolor/128x128/apps appiconsvg.files = data/scalable/qalculate-qt.svg appiconsvg.path = $$DESKTOP_ICON_DIR/hicolor/scalable/apps INSTALLS += target desktop appdata qm \ appicon16 appicon22 appicon32 appicon64 appicon128 appiconsvg RESOURCES = icons.qrc flags.qrc } else { RESOURCES = icons.qrc flags.qrc translations.qrc target.path = $$BINDIR desktop.files = data/io.github.Qalculate.qalculate-qt.desktop desktop.path = $$DESKTOP_DIR appicon64.files = data/64/qalculate-qt.png appicon64.path = $$DESKTOP_ICON_DIR/hicolor/64x64/apps INSTALLS += target desktop appicon64 } unix:!android:!macx { man.files = data/qalculate-qt.1 man.path = $$MAN_DIR/man1 INSTALLS += man } macx: ICON = data/qalculate.icns win32: RC_FILE = winicon.rc qalculate-qt-5.11.0/snap/000077500000000000000000000000001520501070600151305ustar00rootroot00000000000000qalculate-qt-5.11.0/snap/gui/000077500000000000000000000000001520501070600157145ustar00rootroot00000000000000qalculate-qt-5.11.0/snap/gui/qalculate-qt.desktop000066400000000000000000000035421520501070600217100ustar00rootroot00000000000000[Desktop Entry] Name=Qalculate! (Qt) GenericName=Calculator GenericName[ca]=Calculadora GenericName[de]=Taschenrechner GenericName[es]=Calculadora GenericName[fr]=Calculatrice GenericName[pt_BR]=Calculadora GenericName[pt_PT]=Calculadora GenericName[ru]=КалькулÑ�тор GenericName[sl]=RaÄ�unalo GenericName[sv]=Kalkylator GenericName[zh_CN]=计算器 Comment=Powerful and easy to use calculator Comment[ca]=Calculadora poderosa i fàcil a usar Comment[de]=Leistungsstarker und einfach zu bedienender Taschenrechner Comment[es]=Calculadora poderosa y fácil de usar Comment[fr]=Une calculatrice puissante et facile d'utilisation Comment[nl]=Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Comment[pt_BR]=Calculadora potente e fácil de usar Comment[pt_PT]=Calculadora poderosa e fácil de usar Comment[ru]=Мощный и проÑ�той в иÑ�пользовании калькулÑ�тор Comment[sl]=Zmogljivo raÄ�unalo, preprosto za uporabo Comment[sv]=Kraftfull och användarvänlig miniräknare Comment[zh_CN]=强大而易用的计算器 Exec=qalculate-qt Icon=${SNAP}/meta/gui/qalculate-qt.svg Terminal=false Type=Application StartupNotify=true StartupWMClass=qalculate-qt Categories=Qt;Utility;Calculator;Education;Science;Math; Keywords=calculation;arithmetic;scientific;financial; Keywords[ca]=calculation;arithmetic;scientific;financial; Keywords[de]=Berechnung;Arithmetik;Wissenschaft;Finanzen; Keywords[es]=calculadora;aritmética;científica;financiera; Keywords[fr]=calcul;arithmétique;scientifique;financier; Keywords[pt_BR]=calculadora;aritmética;científica;financeira; Keywords[pt_PT]=calculadora;aritmética;científica;financeira; Keywords[ru]=раÑ�чёт;раÑ�чет;арифметика;научный;финанÑ�овый Keywords[sl]=izraÄ�un;aritmetika;znanstveno;finanÄ�no;raÄ�unalo;kalkulator; Keywords[zh_CN]=计算;算术;ç§‘å­¦;金èž�; qalculate-qt-5.11.0/snap/gui/qalculate-qt.svg000066400000000000000000000245461520501070600210450ustar00rootroot00000000000000 Yaru Icon Theme Template image/svg+xml Yaru Team, based on the Suru template by Sam Hewitt and original Suru designs by Matthieu James Yaru Icon Theme Template image/svg+xml apps qalculate qalculate-qt-5.11.0/snap/patches/000077500000000000000000000000001520501070600165575ustar00rootroot00000000000000qalculate-qt-5.11.0/snap/patches/snap-path.patch000066400000000000000000000076521520501070600215050ustar00rootroot00000000000000diff --git a/libqalculate/util.cc b/libqalculate/util.cc index 23b6da8..5d97581 100644 --- a/libqalculate/util.cc +++ b/libqalculate/util.cc @@ -556,91 +556,13 @@ string getOldLocalDir() { #endif } string getLocalDir() { - const char *homedir; - if((homedir = getenv("QALCULATE_USER_DIR")) != NULL) { - return homedir; - } -#ifdef _WIN32 - char exepath[MAX_PATH]; - GetModuleFileName(NULL, exepath, MAX_PATH); - string str(exepath); - str.resize(str.find_last_of('\\')); - str += "\\user"; -# ifdef WIN_PORTABLE - _mkdir(str.c_str()); - return str; -# else - if(dirExists(str)) return str; - char path[MAX_PATH]; - SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path); - str = path; - return str + "\\Qalculate"; -# endif -#else - if((homedir = getenv("XDG_CONFIG_HOME")) == NULL) { - return getHomeDir() + "/.config/qalculate"; - } - return string(homedir) + "/qalculate"; -#endif + return string(getenv("SNAP_USER_DATA")); } string getLocalDataDir() { - const char *homedir; - if((homedir = getenv("QALCULATE_USER_DIR")) != NULL) { - return homedir; - } -#ifdef _WIN32 - char exepath[MAX_PATH]; - GetModuleFileName(NULL, exepath, MAX_PATH); - string str(exepath); - str.resize(str.find_last_of('\\')); - str += "\\user"; -# ifdef WIN_PORTABLE - _mkdir(str.c_str()); - return str; -# else - if(dirExists(str)) return str; - char path[MAX_PATH]; - SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path); - str = path; - return str + "\\Qalculate"; -# endif -#else - if((homedir = getenv("XDG_DATA_HOME")) == NULL) { - return getHomeDir() + "/.local/share/qalculate"; - } - return string(homedir) + "/qalculate"; -#endif + return string(getenv("SNAP_USER_COMMON")); } string getLocalTmpDir() { - const char *homedir; - if((homedir = getenv("QALCULATE_USER_DIR")) != NULL) { - return homedir; - } -#ifdef _WIN32 - char exepath[MAX_PATH]; - GetModuleFileName(NULL, exepath, MAX_PATH); - string str(exepath); - str.resize(str.find_last_of('\\')); -# ifdef WIN_PORTABLE - str += "\\tmp"; - _mkdir(str.c_str()); - return str; -# else - str += "\\user"; - if(dirExists(str)) return str; - char path[MAX_PATH]; - SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path); - str = path; - str += "\\cache"; - _mkdir(str.c_str()); - return str + "\\Qalculate"; -# endif -#else - if((homedir = getenv("XDG_CACHE_HOME")) == NULL) { - return getHomeDir() + "/.cache/qalculate"; - } - return string(homedir) + "/qalculate"; -#endif + return string(getenv("SNAP_USER_DATA")); } bool move_file(const char *from_file, const char *to_file) { @@ -681,7 +603,10 @@ bool move_file(const char *from_file, const char *to_file) { string getPackageDataDir() { #ifndef WIN32 - return PACKAGE_DATA_DIR; + const char *snap = getenv("SNAP"); + string datadir(snap); + if(dirExists(datadir + "/usr/share/qalculate")) {datadir += "/usr/share";} else {datadir += "/share";} + return datadir; #else char exepath[MAX_PATH]; GetModuleFileName(NULL, exepath, MAX_PATH); @@ -703,15 +628,7 @@ string getGlobalDefinitionsDir() { return ""; #else # ifndef WIN32 - char buffer[500]; - if(getcwd(buffer, 500)) { - string dir = buffer; - if(dirExists(buildPath(dir, "libqalculate")) && fileExists(buildPath(dir, "data", "functions.xml"))) return buildPath(dir, "data"); - size_t i = dir.rfind("/"); - if(i != string::npos && i > 0 && i < dir.length() - 1) dir = dir.substr(0, i); - if(dirExists(buildPath(dir, "libqalculate")) && fileExists(buildPath(dir, "data", "functions.xml"))) return buildPath(dir, "data"); - } - return string(PACKAGE_DATA_DIR) + "/qalculate"; + return getPackageDataDir() + "/qalculate"; # else char exepath[MAX_PATH]; GetModuleFileName(NULL, exepath, MAX_PATH); @@ -742,7 +659,7 @@ string getGlobalDefinitionsDir() { string getPackageLocaleDir() { #ifndef WIN32 - return PACKAGE_LOCALE_DIR; + return getPackageDataDir() + "/locale"; #else char exepath[MAX_PATH]; GetModuleFileName(NULL, exepath, MAX_PATH); qalculate-qt-5.11.0/snap/patches/snap.patch000066400000000000000000000014011520501070600205350ustar00rootroot00000000000000diff --git a/qalculate-qt.pro b/qalculate-qt.pro index 5b3a2f8..22e4fc2 100644 --- a/qalculate-qt.pro +++ b/qalculate-qt.pro @@ -55,22 +55,6 @@ defineReplace(prependAll) { return($$result) } -!win32 { - TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/qalculate-qt_, .ts) - TRANSLATIONS_FILES = - qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { - qmfile = $$shadowed($$tsfile) - qmfile ~= s,.ts$,.qm, - qmdir = $$dirname(qmfile) - exists($$qmdir) { - mkpath($$qmdir)|error("Aborting.") - } - command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile - system($$command)|error("Failed to run: $$command") - TRANSLATIONS_FILES += $$qmfile - } -} - unix:!equals(COMPILE_RESOURCES,"yes"):!android:!macx { target.path = $$BINDIR qalculate-qt-5.11.0/snap/snapcraft.yaml000066400000000000000000000137601520501070600200040ustar00rootroot00000000000000name: qalculate-qt adopt-info: qalculate-qt title: Qalculate! (Qt) version: '5.11.0' license: GPL-2.0+ summary: The ultimate desktop calculator description: | Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. confinement: strict grade: stable base: core24 compression: lzo platforms: amd64: arm64: apps: qalculate-qt: extensions: - kde-neon-6 command: usr/bin/qalculate-qt environment: GNUPLOT_DRIVER_DIR: "$SNAP/usr/libexec/gnuplot/6.0" plugs: - home - browser-support qalc: extensions: - kde-neon-6 command: usr/bin/qalc environment: GNUPLOT_DRIVER_DIR: "$SNAP/usr/libexec/gnuplot/6.0" gnuplot: extensions: - kde-neon-6 command: usr/bin/gnuplot environment: GNUPLOT_DRIVER_DIR: "$SNAP/usr/libexec/gnuplot/6.0" parts: libqalculate: source: https://github.com/Qalculate/libqalculate.git source-tag: v5.11.0 source-depth: 1 plugin: autotools autotools-configure-parameters: - --prefix=/usr build-environment: - CXXFLAGS: -O2 -fsigned-char build-packages: - libncurses5-dev - libreadline-dev - libcurl4-gnutls-dev - libicu-dev - libxml2-dev - libgmp-dev - libmpfr-dev - doxygen - pkg-config stage-packages: - libmpfr6 - libgmp10 override-build: | patch -p1 < $CRAFT_STAGE/patches/snap-path.patch ./autogen.sh craftctl default echo Stripping qalc strip $CRAFT_PART_INSTALL/usr/bin/qalc after: - patches prime: - -include - -lib/pkgconfig - -lib/*.a - -share/doc - -usr/share/doc - -usr/share/lintian qalculate-qt: source: https://github.com/Qalculate/qalculate-qt/releases/download/v5.11.0/qalculate-qt-5.11.0.tar.gz source-checksum: sha512/9b0e3426bfb73815d0076e23d5e3c178dac8045338efd149fe5764d4eb0999b7d82274fe94ea06f60b8e0d0f151d25fc31f4412d3d869e2cb5e27a0be03cb661 plugin: qmake qmake-parameters: - COMPILE_RESOURCES=yes - PREFIX=/usr build-environment: - LD_LIBRARY_PATH: $LD_LIBRARY_PATH:/snap/kde-qt6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/kde-qt6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:/snap/kf6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/kf6-core24/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/core24/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/usr - PKG_CONFIG_PATH: $CRAFT_STAGE/usr/lib/pkgconfig:/snap/kde-qt6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pkgconfig - PATH: /snap/kde-qt6-core24-sdk/current/usr/bin/qt6:$PATH build-snaps: - core24 - kf6-core24 build-packages: - libgmp-dev - libxml2-dev after: - libqalculate - patches prime: - -share/applications override-pull: | craftctl default patch -p1 < $CRAFT_PROJECT_DIR/snap/patches/snap.patch gnuplot: source: https://downloads.sourceforge.net/gnuplot/gnuplot-6.0.4.tar.gz source-checksum: sha256/458d94769625e73d5f6232500f49cbadcb2b183380d43d2266a0f9701aeb9c5b plugin: autotools autotools-configure-parameters: - --prefix=/usr - --without-gd - --without-libcerf - --without-lua - --with-readline=gnu - --without-qt - --enable-wxwidgets after: - wxwidgets-sdk prime: - -share/applications - -share/doc - -share/man override-build: | craftctl default echo Stripping gnuplot strip $CRAFT_PART_INSTALL/usr/bin/gnuplot wxwidgets-sdk: source: https://github.com/wxWidgets/wxWidgets/releases/download/v3.2.8.1/wxWidgets-3.2.8.1.tar.bz2 source-checksum: sha256/ad0cf6c18815dcf1a6a89ad3c3d21a306cd7b5d99a602f77372ef1d92cb7d756 plugin: autotools autotools-configure-parameters: - --enable-shared - --disable-aui - --disable-html - --disable-mdi - --disable-mediactrl - --disable-propgrid - --disable-ribbon - --disable-richtext - --disable-webview - --disable-xrc - --enable-unicode - --with-gtk=3 - --without-opengl - --without-libnotify - --with-libjpeg - --with-libpng - --with-zlib - --prefix=/usr organize: snap/qalculate/current/usr: usr build-packages: - gcc - g++ - gettext - libcairo2-dev - libexpat1-dev - libgtk-3-dev - libjpeg-dev - libpng-dev - libsecret-1-dev - libtiff5-dev - libxtst-dev - zlib1g-dev override-build: | set \ -o errexit \ -o nounset; craftctl default; # Fix-up wx-config link ln \ --force \ --relative \ --symbolic \ "${CRAFT_PART_INSTALL}"/usr/lib/wx/config/* \ "${CRAFT_PART_INSTALL}"/usr/bin/wx-config; # Fix-up installation prefix # command line - How to use sed to replace only the first occurrence in a file? - Stack Overflow # https://stackoverflow.com/questions/148451/how-to-use-sed-to-replace-only-the-first-occurrence-in-a-file sed \ --follow-symlinks \ --in-place \ "0,/^prefix=.*\$/ s##prefix=\"${SNAPCRAFT_STAGE}\"/usr#" \ "${CRAFT_PART_INSTALL}"/usr/bin/wx-config; prime: - usr/lib/libwx_baseu-* - usr/lib/libwx-baseu_xml* - usr/lib/libwx_gtk3u_core* - usr/lib/libwx_gtk3u_adv* patches: source: snap/patches plugin: dump organize: "*": patches/ prime: - -* qalculate-qt-5.11.0/src/000077500000000000000000000000001520501070600147565ustar00rootroot00000000000000qalculate-qt-5.11.0/src/calendarconversiondialog.cpp000066400000000000000000000155221520501070600225260ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "calendarconversiondialog.h" CalendarConversionDialog::CalendarConversionDialog(QWidget *parent) : QDialog(parent), block_calendar_conversion(false) { setWindowTitle(tr("Calendar Conversion")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); CalendarSystem cs; QString str; for(int i = 0; i < 10; i++) { switch(i) { case 0: {str = tr("Gregorian"); cs = CALENDAR_GREGORIAN; break;} case 1: {str = tr("Hebrew"); cs = CALENDAR_HEBREW; break;} case 2: {str = tr("Islamic (Hijri)"); cs = CALENDAR_ISLAMIC; break;} case 3: {str = tr("Persian (Solar Hijri)"); cs = CALENDAR_PERSIAN; break;} case 4: {str = tr("Indian (National)"); cs = CALENDAR_INDIAN; break;} case 5: {str = tr("Chinese"); cs = CALENDAR_CHINESE; break;} case 6: {str = tr("Julian"); cs = CALENDAR_JULIAN; break;} case 7: {str = tr("Revised Julian (Milanković)"); cs = CALENDAR_MILANKOVIC; break;} case 8: {str = tr("Coptic"); cs = CALENDAR_COPTIC; break;} case 9: {str = tr("Ethiopian"); cs = CALENDAR_ETHIOPIAN; break;} } grid->addWidget(new QLabel(str, this), i, 0); if(cs == CALENDAR_CHINESE) { chineseStemCombo = new QComboBox(this); chineseBranchCombo = new QComboBox(this); chineseStemCombo->setProperty("QALCULATE INDEX", i); chineseStemCombo->setProperty("QALCULATE CALENDAR", cs); chineseBranchCombo->setProperty("QALCULATE INDEX", i); chineseBranchCombo->setProperty("QALCULATE CALENDAR", cs); for(int i2 = 1; i2 <= 5; i2++) chineseStemCombo->addItem(QString::fromStdString(chineseStemName(i2 * 2))); for(int i2 = 1; i2 <= 12; i2++) chineseBranchCombo->addItem(QString::fromStdString(chineseBranchName(i2))); grid->addWidget(chineseStemCombo, i, 1); grid->addWidget(chineseBranchCombo, i, 2); connect(chineseStemCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); connect(chineseBranchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); } else { yearEdit[i] = new QSpinBox(this); yearEdit[i]->setRange(INT_MIN, INT_MAX); yearEdit[i]->setProperty("QALCULATE INDEX", i); yearEdit[i]->setProperty("QALCULATE CALENDAR", cs); yearEdit[i]->setAlignment(Qt::AlignRight); grid->addWidget(yearEdit[i], i, 1, 1, 2); connect(yearEdit[i], SIGNAL(valueChanged(int)), this, SLOT(updateCalendars())); } monthCombo[i] = new QComboBox(this); dayCombo[i] = new QComboBox(this); for(int i2 = 1; i2 <= numberOfMonths(cs); i2++) monthCombo[i]->addItem(QString::fromStdString(monthName(i2, cs))); for(int i2 = 1; i2 <= 31; i2++) dayCombo[i]->addItem(QString::number(i2)); monthCombo[i]->setProperty("QALCULATE INDEX", i); monthCombo[i]->setProperty("QALCULATE CALENDAR", cs); dayCombo[i]->setProperty("QALCULATE INDEX", i); dayCombo[i]->setProperty("QALCULATE CALENDAR", cs); grid->addWidget(monthCombo[i], i, 3); grid->addWidget(dayCombo[i], i, 4); connect(monthCombo[i], SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); connect(dayCombo[i], SIGNAL(currentIndexChanged(int)), this, SLOT(updateCalendars())); } box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); } CalendarConversionDialog::~CalendarConversionDialog() {} void CalendarConversionDialog::updateCalendars() { if(block_calendar_conversion) return; block_calendar_conversion = true; int index = sender()->property("QALCULATE INDEX").toInt(); CalendarSystem cs = (CalendarSystem) sender()->property("QALCULATE CALENDAR").toInt(); long int y; if(cs == CALENDAR_CHINESE) { long int cy = chineseStemBranchToCycleYear((chineseStemCombo->currentIndex() * 2) + 1, chineseBranchCombo->currentIndex() + 1); if(cy <= 0) { QMessageBox::critical(this, tr("Error"), tr("The selected Chinese year does not exist.")); block_calendar_conversion = false; return; } y = chineseCycleYearToYear(79, cy); } else { y = yearEdit[index]->value(); } long int m = monthCombo[index]->currentIndex() + 1; long int d = dayCombo[index]->currentIndex() + 1; QalculateDateTime date; if(!calendarToDate(date, y, m, d, cs)) { QMessageBox::critical(this, tr("Error"), tr("Conversion to Gregorian calendar failed.")); block_calendar_conversion = false; return; } QString failed_str; for(int i = 0; i < 10; i++) { switch(i) { case 0: {cs = CALENDAR_GREGORIAN; break;} case 1: {cs = CALENDAR_HEBREW; break;} case 2: {cs = CALENDAR_ISLAMIC; break;} case 3: {cs = CALENDAR_PERSIAN; break;} case 4: {cs = CALENDAR_INDIAN; break;} case 5: {cs = CALENDAR_CHINESE; break;} case 6: {cs = CALENDAR_JULIAN; break;} case 7: {cs = CALENDAR_MILANKOVIC; break;} case 8: {cs = CALENDAR_COPTIC; break;} case 9: {cs = CALENDAR_ETHIOPIAN; break;} } if(dateToCalendar(date, y, m, d, cs) && y <= INT_MAX && y >= INT_MIN && m <= numberOfMonths(cs) && d <= 31) { if(cs == CALENDAR_CHINESE) { long int cy, yc, st, br; chineseYearInfo(y, cy, yc, st, br); chineseStemCombo->setCurrentIndex((st - 1) / 2); chineseBranchCombo->setCurrentIndex(br - 1); } else { yearEdit[i]->setValue(y); } monthCombo[i]->setCurrentIndex(m - 1); dayCombo[i]->setCurrentIndex(d - 1); } else { if(!failed_str.isEmpty()) failed_str += ", "; switch(i) { case 0: {failed_str += tr("Gregorian"); break;} case 1: {failed_str += tr("Hebrew"); break;} case 2: {failed_str += tr("Islamic (Hijri)"); break;} case 3: {failed_str += tr("Persian (Solar Hijri)"); break;} case 4: {failed_str += tr("Indian (National)"); break;} case 5: {failed_str += tr("Chinese"); break;} case 6: {failed_str += tr("Julian"); break;} case 7: {failed_str += tr("Revised Julian (Milanković)"); break;} case 8: {failed_str += tr("Coptic"); break;} case 9: {failed_str += tr("Ethiopian"); break;} } } } if(!failed_str.isEmpty()) QMessageBox::warning(this, tr("Error"), tr("Calendar conversion failed for: %1.").arg(failed_str)); block_calendar_conversion = false; } void CalendarConversionDialog::setDate(QalculateDateTime date) { block_calendar_conversion = true; yearEdit[0]->setValue(date.year()); monthCombo[0]->setCurrentIndex(date.month() - 1); block_calendar_conversion = false; dayCombo[0]->setCurrentIndex(date.day() - 1); } qalculate-qt-5.11.0/src/calendarconversiondialog.h000066400000000000000000000017401520501070600221700ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef CALENDAR_CONVERSION_DIALOG_H #define CALENDAR_CONVERSION_DIALOG_H #include #include class QComboBox; class QSpinBox; class CalendarConversionDialog : public QDialog { Q_OBJECT protected: QSpinBox *yearEdit[10]; QComboBox *monthCombo[10], *dayCombo[10], *chineseStemCombo, *chineseBranchCombo; bool block_calendar_conversion; protected slots: void updateCalendars(); public slots: void setDate(QalculateDateTime date); public: CalendarConversionDialog(QWidget *parent = NULL); virtual ~CalendarConversionDialog(); }; #endif //CALENDAR_CONVERSION_DIALOG_H qalculate-qt-5.11.0/src/csvdialog.cpp000066400000000000000000000211241520501070600174350ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "csvdialog.h" CSVDialog::CSVDialog(bool do_import, QWidget *parent, MathStructure *current_result, KnownVariable *var) : QDialog(parent), b_import(do_import), o_variable(var), m_result(current_result) { setWindowTitle(do_import ? tr("Import CSV File") : tr("Export CSV File")); if(m_result && !m_result->isVector()) m_result = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); int r = 0; if(!b_import) { QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); resultButton = new QRadioButton(tr("Current result"), this); group->addButton(resultButton, 0); resultButton->setChecked(m_result && !var); if(!m_result) resultButton->setEnabled(false); grid->addWidget(resultButton, r, 0); r++; variableButton = new QRadioButton(tr("Matrix/vector variable:"), this); group->addButton(variableButton, 1); variableButton->setChecked(!m_result || var); grid->addWidget(variableButton, r, 0); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(exportTypeToggled(QAbstractButton*, bool))); nameEdit = new QLineEdit(this); if(var) nameEdit->setText(QString::fromStdString(var->name())); grid->addWidget(nameEdit, r, 1); r++; if(var) { nameEdit->hide(); variableButton->hide(); resultButton->hide(); } } grid->addWidget(new QLabel(tr("File:"), this), r, 0); fileEdit = new QLineEdit(this); QAction *action = fileEdit->addAction(LOAD_ICON("document-open"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) fileEdit->setTextMargins(0, 0, 22, 0); # endif #endif connect(action, SIGNAL(triggered()), this, SLOT(onSelectFile())); connect(fileEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFileEdited())); grid->addWidget(fileEdit, r, 1); r++; if(b_import) { grid->addWidget(new QLabel(tr("Import as"), this), r, 0); QHBoxLayout *hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 1); r++; QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); matrixButton = new QRadioButton(tr("matrix"), this); group->addButton(matrixButton); matrixButton->setChecked(true); hbox->addWidget(matrixButton); vectorButton = new QRadioButton(tr("vectors"), this); group->addButton(vectorButton); hbox->addWidget(vectorButton); hbox->addStretch(1); grid->addWidget(new QLabel(tr("Name:"), this), r, 0); nameEdit = new QLineEdit(this); grid->addWidget(nameEdit, r, 1); r++; grid->addWidget(new QLabel(tr("First row:"), this), r, 0); rowSpin = new QSpinBox(this); rowSpin->setRange(1, INT_MAX); rowSpin->setValue(1); grid->addWidget(rowSpin, r, 1); r++; headingsBox = new QCheckBox(tr("Includes headings"), this); headingsBox->setChecked(true); grid->addWidget(headingsBox, r, 1); r++; } grid->addWidget(new QLabel(tr("Delimiter:"), this), r, 0); delimiterCombo = new QComboBox(this); delimiterCombo->addItem(tr("Comma"), ","); delimiterCombo->addItem(tr("Tabulator"), "\t"); delimiterCombo->addItem(tr("Semicolon"), ";"); delimiterCombo->addItem(tr("Space"), " "); delimiterCombo->addItem(tr("Other"), QString()); grid->addWidget(delimiterCombo, r, 1); r++; connect(delimiterCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onDelimiterChanged(int))); delimiterEdit = new QLineEdit(this); delimiterEdit->setEnabled(false); grid->addWidget(delimiterEdit, r, 1); r++; connect(delimiterEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onDelimiterEdited())); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); okButton = buttonBox->button(QDialogButtonBox::Ok); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); fileEdit->setFocus(); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } CSVDialog::~CSVDialog() {} void CSVDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } enableDisableOk(); } void CSVDialog::enableDisableOk() { okButton->setEnabled(((!b_import && !variableButton->isChecked()) || !nameEdit->text().trimmed().isEmpty()) && !fileEdit->text().trimmed().isEmpty() && (!delimiterCombo->currentData().toString().isEmpty() || !delimiterEdit->text().isEmpty())); } void CSVDialog::onSelectFile() { QString str; if(b_import) str = QFileDialog::getOpenFileName(this, QString(), fileEdit->text()); else str = QFileDialog::getSaveFileName(this, QString(), fileEdit->text()); if(!str.isEmpty()) { fileEdit->setText(str); enableDisableOk(); } } void CSVDialog::exportTypeToggled(QAbstractButton *w, bool b) { if(!b) return; nameEdit->setEnabled(w == variableButton); enableDisableOk(); } void CSVDialog::onDelimiterEdited() { enableDisableOk(); } void CSVDialog::onFileEdited() { enableDisableOk(); } void CSVDialog::onDelimiterChanged(int i) { delimiterEdit->setEnabled(delimiterCombo->itemData(i).toString().isEmpty()); enableDisableOk(); } bool CSVDialog::importExport() { std::string namestr = nameEdit->text().trimmed().toStdString(); if(b_import) { if(CALCULATOR->variableNameTaken(namestr)) { if(QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } } if(!CALCULATOR->importCSV(fileEdit->text().trimmed().toLocal8Bit().data(), rowSpin->value(), headingsBox->isChecked(), delimiterCombo->currentData().toString().isEmpty() ? delimiterEdit->text().toStdString() : delimiterCombo->currentData().toString().toStdString(), matrixButton->isChecked(), namestr)) { QMessageBox::critical(this, tr("Error"), tr("Could not import from file \n%1").arg(fileEdit->text()), QMessageBox::Ok); settings->displayMessages(this); fileEdit->setFocus(); return false; } } else { const MathStructure *m; if(o_variable) { m = &o_variable->get(); } else if(resultButton->isChecked() && m_result) { m = m_result; } else { Variable *var = CALCULATOR->getActiveVariable(namestr); if(!var || !var->isKnown() || !((KnownVariable*) var)->get().isVector()) { QMessageBox::critical(this, tr("Error"), tr("No matrix or vector variable with the entered name was found."), QMessageBox::Ok); nameEdit->setFocus(); return false; } m = &((KnownVariable*) var)->get(); } CALCULATOR->startControl(600000); if(!CALCULATOR->exportCSV(*m, fileEdit->text().trimmed().toLocal8Bit().data(), delimiterCombo->currentData().toString().isEmpty() ? delimiterEdit->text().toStdString() : delimiterCombo->currentData().toString().toStdString())) { QMessageBox::critical(this, tr("Error"), tr("Could not export to file \n%1").arg(fileEdit->text()), QMessageBox::Ok); settings->displayMessages(this); fileEdit->setFocus(); CALCULATOR->stopControl(); return false; } CALCULATOR->stopControl(); } settings->displayMessages(this); return true; } bool CSVDialog::importCSVFile(QWidget *parent) { CSVDialog *d = new CSVDialog(true, parent); bool b = false; while(d->exec() == QDialog::Accepted) { if(d->importExport()) {b = true; break;} } d->deleteLater(); return b; } bool CSVDialog::exportCSVFile(QWidget *parent, MathStructure *current_result, KnownVariable *var) { CSVDialog *d = new CSVDialog(false, parent, current_result, var); bool b = false; while(d->exec() == QDialog::Accepted) { if(d->importExport()) {b = true; break;} } d->deleteLater(); return b; } qalculate-qt-5.11.0/src/csvdialog.h000066400000000000000000000030161520501070600171020ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef CSV_DIALOG_H #define CSV_DIALOG_H #include #include class QLineEdit; class QRadioButton; class QComboBox; class QCheckBox; class QSpinBox; class QPushButton; class QAbstractButton; class CSVDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *delimiterEdit, *fileEdit; QComboBox *delimiterCombo; QRadioButton *resultButton, *variableButton, *matrixButton, *vectorButton; QPushButton *okButton; QCheckBox *headingsBox; QSpinBox *rowSpin; bool b_import; KnownVariable *o_variable; MathStructure *m_result; public: CSVDialog(bool do_import, QWidget *parent = NULL, MathStructure *current_result = NULL, KnownVariable *var = NULL); virtual ~CSVDialog(); bool importExport(); static bool importCSVFile(QWidget *parent); static bool exportCSVFile(QWidget *parent, MathStructure *current_result = NULL, KnownVariable *var = NULL); protected slots: void onNameEdited(const QString&); void enableDisableOk(); void exportTypeToggled(QAbstractButton*, bool); void onSelectFile(); void onDelimiterEdited(); void onFileEdited(); void onDelimiterChanged(int); }; #endif //CSV_DIALOG_H qalculate-qt-5.11.0/src/dataseteditdialog.cpp000066400000000000000000000671451520501070600211520ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "functioneditdialog.h" #include "dataseteditdialog.h" DataPropertyEditDialog::DataPropertyEditDialog(QWidget *parent) : QDialog(parent) { o_property = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); grid->addWidget(new QLabel(tr("Description:"), this), 2, 0, 1, 2); descriptionEdit = new SmallTextEdit(3, this); grid->addWidget(descriptionEdit, 3, 0, 1, 2); grid->addWidget(new QLabel(tr("Value type:"), this), 4, 0); typeCombo = new QComboBox(this); typeCombo->setEditable(false); typeCombo->addItem(tr("Expression"), PROPERTY_EXPRESSION); typeCombo->addItem(tr("Number"), PROPERTY_NUMBER); typeCombo->addItem(tr("Text"), PROPERTY_STRING); typeCombo->setCurrentIndex(0); grid->addWidget(typeCombo, 4, 1); grid->addWidget(new QLabel(tr("Unit expression:"), this), 5, 0); unitEdit = new MathLineEdit(this, true); grid->addWidget(unitEdit, 5, 1); keyBox = new QCheckBox(tr("Use as key"), this); grid->addWidget(keyBox, 6, 0, 1, 2); caseBox = new QCheckBox(tr("Case sensitive value"), this); grid->addWidget(caseBox, 7, 0, 1, 2); approxBox = new QCheckBox(tr("Approximate value"), this); grid->addWidget(approxBox, 8, 0, 1, 2); bracketsBox = new QCheckBox(tr("Value uses brackets"), this); grid->addWidget(bracketsBox, 9, 0, 1, 2); bracketsBox->hide(); hideBox = new QCheckBox(tr("Hide"), this); grid->addWidget(hideBox, 10, 0, 1, 2); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); nameEdit->setFocus(); typeChanged(0); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(onPropertyChanged())); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onPropertyChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(unitEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPropertyChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(caseBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(keyBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(approxBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(bracketsBox, SIGNAL(clicked()), this, SLOT(onPropertyChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataPropertyEditDialog::~DataPropertyEditDialog() {} void DataPropertyEditDialog::typeChanged(int i) { keyBox->setEnabled(i != 0); caseBox->setEnabled(i == 2); approxBox->setEnabled(i != 2); bracketsBox->setEnabled(i != 2); unitEdit->setEnabled(i != 2); } void DataPropertyEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(-1, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_property, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onPropertyChanged(); } void DataPropertyEditDialog::onPropertyChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty()); } DataProperty *DataPropertyEditDialog::createProperty(DataSet *ds) { DataProperty *dp = new DataProperty(ds); modifyProperty(dp); return dp; } bool DataPropertyEditDialog::modifyProperty(DataProperty *dp) { dp->setUserModified(true); dp->setTitle(titleEdit->text().trimmed().toStdString()); dp->setUnit(settings->unlocalizeExpression(unitEdit->text().trimmed().toStdString())); dp->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); dp->setHidden(hideBox->isChecked()); dp->setKey(keyBox->isChecked()); dp->setApproximate(approxBox->isChecked()); dp->setCaseSensitive(caseBox->isChecked()); dp->setUsesBrackets(bracketsBox->isChecked()); dp->setPropertyType((PropertyType) typeCombo->currentData().toInt()); if(namesEditDialog) namesEditDialog->modifyNames(dp, nameEdit->text()); else NamesEditDialog::modifyName(dp, nameEdit->text()); return true; } void DataPropertyEditDialog::setProperty(DataProperty *dp) { o_property = dp; name_edited = false; bool read_only = dp->parentSet() && !dp->parentSet()->isLocal(); nameEdit->setText(QString::fromStdString(dp->getName())); if(namesEditDialog) namesEditDialog->setNames(dp, nameEdit->text()); unitEdit->setText(QString::fromStdString(settings->localizeExpression(dp->getUnitString(), true))); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(dp->description())); descriptionEdit->blockSignals(false); typeCombo->setCurrentIndex(typeCombo->findData(dp->propertyType())); titleEdit->setText(QString::fromStdString(dp->title(false))); hideBox->setChecked(dp->isHidden()); keyBox->setChecked(dp->isKey()); approxBox->setChecked(dp->isApproximate()); caseBox->setChecked(dp->isCaseSensitive()); bracketsBox->setChecked(dp->usesBrackets()); descriptionEdit->setReadOnly(read_only); titleEdit->setReadOnly(read_only); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); unitEdit->setReadOnly(read_only); } bool DataPropertyEditDialog::editProperty(QWidget *parent, DataProperty *dp) { DataPropertyEditDialog *d = new DataPropertyEditDialog(parent); d->setWindowTitle(tr("Edit Data Property")); d->setProperty(dp); while(d->exec() == QDialog::Accepted) { if(d->modifyProperty(dp)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataProperty *DataPropertyEditDialog::newProperty(QWidget *parent, DataSet *ds) { DataPropertyEditDialog *d = new DataPropertyEditDialog(parent); d->setWindowTitle(tr("Edit Data Property")); DataProperty *dp = NULL; while(d->exec() == QDialog::Accepted) { dp = d->createProperty(ds); if(dp) break; } d->deleteLater(); return dp; } DataSetEditDialog::DataSetEditDialog(QWidget *parent) : QDialog(parent) { o_dataset = NULL; selected_property = NULL; name_edited = false; file_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); tabs->addTab(w1, tr("General")); tabs->addTab(w2, tr("Properties")); tabs->addTab(w3, tr("Function")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 0, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 0, 1); grid->addWidget(new QLabel(tr("Data file:"), this), 1, 0); fileEdit = new QLineEdit(this); grid->addWidget(fileEdit, 1, 1); grid->addWidget(new QLabel(tr("Description:"), this), 2, 0, 1, 2); descriptionEdit = new SmallTextEdit(3, this); grid->addWidget(descriptionEdit, 3, 0, 1, 2); grid->addWidget(new QLabel(tr("Copyright:"), this), 4, 0, 1, 2); copyrightEdit = new SmallTextEdit(3, this); grid->addWidget(copyrightEdit, 5, 0, 1, 2); grid = new QGridLayout(w2); propertiesView = new QTreeWidget(this); propertiesView->setSelectionMode(QAbstractItemView::SingleSelection); propertiesView->setRootIsDecorated(false); propertiesView->setAllColumnsShowFocus(true); propertiesView->setColumnCount(3); propertiesView->header()->setStretchLastSection(false); propertiesView->headerItem()->setText(0, tr("Title")); propertiesView->headerItem()->setText(1, tr("Name")); propertiesView->headerItem()->setText(2, tr("Type")); propertiesView->header()->setSectionResizeMode(0, QHeaderView::Stretch); propertiesView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); propertiesView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); grid->addWidget(propertiesView, 0, 0); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addStretch(1); addButton = new QPushButton(tr("Add"), this); hbox->addWidget(addButton); editButton = new QPushButton(tr("Edit"), this); editButton->setEnabled(false); hbox->addWidget(editButton); delButton = new QPushButton(tr("Remove"), this); delButton->setEnabled(false); hbox->addWidget(delButton); grid->addLayout(hbox, 1, 0); grid = new QGridLayout(w3); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Object argument name:"), this), 1, 0); arg1Edit = new QLineEdit(this); grid->addWidget(arg1Edit, 1, 1); grid->addWidget(new QLabel(tr("Property argument name:"), this), 2, 0); arg2Edit = new QLineEdit(this); grid->addWidget(arg2Edit, 2, 1); grid->addWidget(new QLabel(tr("Default property:"), this), 3, 0, Qt::AlignTop); default2Edit = new QLineEdit(this); default2Edit->setText("info"); grid->addWidget(default2Edit, 3, 1, Qt::AlignTop); grid->setRowStretch(3, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); titleEdit->setFocus(); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(fileEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFileEdited(const QString&))); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTitleEdited(const QString&))); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onDatasetChanged())); connect(copyrightEdit, SIGNAL(textChanged()), this, SLOT(onDatasetChanged())); connect(arg1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(arg2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(default2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onDatasetChanged())); connect(addButton, SIGNAL(clicked()), this, SLOT(addProperty())); connect(editButton, SIGNAL(clicked()), this, SLOT(editProperty())); connect(delButton, SIGNAL(clicked()), this, SLOT(delProperty())); connect(propertiesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedPropertyChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(propertiesView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editProperty())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataSetEditDialog::~DataSetEditDialog() { for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i]) delete tmp_props[i]; } tmp_props.clear(); tmp_props_orig.clear(); } void DataSetEditDialog::selectedPropertyChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { if(!item) { editButton->setEnabled(false); delButton->setEnabled(false); selected_property = NULL; return; } selected_property = (DataProperty*) item->data(0, Qt::UserRole).value(); editButton->setEnabled(true); delButton->setEnabled(!nameEdit->isReadOnly()); } void DataSetEditDialog::setPropertyItemText(QTreeWidgetItem *item, DataProperty *dp) { QString str; switch(dp->propertyType()) { case PROPERTY_STRING: { str += tr("text"); break; } case PROPERTY_NUMBER: { if(dp->isApproximate()) { str += tr("approximate"); str += " "; } str += tr("number"); break; } case PROPERTY_EXPRESSION: { if(dp->isApproximate()) { str += tr("approximate"); str += " "; } str += tr("expression"); break; } } if(dp->isKey()) { str += " ("; str += tr("key"); str += ")"; } item->setText(0, QString::fromStdString(dp->title(false))); item->setText(1, QString::fromStdString(dp->getName())); item->setText(2, str); } void DataSetEditDialog::addProperty() { DataProperty *dp = DataPropertyEditDialog::newProperty(this, o_dataset); if(dp) { tmp_props.push_back(dp); tmp_props_orig.push_back(NULL); QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); setPropertyItemText(item, dp); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); propertiesView->clearSelection(); propertiesView->setCurrentItem(item); item->setSelected(true); onDatasetChanged(); } } void DataSetEditDialog::editProperty() { if(!selected_property) return; DataProperty *dp = selected_property; if(DataPropertyEditDialog::editProperty(this, dp)) { QTreeWidgetItem *item = propertiesView->currentItem(); setPropertyItemText(item, dp); onDatasetChanged(); } } void DataSetEditDialog::delProperty() { if(!selected_property || !selected_property->isUserModified()) return; for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i] == selected_property) { delete tmp_props[i]; if(tmp_props_orig[i]) { tmp_props[i] = NULL; } else { tmp_props.erase(tmp_props.begin() + i); tmp_props_orig.erase(tmp_props_orig.begin() + i); } QTreeWidgetItem *item = propertiesView->currentItem(); if(item) delete item; onDatasetChanged(); break; } } } void DataSetEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_FUNCTION, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_dataset, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); if(!file_edited) fileEdit->setText(nameEdit->text()); name_edited = false; onDatasetChanged(); } void DataSetEditDialog::onFileEdited(const QString&) { file_edited = true; onDatasetChanged(); } void DataSetEditDialog::onTitleEdited(const QString &str) { if(!file_edited) { QString sfile = str.simplified().toLower(); sfile.replace(" ", "_"); fileEdit->setText(sfile); } if(!name_edited && !namesEditDialog) { QString sname = str.simplified().toLower(); sname.replace(" ", "_"); if(!sname.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(sname.trimmed().toStdString())) { sname = QString::fromStdString(CALCULATOR->convertToValidFunctionName(sname.trimmed().toStdString())); } nameEdit->setText(sname); } onDatasetChanged(); } void DataSetEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(str.trimmed().toStdString()))); } onDatasetChanged(); name_edited = true; } void DataSetEditDialog::onDatasetChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && !fileEdit->text().trimmed().isEmpty()); } DataSet *DataSetEditDialog::createDataset(MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; MathFunction *func = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString())) { func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { *replaced_item = func; } } DataSet *ds_atom = CALCULATOR->getDataSet("atom"); DataSet *ds = new DataSet(ds_atom ? ds_atom->category() : tr("Data Sets").toStdString(), "", fileEdit->text().trimmed().toStdString(), titleEdit->text().trimmed().toStdString(), descriptionEdit->toPlainText().trimmed().toStdString(), true); Argument *arg = ds->getArgumentDefinition(1); if(arg) { if(arg1Edit->text().trimmed().isEmpty()) arg->setName(tr("Object").toStdString()); else arg->setName(arg1Edit->text().trimmed().toStdString()); } arg = ds->getArgumentDefinition(1); if(arg) { if(arg2Edit->text().trimmed().isEmpty()) arg->setName(tr("Property").toStdString()); else arg->setName(arg2Edit->text().trimmed().toStdString()); } ds->setDefaultProperty(default2Edit->text().trimmed().toStdString()); ds->setCopyright(copyrightEdit->toPlainText().trimmed().toStdString()); for(size_t i = 0; i < tmp_props.size();) { if(!tmp_props[i]) { if(tmp_props_orig[i]) ds->delProperty(tmp_props_orig[i]); i++; } else if(tmp_props[i]->isUserModified()) { if(tmp_props_orig[i]) { tmp_props_orig[i]->set(*tmp_props[i]); i++; } else { ds->addProperty(tmp_props[i]); tmp_props.erase(tmp_props.begin() + i); } } else { i++; } } if(namesEditDialog) namesEditDialog->modifyNames(ds, nameEdit->text()); else NamesEditDialog::modifyName(ds, nameEdit->text()); CALCULATOR->addDataSet(ds); ds->loadObjects(); ds->setObjectsLoaded(true); return ds; } bool DataSetEditDialog::modifyDataset(DataSet *ds, MathFunction **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString(), ds)) { MathFunction *func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { *replaced_item = func; } } if(ds->isLocal()) ds->setDefaultDataFile(fileEdit->text().trimmed().toStdString()); ds->setTitle(titleEdit->text().trimmed().toStdString()); ds->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); Argument *arg = ds->getArgumentDefinition(1); if(arg) { if(arg1Edit->text().trimmed().isEmpty()) arg->setName(tr("Object").toStdString()); else arg->setName(arg1Edit->text().trimmed().toStdString()); } arg = ds->getArgumentDefinition(1); if(arg) { if(arg2Edit->text().trimmed().isEmpty()) arg->setName(tr("Property").toStdString()); else arg->setName(arg2Edit->text().trimmed().toStdString()); } ds->setDefaultProperty(default2Edit->text().trimmed().toStdString()); ds->setCopyright(copyrightEdit->toPlainText().trimmed().toStdString()); for(size_t i = 0; i < tmp_props.size();) { if(!tmp_props[i]) { if(tmp_props_orig[i]) ds->delProperty(tmp_props_orig[i]); i++; } else if(tmp_props[i]->isUserModified()) { if(tmp_props_orig[i]) { tmp_props_orig[i]->set(*tmp_props[i]); i++; } else { ds->addProperty(tmp_props[i]); tmp_props.erase(tmp_props.begin() + i); } } else { i++; } } if(namesEditDialog) namesEditDialog->modifyNames(ds, nameEdit->text()); else NamesEditDialog::modifyName(ds, nameEdit->text()); return true; } void DataSetEditDialog::setDataset(DataSet *ds) { o_dataset = ds; name_edited = false; for(size_t i = 0; i < tmp_props.size(); i++) { if(tmp_props[i]) delete tmp_props[i]; } tmp_props.clear(); tmp_props_orig.clear(); bool read_only = !ds->isLocal(); nameEdit->setText(QString::fromStdString(ds->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(ds, nameEdit->text()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(ds->description())); descriptionEdit->blockSignals(false); copyrightEdit->blockSignals(true); copyrightEdit->setPlainText(QString::fromStdString(ds->copyright())); copyrightEdit->blockSignals(false); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); while(dp) { tmp_props.push_back(new DataProperty(*dp)); tmp_props_orig.push_back(dp); dp = ds->getNextProperty(&it); } titleEdit->setText(QString::fromStdString(ds->title(false))); fileEdit->setText(QString::fromStdString(ds->defaultDataFile())); default2Edit->setText(QString::fromStdString(ds->defaultProperty())); Argument *arg = ds->getArgumentDefinition(1); if(arg) arg1Edit->setText(QString::fromStdString(arg->name())); arg = ds->getArgumentDefinition(2); if(arg) arg2Edit->setText(QString::fromStdString(arg->name())); descriptionEdit->setReadOnly(read_only); copyrightEdit->setReadOnly(read_only); arg1Edit->setReadOnly(read_only); arg2Edit->setReadOnly(read_only); default2Edit->setReadOnly(read_only); fileEdit->setReadOnly(read_only); file_edited = true; titleEdit->setReadOnly(read_only); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); addButton->setEnabled(!read_only); editButton->setEnabled(false); delButton->setEnabled(false); selected_property = NULL; propertiesView->clear(); propertiesView->setColumnCount(3); propertiesView->headerItem()->setText(0, tr("Title")); propertiesView->headerItem()->setText(1, tr("Name")); propertiesView->headerItem()->setText(2, tr("Type")); for(size_t i = 0; i < tmp_props.size(); i++) { DataProperty *dp = tmp_props[i]; if(dp) { QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); setPropertyItemText(item, dp); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); if(i == 0) item->setSelected(true); } } } bool DataSetEditDialog::editDataset(QWidget *parent, DataSet *ds, MathFunction **replaced_item) { DataSetEditDialog *d = new DataSetEditDialog(parent); d->setWindowTitle(tr("Edit Data Set")); d->setDataset(ds); while(d->exec() == QDialog::Accepted) { if(d->modifyDataset(ds, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataSet *DataSetEditDialog::newDataset(QWidget *parent, MathFunction **replaced_item) { DataSetEditDialog *d = new DataSetEditDialog(parent); d->setWindowTitle(tr("New Data Set")); DataSet *ds = NULL; while(d->exec() == QDialog::Accepted) { ds = d->createDataset(replaced_item); if(ds) break; } d->deleteLater(); return ds; } DataObjectEditDialog::DataObjectEditDialog(DataSet *o, QWidget *parent) : QDialog(parent), ds(o) { QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(dp->title())), this), r, 0); QLineEdit *w; if(dp->propertyType() == PROPERTY_EXPRESSION) w = new MathLineEdit(this); else w = new QLineEdit(this); valueEdit << w; grid->addWidget(w, r, 1); connect(w, SIGNAL(textEdited(const QString&)), this, SLOT(onObjectChanged())); grid->addWidget(new QLabel(QString::fromStdString(settings->localizeExpression(dp->getUnitString(), true)), this), r, 2); QComboBox *combo = NULL; if(dp->propertyType() != PROPERTY_STRING) { combo = new QComboBox(this); combo->setEditable(false); combo->addItem(tr("Default")); combo->addItem(tr("Approximate")); combo->addItem(tr("Exact")); combo->setCurrentIndex(0); grid->addWidget(combo, r, 3); connect(combo, SIGNAL(activated(int)), this, SLOT(onObjectChanged())); } approxCombo << combo; r++; dp = ds->getNextProperty(&it); } if(!valueEdit.isEmpty()) valueEdit.at(0)->setFocus(); grid->setColumnStretch(1, 1); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } DataObjectEditDialog::~DataObjectEditDialog() {} void DataObjectEditDialog::onObjectChanged() { okButton->setEnabled(!valueEdit.isEmpty() && !valueEdit.at(0)->isReadOnly()); } void DataObjectEditDialog::setObject(DataObject *obj) { DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { QLineEdit *w = valueEdit.at(r); QComboBox *combo = approxCombo.at(r); int iapprox = -1; w->setReadOnly(!obj->isUserModified()); w->setText(QString::fromStdString(settings->localizeExpression(obj->getProperty(dp, &iapprox)))); if(combo) { combo->setCurrentIndex(iapprox < 0 ? 0 : (iapprox > 0 ? 2 : 1)); } r++; dp = ds->getNextProperty(&it); } okButton->setEnabled(false); } DataObject *DataObjectEditDialog::createObject() { DataPropertyIter it; DataObject *obj = new DataObject(ds); ds->addObject(obj); DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { if(valueEdit.at(r)->text().trimmed().isEmpty()) { obj->eraseProperty(dp); } else { obj->setProperty(dp, settings->unlocalizeExpression(valueEdit.at(r)->text().trimmed().toStdString()), approxCombo.at(r) ? approxCombo.at(r)->currentIndex() - 1 : -1); } r++; dp = ds->getNextProperty(&it); } obj->setUserModified(); return obj; } bool DataObjectEditDialog::modifyObject(DataObject *obj) { DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int r = 0; while(dp) { if(valueEdit.at(r)->text().trimmed().isEmpty()) { obj->eraseProperty(dp); } else { obj->setProperty(dp, settings->unlocalizeExpression(valueEdit.at(r)->text().trimmed().toStdString()), approxCombo.at(r) ? approxCombo.at(r)->currentIndex() - 1 : -1); } r++; dp = ds->getNextProperty(&it); } obj->setUserModified(); return true; } bool DataObjectEditDialog::editObject(QWidget *parent, DataObject *obj) { DataObjectEditDialog *d = new DataObjectEditDialog(obj->parentSet(), parent); d->setWindowTitle(tr("Edit Data Object")); d->setObject(obj); while(d->exec() == QDialog::Accepted) { if(d->modifyObject(obj)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } DataObject *DataObjectEditDialog::newObject(QWidget *parent, DataSet *o) { DataObjectEditDialog *d = new DataObjectEditDialog(o, parent); d->setWindowTitle(tr("New Data Object")); DataObject *obj = NULL; while(d->exec() == QDialog::Accepted) { obj = d->createObject(); if(obj) break; } d->deleteLater(); return obj; } qalculate-qt-5.11.0/src/dataseteditdialog.h000066400000000000000000000065101520501070600206040ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef DATASETEDIT_DIALOG_H #define DATASETEDIT_DIALOG_H #include #include #include class QLineEdit; class QPlainTextEdit; class QTabWidget; class NamesEditDialog; class QPushButton; class QComboBox; class QCheckBox; class QTreeWidget; class QTreeWidgetItem; class DataSetEditDialog : public QDialog { Q_OBJECT protected: QTabWidget *tabs; QLineEdit *nameEdit, *titleEdit, *fileEdit, *arg1Edit, *arg2Edit, *default2Edit; QPlainTextEdit *descriptionEdit, *copyrightEdit; QTreeWidget *propertiesView; QPushButton *okButton, *addButton, *delButton, *editButton; NamesEditDialog *namesEditDialog; DataSet *o_dataset; std::vector tmp_props; std::vector tmp_props_orig; bool name_edited, file_edited; DataProperty *selected_property = NULL; void setPropertyItemText(QTreeWidgetItem*, DataProperty*); protected slots: void onDatasetChanged(); void onNameEdited(const QString&); void onTitleEdited(const QString&); void onFileEdited(const QString&); void editNames(); void addProperty(); void editProperty(); void delProperty(); void selectedPropertyChanged(QTreeWidgetItem*, QTreeWidgetItem*); public: DataSetEditDialog(QWidget *parent = NULL); virtual ~DataSetEditDialog(); DataSet *createDataset(MathFunction **replaced_item = NULL); bool modifyDataset(DataSet *ds, MathFunction **replaced_item = NULL); void setDataset(DataSet *ds); static bool editDataset(QWidget *parent, DataSet *ds, MathFunction **replaced_item = NULL); static DataSet *newDataset(QWidget *parent, MathFunction **replaced_item = NULL); }; class DataPropertyEditDialog : public QDialog { Q_OBJECT protected: QPushButton *okButton; QLineEdit *nameEdit, *titleEdit, *unitEdit; QComboBox *typeCombo; QPlainTextEdit *descriptionEdit; QCheckBox *hideBox, *approxBox, *bracketsBox, *keyBox, *caseBox; NamesEditDialog *namesEditDialog; DataProperty *o_property; bool name_edited; protected slots: void onPropertyChanged(); void editNames(); void typeChanged(int); public: DataPropertyEditDialog(QWidget *parent = NULL); virtual ~DataPropertyEditDialog(); DataProperty *createProperty(DataSet *ds); bool modifyProperty(DataProperty *dp); void setProperty(DataProperty *dp); static bool editProperty(QWidget *parent, DataProperty *dp); static DataProperty *newProperty(QWidget *parent, DataSet *ds); }; class DataObjectEditDialog : public QDialog { Q_OBJECT protected: QVector valueEdit; QVector approxCombo; QPushButton *okButton; DataSet *ds; protected slots: void onObjectChanged(); public: DataObjectEditDialog(DataSet*, QWidget *parent = NULL); virtual ~DataObjectEditDialog(); DataObject *createObject(); bool modifyObject(DataObject*); void setObject(DataObject*); static bool editObject(QWidget *parent, DataObject*); static DataObject *newObject(QWidget *parent, DataSet*); }; #endif //DATASETEDIT_DIALOG_H qalculate-qt-5.11.0/src/datasetsdialog.cpp000066400000000000000000000372361520501070600204650ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "datasetsdialog.h" #include "dataseteditdialog.h" DataSetsDialog::DataSetsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { selected_dataset = NULL; selected_object = NULL; QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Data Sets")); hsplitter = new QSplitter(Qt::Horizontal, this); topbox->addWidget(hsplitter, 1); vsplitter_l = new QSplitter(Qt::Vertical, this); vsplitter_r = new QSplitter(Qt::Vertical, this); hsplitter->addWidget(vsplitter_l); hsplitter->addWidget(vsplitter_r); QWidget *w = new QWidget(this); QVBoxLayout *box = new QVBoxLayout(w); vsplitter_l->addWidget(w); box->addWidget(new QLabel(tr("Data sets:"))); datasetsView = new QTreeWidget(this); datasetsView->setSelectionMode(QAbstractItemView::SingleSelection); datasetsView->setRootIsDecorated(false); datasetsView->header()->hide(); datasetsView->setColumnCount(1); box->addWidget(datasetsView); QHBoxLayout *hbox = new QHBoxLayout(); hbox->addStretch(1); addDSButton = new QPushButton(tr("New…"), this); hbox->addWidget(addDSButton); editDSButton = new QPushButton(tr("Edit…"), this); editDSButton->setEnabled(false); hbox->addWidget(editDSButton); delDSButton = new QPushButton(tr("Delete"), this); delDSButton->setEnabled(false); hbox->addWidget(delDSButton); box->addLayout(hbox); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_l->addWidget(w); box->addWidget(new QLabel(tr("Objects:"))); objectsView = new QTreeWidget(this); objectsView->setSelectionMode(QAbstractItemView::SingleSelection); objectsView->setRootIsDecorated(false); objectsView->setAllColumnsShowFocus(true); objectsView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); objectsView->header()->hide(); objectsView->setColumnCount(1); box->addWidget(objectsView); hbox = new QHBoxLayout(); hbox->addStretch(1); addObjButton = new QPushButton(tr("New…"), this); addObjButton->setEnabled(false); hbox->addWidget(addObjButton); editObjButton = new QPushButton(tr("Edit…"), this); editObjButton->setEnabled(false); hbox->addWidget(editObjButton); delObjButton = new QPushButton(tr("Delete"), this); delObjButton->setEnabled(false); hbox->addWidget(delObjButton); box->addLayout(hbox); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_r->addWidget(w); box->addWidget(new QLabel(tr("Data set description:"))); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); box->addWidget(descriptionView); w = new QWidget(this); box = new QVBoxLayout(w); vsplitter_r->addWidget(w); box->addWidget(new QLabel(tr("Object attributes:"))); propertiesView = new QTreeWidget(this); propertiesView->setSelectionMode(QAbstractItemView::NoSelection); propertiesView->setRootIsDecorated(false); propertiesView->setAllColumnsShowFocus(true); propertiesView->setColumnCount(3); propertiesView->header()->setStretchLastSection(false); propertiesView->headerItem()->setText(0, QString()); propertiesView->headerItem()->setText(1, QString()); propertiesView->headerItem()->setText(2, QString()); propertiesView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); propertiesView->header()->setSectionResizeMode(1, QHeaderView::Stretch); propertiesView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents); propertiesView->header()->hide(); box->addWidget(propertiesView); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); datasetsView->setFocus(); connect(addDSButton, SIGNAL(clicked()), this, SLOT(addDataset())); connect(editDSButton, SIGNAL(clicked()), this, SLOT(editDataset())); connect(delDSButton, SIGNAL(clicked()), this, SLOT(delDataset())); connect(addObjButton, SIGNAL(clicked()), this, SLOT(addObject())); connect(editObjButton, SIGNAL(clicked()), this, SLOT(editObject())); connect(delObjButton, SIGNAL(clicked()), this, SLOT(delObject())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(datasetsView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedDatasetChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(objectsView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedObjectChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(datasetsView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editDataset())); connect(objectsView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(editObject())); connect(propertiesView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(propertyDoubleClicked(QTreeWidgetItem*, int))); connect(propertiesView, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(propertyClicked(QTreeWidgetItem*, int))); connect(vsplitter_l, SIGNAL(splitterMoved(int, int)), this, SLOT(vsplitterlMoved(int, int))); connect(vsplitter_r, SIGNAL(splitterMoved(int, int)), this, SLOT(vsplitterrMoved(int, int))); updateDatasets(); if(!settings->datasets_geometry.isEmpty()) restoreGeometry(settings->datasets_geometry); else try_resize(this, 1000, 700); vsplitter_l->setStretchFactor(0, 2); vsplitter_l->setStretchFactor(1, 3); vsplitter_r->setStretchFactor(0, 2); vsplitter_r->setStretchFactor(1, 3); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); if(!settings->datasets_vsplitter_state.isEmpty()) { vsplitter_l->restoreState(settings->datasets_vsplitter_state); vsplitter_r->restoreState(settings->datasets_vsplitter_state); } if(!settings->datasets_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->datasets_hsplitter_state); } DataSetsDialog::~DataSetsDialog() {} void DataSetsDialog::addDataset() { MathFunction *replaced_item = NULL; DataSet *ds = DataSetEditDialog::newDataset(this, &replaced_item); if(ds) { selected_dataset = ds; updateDatasets(); if(ds != replaced_item && !ds->isHidden()) settings->favourite_functions.push_back(ds); emit itemsChanged(); } } void DataSetsDialog::editDataset() { if(!selected_dataset) return; MathFunction *replaced_item = NULL; if(DataSetEditDialog::editDataset(this, selected_dataset, &replaced_item)) { updateDatasets(); emit itemsChanged(); } } void DataSetsDialog::delDataset() { if(!selected_dataset) return; selected_dataset->destroy(); selected_object = NULL; selected_dataset = NULL; updateDatasets(); emit itemsChanged(); } void DataSetsDialog::addObject() { if(!selected_dataset) return; DataObject *o = DataObjectEditDialog::newObject(this, selected_dataset); if(o) { selected_object = o; DataPropertyIter pit; DataProperty *dp = selected_object->parentSet()->getFirstProperty(&pit); QTreeWidgetItem *item = new QTreeWidgetItem(objectsView); for(int i = 0; dp; i++) { if(!dp->isHidden() && dp->isKey()) item->setText(i, QString::fromStdString(selected_object->getPropertyDisplayString(dp))); dp = selected_object->parentSet()->getNextProperty(&pit); } item->setData(0, Qt::UserRole, QVariant::fromValue((void*) selected_object)); objectsView->clearSelection(); objectsView->setCurrentItem(item); item->setSelected(true); selectedObjectChanged(item, NULL); if(objectsView->columnCount() == 1) objectsView->sortItems(0, Qt::AscendingOrder); } } void DataSetsDialog::editObject() { if(!selected_object) return; if(DataObjectEditDialog::editObject(this, selected_object)) { DataPropertyIter pit; DataProperty *dp = selected_object->parentSet()->getFirstProperty(&pit); QTreeWidgetItem *item = objectsView->currentItem(); if(!item) return; for(int i = 0; dp; i++) { if(!dp->isHidden() && dp->isKey()) item->setText(i, QString::fromStdString(selected_object->getPropertyDisplayString(dp))); dp = selected_object->parentSet()->getNextProperty(&pit); } selectedObjectChanged(item, NULL); if(objectsView->columnCount() == 1) objectsView->sortItems(0, Qt::AscendingOrder); } } void DataSetsDialog::delObject() { if(!selected_object) return; QTreeWidgetItem *item = objectsView->currentItem(); if(item) delete item; selected_object->parentSet()->delObject(selected_object); } void DataSetsDialog::vsplitterlMoved(int, int) { vsplitter_r->setSizes(vsplitter_l->sizes()); } void DataSetsDialog::vsplitterrMoved(int, int) { vsplitter_l->setSizes(vsplitter_r->sizes()); } void DataSetsDialog::selectedDatasetChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { objectsView->clear(); if(!item) { objectsView->setColumnCount(1); descriptionView->clear(); selected_dataset = NULL; addObjButton->setEnabled(false); editDSButton->setEnabled(false); delDSButton->setEnabled(false); return; } DataSet *ds = (DataSet*) item->data(0, Qt::UserRole).value(); addObjButton->setEnabled(ds->isLocal()); editDSButton->setEnabled(true); delDSButton->setEnabled(ds->isLocal()); selected_dataset = ds; DataObjectIter it; DataPropertyIter pit; DataProperty *dp; DataObject *o = ds->getFirstObject(&it); dp = ds->getFirstProperty(&pit); int n = 0; while(dp) { if(!dp->isHidden() && dp->isKey()) n++; dp = ds->getNextProperty(&pit); } bool no_key = (n == 0); if(n == 0) n = 1; objectsView->setColumnCount(n); for(int i = 0; i < n; i++) objectsView->headerItem()->setText(i, QString()); n = 0; if(!o) selectedObjectChanged(NULL, NULL); while(o) { dp = ds->getFirstProperty(&pit); QTreeWidgetItem *item = new QTreeWidgetItem(objectsView); for(int i = 0; dp; i++) { if((no_key && i == 0) || (!dp->isHidden() && dp->isKey())) item->setText(i, QString::fromStdString(o->getPropertyDisplayString(dp))); dp = ds->getNextProperty(&pit); } item->setData(0, Qt::UserRole, QVariant::fromValue((void*) o)); n++; if(o == selected_object || (n == 1 && !selected_object)) { objectsView->setCurrentItem(item); item->setSelected(true); selectedObjectChanged(item, NULL); } o = ds->getNextObject(&it); } if(n == 1) objectsView->sortItems(0, Qt::AscendingOrder); QString str; if(!ds->description().empty()) { str = QString::fromStdString(ds->description()); str += "
"; str += "
"; } str += ""; str += tr("Properties"); str += ""; str += "
"; dp = ds->getFirstProperty(&pit); while(dp) { if(!dp->isHidden()) { if(!dp->title(false).empty()) { str += QString::fromStdString(dp->title()); str += ": "; } for(size_t i = 1; i <= dp->countNames(); i++) { if(i > 1) str += ", "; str += QString::fromStdString(dp->getName(i)); } if(dp->isKey()) { str += " ("; str += tr("key"); str += ")"; } str += "
"; if(!dp->description().empty()) { str += ""; str += QString::fromStdString(dp->description()); str += ""; str += "
"; } } dp = ds->getNextProperty(&pit); } str += "
"; str += ""; str += tr("Data Retrieval Function"); str += ""; Argument *arg; Argument default_arg; const ExpressionName *ename = &ds->preferredName(false, true, false, false, &can_display_unicode_string_function, (void*) descriptionView); str += "
"; str += ""; str += QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true)); str += ""; int iargs = ds->maxargs(); if(iargs < 0) { iargs = ds->minargs() + 1; if((int) ds->lastArgumentDefinitionIndex() > iargs) iargs = (int) ds->lastArgumentDefinitionIndex(); } str += "("; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > ds->minargs()) { str += "["; } if(i2 > 1) { str += QString::fromStdString(CALCULATOR->getComma()); str += " "; } arg = ds->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += QString::fromStdString(arg->name()); } else { str += tr("argument"); if(i2 > 1 || ds->maxargs() != 1) { str += " "; str += QString::number(i2); } } if(i2 > ds->minargs()) { str += "]"; } } if(ds->maxargs() < 0) { str += QString::fromStdString(CALCULATOR->getComma()); str += " …"; } } str += ")"; for(size_t i2 = 1; i2 <= ds->countNames(); i2++) { if(&ds->getName(i2) != ename) { str += "
"; str += QString::fromStdString(ds->getName(i2).formattedName(TYPE_FUNCTION, true, true)); } } str += "
"; str += "
"; if(!ds->copyright().empty()) { str += "
"; str += QString::fromStdString(ds->copyright()); str += "
"; } descriptionView->setHtml(str); } void DataSetsDialog::selectedObjectChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { propertiesView->clear(); propertiesView->setColumnCount(3); propertiesView->headerItem()->setText(0, QString()); propertiesView->headerItem()->setText(1, QString()); propertiesView->headerItem()->setText(2, QString()); if(!item) { editObjButton->setEnabled(false); delObjButton->setEnabled(false); selected_object = NULL; return; } DataObject *o = (DataObject*) item->data(0, Qt::UserRole).value(); selected_object = o; DataSet *ds = o->parentSet(); editObjButton->setEnabled(true); delObjButton->setEnabled(o->isUserModified()); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); QFont bold_font(font()); bold_font.setWeight(QFont::Bold); while(dp) { if(!dp->isHidden()) { QTreeWidgetItem *item = new QTreeWidgetItem(propertiesView); item->setText(0, QString::fromStdString(dp->title())); item->setText(1, QString::fromStdString(o->getPropertyDisplayString(dp))); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) dp)); item->setFont(0, bold_font); item->setText(2, QString()); item->setIcon(2, LOAD_COLORED_ICON("edit-paste")); item->setTextAlignment(2, Qt::AlignRight); } dp = ds->getNextProperty(&it); } } void DataSetsDialog::propertyDoubleClicked(QTreeWidgetItem *item, int) { if(!item || !selected_object) return; emit insertPropertyRequest(selected_object, (DataProperty*) item->data(0, Qt::UserRole).value()); } void DataSetsDialog::propertyClicked(QTreeWidgetItem *item, int c) { if(c != 2 || !item || !selected_object) return; emit insertPropertyRequest(selected_object, (DataProperty*) item->data(0, Qt::UserRole).value()); } void DataSetsDialog::updateDatasets() { DataSet *ds = selected_dataset; datasetsView->clear(); datasetsView->header()->hide(); datasetsView->setColumnCount(1); selected_dataset = ds; for(size_t i = 1; ; i++) { ds = CALCULATOR->getDataSet(i); if(!ds) break; QTreeWidgetItem *item = new QTreeWidgetItem(datasetsView, QStringList(QString::fromStdString(ds->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) datasetsView)))); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) ds)); if((!selected_dataset && i == 1) || ds == selected_dataset) { datasetsView->setCurrentItem(item); item->setSelected(true); } } datasetsView->sortItems(0, Qt::AscendingOrder); } void DataSetsDialog::closeEvent(QCloseEvent *e) { settings->datasets_geometry = saveGeometry(); settings->datasets_vsplitter_state = vsplitter_l->saveState(); settings->datasets_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void DataSetsDialog::reject() { settings->datasets_geometry = saveGeometry(); settings->datasets_vsplitter_state = vsplitter_l->saveState(); settings->datasets_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } qalculate-qt-5.11.0/src/datasetsdialog.h000066400000000000000000000032441520501070600201220ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef DATASETS_DIALOG_H #define DATASETS_DIALOG_H #include #include class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QPushButton; class QSplitter; class DataSetsDialog : public QDialog { Q_OBJECT protected: QTreeWidget *datasetsView, *objectsView, *propertiesView; QTextEdit *descriptionView; QPushButton *addDSButton, *delDSButton, *editDSButton, *addObjButton, *delObjButton, *editObjButton; QSplitter *vsplitter_l, *vsplitter_r, *hsplitter; DataSet *selected_dataset; DataObject *selected_object; void closeEvent(QCloseEvent*) override; protected slots: void selectedDatasetChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedObjectChanged(QTreeWidgetItem*, QTreeWidgetItem*); void propertyDoubleClicked(QTreeWidgetItem*, int); void propertyClicked(QTreeWidgetItem*, int); void vsplitterrMoved(int, int); void vsplitterlMoved(int, int); void addDataset(); void editDataset(); void delDataset(); void addObject(); void editObject(); void delObject(); public: DataSetsDialog(QWidget *parent = NULL); virtual ~DataSetsDialog(); void updateDatasets(); public slots: void reject() override; signals: void itemsChanged(); void insertPropertyRequest(DataObject*, DataProperty*); }; #endif //DATASETS_DIALOG_H qalculate-qt-5.11.0/src/expressionedit.cpp000066400000000000000000006433421520501070600205430ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021-2024 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #include #include #include "expressionedit.h" #include "qalculateqtsettings.h" #include "matrixwidget.h" #define ITEM_ROLE (Qt::UserRole + 10) #define TYPE_ROLE (Qt::UserRole + 11) #define MATCH_ROLE (Qt::UserRole + 12) #define IMATCH_ROLE (Qt::UserRole + 13) #include std::unordered_map capitalized_names; class ExpressionTipLabel : public QLabel { public: QBasicTimer hideTimer, expireTimer; QWidget *widget; ExpressionTipLabel(const QString &text, const QPoint &pos, QWidget *w); ~ExpressionTipLabel(); void adjustTooltipScreen(const QPoint &pos); void updateSize(const QPoint &pos); void reuseTip(const QString &text, const QPoint &pos); void hideTip(); void hideTipImmediately(); void restartExpireTimer(); bool placeTip(const QPoint &pos, const QRect &completion_rect = QRect()); protected: void timerEvent(QTimerEvent *e) override; void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; }; ExpressionTipLabel::ExpressionTipLabel(const QString &text, const QPoint &pos, QWidget *w) : QLabel(w, Qt::ToolTip | Qt::BypassGraphicsProxyWidget), widget(w) { setForegroundRole(QPalette::ToolTipText); setBackgroundRole(QPalette::ToolTipBase); setPalette(QToolTip::palette()); setTextFormat(Qt::RichText); ensurePolished(); setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, this)); setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignLeft); setIndent(1); setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0, this) / 255.0); setMouseTracking(true); reuseTip(text, pos); } void ExpressionTipLabel::restartExpireTimer() { int time = 10000 + 40 * qMax(0, text().length() - 100); expireTimer.start(time, this); hideTimer.stop(); } void ExpressionTipLabel::reuseTip(const QString &text, const QPoint &pos) { int i = text.lastIndexOf(" = "); if(i <= 0) i = text.lastIndexOf(" " SIGN_ALMOST_EQUAL " "); if(!wordWrap() || i <= 0) { setText(text); updateSize(pos); } if(wordWrap() && i > 0) { QString str = text; str.replace(i, 6, "
"); setText(str); updateSize(pos); } restartExpireTimer(); } void ExpressionTipLabel::updateSize(const QPoint &pos) { QFontMetrics fm(font()); QSize extra(1, 0); if(fm.descent() == 2 && fm.ascent() >= 11) ++extra.rheight(); QSize sh = sizeHint(); if(!wordWrap()) { if(pos.x() + sh.width() > widget->mapToGlobal(QPoint(widget->width(), 0)).x()) { setWordWrap(true); sh = sizeHint(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) } else { # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *screen = widget->screen(); # else QScreen *screen = QGuiApplication::screenAt(pos); # endif if(!screen) screen = QGuiApplication::primaryScreen(); if(screen) { const qreal screenWidth = screen->geometry().width(); if(sh.width() > screenWidth) { setWordWrap(true); sh = sizeHint(); } } #endif } } resize(sh + extra); } void ExpressionTipLabel::paintEvent(QPaintEvent *ev) { QStylePainter p(this); QStyleOptionFrame opt; opt.initFrom(this); p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); p.end(); QLabel::paintEvent(ev); } void ExpressionTipLabel::resizeEvent(QResizeEvent *e) { QStyleHintReturnMask frameMask; QStyleOption option; option.initFrom(this); if(style()->styleHint(QStyle::SH_ToolTip_Mask, &option, this, &frameMask)) setMask(frameMask.region); QLabel::resizeEvent(e); } ExpressionTipLabel::~ExpressionTipLabel() {} void ExpressionTipLabel::hideTip() { if(isVisible() && !hideTimer.isActive()) hideTimer.start(300, this); } void ExpressionTipLabel::hideTipImmediately() { hide(); } void ExpressionTipLabel::timerEvent(QTimerEvent *e) { if(e->timerId() == hideTimer.timerId() || e->timerId() == expireTimer.timerId()) { hideTimer.stop(); expireTimer.stop(); hideTipImmediately(); } } bool ExpressionTipLabel::placeTip(const QPoint &pos, const QRect &completion_rect) { QRect screen = get_screen_geometry(widget); QPoint p = pos; p += QPoint(2, 16); if(!completion_rect.isNull() && completion_rect.intersects(QRect(p, this->size()))) { p.rx() -= 16 + this->width(); if(p.x() < screen.x() || completion_rect.intersects(QRect(p, this->size()))) { p = pos; p += QPoint(2, 16); p.setY(widget->window()->mapToGlobal(QPoint(0, 0)).y() - this->height() - 2); if(p.x() + this->width() > screen.x() + screen.width()) p.rx() -= 4 + this->width(); if(p.y() < screen.y() || completion_rect.intersects(QRect(p, this->size()))) { } } } else { if(p.x() + this->width() > screen.x() + screen.width()) p.rx() -= 4 + this->width(); if(p.y() + this->height() > screen.y() + screen.height()) p.ry() -= 24 + this->height(); if(p.y() < screen.y()) p.setY(screen.y()); if(p.x() + this->width() > screen.x() + screen.width()) p.setX(screen.x() + screen.width() - this->width()); if(p.x() < screen.x()) p.setX(screen.x()); if(p.y() + this->height() > screen.y() + screen.height()) p.setY(screen.y() + screen.height() - this->height()); } if(settings->wayland_platform && this->isVisible()) { if(p.y() != this->pos().y() || p.x() < this->pos().x() - 1) { this->hide(); this->move(p); this->show(); } } else { this->move(p); } return true; } bool last_is_operator(std::string str, bool allow_exp) { remove_blank_ends(str); if(str.empty()) return false; if((signed char) str[str.length() - 1] > 0) { if(is_in(OPERATORS "\\" LEFT_PARENTHESIS LEFT_VECTOR_WRAP, str[str.length() - 1]) && (str[str.length() - 1] != '!' || str.length() == 1)) return true; if(allow_exp && is_in(EXP, str[str.length() - 1])) return true; if(str.length() >= 3 && str[str.length() - 1] == 'r' && str[str.length() - 2] == 'o' && str[str.length() - 3] == 'x') return true; } else { if(str.length() >= 3 && (signed char) str[str.length() - 2] < 0) { str = str.substr(str.length() - 3); if(str == "∧" || str == "∨" || str == "⊻" || str == "≤" || str == "≥" || str == "≠" || str == "∠" || str == settings->multiplicationSign() || str == settings->divisionSign() || str == SIGN_MINUS) { return true; } } if(str.length() >= 2) { str = str.substr(str.length() - 2); if(str == "¬" || str == settings->multiplicationSign() || str == settings->divisionSign() || str == SIGN_MINUS) return true; } } return false; } bool contains_imaginary_number(MathStructure &m) { if(m.isNumber() && m.number().hasImaginaryPart()) return true; if(m.isFunction() && m.function()->id() == FUNCTION_ID_CIS) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_imaginary_number(m[i])) return true; } return false; } bool contains_rational_number(MathStructure &m) { if(m.isNumber() && ((m.number().realPartIsRational() && !m.number().realPart().isInteger()) || (m.number().hasImaginaryPart() && m.number().imaginaryPart().isRational() && !m.number().imaginaryPart().isInteger()))) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_rational_number(m[i])) { return i != 1 || !m.isPower() || !m[1].isNumber() || m[1].number().denominatorIsGreaterThan(9) || (m[1].number().numeratorIsGreaterThan(9) && !m[1].number().denominatorIsTwo() && !m[0].representsNonNegative(true)); } } return false; } bool contains_related_unit(const MathStructure &m, Unit *u) { if(m.isUnit()) return u == m.unit() || u->containsRelativeTo(m.unit()) || m.unit()->containsRelativeTo(u); for(size_t i = 0; i < m.size(); i++) { if(contains_related_unit(m[i], u)) return true; } return false; } bool equalsIgnoreCase(const std::string &str1, const std::string &str2, size_t i2, size_t i2_end, size_t minlength) { if(str1.empty() || str2.empty()) return false; size_t l = 0; if(i2_end == std::string::npos) i2_end = str2.length(); for(size_t i1 = 0;; i1++, i2++) { if(i2 >= i2_end) return i1 >= str1.length(); if(i1 >= str1.length()) break; if(i2 >= str2.length()) return false; if(((signed char) str1[i1] < 0 && i1 + 1 < str1.length()) || ((signed char) str2[i2] < 0 && i2 + 1 < str2.length())) { size_t iu1 = 1, iu2 = 1; size_t n1 = 1, n2 = 1; if((signed char) str1[i1] < 0) { while(iu1 + i1 < str1.length() && (signed char) str1[i1 + iu1] < 0) { if((unsigned char) str1[i1 + iu1] >= 0xC0) n1++; iu1++; } } if((signed char) str2[i2] < 0) { while(iu2 + i2 < str2.length() && (signed char) str2[i2 + iu2] < 0) { if((unsigned char) str2[i2 + iu2] >= 0xC0) { if(n1 == n2) break; n2++; } iu2++; } } if(n1 != n2) return false; bool isequal = (iu1 == iu2); if(isequal) { for(size_t i = 0; i < iu1; i++) { if(str1[i1 + i] != str2[i2 + i]) { isequal = false; break; } } } if(!isequal) { char *gstr1 = utf8_strdown(str1.c_str() + (sizeof(char) * i1), iu1); if(!gstr1) return false; char *gstr2 = utf8_strdown(str2.c_str() + (sizeof(char) * i2), iu2); if(!gstr2) { free(gstr1); return false; } bool b = strcmp(gstr1, gstr2) == 0; free(gstr1); free(gstr2); if(!b) return false; } i1 += iu1 - 1; i2 += iu2 - 1; } else if(str1[i1] != str2[i2] && !((str1[i1] >= 'a' && str1[i1] <= 'z') && str1[i1] - 32 == str2[i2]) && !((str1[i1] <= 'Z' && str1[i1] >= 'A') && str1[i1] + 32 == str2[i2])) { return false; } l++; } return l >= minlength; } bool title_matches(ExpressionItem *item, const std::string &str, size_t minlength) { bool big_A = false; if(minlength > 1 && str.length() == 1) { if(str[0] == 'a' || str[0] == 'x' || str[0] == 'y' || str[0] == 'X' || str[0] == 'Y') return false; big_A = (str[0] == 'A'); } const std::string &title = item->title(true); if(title.empty()) return false; size_t i = 0; while(true) { while(true) { if(i >= title.length()) return false; if(title[i] != ' ' && title[i] != '(') break; i++; } size_t i2 = title.find(' ', i); if(big_A && title[i] == str[0] && ((i2 == std::string::npos && i == title.length() - 1) || i2 - i == 1)) { return true; } else if(!big_A && equalsIgnoreCase(str, title, i, i2, minlength)) { return true; } if(i2 == std::string::npos) break; i = i2 + 1; } return false; } bool test_unicode_length_from(const std::string &str, size_t i, size_t l) { if(l == 0) return true; for(; i < str.length(); i++) { if((signed char) str[i] > 0 || (unsigned char) str[i] >= 0xC0) { l--; if(l == 0) return true; } } return false; } bool name_matches(ExpressionItem *item, const std::string &str) { for(size_t i2 = 1; i2 <= item->countNames(); i2++) { const ExpressionName *ename = &item->getName(i2); if(ename->case_sensitive) { if(str == ename->name.substr(0, str.length())) { return true; } } else { if(equalsIgnoreCase(str, ename->name, 0, str.length(), 0)) { return true; } std::unordered_map::iterator cap_it = capitalized_names.find(ename); if(cap_it != capitalized_names.end() && equalsIgnoreCase(str, cap_it->second, 0, str.length(), 0)) { return true; } } size_t i = 0; while(true) { i = ename->name.find("_", i); if(i == std::string::npos || !test_unicode_length_from(ename->name, i + 1, 2)) break; i++; if((ename->case_sensitive && str == ename->name.substr(i, str.length())) || (!ename->case_sensitive && equalsIgnoreCase(str, ename->name, i, str.length() + i, 0))) { return true; } } } return false; } int name_matches2(ExpressionItem *item, const std::string &str, size_t minlength, size_t *i_match = NULL) { if(minlength > 1 && !test_unicode_length_from(str, 0, 2)) return 0; bool b_match = false; for(size_t i2 = 1; i2 <= item->countNames(); i2++) { const ExpressionName *ename = &item->getName(i2); if(equalsIgnoreCase(str, ename->name, 0, str.length(), 0)) { if(!ename->case_sensitive && ename->name.length() == str.length()) { if(i_match) *i_match = i2; return 1; } if(i_match && *i_match == 0) *i_match = i2; b_match = true; } size_t i = 0; while(true) { i = ename->name.find("_", i); if(i == std::string::npos || !test_unicode_length_from(ename->name, i + 1, 2)) break; i++; if((ename->case_sensitive && str.length() <= ename->name.length() - i && str == ename->name.substr(i, str.length())) || (!ename->case_sensitive && equalsIgnoreCase(str, ename->name, i, str.length() + i, minlength))) { b_match = true; break; } } } return b_match ? 2 : 0; } bool country_matches(Unit *u, const std::string &str, size_t minlength) { const std::string &countries = u->countries(); size_t i = 0; while(true) { while(true) { if(i >= countries.length()) return false; if(countries[i] != ' ') break; i++; } size_t i2 = countries.find(',', i); if(equalsIgnoreCase(str, countries, i, i2, minlength)) { return true; } if(i2 == std::string::npos) break; i = i2 + 1; } return false; } int completion_names_match(std::string name, const std::string &str, size_t minlength = 0, size_t *i_match = NULL) { size_t i = 0, n = 0; bool b_match = false; while(true) { size_t i2 = name.find(i == 0 ? " " : "", i); if(equalsIgnoreCase(str, name, i, i2, minlength)) { if((i2 == std::string::npos && name.length() - i == str.length()) || (i2 != std::string::npos && i2 - i == str.length())) { if(i_match) *i_match = n; return 1; } if(i_match && *i_match == 0) *i_match = n + 1; b_match = true; } if(i2 == std::string::npos) break; if(i == 0) { i = i2 + 4; } else { i = name.find("", i2); if(i == std::string::npos) break; i += 3; } n++; } if(i_match && *i_match > 0) *i_match -= 1; return (b_match ? 2 : 0); } bool is_digit_q(QChar qc, int base) { char c = qc.toLatin1(); // 0-9 is always treated as a digit if(c >= '0' && c <= '9') return true; // in non standard bases every character might be a digit if(base < 0) return true; if(base <= 10) return false; // duodecimal bases uses 0-9, E, X if(base == 12) return c == 'E' || c == 'X' || c == 'A' || c == 'B' || c == 'a' || c == 'b'; // bases 11-36 is case insensitive if(base <= 36) { if(c >= 'a' && c < 'a' + (base - 10)) return true; if(c >= 'A' && c < 'A' + (base - 10)) return true; return false; } // bases 37-62 is case sensitive if(base <= 62) { if(c >= 'a' && c < 'a' + (base - 36)) return true; if(c >= 'A' && c < 'Z') return true; return false; } return true; } class HTMLDelegate : public QStyledItemDelegate { public: void paint(QPainter * painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; void HTMLDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style(); QTextDocument doc; doc.setDefaultFont(optionV4.font); doc.setHtml(optionV4.text); // Painting item without text optionV4.text = QString(); style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter); QAbstractTextDocumentLayout::PaintContext ctx; // Highlighting text if item is selected if(optionV4.state & QStyle::State_Selected) ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText)); QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4); painter->save(); painter->translate(textRect.topLeft()); painter->setClipRect(textRect.translated(-textRect.topLeft())); doc.documentLayout()->draw(painter, ctx); painter->restore(); } QSize HTMLDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QTextDocument doc; doc.setDefaultFont(optionV4.font); doc.setHtml(optionV4.text); return QSize(doc.idealWidth(), doc.size().height() + 4); } struct CompletionData { std::vector pstr; std::vector prefixes; MathStructure *current_from_struct; MathFunction *current_function; int current_function_index; std::vector current_from_units; std::vector current_from_categories; bool editing_to_expression, editing_to_expression1, show_custom_to; int to_type, highest_match; Argument *arg; CompletionData() : current_from_struct(NULL), current_function(NULL), current_function_index(0), editing_to_expression(false), editing_to_expression1(false), show_custom_to(false), to_type(0), highest_match(0), arg(NULL) { } }; extern int to_form; extern int to_base; #define TO_FORM_OFF -10000 const Number *from_struct_get_number(const MathStructure &m) { if(m.isNumber()) return &m.number(); const Number *nr = NULL; for(size_t i = 0; i < m.size(); i++) { if(m[i].isNumber()) return &m[i].number(); else if(!nr) nr = from_struct_get_number(m[i]); } return nr; } ExpressionProxyModel::ExpressionProxyModel(CompletionData *cd, QObject *parent) : QSortFilterProxyModel(parent), cdata(cd) { setSortCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); setDynamicSortFilter(false); } ExpressionProxyModel::~ExpressionProxyModel() {} bool use_with_prefix(Unit *u, Prefix *prefix) { if(!prefix) return true; if(!u->useWithPrefixesByDefault()) return false; if((prefix->type() != PREFIX_DECIMAL || u->minPreferredPrefix() > ((DecimalPrefix*) prefix)->exponent() || u->maxPreferredPrefix() < ((DecimalPrefix*) prefix)->exponent()) && (prefix->type() != PREFIX_BINARY || u->baseUnit()->referenceName() != "bit" || u->minPreferredPrefix() > ((BinaryPrefix*) prefix)->exponent() || u->maxPreferredPrefix() < ((BinaryPrefix*) prefix)->exponent())) { return false; } return true; } bool ExpressionProxyModel::filterAcceptsRow(int source_row, const QModelIndex&) const { if(!cdata->arg && cdata->to_type < 2 && str.empty()) return false; QModelIndex index = sourceModel()->index(source_row, 0); if(!index.isValid()) return false; int p_type = index.data(TYPE_ROLE).toInt(); if(cdata->arg) { return p_type > 2 && p_type < 100; } ExpressionItem *item = NULL; Prefix *prefix = NULL; void *p = index.data(ITEM_ROLE).value(); if(p_type == 1) item = (ExpressionItem*) p; else if(p_type == 2) prefix = (Prefix*) p; int b_match = false; size_t i_match = 0; std::unordered_map::iterator cap_it; if(item && cdata->to_type < 2) { if((cdata->editing_to_expression || !settings->evalops.parse_options.functions_enabled) && item->type() == TYPE_FUNCTION) {} else if(item->type() == TYPE_VARIABLE && (!settings->evalops.parse_options.variables_enabled || (cdata->editing_to_expression && !((Variable*) item)->isKnown()))) {} else if(!settings->evalops.parse_options.units_enabled && item->type() == TYPE_UNIT) {} else { CompositeUnit *cu = NULL; int exp = 0; if(item->type() == TYPE_UNIT && ((Unit*) item)->subtype() == SUBTYPE_COMPOSITE_UNIT) { cu = (CompositeUnit*) item; item = cu->get(1, &exp, &prefix); if(item && prefix) { for(size_t name_i = 1; name_i <= prefix->countNames(); name_i++) { const ExpressionName *ename = &prefix->getName(name_i); if(!ename->name.empty() && ename->name.length() >= str.length() && (ename->abbreviation || str.length() >= 2)) { bool pmatch = true; for(size_t i = 0; i < str.length(); i++) { if(ename->name[i] != str[i]) { pmatch = false; break; } } if(pmatch) { b_match = 2; item = NULL; break; } } } if(item && exp == 1 && cu->countUnits() == 1 && ((Unit*) item)->useWithPrefixesByDefault()) { if(!b_match && settings->enable_completion2 && title_matches(cu, str, settings->completion_min2)) { b_match = 4; } item = NULL; } } } for(size_t name_i = 1; item && name_i <= item->countNames() && !b_match; name_i++) { const ExpressionName *ename = &item->getName(name_i); if(ename && (!cu || ename->abbreviation || str.length() >= 3 || str.length() == ename->name.length())) { if(item->isHidden() && (item->type() != TYPE_UNIT || !((Unit*) item)->isCurrency()) && ename) { b_match = (ename->name == str) ? 1 : 0; } else { for(size_t icap = 0; icap < 2; icap++) { const std::string *namestr; if(icap == 0) { namestr = &ename->name; } else { cap_it = capitalized_names.find(ename); if(cap_it == capitalized_names.end()) break; namestr = &cap_it->second; } for(size_t icmp = 0; icmp <= cdata->prefixes.size(); icmp++) { if(icmp == 1 && (item->type() != TYPE_UNIT || (cu && !prefix) || (!cu && !((Unit*) item)->useWithPrefixesByDefault()))) break; if(cu && prefix) { if(icmp == 0 || prefix != cdata->prefixes[icmp - 1]) continue; } const std::string *cmpstr; if(icmp == 0) cmpstr = &str; else cmpstr = &cdata->pstr[icmp - 1]; if(cmpstr->empty()) break; if(cmpstr->length() <= namestr->length()) { b_match = 2; for(size_t i = 0; i < cmpstr->length(); i++) { if((*namestr)[i] != (*cmpstr)[i]) { b_match = false; break; } } if(b_match && (!cu || (exp == 1 && cu->countUnits() == 1)) && ((!ename->case_sensitive && equalsIgnoreCase(*namestr, *cmpstr)) || (ename->case_sensitive && *namestr == *cmpstr))) b_match = 1; if(b_match) { if(icmp > 0 && !cu) { prefix = cdata->prefixes[icmp - 1]; if(!use_with_prefix((Unit*) item, prefix)) { b_match = false; prefix = NULL; continue; } if(CALCULATOR->getActiveExpressionItem(str.substr(0, str.length() - cmpstr->length()) + *namestr)) { b_match = false; prefix = NULL; continue; } i_match = str.length() - cmpstr->length(); } else if(b_match > 1 && !cdata->editing_to_expression && item->isHidden() && str.length() == 1) { b_match = 4; i_match = name_i; } break; } } } if(b_match) break; } } } } if(item && ((!cu && b_match >= 2) || (exp == 1 && cu->countUnits() == 1 && b_match == 2)) && item->countNames() > 1) { for(size_t icmp = 0; icmp <= cdata->prefixes.size() && b_match > 1; icmp++) { if(icmp == 1 && (item->type() != TYPE_UNIT || (cu && !prefix) || (!cu && !((Unit*) item)->useWithPrefixesByDefault()))) break; if(cu && prefix) { if(icmp == 0 || prefix != cdata->prefixes[icmp - 1]) continue; } const std::string *cmpstr; if(icmp == 0) cmpstr = &str; else cmpstr = &cdata->pstr[icmp - 1]; if(cmpstr->empty()) break; for(size_t name_i = 1; name_i <= item->countNames(); name_i++) { cap_it = capitalized_names.find(&item->getName(name_i)); if(item->getName(name_i).name == *cmpstr || (cap_it != capitalized_names.end() && cap_it->second == *cmpstr)) { if(!cu) { if(icmp > 0) { if(CALCULATOR->getActiveExpressionItem(str.substr(0, str.length() - cmpstr->length()) + *cmpstr)) break; prefix = cdata->prefixes[icmp - 1]; } else { prefix = NULL; } } b_match = 1; break; } } } } if(item && !b_match && settings->enable_completion2 && (!item->isHidden() || (item->type() == TYPE_UNIT && str.length() > 1 && ((Unit*) item)->isCurrency()))) { int i_cinm = name_matches2(cu ? cu : item, str, cdata->to_type == 1 ? 1 : settings->completion_min2, &i_match); if(i_cinm == 1) {b_match = 1; i_match = 0;} else if(i_cinm == 2) b_match = 4; else if(title_matches(cu ? cu : item, str, cdata->to_type == 1 ? 1 : settings->completion_min2)) b_match = 4; else if(!cu && item->type() == TYPE_UNIT && ((Unit*) item)->isCurrency() && country_matches((Unit*) item, str, cdata->to_type == 1 ? 1 : settings->completion_min2)) b_match = 5; } if(cu) prefix = NULL; } if(b_match > 1 && ( (cdata->to_type == 1 && (!item || item->type() != TYPE_UNIT)) || ((b_match > 2 || str.length() < 3) && cdata->editing_to_expression && cdata->current_from_struct && !cdata->current_from_struct->isAborted() && item && item->type() == TYPE_UNIT && !contains_related_unit(*cdata->current_from_struct, (Unit*) item) && (!cdata->current_from_struct->isNumber() || !cdata->current_from_struct->number().isReal() || (!prefix && ((Unit*) item)->isSIUnit() && (Unit*) item != CALCULATOR->getRadUnit()))) )) { b_match = 0; i_match = 0; } if(b_match) { QString qstr = index.data(Qt::DisplayRole).toString(); if(!qstr.isEmpty()) { if(qstr[0] == '<') { int i = qstr.indexOf("-) "); if(i > 2) { if(prefix && prefix->longName() == qstr.mid(22, i - 22).toStdString()) { prefix = NULL; } else { qstr = qstr.mid(i + 10); if(!prefix) sourceModel()->setData(index, qstr, Qt::DisplayRole); } } } if(prefix) { if(qstr.isEmpty()) qstr = index.data(Qt::DisplayRole).toString(); qstr.insert(0, "-) "); qstr.insert(0, QString::fromStdString(prefix->longName())); qstr.insert(0, "("); sourceModel()->setData(index, qstr, Qt::DisplayRole); } } if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } else if(item && cdata->to_type == 4) { if(item->type() == TYPE_UNIT) { for(size_t i = 0; i < cdata->current_from_categories.size(); i++) { if(item->category() == cdata->current_from_categories[i]) { b_match = 6; break; } else if(cdata->current_from_categories[i] == settings->volume_category && (((Unit*) item)->system() != "Imperial" || cdata->current_from_units[i]->system().find("Imperial") != std::string::npos)) { for(size_t i2 = 0; i2 < settings->alternative_volume_categories.size(); i2++) { if(item->category() == settings->alternative_volume_categories[i2]) {b_match = 6; break;} } if(b_match == 6) break; } } if(b_match == 6 && item->isHidden() && item != CALCULATOR->getLocalCurrency()) b_match = 0; if(b_match == 6) { QString qstr = index.data(Qt::DisplayRole).toString(); if(!qstr.isEmpty() && qstr[0] == '<') { int i = qstr.indexOf("-) "); if(i > 2) { qstr = qstr.mid(i + 10); sourceModel()->setData(index, qstr, Qt::DisplayRole); } } } } } else if(item && cdata->to_type == 5) { if(item->type() == TYPE_UNIT && ((Unit*) item)->isCurrency() && (!item->isHidden() || item == CALCULATOR->getLocalCurrency())) b_match = 6; } else if(item && cdata->to_type == 2 && str.empty() && cdata->current_from_struct) { if(item->type() == TYPE_VARIABLE && (item == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT) || item == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)) && cdata->current_from_struct->isNumber() && !cdata->current_from_struct->isInteger() && !cdata->current_from_struct->number().imaginaryPartIsNonZero()) b_match = 2; } else if(prefix && cdata->to_type < 2) { for(size_t name_i = 1; name_i <= prefix->countNames() && !b_match; name_i++) { const std::string *pname = &prefix->getName(name_i).name; if(!pname->empty() && str.length() <= pname->length()) { b_match = 2; for(size_t i = 0; i < str.length(); i++) { if(str[i] != (*pname)[i]) { b_match = false; break; } } if(b_match && *pname == str) b_match = 1; } } if(cdata->to_type == 1 && b_match > 1) b_match = 0; if(b_match > cdata->highest_match) cdata->highest_match = b_match; else if(b_match == 1 && cdata->highest_match < 2) cdata->highest_match = 2; prefix = NULL; } else if(p_type == 1000) { if(cdata->show_custom_to) b_match = 2; } else if(p_type >= 100 && cdata->editing_to_expression && cdata->editing_to_expression1) { QString qstr = index.data(Qt::DisplayRole).toString(); if(cdata->to_type >= 2 && str.empty()) b_match = 2; else b_match = completion_names_match(qstr.toStdString(), str, settings->completion_min, &i_match); if(b_match > 1) { if(cdata->current_from_struct && str.length() < 3) { if(cdata->current_from_struct->isZero()) { b_match = 0; } else if(p_type >= 100 && p_type < 200) { if(cdata->to_type == 5 || cdata->current_from_struct->containsType(STRUCT_UNIT) <= 0) b_match = 0; } else if((p_type == 294 || p_type == 295 || p_type == 293 || (p_type == 292 && cdata->to_type == 4)) && !cdata->current_from_units.empty()) { bool b = false; if(p_type == 293) { if(cdata->current_from_struct->isUnit() && cdata->current_from_struct->unit()->baseUnit()->referenceName() == "s" && cdata->current_from_struct->unit()->baseExponent() == 1) { b = true; } else if(cdata->current_from_struct->isMultiplication()) { for(size_t i = 0; i < cdata->current_from_struct->size(); i++) { if((*cdata->current_from_struct)[i].isUnit() && (*cdata->current_from_struct)[i].unit()->baseUnit()->referenceName() == "s" && (*cdata->current_from_struct)[i].unit()->baseExponent() == 1) { b = true; break; } } } } else { for(size_t i = 0; i < cdata->current_from_units.size(); i++) { if(cdata->current_from_units[i] == CALCULATOR->getDegUnit()) { b = true; break; } } } if(!b) { b_match = 0; } else if(str.empty()) { int base = to_base; if(base == 0) base = settings->printops.base; if((base == BASE_SEXAGESIMAL && p_type == 292) || (base == BASE_TIME && p_type == 293) || (base == BASE_LATITUDE && p_type == 294) || (base == BASE_LONGITUDE && p_type == 295)) { b_match = 0; } } } else if(p_type > 290 && p_type < 300 && (p_type != 292 || cdata->to_type >= 1)) { if(!cdata->current_from_struct->isNumber() || (p_type > 290 && str.empty() && cdata->current_from_struct->isInteger())) b_match = 0; if(str.empty()) { int base = to_base; if(base == 0) base = settings->printops.base; if((base == BASE_SEXAGESIMAL && p_type == 292) || (base == BASE_TIME && p_type == 293) || (base == BASE_LATITUDE && p_type == 294) || (base == BASE_LONGITUDE && p_type == 295)) { b_match = 0; } } } else if(p_type >= 200 && p_type <= 290 && (p_type != 200 || cdata->to_type == 1 || cdata->to_type >= 3)) { if(!cdata->current_from_struct->isNumber()) { b_match = 0; } else if(str.empty() && p_type >= 202 && !cdata->current_from_struct->isInteger()) { b_match = 0; } else if(str.empty()) { int base = to_base; if(base == 0) base = settings->printops.base; if((p_type >= 202 && p_type <= 236 && base == p_type - 200) || (base == BASE_UNICODE && p_type == 281) || (base == BASE_BINARY_DECIMAL && p_type == 285) || (base == BASE_BIJECTIVE_26 && p_type == 290) || (base == BASE_ROMAN_NUMERALS && p_type == 280)) { b_match = 0; } } } else if(p_type >= 300 && p_type < 400) { if(p_type == 300 || p_type == 302) { if(!contains_rational_number(*cdata->current_from_struct)) b_match = 0; if(str.empty()) { ExpressionEdit *expression_edit = qobject_cast(parent()); if(expression_edit && !expression_edit->expressionHasChanged() && !settings->v_result.empty()) { bool has_decimal = false; bool has_fraction = false; for(size_t i = 0; i < 2 && i < settings->v_result.back().size() && (!has_decimal || !has_fraction); i++) { if(settings->v_result.back()[i].find(settings->printops.decimalpoint()) != std::string::npos) has_decimal = true; else if(!has_fraction && settings->v_result.back()[i].find(settings->divisionSign()) != std::string::npos) has_fraction = true; } if(p_type == 302 && has_decimal) b_match = 0; else if(p_type == 300 && has_fraction) b_match = 0; } } } else if(p_type == 301) { if((!cdata->current_from_struct->isNumber() || cdata->current_from_struct->number().isInteger() || cdata->current_from_struct->number().hasImaginaryPart())) { bool b = false; for(size_t i = 0; i < cdata->current_from_units.size(); i++) { if(cdata->current_from_units[i]->system().find("Imperial") != std::string::npos) { b = true; break; } } if(!b) b_match = 0; } } else { if(!cdata->current_from_struct->isNumber()) b_match = 0; if(p_type >= 310 && p_type <= 314) { int base = to_base; if(base == 0) base = settings->printops.base; if((base == BASE_FP16 && p_type == 310) || (base == BASE_FP32 && p_type == 311) || (base == BASE_FP64 && p_type == 312) || (base == BASE_FP80 && p_type == 313) || (base == BASE_FP128 && p_type == 314)) { b_match = 0; } } } } else if(p_type >= 400 && p_type < 500) { if(!contains_imaginary_number(*cdata->current_from_struct)) b_match = 0; if(str.empty()) { if(p_type == 404 && settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_RECTANGULAR) b_match = 0; else if(p_type == 403 && settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) b_match = 0; else if(p_type == 402 && settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_EXPONENTIAL) b_match = 0; else if(p_type == 401 && settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS && !settings->complex_angle_form) b_match = 0; else if(p_type == 400 && settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS && settings->complex_angle_form) b_match = 0; } } else if(p_type >= 500 && p_type < 600) { if(!cdata->current_from_struct->isDateTime()) b_match = 0; } else if(p_type == 600) { if(!cdata->current_from_units.empty() || (!cdata->current_from_struct->isInteger() && cdata->current_from_struct->containsType(STRUCT_ADDITION) <= 0)) b_match = 0; } else if(p_type == 601) { if(!cdata->current_from_units.empty() || cdata->current_from_struct->containsType(STRUCT_ADDITION) <= 0) b_match = 0; } else if(p_type >= 700 && p_type < 800) { int exp = to_form; if(exp == TO_FORM_OFF) exp = settings->printops.min_exp; if((p_type == 703 && (exp == 0 || !cdata->current_from_struct->isNumber())) || (p_type == 702 && exp == -3) || (p_type == 701 && exp > 0)) { b_match = 0; } else { const Number *nr_p = from_struct_get_number(*cdata->current_from_struct); if(!nr_p) { b_match = 0; } else { int absexp = (exp < -1 ? -exp : exp); Number nr(nr_p->hasImaginaryPart() ? nr_p->realPart() : *nr_p); if(nr.isFraction()) { nr.recip(); if(absexp == -1) absexp = PRECISION; } else if(absexp == -1) { absexp = PRECISION + 3; } nr.abs(); if(nr > Number(1, 1, 100)) { if(p_type == 703 || (p_type == 701 && absexp <= 100 && exp > 0)) b_match = 0; } else { if((p_type == 703 && (absexp > 100 || nr < Number(1, 1, absexp))) || (p_type == 701 && absexp <= 100 && ((absexp > 0 && exp >= -1 && nr >= Number(1, 1, absexp)) || nr < Number(1, 1, str.empty() ? 5 : 1))) || (p_type == 702 && nr < Number(1, 1, str.empty() ? 5 : 3))) { b_match = 0; } } } } } } if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } if(b_match) { sourceModel()->setData(index, b_match, MATCH_ROLE); sourceModel()->setData(index, (qulonglong) i_match, IMATCH_ROLE); QFont wfont(index.data(Qt::FontRole).value()); if(b_match == 1) wfont.setWeight(QFont::Bold); else wfont.setWeight(QFont::Normal); sourceModel()->setData(index, wfont, Qt::FontRole); } return b_match > 0; } bool ExpressionProxyModel::lessThan(const QModelIndex &index1, const QModelIndex &index2) const { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) QModelIndex s1 = index1.siblingAtColumn(0); QModelIndex s2 = index2.siblingAtColumn(0); #else QModelIndex s1 = index1.sibling(index1.row(), 0); QModelIndex s2 = index2.sibling(index2.row(), 0); #endif if(s1.isValid() && s2.isValid()) { int i1 = s1.data(MATCH_ROLE).toInt(); int i2 = s2.data(MATCH_ROLE).toInt(); if(i1 < i2) return true; if(i1 > i2) return false; if(s1.data(TYPE_ROLE).toInt() == 1000) return true; if(s2.data(TYPE_ROLE).toInt() == 1000) return false; } return QSortFilterProxyModel::lessThan(index1, index2); } void ExpressionProxyModel::setFilter(std::string sfilter) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) beginFilterChange(); #endif str = sfilter; #if (QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)) endFilterChange(Direction::Rows); #else invalidateFilter(); #endif } #define USES_TOOLTIP (!settings->status_in_statusbar && (!settings->status_in_history || !settings->show_statusbar)) ExpressionEdit::ExpressionEdit(QWidget *parent, QWidget *toolbar, QLabel *sl) : QPlainTextEdit(parent), statusLabel(sl) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif tb = toolbar; cmenu = NULL; fileMenu = NULL; tipLabel = NULL; completionTimer = NULL; toolTipTimer = NULL; completion_blocked = 0; parse_blocked = 0; block_add_to_undo = 0; expression_from_history = false; undo_index = 0; prev_group_separator = 0; cdata = new CompletionData; history_index = -1; disable_history_arrow_keys = false; block_display_parse = 0; block_text_change = 0; dont_change_index = false; cursor_has_moved = false; expression_has_changed = false; expression_has_changed2 = false; auto_calculable = false; tabbed_index = -1; enable_tab = false; use_bold_highlight = -1; previous_epos = 0; parsed_had_errors = false; parsed_had_warnings = false; parentheses_highlighted = false; setUndoRedoEnabled(false); completionModel = new ExpressionProxyModel(cdata, this); sourceModel = new QStandardItemModel(this); sourceModel->setColumnCount(3); completionModel->setSourceModel(sourceModel); completer = new QCompleter(completionModel, this); completer->setWidget(this); completer->setMaxVisibleItems(20); completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); completer->setModel(completionModel); completionView = new QTableView(); completionView->setSelectionBehavior(QAbstractItemView::SelectRows); completionView->setShowGrid(false); completionView->verticalHeader()->hide(); completionView->horizontalHeader()->hide(); completionView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); completionView->setSelectionMode(QAbstractItemView::SingleSelection); HTMLDelegate* delegate = new HTMLDelegate(); completionView->setItemDelegateForColumn(0, delegate); completionView->setItemDelegateForColumn(1, delegate); completionView->setItemDelegateForColumn(2, delegate); completer->setPopup(completionView); default_frame = -1; previous_pos = 0; if(settings->completion_delay > 0) { completionTimer = new QTimer(this); completionTimer->setSingleShot(true); connect(completionTimer, SIGNAL(timeout()), this, SLOT(complete())); } if(settings->expression_status_delay > 0 && USES_TOOLTIP) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } connect(this, SIGNAL(textChanged()), this, SLOT(onTextChanged())); connect(this, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged())); connect(completer, SIGNAL(activated(const QModelIndex&)), this, SLOT(onCompletionActivated(const QModelIndex&))); connect(completer, SIGNAL(highlighted(const QModelIndex&)), this, SLOT(onCompletionHighlighted(const QModelIndex&))); qApp->installEventFilter(this); } ExpressionEdit::~ExpressionEdit() {} int ExpressionEdit::parsedCalculable() { return auto_calculable; } void ExpressionEdit::updateMinimumHeight() { QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) setMinimumHeight(fm.lineSpacing() * 1 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else setMinimumHeight(fm.lineSpacing() * 1 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif } void ExpressionEdit::changeEvent(QEvent *e) { if(e->type() == QEvent::FontChange) { updateMinimumHeight(); use_bold_highlight = -1; } QPlainTextEdit::changeEvent(e); } bool ExpressionEdit::eventFilter(QObject *o, QEvent *e) { switch(e->type()) { #if defined (Q_OS_QNX) case QEvent::WindowActivate: case QEvent::WindowDeactivate: if(!tipLabel && o == tipLabel) return false; tipLabel->hideTipImmediately(); break; #else case QEvent::WindowActivate: case QEvent::WindowDeactivate: #endif case QEvent::Close: case QEvent::Wheel: if(tipLabel) tipLabel->hideTipImmediately(); break; case QEvent::MouseMove: if(completionView->isVisible()) { if(toolTipTimer) toolTipTimer->stop(); if(tipLabel) tipLabel->hideTip(); } #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) if(tipLabel && tipLabel->isVisible() && QRect(tb->parentWidget()->mapToGlobal(tb->pos()), tb->size()).contains(((QMouseEvent*) e)->globalPosition().toPoint()) && tipLabel->pos().x() + tipLabel->width() > mapToGlobal(QPoint(width(), 0)).x()) tipLabel->hideTipImmediately(); #else if(tipLabel && tipLabel->isVisible() && QRect(tb->parentWidget()->mapToGlobal(tb->pos()), tb->size()).contains(((QMouseEvent*) e)->globalPos()) && tipLabel->pos().x() + tipLabel->width() > mapToGlobal(QPoint(width(), 0)).x()) tipLabel->hideTipImmediately(); #endif break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: if(tipLabel && o == tipLabel) tipLabel->hideTipImmediately(); break; default: break; } return false; } #define COMPLETION_APPEND_M(x, y, z, m) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ if(m) { \ QFont font = completionView->font(); \ font.setWeight(QFont::Bold); \ item->setData(font, Qt::FontRole); \ } else { \ item->setData(completionView->font(), Qt::FontRole); \ } \ item->setData(QVariant::fromValue((void*) NULL), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(m), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_2(x, y, y2, z, p) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ item = new QStandardItem(y2); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_2T(x, y, y2, z, p, t) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ item = new QStandardItem(y2); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_C(x, y, z, p) COMPLETION_APPEND_2(x, y, y, z, p) #define COMPLETION_APPEND_T(x, y, z, p, t) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ if(!t.isEmpty()) item->setData("

" + t + "

", Qt::ToolTipRole);\ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND(x, y, z, p) {items.clear(); \ QStandardItem *item = new QStandardItem(x); \ item->setData(completionView->font(), Qt::FontRole); \ item->setData(QVariant::fromValue((void*) p), ITEM_ROLE); \ item->setData(QVariant::fromValue(z), TYPE_ROLE); \ item->setData(QVariant::fromValue(0), MATCH_ROLE); \ item->setData(QVariant::fromValue(0), IMATCH_ROLE); \ items.append(item); \ item = new QStandardItem(y); \ item->setData(ifont, Qt::FontRole); \ items.append(item); \ sourceModel->appendRow(items);} #define COMPLETION_APPEND_FLAG(x, y, y2, z, p, t) \ if(!QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) {COMPLETION_APPEND_2T(x, y, y2, z, p, t)} \ else if(flagheight <= 0) {COMPLETION_APPEND_2T(x, QStringLiteral("%1  ").arg(y).arg(QString::fromStdString(u->referenceName())), QStringLiteral("%1").arg(y2).arg(QString::fromStdString(u->referenceName())), z, p, t)} \ else {COMPLETION_APPEND_2T(x, QStringLiteral("%1  ").arg(y).arg(flagheight).arg(QString::fromStdString(u->referenceName())), QStringLiteral("%1").arg(y2).arg(QString::fromStdString(u->referenceName())), z, p, t)} #define MAX_COMPLETION_LENGTH_1 25 #define MAX_COMPLETION_LENGTH_2 25 bool ellipsize_completion_names(std::string &str) { if(str.length() < MAX_COMPLETION_LENGTH_1 + 15) return false; size_t l = 0, l_insub = 0, first_i = 0; bool insub = false; for(size_t i = 0; i < str.length(); i++) { if(str[i] == '<') { if(i + 1 == str.length()) break; if(str[i + 1] == 's') {insub = true; l_insub = l;} else if(insub && str[i + 1] == '/') {insub = false; l -= ((l - l_insub) * 6) / 10;} else if(first_i == 0 && str[i + 1] == 'i') first_i = i; i = str.find('>', i + 1); if(i == std::string::npos) break; } else if((signed char) str[i] > 0 || (unsigned char) str[i] >= 0xC0) { if(first_i > 0 && l >= MAX_COMPLETION_LENGTH_1 && (!insub || l - ((l - l_insub) * 6) / 10 >= MAX_COMPLETION_LENGTH_1) && i < str.length() - 2 && str[i + 1] != '<' && str[i + 1] != ')' && str[i + 1] != '(') { str = str.substr(0, i); str += "…"; if(insub) str += ""; str += "
"; return true; } l++; } } return false; } void ellipsize_title(QString &str, int max_length) { if(str.length() > max_length) { int i = str.lastIndexOf("("); if(i <= max_length && i > max_length - 10) { str.truncate(i); } else { str.truncate(max_length - 4); str += "…"; } } } bool name_has_formatting(const ExpressionName *ename) { if(ename->name.length() < 2) return false; if(ename->suffix) return true; if(ename->completion_only || ename->case_sensitive || ename->name.length() <= 4) return false; size_t i = ename->name.find('_'); if(i == std::string::npos) return false; return unicode_length(ename->name, i) >= 3; } std::string format_name(const ExpressionName *ename, int type) { bool was_capitalized = false; std::string name = ename->formattedName(type, true, true, 0, false, false, NULL, &was_capitalized); if(was_capitalized) { if(ename->suffix) { std::string str = name; size_t i = str.find(""); if(i != std::string::npos) { str.erase(str.length() - 6, 6); str.erase(i, 5); char *cap_str = utf8_strup(str.c_str() + sizeof(char) * i); if(cap_str) { str.replace(i, str.length() - i, cap_str); free(cap_str); } } capitalized_names[ename] = str; } else { capitalized_names[ename] = name; } } return name; } void ExpressionEdit::updateCompletion() { QFont ifont(completionInitialized() ? qApp->font() : completionView->font()); sourceModel->clear(); capitalized_names.clear(); std::string str, strs; QString title, title2, tooltip; QList items; QFontMetrics fm(ifont); int max_length = ((width() * 2) / 3) / fm.averageCharWidth(); if(max_length > 50) { max_length = (width() / 2) / fm.averageCharWidth(); if(max_length < 50) max_length = 50; } else if(max_length < 40) { max_length = 40; } int flagheight = fm.ascent(); ifont.setStyle(QFont::StyleItalic); for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive()) { const ExpressionName *ename, *ename_r; ename_r = &f->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); if(name_has_formatting(ename_r)) str = format_name(ename_r, TYPE_FUNCTION); else str = ename_r->name; str += "()"; for(size_t name_i = 1; name_i <= f->countNames(); name_i++) { ename = &f->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), this))) { str += " "; if(name_has_formatting(ename)) str += format_name(ename, TYPE_FUNCTION); else str += ename->name; str += "()"; } } ellipsize_completion_names(str); tooltip = QString::fromStdString(f->description()); title = QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)); if(title.length() > max_length) { if(tooltip.isEmpty()) tooltip = title; ellipsize_title(title, max_length); } COMPLETION_APPEND_T(QString::fromStdString(str), title, 1, f, tooltip) } } for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive()) { const ExpressionName *ename, *ename_r; bool b = false; ename_r = &v->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); for(size_t name_i = 1; name_i <= v->countNames(); name_i++) { ename = &v->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { if(!b) { if(name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_VARIABLE); } else { str = ename_r->name; } b = true; } str += " "; if(name_has_formatting(ename)) { str += format_name(ename, TYPE_VARIABLE); } else { str += ename->name; } str += ""; } } if(!b && name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_VARIABLE); b = true; } if(settings->printops.use_unicode_signs && can_display_unicode_string_function("→", completionView)) { size_t pos = 0; if(b) { pos = str.find("_to_"); } else { pos = ename_r->name.find("_to_"); if(pos != std::string::npos) { str = ename_r->name; b = true; } } if(b) { while(pos != std::string::npos) { if((pos == 1 && str[0] == 'm') || (pos > 1 && str[pos - 1] == 'm' && str[pos - 2] == '>')) { str.replace(pos, 4, "-1→"); } else { str.replace(pos, 4, "→"); } pos = str.find("_to_", pos); } } } ellipsize_completion_names(str); tooltip.clear(); if(!v->title(false).empty()) { title = QString::fromStdString(v->title(false)).replace("MeV/c^2", "MeV/c²"); if(title.length() > max_length) { tooltip = title; ellipsize_title(title, max_length); } } else { if(v->isKnown()) { if(((KnownVariable*) v)->isExpression() && !v->isLocal()) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; title = QString::fromStdString(CALCULATOR->localizeExpression(((KnownVariable*) v)->expression(), pa)); if(title.length() > MAX_COMPLETION_LENGTH_2) {title = title.left(MAX_COMPLETION_LENGTH_2); title += "…";} else if(!((KnownVariable*) v)->unit().empty() && ((KnownVariable*) v)->unit() != "auto") {title += " "; title += QString::fromStdString(((KnownVariable*) v)->unit());} } else { if(((KnownVariable*) v)->get().isMatrix()) { title = tr("matrix"); } else if(((KnownVariable*) v)->get().isVector()) { title = tr("vector"); } else { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) completionView; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.allow_non_usable = true; po.is_approximate = NULL; title = QString::fromStdString(CALCULATOR->print(((KnownVariable*) v)->get(), MAX_COMPLETION_LENGTH_2, po)); if(title.length() > MAX_COMPLETION_LENGTH_2) {title = title.left(MAX_COMPLETION_LENGTH_2); title += "…";} } } } else { if(((UnknownVariable*) v)->assumptions()) { switch(((UnknownVariable*) v)->assumptions()->sign()) { case ASSUMPTION_SIGN_POSITIVE: {title = tr("positive"); break;} case ASSUMPTION_SIGN_NONPOSITIVE: {title = tr("non-positive"); break;} case ASSUMPTION_SIGN_NEGATIVE: {title = tr("negative"); break;} case ASSUMPTION_SIGN_NONNEGATIVE: {title = tr("non-negative"); break;} case ASSUMPTION_SIGN_NONZERO: {title = tr("non-zero"); break;} default: {} } if(!title.isEmpty() && ((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_NONE) title += " "; switch(((UnknownVariable*) v)->assumptions()->type()) { case ASSUMPTION_TYPE_BOOLEAN: {title += tr("boolean"); break;} case ASSUMPTION_TYPE_INTEGER: {title += tr("integer"); break;} case ASSUMPTION_TYPE_RATIONAL: {title += tr("rational"); break;} case ASSUMPTION_TYPE_REAL: {title += tr("real"); break;} case ASSUMPTION_TYPE_COMPLEX: {title += tr("complex"); break;} case ASSUMPTION_TYPE_NUMBER: {title += tr("number"); break;} case ASSUMPTION_TYPE_NONMATRIX: {title += tr("(not matrix)"); break;} default: {} } if(title.isEmpty()) title = tr("unknown"); } else { title = tr("default assumptions"); } } } if(v == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT) || v == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)) { if(tooltip.isEmpty()) title2 = title; else title2 = tooltip; if(v == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT)) title2 += " (%)"; else title2 += " (‰)"; COMPLETION_APPEND_2T(QString::fromStdString(b ? str : ename_r->name), title, title2, 1, v, tooltip) } else { COMPLETION_APPEND_T(QString::fromStdString(b ? str : ename_r->name), title, 1, v, tooltip) } } } PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) completionView; po.abbreviate_names = true; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive()) { CompositeUnit *cu = (u->subtype() == SUBTYPE_COMPOSITE_UNIT ? (CompositeUnit*) u : NULL); if(!cu && u->isHidden() && u->subtype() == SUBTYPE_ALIAS_UNIT && ((AliasUnit*) u)->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT && !((AliasUnit*) u)->firstBaseUnit()->isHidden() && ((AliasUnit*) u)->firstBaseUnit()->isActive()) { cu = (CompositeUnit*) ((AliasUnit*) u)->firstBaseUnit(); } if(!cu) { const ExpressionName *ename, *ename_r; bool b = false; ename_r = &u->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); for(size_t name_i = 1; name_i <= u->countNames(); name_i++) { ename = &u->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { if(!b) { if(name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_UNIT); } else { str = ename_r->name; } b = true; } str += " "; if(name_has_formatting(ename)) { str += format_name(ename, TYPE_UNIT); } else { str += ename->name; } str += ""; } } if(!b && name_has_formatting(ename_r)) { str = format_name(ename_r, TYPE_UNIT); b = true; } else { ellipsize_completion_names(str); } if(u->title(false).empty()) { if(name_has_formatting(ename_r)) title2 = QString::fromStdString(format_name(ename_r, TYPE_UNIT)); else title2 = QString::fromStdString(ename_r->name); } else { title2 = QString::fromStdString(u->title(false)); ename = &u->preferredInputName(true, settings->printops.use_unicode_signs, false, u->isCurrency(), &can_display_unicode_string_function, completionView); if(ename->abbreviation && (!ename->suffix || (ename->name.length() > 5 && ename->name.find("_unit", ename->name.length() - 5) != std::string::npos))) { bool tp = title2[title2.length() - 1] == ')'; title2 += " "; if(!tp) title2 += "("; if(name_has_formatting(ename)) title2 += QString::fromStdString(ename->formattedName(TYPE_UNIT, true, false, -1, true)); else title2 += QString::fromStdString(ename->name); if(!tp) title2 += ")"; if(title2.contains("_")) title2 = QString::fromStdString(u->title(false)); } } title = QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)); if(u->isCurrency()) { if(title.length() > max_length) { tooltip = title; ellipsize_title(title, max_length); } else { tooltip.clear(); } COMPLETION_APPEND_FLAG(QString::fromStdString(b ? str : ename_r->name), title, title2, 1, u, tooltip) } else { if(u->isSIUnit() && !u->category().empty() && title[title.length() - 1] != ')') { size_t i_slash = std::string::npos; if(u->category().length() > 1) i_slash = u->category().rfind("/", u->category().length() - 2); if(i_slash != std::string::npos) i_slash++; if((size_t) title.length() + u->category().length() - (i_slash == std::string::npos ? 0 : i_slash) < MAX_COMPLETION_LENGTH_1) { title += " ("; if(i_slash == std::string::npos) title += QString::fromStdString(u->category()); else title += QString::fromStdString(u->category().substr(i_slash, u->category().length() - i_slash)); title += ")"; } } if(title.length() > max_length) { tooltip = title; if(title2.isEmpty()) title2 = title; ellipsize_title(title, max_length); } else { tooltip.clear(); } COMPLETION_APPEND_2T(QString::fromStdString(b ? str : ename_r->name), title, title2.isEmpty() ? title : title2, 1, u, tooltip) } } else if(!cu->isHidden()) { title = QString::fromStdString(cu->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, completionView)); title2 = title; bool tp = title2[title2.length() - 1] == ')'; title2 += " "; if(!tp) title2 += "("; Prefix *prefix = NULL; int exp = 1; Unit *u_i = NULL; if(cu->countUnits() == 1 && (u_i = cu->get(1, &exp, &prefix)) != NULL && prefix != NULL && exp == 1) { str = ""; for(size_t name_i = 0; name_i < 2; name_i++) { const ExpressionName *ename; ename = &prefix->preferredInputName(name_i != 1, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); if(!ename->name.empty() && (ename->abbreviation == (name_i != 1))) { bool b_italic = !str.empty(); if(b_italic) str += " "; str += ename->formattedName(-1, false, true); const ExpressionName *ename2 = &u_i->preferredInputName(name_i != 1, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); str += ename2->formattedName(TYPE_UNIT, true, true); if(b_italic) str += ""; if(!b_italic) { if(str.find("<") == std::string::npos) { title2 += QString::fromStdString(str); } else { title2 += QString::fromStdString(ename->formattedName(TYPE_UNIT, true, false, -1, true) + ename2->formattedName(TYPE_UNIT, true, false, -1, true)); } } } } ellipsize_completion_names(str); } else { str = cu->print(po, true, TAG_TYPE_HTML, true, false); if(str.find("<") == std::string::npos) { title2 += QString::fromStdString(str); } else { title2 += QString::fromStdString(cu->print(po, true, TAG_TYPE_TERMINAL, false, false)); } } if(!tp) title2 += ")"; size_t i_slash = std::string::npos; if(cu->category().length() > 1) i_slash = cu->category().rfind("/", cu->category().length() - 2); if(i_slash != std::string::npos) i_slash++; tooltip.clear(); if(cu->isSIUnit() && !cu->category().empty()) { if(title.length() + cu->category().length() - (i_slash == std::string::npos ? 0 : i_slash) < MAX_COMPLETION_LENGTH_1 && title[title.length() - 1] != ')') { title += " ("; if(i_slash == std::string::npos) title += QString::fromStdString(cu->category()); else title += QString::fromStdString(cu->category().substr(i_slash, cu->category().length() - i_slash)); title += ")"; } else { tooltip = title; if(i_slash == std::string::npos) title = QString::fromStdString(cu->category()); else title = QString::fromStdString(cu->category().substr(i_slash, cu->category().length() - i_slash)); } } if(title.length() > max_length) { if(tooltip.isEmpty()) tooltip = title; ellipsize_title(title, max_length); } COMPLETION_APPEND_2T(QString::fromStdString(str), title, title2, 1, u, tooltip) } } } QString sprefix = tr("Prefix:"); for(size_t i = 1; ; i++) { Prefix *p = CALCULATOR->getPrefix(i); if(!p) break; str = ""; const ExpressionName *ename, *ename_r; ename_r = &p->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, completionView); str = ename_r->formattedName(-1, false, true); for(size_t name_i = 1; name_i <= p->countNames(); name_i++) { ename = &p->getName(name_i); if(ename && ename != ename_r && !ename->completion_only && !ename->plural && (!ename->unicode || can_display_unicode_string_function(ename->name.c_str(), completionView))) { str += " "; str += ename->formattedName(-1, false, true); if(ename->name != "k" && ename->name != "M") str += "-"; str += ""; } } ellipsize_completion_names(str); title = sprefix; title += " "; switch(p->type()) { case PREFIX_DECIMAL: { title += "10"; title += QString::number(((DecimalPrefix*) p)->exponent()); title += ""; break; } case PREFIX_BINARY: { title += "2"; title += QString::number(((BinaryPrefix*) p)->exponent()); title += ""; break; } case PREFIX_NUMBER: { title += QString::fromStdString(((NumberPrefix*) p)->value().print()); break; } } COMPLETION_APPEND(QString::fromStdString(str), title, 2, p) } QString str1, str2; #define COMPLETION_CONVERT_STRING(x) str1 = tr(x); if(str1 != x) {str1 += " "; str1 += x; str1 += "";} #define COMPLETION_CONVERT_STRING2(x, y) str1 = tr(x); if(str1 != x) {str1 += " "; str1 += x; str1 += "";} str2 = tr(y); str1 += " "; str1 += str2; str1 += ""; if(str2 != y) {str1 += " "; str1 += y; str1 += "";} COMPLETION_CONVERT_STRING2("angle", "phasor") COMPLETION_APPEND_C(str1, tr("Complex Angle/Phasor Notation"), 400, NULL) /*COMPLETION_CONVERT_STRING("bases") COMPLETION_APPEND_C(str1, tr("Number bases"), 201, NULL)*/ COMPLETION_CONVERT_STRING("base") COMPLETION_APPEND_C(str1, tr("Base units"), 101, NULL) COMPLETION_APPEND_C("", tr("Custom"), 1000, NULL) COMPLETION_CONVERT_STRING("base ") COMPLETION_APPEND_C(str1, tr("Number Base"), 200, NULL) COMPLETION_APPEND_C("bcd", tr("Binary-Coded Decimal"), 285, NULL) COMPLETION_CONVERT_STRING("bijective") COMPLETION_APPEND_C(str1, tr("Bijective Base-26"), 290, NULL) COMPLETION_CONVERT_STRING("binary") str1 += " "; str1 += "bin"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Binary Number"), 202, NULL) COMPLETION_CONVERT_STRING("calendars") COMPLETION_APPEND_C(str1, tr("Calendars"), 500, NULL) COMPLETION_CONVERT_STRING("cis") COMPLETION_APPEND_C(str1, tr("Complex cis Form"), 401, NULL) COMPLETION_CONVERT_STRING("decimals") COMPLETION_APPEND_C(str1, tr("Decimal Fraction"), 302, NULL) COMPLETION_CONVERT_STRING("decimal") str1 += " "; str1 += "dec"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Decimal Number"), 210, NULL) COMPLETION_CONVERT_STRING("duodecimal") str1 += " "; str1 += "duo"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Duodecimal Number"), 212, NULL) COMPLETION_CONVERT_STRING("engineering") str1 += " "; str1 += "eng"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Engineering Notation"), 702, NULL) COMPLETION_CONVERT_STRING("exponential") COMPLETION_APPEND_C(str1, tr("Complex Exponential Form"), 402, NULL) COMPLETION_CONVERT_STRING("factors") COMPLETION_APPEND_C(str1, tr("Factors"), 600, NULL) COMPLETION_CONVERT_STRING("fp16") str1 += " "; str1 += "binary16"; str1 += ""; COMPLETION_APPEND_C(str1, tr("16-bit Floating Point Binary Format"), 310, NULL) COMPLETION_CONVERT_STRING("fp32") str1 += " "; str1 += "binary32"; str1 += ""; str1 += " "; str1 += "float"; str1 += ""; COMPLETION_APPEND_C(str1, tr("32-bit Floating Point Binary Format"), 311, NULL) COMPLETION_CONVERT_STRING("fp64") str1 += " "; str1 += "binary64"; str1 += ""; str1 += " "; str1 += "double"; str1 += ""; COMPLETION_APPEND_C(str1, tr("64-bit Floating Point Binary Format"), 312, NULL) COMPLETION_CONVERT_STRING("fp80"); COMPLETION_APPEND_C(str1, tr("80-bit (x86) Floating Point Binary Format"), 313, NULL) COMPLETION_CONVERT_STRING("fp128") str1 += " "; str1 += "binary128"; str1 += ""; COMPLETION_APPEND_C(str1, tr("128-bit Floating Point Binary Format"), 314, NULL) COMPLETION_CONVERT_STRING("1/") COMPLETION_APPEND_C(str1, tr("Fraction") + " (1/n)", 301, NULL) COMPLETION_CONVERT_STRING("fraction") COMPLETION_APPEND_C(str1, tr("Fraction"), 300, NULL) COMPLETION_CONVERT_STRING("hexadecimal") str1 += " "; str1 += "hex"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Hexadecimal Number"), 216, NULL) COMPLETION_CONVERT_STRING("latitude") str1 += " "; str1 += "latitude2"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Latitude"), 294, NULL) COMPLETION_CONVERT_STRING("longitude") str1 += " "; str1 += "longitude2"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Longitude"), 295, NULL) COMPLETION_CONVERT_STRING("mixed") COMPLETION_APPEND_C(str1, tr("Mixed Units"), 102, NULL) COMPLETION_CONVERT_STRING("octal") str1 += " "; str1 += "oct"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Octal Number"), 208, NULL) COMPLETION_CONVERT_STRING("optimal") COMPLETION_APPEND_C(str1, tr("Optimal Unit"), 100, NULL) COMPLETION_CONVERT_STRING("prefix") COMPLETION_APPEND_C(str1, tr("Optimal Prefix"), 103, NULL) COMPLETION_CONVERT_STRING("partial fraction") COMPLETION_APPEND_C(str1, tr("Expanded Partial Fractions"), 601, NULL) COMPLETION_CONVERT_STRING("polar") COMPLETION_APPEND_C(str1, tr("Complex Polar Form"), 403, NULL) COMPLETION_CONVERT_STRING2("rectangular", "cartesian") COMPLETION_APPEND_C(str1, tr("Complex Rectangular Form"), 404, NULL) COMPLETION_CONVERT_STRING("roman") COMPLETION_APPEND_C(str1, tr("Roman Numerals"), 280, NULL) COMPLETION_CONVERT_STRING("scientific") str1 += " "; str1 += "sci"; str1 += ""; COMPLETION_APPEND_C(str1, tr("Scientific Notation"), 701, NULL) COMPLETION_CONVERT_STRING("sexagesimal") str += " "; str += "sexa"; str += ""; str += " "; str += "sexa2"; str += ""; str += " "; str += "sexa3"; str += ""; COMPLETION_APPEND_C(str1, tr("Sexagesimal Number"), 292, NULL) COMPLETION_CONVERT_STRING("simple") COMPLETION_APPEND_C(str1, tr("Simple Notation"), 703, NULL) COMPLETION_CONVERT_STRING("time") COMPLETION_APPEND_C(str1, tr("Time Format"), 293, NULL) COMPLETION_CONVERT_STRING("unicode") COMPLETION_APPEND_C(str1, tr("Unicode"), 281, NULL) COMPLETION_CONVERT_STRING("utc") COMPLETION_APPEND_C(str1, tr("UTC Time Zone"), 501, NULL) } void ExpressionEdit::setExpression(std::string str) { setExpression(QString::fromStdString(str)); } void ExpressionEdit::setExpression(const QString &str) { if(str.isEmpty()) { clear(); return; } block_add_to_undo++; setCursorWidth(0); block_text_change++; clear(); block_text_change--; block_add_to_undo--; insertPlainText(str); setCursorWidth(1); highlightParentheses(); } std::string ExpressionEdit::expression() const { return toPlainText().toStdString(); } QSize ExpressionEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } void ExpressionEdit::inputMethodEvent(QInputMethodEvent *event) { if(event->commitString() == "â�½") event->setCommitString("^("); if(event->commitString() == "â�°" || event->commitString() == "¹" || event->commitString() == "²" || event->commitString() == "³" || event->commitString() == "â�´" || event->commitString() == "â�µ" || event->commitString() == "â�¶" || event->commitString() == "â�·" || event->commitString() == "â�¸" || event->commitString() == "â�¹" || event->commitString() == "â�»") { wrapSelection(event->commitString()); return; } QPlainTextEdit::inputMethodEvent(event); } void ExpressionEdit::keyReleaseEvent(QKeyEvent *event) { if(!event->isAutoRepeat()) disable_history_arrow_keys = false; QPlainTextEdit::keyReleaseEvent(event); } void ExpressionEdit::enableTabCompletion(bool b) {enable_tab = b;} bool ExpressionEdit::completeOrActivateFirst(bool backwards) { if(completionView->isVisible()) { if(completionView->currentIndex().isValid()) { onCompletionActivated(completionView->currentIndex()); tabbed_index = completionView->currentIndex().row(); } else { onCompletionActivated(completionModel->index(0, 0)); tabbed_index = 0; } return true; } else if(tabbed_index >= 0) { if(backwards) tabbed_index--; else tabbed_index++; if(tabbed_index < 0) tabbed_index = completionModel->rowCount() - 1; else if(tabbed_index >= completionModel->rowCount()) tabbed_index = 0; int ti_bak = tabbed_index; onCompletionActivated(completionModel->index(tabbed_index, 0)); tabbed_index = ti_bak; return true; } else { int cm_bak = settings->completion_min; settings->completion_min = 1; complete(NULL, NULL, NULL, false, true); settings->completion_min = cm_bak; } return completionView->isVisible(); } void ExpressionEdit::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Undo)) { editUndo(); return; } if(event->matches(QKeySequence::Redo)) { editRedo(); return; } if(event->matches(QKeySequence::Copy)) { if(!textCursor().hasSelection() && !settings->v_result.empty()) { if(settings->copy_ascii) { std::string str = settings->v_result[settings->v_result.size() - 1][0]; if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[settings->v_result.size() - 1][0]))); qm->setText(QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0]))); qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } return; } else if(settings->copy_ascii && textCursor().hasSelection()) { QApplication::clipboard()->setText(QString::fromStdString(unformat(textCursor().selectedText().toStdString(), true))); return; } } else if(event->matches(QKeySequence::Cut) && settings->copy_ascii && textCursor().hasSelection()) { QApplication::clipboard()->setText(QString::fromStdString(unformat(textCursor().selectedText().toStdString(), true))); textCursor().deleteChar(); return; } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Insert: { if(event->modifiers() != Qt::ShiftModifier) setOverwriteMode(!overwriteMode()); break; } case Qt::Key_Asterisk: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_MULTIPLY); return; } if(expressionInQuotes()) break; if(doChainMode(settings->multiplicationSign())) return; wrapSelection(settings->multiplicationSign()); return; } case Qt::Key_Minus: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { int pos = 0; if(textCursor().hasSelection()) pos = textCursor().selectionStart(); else pos = textCursor().position(); if(pos >= 2) { pos--; if((document()->characterAt(pos) == 'E' || document()->characterAt(pos) == 'e') && document()->characterAt(pos - 1).isNumber()) { insertPlainText(settings->printops.use_unicode_signs ? SIGN_MINUS : "-"); return; } } emit calculateRPNRequest(OPERATION_SUBTRACT); return; } if(expressionInQuotes()) break; if(doChainMode(settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) return; wrapSelection(settings->printops.use_unicode_signs ? SIGN_MINUS : "-"); return; } case Qt::Key_Dead_Circumflex: { if(!event->text().isEmpty() && event->text() != "^") break; if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(settings->caret_as_xor ? OPERATION_BITWISE_XOR : OPERATION_RAISE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->caret_as_xor ? " xor " : "^")) return; wrapSelection(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { if(!event->text().isEmpty() && event->text() != "~") break; insertPlainText("~"); return; } case Qt::Key_AsciiCircum: { if(!event->text().isEmpty() && event->text() != "^") break; if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(settings->caret_as_xor ? OPERATION_BITWISE_XOR : OPERATION_RAISE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->caret_as_xor ? " xor " : "^")) return; wrapSelection(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Plus: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_ADD); return; } if(expressionInQuotes()) break; if(doChainMode("+")) return; wrapSelection("+"); return; } case Qt::Key_Slash: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_DIVIDE); return; } if(expressionInQuotes()) break; if(doChainMode(settings->divisionSign(false))) return; wrapSelection(settings->divisionSign(false)); return; } case Qt::Key_ParenRight: { QTextCursor cur = textCursor(); if(cur.hasSelection() || cur.position() == 0) { smartParentheses(); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_RAISE); return; } if(doChainMode("^")) return; wrapSelection("^"); return; } if(event->modifiers() == Qt::ControlModifier || (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { switch(event->key()) { case Qt::Key_A: { if(event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) { if(doChainMode("∠")) return; insertPlainText("∠"); return; } break; } case Qt::Key_ParenLeft: {} case Qt::Key_ParenRight: { smartParentheses(); return; } case Qt::Key_E: { if(settings->rpn_mode && settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN) { emit calculateRPNRequest(OPERATION_EXP10); return; } } } } if((event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab) && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == (Qt::ShiftModifier | Qt::KeypadModifier))) { if(enable_tab) { if(!completeOrActivateFirst(event->modifiers() & Qt::ShiftModifier || event->key() == Qt::Key_Backtab)) event->ignore(); } else { if(completionView->isVisible()) { QKeyEvent *e = new QKeyEvent(event->type(), event->modifiers() & Qt::ShiftModifier || event->key() == Qt::Key_Backtab ? Qt::Key_Up : Qt::Key_Down, Qt::NoModifier, QString(), event->isAutoRepeat(), event->count()); QApplication::postEvent(completionView, e); } else { event->ignore(); } } return; } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Escape: { if(CALCULATOR->busy()) { CALCULATOR->abort(); } else if(completionView->isVisible()) { completionView->hide(); if((!tipLabel || !tipLabel->isVisible()) && USES_TOOLTIP) { if(settings->expression_status_delay > 0) { if(!toolTipTimer) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } toolTipTimer->start(settings->expression_status_delay); } else { showCurrentStatus(); } } } else if(document()->isEmpty()) { if(settings->close_with_esc) qApp->closeAllWindows(); } else { clear(); } return; } case Qt::Key_Return: {} case Qt::Key_Enter: { if(completionView->isVisible() && completionView->currentIndex().isValid()) { onCompletionActivated(completionView->currentIndex()); } else if(settings->rpn_mode || !document()->isEmpty()) { emit returnPressed(); } return; } case Qt::Key_Up: { if(completionView->isVisible() || disable_history_arrow_keys || event->modifiers() == Qt::ShiftModifier) break; QTextCursor c = textCursor(); bool b = (cursor_has_moved && (!c.atStart() || c.hasSelection())) || (!c.atEnd() && !c.atStart()) || history_index + 1 >= (int) settings->expression_history.size(); if(b) { QString text = toPlainText(); if((b && c.atStart()) || text.lastIndexOf("\n", c.position() - 1) >= 0) { disable_history_arrow_keys = true; break; } else { QTextCursor c = textCursor(); c.movePosition(QTextCursor::Start); setTextCursor(c); disable_history_arrow_keys = true; return; } } if(history_index + 1 < (int) settings->expression_history.size()) { if(history_index == -1) current_history = toPlainText(); history_index++; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = true; else blockParseStatus(true); if(history_index == -1 && (current_history.isEmpty() || current_history == toPlainText())) history_index = 0; if(history_index == -1) setExpression(current_history); else if(settings->expression_history.empty()) history_index = -1; else setExpression(QString::fromStdString(settings->expression_history[history_index])); if(settings->status_in_history) { expression_from_history = false; } else { blockParseStatus(false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } blockCompletion(false); dont_change_index = false; } else { break; } if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_PageUp: { if(history_index + 1 < (int) settings->expression_history.size()) { if(history_index == -1) current_history = toPlainText(); history_index++; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = true; else blockParseStatus(true); if(history_index == -1 && (current_history.isEmpty() || current_history == toPlainText())) history_index = 0; if(history_index == -1) setExpression(current_history); else if(settings->expression_history.empty()) history_index = -1; else setExpression(QString::fromStdString(settings->expression_history[history_index])); if(settings->status_in_history) { expression_from_history = false; } else { blockParseStatus(false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } blockCompletion(false); dont_change_index = false; } else { break; } if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_Down: { if(completionView->isVisible() || disable_history_arrow_keys) break; QTextCursor c = textCursor(); bool b = (cursor_has_moved && (!c.atEnd() || c.hasSelection())) || (!c.atEnd() && !c.atStart()); if(b) { QString text = toPlainText(); if((b && c.atEnd()) || text.indexOf("\n", c.position()) >= 0) { disable_history_arrow_keys = true; break; } else { QTextCursor c = textCursor(); c.movePosition(QTextCursor::End); setTextCursor(c); disable_history_arrow_keys = true; return; } } if(history_index == -1) current_history = toPlainText(); if(history_index >= -1) history_index--; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = (history_index >= 0); else blockParseStatus(true); if(history_index < 0) { if(history_index == -1 && current_history != toPlainText()) setExpression(current_history); else clear(); } else { setExpression(QString::fromStdString(settings->expression_history[history_index])); } if(settings->status_in_history) { expression_from_history = false; } else { blockParseStatus(false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } blockCompletion(false); dont_change_index = false; if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_PageDown: { if(history_index == -1) current_history = toPlainText(); if(history_index >= -1) history_index--; dont_change_index = true; blockCompletion(true); if(settings->status_in_history) expression_from_history = (history_index >= 0); else blockParseStatus(true); if(history_index < 0) { if(history_index == -1 && current_history != toPlainText()) setExpression(current_history); else clear(); } else { setExpression(QString::fromStdString(settings->expression_history[history_index])); } if(settings->status_in_history) { expression_from_history = false; } else { blockParseStatus(false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } blockCompletion(false); dont_change_index = false; if(event->key() == Qt::Key_Up) cursor_has_moved = false; return; } case Qt::Key_Home: { QTextCursor c = textCursor(); c.movePosition(QTextCursor::Start); setTextCursor(c); return; } case Qt::Key_End: { QTextCursor c = textCursor(); c.movePosition(QTextCursor::End); setTextCursor(c); return; } } } QPlainTextEdit::keyPressEvent(event); } void ExpressionEdit::contextMenuEvent(QContextMenuEvent *e) { if(!cmenu) { cmenu = new QMenu(this); undoAction = cmenu->addAction(tr("Undo"), this, SLOT(editUndo())); undoAction->setShortcut(QKeySequence::Undo); undoAction->setShortcutContext(Qt::WidgetShortcut); redoAction = cmenu->addAction(tr("Redo"), this, SLOT(editRedo())); redoAction->setShortcut(QKeySequence::Redo); redoAction->setShortcutContext(Qt::WidgetShortcut); cmenu->addSeparator(); cutAction = cmenu->addAction(tr("Cut"), this, SLOT(cut())); cutAction->setShortcut(QKeySequence::Cut); cutAction->setShortcutContext(Qt::WidgetShortcut); copyAction = cmenu->addAction(tr("Copy"), this, SLOT(copy())); copyAction->setShortcut(QKeySequence::Copy); copyAction->setShortcutContext(Qt::WidgetShortcut); pasteAction = cmenu->addAction(tr("Paste"), this, SLOT(paste())); pasteAction->setShortcut(QKeySequence::Paste); pasteAction->setShortcutContext(Qt::WidgetShortcut); deleteAction = cmenu->addAction(tr("Delete"), this, SLOT(editDelete())); deleteAction->setShortcut(QKeySequence::Delete); deleteAction->setShortcutContext(Qt::WidgetShortcut); calculateSelectionAction = cmenu->addAction(tr("Calculate Selection"), this, SIGNAL(calculateSelectionRequest())); cmenu->addSeparator(); cmenu->addAction(tr("Insert Date…"), this, SLOT(insertDate())); cmenu->addAction(tr("Insert Matrix…"), this, SLOT(insertMatrix())); cmenu->addSeparator(); selectAllAction = cmenu->addAction(tr("Select All"), this, SLOT(selectAll())); selectAllAction->setShortcut(QKeySequence::SelectAll); selectAllAction->setShortcutContext(Qt::WidgetShortcut); clearAction = cmenu->addAction(tr("Clear"), this, SLOT(clear())); clearAction->setShortcut(Qt::Key_Escape); clearAction->setShortcutContext(Qt::WidgetShortcut); clearHistoryAction = cmenu->addAction(tr("Clear History"), this, SLOT(clearHistory())); cmenu->addSeparator(); QMenu *menu = cmenu->addMenu(tr("Completion")); int completion_level = 0; if(settings->enable_completion) { if(settings->enable_completion2) { if(settings->completion_min2 > 1) completion_level = 3; else completion_level = 4; } else { if(settings->completion_min > 1) completion_level = 1; else completion_level = 2; } } QActionGroup *group = new QActionGroup(this); QAction *action = menu->addAction(tr("No completion"), this, SLOT(onCompletionModeChanged())); action->setData(0); action->setCheckable(true); group->addAction(action); if(completion_level == 0) action->setChecked(true); action = menu->addAction(tr("Limited strict completion"), this, SLOT(onCompletionModeChanged())); action->setData(1); action->setCheckable(true); group->addAction(action); if(completion_level == 1) action->setChecked(true); action = menu->addAction(tr("Strict completion"), this, SLOT(onCompletionModeChanged())); action->setData(2); action->setCheckable(true); group->addAction(action); if(completion_level == 2) action->setChecked(true); action = menu->addAction(tr("Limited full completion"), this, SLOT(onCompletionModeChanged())); action->setData(3); action->setCheckable(true); group->addAction(action); if(completion_level == 3) action->setChecked(true); action = menu->addAction(tr("Full completion"), this, SLOT(onCompletionModeChanged())); action->setData(4); action->setCheckable(true); group->addAction(action); if(completion_level == 4) action->setChecked(true); menu->addSeparator(); action = menu->addAction(tr("Delayed completion"), this, SLOT(enableCompletionDelay())); action->setCheckable(true); if(settings->completion_delay > 0) action->setChecked(true); menu = cmenu->addMenu(tr("Expression Status")); group = new QActionGroup(this); action = menu->addAction(tr("Off"), this, SLOT(onStatusModeChanged())); action->setData(0); action->setCheckable(true); group->addAction(action); statusOffAction = action; action = menu->addAction(tr("In history list"), this, SLOT(onStatusModeChanged())); action->setData(1); action->setCheckable(true); group->addAction(action); statusHistoryAction = action; action = menu->addAction(tr("In expression field"), this, SLOT(onStatusModeChanged())); action->setData(2); action->setCheckable(true); group->addAction(action); statusExpressionAction = action; action = menu->addAction(tr("In status bar"), this, SLOT(onStatusModeChanged())); action->setData(6); action->setCheckable(true); group->addAction(action); statusStatusAction = action; menu->addSeparator(); group = new QActionGroup(this); action = menu->addAction(tr("With delay"), this, SLOT(onStatusModeChanged())); action->setData(3); action->setCheckable(true); group->addAction(action); statusDelayAction = action; action = menu->addAction(tr("With adaptive delay"), this, SLOT(onStatusModeChanged())); action->setData(5); action->setCheckable(true); group->addAction(action); statusAdaptiveDelayAction = action; action = menu->addAction(tr("Without delay"), this, SLOT(onStatusModeChanged())); action->setData(4); action->setCheckable(true); group->addAction(action); statusNoDelayAction = action; menu->addSeparator(); action = menu->addAction(tr("Automatically calculate selection"), this, SLOT(onAutocalcSelectionChanged())); action->setCheckable(true); autocalcSelectionAction = action; #ifndef _WIN32 QAction *enableIMAction = cmenu->addAction(tr("Use input method"), this, SLOT(enableIM())); enableIMAction->setCheckable(true); enableIMAction->setChecked(settings->enable_input_method); #endif if(fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } bool b_sel = textCursor().hasSelection(); bool b_empty = document()->isEmpty(); undoAction->setEnabled(undo_index == 0); redoAction->setEnabled(undo_index < expression_undo_buffer.size() - 1); cutAction->setEnabled(b_sel); copyAction->setEnabled(b_sel); pasteAction->setEnabled(canPaste()); deleteAction->setEnabled(b_sel); calculateSelectionAction->setEnabled(b_sel); selectAllAction->setEnabled(!b_empty); clearAction->setEnabled(!b_empty); clearHistoryAction->setEnabled(!settings->expression_history.empty()); if(!settings->display_expression_status) statusOffAction->setChecked(true); else if(settings->status_in_history) statusHistoryAction->setChecked(true); else if(settings->status_in_statusbar) statusStatusAction->setChecked(true); else statusExpressionAction->setChecked(true); if(settings->status_in_history && settings->auto_calculate_delay > 0 && settings->adaptive_autocalc_delay) { statusAdaptiveDelayAction->setChecked(true); } else if(!settings->status_in_statusbar && ((settings->status_in_history && settings->auto_calculate_delay > 0) || (!settings->status_in_history && settings->expression_status_delay > 0))) { statusDelayAction->setChecked(true); } else { statusNoDelayAction->setChecked(true); } statusAdaptiveDelayAction->setEnabled(settings->status_in_history); statusDelayAction->setEnabled(!settings->status_in_statusbar); autocalcSelectionAction->setChecked(settings->autocalc_selection); cmenu->popup(e->globalPos()); } void ExpressionEdit::setMenuAndToolbarItems(QMenu *mode, QMenu *menu, QAction *action) { if(!menu && cmenu && fileMenu) { cmenu->removeAction(fileSeparator); cmenu->removeAction(modeMenu->menuAction()); cmenu->removeAction(fileMenu->menuAction()); cmenu->removeAction(tbAction); } modeMenu = mode; fileMenu = menu; tbAction = action; if(cmenu && fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } void ExpressionEdit::insertDate() { QDialog *dialog = new QDialog(this, Qt::Popup); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QVBoxLayout *box = new QVBoxLayout(dialog); box->setContentsMargins(0, 0, 0, 0); QCalendarWidget *w = new QCalendarWidget(dialog); std::string str = textCursor().selectedText().toStdString(), str2; CALCULATOR->separateToExpression(str, str2, settings->evalops, true); remove_blank_ends(str); int b_quote = -1; if(str.length() > 2 && ((str[0] == '\"' && str[str.length() - 1] == '\"') || (str[0] == '\'' && str[str.length() - 1] == '\''))) { str = str.substr(1, str.length() - 2); remove_blank_ends(str); b_quote = 1; } if(!str.empty()) { QalculateDateTime date; if(date.set(str)) { if(b_quote < 0 && is_in(NUMBERS, str[0])) b_quote = 0; w->setSelectedDate(QDate(date.year(), date.month() - 1, date.day())); } } box->addWidget(w); connect(w, SIGNAL(clicked(QDate)), dialog, SLOT(accept())); connect(w, SIGNAL(activated(QDate)), dialog, SLOT(accept())); if(dialog->exec() == QDialog::Accepted) { if(b_quote == 0) insertPlainText(w->selectedDate().toString(Qt::ISODate)); else insertPlainText("\"" + w->selectedDate().toString(Qt::ISODate) + "\""); } dialog->deleteLater(); } void ExpressionEdit::insertMatrix() { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixString(textCursor().selectedText()); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); w->setFocus(); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { if(!w->isEmpty()) { insertPlainText(w->getMatrixString()); } } dialog->deleteLater(); } void ExpressionEdit::enableCompletionDelay() { if(qobject_cast(sender())->isChecked()) settings->completion_delay = 500; else settings->completion_delay = 0; } void ExpressionEdit::onCompletionModeChanged() { int completion_level = qobject_cast(sender())->data().toInt(); settings->enable_completion = completion_level > 0; if(completion_level == 0) completion_level = 4; settings->enable_completion2 = completion_level > 2; if(completion_level == 2 || completion_level > 3) settings->completion_min = 1; else settings->completion_min = 2; if(completion_level > 3) settings->completion_min2 = 1; else settings->completion_min2 = 2; } void ExpressionEdit::onAutocalcSelectionChanged() { settings->autocalc_selection = qobject_cast(sender())->isChecked(); emit expressionStatusModeChanged(false); } void ExpressionEdit::onStatusModeChanged() { int i = qobject_cast(sender())->data().toInt(); if(i == 3) { if(settings->status_in_history) { settings->auto_calculate_delay = 500; settings->adaptive_autocalc_delay = false; } else { settings->expression_status_delay = 1000; } } else if(i == 4) { if(settings->status_in_history) { settings->auto_calculate_delay = 0; settings->adaptive_autocalc_delay = true; } else { settings->expression_status_delay = 0; } } else if(i == 5) { if(settings->status_in_history) { settings->auto_calculate_delay = 500; settings->adaptive_autocalc_delay = true; } } if(i < 3 || i > 5) { settings->display_expression_status = (i > 0); settings->status_in_history = (i == 1); settings->status_in_statusbar = (i == 6); if(settings->status_in_history && settings->display_expression_status) { settings->expression_status_delay = 1000; } else if(!settings->status_in_statusbar && settings->auto_calculate_delay == 0) { settings->expression_status_delay = 0; } } emit expressionStatusModeChanged(i < 3 || i > 5); } void ExpressionEdit::editUndo() { if(undo_index == 0) return; blockCompletion(); blockParseStatus(); undo_index--; block_add_to_undo++; setCursorWidth(0); setPlainText(expression_undo_buffer.at(undo_index)); QTextCursor cur = textCursor(); cur.setPosition(expression_undo_pos.at(undo_index)); setTextCursor(cur); setCursorWidth(1); block_add_to_undo--; blockCompletion(false); blockParseStatus(false); displayParseStatus(false, false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } void ExpressionEdit::editRedo() { if(undo_index >= expression_undo_buffer.size() - 1) return; blockCompletion(); blockParseStatus(); undo_index++; block_add_to_undo++; setCursorWidth(0); setPlainText(expression_undo_buffer.at(undo_index)); QTextCursor cur = textCursor(); cur.setPosition(expression_undo_pos.at(undo_index)); setTextCursor(cur); setCursorWidth(1); block_add_to_undo--; blockCompletion(false); blockParseStatus(false); displayParseStatus(false, false); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } void ExpressionEdit::editDelete() { textCursor().removeSelectedText(); } void ExpressionEdit::enableIM() { settings->enable_input_method = qobject_cast(sender())->isChecked(); setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); } void ExpressionEdit::blockCompletion(bool b, bool h) { if(b) { if(completionTimer) completionTimer->stop(); if(h) completionView->hide(); completion_blocked++; } else { completion_blocked--; } } #define HIDE_TOOLTIP if(tipLabel) {tipLabel->hideTipImmediately();} void ExpressionEdit::blockParseStatus(bool b) { if(b) { HIDE_TOOLTIP statusLabel->clear(); statusLabel->setToolTip(QString()); if(toolTipTimer) toolTipTimer->stop(); parse_blocked++; } else { parse_blocked--; } } void ExpressionEdit::blockUndo(bool b) { if(b) block_add_to_undo++; else block_add_to_undo--; } void ExpressionEdit::showCurrentStatus() { statusLabel->setToolTip(QString()); if((!expression_has_changed && current_status_type != 4) || current_status_text.isEmpty() || (completionView->isVisible() && (completionView->selectionModel()->hasSelection() || current_status_type == 3))) { HIDE_TOOLTIP statusLabel->clear(); } else { bool show_in_status = !USES_TOOLTIP; QString str = current_status_type == 4 ? "" : current_status_text; std::string str_nohtml = current_status_type == 4 ? current_status_text.toStdString() : unhtmlize(current_status_text.toStdString()); std::string current_text = current_status_type == 4 ? str_nohtml : toPlainText().toStdString(); if(((current_status_type == 1 && settings->auto_calculate) || current_status_type == 4) && str_nohtml.length() <= 2000 && auto_calculable) { bool b_comp = false, is_approximate = false; PrintOptions po = settings->printops; po.is_approximate = &is_approximate; std::string result = CALCULATOR->unlocalizeExpression(current_text, settings->evalops.parse_options); remove_spaces(current_text); CALCULATOR->beginTemporaryStopMessages(); if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); std::string parsed_text; result = CALCULATOR->calculateAndPrint(result, 50, settings->evalops, po, settings->dual_fraction == 0 ? AUTOMATIC_FRACTION_OFF : AUTOMATIC_FRACTION_SINGLE, settings->dual_approximation == 0 ? AUTOMATIC_APPROXIMATION_OFF : AUTOMATIC_APPROXIMATION_SINGLE, current_status_type == 4 ? &parsed_text : NULL, -1, &b_comp, true, false, TAG_TYPE_HTML); if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); std::string result_nohtml = unhtmlize(result); remove_spaces(result_nohtml); remove_spaces(str_nohtml); if(current_status_type == 4 && parsed_text != CALCULATOR->timedOutString()) str = QString::fromStdString(parsed_text); if(!CALCULATOR->endTemporaryStopMessages() && !result.empty() && result_nohtml.length() < 200 && result_nohtml != str_nohtml && result_nohtml != current_text && result != CALCULATOR->timedOutString() && result != parsed_text) { if(show_in_status) str += " "; else str += " "; int rpos = str.length(); if(is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; if(b_comp) str += "("; str += QString::fromStdString(result); if(b_comp) str += ")"; str_nohtml = ""; if(show_in_status) { QFontMetrics fm(statusLabel->font()); if(fm.boundingRect(QString::fromStdString(unhtmlize(str.toStdString()))).width() > statusLabel->width() - statusLabel->indent()) { statusLabel->setToolTip(str); if(fm.boundingRect(QString::fromStdString(unhtmlize(str.mid(rpos).toStdString()))).width() > statusLabel->width() - statusLabel->indent()) { str.remove(0, rpos); str = QString::fromStdString(unhtmlize(str.toStdString())); str = fm.elidedText(str, Qt::ElideRight, statusLabel->width() - statusLabel->indent()); } else { str = QString::fromStdString(unhtmlize(str.toStdString())); str = fm.elidedText(str, Qt::ElideLeft, statusLabel->width() - statusLabel->indent()); } } } } else if(show_in_status) { QFontMetrics fm(statusLabel->font()); if(fm.boundingRect(unhtmlize(str)).width() > statusLabel->width() - statusLabel->indent()) { statusLabel->setToolTip(str); str = unhtmlize(str); str = fm.elidedText(str, Qt::ElideLeft, statusLabel->width()); } } } else { if(show_in_status) { QFontMetrics fm(statusLabel->font()); if(fm.boundingRect(unhtmlize(str)).width() > statusLabel->width() - statusLabel->indent()) { statusLabel->setToolTip(str); str = unhtmlize(str); str = fm.elidedText(str, Qt::ElideRight, statusLabel->width()); } } remove_spaces(current_text); } if(str.isEmpty() || str_nohtml == current_text || str_nohtml.length() > 2000) { HIDE_TOOLTIP statusLabel->clear(); } else { if(show_in_status) { str.replace("
", " "); str.replace("\n", " "); statusLabel->setText(str); } else if(tipLabel && tipLabel->isVisible()) { tipLabel->reuseTip(str, mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight()))); if(!tipLabel->placeTip(mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), completionView->isVisible() ? completionView->geometry(): QRect())) { HIDE_TOOLTIP } } else { if(tipLabel) tipLabel->deleteLater(); tipLabel = new ExpressionTipLabel(str, mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), this); if(tipLabel->placeTip(mapToGlobal((current_status_type == 2 ? function_pos : cursorRect().bottomRight())), completionView->isVisible() ? completionView->geometry(): QRect())) { tipLabel->showNormal(); } else { HIDE_TOOLTIP } } } } } void ExpressionEdit::onSelectionChanged() { if(settings->autocalc_selection && textCursor().hasSelection()) { QTextCursor cur = textCursor(); if(((!settings->status_in_history || !settings->display_expression_status) && expression_has_changed) || cur.selectionStart() != 0 || cur.selectionEnd() != toPlainText().length()) { setStatusText(cur.selectedText(), 4); } else if(current_status_type == 4) { HIDE_TOOLTIP statusLabel->clear(); statusLabel->setToolTip(QString()); } } else if(current_status_type == 4) { HIDE_TOOLTIP statusLabel->clear(); statusLabel->setToolTip(QString()); } } void ExpressionEdit::setStatusText(const QString &text, int stype) { if(toolTipTimer) toolTipTimer->stop(); current_status_text = text; if(text.isEmpty() || (stype != 4 && !settings->display_expression_status)) { HIDE_TOOLTIP statusLabel->clear(); statusLabel->setToolTip(QString()); } else { bool prev_func = (current_status_type == 2); current_status_type = stype; if(settings->expression_status_delay > 0 && USES_TOOLTIP && (current_status_type != 2 || !prev_func || !tipLabel || !tipLabel->isVisible())) { if(tipLabel) tipLabel->hideTip(); if(!toolTipTimer) { toolTipTimer = new QTimer(this); toolTipTimer->setSingleShot(true); connect(toolTipTimer, SIGNAL(timeout()), this, SLOT(showCurrentStatus())); } toolTipTimer->start(settings->expression_status_delay); } else { showCurrentStatus(); } } } bool ExpressionEdit::displayFunctionHint(MathFunction *f, int arg_index) { if(!settings->display_expression_status) return false; if(!f) return false; int iargs = f->maxargs(); if((iargs == 0 && arg_index == 0) || (iargs == 1 && arg_index == 1)) return false; const ExpressionName *ename = &f->preferredName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) parent()); bool last_is_vctr = f->getArgumentDefinition(iargs) && f->getArgumentDefinition(iargs)->type() == ARGUMENT_TYPE_VECTOR; if(arg_index == 0 || function_pos.isNull()) function_pos = cursorRect().bottomRight(); if(iargs == 0 || (arg_index > iargs && iargs >= 0 && (!last_is_vctr || iargs == 1))) { if(last_is_vctr || (iargs == 1 && f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->handlesVector())) { function_pos = QPoint(); return false; } else { setStatusText(tr("Too many arguments for %1().").arg(QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true))), 2); return true; } } if(arg_index <= 0) arg_index = 1; Argument *arg; Argument default_arg; QString str, str2, str3; str += QString::fromStdString(ename->formattedName(TYPE_FUNCTION, true, true)); if(iargs < 0) { iargs = f->minargs() + 1; if((int) f->lastArgumentDefinitionIndex() > iargs) iargs = (int) f->lastArgumentDefinitionIndex(); if(arg_index > iargs) arg_index = iargs; } if(arg_index > iargs && last_is_vctr) arg_index = iargs; str += "("; int i_reduced = 1; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > f->minargs() && arg_index < i2) { str += "["; } if(i2 > 1) { str += QString::fromStdString(CALCULATOR->getComma()); str += " "; } if(i2 == arg_index) str += ""; arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str2 = QString::fromStdString(arg->name()); } else { str2 = tr("argument"); if(i2 > 1 || f->maxargs() != 1) { str2 += " "; str2 += QString::number(i2); } } if(i2 == arg_index) { if(arg) { str3 = QString::fromStdString(arg->printlong()); } else { Argument arg_default; str3 = QString::fromStdString(arg_default.printlong()); } if(i_reduced != 2 && settings->printops.use_unicode_signs) { str3.replace(">=", SIGN_GREATER_OR_EQUAL); str3.replace("<=", SIGN_LESS_OR_EQUAL); str3.replace("!=", SIGN_NOT_EQUAL); } if(!str3.isEmpty()) { str2 = tr("%1:").arg(str2); str2 += " "; str2 += str3; } str += str2.toHtmlEscaped(); str += ""; } else { str += str2.toHtmlEscaped(); if(i2 > f->minargs() && arg_index < i2) { str += "]"; } } } if(f->maxargs() < 0) { str += QString::fromStdString(CALCULATOR->getComma()); str += " …"; } } str += ")"; setStatusText(str, 2); return true; } void remove_non_units(MathStructure &m) { if(m.isPower() && m[0].isUnit()) return; if(m.size() > 0) { for(size_t i = m.size(); i > 0; i--) { if(m[i - 1].isFunction() || m[i - 1].containsType(STRUCT_UNIT, true) <= 0) { m.delChild(i); } else { remove_non_units(m[i - 1]); } } if(m.size() == 0) m.clear(); else if(m.size() == 1) m.setToChild(1); } } void find_matching_units(const MathStructure &m, const MathStructure *mparse, std::vector &v, bool top = true) { Unit *u = CALCULATOR->findMatchingUnit(m); if(u) { for(size_t i = 0; i < v.size(); i++) { if(v[i] == u) return; } v.push_back(u); if(top && mparse) { Unit *u2 = CALCULATOR->findMatchingUnit(*mparse); if(u2 && u2 != u && u2->baseUnit() == u->baseUnit() && u2->baseExponent() == u->baseExponent() && u2->category() != u->category()) v.push_back(u2); } return; } if(top && mparse && !m.containsType(STRUCT_UNIT, true) && (mparse->containsFunctionId(FUNCTION_ID_ASIN) || mparse->containsFunctionId(FUNCTION_ID_ACOS) || mparse->containsFunctionId(FUNCTION_ID_ATAN))) { v.push_back(CALCULATOR->getRadUnit()); return; } if(top && m.containsType(STRUCT_UNIT, true) > 0 && m.size() < 100) { MathStructure m2(m); remove_non_units(m2); CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->startControl(50); m2 = CALCULATOR->convertToOptimalUnit(m2); CALCULATOR->stopControl(); CALCULATOR->endTemporaryStopMessages(); find_matching_units(m2, mparse, v, false); } else { for(size_t i = 0; i < m.size() && i < 100; i++) { if(!m.isFunction() || !m.function()->getArgumentDefinition(i + 1) || m.function()->getArgumentDefinition(i + 1)->type() != ARGUMENT_TYPE_ANGLE) { find_matching_units(m[i], mparse, v, false); } } } } void replace_control_characters_qt(std::string &str) { for(size_t i = 0; i < str.size();) { if((str[i] > 0 && str[i] < 9) || ((str[i] > 13 && str[i] < 32) && str[i] != '\e')) { str.erase(i, 1); } else { i++; } } } bool test_autocalculatable(const MathStructure &m, bool where = false, bool top = true) { if(where && top && ((m.isVariable() && !m.variable()->isKnown()) || m.isNumber())) return false; if(m.isFunction()) { if(m.size() < (size_t) m.function()->minargs() && (!where || m.size() != 0) && (m.size() != 1 || m[0].representsScalar())) { MathStructure mf(m); mf.calculateFunctions(settings->evalops, false); return false; } if(m.function()->id() == FUNCTION_ID_SAVE || m.function()->id() == FUNCTION_ID_PLOT || m.function()->id() == FUNCTION_ID_EXPORT || m.function()->id() == FUNCTION_ID_LOAD || m.function()->id() == FUNCTION_ID_COMMAND || (m.function()->subtype() == SUBTYPE_USER_FUNCTION && ((UserFunction*) m.function())->formula().find("plot(") != std::string::npos)) return false; if(m.size() > 0 && (m.function()->id() == FUNCTION_ID_FACTORIAL || m.function()->id() == FUNCTION_ID_DOUBLE_FACTORIAL || m.function()->id() == FUNCTION_ID_MULTI_FACTORIAL) && m[0].isInteger() && m[0].number().integerLength() > 17) { return false; } if(m.function()->id() == FUNCTION_ID_LOGN && m.size() == 2 && m[0].isUndefined() && m[1].isNumber()) return false; if(top && m.function()->subtype() == SUBTYPE_DATA_SET && m.size() >= 2 && m[1].isSymbolic() && equalsIgnoreCase(m[1].symbol(), "info")) return false; } else if(m.isSymbolic() && contains_plot_or_save(m.symbol())) { return false; } for(size_t i = 0; i < m.size(); i++) { if(!test_autocalculatable(m[i], where || (m.isFunction() && m.function()->id() == FUNCTION_ID_REPLACE && i > 0), false)) return false; } return true; } #define NONDIGIT_INPUT_BASE ((settings->evalops.parse_options.base > 10 && settings->evalops.parse_options.base <= 36) || settings->evalops.parse_options.base == BASE_UNICODE || settings->evalops.parse_options.base == BASE_BIJECTIVE_26 || (settings->evalops.parse_options.base == BASE_CUSTOM && (CALCULATOR->customInputBase() > 10 || CALCULATOR->customInputBase() < -10))) #define CURRENT_TEXT_ARGUMENT (cdata->current_function && cdata->current_function_index > 0 && cdata->current_function->getArgumentDefinition(cdata->current_function_index) && cdata->current_function->getArgumentDefinition(cdata->current_function_index)->suggestsQuotes()) void ExpressionEdit::displayParseStatus(bool update, bool show_tooltip) { if(toolTipTimer) toolTipTimer->stop(); if(parse_blocked) { auto_calculable = 0; return; } if(update) expression_has_changed2 = true; bool prev_func = cdata->current_function; cdata->current_function = NULL; mfunc.clear(); if(expression_has_changed2) current_status_struct.clear(); if(block_display_parse) { auto_calculable = 0; return; } status_messages.clear(); if(document()->isEmpty()) { auto_calculable = 0; function_pos = QPoint(); setStatusText(""); if(settings->status_in_history) emit statusChanged(QString(), false, false, false, expression_from_history); prev_parsed_expression = ""; expression_has_changed2 = false; return; } QString qtext = toPlainText(); std::string text = qtext.toStdString(), str_f; if(text.find("#") != std::string::npos) { CALCULATOR->parseComments(text, settings->evalops.parse_options); if(text.empty()) { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("comment"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("comment")); function_pos = QPoint(); } return; } } if(text[0] == '/' && text.length() > 1) { size_t i = text.find_first_not_of(SPACES, 1); if(i != std::string::npos && (signed char) text[i] > 0 && is_not_in(NUMBER_ELEMENTS OPERATORS, text[i])) { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged("qalc command", false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText("qalc command"); function_pos = QPoint(); } return; } } else if(text == "MC") { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("MC (memory clear)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("MC (memory clear)")); function_pos = QPoint(); } return; } else if(text == "MS") { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("MS (memory store)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("MS (memory store)")); function_pos = QPoint(); } return; } else if(text == "M+") { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("M+ (memory plus)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("M+ (memory plus)")); function_pos = QPoint(); } return; } else if(text == "M-" || text == "M−") { auto_calculable = 0; if(settings->status_in_history) { setStatusText(""); emit statusChanged(tr("M− (memory minus)"), false, false, false, expression_from_history); } else if(show_tooltip) { setStatusText(tr("M− (memory minus)")); function_pos = QPoint(); } return; } CALCULATOR->beginTemporaryStopMessages(); gsub(ID_WRAP_LEFT, LEFT_PARENTHESIS, text); gsub(ID_WRAP_RIGHT, RIGHT_PARENTHESIS, text); replace_control_characters_qt(text); std::string parsed_expression, parsed_expression_tooltip; remove_duplicate_blanks(text); size_t i = text.find_first_of(SPACES); if(i != std::string::npos) { str_f = text.substr(0, i); if(str_f == "factor" || equalsIgnoreCase(str_f, "factorize") || equalsIgnoreCase(str_f, tr("factorize").toStdString())) { text = text.substr(i + 1); str_f = tr("factorize").toStdString(); } else if(equalsIgnoreCase(str_f, "expand") || equalsIgnoreCase(str_f, tr("expand").toStdString())) { text = text.substr(i + 1); str_f = tr("expand").toStdString(); } else { str_f = ""; } } QTextCursor cursor = textCursor(); MathStructure mparse; bool full_parsed = false; std::string str_e, str_u, str_w; bool had_errors = false, had_warnings = false; size_t pos = 0; char pos_c = 0; settings->evalops.parse_options.preserve_format = true; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); if(!cursor.atStart()) { settings->evalops.parse_options.unended_function = &mfunc; if(cdata->current_from_struct) {cdata->current_from_struct->unref(); cdata->current_from_struct = NULL; cdata->current_from_units.clear(); cdata->current_from_categories.clear();} if(!cursor.atEnd()) { str_e = CALCULATOR->unlocalizeExpression(qtext.left(cursor.position()).toStdString(), settings->evalops.parse_options); bool b = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, false, true); if(b) {pos = str_u.length(); pos_c = 'u';} if(CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops)) { if(!b) {pos = str_w.length(); pos_c = 'w';} b = true; } if(!b) { pos = str_e.length(); pos_c = 'e'; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); } } else { str_e = CALCULATOR->unlocalizeExpression(text, settings->evalops.parse_options); transform_expression_for_equals_save(str_e, settings->evalops.parse_options); bool b = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, false, true); b = CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops) || b; if(!b) { pos_c = 'e'; pos = str_e.length(); if(str_e.length() > 1 && str_e.back() == LEFT_PARENTHESIS_CH) { CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(mfunc.isFunction()); if(!mfunc.isFunction()) CALCULATOR->parse(&mparse, str_e.substr(0, str_e.length() - 1), settings->evalops.parse_options); } else if(str_e.length() > 4 && str_e.find(LEFT_PARENTHESIS SIGN_MINUS, str_e.length() - 4) != std::string::npos) { CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str_e.substr(0, str_e.length() - 3), settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(mfunc.isFunction()); if(!mfunc.isFunction()) CALCULATOR->parse(&mparse, str_e.substr(0, str_e.length() - 4), settings->evalops.parse_options); else if(mfunc.size() == 0) mfunc.addChild(m_zero); } else { CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); } full_parsed = true; } } settings->evalops.parse_options.unended_function = NULL; } bool b_func = false; size_t function_index = 0; if(mfunc.isFunction()) { cdata->current_function = mfunc.function(); function_index = mfunc.countChildren(); if(mfunc.countChildren() == 0) { cdata->current_function_index = 1; if(!settings->status_in_history || !USES_TOOLTIP || (is_in(NOT_IN_NAMES, str_e.back()) && !completionView->isVisible())) { b_func = displayFunctionHint(mfunc.function(), 0); } } else { cdata->current_function_index = mfunc.countChildren(); b_func = displayFunctionHint(mfunc.function(), mfunc.countChildren()); if(mfunc.last().isZero()) { size_t i = str_e.find_last_not_of(SPACES); if(i != std::string::npos && (str_e[i] == COMMA_CH || str_e[i] == ';')) function_index--; } } } if(!b_func) function_pos = QPoint(); if(expression_has_changed2) { bool last_is_space = false; parsed_expression_tooltip = ""; auto_calculable = 1; if((mfunc.isFunction() && (int) function_index < mfunc.function()->minargs() && (cursor.atEnd() || cursor.position() >= document()->characterCount() - 2))) { auto_calculable = 0; } if(!full_parsed) { str_e = CALCULATOR->unlocalizeExpression(text, settings->evalops.parse_options); transform_expression_for_equals_save(str_e, settings->evalops.parse_options); last_is_space = is_in(SPACES, str_e[str_e.length() - 1]); bool b_to = CALCULATOR->separateToExpression(str_e, str_u, settings->evalops, true, true); if(!pos_c && b_to) {pos = str_u.length(); pos_c = 'u';} if(b_to && str_u.empty()) auto_calculable = 0; if(CALCULATOR->separateWhereExpression(str_e, str_w, settings->evalops)) { if(str_w.empty()) auto_calculable = 0; if(!pos_c && !b_to) {pos = str_w.length(); pos_c = 'w';} } if(!pos_c) {pos = str_e.length(); pos_c = 'e';} if(!str_e.empty()) CALCULATOR->parse(&mparse, str_e, settings->evalops.parse_options); if(b_to && !str_e.empty()) { if(!cdata->current_from_struct && test_autocalculatable(mparse)) { cdata->current_from_struct = new MathStructure; EvaluationOptions eo = settings->evalops; eo.structuring = STRUCTURING_NONE; eo.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; eo.auto_post_conversion = POST_CONVERSION_NONE; eo.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; eo.expand = -2; if(!CALCULATOR->calculate(cdata->current_from_struct, str_w.empty() ? str_e : str_e + "/." + str_w, 50, eo)) cdata->current_from_struct->setAborted(); find_matching_units(*cdata->current_from_struct, &mparse, cdata->current_from_units); cdata->current_from_categories.clear(); } } else if(cdata->current_from_struct) { cdata->current_from_struct->unref(); cdata->current_from_struct = NULL; cdata->current_from_units.clear(); cdata->current_from_categories.clear(); } } current_status_struct = mparse; if(auto_calculable && !test_autocalculatable(mparse)) auto_calculable = 0; else if(auto_calculable && !cdata->current_function && ((str_e.length() > 3 && str_u.empty() && str_e.find(" to", str_e.length() - 3) != std::string::npos) || (str_e.length() > 6 && str_w.empty() && str_e.find(" where", str_e.length() - 6) != std::string::npos) || (str_e.length() > 2 && str_e.find("/.", str_e.length() - 2) != std::string::npos)) && settings->evalops.parse_options.base != BASE_UNICODE && (settings->evalops.parse_options.base != BASE_CUSTOM || CALCULATOR->customInputBase() <= 62)) auto_calculable = 0; else if(auto_calculable && !str_w.empty() && (str_w.back() == '>' || str_w.back() == '<' || str_w.back() == '=' || (str_w.length() >= 3 && (str_w.find("≤", str_w.length() - 3) != std::string::npos || str_w.find("≥", str_w.length() - 3) != std::string::npos || str_w.find("≠", str_w.length() - 3) != std::string::npos)))) auto_calculable = 0; else if(auto_calculable == 1 && cdata->current_function && cursor.atEnd() && str_e.find("(") != std::string::npos) auto_calculable = 2; if(auto_calculable != 0 && pos_c == 'e' && pos <= str_e.length() && str_w.empty() && !NONDIGIT_INPUT_BASE && !CURRENT_TEXT_ARGUMENT) { size_t pos2 = pos; std::string *str_cur = &str_e; std::string str; while(pos > 0) { size_t l = 1; while(pos - l > 0 && (unsigned char) (*str_cur)[pos - l] >= 0x80 && (unsigned char) (*str_cur)[pos - l] < 0xC0) l++; pos -= l; if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) str_cur->c_str() + sizeof(char) * pos)) { pos += l; break; } else if(l == 1 && is_in(NUMBERS, (*str_cur)[pos])) { pos++; break; } } if(pos > 0) { bool cit1 = false, cit2 = false, xbase = false; for(size_t i = 0; i < pos; i++) { if(!cit1 && (*str_cur)[i] == '\"') { cit2 = !cit2; } else if(!cit2 && (*str_cur)[i] == '\'') { cit1 = !cit1; } else if(i > 0 && i + 1 < pos && (*str_cur)[i] == 'x' && (*str_cur)[i - 1] == '0' && is_digit_q((*str_cur)[i + 1], 16)) { xbase = true; break; } else if(i > 0 && i + 2 < pos && (*str_cur)[i] == 'd' && (*str_cur)[i - 1] == '0' && is_digit_q((*str_cur)[i + 1], 12) && is_digit_q((*str_cur)[i + 2], 12)) { xbase = true; break; } } if(xbase || ((cit1 || cit2) && mparse.containsType(STRUCT_SYMBOLIC, true))) pos = pos2 + 1; } if(pos <= pos2) { while(pos2 < str_cur->length()) { if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) str_cur->c_str() + sizeof(char) * pos2)) { break; } if((unsigned char) (*str_cur)[pos2] >= 0xC0) pos2 += 2; else if((unsigned char) (*str_cur)[pos2] >= 0xE0) pos2 += 3; else if((unsigned char) (*str_cur)[pos2] >= 0xF0) pos2 += 4; else pos2++; } if(pos < pos2) { str = str_cur->substr(pos, pos2 - pos); } } if(!str.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure m; CALCULATOR->parse(&m, str, settings->evalops.parse_options); int w_n = 0; if(!CALCULATOR->endTemporaryStopMessages(NULL, &w_n)) { MathStructure *func = NULL; if(m.isFunction() && m.size() > 0) func = &m; else if(m.isMultiplication() && m.size() > 0 && m.last().isFunction() && m.last().size() > 0) func = &m.last(); if(func && cdata->current_function) { if((*func)[0].isMultiplication()) { for(size_t i = 0; i < (*func)[0].size(); i++) { if(!(*func)[0][i].isVariable() || ((*func)[0][i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_X) && (*func)[0][i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Y) && (*func)[0][i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Z))) { auto_calculable = 0; break; } } } else if(!(*func)[0].isVariable() || ((*func)[0].variable() != CALCULATOR->getVariableById(VARIABLE_ID_X) && (*func)[0].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Y) && (*func)[0].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Z))) { auto_calculable = 0; } } if(auto_calculable == 1 && m.isMultiplication()) { for(size_t i = 1; i < m.size(); i++) { if(m[i].isVariable() && m[i].variable() == CALCULATOR->getVariableById(VARIABLE_ID_I) && m[i - 1].isUnit() && m[i - 1].unit()->baseUnit() != CALCULATOR->getRadUnit()) { auto_calculable = 0; break; } } } if(auto_calculable == 1 && w_n > 0) { auto_calculable = 2; } else if(auto_calculable == 1 && !m.isNumber() && !m.isFunction() && !m.isVariable() && (!m.isUnit() || !use_with_prefix(m.unit(), m.prefix()))) { if(m.isMultiplication()) { bool b = true; for(size_t i = 0; i < m.size(); i++) { if(!m[i].isUnit() || !use_with_prefix(m[i].unit(), m[i].prefix())) { b = false; break; } } if(b) { b = false; for(size_t i = 0; i < CALCULATOR->units.size() && !b; i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive() && u->subtype() == SUBTYPE_COMPOSITE_UNIT && ((CompositeUnit*) u)->countUnits() == m.size()) { b = true; for(size_t i2 = 0; i2 < m.size(); i2++) { int exp = 1; Unit *ui = ((CompositeUnit*) u)->get(i2 + 1, &exp); if(exp != 1 || m[i2].unit() != ui) { b = false; break; } } } } } else { b = true; for(size_t i = 0; i < m.size(); i++) { if(!m[i].isVariable() || (m[i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_X) && m[i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Y) && m[i].variable() != CALCULATOR->getVariableById(VARIABLE_ID_Z))) { if(i == 0 && m[0].isUnit() && m[0].unit() == CALCULATOR->getDegUnit() && str.find("°") == 0) { if(m.size() == 2 && !m[1].isUnit()) break; continue; } b = false; break; } } } if(!b) auto_calculable = 2; } else { auto_calculable = 2; } } } } } PrintOptions po; po.preserve_format = true; po.show_ending_zeroes = settings->evalops.parse_options.read_precision != DONT_READ_PRECISION && !CALCULATOR->usesIntervalArithmetic() && settings->evalops.parse_options.base > BASE_CUSTOM; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.base_display = settings->printops.base_display; po.rounding = settings->printops.rounding; po.twos_complement = settings->printops.twos_complement; po.hexadecimal_twos_complement = settings->printops.hexadecimal_twos_complement; po.base = settings->evalops.parse_options.base; po.allow_non_usable = settings->status_in_history; Number nr_base; if(po.base == BASE_CUSTOM && (CALCULATOR->usesIntervalArithmetic() || CALCULATOR->customInputBase().isRational()) && (CALCULATOR->customInputBase().isInteger() || !CALCULATOR->customInputBase().isNegative()) && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if(po.base == BASE_CUSTOM || (po.base < BASE_CUSTOM && !CALCULATOR->usesIntervalArithmetic() && po.base != BASE_UNICODE && po.base != BASE_BIJECTIVE_26 && po.base != BASE_BINARY_DECIMAL)) { po.base = 10; po.min_exp = 6; po.use_max_decimals = true; po.max_decimals = 5; po.preserve_format = false; } bool compact = ((settings->history_expression_type == HISTORY_EXPRESSION_TYPE_PARSED_COMPACT || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT) && settings->status_in_history); po.abbreviate_names = compact; po.hide_underscore_spaces = true; po.use_unicode_signs = settings->printops.use_unicode_signs; po.digit_grouping = settings->printops.digit_grouping; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = compact; po.excessive_parenthesis = true; po.improve_division_multipliers = false; po.can_display_unicode_string_function = &can_display_unicode_string_function; po.can_display_unicode_string_arg = (void*) parent(); po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.restrict_to_parent_precision = false; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(!str_w.empty()) { CALCULATOR->endTemporaryStopMessages(); CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->beginTemporaryStopMessages(); MathStructure mwhere; CALCULATOR->parseExpressionAndWhere(&mparse, &mwhere, str_e, str_w, settings->evalops.parse_options); if(auto_calculable && (!test_autocalculatable(mwhere, true))) auto_calculable = 0; else if(auto_calculable == 1 && !mwhere.isComparison() && !mwhere.isLogicalAnd() && !mwhere.isLogicalOr()) auto_calculable = 2; mparse.format(po); if(compact) po.preserve_format = false; parsed_expression = mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); if(compact) po.preserve_format = true; parsed_expression += CALCULATOR->localWhereString(); mwhere.format(po); if(compact) po.preserve_format = false; parsed_expression += mwhere.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); if(compact) po.preserve_format = true; if(CALCULATOR->endTemporaryStopMessages() && auto_calculable == 1) auto_calculable = 2; } else if(str_e.empty()) { parsed_expression = ""; } else { CALCULATOR->beginTemporaryStopMessages(); mparse.format(po); if(compact) po.preserve_format = false; parsed_expression = mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); if(compact) po.preserve_format = true; CALCULATOR->endTemporaryStopMessages(); } if(!str_u.empty()) { std::string str_u2; size_t parse_l = parsed_expression.length(); bool had_to_conv = false; MathStructure *mparse2 = NULL; while(true) { if(last_is_space) str_u += " "; if(!str_e.empty()) CALCULATOR->separateToExpression(str_u, str_u2, settings->evalops, true, false); remove_blank_ends(str_u); if(parsed_expression.empty()) { parsed_expression += CALCULATOR->localToString(false); parsed_expression += " "; } else { parsed_expression += CALCULATOR->localToString(); } remove_duplicate_blanks(str_u); std::string to_str1, to_str2; size_t ispace = str_u.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = str_u.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = str_u.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(str_u, "hex") || equalsIgnoreCase(str_u, "hexadecimal") || equalsIgnoreCase(str_u, tr("hexadecimal").toStdString())) { parsed_expression += tr("hexadecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "oct") || equalsIgnoreCase(str_u, "octal") || equalsIgnoreCase(str_u, tr("octal").toStdString())) { parsed_expression += tr("octal number").toStdString(); } else if(equalsIgnoreCase(str_u, "dec") || equalsIgnoreCase(str_u, "decimal") || equalsIgnoreCase(str_u, tr("decimal").toStdString())) { parsed_expression += tr("decimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "duo") || equalsIgnoreCase(str_u, "duodecimal") || equalsIgnoreCase(str_u, tr("duodecimal").toStdString())) { parsed_expression += tr("duodecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "doz") || equalsIgnoreCase(str_u, "dozenal")) { parsed_expression += tr("duodecimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "bin") || equalsIgnoreCase(str_u, "binary") || equalsIgnoreCase(str_u, tr("binary").toStdString())) { parsed_expression += tr("binary number").toStdString(); } else if(equalsIgnoreCase(str_u, "roman") || equalsIgnoreCase(str_u, tr("roman").toStdString())) { parsed_expression += tr("roman numerals").toStdString(); } else if(equalsIgnoreCase(str_u, "bijective") || equalsIgnoreCase(str_u, tr("bijective").toStdString())) { parsed_expression += tr("bijective base-26").toStdString(); } else if(equalsIgnoreCase(str_u, "bcd")) { parsed_expression += tr("binary-coded decimal").toStdString(); } else if(equalsIgnoreCase(str_u, "sexa") || equalsIgnoreCase(str_u, "sexa2") || equalsIgnoreCase(str_u, "sexa3") || equalsIgnoreCase(str_u, "sexagesimal") || equalsIgnoreCase(str_u, tr("sexagesimal").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "sexagesimal", tr("sexagesimal"), "2") || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "sexagesimal", tr("sexagesimal"), "3")) { parsed_expression += tr("sexagesimal number").toStdString(); } else if(equalsIgnoreCase(str_u, "latitude") || equalsIgnoreCase(str_u, tr("latitude").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "latitude", tr("latitude"), "2")) { parsed_expression += tr("latitude").toStdString(); } else if(equalsIgnoreCase(str_u, "longitude") || equalsIgnoreCase(str_u, tr("longitude").toStdString()) || EQUALS_IGNORECASE_AND_LOCAL_NR(str_u, "longitude", tr("longitude"), "2")) { parsed_expression += tr("longitude").toStdString(); } else if(equalsIgnoreCase(str_u, "fp32") || equalsIgnoreCase(str_u, "binary32") || equalsIgnoreCase(str_u, "float")) { parsed_expression += tr("32-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp64") || equalsIgnoreCase(str_u, "binary64") || equalsIgnoreCase(str_u, "double")) { parsed_expression += tr("64-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp16") || equalsIgnoreCase(str_u, "binary16")) { parsed_expression += tr("16-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp80")) { parsed_expression += tr("80-bit (x86) floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "fp128") || equalsIgnoreCase(str_u, "binary128")) { parsed_expression += tr("128-bit floating point").toStdString(); } else if(equalsIgnoreCase(str_u, "time") || equalsIgnoreCase(str_u, tr("time").toStdString())) { parsed_expression += tr("time format").toStdString(); } else if(equalsIgnoreCase(str_u, "unicode")) { parsed_expression += tr("Unicode").toStdString(); } else if(equalsIgnoreCase(str_u, "sci") || EQUALS_IGNORECASE_AND_LOCAL(str_u, "scientific", tr("scientific"))) { parsed_expression += tr("scientific notation").toStdString(); } else if(equalsIgnoreCase(str_u, "eng") || EQUALS_IGNORECASE_AND_LOCAL(str_u, "engineering", tr("engineering"))) { parsed_expression += tr("engineering notation").toStdString(); } else if(EQUALS_IGNORECASE_AND_LOCAL(str_u, "simple", tr("simple"))) { parsed_expression += tr("simple notation").toStdString(); } else if(equalsIgnoreCase(str_u, "bases") || equalsIgnoreCase(str_u, tr("bases").toStdString())) { parsed_expression += tr("number bases").toStdString(); } else if(equalsIgnoreCase(str_u, "calendars") || equalsIgnoreCase(str_u, tr("calendars").toStdString())) { parsed_expression += tr("calendars").toStdString(); } else if(equalsIgnoreCase(str_u, "optimal") || equalsIgnoreCase(str_u, tr("optimal").toStdString())) { parsed_expression += tr("optimal unit").toStdString(); } else if(equalsIgnoreCase(str_u, "prefix") || equalsIgnoreCase(str_u, tr("prefix").toStdString()) || str_u == "?" || (str_u.length() == 2 && str_u[1] == '?' && (str_u[0] == 'b' || str_u[0] == 'a' || str_u[0] == 'd'))) { parsed_expression += tr("optimal prefix").toStdString(); } else if(equalsIgnoreCase(str_u, "base") || equalsIgnoreCase(str_u, tr("base", "base units").toStdString())) { parsed_expression += tr("base units").toStdString(); } else if(equalsIgnoreCase(str_u, "mixed") || equalsIgnoreCase(str_u, tr("mixed").toStdString()) || str_u == "+") { parsed_expression += tr("mixed units").toStdString(); } else if(equalsIgnoreCase(str_u, "factors") || equalsIgnoreCase(str_u, tr("factors").toStdString()) || equalsIgnoreCase(str_u, "factor")) { parsed_expression += tr("factors").toStdString(); } else if(equalsIgnoreCase(str_u, "partial fraction") || equalsIgnoreCase(str_u, tr("partial fraction").toStdString())) { parsed_expression += tr("expanded partial fractions").toStdString(); } else if(equalsIgnoreCase(str_u, "rectangular") || equalsIgnoreCase(str_u, "cartesian") || equalsIgnoreCase(str_u, tr("rectangular").toStdString()) || equalsIgnoreCase(str_u, tr("cartesian").toStdString())) { parsed_expression += tr("complex rectangular form").toStdString(); } else if(equalsIgnoreCase(str_u, "exponential") || equalsIgnoreCase(str_u, tr("exponential").toStdString())) { parsed_expression += tr("complex exponential form").toStdString(); } else if(equalsIgnoreCase(str_u, "polar") || equalsIgnoreCase(str_u, tr("polar").toStdString())) { parsed_expression += tr("complex polar form").toStdString(); } else if(str_u == "cis") { parsed_expression += tr("complex cis form").toStdString(); } else if(equalsIgnoreCase(str_u, "angle") || equalsIgnoreCase(str_u, tr("angle").toStdString())) { parsed_expression += tr("complex angle notation").toStdString(); } else if(equalsIgnoreCase(str_u, "phasor") || equalsIgnoreCase(str_u, tr("phasor").toStdString())) { parsed_expression += tr("complex phasor notation").toStdString(); } else if(equalsIgnoreCase(str_u, "utc") || equalsIgnoreCase(str_u, "gmt")) { parsed_expression += tr("UTC time zone").toStdString(); } else if(str_u.length() > 3 && (equalsIgnoreCase(str_u.substr(0, 3), "utc") || equalsIgnoreCase(str_u.substr(0, 3), "gmt"))) { str_u = str_u.substr(3); parsed_expression += "UTC"; remove_blanks(str_u); bool b_minus = false; if(str_u[0] == '+') { str_u.erase(0, 1); } else if(str_u[0] == '-') { b_minus = true; str_u.erase(0, 1); } else if(str_u.find(SIGN_MINUS) == 0) { b_minus = true; str_u.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!str_u.empty() && sscanf(str_u.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; } else { had_errors = true; } if(itz > 0) { if(b_minus) parsed_expression += '-'; else parsed_expression += '+'; if(itz < 60) { parsed_expression += "00"; } else { if(itz < 60 * 10) parsed_expression += '0'; parsed_expression += i2s(itz / 60); } if(itz % 60 > 0) { parsed_expression += ":"; if(itz % 60 < 10) parsed_expression += '0'; parsed_expression += i2s(itz % 60); } } } else if(str_u.length() > 3 && equalsIgnoreCase(str_u.substr(0, 3), "bin") && is_in(NUMBERS, str_u[3])) { unsigned int bits = s2i(str_u.substr(3)); if(bits > 4096) bits = 4096; parsed_expression += i2s(bits); parsed_expression += "-bit "; parsed_expression += tr("binary number").toStdString(); } else if(str_u.length() > 3 && equalsIgnoreCase(str_u.substr(0, 3), "hex") && is_in(NUMBERS, str_u[3])) { unsigned int bits = s2i(str_u.substr(3)); if(bits > 4096) bits = 4096; parsed_expression += i2s(bits); parsed_expression += "-bit "; parsed_expression += tr("hexadecimal number").toStdString(); } else if(str_u == "CET") { parsed_expression += "UTC"; parsed_expression += "+01"; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base", "number base").toStdString())) { parsed_expression += (tr("number base %1").arg(QString::fromStdString(to_str2))).toStdString(); } else if(equalsIgnoreCase(str_u, "decimals") || equalsIgnoreCase(str_u, tr("decimals").toStdString())) { parsed_expression += tr("decimal fraction").toStdString(); } else { int tofr = 0; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(str_u), tofr, tr("fraction")); if(fden > 0) { parsed_expression += tr("fraction").toStdString(); parsed_expression += " ("; parsed_expression += "1/"; parsed_expression += i2s(fden); parsed_expression += ")"; } else if(fden < 0) { parsed_expression += tr("fraction").toStdString(); } else { char c0 = 0; if(str_u[0] == '0' || str_u[0] == '?' || str_u[0] == '+' || str_u[0] == '-') { if(str_u[0] != '?') c0 = str_u[0]; str_u = str_u.substr(1, str_u.length() - 1); remove_blank_ends(str_u); } else if(str_u.length() > 1 && str_u[1] == '?' && (str_u[0] == 'b' || str_u[0] == 'a' || str_u[0] == 'd')) { str_u = str_u.substr(2, str_u.length() - 2); remove_blank_ends(str_u); } Unit *u = CALCULATOR->getActiveUnit(str_u); if(!u) u = CALCULATOR->getCompositeUnit(str_u); Variable *v = NULL; if(!u) v = CALCULATOR->getActiveVariable(str_u); if(v && !v->isKnown()) v = NULL; Prefix *p = NULL; if(!u && !v && CALCULATOR->unitNameIsValid(str_u)) p = CALCULATOR->getPrefix(str_u); CALCULATOR->startControl(100); if(u) { if(!had_to_conv && !str_e.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure to_struct = get_units_for_parsed_expression(&mparse, u, settings->evalops, cdata->current_from_struct && !cdata->current_from_struct->isAborted() ? cdata->current_from_struct : NULL, str_e); if(!to_struct.isZero()) { mparse2 = new MathStructure(); CALCULATOR->parse(mparse2, str_e, settings->evalops.parse_options); po.preserve_format = false; to_struct.format(po); po.preserve_format = true; if(to_struct.isMultiplication() && to_struct.size() >= 2) { if(to_struct[0].isOne()) to_struct.delChild(1, true); else if(to_struct[1].isOne()) to_struct.delChild(2, true); } mparse2->multiply(to_struct); } CALCULATOR->endTemporaryStopMessages(); } mparse = u; } else if(v) { mparse = v; } else if(!p && !str_u.empty()) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", settings->evalops.parse_options.limit_implicit_multiplication ? "01" : "00", "", str_u); int i_warn = 0, i_error = CALCULATOR->endTemporaryStopMessages(NULL, &i_warn); if(!had_to_conv && cu.countUnits() > 0 && !str_e.empty()) { CALCULATOR->beginTemporaryStopMessages(); MathStructure to_struct = get_units_for_parsed_expression(&mparse, &cu, settings->evalops, cdata->current_from_struct && !cdata->current_from_struct->isAborted() ? cdata->current_from_struct : NULL, str_e); if(!to_struct.isZero()) { mparse2 = new MathStructure(); CALCULATOR->parse(mparse2, str_e, settings->evalops.parse_options); po.preserve_format = false; to_struct.format(po); po.preserve_format = true; if(to_struct.isMultiplication() && to_struct.size() >= 2) { if(to_struct[0].isOne()) to_struct.delChild(1, true); else if(to_struct[1].isOne()) to_struct.delChild(2, true); } mparse2->multiply(to_struct); } CALCULATOR->endTemporaryStopMessages(); } if(i_error) { ParseOptions pa = settings->evalops.parse_options; pa.units_enabled = true; if(c0 != 0) str_u.insert(0, 1, c0); CALCULATOR->parse(&mparse, str_u, pa); if(auto_calculable && !test_autocalculatable(mparse)) auto_calculable = 0; else if(auto_calculable == 1 && !mparse.isNumber()) auto_calculable = 2; } else { if(i_warn > 0) had_warnings = true; mparse = cu.generateMathStructure(true); } mparse.format(po); } CALCULATOR->stopControl(); if(p) { parsed_expression += p->preferredDisplayName(po.abbreviate_names, po.use_unicode_signs, false, false, po.can_display_unicode_string_function, po.can_display_unicode_string_arg).formattedName(-1, true, TAG_TYPE_HTML, 0, true, po.hide_underscore_spaces); } else if(!str_u.empty()) { CALCULATOR->beginTemporaryStopMessages(); if(compact) po.preserve_format = false; parsed_expression += mparse.print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML); if(compact) po.preserve_format = true; CALCULATOR->endTemporaryStopMessages(); } had_to_conv = true; } } if(str_u2.empty()) break; str_u = str_u2; } if(mparse2) { mparse2->format(po); parsed_expression.replace(0, parse_l, mparse2->print(po, true, settings->status_in_history ? settings->color : false, TAG_TYPE_HTML)); mparse2->unref(); } } if(po.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nr_base); CALCULATOR->endTemporaryStopMessages(false, &status_messages); size_t message_n = 0; for(size_t i = 0; i < status_messages.size(); i++) { if(status_messages[i].category() != MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION || !settings->implicit_question_asked) { MessageType mtype = status_messages[i].type(); if(mtype == MESSAGE_ERROR) { if(message_n > 0) { if(message_n == 1) parsed_expression_tooltip = "• " + parsed_expression_tooltip; parsed_expression_tooltip += "
• "; } parsed_expression_tooltip += status_messages[i].message(); had_errors = true; message_n++; } else if(mtype == MESSAGE_WARNING) { had_warnings = true; } } } parsed_had_errors = had_errors && (!USES_TOOLTIP || settings->expression_status_delay >= settings->completion_delay); parsed_had_warnings = had_warnings || had_errors; if(!str_f.empty()) {str_f += " "; parsed_expression.insert(0, str_f);} if(parsed_had_errors) prev_parsed_expression = QString::fromStdString(parsed_expression_tooltip); else prev_parsed_expression = QString::fromStdString(parsed_expression); settings->evalops.parse_options.preserve_format = false; if(settings->status_in_history) { emit statusChanged(QString::fromStdString(parsed_expression), !str_e.empty(), had_errors, had_warnings, expression_from_history); if(!b_func) setStatusText(settings->chain_mode || !parsed_had_errors ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 0); } else if(!b_func && show_tooltip) { setStatusText(settings->chain_mode ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 1); } expression_has_changed2 = false; } else if(!b_func) { CALCULATOR->endTemporaryStopMessages(); settings->evalops.parse_options.preserve_format = false; if(prev_func && show_tooltip) { setStatusText((settings->status_in_history && !parsed_had_errors) || settings->chain_mode ? "" : prev_parsed_expression, parsed_had_errors ? 3 : 1); } } else { CALCULATOR->endTemporaryStopMessages(); settings->evalops.parse_options.preserve_format = false; } if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); } void ExpressionEdit::updateDigitGroups() { if(settings->automatic_digit_grouping) { onTextChanged(true); } } void ExpressionEdit::onTextChanged(bool force_update_groups) { QString str = toPlainText(); if(!force_update_groups && str == previous_text && textCursor().position() == previous_pos) return; tabbed_index = -1; if(completionTimer) completionTimer->stop(); if(tipLabel && settings->expression_status_delay > 0 && current_status_type != 2) tipLabel->hideTip(); if(!force_update_groups && block_text_change) return; previous_pos = textCursor().position(); if(settings->automatic_digit_grouping && (settings->evalops.parse_options.base == BASE_DECIMAL || settings->evalops.parse_options.base == BASE_BINARY) && (force_update_groups || previous_text != str) && !str.isEmpty()) { QString sbak = str; char dec = '.', alt_dec = '.'; dec = CALCULATOR->getDecimalPoint()[0]; if(dec != '.' && settings->evalops.parse_options.dot_as_separator) alt_dec = dec; int first_pos = 0, last_pos = 0; int sel_anchor = textCursor().selectionStart(); if(sel_anchor == previous_pos) sel_anchor = textCursor().selectionEnd(); while(true) { char sep = ' '; int base = 10; if(settings->evalops.parse_options.base == BASE_BINARY) base = 2; if(base == 10 && settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE) { if(CALCULATOR->local_digit_group_separator == "." && settings->evalops.parse_options.dot_as_separator) sep = '.'; else if(CALCULATOR->local_digit_group_separator == "," && settings->evalops.parse_options.comma_as_separator) sep = ','; } if(base == 10 && (force_update_groups || prev_group_separator == 0) && last_pos == 0) { if(prev_group_separator > 0 && prev_group_separator != sep && str.length() > 2) { for(int i = 1; i < str.length() - 1; i++) { if(((prev_group_separator == ' ' && str[i] == QChar(0x2009)) || (prev_group_separator != ' ' && str[i] == prev_group_separator)) && str[i - 1].isDigit() && str[i + 1].isDigit()) { if(i < previous_pos) previous_pos--; if(i < sel_anchor) sel_anchor--; str.remove(i, 1); } } } prev_group_separator = sep; } if(last_pos == 0 && previous_pos > 0 && sep == ' ' && str[previous_pos - 1].isSpace() && str.length() - 1 == previous_text.length()) { QString stest = str; stest.remove(previous_pos - 1, 1); if(stest == previous_text) break; } bool cit1 = 0, cit2 = 0; int vpar = 0; for(first_pos = last_pos; first_pos < str.length(); first_pos++) { if(!cit1 && str[first_pos] == '\"') cit2 = !cit2; else if(!cit2 && str[first_pos] == '\'') cit1 = !cit1; else if(!cit1 && !cit2 && vpar > 0 && str[first_pos] == RIGHT_VECTOR_WRAP_CH) vpar--; else if(!cit1 && !cit2 && str[first_pos] == LEFT_VECTOR_WRAP_CH) vpar++; if(!cit1 && !cit2 && !vpar && (is_digit_q(str[first_pos], base) || str[first_pos] == dec || str[first_pos] == alt_dec)) break; } if(first_pos >= str.length()) break; for(last_pos = first_pos + 1; last_pos < str.length(); last_pos++) { if(last_pos == first_pos + 1 && str[last_pos] == 'x' && str[first_pos] == '0') { base = 16; sep = ' '; first_pos = last_pos + 1; } else if(last_pos == first_pos + 1 && str[last_pos] == 'b' && str[first_pos] == '0') { base = 2; sep = ' '; first_pos = last_pos + 1; } else if(last_pos == first_pos + 1 && str[last_pos] == 'd' && str[first_pos] == '0') { base = 12; sep = ' '; first_pos = last_pos + 1; } else if(last_pos == first_pos + 1 && str[last_pos] == 'o' && str[first_pos] == '0') { base = 8; sep = ' '; first_pos = last_pos + 1; } else if(!is_digit_q(str[last_pos], base) && str[last_pos] != dec && str[last_pos] != alt_dec && ((sep == ' ' && !str[last_pos].isSpace()) || (sep != ' ' && str[last_pos] != sep) || last_pos == str.length() - 1 || (!is_digit_q(str[last_pos + 1], base) && str[last_pos + 1] != dec && str[last_pos + 1] != alt_dec))) { break; } } size_t group_index = 0; int group_size = 3; if(base == 2) group_size = 4; else if(base == 8) group_size = 3; else if(base == 16) group_size = 2; else if(settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE && group_index < CALCULATOR->local_digit_group_format.size() && CALCULATOR->local_digit_group_format[group_index] != CHAR_MAX) group_size = CALCULATOR->local_digit_group_format[group_index]; last_pos--; int n = 0, nd = 0, ns = 0, ns_p = 0; int dec_pos = -1; for(int i = last_pos; i >= first_pos; i--) { if(str[i] == dec || str[i] == alt_dec) { dec_pos = i; nd = n; n = 0; } else if(is_digit_q(str[i], base)) { n++; } else if(((sep == ' ' && str[i].isSpace()) || (sep != ' ' && str[i] == sep)) && i > 0 && (is_digit_q(str[i - 1], base) || str[i - 1] == dec || str[i - 1] == alt_dec)) { if(i < previous_pos) ns_p++; ns++; } } if(base <= 10 && (n > group_size + 1 || (nd > group_size + 1 && settings->printops.digit_grouping != DIGIT_GROUPING_LOCALE) || (ns > 0 && (str.length() < previous_text.length() || dec_pos >= 0 || previous_pos < str.length())))) { for(int i = last_pos - 1; ns > 0 && i >= 0;) { if(((sep == ' ' && str[i].isSpace()) || (sep != ' ' && str[i] == sep))) { str.remove(i, 1); ns--; last_pos--; if(i < dec_pos) dec_pos--; if(i < sel_anchor) sel_anchor--; } else { i--; } } previous_pos -= ns_p; ns_p = 0; for(int i = (dec_pos >= 0 ? dec_pos - group_size : last_pos - (group_size - 1)); n > group_size + 1 && i > first_pos; i -= group_size) { if(sep == ' ' && base != 2) str.insert(i, THIN_SPACE); else str.insert(i, sep); if(i < previous_pos) ns_p++; last_pos++; dec_pos++; if(i < sel_anchor) sel_anchor++; if(base == 10 && settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE && group_index + 1 < CALCULATOR->local_digit_group_format.size() && CALCULATOR->local_digit_group_format[group_index + 1] != CHAR_MAX) { group_size = CALCULATOR->local_digit_group_format[group_index + 1]; group_index++; } } for(int i = dec_pos + group_size + 1; nd > group_size + 1 && i <= last_pos && (base == 10 && settings->printops.digit_grouping != DIGIT_GROUPING_LOCALE); i += group_size + 1) { if(sep == ' ' && base != 2) str.insert(i, THIN_SPACE); else str.insert(i, sep); if(i < previous_pos + ns_p) ns_p++; last_pos++; if(i < sel_anchor) sel_anchor++; } previous_pos += ns_p; } last_pos++; } if(str != sbak) { block_text_change++; setCursorWidth(0); setPlainText(str); QTextCursor cur = textCursor(); if(sel_anchor != previous_pos) { cur.setPosition(sel_anchor); cur.setPosition(previous_pos, QTextCursor::KeepAnchor); } else { cur.setPosition(previous_pos); } setTextCursor(cur); setCursorWidth(1); block_text_change--; } } previous_text = str; if(force_update_groups) return; if(expression_undo_buffer.isEmpty() || str != expression_undo_buffer.last()) { if(expression_undo_buffer.isEmpty()) { expression_undo_buffer.push_back(QString()); expression_undo_pos.push_back(0); } if(!block_add_to_undo) { if(expression_undo_buffer.size() > 100) {expression_undo_buffer.pop_front(); expression_undo_pos.pop_front();} else undo_index++; while(undo_index < expression_undo_buffer.size()) { expression_undo_buffer.pop_back(); expression_undo_pos.pop_back(); } expression_undo_buffer.push_back(str); expression_undo_pos.push_back(textCursor().position()); } expression_has_changed = true; } if(!dont_change_index) history_index = -1; highlightParentheses(); bool was_completed = completionView->isVisible(); expression_has_changed2 = true; qApp->processEvents(); displayParseStatus(); if(!completion_blocked && settings->enable_completion) { bool b = was_completed; if(b && settings->completion_delay > 0) { std::string prev_object_text = current_object_text; setCurrentObject(); if((!settings->wayland_platform || strcmp(qVersion(), "6.9.0") != 0) && (current_object_text.find(prev_object_text) != 0 || (prev_object_text.empty() && !CALCULATOR->hasToExpression(str.toStdString(), true, settings->evalops)))) { b = false; } } if(!b && settings->completion_delay > 0) { bool b2 = false; std::string str_from = str.toStdString(); if(CALCULATOR->hasToExpression(str_from, true, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str_from, str_to, settings->evalops, true, true); if(str_to.empty()) b2 = true; } if(!completionTimer) { completionTimer = new QTimer(this); completionTimer->setSingleShot(true); connect(completionTimer, SIGNAL(timeout()), this, SLOT(complete())); } if(b2) { complete(); } else { hideCompletion(); completionTimer->start(settings->completion_delay); } } else { complete(NULL, NULL, NULL, settings->completion_delay > 0); } } qApp->processEvents(); if(was_completed && !completionView->isVisible()) { cdata->current_function = settings->f_answer; displayParseStatus(); } if(document()->isEmpty()) expression_has_changed = false; if(!parse_blocked) emit expressionChanged(); } bool ExpressionEdit::expressionHasChanged() { return expression_has_changed && !document()->isEmpty() && !toPlainText().trimmed().isEmpty(); } void ExpressionEdit::setExpressionHasChanged(bool b) { expression_has_changed = b; } void ExpressionEdit::onCompletionMenuItemActivated() { onCompletionActivated(sender()->property("MODEL INDEX").toModelIndex()); } bool ExpressionEdit::completionInitialized() {return sourceModel->hasChildren();} extern bool function_differentiable(MathFunction*); bool test_x_count_sub(const MathStructure &m, int &x, int &y, int &z) { if(m.isVariable() && !m.variable()->isKnown()) { if(x > 0 && m.variable()->referenceName() == "x") x--; else if(y > 0 && m.variable()->referenceName() == "y") y--; else if(z > 0 && m.variable()->referenceName() == "z") z--; } if(m.isFunction() && !function_differentiable(m.function())) return false; for(size_t i = 0; i < m.size(); i++) { if(test_x_count_sub(m[i], x, y, z)) return true; } return x == 0 || y == 0 || z == 0; } bool test_x_count(const MathStructure &m, int x = -1, int y = -1, int z = -1) { return test_x_count_sub(m, x, y, z); } #define MFROM_CLEANUP if(mstruct_from) {cdata->current_from_struct = from_struct_bak; cdata->current_from_units = from_units_bak; cdata->current_from_categories = from_cats_bak;} bool ExpressionEdit::complete(MathStructure *mstruct_from, MathStructure *mstruct_parsed, QMenu *menu, bool current_object_is_set, bool force) { if(completionTimer) completionTimer->stop(); if(!sourceModel->hasChildren()) updateCompletion(); MathStructure *from_struct_bak = cdata->current_from_struct; std::vector from_units_bak = cdata->current_from_units; std::vector from_cats_bak = cdata->current_from_categories; completionView->setColumnHidden(2, true); if(mstruct_from || (menu && (cdata->current_from_struct || !contains_plot_or_save(CALCULATOR->unlocalizeExpression(toPlainText().toStdString(), settings->evalops.parse_options))))) { do_completion_signal = 1; if(mstruct_from) { cdata->current_from_struct = mstruct_from; find_matching_units(*cdata->current_from_struct, mstruct_parsed, cdata->current_from_units); cdata->current_from_categories.clear(); } else if(!cdata->current_from_struct) { cdata->current_from_struct = new MathStructure; EvaluationOptions eo = settings->evalops; eo.structuring = STRUCTURING_NONE; eo.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; eo.auto_post_conversion = POST_CONVERSION_NONE; eo.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; eo.expand = -2; MathStructure mparse; if(!CALCULATOR->calculate(cdata->current_from_struct, CALCULATOR->unlocalizeExpression(toPlainText().toStdString(), eo.parse_options), 50, eo, &mparse)) cdata->current_from_struct->setAborted(); find_matching_units(*cdata->current_from_struct, &mparse, cdata->current_from_units); cdata->current_from_categories.clear(); } cdata->editing_to_expression = true; cdata->editing_to_expression1 = true; current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { if(menu) {MFROM_CLEANUP; return false;} do_completion_signal = 0; if(!current_object_is_set) setCurrentObject(); if(cdata->editing_to_expression && cdata->editing_to_expression1 && !textCursor().atEnd()) {MFROM_CLEANUP; return false;} } if(!force && !cdata->editing_to_expression && NONDIGIT_INPUT_BASE) { hideCompletion(); MFROM_CLEANUP return false; } if(!force && !cdata->editing_to_expression && !current_object_text.empty() && cdata->current_function && cdata->current_function_index > 0 && cdata->current_function->getArgumentDefinition(cdata->current_function_index) && cdata->current_function->getArgumentDefinition(cdata->current_function_index)->type() == ARGUMENT_TYPE_TEXT && mfunc.isFunction() && (size_t) cdata->current_function_index <= mfunc.size() && mfunc[cdata->current_function_index - 1].isSymbolic() && (cdata->current_function_index != 1 || (cdata->current_function->id() != FUNCTION_ID_BIN && cdata->current_function->id() != FUNCTION_ID_OCT && cdata->current_function->id() != FUNCTION_ID_DEC && cdata->current_function->id() != FUNCTION_ID_FUNCTION))) { hideCompletion(); MFROM_CLEANUP return false; } if(!force && !cdata->editing_to_expression && ((current_object_text.length() == 1 && (current_object_text[0] == 'x' || current_object_text[0] == 'y' || current_object_text[0] == 'z')) || (current_object_text.length() == 2 && ((current_object_text[0] == 'x' && current_object_text[1] == 'y') || (current_object_text[0] == 'x' && current_object_text[1] == 'z') || (current_object_text[0] == 'y' && current_object_text[1] == 'z'))) || (current_object_text.length() == 3 && current_object_text[0] == 'x' && current_object_text[1] == 'y' && current_object_text[2] == 'z')) && (test_x_count(current_status_struct, current_object_text.find("x") != std::string::npos ? 2 : 1, current_object_text.find("y") != std::string::npos ? 2 : 1, current_object_text.find("z") != std::string::npos ? 2 : 1) || (cdata->current_function && cdata->current_function_index > 0 && (size_t) cdata->current_function_index <= mfunc.size() && test_x_count(mfunc[cdata->current_function_index - 1], current_object_text.find("x") != std::string::npos ? 2 : 1, current_object_text.find("y") != std::string::npos ? 2 : 1, current_object_text.find("z") != std::string::npos ? 2 : 1)))) { hideCompletion(); MFROM_CLEANUP return false; } cdata->show_custom_to = (menu != NULL); cdata->to_type = 0; if(cdata->editing_to_expression && cdata->current_from_struct && cdata->current_from_struct->isDateTime()) cdata->to_type = 3; if(current_object_start < 0) { if(cdata->editing_to_expression && cdata->editing_to_expression1 && cdata->current_from_struct && (!cdata->current_from_units.empty() || cdata->current_from_struct->containsType(STRUCT_UNIT, true))) { cdata->to_type = 4; } else if(cdata->editing_to_expression && cdata->editing_to_expression1 && cdata->current_from_struct) { cdata->to_type = 2; } else if(!mstruct_from && !menu && cdata->current_function && cdata->current_function->subtype() == SUBTYPE_DATA_SET && cdata->current_function_index > 1) { Argument *arg = cdata->current_function->getArgumentDefinition(cdata->current_function_index); if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY) { hideCompletion(); MFROM_CLEANUP return false; } } else if(cdata->to_type < 2) { hideCompletion(); MFROM_CLEANUP return false; } } else { if(unicode_length(current_object_text) < (size_t) settings->completion_min) {hideCompletion(); MFROM_CLEANUP; return false;} } if(cdata->editing_to_expression && cdata->editing_to_expression1 && cdata->current_from_struct) { if((cdata->current_from_struct->isUnit() && cdata->current_from_struct->unit()->isCurrency()) || (cdata->current_from_struct->isMultiplication() && cdata->current_from_struct->size() == 2 && (*cdata->current_from_struct)[0].isNumber() && (*cdata->current_from_struct)[1].isUnit() && (*cdata->current_from_struct)[1].unit()->isCurrency())) { if(cdata->to_type == 4) cdata->to_type = 5; else cdata->to_type = 1; } } if(cdata->to_type < 2 && (current_object_text.empty() || is_in(NUMBERS NOT_IN_NAMES "%", current_object_text[0])) && (!current_object_text.empty() || !cdata->current_function || cdata->current_function->subtype() != SUBTYPE_DATA_SET)) { hideCompletion(); MFROM_CLEANUP return false; } if(cdata->to_type == 4 && cdata->current_from_categories.empty()) { for(size_t i = 0; i < cdata->current_from_units.size(); i++) { bool b = false; for(size_t i2 = 0; i2 < settings->alternative_volume_categories.size(); i2++) { if(cdata->current_from_units[i]->category() == settings->alternative_volume_categories[i2]) { cdata->current_from_categories.push_back(settings->volume_category); b = true; break; } } if(!b) cdata->current_from_categories.push_back(cdata->current_from_units[i]->category()); } } cdata->highest_match = 0; cdata->arg = NULL; if(!mstruct_from && !menu && cdata->current_function && cdata->current_function->subtype() == SUBTYPE_DATA_SET) { cdata->arg = cdata->current_function->getArgumentDefinition(cdata->current_function_index); if(cdata->arg && (cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT || cdata->arg->type() == ARGUMENT_TYPE_DATA_PROPERTY)) { if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT && (current_object_text.empty() || unicode_length(current_object_text) < (size_t) settings->completion_min)) {hideCompletion(); MFROM_CLEANUP; return false;} if(cdata->current_function_index == 1) { for(size_t i = 1; i <= cdata->current_function->countNames(); i++) { if(current_object_text.find(cdata->current_function->getName(i).name) != std::string::npos) { cdata->arg = NULL; break; } } } } else { cdata->arg = NULL; } if(cdata->arg) { DataSet *o = NULL; if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT) o = ((DataObjectArgument*) cdata->arg)->dataSet(); else if(cdata->arg->type() == ARGUMENT_TYPE_DATA_PROPERTY) o = ((DataPropertyArgument*) cdata->arg)->dataSet(); if(o) { QFont ifont(completionView->font()); ifont.setStyle(QFont::StyleItalic); QList items; for(int i = 0; i < sourceModel->rowCount();) { QModelIndex index = sourceModel->index(i, 0); int p_type = index.data(TYPE_ROLE).toInt(); if(p_type > 2 && p_type < 100) { sourceModel->removeRow(i); } else { i++; } } DataPropertyIter it; DataProperty *dp = o->getFirstProperty(&it); std::vector found_objects; while(dp) { if(cdata->arg->type() == ARGUMENT_TYPE_DATA_OBJECT) { if(dp->isKey() && dp->propertyType() == PROPERTY_STRING) { DataObjectIter it2; DataObject *obj = o->getFirstObject(&it2); while(obj) { const std::string &name = obj->getProperty(dp); int b_match = 0; if(equalsIgnoreCase(current_object_text, name, 0, current_object_text.length(), 0)) b_match = name.length() == current_object_text.length() ? 1 : 2; for(size_t i = 0; b_match && i < found_objects.size(); i++) { if(found_objects[i] == obj) b_match = 0; } if(b_match) { found_objects.push_back(obj); DataPropertyIter it3; DataProperty *dp2 = o->getFirstProperty(&it3); std::string names = name; std::string title; while(dp2) { if(title.empty() && dp2->hasName("name")) { title = dp2->getDisplayString(obj->getProperty(dp2)); } if(dp2 != dp && dp2->isKey()) { names += " "; names += dp2->getDisplayString(obj->getProperty(dp2)); names += ""; } dp2 = o->getNextProperty(&it3); } COMPLETION_APPEND_M(QString::fromStdString(names), title.empty() ? tr("Data object") : QString::fromStdString(title), 4, b_match) } obj = o->getNextObject(&it2); } } } else { int b_match = 0; size_t i_match = 0; if(current_object_text.empty()) { b_match = 2; i_match = 1; } else { for(size_t i = 1; i <= dp->countNames(); i++) { const std::string &name = dp->getName(i); if((i_match == 0 || name.length() == current_object_text.length()) && equalsIgnoreCase(current_object_text, name, 0, current_object_text.length(), 0)) { b_match = name.length() == current_object_text.length() ? 1 : 2; i_match = i; if(b_match == 1) break; } } } if(b_match) { std::string names = dp->getName(i_match); for(size_t i = 1; i <= dp->countNames(); i++) { if(i != i_match) { names += " "; names += dp->getName(i); names += ""; } } i_match = 0; COMPLETION_APPEND_M(QString::fromStdString(names), QString::fromStdString(dp->title()), 3, b_match) if(b_match > cdata->highest_match) cdata->highest_match = b_match; } } dp = o->getNextProperty(&it); } } else { cdata->arg = NULL; } } } cdata->prefixes.clear(); cdata->pstr.clear(); if(!mstruct_from && !menu && !cdata->arg && unicode_length(current_object_text) >= (size_t) settings->completion_min) { for(size_t pi = 1; ; pi++) { Prefix *prefix = CALCULATOR->getPrefix(pi); if(!prefix) break; for(size_t name_i = 1; name_i <= prefix->countNames(); name_i++) { const std::string *pname = &prefix->getName(name_i).name; if(!pname->empty() && pname->length() < current_object_text.length()) { bool pmatch = true; for(size_t i = 0; i < pname->length(); i++) { if((*pname)[i] != current_object_text[i]) { pmatch = false; break; } } if(pmatch) { cdata->prefixes.push_back(prefix); cdata->pstr.push_back(current_object_text.substr(pname->length())); } } } } } completionModel->setFilter(current_object_text); completionModel->sort(1); if(completionModel->rowCount() > 0) { if(menu) { hideCompletion(); HIDE_TOOLTIP int r = 0; bool b_separator = false; QModelIndex index = completionModel->index(0, 2); QString title, flag; while(index.isValid()) { title = index.data().toString(); int i = title.indexOf("= 0) i2 = title.indexOf("\"/>", i + 10); if(i2 >= 0) { flag = title.mid(i + 10, i2 - (i + 10)); title = title.left(i); } else { flag.clear(); } #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) index = index.siblingAtColumn(0); #else index = index.sibling(r, 0); #endif if(!b_separator && r > 0 && index.data(MATCH_ROLE).toInt() == 6) { menu->addSeparator(); b_separator = true; } QAction *action = menu->addAction(title, this, SLOT(onCompletionMenuItemActivated())); action->setProperty("MODEL INDEX", index); if(!flag.isEmpty()) action->setIcon(QIcon(flag)); r++; index = index.sibling(r, 2); } MFROM_CLEANUP return true; } completionView->resizeRowsToContents(); int c1_prev = completionView->columnWidth(0); completionView->horizontalHeader()->setStretchLastSection(false); completionView->resizeColumnsToContents(); QRect rect; int w = completionView->sizeHint().width(); QTextCursor cur = textCursor(); if(current_object_start >= 0) cur.setPosition(current_object_start); rect = cursorRect(cur); if(prev_rect == rect && completionView->isVisible() && completionView->width() > w) { w = completionView->width(); int scr_w = 0; if(completionView->verticalScrollBar() && completionView->verticalScrollBar()->isVisible()) scr_w = completionView->verticalScrollBar()->sizeHint().width(); if(completionView->columnWidth(0) < c1_prev) { if(completionView->columnWidth(1) <= (w - scr_w) - c1_prev) { completionView->setColumnWidth(0, c1_prev); } else { completionView->setColumnWidth(0, (w - scr_w) - completionView->columnWidth(1)); } completionView->horizontalHeader()->setStretchLastSection(true); } } else if(completionView->verticalScrollBar()) { w += completionView->verticalScrollBar()->sizeHint().width(); } if(!settings->wayland_platform || !completionView->isVisible()) { prev_rect = rect; if(settings->wayland_platform) { QWidget *win = this; while(win->parentWidget()) win = win->parentWidget(); int max_h = win->height() - mapTo(win, QPoint(0, rect.y() + rect.height())).y() - 3; if(completionView->horizontalScrollBar()) max_h -= completionView->horizontalScrollBar()->sizeHint().height(); int n = max_h / ((QAbstractItemView*) completionView)->sizeHintForRow(0); if(n > 20) n = 20; else if(n < 5) n = 5; completer->setMaxVisibleItems(n); } rect.setWidth(w); completer->complete(rect); } else { int h = (((QAbstractItemView*) completionView)->sizeHintForRow(0) * qMin(completer->maxVisibleItems(), completionModel->rowCount()) + 3) + 3; QScrollBar *hsb = completionView->horizontalScrollBar(); if(hsb && hsb->isVisible()) h += hsb->sizeHint().height(); completionView->resize(w, h); } completionView->clearSelection(); completionView->setCurrentIndex(QModelIndex()); if(settings->status_in_history && USES_TOOLTIP) {HIDE_TOOLTIP} if(tipLabel && tipLabel->isVisible()) { if(!tipLabel->placeTip(mapToGlobal(cursorRect().bottomRight()), completionView->geometry())) {HIDE_TOOLTIP} } else if(toolTipTimer && toolTipTimer->isActive()) { toolTipTimer->start(settings->expression_status_delay); } } else { if(tipLabel && tipLabel->isVisible() && completionView->isVisible()) tipLabel->placeTip(mapToGlobal(cursorRect().bottomRight())); hideCompletion(); MFROM_CLEANUP return false; } MFROM_CLEANUP return true; } void ExpressionEdit::onCursorPositionChanged() { tabbed_index = -1; if(completionTimer) completionTimer->stop(); if(toolTipTimer) toolTipTimer->stop(); if(tipLabel && settings->expression_status_delay > 0 && current_status_type != 2) tipLabel->hideTip(); if(block_text_change) return; cursor_has_moved = true; int epos = document()->characterCount() - 1 - textCursor().position(); if(epos == previous_epos) return; previous_epos = epos; completionView->hide(); highlightParentheses(); displayParseStatus(); } bool ExpressionEdit::expressionInQuotes() { bool in_cit1 = false, in_cit2 = false; int pos = textCursor().selectionStart(); for(int i = 0; i < pos; i++) { if(!in_cit2 && document()->characterAt(i) == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && document()->characterAt(i) == '\'') { in_cit2 = !in_cit2; } } return in_cit1 || in_cit2; } void ExpressionEdit::highlightParentheses() { if(document()->isEmpty()) return; if(parentheses_highlighted) { block_text_change++; QTextCursor cur = textCursor(); cur.select(QTextCursor::Document); cur.setCharFormat(QTextCharFormat()); block_text_change--; parentheses_highlighted = false; } if(textCursor().hasSelection()) return; int pos = textCursor().position(), ipar2; int l = document()->characterCount() - 1; if(pos > l) pos = l; bool b = pos < l && document()->characterAt(pos) == ')'; if(!b && pos > 0 && document()->characterAt(pos - 1) == ')') { pos--; b = true; } if(b) { ipar2 = pos; int pars = 1; while(ipar2 > 0) { ipar2--; if(document()->characterAt(ipar2) == ')') pars++; else if(document()->characterAt(ipar2) == '(') pars--; if(pars == 0) break; } if(pars != 0) ipar2 = -1; } else { b = pos < l && document()->characterAt(pos) == '('; if(!b && pos > 0 && document()->characterAt(pos - 1) == '(') { pos--; b = true; } if(b) { ipar2 = pos; int pars = 1; while(ipar2 + 1 < l) { ipar2++; if(document()->characterAt(ipar2) == '(') pars++; else if(document()->characterAt(ipar2) == ')') pars--; if(pars == 0) break; } if(pars != 0) { ipar2 = -1; b = (pos < l - 1); } } } if(b) { block_text_change++; QTextCharFormat format; if(ipar2 >= 0) { if(settings->color == 1) format.setForeground(QColor(0, 159, 0)); else format.setForeground(QColor(96, 255, 96)); } else { if(settings->color == 1) format.setForeground(QColor(183, 0, 0)); else format.setForeground(QColor(255, 128, 128)); } if(use_bold_highlight < 0) { QFontMetrics fm(font()); QFont bfont(font()); bfont.setWeight(QFont::Bold); QFontMetrics fmb(bfont); #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) use_bold_highlight = (fm.horizontalAdvance('(') == fmb.horizontalAdvance('(')); #else use_bold_highlight = (fm.averageCharWidth() == fmb.averageCharWidth()); #endif } if(use_bold_highlight) format.setFontWeight(QFont::Bold); QTextCursor cur = textCursor(); cur.setPosition(pos, QTextCursor::MoveAnchor); cur.setPosition(pos + 1, QTextCursor::KeepAnchor); cur.setCharFormat(format); if(ipar2 >= 0) { cur.setPosition(ipar2, QTextCursor::MoveAnchor); cur.setPosition(ipar2 + 1, QTextCursor::KeepAnchor); cur.setCharFormat(format); } setCurrentCharFormat(QTextCharFormat()); block_text_change--; parentheses_highlighted = true; } } void ExpressionEdit::selectAll(bool b) { tabbed_index = -1; QTextCursor cur = textCursor(); if(b) { cur.select(QTextCursor::Document); setTextCursor(cur); if(!document()->isEmpty()) QApplication::clipboard()->setText(toPlainText(), QClipboard::Selection); cursor_has_moved = false; } else if(cur.hasSelection()) { cur.setPosition(cur.selectionEnd()); setTextCursor(cur); if(!document()->isEmpty()) QApplication::clipboard()->clear(QClipboard::Selection); } } void ExpressionEdit::insertBrackets() { QTextCursor cur = textCursor(); cur.beginEditBlock(); if(cur.hasSelection()) { int istart = cur.selectionStart(); int iend = cur.selectionEnd(); std::string str = CALCULATOR->unlocalizeExpression(toPlainText().mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); cur.setPosition(istart); cur.insertText("["); iend++; cur.setPosition(iend); cur.insertText("]"); iend++; istart++; CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend--; } cur.setPosition(iend); setTextCursor(cur); } else { insertPlainText("[]"); moveCursor(QTextCursor::PreviousCharacter); } cur.endEditBlock(); highlightParentheses(); } void ExpressionEdit::insertText(const QString &s) { if(overwriteMode() && !textCursor().atEnd()) { QTextCursor cur = textCursor(); cur.beginEditBlock(); cur.deleteChar(); insertPlainText(s); cur.endEditBlock(); } else { insertPlainText(s); } } void ExpressionEdit::wrapSelection(const QString &text, bool insert_before, bool always_add_parentheses, bool add_comma, const QString &add_args, bool quote) { blockParseStatus(); QTextCursor cur = textCursor(); if(cur.hasSelection() && (!overwriteMode() || insert_before || always_add_parentheses || add_comma || !add_args.isEmpty())) { QString qstr = toPlainText(); std::string str = qstr.toStdString(); int istart = cur.selectionStart(); int iend = cur.selectionEnd(); if(istart == 0 && iend == qstr.length()) { if(CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str, str_to, settings->evalops, true, true); CALCULATOR->separateWhereExpression(str, str_to, settings->evalops); if(str.empty()) { if(always_add_parentheses && insert_before) { setCursorWidth(0); cur.beginEditBlock(); if(quote) insertPlainText(text + "(\"\"" + add_args +")"); else insertPlainText(text + "(" + add_args +")"); cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::MoveAnchor, add_args.length() + (quote ? 2 : 1)); cur.endEditBlock(); setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses) { insertPlainText("(" + add_args +")" + text); } else if(!text.isEmpty()) { insertPlainText(text); } else { blockParseStatus(false); return; } blockParseStatus(false); highlightParentheses(); displayParseStatus(); return; } iend = unicode_length(str); } else if(!always_add_parentheses && str.find_first_not_of(NUMBER_ELEMENTS SPACE) == std::string::npos) { if(insert_before && !text.isEmpty()) { moveCursor(QTextCursor::Start); insertPlainText(text); moveCursor(QTextCursor::End); } else { moveCursor(QTextCursor::End); if(text.isEmpty()) {blockParseStatus(false); return;} insertPlainText(text); } blockParseStatus(false); highlightParentheses(); displayParseStatus(); return; } } setCursorWidth(0); str = CALCULATOR->unlocalizeExpression(qstr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); if(insert_before || text.isEmpty()) { cur.beginEditBlock(); cur.setPosition(istart); if(quote && str.length() > 2 && str.find_first_of("\"\'") != std::string::npos) quote = false; if(quote) cur.insertText(text + "(\""); else cur.insertText(text + "("); iend += text.length() + (quote ? 2 : 1); cur.setPosition(iend); int iend_text = iend; if(quote) {cur.insertText("\""); iend++; cur.setPosition(iend);} if(!add_args.isEmpty()) { cur.insertText(add_args); iend += add_args.length(); } if(add_comma) { cur.insertText(QString::fromStdString(CALCULATOR->getComma()) + " )"); iend += 3; } else { cur.insertText(")"); iend++; } istart++; CALCULATOR->parseSigns(str); if(!quote && !str.empty() && is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend = iend_text; } else if(add_comma) { iend--; } cur.setPosition(iend); cur.endEditBlock(); } else { CALCULATOR->parseSigns(str); if(!str.empty() && is_in(OPERATORS, str[str.length() - 1]) && str[str.length() - 1] != NOT_CH) { insertPlainText(text); } else { cur.beginEditBlock(); cur.setPosition(istart); cur.insertText("("); cur.setPosition(iend + 1); cur.insertText(")" + text); cur.endEditBlock(); } } setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses && insert_before) { setCursorWidth(0); cur.beginEditBlock(); if(overwriteMode()) cur.deleteChar(); if(quote) insertPlainText(text + "(\"\"" + add_args + ")"); else insertPlainText(text + "(" + add_args + ")"); cur.movePosition(QTextCursor::PreviousCharacter, QTextCursor::MoveAnchor, add_args.length() + (quote ? 2 : 1)); cur.endEditBlock(); setTextCursor(cur); setCursorWidth(1); } else if(always_add_parentheses) { insertText("(" + add_args + ")" + text); } else if(!text.isEmpty()) { insertText(text); } else { blockParseStatus(false); return; } blockParseStatus(false); highlightParentheses(); displayParseStatus(); if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } void ExpressionEdit::smartParentheses() { QString qexpr = toPlainText(); int istart = 0, iend = 0, ipos; QTextCursor cur = textCursor(); cur.beginEditBlock(); if(qexpr.isEmpty()) { setCursorWidth(0); insertPlainText("()"); moveCursor(QTextCursor::PreviousCharacter); cur.endEditBlock(); setCursorWidth(1); return; } ipos = cur.position(); bool goto_start = false; if(cur.hasSelection()) { istart = cur.selectionStart(); iend = cur.selectionEnd(); if(istart == 0 && iend == qexpr.length()) { std::string str = qexpr.toStdString(); if(CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops)) { std::string str_to; CALCULATOR->separateToExpression(str, str_to, settings->evalops, true, true); CALCULATOR->separateWhereExpression(str, str_to, settings->evalops); iend = unicode_length(str); } } } else { iend = ipos; if(iend != 0) { std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { istart = iend; iend = qexpr.length(); if(istart < iend) { str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || (is_in(OPERATORS SPACES SEXADOT DOT RIGHT_VECTOR_WRAP LEFT_PARENTHESIS RIGHT_PARENTHESIS COMMAS, str[0]) && str[0] != MINUS_CH)) { iend = istart; } } } } else { goto_start = true; iend = qexpr.length(); std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart).toStdString(), settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty() || (is_in(OPERATORS SPACES SEXADOT DOT RIGHT_VECTOR_WRAP LEFT_PARENTHESIS RIGHT_PARENTHESIS COMMAS, str[0]) && str[0] != MINUS_CH)) { iend = istart; } } } if(istart >= iend) { setCursorWidth(0); cur.setPosition(istart); setTextCursor(cur); insertPlainText("()"); moveCursor(QTextCursor::PreviousCharacter); cur.endEditBlock(); setCursorWidth(1); return; } setCursorWidth(0); std::string str = CALCULATOR->unlocalizeExpression(qexpr.mid(istart, iend - istart).toStdString(), settings->evalops.parse_options); cur.setPosition(istart); cur.insertText("("); iend++; cur.setPosition(iend); cur.insertText(")"); iend++; istart++; CALCULATOR->parseSigns(str); if(str.empty() || is_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1])) { iend--; goto_start = false; } if(goto_start) cur.setPosition(istart); else cur.setPosition(iend); setTextCursor(cur); cur.endEditBlock(); setCursorWidth(1); highlightParentheses(); } void ExpressionEdit::onCompletionHighlighted(const QModelIndex&) { if(tipLabel && tipLabel->isVisible()) {HIDE_TOOLTIP} else if(toolTipTimer && toolTipTimer->isActive()) toolTipTimer->start(settings->expression_status_delay); } void ExpressionEdit::onCompletionActivated(const QModelIndex &index_pre) { if(!index_pre.isValid()) return; #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) QModelIndex index = index_pre.siblingAtColumn(0); #else QModelIndex index = index_pre.sibling(index_pre.row(), 0); #endif if(!index.isValid()) return; std::string str; int cos_bak = current_object_start; ExpressionItem *item = NULL; Prefix *prefix = NULL; int p_type = 0; int exp = 1; void *p = NULL; const ExpressionName *ename = NULL, *ename_r = NULL, *ename_r2; int i_type = 0; size_t i_match = 0; p_type = index.data(TYPE_ROLE).toInt(); p = index.data(ITEM_ROLE).value(); i_match = index.data(IMATCH_ROLE).toInt(); i_type = index.data(MATCH_ROLE).toULongLong(); if(i_type == 3 && p) return; if(p_type == 1) item = (ExpressionItem*) p; else if(p_type == 2) prefix = (Prefix*) p; if(item && item->isHidden() && item->type() == TYPE_UNIT && item->subtype() == SUBTYPE_ALIAS_UNIT && ((AliasUnit*) item)->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT && !((AliasUnit*) item)->firstBaseUnit()->isHidden() && ((AliasUnit*) item)->firstBaseUnit()->isActive()) { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) this; po.abbreviate_names = true; str = ((AliasUnit*) item)->firstBaseUnit()->print(po, false, TAG_TYPE_HTML, true, false); } else if(item && item->type() == TYPE_UNIT && item->subtype() == SUBTYPE_COMPOSITE_UNIT && (((CompositeUnit*) item)->countUnits() > 1 || !((CompositeUnit*) item)->get(1, &exp, &prefix) || exp != 1)) { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) this; po.abbreviate_names = true; str = ((Unit*) item)->print(po, false, TAG_TYPE_HTML, true, false); } else if(item) { CompositeUnit *cu = NULL; if(item->type() == TYPE_UNIT && item->subtype() == SUBTYPE_COMPOSITE_UNIT) { cu = (CompositeUnit*) item; item = cu->get(1); } if(i_type > 2) { if(i_match > 0) ename = &item->getName(i_match); else ename = &item->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(!ename) return; if(cu && prefix) { str = prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this).name; str += ename->formattedName(TYPE_UNIT, true); } else { str = ename->formattedName(TYPE_UNIT, true); } } else if(cu && prefix) { ename_r = &prefix->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &prefix->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; const ExpressionName *ename_i; size_t l = 0; for(size_t name_i = 0; name_i <= (ename_r2 ? prefix->countNames() + 1 : prefix->countNames()) && l != current_object_text.length(); name_i++) { if(name_i == 0) { ename_i = ename_r; } else if(name_i == 1 && ename_r2) { ename_i = ename_r2; } else { ename_i = &prefix->getName(ename_r2 ? name_i - 1 : name_i); if(!ename_i || ename_i == ename_r || ename_i == ename_r2 || (ename_i->name.length() <= l && ename_i->name.length() != current_object_text.length()) || ename_i->plural || (ename_i->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename_i->name.c_str(), (void*) this)))) { ename_i = NULL; } } if(ename_i) { if(!((Unit*)item)->useWithPrefixesByDefault() || ename_i->name.length() >= current_object_text.length()) { for(size_t i = 0; i < current_object_text.length() && i < ename_i->name.length(); i++) { if(ename_i->name[i] != current_object_text[i]) { if(i_type != 1 || !equalsIgnoreCase(ename_i->name, current_object_text)) { ename_i = NULL; } break; } } } else { ename_i = NULL; } } if(ename_i) { l = ename_i->name.length(); ename = ename_i; } } for(size_t name_i = 1; name_i <= prefix->countNames() && l != current_object_text.length(); name_i++) { ename_i = &prefix->getName(name_i); if(!ename_i || ename_i == ename_r || ename_i == ename_r2 || (ename_i->name.length() <= l && ename_i->name.length() != current_object_text.length()) || (!ename_i->plural && !(ename_i->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename_i->name.c_str(), (void*) this))))) { ename_i = NULL; } if(ename_i) { if(!((Unit*)item)->useWithPrefixesByDefault() || ename_i->name.length() >= current_object_text.length()) { for(size_t i = 0; i < current_object_text.length() && i < ename_i->name.length(); i++) { if(ename_i->name[i] != current_object_text[i] && (ename_i->name[i] < 'A' || ename_i->name[i] > 'Z' || ename_i->name[i] != current_object_text[i] + 32) && (ename_i->name[i] < 'a' || ename_i->name[i] > '<' || ename_i->name[i] != current_object_text[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename_i->name, current_object_text)) { ename_i = NULL; } break; } } } else { ename_i = NULL; } } if(ename_i) { l = ename_i->name.length(); ename = ename_i; } } if(ename && ename->completion_only) { ename = &prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, ename->plural, false, &can_display_unicode_string_function, (void*) this); } if(!ename) ename = ename_r; if(!ename) return; str = ename->name; str += item->preferredInputName(settings->printops.abbreviate_names && ename->abbreviation, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this).formattedName(TYPE_UNIT, true); } else { std::string str2; if(i_match > 0) { str2 = current_object_text.substr(i_match); current_object_start += unicode_length(current_object_text.substr(0, i_match)); } else { str2 = current_object_text; } ename_r = &item->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &item->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; std::string cap_str; for(size_t name_i = 0; name_i <= (ename_r2 ? item->countNames() + 1 : item->countNames()) && !ename; name_i++) { if(name_i == 0) { ename = ename_r; } else if(name_i == 1 && ename_r2) { ename = ename_r2; } else { ename = &item->getName(ename_r2 ? name_i - 1 : name_i); if(!ename || ename == ename_r || ename == ename_r2 || ename->plural || (ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this)))) { ename = NULL; } } if(ename) { bool b = false; std::unordered_map::iterator cap_it = capitalized_names.find(ename); if(cap_it != capitalized_names.end() && str2.length() <= cap_it->second.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(cap_it->second[i] != str2[i]) { if(i_type != 1 || !equalsIgnoreCase(cap_it->second, str2)) { b = false; } break; } } if(b && i_match > 0 && i_type != 1 && equalsIgnoreCase(cap_it->second, str2)) b = false; } if(b) cap_str = cap_it->second; if(!b && str2.length() <= ename->name.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(ename->name[i] != str2[i]) { if(i_type != 1 || !equalsIgnoreCase(ename->name, str2)) { b = false; } break; } } if(b && i_match > 0 && i_type != 1 && equalsIgnoreCase(ename->name, str2)) b = false; } if(!b) ename = NULL; } } for(size_t name_i = 1; name_i <= item->countNames() && !ename; name_i++) { ename = &item->getName(name_i); if(!ename || ename == ename_r || ename == ename_r2 || (!ename->plural && !(ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this))))) { ename = NULL; } if(ename) { bool b = false; if(str2.length() <= ename->name.length()) { b = true; for(size_t i = 0; i < str2.length(); i++) { if(ename->name[i] != str2[i] && (ename->name[i] < 'A' || ename->name[i] > 'Z' || ename->name[i] != str2[i] + 32) && (ename->name[i] < 'a' || ename->name[i] > '<' || ename->name[i] != str2[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename->name, str2)) { b = false; } break; } } if(b && i_match > 0 && i_type != 1 && equalsIgnoreCase(ename->name, str2)) b = false; } if(!b) ename = NULL; } } if(!ename || ename->completion_only) ename = ename_r; if(!ename) return; if(!cap_str.empty()) str = cap_str; else str = ename->name; } } else if(prefix) { ename_r = &prefix->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); if(settings->printops.abbreviate_names && ename_r->abbreviation) ename_r2 = &prefix->preferredInputName(false, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) this); else ename_r2 = NULL; if(ename_r2 == ename_r) ename_r2 = NULL; for(size_t name_i = 0; name_i <= (ename_r2 ? prefix->countNames() + 1 : prefix->countNames()) && !ename; name_i++) { if(name_i == 0) { ename = ename_r; } else if(name_i == 1 && ename_r2) { ename = ename_r2; } else { ename = &prefix->getName(ename_r2 ? name_i - 1 : name_i); if(!ename || ename == ename_r || ename == ename_r2 || ename->plural || (ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this)))) { ename = NULL; } } if(ename) { if(current_object_text.length() <= ename->name.length()) { for(size_t i = 0; i < current_object_text.length(); i++) { if(ename->name[i] != current_object_text[i]) { if(i_type != 1 || !equalsIgnoreCase(ename->name, current_object_text)) { ename = NULL; } break; } } } else { ename = NULL; } } } for(size_t name_i = 1; name_i <= prefix->countNames() && !ename; name_i++) { ename = &prefix->getName(name_i); if(!ename || ename == ename_r || ename == ename_r2 || (!ename->plural && !(ename->unicode && (!settings->printops.use_unicode_signs || !can_display_unicode_string_function(ename->name.c_str(), (void*) this))))) { ename = NULL; } if(ename) { if(current_object_text.length() <= ename->name.length()) { for(size_t i = 0; i < current_object_text.length(); i++) { if(ename->name[i] != current_object_text[i] && (ename->name[i] < 'A' || ename->name[i] > 'Z' || ename->name[i] != current_object_text[i] + 32) && (ename->name[i] < 'a' || ename->name[i] > '<' || ename->name[i] != current_object_text[i] - 32)) { if(i_type != 1 || !equalsIgnoreCase(ename->name, current_object_text)) { ename = NULL; } break; } } } else { ename = NULL; } } } if(ename && (ename->completion_only || (settings->printops.use_unicode_signs && ename->name == "u"))) { ename = &prefix->preferredInputName(ename->abbreviation, settings->printops.use_unicode_signs, ename->plural, false, &can_display_unicode_string_function, (void*) this); } if(!ename) ename = ename_r; if(!ename) return; str = ename->name; } else { str = index.data(Qt::DisplayRole).toString().toStdString(); size_t i = 0; size_t i2 = str.find(" "); while(i_match > 0) { if(i == 0) i = i2 + 4; else i = i2 + 8; if(i >= str.length()) break; i2 = str.find("", i); if(i2 == std::string::npos) break; i_match--; if(i == std::string::npos) break; } if(i2 == std::string::npos) i2 = str.length(); if(i == std::string::npos) i = 0; str = str.substr(i, i2 - i); } if(do_completion_signal > 0) { emit toConversionRequested(str); return; } blockCompletion(true); if(current_object_start >= 0) { QTextCursor c = textCursor(); c.setPosition(current_object_start); c.setPosition(current_object_end, QTextCursor::KeepAnchor); setTextCursor(c); } int i_move = 0; QString text = toPlainText(); if(item && item->type() == TYPE_FUNCTION) { if(text.length() > current_object_end && text[current_object_end] == '(') { i_move = 1; } else { str += "()"; i_move = -1; } } blockParseStatus(); insertPlainText(QString::fromStdString(str)); blockParseStatus(false); if(i_move != 0) { QTextCursor c = textCursor(); c.setPosition(c.position() + i_move); setTextCursor(c); } blockCompletion(false); if((do_completion_signal < 0 || (!item && !prefix)) && cdata->editing_to_expression && (current_object_end < 0 || current_object_end == text.length())) { if(!str.empty() && str[str.length() - 1] != ' ' && str[str.length() - 1] != '/') { current_object_end = current_object_start + unicode_length(str); current_object_start = cos_bak; emit returnPressed(); return; } } current_object_end = current_object_start + unicode_length(str); current_object_start = cos_bak; cdata->current_function = settings->f_answer; if(settings->adaptive_autocalc_delay && settings->status_in_history && (!item || item->type() != TYPE_FUNCTION)) { int delay_bak = settings->auto_calculate_delay; settings->auto_calculate_delay = 0; displayParseStatus(); settings->auto_calculate_delay = delay_bak; } else { displayParseStatus(); } if(expressionHasChanged() && !parse_blocked) emit expressionChanged(); } void ExpressionEdit::hideCompletion() { completionView->hide(); } void ExpressionEdit::clearHistory() { settings->expression_history.clear(); history_index = -1; current_history.clear(); } void ExpressionEdit::addToHistory() { std::string str = toPlainText().toStdString(); for(size_t i = 0; i < settings->expression_history.size(); i++) { if(settings->expression_history[i] == str) { settings->expression_history.erase(settings->expression_history.begin() + i); break; } } if(settings->expression_history.size() >= 100) { settings->expression_history.pop_back(); } settings->expression_history.insert(settings->expression_history.begin(), str); history_index = 0; cursor_has_moved = false; } void ExpressionEdit::setCurrentObject() { current_object_start = -1; current_object_end = -1; current_object_text = ""; cdata->editing_to_expression = false; cdata->editing_to_expression1 = false; bool current_object_in_quotes = false; std::string str; size_t l_to = 0, pos = 0, pos2 = 0; if(textCursor().position() > 0) { QString str = toPlainText(); current_object_start = textCursor().position(); current_object_end = current_object_start; current_object_text = str.left(current_object_start).toStdString(); l_to = current_object_text.length(); pos = current_object_text.length(); pos2 = pos; if(l_to > 0 && current_object_text[0] == '/') return; bool cit1 = false, cit2 = false, hex = false, duo = false, after_space = false; for(size_t i = 0; i < l_to; i++) { if(!cit1 && current_object_text[i] == '\"') { cit2 = !cit2; hex = false; duo = false; } else if(!cit2 && current_object_text[i] == '\'') { cit1 = !cit1; hex = false; duo = false; } else if(!hex && !cit1 && !cit2 && i + 2 < l_to && current_object_text[i] == '0' && current_object_text[i + 1] == 'x' && is_digit_q(current_object_text[i + 2], 16)) { hex = true; duo = false; after_space = false; i += 2; } else if(!hex && !duo && !cit1 && !cit2 && i + 3 < l_to && current_object_text[i] == '0' && current_object_text[i + 1] == 'd' && is_digit_q(current_object_text[i + 2], 12) && is_digit_q(current_object_text[i + 3], 12)) { duo = true; after_space = false; i += 3; } else if(!cit1 && !cit2 && current_object_text[i] == '#') { current_object_start = -1; current_object_end = -1; current_object_text = ""; break; } else if((hex || duo) && current_object_text[i] == ' ') { after_space = true; } else if((hex || duo) && after_space && (current_object_text[i] < '0' || current_object_text[i] < '9')) { after_space = false; } else if((hex || duo) && ((after_space && !is_digit_q(current_object_text[i], hex ? 16 : 12)) || !CALCULATOR->utf8_pos_is_valid_in_name((char*) current_object_text.c_str() + sizeof(char) * i))) { duo = false; hex = false; } } if(hex || duo) { current_object_start = -1; current_object_end = -1; current_object_text = ""; } current_object_in_quotes = (cit1 || cit2); } if(current_object_start >= 0) { if(CALCULATOR->hasToExpression(current_object_text, true, settings->evalops)) { cdata->editing_to_expression = true; std::string str_to, str_from = current_object_text; bool b_space = is_in(SPACES, str_from[str_from.length() - 1]); bool b_first = true; do { CALCULATOR->separateToExpression(str_from, str_to, settings->evalops, true, true); if(b_first && str_from.empty()) { if(cdata->current_from_struct) cdata->current_from_struct->unref(); cdata->current_from_struct = settings->current_result; if(cdata->current_from_struct) { cdata->current_from_struct->ref(); find_matching_units(*cdata->current_from_struct, NULL, cdata->current_from_units); cdata->current_from_categories.clear(); } } b_first = false; str_from = str_to; if(!str_to.empty() && b_space) str_from += " "; } while(CALCULATOR->hasToExpression(str_from, true, settings->evalops)); l_to = str_to.length(); } bool non_number_before = false; size_t l; while(pos2 > 0 && l_to > 0) { l = 1; while(pos2 - l > 0 && (unsigned char) current_object_text[pos2 - l] >= 0x80 && (unsigned char) current_object_text[pos2 - l] < 0xC0) l++; pos2 -= l; l_to -= l; current_object_start--; if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) current_object_text.c_str() + sizeof(char) * pos2)) { if(l == 1 && (((char*) current_object_text.c_str() + sizeof(char) * pos2)[0] == '\\' || (current_object_in_quotes && !cdata->editing_to_expression && (((char*) current_object_text.c_str() + sizeof(char) * pos2)[0] == '\'' || ((char*) current_object_text.c_str() + sizeof(char) * pos2)[0] == '\"')))) { pos2 = pos + 1; } else { pos2 += l; current_object_start++; } break; } else if(l == 1 && is_in(NUMBERS, current_object_text[pos2])) { if(non_number_before) { pos2++; current_object_start++; break; } } else { non_number_before = true; } } cdata->editing_to_expression1 = (l_to == 0); if(pos2 > pos) { current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { std::string str2 = toPlainText().toStdString(); while(pos < str2.length()) { if(!CALCULATOR->utf8_pos_is_valid_in_name((char*) str2.c_str() + sizeof(char) * pos)) { break; } if((unsigned char) str2[pos] >= 0xC0) pos += 2; else if((unsigned char) str2[pos] >= 0xE0) pos += 3; else if((unsigned char) str2[pos] >= 0xF0) pos += 4; else pos++; current_object_end++; } if(pos2 >= pos) { current_object_start = -1; current_object_end = -1; current_object_text = ""; } else { current_object_text = str2.substr(pos2, pos - pos2); } } } } bool ExpressionEdit::doChainMode(const QString &op) { if(expression_has_changed && !settings->rpn_mode && settings->chain_mode && !cdata->current_function && settings->evalops.parse_options.base != BASE_UNICODE && (settings->evalops.parse_options.base != BASE_CUSTOM || (CALCULATOR->customInputBase() <= 62 && CALCULATOR->customInputBase() >= -62))) { QTextCursor cur = textCursor(); if(cur.hasSelection()) { if(cur.selectionStart() != 0 || cur.selectionEnd() != toPlainText().length()) return false; } else if(!cur.atEnd()) { return false; } std::string str = CALCULATOR->unlocalizeExpression(toPlainText().toStdString(), settings->evalops.parse_options); remove_blanks(str); if(str.empty() || str[0] == '/' || CALCULATOR->hasToExpression(str, true, settings->evalops) || CALCULATOR->hasWhereExpression(str, settings->evalops) || last_is_operator(str)) return false; size_t par_n = 0, vec_n = 0; for(size_t i = 0; i < str.length(); i++) { if(str[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n > 0 || vec_n > 0) return false; cur.beginEditBlock(); if(str.find_first_not_of(NUMBER_ELEMENTS SPACE) != std::string::npos) { MathStructure mparse; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mparse, str, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); if((!mparse.isMultiplication() || op != settings->multiplicationSign(false)) && (!mparse.isAddition() || (op != "+" && op != "-" && op != SIGN_MINUS)) && (!mparse.isBitwiseOr() || op != BITWISE_OR) && (!mparse.isBitwiseAnd() || op != BITWISE_AND)) { cur.movePosition(QTextCursor::Start); cur.insertText("("); cur.movePosition(QTextCursor::End); cur.insertText(")"); } else if(cur.hasSelection()) { cur.movePosition(QTextCursor::End); } } else if(cur.hasSelection()) { cur.movePosition(QTextCursor::End); } setTextCursor(cur); insertPlainText(op); cur.endEditBlock(); return true; } return false; } QString ExpressionEdit::selectedText(bool b) { if(b && !textCursor().hasSelection()) return toPlainText(); return textCursor().selectedText(); } void ExpressionEdit::insertFromMimeData(const QMimeData *source) { QString str; if(!source->objectName().startsWith("history_") && source->hasHtml()) str = unhtmlize(source->html()).trimmed(); else if(source->hasText()) str = source->text(); if(settings->printops.use_unicode_signs && str.length() > 1) { bool in_cit1 = false, in_cit2 = false; QString text = toPlainText(); int pos = textCursor().selectionStart(); for(int i = 0; i < pos; i++) { if(!in_cit2 && text[i] == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && text[i] == '\'') { in_cit2 = !in_cit2; } } for(int i = 0; i < str.length(); i++) { if(!in_cit2 && str[i] == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && str[i] == '\'') { in_cit2 = !in_cit2; } else if(!in_cit1 && !in_cit2) { if(str[i] == '*') str.replace(i, 1, settings->multiplicationSign()); else if(str[i] == '/') str.replace(i, 1, settings->divisionSign(false)); else if(str[i] == '-') str.replace(i, 1, SIGN_MINUS); else if(str[i] == 's' && settings->copy_ascii && settings->printops.use_unicode_signs && i + 3 < str.length() && str[i + 1] == 'q' && str[i + 2] == 'r' && str[i + 3] == 't') str.replace(i, 4, SIGN_SQRT); else if(str[i] == 'o' && settings->copy_ascii && settings->printops.use_unicode_signs && i + 2 < str.length() && str[i + 1] == 'h' && str[i + 2] == 'm') str.replace(i, 3, "Ω"); } } } if(!str.isEmpty()) insertPlainText(str); } qalculate-qt-5.11.0/src/expressionedit.h000066400000000000000000000132441520501070600202000ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef EXPRESSION_EDIT_H #define EXPRESSION_EDIT_H #include #include #include #include class QCompleter; class QStandardItemModel; class QTableView; class QMenu; class QAction; class QLabel; class QTimer; class ExpressionTipLabel; struct CompletionData; class ExpressionProxyModel : public QSortFilterProxyModel { Q_OBJECT public: ExpressionProxyModel(CompletionData*, QObject *parent = NULL); ~ExpressionProxyModel(); void setFilter(std::string); CompletionData *cdata; protected: std::string str; bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; }; class ExpressionEdit : public QPlainTextEdit { Q_OBJECT protected: QCompleter *completer; ExpressionProxyModel *completionModel; QStandardItemModel *sourceModel; QTableView *completionView; QMenu *cmenu, *fileMenu, *modeMenu; QAction *undoAction, *redoAction, *cutAction, *copyAction, *pasteAction, *deleteAction, *selectAllAction, *clearAction, *statusOffAction, *statusDelayAction, *statusAdaptiveDelayAction, *statusNoDelayAction, *statusHistoryAction, *statusExpressionAction, *statusStatusAction, *autocalcSelectionAction, *calculateSelectionAction, *clearHistoryAction, *fileAction, *fileSeparator, *tbAction; QTimer *completionTimer, *toolTipTimer; QLabel *statusLabel; ExpressionTipLabel *tipLabel; QWidget *tb; QStringList expression_undo_buffer; QList expression_undo_pos; QString current_history; int history_index, undo_index; int tabbed_index; int previous_pos; QString previous_text; bool enable_tab; int use_bold_highlight; char prev_group_separator; CompletionData *cdata; int current_object_start, current_object_end; int current_function_index; std::string current_object_text; MathStructure mfunc, current_status_struct; int completion_blocked, parse_blocked, block_add_to_undo; int block_text_change; int do_completion_signal; bool disable_history_arrow_keys, dont_change_index, cursor_has_moved; int block_display_parse; QString prev_parsed_expression, parsed_expression_tooltip, current_status_text; int current_status_type; bool expression_has_changed, expression_has_changed2; bool parsed_had_errors, parsed_had_warnings; bool expression_from_history; int previous_epos; QPoint function_pos; bool parentheses_highlighted; int auto_calculable; int default_frame; QRect prev_rect; void setCurrentObject(); void setStatusText(const QString &text, int = 0); bool displayFunctionHint(MathFunction *f, int arg_index = 1); void highlightParentheses(); void keyReleaseEvent(QKeyEvent*) override; void changeEvent(QEvent*) override; void contextMenuEvent(QContextMenuEvent *e) override; void insertFromMimeData(const QMimeData*) override; bool expressionInQuotes(); public: ExpressionEdit(QWidget *parent, QWidget *toolbar, QLabel *sl); virtual ~ExpressionEdit(); std::string expression() const; QSize sizeHint() const override; void updateMinimumHeight(); void wrapSelection(const QString &text = QString(), bool insert_before = false, bool add_parentheses = false, bool add_comma = false, const QString &add_arg = QString(), bool quote = false); bool doChainMode(const QString &op); bool expressionHasChanged(); void setExpressionHasChanged(bool); void displayParseStatus(bool = false, bool = true); void inputMethodEvent(QInputMethodEvent*) override; void keyPressEvent(QKeyEvent*) override; QString selectedText(bool = false); void onCompleterEvent(QEvent*); bool eventFilter(QObject*, QEvent*) override; void setMenuAndToolbarItems(QMenu*, QMenu*, QAction*); bool completionInitialized(); void insertText(const QString&); int parsedCalculable(); std::vector status_messages; protected slots: void onTextChanged(bool = false); void onCursorPositionChanged(); void onCompletionActivated(const QModelIndex&); void onCompletionHighlighted(const QModelIndex&); void onCompletionMenuItemActivated(); void enableIM(); void enableCompletionDelay(); void onCompletionModeChanged(); void onAutocalcSelectionChanged(); void onStatusModeChanged(); void onSelectionChanged(); public slots: void showCurrentStatus(); void updateCompletion(); void setExpression(std::string); void setExpression(const QString &str); void blockCompletion(bool = true, bool = true); void blockParseStatus(bool = true); void blockUndo(bool = true); void hideCompletion(); void addToHistory(); void smartParentheses(); void insertBrackets(); void selectAll(bool b = true); void editUndo(); void editRedo(); void editDelete(); void insertDate(); void insertMatrix(); void enableTabCompletion(bool); bool completeOrActivateFirst(bool = false); bool complete(MathStructure* = NULL, MathStructure* = NULL, QMenu* = NULL, bool = false, bool = false); void clearHistory(); void updateDigitGroups(); signals: void returnPressed(); void toConversionRequested(std::string); void calculateRPNRequest(int); void calculateSelectionRequest(); void expressionStatusModeChanged(bool); void statusChanged(QString, bool, bool, bool, bool); void expressionChanged(); }; #endif //EXPRESSION_EDIT_H qalculate-qt-5.11.0/src/fpconversiondialog.cpp000066400000000000000000000333751520501070600213700ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "fpconversiondialog.h" FPConversionDialog::FPConversionDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Floating Point Conversion (IEEE 754)")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Format"), this), 0, 0, Qt::AlignRight); formatCombo = new QComboBox(this); grid->addWidget(formatCombo, 0, 1); formatCombo->addItem(tr("16-bit (half precision)")); formatCombo->addItem(tr("32-bit (single precision)")); formatCombo->addItem(tr("64-bit (double precision)")); formatCombo->addItem(tr("80-bit (x86 extended format)")); formatCombo->addItem(tr("128-bit (quadruple precision)")); formatCombo->addItem(tr("Microchip 24-bit")); formatCombo->addItem(tr("Microchip 32-bit")); formatCombo->setCurrentIndex(1); grid->addWidget(new QLabel(tr("Value"), this), 1, 0, Qt::AlignRight); valueEdit = new MathLineEdit(this); valueEdit->setAlignment(Qt::AlignRight); grid->addWidget(valueEdit, 1, 1); QLabel *label = new QLabel(tr("Binary representation"), this); label->setMinimumHeight(valueEdit->sizeHint().height()); grid->addWidget(label, 2, 0, Qt::AlignRight | Qt::AlignTop); binEdit = new QTextEdit(this); grid->addWidget(binEdit, 2, 1); QFontMetrics fm(binEdit->font()); QString str; str.fill('0', 68); binEdit->setMinimumWidth(fm.boundingRect(str).width()); binEdit->setFixedHeight(fm.lineSpacing() * 3 + (binEdit->document()->documentMargin() + binEdit->frameWidth()) * 2 + binEdit->contentsMargins().top() + binEdit->contentsMargins().bottom()); binEdit->setPlainText("0"); QTextCursor cursor = binEdit->textCursor(); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); binEdit->setTextCursor(cursor); binEdit->setPlainText(""); grid->addWidget(new QLabel(tr("Hexadecimal representation"), this), 3, 0, Qt::AlignRight); hexEdit = new QLineEdit(this); hexEdit->setAlignment(Qt::AlignRight); grid->addWidget(hexEdit, 3, 1); grid->addWidget(new QLabel(tr("Floating point value"), this), 4, 0, Qt::AlignRight); hexExp2Edit = new QLineEdit(this); hexExp2Edit->setAlignment(Qt::AlignRight); grid->addWidget(hexExp2Edit, 4, 1); hexExp2Edit->setReadOnly(true); exp2Edit = new QLineEdit(this); exp2Edit->setAlignment(Qt::AlignRight); grid->addWidget(exp2Edit, 5, 1); exp2Edit->setReadOnly(true); decEdit = new QLineEdit(this); decEdit->setAlignment(Qt::AlignRight); grid->addWidget(decEdit, 6, 1); decEdit->setReadOnly(true); grid->addWidget(new QLabel(tr("Conversion error"), this), 7, 0, Qt::AlignRight); errorEdit = new QLineEdit(this); errorEdit->setAlignment(Qt::AlignRight); grid->addWidget(errorEdit, 7, 1); errorEdit->setReadOnly(true); valueEdit->setFocus(); grid->setColumnStretch(1, 1); box->addLayout(grid); box->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(formatCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(formatChanged())); connect(binEdit, SIGNAL(textChanged()), this, SLOT(binChanged())); connect(valueEdit, SIGNAL(textEdited(const QString&)), this, SLOT(valueChanged())); connect(hexEdit, SIGNAL(textEdited(const QString&)), this, SLOT(hexChanged())); box->setSizeConstraint(QLayout::SetFixedSize); } FPConversionDialog::~FPConversionDialog() {} unsigned int FPConversionDialog::getBits() { switch(formatCombo->currentIndex()) { case 0: return 16; case 1: return 32; case 2: return 64; case 3: return 80; case 4: return 128; case 5: return 24; case 6: return 32; } return 32; } unsigned int FPConversionDialog::getExponentBits() { int i = formatCombo->currentIndex(); if(i == 5) return 8; return standard_expbits(getBits()); } unsigned int FPConversionDialog::getSignPosition() { int i = formatCombo->currentIndex(); if(i == 5 || i == 6) return 8; return 0; } void FPConversionDialog::formatChanged() { updateFields(10); } void FPConversionDialog::clear() { updateFields(0); } void FPConversionDialog::updateFields(int base, const MathStructure *v) { std::string sbin; Number decnum; bool use_decnum = false; unsigned int bits = getBits(); unsigned int expbits = getExponentBits(); unsigned int sgnpos = getSignPosition(); PrintOptions po; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; po.use_unicode_signs = settings->printops.use_unicode_signs; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.rounding = settings->printops.rounding; po.base_display = BASE_DISPLAY_NONE; po.abbreviate_names = settings->printops.abbreviate_names; po.digit_grouping = settings->printops.digit_grouping; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = settings->printops.short_multiplication; po.excessive_parenthesis = settings->printops.excessive_parenthesis; po.can_display_unicode_string_function = &can_display_unicode_string_function; po.can_display_unicode_string_arg = (void*) valueEdit; po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.binary_bits = bits; po.show_ending_zeroes = false; po.min_exp = 0; if(base == 10 || v) { MathStructure value; if(v) { valueEdit->setText(QString::fromStdString(v->number().print(po))); base = 10; value.set(*v); } else { std::string str = valueEdit->text().toStdString(); remove_blank_ends(str); if(str.empty()) { value.setAborted(); } else { if(last_is_operator(str, true)) return; EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; eo.parse_options.read_precision = DONT_READ_PRECISION; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.base = 10; CALCULATOR->calculate(&value, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 1500, eo); } } if(value.isNumber()) { sbin = to_float(value.number(), bits, expbits, sgnpos); decnum = value.number(); use_decnum = true; } else if(value.isUndefined()) { sbin = to_float(nr_one_i, bits, expbits, sgnpos); } else { sbin = ""; } CALCULATOR->clearMessages(); } else if(base == 2) { std::string str = binEdit->toPlainText().toStdString(); remove_blanks(str); if(!str.empty()) { if(str.find_first_not_of("01") == std::string::npos && str.length() <= bits) { sbin = str; } else { sbin = ""; } CALCULATOR->clearMessages(); } } else if(base == 16) { std::string str = hexEdit->text().toStdString(); remove_blanks(str); if(!str.empty()) { ParseOptions pa; pa.base = BASE_HEXADECIMAL; Number nr(str, pa); PrintOptions po; po.base = BASE_BINARY; po.binary_bits = bits; po.max_decimals = 0; po.use_max_decimals = true; po.base_display = BASE_DISPLAY_NONE; sbin = nr.print(po); if(sbin.length() < bits) sbin.insert(0, bits - sbin.length(), '0'); if(sbin.length() > bits) { sbin = ""; } CALCULATOR->clearMessages(); } } valueEdit->blockSignals(true); binEdit->blockSignals(true); hexEdit->blockSignals(true); if(sbin.empty()) { if(base != 10) valueEdit->clear(); if(base != 16) hexEdit->clear(); if(base != 2) binEdit->clear(); hexExp2Edit->clear(); exp2Edit->clear(); decEdit->clear(); errorEdit->clear(); } else { int prec_bak = CALCULATOR->getPrecision(); CALCULATOR->setPrecision(100); ParseOptions pa; pa.base = BASE_BINARY; Number nr(sbin, pa); if(base != 16) {po.base = 16; hexEdit->setText(QString::fromStdString(nr.print(po)));} if(base != 2) { std::string str = sbin; if(bits > 32) { for(size_t i = expbits + 5; i < str.length() - 1; i += 4) { if((bits == 80 && str.length() - i == 32) || (bits == 128 && (str.length() - i == 56))) str.insert(i, "\n"); else str.insert(i, " "); i++; } } str.insert(expbits + 1, bits > 32 ? "\n" : " "); str.insert(1, " "); binEdit->setPlainText(QString::fromStdString(str)); QTextCursor cursor = binEdit->textCursor(); cursor.select(QTextCursor::Document); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); cursor.setPosition(0); binEdit->setTextCursor(cursor); } if(settings->printops.min_exp == -1 || settings->printops.min_exp == 0) po.min_exp = 8; else po.min_exp = settings->printops.min_exp; po.base = 10; po.max_decimals = 50; po.use_max_decimals = true; Number value; int ret = from_float(value, sbin, bits, expbits, sgnpos); if(ret <= 0) { decEdit->setText(ret < 0 ? "NaN" : ""); hexExp2Edit->setText(ret < 0 ? "NaN" : ""); exp2Edit->setText(ret < 0 ? "NaN" : ""); errorEdit->clear(); if(base != 10) valueEdit->setText(QString::fromStdString(m_undefined.print(po))); } else { if(sbin.length() < bits) sbin.insert(0, bits - sbin.length(), '0'); Number exponent, significand; exponent.set(sbin.substr(sgnpos == 0 ? 1 : 0, expbits), pa); Number expbias(2); expbias ^= (expbits - 1); expbias--; bool subnormal = exponent.isZero(); exponent -= expbias; std::string sfloat, sfloathex; bool b_approx = false; po.is_approximate = &b_approx; if(exponent > expbias) { if(sbin[0] != '0') sfloat = nr_minus_inf.print(po); else sfloat = nr_plus_inf.print(po); sfloathex = sfloat; } else { if(subnormal) exponent++; if(subnormal) significand.set(std::string("0.") + sbin.substr((bits == 80 ? 2 : 1) + expbits), pa); else significand.set(std::string("1.") + sbin.substr((bits == 80 ? 2 : 1) + expbits), pa); if(sbin[sgnpos] != '0') significand.negate(); int exp_bak = po.min_exp; po.min_exp = 0; sfloat = significand.print(po); if(!subnormal || !significand.isZero()) { sfloat += " "; sfloat += settings->multiplicationSign(); sfloat += " "; sfloat += "2^"; po.digit_grouping = DIGIT_GROUPING_NONE; sfloat += exponent.print(po); po.digit_grouping = settings->printops.digit_grouping; } if(b_approx) sfloat.insert(0, SIGN_ALMOST_EQUAL " "); b_approx = false; po.base = 16; po.lower_case_numbers = true; po.decimalpoint_sign = "."; po.use_unicode_signs = false; if(significand.isNegative()) { significand.negate(); sfloathex = "-"; } sfloathex += "0x"; sfloathex += significand.print(po); po.base = 10; sfloathex += 'p'; if(sfloathex == "0") sfloathex += "-1"; else sfloathex += exponent.print(po); if(b_approx) sfloat.insert(0, SIGN_ALMOST_EQUAL " "); po.decimalpoint_sign = settings->printops.decimalpoint_sign; po.lower_case_numbers = false; po.min_exp = exp_bak; po.use_unicode_signs = settings->printops.use_unicode_signs; } hexExp2Edit->setText(QString::fromStdString(sfloathex)); exp2Edit->setText(QString::fromStdString(sfloat)); b_approx = false; std::string svalue = value.print(po); if(base != 10) valueEdit->setText(QString::fromStdString(svalue)); if(b_approx) svalue.insert(0, SIGN_ALMOST_EQUAL " "); decEdit->setText(QString::fromStdString(svalue)); Number nr_error; if(use_decnum && (!decnum.isInfinite() || !value.isInfinite())) { nr_error = value; nr_error -= decnum; nr_error.abs(); if(decnum.isApproximate() && prec_bak < CALCULATOR->getPrecision()) CALCULATOR->setPrecision(prec_bak); } b_approx = false; std::string serror = nr_error.print(po); if(b_approx) serror.insert(0, SIGN_ALMOST_EQUAL " "); errorEdit->setText(QString::fromStdString(serror)); } CALCULATOR->setPrecision(prec_bak); } valueEdit->blockSignals(false); binEdit->blockSignals(false); hexEdit->blockSignals(false); } void FPConversionDialog::setValue(const QString &str) { valueEdit->blockSignals(true); valueEdit->setText(str); valueEdit->blockSignals(false); updateFields(10); valueEdit->selectAll(); valueEdit->setFocus(); } void FPConversionDialog::setValue(const MathStructure &m) { updateFields(0, &m); valueEdit->selectAll(); valueEdit->setFocus(); } void FPConversionDialog::setBin(const QString &str) { binEdit->blockSignals(true); binEdit->setPlainText(str); QTextCursor cursor = binEdit->textCursor(); cursor.select(QTextCursor::Document); QTextBlockFormat textBlockFormat = cursor.blockFormat(); textBlockFormat.setAlignment(Qt::AlignRight); cursor.mergeBlockFormat(textBlockFormat); cursor.setPosition(0); binEdit->setTextCursor(cursor); binEdit->blockSignals(false); updateFields(2); binEdit->setFocus(); } void FPConversionDialog::setHex(const QString &str) { hexEdit->blockSignals(true); hexEdit->setText(str); hexEdit->blockSignals(false); updateFields(16); hexEdit->selectAll(); hexEdit->setFocus(); } void FPConversionDialog::hexChanged() { updateFields(16); } void FPConversionDialog::binChanged() { updateFields(2); } void FPConversionDialog::valueChanged() { updateFields(10); } qalculate-qt-5.11.0/src/fpconversiondialog.h000066400000000000000000000024321520501070600210230ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef FP_CONVERSION_DIALOG_H #define FP_CONVERSION_DIALOG_H #include #include class QComboBox; class QTextEdit; class QLineEdit; class FPConversionDialog : public QDialog { Q_OBJECT protected: QComboBox *formatCombo; QLineEdit *valueEdit, *hexEdit, *hexExp2Edit, *exp2Edit, *decEdit, *errorEdit; QTextEdit *binEdit; unsigned int getBits(); unsigned int getExponentBits(); unsigned int getSignPosition(); protected slots: void formatChanged(); void updateFields(int base, const MathStructure *value = NULL); void hexChanged(); void binChanged(); void valueChanged(); public slots: void setValue(const QString &str); void setValue(const MathStructure &m); void setBin(const QString &str); void setHex(const QString &str); void clear(); public: FPConversionDialog(QWidget *parent = NULL); virtual ~FPConversionDialog(); }; #endif //FP_CONVERSION_DIALOG_H qalculate-qt-5.11.0/src/functioneditdialog.cpp000066400000000000000000001660151520501070600213460ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #include #include #include "functioneditdialog.h" #include "qalculateqtsettings.h" void fix_expression(std::string &str) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; str = CALCULATOR->unlocalizeExpression(str, pa); if(str.empty()) return; size_t i = 0; bool b = false; while(true) { i = str.find("\\", i); if(i == std::string::npos || i == str.length() - 1) break; if((str[i + 1] >= 'a' && str[i + 1] <= 'z') || (str[i + 1] >= 'A' && str[i + 1] <= 'Z') || (str[i + 1] >= '1' && str[i + 1] <= '9')) { b = true; break; } i++; } CALCULATOR->parseSigns(str); if(!b) { bool in_cit1 = false, in_cit2 = false; for(i = 0; i < str.length(); i++) { if(!in_cit2 && str[i] == '\"') { in_cit1 = !in_cit1; } else if(!in_cit1 && str[i] == '\'') { in_cit2 = !in_cit2; } else if(!in_cit1 && !in_cit2 && (str[i] == 'x' || str[i] == 'y' || str[i] == 'z' || str[i] == 'X' || str[i] == 'Y' || str[i] == 'Z')) { size_t i2 = str.find_last_of(NOT_IN_NAMES NUMBERS, i); size_t i3 = str.find_first_of(NOT_IN_NAMES NUMBERS, i); if(i2 == std::string::npos) i2 = 0; else i2++; if(i3 == std::string::npos) i3 = str.length(); size_t i4 = i2; if(i4 > 0) { i4 = str.find_last_of(NOT_IN_NAMES, i4); if(i4 == std::string::npos) i4 = 0; else i4++; } size_t i5 = i3; if(i5 < str.length()) { i5 = str.find_first_of(NOT_IN_NAMES, i5 - 1); if(i5 == std::string::npos) i5 = str.length(); } if((i2 == i3 - 1 || !CALCULATOR->getActiveExpressionItem(str.substr(i2, i3 - i2))) && ((i4 == i2 && i5 == i3) || !CALCULATOR->getActiveExpressionItem(str.substr(i4, i5 - i4)))) { str.insert(i, 1, '\\'); i++; } else { i = i5 - 1; } } } } } SmallTextEdit::SmallTextEdit(int r, QWidget *parent) : QPlainTextEdit(parent), i_rows(r) {} SmallTextEdit::~SmallTextEdit() {} QSize SmallTextEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * i_rows + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * i_rows + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } MathTextEdit::MathTextEdit(QWidget *parent) : QPlainTextEdit(parent) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathTextEdit::~MathTextEdit() {} QSize MathTextEdit::sizeHint() const { QSize size = QPlainTextEdit::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 3 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif return size; } void MathTextEdit::insertText(const QString &s) { if(overwriteMode() && !textCursor().atEnd()) { QTextCursor cur = textCursor(); cur.beginEditBlock(); cur.deleteChar(); insertPlainText(s); cur.endEditBlock(); } else { insertPlainText(s); } } void MathTextEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Insert: { if(event->modifiers() != Qt::ShiftModifier) setOverwriteMode(!overwriteMode()); break; } case Qt::Key_Asterisk: { insertText(settings->multiplicationSign()); return; } case Qt::Key_Slash: { insertText(settings->divisionSign(false)); return; } case Qt::Key_Minus: { insertText(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insertText(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insertText("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insertText(" xor "); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insertText("^"); return; } QPlainTextEdit::keyPressEvent(event); } ExpandingMathLineEdit::ExpandingMathLineEdit(QWidget *parent) : QLineEdit(parent), originalWidth(-1), widgetOwnsGeometry(false) { connect(this, SIGNAL(textChanged(QString)), this, SLOT(resizeToContents())); updateMinimumWidth(); } void ExpandingMathLineEdit::setWidgetOwnsGeometry(bool value) { widgetOwnsGeometry = value; } void ExpandingMathLineEdit::changeEvent(QEvent *e) { switch(e->type()) { case QEvent::FontChange: case QEvent::StyleChange: case QEvent::ContentsRectChange: updateMinimumWidth(); break; default: break; } QLineEdit::changeEvent(e); } void ExpandingMathLineEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Asterisk: { insert(settings->multiplicationSign(false)); return; } case Qt::Key_Minus: { insert(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insert(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insert("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insert(" xor "); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insert("^"); return; } QLineEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } void ExpandingMathLineEdit::updateMinimumWidth() { const QMargins tm = textMargins(); const QMargins cm = contentsMargins(); const int width = tm.left() + tm.right() + cm.left() + cm.right() + 4; QStyleOptionFrame opt; initStyleOption(&opt); int minWidth = style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(width, 0), this).width(); setMinimumWidth(minWidth); } void ExpandingMathLineEdit::resizeToContents() { int oldWidth = width(); if(originalWidth == -1) originalWidth = oldWidth; if(QWidget *parent = parentWidget()) { QPoint position = pos(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) int hintWidth = minimumWidth() + fontMetrics().horizontalAdvance(displayText()); #else int hintWidth = minimumWidth() + fontMetrics().boundingRect(displayText()).width(); #endif int parentWidth = parent->width(); int maxWidth = isRightToLeft() ? position.x() + oldWidth : parentWidth - position.x(); int newWidth = qBound(originalWidth, hintWidth, maxWidth); if(widgetOwnsGeometry) setMaximumWidth(newWidth); if(isRightToLeft()) move(position.x() - newWidth + oldWidth, position.y()); resize(newWidth, height()); } } class SubfunctionDelegate : public QStyledItemDelegate { public: SubfunctionDelegate(QWidget *parent) : QStyledItemDelegate(parent) {} QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex&) const override { return new ExpandingMathLineEdit(parent); } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override { if(!editor) return; Q_ASSERT(index.isValid()); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.showDecorationSelected = editor->style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, nullptr, editor); QStyle *style = QApplication::style(); QRect geom = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, (QWidget*) parent()); editor->setGeometry(geom); } }; #include #include class CenteredBoxProxy : public QProxyStyle { public: QRect subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const override { const QRect baseRes = QProxyStyle::subElementRect(element, option, widget); const QRect itemRect = option->rect; QRect retval = baseRes; QSize sz = baseRes.size(); if(element == SE_ItemViewItemCheckIndicator) { int x = itemRect.x() + (itemRect.width()/2) - (baseRes.width()/2); retval = QRect( QPoint(x, baseRes.y()), sz); } else if(element == SE_ItemViewItemFocusRect) { sz.setWidth(baseRes.width()+baseRes.x()); retval = QRect( QPoint(0, baseRes.y()), sz); } return retval; } }; class SmallTreeView : public QTreeView { public: SmallTreeView(QWidget *parent) : QTreeView(parent) {} QSize sizeHint() const override { QSize size = QTreeView::sizeHint(); QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) size.setHeight(fm.lineSpacing() * 4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + viewportMargins().bottom() + viewportMargins().top()); #else size.setHeight(fm.lineSpacing() * 4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom()); #endif return size; } }; NamesEditDialog::NamesEditDialog(int type, QWidget *parent, bool read_only) : QDialog(parent), i_type(type) { o_item = NULL; QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); namesView = new QTreeView(this); namesModel = new QStandardItemModel(this); namesView->setSelectionMode(QAbstractItemView::SingleSelection); namesView->setRootIsDecorated(false); namesView->setStyle(new CenteredBoxProxy()); if(i_type < 0) { namesModel->setColumnCount(2); namesModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); namesModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Reference"))); } else { namesModel->setColumnCount(8); namesModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); namesModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Abbreviation"))); namesModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Plural"))); namesModel->setHorizontalHeaderItem(3, new QStandardItem(tr("Reference"))); namesModel->setHorizontalHeaderItem(4, new QStandardItem(tr("Avoid input"))); namesModel->setHorizontalHeaderItem(5, new QStandardItem(tr("Suffix"))); namesModel->setHorizontalHeaderItem(6, new QStandardItem(tr("Case sensitive"))); namesModel->setHorizontalHeaderItem(7, new QStandardItem(tr("Completion only"))); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *scr = screen(); # else QScreen *scr = QGuiApplication::screenAt(pos); # endif if(!scr) scr = QGuiApplication::primaryScreen(); QRect screen = scr->geometry(); #else QRect screen = QApplication::desktop()->screenGeometry(this); #endif if(screen.width() > 800) namesView->setMinimumWidth(800); } namesView->setModel(namesModel); namesView->header()->setStretchLastSection(false); namesView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); namesView->header()->setSectionResizeMode(0, QHeaderView::Stretch); if(i_type >= 0 && i_type != TYPE_UNIT) namesView->header()->hideSection(2); grid->addWidget(namesView, 0, 0); QHBoxLayout *box = new QHBoxLayout(); addButton = new QPushButton(tr("Add"), this); box->addWidget(addButton); connect(addButton, SIGNAL(clicked()), this, SLOT(addClicked())); addButton->setEnabled(!read_only); editButton = new QPushButton(tr("Edit"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); editButton->setEnabled(false); delButton = new QPushButton(tr("Remove"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); delButton->setEnabled(false); grid->addLayout(box, 1, 0, Qt::AlignRight); topbox->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Close)->setDefault(true); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(namesView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedNameChanged(const QModelIndex&, const QModelIndex&))); box_clicked = false; connect(namesModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(nameChanged(QStandardItem*))); connect(namesView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(nameClicked(const QModelIndex&))); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } NamesEditDialog::~NamesEditDialog() {} void NamesEditDialog::setNames(ExpressionItem *o, const QString &str) { o_item = o; bool read_only = !addButton->isEnabled(); ExpressionName estr(str.trimmed().toStdString()); estr.reference = true; for(size_t i = 1; i == 1 || (o && i <= o->countNames()); i++) { const ExpressionName *ename; if(o) ename = &o->getName(i); else ename = &estr; QList items; QStandardItem *item = new QStandardItem(i == 1 && !str.trimmed().isEmpty() ? str.trimmed() : QString::fromStdString(ename->name)); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->abbreviation ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->plural ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->reference ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->avoid_input ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->suffix ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->case_sensitive ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(ename->completion_only ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); namesModel->appendRow(items); if(!read_only && i == 1 && !item->text().isEmpty() && (!o || QString::fromStdString(ename->name) != item->text())) nameChanged(item); } } void NamesEditDialog::setName(const QString &str) { if(str.trimmed().isEmpty()) return; QStandardItem *item = namesModel->item(0, 0); if(!item) { item = new QStandardItem(); QList items; items.append(item); for(int i = 1; i < namesModel->columnCount(); i++) { QStandardItem *item2 = new QStandardItem(); item2->setEditable(false); item2->setCheckable(true); item2->setCheckState(Qt::Unchecked); item2->setTextAlignment(Qt::AlignCenter); items.append(item2); } namesModel->appendRow(items); } if(str.trimmed() != item->text()) item->setText(str.trimmed()); } QString NamesEditDialog::firstName() { QStandardItem *item = namesModel->item(0, 0); if(!item) return QString(); return item->text(); } void NamesEditDialog::modifyNames(ExpressionItem *o, const QString &str) { o->clearNames(); for(int i = 0; i < namesModel->rowCount(); i++) { ExpressionName ename; if(i == 0) ename.name = str.trimmed().toStdString(); else ename.name = namesModel->item(i, 0)->text().trimmed().toStdString(); if(!ename.name.empty()) { ename.abbreviation = (namesModel->item(i, 1)->checkState() == Qt::Checked); ename.plural = (namesModel->item(i, 2)->checkState() == Qt::Checked); ename.reference = (namesModel->item(i, 3)->checkState() == Qt::Checked); ename.avoid_input = (namesModel->item(i, 4)->checkState() == Qt::Checked); ename.unicode = false; for(size_t i2 = 0; i2 < ename.name.length(); i2++) { if((unsigned char) ename.name[i] >= 0xC0) { ename.unicode = true; } } ename.suffix = (namesModel->item(i, 5)->checkState() == Qt::Checked); ename.case_sensitive = (namesModel->item(i, 6)->checkState() == Qt::Checked); ename.completion_only = (namesModel->item(i, 7)->checkState() == Qt::Checked); o->addName(ename); } } if(o->countNames() == 0) { ExpressionName ename(str.trimmed().toStdString()); ename.reference = true; o->addName(ename); } } void NamesEditDialog::modifyName(ExpressionItem *o, const QString &str) { if(o->countNames() == 0) { ExpressionName ename(str.trimmed().toStdString()); ename.reference = true; o->addName(ename); } else { o->setName(str.trimmed().toStdString()); } } void NamesEditDialog::setNames(DataProperty *o, const QString &str) { bool read_only = !addButton->isEnabled(); for(size_t i = 1; i == 1 || (o && i <= o->countNames()); i++) { QList items; QStandardItem *item = new QStandardItem(i == 1 && (!o || !str.trimmed().isEmpty()) ? str.trimmed() : QString::fromStdString(o->getName(i))); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState((!o || o->nameIsReference(i)) ? Qt::Checked : Qt::Unchecked); if(read_only) {item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);} item->setTextAlignment(Qt::AlignCenter); items.append(item); namesModel->appendRow(items); } } void NamesEditDialog::modifyNames(DataProperty *o, const QString &str) { o->clearNames(); for(int i = 0; i < namesModel->rowCount(); i++) { if(i == 0) o->addName(str.trimmed().toStdString(), namesModel->item(i, 1)->checkState() == Qt::Checked); else o->addName(namesModel->item(i, 0)->text().trimmed().toStdString(), namesModel->item(i, 1)->checkState() == Qt::Checked); } if(o->countNames() == 0) { o->addName(str.trimmed().toStdString(), true); } } void NamesEditDialog::modifyName(DataProperty *o, const QString &str) { if(o->countNames() == 0) { o->addName(str.trimmed().toStdString(), true); } else { std::vector names; std::vector name_refs; for(size_t i = 1; i <= o->countNames(); i++) { if(i == 1) names.push_back(str.trimmed().toStdString()); else names.push_back(o->getName(i)); name_refs.push_back(o->nameIsReference(i)); } o->clearNames(); for(size_t i = 0; i < names.size(); i++) { o->addName(names[i], name_refs[i]); } } } void NamesEditDialog::addClicked() { QList items; QStandardItem *item = new QStandardItem(); QStandardItem *edit_item = item; items.append(item); for(int i = 1; i < namesModel->columnCount(); i++) { item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(Qt::Unchecked); item->setTextAlignment(Qt::AlignCenter); items.append(item); } namesModel->appendRow(items); namesView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); namesView->scrollTo(edit_item->index()); namesView->edit(edit_item->index()); } void NamesEditDialog::editClicked() { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) namesView->edit(namesView->selectionModel()->currentIndex().siblingAtColumn(0)); #else namesView->edit(namesView->selectionModel()->currentIndex().sibling(namesView->selectionModel()->currentIndex().row(), 0)); #endif } void NamesEditDialog::delClicked() { namesModel->removeRow(namesView->selectionModel()->currentIndex().row()); } void NamesEditDialog::selectedNameChanged(const QModelIndex &index, const QModelIndex&) { if(addButton->isEnabled()) { delButton->setEnabled(index.isValid()); editButton->setEnabled(index.isValid()); } } void NamesEditDialog::nameClicked(const QModelIndex &index) { if(box_clicked) { box_clicked = false; return; } QStandardItem *item = namesModel->itemFromIndex(index); if(item && addButton->isEnabled() && item->isCheckable()) { item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked); box_clicked = false; } } void NamesEditDialog::nameChanged(QStandardItem *item) { if(item->column() > 0) box_clicked = true; if(i_type < 0 || item->column() != 0 || item->text().trimmed().isEmpty()) return; if((i_type == TYPE_FUNCTION && !CALCULATOR->functionNameIsValid(item->text().trimmed().toStdString())) || (i_type == TYPE_VARIABLE && !CALCULATOR->variableNameIsValid(item->text().trimmed().toStdString())) || (i_type == TYPE_UNIT && !CALCULATOR->unitNameIsValid(item->text().trimmed().toStdString()))) { namesModel->blockSignals(true); if(i_type == TYPE_FUNCTION) item->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(item->text().trimmed().toStdString()))); else if(i_type == TYPE_VARIABLE) item->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(item->text().trimmed().toStdString()))); else if(i_type == TYPE_UNIT) item->setText(QString::fromStdString(CALCULATOR->convertToValidUnitName(item->text().trimmed().toStdString()))); namesModel->blockSignals(false); QMessageBox::warning(this, tr("Warning"), tr("Illegal name")); } else if(i_type == TYPE_FUNCTION && CALCULATOR->functionNameTaken(item->text().trimmed().toStdString(), (MathFunction*) o_item)) { MathFunction *f = CALCULATOR->getActiveFunction(item->text().trimmed().toStdString(), true); if(!f || f->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A function with the same name already exists.")); } else if(i_type == TYPE_VARIABLE && CALCULATOR->variableNameTaken(item->text().trimmed().toStdString(), (Variable*) o_item)) { Variable *var = CALCULATOR->getActiveVariable(item->text().trimmed().toStdString(), true); if(!var || var->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A unit or variable with the same name already exists.")); } else if(i_type == TYPE_UNIT && CALCULATOR->unitNameTaken(item->text().trimmed().toStdString(), (Unit*) o_item)) { Unit *u = CALCULATOR->getActiveUnit(item->text().trimmed().toStdString(), true); if(!u || u->category() != CALCULATOR->temporaryCategory()) QMessageBox::warning(this, tr("Warning"), tr("A unit or variable with the same name already exists.")); } } ArgumentEditDialog::ArgumentEditDialog(QWidget *parent, bool read_only) : QDialog(parent) { QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); nameEdit->setReadOnly(read_only); grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Type:"), this), 1, 0); typeCombo = new QComboBox(this); typeCombo->setEditable(false); typeCombo->addItem(tr("Free"), ARGUMENT_TYPE_FREE); typeCombo->addItem(tr("Number"), ARGUMENT_TYPE_NUMBER); typeCombo->addItem(tr("Integer"), ARGUMENT_TYPE_INTEGER); typeCombo->addItem(tr("Symbol"), ARGUMENT_TYPE_SYMBOLIC); typeCombo->addItem(tr("Text"), ARGUMENT_TYPE_TEXT); typeCombo->addItem(tr("Date"), ARGUMENT_TYPE_DATE); typeCombo->addItem(tr("Vector"), ARGUMENT_TYPE_VECTOR); typeCombo->addItem(tr("Matrix"), ARGUMENT_TYPE_MATRIX); typeCombo->addItem(tr("Boolean"), ARGUMENT_TYPE_BOOLEAN); typeCombo->addItem(tr("Angle"), ARGUMENT_TYPE_ANGLE); typeCombo->addItem(tr("Object"), ARGUMENT_TYPE_EXPRESSION_ITEM); typeCombo->addItem(tr("Function"), ARGUMENT_TYPE_FUNCTION); typeCombo->addItem(tr("Unit"), ARGUMENT_TYPE_UNIT); typeCombo->addItem(tr("Variable"), ARGUMENT_TYPE_VARIABLE); typeCombo->addItem(tr("File"), ARGUMENT_TYPE_FILE); grid->addWidget(typeCombo, 1, 1); testBox = new QCheckBox(tr("Enable rules and type test"), this); grid->addWidget(testBox, 2, 0, 1, 2); grid->addWidget(new QLabel(tr("Custom condition:"), this), 3, 0); conditionEdit = new MathLineEdit(this); conditionEdit->setToolTip("
" + tr("For example if argument is a matrix that must have equal number of rows and columns: rows(\\x) = columns(\\x)") + "
"); grid->addWidget(conditionEdit, 3, 1); matrixBox = new QCheckBox(tr("Allow matrix"), this); grid->addWidget(matrixBox, 4, 0, 1, 2); zeroBox = new QCheckBox(tr("Forbid zero"), this); grid->addWidget(zeroBox, 5, 0, 1, 2); vectorBox = new QCheckBox(tr("Handle vector"), this); vectorBox->setToolTip("
" + tr("Calculate function for each separate element in vector.") + "
"); grid->addWidget(vectorBox, 6, 0, 1, 2); minBox = new QCheckBox(tr("Min"), this); grid->addWidget(minBox, 7, 0); minEdit = new QDoubleSpinBox(this); grid->addWidget(minEdit, 7, 1); includeMinBox = new QCheckBox(tr("Include equals"), this); grid->addWidget(includeMinBox, 8, 1, Qt::AlignRight); maxBox = new QCheckBox(tr("Max"), this); grid->addWidget(maxBox, 9, 0); maxEdit = new QDoubleSpinBox(this); minEdit->setDecimals(8); minEdit->setRange(INT_MIN, INT_MAX); maxEdit->setDecimals(8); maxEdit->setRange(INT_MIN, INT_MAX); grid->addWidget(maxEdit, 9, 1); includeMaxBox = new QCheckBox(tr("Include equals"), this); grid->addWidget(includeMaxBox, 10, 1, Qt::AlignRight); topbox->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Close)->setDefault(true); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(typeChanged(int))); connect(minBox, SIGNAL(toggled(bool)), this, SLOT(minToggled(bool))); connect(maxBox, SIGNAL(toggled(bool)), this, SLOT(maxToggled(bool))); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } ArgumentEditDialog::~ArgumentEditDialog() {} void ArgumentEditDialog::setArgument(Argument *arg) { testBox->setChecked(!arg || arg->tests()); matrixBox->setChecked(!arg || arg->matrixAllowed() || arg->type() == ARGUMENT_TYPE_FREE || arg->type() == ARGUMENT_TYPE_MATRIX); matrixBox->setEnabled(arg && arg->type() != ARGUMENT_TYPE_FREE && arg->type() != ARGUMENT_TYPE_MATRIX); if(arg) { std::string str = settings->localizeExpression(arg->getCustomCondition()); conditionEdit->setText(QString::fromStdString(str)); } else { conditionEdit->clear(); } nameEdit->setText(arg ? QString::fromStdString(arg->name()) : QString()); zeroBox->setChecked(arg && arg->zeroForbidden()); vectorBox->setChecked(arg && arg->handlesVector()); switch(arg ? arg->type() : ARGUMENT_TYPE_FREE) { case ARGUMENT_TYPE_NUMBER: { NumberArgument *farg = (NumberArgument*) arg; minBox->setEnabled(true); minBox->setChecked(farg->min() != NULL); includeMinBox->setChecked(farg->includeEqualsMin()); includeMinBox->setEnabled(true); minEdit->setEnabled(farg->min() != NULL); minEdit->setDecimals(8); if(farg->min()) { minEdit->setValue(farg->min()->floatValue()); } else { minEdit->setValue(0.0); } maxBox->setEnabled(true); maxBox->setChecked(farg->max() != NULL); includeMaxBox->setChecked(farg->includeEqualsMax()); includeMaxBox->setEnabled(true); maxEdit->setEnabled(farg->max() != NULL); maxEdit->setDecimals(8); if(farg->max()) { maxEdit->setValue(farg->max()->floatValue()); } else { maxEdit->setValue(0.0); } break; } case ARGUMENT_TYPE_INTEGER: { NumberArgument *farg = (NumberArgument*) arg; minBox->setEnabled(true); minBox->setChecked(farg->min() != NULL); includeMinBox->setChecked(true); includeMinBox->setEnabled(false); minEdit->setEnabled(farg->min() != NULL); minEdit->setDecimals(0); if(farg->min()) { minEdit->setValue(farg->min()->intValue()); } else { minEdit->setValue(0.0); } maxBox->setEnabled(true); maxBox->setChecked(farg->max() != NULL); includeMaxBox->setChecked(true); includeMaxBox->setEnabled(false); maxEdit->setEnabled(farg->max() != NULL); maxEdit->setDecimals(0); if(farg->max()) { maxEdit->setValue(farg->max()->intValue()); } else { maxEdit->setValue(0.0); } break; } default: { minBox->setChecked(false); minEdit->setValue(0.0); minEdit->setEnabled(false); includeMinBox->setEnabled(false); includeMinBox->setChecked(true); minBox->setEnabled(false); maxBox->setChecked(false); maxEdit->setValue(0.0); maxEdit->setEnabled(false); includeMaxBox->setEnabled(false); includeMaxBox->setChecked(true); maxBox->setEnabled(false); } } typeCombo->setCurrentIndex(typeCombo->findData(arg ? arg->type() : 0)); } Argument *ArgumentEditDialog::createArgument() { Argument *arg = NULL; switch(typeCombo->currentData().toInt()) { case ARGUMENT_TYPE_NUMBER: { arg = new NumberArgument(); if(minBox->isChecked()) { QString str = minEdit->cleanText(); int i = str.indexOf(","); if(i > 0) { if(str.indexOf(".", i) > 0) { str.remove(","); } else { str.remove("."); str.replace(",", "."); } } Number nr(str.toStdString()); ((NumberArgument*) arg)->setMin(&nr); ((NumberArgument*) arg)->setIncludeEqualsMin(includeMinBox->isChecked()); } if(maxBox->isChecked()) { QString str = maxEdit->cleanText(); int i = str.indexOf(","); if(i > 0) { if(str.indexOf(".", i) > 0) { str.remove(","); } else { str.remove("."); str.replace(",", "."); } } Number nr(str.toStdString()); ((NumberArgument*) arg)->setMax(&nr); ((NumberArgument*) arg)->setIncludeEqualsMax(includeMaxBox->isChecked()); } break; } case ARGUMENT_TYPE_INTEGER: { arg = new IntegerArgument(); if(minBox->isChecked()) { QString str = minEdit->cleanText(); str.remove(","); str.remove("."); Number nr(str.toStdString()); ((IntegerArgument*) arg)->setMin(&nr); } if(maxBox->isChecked()) { QString str = maxEdit->cleanText(); str.remove(","); str.remove("."); Number nr(str.toStdString()); ((IntegerArgument*) arg)->setMax(&nr); } break; } case ARGUMENT_TYPE_SYMBOLIC: {arg = new SymbolicArgument(); break;} case ARGUMENT_TYPE_TEXT: {arg = new TextArgument(); break;} case ARGUMENT_TYPE_DATE: {arg = new DateArgument(); break;} case ARGUMENT_TYPE_FILE: {arg = new FileArgument(); break;} case ARGUMENT_TYPE_VECTOR: {arg = new VectorArgument(); break;} case ARGUMENT_TYPE_MATRIX: {arg = new MatrixArgument(); break;} case ARGUMENT_TYPE_EXPRESSION_ITEM: {arg = new ExpressionItemArgument(); break;} case ARGUMENT_TYPE_FUNCTION: {arg = new FunctionArgument(); break;} case ARGUMENT_TYPE_UNIT: {arg = new UnitArgument(); break;} case ARGUMENT_TYPE_VARIABLE: {arg = new VariableArgument(); break;} case ARGUMENT_TYPE_BOOLEAN: {arg = new BooleanArgument(); break;} case ARGUMENT_TYPE_ANGLE: {arg = new AngleArgument(); break;} default: { arg = new Argument(); } } arg->setName(nameEdit->text().trimmed().toStdString()); std::string str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); arg->setCustomCondition(str); arg->setTests(testBox->isChecked()); arg->setAlerts(testBox->isChecked()); arg->setZeroForbidden(zeroBox->isChecked()); arg->setMatrixAllowed(matrixBox->isChecked()); arg->setHandleVector(vectorBox->isChecked()); return arg; } void ArgumentEditDialog::typeChanged(int index) { int i = typeCombo->itemData(index).toInt(); minEdit->setValue(0.0); maxEdit->setValue(0.0); minEdit->setEnabled(false); maxEdit->setEnabled(false); minBox->setChecked(false); maxBox->setChecked(false); if(i == ARGUMENT_TYPE_INTEGER) minEdit->setDecimals(0); else if(i == ARGUMENT_TYPE_NUMBER) minEdit->setDecimals(8); if(i == ARGUMENT_TYPE_INTEGER) maxEdit->setDecimals(0); else if(i == ARGUMENT_TYPE_NUMBER) maxEdit->setDecimals(8); includeMaxBox->setChecked(true); includeMinBox->setChecked(true); includeMaxBox->setEnabled(i == ARGUMENT_TYPE_NUMBER); includeMinBox->setEnabled(i == ARGUMENT_TYPE_NUMBER); minBox->setEnabled(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER); maxBox->setEnabled(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER); vectorBox->setChecked(i == ARGUMENT_TYPE_NUMBER || i == ARGUMENT_TYPE_INTEGER || i == ARGUMENT_TYPE_TEXT || i == ARGUMENT_TYPE_DATE || i == ARGUMENT_TYPE_BOOLEAN); matrixBox->setEnabled(i != ARGUMENT_TYPE_FREE && i != ARGUMENT_TYPE_MATRIX); matrixBox->setChecked(i == ARGUMENT_TYPE_FREE || i == ARGUMENT_TYPE_MATRIX); } void ArgumentEditDialog::minToggled(bool b) { minEdit->setEnabled(b); includeMinBox->setEnabled(typeCombo->currentData().toInt() == ARGUMENT_TYPE_NUMBER); } void ArgumentEditDialog::maxToggled(bool b) { maxEdit->setEnabled(b); includeMaxBox->setEnabled(typeCombo->currentData().toInt() == ARGUMENT_TYPE_NUMBER); } FunctionEditDialog::FunctionEditDialog(QWidget *parent) : QDialog(parent) { namesEditDialog = NULL; o_function = NULL; name_edited = false; QVBoxLayout *topbox = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); topbox->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); tabs->addTab(w1, tr("Required")); tabs->addTab(w3, tr("Details")); tabs->addTab(w2, tr("Description")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Expression:"), this), 1, 0, 1, 2); expressionEdit = new MathTextEdit(this); expressionEdit->setToolTip(tr("Use x, y, and z (e.g. \"(x+y)/2\"), or\n\\x, \\y, \\z, \\a, \\b, … (e.g. \"(\\x+\\y)/2\")")); grid->addWidget(expressionEdit, 2, 0, 1, 2); QHBoxLayout *box = new QHBoxLayout(); QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Category:"), this), 0, 0); categoryEdit = new QComboBox(this); QMap hash; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(!CALCULATOR->functions[i]->category().empty()) { if(hash.find(CALCULATOR->functions[i]->category()) == hash.end()) { hash[CALCULATOR->functions[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString()); grid->addWidget(categoryEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); hideBox = new QCheckBox(tr("Hide function"), this); grid->addWidget(hideBox, 2, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Example:"), this), 3, 0); exampleEdit = new MathLineEdit(this); grid->addWidget(exampleEdit, 3, 1); grid->addWidget(new QLabel(tr("Description:"), this), 4, 0, 1, 2); descriptionEdit = new QPlainTextEdit(this); grid->addWidget(descriptionEdit, 5, 0, 1, 2); grid = new QGridLayout(w3); grid->addWidget(new QLabel(tr("Condition:"), this), 0, 0); conditionEdit = new MathLineEdit(this); conditionEdit->setToolTip(tr("Condition that must be true for the function (e.g. if the second argument must be greater than the first: \"\\y > \\x\")")); grid->addWidget(conditionEdit, 0, 1); grid->addWidget(new QLabel(tr("Sub-functions:"), this), 1, 0); subfunctionsView = new SmallTreeView(this); subfunctionsModel = new QStandardItemModel(this); subfunctionsView->setSelectionMode(QAbstractItemView::SingleSelection); subfunctionsView->setRootIsDecorated(false); subfunctionsView->setStyle(new CenteredBoxProxy()); subfunctionsModel->setColumnCount(3); subfunctionsModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Expression"))); subfunctionsModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Precalculate"))); subfunctionsModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Reference"))); subfunctionsView->setModel(subfunctionsModel); subfunctionsView->header()->setStretchLastSection(false); subfunctionsView->header()->setSectionResizeMode(0, QHeaderView::Stretch); subfunctionsView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); SubfunctionDelegate* delegate = new SubfunctionDelegate(subfunctionsView); subfunctionsView->setItemDelegateForColumn(0, delegate); grid->addWidget(subfunctionsView, 2, 0, 1, 2); box = new QHBoxLayout(); subAddButton = new QPushButton(tr("Add"), this); box->addWidget(subAddButton); connect(subAddButton, SIGNAL(clicked()), this, SLOT(subAddClicked())); subEditButton = new QPushButton(tr("Edit"), this); box->addWidget(subEditButton); connect(subEditButton, SIGNAL(clicked()), this, SLOT(subEditClicked())); subEditButton->setEnabled(false); subDelButton = new QPushButton(tr("Remove"), this); box->addWidget(subDelButton); connect(subDelButton, SIGNAL(clicked()), this, SLOT(subDelClicked())); subDelButton->setEnabled(false); grid->addLayout(box, 3, 0, 1, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("Arguments:"), this), 4, 0); argumentsView = new SmallTreeView(this); argumentsModel = new QStandardItemModel(this); argumentsView->setSelectionMode(QAbstractItemView::SingleSelection); argumentsView->setRootIsDecorated(false); argumentsModel->setColumnCount(3); argumentsModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name"))); argumentsModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Type"))); argumentsModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Reference"))); argumentsView->setModel(argumentsModel); argumentsView->header()->setStretchLastSection(false); argumentsView->header()->setSectionResizeMode(0, QHeaderView::Stretch); argumentsView->header()->setSectionResizeMode(1, QHeaderView::Stretch); argumentsView->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); grid->addWidget(argumentsView, 5, 0, 1, 2); box = new QHBoxLayout(); argAddButton = new QPushButton(tr("Add"), this); box->addWidget(argAddButton); connect(argAddButton, SIGNAL(clicked()), this, SLOT(argAddClicked())); argEditButton = new QPushButton(tr("Edit"), this); box->addWidget(argEditButton); connect(argEditButton, SIGNAL(clicked()), this, SLOT(argEditClicked())); argEditButton->setEnabled(false); argDelButton = new QPushButton(tr("Remove"), this); box->addWidget(argDelButton); connect(argDelButton, SIGNAL(clicked()), this, SLOT(argDelClicked())); argDelButton->setEnabled(false); grid->addLayout(box, 6, 0, 1, 2, Qt::AlignRight); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); topbox->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(expressionEdit, SIGNAL(textChanged()), this, SLOT(onFunctionChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onFunctionChanged())); connect(conditionEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onFunctionChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(exampleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onFunctionChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onFunctionChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(subfunctionsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedSubfunctionChanged(const QModelIndex&, const QModelIndex&))); connect(argumentsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedArgumentChanged(const QModelIndex&, const QModelIndex&))); connect(argumentsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(argumentActivated(const QModelIndex&))); connect(argumentsModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(argumentChanged(QStandardItem*))); precalculate_box_clicked = false; connect(subfunctionsModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onSubfunctionChanged(QStandardItem*))); connect(subfunctionsView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(subfunctionClicked(const QModelIndex&))); connect(this, SIGNAL(rejected()), this, SLOT(onRejected())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } FunctionEditDialog::~FunctionEditDialog() {} void FunctionEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_FUNCTION, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_function, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onFunctionChanged(); } UserFunction *FunctionEditDialog::createFunction(MathFunction **replaced_item) { if(CALCULATOR->hasToExpression(expressionEdit->toPlainText().trimmed().toStdString())) { QMessageBox::warning(this, tr("Warning"), tr("Conversion (using \"to\") is not supported in functions."), QMessageBox::Ok); return NULL; } if(replaced_item) *replaced_item = NULL; MathFunction *func = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString())) { func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { *replaced_item = func; } } UserFunction *f; if(func && func->isLocal() && func->subtype() == SUBTYPE_USER_FUNCTION) { f = (UserFunction*) func; f->clearNames(); f->setApproximate(false); if(!modifyFunction(f)) return NULL; return f; } f = new UserFunction("", "", ""); std::string str; f->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); f->setTitle(titleEdit->text().trimmed().toStdString()); f->setCategory(categoryEdit->currentText().trimmed().toStdString()); f->setHidden(hideBox->isChecked()); str = settings->unlocalizeExpression(exampleEdit->text().trimmed().toStdString()); f->setExample(str); str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); f->setCondition(str); for(int i = 0; i < argumentsModel->rowCount(); i++) { Argument *arg = (Argument*) argumentsModel->item(i, 0)->data().value(); if(arg) f->setArgumentDefinition(i + 1, arg); } for(int i = 0; i < subfunctionsModel->rowCount(); i++) { str = subfunctionsModel->item(i, 0)->text().trimmed().toStdString(); gsub("{", "\a", str); gsub("}", "\b", str); fix_expression(str); gsub("\a", "{", str); gsub("\b", "}", str); f->addSubfunction(str, subfunctionsModel->item(i, 1)->checkState() == Qt::Checked); } if(namesEditDialog) namesEditDialog->modifyNames(f, nameEdit->text()); else NamesEditDialog::modifyName(f, nameEdit->text()); str = expressionEdit->toPlainText().trimmed().toStdString(); gsub("{", "\a", str); gsub("}", "\b", str); fix_expression(str); gsub("\a", "{", str); gsub("\b", "}", str); ((UserFunction*) f)->setFormula(str); CALCULATOR->addFunction(f); return f; } bool FunctionEditDialog::modifyFunction(MathFunction *f, MathFunction **replaced_item) { if(CALCULATOR->hasToExpression(expressionEdit->toPlainText().trimmed().toStdString())) { QMessageBox::warning(this, tr("Warning"), tr("Conversion (using \"to\") is not supported in functions."), QMessageBox::Ok); return false; } if(replaced_item) *replaced_item = NULL; if(CALCULATOR->functionNameTaken(nameEdit->text().trimmed().toStdString(), f)) { MathFunction *func = CALCULATOR->getActiveFunction(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!func || func->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A function with the same name already exists.\nDo you want to overwrite the function?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { *replaced_item = func; } } f->setLocal(true); if(namesEditDialog) namesEditDialog->modifyNames(f, nameEdit->text()); else NamesEditDialog::modifyName(f, nameEdit->text()); std::string str; f->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); f->setTitle(titleEdit->text().trimmed().toStdString()); f->setCategory(categoryEdit->currentText().trimmed().toStdString()); f->setHidden(hideBox->isChecked()); str = settings->unlocalizeExpression(exampleEdit->text().trimmed().toStdString()); f->setExample(str); str = conditionEdit->text().trimmed().toStdString(); fix_expression(str); f->setCondition(str); f->clearArgumentDefinitions(); for(int i = 0; i < argumentsModel->rowCount(); i++) { Argument *arg = (Argument*) argumentsModel->item(i, 0)->data().value(); if(arg) f->setArgumentDefinition(i + 1, arg); } if(f->subtype() == SUBTYPE_USER_FUNCTION) { ((UserFunction*) f)->clearSubfunctions(); for(int i = 0; i < subfunctionsModel->rowCount(); i++) { str = subfunctionsModel->item(i, 0)->text().trimmed().toStdString(); gsub("{", "\a", str); gsub("}", "\b", str); fix_expression(str); gsub("\a", "{", str); gsub("\b", "}", str); ((UserFunction*) f)->addSubfunction(str, subfunctionsModel->item(i, 1)->checkState() == Qt::Checked); } str = expressionEdit->toPlainText().trimmed().toStdString(); gsub("{", "\a", str); gsub("}", "\b", str); fix_expression(str); gsub("\a", "{", str); gsub("\b", "}", str); ((UserFunction*) f)->setFormula(str); } return true; } void FunctionEditDialog::subAddClicked() { QList items; QStandardItem *item = new QStandardItem(); QStandardItem *edit_item = item; item->setEditable(true); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(Qt::Unchecked); item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem("\\" + QString::number(subfunctionsModel->rowCount() + 1)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); subfunctionsModel->appendRow(items); subfunctionsView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); subfunctionsView->scrollTo(edit_item->index()); subfunctionsView->edit(edit_item->index()); onFunctionChanged(); } void FunctionEditDialog::subEditClicked() { #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) subfunctionsView->edit(subfunctionsView->selectionModel()->currentIndex().siblingAtColumn(0)); #else subfunctionsView->edit(subfunctionsView->selectionModel()->currentIndex().sibling(subfunctionsView->selectionModel()->currentIndex().row(), 0)); #endif onFunctionChanged(); } void FunctionEditDialog::subDelClicked() { subfunctionsModel->removeRow(subfunctionsView->selectionModel()->currentIndex().row()); onFunctionChanged(); for(int i = 0; i < subfunctionsModel->rowCount(); i++) { QStandardItem *item = subfunctionsModel->item(i, 2); if(item) { item->setText("\\" + QString::number(i + 1)); } } } void FunctionEditDialog::argAddClicked() { QList items; QStandardItem *item = new QStandardItem(); item->setData(QVariant::fromValue((void*) NULL)); QStandardItem *edit_item = item; item->setEditable(true); items.append(item); Argument defarg; item = new QStandardItem(QString::fromStdString(defarg.printlong())); item->setData(QVariant::fromValue((void*) NULL)); item->setEditable(false); items.append(item); QString refstr = "\\"; int i = argumentsModel->rowCount() + 1; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item = new QStandardItem(refstr); item->setData(QVariant::fromValue((void*) NULL)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); argumentsModel->appendRow(items); argumentsView->selectionModel()->setCurrentIndex(edit_item->index(), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear | QItemSelectionModel::Rows); argumentsView->scrollTo(edit_item->index()); argEditClicked(); } void FunctionEditDialog::argumentActivated(const QModelIndex &index) { if(!nameEdit->isReadOnly() && index.column() != 0) argEditClicked(); } void FunctionEditDialog::argumentChanged(QStandardItem *item) { if(nameEdit->isReadOnly() || item->column() != 0) return; Argument *arg = (Argument*) item->data().value(); if(arg) { arg->setName(item->text().trimmed().toStdString()); } else if(!item->text().trimmed().isEmpty()) { arg = new Argument(item->text().trimmed().toStdString()); item->setData(QVariant::fromValue((void*) arg)); } onFunctionChanged(); } void FunctionEditDialog::argEditClicked() { int r = argumentsView->selectionModel()->currentIndex().row(); QStandardItem *item = argumentsModel->item(r, 0); if(!item) return; Argument *arg = (Argument*) item->data().value(); ArgumentEditDialog *d = new ArgumentEditDialog(this, nameEdit->isReadOnly()); d->setArgument(arg); d->exec(); if(!nameEdit->isReadOnly()) { if(arg) delete arg; arg = d->createArgument(); argumentsModel->blockSignals(true); item->setData(QVariant::fromValue((void*) arg)); item->setText(QString::fromStdString(arg->name())); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item = argumentsModel->item(r, 1); item->setText(QString::fromStdString(arg->printlong())); item->setData("

" + item->text() + "

", Qt::ToolTipRole); argumentsModel->blockSignals(false); onFunctionChanged(); } d->deleteLater(); } void FunctionEditDialog::argDelClicked() { int r = argumentsView->selectionModel()->currentIndex().row(); QStandardItem *item = argumentsModel->item(r, 0); if(!item) return; Argument *arg = (Argument*) item->data().value(); if(arg) delete arg; argumentsModel->removeRow(r); onFunctionChanged(); for(int i = 0; i < argumentsModel->rowCount(); i++) { QStandardItem *item = argumentsModel->item(i, 2); if(item) { QString refstr = "\\"; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item->setText(refstr); } } } void FunctionEditDialog::selectedSubfunctionChanged(const QModelIndex &index, const QModelIndex&) { if(!expressionEdit->isReadOnly()) { subDelButton->setEnabled(index.isValid()); subEditButton->setEnabled(index.isValid()); } } void FunctionEditDialog::selectedArgumentChanged(const QModelIndex &index, const QModelIndex&) { if(!expressionEdit->isReadOnly()) { argDelButton->setEnabled(index.isValid()); argEditButton->setEnabled(index.isValid()); } } void FunctionEditDialog::onRejected() { if(expressionEdit->isReadOnly()) return; for(int i = 0; i < argumentsModel->rowCount(); i++) { QStandardItem *item = argumentsModel->item(i, 0); if(item) { Argument *arg = (Argument*) item->data(Qt::UserRole).value(); if(arg && !nameEdit->isReadOnly()) delete arg; } } } void FunctionEditDialog::setFunction(MathFunction *f) { o_function = f; name_edited = false; bool read_only = !f->isLocal(); nameEdit->setText(QString::fromStdString(f->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(f, nameEdit->text()); if(f->subtype() == SUBTYPE_USER_FUNCTION) { expressionEdit->setEnabled(true); std::string str = settings->localizeExpression(((UserFunction*) f)->formula()); expressionEdit->setPlainText(QString::fromStdString(str)); for(size_t i = 1; i <= ((UserFunction*) f)->countSubfunctions(); i++) { QList items; str = settings->localizeExpression(((UserFunction*) f)->getSubfunction(i)); QStandardItem *item = new QStandardItem(QString::fromStdString(str)); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setEditable(!read_only); items.append(item); item = new QStandardItem(); item->setEditable(false); item->setCheckable(true); item->setCheckState(((UserFunction*) f)->subfunctionPrecalculated(i) ? Qt::Checked : Qt::Unchecked); if(read_only) item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable); item->setTextAlignment(Qt::AlignCenter); items.append(item); item = new QStandardItem("\\" + QString::number(i)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); subfunctionsModel->appendRow(items); } } else { read_only = true; expressionEdit->setEnabled(false); expressionEdit->clear(); subfunctionsView->setEnabled(false); } int args = f->maxargs(); if(args < 0) { args = f->minargs() + 1; } if((int) f->lastArgumentDefinitionIndex() > args) args = (int) f->lastArgumentDefinitionIndex(); for(int i = 1; i <= args; i++) { Argument *arg = f->getArgumentDefinition(i); QString str, str2; if(arg) { if(!read_only) arg = arg->copy(); str = QString::fromStdString(arg->printlong()); str2 = QString::fromStdString(arg->name()); } else { Argument defarg; str = QString::fromStdString(defarg.printlong()); } QList items; QStandardItem *item = new QStandardItem(str2); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(!read_only); items.append(item); item = new QStandardItem(str); item->setData("

" + item->text() + "

", Qt::ToolTipRole); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(false); items.append(item); QString refstr = "\\"; if(i <= 3) refstr += (char) ('x' + (i - 1)); else refstr += (char) ('a' + (i - 4)); item = new QStandardItem(refstr); item->setData(QVariant::fromValue((void*) arg)); item->setEditable(false); item->setTextAlignment(Qt::AlignCenter); items.append(item); argumentsModel->appendRow(items); } descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(f->description())); descriptionEdit->blockSignals(false); std::string str = settings->localizeExpression(f->example(true)); exampleEdit->setText(QString::fromStdString(str)); str = settings->localizeExpression(f->condition()); conditionEdit->setText(QString::fromStdString(str)); titleEdit->setText(QString::fromStdString(f->title(false))); categoryEdit->blockSignals(true); categoryEdit->setCurrentText(QString::fromStdString(f->category())); categoryEdit->blockSignals(false); descriptionEdit->setReadOnly(read_only); exampleEdit->setReadOnly(read_only); titleEdit->setReadOnly(read_only); hideBox->setChecked(f->isHidden()); okButton->setEnabled(false); nameEdit->setReadOnly(read_only); subEditButton->setEnabled(false); subAddButton->setEnabled(!read_only); subDelButton->setEnabled(false); argEditButton->setEnabled(false); argAddButton->setEnabled(!read_only); argDelButton->setEnabled(false); conditionEdit->setReadOnly(read_only); expressionEdit->setReadOnly(read_only); } void FunctionEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->functionNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidFunctionName(str.trimmed().toStdString()))); } name_edited = true; onFunctionChanged(); } void FunctionEditDialog::subfunctionClicked(const QModelIndex &index) { if(precalculate_box_clicked) { precalculate_box_clicked = false; return; } QStandardItem *item = subfunctionsModel->itemFromIndex(index); if(item && !nameEdit->isReadOnly() && item->isCheckable()) { item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked); precalculate_box_clicked = false; } } void FunctionEditDialog::onSubfunctionChanged(QStandardItem *item) { if(item && item->isCheckable()) precalculate_box_clicked = true; onFunctionChanged(); } void FunctionEditDialog::onFunctionChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && (!expressionEdit->document()->isEmpty() || !expressionEdit->isEnabled()) && !nameEdit->text().trimmed().isEmpty()); } void FunctionEditDialog::setExpression(const QString &str) { expressionEdit->setPlainText(str); onFunctionChanged(); } void FunctionEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } QString FunctionEditDialog::expression() const { return expressionEdit->toPlainText(); } bool FunctionEditDialog::editFunction(QWidget *parent, MathFunction *f, MathFunction **replaced_item) { FunctionEditDialog *d = new FunctionEditDialog(parent); d->setWindowTitle(tr("Edit Function")); d->setFunction(f); while(d->exec() == QDialog::Accepted) { if(d->modifyFunction(f, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } UserFunction *FunctionEditDialog::newFunction(QWidget *parent, MathFunction **replaced_item) { FunctionEditDialog *d = new FunctionEditDialog(parent); d->setWindowTitle(tr("New Function")); std::string f_name; int i = 1; do { f_name = "f"; f_name += i2s(i); i++; } while(CALCULATOR->nameTaken(f_name)); d->setName(QString::fromStdString(f_name)); UserFunction *f = NULL; while(d->exec() == QDialog::Accepted) { f = d->createFunction(replaced_item); if(f) break; } d->deleteLater(); return f; } qalculate-qt-5.11.0/src/functioneditdialog.h000066400000000000000000000112711520501070600210040ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef FUNCTION_EDIT_DIALOG_H #define FUNCTION_EDIT_DIALOG_H #include #include #include #include class QPlainTextEdit; class QPushButton; class QRadioButton; class QDoubleSpinBox; class QComboBox; class QCheckBox; class QTreeView; class QStandardItemModel; class QStandardItem; class NamesEditDialog : public QDialog { Q_OBJECT protected: QTreeView *namesView; QStandardItemModel *namesModel; QPushButton *addButton, *editButton, *delButton; ExpressionItem *o_item; bool box_clicked; int i_type; protected slots: void addClicked(); void delClicked(); void editClicked(); void selectedNameChanged(const QModelIndex&, const QModelIndex&); void nameChanged(QStandardItem*); void nameClicked(const QModelIndex&); public: NamesEditDialog(int type, QWidget *parent = NULL, bool = false); virtual ~NamesEditDialog(); void modifyNames(ExpressionItem*, const QString&); static void modifyName(ExpressionItem*, const QString&); void setNames(ExpressionItem*, const QString&); void modifyNames(DataProperty*, const QString&); static void modifyName(DataProperty*, const QString&); void setNames(DataProperty*, const QString&); void setName(const QString&); QString firstName(); }; class MathTextEdit : public QPlainTextEdit { public: MathTextEdit(QWidget *parent); ~MathTextEdit(); QSize sizeHint() const override; void insertText(const QString&); protected: void keyPressEvent(QKeyEvent *event) override; }; class SmallTextEdit : public QPlainTextEdit { public: SmallTextEdit(int r, QWidget *parent); ~SmallTextEdit(); QSize sizeHint() const; protected: int i_rows; }; class ExpandingMathLineEdit : public QLineEdit { Q_OBJECT public: ExpandingMathLineEdit(QWidget *parent); void setWidgetOwnsGeometry(bool value); protected: void changeEvent(QEvent *e) override; void keyPressEvent(QKeyEvent*) override; public slots: void resizeToContents(); private: void updateMinimumWidth(); int originalWidth; bool widgetOwnsGeometry; }; class ArgumentEditDialog : public QDialog { Q_OBJECT protected: QComboBox *typeCombo; QLineEdit *nameEdit, *conditionEdit; QDoubleSpinBox *minEdit, *maxEdit; QCheckBox *maxBox, *minBox, *vectorBox, *matrixBox, *zeroBox, *includeMinBox, *includeMaxBox, *testBox; protected slots: void typeChanged(int); void minToggled(bool); void maxToggled(bool); public: ArgumentEditDialog(QWidget *parent = NULL, bool = false); virtual ~ArgumentEditDialog(); Argument *createArgument(); void setArgument(Argument*); }; class FunctionEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit, *conditionEdit, *exampleEdit; QComboBox *categoryEdit; QCheckBox *hideBox; QPlainTextEdit *expressionEdit, *descriptionEdit; QPushButton *okButton, *argDelButton, *argAddButton, *argEditButton, *subDelButton, *subAddButton, *subEditButton; QTreeView *subfunctionsView, *argumentsView; QStandardItemModel *subfunctionsModel, *argumentsModel; NamesEditDialog *namesEditDialog; MathFunction *o_function; bool name_edited, precalculate_box_clicked; protected slots: void onNameEdited(const QString&); void subfunctionClicked(const QModelIndex &index); void onSubfunctionChanged(QStandardItem *item); void onFunctionChanged(); void subAddClicked(); void subEditClicked(); void subDelClicked(); void argAddClicked(); void argEditClicked(); void argDelClicked(); void argumentChanged(QStandardItem *item); void argumentActivated(const QModelIndex&); void selectedSubfunctionChanged(const QModelIndex&, const QModelIndex&); void selectedArgumentChanged(const QModelIndex&, const QModelIndex&); void onRejected(); void editNames(); public: FunctionEditDialog(QWidget *parent = NULL); virtual ~FunctionEditDialog(); UserFunction *createFunction(MathFunction **replaced_item = NULL); bool modifyFunction(MathFunction *f, MathFunction **replaced_item = NULL); void setFunction(MathFunction *f); void setExpression(const QString&); QString expression() const; void setName(const QString&); static bool editFunction(QWidget *parent, MathFunction *f, MathFunction **replaced_item = NULL); static UserFunction *newFunction(QWidget *parent, MathFunction **replaced_item = NULL); }; #endif //FUNCTION_EDIT_DIALOG_H qalculate-qt-5.11.0/src/functionsdialog.cpp000066400000000000000000000724711520501070600206650ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "functionsdialog.h" #include "itemproxymodel.h" #include "functioneditdialog.h" #include "dataseteditdialog.h" FunctionsDialog::FunctionsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Functions")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); functionsView = new QTreeView(this); functionsView->setSelectionMode(QAbstractItemView::SingleSelection); functionsView->setRootIsDecorated(false); functionsModel = new ItemProxyModel(this); functionsView->installEventFilter(this); sourceModel = new QStandardItemModel(this); functionsModel->setSourceModel(sourceModel); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Function"))); functionsView->setModel(functionsModel); selected_item = NULL; vbox->addWidget(functionsView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 2); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New…"), this); box->addWidget(newButton); connect(newButton, SIGNAL(clicked()), this, SLOT(newClicked())); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); calculateButton = new QPushButton(tr("Calculate…"), this); box->addWidget(calculateButton); connect(calculateButton, SIGNAL(clicked()), this, SLOT(calculateClicked())); calculateButton->setDefault(true); applyButton = new QPushButton(tr("Apply"), this); box->addWidget(applyButton); connect(applyButton, SIGNAL(clicked()), this, SLOT(applyClicked())); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); selected_category = "All"; updateFunctions(); functionsView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(functionsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedFunctionChanged(const QModelIndex&, const QModelIndex&))); connect(functionsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(calculateClicked())); if(!settings->functions_geometry.isEmpty()) restoreGeometry(settings->functions_geometry); else try_resize(this, 900, 800); if(!settings->functions_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->functions_vsplitter_state); if(!settings->functions_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->functions_hsplitter_state); } FunctionsDialog::~FunctionsDialog() {} bool FunctionsDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { functionsView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(functionsView, eventCopy); return true; } } else if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void FunctionsDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); functionsView->setFocus(); return; } if(event->key() == Qt::Key_Return && functionsView->hasFocus()) { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(index.isValid()) { calculateClicked(); return; } } QDialog::keyPressEvent(event); } void FunctionsDialog::closeEvent(QCloseEvent *e) { settings->functions_geometry = saveGeometry(); settings->functions_vsplitter_state = vsplitter->saveState(); settings->functions_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void FunctionsDialog::reject() { settings->functions_geometry = saveGeometry(); settings->functions_vsplitter_state = vsplitter->saveState(); settings->functions_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void FunctionsDialog::searchChanged(const QString &str) { functionsModel->setSecondaryFilter(str.toStdString()); functionsView->selectionModel()->setCurrentIndex(functionsModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) functionsView->setFocus(); } void FunctionsDialog::newClicked() { MathFunction *replaced_item = NULL; UserFunction *f = FunctionEditDialog::newFunction(this, &replaced_item); if(f) { if(replaced_item && (replaced_item == f || !CALCULATOR->hasFunction(replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item && !replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } selected_item = f; if(f->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(f->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(f->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateFunctions(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + f->category() && (selected_category != "Uncategorized" || !f->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { functionsModel->invalidate(); } sourceModel->sort(0); QModelIndex index = functionsModel->mapFromSource(item->index()); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } if(f != replaced_item && !f->isHidden()) settings->favourite_functions.push_back(f); emit itemsChanged(); } } void FunctionsDialog::editClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *replaced_item = NULL; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f && ((f->subtype() != SUBTYPE_DATA_SET && FunctionEditDialog::editFunction(this, f, &replaced_item)) || (f->subtype() == SUBTYPE_DATA_SET && DataSetEditDialog::editDataset(this, (DataSet*) f, &replaced_item)))) { sourceModel->removeRow(functionsModel->mapToSource(functionsView->selectionModel()->currentIndex()).row()); if(replaced_item && !CALCULATOR->hasFunction(replaced_item)) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item && !replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } selected_item = f; if(f->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(f->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(f->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateFunctions(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + f->category() && (selected_category != "Uncategorized" || !f->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { functionsModel->invalidate(); } sourceModel->sort(0); QModelIndex index = functionsModel->mapFromSource(item->index()); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } emit itemsChanged(); } } void FunctionsDialog::favouriteClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(!f) return; if(favouriteButton->isChecked()) { settings->favourite_functions.push_back(f); } else { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) { settings->favourite_functions.erase(settings->favourite_functions.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_functions.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; functionsModel->invalidate(); selectedFunctionChanged(functionsView->selectionModel()->currentIndex(), functionsView->selectionModel()->currentIndex()); } } } settings->favourite_functions_changed = true; emit favouritesChanged(); } void FunctionsDialog::delClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f && f->isLocal()) { sourceModel->removeRow(functionsModel->mapToSource(functionsView->selectionModel()->currentIndex()).row()); selected_item = NULL; f->destroy(); emit itemsChanged(); } } void FunctionsDialog::applyClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); emit applyFunctionRequest(f); } void FunctionsDialog::calculateClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { emit calculateFunctionRequest(f); } } void FunctionsDialog::insertClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { emit insertFunctionRequest(f); } } void FunctionsDialog::deactivateClicked() { QModelIndex index = functionsView->selectionModel()->currentIndex(); if(!index.isValid()) return; MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(f) { f->setActive(!f->isActive()); QList list = categoriesView->findItems(f->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!f->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void FunctionsDialog::selectedFunctionChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { MathFunction *f = (MathFunction*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasFunction(f)) { selected_item = f; Argument *arg; Argument default_arg; std::string str; const ExpressionName *ename = &f->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_FUNCTION, true, true); str += ""; int iargs = f->maxargs(); if(iargs < 0) { iargs = f->minargs() + 1; if((int) f->lastArgumentDefinitionIndex() > iargs) iargs = (int) f->lastArgumentDefinitionIndex(); } str += "("; if(iargs != 0) { for(int i2 = 1; i2 <= iargs; i2++) { if(i2 > f->minargs()) { str += "["; } if(i2 > 1) { str += CALCULATOR->getComma(); str += " "; } arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += arg->name(); } else { str += tr("argument").toStdString(); if(i2 > 1 || f->maxargs() != 1) { str += " "; str += i2s(i2); } } if(i2 > f->minargs()) { str += "]"; } } if(f->maxargs() < 0) { str += CALCULATOR->getComma(); str += " …"; } } str += ")"; for(size_t i2 = 1; i2 <= f->countNames(); i2++) { if(&f->getName(i2) != ename) { str += "
"; str += f->getName(i2).formattedName(TYPE_FUNCTION, true, true); } } str += "

"; if(f->subtype() == SUBTYPE_DATA_SET) { str += "
"; str += tr("Retrieves data from the %1 data set for a given object and property. If \"info\" is typed as property, a dialog window will pop up with all properties of the object.").arg(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) descriptionView))).toHtmlEscaped().toStdString(); str += "
"; } if(!f->description().empty()) { str += "
"; str += to_html_escaped(f->description()); str += "
"; } if(!f->example(true).empty()) { str += "
"; str += tr("Example:").toStdString(); str += " "; str += to_html_escaped(f->example(false, ename->formattedName(TYPE_FUNCTION, true))); str += "
"; } if(f->subtype() == SUBTYPE_DATA_SET && !((DataSet*) f)->copyright().empty()) { str += "
"; str += to_html_escaped(((DataSet*) f)->copyright()); str += "
"; } if(iargs) { str += "
"; str += tr("Arguments").toStdString(); str += "
"; for(int i2 = 1; i2 <= iargs; i2++) { arg = f->getArgumentDefinition(i2); if(arg && !arg->name().empty()) { str += arg->name(); } else { str += i2s(i2); } str += ": "; if(arg) { str += to_html_escaped(arg->printlong()); } else { str += default_arg.printlong(); } if(i2 > f->minargs()) { str += " ("; str += tr("optional", "optional argument").toStdString(); if(!f->getDefaultValue(i2).empty() && f->getDefaultValue(i2) != "\"\"") { str += ", "; str += tr("default:", "argument default").toStdString(); str += " "; ParseOptions pa = settings->evalops.parse_options; pa.base = 10; std::string str2 = CALCULATOR->localizeExpression(f->getDefaultValue(i2), pa); gsub("*", settings->multiplicationSign(), str2); gsub("/", settings->divisionSign(false), str2); gsub("-", SIGN_MINUS, str2); str += str2; } str += ")"; } str += "
"; } } if(!f->condition().empty()) { str += "
"; str += tr("Requirement:", "Required condition for function").toStdString(); str += " "; str += to_html_escaped(f->printCondition()); str += "
"; } if(f->subtype() == SUBTYPE_DATA_SET) { DataSet *ds = (DataSet*) f; str += "
"; str += tr("Properties").toStdString(); str += "
"; DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); while(dp) { if(!dp->isHidden()) { if(!dp->title(false).empty()) { str += tr("%1:").arg(QString::fromStdString(dp->title())).toStdString(); str += " "; } for(size_t i = 1; i <= dp->countNames(); i++) { if(i > 1) str += ", "; str += dp->getName(i); } if(dp->isKey()) { str += " ("; //: indicating that the property is a data set key str += tr("key").toStdString(); str += ")"; } str += "
"; if(!dp->description().empty()) { str += ""; str += to_html_escaped(dp->description()); str += "
"; } } dp = ds->getNextProperty(&it); } } if(f->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(f->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(!f->isBuiltin()); insertButton->setEnabled(f->isActive()); calculateButton->setEnabled(f->isActive()); delButton->setEnabled(f->isLocal()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) { favouriteButton->setChecked(true); break; } } deactivateButton->setEnabled(true); applyButton->setEnabled(f->isActive() && ((f->minargs() <= 1 && f->id() != FUNCTION_ID_LOGN) || settings->rpn_mode)); descriptionView->setHtml(QString::fromStdString(str)); return; } } editButton->setEnabled(false); insertButton->setEnabled(false); calculateButton->setEnabled(false); delButton->setEnabled(false); deactivateButton->setEnabled(false); applyButton->setEnabled(false); favouriteButton->setEnabled(false); favouriteButton->setChecked(false); descriptionView->clear(); selected_item = NULL; } void FunctionsDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); functionsModel->setFilter(selected_category); QModelIndex index = functionsView->selectionModel()->currentIndex(); if(index.isValid()) { selectedFunctionChanged(index, QModelIndex()); functionsView->scrollTo(index); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void FunctionsDialog::updateFunctions() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; tree_struct function_cats; function_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; functionsView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Function"))); for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(!f->isActive()) { has_inactive = true; } else { tree_struct *item = &function_cats; if(!f->category().empty()) { cat = f->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) functionsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) f), Qt::UserRole); sourceModel->appendRow(item); if(f == selected_item) item_sel = item; } functionsView->selectionModel()->blockSignals(false); sourceModel->sort(0); function_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User functions"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive functions l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All functions"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; function_cats.it = function_cats.items.begin(); if(function_cats.it != function_cats.items.end()) { item = &*function_cats.it; ++function_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are functions without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); functionsModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = functionsModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = functionsModel->index(0, 0); if(index.isValid()) { functionsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); functionsView->scrollTo(index); } selectedFunctionChanged(index, QModelIndex()); } void FunctionsDialog::setSearch(const QString &str) { searchEdit->setText(str); } void FunctionsDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.11.0/src/functionsdialog.h000066400000000000000000000042251520501070600203220ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef FUNCTIONS_DIALOG_H #define FUNCTIONS_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QComboBox; class QLabel; class QAbstractButton; class FunctionsDialog : public QDialog { Q_OBJECT protected: QTreeView *functionsView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *functionsModel; QStandardItemModel *sourceModel; QPushButton *deactivateButton, *calculateButton, *insertButton, *delButton, *editButton, *newButton, *applyButton; QAbstractButton *favouriteButton; QLineEdit *searchEdit; QSplitter *vsplitter, *hsplitter; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedFunctionChanged(const QModelIndex&, const QModelIndex&); void newClicked(); void editClicked(); void delClicked(); void applyClicked(); void insertClicked(); void calculateClicked(); void deactivateClicked(); void favouriteClicked(); void searchChanged(const QString&); public: FunctionsDialog(QWidget *parent = NULL); virtual ~FunctionsDialog(); void updateFunctions(); void setSearch(const QString&); void selectCategory(std::string); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void applyFunctionRequest(MathFunction*); void insertFunctionRequest(MathFunction*); void calculateFunctionRequest(MathFunction*); }; #endif //FUNCTIONS_DIALOG_H qalculate-qt-5.11.0/src/historyview.cpp000066400000000000000000002110231520501070600200550ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "expressionedit.h" #include "historyview.h" #include "qalculateqtsettings.h" bool qstring_has_nondigit(const QString &str) { for(int i = 0; i < str.length(); i++) { if(!str[i].isDigit()) return true; } return false; } QString unhtmlize(QString str, bool b_ascii) { int i = 0, i2; str.remove("\n"); while(true) { i = str.indexOf("<", i); if(i < 0) break; i2 = str.indexOf(">", i + 1); if(i2 < 0) break; int i_sup = str.indexOf("vertical-align:super", i); int i_sub = str.indexOf("vertical-align:sub", i); int i_small = str.indexOf("font-size:small", i); int i_italic = str.indexOf("font-style:italic", i); if(i_sup > i && i2 > i_sup) { int i3 = str.indexOf("= 0) { QString str2 = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(!b_ascii && str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i, SIGN_POWER_2); else if(!b_ascii && str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i, SIGN_POWER_3); else if(str.length() == i3 + 7 && (str2.length() == 1 || !qstring_has_nondigit(str2))) str.replace(i, i3 - i, "^" + str2); else str.replace(i, i3 - i, "^(" + str2 + ")"); continue; } } else if(i_sub > i && i2 > i_sub) { int i3 = str.indexOf("= 0) { if(i_small > i && i2 > i_small) str.remove(i, i3 - i); else str.replace(i, i3 - i, "_" + unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii)); continue; } } else if(i_italic > i && i2 > i_italic) { int i3 = str.indexOf("= 0) { QString name = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(!name.isEmpty() && name[0] != '\'' && name[0] != '\"') { Variable *v = CALCULATOR->getActiveVariable(name.toStdString()); bool replace_all_i = (!v || v->isKnown()); if(replace_all_i && name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, "\\"); str.replace(i, i3 - i, name); continue; } else if(replace_all_i) { name.insert(0, "\""); name += "\""; str.replace(i, i3 - i, name); continue; } } } } else if((i2 - i == 3 && str.mid(i + 1, 2) == "br") || (i2 - i == 4 && str.mid(i + 1, 3) == "/tr")) { str.replace(i, i2 - i + 1, "\n"); continue; } else if(i2 - i > 5 && str.mid(i + 1, 4) == "span" && i2 + 1 < str.length() && str[i2 + 1] == '#') { int i3 = str.indexOf("= 0 && str.indexOf("
") == i3) { str.remove(i, i3 - i); continue; } } else if(i2 - i == 5 && str.mid(i + 1, 4) == "head") { int i3 = str.indexOf("", i2 + 1); if(i3 > 0) { i2 = i3 + 6; } } else if(i2 - i == 4) { if(str.mid(i + 1, 3) == "sup") { int i3 = str.indexOf("", i2 + 1); if(i3 >= 0) { QString str2 = unhtmlize(str.mid(i + 5, i3 - i - 5), b_ascii); if(str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i + 6, SIGN_POWER_2); else if(str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i + 6, SIGN_POWER_3); else if(str.length() == i3 + 6 && (str2.length() == 1 || !qstring_has_nondigit(str2))) str.replace(i, i3 - i + 6, "^" + str2); else str.replace(i, i3 - i + 6, "^(" + str2 + ")"); continue; } } else if(str.mid(i + 1, 3) == "sub") { int i3 = str.indexOf("
", i + 4); if(i3 >= 0) { str.replace(i, i3 - i + 6, "_" + unhtmlize(str.mid(i + 5, i3 - i - 5), b_ascii)); continue; } } } else if(i2 - i == 17 && str.mid(i + 1, 16) == "i class=\"symbol\"") { int i3 = str.indexOf("", i2 + 1); if(i3 >= 0) { QString name = unhtmlize(str.mid(i2 + 1, i3 - i2 - 1), b_ascii); if(name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, "\\"); } else { name.insert(0, "\""); name += "\""; } str.replace(i, i3 - i + 4, name); continue; } } str.remove(i, i2 - i + 1); } str.replace(" " SIGN_DIVISION_SLASH " ", "/"); str.replace("&", "&"); str.replace(">", ">"); str.replace("<", "<"); str.replace(" ", " "); str.replace(" ", THIN_SPACE); str.replace(" ", NNBSP); str.replace(""", "\""); return str; } HistoryView::HistoryView(QWidget *parent) : QTextEdit(parent) { fileMenu = NULL; i_pos = 0; i_pos_p = 0; previous_cursor = 0; previous_temporary = 0; last_ans = 0; b_reversed = false; #ifdef _WIN32 has_lock_symbol = 1; #else has_lock_symbol = -1; #endif initial_loaded = false; setReadOnly(true); QImage img1px(1, 1, QImage::Format_ARGB32); img1px.fill(Qt::transparent); document()->addResource(QTextDocument::ImageResource, QUrl("data://img1px.png"), QVariant(img1px)); text_color = palette().text().color(); setTextColor(text_color); cmenu = NULL; searchDialog = NULL; findAction = new QAction(tr("Search…"), this); addAction(findAction); connect(findAction, SIGNAL(triggered()), this, SLOT(editFind())); findDateAction = new QAction(tr("Search by Date…"), this); addAction(findDateAction); connect(findDateAction, SIGNAL(triggered()), this, SLOT(editFindDate())); } HistoryView::~HistoryView() {} void HistoryView::replaceColors(QString &str, QColor prev_text_color) { if(settings->color == 2) { str.replace("color: #585858", "color: #AAAAAA"); str.replace("color: #800000", "color: #FFAAAA"); str.replace("color: #000080", "color: #AAAAFF"); str.replace("color:#005858", "color:#AAFFFF"); str.replace("color:#585800", "color:#FFFFAA"); str.replace("color:#580058", "color:#FFAAFF"); str.replace("color:#800000", "color:#FFAAAA"); str.replace("color:#000080", "color:#AAAAFF"); str.replace("color:#008000", "color:#BBFFBB"); str.replace("color:#668888", "color:#88AAAA"); str.replace("color:#888866", "color:#AAAA88"); str.replace("color:#886688", "color:#AA88AA"); str.replace("color:#666699", "color:#AA8888"); str.replace("color:#669966", "color:#99BB99"); str.replace("color: #666666", "color: #AAAAAA"); str.replace(prev_text_color.name(QColor::HexRgb), text_color.name(QColor::HexRgb)); str.replace(":/icons/actions", ":/icons/dark/actions"); } else { str.replace("color: #AAAAAA", "color: #585858"); str.replace("color: #AAAAFF", "color: #000080"); str.replace("color: #FFAAAA", "color: #800000"); str.replace("color:#AAFFFF", "color:#005858"); str.replace("color:#FFFFAA", "color:#585800"); str.replace("color:#FFAAFF", "color:#580058"); str.replace("color:#FFAAAA", "color:#800000"); str.replace("color:#AAAAFF", "color:#000080"); str.replace("color:#BBFFBB", "color:#008000"); str.replace("color:#88AAAA", "color:#668888"); str.replace("color:#AAAA88", "color:#888866"); str.replace("color:#AA88AA", "color:#886688"); str.replace("color:#AA8888", "color:#666699"); str.replace("color:#99BB99", "color:#669966"); str.replace("color: #AAAAAA", "color: #666666"); str.replace(prev_text_color.name(QColor::HexRgb), text_color.name(QColor::HexRgb)); str.replace(":/icons/dark/actions", ":/icons/actions"); } } void replace_colors(std::string &str) { if(settings->color == 2) { gsub("color:#005858", "color:#AAFFFF", str); gsub("color:#585800", "color:#FFFFAA", str); gsub("color:#580058", "color:#FFAAFF", str); gsub("color:#800000", "color:#FFAAAA", str); gsub("color:#000080", "color:#AAAAFF", str); gsub("color:#008000", "color:#BBFFBB", str); gsub(":/icons/actions", ":/icons/dark/actions", str); } else { gsub("color:#AAFFFF", "color:#005858", str); gsub("color:#FFFFAA", "color:#585800", str); gsub("color:#FFAAFF", "color:#580058", str); gsub("color:#FFAAAA", "color:#800000", str); gsub("color:#AAAAFF", "color:#000080", str); gsub("color:#BBFFBB", "color:#008000", str); gsub(":/icons/dark/actions", ":/icons/actions", str); } } std::string uncolorize(std::string str, bool remove_class) { size_t i = 0; while(true) { i = str.find(" style=\"color:#", i); if(i == std::string::npos) break; str.erase(i, 22); } if(remove_class) { gsub(" class=\"nous\"", "", str); gsub(" class=\"symbol\"", "", str); } i = 0; size_t i2 = 0, i1 = 0; int depth = 0; while(true) { i2 = str.find("", i); i = str.find(" 0) { depth--; if(depth == 0 && str[i1 + 5] == '>') { str.erase(i2, 7); str.erase(i1, 6); i = i1; } else { i = i2 + 7; } } else { i = i2 + 7; } } else if(i != std::string::npos) { if(depth == 0) i1 = i; i += 6; depth++; } else { break; } } return str; } std::string replace_parse_colors(std::string str) { if(settings->color == 2) { gsub("color:#AAFFFF", "color:#88AAAA", str); gsub("color:#FFFFAA", "color:#AAAA88", str); gsub("color:#FFAAFF", "color:#AA88AA", str); gsub("color:#FFAAAA", "color:#AA8888", str); gsub("color:#BBFFBB", "color:#99BB99", str); } else { gsub("color:#005858", "color:#668888", str); gsub("color:#585800", "color:#888866", str); gsub("color:#580058", "color:#886688", str); gsub("color:#000080", "color:#666699", str); gsub("color:#008000", "color:#669966", str); } return str; } void replace_one(QString &str, const QString &origstr, const QString &newstr, bool b_last = false) { int index = (b_last ? str.lastIndexOf(origstr) : str.indexOf(origstr)); if(index > 0) { str.replace(index, origstr.length(), newstr); } } #define SAVE_SCROLLBAR_POS int vpos = verticalScrollBar()->value(); if(b_reversed) vpos = verticalScrollBar()->maximum() - vpos; #define RESTORE_SCROLLBAR_POS verticalScrollBar()->setValue(b_reversed ? verticalScrollBar()->maximum() - vpos : vpos); #define SCROLL_TO_BEGINNING verticalScrollBar()->setValue(b_reversed ? verticalScrollBar()->maximum() : 0); void HistoryView::loadInitial(bool reload) { if(reload && !initial_loaded) return; s_text.clear(); i_pos = 0; i_pos_p = 0; previous_html.clear(); last_ans = 0; last_ref = ""; i_pos2 = 0; i_pos_p2 = 0; previous_html2.clear(); last_ans2 = 0; last_ref2 = ""; previous_temporary = false; previous_cursor = 0; previous_cursor2 = 0; for(size_t i = 0; i < settings->v_expression.size() && !reload;) { if(i > 0 && !settings->v_protected[i] && settings->v_expression[i] == settings->v_expression[i - 1] && settings->v_parse[i] == settings->v_parse[i - 1] && settings->v_result[i] == settings->v_result[i - 1] && settings->v_pexact[i] == settings->v_pexact[i] && settings->v_exact[i] == settings->v_exact[i - 1] && settings->v_value[i] == settings->v_value[i - 1] && settings->v_parse[i].find("rand") == std::string::npos && settings->v_expression[i].find("rand") == std::string::npos) { settings->v_expression.erase(settings->v_expression.begin() + i); settings->v_parse.erase(settings->v_parse.begin() + i); settings->v_result.erase(settings->v_result.begin() + i); settings->v_protected.erase(settings->v_protected.begin() + i); settings->v_time.erase(settings->v_time.begin() + i); settings->v_exact.erase(settings->v_exact.begin() + i); settings->v_pexact.erase(settings->v_pexact.begin() + i); settings->v_value.erase(settings->v_value.begin() + i); settings->v_messages.erase(settings->v_messages.begin() + i); settings->v_parseerror.erase(settings->v_parseerror.begin() + i); } else { i++; } } if(settings->v_expression.empty()) { if(!settings->clear_history_on_exit && !reload) { setHtml("" + (b_reversed ? tr("Type a mathematical expression below, e.g. \"5 + 2 / 3\", and press the enter key.") : tr("Type a mathematical expression above, e.g. \"5 + 2 / 3\", and press the enter key.")) + ""); } else { setHtml(""); } } else { size_t i = 0; for(; i < settings->v_expression.size() - 1; i++) { if(!settings->v_messages[i].isEmpty()) { replaceColors(settings->v_messages[i]); if(reload) { settings->v_messages[i].replace("font-size:normal", "font-size:small "); settings->v_messages[i].replace("width=\"2\"", "width=\"1\""); } } addResult(settings->v_result[i], settings->v_expression[i], settings->v_pexact[i], settings->v_parse[i], true, false, QString(), NULL, reload ? 2 : 1, i); } if((settings->color == 2 && (s_text.contains("color:#00") || s_text.contains("color:#58"))) || (settings->color != 2 && (s_text.contains("color:#FF") || s_text.contains("color:#AA")))) { replaceColors(s_text); for(size_t i = 0; i < settings->v_expression.size(); i++) { replace_colors(settings->v_parse[i]); for(size_t i2 = 0; i2 < settings->v_result[i].size(); i2++) { replace_colors(settings->v_result[i][i2]); } } } setHtml("" + s_text + ""); if(!settings->v_messages[i].isEmpty()) { replaceColors(settings->v_messages[i]); if(!reload || settings->history_answer.empty() || !settings->current_result) { settings->current_result = NULL; settings->v_messages[i].replace("font-size:normal", "font-size:small "); settings->v_messages[i].replace("width=\"2\"", "width=\"1\""); } } addResult(settings->v_result[i], settings->v_expression[i], settings->v_pexact[i], settings->v_parse[i], true, false, QString(), NULL, reload && !settings->history_answer.empty() && settings->current_result ? 3 : (reload ? 2 : 1), i); } initial_loaded = true; QFontMetrics fm(font()); prev_fonti = fm.boundingRect("Öy"); if(b_reversed) { previous_cursor2 = textCursor().position(); updateTopMargin(); } } #define PASTE_H QFontMetrics fm(font()); \ int paste_h = fm.ascent() * 0.75; \ if(paste_h < 12) paste_h = 12; void HistoryView::updateTopMargin() { if(!b_reversed) return; int dh = document()->size().height(); int h = height(); QTextFrameFormat ffmt = document()->rootFrame()->frameFormat(); dh -= ffmt.topMargin(); if(dh - ffmt.bottomMargin() * 2 < h) ffmt.setTopMargin(h - dh - ffmt.bottomMargin()); else ffmt.setTopMargin(ffmt.bottomMargin()); document()->rootFrame()->setFrameFormat(ffmt); } void HistoryView::clearTemporary() { if(!previous_temporary || previous_html.isEmpty()) return; QTextCursor cur = textCursor(); cur.setPosition(previous_cursor); if(b_reversed) cur.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); else cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); if(!previous_html2.isEmpty()) { cur.setPosition(previous_cursor2); if(b_reversed) cur.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); else cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); if(b_reversed) previous_cursor = textCursor().position(); insertHtml("" + previous_html2 + "
"); previous_html = previous_html2; if(!b_reversed) previous_cursor = textCursor().position(); } else { previous_html.clear(); previous_cursor = 0; } previous_temporary = false; i_pos = i_pos2; i_pos_p = i_pos_p2; last_ans = last_ans2; last_ref = last_ref2; if(!b_reversed) previous_cursor2 = 0; i_pos2 = 0; i_pos_p2 = 0; previous_html2.clear(); last_ans2 = 0; last_ref2 = ""; if(b_reversed) { SCROLL_TO_BEGINNING updateTopMargin(); } } bool HistoryView::testTemporaryResultLength(const std::string &str) { QFontMetrics fm(font()); return fm.boundingRect(QStringLiteral("#9999") + "= " + unhtmlize(QString::fromStdString(str))).width() + 2 < width() * 1.65; } int HistoryView::maxTemporaryCharacters() { QFontMetrics fm(font()); return (width() * 1.65 / fm.averageCharWidth()) - 7; } void HistoryView::addResult(std::vector values, std::string expression, bool pexact, std::string parse, int exact, bool dual_approx, const QString &image, bool *implicit_warning, int initial_load, size_t index, bool temporary, const std::string &tmp_value) { if(temporary && !previous_temporary) { previous_cursor2 = previous_cursor; } if(!temporary && previous_temporary && expression.empty() && parse.empty()) { clearTemporary(); } QString serror; bool b_parse_error = (initial_load && !expression.empty() && settings->v_parseerror[index] && !settings->v_messages[index].isEmpty()); bool empty_error = false; if(!initial_load && CALCULATOR->message()) { int n = 0, first_error_index = -1; do { if(CALCULATOR->message()->category() == MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION && (settings->implicit_question_asked || implicit_warning)) { if(!settings->implicit_question_asked) *implicit_warning = true; } else { QString mstr = QString::fromStdString(CALCULATOR->message()->message()); if(settings->printops.use_unicode_signs) { mstr.replace(">=", SIGN_GREATER_OR_EQUAL); mstr.replace("<=", SIGN_LESS_OR_EQUAL); mstr.replace("!=", SIGN_NOT_EQUAL); mstr.replace("\n", "
"); } MessageType mtype = CALCULATOR->message()->type(); if(temporary) { if(mtype == MESSAGE_ERROR || mtype == MESSAGE_WARNING) { if(CALCULATOR->message()->message().empty()) { empty_error = true; } else { if(n > 0) { if(n == 1) serror = "• " + serror; serror += "\n• "; } serror += mstr; n++; } } } else { if(mtype == MESSAGE_ERROR || mtype == MESSAGE_WARNING) { serror += "color == 2) serror += "#FFAAAA"; else serror += "#800000"; } else { if(settings->color == 2) serror += "#AAAAFF"; else serror += "#000080"; } serror += ""; if(CALCULATOR->message()->stage() == MESSAGE_STAGE_PARSING) b_parse_error = true; serror += "\">"; if(n == 0 && (mstr.isEmpty() || mstr[0] != '-')) first_error_index = serror.length(); if(n == 1 && first_error_index >= 0) serror.insert(first_error_index, "• "); if(n > 0 && !mstr.startsWith("-")) serror += "• "; serror += mstr.toHtmlEscaped(); serror += ""; n++; } else { values.insert(values.begin(), std::string("#") + mstr.toStdString()); } } } } while(CALCULATOR->nextMessage()); if(serror.isEmpty() && values.empty() && expression.empty() && parse.empty()) return; } PASTE_H QString str; bool comment = false; if(!expression.empty() || !parse.empty()) { comment = !temporary && expression.empty() && parse == "#"; if((initial_load && index != settings->v_expression.size() - 1) || b_reversed) str += QStringLiteral(""; if(temporary) { parse_tmp = parse; result_tmp = tmp_value; } else if(!initial_load) { settings->v_expression.push_back(expression); settings->v_parse.push_back(parse); settings->v_pexact.push_back(pexact); settings->v_protected.push_back(false); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) settings->v_time.push_back(QDateTime::currentSecsSinceEpoch()); #else settings->v_time.push_back(QDateTime::currentMSecsSinceEpoch() / 1000); #endif settings->v_messages.push_back(serror); settings->v_parseerror.push_back(b_parse_error); settings->v_result.push_back(values); settings->v_exact.push_back(std::vector()); settings->v_value.push_back(std::vector()); size_t n = 0; for(size_t i = 0; i < values.size(); i++) { settings->v_exact[settings->v_exact.size() - 1].push_back(exact || i < values.size() - 1); settings->v_value[settings->v_value.size() - 1].push_back(dual_approx && n == 0 ? settings->history_answer.size() - 1 : settings->history_answer.size()); if(values[i].empty() || values[i][0] != '#') n++; } } gsub("", "", parse); if(!comment && !temporary && !expression.empty() && (settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT || parse.empty())) { if(!parse.empty() && (settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT) && parse != expression) { str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(expression).toHtmlEscaped(); str += ""; if(settings->color == 2) str += "  "; else str += "  "; str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); if(pexact) str += "= "; else str += SIGN_ALMOST_EQUAL " "; if(!settings->colorize_result) str += QString::fromStdString(uncolorize(parse, false)); else str += QString::fromStdString(replace_parse_colors(parse)); str += ""; str += ""; } else { str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(expression).toHtmlEscaped(); str += ""; } } else if(!comment) { if(temporary) str += ""; else str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); if(!pexact) str += SIGN_ALMOST_EQUAL " "; if(!settings->colorize_result) str += QString::fromStdString(uncolorize(parse, false)); else str += QString::fromStdString(parse); str += ""; if(!temporary && b_parse_error && !expression.empty()) { str += "    "; if(settings->color == 2) str += ""; else str += ""; str += QStringLiteral("").arg(initial_load ? (int) index : settings->v_expression.size() - 1); str += QString::fromStdString(replace_parse_colors(expression)); str += ""; str += ""; } } if(initial_load && settings->v_protected[index]) { if(has_lock_symbol < 0) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) if(QFontDatabase::families(QFontDatabase::Symbol).contains("Noto Color Emoji")) has_lock_symbol = 1; #else QFontDatabase database; if(database.families(QFontDatabase::Symbol).contains("Noto Color Emoji")) has_lock_symbol = 1; #endif else has_lock_symbol = 0; } if(has_lock_symbol) str += " 🔒"; else str += " [P]"; } if(temporary) { temporary_error = serror; if(!serror.isEmpty() || empty_error) str += QStringLiteral("\"temporary_error\"/").arg(":/icons/actions/scalable/warning.svg").arg(fm.ascent()); } str += ""; } else if(!initial_load && !settings->v_result.empty()) { for(size_t i = values.size(); i > 0; i--) { settings->v_result[settings->v_result.size() - 1].insert(settings->v_result[settings->v_result.size() - 1].begin(), values[i - 1]); settings->v_exact[settings->v_exact.size() - 1].insert(settings->v_exact[settings->v_exact.size() - 1].begin(), exact || i < values.size()); settings->v_value[settings->v_value.size() - 1].insert(settings->v_value[settings->v_value.size() - 1].begin(), dual_approx && i == 1 ? settings->history_answer.size() - 1 : settings->history_answer.size()); } if(!serror.isEmpty()) { settings->v_messages[settings->v_messages.size() - 1] += serror; } } if(!temporary) str += serror; if(initial_load) str += settings->v_messages[index]; str.replace("", ""); if((!expression.empty() || !parse.empty()) && !temporary) { i_pos = str.length(); if(!initial_load || initial_load > 2) i_pos_p = i_pos; } size_t i_answer_pre = 0; if(temporary && values.empty()) { values.push_back(""); } size_t n = 0; for(size_t i = 0; i < values.size(); i++) { size_t i_answer = 0; if(initial_load) i_answer = settings->v_value[index][i]; else if(!temporary) i_answer = dual_approx && n == 0 ? settings->history_answer.size() - 1 : settings->history_answer.size(); if(!values[i].empty() && values[i][0] == '#') { str += " 2 && n > 0))) str += "; font-size:small"; else if(!comment) str += "; font-size:normal"; if((!expression.empty() || !parse.empty()) && i == values.size() - 1) str += QStringLiteral("; padding-bottom: %1 px").arg(paste_h / 4); str += "\">"; if(i_answer == 0) str += QStringLiteral("").arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); else str += QStringLiteral("").arg(i_answer).arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : (initial_load > 1 ? values.size() - i - 1 : settings->v_result[settings->v_result.size() - 1].size() - i - 1)); str += QString::fromStdString(values[i]).mid(1); str += ""; continue; } QFontMetrics fm(font()); int w_number = fm.boundingRect(i_answer > 9999 ? (i_answer > 99999 ? "#999999" : "#99999") : "#9999").width() + 2; int w = 0; str += ""; if(!initial_load || initial_load > 2) { w = fm.boundingRect("= " + unhtmlize(QString::fromStdString(values[i]))).width(); } if(i_answer != 0 && i_answer != i_answer_pre) { if(!initial_load && expression.empty() && parse.empty() && last_ans == i_answer && !last_ref.isEmpty()) { previous_html.remove(last_ref); } QString sref; if(settings->color == 2) { sref = QStringLiteral("#%1").arg(i_answer).arg(initial_load ? (int) index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : (initial_load > 1 ? values.size() - i - 1 : settings->v_result[settings->v_result.size() - 1].size() - i - 1)); } else { sref = QStringLiteral("#%1").arg(i_answer).arg(initial_load ? (int) index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : (initial_load > 1 ? values.size() - i - 1 : settings->v_result[settings->v_result.size() - 1].size() - i - 1)); } bool b = true; if(initial_load) { for(size_t i2 = 0; i2 < i; i2++) { if(settings->v_value[index][i2] == i_answer && (values[i2].empty() || values[i2][0] != '#')) { b = false; } } } if(b) str += sref; if((initial_load > 2 && n == 0) || (!initial_load && (!dual_approx || i == values.size() - 1))) { last_ans = i_answer; last_ref = sref; } } str += " 1 && n > 0 && i_answer <= i_answer_pre) || w * 1.5 + w_number > width() || !settings->format_result) { gsub("", "", values[i]); } else if(w * 1.85 + w_number > width()) { str += "; font-size:large"; if(temporary) {str += "; line-height:"; str += QString::number((int) fm.lineSpacing() * 1.5); str += "px";} gsub("", "", values[i]); } else { str += "; font-size:x-large"; gsub("", "", values[i]); } if((!expression.empty() || !parse.empty()) && i == values.size() - 1) str += QStringLiteral("; padding-bottom: %1 px").arg(paste_h / 4); str += "\">"; int b_exact = 1; if(initial_load) { b_exact = settings->v_exact[index][i]; } else { if(exact < 0) b_exact = -1; else if(exact == 0 && i == values.size() - 1) b_exact = 0; } if(temporary && !values[i].empty()) { str += ""; } else if(!temporary) { if(i_answer == 0) str += QStringLiteral("").arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load ? (int) i : settings->v_result[settings->v_result.size() - 1].size() - i - 1); else str += QStringLiteral("").arg(i_answer).arg(initial_load ? index : settings->v_expression.size() - 1).arg(initial_load == 1 ? (int) i : (initial_load > 1 ? values.size() - i - 1 : settings->v_result[settings->v_result.size() - 1].size() - i - 1)); } if(!temporary || !values[i].empty()) { if(b_exact > 0) str += "= "; else if(b_exact == 0) str += SIGN_ALMOST_EQUAL " "; } if(!settings->colorize_result) str += QString::fromStdString(uncolorize(values[i], false)); else str += QString::fromStdString(values[i]); if(!image.isEmpty() && i == values.size() - 1 && w * 1.85 + w_number + fm.ascent() <= width()) { str += QStringLiteral("setExchangeRatesUsed(-100); int i = CALCULATOR->exchangeRatesUsed(); CALCULATOR->setExchangeRatesUsed(-100); if(i > 0) { QString sources_str; int n = 0; if(i & 0b0001) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(1)); n++;} if(i & 0b0010) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(2)); n++;} if(i & 0b0100) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(3)); n++;} if(i & 0b1000) {sources_str += "\\n"; sources_str += QString::fromStdString(CALCULATOR->getExchangeRatesUrl(4)); n++;} if(n > 0) { str += " alt=\""; str += tr("Exchange rate source(s):", "", n); str += sources_str; str += "\\n("; str += tr("updated %1", "", n).arg(QString::fromStdString(QalculateDateTime(CALCULATOR->getExchangeRatesTime(CALCULATOR->exchangeRatesUsed())).toISOString())); str += ")"; str += "\""; } } str += "/>"; } if(!temporary || !values[i].empty()) str += ""; str += ""; i_answer_pre = i_answer; n++; } str.replace("\n", "
"); str.replace(QChar(0x2028), "
"); int i = 0; if(!previous_temporary && (!expression.empty() || !parse.empty())) { previous_html2 = previous_html; i_pos2 = i_pos; i_pos_p2 = i_pos_p; last_ans2 = last_ans; last_ref2 = last_ref; } if(!initial_load) { if(settings->format_result && n > 0) { previous_html.replace("font-size:normal", "font-size:small "); previous_html.replace("width=\"2\"", "width=\"1\""); } while(true) { i = previous_html.indexOf("", i); previous_html.remove(i, i2 - i + 1); if(i < i_pos_p && expression.empty() && parse.empty()) i_pos_p -= (i2 - i + 1); } QTextCursor cur = textCursor(); cur.setPosition(previous_cursor); if(b_reversed) cur.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); else cur.setPosition(0, QTextCursor::KeepAnchor); setTextCursor(cur); cur.deleteChar(); } if(expression.empty() && parse.empty()) { if(!initial_load && settings->format_result && n > 0) { i = 0; while(true) { i = previous_html.indexOf("; font-size:x-large", i); if(i < 0) break; previous_html.remove(i, 19); if(i < i_pos_p) i_pos_p -= 19; } i = 0; while(true) { i = previous_html.indexOf("; font-size:large", i); if(i < 0) break; previous_html.remove(i, 17); if(i < i_pos_p) i_pos_p -= 17; } i = 0; } if(initial_load) { s_text.insert(i_pos, str); } else { QTextCursor cur = textCursor(); if(b_reversed) cur.movePosition(QTextCursor::End); else cur.setPosition(0); setTextCursor(cur); if(b_reversed) previous_html += str; else previous_html.insert(i_pos_p, str); insertHtml("" + previous_html + "
"); if(!b_reversed) previous_cursor = textCursor().position(); previous_html2 = previous_html; i_pos2 = i_pos; i_pos_p2 = i_pos_p; last_ans2 = last_ans; last_ref2 = last_ref; if(b_reversed) { SCROLL_TO_BEGINNING updateTopMargin(); } } } else { if(initial_load) { if(index == settings->v_expression.size() - 1) { QTextCursor cur = textCursor(); if(b_reversed) cur.movePosition(QTextCursor::End); else cur.setPosition(0); setTextCursor(cur); if(b_reversed) previous_cursor = textCursor().position(); insertHtml("" + str + "
"); previous_html = str; if(!b_reversed) previous_cursor = textCursor().position(); if(b_reversed) { SCROLL_TO_BEGINNING updateTopMargin(); } } else { if(b_reversed) s_text += "" + str + "
"; else s_text.insert(0, "" + str + "
"); } } else { if(previous_html.isEmpty()) { setHtml(""); } else if(!previous_temporary) { if(settings->format_result) { previous_html.remove("; font-size:x-large"); previous_html.remove("; font-size:large"); } replace_one(previous_html, "border-top: 0px none", "border-top: 1px dashed"); replace_one(previous_html, "padding-top: 0px", "padding-top: " + QString::number(paste_h / 2) + "px"); insertHtml("" + previous_html + "
"); } QTextCursor cur = textCursor(); if(b_reversed) cur.movePosition(QTextCursor::End); else cur.setPosition(0); setTextCursor(cur); if(b_reversed) previous_cursor = textCursor().position(); insertHtml("" + str + "
"); previous_html = str; if(!b_reversed) previous_cursor = textCursor().position(); if(b_reversed) { SCROLL_TO_BEGINNING updateTopMargin(); } } } previous_temporary = temporary; } void HistoryView::setReversed(bool b) { b_reversed = b; } void HistoryView::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { text_color = palette().text().color(); setTextColor(text_color); for(size_t i = 0; i < settings->v_expression.size(); i++) { replace_colors(settings->v_parse[i]); for(size_t i2 = 0; i2 < settings->v_result[i].size(); i2++) { replace_colors(settings->v_result[i][i2]); } } reloadHistory(); } else if(e->type() == QEvent::FontChange) { QFontMetrics fm(font()); if(fm.boundingRect("Öy") != prev_fonti) { reloadHistory(); } updateMinimumHeight(); } QTextEdit::changeEvent(e); } void HistoryView::addMessages() { std::vector values; addResult(values, "", true, "", true); } void HistoryView::mouseMoveEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) QPoint p = e->pos(); p.ry() += verticalScrollBar()->value(); bool b_tooltip = false; if(str.isEmpty() && (document()->documentLayout()->imageAt(p).indexOf(":/icons") == 0 || (e->pos().x() > width() - 150 && document()->documentLayout()->imageAt(p).indexOf(":/data/flags") == 0))) { p = viewport()->mapFromParent(e->pos()); for(int n = 0; n < 5; n++) { QTextCursor cur = cursorForPosition(p); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf(" alt=\""); if(i >= 0) { i += 6; int i2 = str.indexOf("\"", i + 1); if(i2 > i) { str = str.mid(i, i2 - i); if(str == "temporary_error") str = temporary_error; else str.replace("\\n", "\n"); if(!str.isEmpty()) { QToolTip::showText(mapToGlobal(e->pos()), str, this); b_tooltip = true; } } break; } p.rx() += QFontMetrics(font()).ascent() / 2; } } if(!b_tooltip) QToolTip::hideText(); #endif if(str.isEmpty()) viewport()->setCursor(Qt::IBeamCursor); else viewport()->setCursor(Qt::PointingHandCursor); QTextEdit::mouseMoveEvent(e); } void HistoryView::mouseDoubleClickEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); if(str.isEmpty() && e->button() == Qt::LeftButton) { int i1 = -1, i2 = -1; indexAtPos(e->pos(), &i1, &i2, NULL, &str); if(i1 >= 0 && str.length() > 0) { if(str[0] == 'c') { editComment(i1, i2); } else if(str[0] == 'p') { int index = str.indexOf(":"); if(index < 0) return; str = str.mid(index + 1); index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && i1 < (int) settings->v_result.size() && i2 < (int) settings->v_result[i1].size()) { emit insertTextRequested(settings->replaceResultSeparators(settings->v_result[i1][settings->v_result[i1].size() - i2 - 1])); } } } else if(str[0] == '#') { int index = str.indexOf(":"); if(index < 0) emit insertValueRequested(str.mid(1).toInt()); else emit insertValueRequested(str.mid(1, index - 1).toInt()); } else if(str[0] == 'e' || str[0] == 'a') { int i = str.mid(1).toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && i2 >= 0 && (size_t) i2 < settings->v_result[i1].size()) { if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') editComment(i1, i2); else emit insertTextRequested(settings->replaceResultSeparators(settings->v_result[i1][i2])); } } } } } else { QTextEdit::mouseDoubleClickEvent(e); } } void HistoryView::mouseReleaseEvent(QMouseEvent *e) { QString str = anchorAt(e->pos()); if(!str.isEmpty() && e->button() == Qt::LeftButton) { if(str.startsWith("https://")) QDesktopServices::openUrl(QUrl(str)); if(str[0] == 'p') { int index = str.indexOf(":"); if(index < 0) return; str = str.mid(index + 1); index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && i1 < (int) settings->v_result.size() && i2 < (int) settings->v_result[i1].size()) { emit insertTextRequested(settings->v_result[i1][settings->v_result[i1].size() - i2 - 1]); } } } else if(str[0] == '#') { int index = str.indexOf(":"); if(index < 0) emit insertValueRequested(str.mid(1).toInt()); else emit insertValueRequested(str.mid(1, index - 1).toInt()); } else { int index = str.indexOf(":"); if(index < 0) { int i = str.toInt(); if(i >= 0 && (size_t) i < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i].empty() ? settings->v_parse[i] : settings->v_expression[i]); } else { int i1 = str.left(index).toInt(); int i2 = str.mid(index + 1).toInt(); if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && i2 >= 0 && (size_t) i2 < settings->v_result[i1].size()) emit insertTextRequested(settings->v_result[i1][i2]); } } } else { QTextEdit::mouseReleaseEvent(e); } } void HistoryView::keyPressEvent(QKeyEvent *e) { if(e->matches(QKeySequence::Copy)) { editCopy(); return; } QTextEdit::keyPressEvent(e); if(!e->isAccepted() && (e->key() != Qt::Key_Control && e->key() != Qt::Key_Meta && e->key() != Qt::Key_Alt)) { expressionEdit->setFocus(); expressionEdit->keyPressEvent(e); } } void HistoryView::inputMethodEvent(QInputMethodEvent *e) { QTextEdit::inputMethodEvent(e); if(!e->isAccepted() && !e->commitString().isEmpty()) { expressionEdit->setFocus(); expressionEdit->inputMethodEvent(e); } } void HistoryView::resizeEvent(QResizeEvent *e) { QTextEdit::resizeEvent(e); if(b_reversed) { SCROLL_TO_BEGINNING updateTopMargin(); } } void HistoryView::editClear() { for(size_t i1 = 0; i1 < settings->v_protected.size();) { if(!settings->v_protected[i1]) { if(i1 == settings->v_protected.size() - 1) settings->current_result = NULL; settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); } else { i1++; } } SCROLL_TO_BEGINNING reloadHistory(); } void HistoryView::editMoveToTop() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; settings->current_result = NULL; settings->v_expression.push_back(settings->v_expression[i1]); settings->v_parse.push_back(settings->v_parse[i1]); settings->v_pexact.push_back(settings->v_pexact[i1]); settings->v_protected.push_back(settings->v_protected[i1]); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) settings->v_time.push_back(QDateTime::currentSecsSinceEpoch()); #else settings->v_time.push_back(QDateTime::currentMSecsSinceEpoch() / 1000); #endif settings->v_result.push_back(settings->v_result[i1]); settings->v_exact.push_back(settings->v_exact[i1]); settings->v_value.push_back(settings->v_value[i1]); settings->v_messages.push_back(settings->v_messages[i1]); settings->v_parseerror.push_back(settings->v_parseerror[i1]); settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); SCROLL_TO_BEGINNING reloadHistory(); } void HistoryView::reloadHistory() { SAVE_SCROLLBAR_POS loadInitial(true); emit historyReloaded(); RESTORE_SCROLLBAR_POS } void HistoryView::editRemove() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; if(i2 >= 0 && i2 < (int) settings->v_result[i1].size()) { bool remove_expression = true; for(size_t i = 0; i < settings->v_result[i1].size(); i++) { if(i != (size_t) i2 && (settings->v_result[i1][i].empty() || settings->v_result[i1][i][0] != '#')) { remove_expression = false; break; } } if(remove_expression) { i2 = -1; } else { settings->v_result[i1].erase(settings->v_result[i1].begin() + i2); settings->v_exact[i1].erase(settings->v_exact[i1].begin() + i2); settings->v_value[i1].erase(settings->v_value[i1].begin() + i2); } } if(i2 < 0) { if((size_t) i1 == settings->v_expression.size() - 1) settings->current_result = NULL; settings->v_expression.erase(settings->v_expression.begin() + i1); settings->v_parse.erase(settings->v_parse.begin() + i1); settings->v_result.erase(settings->v_result.begin() + i1); settings->v_protected.erase(settings->v_protected.begin() + i1); settings->v_time.erase(settings->v_time.begin() + i1); settings->v_exact.erase(settings->v_exact.begin() + i1); settings->v_pexact.erase(settings->v_pexact.begin() + i1); settings->v_value.erase(settings->v_value.begin() + i1); settings->v_messages.erase(settings->v_messages.begin() + i1); settings->v_parseerror.erase(settings->v_parseerror.begin() + i1); } SAVE_SCROLLBAR_POS reloadHistory(); RESTORE_SCROLLBAR_POS } void HistoryView::editComment(int i1, int i2) { bool b_edit = !settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#'; if(i2 > 0 && !settings->v_result[i1][i2 - 1].empty() && settings->v_result[i1][i2 - 1][0] == '#') { i2--; b_edit = true; } QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Comment")); QGridLayout *grid = new QGridLayout(); QPlainTextEdit *commentEdit = new QPlainTextEdit(this); if(b_edit) { QString str = QString::fromStdString(unhtmlize(settings->v_result[i1][i2].substr(1))); commentEdit->setPlainText(str); commentEdit->selectAll(); } commentEdit->setFocus(); grid->addWidget(commentEdit, 0, 0); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted && (b_edit || !commentEdit->toPlainText().trimmed().isEmpty())) { if(b_edit && commentEdit->toPlainText().trimmed().isEmpty()) { editRemove(); } else { QString str = "#" + commentEdit->toPlainText().trimmed().toHtmlEscaped(); str.replace("\n", "
"); if(b_edit) { if(settings->v_result[i1][i2] != str.toStdString()) { settings->v_result[i1][i2] = str.toStdString(); SAVE_SCROLLBAR_POS reloadHistory(); RESTORE_SCROLLBAR_POS } } else if(!settings->history_answer.empty() && i1 == (int) settings->v_result.size() - 1 && i2 == 0) { std::vector values; values.push_back(str.toStdString()); addResult(values, "", true, "", settings->v_exact[i1][i2]); emit historyReloaded(); } else { settings->v_result[i1].insert(settings->v_result[i1].begin(), str.toStdString()); settings->v_exact[i1].insert(settings->v_exact[i1].begin(), settings->v_exact[i1][i2]); settings->v_value[i1].insert(settings->v_value[i1].begin(), settings->v_value[i1][i2]); SAVE_SCROLLBAR_POS reloadHistory(); RESTORE_SCROLLBAR_POS } } } dialog->deleteLater(); } void HistoryView::editComment() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_expression.size()) return; if(i2 < 0 || i2 >= (int) settings->v_result[i1].size()) i2 = 0; editComment(i1, i2); } void HistoryView::editProtect() { int i1 = -1, i2 = -1; indexAtPos(context_pos, &i1, &i2); if(i1 < 0 || i1 >= (int) settings->v_protected.size()) return; settings->v_protected[i1] = protectAction->isChecked(); if(i1 == 0) settings->current_result = NULL; SAVE_SCROLLBAR_POS reloadHistory(); RESTORE_SCROLLBAR_POS } void HistoryView::indexAtPos(const QPoint &pos, int *expression_index, int *result_index, int *value_index, QString *anchorstr) { *expression_index = -1; *result_index = -1; if(value_index) *value_index = -1; QString sref = anchorAt(pos); if(sref.isEmpty()) { QTextCursor cur = cursorForPosition(viewport()->mapFromParent(pos)); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf("= 0) { i += 9; int i2 = str.indexOf("\"", i); if(i2 >= 0) sref = str.mid(i, i2 - i); } } if(sref.isEmpty()) { QTextCursor cur = cursorForPosition(viewport()->mapFromParent(pos)); cur.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); cur.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); QString str = cur.selection().toHtml(); int i = str.lastIndexOf("= 0) { i += 9; int i2 = str.indexOf("\"", i); if(i2 >= 0) sref = str.mid(i, i2 - i); } } if(anchorstr) *anchorstr = sref; if(sref.isEmpty() || sref == "TR" || sref == "TP") return; int i = sref.indexOf(":"); if(sref[0] == '#' || sref[0] == 'p' || sref[0] == 'c') { if(i < 0) return; int i2 = sref.indexOf(":", i + 1); if(i2 >= 0) { *expression_index = sref.mid(i + 1, i2 - (i + 1)).toInt(); *result_index = sref.mid(i2 + 1).toInt(); if(*expression_index >= 0 && *expression_index < (int) settings->v_result.size() && *result_index < (int) settings->v_result[*expression_index].size()) { *result_index = settings->v_result[*expression_index].size() - *result_index - 1; } if(value_index) *value_index = sref.mid(1, i - 1).toInt(); } else { *expression_index = sref.mid(i + 1).toInt(); } } else if(sref[0] == 'a' || sref[0] == 'e') { *expression_index = sref.mid(1).toInt(); } else if(i >= 0) { *expression_index = sref.left(i).toInt(); *result_index = sref.mid(i + 1).toInt(); } else { *expression_index = sref.toInt(); } } void HistoryView::updateMinimumHeight() { QFontMetrics fm(font()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) setMinimumHeight(fm.lineSpacing() * 4.4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin() * 2 + viewportMargins().bottom() + viewportMargins().top()); #else setMinimumHeight(fm.lineSpacing() * 4.4 + frameWidth() * 2 + contentsMargins().top() + contentsMargins().bottom() + document()->documentMargin()); #endif } void HistoryView::contextMenuEvent(QContextMenuEvent *e) { if(!cmenu) { cmenu = new QMenu(this); insertValueAction = cmenu->addAction(tr("Insert Value"), this, SLOT(editInsertValue())); insertTextAction = cmenu->addAction(tr("Insert Text"), this, SLOT(editInsertText())); copyAction = new QAction(tr("Copy"), this); connect(copyAction, SIGNAL(triggered()), this, SLOT(editCopy())); copyAction->setShortcut(QKeySequence::Copy); copyAction->setShortcutContext(Qt::WidgetShortcut); copyFormattedAction = cmenu->addAction(tr("Copy"), this, SLOT(editCopyFormatted())); copyAsciiAction = cmenu->addAction(tr("Copy unformatted ASCII"), this, SLOT(editCopyAscii())); selectAllAction = cmenu->addAction(tr("Select All"), this, SLOT(selectAll())); selectAllAction->setShortcut(QKeySequence::SelectAll); selectAllAction->setShortcutContext(Qt::WidgetShortcut); cmenu->addAction(findAction); cmenu->addAction(findDateAction); cmenu->addSeparator(); protectAction = cmenu->addAction(tr("Protect"), this, SLOT(editProtect())); protectAction->setCheckable(true); commentAction = cmenu->addAction(tr("Add Comment…"), this, SLOT(editComment())); movetotopAction = cmenu->addAction(tr("Move to Top"), this, SLOT(editMoveToTop())); cmenu->addSeparator(); delAction = cmenu->addAction(tr("Remove"), this, SLOT(editRemove())); clearAction = cmenu->addAction(tr("Clear"), this, SLOT(editClear())); if(fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } int i1 = -1, i2 = -1, i3 = -1; QString astr; context_pos = e->pos(); indexAtPos(context_pos, &i1, &i2, &i3, &astr); bool b_tmp = (i1 < 0 && (astr == "TR" || astr == "TP")); selectAllAction->setEnabled(!document()->isEmpty()); protectAction->setChecked(i1 >= 0 && i1 < (int) settings->v_protected.size() && settings->v_protected[i1]); if((i1 >= 0 || b_tmp) && e->reason() == QContextMenuEvent::Mouse && !textCursor().hasSelection()) { if(i2 < 0) i2 = 0; bool b_edit = (!astr.isEmpty() && astr[0] == 'c') || (!b_tmp && i2 < (int) settings->v_result[i1].size() && ((!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') || (i2 > 0 && !settings->v_result[i1][i2 - 1].empty() && settings->v_result[i1][i2 - 1][0] == '#'))); insertValueAction->setEnabled(i3 >= 0 && !b_edit); insertTextAction->setEnabled(true); copyAction->setEnabled(true); copyFormattedAction->setEnabled(true); copyAsciiAction->setEnabled(true); delAction->setEnabled(i1 >= 0); protectAction->setEnabled(i1 >= 0); movetotopAction->setEnabled(i1 >= 0 && !settings->v_expression.empty()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) if(i1 >= 0 && !settings->v_time.empty() && settings->v_time[i1] != 0) findDateAction->setText(tr("Search by Date…") + " (" + QDateTime::fromSecsSinceEpoch(settings->v_time[i1]).date().toString(Qt::ISODate) + ")"); #else if(i1 >= 0 && !settings->v_time.empty() && settings->v_time[i1] != 0) findDateAction->setText(tr("Search by Date…") + " (" + QDateTime::fromMSecsSinceEpoch(settings->v_time[i1] * 1000).date().toString(Qt::ISODate) + ")"); #endif else findDateAction->setText(tr("Search by Date…")); commentAction->setEnabled(i1 >= 0); if(b_edit) commentAction->setText(tr("Edit Comment…")); else commentAction->setText(tr("Add Comment…")); } else { copyAction->setEnabled(textCursor().hasSelection()); copyFormattedAction->setEnabled(textCursor().hasSelection()); copyAsciiAction->setEnabled(textCursor().hasSelection()); delAction->setEnabled(false); protectAction->setEnabled(false); movetotopAction->setEnabled(false); insertValueAction->setEnabled(false); insertTextAction->setEnabled(false); findDateAction->setText(tr("Search by Date…")); commentAction->setEnabled(false); commentAction->setText(tr("Add Comment…")); } findAction->setEnabled(!settings->v_expression.empty()); findDateAction->setEnabled(!settings->v_expression.empty()); clearAction->setEnabled(!settings->v_expression.empty()); cmenu->popup(e->globalPos()); } void HistoryView::setMenuAndToolbarItems(QMenu *mode, QMenu *menu, QAction *action) { if(!menu && cmenu && fileMenu) { cmenu->removeAction(fileSeparator); cmenu->removeAction(modeMenu->menuAction()); cmenu->removeAction(fileMenu->menuAction()); cmenu->removeAction(tbAction); } modeMenu = mode; fileMenu = menu; tbAction = action; if(cmenu && fileMenu) { fileSeparator = cmenu->addSeparator(); cmenu->addAction(modeMenu->menuAction()); cmenu->addAction(fileMenu->menuAction()); cmenu->addAction(tbAction); } } void HistoryView::doFind() { if(!find(searchEdit->text(), b_reversed ? QTextDocument::FindBackward : QTextDocument::FindFlags())) { QTextCursor c = textCursor(); QTextCursor cbak = c; c.movePosition(b_reversed ? QTextCursor::End : QTextCursor::Start); setTextCursor(c); if(!find(searchEdit->text())) { setTextCursor(cbak); } } } void HistoryView::editFind() { if(searchDialog) { searchDialog->setWindowState((searchDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); searchDialog->show(); qApp->processEvents(); searchDialog->raise(); searchDialog->activateWindow(); searchEdit->clear(); searchEdit->setFocus(); return; } searchDialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(searchDialog); if(settings->always_on_top) searchDialog->setWindowFlags(searchDialog->windowFlags() | Qt::WindowStaysOnTopHint); searchDialog->setWindowTitle(tr("Search")); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Text:"), this), 0, 0); searchEdit = new QLineEdit(this); searchEdit->setFocus(); grid->addWidget(searchEdit, 0, 1); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, searchDialog); connect(buttonBox->addButton(tr("Search"), QDialogButtonBox::AcceptRole), SIGNAL(clicked()), this, SLOT(doFind())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), searchDialog, SLOT(reject())); box->addWidget(buttonBox); searchDialog->show(); } void HistoryView::editFindDate() { QDialog *dialog = new QDialog(this, Qt::Popup); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QVBoxLayout *box = new QVBoxLayout(dialog); box->setContentsMargins(0, 0, 0, 0); QCalendarWidget *w = new QCalendarWidget(dialog); if(!settings->v_time.empty() && settings->v_time[settings->v_time.size() - 1] > 0) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) w->setMaximumDate(QDateTime::fromSecsSinceEpoch(settings->v_time[settings->v_time.size() - 1]).date()); #else w->setMaximumDate(QDateTime::fromMSecsSinceEpoch(settings->v_time[settings->v_time.size() - 1] * 1000).date()); #endif for(size_t i = settings->v_time.size() - 1; ; i--) { if(i == 0 || settings->v_time[i] == 0) { if(settings->v_time[i] == 0) i++; #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) w->setMinimumDate(QDateTime::fromSecsSinceEpoch(settings->v_time[i]).date()); #else w->setMinimumDate(QDateTime::fromMSecsSinceEpoch(settings->v_time[i] * 1000).date()); #endif break; } } } box->addWidget(w); connect(w, SIGNAL(clicked(QDate)), dialog, SLOT(accept())); connect(w, SIGNAL(activated(QDate)), dialog, SLOT(accept())); if(dialog->exec() == QDialog::Accepted) { QDate date = w->selectedDate(); for(size_t i = settings->v_time.size(); i > 0; i--) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) if(settings->v_time[i - 1] != 0 && QDateTime::fromSecsSinceEpoch(settings->v_time[i - 1]).date() <= date) { #else if(settings->v_time[i - 1] != 0 && QDateTime::fromMSecsSinceEpoch(settings->v_time[i - 1] * 1000).date() <= date) { #endif if(settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT) scrollToAnchor("e" + QString::number(i - 1)); else scrollToAnchor(QString::number(i - 1)); break; } } } dialog->deleteLater(); } void remove_separator(std::string ©_text) { for(size_t i = ((CALCULATOR->local_digit_group_separator.empty() || CALCULATOR->local_digit_group_separator == " " || CALCULATOR->local_digit_group_separator == settings->printops.decimalpoint()) ? 1 : 0); i < 4; i++) { std::string str_sep; if(i == 0) str_sep = CALCULATOR->local_digit_group_separator; else if(i == 1) str_sep = THIN_SPACE; else if(i == 2) str_sep = NNBSP; else str_sep = " "; size_t index = copy_text.find(str_sep); while(index != std::string::npos) { if(index > 0 && index + str_sep.length() < copy_text.length() && copy_text[index - 1] >= '0' && copy_text[index - 1] <= '9' && copy_text[index + str_sep.length()] >= '0' && copy_text[index + str_sep.length()] <= '9') { copy_text.erase(index, str_sep.length()); } else { index++; } index = copy_text.find(str_sep, index); } } } QString replace_first_minus(const QString &qstr) { if(qstr.indexOf(SIGN_MINUS) == 0) { std::string str = qstr.toStdString(); if(str.find_first_of(OPERATORS) == std::string::npos) { for(size_t i = strlen(SIGN_MINUS); i < str.length(); i++) { if((signed char) str[i] < 0) return qstr; } std::string str_new = str; str_new.replace(0, strlen(SIGN_MINUS), "-"); return QString::fromStdString(str_new); } } return qstr; } std::string replace_first_minus(const std::string &str) { if(str.find(SIGN_MINUS) == 0 && str.find_first_of(OPERATORS) == std::string::npos) { for(size_t i = strlen(SIGN_MINUS); i < str.length(); i++) { if((signed char) str[i] < 0) return str; } std::string str_new = str; str_new.replace(0, strlen(SIGN_MINUS), "-"); return str_new; } return str; } std::string unformat(std::string str, bool restorable) { remove_separator(str); gsub(SIGN_MINUS, "-", str); gsub(SIGN_MULTIPLICATION, "*", str); gsub(SIGN_MULTIDOT, "*", str); gsub(SIGN_MIDDLEDOT, "*", str); gsub(THIN_SPACE, " ", str); gsub(NNBSP, " ", str); gsub(SIGN_DIVISION, "/", str); gsub(SIGN_DIVISION_SLASH, "/", str); gsub(SIGN_SQRT, "sqrt", str); gsub("Ω", "ohm", str); gsub("µ", restorable ? "µ" : "u", str); return str; } void HistoryView::editCopy(int ascii) { if(ascii < 0) ascii = settings->copy_ascii; if(textCursor().hasSelection()) { QString str = textCursor().selection().toHtml(), str_nohtml; int i = str.indexOf(""); if(i >= 0) { int i2 = str.indexOf("", i + 20); if(i2 >= 0) str = str.mid(i + 20, i2 - i - 20).trimmed(); str_nohtml = unhtmlize(str, ascii); } else if(str.startsWith(""); int i2 = str.indexOf("", i + 6); if(i2 >= 0) str = str.mid(i + 6, i2 - i - 6).trimmed(); str_nohtml = unhtmlize(str, ascii).trimmed(); str_nohtml.replace("\n\n", "\n"); str_nohtml.replace("\n ", "\n"); } else { str_nohtml = unhtmlize(textCursor().selectedText(), ascii); } if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(str_nohtml.toStdString()))); } else { i = 0; while(true) { i = str.indexOf("color:", i); if(i < 0) break; int i2 = str.indexOf(";", i); int i3 = str.indexOf("\"", i); if(i2 < 0 || i3 < i2) i2 = i3 - 1; if(i2 < 0) break; str.remove(i, i2 - i); } i = 0; while(true) { i = str.indexOf("", i); if(i2 < 0) break; str.remove(i, i2 - i + 2); } str.remove("font-size:x-large;"); str.remove("font-size:large;"); str.replace("; ;", ";"); str.replace("style=\" ", "style=\""); str.replace("style=\" ", "style=\""); str.replace("style=\"; ", "style=\""); str.remove(" style=\"\""); str.remove(" style=\";\""); int i2 = 0; QList i1; i = 0; int depth = 0; while(true) { i2 = str.indexOf("", i); i = str.indexOf("= 0 && (i < 0 || i2 < i)) { if(depth > 0) { depth--; int i3 = str.indexOf(">", i1.last()); if(i3 < i1.last()) break; QString str2 = str.mid(i1.last() + 5, i3 - (i1.last() + 5) + 1); if(str2 == ">") { str.remove(i2, 7); str.remove(i1.last(), 6); i = i1.last(); } else if(str2 == " style=\"vertical-align:super;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"font-style:italic; vertical-align:super;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"font-style:italic;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else if(str2 == " style=\"vertical-align:sub;\">") { str.replace(i2, 7, ""); str.replace(i1.last(), str2.length() + 5, ""); i = i1.last(); } else { i = i2 + 7; } i1.removeLast(); } else { i = i2 + 7; } } else if(i >= 0) { i1 << i; i += 6; depth++; } else { break; } } i = 0; while(true) { i = str.indexOf("", i); if(i2 < 0) break; str.remove(i, i2 - i + 1); } str.remove(""); QMimeData *qm = new QMimeData(); qm->setHtml(str); qm->setText(str_nohtml); qm->setObjectName("history_selection"); QApplication::clipboard()->setMimeData(qm); } } else { int i1 = -1, i2 = -1; QString astr; indexAtPos(context_pos, &i1, &i2, NULL, &astr); if(i1 < 0 && astr == "TP") { if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(parse_tmp, true)))); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(parse_tmp))); qm->setText(QString::fromStdString(unhtmlize(parse_tmp))); qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } return; } bool b_temp = (i1 < 0 && astr == "TR"); if(i1 < 0 && !b_temp) return; if(i2 < 0 && !b_temp) { if(i1 >= 0 && (size_t) i1 < settings->v_expression.size()) { if(astr[0] == 'e' || (astr[0] != 'a' && settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED && !settings->v_expression[i1].empty())) { if(ascii > 0 || (ascii < 0 && settings->copy_ascii)) { QApplication::clipboard()->setText(QString::fromStdString(unformat(settings->v_expression[i1]))); } else { QApplication::clipboard()->setText(QString::fromStdString(settings->v_expression[i1])); } } else { if(ascii) { QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(settings->v_parse[i1], true)))); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(settings->v_parse[i1]))); qm->setText(QString::fromStdString(unhtmlize(settings->v_parse[i1]))); qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } } } } else { if(b_temp || ((size_t) i1 < settings->v_result.size() && (size_t) i2 < settings->v_result[i1].size())) { if(ascii) { std::string str = (b_temp ? result_tmp : settings->v_result[i1][i2]); if(!str.empty() && str[0] == '#') str.erase(0, 1); if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); if(b_temp) { qm->setHtml(QString::fromStdString(uncolorize(result_tmp))); qm->setText(QString::fromStdString(unhtmlize((result_tmp)))); } else if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') { qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[i1][i2].substr(1)))); qm->setText(QString::fromStdString(unhtmlize((settings->v_result[i1][i2].substr(1))))); } else { qm->setHtml(QString::fromStdString(uncolorize(settings->v_result[i1][i2]))); qm->setText(QString::fromStdString(unhtmlize((settings->v_result[i1][i2])))); } qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } } } } } void HistoryView::editCopyAscii() { editCopy(1); } void HistoryView::editCopyFormatted() { editCopy(0); } void HistoryView::editInsertValue() { int i1 = -1, i2 = -1, i3 = -1; indexAtPos(context_pos, &i1, &i2, &i3); if(i3 > 0) emit insertValueRequested(i3); } void HistoryView::editInsertText() { int i1 = -1, i2 = -1; QString astr; indexAtPos(context_pos, &i1, &i2, NULL, &astr); if(i1 < 0 && astr == "TR") { emit insertTextRequested(result_tmp); } else if(i1 < 0 && astr == "TP") { emit insertTextRequested(parse_tmp); } else if(i2 >= 0) { if(i1 >= 0 && (size_t) i1 < settings->v_result.size() && (size_t) i2 < settings->v_result[i1].size()) { if(!settings->v_result[i1][i2].empty() && settings->v_result[i1][i2][0] == '#') emit insertTextRequested(settings->v_result[i1][i2].substr(1)); else emit insertTextRequested(settings->v_result[i1][i2]); } } else { if(i1 >= 0 && (size_t) i1 < settings->v_expression.size()) emit insertTextRequested(settings->v_expression[i1].empty() ? settings->v_parse[i1] : settings->v_expression[i1]); } } qalculate-qt-5.11.0/src/historyview.h000066400000000000000000000062201520501070600175230ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef HISTORY_VIEW_H #define HISTORY_VIEW_H #include class QImage; class QMenu; class QAction; class ExpressionEdit; class QColor; class QLineEdit; class QDialog; class HistoryView : public QTextEdit { Q_OBJECT public: HistoryView(QWidget *parent = NULL); virtual ~HistoryView(); ExpressionEdit *expressionEdit; QAction *findAction; QDialog *searchDialog; void addResult(std::vector values, std::string expression = "", bool pexact = true, std::string parse = "", int exact = 1, bool dual_approx = false, const QString &image = QString(), bool *implicit_warning = NULL, int initial_load = 0, size_t index = 0, bool temporary = false, const std::string &tmp_value = ""); void clearTemporary(); void addMessages(); void loadInitial(bool reload = false); void indexAtPos(const QPoint &pos, int *expression_index, int *result_index, int *value_index = NULL, QString *anchorstr = NULL); void replaceColors(QString&, QColor prev_text_color = QColor()); void setMenuAndToolbarItems(QMenu*, QMenu*, QAction*); void updateMinimumHeight(); bool testTemporaryResultLength(const std::string&); int maxTemporaryCharacters(); void setReversed(bool); protected: QString s_text, previous_html, previous_html2, temporary_error; std::string parse_tmp, result_tmp; int i_pos, i_pos2, i_pos_p, i_pos_p2, previous_cursor, previous_cursor2, previous_temporary; int has_lock_symbol; QMenu *cmenu, *fileMenu, *modeMenu; QAction *insertTextAction, *insertValueAction, *copyAction, *copyFormattedAction, *copyAsciiAction, *selectAllAction, *delAction, *clearAction, *protectAction, *movetotopAction, *tbAction, *fileSeparator, *findDateAction, *commentAction; QColor text_color; QRect prev_fonti; QPoint context_pos; QLineEdit *searchEdit; size_t last_ans, last_ans2; QString last_ref, last_ref2; bool initial_loaded; bool b_reversed; void mouseDoubleClickEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void contextMenuEvent(QContextMenuEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void inputMethodEvent(QInputMethodEvent*) override; void changeEvent(QEvent*) override; void resizeEvent(QResizeEvent*) override; void editComment(int, int); void updateTopMargin(); protected slots: void doFind(); public slots: void editInsertValue(); void editInsertText(); void editCopy(int = -1); void editCopyFormatted(); void editCopyAscii(); void editClear(); void editRemove(); void editProtect(); void editFind(); void editFindDate(); void editMoveToTop(); void editComment(); void reloadHistory(); signals: void insertTextRequested(std::string); void insertValueRequested(int); void historyReloaded(); }; #endif //HISTORY_VIEW_H qalculate-qt-5.11.0/src/itemproxymodel.cpp000066400000000000000000000073231520501070600205500ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include "itemproxymodel.h" #include #include "qalculateqtsettings.h" ItemProxyModel::ItemProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { setSortCaseSensitivity(Qt::CaseInsensitive); setSortLocaleAware(true); setDynamicSortFilter(false); show_hidden = true; } ItemProxyModel::~ItemProxyModel() {} bool ItemProxyModel::filterAcceptsRow(int source_row, const QModelIndex&) const { QModelIndex index = sourceModel()->index(source_row, 0); if(!index.isValid()) return false; ExpressionItem *item = (ExpressionItem*) index.data(Qt::UserRole).value(); if(cat.empty()) return false; if(!show_hidden && item->isHidden() && (item->type() != TYPE_UNIT || !((Unit*) item)->isCurrency())) return false; if(cat == "All") { if(!item->isActive()) return false; } else if(cat == "Inactive") { if(item->isActive()) return false; } else if(cat == "Uncategorized") { if(!item->isActive() || !item->category().empty()) return false; } else if(cat == "User items") { if(!item->isActive() || !item->isLocal()) return false; } else if(cat == "Favorites") { bool b = false; if(item->type() == TYPE_UNIT) { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == item) {b = true; break;} } } if(item->type() == TYPE_FUNCTION) { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == item) {b = true; break;} } } if(item->type() == TYPE_VARIABLE) { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == item) {b = true; break;} } } if(!b) return false; } else { if(!item->isActive()) return false; if(!subcat.empty()) { size_t l1 = subcat.length(), l2; l2 = item->category().length(); if((l2 != l1 && (l2 <= l1 || item->category()[l1] != '/')) || item->category().substr(0, l1) != subcat) return false; } else { if(item->category() != cat) return false; } } if(filter.empty()) return true; return name_matches(item, filter) || title_matches(item, filter) || (item->type() == TYPE_UNIT && country_matches((Unit*) item, filter)); } void ItemProxyModel::setFilter(std::string scat, std::string sfilter) { remove_blank_ends(sfilter); if(cat != scat || filter != sfilter) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) beginFilterChange(); #endif cat = scat; if(cat[0] == '/') subcat = cat.substr(1, cat.length() - 1); else subcat = ""; filter = sfilter; #if (QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)) endFilterChange(Direction::Rows); #else invalidateFilter(); #endif } } void ItemProxyModel::setSecondaryFilter(std::string sfilter) { remove_blank_ends(sfilter); if(filter != sfilter) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) beginFilterChange(); #endif filter = sfilter; #if (QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)) endFilterChange(Direction::Rows); #else invalidateFilter(); #endif } } void ItemProxyModel::setShowHidden(bool b) { if(b != show_hidden) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) beginFilterChange(); #endif show_hidden = b; #if (QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)) endFilterChange(Direction::Rows); #else invalidateFilter(); #endif } } std::string ItemProxyModel::currentFilter() const { return cat; } std::string ItemProxyModel::currentSecondaryFilter() const { return filter; } qalculate-qt-5.11.0/src/itemproxymodel.h000066400000000000000000000017241520501070600202140ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef ITEM_PROXY_MODEL_H #define ITEM_PROXY_MODEL_H #include class ItemProxyModel : public QSortFilterProxyModel { Q_OBJECT public: ItemProxyModel(QObject *parent = NULL); ~ItemProxyModel(); void setFilter(std::string, std::string = ""); void setSecondaryFilter(std::string); void setShowHidden(bool); std::string currentFilter() const; std::string currentSecondaryFilter() const; protected: std::string cat, subcat, filter; bool show_hidden; bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override; }; #endif //ITEM_PROXY_MODEL_H qalculate-qt-5.11.0/src/keypadwidget.cpp000066400000000000000000002660141520501070600201540ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "keypadwidget.h" #include "qalculateqtsettings.h" #define BUTTON_DATA "QALCULATE DATA1" #define BUTTON_DATA2 "QALCULATE DATA2" #define BUTTON_DATA3 "QALCULATE DATA3" #define BUTTON_VALUE "QALCULATE VALUE1" #define BUTTON_VALUE2 "QALCULATE VALUE2" #define BUTTON_VALUE3 "QALCULATE VALUE3" #define SYMBOL_BUTTON_BOX(x) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked())); \ box->addWidget(button); #define SYMBOL_BUTTON3(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_OPERATOR_SYMBOL_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_OPERATOR_ITEM_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) z)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL2_ITEM_BUTTON(x, y, o, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_ITEM2_BUTTON(x, o1, o2, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ connect(button, SIGNAL(clicked()), this, SLOT(onSymbolButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_ITEM2_BUTTON(x, o1, o2, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SYMBOL_BUTTON(x, r, c) SYMBOL_BUTTON3(x, x, x, r, c) #define SYMBOL_BUTTON2(x, y, r, c) SYMBOL_BUTTON3(x, y, y, r, c) #define OPERATOR_BUTTON3(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onOperatorButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_ITEM_SYMBOL_BUTTON(x, y, z, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) y)); \ button->setProperty(BUTTON_DATA3, z); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_SYMBOL_BUTTON(x, y, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, x); \ button->setProperty(BUTTON_DATA2, y); \ button->setProperty(BUTTON_DATA3, y); \ connect(button, SIGNAL(clicked()), this, SLOT(onOperatorButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onSymbolButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onSymbolButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define OPERATOR_BUTTON(x, r, c) OPERATOR_BUTTON3(x, x, x, r, c) #define OPERATOR_BUTTON2(x, y, r, c) OPERATOR_BUTTON3(x, y, y, r, c) #define ITEM_BUTTON3(o1, o2, o3, x, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o2)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o3)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), (void*) o1 == (void*) o2 ? QString() : QString::fromStdString(o2->title(true, settings->printops.use_unicode_signs)), (void*) o2 == (void*) o3 ? QString() : QString::fromStdString(o3->title(true, settings->printops.use_unicode_signs))); \ connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define ITEM_OPERATOR_ITEM_BUTTON(o1, o2, o3, x, r, c) button = new KeypadButton(x, this); \ button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, o2); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o3)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), o2, QString::fromStdString(o3->title(true, settings->printops.use_unicode_signs))); \ connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onOperatorButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked3())); \ grid->addWidget(button, r, c, 1, 1); #define SET_ITEM_BUTTON2(button, o1, o2) button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) o1)); \ button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) o2)); \ button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) o2)); \ button->setToolTip(QString::fromStdString(o1->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(o2->title(true, settings->printops.use_unicode_signs))); #define ITEM_BUTTON(o, x, r, c) ITEM_BUTTON3(o, o, o, x, r, c) #define ITEM_BUTTON2(o1, o2, x, r, c) ITEM_BUTTON3(o1, o2, o2, x, r, c) #define BASE_BUTTON(x, i, r, c) button = new KeypadButton(x, this); \ button->setCheckable(true); \ grid->addWidget(button, r, c); \ button->setProperty(BUTTON_DATA, i); \ connect(button, SIGNAL(clicked()), this, SLOT(onBaseButtonClicked())); \ connect(button, SIGNAL(clicked2()), this, SLOT(onBaseButtonClicked2())); \ connect(button, SIGNAL(clicked3()), this, SLOT(onBaseButtonClicked2())); #define MENU_ITEM(x) item = x;\ if(item) {\ action = menu->addAction(QString::fromStdString(item->title(true, settings->printops.use_unicode_signs)), this, SLOT(onItemButtonClicked()));\ action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) item));\ } #define MENU_SYMBOL(x) action = menu->addAction(x, this, SLOT(onSymbolButtonClicked()));\ action->setProperty(BUTTON_DATA, x); #define CREATE_MENU menu = new QMenu(this);\ button->setMenu(menu);\ button->setPopupMode(settings->separate_keypad_menu_buttons ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup);\ button->menuSet(); #define ADD_SECTION(str) \ if(!menu->style()->styleHint(QStyle::SH_Menu_SupportsSections)) { \ aw = new QWidgetAction(this); \ QLabel *label = new QLabel(str, this); \ label->setAlignment(Qt::AlignCenter); \ aw->setDefaultWidget(label); \ menu->addSeparator(); \ menu->addAction(aw); \ menu->addSeparator(); \ } else { \ menu->addSection(str); \ } void KeypadWidget::createKeypad(int i) { KeypadButton *button; QMenu *menu; MathFunction *f, *f2; int c = 0; QGridLayout *grid; QHBoxLayout *box; if(i == KEYPAD_GENERAL && !sinButton) { grid = new QGridLayout(keypadG); grid->setContentsMargins(0, 0, 0, 0); button = new KeypadButton("MS", this); connect(button, SIGNAL(clicked()), this, SIGNAL(MSClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MSClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MSClicked())); button->setToolTip(tr("Memory store")); grid->addWidget(button, c, 0, 1, 1); button = new KeypadButton("MC", this); button->setToolTip(tr("Memory clear")); connect(button, SIGNAL(clicked()), this, SIGNAL(MCClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MCClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MCClicked())); grid->addWidget(button, c, 1, 1, 1); button = new KeypadButton("MR", this); button->setToolTip(tr("Memory recall")); connect(button, SIGNAL(clicked()), this, SIGNAL(MRClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MRClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MRClicked())); grid->addWidget(button, c, 2, 1, 1); button = new KeypadButton("M+", this); button->setToolTip(tr("Memory add"), tr("Memory subtract")); connect(button, SIGNAL(clicked()), this, SIGNAL(MPlusClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(MMinusClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(MMinusClicked())); grid->addWidget(button, c, 3, 1, 1); //: Standard calculator button. Do not use more than three characters. button = new KeypadButton(tr("STO"), this); connect(button, SIGNAL(clicked()), this, SIGNAL(storeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(newFunctionClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(newFunctionClicked())); button->setToolTip(tr("Store"), tr("New function")); grid->addWidget(button, c, 4, 1, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateStoreMenu())); c++; button = new KeypadButton("hyp"); button->setCheckable(true); grid->addWidget(button, c, 0, 1, 1); connect(button, SIGNAL(toggled(bool)), this, SLOT(onHypToggled(bool))); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SIN), CALCULATOR->getFunctionById(FUNCTION_ID_ASIN), tr("sin"), c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSinMenu())); sinButton = button; ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_COS), CALCULATOR->getFunctionById(FUNCTION_ID_ACOS), tr("cos"), c, 2); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateCosMenu())); cosButton = button; ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_TAN), CALCULATOR->getFunctionById(FUNCTION_ID_ATAN), tr("tan"), c, 3); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateTanMenu())); tanButton = button; ITEM_BUTTON3(CALCULATOR->getVariableById(VARIABLE_ID_PI), CALCULATOR->getVariableById(VARIABLE_ID_EULER), CALCULATOR->getVariableById(VARIABLE_ID_CATALAN), SIGN_PI, c, 4); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePiMenu())); c++; OPERATOR_ITEM2_BUTTON("^", CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), c, 2); button->setRichText("xy"); button->setToolTip(tr("Exponentiation"), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_EXP)->title(true, settings->printops.use_unicode_signs))); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePowerMenu())); ITEM_BUTTON3(CALCULATOR->getFunctionById(FUNCTION_ID_SQRT), CALCULATOR->getFunctionById(FUNCTION_ID_CBRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), SIGN_SQRT, c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSqrtMenu())); f = CALCULATOR->getActiveFunction("log10"); if(f) { ITEM_BUTTON3(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), f, CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", c, 0); } else { ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", c, 0); } CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateLnMenu())); ITEM_OPERATOR_ITEM_BUTTON(CALCULATOR->getVariableById(VARIABLE_ID_I), "∠", CALCULATOR->getFunctionById(FUNCTION_ID_ARG), CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0 ? "j" : "i", c, 3); imaginaryButton = button; QFont ifont(button->font()); ifont.setStyle(QFont::StyleItalic); button->setFont(ifont); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateComplexMenu())); f = CALCULATOR->getActiveFunction("cis"); if(f) { ITEM_BUTTON3(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), f, "e", c, 4); } else { ITEM_BUTTON2(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), "e", c, 4); } CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateEMenu())); c++; f = CALCULATOR->getActiveFunction("perm"); f2 = CALCULATOR->getActiveFunction("comb"); if(f && f2) { OPERATOR_ITEM2_BUTTON("!", f, f2, c, 0); button->setToolTip(QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_FACTORIAL)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f2->title(true, settings->printops.use_unicode_signs))); } else { OPERATOR_BUTTON("!", c, 0); } button->setText("x!"); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateFactorialMenu())); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SUM), CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT), "Σ", c, 1); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateSumMenu())); SYMBOL_BUTTON3("x", "y", "z", c, 2); button->setToolTip(QString(), "y", "z"); button->setFont(ifont); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateXMenu())); SYMBOL_BUTTON("=", c, 3); button->setRichText("x ="); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateEqualsMenu())); button = new KeypadButton("a(x)b", this); connect(button, SIGNAL(clicked()), this, SIGNAL(factorizeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(expandClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(expandClicked())); button->setToolTip(tr("Factorize"), tr("Expand")); grid->addWidget(button, c, 4); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateFactorizeMenu())); c++; if(!settings->show_percent_in_numpad) { SYMBOL_BUTTON2("%", "‰", c, 1); button->setToolTip(tr("Percent or remainder"), QString::fromStdString(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)->title(true, settings->printops.use_unicode_signs))); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePercentageMenu())); percentButton = button; } else { button = new KeypadButton("(x)", this); button->setToolTip(tr("Smart parentheses"), tr("Vector brackets")); connect(button, SIGNAL(clicked()), this, SIGNAL(parenthesesClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(bracketsClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(bracketsClicked())); grid->addWidget(button, c, 2, 1, 1); parButton = button; } SYMBOL_ITEM2_BUTTON("±", CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY), CALCULATOR->getFunctionById(FUNCTION_ID_INTERVAL), c, 0); button->setToolTip(tr("Uncertainty/interval"), tr("Relative error"), tr("Interval")); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateIntervalMenu())); std::string sunit = settings->latest_button_unit; if(sunit.empty()) sunit = "m"; Unit *u = CALCULATOR->getActiveUnit(sunit); button = new KeypadButton(QString::fromStdString(sunit), this); Prefix *p1 = CALCULATOR->getExactDecimalPrefix(-3), *p2 = CALCULATOR->getExactDecimalPrefix(3); button->setProperty(BUTTON_DATA, u ? QVariant::fromValue((void*) u) : QString::fromStdString(sunit)); button->setProperty(BUTTON_DATA2, QVariant::fromValue((void*) p1)); button->setProperty(BUTTON_DATA3, QVariant::fromValue((void*) p2)); connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onUnitButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onUnitButtonClicked3())); grid->addWidget(button, c, settings->show_percent_in_numpad ? 1 : 2, 1, 1); unitButton = button; unitButton->setToolTip(QString::fromStdString(u ? u->title(true, settings->printops.use_unicode_signs) : sunit), p1 ? QString::fromStdString(p1->longName()) : QString(), p2 ? QString::fromStdString(p2->longName()) : QString()); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateUnitsMenu())); backButton = new KeypadButton(LOAD_COLORED_ICON("go-back"), this, true); backButton->setToolTip(tr("Move cursor left"), tr("Move cursor to start")); connect(backButton, SIGNAL(clicked()), this, SIGNAL(leftClicked())); connect(backButton, SIGNAL(clicked2()), this, SIGNAL(startClicked())); connect(backButton, SIGNAL(clicked3()), this, SIGNAL(startClicked())); grid->addWidget(backButton, c, 3, 1, 1); forwardButton = new KeypadButton(LOAD_COLORED_ICON("go-forward"), this, true); forwardButton->setToolTip(tr("Move cursor right"), tr("Move cursor to end")); connect(forwardButton, SIGNAL(clicked()), this, SIGNAL(rightClicked())); connect(forwardButton, SIGNAL(clicked2()), this, SIGNAL(endClicked())); connect(forwardButton, SIGNAL(clicked3()), this, SIGNAL(endClicked())); grid->addWidget(forwardButton, c, 4, 1, 1); for(c = 0; c < 5; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_PROGRAMMING && !binButton) { grid = new QGridLayout(keypadP); grid->setContentsMargins(0, 0, 0, 0); BASE_BUTTON("BIN", 2, 0, 0); binButton = button; BASE_BUTTON("OCT", 8, 0, 1); octButton = button; BASE_BUTTON("DEC", 10, 0, 2); decButton = button; BASE_BUTTON("HEX", 16, 0, 3); hexButton = button; box = new QHBoxLayout(); SYMBOL_BUTTON_BOX("A"); aButton = button; SYMBOL_BUTTON_BOX("B"); bButton = button; SYMBOL_BUTTON_BOX("C"); cButton = button; SYMBOL_BUTTON_BOX("D"); dButton = button; SYMBOL_BUTTON_BOX("E"); eButton = button; SYMBOL_BUTTON_BOX("F"); fButton = button; updateBase(); grid->addLayout(box, 1, 0, 1, 4); OPERATOR_BUTTON2("&", "&&", 2, 0); button->setText("AND"); button->setToolTip(tr("Bitwise AND"), tr("Logical AND")); OPERATOR_BUTTON2("|", "||", 2, 1); button->setText("OR"); button->setToolTip(tr("Bitwise OR"), tr("Logical OR")); OPERATOR_BUTTON("xor", 2, 2); button->setText("XOR"); button->setToolTip(tr("Bitwise Exclusive OR")); OPERATOR_BUTTON2("~", "NOT", 2, 3); button->setText("NOT"); button->setToolTip(tr("Bitwise NOT"), tr("Logical NOT")); OPERATOR_BUTTON("<<", 3, 0); button->setToolTip(tr("Bitwise Left Shift")); OPERATOR_BUTTON(">>", 3, 1); button->setToolTip(tr("Bitwise Right Shift")); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_BIT_CMP), tr("cmp"), 3, 2); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_CIRCULAR_SHIFT), tr("rot"), 3, 3); OPERATOR_BUTTON2("mod", "rem", 4, 0); button->setText("mod"); button->setToolTip(QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_REM)->title(true, settings->printops.use_unicode_signs))); OPERATOR_BUTTON("//", 4, 1); button->setText("div"); f = CALCULATOR->getActiveFunction("div"); if(f) button->setToolTip(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); f = CALCULATOR->getActiveFunction("log10"); f2 = CALCULATOR->getActiveFunction("log2"); if(f && f2) { ITEM_BUTTON2(f2, f, "log2", 4, 2); } else { ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), "ln", 4, 2); } ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_ASCII), CALCULATOR->getFunctionById(FUNCTION_ID_CHAR), tr("a→1"), 4, 3); for(c = 0; c < 4; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_ALGEBRA && !xButton) { grid = new QGridLayout(keypadX); grid->setContentsMargins(0, 0, 0, 0); for(size_t i = 0; i < 3; i++) { SYMBOL_BUTTON((i == 0 ? "x" : (i == 1 ? "y" : "z")), 0, i); if(i == 0) xButton = button; int id = 0; if(i == 0) id = VARIABLE_ID_X; else if(i == 1) id = VARIABLE_ID_Y; else if(i == 2) id = VARIABLE_ID_Z; QFont ifont(button->font()); ifont.setStyle(QFont::StyleItalic); button->setFont(ifont); menu = new QMenu(this); button->setMenu(menu); connect(menu, SIGNAL(aboutToShow()), this, SLOT(updateAssumptions())); menu->setProperty(BUTTON_DATA, id); } SYMBOL_BUTTON("n", 0, 3); SYMBOL_BUTTON2("=", SIGN_NOT_EQUAL, 1, 2); SYMBOL_BUTTON("/.", 1, 3); button->setToolTip(QString::fromStdString(CALCULATOR->localWhereString())); SYMBOL_BUTTON("<", 2, 0); SYMBOL_BUTTON(SIGN_LESS_OR_EQUAL, 2, 1); SYMBOL_BUTTON(">", 2, 2); SYMBOL_BUTTON(SIGN_GREATER_OR_EQUAL, 2, 3); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SUM), CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT), "∑", 3, 0); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_DIFFERENTIATE), CALCULATOR->getFunctionById(FUNCTION_ID_D_SOLVE), "d/dx", 3, 1); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_INTEGRATE), "∫", 3, 2); button = new KeypadButton("a(x)b", this); connect(button, SIGNAL(clicked()), this, SIGNAL(factorizeClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(expandClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(expandPartialFractionsClicked())); button->setToolTip(tr("Factorize"), tr("Expand"), tr("Expand partial fractions")); grid->addWidget(button, 3, 3); ITEM_BUTTON(CALCULATOR->getVariableById(VARIABLE_ID_PI), SIGN_PI, 1, 0); ITEM_BUTTON2(CALCULATOR->getVariableById(VARIABLE_ID_E), CALCULATOR->getFunctionById(FUNCTION_ID_EXP), "e", 1, 1); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_SQRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), SIGN_SQRT, 4, 0); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_CBRT), CALCULATOR->getFunctionById(FUNCTION_ID_ROOT), "∛", 4, 1); ITEM_BUTTON2(CALCULATOR->getFunctionById(FUNCTION_ID_LOG), CALCULATOR->getFunctionById(FUNCTION_ID_LOGN), "ln", 4, 2); ITEM_BUTTON(CALCULATOR->getFunctionById(FUNCTION_ID_ABS), "|x|", 4, 3); for(c = 0; c < 4; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 5; r++) grid->setRowStretch(r, 1); } else if(i == KEYPAD_CUSTOM && !customEditButton) { grid = new QGridLayout(keypadC); grid->setContentsMargins(0, 0, 0, 0); customGrid = grid; customEditButton = new KeypadButton(LOAD_COLORED_ICON("document-edit"), this); customEditButton->setCheckable(true); menu = new QMenu(this); addColumnAction = menu->addAction(tr("Add column"), this, SLOT(addCustomColumn())); addColumnAction->setEnabled(settings->custom_button_columns < 100); addRowAction = menu->addAction(tr("Add row"), this, SLOT(addCustomRow())); addRowAction->setEnabled(settings->custom_button_rows < 100); removeColumnAction = menu->addAction(tr("Remove column"), this, SLOT(removeCustomColumn())); removeColumnAction->setEnabled(settings->custom_button_columns > 1); removeRowAction = menu->addAction(tr("Remove row"), this, SLOT(removeCustomRow())); removeRowAction->setEnabled(settings->custom_button_rows > 1); customEditButton->setMenu(menu); customEditButton->setPopupMode(QToolButton::MenuButtonPopup); connect(customEditButton, SIGNAL(toggled(bool)), this, SLOT(onCustomEditClicked(bool))); grid->addWidget(customEditButton, 0, 0); customButtons.resize(settings->custom_button_columns); for(c = 0; c < settings->custom_button_columns; c++) { customButtons[c].resize(settings->custom_button_rows); for(int r = 0; r < settings->custom_button_rows; r++) { if(c == 0 && r == 0) { customButtons[c][r] = NULL; } else { button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); grid->addWidget(button, r, c); customButtons[c][r] = button; } grid->setRowStretch(r, 1); } grid->setColumnStretch(c, 1); } for(size_t i = 0; i < settings->custom_buttons.size();) { custom_button *cb = &settings->custom_buttons[i]; if(cb->c > 0 && cb->r > 0 && (cb->c != 1 || cb->r != 1) && cb->c <= customButtons.size() && cb->r <= customButtons[cb->c - 1].size()) { button = customButtons[cb->c - 1][cb->r - 1]; if(button) { if(cb->label.contains("setRichText(cb->label); else button->setText(cb->label); button->setProperty(BUTTON_DATA, cb->type[0]); button->setProperty(BUTTON_VALUE, QString::fromStdString(cb->value[0])); button->setProperty(BUTTON_DATA2, cb->type[1]); button->setProperty(BUTTON_VALUE2, QString::fromStdString(cb->value[1])); button->setProperty(BUTTON_DATA3, cb->type[2]); button->setProperty(BUTTON_VALUE3, QString::fromStdString(cb->value[2])); button->setToolTip(settings->shortcutText(cb->type[0], cb->value[0]), settings->shortcutText(cb->type[1], cb->value[1]), settings->shortcutText(cb->type[2], cb->value[2])); } i++; } else if(cb->c > 0) { settings->custom_buttons.erase(settings->custom_buttons.begin() + i); } else { i++; } } b_edit = false; } else if(i == KEYPAD_NUMBERPAD && !acButton[1]) { createNumpad(keypadN, 1); } } void KeypadWidget::updateButtonLocation() { KeypadButton *button, *prev_parbutton = parButton; QMenu *menu; if(settings->show_percent_in_numpad) { if(percentButton && keypadG->layout()) { QGridLayout *grid = (QGridLayout*) keypadG->layout(); percentButton->deleteLater(); percentButton = NULL; button = new KeypadButton("(x)", this); button->setToolTip(tr("Smart parentheses"), tr("Vector brackets")); connect(button, SIGNAL(clicked()), this, SIGNAL(parenthesesClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(bracketsClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(bracketsClicked())); grid->removeWidget(unitButton); grid->addWidget(button, 4, 2, 1, 1); grid->addWidget(unitButton, 4, 1, 1, 1); parButton = button; } if(prev_parbutton && (settings->hide_numpad ? keypadN->layout() : numpad->layout())) { QGridLayout *grid = (QGridLayout*) (settings->hide_numpad ? keypadN->layout() : numpad->layout()); prev_parbutton->deleteLater(); if(parButton == prev_parbutton) parButton = NULL; SYMBOL_BUTTON2("%", "‰", 0, 0); button->setToolTip(tr("Percent or remainder"), QString::fromStdString(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)->title(true, settings->printops.use_unicode_signs))); percentButton = button; } } else { if(percentButton && (settings->hide_numpad ? keypadN->layout() : numpad->layout())) { QGridLayout *grid = (QGridLayout*) (settings->hide_numpad ? keypadN->layout() : numpad->layout()); percentButton->deleteLater(); percentButton = NULL; button = new KeypadButton("(x)", this); button->setToolTip(tr("Smart parentheses"), tr("Vector brackets")); connect(button, SIGNAL(clicked()), this, SIGNAL(parenthesesClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(bracketsClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(bracketsClicked())); grid->addWidget(button, 0, 0, 1, 1); parButton = button; } if(prev_parbutton && keypadG->layout()) { QGridLayout *grid = (QGridLayout*) keypadG->layout(); prev_parbutton->deleteLater(); if(parButton == prev_parbutton) parButton = NULL; grid->removeWidget(unitButton); SYMBOL_BUTTON2("%", "‰", 4, 1); grid->addWidget(unitButton, 4, 2, 1, 1); button->setToolTip(tr("Percent or remainder"), QString::fromStdString(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)->title(true, settings->printops.use_unicode_signs))); CREATE_MENU connect(menu, SIGNAL(aboutToShow()), this, SLOT(updatePercentageMenu())); percentButton = button; } } } void KeypadWidget::createNumpad(QWidget *w, int i) { if(acButton[i]) return; KeypadButton *button; MathFunction *f, *f2; QGridLayout *grid = new QGridLayout(w); grid->setContentsMargins(0, 0, 0, 0); int c = 0; SYMBOL_BUTTON2("(", "[", 1, c) button->setToolTip(tr("Left parenthesis"), tr("Left vector bracket")); SYMBOL_BUTTON2(")", "]", 2, c) button->setToolTip(tr("Right parenthesis"), tr("Right vector bracket")); if(settings->show_percent_in_numpad) { SYMBOL_BUTTON2("%", "‰", 0, c); button->setToolTip(tr("Percent or remainder"), QString::fromStdString(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)->title(true, settings->printops.use_unicode_signs))); percentButton = button; } else { button = new KeypadButton("(x)", this); button->setToolTip(tr("Smart parentheses"), tr("Vector brackets")); connect(button, SIGNAL(clicked()), this, SIGNAL(parenthesesClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(bracketsClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(bracketsClicked())); grid->addWidget(button, 0, c, 1, 1); parButton = button; } SYMBOL_BUTTON3(QString::fromStdString(CALCULATOR->getComma()), " ", "\n", 3, c) button->setToolTip(tr("Argument separator"), tr("Blank space"), tr("New line")); commaButton[i] = button; c++; SYMBOL_OPERATOR_SYMBOL_BUTTON("0", "â�°", "°", 3, c) button->setToolTip(QString(), "x0", QString::fromStdString(CALCULATOR->getDegUnit()->title(true, settings->printops.use_unicode_signs))); f = CALCULATOR->getActiveFunction("inv"); if(f) { SYMBOL_OPERATOR_ITEM_BUTTON("1", "¹", f, 2, c) button->setToolTip(QString(), "x1", "1/x"); } else { SYMBOL_OPERATOR_SYMBOL_BUTTON("1", "¹", "¹", 2, c) button->setToolTip(QString(), "x1"); } SYMBOL_OPERATOR_SYMBOL_BUTTON("4", "â�´", "¼", 1, c) button->setToolTip(QString(), "x4", "1/4"); SYMBOL_OPERATOR_SYMBOL_BUTTON("7", "â�·", "â…�", 0, c) button->setToolTip(QString(), "x7", "1/7"); c++; SYMBOL_BUTTON3(QString::fromStdString(CALCULATOR->getDecimalPoint()), " ", "\n", 3, c) button->setToolTip(tr("Decimal point"), tr("Blank space"), tr("New line")); dotButton[i] = button; SYMBOL_OPERATOR_SYMBOL_BUTTON("2", "²", "½", 2, c) button->setToolTip(QString(), "x2", "1/2"); SYMBOL_OPERATOR_SYMBOL_BUTTON("5", "â�µ", "â…•", 1, c) button->setToolTip(QString(), "x5", "1/5"); SYMBOL_OPERATOR_SYMBOL_BUTTON("8", "â�¸", "â…›", 0, c) button->setToolTip(QString(), "x8", "1/8"); c++; SYMBOL_OPERATOR_SYMBOL_BUTTON("3", "³", "â…“", 2, c) button->setToolTip(QString(), "x3", "1/3"); SYMBOL_OPERATOR_SYMBOL_BUTTON("6", "â�¶", "â…™", 1, c) button->setToolTip(QString(), "x6", "1/6"); SYMBOL_OPERATOR_SYMBOL_BUTTON("9", "â�¹", "â…‘", 0, c) button->setToolTip(QString(), "x9", "1/9"); f = CALCULATOR->getActiveFunction("exp10"); f2 = CALCULATOR->getActiveFunction("exp2"); if(f && f2) { OPERATOR_ITEM2_BUTTON("E", f, f2, 3, c); button->setToolTip("10x", QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)), QString::fromStdString(f2->title(true, settings->printops.use_unicode_signs))); } else { OPERATOR_BUTTON("E", 3, c); button->setToolTip("10x"); } button->setText("EXP"); c++; ITEM_BUTTON(settings->vans[0], "ANS", 3, c); button = new KeypadButton("ANS", this); button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) settings->vans[0])); \ button->setToolTip(QString::fromStdString(settings->vans[0]->title(true, settings->printops.use_unicode_signs)), tr("Previous result (static)")); connect(button, SIGNAL(clicked()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(answerClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(answerClicked())); grid->addWidget(button, 3, c, 1, 1); OPERATOR_BUTTON3(settings->multiplicationSign(), "&", "<<", 1, c); button->setToolTip(tr("Multiplication"), tr("Bitwise AND"), tr("Bitwise Shift")); multiplicationButton[i] = button; //: Standard calculator button. Do not use more than three characters. button = new KeypadButton(tr("DEL"), this, true); connect(button, SIGNAL(clicked()), this, SIGNAL(delClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(backspaceClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(backspaceClicked())); button->setToolTip(tr("Delete"), tr("Backspace")); grid->addWidget(button, 0, c, 1, 1); delButton[i] = button; OPERATOR_SYMBOL_BUTTON("+", "+", 2, c); button->setToolTip(tr("Addition"), tr("Plus")); c++; f = CALCULATOR->getActiveFunction("neg"); if(f) { OPERATOR_ITEM_SYMBOL_BUTTON(SIGN_MINUS, f, SIGN_MINUS, 2, c); button->setToolTip(tr("Subtraction"), QString::fromStdString(f->title(true, settings->printops.use_unicode_signs)) + " (" + QKeySequence(Qt::CTRL | Qt::Key_Minus).toString(QKeySequence::NativeText) + ")", tr("Minus")); } else { OPERATOR_SYMBOL_BUTTON(SIGN_MINUS, SIGN_MINUS, 2, c); button->setToolTip(tr("Subtraction"), tr("Minus")); } OPERATOR_BUTTON3(settings->divisionSign(), "|", "~", 1, c); divisionButton[i] = button; button->setProperty(BUTTON_DATA, settings->divisionSign(false)); button->setToolTip(tr("Division"), tr("Bitwise OR"), tr("Bitwise NOT")); //: Standard calculator button. Do not use more than three characters. button = new KeypadButton(tr("C"), this); button->setToolTip(tr("Clear expression")); connect(button, SIGNAL(clicked()), this, SIGNAL(clearClicked())); connect(button, SIGNAL(clicked2()), this, SIGNAL(clearClicked())); connect(button, SIGNAL(clicked3()), this, SIGNAL(clearClicked())); grid->addWidget(button, 0, c, 1, 1); acButton[i] = button; button = new KeypadButton("=", this); button->setToolTip(tr("Calculate expression"), QString::fromStdString(CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE)->title(true, settings->printops.use_unicode_signs))); button->setProperty(BUTTON_DATA, QVariant::fromValue((void*) CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE))); \ connect(button, SIGNAL(clicked()), this, SIGNAL(equalsClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onItemButtonClicked())); connect(button, SIGNAL(clicked3()), this, SLOT(onItemButtonClicked())); grid->addWidget(button, 3, c, 1, 1); for(c = 0; c < 6; c++) grid->setColumnStretch(c, 1); for(int r = 0; r < 4; r++) grid->setRowStretch(r, 1); } void KeypadWidget::createCustomButtonColumn() { if(customEditButton2) return; KeypadButton *button; QGridLayout *grid = new QGridLayout(customButtonColumn); grid->setContentsMargins(0, 0, grid->spacing(), 0); customGrid2 = grid; customEditButton2 = new KeypadButton(LOAD_COLORED_ICON("document-edit"), this); customEditButton2->setCheckable(true); connect(customEditButton2, SIGNAL(toggled(bool)), this, SLOT(onCustomEdit2Clicked(bool))); grid->addWidget(customEditButton2, 4, 0); customButtons2.resize(4); for(int r = 0; r < 4; r++) { button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButton2Clicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButton2Clicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButton2Clicked3())); grid->addWidget(button, r, 0); customButtons2[r] = button; grid->setRowStretch(r, 1); } for(size_t i = 0; i < settings->custom_buttons.size();) { custom_button *cb = &settings->custom_buttons[i]; if(cb->c == 0 && cb->r <= customButtons2.size()) { button = customButtons2[cb->r - 1]; if(button) { if(cb->label.contains("setRichText(cb->label); else button->setText(cb->label); button->setProperty(BUTTON_DATA, cb->type[0]); button->setProperty(BUTTON_VALUE, QString::fromStdString(cb->value[0])); button->setProperty(BUTTON_DATA2, cb->type[1]); button->setProperty(BUTTON_VALUE2, QString::fromStdString(cb->value[1])); button->setProperty(BUTTON_DATA3, cb->type[2]); button->setProperty(BUTTON_VALUE3, QString::fromStdString(cb->value[2])); button->setToolTip(settings->shortcutText(cb->type[0], cb->value[0]), settings->shortcutText(cb->type[1], cb->value[1]), settings->shortcutText(cb->type[2], cb->value[2])); } i++; } else if(cb->c == 0) { settings->custom_buttons.erase(settings->custom_buttons.begin() + i); } else { i++; } } b_edit2 = false; } KeypadWidget::KeypadWidget(QWidget *parent) : QWidget(parent) { QHBoxLayout *box = new QHBoxLayout(this); leftStack = new QStackedLayout(); box->addLayout(leftStack, 11); box->addSpacing(box->spacing()); customButtonColumn = new QWidget(this); if(!settings->show_custom_keypad_column) customButtonColumn->hide(); box->addWidget(customButtonColumn, 1); numpad = new QWidget(this); if(settings->hide_numpad) numpad->hide(); box->addWidget(numpad, 12); keypadG = new QWidget(this); leftStack->addWidget(keypadG); keypadP = new QWidget(this); leftStack->addWidget(keypadP); keypadX = new QWidget(this); leftStack->addWidget(keypadX); keypadC = new QWidget(this); leftStack->addWidget(keypadC); keypadN = new QWidget(this); leftStack->addWidget(keypadN); sinButton = NULL; cosButton = NULL; tanButton = NULL; delButton[0] = NULL; delButton[1] = NULL; acButton[0] = NULL; acButton[1] = NULL; backButton = NULL; forwardButton = NULL; dotButton[0] = NULL; commaButton[0] = NULL; multiplicationButton[0] = NULL; divisionButton[0] = NULL; dotButton[1] = NULL; commaButton[1] = NULL; multiplicationButton[1] = NULL; divisionButton[1] = NULL; imaginaryButton = NULL; binButton = NULL; octButton = NULL; decButton = NULL; hexButton = NULL; aButton = NULL; bButton = NULL; cButton = NULL; dButton = NULL; eButton = NULL; fButton = NULL; unitButton = NULL; storeButton = NULL; customOKButton = NULL; customEditButton = NULL; customEditButton2 = NULL; customGrid = NULL; customGrid2 = NULL; xButton = NULL; percentButton = NULL; parButton = NULL; updateStretch(); setKeypadType(settings->keypad_type); } KeypadWidget::~KeypadWidget() {} void KeypadWidget::updateSinMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SIN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ASIN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ASINH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("csc")) MENU_ITEM(CALCULATOR->getActiveFunction("csch")) MENU_ITEM(CALCULATOR->getActiveFunction("arccsc")) MENU_ITEM(CALCULATOR->getActiveFunction("arcsch")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINC)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SININT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SINHINT)) } } void KeypadWidget::updateCosMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COS)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ACOS)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ACOSH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("sec")) MENU_ITEM(CALCULATOR->getActiveFunction("sech")) MENU_ITEM(CALCULATOR->getActiveFunction("arcsec")) MENU_ITEM(CALCULATOR->getActiveFunction("arsech")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSINT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_COSHINT)) } } void KeypadWidget::updateTanMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_TAN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_TANH)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATAN)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATANH)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("cot")) MENU_ITEM(CALCULATOR->getActiveFunction("coth")) MENU_ITEM(CALCULATOR->getActiveFunction("arccot")) MENU_ITEM(CALCULATOR->getActiveFunction("arcoth")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ATAN2)) } } void KeypadWidget::updatePiMenu() { QMenu *menu = qobject_cast(sender()); QAction *action; if(menu->isEmpty()) { QMap map; Variable *v[9]; v[0] = CALCULATOR->getActiveVariable("apery"); v[1] = CALCULATOR->getVariableById(VARIABLE_ID_CATALAN); v[2] = CALCULATOR->getVariableById(VARIABLE_ID_EULER); v[3] = CALCULATOR->getActiveVariable("golden"); v[4] = CALCULATOR->getActiveVariable("omega"); v[5] = CALCULATOR->getActiveVariable("plastic"); v[6] = CALCULATOR->getActiveVariable("pythagoras"); for(size_t i = 0; i < 7; i++) { if(v[i]) map[QString::fromStdString(v[i]->title(true, settings->printops.use_unicode_signs))] = v[i]; } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } menu->addSeparator(); map.clear(); v[0] = CALCULATOR->getActiveVariable("c"); v[1] = CALCULATOR->getActiveVariable("newtonian_constant"); v[2] = CALCULATOR->getActiveVariable("planck"); v[3] = CALCULATOR->getActiveVariable("boltzmann"); v[4] = CALCULATOR->getActiveVariable("avogadro"); v[5] = CALCULATOR->getActiveVariable("magnetic_constant"); v[6] = CALCULATOR->getActiveVariable("electric_constant"); v[7] = CALCULATOR->getActiveVariable("characteristic_impedance"); v[8] = CALCULATOR->getActiveVariable("standard_gravity"); for(size_t i = 0; i < 9; i++) { if(v[i]) map[QString::fromStdString(v[i]->title(true, settings->printops.use_unicode_signs))] = v[i]; } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } menu->addSeparator(); action = menu->addAction(tr("Enable units in physical constants"), this, SLOT(variableUnitsActivated())); action->setCheckable(true); action->setObjectName("action_variable_units"); menu->addSeparator(); menu->addAction(tr("All constants"), this, SIGNAL(openVariablesRequest())); } action = findChild("action_variable_units"); if(action) action->setChecked(CALCULATOR->variableUnitsEnabled()); } void KeypadWidget::updateLnMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getActiveFunction("log10")) MENU_ITEM(CALCULATOR->getActiveFunction("log2")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LOGN)) menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LOGINT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_POLYLOG)) } } void KeypadWidget::updateSqrtMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_CBRT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ROOT)) MENU_ITEM(CALCULATOR->getActiveFunction("sqrtpi")) } } void KeypadWidget::updatePowerMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SQUARE)) MENU_ITEM(CALCULATOR->getActiveFunction("exp10")) MENU_ITEM(CALCULATOR->getActiveFunction("exp2")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LAMBERT_W)) } } void KeypadWidget::updateEMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_EXP)) MENU_ITEM(CALCULATOR->getActiveFunction("cis")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_EXPINT)) } } void KeypadWidget::updateFactorialMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_GAMMA)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DOUBLE_FACTORIAL)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_MULTI_FACTORIAL)) MENU_ITEM(CALCULATOR->getActiveFunction("hyperfactorial")) MENU_ITEM(CALCULATOR->getActiveFunction("superfactorial")) menu->addSeparator(); MENU_ITEM(CALCULATOR->getActiveFunction("perm")) MENU_ITEM(CALCULATOR->getActiveFunction("comb")) MENU_ITEM(CALCULATOR->getActiveFunction("derangement")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_BINOMIAL)) } } void KeypadWidget::updateSumMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_PRODUCT)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_FOR)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_IF)) } } void KeypadWidget::updateXMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); QAction *action; QMap map; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->isKnown() && !CALCULATOR->variables[i]->isHidden() && CALCULATOR->variables[i]->isActive() && CALCULATOR->variables[i] != CALCULATOR->getVariableById(VARIABLE_ID_X)) { map[QString::fromStdString(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs))] = CALCULATOR->variables[i]; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } } void KeypadWidget::updateEqualsMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_SYMBOL(SIGN_NOT_EQUAL); MENU_SYMBOL("<"); MENU_SYMBOL(SIGN_LESS_OR_EQUAL); MENU_SYMBOL(">"); MENU_SYMBOL(SIGN_GREATER_OR_EQUAL); menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SOLVE)) MENU_ITEM(CALCULATOR->getActiveFunction("solve2")) MENU_ITEM(CALCULATOR->getActiveFunction("linearfunction")) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_D_SOLVE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_NEWTON_RAPHSON)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_SECANT_METHOD)) } } void KeypadWidget::updateFactorizeMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; menu->addAction(tr("Expand"), this, SIGNAL(expandClicked())); menu->addAction(tr("Expand partial fractions"), this, SIGNAL(expandPartialFractionsClicked())); menu->addSeparator(); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DIFFERENTIATE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_INTEGRATE)) } } void KeypadWidget::updatePercentageMenu() { QMenu *menu = qobject_cast(sender()); if(menu->isEmpty()) { ExpressionItem *item; QAction *action; MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_REM)); MENU_ITEM(CALCULATOR->getFunction("div")); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ABS)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_GCD)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_LCM)); MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_DIVISORS)); menu->addSeparator(); MENU_ITEM(CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE)); MENU_ITEM(CALCULATOR->getVariableById(VARIABLE_ID_PERMYRIAD)); menu->addSeparator(); action = menu->addAction(tr("Percentage Calculation Tool"), this, SIGNAL(openPercentageCalculationRequest())); } } void KeypadWidget::updateUnitsMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); ExpressionItem *item; QAction *action; QMap map, map2; const char *si_units[] = {"m", "g", "s", "A", "K", "J", "W", "L", "V", "ohm", "N", "Pa", "C", "F", "S", "oC", "Hz", "cd", "mol", "Wb", "T", "H", "lm", "lx", "Bq", "Gy", "Sv", "kat"}; size_t n = 0; for(size_t i = 0; i < 5 && i < settings->recent_units.size(); i++) { item = settings->recent_units[i]; action = menu->addAction(QString::fromStdString(item->title(true, settings->printops.use_unicode_signs)), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) item)); n++; } if(n > 0) menu->addSeparator(); for(size_t i = 0; i < 28; i++) { item = CALCULATOR->getActiveUnit(si_units[i]); for(size_t i = 0; item && i < 5 && i < settings->recent_units.size(); i++) { if(item == settings->recent_units[i]) { item = NULL; break; } } if(item) { if(n >= 15) map2[QString::fromStdString(item->title(true, settings->printops.use_unicode_signs))] = item; else map[QString::fromStdString(item->title(true, settings->printops.use_unicode_signs))] = item; n++; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } if(!map2.isEmpty()) { QMenu *menu2 = menu->addMenu(tr("more")); for(QMap::const_iterator it = map2.constBegin(); it != map2.constEnd(); ++it) { action = menu2->addAction(it.key(), this, SLOT(onUnitItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } } menu->addSeparator(); for(int i = -9; i <= 12; i += 3) { Prefix *p = CALCULATOR->getExactDecimalPrefix(i); if(p) { action = menu->addAction(QString::fromStdString(p->longName(true, true)), this, SLOT(onPrefixItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) p)); } } QMenu *menu2 = menu->addMenu(tr("more")); for(int i = -30; i <= 30; i += 3) { if(i == -9) i = -2; else if(i == 1) i = -1; else if(i == 2) i = 1; else if(i == 4) i = 2; else if(i == 5) i = 15; Prefix *p = CALCULATOR->getExactDecimalPrefix(i); if(p) { action = menu2->addAction(QString::fromStdString(p->longName(true, true)), this, SLOT(onPrefixItemClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) p)); } } menu->addSeparator(); menu->addAction(tr("All units"), this, SIGNAL(openUnitsRequest())); } void KeypadWidget::updateStoreMenu() { QMenu *menu = qobject_cast(sender()); menu->clear(); QAction *action; QMap map; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal()) { map[QString::fromStdString(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs))] = CALCULATOR->variables[i]; } } for(QMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) { action = menu->addAction(it.key(), this, SLOT(onItemButtonClicked())); action->setProperty(BUTTON_DATA, QVariant::fromValue((void*) it.value())); } if(!map.isEmpty()) menu->addSeparator(); menu->addAction(tr("All variables"), this, SIGNAL(openVariablesRequest())); } void KeypadWidget::updateCustomActionOK() { QTreeWidgetItem *item = actionList->currentItem(); customOKButton->setEnabled(item && (item->data(0, Qt::UserRole).toInt() < 0 || ((!labelEdit || !labelEdit->text().trimmed().isEmpty()) && (!SHORTCUT_REQUIRES_VALUE(item->data(0, Qt::UserRole).toInt()) || !valueEdit->currentText().isEmpty())))); } void KeypadWidget::customActionOKClicked() { QString value = valueEdit->currentText(); QTreeWidgetItem *item = actionList->currentItem(); if(!item) return; if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, customActionDialog)) { customActionDialog->accept(); } else { valueEdit->setFocus(); } valueEdit->setCurrentText(value); } void KeypadWidget::currentCustomActionChanged(QTreeWidgetItem *item, QTreeWidgetItem *item_prev) { if(!item || !SHORTCUT_USES_VALUE(item->data(0, Qt::UserRole).toInt())) { valueEdit->clear(); valueEdit->clearEditText(); valueEdit->setEnabled(false); valueLabel->setEnabled(false); return; } int i = item->data(0, Qt::UserRole).toInt(); int i_prev = -1; if(item_prev) i_prev = item_prev->data(0, Qt::UserRole).toInt(); valueEdit->setEnabled(true); valueLabel->setEnabled(true); if(i == SHORTCUT_TYPE_FUNCTION || i == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { if(i_prev != SHORTCUT_TYPE_FUNCTION && i_prev != SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { valueEdit->clear(); QStringList citems; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive() && !f->isHidden()) citems << QString::fromStdString(f->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); valueEdit->clearEditText(); } } else { valueEdit->clear(); if(i == SHORTCUT_TYPE_UNIT || i == SHORTCUT_TYPE_CONVERT_TO) { QStringList citems; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive() && !u->isHidden()) citems << QString::fromStdString(u->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_VARIABLE) { QStringList citems; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive() && !v->isHidden()) citems << QString::fromStdString(v->referenceName()); } citems.sort(Qt::CaseInsensitive); valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_OPERATOR) { QStringList citems; citems << "+" << (settings->printops.use_unicode_signs ? SIGN_MINUS : "-") << settings->multiplicationSign(false) << settings->divisionSign(false) << "^" << ".+" << (QStringLiteral(".") + (settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) << (QStringLiteral(".") + settings->multiplicationSign(false)) << (QStringLiteral(".") + settings->divisionSign(false)) << ".^" << "mod" << "rem" << "//" << "&" << "|" << "<<" << ">>" << "&&" << "||" << "xor" << "=" << SIGN_NOT_EQUAL << "<" << SIGN_LESS_OR_EQUAL << SIGN_GREATER_OR_EQUAL << ">"; valueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_COPY_RESULT) { settings->updateActionValueTexts(); valueEdit->addItems(settings->copy_action_value_texts); } if(i == SHORTCUT_TYPE_COPY_RESULT) valueEdit->setCurrentText(settings->copy_action_value_texts[0]); else valueEdit->clearEditText(); } } void KeypadWidget::editCustomAction(KeypadButton *button, int i) { if(i < 1 || i > 3) return; QDialog *dialog = new QDialog(this); customActionDialog = dialog; if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Button Action")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); if(i == 1) { grid->addWidget(new QLabel(tr("Label:"), dialog), 0, 0); labelEdit = new QLineEdit(dialog); labelEdit->setText(button->richText().isEmpty() ? button->text() : button->richText()); grid->addWidget(labelEdit, 0, 1); } else { labelEdit = NULL; } actionList = new QTreeWidget(dialog); actionList->setColumnCount(1); actionList->setHeaderLabel(tr("Action")); actionList->setSelectionMode(QAbstractItemView::SingleSelection); actionList->setRootIsDecorated(false); actionList->header()->setVisible(true); actionList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); actionList->setSortingEnabled(true); actionList->sortByColumn(-1, Qt::AscendingOrder); grid->addWidget(actionList, i != 1 ? 0 : 1, 0, 1, 2); int type = -1; if(button->property(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA)).isValid()) type = button->property(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA)).toInt(); QTreeWidgetItem *item = new QTreeWidgetItem(actionList, QStringList(tr("None"))); item->setData(0, Qt::UserRole, -1); actionList->setCurrentItem(item); for(int i = SHORTCUT_TYPE_FUNCTION; i <= SHORTCUT_TYPE_QUIT; i++) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) i))); item->setData(0, Qt::UserRole, i); if(i == type) actionList->setCurrentItem(item); if(i == SHORTCUT_TYPE_HISTORY_SEARCH) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) SHORTCUT_TYPE_HISTORY_CLEAR))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_HISTORY_CLEAR); if(type == SHORTCUT_TYPE_HISTORY_CLEAR) actionList->setCurrentItem(item); } else if(i == SHORTCUT_TYPE_APPROXIMATE) { item = new QTreeWidgetItem(actionList, QStringList(settings->shortcutTypeText((shortcut_type) SHORTCUT_TYPE_TOGGLE_FRACTION))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_TOGGLE_FRACTION); if(type == SHORTCUT_TYPE_TOGGLE_FRACTION) actionList->setCurrentItem(item); } } valueLabel = new QLabel(tr("Value:"), dialog); grid->addWidget(valueLabel, i != 1 ? 1 : 2, 0); valueEdit = new QComboBox(dialog); valueEdit->setEditable(true); valueEdit->setLineEdit(new MathLineEdit()); grid->addWidget(valueEdit, i != 1 ? 1 : 2, 1); grid->setColumnStretch(1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(customActionOKClicked())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(labelEdit) connect(labelEdit, SIGNAL(textEdited(const QString&)), this, SLOT(updateCustomActionOK())); connect(actionList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(updateCustomActionOK())); connect(actionList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentCustomActionChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(valueEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(updateCustomActionOK())); customOKButton = buttonBox->button(QDialogButtonBox::Ok); currentCustomActionChanged(actionList->currentItem(), NULL); if(button->property(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE)).isValid()) { QString value = button->property(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE)).toString(); if(type == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) valueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { valueEdit->setCurrentText(value); } } customOKButton->setEnabled(false); if(labelEdit) labelEdit->setFocus(); else actionList->setFocus(); dialog->resize(dialog->sizeHint().width(), dialog->sizeHint().width() * 1.25); if(dialog->exec() == QDialog::Accepted) { int c = 0, r = 0, cs = 0, rs = 0; int grid_i = -1; if(customGrid) grid_i = customGrid->indexOf(button); if(grid_i >= 0) { customGrid->getItemPosition(grid_i, &r, &c, &rs, &cs); c++; r++; } else if(customGrid2) { grid_i = customGrid2->indexOf(button); if(grid_i >= 0) { customGrid2->getItemPosition(grid_i, &r, &c, &rs, &cs); r++; } } size_t index = 0; for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r && settings->custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; settings->custom_buttons.push_back(cb); index = settings->custom_buttons.size(); } index--; custom_button *cb = &settings->custom_buttons[index]; cb->type[i - 1] = actionList->currentItem()->data(0, Qt::UserRole).toInt(); cb->value[i - 1] = valueEdit->currentText().toStdString(); button->setProperty(i == 2 ? BUTTON_DATA2 : (i == 3 ? BUTTON_DATA3 : BUTTON_DATA), actionList->currentItem()->data(0, Qt::UserRole).toInt()); button->setProperty(i == 2 ? BUTTON_VALUE2 : (i == 3 ? BUTTON_VALUE3 : BUTTON_VALUE), valueEdit->currentText()); button->setToolTip(settings->shortcutText(cb->type[0], cb->value[0]), settings->shortcutText(cb->type[1], cb->value[1]), settings->shortcutText(cb->type[2], cb->value[2])); if(labelEdit) { settings->custom_buttons[index].label = labelEdit->text().trimmed(); if(labelEdit->text().contains("setRichText(labelEdit->text().trimmed()); else button->setText(labelEdit->text()); } } dialog->deleteLater(); } void KeypadWidget::onCustomEditClicked(bool b) { b_edit = b; } void KeypadWidget::onCustomEdit2Clicked(bool b) { b_edit2 = b; } void KeypadWidget::addCustomRow() { settings->custom_button_rows++; int r = settings->custom_button_rows - 1; for(int c = 0; c < settings->custom_button_columns; c++) { customButtons[c].resize(settings->custom_button_rows); KeypadButton *button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); customGrid->addWidget(button, r, c); customButtons[c][r] = button; customGrid->setRowStretch(r, 1); } addRowAction->setEnabled(settings->custom_button_rows < 100); removeRowAction->setEnabled(true); } void KeypadWidget::addCustomColumn() { settings->custom_button_columns++; customButtons.resize(settings->custom_button_columns); int c = settings->custom_button_columns - 1; customButtons[c].resize(settings->custom_button_rows); for(int r = 0; r < settings->custom_button_rows; r++) { KeypadButton *button = new KeypadButton(QString(), this); connect(button, SIGNAL(clicked()), this, SLOT(onCustomButtonClicked())); connect(button, SIGNAL(clicked2()), this, SLOT(onCustomButtonClicked2())); connect(button, SIGNAL(clicked3()), this, SLOT(onCustomButtonClicked3())); customGrid->addWidget(button, r, c); customButtons[c][r] = button; customGrid->setRowStretch(r, 1); } customGrid->setColumnStretch(c, 1); updateStretch(); addColumnAction->setEnabled(settings->custom_button_columns < 100); removeColumnAction->setEnabled(true); } void KeypadWidget::removeCustomRow() { if(settings->custom_button_rows <= 1) return; settings->custom_button_rows--; int r = settings->custom_button_rows; customGrid->setRowStretch(r, 0); for(int c = 0; c < settings->custom_button_columns; c++) { for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r + 1 && settings->custom_buttons[i - 1].c == c + 1) { settings->custom_buttons.erase(settings->custom_buttons.begin() + (i - 1)); break; } } customGrid->removeWidget(customButtons[c][r]); customButtons[c][r]->deleteLater(); customButtons[c].pop_back(); } addRowAction->setEnabled(true); removeRowAction->setEnabled(settings->custom_button_rows > 1); } void KeypadWidget::removeCustomColumn() { if(settings->custom_button_columns <= 1) return; settings->custom_button_columns--; int c = settings->custom_button_columns; customGrid->setColumnStretch(c, 0); for(int r = 0; r < settings->custom_button_rows; r++) { for(size_t i = settings->custom_buttons.size(); i > 0; i--) { if(settings->custom_buttons[i - 1].r == r + 1 && settings->custom_buttons[i - 1].c == c + 1) { settings->custom_buttons.erase(settings->custom_buttons.begin() + (i - 1)); break; } } customGrid->removeWidget(customButtons[c][r]); customButtons[c][r]->deleteLater(); } customButtons.pop_back(); updateStretch(); addColumnAction->setEnabled(true); removeColumnAction->setEnabled(settings->custom_button_columns > 1); } void KeypadWidget::onCustomButtonClicked() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA).isValid() || sender()->property(BUTTON_DATA).toInt() < 0) { editCustomAction(button, 1); } else { emit shortcutClicked(sender()->property(BUTTON_DATA).toInt(), sender()->property(BUTTON_VALUE).toString()); } } void KeypadWidget::onCustomButtonClicked2() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA2).isValid() || sender()->property(BUTTON_DATA2).toInt() < 0) { editCustomAction(button, 2); } else { emit shortcutClicked(sender()->property(BUTTON_DATA2).toInt(), sender()->property(BUTTON_VALUE2).toString()); } } void KeypadWidget::onCustomButtonClicked3() { KeypadButton *button = qobject_cast(sender()); if(b_edit || !sender()->property(BUTTON_DATA3).isValid() || sender()->property(BUTTON_DATA3).toInt() < 0) { editCustomAction(button, 3); } else { emit shortcutClicked(sender()->property(BUTTON_DATA3).toInt(), sender()->property(BUTTON_VALUE3).toString()); } } void KeypadWidget::onCustomButton2Clicked() { KeypadButton *button = qobject_cast(sender()); if(b_edit2 || !sender()->property(BUTTON_DATA).isValid() || sender()->property(BUTTON_DATA).toInt() < 0) { editCustomAction(button, 1); } else { emit shortcutClicked(sender()->property(BUTTON_DATA).toInt(), sender()->property(BUTTON_VALUE).toString()); } } void KeypadWidget::onCustomButton2Clicked2() { KeypadButton *button = qobject_cast(sender()); if(b_edit2 || !sender()->property(BUTTON_DATA2).isValid() || sender()->property(BUTTON_DATA2).toInt() < 0) { editCustomAction(button, 2); } else { emit shortcutClicked(sender()->property(BUTTON_DATA2).toInt(), sender()->property(BUTTON_VALUE2).toString()); } } void KeypadWidget::onCustomButton2Clicked3() { KeypadButton *button = qobject_cast(sender()); if(b_edit2 || !sender()->property(BUTTON_DATA3).isValid() || sender()->property(BUTTON_DATA3).toInt() < 0) { editCustomAction(button, 3); } else { emit shortcutClicked(sender()->property(BUTTON_DATA3).toInt(), sender()->property(BUTTON_VALUE3).toString()); } } void KeypadWidget::intervalDisplayActivated() { int v = qobject_cast(sender())->data().toInt(); if(v < 0) { settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; settings->adaptive_interval_display = true; } else { settings->printops.interval_display = (IntervalDisplay) v; settings->adaptive_interval_display = false; } emit resultFormatUpdated(0); } void KeypadWidget::intervalCalculationActivated() { settings->evalops.interval_calculation = (IntervalCalculation) qobject_cast(sender())->data().toInt(); emit expressionCalculationUpdated(0); } void KeypadWidget::conciseInputActivated() { CALCULATOR->setConciseUncertaintyInputEnabled(!CALCULATOR->conciseUncertaintyInputEnabled()); emit expressionFormatUpdated(false); } void KeypadWidget::variableUnitsActivated() { CALCULATOR->setVariableUnitsEnabled(!CALCULATOR->variableUnitsEnabled()); emit expressionCalculationUpdated(0); } void KeypadWidget::updateIntervalMenu() { QMenu *menu = qobject_cast(sender()); QAction *action; QActionGroup *group; QWidgetAction *aw; if(menu->isEmpty()) { ADD_SECTION(tr("Interval Display")); group = new QActionGroup(this); group->setObjectName("group_interval_display"); action = menu->addAction(tr("Adaptive"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(-1); action = menu->addAction(tr("Significant digits"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_SIGNIFICANT_DIGITS); action = menu->addAction(tr("Interval"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_INTERVAL); action = menu->addAction(tr("Plus/minus"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_PLUSMINUS); action = menu->addAction(tr("Relative"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_RELATIVE); action = menu->addAction(tr("Concise"), this, SLOT(intervalDisplayActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_DISPLAY_CONCISE); ADD_SECTION(tr("Interval Calculation")); group = new QActionGroup(this); group->setObjectName("group_interval_calculation"); action = menu->addAction(tr("Variance formula"), this, SLOT(intervalCalculationActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_CALCULATION_VARIANCE_FORMULA); action = menu->addAction(tr("Interval arithmetic"), this, SLOT(intervalCalculationActivated())); action->setCheckable(true); group->addAction(action); action->setData(INTERVAL_CALCULATION_INTERVAL_ARITHMETIC); menu->addSeparator(); action = menu->addAction(tr("Allow concise uncertainty input"), this, SLOT(conciseInputActivated())); action->setCheckable(true); action->setObjectName("action_concise_input"); } group = findChild("group_interval_display"); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == (settings->adaptive_interval_display ? -1 : settings->printops.interval_display)) { actions.at(i)->setChecked(true); break; } } group = findChild("group_interval_calculation"); if(!group) return; actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == settings->evalops.interval_calculation) { actions.at(i)->setChecked(true); break; } } action = findChild("action_concise_input"); if(action) action->setChecked(CALCULATOR->conciseUncertaintyInputEnabled()); } void KeypadWidget::complexFormActivated() { settings->evalops.complex_number_form = (ComplexNumberForm) qobject_cast(sender())->data().toInt(); settings->complex_angle_form = (settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS); emit expressionCalculationUpdated(0); } void KeypadWidget::updateComplexMenu() { QMenu *menu = qobject_cast(sender()); ExpressionItem *item; QAction *action; QActionGroup *group; if(menu->isEmpty()) { MENU_SYMBOL("∠") MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_RE)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_IM)) MENU_ITEM(CALCULATOR->getFunctionById(FUNCTION_ID_ARG)) MENU_ITEM(CALCULATOR->getActiveFunction("conj")) menu->addSeparator(); menu = menu->addMenu(tr("Complex number form")); group = new QActionGroup(this); group->setObjectName("group_complex_form"); action = menu->addAction(tr("Rectangular"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_RECTANGULAR); action = menu->addAction(tr("Exponential"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_EXPONENTIAL); action = menu->addAction(tr("Polar"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_POLAR); action = menu->addAction(tr("Angle/phasor"), this, SLOT(complexFormActivated())); action->setCheckable(true); group->addAction(action); action->setData(COMPLEX_NUMBER_FORM_CIS); } group = findChild("group_complex_form"); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == settings->evalops.complex_number_form) { actions.at(i)->setChecked(true); break; } } } void KeypadWidget::updateAssumptions() { QMenu *menu = qobject_cast(sender()); QAction *action; QActionGroup *group; QString name; QWidgetAction *aw; int id = menu->property(BUTTON_DATA).toInt(); if(id == VARIABLE_ID_Y) name = "y"; else if(id == VARIABLE_ID_Z) name = "z"; else name = "x"; if(menu->isEmpty()) { ADD_SECTION(tr("Type", "Assumptions type")); group = new QActionGroup(this); group->setObjectName("group_type_" + name); action = menu->addAction(tr("Number"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_NUMBER); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Real"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_REAL); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Rational"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_RATIONAL); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Integer"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_INTEGER); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Boolean"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_BOOLEAN); action->setProperty(BUTTON_DATA, id); ADD_SECTION(tr("Sign", "Assumptions sign")); group = new QActionGroup(this); group->setObjectName("group_sign_" + name); action = menu->addAction(tr("Unknown", "Unknown assumptions sign"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_UNKNOWN); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-zero"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONZERO); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_POSITIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONNEGATIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NEGATIVE); action->setProperty(BUTTON_DATA, id); action = menu->addAction(tr("Non-positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONPOSITIVE); menu->addSeparator(); action = menu->addAction(tr("Default assumptions"), this, SLOT(defaultAssumptionsActivated())); action->setProperty(BUTTON_DATA, id); } Variable *v = CALCULATOR->getVariableById(id); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; Assumptions *ass = uv->assumptions(); if(!ass) ass = CALCULATOR->defaultAssumptions(); group = findChild("group_type_" + name); if(!group) return; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == ass->type()) { actions.at(i)->setChecked(true); break; } } group = findChild("group_sign_" + name); if(!group) return; actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == ass->sign()) { actions.at(i)->setChecked(true); break; } } } void KeypadWidget::defaultAssumptionsActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; uv->setAssumptions(NULL); settings->assumptions_warning_shown = true; emit expressionCalculationUpdated(0); } void KeypadWidget::assumptionsTypeActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; if(!uv->assumptions()) uv->setAssumptions(new Assumptions()); uv->assumptions()->setType((AssumptionType) action->data().toInt()); settings->assumptions_warning_shown = true; emit expressionCalculationUpdated(0); } void KeypadWidget::assumptionsSignActivated() { QAction *action = qobject_cast(sender()); Variable *v = CALCULATOR->getVariableById(action->property(BUTTON_DATA).toInt()); if(!v || v->isKnown()) return; UnknownVariable *uv = (UnknownVariable*) v; if(!uv->assumptions()) uv->setAssumptions(new Assumptions()); uv->assumptions()->setSign((AssumptionSign) action->data().toInt()); settings->assumptions_warning_shown = true; emit expressionCalculationUpdated(0); } void KeypadWidget::setKeypadType(int i) { if(i < 0 || i > KEYPAD_NUMBERPAD) i = 0; createKeypad(i); hideNumpad(settings->hide_numpad); showCustomButtonColumn(settings->show_custom_keypad_column); if(leftStack->currentIndex() == KEYPAD_PROGRAMMING && settings->programming_base_changed) { settings->programming_base_changed = false; emit baseClicked(BASE_DECIMAL, true, false); } leftStack->setCurrentIndex(i); } void KeypadWidget::hideNumpad(bool b) { if(!b) createNumpad(numpad, 0); numpad->setVisible(!b); } void KeypadWidget::showCustomButtonColumn(bool b) { if(b) createCustomButtonColumn(); customButtonColumn->setVisible(b); } void KeypadWidget::updateStretch() { int left_size = 5; if(settings->separate_keypad_menu_buttons) left_size++; if(settings->custom_button_columns > left_size) left_size = settings->custom_button_columns; ((QBoxLayout*) layout())->setStretchFactor(leftStack, (left_size * 2) + 1); ((QBoxLayout*) layout())->setStretchFactor(numpad, 12); ((QBoxLayout*) layout())->setStretchFactor(customButtonColumn, 2); } void KeypadWidget::showSeparateKeypadMenuButtons(bool b) { QList buttons = findChildren(); for(int i = 0; i < buttons.count(); i++) { if(buttons.at(i) != customEditButton && buttons.at(i)->menu()) { buttons.at(i)->setPopupMode(b ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup); } buttons.at(i)->updateSize(); } updateStretch(); QRect r = geometry(); r.moveTo(0, 0); repaint(r); } void KeypadWidget::updateBase() { if(!binButton) return; binButton->setChecked(settings->printops.base == 2 && settings->evalops.parse_options.base == 2); octButton->setChecked(settings->printops.base == 8 && settings->evalops.parse_options.base == 8); decButton->setChecked(settings->printops.base == 10 && settings->evalops.parse_options.base == 10); hexButton->setChecked(settings->printops.base == 16 && settings->evalops.parse_options.base == 16); int base = settings->evalops.parse_options.base; if(base == BASE_CUSTOM) base = CALCULATOR->customOutputBase().intValue(); else if(base < 2 || base > 36) base = 10; aButton->setEnabled(base > 10); bButton->setEnabled(base > 11); cButton->setEnabled(base > 12); dButton->setEnabled(base > 13); eButton->setEnabled(base > 14); fButton->setEnabled(base > 15); } void KeypadWidget::updateSymbols() { for(size_t i = 0; i < 2; i++) { if(!dotButton[i]) continue; multiplicationButton[i]->setText(settings->multiplicationSign()); multiplicationButton[i]->setText(settings->multiplicationSign()); multiplicationButton[i]->setProperty(BUTTON_DATA, settings->multiplicationSign()); divisionButton[i]->setText(settings->divisionSign()); divisionButton[i]->setProperty(BUTTON_DATA, settings->divisionSign(false)); commaButton[i]->setText(QString::fromStdString(CALCULATOR->getComma())); commaButton[i]->setProperty(BUTTON_DATA, QString::fromStdString(CALCULATOR->getComma())); dotButton[i]->setText(QString::fromStdString(CALCULATOR->getDecimalPoint())); dotButton[i]->setProperty(BUTTON_DATA, QString::fromStdString(CALCULATOR->getDecimalPoint())); } if(imaginaryButton) imaginaryButton->setText(CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0 ? "j" : "i"); } void KeypadWidget::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { if(backButton) backButton->setIcon(LOAD_COLORED_ICON("go-back")); if(forwardButton) forwardButton->setIcon(LOAD_COLORED_ICON("go-forward")); if(customEditButton) customEditButton->setIcon(LOAD_COLORED_ICON("document-edit")); } else if(e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) { QList buttons = findChildren(); for(int i = 0; i < buttons.count(); i++) { buttons.at(i)->updateSize(); } } QWidget::changeEvent(e); } void KeypadWidget::onHypToggled(bool b) { if(b) { SET_ITEM_BUTTON2(sinButton, CALCULATOR->getFunctionById(FUNCTION_ID_SINH), CALCULATOR->getFunctionById(FUNCTION_ID_ASINH)); SET_ITEM_BUTTON2(cosButton, CALCULATOR->getFunctionById(FUNCTION_ID_COSH), CALCULATOR->getFunctionById(FUNCTION_ID_ACOSH)); SET_ITEM_BUTTON2(tanButton, CALCULATOR->getFunctionById(FUNCTION_ID_TANH), CALCULATOR->getFunctionById(FUNCTION_ID_ATANH)); } else { SET_ITEM_BUTTON2(sinButton, CALCULATOR->getFunctionById(FUNCTION_ID_SIN), CALCULATOR->getFunctionById(FUNCTION_ID_ASIN)); SET_ITEM_BUTTON2(cosButton, CALCULATOR->getFunctionById(FUNCTION_ID_COS), CALCULATOR->getFunctionById(FUNCTION_ID_ACOS)); SET_ITEM_BUTTON2(tanButton, CALCULATOR->getFunctionById(FUNCTION_ID_TAN), CALCULATOR->getFunctionById(FUNCTION_ID_ATAN)); } } void KeypadWidget::onSymbolButtonClicked() { emit symbolClicked(sender()->property(BUTTON_DATA).toString()); } void KeypadWidget::onSymbolButtonClicked2() { emit symbolClicked(sender()->property(BUTTON_DATA2).toString()); } void KeypadWidget::onSymbolButtonClicked3() { emit symbolClicked(sender()->property(BUTTON_DATA3).toString()); } void KeypadWidget::onOperatorButtonClicked() { emit operatorClicked(sender()->property(BUTTON_DATA).toString()); } void KeypadWidget::onOperatorButtonClicked2() { emit operatorClicked(sender()->property(BUTTON_DATA2).toString()); } void KeypadWidget::onOperatorButtonClicked3() { emit operatorClicked(sender()->property(BUTTON_DATA3).toString()); } void KeypadWidget::onBaseButtonClicked() { settings->programming_base_changed = settings->programming_base_changed || (settings->printops.base == BASE_DECIMAL && settings->evalops.parse_options.base == BASE_DECIMAL); emit baseClicked(sender()->property(BUTTON_DATA).toInt(), true, true); } void KeypadWidget::onBaseButtonClicked2() { settings->programming_base_changed = settings->programming_base_changed || (settings->printops.base == BASE_DECIMAL && settings->evalops.parse_options.base == BASE_DECIMAL); emit baseClicked(sender()->property(BUTTON_DATA).toInt(), false, true); } void KeypadWidget::onItemButtonClicked() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } void KeypadWidget::onPrefixItemClicked() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA).value()); } void KeypadWidget::onUnitItemClicked() { Unit *u = (Unit*) sender()->property(BUTTON_DATA).value(); emit unitClicked(u); if(unicode_length(u->print(false, true, true)) <= 3) { settings->latest_button_unit = u->print(false, true, true); unitButton->setText(QString::fromStdString(settings->latest_button_unit)); Prefix *p1 = CALCULATOR->getExactDecimalPrefix(-3), *p2 = CALCULATOR->getExactDecimalPrefix(3); unitButton->setToolTip(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs)), p1 ? QString::fromStdString(p1->longName()) : QString(), p2 ? QString::fromStdString(p2->longName()) : QString()); unitButton->setProperty(BUTTON_DATA, QVariant::fromValue((void*) u)); } } void KeypadWidget::onUnitButtonClicked2() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA2).value()); } void KeypadWidget::onUnitButtonClicked3() { emit prefixClicked((Prefix*) sender()->property(BUTTON_DATA3).value()); } void KeypadWidget::onItemButtonClicked2() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA2).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } void KeypadWidget::onItemButtonClicked3() { ExpressionItem *item = (ExpressionItem*) sender()->property(BUTTON_DATA3).value(); if(item->type() == TYPE_FUNCTION) emit functionClicked((MathFunction*) item); else if(item->type() == TYPE_VARIABLE) emit variableClicked((Variable*) item); else if(item->type() == TYPE_UNIT) emit unitClicked((Unit*) item); } KeypadButton::KeypadButton(const QString &text, QWidget *parent, bool autorepeat) : QToolButton(parent), longPressTimer(NULL), b_longpress(false), b_autorepeat(autorepeat) { setFocusPolicy(Qt::TabFocus); if(text.contains("separate_keypad_menu_buttons && menu() ? 10 : 0)); size.setHeight(size.height() * 1.6); setMinimumSize(size); } void KeypadButton::setRichText(const QString &text) { richtext = text; setText(QString()); } const QString &KeypadButton::richText() const { return richtext; } void KeypadButton::menuSet() { if(settings->separate_keypad_menu_buttons) updateSize(); QString str = toolTip(); if(!str.isEmpty()) { str.replace(tr("Right-click/long press: %1").arg(QString()), tr("Right-click: %1").arg(QString())); str += "
"; } str += tr("Long press: %1").arg(tr("Open menu")); QToolButton::setToolTip(str); connect(menu(), SIGNAL(aboutToShow()), this, SLOT(menuOpened())); connect(menu(), SIGNAL(aboutToHide()), this, SLOT(menuClosed())); } void KeypadButton::menuOpened() { if(longPressTimer && longPressTimer->isActive()) longPressTimer->stop(); } void KeypadButton::menuClosed() { } #include void KeypadButton::paintEvent(QPaintEvent *p) { QToolButton::paintEvent(p); if(!richtext.isEmpty()) { QPainter painter(this); QTextDocument doc; QAbstractTextDocumentLayout::PaintContext ctx; ctx.palette.setColor(QPalette::Text, painter.pen().color()); doc.setHtml(richtext); QFont f = font(); doc.setDefaultFont(f); QPointF point = p->rect().center(); bool b_menu = (menu() && settings->separate_keypad_menu_buttons); point.setY(point.y() - doc.size().height() / 2.0 + 1.0); point.setX((point.x() - (b_menu ? 6.0 : 0.0)) - doc.size().width() / 2.0 + 1.0); painter.translate(point); painter.save(); doc.documentLayout()->draw(&painter, ctx); painter.restore(); } } void KeypadButton::mousePressEvent(QMouseEvent *e) { b_longpress = false; if(e->button() == Qt::LeftButton && (!menu() || popupMode() != QToolButton::DelayedPopup)) { if(!longPressTimer) { longPressTimer = new QTimer(this); longPressTimer->setSingleShot(!b_autorepeat); connect(longPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout())); } longPressTimer->start(b_autorepeat ? 250 : 500); } QToolButton::mousePressEvent(e); } void KeypadButton::longPressTimeout() { b_longpress = true; if(menu()) { showMenu(); } else if(b_autorepeat) { emit clicked(); } else { emit clicked2(); } } void KeypadButton::mouseReleaseEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { emit clicked2(); } else if(e->button() == Qt::MiddleButton) { emit clicked3(); } else { if(longPressTimer && longPressTimer->isActive() && e->button() == Qt::LeftButton) { longPressTimer->stop(); } else if(b_longpress && e->button() == Qt::LeftButton) { b_longpress = false; blockSignals(true); QToolButton::mouseReleaseEvent(e); blockSignals(false); return; } QToolButton::mouseReleaseEvent(e); } } void KeypadButton::setToolTip(const QString &s1, const QString &s2, const QString &s3) { QString str; if(!s1.isEmpty()) str += s1; if(!s2.isEmpty()) { if(!str.isEmpty()) str += "
"; if(!b_autorepeat) str += tr("Right-click/long press: %1").arg(s2); else str += tr("Right-click: %1").arg(s2); } if(!s3.isEmpty()) { if(!str.isEmpty()) str += "
"; str += tr("Middle-click: %1").arg(s3); } QToolButton::setToolTip(str); } qalculate-qt-5.11.0/src/keypadwidget.h000066400000000000000000000136561520501070600176230ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef KEYPAD_WIDGET_H #define KEYPAD_WIDGET_H #include #include #include #include class QTimer; class QStackedLayout; class QLineEdit; class QComboBox; class QTreeWidget; class QTreeWidgetItem; class QDialog; class QGridLayout; class QAction; class QLabel; class QPushButton; class KeypadButton : public QToolButton { Q_OBJECT public: KeypadButton(const QString &text, QWidget *parent = NULL, bool autorepeat = false); KeypadButton(const QIcon &icon, QWidget *parent = NULL, bool autorepeat = false); ~KeypadButton(); void setToolTip(const QString &s1, const QString &s2 = QString(), const QString &s3 = QString()); void setRichText(const QString &text); const QString &richText() const; void menuSet(); void updateSize(); protected: QString richtext; QTimer *longPressTimer; bool b_longpress; bool b_autorepeat; void paintEvent(QPaintEvent*) override; void mouseReleaseEvent(QMouseEvent*) override; void mousePressEvent(QMouseEvent*) override; protected slots: void longPressTimeout(); void menuOpened(); void menuClosed(); signals: void clicked2(); void clicked3(); }; enum { KEYPAD_GENERAL = 0, KEYPAD_PROGRAMMING = 1, KEYPAD_ALGEBRA = 2, KEYPAD_CUSTOM = 3, KEYPAD_NUMBERPAD = 4 }; class KeypadWidget : public QWidget { Q_OBJECT public: KeypadWidget(QWidget *parent = NULL); virtual ~KeypadWidget(); protected: KeypadButton *sinButton, *cosButton, *tanButton, *delButton[2], *acButton[2], *backButton, *forwardButton, *dotButton[2], *commaButton[2], *multiplicationButton[2], *divisionButton[2], *imaginaryButton, *binButton, *octButton, *decButton, *hexButton, *aButton, *bButton, *cButton, *dButton, *eButton, *fButton, *unitButton, *storeButton, *xButton, *parButton, *percentButton; QPushButton *customOKButton; QToolButton *customEditButton, *customEditButton2; QWidget *keypadG, *keypadP, *keypadX, *keypadC, *keypadN; QVector > customButtons; QVector customButtons2; QStackedLayout *leftStack; QGridLayout *customGrid, *customGrid2; QLineEdit *labelEdit; QComboBox *valueEdit; QLabel *valueLabel; QTreeWidget *actionList; QWidget *numpad, *customButtonColumn; QDialog *customActionDialog; QAction *addRowAction, *addColumnAction, *removeRowAction, *removeColumnAction; bool b_edit, b_edit2; void changeEvent(QEvent *e); void editCustomAction(KeypadButton*, int); void updateStretch(); void createKeypad(int); void createCustomButtonColumn(); void createNumpad(QWidget*, int); protected slots: void onSymbolButtonClicked(); void onOperatorButtonClicked(); void onItemButtonClicked(); void onUnitItemClicked(); void onPrefixItemClicked(); void onUnitButtonClicked2(); void onUnitButtonClicked3(); void onSymbolButtonClicked2(); void onOperatorButtonClicked2(); void onItemButtonClicked2(); void onSymbolButtonClicked3(); void onOperatorButtonClicked3(); void onItemButtonClicked3(); void onBaseButtonClicked(); void onBaseButtonClicked2(); void onCustomButtonClicked(); void onCustomButtonClicked2(); void onCustomButtonClicked3(); void onCustomButton2Clicked(); void onCustomButton2Clicked2(); void onCustomButton2Clicked3(); void onHypToggled(bool); void assumptionsTypeActivated(); void assumptionsSignActivated(); void defaultAssumptionsActivated(); void updateAssumptions(); void onCustomEditClicked(bool); void onCustomEdit2Clicked(bool); void removeCustomRow(); void addCustomRow(); void removeCustomColumn(); void addCustomColumn(); void updateCustomActionOK(); void customActionOKClicked(); void currentCustomActionChanged(QTreeWidgetItem*, QTreeWidgetItem*); void intervalDisplayActivated(); void intervalCalculationActivated(); void conciseInputActivated(); void variableUnitsActivated(); void updateIntervalMenu(); void complexFormActivated(); void updateComplexMenu(); void updateStoreMenu(); void updateSinMenu(); void updateCosMenu(); void updateTanMenu(); void updatePiMenu(); void updateLnMenu(); void updateSqrtMenu(); void updatePowerMenu(); void updateEMenu(); void updateFactorialMenu(); void updateSumMenu(); void updateXMenu(); void updateEqualsMenu(); void updateFactorizeMenu(); void updatePercentageMenu(); void updateUnitsMenu(); public slots: void updateBase(); void updateSymbols(); void setKeypadType(int); void hideNumpad(bool); void showCustomButtonColumn(bool); void showSeparateKeypadMenuButtons(bool); void updateButtonLocation(); signals: void operatorClicked(const QString&); void symbolClicked(const QString&); void functionClicked(MathFunction *f); void variableClicked(Variable *v); void unitClicked(Unit *u); void prefixClicked(Prefix *p); void delClicked(); void clearClicked(); void equalsClicked(); void parenthesesClicked(); void bracketsClicked(); void leftClicked(); void rightClicked(); void endClicked(); void startClicked(); void MSClicked(); void MCClicked(); void MRClicked(); void MPlusClicked(); void MMinusClicked(); void storeClicked(); void newFunctionClicked(); void backspaceClicked(); void answerClicked(); void baseClicked(int, bool, bool); void factorizeClicked(); void expandClicked(); void expandPartialFractionsClicked(); void expressionCalculationUpdated(int); void expressionFormatUpdated(bool); void resultFormatUpdated(int); void shortcutClicked(int, const QString&); void openVariablesRequest(); void openUnitsRequest(); void openPercentageCalculationRequest(); }; #endif //KEYPAD_WIDGET_H qalculate-qt-5.11.0/src/main.cpp000066400000000000000000000321751520501070600164160ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculatewindow.h" #include "qalculateqtsettings.h" #ifdef _WIN32 # include #endif QString custom_title; QalculateQtSettings *settings; extern bool title_modified; QTranslator translator, translator_qt, translator_qtbase; int main(int argc, char **argv) { #ifdef _WIN32 if(!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")) { qputenv("QT_QPA_PLATFORM", "windows:altgr"); } #endif QApplication app(argc, argv); app.setApplicationName("qalculate-qt"); app.setApplicationDisplayName("Qalculate!"); app.setOrganizationName("qalculate"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) app.setDesktopFileName("io.github.Qalculate.qalculate-qt"); #endif app.setApplicationVersion("5.11.0"); #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) app.setAttribute(Qt::AA_UseHighDpiPixmaps); #endif settings = new QalculateQtSettings(); QalculateTranslator eqtr; app.installTranslator(&eqtr); if(!settings->ignore_locale) { if(!settings->custom_lang.isEmpty()) { #if (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) QLocale::setDefault(QLocale(QLocale(settings->custom_lang).language(), QLocale(settings->custom_lang).territory())); #else QLocale::setDefault(QLocale(QLocale(settings->custom_lang).language(), QLocale(settings->custom_lang).country())); #endif #ifdef _WIN32 _putenv_s("LANGUAGE", settings->custom_lang.toLocal8Bit().data()); } else { ULONG nlang = 0; DWORD n = 0; if(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &nlang, NULL, &n)) { WCHAR wlocale[n]; if(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &nlang, wlocale, &n)) { for(size_t i = 2; nlang > 1 && i < n - 1; i++) { if(wlocale[i] == '\0') { if(wlocale[i + 1] == '\0') break; wlocale[i] = ':'; nlang--; } } std::string lang = utf8_encode(wlocale); if(!lang.empty()) { gsub("-", "_", lang); if(lang.substr(0, lang.find(":")) != QLocale().name().toStdString()) { # if (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) QLocale::setDefault(QLocale(QLocale(QString::fromStdString(lang)).language(), QLocale(QString::fromStdString(lang)).territory())); # else QLocale::setDefault(QLocale(QLocale(QString::fromStdString(lang)).language(), QLocale(QString::fromStdString(lang)).country())); # endif } _putenv_s("LANGUAGE", lang.c_str()); } } } } #else QString lang = settings->custom_lang; setenv("LANGUAGE", lang.toLocal8Bit().data(), 1); if(lang.indexOf(".") < 0 && lang.indexOf("_") > 0) lang += ".utf8"; if(lang.indexOf(".") > 0) setenv("LC_MESSAGES", lang.toLocal8Bit().data(), 1); } #endif #ifndef TRANSLATIONS_DIR # define TRANSLATIONS_DIR ":/translations" #endif if(translator.load(QLocale(), QLatin1String("qalculate-qt"), QLatin1String("_"), QLatin1String(TRANSLATIONS_DIR))) app.installTranslator(&translator); #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) if(translator_qt.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qt); if(translator_qtbase.load(QLocale(), QLatin1String("qtbase"), QLatin1String("_"), QLibraryInfo::path(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qtbase); #else if(translator_qt.load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qt); if(translator_qtbase.load(QLocale(), QLatin1String("qtbase"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(&translator_qtbase); #endif } QCommandLineParser *parser = new QCommandLineParser(); QCommandLineOption fOption(QStringList() << "f" << "file", QApplication::tr("Execute expressions and commands from a file"), QApplication::tr("FILE")); parser->addOption(fOption); QCommandLineOption nOption(QStringList() << "n" << "new-instance", QApplication::tr("Start a new instance of the application")); parser->addOption(nOption); QCommandLineOption tOption(QStringList() << "title", QApplication::tr("Specify the window title"), QApplication::tr("TITLE")); parser->addOption(tOption); QCommandLineOption uOption(QStringList() << "update-exchange-rates", QApplication::tr("Update exchange rates")); parser->addOption(uOption); QCommandLineOption vOption(QStringList() << "v" << "version", QApplication::tr("Display the application version")); parser->addOption(vOption); QCommandLineOption wOption(QStringList() << "w" << "workspace", QApplication::tr("Open workspace"), QApplication::tr("FILE")); parser->addOption(wOption); QCommandLineOption testOption(QStringList() << "run-test"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) testOption.setFlags(QCommandLineOption::HiddenFromHelp); #endif parser->addOption(testOption); QCommandLineOption stopTestOption(QStringList() << "stop-test"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) stopTestOption.setFlags(QCommandLineOption::HiddenFromHelp); #endif parser->addOption(stopTestOption); parser->addPositionalArgument("expression", QApplication::tr("Expression to calculate"), QApplication::tr("[EXPRESSION]")); parser->addHelpOption(); parser->process(app); if(parser->isSet(vOption)) { puts(qApp->applicationVersion().toUtf8().data()); return 0; } std::string homedir = getLocalDir(); recursiveMakeDir(homedir); QLockFile lockFile(QString::fromStdString(buildPath(homedir, "qalculate-qt.lock"))); if(settings->allow_multiple_instances < 1 && !parser->isSet(nOption) && !lockFile.tryLock(100)) { if(lockFile.error() == QLockFile::LockFailedError) { bool ami_changed = false; if(settings->allow_multiple_instances < 0 && parser->value(fOption).isEmpty() && parser->value(wOption).isEmpty() && parser->positionalArguments().isEmpty()) { settings->allow_multiple_instances = (QMessageBox::question(NULL, QApplication::tr("Allow multiple instances?"), QApplication::tr("By default, only one instance (one main window) of %1 is allowed.\n\nIf multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved.\n\nDo you, despite this, want to change the default behavior and allow multiple simultaneous instances?").arg("Qalculate!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes); ami_changed = true; if(settings->allow_multiple_instances) { QLocalSocket socket; socket.connectToServer("qalculate-qt"); if(socket.waitForConnected()) { socket.write("+"); socket.waitForBytesWritten(3000); socket.disconnectFromServer(); } } } if(settings->allow_multiple_instances <= 0) { #ifdef _WIN32 qint64 pid = 0; lockFile.getLockInfo(&pid, NULL, NULL); if(pid != 0) AllowSetForegroundWindow(pid); #endif QTextStream outStream(stdout); outStream << QApplication::tr("%1 is already running.").arg(app.applicationDisplayName()) << '\n'; QLocalSocket socket; socket.connectToServer("qalculate-qt"); if(socket.waitForConnected()) { QString command; if(!parser->value(fOption).isEmpty()) { command = "f"; command += parser->value(fOption); } else if(!parser->value(wOption).isEmpty()) { command = "w"; command += parser->value(wOption); } else if(parser->isSet(uOption)) { command = "u"; } else if(parser->isSet(testOption)) { command = "t"; } else if(parser->isSet(stopTestOption)) { command = "e"; } else if(ami_changed) { command = "-"; } else { command = "0"; } QStringList args = parser->positionalArguments(); for(int i = 0; i < args.count(); i++) { if(i > 0) command += " "; else if(command == "f") command += ";"; command += args.at(i); } socket.write(command.toUtf8()); socket.waitForBytesWritten(3000); socket.disconnectFromServer(); } return 1; } } } #ifndef __APPLE__ app.setWindowIcon(LOAD_APP_ICON("qalculate-qt")); #endif new Calculator(settings->ignore_locale); if(parser->isSet(uOption)) { return !CALCULATOR->fetchExchangeRates(); } CALCULATOR->setExchangeRatesWarningEnabled(!CALCULATOR->canFetch()); settings->loadPreferences(); if(!parser->value(wOption).isEmpty()) settings->loadWorkspace(parser->value(wOption).toLocal8Bit().data()); if(settings->disable_cursor_blinking) app.setCursorFlashTime(0); CALCULATOR->loadExchangeRates(); if(!CALCULATOR->loadGlobalDefinitions()) { QTextStream outStream(stderr); outStream << QApplication::tr("Failed to load global definitions!\n"); return 1; } if(settings->do_imaginary_j && CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") == 0) { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } settings->f_answer->setCategory(CALCULATOR->getFunctionById(FUNCTION_ID_WARNING)->category()); settings->f_answer->setChanged(false); CALCULATOR->loadLocalDefinitions(); Unit *u = CALCULATOR->getActiveUnit("L"); if(u) settings->volume_category = u->category(); u = CALCULATOR->getActiveUnit("teaspoon"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); u = CALCULATOR->getActiveUnit("gal"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); u = CALCULATOR->getActiveUnit("UK_gal"); if(u && u->category().find(settings->volume_category) == 0) settings->alternative_volume_categories.push_back(u->category()); settings->setCustomAngleUnit(); settings->setDefaultCurrency(); settings->updateFavourites(); QColor c = QApplication::palette().base().color(); if(c.red() + c.green() + c.blue() < 255) settings->color = 2; else settings->color = 1; settings->saved_app_font = app.font(); if(settings->use_custom_app_font) { QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); app.setFont(font); } QalculateWindow *win = new QalculateWindow(); if(parser->value(tOption).isEmpty()) { win->updateWindowTitle(QString(), false, true); title_modified = false; } else { win->setWindowTitle(parser->value(tOption)); title_modified = true; } win->setCommandLineParser(parser); win->show(); app.processEvents(); win->initFinished(); if(!parser->value(fOption).isEmpty()) win->executeFromFile(parser->value(fOption)); QStringList args = parser->positionalArguments(); QString expression; for(int i = 0; i < args.count(); i++) { if(i > 0) expression += " "; expression += args.at(i); } expression = expression.trimmed(); if(!expression.isEmpty()) win->calculate(expression); args.clear(); settings->checkVersion(false, win); if(!settings->use_custom_app_font) win->loadInitialHistory(); return app.exec(); } QalculateTranslator::QalculateTranslator() : QTranslator() {} QString QalculateTranslator::translate(const char *context, const char *sourceText, const char *disambiguation, int n) const { if(!translator_qt.translate(context, sourceText, disambiguation, n).isEmpty() || !translator_qtbase.translate(context, sourceText, disambiguation, n).isEmpty()) return QString(); if(strcmp(context, "QalculateTranslator") == 0) return QString(); //: Only used when Qt translation is missing if(strcmp(sourceText, "OK") == 0) return tr("OK"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Cancel") == 0) return tr("Cancel"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Close") == 0) return tr("Close"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Yes") == 0) return tr("&Yes"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&No") == 0) return tr("&No"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Open") == 0) return tr("&Open"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Save") == 0) return tr("&Save"); //: Only used when Qt translation is missing if(strcmp(sourceText, "&Select All") == 0) return tr("&Select All"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Look in:") == 0) return tr("Look in:"); //: Only used when Qt translation is missing if(strcmp(sourceText, "File &name:") == 0) return tr("File &name:"); //: Only used when Qt translation is missing if(strcmp(sourceText, "Files of type:") == 0) return tr("Files of type:"); return QString(); } qalculate-qt-5.11.0/src/matrixwidget.cpp000066400000000000000000000137731520501070600202050ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include "matrixwidget.h" #include "qalculateqtsettings.h" MatrixWidget::MatrixWidget(QWidget *parent, int r, int c) : QWidget(parent) { QVBoxLayout *box = new QVBoxLayout(this); box->setContentsMargins(0, 0, 0, 0); QHBoxLayout *hbox = new QHBoxLayout(); box->addLayout(hbox); hbox->addStretch(1); rowsSpin = new QSpinBox(this); rowsSpin->setRange(1, 10000); rowsSpin->setValue(r); hbox->addWidget(rowsSpin); connect(rowsSpin, SIGNAL(valueChanged(int)), this, SLOT(matrixRowsChanged(int))); hbox->addWidget(new QLabel(SIGN_MULTIPLICATION)); columnsSpin = new QSpinBox(this); columnsSpin->setRange(1, 10000); columnsSpin->setValue(c); hbox->addWidget(columnsSpin); connect(columnsSpin, SIGNAL(valueChanged(int)), this, SLOT(matrixColumnsChanged(int))); matrixTable = new QTableWidget(this); matrixTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QTableWidgetItem *proto = new QTableWidgetItem(); proto->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItemPrototype(proto); matrixTable->setRowCount(r); matrixTable->setColumnCount(c); matrixTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); matrixTable->setFocus(); setEditable(true); box->addWidget(matrixTable, 1); connect(matrixTable, SIGNAL(itemChanged(QTableWidgetItem*)), this, SIGNAL(matrixChanged())); } MatrixWidget::~MatrixWidget() {} QSize MatrixWidget::sizeHint() const { QFontMetrics fm(matrixTable->font()); return QSize(fm.boundingRect("000000").width() * 12, QWidget::sizeHint().height()); } void MatrixWidget::matrixRowsChanged(int i) { matrixTable->setRowCount(i); matrixTable->adjustSize(); emit dimensionChanged(i, matrixTable->columnCount()); } void MatrixWidget::matrixColumnsChanged(int i) { matrixTable->setColumnCount(i); matrixTable->adjustSize(); emit dimensionChanged(matrixTable->rowCount(), i); } void MatrixWidget::setEditable(bool b) { matrixTable->setEditTriggers(b ? QAbstractItemView::AllEditTriggers : QAbstractItemView::NoEditTriggers); rowsSpin->setReadOnly(!b); columnsSpin->setReadOnly(!b); } QString MatrixWidget::getMatrixString() const { QString str; int max_c = -1, max_r = -1; for(int r = 0; r < matrixTable->rowCount(); r++) { bool b = false; for(int c = 0; c < matrixTable->columnCount(); c++) { QTableWidgetItem *item = matrixTable->item(r, c); if(item && !item->text().isEmpty()) { b = true; if(c > max_c) max_c = c; } } if(b) max_r = r; } if(max_r < 0) {max_r = matrixTable->rowCount() - 1; max_c = matrixTable->columnCount() - 1;} str = "["; QString str_e; for(int r = 0; r <= max_r; r++) { if(r > 0) str += "; "; for(int c = 0; c <= max_c; c++) { if(c > 0) str += " "; QTableWidgetItem *item = matrixTable->item(r, c); if(!item || item->text().isEmpty()) { str += "0"; } else { str_e = item->text(); bool in_cit1 = false, in_cit2 = false; int pars = 0, brackets = 0; for(int i = 0; i < str_e.length(); i++) { if(!in_cit1 && !in_cit2) { if(str_e[i] == '[') brackets++; else if(str_e[i] == ']' && brackets > 0) brackets++; else if(str_e[i] == '(' && brackets == 0) pars++; else if(str_e[i] == ')' && brackets == 0 && pars > 0) pars--; else if(brackets == 0 && pars == 0 && (str_e[i].isSpace() || str_e[i] == ';' || (str_e[i] == ',' && settings->printops.decimalpoint() != ","))) { str += "("; str_e += ")"; break; } } if(str_e[i] == '\"') { if(in_cit1) in_cit1 = false; else if(!in_cit2) in_cit1 = true; } else if(str_e[i] == '\'') { if(in_cit2) in_cit2 = false; else if(!in_cit1) in_cit1 = true; } } str += str_e; } } } str += "]"; return str; } void MatrixWidget::setMatrix(const MathStructure &mstruct) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.base = 10; QTableWidgetItem *item; if(mstruct.isMatrix()) { MathStructure m(mstruct); rowsSpin->setValue(m.rows()); columnsSpin->setValue(m.columns()); CALCULATOR->startControl(2000); for(size_t i = 0; i < m.rows(); i++) { for(size_t i2 = 0; i2 < m.columns(); i2++) { m.getElement(i + 1, i2 + 1)->format(po); item = new QTableWidgetItem(QString::fromStdString(m.getElement(i + 1, i2 + 1)->print(po))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItem((int) i, (int) i2, item); } } CALCULATOR->stopControl(); } } void MatrixWidget::setMatrixStrings(const MathStructure &mstruct) { QTableWidgetItem *item; rowsSpin->setValue(mstruct.rows()); columnsSpin->setValue(mstruct.columns()); for(size_t i = 0; i < mstruct.rows(); i++) { for(size_t i2 = 0; i2 < mstruct.columns(); i2++) { item = new QTableWidgetItem(QString::fromStdString(mstruct.getElement(i + 1, i2 + 1)->symbol())); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); matrixTable->setItem((int) i, (int) i2, item); } } } void MatrixWidget::setMatrixString(const QString &str) { if(str.isEmpty()) return; MathStructure m; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&m, CALCULATOR->unlocalizeExpression(str.toStdString(), settings->evalops.parse_options), settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); setMatrix(m); } bool MatrixWidget::isEmpty() const { for(int r = 0; r < matrixTable->rowCount(); r++) { for(int c = 0; c < matrixTable->columnCount(); c++) { QTableWidgetItem *item = matrixTable->item(r, c); if(item && !item->text().isEmpty()) { return false; } } } return true; } qalculate-qt-5.11.0/src/matrixwidget.h000066400000000000000000000022001520501070600176310ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef MATRIX_WIDGET_H #define MATRIX_WIDGET_H #include #include class QTableWidget; class QSpinBox; class MatrixWidget : public QWidget { Q_OBJECT public: MatrixWidget(QWidget *parent = 0, int r = 8, int c = 8); ~MatrixWidget(); QSize sizeHint() const override; QString getMatrixString() const; void setMatrix(const MathStructure&); void setMatrixStrings(const MathStructure&); void setMatrixString(const QString&); void setEditable(bool); bool isEmpty() const; protected: QSpinBox *rowsSpin, *columnsSpin; QTableWidget *matrixTable; protected slots: void matrixRowsChanged(int); void matrixColumnsChanged(int); signals: void matrixChanged(); void dimensionChanged(int, int); }; #endif //MATRIX_WIDGET_H qalculate-qt-5.11.0/src/percentagecalculationdialog.cpp000066400000000000000000000371541520501070600232100ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "percentagecalculationdialog.h" #define PERCENTAGE_ENTRY_ID "QALCULATE DATA1" PercentageCalculationDialog::PercentageCalculationDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Percentage")); QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel(tr("Value 1"), this), 0, 0, Qt::AlignRight); value1Edit = new MathLineEdit(this); value1Edit->setAlignment(Qt::AlignRight); grid->addWidget(value1Edit, 0, 1); value1Edit->setProperty(PERCENTAGE_ENTRY_ID, 1); QFontMetrics fm(value1Edit->font()); QString str; str.fill('0', 27); value1Edit->setMinimumWidth(fm.boundingRect(str).width()); grid->addWidget(new QLabel(tr("Value 2"), this), 1, 0, Qt::AlignRight); value2Edit = new MathLineEdit(this); value2Edit->setAlignment(Qt::AlignRight); grid->addWidget(value2Edit, 1, 1); value2Edit->setProperty(PERCENTAGE_ENTRY_ID, 2); grid->addWidget(new QLabel(tr("Change from 1 to 2"), this), 2, 0, Qt::AlignRight); changeEdit = new MathLineEdit(this); changeEdit->setAlignment(Qt::AlignRight); grid->addWidget(changeEdit, 2, 1); changeEdit->setProperty(PERCENTAGE_ENTRY_ID, 4); grid->addWidget(new QLabel(tr("Change from 1 to 2"), this), 3, 0, Qt::AlignRight); change1Edit = new MathLineEdit(this); change1Edit->setAlignment(Qt::AlignRight); grid->addWidget(change1Edit, 3, 1); change1Edit->setProperty(PERCENTAGE_ENTRY_ID, 8); grid->addWidget(new QLabel("%", this), 3, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("Change from 2 to 1"), this), 4, 0, Qt::AlignRight); change2Edit = new MathLineEdit(this); change2Edit->setAlignment(Qt::AlignRight); grid->addWidget(change2Edit, 4, 1); change2Edit->setProperty(PERCENTAGE_ENTRY_ID, 16); grid->addWidget(new QLabel("%", this), 4, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("2 compared to 1"), this), 5, 0, Qt::AlignRight); compare1Edit = new MathLineEdit(this); compare1Edit->setAlignment(Qt::AlignRight); grid->addWidget(compare1Edit, 5, 1); compare1Edit->setProperty(PERCENTAGE_ENTRY_ID, 32); grid->addWidget(new QLabel("%", this), 5, 2, Qt::AlignRight); grid->addWidget(new QLabel(tr("1 compared to 2"), this), 6, 0, Qt::AlignRight); compare2Edit = new MathLineEdit(this); compare2Edit->setAlignment(Qt::AlignRight); grid->addWidget(compare2Edit, 6, 1); compare2Edit->setProperty(PERCENTAGE_ENTRY_ID, 64); grid->addWidget(new QLabel("%", this), 6, 2, Qt::AlignRight); value1Edit->setFocus(); QLabel *descr = new QLabel("" + tr("Enter two values, of which at most one is a percentage, and the others will be calculated for you.") + "", this); descr->setWordWrap(true); descr->setContentsMargins(0, 6, 0, 12); grid->addWidget(descr, 7, 0, 1, 3); box->addLayout(grid); box->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); clearButton = buttonBox->addButton(tr("Clear"), QDialogButtonBox::ResetRole); clearButton->setEnabled(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(clearButton, SIGNAL(clicked()), this, SLOT(onClearClicked())); connect(value1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(value2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(changeEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(change1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(change2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(compare1Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(compare2Edit, SIGNAL(textEdited(const QString&)), this, SLOT(onPercentageEntryChanged(const QString&))); connect(value1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(value2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(changeEdit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(change1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(change2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(compare1Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); connect(compare2Edit, SIGNAL(editingFinished()), this, SLOT(onPercentageEntryEditingFinished())); updating_percentage_entries = false; } PercentageCalculationDialog::~PercentageCalculationDialog() {} void PercentageCalculationDialog::resetValues(const QString &str) { onClearClicked(); if(!str.trimmed().isEmpty()) { value1Edit->setText(str.trimmed()); percentageEntryChanged(value1Edit->property(PERCENTAGE_ENTRY_ID).toInt(), str.trimmed().isEmpty()); } value1Edit->setFocus(); } void PercentageCalculationDialog::onClearClicked() { updating_percentage_entries = true; value1Edit->clear(); value2Edit->clear(); changeEdit->clear(); change1Edit->clear(); change2Edit->clear(); compare1Edit->clear(); compare2Edit->clear(); clearButton->setEnabled(false); value1Edit->setFocus(); percentage_entries_changes.clear(); updating_percentage_entries = false; } void PercentageCalculationDialog::onPercentageEntryEditingFinished() { QLineEdit *entry = qobject_cast(sender()); int id = entry->property(PERCENTAGE_ENTRY_ID).toInt(); QString str1 = entry->text(); EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; eo.parse_options.base = 10; eo.assume_denominators_nonzero = true; eo.warn_about_denominators_assumed_nonzero = false; MathStructure m1(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str1.toStdString(), eo.parse_options), eo.parse_options)); CALCULATOR->calculate(&m1, 500, eo); PrintOptions po = settings->printops; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; if(id > 4) { po.max_decimals = 2; po.use_max_decimals = true; } entry->blockSignals(true); entry->setText(QString::fromStdString(m1.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m1, 200, po))); entry->blockSignals(false); } void PercentageCalculationDialog::onPercentageEntryChanged(const QString &str) { percentageEntryChanged(qobject_cast(sender())->property(PERCENTAGE_ENTRY_ID).toInt(), str.trimmed().isEmpty()); } void PercentageCalculationDialog::percentageEntryChanged(int entry_id, bool is_empty) { if(updating_percentage_entries) return; for(size_t i = 0; i < percentage_entries_changes.size(); i++) { if(percentage_entries_changes[i] == entry_id) { percentage_entries_changes.erase(percentage_entries_changes.begin() + i); break; } } if(!is_empty) { percentage_entries_changes.push_back(entry_id); updatePercentageEntries(); } clearButton->setEnabled(!percentage_entries_changes.empty()); } void PercentageCalculationDialog::updatePercentageEntries() { if(updating_percentage_entries) return; if(percentage_entries_changes.size() < 2) return; int variant1 = percentage_entries_changes[percentage_entries_changes.size() - 1]; int variant2 = percentage_entries_changes[percentage_entries_changes.size() - 2]; if(variant1 > 4) { for(int i = percentage_entries_changes.size() - 3; i >= 0 && variant2 > 4; i--) { variant2 = percentage_entries_changes[(size_t) i]; } if(variant2 > 4) return; } int variant = variant1 + variant2; updating_percentage_entries = true; MathStructure m1, m2, m3, m4, m5, m6, m7, m1_pre, m2_pre; QString str1, str2; switch(variant) { case 3: {str1 = value1Edit->text(); str2 = value2Edit->text(); break;} case 5: {str1 = value1Edit->text(); str2 = changeEdit->text(); break;} case 9: {str1 = value1Edit->text(); str2 = change1Edit->text(); break;} case 17: {str1 = value1Edit->text(); str2 = change2Edit->text(); break;} case 33: {str1 = value1Edit->text(); str2 = compare1Edit->text(); break;} case 65: {str1 = value1Edit->text(); str2 = compare2Edit->text(); break;} case 6: {str1 = value2Edit->text(); str2 = changeEdit->text(); break;} case 10: {str1 = value2Edit->text(); str2 = change1Edit->text(); break;} case 18: {str1 = value2Edit->text(); str2 = change2Edit->text(); break;} case 34: {str1 = value2Edit->text(); str2 = compare1Edit->text(); break;} case 66: {str1 = value2Edit->text(); str2 = compare2Edit->text(); break;} case 12: {str1 = changeEdit->text(); str2 = change1Edit->text(); break;} case 20: {str1 = changeEdit->text(); str2 = change2Edit->text(); break;} case 36: {str1 = changeEdit->text(); str2 = compare1Edit->text(); break;} case 68: {str1 = changeEdit->text(); str2 = compare2Edit->text(); break;} default: {variant = 0;} } if(str2 == SIGN_MINUS || str1 == SIGN_MINUS) {updating_percentage_entries = false; return;} EvaluationOptions eo; eo.parse_options = settings->evalops.parse_options; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; eo.parse_options.base = 10; eo.assume_denominators_nonzero = true; eo.warn_about_denominators_assumed_nonzero = false; if(variant != 0) { m1_pre.set(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str1.toStdString(), eo.parse_options), eo.parse_options)); m2_pre.set(CALCULATOR->parse(CALCULATOR->unlocalizeExpression(str2.toStdString(), eo.parse_options), eo.parse_options)); } bool b_divzero = false; MathStructure mtest; if(variant == 17 || variant == 65 || variant == 10 || variant == 34 || variant == 12 || variant == 20 || variant == 36 || variant == 68) { mtest = m2_pre; CALCULATOR->calculate(&mtest, 500, eo); if(!mtest.isNumber()) mtest = m_one; } switch(variant) { case 3: {m1 = m1_pre; m2 = m2_pre; break;} case 5: {m1 = m1_pre; m2 = m2_pre; m2 += m1; break;} case 9: {m1 = m1_pre; m2 = m2_pre; m2 /= 100; m2 += 1; m2 *= m1; break;} case 17: { ComparisonResult cr = mtest.number().compare(-100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2_pre += 1; m2 = m1; m2 /= m2_pre; break; } case 33: {m1 = m1_pre; m2 = m2_pre; m2 /= 100; m2 *= m1; break;} case 65: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2 = m1; m2 /= m2_pre; break; } case 6: {m2 = m1_pre; m1 = m1_pre; m1 -= m2_pre; break;} case 10: { ComparisonResult cr = mtest.number().compare(-100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m2 = m1_pre; m2_pre /= 100; m2_pre += 1; m1 = m2; m1 /= m2_pre; break; } case 18: {m2 = m1_pre; m2_pre /= 100; m2_pre += 1; m1 = m2; m1 *= m2_pre; break;} case 34: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m2 = m1_pre; m2_pre /= 100; m1 = m2; m1 /= m2_pre; break; } case 66: {m2 = m1_pre; m2_pre /= 100; m1 = m2; m1 *= m2_pre; break;} case 12: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m1 /= m2_pre; m2 = m1; m2 += m1_pre; break; } case 20: { if(!mtest.number().isNonZero()) {b_divzero = true; break;} m1_pre.negate(); m2 = m1_pre; m2_pre /= 100; m2 /= m2_pre; m1 = m2; m1 += m1_pre; break; } case 36: { ComparisonResult cr = mtest.number().compare(100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1 = m1_pre; m2_pre /= 100; m2_pre -= 1; m1 /= m2_pre; m2 = m1; m2 += m1_pre; break; } case 68: { ComparisonResult cr = mtest.number().compare(100); if(cr == COMPARISON_RESULT_EQUAL || COMPARISON_MIGHT_BE_EQUAL(cr)) {b_divzero = true; break;} m1_pre.negate(); m2 = m1_pre; m2_pre /= 100; m2_pre -= 1; m2 /= m2_pre; m1 = m2; m1 += m1_pre; break; } default: {variant = 0;} } if(b_divzero) { if(variant != 3 && variant != 5 && variant != 9 && variant != 17 && variant != 33 && variant != 65) value1Edit->clear(); if(variant != 3 && variant != 6 && variant != 10 && variant != 18 && variant != 34 && variant != 66) value2Edit->clear(); if(variant != 5 && variant != 6 && variant != 12 && variant != 20 && variant != 36 && variant != 68) changeEdit->clear(); if(variant != 9 && variant != 10 && variant != 12) change1Edit->clear(); if(variant != 17 && variant != 18 && variant != 20) change2Edit->clear(); if(variant != 33 && variant != 34 && variant != 36) compare1Edit->clear(); if(variant != 65 && variant != 66 && variant != 68) compare2Edit->clear(); } else if(variant != 0) { CALCULATOR->calculate(&m1, 500, eo); CALCULATOR->calculate(&m2, 500, eo); m3 = m2; m3 -= m1; m6 = m2; m6 /= m1; m7 = m1; m7 /= m2; m4 = m6; m4 -= 1; m5 = m7; m5 -= 1; m4 *= 100; m5 *= 100; m6 *= 100; m7 *= 100; CALCULATOR->calculate(&m1, 500, eo); CALCULATOR->calculate(&m2, 500, eo); CALCULATOR->calculate(&m3, 500, eo); if(!m1.isZero()) CALCULATOR->calculate(&m4, 500, eo); if(!m2.isZero()) CALCULATOR->calculate(&m5, 500, eo); if(!m1.isZero()) CALCULATOR->calculate(&m6, 500, eo); if(!m2.isZero()) CALCULATOR->calculate(&m7, 500, eo); PrintOptions po = settings->printops; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; if(variant1 != 1) value1Edit->setText(QString::fromStdString(m1.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m1, 200, po))); if(variant1 != 2) value2Edit->setText(QString::fromStdString(m2.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m2, 200, po))); if(variant1 != 4) changeEdit->setText(QString::fromStdString(m3.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m3, 200, po))); po.max_decimals = 2; po.use_max_decimals = true; if(variant1 != 8) change1Edit->setText(m1.isZero() ? QString() : QString::fromStdString(m4.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m4, 200, po))); if(variant1 != 16) change2Edit->setText(m2.isZero() ? QString() : QString::fromStdString(m5.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m5, 200, po))); if(variant1 != 32) compare1Edit->setText(m1.isZero() ? QString() : QString::fromStdString(m6.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m6, 200, po))); if(variant1 != 64) compare2Edit->setText(m2.isZero() ? QString() : QString::fromStdString(m7.isAborted() ? CALCULATOR->timedOutString() : CALCULATOR->print(m7, 200, po))); } CALCULATOR->clearMessages(); updating_percentage_entries = false; } qalculate-qt-5.11.0/src/percentagecalculationdialog.h000066400000000000000000000023541520501070600226470ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef PERCENTAGE_CALCULATION_DIALOG_H #define PERCENTAGE_CALCULATION_DIALOG_H #include #include class QPushButton; class QLineEdit; class PercentageCalculationDialog : public QDialog { Q_OBJECT protected: QLineEdit *value1Edit, *value2Edit, *changeEdit, *change1Edit, *change2Edit, *compare1Edit, *compare2Edit; QPushButton *clearButton; void updatePercentageEntries(); void percentageEntryChanged(int, bool = false); std::vector percentage_entries_changes; bool updating_percentage_entries; protected slots: void onPercentageEntryChanged(const QString&); void onPercentageEntryEditingFinished(); void onClearClicked(); public: PercentageCalculationDialog(QWidget *parent = NULL); virtual ~PercentageCalculationDialog(); void resetValues(const QString &str = QString()); }; #endif //PERCENTAGE_CALCULATION_DIALOG_H qalculate-qt-5.11.0/src/periodictabledialog.cpp000066400000000000000000000246031520501070600214550ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "periodictabledialog.h" PeriodicTableDialog::PeriodicTableDialog(QWidget *parent) : QDialog(parent, Qt::Window | Qt::MSWindowsFixedSizeDialogHint) { setWindowTitle(tr("Periodic Table")); QVBoxLayout *topbox = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); topbox->addLayout(grid); grid->setSpacing(3); QFontMetrics fm(font()); QSize size = fm.boundingRect("AB").size(); size.setWidth(size.width() * 2); size.setHeight(size.height() * 2); for(int i = 1; i <= 18; i++) { QLabel *label = new QLabel(QString::number(i), this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 0, i > 2 ? i + 1 : i, Qt::AlignCenter); } for(int i = 1; i <= 7; i++) { QLabel *label = new QLabel(QString::number(i), this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, i, 0, Qt::AlignCenter); } QLabel *label = new QLabel("*", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 6, 3, Qt::AlignCenter); label = new QLabel("**", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 7, 3, Qt::AlignCenter); label = new QLabel("*", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 9, 3, Qt::AlignCenter); label = new QLabel("**", this); label->setMinimumSize(size); label->setAlignment(Qt::AlignCenter); grid->addWidget(label, 10, 3, Qt::AlignCenter); DataSet *dc = CALCULATOR->getDataSet("atom"); if(dc) { DataProperty *p_xpos = dc->getProperty("x_pos"); DataProperty *p_ypos = dc->getProperty("y_pos"); DataProperty *p_weight = dc->getProperty("weight"); DataProperty *p_number = dc->getProperty("number"); DataProperty *p_symbol = dc->getProperty("symbol"); DataProperty *p_class = dc->getProperty("class"); DataProperty *p_name = dc->getProperty("name"); if(p_xpos && p_ypos && p_weight && p_number && p_symbol && p_class && p_name) { int x_pos = 0, y_pos = 0; for(int i = 1; i < 120; i++) { DataObject *e = dc->getObject(i2s(i)); if(e) { x_pos = s2i(e->getProperty(p_xpos)); y_pos = s2i(e->getProperty(p_ypos)); } if(e && x_pos > 0 && x_pos <= 18 && y_pos > 0 && y_pos <= 10) { QPushButton *e_button = new QPushButton(QString::fromStdString(e->getProperty(p_symbol)), this); e_button->setFlat(true); int group = s2i(e->getProperty(p_class)); if(group > 0 && group <= 11) { QPalette pal = e_button->palette(); switch(group) { case 1: {pal.setColor(QPalette::Button, QColor("#eeccee")); break;} case 2: {pal.setColor(QPalette::Button, QColor("#ddccee")); break;} case 3: {pal.setColor(QPalette::Button, QColor("#ccddff")); break;} case 4: {pal.setColor(QPalette::Button, QColor("#ddeeff")); break;} case 5: {pal.setColor(QPalette::Button, QColor("#cceeee")); break;} case 6: {pal.setColor(QPalette::Button, QColor("#bbffbb")); break;} case 7: {pal.setColor(QPalette::Button, QColor("#eeffdd")); break;} case 8: {pal.setColor(QPalette::Button, QColor("#ffffaa")); break;} case 9: {pal.setColor(QPalette::Button, QColor("#ffddaa")); break;} case 10: {pal.setColor(QPalette::Button, QColor("#ffccdd")); break;} case 11: {pal.setColor(QPalette::Button, QColor("#aaeedd")); break;} default: {} } pal.setColor(QPalette::ButtonText, QColor("#000000")); pal.setColor(QPalette::Text, QColor("#000000")); pal.setColor(QPalette::WindowText, QColor("#000000")); e_button->setAutoFillBackground(true); e_button->setPalette(pal); e_button->update(); } if(x_pos > 2) { grid->addWidget(e_button, y_pos, x_pos + 1); } else { grid->addWidget(e_button, y_pos, x_pos); } std::string tip = e->getProperty(p_number); tip += " "; tip += e->getProperty(p_name); std::string weight = e->getPropertyDisplayString(p_weight); if(!weight.empty() && weight != "-") { tip += "\n"; tip += weight; } e_button->setToolTip(QString::fromStdString(tip)); e_button->setProperty("ELEMENT OBJECT", QVariant::fromValue((void*) e)); if(i == 1) { QMargins margins = e_button->contentsMargins(); if(margins.left() + margins.right() > size.width() / 2 - 3) { size.setWidth(size.width() / 2 + 4 + margins.left() + margins.right()); } if(margins.bottom() + margins.top() > size.height() / 2 - 3) { size.setWidth(size.height() / 2 + 4 + margins.bottom() + margins.top()); } } e_button->setMinimumSize(size); e_button->setMaximumSize(size); connect(e_button, SIGNAL(clicked()), this, SLOT(elementClicked())); } } } } for(int i = 0; i < 20; i++) { grid->setColumnStretch(i, 1); } for(int i = 0; i < 10; i++) { grid->setRowStretch(i, 1); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); buttonBox->setFocus(); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); layout()->setSizeConstraint(QLayout::SetFixedSize); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } PeriodicTableDialog::~PeriodicTableDialog() {} void PeriodicTableDialog::reject() { for(QMap::const_iterator it = elementDialogs.constBegin(); it != elementDialogs.constEnd(); ++it) { (*it)->reject(); } QDialog::reject(); } void PeriodicTableDialog::onAlwaysOnTopChanged() { if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); for(QMap::const_iterator it = elementDialogs.constBegin(); it != elementDialogs.constEnd(); ++it) { if(settings->always_on_top) (*it)->setWindowFlags((*it)->windowFlags() | Qt::WindowStaysOnTopHint); else (*it)->setWindowFlags((*it)->windowFlags() & ~Qt::WindowStaysOnTopHint); } } void PeriodicTableDialog::elementClicked() { DataObject *e = (DataObject*) sender()->property("ELEMENT OBJECT").value(); QMap::const_iterator qit = elementDialogs.find(e); if(qit != elementDialogs.constEnd()) { (*qit)->show(); qApp->processEvents(); (*qit)->raise(); (*qit)->activateWindow(); return; } QDialog *dialog = new QDialog(this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); dialog->setWindowTitle(tr("Element Data")); QVBoxLayout *topbox = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); topbox->addLayout(grid); DataSet *ds = e->parentSet(); DataProperty *p_number = ds->getProperty("number"); DataProperty *p_symbol = ds->getProperty("symbol"); DataProperty *p_class = ds->getProperty("class"); DataProperty *p_name = ds->getProperty("name"); int group = s2i(e->getProperty(p_class)); QString group_name; switch(group) { case ALKALI_METALS: {group_name = tr("Alkali Metal"); break;} case ALKALI_EARTH_METALS: {group_name = tr("Alkaline-Earth Metal"); break;} case LANTHANIDES: {group_name = tr("Lanthanide"); break;} case ACTINIDES: {group_name = tr("Actinide"); break;} case TRANSITION_METALS: {group_name = tr("Transition Metal"); break;} case METALS: {group_name = tr("Metal"); break;} case METALLOIDS: {group_name = tr("Metalloid"); break;} case NONMETALS: {group_name = tr("Polyatomic Non-Metal"); break;} case HALOGENS: {group_name = tr("Diatomic Non-Metal"); break;} case NOBLE_GASES: {group_name = tr("Noble Gas"); break;} case TRANSACTINIDES: {group_name = tr("Unknown chemical properties"); break;} default: {group_name = tr("Unknown"); break;} } grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_number))), dialog), 0, 0, 1, 3, Qt::AlignRight); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_symbol))), dialog), 1, 0, 1, 3); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(QString::fromStdString(e->getProperty(p_name))), dialog), 2, 0, 1, 3); grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(tr("%1:").arg(QString::fromStdString(p_class->title()))), dialog), 3, 0); grid->addWidget(new QLabel(group_name, dialog), 3, 1); DataPropertyIter it; DataProperty *dp = ds->getFirstProperty(&it); int row = 4; while(dp) { if(!dp->isHidden() && dp != p_number && dp != p_class && dp != p_symbol && dp != p_name) { std::string sval = e->getPropertyDisplayString(dp); if(!sval.empty()) { grid->addWidget(new QLabel(QStringLiteral("
%1
").arg(tr("%1:").arg(QString::fromStdString(dp->title()))), dialog), row, 0); grid->addWidget(new QLabel(QString::fromStdString(sval), dialog), row, 1); QPushButton *button = new QPushButton(LOAD_COLORED_ICON("edit-paste"), QString(), dialog); grid->addWidget(button, row, 2); button->setProperty("ELEMENT OBJECT", QVariant::fromValue((void*) e)); button->setProperty("ELEMENT PROPERTY", QVariant::fromValue((void*) dp)); connect(button, SIGNAL(clicked()), this, SLOT(propertyClicked())); row++; } } dp = ds->getNextProperty(&it); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, dialog); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), dialog, SLOT(reject())); dialog->layout()->setSizeConstraint(QLayout::SetFixedSize); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); elementDialogs[e] = dialog; dialog->show(); } void PeriodicTableDialog::propertyClicked() { emit insertPropertyRequest((DataObject*) sender()->property("ELEMENT OBJECT").value(), (DataProperty*) sender()->property("ELEMENT PROPERTY").value()); } qalculate-qt-5.11.0/src/periodictabledialog.h000066400000000000000000000016761520501070600211270ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef PERIODIC_TABLE_DIALOG_H #define PERIODIC_TABLE_DIALOG_H #include #include #include class PeriodicTableDialog : public QDialog { Q_OBJECT protected: QMap elementDialogs; protected slots: void elementClicked(); void propertyClicked(); public slots: void reject() override; void onAlwaysOnTopChanged(); public: PeriodicTableDialog(QWidget *parent = NULL); virtual ~PeriodicTableDialog(); signals: void insertPropertyRequest(DataObject*, DataProperty*); }; #endif //PERIODIC_TABLE_DIALOG_H qalculate-qt-5.11.0/src/plotdialog.cpp000066400000000000000000000671411520501070600176310ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "plotdialog.h" #define TYPE_ROLE Qt::UserRole #define YAXIS2_ROLE Qt::UserRole + 1 #define STYLE_ROLE Qt::UserRole + 2 #define SMOOTHING_ROLE Qt::UserRole + 3 #define ROWS_ROLE Qt::UserRole + 4 #define YVECTOR_ROLE Qt::UserRole + 5 #define XVECTOR_ROLE Qt::UserRole + 6 #define X_ROLE Qt::UserRole + 7 PlotDialog::PlotDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Plot")); QVBoxLayout *topbox = new QVBoxLayout(this); tabs = new QTabWidget(this); topbox->addWidget(tabs); QWidget *tab; QGridLayout *grid; QHBoxLayout *hbox; QButtonGroup *group; int r = 0; plotThread = NULL; tab = new QWidget(this); tabs->addTab(tab, tr("Data")); grid = new QGridLayout(tab); grid->addWidget(new QLabel(tr("Title:")), r, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Expression:")), r, 0); expressionEdit = new MathLineEdit(this); grid->addWidget(expressionEdit, r, 1); r++; connect(expressionEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableDisableButtons())); connect(expressionEdit, SIGNAL(returnPressed()), this, SLOT(onExpressionActivated())); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 0, 1, 2); r++; hbox->addStretch(1); group = new QButtonGroup(this); functionButton = new QRadioButton(tr("Function"), this); group->addButton(functionButton, 0); hbox->addWidget(functionButton); vectorButton = new QRadioButton(tr("Vector/matrix"), this); group->addButton(vectorButton, 1); hbox->addWidget(vectorButton); pairedButton = new QRadioButton(tr("Paired matrix"), this); group->addButton(pairedButton, 2); hbox->addWidget(pairedButton); group->button(settings->default_plot_type)->setChecked(true); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(onTypeToggled(QAbstractButton*, bool))); rowsBox = new QCheckBox(tr("Rows"), this); hbox->addWidget(rowsBox); rowsBox->setChecked(settings->default_plot_rows); rowsBox->setEnabled(settings->default_plot_type > 0); grid->addWidget(new QLabel(tr("X variable:")), r, 0); variableEdit = new QLineEdit(this); grid->addWidget(variableEdit, r, 1); r++; variableEdit->setText(QString::fromStdString(settings->default_plot_variable)); variableEdit->setEnabled(settings->default_plot_type == 0); connect(variableEdit, SIGNAL(textChanged(const QString&)), this, SLOT(enableDisableButtons())); grid->addWidget(new QLabel(tr("Style:")), r, 0); styleCombo = new QComboBox(this); grid->addWidget(styleCombo, r, 1); r++; styleCombo->addItem(tr("Line"), PLOT_STYLE_LINES); styleCombo->addItem(tr("Points"), PLOT_STYLE_POINTS); styleCombo->addItem(tr("Line with points"), PLOT_STYLE_POINTS_LINES); styleCombo->addItem(tr("Boxes/bars"), PLOT_STYLE_BOXES); styleCombo->addItem(tr("Histogram"), PLOT_STYLE_HISTOGRAM); styleCombo->addItem(tr("Steps"), PLOT_STYLE_STEPS); styleCombo->addItem(tr("Candlesticks"), PLOT_STYLE_CANDLESTICKS); styleCombo->addItem(tr("Dots"), PLOT_STYLE_DOTS); styleCombo->addItem(tr("Polar"), PLOT_STYLE_POLAR); styleCombo->setCurrentIndex(styleCombo->findData(settings->default_plot_style)); grid->addWidget(new QLabel(tr("Smoothing:")), r, 0); smoothingCombo = new QComboBox(this); grid->addWidget(smoothingCombo, r, 1); r++; smoothingCombo->addItem(tr("None"), PLOT_SMOOTHING_NONE); smoothingCombo->addItem(tr("Monotonic"), PLOT_SMOOTHING_UNIQUE); smoothingCombo->addItem(tr("Natural cubic splines"), PLOT_SMOOTHING_CSPLINES); smoothingCombo->addItem(tr("Bezier"), PLOT_SMOOTHING_BEZIER); smoothingCombo->addItem(tr("Bezier (monotonic)"), PLOT_SMOOTHING_SBEZIER); smoothingCombo->setCurrentIndex(smoothingCombo->findData(settings->default_plot_smoothing)); grid->addWidget(new QLabel(tr("Y-axis:")), r, 0); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 1); r++; group = new QButtonGroup(this); primaryButton = new QRadioButton(tr("Primary"), this); group->addButton(primaryButton); hbox->addWidget(primaryButton); secondaryButton = new QRadioButton(tr("Secondary"), this); group->addButton(secondaryButton); hbox->addWidget(secondaryButton); primaryButton->setChecked(true); hbox->addStretch(1); hbox = new QHBoxLayout(); grid->addLayout(hbox, r, 0, 1, 2); r++; hbox->addStretch(1); addButton = new QPushButton(tr("Add"), this); hbox->addWidget(addButton); addButton->setEnabled(false); connect(addButton, SIGNAL(clicked()), this, SLOT(onAddClicked())); applyButton = new QPushButton(tr("Apply"), this); hbox->addWidget(applyButton); applyButton->setEnabled(false); connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyClicked())); removeButton = new QPushButton(tr("Remove"), this); hbox->addWidget(removeButton); removeButton->setEnabled(false); connect(removeButton, SIGNAL(clicked()), this, SLOT(onRemoveClicked())); graphsTable = new QTreeWidget(this); grid->addWidget(graphsTable, r, 0, 1, 2); grid->setRowStretch(r, 1); r++; graphsTable->setSelectionMode(QAbstractItemView::ExtendedSelection); graphsTable->setColumnCount(2); QStringList list; list << tr("Title"); list << tr("Expression"); graphsTable->setHeaderLabels(list); graphsTable->setRootIsDecorated(false); connect(graphsTable, SIGNAL(itemSelectionChanged()), this, SLOT(onGraphsSelectionChanged())); tab = new QWidget(this); tabs->addTab(tab, tr("Function Range")); grid = new QGridLayout(tab); r = 0; grid->addWidget(new QLabel(tr("Minimum x value:")), r, 0); minxEdit = new MathLineEdit(this); grid->addWidget(minxEdit, r, 1); r++; minxEdit->setText(QString::fromStdString(settings->default_plot_min)); grid->addWidget(new QLabel(tr("Maximum x value:")), r, 0); maxxEdit = new MathLineEdit(this); grid->addWidget(maxxEdit, r, 1); r++; maxxEdit->setText(QString::fromStdString(settings->default_plot_max)); group = new QButtonGroup(this); rateButton = new QRadioButton(tr("Sampling rate:"), this); group->addButton(rateButton, 0); grid->addWidget(rateButton, r, 0); rateSpin = new QSpinBox(this); grid->addWidget(rateSpin, r, 1); r++; rateSpin->setSingleStep(2); rateSpin->setRange(1, 1000000); rateSpin->setValue(settings->default_plot_sampling_rate); rateButton->setChecked(settings->default_plot_use_sampling_rate); rateSpin->setEnabled(settings->default_plot_use_sampling_rate); stepButton = new QRadioButton(tr("Step size:"), this); group->addButton(stepButton, 1); grid->addWidget(stepButton, r, 0); stepEdit = new MathLineEdit(this); grid->addWidget(stepEdit, r, 1); r++; stepEdit->setText(QString::fromStdString(settings->default_plot_step)); stepButton->setChecked(!settings->default_plot_use_sampling_rate); stepEdit->setEnabled(!settings->default_plot_use_sampling_rate); complexBox = new QCheckBox(tr("Show real and imaginary parts"), this); grid->addWidget(complexBox, r, 0, 1, 2); complexBox->setChecked(settings->default_plot_complex); r++; connect(complexBox, SIGNAL(clicked(bool)), this, SLOT(onComplexClicked(bool))); connect(group, SIGNAL(buttonToggled(QAbstractButton*, bool)), this, SLOT(onRateStepToggled(QAbstractButton*, bool))); applyButton2 = new QPushButton(tr("Apply"), this); grid->addWidget(applyButton2, r, 0, 1, 2, Qt::AlignRight | Qt::AlignTop); grid->setRowStretch(r, 1); connect(applyButton2, SIGNAL(clicked()), this, SLOT(onApply2Clicked())); tab = new QWidget(this); tabs->addTab(tab, tr("Appearance")); grid = new QGridLayout(tab); r = 0; grid->addWidget(new QLabel(tr("Title:")), r, 0); titleEdit2 = new QLineEdit(this); grid->addWidget(titleEdit2, r, 1); r++; gridBox = new QCheckBox(tr("Display grid"), this); grid->addWidget(gridBox, r, 0); gridBox->setChecked(settings->default_plot_display_grid); borderBox = new QCheckBox(tr("Display full border"), this); grid->addWidget(borderBox, r, 1); r++; borderBox->setChecked(settings->default_plot_full_border); minyBox = new QCheckBox(tr("Minimum y value:"), this); grid->addWidget(minyBox, r, 0); minySpin = new QSpinBox(this); grid->addWidget(minySpin, r, 1); r++; minySpin->setEnabled(false); minySpin->setRange(INT_MIN, INT_MAX); minySpin->setValue(-1); connect(minyBox, SIGNAL(toggled(bool)), minySpin, SLOT(setEnabled(bool))); maxyBox = new QCheckBox(tr("Maximum y value:"), this); grid->addWidget(maxyBox, r, 0); maxySpin = new QSpinBox(this); grid->addWidget(maxySpin, r, 1); r++; maxySpin->setEnabled(false); maxySpin->setRange(INT_MIN, INT_MAX); maxySpin->setValue(10); connect(maxyBox, SIGNAL(toggled(bool)), maxySpin, SLOT(setEnabled(bool))); logxBox = new QCheckBox(tr("Logarithmic x scale:"), this); grid->addWidget(logxBox, r, 0); logxSpin = new QSpinBox(this); grid->addWidget(logxSpin, r, 1); r++; logxSpin->setRange(2, 100); logxSpin->setValue(10); logxSpin->setEnabled(false); connect(logxBox, SIGNAL(toggled(bool)), logxSpin, SLOT(setEnabled(bool))); logyBox = new QCheckBox(tr("Logarithmic y scale:"), this); grid->addWidget(logyBox, r, 0); logySpin = new QSpinBox(this); grid->addWidget(logySpin, r, 1); r++; logySpin->setRange(2, 100); logySpin->setValue(10); logySpin->setEnabled(false); connect(logyBox, SIGNAL(toggled(bool)), logySpin, SLOT(setEnabled(bool))); grid->addWidget(new QLabel(tr("X-axis label:")), r, 0); xaxisEdit = new QLineEdit(this); grid->addWidget(xaxisEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Y-axis label:")), r, 0); yaxisEdit = new QLineEdit(this); grid->addWidget(yaxisEdit, r, 1); r++; grid->addWidget(new QLabel(tr("Line width:")), r, 0); lineSpin = new QSpinBox(this); grid->addWidget(lineSpin, r, 1); r++; lineSpin->setRange(1, 10); lineSpin->setValue(settings->default_plot_linewidth); grid->addWidget(new QLabel(tr("Legend placement:")), r, 0); legendCombo = new QComboBox(this); grid->addWidget(legendCombo, r, 1); r++; legendCombo->addItem(tr("None"), PLOT_LEGEND_NONE); legendCombo->addItem(tr("Top-left"), PLOT_LEGEND_TOP_LEFT); legendCombo->addItem(tr("Top-right"), PLOT_LEGEND_TOP_RIGHT); legendCombo->addItem(tr("Bottom-left"), PLOT_LEGEND_BOTTOM_LEFT); legendCombo->addItem(tr("Bottom-right"), PLOT_LEGEND_BOTTOM_RIGHT); legendCombo->addItem(tr("Below"), PLOT_LEGEND_BELOW); legendCombo->addItem(tr("Outside"), PLOT_LEGEND_OUTSIDE); legendCombo->setCurrentIndex(legendCombo->findData(settings->default_plot_legend_placement)); applyButton3 = new QPushButton(tr("Apply"), this); grid->addWidget(applyButton3, r, 0, 1, 2, Qt::AlignRight | Qt::AlignTop); grid->setRowStretch(r, 1); connect(applyButton3, SIGNAL(clicked()), this, SLOT(onApply3Clicked())); expressionEdit->setFocus(); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); } PlotDialog::~PlotDialog() {} void PlotDialog::reject() { resetParameters(); settings->default_plot_legend_placement = (PlotLegendPlacement) legendCombo->currentData().toInt(); settings->default_plot_smoothing = (PlotSmoothing) smoothingCombo->currentData().toInt(); settings->default_plot_style = (PlotStyle) styleCombo->currentData().toInt(); settings->default_plot_display_grid = gridBox->isChecked(); settings->default_plot_full_border = borderBox->isChecked(); settings->default_plot_min = minxEdit->text().toStdString(); settings->default_plot_max = maxxEdit->text().toStdString(); settings->default_plot_step = stepEdit->text().toStdString(); settings->default_plot_sampling_rate = rateSpin->value(); settings->default_plot_linewidth = lineSpin->value(); settings->default_plot_rows = rowsBox->isChecked(); settings->default_plot_type = (vectorButton->isChecked() ? 1 : (pairedButton->isChecked() ? 2 : 0)); settings->default_plot_variable = variableEdit->text().toStdString(); settings->default_plot_use_sampling_rate = rateButton->isChecked(); CALCULATOR->closeGnuplot(); if(plotThread && plotThread->running) { plotThread->write(0); } QDialog::reject(); } void PlotDialog::resetParameters() { expressionEdit->clear(); titleEdit->clear(); titleEdit2->clear(); xaxisEdit->clear(); yaxisEdit->clear(); graphsTable->clear(); addButton->setEnabled(false); removeButton->setEnabled(false); applyButton->setEnabled(false); primaryButton->setChecked(true); } void PlotDialog::enableDisableButtons() { bool b = (!functionButton->isChecked() || !variableEdit->text().trimmed().isEmpty()) && !expressionEdit->text().trimmed().isEmpty(); addButton->setEnabled(b); QList list = graphsTable->selectedItems(); removeButton->setEnabled(list.count() >= 1); applyButton->setEnabled(b && list.count() == 1); } void PlotDialog::setExpression(const QString &str) { expressionEdit->setText(str); expressionEdit->setFocus(); expressionEdit->selectAll(); } void PlotDialog::onExpressionActivated() { if(applyButton->isEnabled()) onApplyClicked(); else if(addButton->isEnabled()) onAddClicked(); } void PlotDialog::onAddClicked() { QTreeWidgetItem *item = new QTreeWidgetItem(graphsTable); updateItem(item); graphsTable->selectionModel()->clear(); item->setSelected(true); expressionEdit->setFocus(); expressionEdit->selectAll(); updatePlot(); } std::string plot_min, plot_max, plot_x, plot_str, plot_step; int plot_rate; bool plot_busy; int plot_complex; std::vector y_vectors; std::vector x_vectors; std::vector pdps; PlotParameters pp; void PlotDialog::abort() { CALCULATOR->abort(); } class PlotThread : public Thread { protected: void run() { while(true) { EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; eo.parse_options.read_precision = DONT_READ_PRECISION; int type = -1; if(!read(&type) || type <= 0) return; if(type == 2) { CALCULATOR->startControl(); CALCULATOR->plotVectors(&pp, y_vectors, x_vectors, pdps, false, 0); CALCULATOR->stopControl(); } else { void *x = NULL; if(!read(&x) || !x) return; MathStructure *y_vector = (MathStructure*) x; if(!read(&x)) return; CALCULATOR->beginTemporaryStopIntervalArithmetic(); CALCULATOR->startControl(); if(!x) { y_vector->set(CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), eo)); } else { MathStructure *x_vector = (MathStructure*) x; MathStructure min = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_min, eo.parse_options), eo); MathStructure max = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_max, eo.parse_options), eo); if(plot_rate < 0) { MathStructure m_step = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(plot_step, eo.parse_options), eo); if(!CALCULATOR->aborted()) { y_vector->set(CALCULATOR->expressionToPlotVector(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), min, max, m_step, plot_complex >= 0 ? plot_complex : settings->evalops.allow_complex, x_vector, plot_x, eo.parse_options, 0)); } } else if(!CALCULATOR->aborted()) { y_vector->set(CALCULATOR->expressionToPlotVector(CALCULATOR->unlocalizeExpression(plot_str, eo.parse_options), min, max, plot_rate, plot_complex, x_vector, plot_x, eo.parse_options, 0)); } } CALCULATOR->stopControl(); CALCULATOR->endTemporaryStopIntervalArithmetic(); } plot_busy = false; } } }; void PlotDialog::generatePlotSeries(MathStructure **x_vector, MathStructure **y_vector, int type, QString str, QString str_x) { *y_vector = new MathStructure(); plot_str = str.toStdString(); plot_x = str_x.toStdString(); if(type == 1 || type == 2) { *x_vector = NULL; } else { *x_vector = new MathStructure(); (*x_vector)->clearVector(); plot_min = minxEdit->text().toStdString(); plot_max = maxxEdit->text().toStdString(); if(stepButton->isChecked()) { plot_rate = -1; plot_step = stepEdit->text().toStdString(); } else { plot_rate = rateSpin->value(); } plot_complex = settings->default_plot_complex; } plot_busy = true; if(!plotThread) plotThread = new PlotThread; if(!plotThread->running) plotThread->start(); if(plotThread->write(1) && plotThread->write((void*) *y_vector) && plotThread->write((void*) *x_vector)) { QProgressDialog *dialog = NULL; PREPARE_TIMECHECK(1000) for(int i = 0; plot_busy && plotThread->running && i < 10000; i++) { sleep_ms(1); DO_TIMECHECK {break;} } if(plot_busy && plotThread->running) { dialog = new QProgressDialog(tr("Calculating…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Calculating…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); } while(plot_busy && plotThread->running) { qApp->processEvents(); sleep_ms(10); } if(dialog) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); } } settings->displayMessages(this); } bool PlotDialog::generatePlot() { for(int i = 0; ; i++) { QTreeWidgetItem *item = graphsTable->topLevelItem(i); if(!item) { if(i == 0) return false; break; } MathStructure *x_vector = (MathStructure*) item->data(0, XVECTOR_ROLE).value(); MathStructure *y_vector = (MathStructure*) item->data(0, YVECTOR_ROLE).value(); std::string title = item->text(0).toStdString(); std::string expr = item->text(1).toStdString(); int type = item->data(0, TYPE_ROLE).toInt(); int style = item->data(0, STYLE_ROLE).toInt(); int smoothing = item->data(0, SMOOTHING_ROLE).toInt(); bool yaxis2 = item->data(0, YAXIS2_ROLE).toBool(); bool rows = item->data(0, ROWS_ROLE).toBool(); int count = 1; if(type == 1) { if(y_vector->isMatrix()) { count = 0; if(rows) { for(size_t i = 1; i <= y_vector->rows(); i++) { y_vectors.push_back(m_undefined); y_vector->rowToVector(i, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); count++; } } else { for(size_t i = 1; i <= y_vector->columns(); i++) { y_vectors.push_back(m_undefined); y_vector->columnToVector(i, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); count++; } } } else if(y_vector->isVector()) { y_vectors.push_back(*y_vector); x_vectors.push_back(m_undefined); } else { y_vectors.push_back(*y_vector); y_vectors[y_vectors.size() - 1].transform(STRUCT_VECTOR); x_vectors.push_back(m_undefined); } } else if(type == 2) { if(y_vector->isMatrix()) { count = 0; if(rows) { for(size_t i = 1; i <= y_vector->rows(); i += 2) { y_vectors.push_back(m_undefined); y_vector->rowToVector(i + 1, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); y_vector->rowToVector(i, x_vectors[x_vectors.size() - 1]); count++; } } else { for(size_t i = 1; i <= y_vector->columns(); i += 2) { y_vectors.push_back(m_undefined); y_vector->columnToVector(i + 1, y_vectors[y_vectors.size() - 1]); x_vectors.push_back(m_undefined); y_vector->columnToVector(i, x_vectors[x_vectors.size() - 1]); count++; } } } else if(y_vector->isVector()) { y_vectors.push_back(*y_vector); x_vectors.push_back(m_undefined); } else { y_vectors.push_back(*y_vector); y_vectors[y_vectors.size() - 1].transform(STRUCT_VECTOR); x_vectors.push_back(m_undefined); } } else { y_vectors.push_back(*y_vector); x_vectors.push_back(*x_vector); } for(int i = 0; i < count; i++) { PlotDataParameters *pdp = new PlotDataParameters(); pdp->title = title; if(pdp->title.empty()) { pdp->title = expr; } if(count > 1) { pdp->title += " :"; pdp->title += i2s(i + 1); } pdp->test_continuous = (type != 1 && type != 2); pdp->smoothing = (PlotSmoothing) smoothing; pdp->style = (PlotStyle) style; pdp->yaxis2 = yaxis2; pdps.push_back(pdp); } } pp.legend_placement = (PlotLegendPlacement) legendCombo->currentData().toInt(); pp.title = titleEdit2->text().toStdString(); pp.x_label = xaxisEdit->text().toStdString(); pp.y_label = yaxisEdit->text().toStdString(); pp.grid = gridBox->isChecked(); pp.x_log = logxBox->isChecked(); pp.y_log = logyBox->isChecked(); pp.x_log_base = logxSpin->value(); pp.y_log_base = logySpin->value(); pp.auto_y_min = !minyBox->isChecked(); pp.auto_y_max = !maxyBox->isChecked(); pp.y_min = minySpin->value(); pp.y_max = maxySpin->value(); pp.color = settings->default_plot_color; pp.show_all_borders = borderBox->isChecked(); pp.linewidth = lineSpin->value(); return true; } void PlotDialog::updatePlot() { if(!generatePlot()) { CALCULATOR->closeGnuplot(); return; } plot_busy = true; if(!plotThread) plotThread = new PlotThread; if(!plotThread->running) plotThread->start(); if(plotThread->write(2)) { QProgressDialog *dialog = NULL; PREPARE_TIMECHECK(1000) for(int i = 0; plot_busy && plotThread->running && i < 10000; i++) { sleep_ms(1); DO_TIMECHECK {break;} } if(plot_busy && plotThread->running) { dialog = new QProgressDialog(tr("Processing…"), tr("Cancel"), 0, 0, this); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); } while(plot_busy && plotThread->running) { qApp->processEvents(); sleep_ms(10); } if(dialog) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); } } settings->displayMessages(this); for(size_t i = 0; i < pdps.size(); i++) { if(pdps[i]) delete pdps[i]; } pdps.clear(); x_vectors.clear(); y_vectors.clear(); } void PlotDialog::updateItem(QTreeWidgetItem *item) { int type = (vectorButton->isChecked() ? 1 : (pairedButton->isChecked() ? 2 : 0)); QString expression = expressionEdit->text().trimmed(); QString title = titleEdit->text().trimmed(); QString str_x = variableEdit->text().trimmed(); if((type == 1 || type == 2) && title.isEmpty()) { Variable *v = CALCULATOR->getActiveVariable(expression.toStdString()); if(v) { title = QString::fromStdString(v->title(false)); } } MathStructure *x_vector, *y_vector; generatePlotSeries(&x_vector, &y_vector, type, expression, str_x); bool b_multiple = (type != 1 && type != 2 && y_vector->isMatrix() && expression != item->text(1)); MathStructure mfunc; if(b_multiple) { EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; eo.parse_options.read_precision = DONT_READ_PRECISION; eo.interval_calculation = INTERVAL_CALCULATION_NONE; mfunc = CALCULATOR->parse(expression.toStdString(), eo.parse_options); if(!mfunc.isVector()) { CALCULATOR->beginTemporaryStopIntervalArithmetic(); CALCULATOR->beginTemporaryStopMessages(); mfunc.eval(eo); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->endTemporaryStopIntervalArithmetic(); if(!mfunc.isVector() || mfunc.size() != y_vector->columns()) b_multiple = false; } } PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) expressionEdit; po.base = 10; po.is_approximate = NULL; po.allow_non_usable = false; for(size_t i = 0; ; i++) { if(b_multiple) { MathStructure *m = new MathStructure(); y_vector->columnToVector(i + 1, *m); item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) m)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) new MathStructure(*x_vector))); QString str = QString::fromStdString(mfunc[i].print(po)); item->setText(1, str); if(i == 0) expressionEdit->setText(str); } else { item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) y_vector)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) x_vector)); item->setText(1, expression); } item->setData(0, TYPE_ROLE, type); item->setData(0, YAXIS2_ROLE, secondaryButton->isChecked()); item->setData(0, ROWS_ROLE, rowsBox->isChecked()); item->setData(0, SMOOTHING_ROLE, smoothingCombo->currentData()); item->setData(0, STYLE_ROLE, styleCombo->currentData()); item->setData(0, X_ROLE, str_x); item->setText(0, title); item->setTextAlignment(1, Qt::AlignRight | Qt::AlignVCenter); if(!b_multiple || i + 1 >= y_vector->columns()) break; item = new QTreeWidgetItem(graphsTable); } if(b_multiple) { delete y_vector; delete x_vector; } } void PlotDialog::onApplyClicked() { QList list = graphsTable->selectedItems(); if(list.count() != 1) return; MathStructure *x_vector = (MathStructure*) list[0]->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) list[0]->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; updateItem(list[0]); expressionEdit->setFocus(); expressionEdit->selectAll(); updatePlot(); } void PlotDialog::onRemoveClicked() { QList list = graphsTable->selectedItems(); for(int i = 0; i < list.count(); i++) { MathStructure *x_vector = (MathStructure*) list[i]->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) list[i]->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; delete list[i]; } updatePlot(); } void PlotDialog::onComplexClicked(bool b) { settings->default_plot_complex = b; } void PlotDialog::onApply2Clicked() { for(int i = 0; ; i++) { QTreeWidgetItem *item = graphsTable->topLevelItem(i); if(!item) break; MathStructure *x_vector = (MathStructure*) item->data(0, XVECTOR_ROLE).value(); if(x_vector) delete x_vector; MathStructure *y_vector = (MathStructure*) item->data(0, YVECTOR_ROLE).value(); if(y_vector) delete y_vector; generatePlotSeries(&x_vector, &y_vector, item->data(0, TYPE_ROLE).toInt(), item->text(1), item->data(0, X_ROLE).toString()); item->setData(0, YVECTOR_ROLE, QVariant::fromValue((void*) y_vector)); item->setData(0, XVECTOR_ROLE, QVariant::fromValue((void*) x_vector)); } updatePlot(); } void PlotDialog::onApply3Clicked() { updatePlot(); } void PlotDialog::onTypeToggled(QAbstractButton *w, bool b) { if(b) { rowsBox->setEnabled(w != functionButton); variableEdit->setEnabled(w == functionButton); enableDisableButtons(); } } void PlotDialog::onRateStepToggled(QAbstractButton *w, bool b) { if(b) { rateSpin->setEnabled(w == rateButton); stepEdit->setEnabled(w == stepButton); } } void PlotDialog::onGraphsSelectionChanged() { enableDisableButtons(); QList list = graphsTable->selectedItems(); if(list.count() != 1) return; QTreeWidgetItem *item = list[0]; titleEdit->setText(item->text(0)); expressionEdit->setText(item->text(1)); variableEdit->setText(item->data(0, X_ROLE).toString()); primaryButton->setChecked(!item->data(0, YAXIS2_ROLE).toBool()); secondaryButton->setChecked(item->data(0, YAXIS2_ROLE).toBool()); rowsBox->setChecked(item->data(0, ROWS_ROLE).toBool()); styleCombo->setCurrentIndex(styleCombo->findData(item->data(0, STYLE_ROLE).toInt())); smoothingCombo->setCurrentIndex(smoothingCombo->findData(item->data(0, SMOOTHING_ROLE).toInt())); int type = item->data(0, TYPE_ROLE).toInt(); vectorButton->setChecked(type == 1); pairedButton->setChecked(type == 2); functionButton->setChecked(type == 0); } qalculate-qt-5.11.0/src/plotdialog.h000066400000000000000000000041341520501070600172670ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef PLOT_DIALOG_H #define PLOT_DIALOG_H #include #include class QLineEdit; class QPushButton; class QRadioButton; class QCheckBox; class QSpinBox; class QComboBox; class QTreeWidget; class QTreeWidgetItem; class QTabWidget; class QAbstractButton; class PlotDialog : public QDialog { Q_OBJECT protected: QLineEdit *titleEdit, *expressionEdit, *variableEdit, *stepEdit, *titleEdit2, *xaxisEdit, *yaxisEdit, *minxEdit, *maxxEdit; QRadioButton *functionButton, *vectorButton, *pairedButton, *primaryButton, *secondaryButton, *rateButton, *stepButton; QCheckBox *rowsBox, *gridBox, *borderBox, *minyBox, *maxyBox, *logxBox, *logyBox, *complexBox; QComboBox *styleCombo, *smoothingCombo, *legendCombo; QPushButton *addButton, *applyButton, *removeButton, *applyButton2, *applyButton3; QTreeWidget *graphsTable; QSpinBox *minySpin, *maxySpin, *logxSpin, *logySpin, *rateSpin, *lineSpin; QTabWidget *tabs; Thread *plotThread; void generatePlotSeries(MathStructure **x_vector, MathStructure **y_vector, int type, QString str, QString str_x); bool generatePlot(); void updatePlot(); void updateItem(QTreeWidgetItem*); public: PlotDialog(QWidget *parent = NULL); virtual ~PlotDialog(); void resetParameters(); protected slots: void enableDisableButtons(); void onExpressionActivated(); void onAddClicked(); void onComplexClicked(bool); void onApplyClicked(); void onRemoveClicked(); void onApply2Clicked(); void onApply3Clicked(); void onTypeToggled(QAbstractButton*, bool); void onRateStepToggled(QAbstractButton*, bool); void onGraphsSelectionChanged(); void abort(); public slots: void reject() override; void setExpression(const QString&); }; #endif //PLOT_DIALOG_H qalculate-qt-5.11.0/src/preferencesdialog.cpp000066400000000000000000001626021520501070600211520ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "qalculateqtsettings.h" #include "preferencesdialog.h" #define BOX(t, x, f) box = new QCheckBox(t, this); l->addWidget(box, r, 0, 1, 2); box->setChecked(x); connect(box, SIGNAL(toggled(bool)), this, SLOT(f)); r++; #define BOX1(t, x, f) box = new QCheckBox(t, this); l->addWidget(box, r, 0); box->setChecked(x); connect(box, SIGNAL(toggled(bool)), this, SLOT(f)); QString font_string(std::string str) { size_t i = str.find(","); if(i != std::string::npos && i < str.length() - 1) { if(str[i + 1] != ' ') str.insert(i + 1, 1, ' '); i = str.find(",", i + 1); if(i != std::string::npos) str = str.substr(0, i); } return QString::fromStdString(str); } class PreferencesPageScroll : public QScrollArea { protected: QWidget *child_widget; bool use_child_hint_h, use_child_hint_w; public: PreferencesPageScroll(QWidget *parent, QWidget *child, bool bh, bool bw) : QScrollArea(parent), child_widget(child), use_child_hint_h(bh), use_child_hint_w(bw) { setWidget(child); } QSize sizeHint() const { if(use_child_hint_w || use_child_hint_h) { QSize s = child_widget->sizeHint(); if(use_child_hint_w) s.setWidth(s.width() + 2); else s.setWidth(QScrollArea::sizeHint().width()); if(use_child_hint_h) s.setHeight(s.height() + 2); else s.setHeight(QScrollArea::sizeHint().height()); return s; } return QScrollArea::sizeHint(); } }; PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Preferences")); QVBoxLayout *topbox = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); topbox->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); QWidget *w3 = new QWidget(this); QWidget *w4 = new QWidget(this); QWidget *w5 = new QWidget(this); QAbstractButton *box; QGridLayout *l; QComboBox *combo; int r = 0; l = new QGridLayout(w1); BOX(tr("Ignore system language (requires restart)"), settings->ignore_locale, ignoreLocaleToggled(bool)); ignoreLocaleBox = box; QLabel *label = new QLabel(tr("Language:"), this); l->addWidget(label, r, 0); combo = new QComboBox(this); combo->addItem(tr("Default")); combo->addItem("Català"); combo->addItem("Deutsch"); combo->addItem("English"); combo->addItem("Español"); combo->addItem("Français"); combo->addItem("ქ�რთული ენ�"); combo->addItem("Nederlands"); combo->addItem("Português"); combo->addItem("Português do Brasil"); combo->addItem("Ру��кий"); combo->addItem("Slovenš�ina"); combo->addItem("Svenska"); combo->addItem("简体中文"); combo->addItem("�體中文"); QString lang = settings->custom_lang.left(2); if(lang == "ca") combo->setCurrentIndex(1); else if(lang == "de") combo->setCurrentIndex(2); else if(lang == "en") combo->setCurrentIndex(3); else if(lang == "es") combo->setCurrentIndex(4); else if(lang == "fr") combo->setCurrentIndex(5); else if(lang == "ka") combo->setCurrentIndex(6); else if(lang == "nl") combo->setCurrentIndex(7); else if(settings->custom_lang == "pt_PT") combo->setCurrentIndex(8); else if(lang == "pt") combo->setCurrentIndex(9); else if(lang == "ru") combo->setCurrentIndex(10); else if(lang == "sl") combo->setCurrentIndex(11); else if(lang == "sv") combo->setCurrentIndex(12); else if(settings->custom_lang == "zh_CN") combo->setCurrentIndex(13); else if(settings->custom_lang == "zh_TW") combo->setCurrentIndex(14); else combo->setCurrentIndex(0); combo->setEnabled(!settings->ignore_locale); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(langChanged(int))); l->addWidget(combo, r, 1); r++; langCombo = combo; BOX(tr("Allow multiple instances"), settings->allow_multiple_instances > 0, multipleInstancesToggled(bool)); BOX(tr("Notify when a new version is available"), settings->check_version, checkVersionToggled(bool)); BOX(tr("Clear history on exit"), settings->clear_history_on_exit, clearHistoryToggled(bool)); l->addWidget(new QLabel(tr("Max history lines saved:"), this), r, 0); QSpinBox *spin = new QSpinBox(this); spin->setRange(0, 100000); spin->setValue(settings->max_history_lines); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(maxHistoryLinesChanged(int))); l->addWidget(spin, r, 1); r++; BOX(tr("Close application with Escape key"), settings->close_with_esc, closeWithEscToggled(bool)); BOX(tr("Use keyboard keys for RPN"), settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN, rpnKeysToggled(bool)); rpnKeysBox = box; rpnKeysBox->setEnabled(settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); BOX(tr("Use caret for bitwise XOR"), settings->caret_as_xor, caretAsXorToggled(bool)); BOX(tr("Keep above other windows"), settings->always_on_top, keepAboveToggled(bool)); if(settings->wayland_platform) box->hide(); QCheckBox *box2 = new QCheckBox(tr("Preserve history height"), this); l->addWidget(box2, r, 0, 1, 2); connect(box2, SIGNAL(stateChanged(int)), this, SLOT(preserveHeightChanged(int))); r++; preserveHeightBox = box2; if(settings->preserve_history_height < 0) { box2->setTristate(true); box2->setCheckState(Qt::PartiallyChecked); } else { box2->setChecked(settings->preserve_history_height > 0); } box2->setToolTip(tr("Do not change the height of history list when keypad or number bases are show or hidden.")); BOX(tr("Place expression field below history"), settings->expression_pos != 0, expressionPositionToggled(bool)); BOX(tr("Show status bar"), settings->show_statusbar || settings->status_in_statusbar, showStatusBarToggled(bool)); l->addWidget(new QLabel(tr("Window title:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Application name"), TITLE_APP); combo->addItem(tr("Result"), TITLE_RESULT); combo->addItem(tr("Application name + result"), TITLE_APP_RESULT); combo->addItem(tr("Workspace"), TITLE_WORKSPACE); combo->addItem(tr("Application name + workspace"), TITLE_APP_WORKSPACE); combo->setCurrentIndex(combo->findData(settings->title_type)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(titleChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Tooltips:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Show all"), 1); combo->addItem(tr("Hide in keypad"), 2); combo->addItem(tr("Hide all"), 0); combo->setCurrentIndex(combo->findData(settings->enable_tooltips)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(tooltipsChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Style:"), this), r, 0); combo = new QComboBox(this); QStringList list = QStyleFactory::keys(); combo->addItem(tr("Default (requires restart)", "Default style")); combo->addItems(list); if(settings->style.isEmpty()) { combo->setCurrentIndex(0); } else { int i = list.indexOf(settings->style); combo->setCurrentIndex(i < 0 ? 0 : i + 1); } connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(styleChanged(int))); l->addWidget(combo, r, 1); r++; styleCombo = combo; #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) BOX(tr("Dark mode"), settings->palette == 1 || (settings->palette == -1 && QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark), darkModeToggled(bool)); #else BOX(tr("Dark mode"), settings->palette == 1, darkModeToggled(bool)); #endif BOX(tr("Disable cursor blinking"), settings->disable_cursor_blinking, disableCursorBlinkingToggled(bool)); BOX(tr("Colorize result"), settings->colorize_result, colorizeToggled(bool)); BOX(tr("Format result"), settings->format_result, formatToggled(bool)); l->setRowStretch(r, 1); r = 0; l = new QGridLayout(w4); l->addWidget(new QLabel(tr("Expression status:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Off"), 0); combo->addItem(tr("In history list"), 1); combo->addItem(tr("In expression field"), 2); combo->addItem(tr("In status bar"), 3); if(!settings->display_expression_status) combo->setCurrentIndex(0); else if(settings->status_in_history) combo->setCurrentIndex(1); else if(settings->status_in_statusbar) combo->setCurrentIndex(3); else combo->setCurrentIndex(2); statusCombo = combo; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(statusModeChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Status tooltip delay:")), r, 0); statusDelayWidget = new QSpinBox(this); statusDelayWidget->setRange(0, 10000); statusDelayWidget->setSingleStep(250); //: milliseconds statusDelayWidget->setSuffix(" " + tr("ms")); statusDelayWidget->setValue(settings->expression_status_delay); statusDelayWidget->setEnabled(settings->display_expression_status); connect(statusDelayWidget, SIGNAL(valueChanged(int)), this, SLOT(statusDelayChanged(int))); l->addWidget(statusDelayWidget, r, 1); r++; l->addWidget(new QLabel(tr("Calculate as you type delay:")), r, 0); calculateDelayWidget = new QSpinBox(this); calculateDelayWidget->setRange(0, 10000); calculateDelayWidget->setSingleStep(250); //: milliseconds calculateDelayWidget->setSuffix(" " + tr("ms")); calculateDelayWidget->setValue(settings->auto_calculate_delay); calculateDelayWidget->setEnabled(settings->status_in_history); connect(calculateDelayWidget, SIGNAL(valueChanged(int)), this, SLOT(calculateDelayChanged(int))); l->addWidget(calculateDelayWidget, r, 1); r++; BOX(tr("Adaptive delay"), settings->adaptive_autocalc_delay, adaptiveDelayToggled(bool)); box->setEnabled(settings->status_in_history); adaptiveDelayBox = box; BOX(tr("Automatically calculate selection"), settings->autocalc_selection, autocalcSelectionToggled(bool)); autocalcSelectionBox = box; l->addWidget(new QLabel(tr("Expression in history:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Parsed"), HISTORY_EXPRESSION_TYPE_PARSED); combo->addItem(tr("Parsed (compact)"), HISTORY_EXPRESSION_TYPE_PARSED_COMPACT); combo->addItem(tr("Entered"), HISTORY_EXPRESSION_TYPE_ENTERED); combo->addItem(tr("Entered + parsed"), HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED); combo->addItem(tr("Entered + parsed (compact)"), HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT); combo->setCurrentIndex(combo->findData(settings->history_expression_type)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(historyExpressionChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Expression after calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Keep expression"), KEEP_EXPRESSION); combo->addItem(tr("Clear expression"), CLEAR_EXPRESSION); combo->addItem(tr("Replace with result"), REPLACE_EXPRESSION_WITH_RESULT); combo->addItem(tr("Replace with result if shorter"), REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER); combo->setCurrentIndex(combo->findData(settings->replace_expression)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(replaceExpressionChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Automatically copy result"), settings->autocopy_result, autocopyResultToggled(bool)); l->addWidget(new QLabel(tr("Parsing mode:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Adaptive"), PARSING_MODE_ADAPTIVE); combo->addItem(tr("Conventional"), PARSING_MODE_CONVENTIONAL); combo->addItem(tr("Implicit multiplication first"), PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST); combo->addItem(tr("Chain"), PARSING_MODE_CHAIN); combo->addItem(tr("RPN"), PARSING_MODE_RPN); combo->setCurrentIndex(combo->findData(settings->evalops.parse_options.parsing_mode)); parseCombo = combo; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(parsingModeChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Simplified percentage calculation"), settings->simplified_percentage, simplifiedPercentageToggled(bool)); BOX(tr("Read precision"), settings->evalops.parse_options.read_precision != DONT_READ_PRECISION, readPrecisionToggled(bool)); BOX(tr("Allow concise uncertainty input"), CALCULATOR->conciseUncertaintyInputEnabled(), conciseUncertaintyInputToggled(bool)); conciseUncertaintyInputBox = box; BOX(tr("Limit implicit multiplication"), settings->evalops.parse_options.limit_implicit_multiplication, limitImplicitToggled(bool)); BOX(tr("Interpret unrecognized symbols as variables"), settings->evalops.parse_options.unknowns_enabled, unknownsToggled(bool)); l->addWidget(new QLabel(tr("Interval calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Variance formula"), INTERVAL_CALCULATION_VARIANCE_FORMULA); combo->addItem(tr("Interval arithmetic"), INTERVAL_CALCULATION_INTERVAL_ARITHMETIC); combo->setCurrentIndex(combo->findData(settings->evalops.interval_calculation)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(intervalCalculationChanged(int))); l->addWidget(combo, r, 1); r++; intervalCalculationCombo = combo; BOX(tr("Factorize result"), settings->evalops.structuring == STRUCTURING_FACTORIZE, factorizeToggled(bool)); l->setRowStretch(r, 1); l = new QGridLayout(w2); r = 0; QGridLayout *l2 = new QGridLayout(); l2->addWidget(new QLabel(tr("Two's complement output:"), this), 0, 0); l2->addWidget(new QLabel(tr("Two's complement input:"), this), 1, 0); box = new QCheckBox(tr("Binary"), this); l2->addWidget(box, 0, 1); box->setChecked(settings->printops.twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(binTwosToggled(bool))); box = new QCheckBox(tr("Hexadecimal"), this); l2->addWidget(box, 0, 2); box->setChecked(settings->printops.hexadecimal_twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(hexTwosToggled(bool))); box = new QCheckBox(tr("Binary"), this); l2->addWidget(box, 1, 1); box->setChecked(settings->evalops.parse_options.twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(binTwosInputToggled(bool))); box = new QCheckBox(tr("Hexadecimal"), this); l2->addWidget(box, 1, 2); box->setChecked(settings->evalops.parse_options.hexadecimal_twos_complement); connect(box, SIGNAL(toggled(bool)), this, SLOT(hexTwosInputToggled(bool))); l2->addWidget(new QLabel(tr("Binary bits:"), this), 2, 0); combo = new QComboBox(this); combo->addItem(tr("Automatic"), 0); combo->addItem("8", 8); combo->addItem("16", 16); combo->addItem("32", 32); combo->addItem("64", 64); combo->addItem("128", 128); combo->addItem("256", 256); combo->addItem("512", 512); combo->addItem("1024", 1024); combo->setCurrentIndex(combo->findData(settings->printops.binary_bits)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(bitsChanged(int))); l2->addWidget(combo, 2, 1, 1, 2); l->addLayout(l2, r, 0, 1, 2); r++; BOX(tr("Use lower case letters in non-decimal numbers"), settings->printops.lower_case_numbers, lowerCaseToggled(bool)); BOX(tr("Use special duodecimal symbols"), settings->printops.duodecimal_symbols, duodecimalSymbolsToggled(bool)); l->addWidget(new QLabel(tr("Multiplication sign:"), this), r, 0); combo = new QComboBox(this); //: Unicode character name combo->addItem(QString(" × (%1)").arg(tr("multiplication sign")), MULTIPLICATION_SIGN_X); //: Unicode character name combo->addItem(QString(" ⋅ (%1)").arg(tr("dot operator")), MULTIPLICATION_SIGN_DOT); //: Unicode character name combo->addItem(QString(" · (%1)").arg(tr("middle dot")), MULTIPLICATION_SIGN_ALTDOT); //: Unicode character name combo->addItem(QString(" * (%1)").arg(tr("asterisk")), MULTIPLICATION_SIGN_ASTERISK); combo->setCurrentIndex(combo->findData(settings->printops.multiplication_sign)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(multiplicationSignChanged(int))); l->addWidget(combo, r, 1); r++; BOX(tr("Use Unicode division slash in output"), settings->printops.division_sign == DIVISION_SIGN_DIVISION_SLASH, divisionSlashToggled(bool)); BOX(tr("Spell out logical operators"), settings->printops.spell_out_logical_operators, spellOutToggled(bool)); BOX(tr("Use E-notation instead of 10^n"), settings->printops.exp_display != EXP_POWER_OF_10, eToggled(bool)); BOX(tr("Use 'j' as imaginary unit"), CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0, imaginaryJToggled(bool)); BOX(tr("Use comma as decimal separator"), CALCULATOR->getDecimalPoint() == COMMA, decimalCommaToggled(bool)); decimalCommaBox = box; BOX(tr("Ignore comma in numbers"), settings->evalops.parse_options.comma_as_separator, ignoreCommaToggled(bool)); ignoreCommaBox = box; BOX(tr("Ignore dots in numbers"), settings->evalops.parse_options.dot_as_separator, ignoreDotToggled(bool)); ignoreDotBox = box; if(CALCULATOR->getDecimalPoint() == COMMA) ignoreCommaBox->hide(); if(CALCULATOR->getDecimalPoint() == DOT) ignoreDotBox->hide(); BOX(tr("Copy unformatted ASCII by default"), settings->copy_ascii, copyAsciiToggled(bool)); BOX(tr("Place percent button in number pad"), settings->show_percent_in_numpad, showPercentInNumpadToggled(bool)); l->addWidget(new QLabel(tr("Indicate repeating decimals:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Off"), REPEATING_DECIMALS_OFF); combo->addItem(tr("Ellipsis"), REPEATING_DECIMALS_ELLIPSIS); combo->addItem(tr("Overline"), REPEATING_DECIMALS_OVERLINE); combo->setCurrentIndex(combo->findData(settings->printops.indicate_infinite_series)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(repeatingDecimalsChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Digit grouping:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("None"), DIGIT_GROUPING_NONE); combo->addItem(tr("Standard"), DIGIT_GROUPING_STANDARD); combo->addItem(tr("Local"), DIGIT_GROUPING_LOCALE); combo->addItem(tr("Custom"), DIGIT_GROUPING_LOCALE + 1); combo->setCurrentIndex(combo->findData(settings->custom_digit_grouping ? DIGIT_GROUPING_LOCALE + 1 : settings->printops.digit_grouping)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(groupingChanged(int))); l->addWidget(combo, r, 1); r++; QHBoxLayout *cgl = new QHBoxLayout(); spin = new QSpinBox(this); spin->setRange(settings->custom_digit_grouping ? 1 : 0, 70); spin->setValue(settings->max_history_lines); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(cgfChanged(int))); cgl->addWidget(spin); cgfSpin = spin; cgsEdit = new QLineEdit(this); connect(cgsEdit, SIGNAL(textEdited(const QString&)), this, SLOT(cgsChanged(const QString&))); cgl->addWidget(cgsEdit); updateCustomDigitGrouping(); l->addLayout(cgl, r, 1); r++; BOX(tr("Automatically group digits in input"), settings->automatic_digit_grouping, automaticDigitGroupingToggled(bool)); l->addWidget(new QLabel(tr("Interval display:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Adaptive"), -1); combo->addItem(tr("Significant digits"), INTERVAL_DISPLAY_SIGNIFICANT_DIGITS); combo->addItem(tr("Interval"), INTERVAL_DISPLAY_INTERVAL); combo->addItem(tr("Plus/minus"), INTERVAL_DISPLAY_PLUSMINUS); combo->addItem(tr("Relative"), INTERVAL_DISPLAY_RELATIVE); combo->addItem(tr("Concise"), INTERVAL_DISPLAY_CONCISE); combo->addItem(tr("Midpoint"), INTERVAL_DISPLAY_MIDPOINT); combo->addItem(tr("Lower"), INTERVAL_DISPLAY_LOWER); combo->addItem(tr("Upper"), INTERVAL_DISPLAY_UPPER); if(settings->adaptive_interval_display) combo->setCurrentIndex(0); else combo->setCurrentIndex(combo->findData(settings->printops.interval_display)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(intervalDisplayChanged(int))); intervalDisplayCombo = combo; l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Rounding:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Round halfway numbers away from zero"), ROUNDING_HALF_AWAY_FROM_ZERO); combo->addItem(tr("Round halfway numbers to even"), ROUNDING_HALF_TO_EVEN); combo->addItem(tr("Round halfway numbers to odd"), ROUNDING_HALF_TO_ODD); combo->addItem(tr("Round halfway numbers toward zero"), ROUNDING_HALF_TOWARD_ZERO); combo->addItem(tr("Round halfway numbers to random"), ROUNDING_HALF_RANDOM); combo->addItem(tr("Round halfway numbers up"), ROUNDING_HALF_UP); combo->addItem(tr("Round halfway numbers down"), ROUNDING_HALF_DOWN); combo->addItem(tr("Round toward zero"), ROUNDING_TOWARD_ZERO); combo->addItem(tr("Round away from zero"), ROUNDING_AWAY_FROM_ZERO); combo->addItem(tr("Round up"), ROUNDING_UP); combo->addItem(tr("Round down"), ROUNDING_DOWN); combo->setCurrentIndex(combo->findData(settings->printops.rounding)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(roundingChanged(int))); l->addWidget(combo, r, 1); r++; l->addWidget(new QLabel(tr("Complex number form:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Rectangular"), COMPLEX_NUMBER_FORM_RECTANGULAR); combo->addItem(tr("Exponential"), COMPLEX_NUMBER_FORM_EXPONENTIAL); combo->addItem(tr("Polar"), COMPLEX_NUMBER_FORM_POLAR); combo->addItem(tr("Angle/phasor"), COMPLEX_NUMBER_FORM_CIS); combo->setCurrentIndex(combo->findData(settings->evalops.complex_number_form)); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(complexFormChanged(int))); complexFormCombo = combo; l->addWidget(combo, r, 1); r++; l->setRowStretch(r, 1); l = new QGridLayout(w3); r = 0; BOX(tr("Enable units"), settings->evalops.parse_options.units_enabled, unitsToggled(bool)); BOX(tr("Abbreviate names"), settings->printops.abbreviate_names, abbreviateNamesToggled(bool)); BOX(tr("Use binary prefixes for information units"), CALCULATOR->usesBinaryPrefixes() > 0, binaryPrefixesToggled(bool)); l->addWidget(new QLabel(tr("Automatic unit conversion:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("No conversion"), POST_CONVERSION_NONE); combo->addItem(tr("Base units"), POST_CONVERSION_BASE); combo->addItem(tr("Optimal units"), POST_CONVERSION_OPTIMAL); combo->addItem(tr("Optimal SI units"), POST_CONVERSION_OPTIMAL_SI); combo->setCurrentIndex(combo->findData(settings->evalops.auto_post_conversion)); l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(conversionChanged(int))); BOX(tr("Convert to mixed units"), settings->evalops.mixed_units_conversion != MIXED_UNITS_CONVERSION_NONE, mixedUnitsToggled(bool)); l->addWidget(new QLabel(tr("Automatic unit prefixes:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Default")); combo->addItem(tr("No prefixes")); combo->addItem(tr("Prefixes for some units")); combo->addItem(tr("Prefixes also for currencies")); combo->addItem(tr("Prefixes for all units")); if(settings->prefixes_default) combo->setCurrentIndex(0); else if(!settings->printops.use_unit_prefixes) combo->setCurrentIndex(1); else if(settings->printops.use_prefixes_for_all_units) combo->setCurrentIndex(4); else if(settings->printops.use_prefixes_for_currencies) combo->setCurrentIndex(3); else combo->setCurrentIndex(2); l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(prefixesChanged(int))); BOX(tr("Enable all SI-prefixes"), settings->printops.use_all_prefixes, allPrefixesToggled(bool)); BOX(tr("Enable denominator prefixes"), settings->printops.use_denominator_prefix, denominatorPrefixToggled(bool)); BOX(tr("Enable units in physical constants"), CALCULATOR->variableUnitsEnabled(), variableUnitsToggled(bool)); variableUnitsBox = box; BOX(tr("Copy unformatted ASCII without units"), settings->copy_ascii_without_units, copyAsciiWithoutUnitsToggled(bool)); l->addWidget(new QLabel(tr("Temperature calculation:"), this), r, 0); combo = new QComboBox(this); combo->addItem(tr("Absolute"), TEMPERATURE_CALCULATION_ABSOLUTE); combo->addItem(tr("Relative"), TEMPERATURE_CALCULATION_RELATIVE); combo->addItem(tr("Hybrid"), TEMPERATURE_CALCULATION_HYBRID); combo->setItemData(0, "1 °C + 1 °C ≈ 274 K + 274 K ≈ 548 K\n1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K\n2 °C − 1 °C = 1 K\n1 °C − 5 °F = 16 K\n1 °C + 1 K = 2 °C", Qt::ToolTipRole); combo->setItemData(1, "1 °C + 1 °C = 2 °C\n1 °C + 5 °F = 1 °C + 5 °R ≈ 4 °C ≈ 277 K\n2 °C − 1 °C = 1 °C\n1 °C − 5 °F = 1 °C - 5 °R ≈ −2 °C\n1 °C + 1 K = 2 °C", Qt::ToolTipRole); combo->setItemData(2, "1 °C + 1 °C ≈ 2 °C\n1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K\n2 °C − 1 °C = 1 °C\n1 °C − 5 °F = 16 K\n1 °C + 1 K = 2 °C", Qt::ToolTipRole); combo->setCurrentIndex(combo->findData(CALCULATOR->getTemperatureCalculationMode())); tcCombo = combo; l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(temperatureCalculationChanged(int))); box = new QCheckBox(tr("Exchange rates updates:"), this); box->setChecked(settings->auto_update_exchange_rates > 0); connect(box, SIGNAL(toggled(bool)), this, SLOT(exratesToggled(bool))); l->addWidget(box, r, 0); int days = settings->auto_update_exchange_rates <= 0 ? 7 : settings->auto_update_exchange_rates; spin = new QSpinBox(this); spin->setRange(1, 100); spin->setValue(days); spin->setEnabled(settings->auto_update_exchange_rates > 0); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(exratesChanged(int))); l->addWidget(spin, r, 1); exratesSpin = spin; r++; QString str = tr("%n day(s)", "", days); int index = str.indexOf(QString::number(days)); if(index == 0) { str = str.mid(index + QString::number(days).length()); if(str == " day(s)") str = (days == 1 ? " day" : " days"); exratesSpin->setSuffix(str); } else { exratesSpin->setPrefix(str.right(index)); } l->addWidget(new QLabel(tr("Default currency:"), this), r, 0); combo = new QComboBox(this); QStringList curs; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isCurrency() && CALCULATOR->units[i]->referenceName().length() == 3) { curs << QString::fromStdString(CALCULATOR->units[i]->title()) + " (" + QString::fromStdString(CALCULATOR->units[i]->referenceName()) + ")"; } } curs.sort(); combo->addItems(curs); if(CALCULATOR->getLocalCurrency()) { QString scur; scur = QString::fromStdString(CALCULATOR->getLocalCurrency()->referenceName()); for(int i = 0; i < curs.size(); i++) { if(curs[i].indexOf(scur) == curs[i].length() - 4) { combo->setCurrentIndex(i); break; } } } combo->setMinimumContentsLength(20); combo->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); l->addWidget(combo, r, 1); r++; connect(combo, SIGNAL(currentTextChanged(const QString&)), this, SLOT(defaultCurrencyChanged(const QString&))); l->setRowStretch(r, 1); l = new QGridLayout(w5); r = 0; BOX1(tr("Custom history font:"), settings->use_custom_result_font, resultFontToggled(bool)); QPushButton *button = new QPushButton(font_string(settings->custom_result_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(resultFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom expression font:"), settings->use_custom_expression_font, expressionFontToggled(bool)); button = new QPushButton(font_string(settings->custom_expression_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(expressionFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom status bar font:"), settings->use_custom_status_font, statusFontToggled(bool)); button = new QPushButton(font_string(settings->custom_status_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(statusFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom keypad font:"), settings->use_custom_keypad_font, keypadFontToggled(bool)); button = new QPushButton(font_string(settings->custom_keypad_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked());; r++; connect(button, SIGNAL(clicked()), this, SLOT(keypadFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); BOX1(tr("Custom application font:"), settings->use_custom_app_font, appFontToggled(bool)); button = new QPushButton(font_string(settings->custom_app_font), this); l->addWidget(button, r, 1); button->setEnabled(box->isChecked()); r++; connect(button, SIGNAL(clicked()), this, SLOT(appFontClicked())); connect(box, SIGNAL(toggled(bool)), button, SLOT(setEnabled(bool))); l->setRowStretch(r, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); topbox->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); QSize size = get_screen_geometry(this).size(); QSize sh = w1->sizeHint().expandedTo(w2->sizeHint().expandedTo(w3->sizeHint().expandedTo(w4->sizeHint().expandedTo(w5->sizeHint())))); bool use_child_hint_h = size.height() >= sh.height() + 100; bool use_child_hint_w = size.width() >= sh.width() + 100; if(use_child_hint_w) tabs->setUsesScrollButtons(false); QScrollArea *s1 = new PreferencesPageScroll(this, w1, use_child_hint_h, use_child_hint_w); QScrollArea *s2 = new PreferencesPageScroll(this, w2, use_child_hint_h, use_child_hint_w); QScrollArea *s3 = new PreferencesPageScroll(this, w3, use_child_hint_h, use_child_hint_w); QScrollArea *s4 = new PreferencesPageScroll(this, w4, use_child_hint_h, use_child_hint_w); QScrollArea *s5 = new PreferencesPageScroll(this, w5, use_child_hint_h, use_child_hint_w); tabs->addTab(s1, tr("Look && Feel")); tabs->addTab(s5, tr("Fonts")); tabs->addTab(s2, tr("Numbers && Operators")); tabs->addTab(s3, tr("Units")); tabs->addTab(s4, tr("Calculation")); } PreferencesDialog::~PreferencesDialog() {} void PreferencesDialog::ignoreLocaleToggled(bool b) { settings->ignore_locale = b; if(settings->ignore_locale) { langCombo->blockSignals(true); langCombo->setCurrentIndex(0); langCombo->blockSignals(false); } langCombo->setEnabled(!settings->ignore_locale); } void PreferencesDialog::langChanged(int i) { switch(i) { case 0: {settings->custom_lang = ""; break;} case 1: {settings->custom_lang = "ca_ES"; break;} case 2: {settings->custom_lang = "de_DE"; break;} case 3: {settings->custom_lang = "en_US"; break;} case 4: {settings->custom_lang = "es_ES"; break;} case 5: {settings->custom_lang = "fr_FR"; break;} case 6: {settings->custom_lang = "ka_GE"; break;} case 7: {settings->custom_lang = "nl_NL"; break;} case 8: {settings->custom_lang = "pt_PT"; break;} case 9: {settings->custom_lang = "pt_BR"; break;} case 10: {settings->custom_lang = "ru_RU"; break;} case 11: {settings->custom_lang = "sl_SL"; break;} case 12: {settings->custom_lang = "sv_SE"; break;} case 13: {settings->custom_lang = "zh_CN"; break;} case 14: {settings->custom_lang = "zh_TW"; break;} } if(!settings->custom_lang.isEmpty()) { ignoreLocaleBox->setChecked(false); settings->ignore_locale = false; } QMessageBox::information(this, tr("Restart required"), tr("Please restart the program for the language change to take effect."), QMessageBox::Close); } void PreferencesDialog::multipleInstancesToggled(bool b) { settings->allow_multiple_instances = b; } void PreferencesDialog::checkVersionToggled(bool b) { settings->check_version = b; } void PreferencesDialog::clearHistoryToggled(bool b) { settings->clear_history_on_exit = b; } void PreferencesDialog::maxHistoryLinesChanged(int i) { settings->max_history_lines = i; } void PreferencesDialog::preserveHeightChanged(int state) { preserveHeightBox->setTristate(false); settings->preserve_history_height = (state == Qt::Checked); settings->keypad_appended = false; settings->bases_appended = false; } void PreferencesDialog::expressionPositionToggled(bool b) { settings->expression_pos = (b ? 1 : 0); emit expressionPositionChanged(); } void PreferencesDialog::showStatusBarToggled(bool b) { settings->show_statusbar = b; if(!b) { settings->status_in_statusbar = false; settings->status_in_history = true; emit statusModeChanged(); } emit showStatusBarChanged(); } void PreferencesDialog::keepAboveToggled(bool b) { settings->always_on_top = b; if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); show(); emit alwaysOnTopChanged(); } void PreferencesDialog::tooltipsChanged(int i) { settings->enable_tooltips = qobject_cast(sender())->itemData(i).toInt(); emit enableTooltipsChanged(); } void PreferencesDialog::statusModeChanged(int i) { settings->display_expression_status = (i > 0); settings->status_in_history = (i == 1); settings->status_in_statusbar = (i == 3); statusDelayWidget->setEnabled(settings->display_expression_status); calculateDelayWidget->setEnabled(settings->status_in_history); adaptiveDelayBox->setEnabled(settings->status_in_history); adaptiveDelayBox->blockSignals(true); adaptiveDelayBox->setChecked(settings->status_in_history && settings->adaptive_autocalc_delay); adaptiveDelayBox->blockSignals(false); emit statusModeChanged(); } void PreferencesDialog::statusDelayChanged(int v) { settings->expression_status_delay = v; } void PreferencesDialog::calculateDelayChanged(int v) { settings->auto_calculate_delay = v; } void PreferencesDialog::adaptiveDelayToggled(bool b) { settings->adaptive_autocalc_delay = b; } void PreferencesDialog::autocalcSelectionToggled(bool b) { settings->autocalc_selection = b; } void PreferencesDialog::binTwosToggled(bool b) { settings->printops.twos_complement = b; emit resultDisplayUpdated(); } void PreferencesDialog::hexTwosToggled(bool b) { settings->printops.hexadecimal_twos_complement = b; emit resultDisplayUpdated(); } void PreferencesDialog::binTwosInputToggled(bool b) { settings->evalops.parse_options.twos_complement = b; if(b != settings->default_signed) settings->default_signed = -1; emit twosChanged(); emit expressionFormatUpdated(false); } void PreferencesDialog::hexTwosInputToggled(bool b) { settings->evalops.parse_options.hexadecimal_twos_complement = b; emit twosChanged(); emit expressionFormatUpdated(false); } void PreferencesDialog::bitsChanged(int i) { settings->printops.binary_bits = qobject_cast(sender())->itemData(i).toInt(); settings->evalops.parse_options.binary_bits = settings->printops.binary_bits; settings->default_bits = -1; emit binaryBitsChanged(); if(settings->evalops.parse_options.hexadecimal_twos_complement || settings->evalops.parse_options.twos_complement) { emit expressionFormatUpdated(false); } else { emit resultDisplayUpdated(); } } void PreferencesDialog::lowerCaseToggled(bool b) { settings->printops.lower_case_numbers = b; emit resultDisplayUpdated(); } void PreferencesDialog::duodecimalSymbolsToggled(bool b) { settings->printops.duodecimal_symbols = b; emit resultDisplayUpdated(); } void PreferencesDialog::multiplicationSignChanged(int i) { settings->printops.multiplication_sign = (MultiplicationSign) qobject_cast(sender())->itemData(i).toInt(); emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::divisionSlashToggled(bool b) { if(b) { settings->printops.division_sign = DIVISION_SIGN_DIVISION_SLASH; } else { settings->printops.division_sign = DIVISION_SIGN_SLASH; } emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::spellOutToggled(bool b) { settings->printops.spell_out_logical_operators = b; emit resultDisplayUpdated(); } void PreferencesDialog::eToggled(bool b) { if(b) { settings->printops.exp_display = EXP_LOWERCASE_E; } else { settings->printops.exp_display = EXP_POWER_OF_10; } emit resultDisplayUpdated(); } void PreferencesDialog::imaginaryJToggled(bool b) { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); if(!v_i || (b == (CALCULATOR->v_i->hasName("j") > 0))) return; if(b) { ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } else { v_i->clearNonReferenceNames(); v_i->setChanged(false); } emit expressionFormatUpdated(false); emit symbolsUpdated(); } void PreferencesDialog::decimalCommaToggled(bool b) { settings->decimal_comma = b; if(b) { CALCULATOR->useDecimalComma(); ignoreCommaBox->hide(); ignoreDotBox->show(); } else { CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); ignoreCommaBox->show(); ignoreDotBox->hide(); } settings->dot_question_asked = true; emit expressionFormatUpdated(false); emit resultDisplayUpdated(); emit symbolsUpdated(); } void PreferencesDialog::ignoreDotToggled(bool b) { settings->evalops.parse_options.dot_as_separator = b; settings->dot_question_asked = true; if(settings->automatic_digit_grouping && settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE && CALCULATOR->local_digit_group_separator == DOT) { emit automaticDigitGroupingChanged(); } emit expressionFormatUpdated(false); } void PreferencesDialog::ignoreCommaToggled(bool b) { settings->evalops.parse_options.comma_as_separator = b; CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); settings->dot_question_asked = true; if(settings->automatic_digit_grouping && settings->printops.digit_grouping == DIGIT_GROUPING_LOCALE && CALCULATOR->local_digit_group_separator == COMMA) { emit automaticDigitGroupingChanged(); } emit expressionFormatUpdated(false); emit symbolsUpdated(); } void PreferencesDialog::colorizeToggled(bool b) { settings->colorize_result = b; emit historyExpressionTypeChanged(); } void PreferencesDialog::formatToggled(bool b) { settings->format_result = b; emit resultDisplayUpdated(); } void PreferencesDialog::parsingModeChanged(int i) { settings->evalops.parse_options.parsing_mode = (ParsingMode) qobject_cast(sender())->itemData(i).toInt(); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) settings->implicit_question_asked = true; rpnKeysBox->setEnabled(settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); rpnKeysBox->blockSignals(true); rpnKeysBox->setChecked(settings->rpn_keys && settings->evalops.parse_options.parsing_mode != PARSING_MODE_RPN); rpnKeysBox->blockSignals(false); emit expressionFormatUpdated(false); } void PreferencesDialog::temperatureCalculationChanged(int i) { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) qobject_cast(sender())->itemData(i).toInt()); emit expressionCalculationUpdated(0); } void PreferencesDialog::exratesToggled(bool b) { exratesSpin->setEnabled(b); settings->auto_update_exchange_rates = b ? exratesSpin->value() : 0; } void PreferencesDialog::exratesChanged(int i) { settings->auto_update_exchange_rates = i; QString str = tr("%n day(s)", "", i); int index = str.indexOf(QString::number(i)); if(index == 0) { str = str.mid(index + QString::number(i).length()); if(str == " day(s)") str = (i == 1 ? " day" : " days"); exratesSpin->setSuffix(str); } else { exratesSpin->setPrefix(str.right(index)); } } void PreferencesDialog::unitsToggled(bool b) { settings->evalops.parse_options.units_enabled = b; emit expressionFormatUpdated(false); } void PreferencesDialog::binaryPrefixesToggled(bool b) { CALCULATOR->useBinaryPrefixes(b ? 1 : 0); emit resultFormatUpdated(); } void PreferencesDialog::abbreviateNamesToggled(bool b) { settings->printops.abbreviate_names = b; emit resultFormatUpdated(); } void PreferencesDialog::simplifiedPercentageToggled(bool b) { settings->simplified_percentage = b; emit expressionFormatUpdated(true); } void PreferencesDialog::readPrecisionToggled(bool b) { if(b) { settings->evalops.parse_options.read_precision = READ_PRECISION_WHEN_DECIMALS; } else { settings->evalops.parse_options.read_precision = DONT_READ_PRECISION; } emit expressionFormatUpdated(true); } void PreferencesDialog::rpnKeysToggled(bool b) { settings->rpn_keys = b; } void PreferencesDialog::intervalCalculationChanged(int i) { settings->evalops.interval_calculation = (IntervalCalculation) qobject_cast(sender())->itemData(i).toInt(); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateIntervalCalculation() { intervalCalculationCombo->blockSignals(true); intervalCalculationCombo->setCurrentIndex(intervalCalculationCombo->findData(settings->evalops.interval_calculation)); intervalCalculationCombo->blockSignals(false); } void PreferencesDialog::complexFormChanged(int i) { settings->evalops.complex_number_form = (ComplexNumberForm) qobject_cast(sender())->itemData(i).toInt(); settings->complex_angle_form = (settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateComplexForm() { complexFormCombo->blockSignals(true); complexFormCombo->setCurrentIndex(complexFormCombo->findData(settings->evalops.complex_number_form)); complexFormCombo->blockSignals(false); } void PreferencesDialog::roundingChanged(int i) { settings->printops.rounding = (RoundingMode) qobject_cast(sender())->itemData(i).toInt(); emit resultFormatUpdated(); } void PreferencesDialog::repeatingDecimalsChanged(int i) { settings->printops.indicate_infinite_series = qobject_cast(sender())->itemData(i).toInt(); emit resultDisplayUpdated(); } void PreferencesDialog::copyAsciiToggled(bool b) { settings->copy_ascii = b; } void PreferencesDialog::showPercentInNumpadToggled(bool b) { settings->show_percent_in_numpad = b; emit buttonLocationChanged(); } void PreferencesDialog::copyAsciiWithoutUnitsToggled(bool b) { settings->copy_ascii_without_units = b; } void PreferencesDialog::caretAsXorToggled(bool b) { settings->caret_as_xor = b; } void PreferencesDialog::automaticDigitGroupingToggled(bool b) { settings->automatic_digit_grouping = b; emit automaticDigitGroupingChanged(); } void PreferencesDialog::closeWithEscToggled(bool b) { settings->close_with_esc = b; } void PreferencesDialog::disableCursorBlinkingToggled(bool b) { settings->disable_cursor_blinking = b; if(b) qApp->setCursorFlashTime(0); else qApp->setCursorFlashTime(1000); } void PreferencesDialog::mixedUnitsToggled(bool b) { if(b) { settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_DEFAULT; } else { settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; } emit expressionCalculationUpdated(0); } void PreferencesDialog::conversionChanged(int i) { settings->evalops.auto_post_conversion = (AutoPostConversion) qobject_cast(sender())->itemData(i).toInt(); emit expressionCalculationUpdated(0); } void PreferencesDialog::prefixesChanged(int i) { settings->prefixes_default = (i == 0); settings->printops.use_unit_prefixes = (i == 0 && (settings->printops.min_exp == EXP_PRECISION || settings->printops.min_exp == EXP_NONE)) || i >= 2; settings->printops.use_prefixes_for_all_units = (i == 4); settings->printops.use_prefixes_for_currencies = (i >= 3); emit resultFormatUpdated(); } void PreferencesDialog::allPrefixesToggled(bool b) { settings->printops.use_all_prefixes = b; emit resultFormatUpdated(); } void PreferencesDialog::denominatorPrefixToggled(bool b) { settings->printops.use_denominator_prefix = b; emit resultFormatUpdated(); } void PreferencesDialog::variableUnitsToggled(bool b) { CALCULATOR->setVariableUnitsEnabled(b); emit expressionCalculationUpdated(0); } void PreferencesDialog::updateVariableUnits() { variableUnitsBox->blockSignals(true); variableUnitsBox->setChecked(CALCULATOR->variableUnitsEnabled()); variableUnitsBox->blockSignals(false); } void PreferencesDialog::updateCustomDigitGrouping() { cgfSpin->blockSignals(true); cgsEdit->blockSignals(true); if(settings->custom_digit_grouping) { cgfSpin->setMinimum(1); cgfSpin->setValue(settings->custom_digit_group_format.empty() ? 3 : settings->custom_digit_group_format[0] - '0'); cgsEdit->setText(QString::fromStdString(settings->custom_digit_group_separator)); } else { cgfSpin->setMinimum(0); cgfSpin->setValue(settings->printops.digit_grouping == DIGIT_GROUPING_NONE ? 0 : (settings->printops.digit_grouping == DIGIT_GROUPING_STANDARD || CALCULATOR->local_digit_group_format.empty() || CALCULATOR->local_digit_group_format[0] == CHAR_MAX ? 3 : (int) CALCULATOR->local_digit_group_format[0])); cgsEdit->setText(settings->printops.digit_grouping == DIGIT_GROUPING_NONE ? QString() : (settings->printops.digit_grouping == DIGIT_GROUPING_STANDARD ? THIN_SPACE : QString::fromStdString(CALCULATOR->local_digit_group_separator))); } cgfSpin->blockSignals(false); cgsEdit->blockSignals(false); cgfSpin->setEnabled(settings->custom_digit_grouping); cgsEdit->setEnabled(settings->custom_digit_grouping); } void PreferencesDialog::groupingChanged(int i) { int v = qobject_cast(sender())->itemData(i).toInt(); if(settings->custom_digit_grouping) { CALCULATOR->local_digit_group_separator = settings->saved_local_dgs; CALCULATOR->local_digit_group_format = settings->saved_local_dgf; } else if(v == DIGIT_GROUPING_LOCALE + 1) { settings->saved_local_dgs = CALCULATOR->local_digit_group_separator; settings->saved_local_dgf = CALCULATOR->local_digit_group_format; } if(v == DIGIT_GROUPING_LOCALE + 1) { settings->printops.digit_grouping = DIGIT_GROUPING_LOCALE; CALCULATOR->local_digit_group_format = ""; for(size_t i = 0; i < settings->custom_digit_group_format.size(); i++) { CALCULATOR->local_digit_group_format += settings->custom_digit_group_format[i] - '0'; } CALCULATOR->local_digit_group_separator = settings->custom_digit_group_separator; settings->custom_digit_grouping = true; } else { settings->printops.digit_grouping = (DigitGrouping) v; settings->custom_digit_grouping = false; } updateCustomDigitGrouping(); if(v == DIGIT_GROUPING_LOCALE && (!settings->evalops.parse_options.comma_as_separator || CALCULATOR->getDecimalPoint() == COMMA) && CALCULATOR->local_digit_group_separator == COMMA) { if(CALCULATOR->getDecimalPoint() == COMMA) { settings->evalops.parse_options.comma_as_separator = true; settings->evalops.parse_options.dot_as_separator = false; ignoreCommaBox->blockSignals(true); ignoreCommaBox->setChecked(true); ignoreCommaBox->blockSignals(false); ignoreDotBox->blockSignals(true); ignoreDotBox->setChecked(false); ignoreDotBox->blockSignals(false); decimalCommaBox->toggle(); } else { ignoreCommaBox->toggle(); } } else if(v == DIGIT_GROUPING_LOCALE && (!settings->evalops.parse_options.dot_as_separator || CALCULATOR->getDecimalPoint() == DOT) && CALCULATOR->local_digit_group_separator == DOT) { if(CALCULATOR->getDecimalPoint() == DOT) { settings->evalops.parse_options.dot_as_separator = true; settings->evalops.parse_options.comma_as_separator = false; ignoreDotBox->blockSignals(true); ignoreDotBox->setChecked(true); ignoreDotBox->blockSignals(false); ignoreCommaBox->blockSignals(true); ignoreCommaBox->setChecked(false); ignoreCommaBox->blockSignals(false); decimalCommaBox->toggle(); } else { ignoreDotBox->toggle(); } } else { emit resultFormatUpdated(); } if(settings->automatic_digit_grouping) emit automaticDigitGroupingChanged(); } void PreferencesDialog::cgfChanged(int i) { if(!settings->custom_digit_grouping) return; settings->custom_digit_group_format = '0' + i; CALCULATOR->local_digit_group_format = ""; for(size_t i = 0; i < settings->custom_digit_group_format.size(); i++) { CALCULATOR->local_digit_group_format += settings->custom_digit_group_format[i] - '0'; } settings->custom_digit_group_changed = true; emit resultFormatUpdated(); if(settings->automatic_digit_grouping) emit automaticDigitGroupingChanged(); } void PreferencesDialog::cgsChanged(const QString &str) { if(!settings->custom_digit_grouping) return; settings->custom_digit_group_separator = str.toStdString(); CALCULATOR->local_digit_group_separator = settings->custom_digit_group_separator; settings->custom_digit_group_changed = true; emit resultFormatUpdated(); if(settings->automatic_digit_grouping) emit automaticDigitGroupingChanged(); } void PreferencesDialog::intervalDisplayChanged(int i) { if(i == 0) { settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; settings->adaptive_interval_display = true; } else { settings->printops.interval_display = (IntervalDisplay) qobject_cast(sender())->itemData(i).toInt(); settings->adaptive_interval_display = false; } emit resultFormatUpdated(); } void PreferencesDialog::updateIntervalDisplay() { intervalDisplayCombo->blockSignals(true); if(settings->adaptive_interval_display) intervalDisplayCombo->setCurrentIndex(0); else intervalDisplayCombo->setCurrentIndex(intervalDisplayCombo->findData(settings->printops.interval_display)); intervalDisplayCombo->blockSignals(false); } void PreferencesDialog::conciseUncertaintyInputToggled(bool b) { CALCULATOR->setConciseUncertaintyInputEnabled(b); emit expressionFormatUpdated(false); } void PreferencesDialog::updateConciseUncertaintyInput() { conciseUncertaintyInputBox->blockSignals(true); conciseUncertaintyInputBox->setChecked(CALCULATOR->conciseUncertaintyInputEnabled()); conciseUncertaintyInputBox->blockSignals(false); } void PreferencesDialog::limitImplicitToggled(bool b) { settings->evalops.parse_options.limit_implicit_multiplication = b; settings->printops.limit_implicit_multiplication = b; emit expressionFormatUpdated(true); } void PreferencesDialog::unknownsToggled(bool b) { settings->evalops.parse_options.unknowns_enabled = b; emit expressionFormatUpdated(false); } void PreferencesDialog::titleChanged(int i) { settings->title_type = qobject_cast(sender())->itemData(i).toInt(); emit titleTypeChanged(); } void PreferencesDialog::resultFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_result_font = true; settings->use_custom_result_font = true; settings->custom_result_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_result_font)); emit resultFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::resultFontToggled(bool b) { settings->use_custom_result_font = b; emit resultFontChanged(); } void PreferencesDialog::expressionFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_expression_font = true; settings->use_custom_expression_font = true; settings->custom_expression_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_expression_font)); emit expressionFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::expressionFontToggled(bool b) { settings->use_custom_expression_font = b; emit expressionFontChanged(); } void PreferencesDialog::statusFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_status_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_status_font = true; settings->use_custom_status_font = true; settings->custom_status_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_status_font)); emit statusFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::statusFontToggled(bool b) { settings->use_custom_status_font = b; emit statusFontChanged(); } void PreferencesDialog::keypadFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_keypad_font = true; settings->use_custom_keypad_font = true; settings->custom_keypad_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_keypad_font)); emit keypadFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::keypadFontToggled(bool b) { settings->use_custom_keypad_font = b; emit keypadFontChanged(); } void PreferencesDialog::appFontClicked() { QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); QFontDialog *dialog = new QFontDialog(font, this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); if(dialog->exec() == QDialog::Accepted) { settings->save_custom_app_font = true; settings->use_custom_app_font = true; settings->custom_app_font = dialog->selectedFont().toString().toStdString(); qobject_cast(sender())->setText(font_string(settings->custom_app_font)); emit appFontChanged(); } dialog->deleteLater(); } void PreferencesDialog::appFontToggled(bool b) { settings->use_custom_app_font = b; emit appFontChanged(); } void PreferencesDialog::darkModeToggled(bool b) { if(b) settings->palette = 1; else settings->palette = -1; #ifdef _WIN32 if(b) { if(styleCombo->currentText().compare("windowsvista", Qt::CaseInsensitive) == 0) { for(int i = 1; i < styleCombo->count(); i++) { if(styleCombo->itemText(i).compare("Fusion", Qt::CaseInsensitive) == 0) { styleCombo->setCurrentIndex(i); break; } } } } #endif #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) settings->updatePalette(QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark); #else settings->updatePalette(); #endif } void PreferencesDialog::styleChanged(int i) { settings->style = (i == 0 ? "" : styleCombo->currentText()); settings->updateStyle(); } void PreferencesDialog::factorizeToggled(bool b) { if(b) { settings->evalops.structuring = STRUCTURING_FACTORIZE; } else { settings->evalops.structuring = STRUCTURING_EXPAND; } emit expressionCalculationUpdated(0); } void PreferencesDialog::closeEvent(QCloseEvent *e) { QDialog::closeEvent(e); emit dialogClosed(); } void PreferencesDialog::replaceExpressionChanged(int i) { settings->replace_expression = qobject_cast(sender())->itemData(i).toInt(); } void PreferencesDialog::autocopyResultToggled(bool b) { settings->autocopy_result = b; } void PreferencesDialog::historyExpressionChanged(int i) { settings->history_expression_type = qobject_cast(sender())->itemData(i).toInt(); emit historyExpressionTypeChanged(); } void PreferencesDialog::defaultCurrencyChanged(const QString &str) { settings->default_currency = str.mid(str.length() - 4, 3).toStdString(); Unit *u = CALCULATOR->getActiveUnit(settings->default_currency); if(u) CALCULATOR->setLocalCurrency(u); } void PreferencesDialog::updateDot() { decimalCommaBox->blockSignals(true); ignoreCommaBox->blockSignals(true); ignoreDotBox->blockSignals(true); decimalCommaBox->setChecked(CALCULATOR->getDecimalPoint() == COMMA); ignoreCommaBox->setChecked(settings->evalops.parse_options.comma_as_separator); ignoreDotBox->setChecked(settings->evalops.parse_options.dot_as_separator); decimalCommaBox->blockSignals(false); ignoreCommaBox->blockSignals(false); ignoreDotBox->blockSignals(false); if(CALCULATOR->getDecimalPoint() == COMMA) ignoreCommaBox->hide(); if(CALCULATOR->getDecimalPoint() == DOT) ignoreDotBox->hide(); } void PreferencesDialog::updateParsingMode() { parseCombo->blockSignals(true); parseCombo->setCurrentIndex(parseCombo->findData(settings->evalops.parse_options.parsing_mode)); parseCombo->blockSignals(false); } void PreferencesDialog::updateExpressionStatus() { statusDelayWidget->blockSignals(true); calculateDelayWidget->blockSignals(true); statusCombo->blockSignals(true); autocalcSelectionBox->blockSignals(true); adaptiveDelayBox->blockSignals(true); if(!settings->display_expression_status) statusCombo->setCurrentIndex(0); else if(settings->status_in_history) statusCombo->setCurrentIndex(1); else if(settings->status_in_statusbar) statusCombo->setCurrentIndex(3); else statusCombo->setCurrentIndex(2); statusDelayWidget->setValue(settings->expression_status_delay); statusDelayWidget->setEnabled(settings->display_expression_status); calculateDelayWidget->setValue(settings->auto_calculate_delay); calculateDelayWidget->setEnabled(settings->status_in_history); adaptiveDelayBox->setEnabled(settings->status_in_history); adaptiveDelayBox->setChecked(settings->status_in_history && settings->adaptive_autocalc_delay); autocalcSelectionBox->setChecked(settings->autocalc_selection); statusDelayWidget->blockSignals(false); calculateDelayWidget->blockSignals(false); statusCombo->blockSignals(false); autocalcSelectionBox->blockSignals(false); adaptiveDelayBox->blockSignals(false); } void PreferencesDialog::updateTemperatureCalculation() { tcCombo->blockSignals(true); tcCombo->setCurrentIndex(tcCombo->findData(CALCULATOR->getTemperatureCalculationMode())); tcCombo->blockSignals(false); } qalculate-qt-5.11.0/src/preferencesdialog.h000066400000000000000000000120051520501070600206060ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef PREFERENCES_DIALOG_H #define PREFERENCES_DIALOG_H #include #include class QAbstractButton; class QCheckBox; class QSpinBox; class QComboBox; class QLineEdit; class PreferencesDialog : public QDialog { Q_OBJECT protected: QAbstractButton *decimalCommaBox, *ignoreCommaBox, *ignoreDotBox, *ignoreLocaleBox, *variableUnitsBox, *conciseUncertaintyInputBox, *rpnKeysBox, *adaptiveDelayBox, *autocalcSelectionBox; QCheckBox *preserveHeightBox; QSpinBox *exratesSpin, *statusDelayWidget, *calculateDelayWidget, *cgfSpin; QComboBox *styleCombo, *parseCombo, *tcCombo, *langCombo, *complexFormCombo, *intervalDisplayCombo, *intervalCalculationCombo, *statusCombo; QLineEdit *cgsEdit; void closeEvent(QCloseEvent*) override; protected slots: void ignoreLocaleToggled(bool); void keepAboveToggled(bool); void tooltipsChanged(int); void preserveHeightChanged(int); void statusModeChanged(int); void statusDelayChanged(int); void autocalcSelectionToggled(bool); void calculateDelayChanged(int); void adaptiveDelayToggled(bool); void binTwosToggled(bool); void hexTwosToggled(bool); void binTwosInputToggled(bool); void hexTwosInputToggled(bool); void bitsChanged(int); void lowerCaseToggled(bool); void duodecimalSymbolsToggled(bool); void multiplicationSignChanged(int); void divisionSlashToggled(bool); void spellOutToggled(bool); void eToggled(bool); void imaginaryJToggled(bool); void decimalCommaToggled(bool); void ignoreCommaToggled(bool); void ignoreDotToggled(bool); void colorizeToggled(bool); void formatToggled(bool); void parsingModeChanged(int); void unknownsToggled(bool); void temperatureCalculationChanged(int); void defaultCurrencyChanged(const QString&); void exratesToggled(bool); void exratesChanged(int); void unitsToggled(bool); void binaryPrefixesToggled(bool); void readPrecisionToggled(bool); void simplifiedPercentageToggled(bool); void intervalCalculationChanged(int); void complexFormChanged(int); void roundingChanged(int); void repeatingDecimalsChanged(int); void mixedUnitsToggled(bool); void abbreviateNamesToggled(bool); void conversionChanged(int); void prefixesChanged(int); void allPrefixesToggled(bool); void denominatorPrefixToggled(bool); void variableUnitsToggled(bool); void updateCustomDigitGrouping(); void groupingChanged(int); void cgfChanged(int); void cgsChanged(const QString&); void intervalDisplayChanged(int); void conciseUncertaintyInputToggled(bool); void limitImplicitToggled(bool); void titleChanged(int); void resultFontClicked(); void resultFontToggled(bool); void expressionFontClicked(); void expressionFontToggled(bool); void statusFontClicked(); void statusFontToggled(bool); void keypadFontClicked(); void keypadFontToggled(bool); void appFontClicked(); void appFontToggled(bool); void darkModeToggled(bool); void styleChanged(int); void langChanged(int); void factorizeToggled(bool); void rpnKeysToggled(bool); void replaceExpressionChanged(int); void autocopyResultToggled(bool); void multipleInstancesToggled(bool); void checkVersionToggled(bool); void clearHistoryToggled(bool); void maxHistoryLinesChanged(int); void historyExpressionChanged(int); void copyAsciiToggled(bool); void copyAsciiWithoutUnitsToggled(bool); void caretAsXorToggled(bool); void automaticDigitGroupingToggled(bool); void closeWithEscToggled(bool); void disableCursorBlinkingToggled(bool); void showPercentInNumpadToggled(bool); void expressionPositionToggled(bool); void showStatusBarToggled(bool); public: PreferencesDialog(QWidget *parent = NULL); virtual ~PreferencesDialog(); void updateDot(); void updateParsingMode(); void updateTemperatureCalculation(); void updateExpressionStatus(); void updateVariableUnits(); void updateComplexForm(); void updateIntervalDisplay(); void updateIntervalCalculation(); void updateConciseUncertaintyInput(); signals: void resultFormatUpdated(); void resultDisplayUpdated(); void expressionCalculationUpdated(int); void expressionFormatUpdated(bool); void alwaysOnTopChanged(); void enableTooltipsChanged(); void titleTypeChanged(); void resultFontChanged(); void expressionFontChanged(); void statusFontChanged(); void keypadFontChanged(); void appFontChanged(); void symbolsUpdated(); void historyExpressionTypeChanged(); void binaryBitsChanged(); void twosChanged(); void statusModeChanged(); void buttonLocationChanged(); void automaticDigitGroupingChanged(); void expressionPositionChanged(); void showStatusBarChanged(); void dialogClosed(); }; #endif //PREFERENCES_DIALOG_H qalculate-qt-5.11.0/src/qalculateqtsettings.cpp000066400000000000000000003401221520501070600215650ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include "qalculateqtsettings.h" #include #include #include #include #include #include #include #include #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # include #else # include #endif #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "keypadwidget.h" #define PREFERENCES_VERSION_BEFORE(i1, i2, i3) (preferences_version[0] < i1 || (preferences_version[0] == i1 && (preferences_version[1] < i2 || (preferences_version[1] == i2 && preferences_version[2] < i3)))) #define PREFERENCES_VERSION_AFTER(i1, i2, i3) (preferences_version[0] > i1 || (preferences_version[0] == i1 && (preferences_version[1] > i2 || (preferences_version[1] == i2 && preferences_version[2] > i3)))) extern int b_busy; bool can_display_unicode_string_function(const char*, void*) { return true; } QRect get_screen_geometry(QWidget *widget) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QScreen *scr = widget->screen(); # else QScreen *scr = QGuiApplication::screenAt(pos); # endif if(!scr) scr = QGuiApplication::primaryScreen(); return scr->availableGeometry(); #else return QApplication::desktop()->availableGeometry(widget); #endif } bool try_resize(QWidget *win, int w, int h) { QSize size = get_screen_geometry(win).size(); if(w + 50 < size.width() && h + 50 < size.height()) { win->resize(w, h); return true; } return false; } std::string to_html_escaped(const std::string strpre) { std::string str = strpre; if(settings->printops.use_unicode_signs) { gsub(">=", SIGN_GREATER_OR_EQUAL, str); gsub("<=", SIGN_LESS_OR_EQUAL, str); gsub("!=", SIGN_NOT_EQUAL, str); gsub("...", "…", str); } gsub("&", "&", str); gsub("<", "<", str); gsub(">", ">", str); gsub("\n","
", str); return str; } bool string_is_less(std::string str1, std::string str2) { size_t i = 0; bool b_uni = false; while(i < str1.length() && i < str2.length()) { if(str1[i] == str2[i]) i++; else if((signed char) str1[i] < 0 || (signed char) str2[i] < 0) {b_uni = true; break;} else return str1[i] < str2[i]; } if(b_uni) return QString::fromStdString(str1).compare(QString::fromStdString(str2)) < 0; return str1 < str2; } bool item_in_calculator(ExpressionItem *item) { if(!CALCULATOR->stillHasVariable((Variable*) item) || !CALCULATOR->stillHasFunction((MathFunction*) item) || !CALCULATOR->stillHasUnit((Unit*) item)) return false; if(item->type() == TYPE_VARIABLE) return CALCULATOR->hasVariable((Variable*) item); if(item->type() == TYPE_UNIT) return CALCULATOR->hasUnit((Unit*) item); if(item->type() == TYPE_FUNCTION) return CALCULATOR->hasFunction((MathFunction*) item); return false; } void remove_spaces(std::string &str) { size_t i = 0; while(true) { i = str.find(' ', i); if(i != std::string::npos) str.erase(i, 1); else break; } i = 0; while(true) { i = str.find(THIN_SPACE, i); if(i != std::string::npos) str.erase(i, strlen(THIN_SPACE)); else break; } i = 0; while(true) { i = str.find(NNBSP, i); if(i != std::string::npos) str.erase(i, strlen(NNBSP)); else break; } i = 0; while(true) { i = str.find(NBSP, i); if(i != std::string::npos) str.erase(i, strlen(NBSP)); else break; } } long int get_fixed_denominator_qt2(const std::string &str, int &to_fraction, char sgn, const QString &localized_fraction, bool qalc_command) { long int fden = 0; if(!qalc_command && (equalsIgnoreCase(str, "fraction") || equalsIgnoreCase(str, localized_fraction.toStdString()) || str == "1/n" || str == "/n")) { fden = -1; } else { if(str.length() > 2 && str[0] == '1' && str[1] == '/' && str.find_first_not_of(NUMBERS SPACES, 2) == std::string::npos) { fden = s2i(str.substr(2, str.length() - 2)); } else if(str.length() > 1 && str[0] == '/' && str.find_first_not_of(NUMBERS SPACES, 1) == std::string::npos) { fden = s2i(str.substr(1, str.length() - 1)); } else if(str == "3rds") { fden = 3; } else if(str == "halves") { fden = 2; } else if(str.length() > 3 && str.find("ths", str.length() - 3) != std::string::npos && str.find_first_not_of(NUMBERS SPACES) == str.length() - 3) { fden = s2i(str.substr(0, str.length() - 3)); } } if(fden == 1) fden = 0; if(fden != 0) { if(sgn == '-') to_fraction = 2; else if(fden > 0 && sgn == 0) to_fraction = -1; else to_fraction = 1; } return fden; } long int get_fixed_denominator_qt(const std::string &str, int &to_fraction, const QString &localized_fraction, bool qalc_command) { size_t n = 0; if(str[0] == '-' || str[0] == '+') n = 1; if(n > 0) return get_fixed_denominator_qt2(str.substr(n, str.length() - n), to_fraction, str[0], localized_fraction, qalc_command); return get_fixed_denominator_qt2(str, to_fraction, 0, localized_fraction, qalc_command); } size_t unformatted_length(const std::string &str) { size_t l = 0; bool intag = false; for(size_t i = 0; i < str.length(); i++) { if(intag) { if(str[i] == '>') intag = false; } else if(str[i] == '<') { intag = true; } else if((signed char) str[i] > 0 || (unsigned char) str[i] >= 0xC0) { l++; } } return l; } bool is_equation_solutions(const MathStructure &m) { if(m.isComparison()) { return m.comparisonType() == COMPARISON_EQUALS && m[0].isUnknown(); } else if(m.isLogicalAnd()) { bool b = false; for(size_t i = 0; i < m.size(); i++) { if(!m[i].isComparison()) { return false; } else if(m[i].comparisonType() == COMPARISON_EQUALS) { if(b || !m[i][0].isUnknown()) return false; b = true; } } return b; } else if(m.isLogicalOr()) { for(size_t i = 0; i < m.size(); i++) { if(m[i].isComparison()) { if(m[i].comparisonType() != COMPARISON_EQUALS || !m[i][0].isUnknown()) return false; } else if(m[i].isLogicalAnd()) { bool b = false; for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(!m[i][i2].isComparison()) { return false; } else if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { if(b || !m[i][i2][0].isUnknown()) return false; b = true; } } if(!b) return false; } else { return false; } } return true; } return false; } AnswerFunction::AnswerFunction() : MathFunction("answer", 1, 1, "", QApplication::tr("History Answer Value").toStdString()) { if(QApplication::tr("answer") != "answer") addName(QApplication::tr("answer").toStdString(), 1); VectorArgument *arg = new VectorArgument(QApplication::tr("History Index(es)").toStdString()); arg->addArgument(new IntegerArgument("", ARGUMENT_MIN_MAX_NONZERO, true, true, INTEGER_TYPE_SINT)); setArgumentDefinition(1, arg); } int AnswerFunction::calculate(MathStructure &mstruct, const MathStructure &vargs, const EvaluationOptions&) { if(vargs[0].size() == 0) return 0; if(vargs[0].size() > 1) mstruct.clearVector(); for(size_t i = 0; i < vargs[0].size(); i++) { int index = vargs[0][i].number().intValue(); if(index < 0) index = (int) settings->history_answer.size() + 1 + index; if(index <= 0 || index > (int) settings->history_answer.size() || settings->history_answer[(size_t) index - 1] == NULL) { CALCULATOR->error(true, QApplication::tr("History index %s does not exist.").toUtf8().data(), vargs[0][i].print().c_str(), NULL); if(vargs[0].size() == 1) mstruct.setUndefined(); else mstruct.addChild(m_undefined); } else { if(is_equation_solutions(*settings->history_answer[(size_t) index - 1])) { MathStructure m(*settings->history_answer[(size_t) index - 1]); if(m.isLogicalAnd()) { for(size_t i = 0; i < m.size(); i++) { if(m[i].comparisonType() == COMPARISON_EQUALS) { m.setToChild(i + 1); break; } } m.setToChild(2); } else if(m.isLogicalOr()) { m.setType(STRUCT_VECTOR); for(size_t i = 0; i < m.size(); i++) { if(m[i].isLogicalAnd()) { for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { m[i].setToChild(i2 + 1); break; } } m[i].setToChild(2); } else { m[i].setToChild(2); } } } else { m.setToChild(2); } if(vargs[0].size() == 1) mstruct.set(m); else mstruct.addChild(m); } else { if(vargs[0].size() == 1) mstruct.set(*settings->history_answer[(size_t) index - 1]); else mstruct.addChild(*settings->history_answer[(size_t) index - 1]); } } } return 1; } QalculateQtSettings::QalculateQtSettings() { current_result = NULL; ignore_locale = false; fetch_exchange_rates_at_startup = false; current_history_time = 0; allow_multiple_instances = -1; std::string filename = buildPath(getLocalDir(), "qalculate-qt.cfg"); FILE *file = fopen(filename.c_str(), "r"); char line[10000]; bool b1 = false, b2 = false; std::string stmp; if(file) { while(true) { if(fgets(line, 10000, file) == NULL) break; if(strcmp(line, "ignore_locale=1\n") == 0) { ignore_locale = true; b1 = true; if(b2) break; } else if(strcmp(line, "ignore_locale=0\n") == 0) { b1 = true; if(b2) break; } else if(strlen(line) > 9 && strncmp(line, "language=", 9) == 0) { custom_lang = (line + sizeof(char) * 9); custom_lang.chop(1); b1 = true; if(b2) break; } else if(strcmp(line, "allow_multiple_instances=1\n") == 0) { allow_multiple_instances = 1; b2 = true; if(b1) break; } else if(strcmp(line, "allow_multiple_instances=0\n") == 0) { allow_multiple_instances = 0; b2 = true; if(b1) break; } else if(strcmp(line, "allow_multiple_instances=-1\n") == 0) { b2 = true; if(b1) break; } } fclose(file); } wayland_platform = qApp->platformName().contains("wayland"); } QalculateQtSettings::~QalculateQtSettings() {} bool QalculateQtSettings::isAnswerVariable(Variable *v) { return v == vans[0] || v == vans[1] || v == vans[2] || v == vans[3] || v == vans[4]; } #include #include #include bool QalculateQtSettings::useColoredIcon(QWidget *w) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) QColor c = w->palette().buttonText().color(); bool light = c.red() + c.green() + c.blue() < 255; if(!light && c.lightness() >= 235 && c.saturation() <= 5) return false; else if(light && c.lightness() <= 50 && c.saturation() <= 50) return false; return true; #endif return false; } QIcon QalculateQtSettings::loadColoredIcon(const QString &str, QWidget *w) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) QColor c = w->palette().buttonText().color(); bool light = c.red() + c.green() + c.blue() < 255; if(!light && c.lightness() >= 235 && c.saturation() <= 5) return QIcon(":/icons/dark/actions/scalable/" + str + ".svg"); else if(light && c.lightness() <= 50 && c.saturation() <= 50) return QIcon(":/icons/actions/scalable/" + str + ".svg"); QResource r((light ? ":/icons/actions/scalable/" : ":/icons/dark/actions/scalable/") + str + ".svg"); QByteArray d = r.uncompressedData(); d.replace(light ? "#232629" : "#eff0f1", c.name().toUtf8()); QTemporaryFile f(QDir::temp().filePath(qApp->applicationName() + "_XXXXXX.svg")); if(!f.open()) return load_icon(str, w); QTextStream out(&f); out << d; f.setAutoRemove(false); tempfiles << f.fileName(); f.close(); return QIcon(f.fileName()); #else return load_icon(str, w); #endif } QIcon load_icon(const QString &str, QWidget *w) { QColor c = w->palette().buttonText().color(); if(c.red() + c.green() + c.blue() < 255) return QIcon(":/icons/actions/scalable/" + str + ".svg"); else return QIcon(":/icons/dark/actions/scalable/" + str + ".svg"); } void QalculateQtSettings::readPreferenceValue(const std::string &svar, const std::string &svalue, bool is_workspace) { int v = s2i(svalue); if(svar == "history_expression" || svar == "history_expression*") { v_expression.push_back(svalue); v_protected.push_back(svar[svar.length() - 1] == '*'); v_result.push_back(std::vector()); v_exact.push_back(std::vector()); v_value.push_back(std::vector()); v_messages.push_back(""); v_parseerror.push_back(false); v_time.push_back(current_history_time); } else if(svar == "history_parse") { if(v_expression.size() > v_parse.size()) { v_parse.push_back(svalue); v_pexact.push_back(true); } } else if(svar == "history_time") { current_history_time = (time_t) strtoll(svalue.c_str(), NULL, 10); } else if(svar == "history_parse_approximate") { if(v_expression.size() > v_parse.size()) { v_parse.push_back(svalue); v_pexact.push_back(false); } } else if(svar == "history_result" || svar == "history_result_approximate") { if(v_parse.size() < v_expression.size()) { v_parse.push_back(v_expression[v_expression.size() - 1]); v_expression[v_expression.size() - 1] = ""; v_pexact.push_back(true); } if(!v_result.empty()) { v_result[v_result.size() - 1].push_back(svalue); v_value[v_value.size() - 1].push_back(0); if(v_exact[v_exact.size() - 1].size() < v_result[v_result.size() - 1].size()) { v_exact[v_exact.size() - 1].push_back(svar.length() < 20); } } } else if(svar == "history_exact") { if(!v_exact.empty()) v_exact[settings->v_exact.size() - 1].push_back(v); } else if(svar == "expression_history") { expression_history.push_back(svalue); } else if(!is_workspace && svar == "favourite_function") { favourite_functions_pre.push_back(svalue); favourite_functions_changed = true; } else if(!is_workspace && svar == "recent_function") { recent_functions_pre.push_back(svalue); } else if(!is_workspace && svar == "favourite_unit") { favourite_units_pre.push_back(svalue); favourite_units_changed = true; } else if(!is_workspace && svar == "recent_unit") { recent_units_pre.push_back(svalue); } else if(!is_workspace && svar == "latest_button_unit") { latest_button_unit = svalue; } else if(!is_workspace && svar == "favourite_variable") { favourite_variables_pre.push_back(svalue); favourite_variables_changed = true; } else if(!is_workspace && svar == "recent_variable") { recent_variables_pre.push_back(svalue); } else if(!is_workspace && svar == "keyboard_shortcut") { default_shortcuts = false; char *str1 = new char[svalue.length()]; char *str2 = new char[svalue.length()]; int ks_type = 0; int n = sscanf(svalue.c_str(), "%s %i %[^\n]", str1, &ks_type, str2); if(n >= 2 && ks_type >= SHORTCUT_TYPE_FUNCTION && ks_type <= LAST_SHORTCUT_TYPE) { keyboard_shortcut *ks = NULL; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { if(keyboard_shortcuts[i]->key == str1) { ks = keyboard_shortcuts[i]; break; } } if(!ks || !PREFERENCES_VERSION_BEFORE(4, 7, 0)) { if(!ks) { ks = new keyboard_shortcut; ks->key = str1; ks->new_action = false; ks->action = NULL; keyboard_shortcuts.push_back(ks); } if(n == 3) { ks->value.push_back(str2); if(ks_type != SHORTCUT_TYPE_TEXT) remove_blank_ends(ks->value[ks->value.size() - 1]); } else { ks->value.push_back(""); } ks->type.push_back((shortcut_type) ks_type); } } delete[] str1; delete[] str2; } else if(!is_workspace && svar == "custom_button_label") { int c = 0, r = 0; char *str = new char[svalue.length()]; int n = sscanf(svalue.c_str(), "%i %i %[^\n]", &r, &c, str); if(n == 3 && c >= 0 && r > 0) { size_t index = 0; for(size_t i = custom_buttons.size(); i > 0; i--) { if(custom_buttons[i - 1].r == r && custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; custom_buttons.push_back(cb); index = custom_buttons.size(); } index--; custom_buttons[index].label = QString::fromUtf8(str).trimmed(); } delete[] str; } else if(!is_workspace && svar == "custom_button") { int c = 0, r = 0; unsigned int bi = 0; char *str = new char[svalue.length()]; int cb_type = -1; int n = sscanf(svalue.c_str(), "%i %i %u %i %[^\n]", &c, &r, &bi, &cb_type, str); if((n == 4 || n == 5) && bi <= 2 && c >= 0 && r > 0) { size_t index = 0; for(size_t i = custom_buttons.size(); i > 0; i--) { if(custom_buttons[i - 1].r == r && custom_buttons[i - 1].c == c) { index = i; break; } } if(index == 0) { custom_button cb; cb.c = c; cb.r = r; cb.type[0] = -1; cb.type[1] = -1; cb.type[2] = -1; custom_buttons.push_back(cb); index = custom_buttons.size(); } index--; custom_buttons[index].type[bi] = cb_type; if(n == 5) { custom_buttons[index].value[bi] = str; if(cb_type != SHORTCUT_TYPE_TEXT) remove_blank_ends(custom_buttons[index].value[bi]); } else { custom_buttons[index].value[bi] = ""; } } delete[] str; } else if(!is_workspace && svar == "show_all_units") { show_all_units = v; } else if(!is_workspace && svar == "show_all_functions") { show_all_functions = v; } else if(!is_workspace && svar == "show_all_variables") { show_all_variables = v; } else if(!is_workspace && svar == "use_function_dialog") { use_function_dialog = v; } else if(!is_workspace && svar == "expression_pos") { if(v >= 0 && v <= 1) expression_pos = v; } else if(!is_workspace && svar == "show_statusbar") { show_statusbar = v; } else if(svar == "keypad_type") { if(v >= 0 && v <= 4) keypad_type = v; } else if(svar == "programming_base_changed") { if(keypad_type == KEYPAD_PROGRAMMING && show_keypad) programming_base_changed = v; } else if(svar == "toolbar_style") { if(v == Qt::ToolButtonIconOnly || v == Qt::ToolButtonTextOnly || v == Qt::ToolButtonTextBesideIcon || v == Qt::ToolButtonTextUnderIcon) toolbar_style = v; } else if(svar == "separate_keypad_menu_buttons") { separate_keypad_menu_buttons = v; } else if(svar == "show_percent_in_numpad") { show_percent_in_numpad = v; } else if(svar == "hide_numpad") { hide_numpad = v; } else if(svar == "show_custom_keypad_column") { show_custom_keypad_column = v; } else if(svar == "show_keypad") { show_keypad = v; } else if(svar == "show_bases") { show_bases = v; } else if(svar == "version") { parse_qalculate_version(svalue, preferences_version); } else if(svar == "min_deci") { printops.min_decimals = v; } else if(svar == "use_min_deci") { printops.use_min_decimals = v; } else if(svar == "max_deci") { printops.max_decimals = v; } else if(svar == "use_max_deci") { printops.use_max_decimals = v; } else if(svar == "precision") { CALCULATOR->setPrecision(v); } else if(svar == "previous_precision") { previous_precision = v; } else if(svar == "min_exp") { printops.min_exp = v; } else if(svar == "interval_arithmetic") { CALCULATOR->useIntervalArithmetic(v); } else if(svar == "interval_display") { if(v == 0) { printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; adaptive_interval_display = true; } else { v--; if(v >= INTERVAL_DISPLAY_SIGNIFICANT_DIGITS && v <= INTERVAL_DISPLAY_RELATIVE) { printops.interval_display = (IntervalDisplay) v; adaptive_interval_display = false; } } } else if(svar == "negative_exponents") { printops.negative_exponents = v; } else if(svar == "sort_minus_last") { printops.sort_options.minus_last = v; } else if(svar == "place_units_separately") { printops.place_units_separately = v; } else if(svar == "use_prefixes") { printops.use_unit_prefixes = v; } else if(svar == "use_prefixes_for_all_units") { printops.use_prefixes_for_all_units = v; } else if(svar == "use_prefixes_for_currencies") { printops.use_prefixes_for_currencies = v; } else if(svar == "prefixes_default") { prefixes_default = v; } else if(svar == "number_fraction_format") { if(v >= FRACTION_DECIMAL && v <= FRACTION_COMBINED) { printops.number_fraction_format = (NumberFractionFormat) v; printops.restrict_fraction_length = (v == FRACTION_FRACTIONAL || v == FRACTION_COMBINED); dual_fraction = 0; } else if(v == FRACTION_COMBINED + 1) { printops.number_fraction_format = FRACTION_FRACTIONAL; printops.restrict_fraction_length = PREFERENCES_VERSION_AFTER(4, 8, 1); dual_fraction = 0; } else if(v == FRACTION_COMBINED + 2) { printops.number_fraction_format = FRACTION_DECIMAL; dual_fraction = 1; } else if(v < 0) { printops.number_fraction_format = FRACTION_DECIMAL; dual_fraction = -1; } else if(v <= FRACTION_PERMYRIAD + 2) { printops.number_fraction_format = (NumberFractionFormat) (v - 2); dual_fraction = 0; } } else if(svar == "number_fraction_denominator") { CALCULATOR->setFixedDenominator(v); } else if(svar == "complex_number_form") { if(v == COMPLEX_NUMBER_FORM_CIS + 1) { evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; complex_angle_form = true; } else if(v >= COMPLEX_NUMBER_FORM_RECTANGULAR && v <= COMPLEX_NUMBER_FORM_CIS) { evalops.complex_number_form = (ComplexNumberForm) v; complex_angle_form = false; } } else if(svar == "number_base") { printops.base = v; } else if(svar == "custom_number_base") { CALCULATOR->beginTemporaryStopMessages(); MathStructure m; CALCULATOR->calculate(&m, svalue, 500); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->setCustomOutputBase(m.number()); } else if(svar == "number_base_expression") { evalops.parse_options.base = v; } else if(svar == "custom_number_base_expression") { CALCULATOR->beginTemporaryStopMessages(); MathStructure m; CALCULATOR->calculate(&m, svalue, 500); CALCULATOR->endTemporaryStopMessages(); CALCULATOR->setCustomInputBase(m.number()); } else if(svar == "read_precision") { if(v >= DONT_READ_PRECISION && v <= READ_PRECISION_WHEN_DECIMALS) { evalops.parse_options.read_precision = (ReadPrecisionMode) v; } } else if(svar == "assume_denominators_nonzero") { evalops.assume_denominators_nonzero = v; } else if(svar == "warn_about_denominators_assumed_nonzero") { evalops.warn_about_denominators_assumed_nonzero = v; } else if(svar == "structuring") { if(v >= STRUCTURING_NONE && v <= STRUCTURING_FACTORIZE) { evalops.structuring = (StructuringMode) v; printops.allow_factorization = (evalops.structuring == STRUCTURING_FACTORIZE); } } else if(svar == "angle_unit") { if(v >= ANGLE_UNIT_NONE && v <= ANGLE_UNIT_CUSTOM) { evalops.parse_options.angle_unit = (AngleUnit) v; } } else if(svar == "custom_angle_unit") { custom_angle_unit = svalue; } else if(svar == "functions_enabled") { evalops.parse_options.functions_enabled = v; } else if(svar == "variables_enabled") { evalops.parse_options.variables_enabled = v; } else if(svar == "donot_calculate_variables") { evalops.calculate_variables = !v; } else if(svar == "calculate_variables") { evalops.calculate_variables = v; } else if(svar == "variable_units_enabled") { CALCULATOR->setVariableUnitsEnabled(v); } else if(svar == "calculate_functions") { evalops.calculate_functions = v; } else if(svar == "sync_units") { evalops.sync_units = v; } else if(svar == "unknownvariables_enabled") { evalops.parse_options.unknowns_enabled = v; } else if(svar == "units_enabled") { evalops.parse_options.units_enabled = v; } else if(svar == "allow_complex") { evalops.allow_complex = v; } else if(svar == "allow_infinite") { evalops.allow_infinite = v; } else if(svar == "use_short_units") { printops.abbreviate_names = v; } else if(svar == "abbreviate_names") { printops.abbreviate_names = v; } else if(svar == "all_prefixes_enabled") { printops.use_all_prefixes = v; } else if(svar == "denominator_prefix_enabled") { printops.use_denominator_prefix = v; } else if(svar == "auto_post_conversion") { if(v >= POST_CONVERSION_NONE && v <= POST_CONVERSION_OPTIMAL) { evalops.auto_post_conversion = (AutoPostConversion) v; } } else if(svar == "mixed_units_conversion") { if(v >= MIXED_UNITS_CONVERSION_NONE || v <= MIXED_UNITS_CONVERSION_FORCE_ALL) { evalops.mixed_units_conversion = (MixedUnitsConversion) v; } } else if(svar == "local_currency_conversion") { evalops.local_currency_conversion = v; } else if(svar == "use_binary_prefixes") { CALCULATOR->useBinaryPrefixes(v); } else if(svar == "indicate_infinite_series") { printops.indicate_infinite_series = v; } else if(svar == "show_ending_zeroes") { printops.show_ending_zeroes = v; } else if(svar == "digit_grouping") { if(v >= DIGIT_GROUPING_NONE && v <= DIGIT_GROUPING_LOCALE) { printops.digit_grouping = (DigitGrouping) v; } else if(v == DIGIT_GROUPING_LOCALE + 1) { custom_digit_grouping = true; printops.digit_grouping = DIGIT_GROUPING_LOCALE; } } else if(svar == "custom_digit_group_separator") { custom_digit_group_separator = svalue; custom_digit_group_changed = true; } else if(svar == "custom_digit_group_format") { custom_digit_group_format = svalue; custom_digit_group_changed = true; } else if(svar == "round_halfway_to_even") { if(v) printops.rounding = ROUNDING_HALF_TO_EVEN; } else if(svar == "rounding_mode") { if(v >= ROUNDING_HALF_AWAY_FROM_ZERO && v <= ROUNDING_DOWN) { if(!PREFERENCES_VERSION_AFTER(4, 9, 0) && v == 2) v = ROUNDING_TOWARD_ZERO; printops.rounding = (RoundingMode) v; } } else if(svar == "approximation") { if(v >= APPROXIMATION_EXACT && v <= APPROXIMATION_APPROXIMATE) { evalops.approximation = (ApproximationMode) v; dual_approximation = 0; } else if(v == APPROXIMATION_APPROXIMATE + 1) { evalops.approximation = APPROXIMATION_TRY_EXACT; dual_approximation = 1; } else if(v < 0) { evalops.approximation = APPROXIMATION_TRY_EXACT; dual_approximation = -1; } } else if(svar == "interval_calculation") { if(v >= INTERVAL_CALCULATION_NONE && v <= INTERVAL_CALCULATION_SIMPLE_INTERVAL_ARITHMETIC) { evalops.interval_calculation = (IntervalCalculation) v; } } else if(svar == "concise_uncertainty_input") { CALCULATOR->setConciseUncertaintyInputEnabled(v); } else if(svar == "chain_mode") { chain_mode = v; } else if(svar == "rpn_mode") { rpn_mode = v; } else if(svar == "limit_implicit_multiplication") { evalops.parse_options.limit_implicit_multiplication = v; printops.limit_implicit_multiplication = v; } else if(svar == "parsing_mode") { evalops.parse_options.parsing_mode = (ParsingMode) v; if(evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) implicit_question_asked = true; } else if(svar == "simplified_percentage") { if(v > 0 && !PREFERENCES_VERSION_AFTER(5, 0, 0)) v = -1; simplified_percentage = v; } else if(svar == "default_assumption_type") { if(v >= ASSUMPTION_TYPE_NONE && v <= ASSUMPTION_TYPE_BOOLEAN) { CALCULATOR->defaultAssumptions()->setType((AssumptionType) v); } } else if(svar == "default_assumption_sign") { if(v >= ASSUMPTION_SIGN_UNKNOWN && v <= ASSUMPTION_SIGN_NONZERO) { CALCULATOR->defaultAssumptions()->setSign((AssumptionSign) v); } } else if(svar == "spacious") { printops.spacious = v; } else if(svar == "excessive_parenthesis") { printops.excessive_parenthesis = v; } else if(svar == "short_multiplication") { printops.short_multiplication = v; } else if(!is_workspace) { if(svar == "custom_button_rows") { if(v > 0 && v <= 100) custom_button_rows = v; } else if(svar == "custom_button_columns") { if(v > 0 && v <= 100) custom_button_columns = v; } else if(svar == "recent_workspace") { recent_workspaces.push_back(svalue); } else if(svar == "last_workspace") { current_workspace = svalue; } else if(svar == "save_workspace") { save_workspace = v; } else if(svar == "always_on_top") { always_on_top = v; } else if(svar == "keep_function_dialog_open") { keep_function_dialog_open = v; } else if(svar == "save_mode_on_exit") { save_mode_on_exit = v; } else if(svar == "save_definitions_on_exit") { save_defs_on_exit = v; } else if(svar == "clear_history_on_exit") { clear_history_on_exit = v; } else if(svar == "max_history_lines") { max_history_lines = v; } else if(svar == "window_state") { window_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "preserve_history_height") { preserve_history_height = v; } else if(svar == "keypad_appended") { keypad_appended = v; } else if(svar == "bases_appended") { bases_appended = v; } else if(svar == "replace_expression") { replace_expression = v; } else if(svar == "autocopy_result") { autocopy_result = v; } else if(svar == "history_expression_type") { if(v >= 0 && v < 5) history_expression_type = v; } else if(svar == "window_geometry") { window_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "splitter_state") { splitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_geometry") { functions_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_vsplitter_state") { functions_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "functions_hsplitter_state") { functions_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_geometry") { units_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_vsplitter_state") { units_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "units_hsplitter_state") { units_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_geometry") { variables_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_vsplitter_state") { variables_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "variables_hsplitter_state") { variables_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_geometry") { datasets_geometry = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_vsplitter_state") { datasets_vsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "datasets_hsplitter_state") { datasets_hsplitter_state = QByteArray::fromBase64(svalue.c_str()); } else if(svar == "style") { #if defined _WIN32 if(PREFERENCES_VERSION_BEFORE(4, 7, 0)) { } else { #else if(v >= 0 && v < QStyleFactory::keys().count()) style = QStyleFactory::keys().at(v); else style = ""; #endif #if defined _WIN32 } #endif } else if(svar == "style_name") { style = QString::fromStdString(svalue); } else if(svar == "palette") { #ifdef _WIN32 #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) if(!PREFERENCES_VERSION_BEFORE(4, 7, 0) || (v == 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark)) palette = v; # else if(!PREFERENCES_VERSION_BEFORE(4, 7, 0)) palette = v; # endif #else palette = v; #endif } else if(svar == "disable_cursor_blinking") { disable_cursor_blinking = v; } else if(svar == "color") { colorize_result = v; } else if(svar == "format") { format_result = v; } else if(svar == "language") { custom_lang = QString::fromStdString(svalue); } else if(svar == "default_currency") { default_currency = svalue; } else if(svar == "ignore_locale") { ignore_locale = v; } else if(svar == "window_title_mode") { if(v >= 0 && v <= 4) title_type = v; } else if(svar == "enable_tooltips") { enable_tooltips = v; if(enable_tooltips < 0) enable_tooltips = 1; else if(enable_tooltips > 2) enable_tooltips = 2; } else if(svar == "auto_update_exchange_rates") { auto_update_exchange_rates = v; } else if(svar == "display_expression_status") { display_expression_status = v; } else if(svar == "expression_status_delay") { if(v < 0) v = 0; expression_status_delay = v; } else if(svar == "enable_input_method") { enable_input_method = v; } else if(svar == "enable_completion") { enable_completion = v; } else if(svar == "enable_completion2") { enable_completion2 = v; } else if(svar == "completion_min") { if(v < 1) v = 1; completion_min = v; } else if(svar == "completion_min2") { if(v < 1) v = 1; completion_min2 = v; } else if(svar == "completion_delay") { if(v < 0) v = 0; completion_delay = v; } else if(svar == "use_custom_result_font") { use_custom_result_font = v; } else if(svar == "use_custom_expression_font") { use_custom_expression_font = v; } else if(svar == "use_custom_status_font") { use_custom_status_font = v; } else if(svar == "use_custom_keypad_font") { use_custom_keypad_font = v; } else if(svar == "use_custom_application_font") { use_custom_app_font = v; } else if(svar == "custom_result_font") { custom_result_font = svalue; save_custom_result_font = true; } else if(svar == "custom_expression_font") { custom_expression_font = svalue; save_custom_expression_font = true; } else if(svar == "custom_status_font") { custom_status_font = svalue; save_custom_status_font = true; } else if(svar == "custom_keypad_font") { custom_keypad_font = svalue; save_custom_keypad_font = true; } else if(svar == "custom_application_font") { custom_app_font = svalue; save_custom_app_font = true; } else if(svar == "multiplication_sign") { if(v >= MULTIPLICATION_SIGN_ASTERISK && v <= MULTIPLICATION_SIGN_ALTDOT) { printops.multiplication_sign = (MultiplicationSign) v; } } else if(svar == "division_sign") { if(v >= DIVISION_SIGN_SLASH && v <= DIVISION_SIGN_DIVISION) printops.division_sign = (DivisionSign) v; } else if(svar == "plot_legend_placement") { if(v >= PLOT_LEGEND_NONE && v <= PLOT_LEGEND_OUTSIDE) default_plot_legend_placement = (PlotLegendPlacement) v; } else if(svar == "plot_style") { if(v >= PLOT_STYLE_LINES && v <= PLOT_STYLE_POLAR) default_plot_style = (PlotStyle) v; } else if(svar == "plot_smoothing") { if(v >= PLOT_SMOOTHING_NONE && v <= PLOT_SMOOTHING_SBEZIER) default_plot_smoothing = (PlotSmoothing) v; } else if(svar == "plot_display_grid") { default_plot_display_grid = v; } else if(svar == "plot_full_border") { default_plot_full_border = v; } else if(svar == "plot_min") { default_plot_min = svalue; } else if(svar == "plot_max") { default_plot_max = svalue; } else if(svar == "plot_step") { default_plot_step = svalue; } else if(svar == "plot_sampling_rate") { default_plot_sampling_rate = v; } else if(svar == "plot_use_sampling_rate") { default_plot_use_sampling_rate = v; } else if(svar == "plot_complex") { default_plot_complex = v; } else if(svar == "plot_variable") { default_plot_variable = svalue; } else if(svar == "plot_rows") { default_plot_rows = v; } else if(svar == "plot_type") { if(v >= 0 && v <= 2) default_plot_type = v; } else if(svar == "plot_color") { default_plot_color = v; } else if(svar == "plot_linewidth") { default_plot_linewidth = v; } else if(svar == "max_plot_time") { max_plot_time = v; } else if(svar == "check_version") { check_version = v; } else if(svar == "last_version_check") { last_version_check_date.set(svalue); } else if(svar == "last_found_version") { last_found_version = svalue; } else if(svar == "bit_width") { default_bits = v; } else if(svar == "signed_integer") { default_signed = v; } else if(svar == "rpn_keys") { rpn_keys = v; } else if(svar == "rpn_shown") { rpn_shown = v; } else if(svar == "use_unicode_signs") { printops.use_unicode_signs = v; } else if(svar == "e_notation") { if(!v) printops.exp_display = EXP_POWER_OF_10; else printops.exp_display = EXP_LOWERCASE_E; } else if(svar == "exp_display") { if(v >= EXP_UPPERCASE_E && v <= EXP_POWER_OF_10) printops.exp_display = (ExpDisplay) v; } else if(svar == "lower_case_numbers") { printops.lower_case_numbers = v; } else if(svar == "duodecimal_symbols") { printops.duodecimal_symbols = v; } else if(svar == "imaginary_j") { do_imaginary_j = v; } else if(svar == "base_display") { if(v >= BASE_DISPLAY_NONE && v <= BASE_DISPLAY_SUFFIX) printops.base_display = (BaseDisplay) v; } else if(svar == "binary_bits") { printops.binary_bits = v; evalops.parse_options.binary_bits = v; } else if(svar == "twos_complement") { printops.twos_complement = v; } else if(svar == "hexadecimal_twos_complement") { printops.hexadecimal_twos_complement = v; } else if(svar == "twos_complement_input") { evalops.parse_options.twos_complement = v; } else if(svar == "hexadecimal_twos_complement_input") { evalops.parse_options.hexadecimal_twos_complement = v; } else if(svar == "spell_out_logical_operators") { printops.spell_out_logical_operators = v; } else if(svar == "caret_as_xor") { caret_as_xor = v; } else if(svar == "automatic_digit_grouping") { automatic_digit_grouping = v; } else if(svar == "close_with_esc") { close_with_esc = v; } else if(svar == "copy_ascii") { copy_ascii = v; } else if(svar == "copy_ascii_without_units") { copy_ascii_without_units = v; } else if(svar == "decimal_comma") { decimal_comma = v; if(v == 0) CALCULATOR->useDecimalPoint(evalops.parse_options.comma_as_separator); else if(v > 0) CALCULATOR->useDecimalComma(); } else if(svar == "dot_as_separator") { if(v < 0) { evalops.parse_options.dot_as_separator = CALCULATOR->default_dot_as_separator; dot_question_asked = false; } else { evalops.parse_options.dot_as_separator = v; dot_question_asked = true; } } else if(svar == "comma_as_separator") { evalops.parse_options.comma_as_separator = v; if(CALCULATOR->getDecimalPoint() != COMMA) { CALCULATOR->useDecimalPoint(evalops.parse_options.comma_as_separator); } } else if(svar == "temperature_calculation") { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) v); tc_set = true; } else if(svar == "sinc_function") { if(v == 1) { CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); sinc_set = true; } else if(v == 0) { sinc_set = true; } } else if(svar == "implicit_question_asked") { implicit_question_asked = v; } else if(svar == "assumptions_warning_shown") { assumptions_warning_shown = v; } else if(svar == "calculate_as_you_type") { auto_calculate = v; } else if(svar == "calculate_as_you_type_delay") { auto_calculate_delay = v; } else if(svar == "adaptive_autocalc_delay") { adaptive_autocalc_delay = v; } else if(svar == "status_in_history") { status_in_history = v; if(status_in_history) status_in_statusbar = false; } else if(svar == "status_in_statusbar") { status_in_statusbar = v; if(status_in_statusbar) status_in_history = false; } else if(svar == "autocalc_selection") { autocalc_selection = v; } } } void QalculateQtSettings::loadPreferences() { f_answer = CALCULATOR->addFunction(new AnswerFunction()); CALCULATOR->setPrecision(10); previous_precision = 0; CALCULATOR->useIntervalArithmetic(true); CALCULATOR->setTemperatureCalculationMode(TEMPERATURE_CALCULATION_HYBRID); CALCULATOR->useBinaryPrefixes(0); CALCULATOR->setConciseUncertaintyInputEnabled(false); current_workspace = ""; save_workspace = -1; printops.multiplication_sign = MULTIPLICATION_SIGN_X; printops.division_sign = DIVISION_SIGN_DIVISION_SLASH; printops.is_approximate = new bool(false); printops.prefix = NULL; printops.use_min_decimals = false; printops.use_denominator_prefix = true; printops.min_decimals = 0; printops.use_max_decimals = false; printops.max_decimals = 2; printops.base = 10; printops.min_exp = EXP_PRECISION; printops.negative_exponents = false; printops.sort_options.minus_last = true; printops.indicate_infinite_series = false; printops.show_ending_zeroes = true; printops.round_halfway_to_even = false; printops.rounding = ROUNDING_HALF_AWAY_FROM_ZERO; printops.number_fraction_format = FRACTION_DECIMAL; printops.restrict_fraction_length = false; printops.abbreviate_names = true; printops.use_unicode_signs = true; printops.digit_grouping = DIGIT_GROUPING_STANDARD; printops.use_unit_prefixes = true; printops.use_prefixes_for_currencies = false; printops.use_prefixes_for_all_units = false; printops.spacious = true; printops.short_multiplication = true; printops.place_units_separately = true; printops.use_all_prefixes = false; printops.excessive_parenthesis = false; printops.allow_non_usable = false; printops.lower_case_numbers = false; printops.duodecimal_symbols = false; printops.exp_display = EXP_POWER_OF_10; printops.lower_case_e = false; printops.base_display = BASE_DISPLAY_SUFFIX; printops.twos_complement = true; printops.hexadecimal_twos_complement = false; printops.limit_implicit_multiplication = false; printops.can_display_unicode_string_function = &can_display_unicode_string_function; printops.can_display_unicode_string_arg = NULL; printops.allow_factorization = false; printops.spell_out_logical_operators = true; printops.exp_to_root = true; printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; evalops.approximation = APPROXIMATION_TRY_EXACT; evalops.sync_units = true; evalops.structuring = STRUCTURING_SIMPLIFY; evalops.parse_options.unknowns_enabled = false; evalops.parse_options.read_precision = DONT_READ_PRECISION; evalops.parse_options.base = BASE_DECIMAL; evalops.allow_complex = true; evalops.allow_infinite = true; evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL; evalops.assume_denominators_nonzero = true; evalops.warn_about_denominators_assumed_nonzero = true; evalops.parse_options.limit_implicit_multiplication = false; evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; evalops.parse_options.angle_unit = ANGLE_UNIT_RADIANS; custom_angle_unit = ""; evalops.parse_options.dot_as_separator = CALCULATOR->default_dot_as_separator; evalops.parse_options.comma_as_separator = false; evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_DEFAULT; evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; evalops.local_currency_conversion = true; evalops.interval_calculation = INTERVAL_CALCULATION_VARIANCE_FORMULA; title_type = TITLE_APP; programming_base_changed = false; auto_calculate = true; status_in_history = true; status_in_statusbar = false; autocalc_selection = false; dot_question_asked = false; implicit_question_asked = false; assumptions_warning_shown = false; complex_angle_form = false; decimal_comma = -1; adaptive_interval_display = true; tc_set = false; sinc_set = false; dual_fraction = -1; dual_approximation = -1; auto_update_exchange_rates = 7; close_with_esc = false; rpn_mode = false; rpn_keys = true; rpn_shown = false; caret_as_xor = false; automatic_digit_grouping = false; custom_digit_grouping = false; custom_digit_group_changed = false; custom_digit_group_separator = ","; custom_digit_group_format = "3"; copy_ascii = false; copy_ascii_without_units = false; do_imaginary_j = false; simplified_percentage = -1; color = 1; colorize_result = true; format_result = true; enable_tooltips = 1; chain_mode = false; enable_input_method = false; enable_completion = true; enable_completion2 = true; completion_min = 1; completion_min2 = 1; completion_delay = 500; always_on_top = false; display_expression_status = true; expression_status_delay = 1000; auto_calculate_delay = 500; adaptive_autocalc_delay = true; prefixes_default = true; keypad_type = 0; expression_pos = -1; show_statusbar = false; toolbar_style = Qt::ToolButtonIconOnly; separate_keypad_menu_buttons = false; show_percent_in_numpad = false; show_keypad = -1; hide_numpad = false; show_custom_keypad_column = false; show_bases = -1; use_custom_result_font = false; use_custom_expression_font = false; use_custom_status_font = false; use_custom_keypad_font = false; use_custom_app_font = false; save_custom_result_font = false; save_custom_expression_font = false; save_custom_status_font = false; save_custom_keypad_font = false; save_custom_app_font = false; custom_result_font = ""; custom_expression_font = ""; custom_status_font = ""; custom_keypad_font = ""; custom_app_font = ""; style = ""; palette = -1; disable_cursor_blinking = false; replace_expression = KEEP_EXPRESSION; autocopy_result = false; save_mode_on_exit = true; save_defs_on_exit = true; clear_history_on_exit = false; max_history_lines = 300; history_expression_type = 0; keep_function_dialog_open = false; #ifdef _WIN32 check_version = true; #else check_version = false; #endif last_version_check_date.setToCurrentDate(); current_workspace = ""; recent_workspaces.clear(); v_expression.clear(); v_parse.clear(); v_value.clear(); v_protected.clear(); current_history_time = 0; v_time.clear(); v_result.clear(); v_exact.clear(); v_pexact.clear(); v_messages.clear(); v_parseerror.clear(); expression_history.clear(); preserve_history_height = -1; keypad_appended = false; bases_appended = false; default_shortcuts = true; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) delete keyboard_shortcuts[i]; keyboard_shortcuts.clear(); custom_buttons.clear(); custom_button_rows = 5; custom_button_columns = 4; default_signed = -1; default_bits = -1; favourite_functions_changed = false; favourite_variables_changed = false; favourite_units_changed = false; show_all_functions = false; show_all_variables = false; show_all_units = false; use_function_dialog = true; FILE *file = NULL; std::string filename = buildPath(getLocalDir(), "qalculate-qt.cfg"); file = fopen(filename.c_str(), "r"); default_plot_legend_placement = PLOT_LEGEND_TOP_RIGHT; default_plot_display_grid = true; default_plot_full_border = false; default_plot_min = "0"; default_plot_max = "10"; default_plot_step = "1"; default_plot_sampling_rate = 1001; default_plot_linewidth = 2; default_plot_rows = false; default_plot_type = 0; default_plot_style = PLOT_STYLE_LINES; default_plot_smoothing = PLOT_SMOOTHING_NONE; default_plot_variable = "x"; default_plot_color = true; default_plot_use_sampling_rate = true; default_plot_complex = -1; max_plot_time = 5; preferences_version[0] = 5; preferences_version[1] = 11; preferences_version[2] = 0; if(file) { char line[1000000L]; std::string stmp, svalue, svar; size_t i; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if((i = stmp.find_first_of("=")) != std::string::npos) { svar = stmp.substr(0, i); remove_blank_ends(svar); svalue = stmp.substr(i + 1); remove_blank_ends(svalue); readPreferenceValue(svar, svalue); } } fclose(file); first_time = false; } else { first_time = true; } while(v_expression.size() > v_parse.size()) { v_parse.push_back(""); v_pexact.push_back(true); } if(custom_digit_grouping) { saved_local_dgs = CALCULATOR->local_digit_group_separator; saved_local_dgf = CALCULATOR->local_digit_group_format; CALCULATOR->local_digit_group_separator = custom_digit_group_separator; CALCULATOR->local_digit_group_format = ""; for(size_t i = 0; i < custom_digit_group_format.size(); i++) { CALCULATOR->local_digit_group_format += custom_digit_group_format[i] - '0'; } } keyboard_shortcut *ks; #define ADD_SHORTCUT(k, t, v) ks = new keyboard_shortcut; ks->key = k; ks->type.push_back(t); ks->value.push_back(v); ks->action = NULL; ks->new_action = false; keyboard_shortcuts.push_back(ks); if(default_shortcuts) { #ifdef _WIN32 ADD_SHORTCUT("Ctrl+Q", SHORTCUT_TYPE_QUIT, "") #else ADD_SHORTCUT(QKeySequence(QKeySequence::Quit).toString(), SHORTCUT_TYPE_QUIT, "") #endif ADD_SHORTCUT(QKeySequence(QKeySequence::HelpContents).toString(), SHORTCUT_TYPE_HELP, "") ADD_SHORTCUT("Ctrl+Alt+C", SHORTCUT_TYPE_COPY_RESULT, "") ADD_SHORTCUT(QKeySequence(QKeySequence::Save).toString(), SHORTCUT_TYPE_STORE, "") ADD_SHORTCUT("Ctrl+M", SHORTCUT_TYPE_MANAGE_VARIABLES, "") ADD_SHORTCUT("Ctrl+F", SHORTCUT_TYPE_MANAGE_FUNCTIONS, "") ADD_SHORTCUT("Ctrl+U", SHORTCUT_TYPE_MANAGE_UNITS, "") ADD_SHORTCUT("Ctrl+P", SHORTCUT_TYPE_PLOT, "") ADD_SHORTCUT("Ctrl+R", SHORTCUT_TYPE_RPN_MODE, "") ADD_SHORTCUT("Ctrl+K", SHORTCUT_TYPE_KEYPAD, "") ADD_SHORTCUT("Alt+K", SHORTCUT_TYPE_KEYPAD, "") ADD_SHORTCUT("Ctrl+T", SHORTCUT_TYPE_CONVERT, "") ADD_SHORTCUT("Ctrl+B", SHORTCUT_TYPE_NUMBER_BASES, "") ADD_SHORTCUT("Ctrl+-", SHORTCUT_TYPE_NEGATE, "") ADD_SHORTCUT("Ctrl+Enter", SHORTCUT_TYPE_APPROXIMATE, "") ADD_SHORTCUT("Ctrl+Return", SHORTCUT_TYPE_APPROXIMATE, "") ADD_SHORTCUT("Alt+M", SHORTCUT_TYPE_MODE, "") ADD_SHORTCUT("Alt+F", SHORTCUT_TYPE_FUNCTIONS_MENU, "") ADD_SHORTCUT("Alt+U", SHORTCUT_TYPE_UNITS_MENU, "") ADD_SHORTCUT("Alt+V", SHORTCUT_TYPE_VARIABLES_MENU, "") ADD_SHORTCUT("F10", SHORTCUT_TYPE_MENU, "") ADD_SHORTCUT("Ctrl+)", SHORTCUT_TYPE_SMART_PARENTHESES, "") ADD_SHORTCUT("Ctrl+(", SHORTCUT_TYPE_SMART_PARENTHESES, "") ADD_SHORTCUT("Ctrl+Up", SHORTCUT_TYPE_RPN_UP, "") ADD_SHORTCUT("Ctrl+Down", SHORTCUT_TYPE_RPN_DOWN, "") ADD_SHORTCUT("Ctrl+Right", SHORTCUT_TYPE_RPN_SWAP, "") ADD_SHORTCUT("Ctrl+Left", SHORTCUT_TYPE_RPN_LASTX, "") ADD_SHORTCUT("Ctrl+Shift+C", SHORTCUT_TYPE_RPN_COPY, "") ADD_SHORTCUT("Ctrl+Delete", SHORTCUT_TYPE_RPN_DELETE, "") ADD_SHORTCUT("Ctrl+Shift+Delete", SHORTCUT_TYPE_RPN_CLEAR, "") ADD_SHORTCUT("Tab", SHORTCUT_TYPE_COMPLETE, "") } else if(PREFERENCES_VERSION_BEFORE(4, 1, 2)) { ADD_SHORTCUT("Tab", SHORTCUT_TYPE_COMPLETE, "") } else if(PREFERENCES_VERSION_BEFORE(4, 8, 1)) { bool b1 = false, b2 = false, b3 = false; for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { if(keyboard_shortcuts[i]->key == "Alt+F") b1 = true; else if(keyboard_shortcuts[i]->key == "Alt+U") b2 = true; else if(keyboard_shortcuts[i]->key == "Alt+V") b3 = true; } if(!b1) {ADD_SHORTCUT("Alt+F", SHORTCUT_TYPE_FUNCTIONS_MENU, "")} if(!b2) {ADD_SHORTCUT("Alt+U", SHORTCUT_TYPE_UNITS_MENU, "")} if(!b3) {ADD_SHORTCUT("Alt+V", SHORTCUT_TYPE_VARIABLES_MENU, "")} } updateMessagePrintOptions(); std::string ans_str = "ans"; vans[0] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str, m_undefined, QApplication::tr("Last Answer").toStdString(), false, true)); vans[0]->setDescription(tr("Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution).").toStdString()); vans[0]->addName(QApplication::tr("answer").toStdString()); vans[0]->addName(ans_str + "1"); vans[1] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "2", m_undefined, QApplication::tr("Answer 2").toStdString(), false, true)); vans[2] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "3", m_undefined, QApplication::tr("Answer 3").toStdString(), false, true)); vans[3] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "4", m_undefined, QApplication::tr("Answer 4").toStdString(), false, true)); vans[4] = (KnownVariable*) CALCULATOR->addVariable(new KnownVariable(CALCULATOR->temporaryCategory(), ans_str + "5", m_undefined, QApplication::tr("Answer 5").toStdString(), false, true)); v_memory = new KnownVariable(CALCULATOR->temporaryCategory(), "", m_zero, QApplication::tr("Memory").toStdString(), false, true); ExpressionName ename; ename.name = "MR"; ename.case_sensitive = true; ename.abbreviation = true; v_memory->addName(ename); /*ename.name = "MRC"; v_memory->addName(ename);*/ CALCULATOR->addVariable(v_memory); #ifdef _WIN32 updateStyle(); #else if(!style.isEmpty()) updateStyle(); else if(palette >= 0) updatePalette(); #endif if(!current_workspace.empty()) { if(!loadWorkspace(current_workspace.c_str())) current_workspace = ""; } } void QalculateQtSettings::setCustomAngleUnit() { if(!custom_angle_unit.empty()) { CALCULATOR->setCustomAngleUnit(CALCULATOR->getActiveUnit(custom_angle_unit)); if(CALCULATOR->customAngleUnit()) custom_angle_unit = CALCULATOR->customAngleUnit()->referenceName(); } if(evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) evalops.parse_options.angle_unit = ANGLE_UNIT_NONE; } void QalculateQtSettings::setDefaultCurrency() { if(!default_currency.empty()) { Unit *u = CALCULATOR->getActiveUnit(default_currency); if(u) CALCULATOR->setLocalCurrency(u); } } void QalculateQtSettings::updateFavourites() { if(favourite_functions_pre.empty()) { for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isHidden()) favourite_functions.push_back(CALCULATOR->functions[i]); } } else { for(size_t i = 0; i < favourite_functions_pre.size(); i++) { MathFunction *f = CALCULATOR->getActiveFunction(favourite_functions_pre[i]); if(f) favourite_functions.push_back(f); } } for(size_t i = 0; i < recent_functions_pre.size(); i++) { MathFunction *f = CALCULATOR->getActiveFunction(recent_functions_pre[i]); if(f) recent_functions.push_back(f); } if(favourite_units_pre.empty()) { const char *si_units[] = {"m", "kg_c", "s", "A", "K", "mol", "cd"}; for(size_t i = 0; i < 7; i++) { Unit *u = CALCULATOR->getActiveUnit(si_units[i]); if(!u) u = CALCULATOR->getCompositeUnit(si_units[i]); if(u) favourite_units.push_back(u); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isHidden()) favourite_units.push_back(CALCULATOR->units[i]); } } else { for(size_t i = 0; i < favourite_units_pre.size(); i++) { Unit *u = CALCULATOR->getActiveUnit(favourite_units_pre[i]); if(!u) u = CALCULATOR->getCompositeUnit(favourite_units_pre[i]); if(u) favourite_units.push_back(u); } } for(size_t i = 0; i < recent_units_pre.size(); i++) { Unit *u = CALCULATOR->getActiveUnit(recent_units_pre[i]); if(!u) u = CALCULATOR->getCompositeUnit(recent_units_pre[i]); if(u) recent_units.push_back(u); } if(favourite_variables_pre.empty()) { favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_PI)); favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_E)); favourite_variables.push_back(CALCULATOR->getVariableById(VARIABLE_ID_EULER)); Variable *v = CALCULATOR->getActiveVariable("golden"); if(v) favourite_variables.push_back(v); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isHidden()) favourite_variables.push_back(CALCULATOR->variables[i]); } } else { for(size_t i = 0; i < favourite_variables_pre.size(); i++) { Variable *v = CALCULATOR->getActiveVariable(favourite_variables_pre[i]); if(v) favourite_variables.push_back(v); } } for(size_t i = 0; i < recent_variables_pre.size(); i++) { Variable *v = CALCULATOR->getActiveVariable(recent_variables_pre[i]); if(v) recent_variables.push_back(v); } } #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) void QalculateQtSettings::updatePalette(bool force_update) { if(!force_update && palette != 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark && (style.isEmpty() || !QStyleFactory::keys().contains(style) || style.compare("Fusion", Qt::CaseInsensitive) == 0)) return; QPalette p; if(palette == 1 && QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark) { #else void QalculateQtSettings::updatePalette(bool) { QPalette p; if(palette == 1) { #endif p.setColor(QPalette::Active, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Active, QPalette::WindowText, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Active, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Active, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Active, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Active, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Active, QPalette::Text, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::Button, QColor(49, 54, 59)); p.setColor(QPalette::Active, QPalette::ButtonText, QColor(252, 252, 252)); p.setColor(QPalette::Active, QPalette::BrightText, QColor(39, 174, 96)); p.setColor(QPalette::Inactive, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Inactive, QPalette::WindowText, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Inactive, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Inactive, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Inactive, QPalette::Text, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::Button, QColor(49, 54, 59)); p.setColor(QPalette::Inactive, QPalette::ButtonText, QColor(252, 252, 252)); p.setColor(QPalette::Inactive, QPalette::BrightText, QColor(39, 174, 96)); p.setColor(QPalette::Disabled, QPalette::Window, QColor(42, 46, 50)); p.setColor(QPalette::Disabled, QPalette::WindowText, QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::Base, QColor(27, 30, 32)); p.setColor(QPalette::Disabled, QPalette::AlternateBase, QColor(35, 38, 41)); p.setColor(QPalette::Disabled, QPalette::ToolTipBase, QColor(49, 54, 59)); p.setColor(QPalette::Disabled, QPalette::ToolTipText, QColor(252, 252, 252)); #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) p.setColor(QPalette::Disabled, QPalette::PlaceholderText, QColor(161, 169, 177)); #endif p.setColor(QPalette::Disabled, QPalette::Text, QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::Button, QColor(47, 52, 56)); p.setColor(QPalette::Disabled, QPalette::ButtonText,QColor(101, 101, 101)); p.setColor(QPalette::Disabled, QPalette::BrightText, QColor(39, 174, 96)); } else { #ifdef _WIN32 QStyle *s = NULL; #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) if(QGuiApplication::styleHints()->colorScheme() != Qt::ColorScheme::Dark || style.isEmpty() || !QStyleFactory::keys().contains(style) || style.compare("windowsvista", Qt::CaseInsensitive) != 0) s = QStyleFactory::create("fusion"); #else s = QStyleFactory::create("fusion"); #endif if(!s) s = QApplication::style(); p = s->standardPalette(); #else p = QApplication::style()->standardPalette(); #endif } QApplication::setPalette(p); } void QalculateQtSettings::updateStyle() { if(!style.isEmpty() && QStyleFactory::keys().contains(style)) { QStyle *s = QStyleFactory::create(style); if(s) QApplication::setStyle(s); } #ifdef _WIN32 else { QStyle *s = QStyleFactory::create("fusion"); if(s) QApplication::setStyle(s); } #endif updatePalette(); } int QalculateQtSettings::savePreferences(bool save_mode) { std::string homedir = getLocalDir(); recursiveMakeDir(homedir); std::string filename = buildPath(homedir, "qalculate-qt.cfg"); while(!savePreferences(filename.c_str(), false, save_mode)) { int answer = QMessageBox::critical(NULL, QApplication::tr("Error"), QApplication::tr("Couldn't write preferences to\n%1").arg(QString::fromStdString(filename)), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) return 0; else if(answer == QMessageBox::Cancel) return -1; } return 1; } bool QalculateQtSettings::savePreferences(const char *filename, bool is_workspace, bool) { std::string shistory, smode, sgeneral; bool read_default = !is_workspace && !current_workspace.empty(); if(read_default && fileExists(filename)) { FILE *file = fopen(filename, "r"); if(!file) return false; char line[1000000L]; std::string stmp, svalue, svar; size_t i; bool b_mode = false, b_history = false; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if(!stmp.empty()) { if(stmp[0] == '[') { b_mode = false; b_history = false; } else if(b_mode) { smode += stmp; smode += "\n"; } else if(b_history) { shistory += stmp; shistory += "\n"; } if(!b_mode && !b_history) { if(stmp == "[Mode]") { b_mode = true; } else if(!clear_history_on_exit && stmp == "[History]") { b_history = true; } else if((i = stmp.find_first_of("=")) != std::string::npos) { if(stmp.substr(0, i) == "keypad_type" || stmp.substr(0, i) == "show_custom_keypad_column" || stmp.substr(0, i) == "hide_numpad" || stmp.substr(0, i) == "show_keypad" || stmp.substr(0, i) == "show_bases") { sgeneral += stmp; sgeneral += "\n"; } } } } } fclose(file); } FILE *file = fopen(filename, "w+"); if(!file) return false; if(is_workspace) fputs("QALCULATE WORKSPACE FILE\n", file); fprintf(file, "\n[General]\n"); fprintf(file, "version=%s\n", qApp->applicationVersion().toUtf8().data()); if(!is_workspace) { fprintf(file, "allow_multiple_instances=%i\n", allow_multiple_instances); if(!custom_lang.isEmpty()) fprintf(file, "language=%s\n", custom_lang.toUtf8().data()); if(!default_currency.empty()) fprintf(file, "default_currency=%s\n", default_currency.c_str()); fprintf(file, "ignore_locale=%i\n", ignore_locale); fprintf(file, "check_version=%i\n", check_version); if(check_version) { fprintf(file, "last_version_check=%s\n", last_version_check_date.toISOString().c_str()); if(!last_found_version.empty()) fprintf(file, "last_found_version=%s\n", last_found_version.c_str()); } if(!window_state.isEmpty()) fprintf(file, "window_state=%s\n", window_state.toBase64().data()); if(!window_geometry.isEmpty()) fprintf(file, "window_geometry=%s\n", window_geometry.toBase64().data()); fprintf(file, "preserve_history_height=%i\n", preserve_history_height); if(keypad_appended) fprintf(file, "keypad_appended=%i\n", keypad_appended); if(bases_appended) fprintf(file, "bases_appended=%i\n", bases_appended); if(rpn_shown) fprintf(file, "rpn_shown=%i\n", rpn_shown); fprintf(file, "splitter_state=%s\n", splitter_state.toBase64().data()); if(!functions_geometry.isEmpty()) fprintf(file, "functions_geometry=%s\n", functions_geometry.toBase64().data()); if(!functions_vsplitter_state.isEmpty()) fprintf(file, "functions_vsplitter_state=%s\n", functions_vsplitter_state.toBase64().data()); if(!functions_hsplitter_state.isEmpty()) fprintf(file, "functions_hsplitter_state=%s\n", functions_hsplitter_state.toBase64().data()); fprintf(file, "keep_function_dialog_open=%i\n", keep_function_dialog_open); if(!units_geometry.isEmpty()) fprintf(file, "units_geometry=%s\n", units_geometry.toBase64().data()); if(!units_vsplitter_state.isEmpty()) fprintf(file, "units_vsplitter_state=%s\n", units_vsplitter_state.toBase64().data()); if(!units_hsplitter_state.isEmpty()) fprintf(file, "units_hsplitter_state=%s\n", units_hsplitter_state.toBase64().data()); if(!variables_geometry.isEmpty()) fprintf(file, "variables_geometry=%s\n", variables_geometry.toBase64().data()); if(!variables_vsplitter_state.isEmpty()) fprintf(file, "variables_vsplitter_state=%s\n", variables_vsplitter_state.toBase64().data()); if(!variables_hsplitter_state.isEmpty()) fprintf(file, "variables_hsplitter_state=%s\n", variables_hsplitter_state.toBase64().data()); if(!datasets_geometry.isEmpty()) fprintf(file, "datasets_geometry=%s\n", datasets_geometry.toBase64().data()); if(!datasets_vsplitter_state.isEmpty()) fprintf(file, "datasets_vsplitter_state=%s\n", datasets_vsplitter_state.toBase64().data()); if(!datasets_hsplitter_state.isEmpty()) fprintf(file, "datasets_hsplitter_state=%s\n", datasets_hsplitter_state.toBase64().data()); fprintf(file, "always_on_top=%i\n", always_on_top); if(title_type != TITLE_APP) fprintf(file, "window_title_mode=%i\n", title_type); fprintf(file, "save_mode_on_exit=%i\n", save_mode_on_exit); fprintf(file, "save_definitions_on_exit=%i\n", save_defs_on_exit); fprintf(file, "clear_history_on_exit=%i\n", clear_history_on_exit); if(max_history_lines != 300) fprintf(file, "max_history_lines=%i\n", max_history_lines); fprintf(file, "enable_input_method=%i\n", enable_input_method); fprintf(file, "enable_tooltips=%i\n", enable_tooltips); fprintf(file, "display_expression_status=%i\n", display_expression_status); fprintf(file, "expression_status_delay=%i\n", expression_status_delay); fprintf(file, "enable_completion=%i\n", enable_completion); fprintf(file, "enable_completion2=%i\n", enable_completion2); fprintf(file, "completion_min=%i\n", completion_min); fprintf(file, "completion_min2=%i\n", completion_min2); fprintf(file, "completion_delay=%i\n", completion_delay); if(!style.isEmpty()) fprintf(file, "style_name=%s\n", style.toUtf8().data()); if(toolbar_style != Qt::ToolButtonIconOnly) fprintf(file, "toolbar_style=%i\n", toolbar_style); fprintf(file, "separate_keypad_menu_buttons=%i\n", separate_keypad_menu_buttons); if(show_percent_in_numpad) fprintf(file, "show_percent_in_numpad=%i\n", show_percent_in_numpad); fprintf(file, "palette=%i\n", palette); fprintf(file, "color=%i\n", colorize_result); if(disable_cursor_blinking) fprintf(file, "disable_cursor_blinking=%i\n", disable_cursor_blinking); if(!format_result) fprintf(file, "format=%i\n", format_result); fprintf(file, "use_custom_result_font=%i\n", use_custom_result_font); fprintf(file, "use_custom_expression_font=%i\n", use_custom_expression_font); fprintf(file, "use_custom_status_font=%i\n", use_custom_status_font); fprintf(file, "use_custom_keypad_font=%i\n", use_custom_keypad_font); fprintf(file, "use_custom_application_font=%i\n", use_custom_app_font); if(use_custom_result_font || save_custom_result_font) fprintf(file, "custom_result_font=%s\n", custom_result_font.c_str()); if(use_custom_expression_font || save_custom_expression_font) fprintf(file, "custom_expression_font=%s\n", custom_expression_font.c_str()); if(use_custom_status_font || save_custom_status_font) fprintf(file, "custom_status_font=%s\n", custom_status_font.c_str()); if(use_custom_keypad_font || save_custom_keypad_font) fprintf(file, "custom_keypad_font=%s\n", custom_keypad_font.c_str()); if(use_custom_app_font || save_custom_app_font) fprintf(file, "custom_application_font=%s\n", custom_app_font.c_str()); if(printops.multiplication_sign != MULTIPLICATION_SIGN_X) fprintf(file, "multiplication_sign=%i\n", printops.multiplication_sign); if(printops.division_sign != DIVISION_SIGN_DIVISION_SLASH) fprintf(file, "division_sign=%i\n", printops.division_sign); if(implicit_question_asked) fprintf(file, "implicit_question_asked=%i\n", implicit_question_asked); if(assumptions_warning_shown) fprintf(file, "assumptions_warning_shown=%i\n", assumptions_warning_shown); fprintf(file, "replace_expression=%i\n", replace_expression); fprintf(file, "autocopy_result=%i\n", autocopy_result); fprintf(file, "history_expression_type=%i\n", history_expression_type); } if(read_default) { fputs(sgeneral.c_str(), file); } else { fprintf(file, "keypad_type=%i\n", keypad_type); if(show_keypad >= 0) fprintf(file, "show_keypad=%i\n", show_keypad); if(programming_base_changed) fprintf(file, "programming_base_changed=%i\n", programming_base_changed); fprintf(file, "hide_numpad=%i\n", hide_numpad); fprintf(file, "show_custom_keypad_column=%i\n", show_custom_keypad_column); fprintf(file, "show_bases=%i\n", show_bases); } if(!is_workspace) { fprintf(file, "rpn_keys=%i\n", rpn_keys); if(expression_pos >= 0) fprintf(file, "expression_pos=%i\n", expression_pos); if(show_statusbar) fprintf(file, "show_statusbar=%i\n", show_statusbar); fprintf(file, "show_all_functions=%i\n", show_all_functions); fprintf(file, "show_all_units=%i\n", show_all_units); fprintf(file, "show_all_variables=%i\n", show_all_variables); fprintf(file, "use_function_dialog=%i\n", use_function_dialog); if(!current_workspace.empty()) fprintf(file, "last_workspace=%s\n", current_workspace.c_str()); if(save_workspace >= 0) fprintf(file, "save_workspace=%i\n", save_workspace); for(size_t i = 0; i < recent_workspaces.size(); i++) { fprintf(file, "recent_workspace=%s\n", recent_workspaces[i].c_str()); } if(!custom_buttons.empty()) { fprintf(file, "custom_button_columns=%i\n", custom_button_columns); fprintf(file, "custom_button_rows=%i\n", custom_button_rows); for(unsigned int i = 0; i < custom_buttons.size(); i++) { if(!custom_buttons[i].label.isEmpty()) fprintf(file, "custom_button_label=%i %i %s\n", custom_buttons[i].r, custom_buttons[i].c, custom_buttons[i].label.toUtf8().data()); for(unsigned int bi = 0; bi <= 2; bi++) { if(custom_buttons[i].type[bi] != -1) { if(custom_buttons[i].value[bi].empty()) fprintf(file, "custom_button=%i %i %u %i\n", custom_buttons[i].c, custom_buttons[i].r, bi, custom_buttons[i].type[bi]); else fprintf(file, "custom_button=%i %i %u %i %s\n", custom_buttons[i].c, custom_buttons[i].r, bi, custom_buttons[i].type[bi], custom_buttons[i].value[bi].c_str()); } } } } if(!default_shortcuts) { for(size_t i = 0; i < keyboard_shortcuts.size(); i++) { for(size_t i2 = 0; i2 < keyboard_shortcuts[i]->type.size(); i2++) { if(keyboard_shortcuts[i]->value[i2].empty()) fprintf(file, "keyboard_shortcut=%s %i\n", keyboard_shortcuts[i]->key.toUtf8().data(), keyboard_shortcuts[i]->type[i2]); else fprintf(file, "keyboard_shortcut=%s %i %s\n", keyboard_shortcuts[i]->key.toUtf8().data(), keyboard_shortcuts[i]->type[i2], keyboard_shortcuts[i]->value[i2].c_str()); } } } if(favourite_functions_changed) { for(size_t i = 0; i < favourite_functions.size(); i++) { if(CALCULATOR->stillHasFunction(favourite_functions[i]) && favourite_functions[i]->isActive() && favourite_functions[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_function=%s\n", favourite_functions[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_functions.size(); i++) { if(CALCULATOR->stillHasFunction(recent_functions[i]) && recent_functions[i]->isActive() && recent_functions[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_function=%s\n", recent_functions[i]->referenceName().c_str()); } } if(favourite_units_changed) { for(size_t i = 0; i < favourite_units.size(); i++) { if(CALCULATOR->stillHasUnit(favourite_units[i]) && favourite_units[i]->isActive() && favourite_units[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_unit=%s\n", favourite_units[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_units.size(); i++) { if(CALCULATOR->stillHasUnit(recent_units[i]) && recent_units[i]->isActive() && recent_units[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_unit=%s\n", recent_units[i]->referenceName().c_str()); } } if(!latest_button_unit.empty()) fprintf(file, "latest_button_unit=%s\n", latest_button_unit.c_str()); if(favourite_variables_changed) { for(size_t i = 0; i < favourite_variables.size(); i++) { if(CALCULATOR->stillHasVariable(favourite_variables[i]) && favourite_variables[i]->isActive() && favourite_variables[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "favourite_variable=%s\n", favourite_variables[i]->referenceName().c_str()); } } } for(size_t i = 0; i < recent_variables.size(); i++) { if(CALCULATOR->stillHasVariable(recent_variables[i]) && recent_variables[i]->isActive() && recent_variables[i]->category() != CALCULATOR->temporaryCategory()) { fprintf(file, "recent_variable=%s\n", recent_variables[i]->referenceName().c_str()); } } if(default_bits >= 0) fprintf(file, "bit_width=%i\n", default_bits); if(default_signed >= 0) fprintf(file, "signed_integer=%i\n", default_signed); fprintf(file, "spell_out_logical_operators=%i\n", printops.spell_out_logical_operators); fprintf(file, "caret_as_xor=%i\n", caret_as_xor); fprintf(file, "automatic_digit_grouping=%i\n", automatic_digit_grouping); fprintf(file, "close_with_esc=%i\n", close_with_esc); fprintf(file, "copy_ascii=%i\n", copy_ascii); fprintf(file, "copy_ascii_without_units=%i\n", copy_ascii_without_units); fprintf(file, "digit_grouping=%i\n", custom_digit_grouping ? DIGIT_GROUPING_LOCALE + 1 : printops.digit_grouping); if(custom_digit_group_changed) fprintf(file, "custom_digit_group_separator=%s\n", custom_digit_group_separator.c_str()); if(custom_digit_group_changed) fprintf(file, "custom_digit_group_format=%s\n", custom_digit_group_format.c_str()); fprintf(file, "decimal_comma=%i\n", decimal_comma); fprintf(file, "dot_as_separator=%i\n", dot_question_asked ? evalops.parse_options.dot_as_separator : -1); fprintf(file, "comma_as_separator=%i\n", evalops.parse_options.comma_as_separator); fprintf(file, "twos_complement=%i\n", printops.twos_complement); fprintf(file, "hexadecimal_twos_complement=%i\n", printops.hexadecimal_twos_complement); fprintf(file, "twos_complement_input=%i\n", evalops.parse_options.twos_complement); fprintf(file, "hexadecimal_twos_complement_input=%i\n", evalops.parse_options.hexadecimal_twos_complement); fprintf(file, "use_unicode_signs=%i\n", printops.use_unicode_signs); fprintf(file, "lower_case_numbers=%i\n", printops.lower_case_numbers); fprintf(file, "duodecimal_symbols=%i\n", printops.duodecimal_symbols); fprintf(file, "exp_display=%i\n", printops.exp_display); fprintf(file, "imaginary_j=%i\n", CALCULATOR->getVariableById(VARIABLE_ID_I)->hasName("j") > 0); fprintf(file, "base_display=%i\n", printops.base_display); if(printops.binary_bits != 0) fprintf(file, "binary_bits=%i\n", printops.binary_bits); if(tc_set) fprintf(file, "temperature_calculation=%i\n", CALCULATOR->getTemperatureCalculationMode()); if(sinc_set) fprintf(file, "sinc_function=%i\n", CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->getDefaultValue(2) == "pi" ? 1 : 0); fprintf(file, "auto_update_exchange_rates=%i\n", auto_update_exchange_rates); fprintf(file, "local_currency_conversion=%i\n", evalops.local_currency_conversion); fprintf(file, "use_binary_prefixes=%i\n", CALCULATOR->usesBinaryPrefixes()); fprintf(file, "calculate_as_you_type=%i\n", auto_calculate); fprintf(file, "calculate_as_you_type_delay=%i\n", auto_calculate_delay); fprintf(file, "adaptive_autocalc_delay=%i\n", adaptive_autocalc_delay); if(status_in_statusbar) fprintf(file, "status_in_statusbar=%i\n", status_in_statusbar); else fprintf(file, "status_in_history=%i\n", status_in_history); fprintf(file, "autocalc_selection=%i\n", autocalc_selection); if(previous_precision > 0) fprintf(file, "previous_precision=%i\n", previous_precision); } if(read_default) { fprintf(file, "\n[Mode]\n"); fputs(smode.c_str(), file); } else { fprintf(file, "\n[Mode]\n"); fprintf(file, "min_deci=%i\n", printops.min_decimals); fprintf(file, "use_min_deci=%i\n", printops.use_min_decimals); fprintf(file, "max_deci=%i\n", printops.max_decimals); fprintf(file, "use_max_deci=%i\n", printops.use_max_decimals); fprintf(file, "precision=%i\n", CALCULATOR->getPrecision()); fprintf(file, "interval_display=%i\n", adaptive_interval_display ? 0 : printops.interval_display + 1); fprintf(file, "min_exp=%i\n", printops.min_exp); fprintf(file, "negative_exponents=%i\n", printops.negative_exponents); fprintf(file, "sort_minus_last=%i\n", printops.sort_options.minus_last); int v = printops.number_fraction_format; if(dual_fraction < 0) v = -1; else if(dual_fraction > 0) v = FRACTION_COMBINED + 2; else if(!printops.restrict_fraction_length && printops.number_fraction_format == FRACTION_FRACTIONAL) v = FRACTION_COMBINED + 1; else if(printops.number_fraction_format >= FRACTION_FRACTIONAL_FIXED_DENOMINATOR) v += 2; fprintf(file, "number_fraction_format=%i\n", v); if(v == FRACTION_COMBINED_FIXED_DENOMINATOR + 2 || v == FRACTION_FRACTIONAL_FIXED_DENOMINATOR + 2) fprintf(file, "number_fraction_denominator=%li\n", CALCULATOR->fixedDenominator()); fprintf(file, "complex_number_form=%i\n", (complex_angle_form && evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) ? evalops.complex_number_form + 1 : evalops.complex_number_form); fprintf(file, "use_prefixes=%i\n", printops.use_unit_prefixes); fprintf(file, "use_prefixes_for_all_units=%i\n", printops.use_prefixes_for_all_units); fprintf(file, "use_prefixes_for_currencies=%i\n", printops.use_prefixes_for_currencies); fprintf(file, "use_binary_prefixes=%i\n", CALCULATOR->usesBinaryPrefixes()); fprintf(file, "prefixes_default=%i\n", prefixes_default); fprintf(file, "abbreviate_names=%i\n", printops.abbreviate_names); fprintf(file, "all_prefixes_enabled=%i\n", printops.use_all_prefixes); fprintf(file, "denominator_prefix_enabled=%i\n", printops.use_denominator_prefix); fprintf(file, "place_units_separately=%i\n", printops.place_units_separately); fprintf(file, "auto_post_conversion=%i\n", evalops.auto_post_conversion); fprintf(file, "mixed_units_conversion=%i\n", evalops.mixed_units_conversion); fprintf(file, "number_base=%i\n", printops.base); if(!CALCULATOR->customOutputBase().isZero()) fprintf(file, "custom_number_base=%s\n", CALCULATOR->customOutputBase().print(CALCULATOR->save_printoptions).c_str()); fprintf(file, "number_base_expression=%i\n", evalops.parse_options.base); if(!CALCULATOR->customInputBase().isZero()) fprintf(file, "custom_number_base_expression=%s\n", CALCULATOR->customInputBase().print(CALCULATOR->save_printoptions).c_str()); fprintf(file, "read_precision=%i\n", evalops.parse_options.read_precision); fprintf(file, "assume_denominators_nonzero=%i\n", evalops.assume_denominators_nonzero); fprintf(file, "warn_about_denominators_assumed_nonzero=%i\n", evalops.warn_about_denominators_assumed_nonzero); fprintf(file, "structuring=%i\n", evalops.structuring); fprintf(file, "angle_unit=%i\n", evalops.parse_options.angle_unit); if(evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && CALCULATOR->customAngleUnit()) fprintf(file, "custom_angle_unit=%s\n", CALCULATOR->customAngleUnit()->referenceName().c_str()); fprintf(file, "functions_enabled=%i\n", evalops.parse_options.functions_enabled); fprintf(file, "variables_enabled=%i\n", evalops.parse_options.variables_enabled); fprintf(file, "calculate_functions=%i\n", evalops.calculate_functions); fprintf(file, "calculate_variables=%i\n", evalops.calculate_variables); fprintf(file, "variable_units_enabled=%i\n", CALCULATOR->variableUnitsEnabled()); fprintf(file, "sync_units=%i\n", evalops.sync_units); fprintf(file, "unknownvariables_enabled=%i\n", evalops.parse_options.unknowns_enabled); fprintf(file, "units_enabled=%i\n", evalops.parse_options.units_enabled); fprintf(file, "allow_complex=%i\n", evalops.allow_complex); fprintf(file, "allow_infinite=%i\n", evalops.allow_infinite); fprintf(file, "indicate_infinite_series=%i\n", printops.indicate_infinite_series); fprintf(file, "show_ending_zeroes=%i\n", printops.show_ending_zeroes); fprintf(file, "rounding_mode=%i\n", printops.rounding); if(dual_approximation < 0) fprintf(file, "approximation=%i\n", -1); else if(dual_approximation > 0) fprintf(file, "approximation=%i\n", APPROXIMATION_APPROXIMATE + 1); else fprintf(file, "approximation=%i\n", evalops.approximation); fprintf(file, "concise_uncertainty_input=%i\n", CALCULATOR->conciseUncertaintyInputEnabled()); fprintf(file, "interval_calculation=%i\n", evalops.interval_calculation); fprintf(file, "rpn_mode=%i\n", rpn_mode); fprintf(file, "chain_mode=%i\n", chain_mode); fprintf(file, "limit_implicit_multiplication=%i\n", evalops.parse_options.limit_implicit_multiplication); fprintf(file, "parsing_mode=%i\n", evalops.parse_options.parsing_mode); fprintf(file, "simplified_percentage=%i\n", simplified_percentage); fprintf(file, "spacious=%i\n", printops.spacious); fprintf(file, "excessive_parenthesis=%i\n", printops.excessive_parenthesis); fprintf(file, "default_assumption_type=%i\n", CALCULATOR->defaultAssumptions()->type()); if(CALCULATOR->defaultAssumptions()->type() != ASSUMPTION_TYPE_BOOLEAN) fprintf(file, "default_assumption_sign=%i\n", CALCULATOR->defaultAssumptions()->sign()); } if(!is_workspace) { fprintf(file, "\n[Plotting]\n"); fprintf(file, "plot_legend_placement=%i\n", default_plot_legend_placement); fprintf(file, "plot_style=%i\n", default_plot_style); fprintf(file, "plot_smoothing=%i\n", default_plot_smoothing); fprintf(file, "plot_display_grid=%i\n", default_plot_display_grid); fprintf(file, "plot_full_border=%i\n", default_plot_full_border); fprintf(file, "plot_min=%s\n", default_plot_min.c_str()); fprintf(file, "plot_max=%s\n", default_plot_max.c_str()); fprintf(file, "plot_step=%s\n", default_plot_step.c_str()); fprintf(file, "plot_sampling_rate=%i\n", default_plot_sampling_rate); fprintf(file, "plot_use_sampling_rate=%i\n", default_plot_use_sampling_rate); if(default_plot_complex >= 0) fprintf(file, "plot_complex=%i\n", default_plot_complex); fprintf(file, "plot_variable=%s\n", default_plot_variable.c_str()); fprintf(file, "plot_rows=%i\n", default_plot_rows); fprintf(file, "plot_type=%i\n", default_plot_type); fprintf(file, "plot_color=%i\n", default_plot_color); fprintf(file, "plot_linewidth=%i\n", default_plot_linewidth); if(max_plot_time != 5) fprintf(file, "max_plot_time=%i\n", max_plot_time); } if(read_default) { fprintf(file, "\n[History]\n"); fputs(shistory.c_str(), file); } else if(!clear_history_on_exit || is_workspace) { fprintf(file, "\n[History]\n"); if(!v_expression.empty()) { long int n = 0; size_t i = v_expression.size() - 1; while(true) { n++; for(size_t i2 = 0; i2 < v_result[i].size(); i2++) { if(v_result[i][i2].length() > 300 && unformatted_length(v_result[i][i2]) <= 5000) { n += v_result[i][i2].length() / 300; } n++; } if(n >= max_history_lines || i == 0) break; i--; } size_t i_first = i; long long int history_time_prev = 0; for(i = 0; i < v_expression.size(); i++) { if(i >= i_first || v_protected[i]) { if(v_time[i] != history_time_prev) { history_time_prev = v_time[i]; fprintf(file, "history_time=%lli\n", (long long int) history_time_prev); } if(v_expression[i].empty()) { if(v_protected[i]) fprintf(file, "history_expression*=%s\n", v_parse[i].c_str()); else fprintf(file, "history_expression=%s\n", v_parse[i].c_str()); } else { if(v_protected[i]) fprintf(file, "history_expression*=%s\n", v_expression[i].c_str()); else fprintf(file, "history_expression=%s\n", v_expression[i].c_str()); if(!v_parse[i].empty()) { if(v_pexact[i]) fprintf(file, "history_parse=%s\n", v_parse[i].c_str()); else fprintf(file, "history_parse_approximate=%s\n", v_parse[i].c_str()); } } n++; for(size_t i2 = 0; i2 < v_result[i].size(); i2++) { if(v_exact[i][i2]) fprintf(file, "history_result"); else fprintf(file, "history_result_approximate"); if(unformatted_length(v_result[i][i2]) > 5000 && !v_protected[i]) { std::string str = unhtmlize(v_result[i][i2]); int index = 50; size_t i3 = str.find("\n", 40); if(i3 != std::string::npos && i3 < (size_t) index + 1) { fprintf(file, "=%s
…\n", str.substr(0, i3).c_str()); } else { if(i3 != std::string::npos) gsub("\n", "
", str); while(index >= 0 && (signed char) str[index] < 0 && (unsigned char) str[index + 1] < 0xC0) index--; if(is_not_in(NUMBERS, str[index]) || is_not_in(NUMBERS, str[index + 1])) { str[index + 1] = ' '; index++; } fprintf(file, "=%s…\n", str.substr(0, index + 1).c_str()); } } else { fprintf(file, "=%s\n", v_result[i][i2].c_str()); } } } } } for(size_t i = 0; i < expression_history.size(); i++) { gsub("\n", " ", expression_history[i]); fprintf(file, "expression_history=%s\n", expression_history[i].c_str()); } } if(is_workspace) { fprintf(file, "\n[Definitions]\n"); fputs(CALCULATOR->saveTemporaryDefinitions().c_str(), file); } fclose(file); return true; } const char *QalculateQtSettings::multiplicationSign(bool units) { if(!printops.use_unicode_signs) return "*"; switch(printops.multiplication_sign) { case MULTIPLICATION_SIGN_X: {if(units) {return SIGN_MIDDLEDOT;} return SIGN_MULTIPLICATION;} case MULTIPLICATION_SIGN_DOT: {return SIGN_MULTIDOT;} case MULTIPLICATION_SIGN_ALTDOT: {return SIGN_MIDDLEDOT;} default: {return "*";} } } const char *QalculateQtSettings::divisionSign(bool output) { if(printops.division_sign == DIVISION_SIGN_DIVISION && printops.use_unicode_signs) return SIGN_DIVISION; else if(output && printops.division_sign == DIVISION_SIGN_DIVISION_SLASH && printops.use_unicode_signs) return SIGN_DIVISION_SLASH; return "/"; } std::string QalculateQtSettings::replaceResultSeparators(std::string str) { if(printops.digit_grouping == DIGIT_GROUPING_LOCALE && !evalops.parse_options.comma_as_separator && CALCULATOR->local_digit_group_separator == COMMA && printops.comma() == ";" && printops.decimalpoint() == ".") { gsub(COMMA, "", str); } else if(printops.digit_grouping == DIGIT_GROUPING_LOCALE && !evalops.parse_options.dot_as_separator && CALCULATOR->local_digit_group_separator == DOT && printops.decimalpoint() != DOT) { gsub(DOT, "", str); } return str; } std::string QalculateQtSettings::localizeExpression(std::string str, bool unit_expression) { ParseOptions pa = evalops.parse_options; pa.base = 10; str = CALCULATOR->localizeExpression(str, pa); gsub("*", multiplicationSign(unit_expression), str); gsub("/", divisionSign(false), str); gsub("-", SIGN_MINUS, str); return str; } std::string QalculateQtSettings::unlocalizeExpression(std::string str) { ParseOptions pa = evalops.parse_options; pa.base = 10; str = CALCULATOR->unlocalizeExpression(str, pa); CALCULATOR->parseSigns(str); return str; } void QalculateQtSettings::updateMessagePrintOptions() { PrintOptions message_printoptions = printops; message_printoptions.is_approximate = NULL; message_printoptions.interval_display = INTERVAL_DISPLAY_PLUSMINUS; message_printoptions.show_ending_zeroes = false; message_printoptions.base = 10; if(printops.min_exp < -10 || printops.min_exp > 10 || ((printops.min_exp == EXP_PRECISION || printops.min_exp == EXP_NONE) && PRECISION > 10)) message_printoptions.min_exp = 10; else if(printops.min_exp == EXP_NONE) message_printoptions.min_exp = EXP_PRECISION; if(PRECISION > 10) { message_printoptions.use_max_decimals = true; message_printoptions.max_decimals = 10; } CALCULATOR->setMessagePrintOptions(message_printoptions); } MathLineEdit::MathLineEdit(QWidget *parent, bool unit_expression, bool function_expression) : QLineEdit(parent), b_unit(unit_expression), b_function(function_expression) { #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathLineEdit::~MathLineEdit() {} void MathLineEdit::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { switch(event->key()) { case Qt::Key_Asterisk: { insert(settings->multiplicationSign(b_unit)); return; } case Qt::Key_Slash: { insert(settings->divisionSign(false)); return; } case Qt::Key_Minus: { insert(SIGN_MINUS); return; } case Qt::Key_Dead_Circumflex: { insert(settings->caret_as_xor ? " xor " : "^"); return; } case Qt::Key_Dead_Tilde: { insert("~"); return; } case Qt::Key_AsciiCircum: { if(settings->caret_as_xor) { insert(" xor "); return; } break; } } } if(event->key() == Qt::Key_Asterisk && (event->modifiers() == Qt::ControlModifier || event->modifiers() == (Qt::ControlModifier | Qt::KeypadModifier) || event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))) { insert("^"); return; } QLineEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } bool QalculateQtSettings::checkExchangeRates(QWidget *parent) { if(!CALCULATOR->canFetch()) return false; int i = CALCULATOR->exchangeRatesUsed(); if(i == 0) return false; if(auto_update_exchange_rates == 0) return false; if(CALCULATOR->checkExchangeRatesDate(auto_update_exchange_rates > 0 ? auto_update_exchange_rates : 7, false, auto_update_exchange_rates == 0, i)) return false; if(auto_update_exchange_rates == 0) return false; bool b = false; if(auto_update_exchange_rates < 0) { int days = (int) floor(difftime(time(NULL), CALCULATOR->getExchangeRatesTime(i)) / 86400); if(QMessageBox::question(parent, tr("Update exchange rates?"), tr("It has been %n day(s) since the exchange rates last were updated.\n\nDo you wish to update the exchange rates now?", "", days), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { b = true; } } if(b || auto_update_exchange_rates > 0) { if(auto_update_exchange_rates <= 0) i = -1; fetchExchangeRates(b ? 15 : 8, i); CALCULATOR->loadExchangeRates(); return true; } return false; } class FetchExchangeRatesThread : public Thread { protected: void run() { int timeout = 15; int n = -1; if(!read(&timeout)) return; if(!read(&n)) return; CALCULATOR->fetchExchangeRates(timeout, n); } }; void QalculateQtSettings::fetchExchangeRates(int timeout, int n, QWidget *parent) { b_busy++; FetchExchangeRatesThread fetch_thread; if(fetch_thread.start() && fetch_thread.write(timeout) && fetch_thread.write(n)) { if(fetch_thread.running) { QProgressDialog *dialog = new QProgressDialog(tr("Fetching exchange rates…"), QString(), 0, 0, parent); dialog->setWindowTitle(tr("Fetching exchange rates…")); dialog->setWindowModality(Qt::WindowModal); dialog->setMinimumDuration(200); while(fetch_thread.running) { qApp->processEvents(); sleep_ms(10); } dialog->cancel(); dialog->deleteLater(); } } b_busy--; } bool QalculateQtSettings::displayMessages(QWidget *parent) { if(!CALCULATOR->message()) return false; std::string str = ""; int index = 0; MessageType mtype, mtype_highest = MESSAGE_INFORMATION; while(true) { mtype = CALCULATOR->message()->type(); if(CALCULATOR->message()->category() != MESSAGE_CATEGORY_IMPLICIT_MULTIPLICATION || !implicit_question_asked) { if(index > 0) { if(index == 1) str = "• " + str; str += "\n• "; } str += CALCULATOR->message()->message(); if(mtype == MESSAGE_ERROR || (mtype_highest != MESSAGE_ERROR && mtype == MESSAGE_WARNING)) { mtype_highest = mtype; } index++; } if(!CALCULATOR->nextMessage()) break; } if(!str.empty()) { if(mtype_highest == MESSAGE_ERROR) QMessageBox::critical(parent, tr("Error"), QString::fromStdString(str), QMessageBox::Ok); else if(mtype_highest == MESSAGE_WARNING) QMessageBox::warning(parent, tr("Warning"), QString::fromStdString(str), QMessageBox::Ok); else QMessageBox::information(parent, tr("Information"), QString::fromStdString(str), QMessageBox::Ok); } return false; } #ifdef AUTO_UPDATE # include void QalculateQtSettings::autoUpdate(std::string new_version, QWidget *parent) { char selfpath[1000]; ssize_t n = readlink("/proc/self/exe", selfpath, 999); if(n < 0 || n >= 999) { QMessageBox::critical(parent, tr("Error"), tr("Path of executable not found.")); return; } selfpath[n] = '\0'; std::string selfdir = selfpath; size_t i = selfdir.rfind("/"); if(i != string::npos) selfdir.substr(0, i); FILE *pipe = popen("curl --version 1>/dev/null", "w"); if(!pipe) { QMessageBox::critical(parent, tr("Error"), tr("curl not found.")); return; } pclose(pipe); std::string tmpdir = getLocalTmpDir(); recursiveMakeDir(tmpdir); string script = "#!/bin/sh\n\n"; script += "echo \"Updating Qalculate!...\";\n"; script += "sleep 1;\n"; script += "new_version="; script += new_version; script += ";\n"; script += "if cd \""; script += tmpdir; script += "\"; then\n"; script += "\tif curl -L -o qalculate-${new_version}-x86_64.tar.xz https://github.com/Qalculate/qalculate-qt/releases/download/v${new_version}/qalculate-${new_version}-x86_64.tar.xz; then\n"; script += "\t\techo \"Extracting files...\";\n"; script += "\t\tif tar -xJf qalculate-${new_version}-x86_64.tar.xz; then\n"; script += "\t\t\tcd qalculate-${new_version};\n"; script += "\t\t\tif cp -f qalculate-qt \""; script += selfpath; script += "\"; then\n"; script += "\t\t\t\tcp -f qalc \""; script += selfdir; script += "/\";\n"; script += "\t\t\t\tcd ..;\n\t\t\trm -r qalculate-${new_version};\n\t\t\trm qalculate-${new_version}-x86_64.tar.xz;\n"; script += "\t\t\t\texit 0;\n"; script += "\t\t\tfi\n"; script += "\t\t\tcd ..;\n\t\trm -r qalculate-${new_version};\n"; script += "\t\tfi\n"; script += "\t\trm qalculate-${new_version}-x86_64.tar.xz;\n"; script += "\tfi\n"; script += "fi\n"; script += "echo \"Update failed\";\n"; script += "echo \"Press Enter to continue\";\n"; script += "read _;\n"; script += "exit 1\n"; std::ofstream ofs; std::string scriptpath = tmpdir; scriptpath += "/update.sh"; ofs.open(scriptpath.c_str(), std::ofstream::out | std::ofstream::trunc); ofs << script; ofs.close(); chmod(scriptpath.c_str(), S_IRWXU); std::string termcom = "#!/bin/sh\n\n"; termcom += "if [ $(command -v gnome-terminal) ]; then\n"; termcom += "\tif gnome-terminal --wait --version; then\n\t\tdetected_term=\"gnome-terminal --wait -- \";\n"; termcom += "\telse\n\t\tdetected_term=\"gnome-terminal --disable-factory -- \";\n\tfi\n"; termcom += "elif [ $(command -v xfce4-terminal) ]; then\n\tdetected_term=\"xfce4-terminal --disable-server -e \";\n"; termcom += "else\n"; termcom += "\tfor t in x-terminal-emulator konsole alacritty qterminal xterm urxvt rxvt kitty sakura terminology termite tilix; do\n\t\tif [ $(command -v $t) ]; then\n\t\t\tdetected_term=\"$t -e \";\n\t\t\tbreak\n\t\tfi\n\tdone\nfi\n"; termcom += "$detected_term "; termcom += scriptpath; termcom += ";\n"; termcom += "exec "; termcom += selfpath; termcom += "\n"; std::ofstream ofs2; std::string scriptpath2 = tmpdir; scriptpath2 += "/terminal.sh"; ofs2.open(scriptpath2.c_str(), std::ofstream::out | std::ofstream::trunc); ofs2 << termcom; ofs2.close(); chmod(scriptpath2.c_str(), S_IRWXU); if(QProcess::execute(scriptpath2.c_str()) != 0) { QMessageBox::critical(parent, tr("Error"), tr("Failed to run update script.\n%1").arg(error->message)); return; } qApp->closeAllWindows(); } #else void QalculateQtSettings::autoUpdate(std::string, QWidget*) {} #endif void QalculateQtSettings::checkVersion(bool force, QWidget *parent) { if(!force) { if(!check_version) return; QalculateDateTime next_version_check_date(last_version_check_date); next_version_check_date.addDays(14); if(next_version_check_date.isFutureDate()) return; } std::string new_version; #ifdef _WIN32 std::string url; int ret = checkAvailableVersion("windows", qApp->applicationVersion().toUtf8().data(), &new_version, &url, force ? 10 : 5); #else int ret = checkAvailableVersion("qalculate-qt", qApp->applicationVersion().toUtf8().data(), &new_version, force ? 10 : 5); #endif if(force && ret <= 0) { if(ret < 0) QMessageBox::critical(parent, tr("Error"), tr("Failed to check for updates.")); else QMessageBox::information(parent, tr("Information"), tr("No updates found.")); if(ret < 0) return; } if(ret > 0 && (force || new_version != last_found_version)) { last_found_version = new_version; #ifdef AUTO_UPDATE if(QMessageBox::question(parent, tr("Information"), "
" + tr("A new version of %1 is available at %2.\n\nDo you wish to update to version %3?").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) == QMessageBox::Yes) + "
") { autoUpdate(new_version); } #else # ifdef _WIN32 QMessageBox *dialog = new QMessageBox(QMessageBox::Information, tr("Information"), "
" + tr("A new version of %1 is available.\n\nYou can get version %3 at %2.").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) + "
", QMessageBox::Ok, parent); if(always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); QAbstractButton *downloadButton = NULL; if(!url.empty()) dialog->addButton(tr("Download"), QMessageBox::YesRole); dialog->exec(); if(!url.empty() && dialog->clickedButton() == downloadButton) { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); } dialog->deleteLater(); # else QMessageBox::information(parent, tr("Information"), "
" + tr("A new version of %1 is available.\n\nYou can get version %3 at %2.").arg("Qalculate!").arg("qalculate.github.io").arg(QString::fromStdString(new_version)) + "
"); # endif #endif } last_version_check_date.setToCurrentDate(); } QString QalculateQtSettings::shortcutText(const std::vector &type, const std::vector &value) { if(type.size() == 1) return shortcutText(type[0], value[0]); QString str; for(size_t i = 0; i < type.size(); i++) { if(!str.isEmpty()) str += ", "; str += shortcutText(type[i], value[i]); } return str; } QString QalculateQtSettings::shortcutText(int type, const std::string &value) { if(type < 0) return QString(); switch(type) { case SHORTCUT_TYPE_FUNCTION: { MathFunction *f = CALCULATOR->getActiveFunction(value); if(!f) break; return QString::fromStdString(f->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { MathFunction *f = CALCULATOR->getActiveFunction(value); if(!f) break; return QString::fromStdString(f->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_VARIABLE: { Variable *v = CALCULATOR->getActiveVariable(value); if(!v) break; return QString::fromStdString(v->title(true, printops.use_unicode_signs)); } case SHORTCUT_TYPE_UNIT: { Unit *u = CALCULATOR->getActiveUnit(value); if(!u) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", "", "", value); CALCULATOR->endTemporaryStopMessages(); if(cu.countUnits() == 0) break; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->subtype() == SUBTYPE_COMPOSITE_UNIT) { CompositeUnit *cu2 = (CompositeUnit*) CALCULATOR->units[i]; if(cu2->countUnits() == cu.countUnits()) { bool b = true; for(size_t i2 = 1; i2 <= cu.countUnits(); i2++) { int exp1 = 1, exp2 = 1; Prefix *p1 = NULL, *p2 = NULL; if(cu.get(i2, &exp1, &p1) != cu2->get(i2, &exp2, &p2) || exp1 != exp2 || p1 != p2) { b = false; break; } } if(b) return QString::fromStdString(cu2->title(true, printops.use_unicode_signs)); } } } return QString::fromStdString(cu.print(false, true, printops.use_unicode_signs)); } return QString::fromStdString(u->title(true, printops.use_unicode_signs)); } default: {} } if(value.empty() || type == SHORTCUT_TYPE_COPY_RESULT) return shortcutTypeText((shortcut_type) type); return tr("%1: %2").arg(shortcutTypeText((shortcut_type) type)).arg(QString::fromStdString(value)); } QString QalculateQtSettings::shortcutTypeText(shortcut_type type) { switch(type) { case SHORTCUT_TYPE_FUNCTION: {return tr("Insert function");} case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: {return tr("Insert function (dialog)");} case SHORTCUT_TYPE_VARIABLE: {return tr("Insert variable");} case SHORTCUT_TYPE_APPROXIMATE: {return tr("Approximate result");} case SHORTCUT_TYPE_NEGATE: {return tr("Negate");} case SHORTCUT_TYPE_INVERT: {return tr("Invert");} case SHORTCUT_TYPE_UNIT: {return tr("Insert unit");} case SHORTCUT_TYPE_TEXT: {return tr("Insert text");} case SHORTCUT_TYPE_OPERATOR: {return tr("Insert operator");} case SHORTCUT_TYPE_DATE: {return tr("Insert date");} case SHORTCUT_TYPE_MATRIX: {return tr("Insert matrix");} case SHORTCUT_TYPE_SMART_PARENTHESES: {return tr("Insert smart parentheses");} case SHORTCUT_TYPE_CONVERT_TO: {return tr("Convert to unit");} case SHORTCUT_TYPE_CONVERT: {return tr("Convert");} case SHORTCUT_TYPE_OPTIMAL_UNIT: {return tr("Convert to optimal unit");} case SHORTCUT_TYPE_BASE_UNITS: {return tr("Convert to base units");} case SHORTCUT_TYPE_OPTIMAL_PREFIX: {return tr("Convert to optimal prefix");} case SHORTCUT_TYPE_TO_NUMBER_BASE: {return tr("Convert to number base");} case SHORTCUT_TYPE_FACTORIZE: {return tr("Factorize result");} case SHORTCUT_TYPE_EXPAND: {return tr("Expand result");} case SHORTCUT_TYPE_PARTIAL_FRACTIONS: {return tr("Expand partial fractions");} case SHORTCUT_TYPE_RPN_DOWN: {return tr("RPN: down");} case SHORTCUT_TYPE_RPN_UP: {return tr("RPN: up");} case SHORTCUT_TYPE_RPN_SWAP: {return tr("RPN: swap");} case SHORTCUT_TYPE_RPN_COPY: {return tr("RPN: copy");} case SHORTCUT_TYPE_RPN_LASTX: {return tr("RPN: lastx");} case SHORTCUT_TYPE_RPN_DELETE: {return tr("RPN: delete register");} case SHORTCUT_TYPE_RPN_CLEAR: {return tr("RPN: clear stack");} case SHORTCUT_TYPE_INPUT_BASE: {return tr("Set expression base");} case SHORTCUT_TYPE_OUTPUT_BASE: {return tr("Set result base");} case SHORTCUT_TYPE_DEGREES: {return tr("Set angle unit to degrees");} case SHORTCUT_TYPE_RADIANS: {return tr("Set angle unit to radians");} case SHORTCUT_TYPE_GRADIANS: {return tr("Set angle unit to gradians");} case SHORTCUT_TYPE_NORMAL_NOTATION: {return tr("Activate normal display mode");} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {return tr("Activate scientific display mode");} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {return tr("Activate engineering display mode");} case SHORTCUT_TYPE_SIMPLE_NOTATION: {return tr("Activate simple display mode");} case SHORTCUT_TYPE_PRECISION: {return tr("Toggle precision");} case SHORTCUT_TYPE_MAX_DECIMALS: {return tr("Toggle max decimals");} case SHORTCUT_TYPE_MIN_DECIMALS: {return tr("Toggle min decimals");} case SHORTCUT_TYPE_MINMAX_DECIMALS: {return tr("Toggle max/min decimals");} case SHORTCUT_TYPE_RPN_MODE: {return tr("Toggle RPN mode");} case SHORTCUT_TYPE_GENERAL_KEYPAD: {return tr("Show general keypad");} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {return tr("Toggle programming keypad");} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {return tr("Toggle algebra keypad");} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {return tr("Toggle custom keypad");} case SHORTCUT_TYPE_KEYPAD: {return tr("Show/hide keypad");} case SHORTCUT_TYPE_HISTORY_SEARCH: {return tr("Search history");} case SHORTCUT_TYPE_HISTORY_CLEAR: {return tr("Clear history");} case SHORTCUT_TYPE_MANAGE_VARIABLES: {return tr("Show variables");} case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {return tr("Show functions");} case SHORTCUT_TYPE_MANAGE_UNITS: {return tr("Show units");} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {return tr("Show data sets");} case SHORTCUT_TYPE_STORE: {return tr("Store result");} case SHORTCUT_TYPE_MEMORY_CLEAR: {return tr("MC (memory clear)");} case SHORTCUT_TYPE_MEMORY_RECALL: {return tr("MR (memory recall)");} case SHORTCUT_TYPE_MEMORY_STORE: {return tr("MS (memory store)");} case SHORTCUT_TYPE_MEMORY_ADD: {return tr("M+ (memory plus)");} case SHORTCUT_TYPE_MEMORY_SUBTRACT: {return tr("M− (memory minus)");} case SHORTCUT_TYPE_NEW_VARIABLE: {return tr("New variable");} case SHORTCUT_TYPE_NEW_FUNCTION: {return tr("New function");} case SHORTCUT_TYPE_PLOT: {return tr("Open plot functions/data");} case SHORTCUT_TYPE_NUMBER_BASES: {return tr("Open convert number bases");} case SHORTCUT_TYPE_FLOATING_POINT: {return tr("Open floating point conversion");} case SHORTCUT_TYPE_CALENDARS: {return tr("Open calender conversion");} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {return tr("Open percentage calculation tool");} case SHORTCUT_TYPE_PERIODIC_TABLE: {return tr("Open periodic table");} case SHORTCUT_TYPE_UPDATE_EXRATES: {return tr("Update exchange rates");} case SHORTCUT_TYPE_COPY_RESULT: {return tr("Copy result");} case SHORTCUT_TYPE_INSERT_RESULT: {return tr("Insert result");} case SHORTCUT_TYPE_MODE: {return tr("Open mode menu");} case SHORTCUT_TYPE_MENU: {return tr("Open menu");} case SHORTCUT_TYPE_HELP: {return tr("Help");} case SHORTCUT_TYPE_QUIT: {return tr("Quit");} case SHORTCUT_TYPE_CHAIN_MODE: {return tr("Toggle chain mode");} case SHORTCUT_TYPE_ALWAYS_ON_TOP: {return tr("Toggle keep above");} case SHORTCUT_TYPE_COMPLETE: {return tr("Show completion (activate first item)");} case SHORTCUT_TYPE_EXPRESSION_CLEAR: {return tr("Clear expression");} case SHORTCUT_TYPE_EXPRESSION_DELETE: {return tr("Delete");} case SHORTCUT_TYPE_EXPRESSION_BACKSPACE: {return tr("Backspace");} case SHORTCUT_TYPE_EXPRESSION_START: {return tr("Home");} case SHORTCUT_TYPE_EXPRESSION_END: {return tr("End");} case SHORTCUT_TYPE_EXPRESSION_RIGHT: {return tr("Right");} case SHORTCUT_TYPE_EXPRESSION_LEFT: {return tr("Left");} case SHORTCUT_TYPE_EXPRESSION_UP: {return tr("Up");} case SHORTCUT_TYPE_EXPRESSION_DOWN: {return tr("Down");} case SHORTCUT_TYPE_EXPRESSION_UNDO: {return tr("Undo");} case SHORTCUT_TYPE_EXPRESSION_REDO: {return tr("Redo");} case SHORTCUT_TYPE_CALCULATE_EXPRESSION: {return tr("Calculate expression");} case SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT: {return tr("Expression history next");} case SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS: {return tr("Expression history previous");} case SHORTCUT_TYPE_FUNCTIONS_MENU: {return tr("Open functions menu");} case SHORTCUT_TYPE_UNITS_MENU: {return tr("Open units menu");} case SHORTCUT_TYPE_VARIABLES_MENU: {return tr("Open variables menu");} case SHORTCUT_TYPE_TOGGLE_FRACTION: {return tr("Toggle fraction format in current result");} } return "-"; } void QalculateQtSettings::updateActionValueTexts() { if(copy_action_value_texts.isEmpty()) { copy_action_value_texts << tr("Default") << tr("Formatted result") << tr("Unformatted ASCII result") << tr("Unformatted ASCII result without units") << tr("Formatted expression") << tr("Unformatted ASCII expression") << tr("Formatted expression + result") << tr("Unformatted ASCII expression + result"); } } bool QalculateQtSettings::testShortcutValue(int type, QString &value, QWidget *w) { if(type != SHORTCUT_TYPE_TEXT) value = value.trimmed(); switch(type) { case SHORTCUT_TYPE_FUNCTION: {} case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { if(value.length() > 2 && value.right(2) == "()") value.chop(2); if(!CALCULATOR->getActiveFunction(value.toStdString())) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Function not found."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_VARIABLE: { if(!CALCULATOR->getActiveVariable(value.toStdString())) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Variable not found."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_UNIT: { if(!CALCULATOR->getActiveUnit(value.toStdString())) { CALCULATOR->beginTemporaryStopMessages(); CompositeUnit cu("", "", "", value.toStdString()); int n = 0; if(CALCULATOR->endTemporaryStopMessages(NULL, &n) || n) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unit not found."), QMessageBox::Ok); return false; } } break; } case SHORTCUT_TYPE_OPERATOR: { break; } case SHORTCUT_TYPE_TO_NUMBER_BASE: {} case SHORTCUT_TYPE_INPUT_BASE: {} case SHORTCUT_TYPE_OUTPUT_BASE: { Number nbase; int base; base_from_string(value.toStdString(), base, nbase, type == SHORTCUT_TYPE_INPUT_BASE); if(base == BASE_CUSTOM && nbase.isZero()) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported base."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_PRECISION: {} case SHORTCUT_TYPE_MIN_DECIMALS: {} case SHORTCUT_TYPE_MAX_DECIMALS: {} case SHORTCUT_TYPE_MINMAX_DECIMALS: { bool ok = false; int v = value.toInt(&ok, 10); if(!ok || v < -1 || (type == SHORTCUT_TYPE_PRECISION && v < 2)) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported value."), QMessageBox::Ok); return false; } break; } case SHORTCUT_TYPE_COPY_RESULT: { if(value.isEmpty()) break; int v = -1; if(value.length() > 1) { updateActionValueTexts(); v = copy_action_value_texts.indexOf(value); if(v >= 0) value = QString::number(v); } else { bool ok = false; v = value.toInt(&ok, 10); if(!ok) v = -1; } if(v < 0 || v > 7) { QMessageBox::critical(w, QApplication::tr("Error"), QApplication::tr("Unsupported value."), QMessageBox::Ok); value = ""; return false; } break; } } return true; } bool QalculateQtSettings::loadWorkspace(const char *filename) { FILE *file = NULL; std::string stmp, svalue, svar; char line[1000000L]; if(!filename || strlen(filename) == 0) { file = fopen(buildPath(getLocalDir(), "qalculate-qt.cfg").c_str(), "r"); if(!file) return false; } else { file = fopen(filename, "r"); if(!file) return false; if(fgets(line, 1000000L, file) == NULL) return false; stmp = line; if(stmp.find("QALCULATE") == std::string::npos) return false; } size_t i; v_expression.clear(); v_parse.clear(); v_value.clear(); v_protected.clear(); v_time.clear(); current_history_time = 0; v_messages.clear(); v_parseerror.clear(); v_result.clear(); v_exact.clear(); v_pexact.clear(); expression_history.clear(); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && CALCULATOR->variables[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->variables[i]->destroy(); } for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && CALCULATOR->functions[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->functions[i]->destroy(); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && CALCULATOR->units[i]->category() == CALCULATOR->temporaryCategory()) CALCULATOR->units[i]->destroy(); } for(size_t i = 0; i < history_answer.size(); i++) { history_answer[i]->unref(); } history_answer.clear(); current_result = NULL; v_memory->set(m_zero); programming_base_changed = false; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp = line; remove_blank_ends(stmp); if((i = stmp.find_first_of("=")) != std::string::npos) { svar = stmp.substr(0, i); remove_blank_ends(svar); svalue = stmp.substr(i + 1); remove_blank_ends(svalue); readPreferenceValue(svar, svalue, true); } else if(stmp == "[Definitions]") { stmp = ""; while(true) { if(fgets(line, 1000000L, file) == NULL) break; stmp += line; } remove_blank_ends(stmp); CALCULATOR->loadDefinitions(stmp.c_str(), true); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isHidden() && CALCULATOR->variables[i]->isActive() && CALCULATOR->variables[i]->category() == CALCULATOR->temporaryCategory()) favourite_variables.push_back(CALCULATOR->variables[i]); } for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isHidden() && CALCULATOR->functions[i]->isActive() && CALCULATOR->functions[i]->category() == CALCULATOR->temporaryCategory()) favourite_functions.push_back(CALCULATOR->functions[i]); } for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isHidden() && CALCULATOR->units[i]->isActive() && CALCULATOR->units[i]->category() == CALCULATOR->temporaryCategory()) favourite_units.push_back(CALCULATOR->units[i]); } } } while(v_expression.size() > v_parse.size()) { v_parse.push_back(""); v_pexact.push_back(true); } if(!filename || strlen(filename) == 0) { current_workspace = ""; } else { current_workspace = filename; for(size_t i = 0; i < recent_workspaces.size(); i++) { if(recent_workspaces[i] == current_workspace) { recent_workspaces.erase(recent_workspaces.begin() + i); break; } } if(recent_workspaces.size() >= 9) recent_workspaces.erase(recent_workspaces.begin()); recent_workspaces.push_back(filename); } fclose(file); return true; } bool QalculateQtSettings::saveWorkspace(const char *filename) { if(savePreferences(filename, true)) { current_workspace = filename; for(size_t i = 0; i < recent_workspaces.size(); i++) { if(recent_workspaces[i] == current_workspace) { recent_workspaces.erase(recent_workspaces.begin() + i); break; } } if(recent_workspaces.size() >= 9) recent_workspaces.erase(recent_workspaces.begin()); recent_workspaces.push_back(filename); return true; } return false; } QString QalculateQtSettings::workspaceTitle() { if(current_workspace.empty()) return QString(); #ifdef _WIN32 size_t index = current_workspace.rfind('\\'); #else size_t index = current_workspace.rfind('/'); #endif if(index != std::string::npos) return QString::fromStdString(current_workspace.substr(index + 1)); return QString::fromStdString(current_workspace); } qalculate-qt-5.11.0/src/qalculateqtsettings.h000066400000000000000000000352731520501070600212420ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef QALCULATE_Q_SETTINGS_H #define QALCULATE_Q_SETTINGS_H #include #include #include #include class QWidget; class QWindow; class QByteArray; class QAction; class QFont; bool can_display_unicode_string_function(const char *str, void *w); #define EQUALS_IGNORECASE_AND_LOCAL(x,y,z) (equalsIgnoreCase(x, y) || equalsIgnoreCase(x, z.toStdString())) #define EQUALS_IGNORECASE_AND_LOCAL_NR(x,y,z,a) (equalsIgnoreCase(x, y a) || (x.length() == z.length() + strlen(a) && equalsIgnoreCase(x.substr(0, x.length() - strlen(a)), z.toStdString()) && equalsIgnoreCase(x.substr(x.length() - strlen(a)), a))) #define LOAD_APP_ICON(x) QIcon(":/icons/apps/scalable/" x ".svg") #define LOAD_ICON(x) load_icon(x, this) #define LOAD_COLORED_ICON(x) settings->loadColoredIcon(x, this) #define USE_QUOTES(arg, f) (arg && (arg->suggestsQuotes() || arg->type() == ARGUMENT_TYPE_TEXT) && f->id() != FUNCTION_ID_BASE && f->id() != FUNCTION_ID_BIN && f->id() != FUNCTION_ID_OCT && f->id() != FUNCTION_ID_DEC && f->id() != FUNCTION_ID_HEX) QRect get_screen_geometry(QWidget *w); bool try_resize(QWidget *win, int w, int h); std::string to_html_escaped(const std::string str); std::string unhtmlize(std::string str, bool b_ascii = false); QString unhtmlize(QString str, bool b_ascii = false); std::string unformat(std::string str, bool restorable = false); size_t unformatted_length(const std::string &str); std::string uncolorize(std::string str, bool remove_class = true); std::string replace_first_minus(const std::string &str); QIcon load_icon(const QString &str, QWidget*); bool last_is_operator(std::string str, bool allow_exp = false); bool string_is_less(std::string str1, std::string str2); bool item_in_calculator(ExpressionItem *item); bool name_matches(ExpressionItem *item, const std::string &str); bool country_matches(Unit *u, const std::string &str, size_t minlength = 0); bool title_matches(ExpressionItem *item, const std::string &str, size_t minlength = 0); void remove_spaces(std::string &str); bool contains_plot_or_save(const std::string &str); void base_from_string(std::string str, int &base, Number &nbase, bool input_base = false); long int get_fixed_denominator_qt(const std::string &str, int &to_fraction, const QString &localized_fraction, bool qalc_command = false); bool is_equation_solutions(const MathStructure &m); void fix_expression(std::string &str); #ifndef CLOCK_MONOTONIC # define PREPARE_TIMECHECK(ms) \ struct timeval tv_end; \ gettimeofday(&tv_end, NULL); \ tv_end.tv_usec += ((ms) % 1000) * 1000; \ tv_end.tv_sec += ((ms) / 1000); \ if(tv_end.tv_usec >= 1000000L) { \ tv_end.tv_sec++; \ tv_end.tv_usec -= 1000000L; \ } # define DO_TIMECHECK \ struct timeval tv; \ gettimeofday(&tv, NULL); \ if(tv.tv_sec > tv_end.tv_sec || (tv.tv_sec == tv_end.tv_sec && tv.tv_usec >= tv_end.tv_usec)) #else # define PREPARE_TIMECHECK(ms) \ struct timespec tv_end; \ clock_gettime(CLOCK_MONOTONIC, &tv_end); \ tv_end.tv_nsec += ((ms) % 1000) * 1000000L; \ tv_end.tv_sec += ((ms) / 1000); \ if(tv_end.tv_nsec >= 1000000000L) { \ tv_end.tv_sec++; \ tv_end.tv_nsec -= 1000000000L; \ } # define DO_TIMECHECK \ struct timespec tv; \ clock_gettime(CLOCK_MONOTONIC, &tv); \ if(tv.tv_sec > tv_end.tv_sec || (tv.tv_sec == tv_end.tv_sec && tv.tv_nsec >= tv_end.tv_nsec)) #endif enum { TITLE_APP, TITLE_RESULT, TITLE_APP_RESULT, TITLE_WORKSPACE, TITLE_APP_WORKSPACE }; enum { KEEP_EXPRESSION, REPLACE_EXPRESSION_WITH_RESULT, REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER, CLEAR_EXPRESSION }; enum { HISTORY_EXPRESSION_TYPE_PARSED, HISTORY_EXPRESSION_TYPE_ENTERED, HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED, HISTORY_EXPRESSION_TYPE_PARSED_COMPACT, HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT }; typedef enum { SHORTCUT_TYPE_FUNCTION, SHORTCUT_TYPE_FUNCTION_WITH_DIALOG, SHORTCUT_TYPE_VARIABLE, SHORTCUT_TYPE_UNIT, SHORTCUT_TYPE_OPERATOR, SHORTCUT_TYPE_TEXT, SHORTCUT_TYPE_DATE, SHORTCUT_TYPE_MATRIX, SHORTCUT_TYPE_SMART_PARENTHESES, SHORTCUT_TYPE_CONVERT_TO, SHORTCUT_TYPE_CONVERT, SHORTCUT_TYPE_OPTIMAL_UNIT, SHORTCUT_TYPE_BASE_UNITS, SHORTCUT_TYPE_OPTIMAL_PREFIX, SHORTCUT_TYPE_TO_NUMBER_BASE, SHORTCUT_TYPE_FACTORIZE, SHORTCUT_TYPE_EXPAND, SHORTCUT_TYPE_PARTIAL_FRACTIONS, SHORTCUT_TYPE_APPROXIMATE, SHORTCUT_TYPE_NEGATE, SHORTCUT_TYPE_INVERT, SHORTCUT_TYPE_RPN_UP, SHORTCUT_TYPE_RPN_DOWN, SHORTCUT_TYPE_RPN_SWAP, SHORTCUT_TYPE_RPN_COPY, SHORTCUT_TYPE_RPN_LASTX, SHORTCUT_TYPE_RPN_DELETE, SHORTCUT_TYPE_RPN_CLEAR, SHORTCUT_TYPE_OUTPUT_BASE, SHORTCUT_TYPE_INPUT_BASE, SHORTCUT_TYPE_DEGREES, SHORTCUT_TYPE_RADIANS, SHORTCUT_TYPE_GRADIANS, SHORTCUT_TYPE_NORMAL_NOTATION, SHORTCUT_TYPE_SCIENTIFIC_NOTATION, SHORTCUT_TYPE_ENGINEERING_NOTATION, SHORTCUT_TYPE_SIMPLE_NOTATION, SHORTCUT_TYPE_COPY_RESULT, SHORTCUT_TYPE_INSERT_RESULT, SHORTCUT_TYPE_RPN_MODE, SHORTCUT_TYPE_CHAIN_MODE, SHORTCUT_TYPE_GENERAL_KEYPAD, SHORTCUT_TYPE_PROGRAMMING_KEYPAD, SHORTCUT_TYPE_ALGEBRA_KEYPAD, SHORTCUT_TYPE_CUSTOM_KEYPAD, SHORTCUT_TYPE_KEYPAD, SHORTCUT_TYPE_HISTORY_SEARCH, SHORTCUT_TYPE_ALWAYS_ON_TOP, SHORTCUT_TYPE_COMPLETE, SHORTCUT_TYPE_STORE, SHORTCUT_TYPE_NEW_VARIABLE, SHORTCUT_TYPE_NEW_FUNCTION, SHORTCUT_TYPE_MANAGE_VARIABLES, SHORTCUT_TYPE_MANAGE_FUNCTIONS, SHORTCUT_TYPE_MANAGE_UNITS, SHORTCUT_TYPE_MANAGE_DATA_SETS, SHORTCUT_TYPE_MEMORY_CLEAR, SHORTCUT_TYPE_MEMORY_RECALL, SHORTCUT_TYPE_MEMORY_STORE, SHORTCUT_TYPE_MEMORY_ADD, SHORTCUT_TYPE_MEMORY_SUBTRACT, SHORTCUT_TYPE_EXPRESSION_CLEAR, SHORTCUT_TYPE_EXPRESSION_DELETE, SHORTCUT_TYPE_EXPRESSION_BACKSPACE, SHORTCUT_TYPE_EXPRESSION_START, SHORTCUT_TYPE_EXPRESSION_END, SHORTCUT_TYPE_EXPRESSION_RIGHT, SHORTCUT_TYPE_EXPRESSION_LEFT, SHORTCUT_TYPE_EXPRESSION_UP, SHORTCUT_TYPE_EXPRESSION_DOWN, SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT, SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS, SHORTCUT_TYPE_EXPRESSION_UNDO, SHORTCUT_TYPE_EXPRESSION_REDO, SHORTCUT_TYPE_CALCULATE_EXPRESSION, SHORTCUT_TYPE_PLOT, SHORTCUT_TYPE_NUMBER_BASES, SHORTCUT_TYPE_FLOATING_POINT, SHORTCUT_TYPE_CALENDARS, SHORTCUT_TYPE_PERCENTAGE_TOOL, SHORTCUT_TYPE_PERIODIC_TABLE, SHORTCUT_TYPE_UPDATE_EXRATES, SHORTCUT_TYPE_MODE, SHORTCUT_TYPE_MENU, SHORTCUT_TYPE_HELP, SHORTCUT_TYPE_QUIT, SHORTCUT_TYPE_HISTORY_CLEAR, SHORTCUT_TYPE_PRECISION, SHORTCUT_TYPE_MIN_DECIMALS, SHORTCUT_TYPE_MAX_DECIMALS, SHORTCUT_TYPE_MINMAX_DECIMALS, SHORTCUT_TYPE_FUNCTIONS_MENU, SHORTCUT_TYPE_UNITS_MENU, SHORTCUT_TYPE_VARIABLES_MENU, SHORTCUT_TYPE_TOGGLE_FRACTION } shortcut_type; #define LAST_SHORTCUT_TYPE SHORTCUT_TYPE_TOGGLE_FRACTION #define SHORTCUT_REQUIRES_VALUE(x) (x == SHORTCUT_TYPE_FUNCTION || x == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG || x == SHORTCUT_TYPE_UNIT || x == SHORTCUT_TYPE_VARIABLE || x == SHORTCUT_TYPE_TEXT || x == SHORTCUT_TYPE_OPERATOR || x == SHORTCUT_TYPE_CONVERT_TO || x == SHORTCUT_TYPE_TO_NUMBER_BASE || x == SHORTCUT_TYPE_INPUT_BASE || x == SHORTCUT_TYPE_OUTPUT_BASE || x == SHORTCUT_TYPE_PRECISION || x == SHORTCUT_TYPE_MAX_DECIMALS || x == SHORTCUT_TYPE_MIN_DECIMALS || x == SHORTCUT_TYPE_MINMAX_DECIMALS) #define SHORTCUT_USES_VALUE(x) (SHORTCUT_REQUIRES_VALUE(x) || x == SHORTCUT_TYPE_COPY_RESULT) struct keyboard_shortcut { QString key; std::vector type; std::vector value; QAction *action; bool new_action; }; struct custom_button { int c, r; int type[3]; std::string value[3]; QString label; }; DECLARE_BUILTIN_FUNCTION(AnswerFunction, 0) class QalculateQtSettings : QObject { Q_OBJECT public: QalculateQtSettings(); ~QalculateQtSettings(); void loadPreferences(); void readPreferenceValue(const std::string &svar, const std::string &svalue, bool is_workspace = false); int savePreferences(bool save_mode = true); bool savePreferences(const char *filename, bool is_workspace = false, bool save_mode = true); void updateStyle(); void updatePalette(bool force_update = false); void updateMessagePrintOptions(); void updateFavourites(); void setCustomAngleUnit(); void setDefaultCurrency(); QIcon loadColoredIcon(const QString &str, QWidget*); bool useColoredIcon(QWidget*); bool checkExchangeRates(QWidget *parent); void fetchExchangeRates(int timeout, int n = -1, QWidget *parent = NULL); bool displayMessages(QWidget *parent); bool isAnswerVariable(Variable *v); QString shortcutTypeText(shortcut_type type); QString shortcutText(int type, const std::string &value); QString shortcutText(const std::vector &type, const std::vector &value); void updateActionValueTexts(); bool testShortcutValue(int type, QString &value, QWidget *parent = NULL); void checkVersion(bool force, QWidget *parent); void autoUpdate(std::string new_version, QWidget *parent); const char *multiplicationSign(bool units = false); const char *divisionSign(bool output = true); std::string replaceResultSeparators(std::string str); std::string localizeExpression(std::string, bool unit_expression = false); std::string unlocalizeExpression(std::string); bool loadWorkspace(const char *filename); bool saveWorkspace(const char *filename); QString workspaceTitle(); QStringList copy_action_value_texts; EvaluationOptions evalops; PrintOptions printops; bool complex_angle_form, dot_question_asked, implicit_question_asked, assumptions_warning_shown, adaptive_interval_display, tc_set, rpn_mode, chain_mode, caret_as_xor, ignore_locale, do_imaginary_j, fetch_exchange_rates_at_startup, always_on_top, display_expression_status, prefixes_default, rpn_keys, sinc_set; bool automatic_digit_grouping; bool custom_digit_grouping, custom_digit_group_changed; std::string custom_digit_group_separator, custom_digit_group_format, saved_local_dgs, saved_local_dgf; int simplified_percentage; bool programming_base_changed; int previous_precision; std::string custom_angle_unit, default_currency; QString custom_lang; int rounding_mode; int allow_multiple_instances; int decimal_comma, dual_fraction, dual_approximation, auto_update_exchange_rates, title_type; int completion_delay, expression_status_delay, auto_calculate_delay; bool adaptive_autocalc_delay; int completion_min, completion_min2; QString style; int palette; bool enable_completion, enable_completion2; int enable_tooltips; int color; bool colorize_result; bool format_result; bool first_time; bool enable_input_method; bool use_custom_result_font, use_custom_expression_font, use_custom_keypad_font, use_custom_app_font, use_custom_status_font; bool save_custom_result_font, save_custom_expression_font, save_custom_keypad_font, save_custom_app_font, save_custom_status_font; QFont saved_app_font; int replace_expression; bool autocopy_result; int default_signed = -1, default_bits = -1; int keypad_type; bool separate_keypad_menu_buttons, show_percent_in_numpad; int expression_pos; bool show_statusbar; int toolbar_style; int show_keypad; int show_bases; bool hide_numpad, show_custom_keypad_column; bool keep_function_dialog_open; bool save_defs_on_exit, save_mode_on_exit, clear_history_on_exit; int max_history_lines; bool rpn_shown; bool auto_calculate, status_in_history, status_in_statusbar, autocalc_selection; int history_expression_type; bool copy_ascii, copy_ascii_without_units; bool close_with_esc; std::string custom_result_font, custom_expression_font, custom_keypad_font, custom_app_font, custom_status_font; KnownVariable *vans[5], *v_memory; MathStructure *current_result; MathFunction *f_answer; std::vector history_answer; std::vector expression_history; QByteArray window_geometry, window_state, splitter_state; QByteArray functions_geometry, functions_vsplitter_state, functions_hsplitter_state; QByteArray units_geometry, units_vsplitter_state, units_hsplitter_state; QByteArray variables_geometry, variables_vsplitter_state, variables_hsplitter_state; QByteArray datasets_geometry, datasets_vsplitter_state, datasets_hsplitter_state; bool disable_cursor_blinking; bool wayland_platform; QStringList tempfiles; int preserve_history_height; bool keypad_appended, bases_appended; std::string volume_category; std::vector alternative_volume_categories; PlotLegendPlacement default_plot_legend_placement; PlotStyle default_plot_style; PlotSmoothing default_plot_smoothing; bool default_plot_display_grid, default_plot_full_border, default_plot_use_sampling_rate, default_plot_rows, default_plot_color; std::string default_plot_min, default_plot_max, default_plot_step, default_plot_variable; int default_plot_sampling_rate, default_plot_linewidth, default_plot_type, max_plot_time, default_plot_complex; QalculateDateTime last_version_check_date; bool check_version; std::string last_found_version; int preferences_version[3]; std::string current_workspace; std::vector recent_workspaces; int save_workspace; std::vector v_expression; std::vector v_parse; std::vector v_pexact; std::vector v_protected; std::vector v_time; std::vector > v_result; std::vector > v_exact; std::vector > v_value; std::vector v_messages; std::vector v_parseerror; std::vector favourite_functions, recent_functions; std::vector favourite_variables, recent_variables; std::vector favourite_units, recent_units; std::string latest_button_unit; std::vector favourite_functions_pre, recent_functions_pre; std::vector favourite_variables_pre, recent_variables_pre; std::vector favourite_units_pre, recent_units_pre; bool default_shortcuts; std::vector keyboard_shortcuts; int custom_button_columns, custom_button_rows; std::vector custom_buttons; bool favourite_functions_changed, favourite_variables_changed, favourite_units_changed; bool show_all_functions, show_all_variables, show_all_units, use_function_dialog; long long int current_history_time; }; class MathLineEdit : public QLineEdit { public: MathLineEdit(QWidget *parent = NULL, bool unit_expression = false, bool function_expression = false); virtual ~MathLineEdit(); protected: bool b_unit, b_function; void keyPressEvent(QKeyEvent*) override; }; extern QalculateQtSettings *settings; #endif //QALCULATE_Q_SETTINGS_H qalculate-qt-5.11.0/src/qalculatewindow.cpp000066400000000000000000016777671520501070600207240ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021-2024 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # include #endif #include #include "qalculatewindow.h" #include "qalculateqtsettings.h" #include "expressionedit.h" #include "historyview.h" #include "keypadwidget.h" #include "unknowneditdialog.h" #include "variableeditdialog.h" #include "uniteditdialog.h" #include "functioneditdialog.h" #include "preferencesdialog.h" #include "datasetsdialog.h" #include "functionsdialog.h" #include "variablesdialog.h" #include "unitsdialog.h" #include "fpconversiondialog.h" #include "percentagecalculationdialog.h" #include "plotdialog.h" #include "periodictabledialog.h" #include "calendarconversiondialog.h" #include "matrixwidget.h" #include "csvdialog.h" class ViewThread : public Thread { protected: virtual void run(); }; class CommandThread : public Thread { protected: virtual void run(); }; enum { COMMAND_FACTORIZE, COMMAND_EXPAND_PARTIAL_FRACTIONS, COMMAND_EXPAND, COMMAND_CONVERT_UNIT, COMMAND_CONVERT_STRING, COMMAND_CONVERT_BASE, COMMAND_CONVERT_OPTIMAL, COMMAND_CONVERT_MIXED, COMMAND_CALCULATE, COMMAND_EVAL }; #ifdef _WIN32 # define DEFAULT_HEIGHT 600 # define DEFAULT_WIDTH 550 #else # define DEFAULT_HEIGHT 650 # define DEFAULT_WIDTH 600 #endif #define RESULT_FONT_FACTOR 1.35 #define STATUS_FONT_FACTOR 0.95 std::vector alt_results; int b_busy = 0, block_result_update = 0; bool exact_comparison, command_aborted; std::string original_expression, result_text, parsed_text, exact_text, previous_expression; bool had_to_expression = false; MathStructure *mstruct, *parsed_mstruct, *parsed_tostruct, matrix_mstruct, mstruct_exact, prepend_mstruct, lastx; QString lastx_text, current_status; std::string command_convert_units_string; Unit *command_convert_unit; bool block_expression_history = false; int to_fraction = 0; long int to_fixed_fraction = 0; char to_prefix = 0; int to_base = 0; #define TO_FORM_OFF -10000 int to_form = TO_FORM_OFF; bool to_duo_syms = false; int to_caf = -1; unsigned int to_bits = 0; Number to_nbase; std::string result_bin, result_oct, result_dec, result_hex; std::string auto_expression, auto_result, current_status_expression, auto_exact_text, auto_result_text; bool auto_calculation_updated = false, auto_format_updated = false, auto_error = false; int prev_autocalculable = 0; size_t auto_aborted = false; bool bases_is_result = false; Number max_bases, min_bases; bool title_modified = false; MathStructure mauto, mauto_parsed; bool contains_unknown_variable(const MathStructure &m) { if(m.isVariable()) return !m.variable()->isKnown(); for(size_t i = 0; i < m.size(); i++) { if(contains_unknown_variable(m[i])) return true; } return false; } QAction *find_child_data(QObject *parent, const QString &name, int v) { QActionGroup *group = parent->findChild(name); if(!group) return NULL; QList actions = group->actions(); for(int i = 0; i < actions.count(); i++) { if(actions.at(i)->data().toInt() == v) return actions.at(i); } return NULL; } bool contains_rand_function(const MathStructure &m) { if(m.isFunction() && m.function()->category() == CALCULATOR->getFunctionById(FUNCTION_ID_RAND)->category()) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_rand_function(m[i])) return true; } return false; } bool contains_fraction_qt(const MathStructure &m) { if(m.isNumber()) return !m.number().isInteger(); for(size_t i = 0; i < m.size(); i++) { if(contains_fraction_qt(m[i])) return true; } return false; } std::string print_with_evalops(const Number &nr) { PrintOptions po; po.is_approximate = NULL; po.base = settings->evalops.parse_options.base; po.base_display = BASE_DISPLAY_NONE; po.twos_complement = settings->evalops.parse_options.twos_complement; po.hexadecimal_twos_complement = settings->evalops.parse_options.hexadecimal_twos_complement; if(((po.base == 2 && po.twos_complement) || (po.base == 16 && po.hexadecimal_twos_complement)) && nr.isNegative()) po.binary_bits = settings->evalops.parse_options.binary_bits; po.min_exp = EXP_NONE; Number nr_base; if(po.base == BASE_CUSTOM) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } if(po.base == BASE_CUSTOM && CALCULATOR->customInputBase().isInteger() && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if((po.base < BASE_CUSTOM && po.base != BASE_UNICODE && po.base != BASE_BIJECTIVE_26 && po.base != BASE_BINARY_DECIMAL) || (po.base == BASE_CUSTOM && CALCULATOR->customInputBase() <= 12 && CALCULATOR->customInputBase() >= -12)) { po.base = 10; std::string str = "dec("; str += nr.print(po); str += ")"; return str; } else if(po.base == BASE_CUSTOM) { po.base = 10; } std::string str = nr.print(po); if(po.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nr_base); return str; } std::string unhtmlize(std::string str, bool b_ascii) { size_t i = 0, i2; while(true) { i = str.find("<", i); if(i == std::string::npos || i == str.length() - 1) break; i2 = str.find(">", i + 1); if(i2 == std::string::npos) break; if((i2 - i == 3 && str.substr(i + 1, 2) == "br") || (i2 - i == 4 && str.substr(i + 1, 3) == "/tr")) { str.replace(i, i2 - i + 1, "\n"); continue; } else if(i2 - i == 5 && str.substr(i + 1, 4) == "head") { size_t i3 = str.find("", i2 + 1); if(i3 != std::string::npos) { i2 = i3 + 6; } } else if(i2 - i == 4) { if(str.substr(i + 1, 3) == "sup") { size_t i3 = str.find("", i2 + 1); if(i3 != std::string::npos) { std::string str2 = unhtmlize(str.substr(i + 5, i3 - i - 5), b_ascii); if(!b_ascii && str2.length() == 1 && str2[0] == '2') str.replace(i, i3 - i + 6, SIGN_POWER_2); else if(!b_ascii && str2.length() == 1 && str2[0] == '3') str.replace(i, i3 - i + 6, SIGN_POWER_3); else if((str.length() == i3 + 6 || (str.length() == i3 + 13 && str.find("
", i3) != std::string::npos)) && (unicode_length(str2) == 1 || str2.find_first_not_of(NUMBERS) == std::string::npos)) str.replace(i, i3 - i + 6, std::string("^") + str2); else str.replace(i, i3 - i + 6, std::string("^(") + str2 + ")"); continue; } } else if(str.substr(i + 1, 3) == "sub") { size_t i3 = str.find("", i + 4); if(i3 != std::string::npos) { if(i3 - i2 > 16 && str.substr(i2 + 1, 7) == "" && str.substr(i3 - 8, 8) == "") str.erase(i, i3 - i + 6); else str.replace(i, i3 - i + 6, std::string("_") + unhtmlize(str.substr(i + 5, i3 - i - 5), b_ascii)); continue; } } } else if(i2 - i == 17 && str.substr(i + 1, 16) == "i class=\"symbol\"") { size_t i3 = str.find("
", i2 + 1); if(i3 != std::string::npos) { std::string name = unhtmlize(str.substr(i2 + 1, i3 - i2 - 1), b_ascii); if(name.length() == 1 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z'))) { name.insert(0, 1, '\\'); } else { name.insert(0, 1, '\"'); name += '\"'; } str.replace(i, i3 - i + 4, name); continue; } } str.erase(i, i2 - i + 1); } gsub(" " SIGN_DIVISION_SLASH " ", "/", str); gsub("&", "&", str); gsub(">", ">", str); gsub("<", "<", str); gsub(""", "\"", str); gsub(" ", "", str); gsub(" ", " ", str); gsub(" ", THIN_SPACE, str); gsub(" ", NNBSP, str); return str; } void base_from_string(std::string str, int &base, Number &nbase, bool input_base) { if(equalsIgnoreCase(str, "golden") || equalsIgnoreCase(str, "golden ratio") || str == "φ") base = BASE_GOLDEN_RATIO; else if(equalsIgnoreCase(str, "roman") || equalsIgnoreCase(str, "roman")) base = BASE_ROMAN_NUMERALS; else if(!input_base && (equalsIgnoreCase(str, "time") || equalsIgnoreCase(str, "time"))) base = BASE_TIME; else if(str == "b26" || str == "B26") base = BASE_BIJECTIVE_26; else if(equalsIgnoreCase(str, "bcd")) base = BASE_BINARY_DECIMAL; else if(equalsIgnoreCase(str, "unicode")) base = BASE_UNICODE; else if(equalsIgnoreCase(str, "supergolden") || equalsIgnoreCase(str, "supergolden ratio") || str == "ψ") base = BASE_SUPER_GOLDEN_RATIO; else if(equalsIgnoreCase(str, "pi") || str == "Ï€") base = BASE_PI; else if(str == "e") base = BASE_E; else if(str == "sqrt(2)" || str == "sqrt 2" || str == "sqrt2" || str == "√2") base = BASE_SQRT2; else { EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; MathStructure m; eo.approximation = APPROXIMATION_TRY_EXACT; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 350, eo); if(CALCULATOR->endTemporaryStopMessages()) { base = BASE_CUSTOM; nbase.clear(); } else if(m.isInteger() && m.number() >= 2 && m.number() <= 36) { base = m.number().intValue(); } else { base = BASE_CUSTOM; nbase = m.number(); } } } QalculateToolButton::QalculateToolButton(QWidget *parent) : QToolButton(parent), longPressTimer(NULL), b_longpress(false) {} QalculateToolButton::~QalculateToolButton() {} void QalculateToolButton::mousePressEvent(QMouseEvent *e) { b_longpress = false; if(e->button() == Qt::RightButton && menu()) { showMenu(); } else if(e->button() == Qt::LeftButton && menu()) { if(!longPressTimer) { longPressTimer = new QTimer(this); longPressTimer->setSingleShot(true); connect(longPressTimer, SIGNAL(timeout()), this, SLOT(longPressTimeout())); } longPressTimer->start(500); } else if(e->button() == Qt::MiddleButton) { emit middleButtonClicked(); } QToolButton::mousePressEvent(e); } void QalculateToolButton::longPressTimeout() { b_longpress = true; showMenu(); } void QalculateToolButton::mouseReleaseEvent(QMouseEvent *e) { if(longPressTimer && longPressTimer->isActive() && e->button() == Qt::LeftButton) { longPressTimer->stop(); } else if(b_longpress && e->button() == Qt::LeftButton) { b_longpress = false; blockSignals(true); QToolButton::mouseReleaseEvent(e); blockSignals(false); return; } QToolButton::mouseReleaseEvent(e); } QalculateDockWidget::QalculateDockWidget(const QString &name, QWidget *parent, ExpressionEdit *editwidget) : QDockWidget(name, parent), expressionEdit(editwidget) {} QalculateDockWidget::QalculateDockWidget(QWidget *parent, ExpressionEdit *editwidget) : QDockWidget(parent), expressionEdit(editwidget) {} QalculateDockWidget::~QalculateDockWidget() {} void QalculateDockWidget::keyPressEvent(QKeyEvent *e) { QDockWidget::keyPressEvent(e); if(!e->isAccepted() && isFloating()) { expressionEdit->setFocus(); expressionEdit->keyPressEvent(e); } } void QalculateDockWidget::closeEvent(QCloseEvent *e) { emit dockClosed(); QDockWidget::closeEvent(e); } class QalculateTableWidget : public QTableWidget { public: QalculateTableWidget(QWidget *parent) : QTableWidget(parent) {} virtual ~QalculateTableWidget() {} protected: void keyPressEvent(QKeyEvent *e) override { if(state() != EditingState) { e->ignore(); return; } QTableWidget::keyPressEvent(e); } }; #define ADD_SECTION(str) \ if(!menu->style()->styleHint(QStyle::SH_Menu_SupportsSections)) { \ aw = new QWidgetAction(this); \ QLabel *label = new QLabel(str, this); \ label->setAlignment(Qt::AlignCenter); \ aw->setDefaultWidget(label); \ menu->addSeparator(); \ menu->addAction(aw); \ menu->addSeparator(); \ } else { \ menu->addSection(str); \ } #define SET_BINARY_BITS \ int binary_bits = settings->printops.binary_bits;\ if(binary_bits <= 0) binary_bits = 64;\ else if(binary_bits > 32 && binary_bits % 32 != 0) binary_bits += (32 - binary_bits % 32); QalculateWindow::QalculateWindow() : QMainWindow() { init_in_progress = true; QWidget *w_top = new QWidget(this); setCentralWidget(w_top); send_event = true; workspace_changed = false; testTimer = NULL; ecTimer = NULL; emhTimer = NULL; resizeTimer = NULL; rfTimer = NULL; decimalsTimer = NULL; autoCalculateTimer = NULL; shortcutsDialog = NULL; preferencesDialog = NULL; functionsDialog = NULL; datasetsDialog = NULL; variablesDialog = NULL; unitsDialog = NULL; fpConversionDialog = NULL; percentageDialog = NULL; plotDialog = NULL; periodicTableDialog = NULL; calendarConversionDialog = NULL; mauto.setAborted(); QVBoxLayout *topLayout = new QVBoxLayout(w_top); topLayout->setContentsMargins(0, 0, 0, 0); tb = addToolBar("Toolbar"); tb->setContextMenuPolicy(Qt::CustomContextMenu); tb->setObjectName("Toolbar"); tb->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); tb->setFloatable(false); tb->setMovable(false); tb->toggleViewAction()->setVisible(false); tbAction = new QAction(tr("Show toolbar"), this); tbAction->setCheckable(true); connect(tbAction, SIGNAL(triggered(bool)), tb, SLOT(setVisible(bool))); statusLabelLeft = new QLabel(); //statusLabelLeft->setTextFormat(Qt::RichText); statusLabelLeft->setIndent(4); statusLabelRight = new QLabel(); QFont font = statusLabelLeft->font(); if(font.pixelSize() >= 0) { font.setPixelSize(font.pixelSize() * STATUS_FONT_FACTOR); } else { font.setPointSize(font.pointSize() * STATUS_FONT_FACTOR); } statusLabelLeft->setFont(font); statusLabelRight->setFont(font); statusBar()->addPermanentWidget(statusLabelLeft, 1); statusBar()->addPermanentWidget(statusLabelRight, 0); if(!settings->show_statusbar && !settings->status_in_statusbar) statusBar()->hide(); tmenu = NULL; connect(tb, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showToolbarContextMenu(const QPoint&))); ehSplitter = new QSplitter(Qt::Vertical, this); topLayout->addWidget(ehSplitter, 1); QAction *action; QActionGroup *group; QMenu *menu, *menu2; int w, w2; QWidgetAction *aw; QWidget *aww; QHBoxLayout *awl; QFont appfont; if(settings->use_custom_app_font) appfont.fromString(QString::fromStdString(settings->custom_app_font)); menuAction_t = new QToolButton(this); menuAction_t->setIcon(LOAD_COLORED_ICON("menu")); menuAction_t->setText(tr("Menu")); menuAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(tr("Menu"), this); menuAction_t->setMenu(menu); menu2 = menu; menu = menu2->addMenu(tr("New")); newFunctionAction = menu->addAction(tr("Function…"), this, SLOT(newFunction())); newVariableAction = menu->addAction(tr("Variable/Constant…"), this, SLOT(newVariable())); menu->addAction(tr("Unknown Variable…"), this, SLOT(newUnknown())); menu->addAction(tr("Matrix…"), this, SLOT(newMatrix())); menu->addAction(tr("Unit…"), this, SLOT(newUnit())); menu = menu2->addMenu(tr("Workspaces")); openWSAction = menu->addAction(tr("Open…"), this, SLOT(openWorkspace())); defaultWSAction = menu->addAction(tr("Open default"), this, SLOT(openDefaultWorkspace())); menu->addSeparator(); saveWSAction = menu->addAction(tr("Save"), this, SLOT(saveWorkspace())); saveWSAsAction = menu->addAction(tr("Save As…"), this, SLOT(saveWorkspaceAs())); recentWSMenu = menu; recentWSSeparator = NULL; updateWSActions(); menu = menu2; menu->addSeparator(); menu->addAction(tr("Import CSV File…"), this, SLOT(importCSV())); menu->addAction(tr("Export CSV File…"), this, SLOT(exportCSV())); menu->addSeparator(); functionsAction = menu->addAction(tr("Functions"), this, SLOT(openFunctions())); variablesAction = menu->addAction(tr("Variables and Constants"), this, SLOT(openVariables())); unitsAction = menu->addAction(tr("Units"), this, SLOT(openUnits())); datasetsAction = menu->addAction(tr("Data Sets"), this, SLOT(openDatasets())); menu->addSeparator(); plotAction = menu->addAction(tr("Plot Functions/Data"), this, SLOT(openPlot())); fpAction = menu->addAction(tr("Floating Point Conversion (IEEE 754)"), this, SLOT(openFPConversion())); calendarsAction = menu->addAction(tr("Calendar Conversion"), this, SLOT(openCalendarConversion())); percentageAction = menu->addAction(tr("Percentage Calculation Tool"), this, SLOT(openPercentageCalculation())); periodicTableAction = menu->addAction(tr("Periodic Table"), this, SLOT(openPeriodicTable())); menu->addSeparator(); exratesAction = menu->addAction(tr("Update Exchange Rates"), this, SLOT(fetchExchangeRates())); exratesAction->setEnabled(CALCULATOR->canFetch()); menu->addSeparator(); group = new QActionGroup(this); action = menu->addAction(tr("Normal Mode"), this, SLOT(normalModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_normalmode"); if(!settings->rpn_mode && !settings->chain_mode) action->setChecked(true); action = menu->addAction(tr("RPN Mode"), this, SLOT(rpnModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_rpnmode"); if(settings->rpn_mode) action->setChecked(true); rpnAction = action; action = menu->addAction(tr("Chain Mode"), this, SLOT(chainModeActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_chainmode"); if(settings->chain_mode) action->setChecked(true); chainAction = action; menu->addSeparator(); menu->addAction(tr("Keyboard Shortcuts"), this, SLOT(editKeyboardShortcuts())); menu->addAction(tr("Preferences"), this, SLOT(editPreferences())); menu->addAction(tr("Open Settings Folder(s)", "", getLocalDir() == getLocalDataDir() ? 1 : 2), this, SLOT(openSettingsFolder())); menu->addSeparator(); helpAction = menu->addAction(tr("Help"), this, SLOT(help())); menu->addAction(tr("Report a Bug"), this, SLOT(reportBug())); menu->addAction(tr("Check for Updates"), this, SLOT(checkVersion())); menu->addAction(tr("About %1").arg("Qt"), qApp, SLOT(aboutQt())); menu->addAction(tr("About %1").arg("Qalculate!"), this, SLOT(showAbout())); menu->addSeparator(); quitAction = menu->addAction(tr("Quit"), qApp, SLOT(closeAllWindows())); modeAction_t = new QToolButton(this); modeAction_t->setIcon(LOAD_COLORED_ICON("configure")); modeAction_t->setText(tr("Mode")); modeAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(tr("Mode"), this); modeAction_t->setMenu(menu); ADD_SECTION(tr("General Display Mode")); QFontMetrics fm1(settings->use_custom_app_font ? appfont : menu->font()); menu->setToolTipsVisible(true); w = fm1.boundingRect(tr("General Display Mode")).width() * 1.5; group = new QActionGroup(this); group->setObjectName("group_general"); action = menu->addAction(tr("Normal"), this, SLOT(normalActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 000
5 × 1014
50 km/s
y − x
erf(10) ≈ 1.000 000 000"); normalAction = action; action->setData(EXP_PRECISION); if(settings->printops.min_exp == EXP_PRECISION) action->setChecked(true); action = menu->addAction(tr("Scientific"), this, SLOT(scientificActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("5 × 105
5 × 104 m·s−1
−y + x
erf(10) ≈ 1.000 000 000"); sciAction = action; action->setData(EXP_SCIENTIFIC); if(settings->printops.min_exp == EXP_SCIENTIFIC) action->setChecked(true); action = menu->addAction(tr("Engineering"), this, SLOT(engineeringActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 × 103
50 × 103 m/s
−y + x
erf(10) ≈ 1.000 000 000"); engAction = action; action->setData(EXP_BASE_3); if(settings->printops.min_exp == EXP_BASE_3) action->setChecked(true); action = menu->addAction(tr("Simple"), this, SLOT(simpleActivated())); action->setCheckable(true); group->addAction(action); action->setToolTip("500 000 000 000 000
50 km/s
y − x
erf(10) ≈ 1"); simpleAction = action; action->setData(EXP_NONE); if(settings->printops.min_exp == EXP_NONE) action->setChecked(true); ADD_SECTION(tr("Angle Unit")); w2 = fm1.boundingRect(tr("Angle Unit")).width() * 1.5; if(w2 > w) w = w2; group = new QActionGroup(this); group->setObjectName("group_angleunit"); action = menu->addAction(tr("Radians"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_radians"); radAction = action; action->setData(ANGLE_UNIT_RADIANS); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_RADIANS) action->setChecked(true); action = menu->addAction(tr("Degrees"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_degrees"); degAction = action; action->setData(ANGLE_UNIT_DEGREES); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_DEGREES) action->setChecked(true); action = menu->addAction(tr("Gradians"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_gradians"); graAction = action; action->setData(ANGLE_UNIT_GRADIANS); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_GRADIANS) action->setChecked(true); menu2 = menu; angleMenu = menu2->addMenu(tr("Other")); updateAngleUnitsMenu(); menu = menu2; ADD_SECTION(tr("Approximation and Fractions")); w2 = fm1.boundingRect(tr("Approximation and Fractions")).width() * 1.5; if(w2 > w) w = w2; group = new QActionGroup(this); action = menu->addAction(tr("Automatic", "Automatic approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_autoappr"); action->setData(-1); assumptionTypeActions[0] = action; if(settings->dual_approximation < 0) action->setChecked(true); action = menu->addAction(tr("Dual", "Dual approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_dualappr"); action->setData(-2); assumptionTypeActions[0] = action; if(settings->dual_approximation > 0) action->setChecked(true); action = menu->addAction(tr("Exact", "Exact approximation"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setData(APPROXIMATION_EXACT); assumptionTypeActions[0] = action; if(settings->dual_approximation == 0 && settings->evalops.approximation == APPROXIMATION_EXACT) action->setChecked(true); action->setObjectName("action_exact"); action = menu->addAction(tr("Approximate"), this, SLOT(approximationActivated())); action->setCheckable(true); group->addAction(action); action->setData(APPROXIMATION_TRY_EXACT); assumptionTypeActions[0] = action; if(settings->dual_approximation == 0 && (settings->evalops.approximation == APPROXIMATION_APPROXIMATE || settings->evalops.approximation == APPROXIMATION_TRY_EXACT)) action->setChecked(true); action->setObjectName("action_approximate"); menu->addSeparator(); menu2 = menu; menu = menu2->addMenu(tr("Assumptions")); ADD_SECTION(tr("Type", "Assumptions type")); group = new QActionGroup(this); group->setObjectName("group_type"); action = menu->addAction(tr("Number"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_NUMBER); assumptionTypeActions[0] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_NUMBER) action->setChecked(true); action = menu->addAction(tr("Real"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_REAL); assumptionTypeActions[1] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_REAL) action->setChecked(true); action = menu->addAction(tr("Rational"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_RATIONAL); assumptionTypeActions[2] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_RATIONAL) action->setChecked(true); action = menu->addAction(tr("Integer"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_INTEGER); assumptionTypeActions[3] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_INTEGER) action->setChecked(true); action = menu->addAction(tr("Boolean"), this, SLOT(assumptionsTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_TYPE_BOOLEAN); assumptionTypeActions[4] = action; if(CALCULATOR->defaultAssumptions()->type() == ASSUMPTION_TYPE_BOOLEAN) action->setChecked(true); ADD_SECTION(tr("Sign", "Assumptions sign")); group = new QActionGroup(this); group->setObjectName("group_sign"); action = menu->addAction(tr("Unknown", "Unknown assumptions sign"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_UNKNOWN); assumptionSignActions[0] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_UNKNOWN) action->setChecked(true); action = menu->addAction(tr("Non-zero"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONZERO); assumptionSignActions[1] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONZERO) action->setChecked(true); action = menu->addAction(tr("Positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_POSITIVE); assumptionSignActions[2] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_POSITIVE) action->setChecked(true); action = menu->addAction(tr("Non-negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONNEGATIVE); assumptionSignActions[3] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONNEGATIVE) action->setChecked(true); action = menu->addAction(tr("Negative"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NEGATIVE); assumptionSignActions[4] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NEGATIVE) action->setChecked(true); action = menu->addAction(tr("Non-positive"), this, SLOT(assumptionsSignActivated())); action->setCheckable(true); group->addAction(action); action->setData(ASSUMPTION_SIGN_NONPOSITIVE); assumptionSignActions[5] = action; if(CALCULATOR->defaultAssumptions()->sign() == ASSUMPTION_SIGN_NONPOSITIVE) action->setChecked(true); menu = menu2; ADD_SECTION(tr("Result Base")); w2 = fm1.boundingRect(tr("Result Base")).width() * 1.5; if(w2 > w) w = w2; bool base_checked = false; group = new QActionGroup(this); group->setObjectName("group_outbase"); action = menu->addAction(tr("Binary"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY); if(settings->printops.base == BASE_BINARY) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Octal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_OCTAL); if(settings->printops.base == BASE_OCTAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Decimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DECIMAL); if(settings->printops.base == BASE_DECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Hexadecimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_HEXADECIMAL); if(settings->printops.base == BASE_HEXADECIMAL) {base_checked = true; action->setChecked(true);} menu2 = menu; menu = menu2->addMenu(tr("Other")); action = menu->addAction(tr("Duodecimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DUODECIMAL); if(settings->printops.base == BASE_DUODECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Sexagesimal"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SEXAGESIMAL); if(settings->printops.base == BASE_SEXAGESIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Time format"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_TIME); if(settings->printops.base == BASE_TIME) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Roman numerals"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_ROMAN_NUMERALS); if(settings->printops.base == BASE_ROMAN_NUMERALS) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Unicode"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_UNICODE); if(settings->printops.base == BASE_UNICODE) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Bijective base-26"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BIJECTIVE_26); if(settings->printops.base == BASE_BIJECTIVE_26) action->setChecked(true); action = menu->addAction("Float", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_FP32); if(settings->printops.base == BASE_FP32) {base_checked = true; action->setChecked(true);} action = menu->addAction("Double", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_FP64); if(settings->printops.base == BASE_FP64) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Binary-coded decimal (BCD)"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY_DECIMAL); if(settings->printops.base == BASE_BINARY_DECIMAL) action->setChecked(true); action = menu->addAction("φ", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_GOLDEN_RATIO); if(settings->printops.base == BASE_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("ψ", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SUPER_GOLDEN_RATIO); if(settings->printops.base == BASE_SUPER_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("Ï€", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_PI); if(settings->printops.base == BASE_PI) {base_checked = true; action->setChecked(true);} action = menu->addAction("e", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_E); if(settings->printops.base == BASE_E) {base_checked = true; action->setChecked(true);} action = menu->addAction("√2", this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SQRT2); if(settings->printops.base == BASE_SQRT2) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Custom:", "Number base"), this, SLOT(outputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_CUSTOM); if(!base_checked) action->setChecked(true); customOutputBaseAction = action; aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); awl = new QHBoxLayout(aww); customOutputBaseEdit = new QSpinBox(this); customOutputBaseEdit->setRange(INT_MIN, INT_MAX); customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? (CALCULATOR->customOutputBase().isZero() ? 10 : CALCULATOR->customOutputBase().intValue()) : ((settings->printops.base >= 2 && settings->printops.base <= 36) ? settings->printops.base : 10)); customOutputBaseEdit->setObjectName("spinbox_outbase"); customOutputBaseEdit->setAlignment(Qt::AlignRight); connect(customOutputBaseEdit, SIGNAL(valueChanged(int)), this, SLOT(onCustomOutputBaseChanged(int))); awl->addWidget(customOutputBaseEdit, 0); menu->addAction(aw); menu = menu2; ADD_SECTION(tr("Expression Base")); w2 = fm1.boundingRect(tr("Expression Base")).width() * 1.5; if(w2 > w) w = w2; base_checked = false; group = new QActionGroup(this); group->setObjectName("group_inbase"); action = menu->addAction(tr("Binary"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY); if(settings->evalops.parse_options.base == BASE_BINARY) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Octal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_OCTAL); if(settings->evalops.parse_options.base == BASE_OCTAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Decimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DECIMAL); if(settings->evalops.parse_options.base == BASE_DECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Hexadecimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_HEXADECIMAL); if(settings->evalops.parse_options.base == BASE_HEXADECIMAL) {base_checked = true; action->setChecked(true);} menu2 = menu; menu = menu2->addMenu(tr("Other")); action = menu->addAction(tr("Duodecimal"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_DUODECIMAL); if(settings->evalops.parse_options.base == BASE_DUODECIMAL) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Roman numerals"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_ROMAN_NUMERALS); if(settings->evalops.parse_options.base == BASE_ROMAN_NUMERALS) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Unicode"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_UNICODE); if(settings->evalops.parse_options.base == BASE_UNICODE) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Bijective base-26"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BIJECTIVE_26); if(settings->evalops.parse_options.base == BASE_BIJECTIVE_26) action->setChecked(true); action = menu->addAction(tr("Binary-coded decimal (BCD)"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_BINARY_DECIMAL); if(settings->evalops.parse_options.base == BASE_BINARY_DECIMAL) action->setChecked(true); action = menu->addAction("φ", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_GOLDEN_RATIO); if(settings->evalops.parse_options.base == BASE_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("ψ", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SUPER_GOLDEN_RATIO); if(settings->evalops.parse_options.base == BASE_SUPER_GOLDEN_RATIO) {base_checked = true; action->setChecked(true);} action = menu->addAction("Ï€", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_PI); if(settings->evalops.parse_options.base == BASE_PI) {base_checked = true; action->setChecked(true);} action = menu->addAction("e", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_E); if(settings->evalops.parse_options.base == BASE_E) {base_checked = true; action->setChecked(true);} action = menu->addAction("√2", this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_SQRT2); if(settings->evalops.parse_options.base == BASE_SQRT2) {base_checked = true; action->setChecked(true);} action = menu->addAction(tr("Custom:", "Number base"), this, SLOT(inputBaseActivated())); action->setCheckable(true); group->addAction(action); action->setData(BASE_CUSTOM); if(!base_checked) action->setChecked(true); customInputBaseAction = action; aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); awl = new QHBoxLayout(aww); customInputBaseEdit = new QSpinBox(this); customInputBaseEdit->setRange(INT_MIN, INT_MAX); customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? (CALCULATOR->customInputBase().isZero() ? 10 : CALCULATOR->customInputBase().intValue()) : ((settings->evalops.parse_options.base >= 2 && settings->evalops.parse_options.base <= 36) ? settings->evalops.parse_options.base : 10)); customInputBaseEdit->setObjectName("spinbox_inbase"); customInputBaseEdit->setAlignment(Qt::AlignRight); connect(customInputBaseEdit, SIGNAL(valueChanged(int)), this, SLOT(onCustomInputBaseChanged(int))); awl->addWidget(customInputBaseEdit, 0); menu->addAction(aw); menu = menu2; menu->addSeparator(); aw = new QWidgetAction(this); aww = new QWidget(this); aw->setDefaultWidget(aww); QGridLayout *awg = new QGridLayout(aww); awg->addWidget(new QLabel(tr("Precision:"), this), 0, 0); QSpinBox *precisionEdit = new QSpinBox(this); precisionEdit->setObjectName("spinbox_precision"); precisionEdit->setRange(2, 10000); precisionEdit->setValue(CALCULATOR->getPrecision()); precisionEdit->setAlignment(Qt::AlignRight); connect(precisionEdit, SIGNAL(valueChanged(int)), this, SLOT(onPrecisionChanged(int))); awg->addWidget(precisionEdit, 0, 1); awg->addWidget(new QLabel(tr("Min decimals:"), this), 1, 0); minDecimalsEdit = new QSpinBox(this); minDecimalsEdit->setObjectName("spinbox_mindecimals"); minDecimalsEdit->setRange(0, 10000); minDecimalsEdit->setValue(settings->printops.use_min_decimals ? settings->printops.min_decimals : 0); minDecimalsEdit->setAlignment(Qt::AlignRight); connect(minDecimalsEdit, SIGNAL(valueChanged(int)), this, SLOT(onMinDecimalsChanged(int))); awg->addWidget(minDecimalsEdit, 1, 1); awg->addWidget(new QLabel(tr("Max decimals:"), this), 2, 0); maxDecimalsEdit = new QSpinBox(this); maxDecimalsEdit->setObjectName("spinbox_maxdecimals"); maxDecimalsEdit->setRange(-1, 10000); maxDecimalsEdit->setSpecialValueText(tr("off", "Max decimals")); maxDecimalsEdit->setValue(settings->printops.use_max_decimals ? settings->printops.max_decimals : -1); maxDecimalsEdit->setAlignment(Qt::AlignRight); connect(maxDecimalsEdit, SIGNAL(valueChanged(int)), this, SLOT(onMaxDecimalsChanged(int))); awg->addWidget(maxDecimalsEdit, 2, 1); menu->addAction(aw); menu->setMinimumWidth(w); tb->addWidget(modeAction_t); modeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); toAction_t = new QalculateToolButton(this); toAction_t->setIcon(LOAD_COLORED_ICON("convert")); toAction_t->setText(tr("Convert")); toAction_t->setEnabled(settings->useColoredIcon(this)); connect(toAction_t, SIGNAL(clicked()), this, SLOT(onToActivated())); connect(toAction_t, SIGNAL(middleButtonClicked()), this, SLOT(onToActivatedAlt())); toMenu = new QMenu(this); tb->addWidget(toAction_t); toAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); storeAction_t = new QalculateToolButton(this); storeAction_t->setIcon(LOAD_COLORED_ICON("document-save")); storeAction_t->setText(tr("Store")); storeAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(storeAction_t, SIGNAL(clicked()), this, SLOT(onStoreActivated())); variablesMenu = new QMenu(this); storeAction_t->setMenu(variablesMenu); tb->addWidget(storeAction_t); storeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); functionsAction_t = new QalculateToolButton(this); functionsAction_t->setIcon(LOAD_COLORED_ICON("function")); functionsAction_t->setText(tr("Functions")); functionsAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(functionsAction_t, SIGNAL(clicked()), this, SLOT(openFunctions())); functionsMenu = new QMenu(this); functionsAction_t->setMenu(functionsMenu); tb->addWidget(functionsAction_t); functionsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); unitsAction_t = new QalculateToolButton(this); unitsAction_t->setIcon(LOAD_COLORED_ICON("units")); unitsAction_t->setText(tr("Units")); unitsAction_t->setPopupMode(QToolButton::MenuButtonPopup); connect(unitsAction_t, SIGNAL(clicked()), this, SLOT(openUnits())); unitsMenu = new QMenu(this); unitsAction_t->setMenu(unitsMenu); tb->addWidget(unitsAction_t); unitsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); if(CALCULATOR->canPlot()) { plotAction_t = new QAction(LOAD_COLORED_ICON("plot"), tr("Plot"), this); connect(plotAction_t, SIGNAL(triggered(bool)), this, SLOT(openPlot())); tb->addAction(plotAction_t); } else { plotAction_t = NULL; } basesAction = new QAction(LOAD_COLORED_ICON("number-bases"), tr("Number bases"), this); connect(basesAction, SIGNAL(triggered(bool)), this, SLOT(onBasesActivated(bool))); basesAction->setCheckable(true); tb->addAction(basesAction); keypadAction_t = new QToolButton(this); keypadAction_t->setIcon(LOAD_COLORED_ICON("keypad")); keypadAction_t->setText(tr("Keypad")); keypadAction_t->setToolTip(tr("Keypad")); keypadAction_t->setPopupMode(QToolButton::InstantPopup); menu = new QMenu(this); keypadAction_t->setMenu(menu); group = new QActionGroup(this); group->setObjectName("group_keypad"); action = menu->addAction(tr("General"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_GENERAL); gKeypadAction = action; action = menu->addAction(tr("Programming"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_PROGRAMMING); pKeypadAction = action; action = menu->addAction(tr("Algebra"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_ALGEBRA); xKeypadAction = action; action = menu->addAction(tr("Custom"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_CUSTOM); cKeypadAction = action; action = menu->addAction(tr("Number Pad"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(KEYPAD_NUMBERPAD); action->setEnabled(settings->hide_numpad); nKeypadAction = action; action = menu->addAction(tr("None"), this, SLOT(keypadTypeActivated())); action->setCheckable(true); group->addAction(action); action->setData(-1); action->setChecked(true); keypadAction = action; menu->addSeparator(); action = menu->addAction(tr("Always Show Number Pad"), this, SLOT(showNumpad(bool))); action->setCheckable(true); action->setChecked(!settings->hide_numpad); showNumpadAction = action; action = menu->addAction(tr("Show Custom Column"), this, SLOT(showCustomKeypadColumn(bool))); action->setCheckable(true); action->setChecked(settings->show_custom_keypad_column); showCustomKeypadColumnAction = action; action = menu->addAction(tr("Separate Menu Buttons"), this, SLOT(showSeparateKeypadMenuButtons(bool))); action->setCheckable(true); action->setChecked(settings->separate_keypad_menu_buttons); action = menu->addAction(tr("Reset Keypad Position"), this, SLOT(resetKeypadPosition())); action->setEnabled(false); resetKeypadPositionAction = action; tb->addWidget(keypadAction_t); keypadAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); QWidget *spacer = new QWidget(); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tb->addWidget(spacer); tb->addWidget(menuAction_t); menuAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); expressionEdit = new ExpressionEdit(this, tb, statusLabelLeft); font = expressionEdit->font(); if(font.pixelSize() >= 0) { font.setPixelSize(font.pixelSize() * RESULT_FONT_FACTOR); } else { font.setPointSize(font.pointSize() * RESULT_FONT_FACTOR); } expressionEdit->setFont(font); expressionEdit->setFocus(); historyView = new HistoryView(this); historyView->expressionEdit = expressionEdit; historyView->setReversed(settings->expression_pos != 0); if(settings->expression_pos == 0) { ehSplitter->addWidget(expressionEdit); ehSplitter->addWidget(historyView); } else { ehSplitter->addWidget(historyView); ehSplitter->addWidget(expressionEdit); } ehSplitter->setStretchFactor(0, settings->expression_pos == 0 ? 0 : 1); ehSplitter->setStretchFactor(1, settings->expression_pos == 0 ? 1 : 0); ehSplitter->setCollapsible(0, false); ehSplitter->setCollapsible(1, false); basesDock = new QalculateDockWidget(tr("Number bases"), this, expressionEdit); basesDock->setObjectName("number-bases-dock"); QWidget *basesWidget = new QWidget(this); QGridLayout *basesGrid = new QGridLayout(basesWidget); binLabel = new QLabel(tr("Binary:")); basesGrid->addWidget(binLabel, 0, 0, Qt::AlignTop); octLabel = new QLabel(tr("Octal:")); basesGrid->addWidget(octLabel, 1, 0); decLabel = new QLabel(tr("Decimal:")); basesGrid->addWidget(decLabel, 2, 0); hexLabel = new QLabel(tr("Hexadecimal:")); basesGrid->addWidget(hexLabel, 3, 0); binEdit = new QLabel(); QFont binfont(settings->use_custom_app_font ? appfont : binEdit->font()); #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) binfont.setFeature("tnum", 1); #endif binEdit->setFont(binfont); binEdit->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse | Qt::TextSelectableByKeyboard); binEdit->setFocusPolicy(Qt::NoFocus); updateBinEditSize(); binEdit->setAlignment(Qt::AlignRight | Qt::AlignTop); basesGrid->addWidget(binEdit, 0, 1); octEdit = new QLabel("0"); QFontMetrics fm2(settings->use_custom_app_font ? appfont : octEdit->font()); octEdit->setAlignment(Qt::AlignRight); octEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); octEdit->setFocusPolicy(Qt::NoFocus); octEdit->setMinimumHeight(fm2.lineSpacing()); basesGrid->addWidget(octEdit, 1, 1); decEdit = new QLabel("0"); decEdit->setAlignment(Qt::AlignRight); decEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); decEdit->setFocusPolicy(Qt::NoFocus); decEdit->setMinimumHeight(fm2.lineSpacing()); basesGrid->addWidget(decEdit, 2, 1); hexEdit = new QLabel("0"); hexEdit->setAlignment(Qt::AlignRight); hexEdit->setTextInteractionFlags(Qt::TextSelectableByMouse); hexEdit->setFocusPolicy(Qt::NoFocus); hexEdit->setMinimumHeight(fm2.lineSpacing()); SET_BINARY_BITS result_bin = ""; result_hex = ""; for(int i = binary_bits; i > 0; i -= 4) { if(i < binary_bits) result_bin += " "; result_bin += "0000"; } for(int i = binary_bits > 128 ? 128 : binary_bits; i > 0; i -= 8) { if(i < binary_bits) result_hex += " "; result_hex += "00"; } result_oct = "0"; result_dec = "0"; updateResultBases(); basesGrid->addWidget(hexEdit, 3, 1); basesGrid->setRowStretch(4, 1); basesDock->setWidget(basesWidget); addDockWidget(Qt::TopDockWidgetArea, basesDock); basesDock->hide(); basesMenu = NULL; binEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(binEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); octEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(octEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); decEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(decEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); hexEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(hexEdit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showBasesContextMenu(const QPoint&))); connect(binEdit, SIGNAL(linkActivated(const QString&)), this, SLOT(resultBasesLinkActivated(const QString&))); keypad = new KeypadWidget(this); keypadDock = new QalculateDockWidget(this, expressionEdit); keypadDock->setObjectName("keypad-dock"); keypadDock->setWidget(keypad); if(!settings->hide_numpad && get_screen_geometry(this).width() < keypad->sizeHint().width() + 50) { showNumpadAction->trigger(); if(settings->show_keypad) nKeypadAction->trigger(); } updateKeypadTitle(); keypadDock->setContextMenuPolicy(Qt::CustomContextMenu); connect(keypadDock, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showKeypadContextMenu(const QPoint&))); addDockWidget(Qt::BottomDockWidgetArea, keypadDock); QWidget *rpnWidget = new QWidget(this); rpnDock = new QalculateDockWidget(tr("RPN Stack"), this, expressionEdit); rpnDock->setObjectName("rpn-dock"); QHBoxLayout *rpnBox = new QHBoxLayout(rpnWidget); rpnView = new QalculateTableWidget(this); rpnView->setColumnCount(1); rpnView->setRowCount(0); rpnView->setSelectionBehavior(QAbstractItemView::SelectRows); rpnView->horizontalHeader()->setStretchLastSection(true); rpnView->horizontalHeader()->hide(); rpnView->verticalHeader()->setSectionsMovable(true); rpnView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); rpnView->setSelectionMode(QAbstractItemView::SingleSelection); rpnView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked); connect(rpnView, SIGNAL(cellChanged(int, int)), this, SLOT(registerChanged(int))); rpnBox->addWidget(rpnView); QToolBar *rpnTB = new QToolBar(this); rpnTB->setToolButtonStyle(Qt::ToolButtonIconOnly); rpnTB->setOrientation(Qt::Vertical); rpnBox->addWidget(rpnTB); rpnUpAction = new QAction(LOAD_COLORED_ICON("go-up"), "RPN Up", this); rpnUpAction->setEnabled(false); connect(rpnUpAction, SIGNAL(triggered(bool)), this, SLOT(registerUp())); rpnTB->addAction(rpnUpAction); rpnDownAction = new QAction(LOAD_COLORED_ICON("go-down"), "RPN Down", this); rpnDownAction->setEnabled(false); connect(rpnDownAction, SIGNAL(triggered(bool)), this, SLOT(registerDown())); rpnTB->addAction(rpnDownAction); rpnSwapAction = new QAction(LOAD_COLORED_ICON("rpn-swap"), "RPN Swap", this); rpnSwapAction->setEnabled(false); connect(rpnSwapAction, SIGNAL(triggered(bool)), this, SLOT(registerSwap())); rpnTB->addAction(rpnSwapAction); rpnCopyAction = new QAction(LOAD_COLORED_ICON("edit-copy"), "RPN Copy", this); rpnCopyAction->setEnabled(false); connect(rpnCopyAction, SIGNAL(triggered(bool)), this, SLOT(copyRegister())); rpnTB->addAction(rpnCopyAction); rpnLastxAction = new QAction(LOAD_COLORED_ICON("edit-undo"), "RPN LastX", this); rpnLastxAction->setEnabled(false); connect(rpnLastxAction, SIGNAL(triggered(bool)), this, SLOT(rpnLastX())); rpnTB->addAction(rpnLastxAction); rpnDeleteAction = new QAction(LOAD_COLORED_ICON("edit-delete"), "RPN Delete", this); rpnDeleteAction->setEnabled(false); connect(rpnDeleteAction, SIGNAL(triggered(bool)), this, SLOT(deleteRegister())); rpnTB->addAction(rpnDeleteAction); rpnClearAction = new QAction(LOAD_COLORED_ICON("edit-clear"), "RPN Clear", this); rpnClearAction->setEnabled(false); connect(rpnClearAction, SIGNAL(triggered(bool)), this, SLOT(clearStack())); rpnTB->addAction(rpnClearAction); rpnDock->setWidget(rpnWidget); addDockWidget(Qt::TopDockWidgetArea, rpnDock); if(!settings->rpn_mode) rpnDock->hide(); QLocalServer::removeServer("qalculate-qt"); server = new QLocalServer(this); server->listen("qalculate-qt"); connect(server, SIGNAL(newConnection()), this, SLOT(serverNewConnection())); mstruct = new MathStructure(); mstruct_exact.setUndefined(); prepend_mstruct.setUndefined(); parsed_mstruct = new MathStructure(); parsed_tostruct = new MathStructure(); viewThread = new ViewThread; commandThread = new CommandThread; settings->printops.can_display_unicode_string_arg = (void*) historyView; b_busy = 0; expressionEdit->setFocus(); if(settings->custom_result_font.empty()) settings->custom_result_font = historyView->font().toString().toStdString(); if(settings->custom_expression_font.empty()) settings->custom_expression_font = expressionEdit->font().toString().toStdString(); if(settings->custom_status_font.empty()) settings->custom_status_font = statusLabelLeft->font().toString().toStdString(); if(settings->custom_keypad_font.empty()) settings->custom_keypad_font = keypad->font().toString().toStdString(); if(settings->custom_app_font.empty()) settings->custom_app_font = QApplication::font().toString().toStdString(); if(settings->use_custom_keypad_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); keypad->setFont(font);} if(settings->use_custom_expression_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); expressionEdit->setFont(font);} if(settings->use_custom_result_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); historyView->setFont(font); rpnView->setFont(font);} if(settings->use_custom_status_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_status_font)); statusLabelLeft->setFont(font); statusLabelRight->setFont(font);} loadShortcuts(); updateStatusText(); connect(functionsMenu, SIGNAL(aboutToShow()), this, SLOT(initializeFunctionsMenu())); connect(variablesMenu, SIGNAL(aboutToShow()), this, SLOT(initializeVariablesMenu())); connect(unitsMenu, SIGNAL(aboutToShow()), this, SLOT(initializeUnitsMenu())); connect(historyView, SIGNAL(insertTextRequested(std::string)), this, SLOT(onInsertTextRequested(std::string))); connect(historyView, SIGNAL(insertValueRequested(int)), this, SLOT(onInsertValueRequested(int))); connect(historyView, SIGNAL(historyReloaded()), this, SLOT(onHistoryReloaded())); connect(expressionEdit, SIGNAL(returnPressed()), this, SLOT(calculate())); connect(expressionEdit, SIGNAL(calculateSelectionRequest()), this, SLOT(calculateSelection())); connect(expressionEdit, SIGNAL(expressionChanged()), this, SLOT(onExpressionChanged())); connect(expressionEdit, SIGNAL(statusChanged(QString, bool, bool, bool, bool)), this, SLOT(onStatusChanged(QString, bool, bool, bool, bool))); connect(expressionEdit, SIGNAL(toConversionRequested(std::string)), this, SLOT(onToConversionRequested(std::string))); connect(expressionEdit, SIGNAL(calculateRPNRequest(int)), this, SLOT(calculateRPN(int))); connect(expressionEdit, SIGNAL(expressionStatusModeChanged(bool)), this, SLOT(onExpressionStatusModeChanged(bool))); connect(tb, SIGNAL(visibilityChanged(bool)), this, SLOT(onToolbarVisibilityChanged(bool))); connect(keypadDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onKeypadVisibilityChanged(bool))); connect(basesDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onBasesVisibilityChanged(bool))); connect(rpnDock, SIGNAL(visibilityChanged(bool)), this, SLOT(onRPNVisibilityChanged(bool))); connect(rpnDock, SIGNAL(dockClosed()), this, SLOT(onRPNClosed())); connect(keypad, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(expressionCalculationUpdated(int))); connect(keypad, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(expressionFormatUpdated(bool))); connect(keypad, SIGNAL(resultFormatUpdated(int)), this, SLOT(resultFormatUpdated(int))); connect(keypad, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(resultFormatUpdated(int)), this, SLOT(keypadPreferencesChanged())); connect(keypad, SIGNAL(shortcutClicked(int, const QString&)), this, SLOT(shortcutClicked(int, const QString&))); connect(keypad, SIGNAL(symbolClicked(const QString&)), this, SLOT(onSymbolClicked(const QString&))); connect(keypad, SIGNAL(operatorClicked(const QString&)), this, SLOT(onOperatorClicked(const QString&))); connect(keypad, SIGNAL(functionClicked(MathFunction*)), this, SLOT(onFunctionClicked(MathFunction*))); connect(keypad, SIGNAL(variableClicked(Variable*)), this, SLOT(onVariableClicked(Variable*))); connect(keypad, SIGNAL(unitClicked(Unit*)), this, SLOT(onUnitClicked(Unit*))); connect(keypad, SIGNAL(prefixClicked(Prefix*)), this, SLOT(onPrefixClicked(Prefix*))); connect(keypad, SIGNAL(delClicked()), this, SLOT(onDelClicked())); connect(keypad, SIGNAL(clearClicked()), this, SLOT(onClearClicked())); connect(keypad, SIGNAL(equalsClicked()), this, SLOT(onEqualsClicked())); connect(keypad, SIGNAL(parenthesesClicked()), this, SLOT(onParenthesesClicked())); connect(keypad, SIGNAL(bracketsClicked()), this, SLOT(onBracketsClicked())); connect(keypad, SIGNAL(endClicked()), this, SLOT(onEndClicked())); connect(keypad, SIGNAL(startClicked()), this, SLOT(onStartClicked())); connect(keypad, SIGNAL(leftClicked()), this, SLOT(onLeftClicked())); connect(keypad, SIGNAL(rightClicked()), this, SLOT(onRightClicked())); connect(keypad, SIGNAL(backspaceClicked()), this, SLOT(onBackspaceClicked())); connect(keypad, SIGNAL(MSClicked()), this, SLOT(onMSClicked())); connect(keypad, SIGNAL(MRClicked()), this, SLOT(onMRClicked())); connect(keypad, SIGNAL(MCClicked()), this, SLOT(onMCClicked())); connect(keypad, SIGNAL(MPlusClicked()), this, SLOT(onMPlusClicked())); connect(keypad, SIGNAL(MMinusClicked()), this, SLOT(onMMinusClicked())); connect(keypad, SIGNAL(storeClicked()), this, SLOT(onStoreActivated())); connect(keypad, SIGNAL(newFunctionClicked()), this, SLOT(newFunction())); connect(keypad, SIGNAL(answerClicked()), this, SLOT(onAnswerClicked())); connect(keypad, SIGNAL(baseClicked(int, bool, bool)), this, SLOT(onBaseClicked(int, bool, bool))); connect(keypad, SIGNAL(factorizeClicked()), this, SLOT(onFactorizeClicked())); connect(keypad, SIGNAL(expandClicked()), this, SLOT(onExpandClicked())); connect(keypad, SIGNAL(expandPartialFractionsClicked()), this, SLOT(onExpandPartialFractionsClicked())); connect(keypad, SIGNAL(openVariablesRequest()), this, SLOT(openVariables())); connect(keypad, SIGNAL(openUnitsRequest()), this, SLOT(openUnits())); connect(keypad, SIGNAL(openPercentageCalculationRequest()), this, SLOT(openPercentageCalculation())); #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) connect(QGuiApplication::styleHints(), SIGNAL(colorSchemeChanged(Qt::ColorScheme)), this, SLOT(onColorSchemeChanged())); #endif if(settings->enable_tooltips != 1) onEnableTooltipsChanged(); if(!settings->window_geometry.isEmpty()) restoreGeometry(settings->window_geometry); if(settings->window_geometry.isEmpty() || (settings->preferences_version[0] == 3 && settings->preferences_version[1] < 22 && height() == 650 && width() == 600)) try_resize(this, DEFAULT_WIDTH, DEFAULT_HEIGHT); if(!settings->window_state.isEmpty()) restoreState(settings->window_state); if(!settings->splitter_state.isEmpty()) { ehSplitter->restoreState(settings->splitter_state); if((settings->preferences_version[0] < 5 || (settings->preferences_version[0] == 5 && (settings->preferences_version[1] < 8 || (settings->preferences_version[1] == 8 && settings->preferences_version[2] < 3)))) && settings->expression_pos < 0) { QTimer *timer = new QTimer(); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(fixSplitterPos())); timer->start(1); } } if(settings->show_bases >= 0) basesDock->setVisible(settings->show_bases > 0); if(settings->show_keypad >= 0) keypadDock->setVisible(settings->show_keypad > 0); rpnDock->setVisible(settings->rpn_mode); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); if(settings->use_custom_app_font) { QTimer *timer = new QTimer(); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(onAppFontTimer())); timer->start(1); } } QalculateWindow::~QalculateWindow() {} void QalculateWindow::startTest() { if(!testTimer) { testTimer = new QTimer(this); connect(testTimer, SIGNAL(timeout()), this, SLOT(testTimeout())); } prev_test_time = QDateTime::currentMSecsSinceEpoch(); prev_test_type = 0; testTimer->start(1); } void QalculateWindow::testTimeout() { if(toAction_t->menu()) toAction_t->menu()->hide(); if(QDateTime::currentMSecsSinceEpoch() > prev_test_time + (prev_test_type == 10 ? 500 : 200)) { std::cout << "SLOW: " << expressionEdit->toPlainText().toStdString() << std::endl; prev_test_type = 10; } if(prev_test_type == 10) expressionEdit->clear(); int type = (prev_test_type == 1 ? rand() % 16 + 8 : rand() % 25); QString s; if(prev_test_type == 9 && type < 9) { s = QString::fromStdString(CALCULATOR->units[rand() % CALCULATOR->units.size()]->referenceName()); prev_test_type = 8; } else if(type < 10) { s = QString::number(rand() % 10000 - 200); if(rand() % 3 == 0) {s += "."; s += QString::number(rand() % 10000);} prev_test_type = 1; } else if(type < 12) { std::string operator_s = OPERATORS VECTOR_WRAPS SPACE; s = operator_s[rand() % operator_s.length()]; prev_test_type = 2; } else if(type == 12) { s = ","; prev_test_type = 3; } else if(type < 15) { s = ";"; prev_test_type = 4; } else if(type == 15) { if(rand() % 5 == 0) s = QChar(rand() % 1000000 + 32); else s = ((char) (rand() % (126 - 32) + 32)); prev_test_type = 5; } else if(type == 16) { MathFunction *f = CALCULATOR->functions[rand() % CALCULATOR->functions.size()]; s = QString::fromStdString(f->referenceName() + "("); size_t n = f->minargs(); if(f->maxargs() > f->minargs()) n += rand() % (f->maxargs() - f->minargs() + 1); if(f->maxargs() < 0) n += rand() % 3; if(rand() % 5 == 0) n++; for(size_t i = 0; i < n; i++) { if(i > 0) s += ";"; s += QString::number(rand() % 10000 - 200); if(rand() % 3 == 0) {s += "."; s += QString::number(rand() % 10000);} } s += ")"; prev_test_type = 6; } else if(type == 17) { MathFunction *f = CALCULATOR->functions[rand() % CALCULATOR->functions.size()]; if(rand() % 2) s = QString::fromStdString(f->referenceName() + "("); else s = QString::fromStdString(f->referenceName()); prev_test_type = 6; } else if(type == 18) { s = QString::fromStdString(CALCULATOR->variables[rand() % CALCULATOR->variables.size()]->referenceName()); prev_test_type = 7; } else if(type == 19) { s = QString::fromStdString(CALCULATOR->units[rand() % CALCULATOR->units.size()]->referenceName()); prev_test_type = 8; } else if(type == 20) { s = "("; prev_test_type = 2; } else if(type == 21) { s = ")"; prev_test_type = 2; } else if(type == 22) { s = "+/-"; prev_test_type = 9; } int t = 1; /*if(type >= 23) { expressionEdit->clear(); prev_test_type = 10; } else */if(type == 24 && rand() % 3 == 0) { toAction_t->animateClick(); t = 200; prev_test_type = 9; } else if(type >= 23) { if(!expressionEdit->toPlainText().startsWith("/")) { std::cerr << "CALCULATE: " << expressionEdit->toPlainText().toStdString() << std::endl; calculate(); if(QDateTime::currentMSecsSinceEpoch() > prev_test_time + 5000) { std::cout << "ABORTED? " << expressionEdit->toPlainText().toStdString() << std::endl; qApp->closeAllWindows(); return; } if(settings->v_expression.size() > 100) historyView->editClear(); toAction_t->animateClick(); t = 200; } prev_test_type = 10; } else { if(expressionEdit->document()->isEmpty() && s == "/") { testTimeout(); return; } std::cerr << (expressionEdit->toPlainText() + s).toStdString() << std::endl; expressionEdit->textCursor().insertText(s); //t = pow(2, (rand() % 6) + 1); } testTimer->setInterval(t); prev_test_time = QDateTime::currentMSecsSinceEpoch() + t; } void QalculateWindow::fixSplitterPos() { QList sizes = ehSplitter->sizes(); if(sizes[1] > sizes[0]) { QTimer *timer = new QTimer(); timer->setSingleShot(true); connect(timer, SIGNAL(timeout()), this, SLOT(onAppFontTimer())); timer->start(1); int p = sizes[1] + 2; sizes[1] = sizes[0] - 2; sizes[0] = p; ehSplitter->setSizes(sizes); } } void QalculateWindow::initializeFunctionsMenu() { if(functionsMenu->isEmpty()) updateFunctionsMenu(); } void QalculateWindow::initializeVariablesMenu() { if(variablesMenu->isEmpty()) updateVariablesMenu(); } void QalculateWindow::initializeUnitsMenu() { if(unitsMenu->isEmpty()) updateUnitsMenu(); } void QalculateWindow::onShowStatusBarChanged() { if(settings->show_statusbar) statusBar()->show(); else statusBar()->hide(); } void QalculateWindow::onExpressionPositionChanged() { if(ehSplitter->indexOf(expressionEdit) == (settings->expression_pos == 0 ? 0 : 1)) return; QList sizes = ehSplitter->sizes(); historyView->setParent(NULL); expressionEdit->setParent(NULL); ehSplitter->insertWidget(settings->expression_pos == 0 ? 1 : 0, historyView); ehSplitter->insertWidget(settings->expression_pos == 0 ? 0 : 1, expressionEdit); ehSplitter->setStretchFactor(0, settings->expression_pos == 0 ? 0 : 1); ehSplitter->setStretchFactor(1, settings->expression_pos == 0 ? 1 : 0); int p = sizes[1]; sizes[1] = sizes[0]; sizes[0] = p; ehSplitter->setSizes(sizes); expressionEdit->setFocus(); historyView->setReversed(settings->expression_pos != 0); historyView->reloadHistory(); if(settings->expression_pos == 0) historyView->moveCursor(QTextCursor::Start); else historyView->moveCursor(QTextCursor::End); } #define STATUS_SPACE if(b) str += "  "; else b = true; void QalculateWindow::updateStatusText() { QString str = ""; bool b = false; if(settings->evalops.approximation == APPROXIMATION_EXACT) { STATUS_SPACE str += "EXACT"; } else if(settings->evalops.approximation == APPROXIMATION_APPROXIMATE) { STATUS_SPACE str += "APPROX"; } if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN) { STATUS_SPACE str += "RPN"; } if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_CHAIN) { STATUS_SPACE // Chain mode str += "CHN"; } switch(settings->evalops.parse_options.base) { case BASE_DECIMAL: { break; } case BASE_BINARY: { STATUS_SPACE str += "BIN"; break; } case BASE_OCTAL: { STATUS_SPACE str += "OCT"; break; } case 12: { STATUS_SPACE str += "DUO"; break; } case BASE_HEXADECIMAL: { STATUS_SPACE str += "HEX"; break; } case BASE_ROMAN_NUMERALS: { STATUS_SPACE str += "ROMAN"; break; } case BASE_BIJECTIVE_26: { STATUS_SPACE str += "B26"; break; } case BASE_BINARY_DECIMAL: { STATUS_SPACE str += "BCD"; break; } case BASE_CUSTOM: { STATUS_SPACE str += QString::fromStdString(CALCULATOR->customInputBase().print(CALCULATOR->messagePrintOptions())); break; } case BASE_GOLDEN_RATIO: { STATUS_SPACE str += "φ"; break; } case BASE_SUPER_GOLDEN_RATIO: { STATUS_SPACE str += "ψ"; break; } case BASE_PI: { STATUS_SPACE str += "Ï€"; break; } case BASE_E: { STATUS_SPACE str += "e"; break; } case BASE_SQRT2: { STATUS_SPACE str += "√2"; break; } case BASE_UNICODE: { STATUS_SPACE str += "UNICODE"; break; } default: { STATUS_SPACE str += QString::number(settings->evalops.parse_options.base); break; } } switch (settings->evalops.parse_options.angle_unit) { case ANGLE_UNIT_DEGREES: { STATUS_SPACE str += "DEG"; break; } case ANGLE_UNIT_RADIANS: { STATUS_SPACE str += "RAD"; break; } case ANGLE_UNIT_GRADIANS: { STATUS_SPACE str += "GRA"; break; } default: {} } if(settings->evalops.parse_options.read_precision != DONT_READ_PRECISION) { STATUS_SPACE str += "PREC"; } if(!settings->evalops.parse_options.functions_enabled) { STATUS_SPACE str += ""; str += "FUNC"; str += ""; } if(!settings->evalops.parse_options.units_enabled) { STATUS_SPACE str += ""; str += "UNIT"; str += ""; } if(!settings->evalops.parse_options.variables_enabled) { STATUS_SPACE str += ""; str += "VAR"; str += ""; } if(!settings->evalops.allow_infinite) { STATUS_SPACE str += ""; str += "INF"; str += ""; } if(!settings->evalops.allow_complex) { STATUS_SPACE str += ""; str += "CPLX"; str += ""; } str += ""; statusLabelRight->setText(str); if(statusLabelRight->isVisible() && (settings->status_in_history || settings->status_in_statusbar)) expressionEdit->showCurrentStatus(); } void QalculateWindow::keypadPreferencesChanged() { if(preferencesDialog) { preferencesDialog->updateVariableUnits(); preferencesDialog->updateComplexForm(); preferencesDialog->updateIntervalDisplay(); preferencesDialog->updateIntervalCalculation(); preferencesDialog->updateConciseUncertaintyInput(); } } void QalculateWindow::updateKeypadTitle() { QString str = tr("Keypad") + " ("; if(settings->keypad_type == KEYPAD_GENERAL) str += tr("General"); else if(settings->keypad_type == KEYPAD_PROGRAMMING) str += tr("Programming"); else if(settings->keypad_type == KEYPAD_ALGEBRA) str += tr("Algebra"); else if(settings->keypad_type == KEYPAD_CUSTOM) str += tr("Custom"); else if(settings->keypad_type == KEYPAD_NUMBERPAD) str += tr("Number Pad"); str += ")"; keypadDock->setWindowTitle(str); } void QalculateWindow::showKeypadContextMenu(const QPoint &pos) { QPoint p = keypadDock->mapToGlobal(pos); if(p.y() < keypad->mapToGlobal(QPoint(0, 0)).y()) keypadAction_t->menu()->popup(p); } void QalculateWindow::showToolbarContextMenu(const QPoint &pos) { QWidget *w = tb->childAt(pos); if(w == storeAction_t || w == functionsAction_t || w == unitsAction_t) return; if(!tmenu) { tmenu = new QMenu(this); QActionGroup *group = new QActionGroup(this); QAction *action = tmenu->addAction(tr("Icons only"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonIconOnly); action->setData(Qt::ToolButtonIconOnly); group->addAction(action); action = tmenu->addAction(tr("Text only"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextOnly); action->setData(Qt::ToolButtonTextOnly); group->addAction(action); action = tmenu->addAction(tr("Text beside icons"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextBesideIcon); action->setData(Qt::ToolButtonTextBesideIcon); group->addAction(action); action = tmenu->addAction(tr("Text under icons"), this, SLOT(setToolbarStyle())); action->setCheckable(true); action->setChecked(tb->toolButtonStyle() == Qt::ToolButtonTextUnderIcon); action->setData(Qt::ToolButtonTextUnderIcon); group->addAction(action); tmenu->addSeparator(); tmenu->addAction(tbAction); } tmenu->popup(tb->mapToGlobal(pos)); } void QalculateWindow::showBasesContextMenu(const QPoint &pos) { if(((QLabel*) sender())->text().isEmpty()) return; if(!basesMenu) { basesMenu = new QMenu(this); copyBasesAction = basesMenu->addAction(tr("Copy"), this, SLOT(copyBases())); } copyBasesAction->setData(QVariant::fromValue((void*) sender())); basesMenu->popup(((QWidget*) sender())->mapToGlobal(pos)); } void QalculateWindow::copyBases() { QLabel *label = (QLabel*) copyBasesAction->data().value(); QApplication::clipboard()->setText(label->hasSelectedText() ? label->selectedText() : (label == binEdit ? QString::fromStdString(result_bin) : label->text())); } void QalculateWindow::setToolbarStyle() { QAction *action = qobject_cast(sender()); settings->toolbar_style = action->data().toInt(); tb->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); modeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); toAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); storeAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); functionsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); unitsAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); menuAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); keypadAction_t->setToolButtonStyle((Qt::ToolButtonStyle) settings->toolbar_style); } void QalculateWindow::loadShortcuts() { if(plotAction_t) plotAction_t->setToolTip(tr("Plot Functions/Data")); storeAction_t->setToolTip(tr("Store") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); unitsAction_t->setToolTip(tr("Units") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); functionsAction_t->setToolTip(tr("Functions") + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); basesAction->setToolTip(tr("Number Bases")); toAction_t->setToolTip(tr("Convert") + "

" + tr("Middle-click: %1").arg(tr("Conversion operator"))); menuAction_t->setToolTip(tr("Menu")); modeAction_t->setToolTip(tr("Mode")); rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up")); rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down")); rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack")); rpnDeleteAction->setToolTip(tr("Delete the top or selected value")); rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation")); rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack")); rpnClearAction->setToolTip(tr("Clear the RPN stack")); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { keyboardShortcutAdded(settings->keyboard_shortcuts[i]); } } void QalculateWindow::keyboardShortcutRemoved(keyboard_shortcut *ks) { if(ks->type[0] == SHORTCUT_TYPE_COMPLETE && ks->key == "Tab") { expressionEdit->enableTabCompletion(false); return; } if(!ks->action) return; if(ks->new_action) { removeAction(ks->action); ks->action->deleteLater(); return; } QList shortcuts = ks->action->shortcuts(); shortcuts.removeAll(QKeySequence::fromString(ks->key)); ks->action->setShortcuts(shortcuts); if(ks->type[0] == SHORTCUT_TYPE_PLOT && plotAction_t) { plotAction_t->setToolTip(tr("Plot Functions/Data") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_STORE) { storeAction_t->setToolTip(tr("Store") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_UNITS) { unitsAction_t->setToolTip(tr("Units") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_FUNCTIONS) { functionsAction_t->setToolTip(tr("Functions") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_NUMBER_BASES) { basesAction->setToolTip(tr("Number Bases") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_CONVERT) { toAction_t->setToolTip(tr("Convert") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))) + "

" + tr("Middle-click: %1").arg(tr("Conversion operator"))); } else if(ks->type[0] == SHORTCUT_TYPE_MODE) { modeAction_t->setToolTip(tr("Mode") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_MENU) { menuAction_t->setToolTip(tr("Menu") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_UP) { rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DOWN) { rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_SWAP) { rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DELETE) { rpnDeleteAction->setToolTip(tr("Delete the top or selected value") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_LASTX) { rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_COPY) { rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_CLEAR) { rpnClearAction->setToolTip(tr("Clear the RPN stack") + (shortcuts.isEmpty() ? QString() : QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)))); } } void QalculateWindow::keyboardShortcutAdded(keyboard_shortcut *ks) { if(ks->type.size() == 1 && ks->type[0] == SHORTCUT_TYPE_COMPLETE && ks->key == "Tab") { expressionEdit->enableTabCompletion(true); ks->new_action = false; return; } QAction *action = NULL; if(ks->type.size() == 1) { switch(ks->type[0]) { case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {action = functionsAction; break;} case SHORTCUT_TYPE_MANAGE_VARIABLES: {action = variablesAction; break;} case SHORTCUT_TYPE_MANAGE_UNITS: {action = unitsAction; break;} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {action = datasetsAction; break;} case SHORTCUT_TYPE_FLOATING_POINT: {action = fpAction; break;} case SHORTCUT_TYPE_CALENDARS: {action = calendarsAction; break;} case SHORTCUT_TYPE_PERIODIC_TABLE: {action = periodicTableAction; break;} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {action = percentageAction; break;} case SHORTCUT_TYPE_NUMBER_BASES: {action = basesAction; break;} case SHORTCUT_TYPE_RPN_MODE: {action = rpnAction; break;} case SHORTCUT_TYPE_DEGREES: {action = degAction; break;} case SHORTCUT_TYPE_RADIANS: {action = radAction; break;} case SHORTCUT_TYPE_GRADIANS: {action = graAction; break;} case SHORTCUT_TYPE_NORMAL_NOTATION: {action = normalAction; break;} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {action = sciAction; break;} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {action = engAction; break;} case SHORTCUT_TYPE_SIMPLE_NOTATION: {action = simpleAction; break;} case SHORTCUT_TYPE_CHAIN_MODE: {action = chainAction; break;} case SHORTCUT_TYPE_KEYPAD: {action = keypadAction; break;} case SHORTCUT_TYPE_GENERAL_KEYPAD: {action = gKeypadAction; break;} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {action = pKeypadAction; break;} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {action = xKeypadAction; break;} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {action = cKeypadAction; break;} case SHORTCUT_TYPE_NEW_VARIABLE: {action = newVariableAction; break;} case SHORTCUT_TYPE_NEW_FUNCTION: {action = newFunctionAction; break;} case SHORTCUT_TYPE_PLOT: {action = plotAction; break;} case SHORTCUT_TYPE_UPDATE_EXRATES: {action = exratesAction; break;} case SHORTCUT_TYPE_HISTORY_SEARCH: {action = historyView->findAction; break;} case SHORTCUT_TYPE_HELP: {action = helpAction; break;} case SHORTCUT_TYPE_QUIT: {action = quitAction; break;} case SHORTCUT_TYPE_RPN_UP: {action = rpnUpAction; break;} case SHORTCUT_TYPE_RPN_DOWN: {action = rpnDownAction; break;} case SHORTCUT_TYPE_RPN_SWAP: {action = rpnSwapAction; break;} case SHORTCUT_TYPE_RPN_LASTX: {action = rpnLastxAction; break;} case SHORTCUT_TYPE_RPN_COPY: {action = rpnCopyAction; break;} case SHORTCUT_TYPE_RPN_DELETE: {action = rpnDeleteAction; break;} case SHORTCUT_TYPE_RPN_CLEAR: {action = rpnClearAction; break;} default: {} } } if(action) { ks->new_action = false; QList shortcuts = action->shortcuts(); shortcuts << QKeySequence::fromString(ks->key); addAction(action); action->setShortcuts(shortcuts); if(ks->type[0] == SHORTCUT_TYPE_PLOT) { if(plotAction_t) plotAction_t->setToolTip(tr("Plot Functions/Data") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_UNITS) { unitsAction_t->setToolTip(tr("Units") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_MANAGE_FUNCTIONS) { functionsAction_t->setToolTip(tr("Functions") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } else if(ks->type[0] == SHORTCUT_TYPE_NUMBER_BASES) { basesAction->setToolTip(tr("Number Bases") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_UP) { rpnUpAction->setToolTip(tr("Rotate the stack or move the selected register up") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DOWN) { rpnDownAction->setToolTip(tr("Rotate the stack or move the selected register down") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_SWAP) { rpnSwapAction->setToolTip(tr("Swap the top two values or move the selected value to the top of the stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_DELETE) { rpnDeleteAction->setToolTip(tr("Delete the top or selected value") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_LASTX) { rpnLastxAction->setToolTip(tr("Enter the top value from before the last numeric operation") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_COPY) { rpnCopyAction->setToolTip(tr("Copy the selected or top value to the top of the stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_RPN_CLEAR) { rpnClearAction->setToolTip(tr("Clear the RPN stack") + QStringLiteral(" (%1)").arg(shortcuts[0].toString(QKeySequence::NativeText))); } } else { if(ks->type[0] == SHORTCUT_TYPE_MODE) { modeAction_t->setToolTip(tr("Mode") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_MENU) { menuAction_t->setToolTip(tr("Menu") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); } else if(ks->type[0] == SHORTCUT_TYPE_STORE) { storeAction_t->setToolTip(tr("Store") + QStringLiteral("(%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText)) + "

" + tr("Right-click/long press: %1").arg(tr("Open menu"))); } if(ks->type.size() == 1 && ks->type[0] == SHORTCUT_TYPE_CONVERT) { toAction_t->setToolTip(tr("Convert") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText))); toAction_t->setToolTip(tr("Convert") + QStringLiteral(" (%1)").arg(QKeySequence::fromString(ks->key).toString(QKeySequence::NativeText)) + "

" + tr("Middle-click: %1").arg(tr("Conversion operator"))); } ks->new_action = true; action = new QAction(this); action->setShortcut(ks->key); action->setData(QVariant::fromValue((void*) ks)); addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(shortcutActivated())); } ks->action = action; } void QalculateWindow::shortcutActivated() { keyboard_shortcut *ks = (keyboard_shortcut*) qobject_cast(sender())->data().value(); for(size_t i = 0; i < ks->type.size(); i++) { triggerShortcut(ks->type[i], ks->value[i]); } } void QalculateWindow::shortcutClicked(int type, const QString &value) { triggerShortcut((shortcut_type) type, value.toStdString()); } bool contains_prefix(const MathStructure &m) { if(m.isUnit() && (m.prefix() || m.unit()->subtype() == SUBTYPE_COMPOSITE_UNIT)) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_prefix(m[i])) return true; } return false; } void QalculateWindow::triggerShortcut(int type, const std::string &value) { switch(type) { case SHORTCUT_TYPE_NEGATE: { negate(); break; } case SHORTCUT_TYPE_INVERT: { onFunctionClicked(CALCULATOR->getActiveFunction("inv")); break; } case SHORTCUT_TYPE_APPROXIMATE: { approximateResult(); break; } case SHORTCUT_TYPE_TOGGLE_FRACTION: { toggleResultFraction(); break; } case SHORTCUT_TYPE_MODE: { modeAction_t->showMenu(); break; } case SHORTCUT_TYPE_FUNCTIONS_MENU: { functionsAction_t->showMenu(); break; } case SHORTCUT_TYPE_UNITS_MENU: { unitsAction_t->showMenu(); break; } case SHORTCUT_TYPE_VARIABLES_MENU: { storeAction_t->showMenu(); break; } case SHORTCUT_TYPE_MENU: { menuAction_t->showMenu(); break; } case SHORTCUT_TYPE_FUNCTION: { onFunctionClicked(CALCULATOR->getActiveFunction(value)); break; } case SHORTCUT_TYPE_FUNCTION_WITH_DIALOG: { insertFunction(CALCULATOR->getActiveFunction(value), this); break; } case SHORTCUT_TYPE_VARIABLE: { onVariableClicked(CALCULATOR->getActiveVariable(value)); break; } case SHORTCUT_TYPE_UNIT: { Unit *u = CALCULATOR->getActiveUnit(value); if(!u) { CALCULATOR->clearMessages(); CompositeUnit cu("", "", "", value); if(CALCULATOR->message()) { settings->displayMessages(this); } else { onUnitClicked(&cu); } } else { onUnitClicked(u); } break; } case SHORTCUT_TYPE_OPERATOR: { onOperatorClicked(QString::fromStdString(value)); break; } case SHORTCUT_TYPE_TEXT: { onSymbolClicked(QString::fromStdString(value)); break; } case SHORTCUT_TYPE_DATE: { expressionEdit->insertDate(); break; } case SHORTCUT_TYPE_MATRIX: { expressionEdit->insertMatrix(); break; } case SHORTCUT_TYPE_SMART_PARENTHESES: { expressionEdit->smartParentheses(); break; } case SHORTCUT_TYPE_CONVERT_TO: { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; executeCommand(COMMAND_CONVERT_STRING, true, CALCULATOR->unlocalizeExpression(value, pa)); break; } case SHORTCUT_TYPE_CONVERT: { onToActivated(false); break; } case SHORTCUT_TYPE_OPTIMAL_UNIT: { executeCommand(COMMAND_CONVERT_OPTIMAL); break; } case SHORTCUT_TYPE_BASE_UNITS: { executeCommand(COMMAND_CONVERT_BASE); break; } case SHORTCUT_TYPE_OPTIMAL_PREFIX: { to_prefix = 0; to_form = TO_FORM_OFF; bool b_use_unit_prefixes = settings->printops.use_unit_prefixes; bool b_use_prefixes_for_all_units = settings->printops.use_prefixes_for_all_units; if((!expressionEdit->expressionHasChanged() || (settings->rpn_mode && CALCULATOR->RPNStackSize() != 0)) && contains_prefix(*mstruct)) { mstruct->unformat(settings->evalops); executeCommand(COMMAND_CALCULATE, false); } settings->printops.use_unit_prefixes = true; settings->printops.use_prefixes_for_all_units = true; setResult(NULL, true, false, true); settings->printops.use_unit_prefixes = b_use_unit_prefixes; settings->printops.use_prefixes_for_all_units = b_use_prefixes_for_all_units; break; } case SHORTCUT_TYPE_TO_NUMBER_BASE: { int save_base = settings->printops.base; Number save_nbase = CALCULATOR->customOutputBase(); to_base = 0; to_bits = 0; to_duo_syms = false; Number nbase; base_from_string(value, settings->printops.base, nbase); CALCULATOR->setCustomOutputBase(nbase); resultFormatUpdated(); settings->printops.base = save_base; CALCULATOR->setCustomOutputBase(save_nbase); break; } case SHORTCUT_TYPE_FACTORIZE: { executeCommand(COMMAND_FACTORIZE); break; } case SHORTCUT_TYPE_EXPAND: { executeCommand(COMMAND_EXPAND); break; } case SHORTCUT_TYPE_PARTIAL_FRACTIONS: { executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); break; } case SHORTCUT_TYPE_INPUT_BASE: { Number nbase; base_from_string(value, settings->evalops.parse_options.base, nbase, true); QAction *action = find_child_data(this, "group_inbase", settings->evalops.parse_options.base); if(!action) action = customInputBaseAction; if(action) action->setChecked(true); if(settings->evalops.parse_options.base == BASE_CUSTOM) CALCULATOR->setCustomInputBase(nbase); if(action == customInputBaseAction) customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? CALCULATOR->customInputBase().intValue() : settings->evalops.parse_options.base); expressionFormatUpdated(false); keypad->updateBase(); break; } case SHORTCUT_TYPE_OUTPUT_BASE: { Number nbase; base_from_string(value, settings->printops.base, nbase, false); to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", settings->printops.base); if(!action) action = customOutputBaseAction; if(action) action->setChecked(true); if(settings->printops.base == BASE_CUSTOM) CALCULATOR->setCustomOutputBase(nbase); if(action == customOutputBaseAction) customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? CALCULATOR->customOutputBase().intValue() : settings->printops.base); resultFormatUpdated(); keypad->updateBase(); break; } case SHORTCUT_TYPE_HISTORY_SEARCH: { historyView->findAction->trigger(); break; } case SHORTCUT_TYPE_HISTORY_CLEAR: { historyView->editClear(); expressionEdit->clearHistory(); break; } case SHORTCUT_TYPE_MEMORY_CLEAR: { onMCClicked(); break; } case SHORTCUT_TYPE_MEMORY_RECALL: { onMRClicked(); break; } case SHORTCUT_TYPE_MEMORY_STORE: { onMSClicked(); break; } case SHORTCUT_TYPE_MEMORY_ADD: { onMPlusClicked(); break; } case SHORTCUT_TYPE_MEMORY_SUBTRACT: { onMMinusClicked(); break; } case SHORTCUT_TYPE_COPY_RESULT: { if(settings->v_result.empty()) break; int v = s2i(value); if(v < 0 || v > 8) v = 0; bool b_ascii = (v != 1 && v != 4 && v != 6 && (v != 0 || settings->copy_ascii)); bool b_nounits = (v == 3 || v == 8 || (v == 0 && settings->copy_ascii && settings->copy_ascii_without_units)); QString str_ascii, str_html; if(v > 3) { if(settings->history_expression_type == 1 && !settings->v_expression[settings->v_expression.size() - 1].empty()) { if(b_ascii) { str_ascii += QString::fromStdString(unformat(settings->v_expression[settings->v_expression.size() - 1])); } else { str_ascii += QString::fromStdString(settings->v_expression[settings->v_expression.size() - 1]); if(v < 6) b_ascii = true; else str_html += QString::fromStdString(settings->v_expression[settings->v_expression.size() - 1]); } } else { if(b_ascii) { str_ascii += QString::fromStdString(unformat(unhtmlize(settings->v_parse[settings->v_parse.size() - 1], true))); } else { str_html += QString::fromStdString(uncolorize(settings->v_parse[settings->v_parse.size() - 1])); str_ascii += QString::fromStdString(unhtmlize(settings->v_parse[settings->v_parse.size() - 1])); } } } if(v <= 3 || v >= 6) { if(b_ascii) { if(v > 3) str_ascii += " = "; std::string str = settings->v_result[settings->v_result.size() - 1][0]; if(b_nounits) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } str_ascii += QString::fromStdString(unformat(unhtmlize(str, true))).trimmed(); } else { if(v > 3) { if(settings->v_exact[settings->v_exact.size() - 1][0]) { str_html += " = "; str_ascii += " = "; } else { str_html += " " SIGN_ALMOST_EQUAL " "; str_ascii += " " SIGN_ALMOST_EQUAL " "; } } str_html += QString::fromStdString(uncolorize(settings->v_result[settings->v_result.size() - 1][0])); str_ascii += QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0])); } } if(b_ascii) { QApplication::clipboard()->setText(str_ascii); } else { QMimeData *qm = new QMimeData(); qm->setHtml(str_html); qm->setText(str_ascii); if(v <= 3 || v >= 6) qm->setObjectName("history_result"); else qm->setObjectName("history_expression"); QApplication::clipboard()->setMimeData(qm); } break; } case SHORTCUT_TYPE_INSERT_RESULT: { if(!settings->v_result.empty()) { expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(unhtmlize(settings->v_result[settings->v_result.size() - 1][0]))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } break; } case SHORTCUT_TYPE_ALWAYS_ON_TOP: { settings->always_on_top = !settings->always_on_top; onAlwaysOnTopChanged(); break; } case SHORTCUT_TYPE_COMPLETE: { expressionEdit->completeOrActivateFirst(); break; } case SHORTCUT_TYPE_EXPRESSION_CLEAR: { expressionEdit->clear(); break; } case SHORTCUT_TYPE_EXPRESSION_DELETE: { expressionEdit->textCursor().deleteChar(); break; } case SHORTCUT_TYPE_EXPRESSION_BACKSPACE: { expressionEdit->textCursor().deletePreviousChar(); break; } case SHORTCUT_TYPE_EXPRESSION_START: { expressionEdit->moveCursor(QTextCursor::Start); break; } case SHORTCUT_TYPE_EXPRESSION_END: { expressionEdit->moveCursor(QTextCursor::End); break; } case SHORTCUT_TYPE_EXPRESSION_RIGHT: { expressionEdit->moveCursor(QTextCursor::NextCharacter); break; } case SHORTCUT_TYPE_EXPRESSION_LEFT: { expressionEdit->moveCursor(QTextCursor::PreviousCharacter); break; } case SHORTCUT_TYPE_EXPRESSION_UP: { expressionEdit->moveCursor(QTextCursor::PreviousRow); break; } case SHORTCUT_TYPE_EXPRESSION_DOWN: { expressionEdit->moveCursor(QTextCursor::NextRow); break; } case SHORTCUT_TYPE_EXPRESSION_UNDO: { expressionEdit->editUndo(); break; } case SHORTCUT_TYPE_EXPRESSION_REDO: { expressionEdit->editRedo(); break; } case SHORTCUT_TYPE_CALCULATE_EXPRESSION: { calculate(); break; } case SHORTCUT_TYPE_EXPRESSION_HISTORY_NEXT: { QKeyEvent e(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier); expressionEdit->keyPressEvent(&e); break; } case SHORTCUT_TYPE_EXPRESSION_HISTORY_PREVIOUS: { QKeyEvent e(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier); expressionEdit->keyPressEvent(&e); break; } case SHORTCUT_TYPE_PRECISION: { int v = s2i(value); if(settings->previous_precision > 0 && CALCULATOR->getPrecision() == v) { v = settings->previous_precision; settings->previous_precision = 0; } else { settings->previous_precision = CALCULATOR->getPrecision(); } QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(v); w->blockSignals(false); } CALCULATOR->setPrecision(v); expressionCalculationUpdated(); break; } case SHORTCUT_TYPE_MAX_DECIMALS: { int v = s2i(value); QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) w->blockSignals(true); if(v < 0 || (settings->printops.use_max_decimals && settings->printops.max_decimals == v)) { if(w) w->setValue(-1); settings->printops.use_max_decimals = false; settings->printops.max_decimals = -1; } else { if(w) w->setValue(v); settings->printops.use_max_decimals = true; settings->printops.max_decimals = v; } if(w) w->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MIN_DECIMALS: { int v = s2i(value); QSpinBox *w = findChild("spinbox_mindecimals"); if(w) w->blockSignals(true); if(v < 0 || (settings->printops.use_min_decimals && settings->printops.min_decimals == v)) { if(w) w->setValue(0); settings->printops.use_min_decimals = false; settings->printops.min_decimals = 0; } else { if(w) w->setValue(v); settings->printops.use_min_decimals = true; settings->printops.min_decimals = v; } if(w) w->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MINMAX_DECIMALS: { int v = s2i(value); QSpinBox *w1 = findChild("spinbox_mindecimals"); QSpinBox *w2 = findChild("spinbox_maxdecimals"); if(w1) w1->blockSignals(true); if(w2) w2->blockSignals(true); if(v < 0 || (settings->printops.use_min_decimals && settings->printops.min_decimals == v && settings->printops.use_max_decimals && settings->printops.max_decimals == v)) { if(w1) w1->setValue(0); if(w2) w2->setValue(-1); settings->printops.use_min_decimals = false; settings->printops.min_decimals = 0; settings->printops.use_max_decimals = false; settings->printops.max_decimals = -1; } else { if(w1) w1->setValue(v); if(w2) w2->setValue(v); settings->printops.use_min_decimals = true; settings->printops.min_decimals = v; settings->printops.use_max_decimals = true; settings->printops.max_decimals = v; } if(w1) w1->blockSignals(false); if(w2) w2->blockSignals(false); resultFormatUpdated(true); break; } case SHORTCUT_TYPE_MANAGE_FUNCTIONS: {functionsAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_VARIABLES: {variablesAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_UNITS: {unitsAction->trigger(); break;} case SHORTCUT_TYPE_MANAGE_DATA_SETS: {datasetsAction->trigger(); break;} case SHORTCUT_TYPE_FLOATING_POINT: {fpAction->trigger(); break;} case SHORTCUT_TYPE_CALENDARS: {calendarsAction->trigger(); break;} case SHORTCUT_TYPE_PERIODIC_TABLE: {periodicTableAction->trigger(); break;} case SHORTCUT_TYPE_PERCENTAGE_TOOL: {percentageAction->trigger(); break;} case SHORTCUT_TYPE_NUMBER_BASES: {basesAction->trigger(); break;} case SHORTCUT_TYPE_RPN_MODE: {rpnAction->trigger(); break;} case SHORTCUT_TYPE_DEGREES: {degAction->trigger(); break;} case SHORTCUT_TYPE_RADIANS: {radAction->trigger(); break;} case SHORTCUT_TYPE_GRADIANS: {graAction->trigger(); break;} case SHORTCUT_TYPE_NORMAL_NOTATION: {normalAction->trigger(); break;} case SHORTCUT_TYPE_SCIENTIFIC_NOTATION: {sciAction->trigger(); break;} case SHORTCUT_TYPE_ENGINEERING_NOTATION: {engAction->trigger(); break;} case SHORTCUT_TYPE_SIMPLE_NOTATION: {simpleAction->trigger(); break;} case SHORTCUT_TYPE_CHAIN_MODE: {chainAction->trigger(); break;} case SHORTCUT_TYPE_KEYPAD: {keypadAction->trigger(); break;} case SHORTCUT_TYPE_GENERAL_KEYPAD: {gKeypadAction->trigger(); break;} case SHORTCUT_TYPE_PROGRAMMING_KEYPAD: {pKeypadAction->trigger(); break;} case SHORTCUT_TYPE_ALGEBRA_KEYPAD: {xKeypadAction->trigger(); break;} case SHORTCUT_TYPE_CUSTOM_KEYPAD: {cKeypadAction->trigger(); break;} case SHORTCUT_TYPE_STORE: {onStoreActivated(); break;} case SHORTCUT_TYPE_NEW_VARIABLE: {newVariableAction->trigger(); break;} case SHORTCUT_TYPE_NEW_FUNCTION: {newFunctionAction->trigger(); break;} case SHORTCUT_TYPE_PLOT: {plotAction->trigger(); break;} case SHORTCUT_TYPE_UPDATE_EXRATES: {exratesAction->trigger(); break;} case SHORTCUT_TYPE_HELP: {helpAction->trigger(); break;} case SHORTCUT_TYPE_QUIT: {quitAction->trigger(); break;} case SHORTCUT_TYPE_RPN_UP: {rpnUpAction->trigger(); break;} case SHORTCUT_TYPE_RPN_DOWN: {rpnDownAction->trigger(); break;} case SHORTCUT_TYPE_RPN_SWAP: {rpnSwapAction->trigger(); break;} case SHORTCUT_TYPE_RPN_LASTX: {rpnLastxAction->trigger(); break;} case SHORTCUT_TYPE_RPN_COPY: {rpnCopyAction->trigger(); break;} case SHORTCUT_TYPE_RPN_DELETE: {rpnDeleteAction->trigger(); break;} case SHORTCUT_TYPE_RPN_CLEAR: {rpnClearAction->trigger(); break;} } } bool sort_compare_item(ExpressionItem *o1, ExpressionItem *o2) { return o1->title(true, settings->printops.use_unicode_signs) < o2->title(true, settings->printops.use_unicode_signs); } void QalculateWindow::updateAngleUnitsMenu() { QActionGroup *group = findChild("group_angleunit"); if(!group) return; QMenu *menu = angleMenu; QAction *action = NULL; menu->clear(); Unit *u_rad = CALCULATOR->getRadUnit(); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->baseUnit() == u_rad) { Unit *u = CALCULATOR->units[i]; if(u != u_rad && !u->isHidden() && u->isActive() && u->baseExponent() == 1 && !u->hasName("gra") && !u->hasName("deg")) { action = menu->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) menu)), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_" + QString::fromStdString(u->referenceName())); action->setData(ANGLE_UNIT_CUSTOM); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && CALCULATOR->customAngleUnit() == u) action->setChecked(true); } } } action = menu->addAction(tr("None"), this, SLOT(angleUnitActivated())); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_none"); action->setData(ANGLE_UNIT_NONE); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_NONE) action->setChecked(true); action = menu->addAction(tr("Other")); action->setCheckable(true); group->addAction(action); action->setObjectName("action_angle_unit_other"); action->setVisible(false); action->setData(-1); if(!group->checkedAction()) action->setChecked(true); } struct tree_struct_m { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; std::vector objects; tree_struct_m *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct_m &s1) const { return string_is_less(item, s1.item); } }; void QalculateWindow::updateFunctionsMenu() { functionsMenu->clear(); functionsMenu->addAction(tr("New Function…"), this, SLOT(newFunction())); functionsMenu->addSeparator(); for(size_t i = 0; i < settings->favourite_functions.size();) { if(!CALCULATOR->stillHasFunction(settings->favourite_functions[i]) || !settings->favourite_functions[i]->isActive()) { settings->favourite_functions.erase(settings->favourite_functions.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_functions.size();) { if(!CALCULATOR->stillHasFunction(settings->recent_functions[i]) || !settings->recent_functions[i]->isActive()) { settings->recent_functions.erase(settings->recent_functions.begin() + i); } else { i++; } } favouriteFunctionActions.clear(); recentFunctionActions.clear(); if(settings->show_all_functions) { tree_struct_m function_cats; std::vector user_functions; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; MathFunction *f = NULL; function_cats.items.clear(); function_cats.objects.clear(); function_cats.parent = NULL; user_functions.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { if(CALCULATOR->functions[i]->isActive() && !CALCULATOR->functions[i]->isHidden()) { if(CALCULATOR->functions[i]->isLocal() && !CALCULATOR->functions[i]->isBuiltin() && !CALCULATOR->functions[i]->isHidden()) { b = false; for(size_t i3 = 0; i3 < user_functions.size(); i3++) { f = user_functions[i3]; if(string_is_less(CALCULATOR->functions[i]->title(true, settings->printops.use_unicode_signs), f->title(true, settings->printops.use_unicode_signs))) { b = true; user_functions.insert(user_functions.begin() + i3, CALCULATOR->functions[i]); break; } } if(!b) user_functions.push_back(CALCULATOR->functions[i]); } tree_struct_m *item = &function_cats; if(!CALCULATOR->functions[i]->category().empty()) { cat = CALCULATOR->functions[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { f = (MathFunction*) item->objects[i3]; if(string_is_less(CALCULATOR->functions[i]->title(true, settings->printops.use_unicode_signs), f->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->functions[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->functions[i]); } } function_cats.sort();} favouriteFunctionsMenu = functionsMenu->addMenu(tr("Favorites")); recentFunctionsMenu = functionsMenu->addMenu(tr("Recent")); int first_index = 5; QMenu *sub = functionsMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; MathFunction *f; tree_struct_m *titem, *titem2; function_cats.rit = function_cats.items.rbegin(); if(function_cats.rit != function_cats.items.rend()) { titem = &*function_cats.rit; ++function_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_functions.empty()) { sub = functionsMenu->addMenu(tr("User functions")); for(size_t i = 0; i < user_functions.size(); i++) { action = sub->addAction(QString::fromStdString(user_functions[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) user_functions[i])); } first_index++; } functionsMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == functionsMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; for(size_t i = 0; i < titem->objects.size(); i++) { f = (MathFunction*) titem->objects[i]; action = sub->addAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < function_cats.objects.size(); i++) { f = (MathFunction*) function_cats.objects[i]; if(!f->isLocal()) { action = sub->addAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); } } functionsMenu->addSeparator(); } else { favouriteFunctionsMenu = functionsMenu; recentFunctionsMenu = functionsMenu; } QAction *action = functionsMenu->addAction(tr("Open dialog")); action->setCheckable(true); action->setChecked(settings->use_function_dialog); connect(action, SIGNAL(toggled(bool)), this, SLOT(useFunctionDialog(bool))); firstFunctionsMenuOptionAction = action; action = functionsMenu->addAction(tr("Show all functions")); action->setCheckable(true); action->setChecked(settings->show_all_functions); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllFunctions(bool))); updateRecentFunctions(); updateFavouriteFunctions(); } void QalculateWindow::useFunctionDialog(bool b) { settings->use_function_dialog = b; } void QalculateWindow::showAllFunctions(bool b) { settings->show_all_functions = b; updateFunctionsMenu(); } void QalculateWindow::updateFavouriteFunctions() { if(functionsMenu->isEmpty()) return; for(int i = 0; i < favouriteFunctionActions.size(); i++) { favouriteFunctionsMenu->removeAction(favouriteFunctionActions[i]); favouriteFunctionActions[i]->deleteLater(); } bool b_empty = settings->show_all_functions && favouriteFunctionActions.isEmpty(); favouriteFunctionActions.clear(); bool update_recent = false; if(!settings->favourite_functions.empty()) { std::sort(settings->favourite_functions.begin(), settings->favourite_functions.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_functions.size(); i++) { MathFunction *f = settings->favourite_functions[i]; if(!settings->show_all_functions) { for(size_t i2 = 0; i2 < settings->recent_functions.size(); i2++) { if(settings->recent_functions[i2] == f) { settings->recent_functions.erase(settings->recent_functions.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteFunctionsMenu); connect(action, SIGNAL(triggered()), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) f)); favouriteFunctionActions << action; } if(!settings->show_all_functions) { QAction *action = new QAction(favouriteFunctionsMenu); action->setSeparator(true); favouriteFunctionActions << action; } if(update_recent) updateRecentFunctions(); favouriteFunctionsMenu->insertActions(settings->show_all_functions ? NULL : (recentFunctionActions.isEmpty() ?firstFunctionsMenuOptionAction : recentFunctionActions.at(0)), favouriteFunctionActions); if(b_empty) { favouriteFunctionsMenu->hide(); favouriteFunctionsMenu->show(); favouriteFunctionsMenu->hide(); } } } void QalculateWindow::updateRecentFunctions() { if(functionsMenu->isEmpty()) return; for(int i = 0; i < recentFunctionActions.size(); i++) { recentFunctionsMenu->removeAction(recentFunctionActions[i]); recentFunctionActions[i]->deleteLater(); } bool b_empty = settings->show_all_functions && recentFunctionActions.isEmpty(); recentFunctionActions.clear(); if(!settings->recent_functions.empty()) { for(size_t i = 0; i < settings->recent_functions.size() && (i < 5 || settings->show_all_functions); i++) { QAction *action = new QAction(QString::fromStdString(settings->recent_functions[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentFunctionsMenu); connect(action, SIGNAL(triggered()), this, SLOT(functionActivated())); action->setData(QVariant::fromValue((void*) settings->recent_functions[i])); recentFunctionActions << action; } if(!settings->show_all_functions) { QAction *action = new QAction(recentFunctionsMenu); action->setSeparator(true); recentFunctionActions << action; } recentFunctionsMenu->insertActions(settings->show_all_functions ? NULL : firstFunctionsMenuOptionAction, recentFunctionActions); if(b_empty) { recentFunctionsMenu->hide(); recentFunctionsMenu->show(); recentFunctionsMenu->hide(); } } } void QalculateWindow::addToRecentFunctions(MathFunction *f) { if(!settings->show_all_functions) { for(size_t i = 0; i < settings->favourite_functions.size(); i++) { if(settings->favourite_functions[i] == f) return; } } for(size_t i = 0; i < settings->recent_functions.size(); i++) { if(settings->recent_functions[i] == f) { if(i == 0) return; settings->recent_functions.erase(settings->recent_functions.begin() + i); break; } } if(settings->recent_functions.size() > 10) settings->recent_functions.pop_back(); settings->recent_functions.insert(settings->recent_functions.begin(), f); updateRecentFunctions(); } void QalculateWindow::updateUnitsMenu() { unitsMenu->clear(); for(size_t i = 0; i < settings->favourite_units.size();) { if(!CALCULATOR->stillHasUnit(settings->favourite_units[i]) || !settings->favourite_units[i]->isActive()) { settings->favourite_units.erase(settings->favourite_units.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_units.size();) { if(!CALCULATOR->stillHasUnit(settings->recent_units[i]) || !settings->recent_units[i]->isActive()) { settings->recent_units.erase(settings->recent_units.begin() + i); } else { i++; } } favouriteUnitActions.clear(); recentUnitActions.clear(); if(settings->show_all_units) { tree_struct_m unit_cats; std::vector user_units; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; Unit *u = NULL; unit_cats.items.clear(); unit_cats.objects.clear(); unit_cats.parent = NULL; user_units.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->isActive() && (!CALCULATOR->units[i]->isHidden() || CALCULATOR->units[i]->isCurrency())) { if(CALCULATOR->units[i]->isLocal() && !CALCULATOR->units[i]->isBuiltin()) { b = false; for(size_t i3 = 0; i3 < user_units.size(); i3++) { u = user_units[i3]; if(string_is_less(CALCULATOR->units[i]->title(true, settings->printops.use_unicode_signs), u->title(true, settings->printops.use_unicode_signs))) { b = true; user_units.insert(user_units.begin() + i3, CALCULATOR->units[i]); break; } } if(!b) user_units.push_back(CALCULATOR->units[i]); } tree_struct_m *item = &unit_cats; if(!CALCULATOR->units[i]->category().empty()) { cat = CALCULATOR->units[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { u = (Unit*) item->objects[i3]; if(string_is_less(CALCULATOR->units[i]->title(true, settings->printops.use_unicode_signs), u->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->units[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->units[i]); } } unit_cats.sort();} favouriteUnitsMenu = unitsMenu->addMenu(tr("Favorites")); recentUnitsMenu = unitsMenu->addMenu(tr("Recent")); int first_index = 3; QMenu *sub = unitsMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; Unit *u; tree_struct_m *titem, *titem2; unit_cats.rit = unit_cats.items.rbegin(); if(unit_cats.rit != unit_cats.items.rend()) { titem = &*unit_cats.rit; ++unit_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_units.empty()) { sub = unitsMenu->addMenu(tr("User units")); for(size_t i = 0; i < user_units.size(); i++) { action = sub->addAction(QString::fromStdString(user_units[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) user_units[i])); } first_index++; } unitsMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == unitsMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; bool is_currencies = false; for(size_t i = 0; i < titem->objects.size(); i++) { u = (Unit*) titem->objects[i]; if(!is_currencies && u->isCurrency()) is_currencies = true; if(!u->isHidden()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } if(is_currencies) { sub = sub3->addMenu(tr("more")); connect(sub3, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); connect(sub, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); for(size_t i = 0; i < titem->objects.size(); i++) { u = (Unit*) titem->objects[i]; if(u->isHidden()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < unit_cats.objects.size(); i++) { u = (Unit*) unit_cats.objects[i]; if(!u->isLocal()) { action = sub->addAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(unitActivated())); action->setData(QVariant::fromValue((void*) u)); } } unitsMenu->addSeparator(); sub = unitsMenu->addMenu(tr("Prefixes")); int index = 0; Prefix *p = CALCULATOR->getPrefix(index); while(p) { QString str = QString::fromStdString(p->preferredDisplayName(false, true, false, false, &can_display_unicode_string_function, (void*) this).name); if(p->type() == PREFIX_DECIMAL) { str += " (10^"; str += QString::number(((DecimalPrefix*) p)->exponent()); str += ")"; } else if(p->type() == PREFIX_BINARY) { str += " (2^"; str += QString::number(((DecimalPrefix*) p)->exponent()); str += ")"; } action = sub->addAction(str, this, SLOT(prefixActivated())); action->setData(QVariant::fromValue((void*) p)); index++; p = CALCULATOR->getPrefix(index); } unitsMenu->addSeparator(); } else { favouriteUnitsMenu = unitsMenu; recentUnitsMenu = unitsMenu; } QAction *action = unitsMenu->addAction(tr("Show all units")); action->setCheckable(true); action->setChecked(settings->show_all_units); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllUnits(bool))); firstUnitsMenuOptionAction = action; updateRecentUnits(); updateFavouriteUnits(); updateAngleUnitsMenu(); } void QalculateWindow::addCurrencyFlagsToMenu() { QMenu *menu = qobject_cast(sender()); QList actions = menu->actions(); for(int i = 0; i < actions.count(); i++) { QAction *action = actions.at(i); Unit *u = (Unit*) action->data().value(); if(u && u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } } disconnect(menu, SIGNAL(aboutToShow()), this, SLOT(addCurrencyFlagsToMenu())); } void QalculateWindow::showAllUnits(bool b) { settings->show_all_units = b; updateUnitsMenu(); } void QalculateWindow::updateFavouriteUnits() { if(unitsMenu->isEmpty()) return; for(int i = 0; i < favouriteUnitActions.size(); i++) { favouriteUnitsMenu->removeAction(favouriteUnitActions[i]); favouriteUnitActions[i]->deleteLater(); } bool b_empty = settings->show_all_units && favouriteUnitActions.isEmpty(); favouriteUnitActions.clear(); bool update_recent = false; if(!settings->favourite_units.empty()) { std::sort(settings->favourite_units.begin(), settings->favourite_units.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_units.size(); i++) { Unit *u = settings->favourite_units[i]; if(!settings->show_all_units) { for(size_t i2 = 0; i2 < settings->recent_units.size(); i2++) { if(settings->recent_units[i2] == u) { settings->recent_units.erase(settings->recent_units.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteUnitsMenu); connect(action, SIGNAL(triggered()), this, SLOT(unitActivated())); if(u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } action->setData(QVariant::fromValue((void*) u)); favouriteUnitActions << action; } if(!settings->show_all_units) { QAction *action = new QAction(favouriteUnitsMenu); action->setSeparator(true); favouriteUnitActions << action; } if(update_recent) updateRecentUnits(); favouriteUnitsMenu->insertActions(settings->show_all_units ? NULL : (recentUnitActions.isEmpty() ? firstUnitsMenuOptionAction : recentUnitActions.at(0)), favouriteUnitActions); if(b_empty) { favouriteUnitsMenu->hide(); favouriteUnitsMenu->show(); favouriteUnitsMenu->hide(); } } } void QalculateWindow::updateRecentUnits() { if(unitsMenu->isEmpty()) return; for(int i = 0; i < recentUnitActions.size(); i++) { recentUnitsMenu->removeAction(recentUnitActions[i]); recentUnitActions[i]->deleteLater(); } bool b_empty = settings->show_all_units && recentUnitActions.isEmpty(); recentUnitActions.clear(); if(!settings->recent_units.empty()) { for(size_t i = 0; i < settings->recent_units.size() && (i < 5 || settings->show_all_units); i++) { Unit *u = settings->recent_units[i]; QAction *action = new QAction(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentUnitsMenu); connect(action, SIGNAL(triggered()), this, SLOT(unitActivated())); if(u->isCurrency() && QFile::exists(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))) { action->setIcon(QIcon(":/data/flags/" + QString::fromStdString(u->referenceName() + ".png"))); } action->setData(QVariant::fromValue((void*) u)); recentUnitActions << action; } if(!settings->show_all_units) { QAction *action = new QAction(recentUnitsMenu); action->setSeparator(true); recentUnitActions << action; } recentUnitsMenu->insertActions(settings->show_all_units ? NULL : firstUnitsMenuOptionAction, recentUnitActions); if(b_empty) { recentUnitsMenu->hide(); recentUnitsMenu->show(); recentUnitsMenu->hide(); } } } void QalculateWindow::addToRecentUnits(Unit *u) { if(!settings->show_all_units) { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) return; } } for(size_t i = 0; i < settings->recent_units.size(); i++) { if(settings->recent_units[i] == u) { if(i == 0) return; settings->recent_units.erase(settings->recent_units.begin() + i); break; } } if(settings->recent_units.size() > 10) settings->recent_units.pop_back(); settings->recent_units.insert(settings->recent_units.begin(), u); updateRecentUnits(); } void QalculateWindow::updateVariablesMenu() { variablesMenu->clear(); variablesMenu->addAction(variablesAction); variablesMenu->addSeparator(); for(size_t i = 0; i < settings->favourite_variables.size();) { if(!CALCULATOR->stillHasVariable(settings->favourite_variables[i]) || !settings->favourite_variables[i]->isActive()) { settings->favourite_variables.erase(settings->favourite_variables.begin() + i); } else { i++; } } for(size_t i = 0; i < settings->recent_variables.size();) { if(!CALCULATOR->stillHasVariable(settings->recent_variables[i]) || !settings->recent_variables[i]->isActive()) { settings->recent_variables.erase(settings->recent_variables.begin() + i); } else { i++; } } favouriteVariableActions.clear(); recentVariableActions.clear(); if(settings->show_all_variables) { tree_struct_m variable_cats; std::vector user_variables; {size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; Variable *v = NULL; variable_cats.items.clear(); variable_cats.objects.clear(); variable_cats.parent = NULL; user_variables.clear(); std::list::iterator it; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(CALCULATOR->variables[i]->isActive() && !CALCULATOR->variables[i]->isHidden()) { if(CALCULATOR->variables[i]->isLocal() && !CALCULATOR->variables[i]->isBuiltin()) { b = false; for(size_t i3 = 0; i3 < user_variables.size(); i3++) { v = user_variables[i3]; if(string_is_less(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs), v->title(true, settings->printops.use_unicode_signs))) { b = true; user_variables.insert(user_variables.begin() + i3, CALCULATOR->variables[i]); break; } } if(!b) user_variables.push_back(CALCULATOR->variables[i]); } tree_struct_m *item = &variable_cats; if(!CALCULATOR->variables[i]->category().empty()) { cat = CALCULATOR->variables[i]->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct_m cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } b = false; for(size_t i3 = 0; i3 < item->objects.size(); i3++) { v = (Variable*) item->objects[i3]; if(string_is_less(CALCULATOR->variables[i]->title(true, settings->printops.use_unicode_signs), v->title(true, settings->printops.use_unicode_signs))) { b = true; item->objects.insert(item->objects.begin() + i3, (void*) CALCULATOR->variables[i]); break; } } if(!b) item->objects.push_back((void*) CALCULATOR->variables[i]); } } variable_cats.sort();} favouriteVariablesMenu = variablesMenu->addMenu(tr("Favorites")); recentVariablesMenu = variablesMenu->addMenu(tr("Recent")); int first_index = 5; QMenu *sub = variablesMenu, *sub2, *sub3; QAction *action = NULL; sub2 = sub; Variable *v; tree_struct_m *titem, *titem2; variable_cats.rit = variable_cats.items.rbegin(); if(variable_cats.rit != variable_cats.items.rend()) { titem = &*variable_cats.rit; ++variable_cats.rit; titem->rit = titem->items.rbegin(); } else { titem = NULL; } std::stack menus; menus.push(sub); sub3 = sub; if(!user_variables.empty()) { sub = variablesMenu->addMenu(tr("User variables")); for(size_t i = 0; i < user_variables.size(); i++) { action = sub->addAction(QString::fromStdString(user_variables[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)).replace("MeV/c^2", "MeV/c²"), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) user_variables[i])); } first_index++; } variablesMenu->addSeparator(); while(titem) { if(!titem->items.empty() || !titem->objects.empty()) { gsub("&", "&&", titem->item); gsub("MeV*c^(-2)", "MeV/c²", titem->item); sub = new QMenu(QString::fromStdString(titem->item)); sub3->insertMenu(sub3->actions().value(sub3 == variablesMenu ? first_index : 0), sub); menus.push(sub); sub3 = sub; for(size_t i = 0; i < titem->objects.size(); i++) { v = (Variable*) titem->objects[i]; action = sub->addAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)).replace("MeV/c^2", "MeV/c²"), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); } } else { titem = titem->parent; } while(titem && titem->rit == titem->items.rend()) { titem = titem->parent; menus.pop(); if(menus.size() > 0) sub3 = menus.top(); } if(titem) { titem2 = &*titem->rit; ++titem->rit; titem = titem2; titem->rit = titem->items.rbegin(); } } sub = sub2; for(size_t i = 0; i < variable_cats.objects.size(); i++) { v = (Variable*) variable_cats.objects[i]; if(!v->isLocal()) { action = sub->addAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); } } variablesMenu->addSeparator(); } else { favouriteVariablesMenu = variablesMenu; recentVariablesMenu = variablesMenu; } QAction *action = variablesMenu->addAction(tr("Show all variables")); action->setCheckable(true); action->setChecked(settings->show_all_variables); connect(action, SIGNAL(toggled(bool)), this, SLOT(showAllVariables(bool))); firstVariablesMenuOptionAction = action; updateRecentVariables(); updateFavouriteVariables(); } void QalculateWindow::showAllVariables(bool b) { settings->show_all_variables = b; updateVariablesMenu(); } void QalculateWindow::updateFavouriteVariables() { if(variablesMenu->isEmpty()) return; for(int i = 0; i < favouriteVariableActions.size(); i++) { favouriteVariablesMenu->removeAction(favouriteVariableActions[i]); favouriteVariableActions[i]->deleteLater(); } bool b_empty = settings->show_all_variables && favouriteVariableActions.isEmpty(); favouriteVariableActions.clear(); bool update_recent = false; if(!settings->favourite_variables.empty()) { std::sort(settings->favourite_variables.begin(), settings->favourite_variables.end(), sort_compare_item); for(size_t i = 0; i < settings->favourite_variables.size(); i++) { Variable *v = settings->favourite_variables[i]; if(!settings->show_all_variables) { for(size_t i2 = 0; i2 < settings->recent_variables.size(); i2++) { if(settings->recent_variables[i2] == v) { settings->recent_variables.erase(settings->recent_variables.begin() + i2); update_recent = true; break; } } } QAction *action = new QAction(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), favouriteVariablesMenu); connect(action, SIGNAL(triggered()), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) v)); favouriteVariableActions << action; } if(!settings->show_all_variables) { QAction *action = new QAction(favouriteVariablesMenu); action->setSeparator(true); favouriteVariableActions << action; } if(update_recent) updateRecentVariables(); favouriteVariablesMenu->insertActions(settings->show_all_variables ? NULL : (recentVariableActions.isEmpty() ? firstVariablesMenuOptionAction : recentVariableActions.at(0)), favouriteVariableActions); if(b_empty) { favouriteVariablesMenu->hide(); favouriteVariablesMenu->show(); favouriteVariablesMenu->hide(); } } } void QalculateWindow::updateRecentVariables() { if(variablesMenu->isEmpty()) return; for(int i = 0; i < recentVariableActions.size(); i++) { recentVariablesMenu->removeAction(recentVariableActions[i]); recentVariableActions[i]->deleteLater(); } bool b_empty = settings->show_all_variables && recentVariableActions.isEmpty(); recentVariableActions.clear(); if(!settings->recent_variables.empty()) { for(size_t i = 0; i < settings->recent_variables.size() && (i < 5 || settings->show_all_variables); i++) { QAction *action = new QAction(QString::fromStdString(settings->recent_variables[i]->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this)), recentVariablesMenu); connect(action, SIGNAL(triggered()), this, SLOT(variableActivated())); action->setData(QVariant::fromValue((void*) settings->recent_variables[i])); recentVariableActions << action; } if(!settings->show_all_variables) { QAction *action = new QAction(recentVariablesMenu); action->setSeparator(true); recentVariableActions << action; } recentVariablesMenu->insertActions(settings->show_all_variables ? NULL : firstVariablesMenuOptionAction, recentVariableActions); if(b_empty) { recentVariablesMenu->hide(); recentVariablesMenu->show(); recentVariablesMenu->hide(); } } } void QalculateWindow::addToRecentVariables(Variable *v) { if(!settings->show_all_variables) { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) return; } } for(size_t i = 0; i < settings->recent_variables.size(); i++) { if(settings->recent_variables[i] == v) { if(i == 0) return; settings->recent_variables.erase(settings->recent_variables.begin() + i); break; } } if(settings->recent_variables.size() > 10) settings->recent_variables.pop_back(); settings->recent_variables.insert(settings->recent_variables.begin(), v); updateRecentVariables(); } void QalculateWindow::variableActivated() { Variable *v = (Variable*) ((QAction*) sender())->data().value(); onVariableClicked(v); addToRecentVariables(v); } void QalculateWindow::unitActivated() { onUnitActivated((Unit*) ((QAction*) sender())->data().value()); } void QalculateWindow::prefixActivated() { Prefix *p = (Prefix*) ((QAction*) sender())->data().value(); if(!p) return; expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(p->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(-1, true))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::functionActivated() { MathFunction *f = (MathFunction*) ((QAction*) sender())->data().value(); if(settings->use_function_dialog) insertFunction(f, this); else onFunctionClicked(f); addToRecentFunctions(f); } void QalculateWindow::registerUp() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index == 0) { CALCULATOR->moveRPNRegister(1, CALCULATOR->RPNStackSize()); item2 = rpnView->item(CALCULATOR->RPNStackSize() - 1, 0); } else { CALCULATOR->moveRPNRegisterUp(index + 1); item2 = rpnView->item(index - 1, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::registerDown() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index + 1 == (int) CALCULATOR->RPNStackSize()) { CALCULATOR->moveRPNRegister(CALCULATOR->RPNStackSize(), 1); item2 = rpnView->item(0, 0); } else { CALCULATOR->moveRPNRegisterDown(index + 1); item2 = rpnView->item(index + 1, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::registerSwap() { if(CALCULATOR->RPNStackSize() <= 1) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item, *item2; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); if(index == 0) { CALCULATOR->moveRPNRegister(1, 2); item2 = rpnView->item(1, 0); } else { CALCULATOR->moveRPNRegister(index + 1, 1); item2 = rpnView->item(0, 0); } if(item2) { QString str = item->text(); rpnView->blockSignals(true); item->setText(item2->text()); item2->setText(str); rpnView->blockSignals(false); } } void QalculateWindow::rpnLastX() { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } CALCULATOR->RPNStackEnter(new MathStructure(lastx)); RPNRegisterAdded(lastx_text.toStdString(), 0); } void QalculateWindow::copyRegister() { if(CALCULATOR->RPNStackSize() == 0) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); CALCULATOR->RPNStackEnter(new MathStructure(*CALCULATOR->getRPNRegister(index + 1))); RPNRegisterAdded(item->text().toStdString(), 0); } void QalculateWindow::deleteRegister() { if(CALCULATOR->RPNStackSize() == 0) return; QList list = rpnView->selectedItems(); QTableWidgetItem *item; if(list.isEmpty()) item = rpnView->item(0, 0); else item = list[0]; if(!item) return; int index = item->row(); CALCULATOR->deleteRPNRegister(index + 1); RPNRegisterRemoved(index); } void QalculateWindow::clearStack() { CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); rpnCopyAction->setEnabled(false); rpnDeleteAction->setEnabled(false); rpnClearAction->setEnabled(false); rpnUpAction->setEnabled(false); rpnDownAction->setEnabled(false); rpnSwapAction->setEnabled(false); updateInsertFunctionDialogs(); } void QalculateWindow::registerChanged(int index) { calculateExpression(true, false, OPERATION_ADD, NULL, true, index); } void QalculateWindow::onInsertTextRequested(std::string str) { expressionEdit->blockCompletion(); gsub("…", "", str); expressionEdit->insertText(QString::fromStdString(unhtmlize(str))); expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::showAbout() { QMessageBox::about(this, tr("About %1").arg(qApp->applicationDisplayName()), QStringLiteral("%1 v%4
%2
https://qalculate.github.io/

Copyright © 2003-2007, 2008, 2016-2026 Hanna Knutsson
%3").arg(qApp->applicationDisplayName()).arg(tr("Powerful and easy to use calculator")).arg(tr("License: GNU General Public License version 2 or later")).arg(qApp->applicationVersion())); } void QalculateWindow::onInsertValueRequested(int i) { expressionEdit->blockCompletion(); Number nr(i, 1, 0); expressionEdit->insertText(QStringLiteral("%1(%2)").arg(QString::fromStdString(settings->f_answer->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true))).arg(QString::fromStdString(print_with_evalops(nr)))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onSymbolClicked(const QString &str) { expressionEdit->blockCompletion(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; expressionEdit->insertText(str); settings->auto_calculate_delay = delay_bak; if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onOperatorClicked(const QString &str) { QString s, s_low; if(str.length() >= 3) { s_low = str.toLower(); if(str == "NOT") s = "!"; else if(s_low == "not") s = str + " "; else if(s_low == "nor" || s_low == "mod" || s_low == "rem" || s_low == "comb" || s_low == "perm" || s_low == "xor" || s_low == "bitand" || s_low == "bitor" || s_low == "nand" || s_low == "cross" || s_low == "dot" || s_low == "and" || s_low == "or" || s_low == "per" || s_low == "times" || s_low == "minus" || s_low == "plus" || s_low == "div") s = " " + str + " "; else s = str; } else { s = str; } if(settings->rpn_mode && str != "NOT" && str != "not") { if(s != str || str == "%") { if(s_low == "mod") {onFunctionClicked(CALCULATOR->getFunctionById(FUNCTION_ID_MOD)); return;} else if(s_low == "rem" || str == "%") {onFunctionClicked(CALCULATOR->getFunctionById(FUNCTION_ID_REM)); return;} MathFunction *f = CALCULATOR->getActiveFunction(s_low.toStdString()); if(f) { onFunctionClicked(f); return; } } if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, str.toStdString()); return; } expressionEdit->blockCompletion(); bool do_exec = false; if(str == "~") { expressionEdit->wrapSelection(str, true, false); } else if(str == "!") { QTextCursor cur = expressionEdit->textCursor(); do_exec = (str == "!") && cur.hasSelection() && cur.selectionStart() == 0 && cur.selectionEnd() == expressionEdit->toPlainText().length(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; if(do_exec) expressionEdit->blockParseStatus(); expressionEdit->wrapSelection(str); if(do_exec) expressionEdit->blockParseStatus(false); settings->auto_calculate_delay = delay_bak; } else if(str == "E" || str == "e") { if(expressionEdit->textCursor().hasSelection() && !expressionEdit->overwriteMode()) expressionEdit->wrapSelection(QString::fromUtf8(settings->multiplicationSign()) + "10^"); else expressionEdit->insertText(settings->printops.exp_display == EXP_UPPERCASE_E ? "E" : "e"); } else { if((str == "//" || (s != str && (s_low == "mod" || s_low == "rem"))) && (settings->rpn_mode || expressionEdit->document()->isEmpty() || settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN || (expressionEdit->textCursor().atStart() && !expressionEdit->textCursor().hasSelection()))) { MathFunction *f; if(s_low == "mod") f = CALCULATOR->getFunctionById(FUNCTION_ID_MOD); else if(s_low == "rem") f = CALCULATOR->getFunctionById(FUNCTION_ID_REM); else f = CALCULATOR->getActiveFunction("div"); if(f) { expressionEdit->blockCompletion(false); onFunctionClicked(f); return; } } if(!expressionEdit->doChainMode(s)) expressionEdit->wrapSelection(s); } if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); if(do_exec) calculate(); expressionEdit->blockCompletion(false); } bool last_is_number(std::string str) { str = CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options); CALCULATOR->parseSigns(str); if(str.empty()) return false; return is_not_in(OPERATORS SPACES SEXADOT DOT LEFT_VECTOR_WRAP LEFT_PARENTHESIS COMMAS, str[str.length() - 1]); } void QalculateWindow::onFunctionClicked(MathFunction *f) { if(!f) return; if(settings->rpn_mode && (f->minargs() <= 1 || (int) CALCULATOR->RPNStackSize() >= f->minargs())) { calculateRPN(f); return; } if(!settings->rpn_mode && settings->chain_mode && !expressionEdit->textCursor().hasSelection() && expressionEdit->textCursor().atEnd()) { QString str = expressionEdit->toPlainText(); std::string str2 = CALCULATOR->unlocalizeExpression(str.toStdString(), settings->evalops.parse_options); remove_blanks(str2); size_t par_n = 0, vec_n = 0; for(size_t i = 0; i < str2.length(); i++) { if(str2[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str2[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str2[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str2[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n <= 0 && vec_n <= 0 && !str2.empty() && str2[0] != '/' && !CALCULATOR->hasToExpression(str2, true, settings->evalops) && !CALCULATOR->hasWhereExpression(str2, settings->evalops) && !last_is_operator(str2)) { int i = str.length() - 1; int nr_of_p = 0; bool prev_plusminus = false; while(i >= 0) { if(str[i] == LEFT_PARENTHESIS_CH) { if(nr_of_p == 0) { if(prev_plusminus) i--; break; } nr_of_p--; } else if(str[i] == RIGHT_PARENTHESIS_CH) { if(nr_of_p == 0 && i + 1 < str.length()) { if(prev_plusminus) i++; break; } nr_of_p++; } else if(nr_of_p == 0) { if(!str[i].isLetterOrNumber() && (signed char) str[i].toLatin1() <= 0) { str2 = str.mid(i, 1).toStdString(); CALCULATOR->parseSigns(str2); if(!str2.empty() && (signed char) str2[0] > 0) { if(is_in("+-", str2[0])) { prev_plusminus = true; } else if(is_in("*/&|=><^", str2[0])) { break; } else if(prev_plusminus) { i++; break; } } } else if(str[i] == '+' || str[i] == '-') { prev_plusminus = true; } else if(is_in("*/&|=><^", str[i].toLatin1())) { break; } else if(prev_plusminus) { i++; break; } } i--; } i++; QTextCursor cur = expressionEdit->textCursor(); cur.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, str.length() - i); expressionEdit->setTextCursor(cur); } } QString sargs; bool b_text = USE_QUOTES(f->getArgumentDefinition(1), f); if(f->id() == FUNCTION_ID_CIRCULAR_SHIFT || f->id() == FUNCTION_ID_BIT_CMP) { Argument *arg_bits = f->getArgumentDefinition(f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? 3 : 2); Argument *arg_steps = (f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? f->getArgumentDefinition(2) : NULL); Argument *arg_signed = f->getArgumentDefinition(f->id() == FUNCTION_ID_CIRCULAR_SHIFT ? 4 : 3); MathSpinBox *spin = NULL; if(arg_bits && arg_signed && (f->id() != FUNCTION_ID_CIRCULAR_SHIFT || arg_steps)) { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); if(arg_steps) { grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_steps->name()))), 0, 0); int min = INT_MIN, max = INT_MAX; if(arg_steps->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg_steps; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } } spin = new MathSpinBox(); spin->setRange(min, max); if(!f->getDefaultValue(2).empty()) { spin->setValue(s2i(f->getDefaultValue(2))); } else if(!arg_steps->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } grid->addWidget(spin, 0, 1); } grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_bits->name()))), arg_steps ? 1 : 0, 0); QComboBox *combo = new QComboBox(dialog); combo->addItem("8", 8); combo->addItem("16", 16); combo->addItem("32", 32); combo->addItem("64", 64); combo->addItem("128", 128); combo->addItem("256", 256); combo->addItem("512", 512); combo->addItem("1024", 1024); int i = combo->findData(settings->default_bits >= 0 ? settings->default_bits : (settings->evalops.parse_options.binary_bits > 0 ? settings->evalops.parse_options.binary_bits : 32)); if(i < 0) i = 2; combo->setCurrentIndex(i); grid->addWidget(combo, arg_steps ? 1 : 0, 1); QCheckBox *button = new QCheckBox(QString::fromStdString(arg_signed->name())); button->setChecked(settings->default_signed > 0 || (settings->default_signed < 0 && (settings->evalops.parse_options.twos_complement || (f->id() == FUNCTION_ID_CIRCULAR_SHIFT && settings->printops.twos_complement)))); grid->addWidget(button, arg_steps ? 2 : 1, 0, 2, 1, Qt::AlignRight); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { Number bits = combo->currentData().toInt(); if(bits.isZero()) bits = 32; sargs = QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(spin) { if(settings->evalops.parse_options.base != BASE_DECIMAL) { Number nr(spin->value(), 1); sargs += QString::fromStdString(print_with_evalops(nr)); } else { sargs += spin->cleanText(); } sargs += QString::fromStdString(CALCULATOR->getComma()); sargs += " "; } sargs += QString::fromStdString(print_with_evalops(bits)); sargs += QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(button->isChecked()) sargs += "1"; else sargs += "0"; settings->default_bits = bits.intValue(); settings->default_signed = button->isChecked(); dialog->deleteLater(); } else { dialog->deleteLater(); return; } } } else if(f->id() == FUNCTION_ID_ROOT || f->id() == FUNCTION_ID_LOGN || (f->minargs() == 2 && ((f->getArgumentDefinition(2) && f->getArgumentDefinition(2)->type() == ARGUMENT_TYPE_INTEGER) xor (f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->type() == ARGUMENT_TYPE_INTEGER)))) { size_t index = 2; if(f->id() != FUNCTION_ID_ROOT && f->id() != FUNCTION_ID_LOGN && f->getArgumentDefinition(1) && f->getArgumentDefinition(1)->type() == ARGUMENT_TYPE_INTEGER) index = 1; Argument *arg_n = f->getArgumentDefinition(index); if(arg_n) { QLineEdit *entry = NULL; MathSpinBox *spin = NULL; QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(QString::fromStdString(f->title(true, settings->printops.use_unicode_signs))); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); grid->addWidget(new QLabel(tr("%1:").arg(QString::fromStdString(arg_n->name()))), 0, 0); int min = INT_MIN, max = INT_MAX; if(arg_n->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg_n; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } } if(settings->evalops.parse_options.base != BASE_DECIMAL || f->id() == FUNCTION_ID_ROOT || arg_n->type() == ARGUMENT_TYPE_INTEGER) { spin = new MathSpinBox(dialog); spin->setRange(min, max); if(f->id() == FUNCTION_ID_ROOT || f->id() == FUNCTION_ID_LOGN) { spin->setValue(2); } else if(!f->getDefaultValue(index).empty()) { spin->setValue(s2i(f->getDefaultValue(index))); } else if(!arg_n->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } grid->addWidget(spin, 0, 1); spin->setFocus(); connect(spin, SIGNAL(returnPressed()), dialog, SLOT(accept())); } else { entry = new MathLineEdit(dialog); entry->setText(QString::fromStdString(f->getDefaultValue(index))); grid->addWidget(entry, 0, 1); entry->setFocus(); connect(entry, SIGNAL(returnPressed()), dialog, SLOT(accept())); } QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { sargs = QString::fromStdString(CALCULATOR->getComma()); sargs += " "; if(spin && settings->evalops.parse_options.base != BASE_DECIMAL) { Number nr(spin->value(), 1); sargs += QString::fromStdString(print_with_evalops(nr)); } else if(spin) { sargs += spin->cleanText(); } else { sargs += entry->text(); } dialog->deleteLater(); } else { dialog->deleteLater(); return; } } } expressionEdit->blockCompletion(); QTextCursor cur = expressionEdit->textCursor(); bool do_exec = false; int minargs = f->minargs(); if(minargs == 1 && f->id() == FUNCTION_ID_LOGN) minargs = 2; if(cur.hasSelection()) { do_exec = (!sargs.isEmpty() || minargs <= 1) && cur.selectionStart() == 0 && cur.selectionEnd() == expressionEdit->toPlainText().length(); } else if(cur.atEnd() && last_is_number(expressionEdit->toPlainText().toStdString())) { QString str = expressionEdit->toPlainText(); size_t par_n = 0, vec_n = 0; for(int i = 0; i < str.length(); i++) { if(str[i] == LEFT_PARENTHESIS_CH) par_n++; else if(par_n > 0 && str[i] == RIGHT_PARENTHESIS_CH) par_n--; else if(str[i] == LEFT_VECTOR_WRAP_CH) vec_n++; else if(vec_n > 0 && str[i] == RIGHT_VECTOR_WRAP_CH) vec_n--; } if(par_n <= 0 && vec_n <= 0) { expressionEdit->selectAll(); do_exec = !sargs.isEmpty() || minargs <= 1; } } if(do_exec) expressionEdit->blockParseStatus(); expressionEdit->wrapSelection(f->referenceName() == "neg" ? SIGN_MINUS : QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)), true, true, minargs > 1 && sargs.isEmpty(), sargs, b_text); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); if(do_exec) expressionEdit->blockParseStatus(false); expressionEdit->blockCompletion(false); if(do_exec) calculate(); } void QalculateWindow::negate() { onFunctionClicked(CALCULATOR->getActiveFunction("neg")); } void QalculateWindow::onVariableClicked(Variable *v) { if(!v) return; expressionEdit->blockCompletion(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; expressionEdit->insertText(QString::fromStdString(v->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_VARIABLE, true))); settings->auto_calculate_delay = delay_bak; if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onUnitClicked(Unit *u) { if(!u) return; expressionEdit->blockCompletion(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) expressionEdit; expressionEdit->insertText(QString::fromStdString(((CompositeUnit*) u)->print(po, false, TAG_TYPE_HTML, true, false))); } else { expressionEdit->insertText(QString::fromStdString(u->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_UNIT, true))); } settings->auto_calculate_delay = delay_bak; if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onPrefixClicked(Prefix *p) { if(!p) return; expressionEdit->blockCompletion(); expressionEdit->insertText(QString::fromStdString(p->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(-1, true))); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onDelClicked() { expressionEdit->blockCompletion(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; QTextCursor cur = expressionEdit->textCursor(); if(cur.atEnd()) cur.deletePreviousChar(); else cur.deleteChar(); settings->auto_calculate_delay = delay_bak; if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onBackspaceClicked() { expressionEdit->blockCompletion(); int delay_bak = settings->auto_calculate_delay; if(settings->adaptive_autocalc_delay && settings->status_in_history) settings->auto_calculate_delay = 0; QTextCursor cur = expressionEdit->textCursor(); if(!cur.atStart()) cur.deletePreviousChar(); else cur.deleteChar(); settings->auto_calculate_delay = delay_bak; if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onClearClicked() { expressionEdit->blockCompletion(); expressionEdit->clear(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onEqualsClicked() { calculate(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onParenthesesClicked() { expressionEdit->blockCompletion(); expressionEdit->smartParentheses(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onBracketsClicked() { expressionEdit->blockCompletion(); expressionEdit->insertBrackets(); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onLeftClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::PreviousCharacter); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onRightClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::NextCharacter); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onStartClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::Start); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onEndClicked() { expressionEdit->blockCompletion(); expressionEdit->moveCursor(QTextCursor::End); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::onMSClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; settings->v_memory->set(*mstruct); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMRClicked() { bool b_exec = !expressionEdit->expressionHasChanged(); onVariableClicked(settings->v_memory); if(b_exec) calculate(); } void QalculateWindow::onMCClicked() { settings->v_memory->set(m_zero); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMPlusClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; MathStructure m = settings->v_memory->get(); m.calculateAdd(*mstruct, settings->evalops); settings->v_memory->set(m); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onMMinusClicked() { if(expressionEdit->expressionHasChanged()) calculate(); if(!mstruct) return; MathStructure m = settings->v_memory->get(); m.calculateAdd(*mstruct, settings->evalops); settings->v_memory->set(m); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); } void QalculateWindow::onAnswerClicked() { if(settings->history_answer.size() > 0) { onInsertValueRequested(settings->history_answer.size()); } } void QalculateWindow::onBaseClicked(int v, bool b, bool b_update) { if(b && v != settings->evalops.parse_options.base) { settings->evalops.parse_options.base = v; QAction *action = find_child_data(this, "group_inbase", v); if(action) action->setChecked(true); expressionFormatUpdated(false); } if(v != settings->printops.base) { settings->printops.base = v; to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", v); if(action) action->setChecked(true); if(b_update) resultFormatUpdated(); } keypad->updateBase(); } void QalculateWindow::onFactorizeClicked() { executeCommand(COMMAND_FACTORIZE); } void QalculateWindow::onExpandClicked() { executeCommand(COMMAND_EXPAND); } void QalculateWindow::onExpandPartialFractionsClicked() { executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); } void QalculateWindow::serverNewConnection() { socket = server->nextPendingConnection(); if(socket) { connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyRead())); } } void QalculateWindow::socketReadyRead() { QString command = socket->readAll(); if(!command.isEmpty() && command[0] == '+') { settings->window_state = saveState(); settings->window_geometry = saveGeometry(); settings->splitter_state = ehSplitter->saveState(); settings->allow_multiple_instances = true; settings->show_bases = basesDock->isVisible(); settings->savePreferences(false); return; } setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); show(); qApp->processEvents(); raise(); activateWindow(); if(command.isEmpty()) return; if(command[0] == '-') { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->allow_multiple_instances = false; settings->show_bases = basesDock->isVisible(); settings->savePreferences(false); command = command.mid(1).trimmed(); if(command.isEmpty()) return; } if(command[0] == 'f') { command = command.mid(1).trimmed(); if(!command.isEmpty()) { int i = command.indexOf(";"); if(i > 0) { QString file = command.left(i); executeFromFile(file); command = command.mid(i); } } } else if(command[0] == 'w') { command = command.mid(1).trimmed(); if(!command.isEmpty()) { int i = command.indexOf(";"); if(i > 0) { QString file = command.left(i); loadWorkspace(file); command = command.mid(i); } } } else if(command[0] == 'u') { fetchExchangeRates(); } else if(command[0] == 't') { startTest(); } else if(command[0] == 'e' && testTimer) { testTimer->stop(); } command = command.mid(1).trimmed(); if(!command.isEmpty()) {expressionEdit->setExpression(command); calculate();} } void QalculateWindow::onActivateRequested(const QStringList &arguments, const QString&) { if(!arguments.isEmpty()) { parser->process(arguments); QStringList args = parser->positionalArguments(); QString command; for(int i = 0; i < args.count(); i++) { if(i > 0) command += " "; command += args.at(i); } command = command.trimmed(); if(!command.isEmpty()) {expressionEdit->setExpression(command); calculate();} args.clear(); } setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); show(); qApp->processEvents(); raise(); activateWindow(); } void QalculateWindow::setCommandLineParser(QCommandLineParser *p) { parser = p; if(parser->isSet("run-test")) startTest(); } void QalculateWindow::calculate() { calculateExpression(); } void QalculateWindow::calculate(const QString &expression) { expressionEdit->setExpression(expression); calculate(); } void QalculateWindow::setPreviousExpression() { if(settings->rpn_mode) { expressionEdit->clear(); } else { expressionEdit->blockCompletion(); expressionEdit->blockParseStatus(); expressionEdit->setExpression(QString::fromStdString(previous_expression)); expressionEdit->selectAll(); expressionEdit->setExpressionHasChanged(false); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); historyView->clearTemporary(); } } void QalculateWindow::resultFormatUpdated(int delay) { if(rfTimer) rfTimer->stop(); if(block_result_update || (!expressionEdit->expressionHasChanged() && auto_expression.empty() && parsed_mstruct && parsed_mstruct->isFunction() && parsed_mstruct->function()->id() == FUNCTION_ID_MESSAGE)) return; if(delay > 0) { if(!rfTimer) { rfTimer = new QTimer(); rfTimer->setSingleShot(true); connect(rfTimer, SIGNAL(timeout()), this, SLOT(resultFormatUpdated())); } rfTimer->start(delay); return; } settings->updateMessagePrintOptions(); workspace_changed = true; setResult(NULL, true, false, false); auto_format_updated = true; if((!settings->status_in_history && !settings->status_in_statusbar && !QToolTip::text().isEmpty()) || (settings->status_in_statusbar && !statusLabelLeft->text().isEmpty()) || (settings->status_in_history && expressionEdit->expressionHasChanged())) expressionEdit->displayParseStatus(true); } void QalculateWindow::resultDisplayUpdated() { resultFormatUpdated(); } void QalculateWindow::expressionObjectsUpdated() { auto_calculation_updated = true; expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); } void QalculateWindow::expressionFormatUpdated(bool recalculate) { settings->updateMessagePrintOptions(); if(!expressionEdit->expressionHasChanged() && !recalculate && !settings->rpn_mode) { expressionEdit->clear(); } else if(!settings->rpn_mode && parsed_mstruct) { for(size_t i = 0; i < 5; i++) { if(parsed_mstruct->contains(settings->vans[i])) expressionEdit->clear(); } } workspace_changed = true; if(!settings->rpn_mode && recalculate && (expressionEdit->expressionHasChanged() || !parsed_mstruct || !parsed_mstruct->isFunction() || parsed_mstruct->function()->id() != FUNCTION_ID_MESSAGE)) { calculateExpression(false); } if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); updateStatusText(); if(!recalculate) onExpressionChanged(); } void QalculateWindow::expressionCalculationUpdated(int delay) { if(ecTimer) ecTimer->stop(); if(delay > 0) { if(!ecTimer) { ecTimer = new QTimer(); ecTimer->setSingleShot(true); connect(ecTimer, SIGNAL(timeout()), this, SLOT(expressionCalculationUpdated())); } ecTimer->start(delay); return; } workspace_changed = true; auto_calculation_updated = true; settings->updateMessagePrintOptions(); if(!settings->rpn_mode && (expressionEdit->expressionHasChanged() || !parsed_mstruct || !parsed_mstruct->isFunction() || parsed_mstruct->function()->id() != FUNCTION_ID_MESSAGE)) { if(parsed_mstruct) { for(size_t i = 0; i < 5; i++) { if(parsed_mstruct->contains(settings->vans[i])) return; } } calculateExpression(false); } if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true, !QToolTip::text().isEmpty()); updateStatusText(); } int s2b(const std::string &str) { if(str.empty()) return -1; if(equalsIgnoreCase(str, "yes")) return 1; if(equalsIgnoreCase(str, "no")) return 0; if(equalsIgnoreCase(str, "true")) return 1; if(equalsIgnoreCase(str, "false")) return 0; if(equalsIgnoreCase(str, "on")) return 1; if(equalsIgnoreCase(str, "off")) return 0; if(str.find_first_not_of(SPACES NUMBERS) != std::string::npos) return -1; int i = s2i(str); if(i > 0) return 1; return 0; } void set_assumption(const std::string &str, AssumptionType &at, AssumptionSign &as, bool last_of_two = false) { if(equalsIgnoreCase(str, "none") || str == "0") { as = ASSUMPTION_SIGN_UNKNOWN; at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "unknown")) { if(!last_of_two) as = ASSUMPTION_SIGN_UNKNOWN; else at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "real")) { at = ASSUMPTION_TYPE_REAL; } else if(equalsIgnoreCase(str, "number") || equalsIgnoreCase(str, "complex") || str == "num" || str == "cplx") { at = ASSUMPTION_TYPE_NUMBER; } else if(equalsIgnoreCase(str, "rational") || str == "rat") { at = ASSUMPTION_TYPE_RATIONAL; } else if(equalsIgnoreCase(str, "integer") || str == "int") { at = ASSUMPTION_TYPE_INTEGER; } else if(equalsIgnoreCase(str, "boolean") || str == "bool") { at = ASSUMPTION_TYPE_BOOLEAN; } else if(equalsIgnoreCase(str, "non-zero") || str == "nz") { as = ASSUMPTION_SIGN_NONZERO; } else if(equalsIgnoreCase(str, "positive") || str == "pos") { as = ASSUMPTION_SIGN_POSITIVE; } else if(equalsIgnoreCase(str, "non-negative") || str == "nneg") { as = ASSUMPTION_SIGN_NONNEGATIVE; } else if(equalsIgnoreCase(str, "negative") || str == "neg") { as = ASSUMPTION_SIGN_NEGATIVE; } else if(equalsIgnoreCase(str, "non-positive") || str == "npos") { as = ASSUMPTION_SIGN_NONPOSITIVE; } else { CALCULATOR->error(true, "Unrecognized assumption: %s.", str.c_str(), NULL); } } #define SET_BOOL_D(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; resultDisplayUpdated();}} #define SET_BOOL_E(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionCalculationUpdated();}} #define SET_BOOL(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v;}} #define SET_BOOL_PV(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(v);}} #define SET_BOOL_PT(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(true);}} #define SET_BOOL_PF(x) {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(x != v) {x = v; expressionFormatUpdated(false);}} void QalculateWindow::setOption(std::string str) { remove_blank_ends(str); gsub(SIGN_MINUS, "-", str); std::string svalue, svar; bool empty_value = false; size_t i_underscore = str.find("_"); size_t index; if(i_underscore != std::string::npos) { index = str.find_first_of(SPACES); if(index != std::string::npos && i_underscore > index) i_underscore = std::string::npos; } if(i_underscore == std::string::npos) index = str.find_last_of(SPACES); if(index != std::string::npos) { svar = str.substr(0, index); remove_blank_ends(svar); svalue = str.substr(index + 1); remove_blank_ends(svalue); } else { svar = str; } if(i_underscore != std::string::npos) gsub("_", " ", svar); if(svalue.empty()) { empty_value = true; svalue = "1"; } if(preferencesDialog) { preferencesDialog->hide(); preferencesDialog->deleteLater(); preferencesDialog = NULL; } set_option_place: if(equalsIgnoreCase(svar, "base") || equalsIgnoreCase(svar, "input base") || svar == "inbase" || equalsIgnoreCase(svar, "output base") || svar == "outbase") { int v = 0; bool b_in = equalsIgnoreCase(svar, "input base") || svar == "inbase"; bool b_out = equalsIgnoreCase(svar, "output base") || svar == "outbase"; if(equalsIgnoreCase(svalue, "roman")) v = BASE_ROMAN_NUMERALS; else if(equalsIgnoreCase(svalue, "bijective") || str == "b26" || str == "B26") v = BASE_BIJECTIVE_26; if(equalsIgnoreCase(svalue, "bcd")) v = BASE_BINARY_DECIMAL; else if(equalsIgnoreCase(svalue, "fp32") || equalsIgnoreCase(svalue, "binary32") || equalsIgnoreCase(svalue, "float")) {if(b_in) v = 0; else v = BASE_FP32;} else if(equalsIgnoreCase(svalue, "fp64") || equalsIgnoreCase(svalue, "binary64") || equalsIgnoreCase(svalue, "double")) {if(b_in) v = 0; else v = BASE_FP64;} else if(equalsIgnoreCase(svalue, "fp16") || equalsIgnoreCase(svalue, "binary16")) {if(b_in) v = 0; else v = BASE_FP16;} else if(equalsIgnoreCase(svalue, "fp80")) {if(b_in) v = 0; else v = BASE_FP80;} else if(equalsIgnoreCase(svalue, "fp128") || equalsIgnoreCase(svalue, "binary128")) {if(b_in) v = 0; else v = BASE_FP128;} else if(equalsIgnoreCase(svalue, "time")) {if(b_in) v = 0; else v = BASE_TIME;} else if(equalsIgnoreCase(svalue, "hex") || equalsIgnoreCase(svalue, "hexadecimal")) v = BASE_HEXADECIMAL; else if(equalsIgnoreCase(svalue, "golden") || equalsIgnoreCase(svalue, "golden ratio") || svalue == "φ") v = BASE_GOLDEN_RATIO; else if(equalsIgnoreCase(svalue, "supergolden") || equalsIgnoreCase(svalue, "supergolden ratio") || svalue == "ψ") v = BASE_SUPER_GOLDEN_RATIO; else if(equalsIgnoreCase(svalue, "pi") || svalue == "Ï€") v = BASE_PI; else if(svalue == "e") v = BASE_E; else if(svalue == "sqrt(2)" || svalue == "sqrt 2" || svalue == "sqrt2" || svalue == "√2") v = BASE_SQRT2; else if(equalsIgnoreCase(svalue, "unicode")) v = BASE_UNICODE; else if(equalsIgnoreCase(svalue, "duo") || equalsIgnoreCase(svalue, "duodecimal")) v = 12; else if(equalsIgnoreCase(svalue, "bin") || equalsIgnoreCase(svalue, "binary")) v = BASE_BINARY; else if(equalsIgnoreCase(svalue, "oct") || equalsIgnoreCase(svalue, "octal")) v = BASE_OCTAL; else if(equalsIgnoreCase(svalue, "dec") || equalsIgnoreCase(svalue, "decimal")) v = BASE_DECIMAL; else if(equalsIgnoreCase(svalue, "sexa") || equalsIgnoreCase(svalue, "sexagesimal")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL;} else if(equalsIgnoreCase(svalue, "sexa2") || equalsIgnoreCase(svalue, "sexagesimal2")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL_2;} else if(equalsIgnoreCase(svalue, "sexa3") || equalsIgnoreCase(svalue, "sexagesimal3")) {if(b_in) v = 0; else v = BASE_SEXAGESIMAL_3;} else if(equalsIgnoreCase(svalue, "latitude")) {if(b_in) v = 0; else v = BASE_LATITUDE;} else if(equalsIgnoreCase(svalue, "latitude2")) {if(b_in) v = 0; else v = BASE_LATITUDE_2;} else if(equalsIgnoreCase(svalue, "longitude")) {if(b_in) v = 0; else v = BASE_LONGITUDE;} else if(equalsIgnoreCase(svalue, "longitude2")) {if(b_in) v = 0; else v = BASE_LONGITUDE_2;} else if(!b_in && !b_out && (index = svalue.find_first_of(SPACES)) != std::string::npos) { str = svalue; svalue = str.substr(index + 1, str.length() - (index + 1)); remove_blank_ends(svalue); svar += " "; str = str.substr(0, index); remove_blank_ends(str); svar += str; gsub("_", " ", svar); if(equalsIgnoreCase(svar, "base display")) { goto set_option_place; } setOption(std::string("inbase ") + svalue); setOption(std::string("outbase ") + str); return; } else if(!empty_value) { MathStructure m; EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; eo.approximation = APPROXIMATION_TRY_EXACT; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(svalue, eo.parse_options), 500, eo); if(CALCULATOR->endTemporaryStopMessages()) { v = 0; } else if(m.isInteger() && m.number() >= 2 && m.number() <= 36) { v = m.number().intValue(); } else if(m.isNumber() && (b_in || ((!m.number().isNegative() || m.number().isInteger()) && (m.number() > 1 || m.number() < -1)))) { v = BASE_CUSTOM; if(b_in) CALCULATOR->setCustomInputBase(m.number()); else CALCULATOR->setCustomOutputBase(m.number()); } } if(v == 0) { CALCULATOR->error(true, "Illegal base: %s.", svalue.c_str(), NULL); } else if(b_in) { if(v == BASE_CUSTOM || v != settings->evalops.parse_options.base) { settings->evalops.parse_options.base = v; QAction *action = find_child_data(this, "group_inbase", v); if(!action) action = find_child_data(this, "group_inbase", BASE_CUSTOM); if(action) { action->setChecked(true); if(action->data().toInt() == BASE_CUSTOM && (v == BASE_CUSTOM || (v >= 2 && v <= 36))) { QSpinBox *w = findChild("spinbox_inbase"); if(w) { w->blockSignals(true); w->setValue(v == BASE_CUSTOM ? (CALCULATOR->customInputBase().isZero() ? 10 : CALCULATOR->customInputBase().intValue()) : v); w->blockSignals(false); } } } expressionFormatUpdated(false); } } else { if(v == BASE_CUSTOM || v != settings->printops.base) { settings->printops.base = v; to_base = 0; to_bits = 0; to_duo_syms = false; QAction *action = find_child_data(this, "group_outbase", v); if(!action) action = find_child_data(this, "group_outbase", BASE_CUSTOM); if(action) { action->setChecked(true); if(action->data().toInt() == BASE_CUSTOM && (v == BASE_CUSTOM || (v >= 2 && v <= 36))) { QSpinBox *w = findChild("spinbox_outbase"); if(w) { w->blockSignals(true); w->setValue(v == BASE_CUSTOM ? (CALCULATOR->customOutputBase().isZero() ? 10 : CALCULATOR->customOutputBase().intValue()) : v); w->blockSignals(false); } } } resultFormatUpdated(); } } } else if(equalsIgnoreCase(svar, "assumptions") || svar == "ass" || svar == "asm") { settings->assumptions_warning_shown = true; size_t i = svalue.find_first_of(SPACES); AssumptionType at = CALCULATOR->defaultAssumptions()->type(); AssumptionSign as = CALCULATOR->defaultAssumptions()->sign(); if(i != std::string::npos) { set_assumption(svalue.substr(0, i), at, as, false); set_assumption(svalue.substr(i + 1, svalue.length() - (i + 1)), at, as, true); } else { set_assumption(svalue, at, as, false); } QAction *action = find_child_data(this, "group_type", CALCULATOR->defaultAssumptions()->type()); if(action) { action->setChecked(true); } action = find_child_data(this, "group_sign", CALCULATOR->defaultAssumptions()->sign()); if(action) { action->setChecked(true); } } else if(equalsIgnoreCase(svar, "all prefixes") || svar == "allpref") SET_BOOL_D(settings->printops.use_all_prefixes) else if(equalsIgnoreCase(svar, "complex numbers") || svar == "cplx") SET_BOOL_E(settings->evalops.allow_complex) else if(equalsIgnoreCase(svar, "excessive parentheses") || svar == "expar") SET_BOOL_D(settings->printops.excessive_parenthesis) else if(equalsIgnoreCase(svar, "functions") || svar == "func") SET_BOOL_PV(settings->evalops.parse_options.functions_enabled) else if(equalsIgnoreCase(svar, "infinite numbers") || svar == "inf") SET_BOOL_E(settings->evalops.allow_infinite) else if(equalsIgnoreCase(svar, "show negative exponents") || svar == "negexp") { {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(settings->printops.negative_exponents != v) {to_form = TO_FORM_OFF; settings->printops.negative_exponents = v; resultDisplayUpdated();}} } else if(equalsIgnoreCase(svar, "minus last") || svar == "minlast") { {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(settings->printops.sort_options.minus_last != v) {to_form = TO_FORM_OFF; settings->printops.sort_options.minus_last = v; resultDisplayUpdated();}} } else if(equalsIgnoreCase(svar, "assume nonzero denominators") || svar == "nzd") SET_BOOL_E(settings->evalops.assume_denominators_nonzero) else if(equalsIgnoreCase(svar, "warn nonzero denominators") || svar == "warnnzd") SET_BOOL_E(settings->evalops.warn_about_denominators_assumed_nonzero) else if(equalsIgnoreCase(svar, "prefixes") || svar == "pref") { {int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL);} else if(settings->printops.use_unit_prefixes != v) {to_form = TO_FORM_OFF; settings->printops.use_unit_prefixes = v; resultDisplayUpdated();}} } else if(equalsIgnoreCase(svar, "binary prefixes") || svar == "binpref") { bool b = CALCULATOR->usesBinaryPrefixes() > 0; SET_BOOL(b) if(b != (CALCULATOR->usesBinaryPrefixes() > 0)) { CALCULATOR->useBinaryPrefixes(b ? 1 : 0); resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "denominator prefixes") || svar == "denpref") SET_BOOL_D(settings->printops.use_denominator_prefix) else if(equalsIgnoreCase(svar, "place units separately") || svar == "unitsep") SET_BOOL_D(settings->printops.place_units_separately) else if(equalsIgnoreCase(svar, "calculate variables") || svar == "calcvar") SET_BOOL_E(settings->evalops.calculate_variables) else if(equalsIgnoreCase(svar, "calculate functions") || svar == "calcfunc") SET_BOOL_E(settings->evalops.calculate_functions) else if(equalsIgnoreCase(svar, "sync units") || svar == "sync") SET_BOOL_E(settings->evalops.sync_units) else if(equalsIgnoreCase(svar, "temperature calculation") || svar == "temp") { int v = -1; if(equalsIgnoreCase(svalue, "relative")) v = TEMPERATURE_CALCULATION_RELATIVE; else if(equalsIgnoreCase(svalue, "hybrid")) v = TEMPERATURE_CALCULATION_HYBRID; else if(equalsIgnoreCase(svalue, "absolute")) v = TEMPERATURE_CALCULATION_ABSOLUTE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { CALCULATOR->setTemperatureCalculationMode((TemperatureCalculationMode) v); settings->tc_set = true; expressionCalculationUpdated(); } } else if(svar == "sinc") { int v = -1; if(equalsIgnoreCase(svalue, "unnormalized")) v = 0; else if(equalsIgnoreCase(svalue, "normalized")) v = 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { if(v == 0) CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, ""); else CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); settings->sinc_set = true; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "round to even") || svar == "rndeven") { bool b = (settings->printops.rounding == ROUNDING_HALF_TO_EVEN); SET_BOOL(b) if(b != (settings->printops.rounding == ROUNDING_HALF_TO_EVEN)) { settings->printops.rounding = b ? ROUNDING_HALF_TO_EVEN : ROUNDING_HALF_AWAY_FROM_ZERO; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "rounding")) { int v = -1; if(equalsIgnoreCase(svalue, "even") || equalsIgnoreCase(svalue, "round to even") || equalsIgnoreCase(svalue, "half to even")) v = ROUNDING_HALF_TO_EVEN; else if(equalsIgnoreCase(svalue, "standard") || equalsIgnoreCase(svalue, "half away from zero")) v = ROUNDING_HALF_AWAY_FROM_ZERO; else if(equalsIgnoreCase(svalue, "truncate") || equalsIgnoreCase(svalue, "toward zero")) v = ROUNDING_TOWARD_ZERO; else if(equalsIgnoreCase(svalue, "half to odd")) v = ROUNDING_HALF_TO_ODD; else if(equalsIgnoreCase(svalue, "half toward zero")) v = ROUNDING_HALF_TOWARD_ZERO; else if(equalsIgnoreCase(svalue, "half random")) v = ROUNDING_HALF_RANDOM; else if(equalsIgnoreCase(svalue, "half up")) v = ROUNDING_HALF_UP; else if(equalsIgnoreCase(svalue, "half down")) v = ROUNDING_HALF_DOWN; else if(equalsIgnoreCase(svalue, "up")) v = ROUNDING_UP; else if(equalsIgnoreCase(svalue, "down")) v = ROUNDING_DOWN; else if(equalsIgnoreCase(svalue, "away from zero")) v = ROUNDING_AWAY_FROM_ZERO; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == 2) v = ROUNDING_TOWARD_ZERO; else if(v > 2 && v <= ROUNDING_TOWARD_ZERO) v--; } if(v < ROUNDING_HALF_AWAY_FROM_ZERO || v > ROUNDING_DOWN) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v != settings->printops.rounding) { settings->printops.rounding = (RoundingMode) v; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "rpn syntax") || svar == "rpnsyn") { bool b = (settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN); SET_BOOL(b) if(b != (settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN)) { if(b) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; } else { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "rpn") && svalue.find(" ") == std::string::npos) { bool b = settings->rpn_mode; SET_BOOL(b) if(b != settings->rpn_mode) { QAction *w = NULL; if(b) w = findChild("action_rpnmode"); else w = findChild("action_normalmode"); if(w) w->setChecked(true); if(b) rpnModeActivated(); else normalModeActivated(); } } else if(equalsIgnoreCase(svar, "short multiplication") || svar == "shortmul") SET_BOOL_D(settings->printops.short_multiplication) else if(equalsIgnoreCase(svar, "simplified percentage") || svar == "percent") SET_BOOL_PT(settings->simplified_percentage) else if(equalsIgnoreCase(svar, "lowercase e") || svar == "lowe") { bool b = (settings->printops.exp_display == EXP_LOWERCASE_E); SET_BOOL(b) if(b != (settings->printops.exp_display == EXP_LOWERCASE_E)) { if(b) settings->printops.exp_display = EXP_LOWERCASE_E; else settings->printops.exp_display = EXP_UPPERCASE_E; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "lowercase numbers") || svar == "lownum") SET_BOOL_D(settings->printops.lower_case_numbers) else if(equalsIgnoreCase(svar, "duodecimal symbols") || svar == "duosyms") SET_BOOL_D(settings->printops.duodecimal_symbols) else if(equalsIgnoreCase(svar, "imaginary j") || svar == "imgj") { Variable *v_i = CALCULATOR->getVariableById(VARIABLE_ID_I); if(v_i) { bool b = v_i->hasName("j") > 0; SET_BOOL(b) if(b) { ExpressionName ename = v_i->getName(1); ename.name = "j"; ename.reference = false; v_i->addName(ename, 1, true); v_i->setChanged(false); } else { v_i->clearNonReferenceNames(); v_i->setChanged(false); } expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "base display") || svar == "basedisp") { int v = -1; if(equalsIgnoreCase(svalue, "none")) v = BASE_DISPLAY_NONE; else if(empty_value || equalsIgnoreCase(svalue, "normal")) v = BASE_DISPLAY_NORMAL; else if(equalsIgnoreCase(svalue, "alternative")) v = BASE_DISPLAY_ALTERNATIVE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.base_display = (BaseDisplay) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "two's complement") || svar == "twos") { SET_BOOL_D(settings->printops.twos_complement) onTwosChanged(); } else if(equalsIgnoreCase(svar, "hexadecimal two's") || svar == "hextwos") { SET_BOOL_D(settings->printops.hexadecimal_twos_complement) onTwosChanged(); } else if(equalsIgnoreCase(svar, "two's complement input") || svar == "twosin") { SET_BOOL(settings->evalops.parse_options.twos_complement) if(settings->evalops.parse_options.twos_complement != settings->default_signed) settings->default_signed = -1; onTwosChanged(); expressionFormatUpdated(false); } else if(equalsIgnoreCase(svar, "hexadecimal two's input") || svar == "hextwosin") { SET_BOOL(settings->evalops.parse_options.hexadecimal_twos_complement) onTwosChanged(); expressionFormatUpdated(false); } else if(equalsIgnoreCase(svar, "binary bits") || svar == "bits") { int v = -1; if(empty_value) { v = 0; } else if(svalue.find_first_not_of(SPACES MINUS NUMBERS) == std::string::npos) { v = s2i(svalue); if(v < 0) v = 0; } if(v < 0 || v == 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.binary_bits = v; settings->evalops.parse_options.binary_bits = v; settings->default_bits = -1; onBinaryBitsChanged(); if(settings->evalops.parse_options.twos_complement || settings->evalops.parse_options.hexadecimal_twos_complement) expressionFormatUpdated(true); else resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "digit grouping") || svar =="group") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = DIGIT_GROUPING_NONE; else if(equalsIgnoreCase(svalue, "none")) v = DIGIT_GROUPING_NONE; else if(empty_value || equalsIgnoreCase(svalue, "standard") || equalsIgnoreCase(svalue, "on")) v = DIGIT_GROUPING_STANDARD; else if(equalsIgnoreCase(svalue, "locale")) v = DIGIT_GROUPING_LOCALE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < DIGIT_GROUPING_NONE || v > DIGIT_GROUPING_LOCALE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.digit_grouping = (DigitGrouping) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "spell out logical") || svar == "spellout") SET_BOOL_D(settings->printops.spell_out_logical_operators) else if((equalsIgnoreCase(svar, "ignore dot") || svar == "nodot") && CALCULATOR->getDecimalPoint() != DOT) { SET_BOOL_PF(settings->evalops.parse_options.dot_as_separator) settings->dot_question_asked = true; } else if((equalsIgnoreCase(svar, "ignore comma") || svar == "nocomma") && CALCULATOR->getDecimalPoint() != COMMA) { SET_BOOL(settings->evalops.parse_options.comma_as_separator) CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); expressionFormatUpdated(false); } else if(equalsIgnoreCase(svar, "decimal comma")) { int v = -2; if(equalsIgnoreCase(svalue, "off")) v = 0; else if(empty_value || equalsIgnoreCase(svalue, "on")) v = 1; else if(equalsIgnoreCase(svalue, "locale")) v = -1; else if(svalue.find_first_not_of(SPACES MINUS NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < -1 || v > 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->decimal_comma = v; if(settings->decimal_comma > 0) CALCULATOR->useDecimalComma(); else if(settings->decimal_comma == 0) CALCULATOR->useDecimalPoint(settings->evalops.parse_options.comma_as_separator); if(v >= 0) { expressionFormatUpdated(false); resultDisplayUpdated(); } } } else if(equalsIgnoreCase(svar, "limit implicit multiplication") || svar == "limimpl") { int v = s2b(svalue); if(v < 0) {CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str());} else {settings->printops.limit_implicit_multiplication = v; settings->evalops.parse_options.limit_implicit_multiplication = v; expressionFormatUpdated(true);} } else if(equalsIgnoreCase(svar, "spacious") || svar == "space") SET_BOOL_D(settings->printops.spacious) else if(equalsIgnoreCase(svar, "unicode") || svar == "uni") { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str()); } else { settings->printops.use_unicode_signs = v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "units") || svar == "unit") SET_BOOL_PV(settings->evalops.parse_options.units_enabled) else if(equalsIgnoreCase(svar, "unknowns") || svar == "unknown") SET_BOOL_PV(settings->evalops.parse_options.unknowns_enabled) else if(equalsIgnoreCase(svar, "variables") || svar == "var") SET_BOOL_PV(settings->evalops.parse_options.variables_enabled) else if(equalsIgnoreCase(svar, "abbreviations") || svar == "abbr" || svar == "abbrev") SET_BOOL_D(settings->printops.abbreviate_names) else if(equalsIgnoreCase(svar, "show ending zeroes") || svar == "zeroes") SET_BOOL_D(settings->printops.show_ending_zeroes) else if(equalsIgnoreCase(svar, "repeating decimals") || svar == "repdeci") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = REPEATING_DECIMALS_OFF; else if(equalsIgnoreCase(svalue, "on") || equalsIgnoreCase(svalue, "ellipsis")) v = REPEATING_DECIMALS_ELLIPSIS; else if(equalsIgnoreCase(svalue, "overline")) v = REPEATING_DECIMALS_OVERLINE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < REPEATING_DECIMALS_OFF || v > REPEATING_DECIMALS_OVERLINE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v != settings->printops.indicate_infinite_series) { settings->printops.indicate_infinite_series = v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "angle unit") || svar == "angle") { int v = -1; if(equalsIgnoreCase(svalue, "rad") || equalsIgnoreCase(svalue, "radians")) v = ANGLE_UNIT_RADIANS; else if(equalsIgnoreCase(svalue, "deg") || equalsIgnoreCase(svalue, "degrees")) v = ANGLE_UNIT_DEGREES; else if(equalsIgnoreCase(svalue, "gra") || equalsIgnoreCase(svalue, "gradians")) v = ANGLE_UNIT_GRADIANS; else if(equalsIgnoreCase(svalue, "none")) v = ANGLE_UNIT_NONE; else if(equalsIgnoreCase(svalue, "custom")) v = ANGLE_UNIT_CUSTOM; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } else { Unit *u = CALCULATOR->getActiveUnit(svalue); if(u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1 && u->isActive() && u->isRegistered() && !u->isHidden()) { if(u == CALCULATOR->getRadUnit()) v = ANGLE_UNIT_RADIANS; else if(u == CALCULATOR->getGraUnit()) v = ANGLE_UNIT_GRADIANS; else if(u == CALCULATOR->getDegUnit()) v = ANGLE_UNIT_DEGREES; else {v = ANGLE_UNIT_CUSTOM; CALCULATOR->setCustomAngleUnit(u);} } } if(v < 0 || v > 4) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) { CALCULATOR->error(true, "Please specify a custom angle unit as argument (e.g. set angle arcsec).", NULL); } else { QAction *w; if(v == ANGLE_UNIT_CUSTOM) { w = findChild("action_angle_unit" + QString::fromStdString(CALCULATOR->customAngleUnit()->referenceName())); } else { w = find_child_data(this, "group_angleunit", v); } if(w) w->setChecked(true); settings->evalops.parse_options.angle_unit = (AngleUnit) v; expressionFormatUpdated(true); } } else if(equalsIgnoreCase(svar, "caret as xor") || equalsIgnoreCase(svar, "xor^")) SET_BOOL_PT(settings->caret_as_xor) else if(equalsIgnoreCase(svar, "concise uncertainty") || equalsIgnoreCase(svar, "concise")) { bool b = CALCULATOR->conciseUncertaintyInputEnabled(); SET_BOOL(b) if(b != CALCULATOR->conciseUncertaintyInputEnabled()) { CALCULATOR->setConciseUncertaintyInputEnabled(b); expressionFormatUpdated(false); } } else if(equalsIgnoreCase(svar, "parsing mode") || svar == "parse" || svar == "syntax") { int v = -1; if(equalsIgnoreCase(svalue, "adaptive")) v = PARSING_MODE_ADAPTIVE; else if(equalsIgnoreCase(svalue, "implicit first")) v = PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST; else if(equalsIgnoreCase(svalue, "conventional")) v = PARSING_MODE_CONVENTIONAL; else if(equalsIgnoreCase(svalue, "chain")) v = PARSING_MODE_CHAIN; else if(equalsIgnoreCase(svalue, "rpn")) v = PARSING_MODE_RPN; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < PARSING_MODE_ADAPTIVE || v > PARSING_MODE_RPN) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.parse_options.parsing_mode = (ParsingMode) v; settings->implicit_question_asked = (settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL || settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST); expressionFormatUpdated(true); } } else if(equalsIgnoreCase(svar, "update exchange rates") || svar == "upxrates") { int v = -2; if(equalsIgnoreCase(svalue, "never")) { settings->auto_update_exchange_rates = 0; } else if(equalsIgnoreCase(svalue, "ask")) { CALCULATOR->error(true, "Unsupported value: %s.", svalue.c_str(), NULL); } else { v = s2i(svalue); if(empty_value) v = 7; if(v < 0) CALCULATOR->error(true, "Unsupported value: %s.", svalue.c_str(), NULL); else settings->auto_update_exchange_rates = v; } } else if(equalsIgnoreCase(svar, "multiplication sign") || svar == "mulsign") { int v = -1; if(svalue == SIGN_MULTIDOT || svalue == ".") v = MULTIPLICATION_SIGN_DOT; else if(svalue == SIGN_MIDDLEDOT) v = MULTIPLICATION_SIGN_ALTDOT; else if(svalue == SIGN_MULTIPLICATION || svalue == "x") v = MULTIPLICATION_SIGN_X; else if(svalue == "*") v = MULTIPLICATION_SIGN_ASTERISK; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < MULTIPLICATION_SIGN_ASTERISK || v > MULTIPLICATION_SIGN_ALTDOT) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.multiplication_sign = (MultiplicationSign) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "division sign") || svar == "divsign") { int v = -1; if(svalue == SIGN_DIVISION_SLASH) v = DIVISION_SIGN_DIVISION_SLASH; else if(svalue == SIGN_DIVISION) v = DIVISION_SIGN_DIVISION; else if(svalue == "/") v = DIVISION_SIGN_SLASH; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.division_sign = (DivisionSign) v; resultDisplayUpdated(); } } else if(equalsIgnoreCase(svar, "approximation") || svar == "appr" || svar == "approx") { int v = -1; if(equalsIgnoreCase(svalue, "exact")) v = APPROXIMATION_EXACT; else if(equalsIgnoreCase(svalue, "auto")) v = -1; else if(equalsIgnoreCase(svalue, "dual")) v = APPROXIMATION_APPROXIMATE + 1; else if(empty_value || equalsIgnoreCase(svalue, "try exact") || svalue == "try") v = APPROXIMATION_TRY_EXACT; else if(equalsIgnoreCase(svalue, "approximate") || svalue == "approx") v = APPROXIMATION_APPROXIMATE; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v > APPROXIMATION_APPROXIMATE + 1) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { QAction *w = NULL; if(v < 0) w = findChild("action_autoappr"); else if(v == APPROXIMATION_APPROXIMATE + 1) w = findChild("action_dualappr"); else if(v == APPROXIMATION_EXACT) w = findChild("action_exact"); else if(v == APPROXIMATION_TRY_EXACT) w = findChild("action_approximate"); else if(v == APPROXIMATION_APPROXIMATE) w = findChild("action_approximate"); if(w) { w->setChecked(true); } if(v < 0) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; settings->dual_approximation = -1; } else if(v == APPROXIMATION_APPROXIMATE + 1) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; settings->dual_approximation = 1; } else { settings->evalops.approximation = (ApproximationMode) v; settings->dual_approximation = 0; } expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "interval calculation") || svar == "ic" || equalsIgnoreCase(svar, "uncertainty propagation") || svar == "up") { int v = -1; if(equalsIgnoreCase(svalue, "variance formula") || equalsIgnoreCase(svalue, "variance")) v = INTERVAL_CALCULATION_VARIANCE_FORMULA; else if(equalsIgnoreCase(svalue, "interval arithmetic") || svalue == "iv") v = INTERVAL_CALCULATION_INTERVAL_ARITHMETIC; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < INTERVAL_CALCULATION_NONE || v > INTERVAL_CALCULATION_SIMPLE_INTERVAL_ARITHMETIC) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.interval_calculation = (IntervalCalculation) v; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "autoconversion") || svar == "conv") { int v = -1; MixedUnitsConversion muc = MIXED_UNITS_CONVERSION_DEFAULT; if(equalsIgnoreCase(svalue, "none")) {v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_NONE;} else if(equalsIgnoreCase(svalue, "best")) v = POST_CONVERSION_OPTIMAL_SI; else if(equalsIgnoreCase(svalue, "optimalsi") || svalue == "si") v = POST_CONVERSION_OPTIMAL_SI; else if(empty_value || equalsIgnoreCase(svalue, "optimal")) v = POST_CONVERSION_OPTIMAL; else if(equalsIgnoreCase(svalue, "base")) v = POST_CONVERSION_BASE; else if(equalsIgnoreCase(svalue, "mixed")) v = POST_CONVERSION_OPTIMAL + 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == 1) v = 3; else if(v == 3) v = 1; } if(v == POST_CONVERSION_OPTIMAL + 1) { v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_DEFAULT; } else if(v == 0) { v = POST_CONVERSION_NONE; muc = MIXED_UNITS_CONVERSION_NONE; } if(v < 0 || v > POST_CONVERSION_OPTIMAL) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.auto_post_conversion = (AutoPostConversion) v; settings->evalops.mixed_units_conversion = muc; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "currency conversion") || svar == "curconv") SET_BOOL_E(settings->evalops.local_currency_conversion) else if(equalsIgnoreCase(svar, "algebra mode") || svar == "alg") { int v = -1; if(equalsIgnoreCase(svalue, "none")) v = STRUCTURING_NONE; else if(equalsIgnoreCase(svalue, "simplify") || equalsIgnoreCase(svalue, "expand")) v = STRUCTURING_SIMPLIFY; else if(equalsIgnoreCase(svalue, "factorize") || svalue == "factor") v = STRUCTURING_FACTORIZE; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > STRUCTURING_FACTORIZE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.structuring = (StructuringMode) v; settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "exact")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { setOption("approx exact"); } } else if(equalsIgnoreCase(svar, "ignore locale")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v != settings->ignore_locale) { if(v > 0) { settings->ignore_locale = true; } else { settings->ignore_locale = false; } CALCULATOR->error(false, "Please restart the program for the change to take effect.", NULL); } } else if(equalsIgnoreCase(svar, "save mode")) { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v > 0) { settings->save_mode_on_exit = true; } else { settings->save_mode_on_exit = false; } } else if(equalsIgnoreCase(svar, "save definitions") || svar == "save defs") { int v = s2b(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else if(v > 0) { settings->save_defs_on_exit = true; } else { settings->save_defs_on_exit = false; } } else if(equalsIgnoreCase(svar, "scientific notation") || svar == "exp mode" || svar == "exp" || svar == "exp display" || svar == "edisp") { int v = -1; bool valid = true; bool display = (svar == "exp display" || svar == "edisp"); if(!display && equalsIgnoreCase(svalue, "off")) v = EXP_NONE; else if(!display && equalsIgnoreCase(svalue, "auto")) v = EXP_PRECISION; else if(!display && equalsIgnoreCase(svalue, "pure")) v = EXP_PURE; else if(!display && (empty_value || svalue == "sci" || equalsIgnoreCase(svalue, "scientific"))) v = EXP_SCIENTIFIC; else if(!display && (svalue == "eng" || equalsIgnoreCase(svalue, "engineering"))) v = EXP_BASE_3; else if(svalue == "E" || (display && empty_value && settings->printops.exp_display == EXP_POWER_OF_10)) {v = EXP_UPPERCASE_E; display = true;} else if(svalue == "e") {v = EXP_LOWERCASE_E; display = true;} else if((display && svalue == "10") || (display && empty_value && settings->printops.exp_display != EXP_POWER_OF_10) || svalue == "pow" || svalue == "pow10" || equalsIgnoreCase(svalue, "power") || equalsIgnoreCase(svalue, "power of 10")) { v = EXP_POWER_OF_10; display = 1; } else if(svalue.find_first_not_of(SPACES NUMBERS MINUS) == std::string::npos) { v = s2i(svalue); if(display) v++; } else valid = false; if(display && valid && (v >= EXP_UPPERCASE_E && v <= EXP_POWER_OF_10)) { settings->printops.exp_display = (ExpDisplay) v; resultDisplayUpdated(); } else if(!display && valid) { settings->printops.min_exp = v; to_form = TO_FORM_OFF; QAction *action = find_child_data(this, "group_general", v); if(action) { action->setChecked(true); } resultFormatUpdated(); } else { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } } else if(equalsIgnoreCase(svar, "precision") || svar == "prec") { int v = 0; if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(v); w->blockSignals(false); } CALCULATOR->setPrecision(v); settings->previous_precision = 0; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "interval display") || svar == "ivdisp") { int v = -1; if(equalsIgnoreCase(svalue, "adaptive")) v = 0; else if(equalsIgnoreCase(svalue, "significant")) v = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS + 1; else if(equalsIgnoreCase(svalue, "interval")) v = INTERVAL_DISPLAY_INTERVAL + 1; else if(empty_value || equalsIgnoreCase(svalue, "plusminus")) v = INTERVAL_DISPLAY_PLUSMINUS + 1; else if(equalsIgnoreCase(svalue, "midpoint")) v = INTERVAL_DISPLAY_MIDPOINT + 1; else if(equalsIgnoreCase(svalue, "upper")) v = INTERVAL_DISPLAY_UPPER + 1; else if(equalsIgnoreCase(svalue, "lower")) v = INTERVAL_DISPLAY_LOWER + 1; else if(equalsIgnoreCase(svalue, "concise")) v = INTERVAL_DISPLAY_CONCISE + 1; else if(equalsIgnoreCase(svalue, "relative")) v = INTERVAL_DISPLAY_RELATIVE + 1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v == 0) { settings->adaptive_interval_display = true; settings->printops.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; resultFormatUpdated(); } else { v--; if(v < INTERVAL_DISPLAY_SIGNIFICANT_DIGITS || v > INTERVAL_DISPLAY_RELATIVE) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->adaptive_interval_display = false; settings->printops.interval_display = (IntervalDisplay) v; resultFormatUpdated(); } } } else if(equalsIgnoreCase(svar, "interval arithmetic") || svar == "ia" || svar == "interval") { bool b = CALCULATOR->usesIntervalArithmetic(); SET_BOOL(b) if(b != CALCULATOR->usesIntervalArithmetic()) { CALCULATOR->useIntervalArithmetic(b); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "variable units") || svar == "varunits") { bool b = CALCULATOR->variableUnitsEnabled(); SET_BOOL(b) if(b != CALCULATOR->variableUnitsEnabled()) { CALCULATOR->setVariableUnitsEnabled(b); expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "color")) { int v = -1; if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->colorize_result = v; } } else if(equalsIgnoreCase(svar, "calculate as you type") || svar == "autocalc") { bool b = settings->display_expression_status; SET_BOOL(b) if(b != settings->display_expression_status) { settings->display_expression_status = b; onExpressionStatusModeChanged(true); } } else if(equalsIgnoreCase(svar, "max decimals") || svar == "maxdeci") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(v < 0 ? -1 : v); w->blockSignals(false); } settings->printops.use_max_decimals = (v >= 0); settings->printops.max_decimals = v; resultFormatUpdated(); } else if(equalsIgnoreCase(svar, "min decimals") || svar == "mindeci") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); QSpinBox *w = findChild("spinbox_mindecimals"); if(w) { w->blockSignals(true); w->setValue(v < 0 ? 0 : v); w->blockSignals(false); } settings->printops.use_min_decimals = (v > 0); settings->printops.min_decimals = v; resultFormatUpdated(); } else if(equalsIgnoreCase(svar, "digits")) { int v = -1; if(equalsIgnoreCase(svalue, "off") || equalsIgnoreCase(svalue, "auto") || equalsIgnoreCase(svalue, "precision")) v = -1; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) v = s2i(svalue); if(v < PRECISION) { QSpinBox *w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(-1); w->blockSignals(false); } } if(v <= 0 || v == PRECISION) { settings->printops.max_decimals = -1; settings->printops.use_max_decimals = false; resultFormatUpdated(); } else if(v >= 2 && v < PRECISION) { settings->printops.max_decimals = -v; settings->printops.use_max_decimals = true; resultFormatUpdated(); } else { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } } else if(equalsIgnoreCase(svar, "fractions") || svar == "fr") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = FRACTION_DECIMAL; else if(equalsIgnoreCase(svalue, "exact")) v = FRACTION_DECIMAL_EXACT; else if(empty_value || equalsIgnoreCase(svalue, "on")) v = FRACTION_FRACTIONAL; else if(equalsIgnoreCase(svalue, "combined") || equalsIgnoreCase(svalue, "mixed")) v = FRACTION_COMBINED; else if(equalsIgnoreCase(svalue, "long")) v = FRACTION_PERMYRIAD + 1; else if(equalsIgnoreCase(svalue, "dual")) v = FRACTION_PERMYRIAD + 2; else if(equalsIgnoreCase(svalue, "auto")) v = -1; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); if(v == FRACTION_COMBINED + 1) v = FRACTION_PERMYRIAD + 1; else if(v == FRACTION_COMBINED + 2) v = FRACTION_PERMYRIAD + 2; else if(v > FRACTION_COMBINED + 2) v -= 2; } else { Variable *var = CALCULATOR->getActiveVariable(svalue); if(var && var->referenceName() == "percent") { v = FRACTION_PERCENT; } else if(var && var->referenceName() == "permille") { v = FRACTION_PERMILLE; } else if(var && var->referenceName() == "permyriad") { v = FRACTION_PERMYRIAD; } else { int tofr = 0; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(svalue), tofr, QString(), true); if(fden != 0) { if(tofr == 1) v = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else v = FRACTION_COMBINED_FIXED_DENOMINATOR; if(fden > 0) CALCULATOR->setFixedDenominator(fden); } } } if(v > FRACTION_PERMYRIAD + 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->printops.restrict_fraction_length = (v == FRACTION_FRACTIONAL || v == FRACTION_COMBINED); if(v < 0) settings->dual_fraction = -1; else if(v == FRACTION_PERMYRIAD + 2) settings->dual_fraction = 1; else settings->dual_fraction = 0; if(v == FRACTION_PERMYRIAD + 1) v = FRACTION_FRACTIONAL; else if(v < 0 || v == FRACTION_PERMYRIAD + 2) v = FRACTION_DECIMAL; settings->printops.number_fraction_format = (NumberFractionFormat) v; resultFormatUpdated(); } } else if(equalsIgnoreCase(svar, "complex form") || svar == "cplxform") { int v = -1; if(equalsIgnoreCase(svalue, "rectangular") || equalsIgnoreCase(svalue, "cartesian") || svalue == "rect") v = COMPLEX_NUMBER_FORM_RECTANGULAR; else if(equalsIgnoreCase(svalue, "exponential") || svalue == "exp") v = COMPLEX_NUMBER_FORM_EXPONENTIAL; else if(equalsIgnoreCase(svalue, "polar")) v = COMPLEX_NUMBER_FORM_POLAR; else if(equalsIgnoreCase(svalue, "angle") || equalsIgnoreCase(svalue, "phasor")) v = COMPLEX_NUMBER_FORM_CIS + 1; else if(svar == "cis") v = COMPLEX_NUMBER_FORM_CIS; else if(!empty_value && svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 4) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->complex_angle_form = (v > 3); if(v == 4) v--; settings->evalops.complex_number_form = (ComplexNumberForm) v; expressionCalculationUpdated(); } } else if(equalsIgnoreCase(svar, "read precision") || svar == "readprec") { int v = -1; if(equalsIgnoreCase(svalue, "off")) v = DONT_READ_PRECISION; else if(equalsIgnoreCase(svalue, "always")) v = ALWAYS_READ_PRECISION; else if(empty_value || equalsIgnoreCase(svalue, "when decimals") || equalsIgnoreCase(svalue, "on")) v = READ_PRECISION_WHEN_DECIMALS; else if(svalue.find_first_not_of(SPACES NUMBERS) == std::string::npos) { v = s2i(svalue); } if(v < 0 || v > 2) { CALCULATOR->error(true, "Illegal value: %s.", svalue.c_str(), NULL); } else { settings->evalops.parse_options.read_precision = (ReadPrecisionMode) v; expressionFormatUpdated(true); } } else { if(i_underscore == std::string::npos) { if(index != std::string::npos) { if((index = svar.find_last_of(SPACES)) != std::string::npos) { svar = svar.substr(0, index); remove_blank_ends(svar); str = str.substr(index + 1); remove_blank_ends(str); svalue = str; gsub("_", " ", svar); goto set_option_place; } } if(!empty_value && !svalue.empty()) { svar += " "; svar += svalue; svalue = "1"; empty_value = true; goto set_option_place; } } CALCULATOR->error(true, "Unrecognized option: %s.", svar.c_str(), NULL); } } void QalculateWindow::calculateRPN(int op) { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, true, (MathOperation) op, NULL); } void QalculateWindow::calculateRPN(MathFunction *f) { if(expressionEdit->expressionHasChanged()) { if(!expressionEdit->toPlainText().trimmed().isEmpty()) { calculateExpression(true); } } calculateExpression(true, true, OPERATION_ADD, f); } void QalculateWindow::RPNRegisterAdded(std::string text, int index) { rpnView->insertRow(index); QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(unhtmlize(text))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); rpnView->setItem(index, 0, item); rpnCopyAction->setEnabled(true); rpnDeleteAction->setEnabled(true); rpnClearAction->setEnabled(true); if(CALCULATOR->RPNStackSize() >= 2) { rpnUpAction->setEnabled(true); rpnDownAction->setEnabled(true); rpnSwapAction->setEnabled(true); } updateInsertFunctionDialogs(); } void QalculateWindow::RPNRegisterRemoved(int index) { rpnView->removeRow(index); if(CALCULATOR->RPNStackSize() == 0) { rpnCopyAction->setEnabled(false); rpnDeleteAction->setEnabled(false); rpnClearAction->setEnabled(false); } if(CALCULATOR->RPNStackSize() < 2) { rpnUpAction->setEnabled(false); rpnDownAction->setEnabled(false); rpnSwapAction->setEnabled(false); } updateInsertFunctionDialogs(); } void QalculateWindow::RPNRegisterChanged(std::string text, int index) { QTableWidgetItem *item = rpnView->item(index, 0); if(item) { item->setText(QString::fromStdString(unhtmlize(text))); } else { item = new QTableWidgetItem(QString::fromStdString(unhtmlize(text))); item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); rpnView->setItem(index, 0, item); } } void QalculateWindow::approximateResult() { ApproximationMode appr_bak = settings->evalops.approximation; NumberFractionFormat frac_bak = settings->printops.number_fraction_format; int dappr_bak = settings->dual_approximation; int dfrac_bak = settings->dual_fraction; settings->dual_approximation = 0; settings->dual_fraction = 0; settings->printops.number_fraction_format = FRACTION_DECIMAL; settings->evalops.approximation = APPROXIMATION_TRY_EXACT; executeCommand(COMMAND_EVAL); settings->evalops.approximation = appr_bak; settings->printops.number_fraction_format = frac_bak; settings->dual_approximation = dappr_bak; settings->dual_fraction = dfrac_bak; } void QalculateWindow::toggleResultFraction() { if(expressionEdit->expressionHasChanged()) { if(settings->status_in_history && !auto_result.empty()) { NumberFractionFormat frac_bak = settings->printops.number_fraction_format; int dfrac_bak = settings->dual_fraction; settings->dual_fraction = 0; if(unhtmlize(auto_result_text).find(settings->printops.decimalpoint()) != std::string::npos) settings->printops.number_fraction_format = FRACTION_COMBINED; else settings->printops.number_fraction_format = FRACTION_DECIMAL; auto_format_updated = true; int acd_bak = settings->auto_calculate_delay; settings->auto_calculate_delay = 0; expressionEdit->displayParseStatus(true); settings->auto_calculate_delay = acd_bak; settings->printops.number_fraction_format = frac_bak; settings->dual_fraction = dfrac_bak; } } else if(!result_text.empty()) { if(unhtmlize(result_text).find(settings->printops.decimalpoint()) != std::string::npos) to_fraction = 2; else to_fraction = 3; to_fixed_fraction = 0; setResult(NULL, true, false, false); } } void QalculateWindow::calculateSelection() { if(!expressionEdit->textCursor().hasSelection()) return; calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", "", true, true); } void QalculateWindow::calculateExpression(bool force, bool do_mathoperation, MathOperation op, MathFunction *f, bool do_stack, size_t stack_index, std::string execute_str, std::string str, bool check_exrates, bool calculate_selection) { workspace_changed = true; std::string saved_execute_str = execute_str; if(b_busy) return; if(autoCalculateTimer) autoCalculateTimer->stop(); auto_expression = ""; auto_result = ""; auto_result_text = ""; auto_exact_text = ""; auto_aborted = false; prev_autocalculable = 1; expressionEdit->hideCompletion(); b_busy++; bool do_factors = false, do_mixed = false, do_pfe = false, do_expand = false, do_bases = false, do_calendars = false; if(do_stack && !settings->rpn_mode) do_stack = false; if(do_stack && do_mathoperation && f && stack_index == 0) do_stack = false; if(!do_stack) stack_index = 0; if(execute_str.empty()) { to_fraction = 0; to_fixed_fraction = 0; to_prefix = 0; to_base = 0; to_duo_syms = false; to_bits = 0; to_nbase.clear(); to_caf = -1; to_form = TO_FORM_OFF; } bool current_expr = false; if(str.empty() && !do_mathoperation) { if(do_stack) { QTableWidgetItem *item = rpnView->item(stack_index, 0); if(!item) {b_busy--; return;} str = item->text().toStdString(); } else if(calculate_selection) { str = expressionEdit->textCursor().selectedText().toStdString(); } else { current_expr = true; str = expressionEdit->toPlainText().toStdString(); if(!force && (expressionEdit->expressionHasChanged() || str.find_first_not_of(SPACES) == std::string::npos)) { b_busy--; return; } expressionEdit->setExpressionHasChanged(false); if(!do_mathoperation && !str.empty() && !block_expression_history) expressionEdit->addToHistory(); askDot(str); } } std::string to_str, str_conv; if(execute_str.empty()) { bool double_tag = false; to_str = CALCULATOR->parseComments(str, settings->evalops.parse_options, &double_tag); if(!to_str.empty()) { if(str.empty()) { if(!double_tag && settings->current_result) { expressionEdit->clear(); CALCULATOR->message(MESSAGE_INFORMATION, to_str.c_str(), NULL); historyView->addMessages(); b_busy--; return; } execute_str = CALCULATOR->getFunctionById(FUNCTION_ID_MESSAGE)->referenceName(); execute_str += "("; if(to_str.find("\"") == std::string::npos) {execute_str += "\""; execute_str += to_str; execute_str += "\"";} else if(to_str.find("\'") == std::string::npos) {execute_str += "\'"; execute_str += to_str; execute_str += "\'";} else execute_str += to_str; execute_str += ")"; } else { CALCULATOR->message(MESSAGE_INFORMATION, to_str.c_str(), NULL); } } // qalc command bool b_command = false; if(!calculate_selection && str[0] == '/' && str.length() > 1) { size_t i = str.find_first_not_of(SPACES, 1); if(i != std::string::npos && (signed char) str[i] > 0 && is_not_in(NUMBER_ELEMENTS OPERATORS, str[i])) { b_command = true; } } if(b_command) { str.erase(0, 1); remove_blank_ends(str); size_t slen = str.length(); size_t ispace = str.find_first_of(SPACES); std::string scom; if(ispace == std::string::npos) { scom = ""; } else { scom = str.substr(1, ispace); } if(equalsIgnoreCase(scom, "convert") || equalsIgnoreCase(scom, "to")) { str = std::string("to") + str.substr(ispace, slen - ispace); b_command = false; } else if((str.length() > 2 && str[0] == '-' && str[1] == '>') || (str.length() > 3 && str[0] == '\xe2' && ((str[1] == '\x86' && str[2] == '\x92') || (str[1] == '\x9e' && (unsigned char) str[2] >= 148 && (unsigned char) str[3] <= 191)))) { b_command = false; } else if(str == "M+" || str == "M-" || str == "M−" || str == "MS" || str == "MC") { b_command = false; } } if(b_command) { remove_blank_ends(str); size_t slen = str.length(); size_t ispace = str.find_first_of(SPACES); std::string scom; if(ispace == std::string::npos) { scom = ""; } else { scom = str.substr(0, ispace); } b_busy--; if(equalsIgnoreCase(scom, "set")) { if(current_expr) setPreviousExpression(); str = str.substr(ispace + 1, slen - (ispace + 1)); setOption(str); } else if(equalsIgnoreCase(scom, "save") || equalsIgnoreCase(scom, "store")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "mode")) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->show_bases = basesDock->isVisible(); settings->savePreferences(); if(current_expr) expressionEdit->clear(); } else if(equalsIgnoreCase(str, "definitions")) { if(!CALCULATOR->saveDefinitions()) { QMessageBox::critical(this, tr("Error"), tr("Couldn't write definitions"), QMessageBox::Ok); } else { if(current_expr) expressionEdit->clear(); } } else { std::string name = str, cat, title; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } bool catset = false; if(str.empty()) { cat = CALCULATOR->temporaryCategory(); } else { if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { cat = str.substr(1, i - 1); title = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(title); } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { cat = str.substr(0, i); title = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(title); } } catset = true; } bool b = true; if(!CALCULATOR->variableNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } Variable *v = NULL; if(b) v = CALCULATOR->getActiveVariable(name, true); if(b && ((!v && CALCULATOR->variableNameTaken(name)) || (v && (!v->isKnown() || !v->isLocal())))) { CALCULATOR->error(true, "A unit or variable with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { if(v && v->isLocal() && v->isKnown()) { if(catset) v->setCategory(cat); if(!title.empty()) v->setTitle(title); ((KnownVariable*) v)->set(*mstruct); if(v->countNames() == 0) { ExpressionName ename(name); ename.reference = true; v->setName(ename, 1); } else { v->setName(name, 1); } } else { CALCULATOR->addVariable(new KnownVariable(cat, name, *mstruct, title)); } expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } } } } else if(equalsIgnoreCase(scom, "variable")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); std::string name = str, expr; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } if(str.length() >= 2 && str[0] == '\"' && str[str.length() - 1] == '\"') str = str.substr(1, str.length() - 2); expr = str; bool b = true; if(!CALCULATOR->variableNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } Variable *v = NULL; if(b) v = CALCULATOR->getActiveVariable(name, true); if(b && ((!v && CALCULATOR->variableNameTaken(name)) || (v && (!v->isKnown() || !v->isLocal())))) { CALCULATOR->error(true, "A unit or variable with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { if(v && v->isLocal() && v->isKnown()) { ((KnownVariable*) v)->set(expr); if(v->countNames() == 0) { ExpressionName ename(name); ename.reference = true; v->setName(ename, 1); } else { v->setName(name, 1); } } else { CALCULATOR->addVariable(new KnownVariable("", name, expr)); } expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } } else if(equalsIgnoreCase(scom, "function")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); std::string name = str, expr; if(str[0] == '\"') { size_t i = str.find('\"', 1); if(i != std::string::npos) { name = str.substr(1, i - 1); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } else { size_t i = str.find_first_of(SPACES, 1); if(i != std::string::npos) { name = str.substr(0, i); str = str.substr(i + 1, str.length() - (i + 1)); remove_blank_ends(str); } else { str = ""; } } if(str.length() >= 2 && str[0] == '\"' && str[str.length() - 1] == '\"') str = str.substr(1, str.length() - 2); expr = str; bool b = true; if(!CALCULATOR->functionNameIsValid(name)) { CALCULATOR->error(true, "Illegal name: %s.", name.c_str(), NULL); b = false; } MathFunction *f = CALCULATOR->getActiveFunction(name, true); if(b && ((!f && CALCULATOR->functionNameTaken(name)) || (f && (!f->isLocal() || f->subtype() != SUBTYPE_USER_FUNCTION)))) { CALCULATOR->error(true, "A function with the same name (%s) already exists.", name.c_str(), NULL); b = false; } if(b) { gsub("{", "\a", expr); gsub("}", "\b", expr); fix_expression(expr); gsub("\a", "{", expr); gsub("\b", "}", expr); if(f && f->isLocal() && f->subtype() == SUBTYPE_USER_FUNCTION) { ((UserFunction*) f)->setFormula(expr); if(f->countNames() == 0) { ExpressionName ename(name); ename.reference = true; f->setName(ename, 1); } else { f->setName(name, 1); } } else { CALCULATOR->addFunction(new UserFunction("", name, expr)); } expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(current_expr) expressionEdit->clear(); functionsMenu->clear(); } } else if(equalsIgnoreCase(scom, "delete")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); Variable *v = CALCULATOR->getActiveVariable(str); if(v && v->isLocal()) { v->destroy(); expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(current_expr) expressionEdit->clear(); } else { if(str.length() > 2 && str[str.length() - 2] == '(' && str[str.length() - 1] == ')') str = str.substr(0, str.length() - 2); MathFunction *f = CALCULATOR->getActiveFunction(str); if(f && f->isLocal()) { f->destroy(); expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); if(current_expr) expressionEdit->clear(); } else { CALCULATOR->error(true, "No user-defined variable or function with the specified name (%s) exist.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(scom, "keep") || equalsIgnoreCase(scom, "unkeep")) { bool unkeep = equalsIgnoreCase(scom, "unkeep"); str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); Variable *v = CALCULATOR->getActiveVariable(str); bool b = v && v->isLocal(); if(b && (v->category() == CALCULATOR->temporaryCategory()) == !unkeep) { if(unkeep) v->setCategory(CALCULATOR->temporaryCategory()); else v->setCategory(""); expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(current_expr) expressionEdit->clear(); variablesMenu->clear(); unitsMenu->clear(); } else { if(str.length() > 2 && str[str.length() - 2] == '(' && str[str.length() - 1] == ')') str = str.substr(0, str.length() - 2); MathFunction *f = CALCULATOR->getActiveFunction(str); if(f && f->isLocal()) { if((f->category() == CALCULATOR->temporaryCategory()) == !unkeep) { if(unkeep) f->setCategory(CALCULATOR->temporaryCategory()); else f->setCategory(""); expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(current_expr) expressionEdit->clear(); functionsMenu->clear(); } } else if(!b) { CALCULATOR->error(true, "No user-defined variable or function with the specified name (%s) exist.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(scom, "base")) { if(current_expr) setPreviousExpression(); setOption(str); } else if(equalsIgnoreCase(scom, "assume")) { if(current_expr) setPreviousExpression(); std::string str2 = "assumptions "; setOption(str2 + str.substr(ispace + 1, slen - (ispace + 1))); } else if(equalsIgnoreCase(scom, "rpn")) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "syntax")) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); expressionFormatUpdated(false); } else if(equalsIgnoreCase(str, "stack")) { if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); } else { int v = s2b(str); if(v < 0) { CALCULATOR->error(true, "Illegal value: %s.", str.c_str(), NULL); } else if(v) { QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); settings->evalops.parse_options.parsing_mode = PARSING_MODE_RPN; expressionFormatUpdated(false); } else { if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_RPN) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); expressionFormatUpdated(false); } } } else if(equalsIgnoreCase(str, "exrates")) { if(current_expr) setPreviousExpression(); fetchExchangeRates(); } else if(equalsIgnoreCase(str, "stack")) { rpnDock->show(); rpnDock->raise(); } else if(equalsIgnoreCase(str, "swap")) { if(CALCULATOR->RPNStackSize() > 1) { rpnView->selectionModel()->clear(); registerSwap(); } } else if(equalsIgnoreCase(scom, "swap")) { if(CALCULATOR->RPNStackSize() > 1) { int index1 = 0, index2 = 0; str = str.substr(ispace + 1, slen - (ispace + 1)); std::string str2 = ""; remove_blank_ends(str); ispace = str.find_first_of(SPACES); if(ispace != std::string::npos) { str2 = str.substr(ispace + 1, str.length() - (ispace + 1)); str = str.substr(0, ispace); remove_blank_ends(str2); remove_blank_ends(str); } index1 = s2i(str); if(str2.empty()) index2 = 1; else index2 = s2i(str2); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index2 < 0) index2 = (int) CALCULATOR->RPNStackSize() + 1 + index2; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize() || (!str2.empty() && (index2 <= 0 || index2 > (int) CALCULATOR->RPNStackSize()))) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else if(index2 != 1 && index1 != 1) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(index1 != index2) { if(index1 == 1) index1 = index2; QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); registerSwap(); } } } } else if(equalsIgnoreCase(scom, "move")) { CALCULATOR->error(true, "Unsupported command: %s.", scom.c_str(), NULL); } else if(equalsIgnoreCase(str, "rotate")) { if(CALCULATOR->RPNStackSize() > 1) { rpnView->selectionModel()->clear(); registerDown(); } } else if(equalsIgnoreCase(scom, "rotate")) { if(CALCULATOR->RPNStackSize() > 1) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); if(equalsIgnoreCase(str, "up")) { rpnView->selectionModel()->clear(); registerUp(); } else if(equalsIgnoreCase(str, "down")) { rpnView->selectionModel()->clear(); registerDown(); } else { CALCULATOR->error(true, "Illegal value: %s.", str.c_str(), NULL); } } } else if(equalsIgnoreCase(str, "copy")) { if(CALCULATOR->RPNStackSize() > 0) { rpnView->selectionModel()->clear(); copyRegister(); } } else if(equalsIgnoreCase(scom, "copy")) { if(CALCULATOR->RPNStackSize() > 0) { str = str.substr(ispace + 1, slen - (ispace + 1)); remove_blank_ends(str); int index1 = s2i(str); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize()) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else { QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); copyRegister(); } } } } else if(equalsIgnoreCase(str, "clear stack")) { if(CALCULATOR->RPNStackSize() > 0) clearStack(); } else if(equalsIgnoreCase(str, "pop")) { if(CALCULATOR->RPNStackSize() > 0) { rpnView->selectionModel()->clear(); deleteRegister(); } } else if(equalsIgnoreCase(scom, "pop")) { if(CALCULATOR->RPNStackSize() > 0) { str = str.substr(ispace + 1, slen - (ispace + 1)); int index1 = s2i(str); if(index1 < 0) index1 = (int) CALCULATOR->RPNStackSize() + 1 + index1; if(index1 <= 0 || index1 > (int) CALCULATOR->RPNStackSize()) { CALCULATOR->error(true, "Missing stack index: %s.", i2s(index1).c_str(), NULL); } else { QTableWidgetItem *item = rpnView->item(index1 - 1, 0); if(item) { rpnView->selectionModel()->clear(); item->setSelected(true); deleteRegister(); } } } } else if(equalsIgnoreCase(str, "factor")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_FACTORIZE); } else if(equalsIgnoreCase(str, "partial fraction")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); } else if(equalsIgnoreCase(str, "simplify") || equalsIgnoreCase(str, "expand")) { if(current_expr) setPreviousExpression(); executeCommand(COMMAND_EXPAND); } else if(equalsIgnoreCase(str, "exact")) { if(current_expr) setPreviousExpression(); setOption("approx exact"); } else if(equalsIgnoreCase(str, "approximate") || str == "approx") { if(current_expr) setPreviousExpression(); setOption("approx try exact"); } else if(equalsIgnoreCase(str, "mode")) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(equalsIgnoreCase(str, "help") || str == "?") { help(); if(current_expr) expressionEdit->clear(); } else if(equalsIgnoreCase(str, "list")) { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } else if(equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find") || equalsIgnoreCase(scom, "info") || equalsIgnoreCase(scom, "help")) { str = str.substr(ispace + 1); remove_blank_ends(str); char list_type = 0; if(equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find")) { size_t i = str.find_first_of(SPACES); std::string str1, str2; if(i == std::string::npos) { str1 = str; } else { str1 = str.substr(0, i); str2 = str.substr(i + 1); remove_blank_ends(str2); } if(equalsIgnoreCase(str1, "currencies")) list_type = 'c'; else if(equalsIgnoreCase(str1, "functions")) list_type = 'f'; else if(equalsIgnoreCase(str1, "variables")) list_type = 'v'; else if(equalsIgnoreCase(str1, "units")) list_type = 'u'; else if(equalsIgnoreCase(str1, "prefixes")) list_type = 'p'; if(list_type == 'c') { openUnits(); unitsDialog->selectCategory(CALCULATOR->getUnitById(UNIT_ID_EURO)->category()); unitsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'f') { openFunctions(); functionsDialog->selectCategory("All"); functionsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'v') { openVariables(); variablesDialog->selectCategory("All"); variablesDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'u') { openUnits(); unitsDialog->selectCategory("All"); unitsDialog->setSearch(QString::fromStdString(str2)); } else if(list_type == 'p') { CALCULATOR->error(true, "Unsupported command: %s.", str.c_str(), NULL); } } if(list_type == 0) { ExpressionItem *item = CALCULATOR->getActiveExpressionItem(str); if(item) { if(item->type() == TYPE_UNIT) { openUnits(); unitsDialog->selectCategory("All"); unitsDialog->setSearch(QString::fromStdString(str)); } else if(item->type() == TYPE_FUNCTION) { openFunctions(); functionsDialog->selectCategory("All"); functionsDialog->setSearch(QString::fromStdString(str)); } else if(item->type() == TYPE_VARIABLE) { openVariables(); variablesDialog->selectCategory("All"); variablesDialog->setSearch(QString::fromStdString(str)); } if(current_expr) expressionEdit->clear(); } else { CALCULATOR->error(true, "No function, variable, or unit with the specified name (%s) was found.", str.c_str(), NULL); } } else { if(current_expr) expressionEdit->clear(); } } else if(equalsIgnoreCase(str, "clear history")) { historyView->editClear(); expressionEdit->clearHistory(); } else if(equalsIgnoreCase(str, "clear")) { expressionEdit->clear(); } else if(equalsIgnoreCase(str, "quit") || equalsIgnoreCase(str, "exit")) { qApp->closeAllWindows(); return; } else { CALCULATOR->error(true, "Unknown command: %s.", str.c_str(), NULL); } displayMessages(); return; } } if(execute_str.empty() && !calculate_selection) { if(str == "MC") { b_busy--; if(current_expr) setPreviousExpression(); onMCClicked(); return; } else if(str == "MS") { b_busy--; if(current_expr) setPreviousExpression(); onMSClicked(); return; } else if(str == "M+") { b_busy--; if(current_expr) setPreviousExpression(); onMPlusClicked(); return; } else if(str == "M-" || str == "M−") { b_busy--; if(current_expr) setPreviousExpression(); onMMinusClicked(); return; } } ComplexNumberForm cnf_bak = settings->evalops.complex_number_form; ComplexNumberForm cnf = settings->evalops.complex_number_form; bool delay_complex = false; bool b_units_saved = settings->evalops.parse_options.units_enabled; AutoPostConversion save_auto_post_conversion = settings->evalops.auto_post_conversion; MixedUnitsConversion save_mixed_units_conversion = settings->evalops.mixed_units_conversion; had_to_expression = false; std::string from_str = str; bool last_is_space = !from_str.empty() && is_in(SPACES, from_str[from_str.length() - 1]); if(execute_str.empty() && CALCULATOR->separateToExpression(from_str, to_str, settings->evalops, true, !do_stack && !calculate_selection)) { remove_duplicate_blanks(to_str); had_to_expression = true; std::string str_left; std::string to_str1, to_str2; bool do_to = false; while(true) { if(!from_str.empty()) { if(last_is_space) to_str += " "; CALCULATOR->separateToExpression(to_str, str_left, settings->evalops, true, false); remove_blank_ends(to_str); } else if(!settings->current_result) { b_busy--; if(current_expr) setPreviousExpression(); return; } size_t ispace = to_str.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = to_str.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = to_str.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(to_str, "hex") || equalsIgnoreCase(to_str, "hexadecimal") || equalsIgnoreCase(to_str, tr("hexadecimal").toStdString())) { to_base = BASE_HEXADECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "oct") || equalsIgnoreCase(to_str, "octal") || equalsIgnoreCase(to_str, tr("octal").toStdString())) { to_base = BASE_OCTAL; do_to = true; } else if(equalsIgnoreCase(to_str, "dec") || equalsIgnoreCase(to_str, "decimal") || equalsIgnoreCase(to_str, tr("decimal").toStdString())) { to_base = BASE_DECIMAL; to_form = EXP_NONE; do_to = true; } else if(equalsIgnoreCase(to_str, "duo") || equalsIgnoreCase(to_str, "duodecimal") || equalsIgnoreCase(to_str, tr("duodecimal").toStdString())) { to_base = BASE_DUODECIMAL; to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "doz") || equalsIgnoreCase(to_str, "dozenal")) { to_base = BASE_DUODECIMAL; to_duo_syms = true; do_to = true; } else if(equalsIgnoreCase(to_str, "bin") || equalsIgnoreCase(to_str, "binary") || equalsIgnoreCase(to_str, tr("binary").toStdString())) { to_base = BASE_BINARY; do_to = true; } else if(equalsIgnoreCase(to_str, "roman") || equalsIgnoreCase(to_str, tr("roman").toStdString())) { to_base = BASE_ROMAN_NUMERALS; do_to = true; } else if(equalsIgnoreCase(to_str, "bijective") || equalsIgnoreCase(to_str, tr("bijective").toStdString())) { to_base = BASE_BIJECTIVE_26; do_to = true; } else if(equalsIgnoreCase(to_str, "bcd")) { to_base = BASE_BINARY_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa") || equalsIgnoreCase(to_str, "sexagesimal") || equalsIgnoreCase(to_str, tr("sexagesimal").toStdString())) { to_base = BASE_SEXAGESIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa2") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "2")) { to_base = BASE_SEXAGESIMAL_2; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa3") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "3")) { to_base = BASE_SEXAGESIMAL_3; do_to = true; } else if(equalsIgnoreCase(to_str, "latitude") || equalsIgnoreCase(to_str, tr("latitude").toStdString())) { to_base = BASE_LATITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "latitude", tr("latitude"), "2")) { to_base = BASE_LATITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "longitude") || equalsIgnoreCase(to_str, tr("longitude").toStdString())) { to_base = BASE_LONGITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "longitude", tr("longitude"), "2")) { to_base = BASE_LONGITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "fp32") || equalsIgnoreCase(to_str, "binary32") || equalsIgnoreCase(to_str, "float")) { to_base = BASE_FP32; do_to = true; } else if(equalsIgnoreCase(to_str, "fp64") || equalsIgnoreCase(to_str, "binary64") || equalsIgnoreCase(to_str, "double")) { to_base = BASE_FP64; do_to = true; } else if(equalsIgnoreCase(to_str, "fp16") || equalsIgnoreCase(to_str, "binary16")) { to_base = BASE_FP16; do_to = true; } else if(equalsIgnoreCase(to_str, "fp80")) { to_base = BASE_FP80; do_to = true; } else if(equalsIgnoreCase(to_str, "fp128") || equalsIgnoreCase(to_str, "binary128")) { to_base = BASE_FP128; do_to = true; } else if(equalsIgnoreCase(to_str, "time") || equalsIgnoreCase(to_str, tr("time").toStdString())) { to_base = BASE_TIME; do_to = true; } else if(equalsIgnoreCase(to_str, "Unicode")) { to_base = BASE_UNICODE; do_to = true; } else if(equalsIgnoreCase(to_str, "sci") || EQUALS_IGNORECASE_AND_LOCAL(to_str, "scientific", tr("scientific"))) { to_form = EXP_PURE; do_to = true; } else if(equalsIgnoreCase(to_str, "eng") || EQUALS_IGNORECASE_AND_LOCAL(to_str, "engineering", tr("engineering"))) { to_form = EXP_BASE_3; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL(to_str, "simple", tr("simple"))) { to_form = EXP_NONE; do_to = true; } else if(equalsIgnoreCase(to_str, "utc") || equalsIgnoreCase(to_str, "gmt")) { settings->printops.time_zone = TIME_ZONE_UTC; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "bin") && is_in(NUMBERS, to_str[3])) { to_base = BASE_BINARY; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "hex") && is_in(NUMBERS, to_str[3])) { to_base = BASE_HEXADECIMAL; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && (equalsIgnoreCase(to_str.substr(0, 3), "utc") || equalsIgnoreCase(to_str.substr(0, 3), "gmt"))) { to_str = to_str.substr(3); remove_blanks(to_str); bool b_minus = false; if(to_str[0] == '+') { to_str.erase(0, 1); } else if(to_str[0] == '-') { b_minus = true; to_str.erase(0, 1); } else if(to_str.find(SIGN_MINUS) == 0) { b_minus = true; to_str.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!to_str.empty() && sscanf(to_str.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; if(b_minus) itz = -itz; } else { CALCULATOR->error(true, tr("Time zone parsing failed.").toUtf8().data(), NULL); } settings->printops.time_zone = TIME_ZONE_CUSTOM; settings->printops.custom_time_zone = itz; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(to_str == "CET") { settings->printops.time_zone = TIME_ZONE_CUSTOM; settings->printops.custom_time_zone = 60; if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); settings->printops.time_zone = TIME_ZONE_LOCAL; return; } do_to = true; } else if(equalsIgnoreCase(to_str, "bases") || equalsIgnoreCase(to_str, tr("bases").toStdString())) { if(from_str.empty()) { b_busy--; if(current_expr) setPreviousExpression(); onBasesActivated(true); return; } do_bases = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "calendars") || equalsIgnoreCase(to_str, tr("calendars").toStdString())) { if(from_str.empty()) { b_busy--; if(current_expr) setPreviousExpression(); openCalendarConversion(); return; } do_calendars = true; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "rectangular") || equalsIgnoreCase(to_str, "cartesian") || equalsIgnoreCase(to_str, tr("rectangular").toStdString()) || equalsIgnoreCase(to_str, tr("cartesian").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_RECTANGULAR; } else if(equalsIgnoreCase(to_str, "exponential") || equalsIgnoreCase(to_str, tr("exponential").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_EXPONENTIAL; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_EXPONENTIAL; } else if(equalsIgnoreCase(to_str, "polar") || equalsIgnoreCase(to_str, tr("polar").toStdString())) { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_POLAR; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_POLAR; } else if(to_str == "cis") { to_caf = 0; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "phasor") || equalsIgnoreCase(to_str, tr("phasor").toStdString()) || equalsIgnoreCase(to_str, "angle") || equalsIgnoreCase(to_str, tr("angle").toStdString())) { to_caf = 1; do_to = true; if(from_str.empty()) { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_CIS; b_busy--; executeCommand(COMMAND_EVAL); if(current_expr) setPreviousExpression(); settings->evalops.complex_number_form = cnf_bak; return; } cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "optimal") || equalsIgnoreCase(to_str, tr("optimal").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_OPTIMAL); if(current_expr) setPreviousExpression(); return; } settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL_SI; str_conv = ""; do_to = true; do_mixed = false; } else if(equalsIgnoreCase(to_str, "prefix") || equalsIgnoreCase(to_str, tr("prefix").toStdString())) { settings->evalops.parse_options.units_enabled = true; to_prefix = 1; do_to = true; } else if(equalsIgnoreCase(to_str, "base") || equalsIgnoreCase(to_str, tr("base", "base units").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_BASE); if(current_expr) setPreviousExpression(); return; } settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_BASE; str_conv = ""; do_to = true; do_mixed = false; } else if(equalsIgnoreCase(to_str, "mixed") || equalsIgnoreCase(to_str, tr("mixed").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_MIXED); if(current_expr) setPreviousExpression(); return; } settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_NONE; settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; do_to = true; if(!str_conv.empty()) do_mixed = true; } else if(equalsIgnoreCase(to_str, "factors") || equalsIgnoreCase(to_str, tr("factors").toStdString()) || equalsIgnoreCase(to_str, "factor")) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_FACTORIZE); if(current_expr) setPreviousExpression(); return; } do_factors = true; do_pfe = false; do_expand = false; execute_str = from_str; } else if(equalsIgnoreCase(to_str, "partial fraction") || equalsIgnoreCase(to_str, tr("partial fraction").toStdString())) { if(from_str.empty()) { b_busy--; executeCommand(COMMAND_EXPAND_PARTIAL_FRACTIONS); if(current_expr) setPreviousExpression(); return; } do_pfe = true; do_factors = false; do_expand = false; execute_str = from_str; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base", "number base").toStdString())) { base_from_string(to_str2, to_base, to_nbase); to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "decimals") || equalsIgnoreCase(to_str, tr("decimals").toStdString())) { to_fixed_fraction = 0; to_fraction = 3; do_to = true; } else { do_to = true; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(to_str), to_fraction, tr("fraction")); if(fden != 0) { if(fden < 0) to_fixed_fraction = 0; else to_fixed_fraction = fden; } else if(from_str.empty()) { b_busy--; executeCommand(COMMAND_CONVERT_STRING, true, CALCULATOR->unlocalizeExpression(to_str, settings->evalops.parse_options)); if(current_expr) setPreviousExpression(); return; } else { if(to_str[0] == '?') { to_prefix = 1; } else if(to_str.length() > 1 && to_str[1] == '?' && (to_str[0] == 'b' || to_str[0] == 'a' || to_str[0] == 'd')) { to_prefix = to_str[0]; } Unit *u = CALCULATOR->getActiveUnit(to_str); if(delay_complex != (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS) && u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1) delay_complex = !delay_complex; if(!str_conv.empty()) str_conv += " to "; str_conv += to_str; do_mixed = false; } } if(str_left.empty()) break; to_str = str_left; } if(do_to) { if(from_str.empty()) { b_busy--; setResult(NULL, true, false, false); if(current_expr) setPreviousExpression(); return; } else { execute_str = from_str; if(!str_conv.empty()) { execute_str += " to "; execute_str += str_conv; } } } } if(!delay_complex || (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS)) { settings->evalops.complex_number_form = cnf; delay_complex = false; } else { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; } if(execute_str.empty()) { size_t i = str.find_first_of(SPACES); if(i != std::string::npos) { to_str = str.substr(0, i); if(to_str == "factor" || equalsIgnoreCase(to_str, "factorize") || equalsIgnoreCase(to_str, tr("factorize").toStdString())) { execute_str = str.substr(i + 1); do_factors = true; do_pfe = false; do_expand = false; } else if(equalsIgnoreCase(to_str, "expand") || equalsIgnoreCase(to_str, tr("expand").toStdString())) { execute_str = str.substr(i + 1); do_expand = true; do_factors = false; do_pfe = false; } } } size_t stack_size = 0; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); parsed_tostruct->setUndefined(); CALCULATOR->resetExchangeRatesUsed(); CALCULATOR->setSimplifiedPercentageUsed(false); if(do_stack) { stack_size = CALCULATOR->RPNStackSize(); if(do_mathoperation && f) { CALCULATOR->getRPNRegister(stack_index + 1)->transform(f); parsed_mstruct->set(*CALCULATOR->getRPNRegister(stack_index + 1)); CALCULATOR->calculateRPNRegister(stack_index + 1, 0, settings->evalops); } else { CALCULATOR->setRPNRegister(stack_index + 1, CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options), 0, settings->evalops, parsed_mstruct, parsed_tostruct); } } else if(settings->rpn_mode) { stack_size = CALCULATOR->RPNStackSize(); if(do_mathoperation) { if(mstruct) { lastx = *mstruct; QTableWidgetItem *item = rpnView->item(0, 0); if(item) lastx_text = item->text(); } rpnLastxAction->setEnabled(true); if(f) CALCULATOR->calculateRPN(f, 0, settings->evalops, parsed_mstruct); else CALCULATOR->calculateRPN(op, 0, settings->evalops, parsed_mstruct); } else { std::string str2 = CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options); transform_expression_for_equals_save(str2, settings->evalops.parse_options); CALCULATOR->parseSigns(str2); remove_blank_ends(str2); MathStructure lastx_bak(lastx); if(mstruct) lastx = *mstruct; if(str2.length() == 1) { do_mathoperation = true; switch(str2[0]) { case 'E': {CALCULATOR->calculateRPN(OPERATION_EXP10, 0, settings->evalops, parsed_mstruct); break;} case '^': {CALCULATOR->calculateRPN(OPERATION_RAISE, 0, settings->evalops, parsed_mstruct); break;} case '+': {CALCULATOR->calculateRPN(OPERATION_ADD, 0, settings->evalops, parsed_mstruct); break;} case '-': {CALCULATOR->calculateRPN(OPERATION_SUBTRACT, 0, settings->evalops, parsed_mstruct); break;} case '*': {CALCULATOR->calculateRPN(OPERATION_MULTIPLY, 0, settings->evalops, parsed_mstruct); break;} case '/': {CALCULATOR->calculateRPN(OPERATION_DIVIDE, 0, settings->evalops, parsed_mstruct); break;} case '&': {CALCULATOR->calculateRPN(OPERATION_BITWISE_AND, 0, settings->evalops, parsed_mstruct); break;} case '|': {CALCULATOR->calculateRPN(OPERATION_BITWISE_OR, 0, settings->evalops, parsed_mstruct); break;} case '~': {CALCULATOR->calculateRPNBitwiseNot(0, settings->evalops, parsed_mstruct); break;} case '!': {CALCULATOR->calculateRPN(CALCULATOR->getFunctionById(FUNCTION_ID_FACTORIAL), 0, settings->evalops, parsed_mstruct); break;} case '>': {CALCULATOR->calculateRPN(OPERATION_GREATER, 0, settings->evalops, parsed_mstruct); break;} case '<': {CALCULATOR->calculateRPN(OPERATION_LESS, 0, settings->evalops, parsed_mstruct); break;} case '=': {CALCULATOR->calculateRPN(OPERATION_EQUALS, 0, settings->evalops, parsed_mstruct); break;} case '\\': { MathFunction *fdiv = CALCULATOR->getActiveFunction("div"); if(fdiv) { CALCULATOR->calculateRPN(fdiv, 0, settings->evalops, parsed_mstruct); break; } do_mathoperation = false; break; } default: {do_mathoperation = false;} } } else if(str2.length() == 2) { if(str2 == "**") { CALCULATOR->calculateRPN(OPERATION_RAISE, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "!!") { CALCULATOR->calculateRPN(CALCULATOR->getFunctionById(FUNCTION_ID_DOUBLE_FACTORIAL), 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "!=" || str == "=!" || str == "<>") { CALCULATOR->calculateRPN(OPERATION_NOT_EQUALS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "<=" || str == "=<") { CALCULATOR->calculateRPN(OPERATION_EQUALS_LESS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == ">=" || str == "=>") { CALCULATOR->calculateRPN(OPERATION_EQUALS_GREATER, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "==") { CALCULATOR->calculateRPN(OPERATION_EQUALS, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "&&") { CALCULATOR->calculateRPN(OPERATION_LOGICAL_AND, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "||") { CALCULATOR->calculateRPN(OPERATION_LOGICAL_OR, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } else if(str2 == "//") { MathFunction *fdiv = CALCULATOR->getActiveFunction("div"); if(fdiv) { CALCULATOR->calculateRPN(fdiv, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } } } else if(str2.length() == 3) { if(str2 == "⊻") { CALCULATOR->calculateRPN(OPERATION_BITWISE_XOR, 0, settings->evalops, parsed_mstruct); do_mathoperation = true; } } if(!do_mathoperation) { bool had_nonnum = false, test_function = true; int in_par = 0; for(size_t i = 0; i < str2.length(); i++) { if(is_in(NUMBERS, str2[i])) { if(!had_nonnum || in_par) { test_function = false; break; } } else if(str2[i] == '(') { if(in_par || !had_nonnum) { test_function = false; break; } in_par = i; } else if(str2[i] == ')') { if(i != str2.length() - 1) { test_function = false; break; } } else if(str2[i] == ' ') { if(!in_par) { test_function = false; break; } } else if(is_in(NOT_IN_NAMES, str2[i])) { test_function = false; break; } else { if(in_par) { test_function = false; break; } had_nonnum = true; } } f = NULL; if(test_function) { if(in_par) f = CALCULATOR->getActiveFunction(str2.substr(0, in_par)); else f = CALCULATOR->getActiveFunction(str2); } if(f && f->minargs() > 0) { do_mathoperation = true; original_expression = ""; CALCULATOR->calculateRPN(f, 0, settings->evalops, parsed_mstruct); } else { original_expression = str2; CALCULATOR->RPNStackEnter(str2, 0, settings->evalops, parsed_mstruct, parsed_tostruct); } } if(do_mathoperation) { rpnLastxAction->setEnabled(true); QTableWidgetItem *item = rpnView->item(0, 0); if(item) lastx_text = item->text(); } else lastx = lastx_bak; } } else { original_expression = CALCULATOR->unlocalizeExpression(execute_str.empty() ? str : execute_str, settings->evalops.parse_options); transform_expression_for_equals_save(original_expression, settings->evalops.parse_options); CALCULATOR->calculate(mstruct, original_expression, 0, settings->evalops, parsed_mstruct, parsed_tostruct); } bool title_set = false; int was_busy = 0; QProgressDialog *dialog = NULL; PREPARE_TIMECHECK(500) for(int i = 0; CALCULATOR->busy() && i < 10000; i++) { sleep_ms(1); DO_TIMECHECK {break;} } if(CALCULATOR->busy() && !was_busy) { if(!do_stack && updateWindowTitle(tr("Calculating…"))) title_set = true; dialog = new QProgressDialog(tr("Calculating…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Calculating…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = 1; } if(CALCULATOR->busy() && testTimer && testTimer->isActive()) CALCULATOR->abort(); while(CALCULATOR->busy()) { qApp->processEvents(); sleep_ms(10); was_busy++; } if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(delay_complex) { settings->evalops.complex_number_form = cnf; CALCULATOR->startControl(100); if(!settings->rpn_mode) { if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mstruct->complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mstruct->complexToPolarForm(settings->evalops); } else if(!do_stack) { MathStructure *mreg = CALCULATOR->getRPNRegister(do_stack ? stack_index + 1 : 1); if(mreg) { if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mreg->complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mreg->complexToPolarForm(settings->evalops); } } CALCULATOR->stopControl(); } if(settings->rpn_mode && !do_stack) { mstruct->unref(); mstruct = CALCULATOR->getRPNRegister(1); if(!mstruct) mstruct = new MathStructure(); else mstruct->ref(); settings->current_result = NULL; } if(do_stack) { } else if(settings->rpn_mode && do_mathoperation) { result_text = tr("RPN Operation").toStdString(); } else { result_text = str; } settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); if(settings->rpn_mode && stack_index == 0) { expressionEdit->clear(); while(CALCULATOR->RPNStackSize() < stack_size) { RPNRegisterRemoved(1); stack_size--; } if(CALCULATOR->RPNStackSize() > stack_size) { RPNRegisterAdded(""); } } if(settings->rpn_mode && do_mathoperation && parsed_tostruct && !parsed_tostruct->isUndefined() && parsed_tostruct->isSymbolic()) { mstruct->set(CALCULATOR->convert(*mstruct, parsed_tostruct->symbol(), settings->evalops)); } // Always perform conversion to optimal (SI) unit when the expression is a number multiplied by a unit and input equals output if(!settings->rpn_mode && (!parsed_tostruct || parsed_tostruct->isUndefined()) && execute_str.empty() && !had_to_expression && (settings->evalops.approximation == APPROXIMATION_EXACT || settings->evalops.auto_post_conversion == POST_CONVERSION_OPTIMAL || settings->evalops.auto_post_conversion == POST_CONVERSION_NONE) && parsed_mstruct && mstruct) { convert_unchanged_quantity_with_unit(*parsed_mstruct, *mstruct, settings->evalops); } if(!do_mathoperation && (askTC(*parsed_mstruct) || askSinc(*parsed_mstruct) || askSinc(*mstruct) || askPercent() || (check_exrates && settings->checkExchangeRates(this)))) { b_busy--; calculateExpression(force, do_mathoperation, op, f, settings->rpn_mode, stack_index, saved_execute_str, str, false, calculate_selection); settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; settings->printops.time_zone = TIME_ZONE_LOCAL; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); return; } warnAssumptions(*parsed_mstruct); //update "ans" variables if(stack_index == 0) { MathStructure m4(settings->vans[3]->get()); m4.replace(settings->vans[4], settings->vans[4]->get()); settings->vans[4]->set(m4); MathStructure m3(settings->vans[2]->get()); m3.replace(settings->vans[3], settings->vans[4]); settings->vans[3]->set(m3); MathStructure m2(settings->vans[1]->get()); m2.replace(settings->vans[2], settings->vans[3]); settings->vans[2]->set(m2); MathStructure m1(settings->vans[0]->get()); m1.replace(settings->vans[1], settings->vans[2]); settings->vans[1]->set(m1); mstruct->replace(settings->vans[0], settings->vans[1]); if(is_equation_solutions(*mstruct)) { if(mstruct->isLogicalAnd()) { for(size_t i = 0; i < mstruct->size(); i++) { if((*mstruct)[i].comparisonType() == COMPARISON_EQUALS) { settings->vans[0]->set((*mstruct)[i][1]); break; } } } else if(mstruct->isLogicalOr()) { MathStructure m(*mstruct); m.setType(STRUCT_VECTOR); for(size_t i = 0; i < m.size(); i++) { if(m[i].isLogicalAnd()) { for(size_t i2 = 0; i2 < m[i].size(); i2++) { if(m[i][i2].comparisonType() == COMPARISON_EQUALS) { m[i].setToChild(i2 + 1); break; } } m[i].setToChild(2); } else { m[i].setToChild(2); } } settings->vans[0]->set(m); } else { settings->vans[0]->set((*mstruct)[1]); } } else { settings->vans[0]->set(*mstruct); } } mstruct_exact.setUndefined(); if((!settings->rpn_mode || (!do_stack && !do_mathoperation)) && (!do_calendars || !mstruct->isDateTime()) && (settings->dual_approximation > 0 || settings->printops.base == BASE_DECIMAL) && !do_bases) { long int i_timeleft = 0; i_timeleft = mstruct->containsType(STRUCT_COMPARISON) ? 2000 : 1000; if(was_busy > 30) i_timeleft /= 2; if(i_timeleft > 0) { if(delay_complex) settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; calculate_dual_exact(mstruct_exact, mstruct, original_expression, parsed_mstruct, settings->evalops, settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_approximation > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), i_timeleft, -1); if(delay_complex && !mstruct_exact.isUndefined()) { settings->evalops.complex_number_form = cnf; CALCULATOR->startControl(100); if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mstruct_exact.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mstruct_exact.complexToPolarForm(settings->evalops); CALCULATOR->stopControl(); } } } b_busy--; if(do_factors || do_pfe || do_expand || do_mixed) { int com = 0; if(do_pfe) com = COMMAND_EXPAND_PARTIAL_FRACTIONS; else if(do_expand) com = COMMAND_EXPAND; else if(do_factors) com = COMMAND_FACTORIZE; else if(do_mixed) com = COMMAND_CONVERT_MIXED; if(do_stack && stack_index != 0) { MathStructure *save_mstruct = mstruct; mstruct = CALCULATOR->getRPNRegister(stack_index + 1); if(com == COMMAND_FACTORIZE && (mstruct->isNumber() || mstruct->isVector()) && to_fraction == 0 && to_fixed_fraction < 2) to_fraction = 2; executeCommand(com, false); mstruct = save_mstruct; } else { if(com == COMMAND_FACTORIZE && mstruct->isInteger() && !parsed_mstruct->isNumber()) prepend_mstruct = *mstruct; if(com == COMMAND_FACTORIZE && (mstruct->isNumber() || mstruct->isVector()) && to_fraction == 0 && to_fixed_fraction < 2) to_fraction = 2; executeCommand(com, false); if(!prepend_mstruct.isUndefined() && mstruct->isInteger()) prepend_mstruct.setUndefined(); } } if(stack_index == 0) { if(!mstruct_exact.isUndefined()) settings->history_answer.push_back(new MathStructure(mstruct_exact)); settings->history_answer.push_back(new MathStructure(*mstruct)); } if(!do_stack && !calculate_selection) previous_expression = execute_str.empty() ? str : execute_str; setResult(NULL, true, stack_index == 0, true, "", do_stack, stack_index, false, false, calculate_selection); prepend_mstruct.setUndefined(); if(do_bases) onBasesActivated(true); if(do_calendars) openCalendarConversion(); settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; settings->printops.time_zone = TIME_ZONE_LOCAL; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); if(stack_index == 0) { if(unitsDialog && unitsDialog->isVisible()) { Unit *u = CALCULATOR->findMatchingUnit(*mstruct); if(u && !u->category().empty()) { unitsDialog->selectCategory(u->category()); } } if(!calculate_selection) { expressionEdit->blockCompletion(); expressionEdit->blockParseStatus(); if(settings->chain_mode) { if(exact_text == "0" || result_text == "0") expressionEdit->clear(); std::string str = unhtmlize(result_text); if(unicode_length(result_text) < 10000) expressionEdit->setExpression(QString::fromStdString(str)); } else if(settings->rpn_mode) { } else if(settings->replace_expression == CLEAR_EXPRESSION) { expressionEdit->clear(); previous_expression = ""; } else if(settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT || settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT_IF_SHORTER) { if(settings->replace_expression == REPLACE_EXPRESSION_WITH_RESULT || (!exact_text.empty() && unicode_length(exact_text) < unicode_length(from_str))) { if(exact_text == "0" || result_text == "0") { expressionEdit->clear(); previous_expression = ""; } else if(exact_text.empty()) { std::string str = settings->replaceResultSeparators(unhtmlize(result_text)); if(unicode_length(str) < 10000) { expressionEdit->setExpression(QString::fromStdString(str)); previous_expression = str; } } else { if(settings->replace_expression != REPLACE_EXPRESSION_WITH_RESULT || unicode_length(exact_text) < 10000) { expressionEdit->setExpression(QString::fromStdString(settings->replaceResultSeparators(exact_text))); previous_expression = settings->replaceResultSeparators(exact_text); } } } else { if(!execute_str.empty()) { from_str = execute_str; CALCULATOR->separateToExpression(from_str, str, settings->evalops, true, true); } expressionEdit->setExpression(QString::fromStdString(from_str)); previous_expression = from_str; } } if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->selectAll(); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); expressionEdit->setExpressionHasChanged(false); } if(settings->autocopy_result) { if(settings->copy_ascii) { std::string str = result_text; if(settings->copy_ascii_without_units) { size_t i = str.find(""); if(i == std::string::npos) i = str.find(""); if(i != std::string::npos) { size_t iend = str.find("", i); if(i == 0) str = str.substr(iend + 7); else if(iend == str.length() - 7) str = str.substr(0, i); } } QApplication::clipboard()->setText(QString::fromStdString(unformat(unhtmlize(str, true))).trimmed()); } else { QMimeData *qm = new QMimeData(); qm->setHtml(QString::fromStdString(uncolorize(result_text))); qm->setText(QString::fromStdString(unhtmlize(result_text))); qm->setObjectName("history_result"); QApplication::clipboard()->setMimeData(qm); } } if(!do_calendars && calendarConversionDialog && mstruct->isDateTime() && calendarConversionDialog->isVisible()) calendarConversionDialog->setDate(*mstruct->datetime()); if(fpConversionDialog && mstruct->isNumber() && mstruct->number().isReal() && fpConversionDialog->isVisible()) fpConversionDialog->setValue(*mstruct); } if(CALCULATOR->checkSaveFunctionCalled()) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); if(functionsDialog) functionsDialog->updateFunctions(); unitsMenu->clear(); variablesMenu->clear(); functionsMenu->clear(); } } void CommandThread::run() { enableAsynchronousCancel(); while(true) { int command_type = 0; if(!read(&command_type)) break; void *x = NULL; if(!read(&x) || !x) break; void *x2 = NULL; if(!read(&x2)) break; CALCULATOR->startControl(); EvaluationOptions eo2 = settings->evalops; switch(command_type) { case COMMAND_FACTORIZE: { if(!((MathStructure*) x)->integerFactorize()) { ((MathStructure*) x)->structure(STRUCTURING_FACTORIZE, eo2, true); } if(x2 && !((MathStructure*) x2)->integerFactorize()) { eo2.approximation = APPROXIMATION_EXACT; ((MathStructure*) x2)->structure(STRUCTURING_FACTORIZE, eo2, true); } break; } case COMMAND_EXPAND_PARTIAL_FRACTIONS: { ((MathStructure*) x)->expandPartialFractions(eo2); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->expandPartialFractions(eo2); break; } case COMMAND_EXPAND: { ((MathStructure*) x)->expand(eo2); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->expand(eo2); break; } case COMMAND_CONVERT_STRING: { MathStructure pm_tmp(*parsed_mstruct); ((MathStructure*) x)->set(CALCULATOR->convert(*((MathStructure*) x), command_convert_units_string, eo2, NULL, true, &pm_tmp)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convert(*((MathStructure*) x2), command_convert_units_string, eo2, NULL, true)); break; } case COMMAND_CONVERT_UNIT: { MathStructure pm_tmp(*parsed_mstruct); ((MathStructure*) x)->set(CALCULATOR->convert(*((MathStructure*) x), command_convert_unit, eo2, false, true, true, &pm_tmp)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convert(*((MathStructure*) x2), command_convert_unit, eo2, false, true, true)); break; } case COMMAND_CONVERT_OPTIMAL: { ((MathStructure*) x)->set(CALCULATOR->convertToOptimalUnit(*((MathStructure*) x), eo2, true)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convertToOptimalUnit(*((MathStructure*) x2), eo2, true)); break; } case COMMAND_CONVERT_BASE: { ((MathStructure*) x)->set(CALCULATOR->convertToBaseUnits(*((MathStructure*) x), eo2)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convertToBaseUnits(*((MathStructure*) x2), eo2)); break; } case COMMAND_CONVERT_MIXED: { eo2.auto_post_conversion = POST_CONVERSION_NONE; eo2.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; ((MathStructure*) x)->set(CALCULATOR->convertToMixedUnits(*((MathStructure*) x), eo2)); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->set(CALCULATOR->convertToMixedUnits(*((MathStructure*) x2), eo2)); break; } case COMMAND_CALCULATE: { eo2.calculate_functions = false; eo2.sync_units = false; ((MathStructure*) x)->calculatesub(eo2, eo2, true); eo2.approximation = APPROXIMATION_EXACT; if(x2) ((MathStructure*) x2)->calculatesub(eo2, eo2, true); break; } case COMMAND_EVAL: { ((MathStructure*) x)->eval(eo2); if(x2) ((MathStructure*) x2)->eval(eo2); break; } } b_busy--; CALCULATOR->stopControl(); } } void QalculateWindow::executeCommand(int command_type, bool show_result, std::string ceu_str, Unit *u, int run) { if(run == 1) { if(expressionEdit->expressionHasChanged() && !settings->rpn_mode) { calculateExpression(); } if(b_busy) return; b_busy++; command_aborted = false; if(command_type >= COMMAND_CONVERT_UNIT) { CALCULATOR->resetExchangeRatesUsed(); command_convert_units_string = ceu_str; command_convert_unit = u; } if(command_type == COMMAND_CONVERT_UNIT || command_type == COMMAND_CONVERT_STRING || command_type == COMMAND_CONVERT_BASE || command_type == COMMAND_CONVERT_MIXED || command_type == COMMAND_CONVERT_OPTIMAL) { to_prefix = 0; } } bool title_set = false, was_busy = false; QProgressDialog *dialog = NULL; MathStructure *mfactor = new MathStructure(*mstruct); MathStructure *mfactor2 = NULL; if(!mstruct_exact.isUndefined()) mfactor2 = new MathStructure(mstruct_exact); MathStructure parsebak(*parsed_mstruct); PREPARE_TIMECHECK(500) rerun_command: if((!commandThread->running && !commandThread->start()) || !commandThread->write(command_type) || !commandThread->write((void *) mfactor) || !commandThread->write((void *) mfactor2)) { commandThread->cancel(); mfactor->unref(); if(mfactor2) mfactor2->unref(); b_busy--; return; } for(int i = 0; b_busy && commandThread->running && i < 10000; i++) { sleep_ms(1); DO_TIMECHECK {break;} } if(!was_busy && b_busy && commandThread->running) { QString progress_str; switch(command_type) { case COMMAND_FACTORIZE: { progress_str = tr("Factorizing…"); break; } case COMMAND_EXPAND_PARTIAL_FRACTIONS: { progress_str = tr("Expanding partial fractions…"); break; } case COMMAND_EXPAND: { progress_str = tr("Expanding…"); break; } case COMMAND_EVAL: { progress_str = tr("Calculating…"); break; } default: { progress_str = tr("Converting…"); break; } } if(updateWindowTitle(progress_str)) title_set = true; dialog = new QProgressDialog(progress_str, tr("Cancel"), 0, 0, this); dialog->setWindowTitle(progress_str); connect(dialog, SIGNAL(canceled()), this, SLOT(abortCommand())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = true; } if(b_busy && testTimer && testTimer->isActive()) CALCULATOR->abort(); while(b_busy && commandThread->running) { qApp->processEvents(); sleep_ms(10); } if(!commandThread->running) command_aborted = true; if(!command_aborted && run == 1 && command_type >= COMMAND_CONVERT_UNIT && settings->checkExchangeRates(this)) { b_busy++; parsed_mstruct->set(parsebak); mfactor->set(*mstruct); run = 2; goto rerun_command; } if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(command_type == COMMAND_CONVERT_STRING && !ceu_str.empty()) { if(ceu_str[0] == '?') { to_prefix = 1; } else if(ceu_str.length() > 1 && ceu_str[1] == '?' && (ceu_str[0] == 'b' || ceu_str[0] == 'a' || ceu_str[0] == 'd')) { to_prefix = ceu_str[0]; } } if(!command_aborted) { if(mfactor2) {mstruct_exact.set(*mfactor2); mfactor2->unref();} mstruct->set(*mfactor); mfactor->unref(); switch(command_type) { case COMMAND_FACTORIZE: { settings->printops.allow_factorization = true; break; } case COMMAND_EXPAND: { settings->printops.allow_factorization = false; break; } default: { settings->printops.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); } } if(show_result) { if(!mstruct_exact.isUndefined()) settings->history_answer.push_back(new MathStructure(mstruct_exact)); settings->history_answer.push_back(new MathStructure(*mstruct)); setResult(NULL, true, !parsed_mstruct->equals(parsebak, true, true), true, ""); } } } void QalculateWindow::updateResultBases() { SET_BINARY_BITS if(result_bin.length() == (size_t) binary_bits + (binary_bits / 4) - 1) { QString sbin = ""; sbin += sbin_i; } if(i == 0) break; if(binary_bits <= 32) sbin_i = QString::fromStdString(result_bin); else sbin_i = QString::fromStdString(result_bin.substr(pos, pos > 0 ? 40 : 39)); if(pos == 0) pos = 39; else pos += 40; sbin_i.replace(" ", " "; i2 = sbin_i.length(); } sbin_i += ""; } sbin += "
", sbin_i; int i2 = 0; size_t pos = 0; QString link_color = binEdit->palette().text().color().name(); for(int i = binary_bits; i >= 0; i -= 8) { if(i % 32 == 0 || i == binary_bits) { if(!sbin_i.isEmpty()) { bool inhtml = false; int n = i + 1; for(; i2 >= 0; i2--) { if(sbin_i[i2] == '>') { inhtml = true; } else if(sbin_i[i2] == '<') { inhtml = false; } else if(!inhtml && (sbin_i[i2] == '0' || sbin_i[i2] == '1')) { sbin_i.replace(i2, 1, QStringLiteral("%2").arg(n).arg(sbin_i[i2]).arg(link_color)); n++; } } if(pos > 39) sbin += "
"); sbin_i += "
"; sbin_i += QString::number(i); sbin_i += "
"; binEdit->setText(sbin); } else { binEdit->setText(QString::fromStdString(result_bin)); } octEdit->setText(QString::fromStdString(result_oct)); decEdit->setText(QString::fromStdString(result_dec)); hexEdit->setText(QString::fromStdString(result_hex)); } bool result_negative = false; void QalculateWindow::resultBasesLinkActivated(const QString &s) { size_t n = s.toInt(); n += (n - 1) / 4; if(n > result_bin.length()) return; n = result_bin.length() - n; if(result_bin[n] == '0') result_bin[n] = '1'; else if(result_bin[n] == '1') result_bin[n] = '0'; ParseOptions pa; pa.base = BASE_BINARY; pa.twos_complement = settings->evalops.parse_options.twos_complement || result_negative; PrintOptions po; po.base = settings->evalops.parse_options.base; po.twos_complement = settings->evalops.parse_options.twos_complement; po.min_exp = 0; po.preserve_precision = true; po.base_display = BASE_DISPLAY_NONE; expressionEdit->setPlainText(QString::fromStdString(Number(result_bin, pa).print(po))); } void set_result_bases(const MathStructure &m) { result_bin = ""; result_oct = "", result_dec = "", result_hex = ""; result_negative = false; SET_BINARY_BITS if(max_bases.isZero()) { max_bases = 2; if(settings->evalops.parse_options.twos_complement) max_bases ^= (binary_bits > 128 ? 127 : binary_bits - 1); else max_bases ^= (binary_bits > 128 ? 128 : binary_bits); max_bases--; min_bases = 2; min_bases ^= (binary_bits > 128 ? 127 : binary_bits - 1); min_bases.negate(); } if(m.isNumber() && m.number() <= max_bases && m.number() >= min_bases) { Number nr(m.number()); if(settings->rounding_mode == 2) nr.trunc(); else nr.round(settings->printops.round_halfway_to_even); PrintOptions po = settings->printops; po.is_approximate = NULL; po.show_ending_zeroes = false; po.base_display = BASE_DISPLAY_NORMAL; po.min_exp = 0; po.base = 2; po.binary_bits = binary_bits; result_negative = nr.isNegative(); po.twos_complement = result_negative; result_bin = nr.print(po); if(result_bin.length() > po.binary_bits + (po.binary_bits / 4) && result_bin.find("1") >= po.binary_bits + (po.binary_bits / 4)) result_bin.erase(0, po.binary_bits + (po.binary_bits / 4)); po.base = 8; if(po.binary_bits > 128) po.binary_bits = 128; result_oct = nr.print(po); size_t i = result_oct.find_first_of(NUMBERS); if(i != std::string::npos && result_oct.length() > i + 1 && result_oct[i] == '0' && is_in(NUMBERS, result_oct[i + 1])) result_oct.erase(i, 1); po.base = 10; result_dec = nr.print(po); po.base = 16; result_hex = nr.print(po); gsub("0x", "", result_hex); size_t l = result_hex.length(); size_t i_after_minus = 0; if(nr.isNegative()) { if(l > 1 && result_hex[0] == '-') i_after_minus = 1; else if(result_hex.find("−") == 0) i_after_minus = strlen("−"); } for(int i = (int) l - 2; i > (int) i_after_minus; i -= 2) { result_hex.insert(i, 1, ' '); } if(result_hex.length() > i_after_minus + 1 && result_hex[i_after_minus + 1] == ' ') result_hex.insert(i_after_minus, 1, '0'); } } bool contains_plot_or_save(const std::string &str) { if(expression_contains_save_function(str, settings->evalops.parse_options, false)) return true; for(size_t f_i = 0; f_i < 4; f_i++) { int id = 0; if(f_i == 0) id = FUNCTION_ID_PLOT; else if(f_i == 1) id = FUNCTION_ID_EXPORT; else if(f_i == 2) id = FUNCTION_ID_LOAD; else if(f_i == 3) id = FUNCTION_ID_COMMAND; MathFunction *f = CALCULATOR->getFunctionById(id); for(size_t i = 1; f && i <= f->countNames(); i++) { if(str.find(f->getName(i).name) != std::string::npos) { MathStructure mtest; CALCULATOR->beginTemporaryStopMessages(); CALCULATOR->parse(&mtest, str, settings->evalops.parse_options); CALCULATOR->endTemporaryStopMessages(); if(mtest.containsFunctionId(FUNCTION_ID_PLOT) || mtest.containsFunctionId(FUNCTION_ID_EXPORT) || mtest.containsFunctionId(FUNCTION_ID_LOAD) || mtest.containsFunctionId(FUNCTION_ID_COMMAND)) return true; return false; } } } return false; } void QalculateWindow::onExpressionChanged() { toAction_t->setEnabled(expressionEdit->expressionHasChanged() || !settings->history_answer.empty() || settings->useColoredIcon(this)); if(!basesDock->isVisible()) return; if(!expressionEdit->expressionHasChanged()) { if(!result_bin.empty() && !bases_is_result && expressionEdit->document()->isEmpty()) { set_result_bases(m_zero); bases_is_result = false; updateResultBases(); } return; } MathStructure m; EvaluationOptions eo = settings->evalops; eo.structuring = STRUCTURING_NONE; eo.mixed_units_conversion = MIXED_UNITS_CONVERSION_NONE; eo.auto_post_conversion = POST_CONVERSION_NONE; eo.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; eo.expand = -2; CALCULATOR->beginTemporaryStopMessages(); bases_is_result = false; std::string str = expressionEdit->toPlainText().toStdString(); str = CALCULATOR->unlocalizeExpression(str, eo.parse_options); CALCULATOR->parseComments(str, eo.parse_options); std::string stmp; CALCULATOR->separateToExpression(str, stmp, eo); CALCULATOR->separateWhereExpression(str, stmp, eo); if(!mauto.isAborted()) { set_result_bases(mauto); } else if(auto_error || auto_aborted || !expressionEdit->parsedCalculable() || !CALCULATOR->calculate(&m, str, 100, eo)) { result_bin = ""; result_oct = "", result_dec = "", result_hex = ""; } else { set_result_bases(m); } CALCULATOR->endTemporaryStopMessages(); updateResultBases(); } void QalculateWindow::onHistoryReloaded() { if(settings->status_in_history && settings->display_expression_status) { historyView->clearTemporary(); auto_expression = ""; mauto.setAborted(); auto_error = false; prev_autocalculable = 0; if(autoCalculateTimer) autoCalculateTimer->stop(); if(!settings->status_in_history) updateWindowTitleResult(result_text); if(expressionEdit->expressionHasChanged()) expressionEdit->displayParseStatus(true); } } void QalculateWindow::onStatusChanged(QString status, bool is_expression, bool had_error, bool had_warning, bool expression_from_history) { if(!settings->status_in_history || settings->rpn_mode) return; std::string current_text = expressionEdit->toPlainText().trimmed().toStdString(); bool last_op = false; if(expressionEdit->textCursor().atEnd()) last_op = last_is_operator(current_text); if(status.isEmpty() || current_text.empty() || (current_text.length() == 1 && current_text[0] == '#')) { if(autoCalculateTimer) autoCalculateTimer->stop(); historyView->clearTemporary(); auto_expression = ""; auto_result = ""; auto_result_text = ""; auto_exact_text = ""; auto_aborted = false; auto_error = false; prev_autocalculable = 0; mauto.setAborted(); updateWindowTitleResult(result_text); } else if(!is_expression || !settings->auto_calculate || !expressionEdit->parsedCalculable()) { prev_autocalculable = 0; if(!settings->auto_calculate || !is_expression) auto_aborted = false; if(autoCalculateTimer) autoCalculateTimer->stop(); if(!had_error && (!had_warning || last_op) && !auto_error && auto_result.empty() && (auto_expression == status.toStdString() || (last_op && auto_expression.empty() && auto_result.empty()))) return; auto_error = had_error || had_warning; std::vector values; auto_expression = status.toStdString(); auto_result = ""; auto_result_text = ""; auto_exact_text = ""; mauto.setAborted(); CALCULATOR->addMessages(&expressionEdit->status_messages); historyView->addResult(values, current_text, true, auto_expression, false, false, QString(), NULL, 0, 0, true); updateWindowTitleResult(""); } else { if(!had_error && (!had_warning || last_op) && !auto_error && !auto_calculation_updated && !auto_format_updated && ((prev_autocalculable != 0 && auto_expression == status.toStdString() && (last_op || (settings->history_expression_type != HISTORY_EXPRESSION_TYPE_PARSED_COMPACT && settings->history_expression_type != HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT) || (expressionEdit->textCursor().atEnd() && expressionEdit->toPlainText().endsWith(" "))) && (last_op || auto_expression.find(CALCULATOR->localToString()) == std::string::npos)) || (last_op && auto_expression.empty() && auto_result.empty())) && (last_op || !settings->adaptive_autocalc_delay || prev_autocalculable != 2 || expressionEdit->parsedCalculable() != 1 || !auto_result.empty())) { prev_autocalculable = expressionEdit->parsedCalculable(); if(autoCalculateTimer && autoCalculateTimer->isActive()) { autoCalculateTimer->stop(); autoCalculateTimer->start(settings->auto_calculate_delay); } return; } prev_autocalculable = expressionEdit->parsedCalculable(); if(auto_aborted && auto_aborted > current_text.length()) auto_aborted = false; current_status_expression = current_text; current_status = status; if(autoCalculateTimer) autoCalculateTimer->stop(); if(had_error || expression_from_history || settings->auto_calculate_delay > 0 || (auto_aborted && settings->adaptive_autocalc_delay)) { if(had_error || had_warning || auto_error || !auto_result.empty() || auto_expression != status.toStdString()) { auto_result = ""; auto_result_text = ""; auto_exact_text = ""; mauto.setAborted(); auto_expression = status.toStdString(); auto_error = had_error || had_warning; std::vector values; CALCULATOR->addMessages(&expressionEdit->status_messages); historyView->addResult(values, current_text, true, auto_expression, false, false, QString(), NULL, 0, 0, true); } if(had_error) { updateWindowTitleResult(""); return; } if(settings->adaptive_autocalc_delay && !auto_aborted && expressionEdit->parsedCalculable() == 1 && !expression_from_history) { autoCalculateTimeout(); return; } if(!autoCalculateTimer) { autoCalculateTimer = new QTimer(this); autoCalculateTimer->setSingleShot(true); connect(autoCalculateTimer, SIGNAL(timeout()), this, SLOT(autoCalculateTimeout())); } autoCalculateTimer->start(auto_aborted || expression_from_history ? (settings->auto_calculate_delay <= 0 ? 500 : settings->auto_calculate_delay * 2) : settings->auto_calculate_delay); } else { autoCalculateTimeout(); } } } bool contains_updating_time(const MathStructure &m) { if((m.isVariable() && (m.variable()->id() == VARIABLE_ID_NOW || m.variable()->id() == VARIABLE_ID_UPTIME)) || (m.isFunction() && (m.function()->id() == FUNCTION_ID_TIME))) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_updating_time(m[i])) return true; if(m[i].isDateTime() && m.isFunction() && m.function()->getArgumentDefinition(i + 1) && m.function()->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_DATE) { QalculateDateTime dnow; dnow.setToCurrentTime(); if(dnow == *m[i].datetime()) return true; if(dnow > *m[i].datetime()) { dnow.addSeconds(-5); if(dnow < *m[i].datetime()) return true; } } } return false; } bool contains_extreme_number(const MathStructure &m) { if(m.isNumber()) { if(m.number().isFloatingPoint() && (mpfr_get_exp(m.number().internalUpperFloat()) > 10000000L || mpfr_get_exp(m.number().internalLowerFloat()) < -10000000L)) { return true; } else if(m.number().isInteger() && ::abs(m.number().integerLength()) > 10000000L) { return true; } } for(size_t i = 0; i < m.size(); i++) { if(contains_extreme_number(m[i])) return true; } return false; } bool contains_subvector(const MathStructure &m, bool top = true) { if(!top && m.isVector()) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_subvector(m[i], top && m.isMatrix())) return true; } return false; } bool contains_undefined(const MathStructure &m) { if(m.isUndefined() || (m.isPower() && m[0].isZero() && m[1].isNumber() && m[1].number().isNegative())) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_undefined(m[i])) return true; } return false; } bool contains_incompatible_units(const MathStructure &m) { if(m.isAddition() && m.size() >= 2 && m[m.size() - 1].isUnitCompatible(m[m.size() - 2]) == 0) { const MathStructure *u1 = NULL, *u2 = NULL; if(m[m.size() - 1].isUnit_exp()) u1 = m.getChild(m.size()); else if(m[m.size() - 1].isMultiplication() && m[m.size() - 1].last().isUnit_exp()) u1 = m[m.size() - 1].getChild(m[m.size() - 1].size()); if(m[m.size() - 2].isUnit()) u2 = m.getChild(m.size() - 1); else if(m[m.size() - 2].isMultiplication() && m[m.size() - 2].last().isUnit_exp()) u2 = m[m.size() - 2].getChild(m[m.size() - 2].size()); if(u1 && u1->isPower()) u1 = u1->base(); if(u2 && u2->isPower()) u2 = u2->base(); if(u1 && u2 && u1->unit() != u2->unit() && u1->unit()->baseUnit() == u2->unit()->baseUnit()) return false; return true; } else if(m.isPower() && ((m[0].isUnit() && !m[1].isNumber()) || m[1].containsType(STRUCT_UNIT, false, false, true) > 0)) { return true; } for(size_t i = 0; i < m.size(); i++) { if(contains_incompatible_units(m[i])) return true; } return false; } int intervals_are_relative(const MathStructure &m) { int ret = -1; if(m.isFunction() && m.function()->id() == FUNCTION_ID_UNCERTAINTY && m.size() == 3) { if(m[2].isOne() && m[1].isMultiplication() && m[1].size() > 1 && m[1].last().isVariable() && (m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERCENT) || m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERMILLE) || m[1].last().variable() == CALCULATOR->getVariableById(VARIABLE_ID_PERMYRIAD))) { ret = 1; } else { return 0; } } if(m.isFunction() && m.function()->id() == FUNCTION_ID_INTERVAL) return 0; for(size_t i = 0; i < m.size(); i++) { int ret_i = intervals_are_relative(m[i]); if(ret_i == 0) return 0; else if(ret_i > 0) ret = ret_i; } return ret; } IntervalDisplay adaptive_interval_display(const QString &expression_str, const MathStructure *mp) { if((mp && mp->containsFunctionId(FUNCTION_ID_UNCERTAINTY)) || expression_str.contains("+/-") || expression_str.contains("+/" SIGN_MINUS) || expression_str.contains("±")) { if(mp && intervals_are_relative(*mp) > 0) return INTERVAL_DISPLAY_RELATIVE; return INTERVAL_DISPLAY_PLUSMINUS; } else if(mp && mp->containsFunctionId(FUNCTION_ID_INTERVAL)) { return INTERVAL_DISPLAY_INTERVAL; } else { bool b = false; if(CALCULATOR->hasWhereExpression(expression_str.toStdString(), settings->evalops)) { MathFunction *f = CALCULATOR->getFunctionById(FUNCTION_ID_INTERVAL); for(size_t i = 1; f && i <= f->countNames(); i++) { if(expression_str.contains(QString::fromStdString(f->getName(i).name))) { b = true; break; } } } if(b) return INTERVAL_DISPLAY_INTERVAL; } return INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; } void QalculateWindow::autoCalculateTimeout() { mauto.setAborted(); bool is_approximate = false; PrintOptions po = settings->printops; po.is_approximate = &is_approximate; std::string str = current_status_expression, result, single_result; CALCULATOR->beginTemporaryStopMessages(); bool do_factors = false, do_mixed = false, do_pfe = false, do_expand = false, do_bases = false, do_calendars = false; to_fraction = 0; to_fixed_fraction = 0; to_prefix = 0; to_base = 0; to_duo_syms = false; to_bits = 0; to_nbase.clear(); to_caf = -1; to_form = TO_FORM_OFF; std::string to_str, str_conv; CALCULATOR->parseComments(str, settings->evalops.parse_options); if(str.empty()) { CALCULATOR->endTemporaryStopMessages(); updateWindowTitleResult(result_text); return; } ComplexNumberForm cnf_bak = settings->evalops.complex_number_form; ComplexNumberForm cnf = settings->evalops.complex_number_form; bool caf_bak = settings->complex_angle_form; bool delay_complex = false; bool b_units_saved = settings->evalops.parse_options.units_enabled; AutoPostConversion save_auto_post_conversion = settings->evalops.auto_post_conversion; MixedUnitsConversion save_mixed_units_conversion = settings->evalops.mixed_units_conversion; CALCULATOR->startControl(auto_aborted ? 50 : 100); had_to_expression = false; std::string from_str = str; bool last_is_space = !from_str.empty() && is_in(SPACES, from_str[from_str.length() - 1]); if(CALCULATOR->separateToExpression(from_str, to_str, settings->evalops, true, true)) { if(from_str.empty()) { CALCULATOR->stopControl(); CALCULATOR->endTemporaryStopMessages(); updateWindowTitleResult(result_text); return; } remove_duplicate_blanks(to_str); had_to_expression = true; std::string str_left; std::string to_str1, to_str2; bool do_to = false; while(true) { if(last_is_space) to_str += " "; CALCULATOR->separateToExpression(to_str, str_left, settings->evalops, true, false); remove_blank_ends(to_str); size_t ispace = to_str.find_first_of(SPACES); if(ispace != std::string::npos) { to_str1 = to_str.substr(0, ispace); remove_blank_ends(to_str1); to_str2 = to_str.substr(ispace + 1); remove_blank_ends(to_str2); } if(equalsIgnoreCase(to_str, "hex") || equalsIgnoreCase(to_str, "hexadecimal") || equalsIgnoreCase(to_str, tr("hexadecimal").toStdString())) { to_base = BASE_HEXADECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "oct") || equalsIgnoreCase(to_str, "octal") || equalsIgnoreCase(to_str, tr("octal").toStdString())) { to_base = BASE_OCTAL; do_to = true; } else if(equalsIgnoreCase(to_str, "dec") || equalsIgnoreCase(to_str, "decimal") || equalsIgnoreCase(to_str, tr("decimal").toStdString())) { to_base = BASE_DECIMAL; to_form = EXP_NONE; do_to = true; } else if(equalsIgnoreCase(to_str, "duo") || equalsIgnoreCase(to_str, "duodecimal") || equalsIgnoreCase(to_str, tr("duodecimal").toStdString())) { to_base = BASE_DUODECIMAL; to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "doz") || equalsIgnoreCase(to_str, "dozenal")) { to_base = BASE_DUODECIMAL; to_duo_syms = true; do_to = true; } else if(equalsIgnoreCase(to_str, "bin") || equalsIgnoreCase(to_str, "binary") || equalsIgnoreCase(to_str, tr("binary").toStdString())) { to_base = BASE_BINARY; do_to = true; } else if(equalsIgnoreCase(to_str, "roman") || equalsIgnoreCase(to_str, tr("roman").toStdString())) { to_base = BASE_ROMAN_NUMERALS; do_to = true; } else if(equalsIgnoreCase(to_str, "bijective") || equalsIgnoreCase(to_str, tr("bijective").toStdString())) { to_base = BASE_BIJECTIVE_26; do_to = true; } else if(equalsIgnoreCase(to_str, "bcd")) { to_base = BASE_BINARY_DECIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa") || equalsIgnoreCase(to_str, "sexagesimal") || equalsIgnoreCase(to_str, tr("sexagesimal").toStdString())) { to_base = BASE_SEXAGESIMAL; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa2") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "2")) { to_base = BASE_SEXAGESIMAL_2; do_to = true; } else if(equalsIgnoreCase(to_str, "sexa3") || EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "sexagesimal", tr("sexagesimal"), "3")) { to_base = BASE_SEXAGESIMAL_3; do_to = true; } else if(equalsIgnoreCase(to_str, "latitude") || equalsIgnoreCase(to_str, tr("latitude").toStdString())) { to_base = BASE_LATITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "latitude", tr("latitude"), "2")) { to_base = BASE_LATITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "longitude") || equalsIgnoreCase(to_str, tr("longitude").toStdString())) { to_base = BASE_LONGITUDE; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL_NR(to_str, "longitude", tr("longitude"), "2")) { to_base = BASE_LONGITUDE_2; do_to = true; } else if(equalsIgnoreCase(to_str, "fp32") || equalsIgnoreCase(to_str, "binary32") || equalsIgnoreCase(to_str, "float")) { to_base = BASE_FP32; do_to = true; } else if(equalsIgnoreCase(to_str, "fp64") || equalsIgnoreCase(to_str, "binary64") || equalsIgnoreCase(to_str, "double")) { to_base = BASE_FP64; do_to = true; } else if(equalsIgnoreCase(to_str, "fp16") || equalsIgnoreCase(to_str, "binary16")) { to_base = BASE_FP16; do_to = true; } else if(equalsIgnoreCase(to_str, "fp80")) { to_base = BASE_FP80; do_to = true; } else if(equalsIgnoreCase(to_str, "fp128") || equalsIgnoreCase(to_str, "binary128")) { to_base = BASE_FP128; do_to = true; } else if(equalsIgnoreCase(to_str, "time") || equalsIgnoreCase(to_str, tr("time").toStdString())) { to_base = BASE_TIME; do_to = true; } else if(equalsIgnoreCase(to_str, "Unicode")) { to_base = BASE_UNICODE; do_to = true; } else if(equalsIgnoreCase(to_str, "sci") || EQUALS_IGNORECASE_AND_LOCAL(to_str, "scientific", tr("scientific"))) { to_form = EXP_PURE; do_to = true; } else if(equalsIgnoreCase(to_str, "eng") || EQUALS_IGNORECASE_AND_LOCAL(to_str, "engineering", tr("engineering"))) { to_form = EXP_BASE_3; do_to = true; } else if(EQUALS_IGNORECASE_AND_LOCAL(to_str, "simple", tr("simple"))) { to_form = EXP_NONE; do_to = true; } else if(equalsIgnoreCase(to_str, "utc") || equalsIgnoreCase(to_str, "gmt")) { po.time_zone = TIME_ZONE_UTC; do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "bin") && is_in(NUMBERS, to_str[3])) { to_base = BASE_BINARY; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && equalsIgnoreCase(to_str.substr(0, 3), "hex") && is_in(NUMBERS, to_str[3])) { to_base = BASE_HEXADECIMAL; int bits = s2i(to_str.substr(3)); if(bits >= 0) { if(bits > 4096) to_bits = 4096; else to_bits = bits; } do_to = true; } else if(to_str.length() > 3 && (equalsIgnoreCase(to_str.substr(0, 3), "utc") || equalsIgnoreCase(to_str.substr(0, 3), "gmt"))) { to_str = to_str.substr(3); remove_blanks(to_str); bool b_minus = false; if(to_str[0] == '+') { to_str.erase(0, 1); } else if(to_str[0] == '-') { b_minus = true; to_str.erase(0, 1); } else if(to_str.find(SIGN_MINUS) == 0) { b_minus = true; to_str.erase(0, strlen(SIGN_MINUS)); } unsigned int tzh = 0, tzm = 0; int itz = 0; if(!to_str.empty() && sscanf(to_str.c_str(), "%2u:%2u", &tzh, &tzm) > 0) { itz = tzh * 60 + tzm; if(b_minus) itz = -itz; } else { CALCULATOR->error(true, tr("Time zone parsing failed.").toUtf8().data(), NULL); } po.time_zone = TIME_ZONE_CUSTOM; po.custom_time_zone = itz; do_to = true; } else if(to_str == "CET") { po.time_zone = TIME_ZONE_CUSTOM; po.custom_time_zone = 60; do_to = true; } else if(equalsIgnoreCase(to_str, "bases") || equalsIgnoreCase(to_str, tr("bases").toStdString())) { do_bases = true; str = from_str; } else if(equalsIgnoreCase(to_str, "calendars") || equalsIgnoreCase(to_str, tr("calendars").toStdString())) { do_calendars = true; str = from_str; } else if(equalsIgnoreCase(to_str, "rectangular") || equalsIgnoreCase(to_str, "cartesian") || equalsIgnoreCase(to_str, tr("rectangular").toStdString()) || equalsIgnoreCase(to_str, tr("cartesian").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_RECTANGULAR; } else if(equalsIgnoreCase(to_str, "exponential") || equalsIgnoreCase(to_str, tr("exponential").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_EXPONENTIAL; } else if(equalsIgnoreCase(to_str, "polar") || equalsIgnoreCase(to_str, tr("polar").toStdString())) { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_POLAR; } else if(to_str == "cis") { to_caf = 0; do_to = true; cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "phasor") || equalsIgnoreCase(to_str, tr("phasor").toStdString()) || equalsIgnoreCase(to_str, "angle") || equalsIgnoreCase(to_str, tr("angle").toStdString())) { to_caf = 1; do_to = true; cnf = COMPLEX_NUMBER_FORM_CIS; } else if(equalsIgnoreCase(to_str, "optimal") || equalsIgnoreCase(to_str, tr("optimal").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_OPTIMAL_SI; str_conv = ""; do_mixed = false; do_to = true; } else if(equalsIgnoreCase(to_str, "prefix") || equalsIgnoreCase(to_str, tr("prefix").toStdString())) { settings->evalops.parse_options.units_enabled = true; to_prefix = 1; do_to = true; } else if(equalsIgnoreCase(to_str, "base") || equalsIgnoreCase(to_str, tr("base", "base units").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_BASE; str_conv = ""; do_mixed = false; do_to = true; } else if(equalsIgnoreCase(to_str, "mixed") || equalsIgnoreCase(to_str, tr("mixed").toStdString())) { settings->evalops.parse_options.units_enabled = true; settings->evalops.auto_post_conversion = POST_CONVERSION_NONE; settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; do_to = true; if(!str_conv.empty()) do_mixed = true; } else if(equalsIgnoreCase(to_str, "factors") || equalsIgnoreCase(to_str, tr("factors").toStdString()) || equalsIgnoreCase(to_str, "factor")) { do_factors = true; do_pfe = false; do_expand = false; str = from_str; } else if(equalsIgnoreCase(to_str, "partial fraction") || equalsIgnoreCase(to_str, tr("partial fraction").toStdString())) { do_pfe = true; do_factors = false; do_expand = false; str = from_str; } else if(equalsIgnoreCase(to_str1, "base") || equalsIgnoreCase(to_str1, tr("base", "number base").toStdString())) { base_from_string(to_str2, to_base, to_nbase); to_duo_syms = false; do_to = true; } else if(equalsIgnoreCase(to_str, "decimals") || equalsIgnoreCase(to_str, tr("decimals").toStdString())) { to_fixed_fraction = 0; to_fraction = 3; do_to = true; } else { do_to = true; long int fden = get_fixed_denominator_qt(settings->unlocalizeExpression(to_str), to_fraction, tr("fraction")); if(fden != 0) { if(fden < 0) to_fixed_fraction = 0; else to_fixed_fraction = fden; } else { if(to_str[0] == '?') { to_prefix = 1; } else if(to_str.length() > 1 && to_str[1] == '?' && (to_str[0] == 'b' || to_str[0] == 'a' || to_str[0] == 'd')) { to_prefix = to_str[0]; } Unit *u = CALCULATOR->getActiveUnit(to_str); if(delay_complex != (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS) && u && u->baseUnit() == CALCULATOR->getRadUnit() && u->baseExponent() == 1) delay_complex = !delay_complex; if(!str_conv.empty()) str_conv += " to "; str_conv += to_str; do_mixed = false; } } if(str_left.empty()) break; to_str = str_left; } if(do_to) { str = from_str; if(!str_conv.empty()) { str += " to "; str += str_conv; } } } if(!delay_complex || (cnf != COMPLEX_NUMBER_FORM_POLAR && cnf != COMPLEX_NUMBER_FORM_CIS)) { settings->evalops.complex_number_form = cnf; delay_complex = false; } else { settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; } size_t i = str.find_first_of(SPACES); if(i != std::string::npos) { to_str = str.substr(0, i); if(to_str == "factor" || equalsIgnoreCase(to_str, "factorize") || equalsIgnoreCase(to_str, tr("factorize").toStdString())) { str = str.substr(i + 1); do_factors = true; do_pfe = false; do_expand = false; } else if(equalsIgnoreCase(to_str, "expand") || equalsIgnoreCase(to_str, tr("expand").toStdString())) { str = str.substr(i + 1); do_expand = true; do_pfe = false; do_factors = false; } } if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); MathStructure mexact, mto; mexact.setUndefined(); po.allow_factorization = (settings->evalops.structuring == STRUCTURING_FACTORIZE); size_t new_auto_aborted = false; if(do_calendars || do_bases) { mauto.setAborted(); } else { mauto = CALCULATOR->calculate(CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options), settings->evalops, &mauto_parsed, &mto); if(mauto.isAborted() || CALCULATOR->aborted()) { new_auto_aborted = current_status_expression.length(); mauto.setAborted(); } else if(mauto.size() > 50 || mauto.countTotalChildren(false) > 500 || (mauto.isMatrix() && mauto.rows() * mauto.columns() > 50) || contains_subvector(mauto) || contains_extreme_number(mauto) || (settings->adaptive_autocalc_delay && (contains_incompatible_units(mauto) || contains_undefined(mauto)))) { mauto.setAborted(); } } if(mauto.isAborted()) { result = ""; } else { if(settings->dual_approximation > 0 || po.base == BASE_DECIMAL) { if(delay_complex) settings->evalops.complex_number_form = COMPLEX_NUMBER_FORM_RECTANGULAR; calculate_dual_exact(mexact, &mauto, CALCULATOR->unlocalizeExpression(str, settings->evalops.parse_options), &mauto_parsed, settings->evalops, settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_approximation > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), 0, -1); if(delay_complex && !mexact.isUndefined()) { settings->evalops.complex_number_form = cnf; if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mexact.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mexact.complexToPolarForm(settings->evalops); } } if(CALCULATOR->aborted()) { CALCULATOR->stopControl(); CALCULATOR->startControl(20); } if(do_factors || do_pfe || do_expand || do_mixed) { if(do_pfe) { mauto.expandPartialFractions(settings->evalops); } else if(do_expand) { mauto.expand(settings->evalops); po.allow_factorization = false; } else if(do_factors) { if((mauto.isNumber() || mauto.isVector()) && to_fraction == 0 && to_fixed_fraction == 0) to_fraction = 2; if(!mauto.integerFactorize()) { mauto.structure(STRUCTURING_FACTORIZE, settings->evalops, true); po.allow_factorization = true; } } else if(do_mixed) { settings->evalops.mixed_units_conversion = MIXED_UNITS_CONVERSION_FORCE_INTEGER; mauto.set(CALCULATOR->convertToMixedUnits(mauto, settings->evalops)); } if(CALCULATOR->aborted() || mauto.countTotalChildren(false) > 500) { mauto.setAborted(); new_auto_aborted = current_status_expression.length(); } } } int b_exact = true; std::vector values; if(!mauto.isAborted()) { // Always perform conversion to optimal (SI) unit when the expression is a number multiplied by a unit and input equals output if(mto.isUndefined() && !had_to_expression && (settings->evalops.approximation == APPROXIMATION_EXACT || settings->evalops.auto_post_conversion == POST_CONVERSION_OPTIMAL || settings->evalops.auto_post_conversion == POST_CONVERSION_NONE)) { convert_unchanged_quantity_with_unit(mauto_parsed, mauto, settings->evalops); } if(delay_complex) { settings->evalops.complex_number_form = cnf; if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_CIS) mauto.complexToCisForm(settings->evalops); else if(settings->evalops.complex_number_form == COMPLEX_NUMBER_FORM_POLAR) mauto.complexToPolarForm(settings->evalops); } if(settings->adaptive_interval_display) po.interval_display = adaptive_interval_display(QString::fromStdString(current_status_expression), &mauto_parsed); Number save_nbase; bool custom_base_set = false; int save_bin = CALCULATOR->usesBinaryPrefixes(); long int save_fden = CALCULATOR->fixedDenominator(); int save_dual = settings->dual_fraction; bool do_to = false; if(to_base != 0 || to_fraction > 0 || to_fixed_fraction >= 2 || to_prefix != 0 || (to_caf >= 0 && to_caf != settings->complex_angle_form) || to_form != TO_FORM_OFF) { if(to_base != 0 && (to_base != po.base || to_bits != po.binary_bits || (to_base == BASE_CUSTOM && to_nbase != CALCULATOR->customOutputBase()) || (to_base == BASE_DUODECIMAL && to_duo_syms && !po.duodecimal_symbols))) { po.base = to_base; po.binary_bits = to_bits; if(to_duo_syms) po.duodecimal_symbols = true; if(to_base == BASE_CUSTOM) { custom_base_set = true; save_nbase = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(to_nbase); } do_to = true; } if(to_fixed_fraction >= 2) { if(to_fraction == 2 || (to_fraction < 0 && !contains_fraction_qt(mauto))) po.number_fraction_format = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else po.number_fraction_format = FRACTION_COMBINED_FIXED_DENOMINATOR; CALCULATOR->setFixedDenominator(to_fixed_fraction); settings->dual_fraction = 0; do_to = true; } else if(to_fraction > 0 && (settings->dual_fraction != 0 || po.restrict_fraction_length || (to_fraction != 2 && po.number_fraction_format != FRACTION_COMBINED) || (to_fraction == 2 && po.number_fraction_format != FRACTION_FRACTIONAL) || (to_fraction == 3 && po.number_fraction_format != FRACTION_DECIMAL))) { po.restrict_fraction_length = false; if(to_fraction == 3) po.number_fraction_format = FRACTION_DECIMAL; else if(to_fraction == 2) po.number_fraction_format = FRACTION_FRACTIONAL; else po.number_fraction_format = FRACTION_COMBINED; settings->dual_fraction = 0; do_to = true; } if(to_caf >= 0 && to_caf != settings->complex_angle_form) { settings->complex_angle_form = to_caf; do_to = true; } if(to_form != TO_FORM_OFF) { po.min_exp = to_form; if(to_base != BASE_DECIMAL) { po.sort_options.minus_last = (to_form == EXP_NONE); po.show_ending_zeroes = (to_form != EXP_NONE); po.use_unit_prefixes = (to_form == EXP_NONE); po.negative_exponents = (to_form > 0); } do_to = true; } if(to_prefix != 0) { bool new_pre = po.use_unit_prefixes; bool new_cur = po.use_prefixes_for_currencies; bool new_allu = po.use_prefixes_for_all_units; bool new_all = po.use_all_prefixes; bool new_den = po.use_denominator_prefix; int new_bin = CALCULATOR->usesBinaryPrefixes(); new_pre = true; if(to_prefix == 'b') { int i = has_information_unit(mauto); new_bin = (i > 0 ? 1 : 2); if(i == 1) { new_den = false; } else if(i > 1) { new_den = true; } else { new_cur = true; new_allu = true; } } else { new_cur = true; new_allu = true; if(to_prefix == 'a') new_all = true; else if(to_prefix == 'd') new_bin = 0; } if(po.use_unit_prefixes != new_pre || po.use_prefixes_for_currencies != new_cur || po.use_prefixes_for_all_units != new_allu || po.use_all_prefixes != new_all || po.use_denominator_prefix != new_den || CALCULATOR->usesBinaryPrefixes() != new_bin) { po.use_unit_prefixes = new_pre; po.use_all_prefixes = new_all; po.use_prefixes_for_currencies = new_cur; po.use_prefixes_for_all_units = new_allu; po.use_denominator_prefix = new_den; CALCULATOR->useBinaryPrefixes(new_bin); do_to = true; } } } po.allow_non_usable = true; int max_length = -1; if(!mauto.isNumber() || !mauto.number().isRational() || mauto.number().denominator() >= 20 || mauto.number() >= 100 || mauto.number() <= -100) max_length = historyView->maxTemporaryCharacters(); print_dual(mauto, str, mauto_parsed, mexact, result, values, po, settings->evalops, settings->dual_fraction < 0 ? AUTOMATIC_FRACTION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_FRACTION_DUAL : AUTOMATIC_FRACTION_OFF), settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), settings->complex_angle_form, &exact_comparison, true, settings->format_result, settings->color, TAG_TYPE_HTML, max_length, had_to_expression); single_result = result; if(max_length >= 0) { size_t l = unformatted_length(result); for(size_t i = 0; i < values.size(); i++) { l += unformatted_length(values[i]); if(l > (size_t) max_length) { values.clear(); break; } } } b_exact = (exact_comparison || (!is_approximate && !mauto.isApproximate())); if(b_exact) auto_exact_text = unhtmlize(single_result); else auto_exact_text = ""; if(!values.empty()) { auto_exact_text = unhtmlize(values[0]); result = ""; for(size_t i = 0; i < values.size(); i++) { if(i > 0) result += " = "; result += values[i]; } if(!is_approximate && !mauto.isApproximate()) result += " = "; else result += " " SIGN_ALMOST_EQUAL " "; result += single_result; values.clear(); b_exact = true; } if(do_to) { settings->complex_angle_form = caf_bak; if(custom_base_set) CALCULATOR->setCustomOutputBase(save_nbase); CALCULATOR->useBinaryPrefixes(save_bin); CALCULATOR->setFixedDenominator(save_fden); settings->dual_fraction = save_dual; } if(askDot(str, false) || askTC(mauto_parsed, true) || askSinc(mauto_parsed, true) || askSinc(mauto, true) || askPercent(true)) { CALCULATOR->error(false, "", NULL); } warnAssumptions(mauto_parsed, true); } if(CALCULATOR->aborted()) new_auto_aborted = current_status_expression.length(); CALCULATOR->stopControl(); if(!auto_aborted || new_auto_aborted < auto_aborted) auto_aborted = new_auto_aborted; settings->evalops.complex_number_form = cnf_bak; settings->evalops.auto_post_conversion = save_auto_post_conversion; settings->evalops.parse_options.units_enabled = b_units_saved; settings->evalops.mixed_units_conversion = save_mixed_units_conversion; if(!settings->simplified_percentage) settings->evalops.parse_options.parsing_mode = (ParsingMode) (settings->evalops.parse_options.parsing_mode & ~PARSE_PERCENT_AS_ORDINARY_CONSTANT); auto_format_updated = false; auto_calculation_updated = false; std::vector messages; CALCULATOR->endTemporaryStopMessages(false, &messages); bool b_error = false, b_warning = false; for(size_t i = 0; i < messages.size(); i++) { if(!mauto.isAborted() || messages[i].stage() != MESSAGE_STAGE_CALCULATION) { if(messages[i].type() == MESSAGE_ERROR) { b_error = true; break; } else if(messages[i].type() == MESSAGE_WARNING) { b_warning = true; } } } if(!b_error && !b_warning && !auto_error && !auto_calculation_updated && !auto_format_updated && auto_result == result && (settings->auto_calculate_delay > 0 || auto_expression == current_status.toStdString())) { if(result.empty()) updateWindowTitleResult(""); auto_exact_text = ""; return; } auto_expression = current_status.toStdString(); auto_error = b_error || b_warning; QString flag; if(!b_error && !result.empty() && (mauto.countTotalChildren(false) < 10 || historyView->testTemporaryResultLength(result))) { auto_result = result; auto_result_text = single_result; if((mauto.isMultiplication() && mauto.size() == 2 && mauto[1].isUnit() && mauto[1].unit()->isCurrency()) || (mauto.isUnit() && mauto.unit()->isCurrency())) { flag = ":/data/flags/" + QString::fromStdString(mauto.isUnit() ? mauto.unit()->referenceName() : mauto[1].unit()->referenceName()) + ".png"; if(!QFile::exists(flag)) flag.clear(); } gsub("\n", "
", result); if(mauto.isLogicalOr() && (mauto[0].isLogicalAnd() || mauto[0].isComparison())) { // add line break before or size_t i = 0; std::string or_str = " "; if(po.spell_out_logical_operators) or_str += CALCULATOR->logicalORString(); else or_str += LOGICAL_OR; or_str += " "; while(true) { i = result.find(or_str, i); if(i == std::string::npos) break; result.replace(i + or_str.length() - 1, 1, "
"); i += or_str.length(); } } values.push_back(result); } else { auto_result = ""; auto_result_text = ""; auto_exact_text = ""; mauto.setAborted(); if(settings->auto_calculate_delay > 0) { updateWindowTitleResult(""); return; } } auto_expression = current_status.toStdString(); CALCULATOR->addMessages(&messages); if(!values.empty() && (mauto.isComparison() || ((mauto.isLogicalAnd() || mauto.isLogicalOr()) && mauto.containsType(STRUCT_COMPARISON, true, false, false))) && (exact_comparison || b_exact || values[0].find(SIGN_ALMOST_EQUAL) != std::string::npos)) b_exact = -1; historyView->addResult(values, "", true, auto_expression, b_exact, false, flag, NULL, 0, 0, true, values.empty() ? "" : single_result); updateWindowTitleResult(auto_result_text); if(contains_updating_time(mauto_parsed)) { auto_calculation_updated = true; if(!autoCalculateTimer) { autoCalculateTimer = new QTimer(this); autoCalculateTimer->setSingleShot(true); connect(autoCalculateTimer, SIGNAL(timeout()), this, SLOT(autoCalculateTimeout())); } autoCalculateTimer->start(1000); } } void QalculateWindow::onTwosChanged() { max_bases.clear(); } void QalculateWindow::onBinaryBitsChanged() { max_bases.clear(); if(basesDock->isVisible() && bases_is_result && settings->current_result) { CALCULATOR->beginTemporaryStopMessages(); set_result_bases(*settings->current_result); CALCULATOR->endTemporaryStopMessages(); updateResultBases(); } else { onExpressionChanged(); } updateBinEditSize(); } std::string ellipsize_result(const std::string &result_text, size_t length) { if(result_text.length() <= length) return result_text; length /= 2; size_t index1 = result_text.find(SPACE, length); if(index1 == std::string::npos || index1 > length * 1.2) { index1 = result_text.find(THIN_SPACE, length); size_t index1b = result_text.find(NNBSP, length); if(index1b != std::string::npos && (index1 == std::string::npos || index1b < index1)) index1 = index1b; } if(index1 == std::string::npos || index1 > length * 1.2) { index1 = length; while(index1 > 0 && (signed char) result_text[index1] < 0 && (unsigned char) result_text[index1 + 1] < 0xC0) index1--; } size_t index2 = result_text.find(SPACE, result_text.length() - length); if(index2 == std::string::npos || index2 > result_text.length() - length * 0.8) { index2 = result_text.find(THIN_SPACE, result_text.length() - length); size_t index2b = result_text.find(NNBSP, result_text.length() - length); if(index2b != std::string::npos && (index2 == std::string::npos || index2b < index2)) index2 = index2b; } if(index2 == std::string::npos || index2 > result_text.length() - length * 0.8) { index2 = result_text.length() - length; while(index2 > index1 && (signed char) result_text[index2] < 0 && (unsigned char) result_text[index2 + 1] < 0xC0) index2--; } return result_text.substr(0, index1) + " (…) " + result_text.substr(index2, result_text.length() - index2); } bool contains_large_matrix(const MathStructure &m) { if((m.isVector() && m.size() > 500) || (m.isMatrix() && m.rows() * m.columns() > 500)) return true; for(size_t i = 0; i < m.size(); i++) { if(contains_large_matrix(m[i])) return true; } return false; } void ViewThread::run() { while(true) { void *x = NULL; if(!read(&x) || !x) break; MathStructure *mresult = (MathStructure*) x; x = NULL; bool b_stack = false; if(!read(&b_stack)) break; if(!read(&x)) break; MathStructure *mm = (MathStructure*) x; if(!read(&x)) break; MathStructure *mparse = (MathStructure*) x; CALCULATOR->startControl(); PrintOptions po; if(mparse) { if(!read(&po.is_approximate)) break; if(!read(&po.preserve_format)) break; po.show_ending_zeroes = settings->evalops.parse_options.read_precision != DONT_READ_PRECISION && CALCULATOR->usesIntervalArithmetic() && settings->evalops.parse_options.base > BASE_CUSTOM; po.exp_display = settings->printops.exp_display; po.lower_case_numbers = settings->printops.lower_case_numbers; po.rounding = settings->printops.rounding; po.base_display = settings->printops.base_display; po.twos_complement = settings->printops.twos_complement; po.hexadecimal_twos_complement = settings->printops.hexadecimal_twos_complement; po.base = settings->evalops.parse_options.base; po.allow_non_usable = true; Number nr_base; if(po.base == BASE_CUSTOM && (CALCULATOR->usesIntervalArithmetic() || CALCULATOR->customInputBase().isRational()) && (CALCULATOR->customInputBase().isInteger() || !CALCULATOR->customInputBase().isNegative()) && (CALCULATOR->customInputBase() > 1 || CALCULATOR->customInputBase() < -1)) { nr_base = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(CALCULATOR->customInputBase()); } else if(po.base == BASE_CUSTOM || (po.base < BASE_CUSTOM && !CALCULATOR->usesIntervalArithmetic() && po.base != BASE_UNICODE)) { po.base = 10; po.min_exp = 6; po.use_max_decimals = true; po.max_decimals = 5; po.preserve_format = false; } bool compact = (settings->history_expression_type == HISTORY_EXPRESSION_TYPE_PARSED_COMPACT || settings->history_expression_type == HISTORY_EXPRESSION_TYPE_ENTERED_AND_PARSED_COMPACT); po.abbreviate_names = compact; po.hide_underscore_spaces = true; po.digit_grouping = settings->printops.digit_grouping; po.use_unicode_signs = settings->printops.use_unicode_signs; po.multiplication_sign = settings->printops.multiplication_sign; po.division_sign = settings->printops.division_sign; po.short_multiplication = compact; po.excessive_parenthesis = true; po.improve_division_multipliers = false; po.restrict_to_parent_precision = false; po.spell_out_logical_operators = settings->printops.spell_out_logical_operators; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; MathStructure mp(*mparse); mp.format(po); if(compact) po.preserve_format = false; parsed_text = mp.print(po, settings->format_result, settings->color, TAG_TYPE_HTML); if(po.base == BASE_CUSTOM) { CALCULATOR->setCustomOutputBase(nr_base); } } if(mm && mresult->isMatrix()) { PrintOptions po = settings->printops; po.allow_non_usable = false; mm->set(*mresult); MathStructure mm2(*mresult); std::string mstr; int c = mm->columns(), r = mm->rows(); for(int index_r = 0; index_r < r; index_r++) { for(int index_c = 0; index_c < c; index_c++) { mm->getElement(index_r + 1, index_c + 1)->setAborted(); } } for(int index_r = 0; index_r < r; index_r++) { for(int index_c = 0; index_c < c; index_c++) { mm2.getElement(index_r + 1, index_c + 1)->format(po); mstr = mm2.getElement(index_r + 1, index_c + 1)->print(po); mm->getElement(index_r + 1, index_c + 1)->set(mstr); } } } po = settings->printops; po.allow_non_usable = true; print_dual(*mresult, original_expression, mparse ? *mparse : *parsed_mstruct, mstruct_exact, result_text, alt_results, po, settings->evalops, settings->dual_fraction < 0 ? AUTOMATIC_FRACTION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_FRACTION_DUAL : AUTOMATIC_FRACTION_OFF), settings->dual_approximation < 0 ? AUTOMATIC_APPROXIMATION_AUTO : (settings->dual_fraction > 0 ? AUTOMATIC_APPROXIMATION_DUAL : AUTOMATIC_APPROXIMATION_OFF), settings->complex_angle_form, &exact_comparison, mparse != NULL, settings->format_result, settings->color, TAG_TYPE_HTML, -1, had_to_expression); if(!prepend_mstruct.isUndefined() && !CALCULATOR->aborted()) { prepend_mstruct.format(po); po.min_exp = 0; alt_results.insert(alt_results.begin(), prepend_mstruct.print(po, settings->format_result, settings->color, TAG_TYPE_HTML)); } if(!b_stack) { set_result_bases(*mresult); bases_is_result = true; } for(size_t i = 0; i < alt_results.size();) { if(unformatted_length(alt_results[i]) > 20000) alt_results.erase(alt_results.begin() + i); else i++; } if(contains_large_matrix(*mresult)) { if(mresult->isMatrix() && result_text.length() > 1000000L) { result_text = "matrix ("; result_text += i2s(mresult->rows()); result_text += SIGN_MULTIPLICATION; result_text += i2s(mresult->columns()); result_text += ")"; } else if(unformatted_length(result_text) > 5000) { result_text = ellipsize_result(unhtmlize(result_text), 1000); } } else if(unformatted_length(result_text) > (mstruct->isNumber() ? 50000 : 20000)) { if(mstruct->isNumber()) { result_text = ellipsize_result(result_text, 5000); } else { result_text = ellipsize_result(unhtmlize(result_text), 2000); } } if(mresult->isLogicalOr() && (mresult->getChild(1)->isLogicalAnd() || mresult->getChild(1)->isComparison())) { // add line break before or size_t i = 0; std::string or_str = " "; if(po.spell_out_logical_operators) or_str += CALCULATOR->logicalORString(); else or_str += LOGICAL_OR; or_str += " "; while(true) { i = result_text.find(or_str, i); if(i == std::string::npos) break; result_text.replace(i + or_str.length() - 1, 1, "
"); i += or_str.length(); } } b_busy--; CALCULATOR->stopControl(); } } void QalculateWindow::setResult(Prefix *prefix, bool update_history, bool update_parse, bool force, std::string transformation, bool do_stack, size_t stack_index, bool register_moved, bool supress_dialog, bool calculate_selection) { if(block_result_update) return; if(!calculate_selection && expressionEdit->expressionHasChanged() && (!settings->rpn_mode || CALCULATOR->RPNStackSize() == 0)) { if(!force) return; calculateExpression(); if(!prefix) return; } if(settings->rpn_mode && CALCULATOR->RPNStackSize() == 0) return; if(!settings->rpn_mode) {stack_index = 0; do_stack = false;} if(!do_stack && (settings->history_answer.empty() || !settings->current_result) && !register_moved && !update_parse && update_history) { return; } if(b_busy) return; workspace_changed = true; std::string prev_result_text = result_text; bool prev_approximate = *settings->printops.is_approximate; if(update_parse) { parsed_text = "aborted"; } if(do_stack) { update_history = true; update_parse = false; } if(register_moved) { update_history = true; update_parse = false; } b_busy++; if(!viewThread->running && !viewThread->start()) {b_busy--; return;} bool b_rpn_operation = false; if(update_history) { if(update_parse || register_moved) { if(register_moved) { result_text = tr("RPN Register Moved").toStdString(); } else { remove_blank_ends(result_text); gsub("\n", " ", result_text); if(result_text == tr("RPN Operation").toStdString()) { b_rpn_operation = true; } else { if(settings->adaptive_interval_display) settings->printops.interval_display = adaptive_interval_display(expressionEdit->toPlainText(), parsed_mstruct); } } } else if(!transformation.empty()) { } result_text = "?"; } if(update_parse) { parsed_text = "aborted"; } bool parsed_approx = false; bool title_set = false, was_busy = false; Number save_nbase; bool custom_base_set = false; int save_base = settings->printops.base; bool caf_bak = settings->complex_angle_form; unsigned int save_bits = settings->printops.binary_bits; bool save_pre = settings->printops.use_unit_prefixes; bool save_cur = settings->printops.use_prefixes_for_currencies; bool save_allu = settings->printops.use_prefixes_for_all_units; bool save_all = settings->printops.use_all_prefixes; bool save_den = settings->printops.use_denominator_prefix; int save_bin = CALCULATOR->usesBinaryPrefixes(); NumberFractionFormat save_format = settings->printops.number_fraction_format; long int save_fden = CALCULATOR->fixedDenominator(); bool save_restrict_fraction_length = settings->printops.restrict_fraction_length; int save_dual = settings->dual_fraction; bool save_duo_syms = settings->printops.duodecimal_symbols; bool save_minus = settings->printops.sort_options.minus_last; int save_exp = settings->printops.min_exp; bool save_zeroes = settings->printops.show_ending_zeroes; bool save_neg = settings->printops.negative_exponents; bool do_to = false; if(!do_stack) { if(to_base != 0 || to_fraction > 0 || to_fixed_fraction >= 2 || to_prefix != 0 || (to_caf >= 0 && to_caf != settings->complex_angle_form) || to_form != TO_FORM_OFF) { if(to_base != 0 && (to_base != settings->printops.base || to_bits != settings->printops.binary_bits || (to_base == BASE_CUSTOM && to_nbase != CALCULATOR->customOutputBase()) || (to_base == BASE_DUODECIMAL && to_duo_syms && !settings->printops.duodecimal_symbols))) { settings->printops.base = to_base; settings->printops.binary_bits = to_bits; if(to_duo_syms) settings->printops.duodecimal_symbols = true; if(to_base == BASE_CUSTOM) { custom_base_set = true; save_nbase = CALCULATOR->customOutputBase(); CALCULATOR->setCustomOutputBase(to_nbase); } do_to = true; } if(to_fixed_fraction >= 2) { if(to_fraction == 2 || (to_fraction < 0 && !contains_fraction_qt(*mstruct))) settings->printops.number_fraction_format = FRACTION_FRACTIONAL_FIXED_DENOMINATOR; else settings->printops.number_fraction_format = FRACTION_COMBINED_FIXED_DENOMINATOR; CALCULATOR->setFixedDenominator(to_fixed_fraction); settings->dual_fraction = 0; do_to = true; } else if(to_fraction > 0 && (settings->dual_fraction != 0 || settings->printops.restrict_fraction_length || (to_fraction != 2 && settings->printops.number_fraction_format != FRACTION_COMBINED) || (to_fraction == 2 && settings->printops.number_fraction_format != FRACTION_FRACTIONAL) || (to_fraction == 3 && settings->printops.number_fraction_format != FRACTION_DECIMAL))) { settings->printops.restrict_fraction_length = false; if(to_fraction == 3) settings->printops.number_fraction_format = FRACTION_DECIMAL; else if(to_fraction == 2) settings->printops.number_fraction_format = FRACTION_FRACTIONAL; else settings->printops.number_fraction_format = FRACTION_COMBINED; settings->dual_fraction = 0; do_to = true; } if(to_caf >= 0 && to_caf != settings->complex_angle_form) { settings->complex_angle_form = to_caf; do_to = true; } if(to_form != TO_FORM_OFF) { settings->printops.min_exp = to_form; if(to_base != BASE_DECIMAL) { settings->printops.sort_options.minus_last = (to_form == EXP_NONE); settings->printops.show_ending_zeroes = (to_form != EXP_NONE); settings->printops.use_unit_prefixes = (to_form == EXP_NONE); settings->printops.negative_exponents = (to_form > 0); } do_to = true; } if(to_prefix != 0 && !prefix) { bool new_pre = settings->printops.use_unit_prefixes; bool new_cur = settings->printops.use_prefixes_for_currencies; bool new_allu = settings->printops.use_prefixes_for_all_units; bool new_all = settings->printops.use_all_prefixes; bool new_den = settings->printops.use_denominator_prefix; int new_bin = CALCULATOR->usesBinaryPrefixes(); new_pre = true; if(to_prefix == 'b') { int i = has_information_unit(*mstruct); new_bin = (i > 0 ? 1 : 2); if(i == 1) { new_den = false; } else if(i > 1) { new_den = true; } else { new_cur = true; new_allu = true; } } else { new_cur = true; new_allu = true; if(to_prefix == 'a') new_all = true; else if(to_prefix == 'd') new_bin = 0; } if(settings->printops.use_unit_prefixes != new_pre || settings->printops.use_prefixes_for_currencies != new_cur || settings->printops.use_prefixes_for_all_units != new_allu || settings->printops.use_all_prefixes != new_all || settings->printops.use_denominator_prefix != new_den || CALCULATOR->usesBinaryPrefixes() != new_bin) { settings->printops.use_unit_prefixes = new_pre; settings->printops.use_all_prefixes = new_all; settings->printops.use_prefixes_for_currencies = new_cur; settings->printops.use_prefixes_for_all_units = new_allu; settings->printops.use_denominator_prefix = new_den; CALCULATOR->useBinaryPrefixes(new_bin); do_to = true; } } } } settings->printops.prefix = prefix; if(!do_stack) { if(!viewThread->write((void*) mstruct)) {b_busy--; viewThread->cancel(); return;} } else { MathStructure *mreg = CALCULATOR->getRPNRegister(stack_index + 1); if(!viewThread->write((void*) mreg)) {b_busy--; viewThread->cancel(); return;} } if(!viewThread->write(do_stack || calculate_selection)) {b_busy--; viewThread->cancel(); return;} if(do_stack) { if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } else { matrix_mstruct.clear(); if(!mstruct->isMatrix() || mstruct->rows() * mstruct->columns() <= 16 || mstruct->columns() * mstruct->rows() > 10000) { if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } else { if(!viewThread->write((void*) &matrix_mstruct)) {b_busy--; viewThread->cancel(); return;} } } if(update_parse) { if(!viewThread->write((void*) parsed_mstruct)) {b_busy--; viewThread->cancel(); return;} bool *parsed_approx_p = &parsed_approx; if(!viewThread->write(parsed_approx_p)) {b_busy--; viewThread->cancel(); return;} if(!viewThread->write(!b_rpn_operation)) {b_busy--; viewThread->cancel(); return;} } else { if(settings->printops.base != BASE_DECIMAL && settings->dual_approximation <= 0) mstruct_exact.setUndefined(); if(!viewThread->write((void*) NULL)) {b_busy--; viewThread->cancel(); return;} } QProgressDialog *dialog = NULL; PREPARE_TIMECHECK(500) for(int i = 0; b_busy && viewThread->running && i < 10000; i++) { sleep_ms(1); DO_TIMECHECK {break;} } if(b_busy && viewThread->running) { if(!do_stack && updateWindowTitle(tr("Processing…"))) title_set = true; dialog = new QProgressDialog(tr("Processing…"), tr("Cancel"), 0, 0, this); dialog->setWindowTitle(tr("Processing…")); connect(dialog, SIGNAL(canceled()), this, SLOT(abort())); dialog->setWindowModality(Qt::WindowModal); dialog->show(); QApplication::setOverrideCursor(Qt::WaitCursor); was_busy = true; } if(b_busy && testTimer && testTimer->isActive()) CALCULATOR->abort(); while(b_busy && viewThread->running) { qApp->processEvents(); sleep_ms(10); } b_busy++; if(was_busy) { QApplication::restoreOverrideCursor(); dialog->hide(); dialog->deleteLater(); if(title_set) updateWindowTitle(); } if(!do_stack) { if(basesDock->isVisible()) updateResultBases(); updateWindowTitleResult(result_text); } if(register_moved) { update_parse = true; parsed_text = result_text; } if(settings->history_answer.empty()) { update_parse = true; } if(do_stack) { RPNRegisterChanged(result_text, stack_index); if(supress_dialog) CALCULATOR->clearMessages(); else displayMessages(); } else if(update_history) { if(update_parse) {} } else { if(supress_dialog) CALCULATOR->clearMessages(); else displayMessages(); } if(register_moved) { update_parse = true; parsed_text = result_text; } bool implicit_warning = false; if(do_stack) { RPNRegisterChanged(result_text, stack_index); } else { if(settings->rpn_mode && !register_moved) { RPNRegisterChanged(result_text, stack_index); } if(mstruct->isAborted() || settings->printops.base != settings->evalops.parse_options.base || (settings->printops.base > 32 || settings->printops.base < 2)) { exact_text = ""; } else if(!mstruct->isApproximate() && !(*settings->printops.is_approximate)) { exact_text = unhtmlize(result_text); } else if(!alt_results.empty()) { exact_text = unhtmlize(alt_results[0]); } else { exact_text = ""; } if(update_parse && parsed_mstruct && alt_results.empty() && mstruct->isZero() && parsed_mstruct->isFunction() && (parsed_mstruct->function()->id() == FUNCTION_ID_ERROR || parsed_mstruct->function()->id() == FUNCTION_ID_WARNING || parsed_mstruct->function()->id() == FUNCTION_ID_MESSAGE || parsed_mstruct->function()->subtype() == SUBTYPE_DATA_SET) && CALCULATOR->message() && CALCULATOR->message()->type() == MESSAGE_INFORMATION) { if(prev_result_text.empty()) { expressionEdit->clear(); parsed_text = "#"; } result_text = ""; } else { alt_results.push_back(result_text); } for(size_t i = 0; i < alt_results.size(); i++) { gsub("\n", "
", alt_results[i]); } QString flag; if((mstruct->isMultiplication() && mstruct->size() == 2 && (*mstruct)[1].isUnit() && (*mstruct)[1].unit()->isCurrency()) || (mstruct->isUnit() && mstruct->unit()->isCurrency())) { flag = ":/data/flags/" + QString::fromStdString(mstruct->isUnit() ? mstruct->unit()->referenceName() : (*mstruct)[1].unit()->referenceName()) + ".png"; if(!QFile::exists(flag)) flag.clear(); } int b_exact = (update_parse || !prev_approximate) && (exact_comparison || (!(*settings->printops.is_approximate) && !mstruct->isApproximate())); if(alt_results.size() == 1 && (mstruct->isComparison() || ((mstruct->isLogicalAnd() || mstruct->isLogicalOr()) && mstruct->containsType(STRUCT_COMPARISON, true, false, false))) && (exact_comparison || b_exact || result_text.find(SIGN_ALMOST_EQUAL) != std::string::npos)) b_exact = -1; size_t index = settings->v_expression.size(); bool b_add = true; if(index > 0 && settings->current_result && !CALCULATOR->message() && (!update_parse || (settings->history_answer.size() > (mstruct_exact.isUndefined() ? 1 : 2) && !settings->rpn_mode && mstruct->equals(*settings->history_answer[settings->history_answer.size() - 1], true, true) && (mstruct_exact.isUndefined() || (settings->history_answer.size() > 1 && mstruct_exact.equals(*settings->history_answer[settings->history_answer.size() - 2], true, true))) && parsed_text == settings->v_parse[index - 1] && prev_result_text == settings->v_expression[index - 1] && parsed_approx != settings->v_pexact[index - 1] && !contains_rand_function(*parsed_mstruct))) && alt_results.size() <= settings->v_result[index - 1].size()) { b_add = false; for(size_t i = 0; i < alt_results.size(); i++) { if(settings->v_exact[index - 1][i] != (b_exact || i < alt_results.size() - 1) || settings->v_result[index - 1][i] != alt_results[i]) { b_add = true; break; } } } if(b_add) { auto_expression = ""; auto_result = ""; auto_result_text = ""; auto_exact_text = ""; mauto.setAborted(); auto_error = false; auto_aborted = false; if(autoCalculateTimer) autoCalculateTimer->stop(); historyView->addResult(alt_results, update_parse ? prev_result_text : "", !parsed_approx, update_parse ? parsed_text : "", b_exact, alt_results.size() > 1 && !mstruct_exact.isUndefined(), flag, !supress_dialog && update_parse && settings->evalops.parse_options.parsing_mode <= PARSING_MODE_CONVENTIONAL && update_history ? &implicit_warning : NULL); } else if(update_parse) { settings->history_answer.pop_back(); if(!mstruct_exact.isUndefined()) settings->history_answer.pop_back(); historyView->clearTemporary(); } } if(do_to) { settings->complex_angle_form = caf_bak; settings->printops.base = save_base; settings->printops.duodecimal_symbols = save_duo_syms; settings->printops.binary_bits = save_bits; if(custom_base_set) CALCULATOR->setCustomOutputBase(save_nbase); settings->printops.use_unit_prefixes = save_pre; settings->printops.use_all_prefixes = save_all; settings->printops.use_prefixes_for_currencies = save_cur; settings->printops.use_prefixes_for_all_units = save_allu; settings->printops.use_denominator_prefix = save_den; CALCULATOR->useBinaryPrefixes(save_bin); settings->printops.number_fraction_format = save_format; CALCULATOR->setFixedDenominator(save_fden); settings->dual_fraction = save_dual; settings->printops.restrict_fraction_length = save_restrict_fraction_length; settings->printops.sort_options.minus_last = save_minus; settings->printops.min_exp = save_exp; settings->printops.show_ending_zeroes = save_zeroes; settings->printops.negative_exponents = save_neg; } settings->printops.prefix = NULL; settings->current_result = mstruct; b_busy--; if(implicit_warning && askImplicit()) { calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", "", true, calculate_selection); return; } if(!supress_dialog && !register_moved && !do_stack && mstruct->isMatrix() && matrix_mstruct.isMatrix()) { QDialog *dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixStrings(matrix_mstruct); w->setEditable(false); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, dialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), dialog, SLOT(reject())); dialog->exec(); dialog->deleteLater(); } } bool QalculateWindow::eventFilter(QObject*, QEvent *e) { if(e->type() == QEvent::ToolTip) return true; return false; } void QalculateWindow::onColorSchemeChanged() { #if defined _WIN32 && (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) settings->updatePalette(true); #endif } void QalculateWindow::changeEvent(QEvent *e) { if(e->type() == QEvent::PaletteChange || e->type() == QEvent::ApplicationPaletteChange) { QColor c = QApplication::palette().base().color(); if(c.red() + c.green() + c.blue() < 255) settings->color = 2; else settings->color = 1; menuAction_t->setIcon(LOAD_COLORED_ICON("menu")); toAction_t->setIcon(LOAD_COLORED_ICON("convert")); storeAction_t->setIcon(LOAD_COLORED_ICON("document-save")); functionsAction_t->setIcon(LOAD_COLORED_ICON("function")); unitsAction_t->setIcon(LOAD_COLORED_ICON("units")); if(plotAction_t) plotAction_t->setIcon(LOAD_COLORED_ICON("plot")); keypadAction_t->setIcon(LOAD_COLORED_ICON("keypad")); basesAction->setIcon(LOAD_COLORED_ICON("number-bases")); modeAction_t->setIcon(LOAD_COLORED_ICON("configure")); rpnUpAction->setIcon(LOAD_COLORED_ICON("go-up")); rpnDownAction->setIcon(LOAD_COLORED_ICON("go-down")); rpnSwapAction->setIcon(LOAD_COLORED_ICON("rpn-swap")); rpnCopyAction->setIcon(LOAD_COLORED_ICON("edit-copy")); rpnLastxAction->setIcon(LOAD_COLORED_ICON("edit-undo")); rpnDeleteAction->setIcon(LOAD_COLORED_ICON("edit-delete")); rpnClearAction->setIcon(LOAD_COLORED_ICON("edit-clear")); } else if(e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) { if(!settings->use_custom_expression_font) { QFont font(QApplication::font()); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * RESULT_FONT_FACTOR); else font.setPointSize(font.pointSize() * RESULT_FONT_FACTOR); expressionEdit->setFont(font); } if(expressionEdit->completionInitialized()) expressionEdit->updateCompletion(); if(!settings->use_custom_status_font) { QFont font(QApplication::font()); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * STATUS_FONT_FACTOR); else font.setPointSize(font.pointSize() * STATUS_FONT_FACTOR); statusLabelLeft->setFont(font); statusLabelRight->setFont(font); } QFont binfont(QApplication::font()); #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) binfont.setFeature("tnum", 1); #endif binEdit->setFont(binfont); updateBinEditSize(); } QMainWindow::changeEvent(e); } void QalculateWindow::resizeEvent(QResizeEvent *e) { if(statusLabelLeft->isVisible() && (settings->status_in_history || settings->status_in_statusbar)) { expressionEdit->showCurrentStatus(); } QMainWindow::resizeEvent(e); } void QalculateWindow::updateBinEditSize(QFont *font) { QFontMetrics fm2(font ? *font : binEdit->font()); SET_BINARY_BITS int rows = binary_bits / 32; if(binary_bits % 32 > 0) rows++; QString row_string; for(int i = binary_bits > 32 ? 32 : binary_bits; i > 0; i -= 4) { if(i < 32 && i < binary_bits) row_string += " "; row_string += "0000"; } binEdit->setMinimumWidth(fm2.boundingRect(row_string).width() + binEdit->frameWidth() * 2 + binEdit->contentsMargins().left() + binEdit->contentsMargins().right()); binEdit->setMinimumHeight(fm2.lineSpacing() * rows * 2 + binEdit->frameWidth() * 2 + binEdit->contentsMargins().top() + binEdit->contentsMargins().bottom()); } void QalculateWindow::fetchExchangeRates() { CALCULATOR->clearMessages(); settings->fetchExchangeRates(15, -1, this); CALCULATOR->loadExchangeRates(); displayMessages(); expressionCalculationUpdated(); } void QalculateWindow::abort() { CALCULATOR->abort(); } void QalculateWindow::abortCommand() { CALCULATOR->abort(); PREPARE_TIMECHECK(5000) for(int i = 0; b_busy && i < 10000; i++) { sleep_ms(10); DO_TIMECHECK {break;} } if(b_busy) { commandThread->cancel(); b_busy--; CALCULATOR->stopControl(); command_aborted = true; } } bool contains_temperature_unit_qt(const MathStructure &m) { if(m.isUnit()) { return m.unit() == CALCULATOR->getUnitById(UNIT_ID_CELSIUS) || m.unit() == CALCULATOR->getUnitById(UNIT_ID_FAHRENHEIT); } if(m.isVariable() && m.variable()->isKnown()) { return contains_temperature_unit_qt(((KnownVariable*) m.variable())->get()); } if(m.isFunction() && m.function()->id() == FUNCTION_ID_STRIP_UNITS) return false; for(size_t i = 0; i < m.size(); i++) { if(contains_temperature_unit_qt(m[i])) return true; } return false; } bool QalculateWindow::warnAssumptions(MathStructure &m, bool dry_run) { if(settings->assumptions_warning_shown) return false; if(CALCULATOR->defaultAssumptions()->type() != ASSUMPTION_TYPE_REAL || CALCULATOR->defaultAssumptions()->sign() != ASSUMPTION_SIGN_UNKNOWN) { settings->assumptions_warning_shown = true; return false; } if(m.containsType(STRUCT_COMPARISON, false) <= 0 && !m.containsFunctionId(FUNCTION_ID_SOLVE)) return false; MathStructure mvar = m.find_x_var(); if(!mvar.isSymbolic() && !mvar.isVariable()) return false; if(mvar.isVariable() && (mvar.variable()->isKnown() || ((UnknownVariable*) mvar.variable())->assumptions())) return false; CALCULATOR->error(false, tr("Unknown variables (e.g. x, y, z) are by default assumed real.").toUtf8().data(), NULL); if(!dry_run) settings->assumptions_warning_shown = true; return true; } bool QalculateWindow::askTC(MathStructure &m, bool dry_run) { if(settings->tc_set || !contains_temperature_unit_qt(m)) return false; MathStructure *mp = &m; if(m.isMultiplication() && m.size() == 2 && m[0].isMinusOne()) mp = &m[1]; else if(m.isNegate()) mp = &m[0]; if(mp->isUnit_exp()) return false; if(mp->isMultiplication() && mp->size() > 0 && mp->last().isUnit_exp()) { bool b = false; for(size_t i = 0; i < mp->size() - 1; i++) { if(contains_temperature_unit_qt((*mp)[i])) {b = true; break;} } if(!b) return false; } if(dry_run) return true; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Temperature Calculation Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("The expression is ambiguous.\nPlease select temperature calculation mode\n(the mode can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_abs = new QRadioButton(tr("Absolute")); group->addButton(w_abs); grid->addWidget(w_abs, 1, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C ≈ 274 K + 274 K ≈ 548 K
1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K
2 °C − 1 °C = 1 K
1 °C − 5 °F = 16 K
1 °C + 1 K = 2 °C
"), 1, 1); QRadioButton *w_relative = new QRadioButton(tr("Relative")); group->addButton(w_relative); grid->addWidget(w_relative, 2, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C = 2 °C
1 °C + 5 °F = 1 °C + 5 °R ≈ 4 °C ≈ 277 K
2 °C − 1 °C = 1 °C
1 °C − 5 °F = 1 °C - 5 °R ≈ −2 °C
1 °C + 1 K = 2 °C
"), 2, 1); QRadioButton *w_hybrid = new QRadioButton(tr("Hybrid")); group->addButton(w_hybrid); grid->addWidget(w_hybrid, 3, 0, Qt::AlignTop); grid->addWidget(new QLabel("1 °C + 1 °C ≈ 2 °C
1 °C + 5 °F ≈ 274 K + 258 K ≈ 532 K
2 °C − 1 °C = 1 °C
1 °C − 5 °F = 16 K
1 °C + 1 K = 2 °C
"), 3, 1); switch(CALCULATOR->getTemperatureCalculationMode()) { case TEMPERATURE_CALCULATION_ABSOLUTE: {w_abs->setChecked(true); break;} case TEMPERATURE_CALCULATION_RELATIVE: {w_relative->setChecked(true); break;} default: {w_hybrid->setChecked(true); break;} } dialog->exec(); TemperatureCalculationMode tc_mode = TEMPERATURE_CALCULATION_HYBRID; if(w_abs->isChecked()) tc_mode = TEMPERATURE_CALCULATION_ABSOLUTE; else if(w_relative->isChecked()) tc_mode = TEMPERATURE_CALCULATION_RELATIVE; dialog->deleteLater(); settings->tc_set = true; if(tc_mode != CALCULATOR->getTemperatureCalculationMode()) { CALCULATOR->setTemperatureCalculationMode(tc_mode); if(preferencesDialog) preferencesDialog->updateTemperatureCalculation(); return true; } return false; } bool QalculateWindow::askSinc(MathStructure &m, bool dry_run) { if(settings->sinc_set || !m.containsFunctionId(FUNCTION_ID_SINC)) return false; if(dry_run) return true; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Temperature Calculation Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("Please select desired variant of the sinc function.")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_1 = new QRadioButton(tr("Unnormalized")); group->addButton(w_1); grid->addWidget(w_1, 1, 0, Qt::AlignTop); grid->addWidget(new QLabel("sinc(x) = sin(x)/x"), 1, 1); QRadioButton *w_pi = new QRadioButton(tr("Normalized")); group->addButton(w_pi); grid->addWidget(w_pi, 2, 0, Qt::AlignTop); grid->addWidget(new QLabel("sinc(x) = sinc(Ï€x)/(Ï€x)"), 2, 1); w_1->setChecked(true); dialog->exec(); bool b_pi = w_pi->isChecked(); dialog->deleteLater(); settings->sinc_set = true; if(b_pi) { CALCULATOR->getFunctionById(FUNCTION_ID_SINC)->setDefaultValue(2, "pi"); return true; } return false; } bool QalculateWindow::askDot(const std::string &str, bool dry_run) { if(settings->dot_question_asked) return false; bool ask_comma = (CALCULATOR->getDecimalPoint() == DOT); size_t i = 0; bool b = false; while(true) { i = str.find(ask_comma ? COMMA : DOT, i); if(i == std::string::npos) return false; i = str.find_first_not_of(SPACES, i + 1); if(i == std::string::npos) return false; if(is_in(NUMBERS, str[i])) { b = true; break; } } if(!b) return false; if(dry_run) return true; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(ask_comma ? tr("Interpretation of comma") : tr("Interpretation of dots")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(ask_comma ? tr("Please select interpretation of comma (\",\")\n(this can later be changed in preferences).") : tr("Please select interpretation of dots (\".\")\n(this can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_bothdeci = new QRadioButton(tr("Both dot and comma as decimal separators")); group->addButton(w_bothdeci); grid->addWidget(w_bothdeci, ask_comma ? 3 : 1, 0); grid->addWidget(new QLabel("(1.2 = 1,2)"), ask_comma ? 3 : 1, 1); QRadioButton *w_ignoredot = new QRadioButton(ask_comma ? tr("Comma as thousands separator") : tr("Dot as thousands separator")); group->addButton(w_ignoredot); grid->addWidget(w_ignoredot, 2, 0); grid->addWidget(new QLabel(ask_comma ? "(1,000,000 = 1000000)" : "(1.000.000 = 1000000)"), 2, 1); QRadioButton *w_dotdeci = new QRadioButton(ask_comma ? tr("Comma as separator for function arguments\nand matrix/vector elements") : tr("Only dot as decimal separator")); group->addButton(w_dotdeci); grid->addWidget(w_dotdeci, ask_comma ? 1 : 3, 0); grid->addWidget(new QLabel("(1.2 + root(16, 4) = 3.2)"), ask_comma ? 1 : 3, 1); if((!ask_comma && settings->evalops.parse_options.dot_as_separator) || (ask_comma && settings->evalops.parse_options.comma_as_separator)) w_ignoredot->setChecked(true); else if(ask_comma) w_dotdeci->setChecked(true); else w_bothdeci->setChecked(true); dialog->exec(); settings->dot_question_asked = true; bool b_ret = false; if(w_dotdeci->isChecked()) { if(ask_comma) { b_ret = settings->evalops.parse_options.comma_as_separator; } else { b_ret = true; settings->evalops.parse_options.dot_as_separator = false; settings->decimal_comma = false; } settings->evalops.parse_options.comma_as_separator = false; CALCULATOR->useDecimalPoint(false); } else if(w_ignoredot->isChecked()) { if(ask_comma) { b_ret = !settings->evalops.parse_options.comma_as_separator; settings->evalops.parse_options.comma_as_separator = true; CALCULATOR->useDecimalPoint(true); } else { b_ret = !settings->evalops.parse_options.dot_as_separator; settings->evalops.parse_options.dot_as_separator = true; } } else { if(ask_comma) { settings->evalops.parse_options.comma_as_separator = false; CALCULATOR->useDecimalComma(); settings->decimal_comma = true; b_ret = true; } else { b_ret = settings->evalops.parse_options.dot_as_separator; } settings->evalops.parse_options.dot_as_separator = false; } if(b_ret && preferencesDialog) preferencesDialog->updateDot(); dialog->deleteLater(); return b_ret; } bool QalculateWindow::askImplicit() { QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Parsing Mode")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("The expression is ambiguous.\nPlease select interpretation of expressions with implicit multiplication\n(this can later be changed in preferences).")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QLabel *label = new QLabel("1/2x = 1/(2x)"); int h = label->sizeHint().height(); QRadioButton *w_implicitfirst = new QRadioButton(tr("Implicit multiplication first")); group->addButton(w_implicitfirst); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST) w_implicitfirst->setChecked(true); grid->addWidget(w_implicitfirst, 1, 0, Qt::AlignTop | Qt::AlignLeft); w_implicitfirst->setMinimumHeight(h); label->setText("1/2x = 1/(2x)
5 m/2 s = (5 m)/(2 s)
"); grid->addWidget(label, 1, 1); QRadioButton *w_conventional = new QRadioButton(tr("Conventional")); group->addButton(w_conventional); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_CONVENTIONAL) w_conventional->setChecked(true); grid->addWidget(w_conventional, 2, 0, Qt::AlignTop | Qt::AlignLeft); w_conventional->setMinimumHeight(h); grid->addWidget(new QLabel("1/2x = (1/2)x
5 m/2 s = (5 m/2)s
"), 2, 1); QRadioButton *w_adaptive = new QRadioButton(tr("Adaptive")); group->addButton(w_adaptive); grid->addWidget(w_adaptive, 3, 0, Qt::AlignTop | Qt::AlignLeft); w_adaptive->setMinimumHeight(h); grid->addWidget(new QLabel("1/2x = 1/(2x); 1/2 x = (1/2)x
5 m/2 s = (5 m)/(2 s)
"), 3, 1); if(settings->evalops.parse_options.parsing_mode == PARSING_MODE_ADAPTIVE) w_adaptive->setChecked(true); dialog->exec(); settings->implicit_question_asked = true; ParsingMode pm_bak = settings->evalops.parse_options.parsing_mode; if(w_implicitfirst->isChecked()) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_IMPLICIT_MULTIPLICATION_FIRST; } else if(w_conventional->isChecked()) { settings->evalops.parse_options.parsing_mode = PARSING_MODE_CONVENTIONAL; } else { settings->evalops.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; } if(preferencesDialog) preferencesDialog->updateParsingMode(); dialog->deleteLater(); return pm_bak != settings->evalops.parse_options.parsing_mode; } bool QalculateWindow::askPercent(bool dry_run) { if(settings->simplified_percentage >= 0 || !CALCULATOR->simplifiedPercentageUsed()) return false; if(dry_run) return true; QDialog *dialog = new QDialog(this); QVBoxLayout *box = new QVBoxLayout(dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Percentage Interpretation")); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, dialog); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); box->addWidget(buttonBox); grid->addWidget(new QLabel(tr("Please select interpretation of percentage addition")), 0, 0, 1, 2); QButtonGroup *group = new QButtonGroup(dialog); group->setExclusive(true); QRadioButton *w_1 = new QRadioButton(tr("Add percentage of original value")); group->addButton(w_1); grid->addWidget(w_1, 1, 0, Qt::AlignTop); std::string s_eg = "100 + 10% = 100 "; s_eg += settings->multiplicationSign(); s_eg += " 110% = 110)"; grid->addWidget(new QLabel(QString::fromStdString(s_eg)), 1, 1); QRadioButton *w_0 = new QRadioButton(tr("Add percentage multiplied by 1/100")); group->addButton(w_0); grid->addWidget(w_0, 2, 0, Qt::AlignTop); s_eg = "100 + 10% = 100 + (10 "; s_eg += settings->multiplicationSign(); s_eg += " 0.01) = 100.1)"; grid->addWidget(new QLabel(QString::fromStdString(CALCULATOR->localizeExpression(s_eg, settings->evalops.parse_options))), 2, 1); w_1->setChecked(true); dialog->exec(); if(w_0->isChecked()) settings->simplified_percentage = 0; else settings->simplified_percentage = 1; dialog->deleteLater(); return settings->simplified_percentage == 0; } void QalculateWindow::keyPressEvent(QKeyEvent *e) { if(e->matches(QKeySequence::Undo)) { expressionEdit->editUndo(); return; } if(e->matches(QKeySequence::Redo)) { expressionEdit->editRedo(); return; } QMainWindow::keyPressEvent(e); } void QalculateWindow::closeEvent(QCloseEvent *e) { if(testTimer) testTimer->stop(); if(autoCalculateTimer) autoCalculateTimer->stop(); if(!settings->current_workspace.empty()) { int i = askSaveWorkspace(); if(i < 0) return; } settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); settings->show_bases = basesDock->isVisible(); if(settings->savePreferences(settings->save_mode_on_exit) < 0) return; if(settings->save_defs_on_exit) { while(!CALCULATOR->saveDefinitions()) { int answer = QMessageBox::critical(this, tr("Error"), tr("Couldn't write definitions"), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) break; else if(answer == QMessageBox::Cancel) return; } } for(int i = 0; i < settings->tempfiles.size(); i++) { QFile::remove(settings->tempfiles[i]); } CALCULATOR->abort(); CALCULATOR->terminateThreads(); if(commandThread->running) { commandThread->write((int) 0); commandThread->write(NULL); } if(viewThread->running) { viewThread->write((int) 0); viewThread->write(NULL); } QMainWindow::closeEvent(e); qApp->closeAllWindows(); } void QalculateWindow::onToActivated(bool) { QTextCursor cur = expressionEdit->textCursor(); int b_result = 0; if(!expressionEdit->expressionHasChanged() && settings->current_result) b_result = 1; else if(settings->status_in_history && !mauto.isAborted() && expressionEdit->expressionHasChanged()) b_result = 2; if(b_result != 1) expressionEdit->blockCompletion(true, true); expressionEdit->complete(b_result == 1 ? mstruct : (b_result == 2 ? &mauto : NULL), b_result == 1 ? parsed_mstruct : (b_result == 2 ? &mauto_parsed : NULL), toMenu, b_result == 2); if(toMenu->isEmpty()) { expressionEdit->blockParseStatus(); expressionEdit->moveCursor(QTextCursor::End); expressionEdit->insertText("➞"); expressionEdit->blockParseStatus(false); expressionEdit->displayParseStatus(true, false); } else { toAction_t->setMenu(toMenu); toAction_t->showMenu(); toAction_t->setMenu(NULL); toMenu->clear(); } if(b_result != 1) expressionEdit->blockCompletion(false); } void QalculateWindow::onToActivatedAlt() { expressionEdit->blockCompletion(true, true); expressionEdit->blockParseStatus(); expressionEdit->moveCursor(QTextCursor::End); expressionEdit->insertText("➞"); expressionEdit->blockParseStatus(false); expressionEdit->displayParseStatus(true, false); expressionEdit->blockCompletion(false); } void QalculateWindow::onToConversionRequested(std::string str) { str.insert(0, "➞"); if(str.length() == strlen("➞") || str[str.length() - 1] == ' ' || str[str.length() - 1] == '/') { expressionEdit->insertText(QString::fromStdString(str)); } else if(expressionEdit->expressionHasChanged() || !settings->current_result) { std::string str_expr = expressionEdit->toPlainText().toStdString(); if(CALCULATOR->hasToExpression(str_expr, true, settings->evalops)) { std::string str2 = str_expr, to_str; CALCULATOR->separateToExpression(str2, to_str, settings->evalops, true, true); if(to_str.empty()) { str_expr = str2; expressionEdit->blockCompletion(true, true); expressionEdit->blockParseStatus(); expressionEdit->setPlainText(QString::fromStdString(str_expr)); expressionEdit->blockParseStatus(false); expressionEdit->blockCompletion(false); } } expressionEdit->setExpressionHasChanged(false); expressionEdit->addToHistory(); askDot(str_expr); calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", str_expr + str); } else { calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", str); } } void QalculateWindow::importCSV() { size_t n = CALCULATOR->variables.size(); if(CSVDialog::importCSVFile(this)) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); for(size_t i = n; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->isHidden()) settings->favourite_variables.push_back(CALCULATOR->variables[i]); } expressionObjectsUpdated(); } } void QalculateWindow::exportCSV() { CSVDialog::exportCSVFile(this, !auto_result.empty() ? &mauto : mstruct); } void QalculateWindow::onStoreActivated() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newVariable(this, !auto_result.empty() ? &mauto : (expressionEdit->expressionHasChanged() || settings->history_answer.empty() ? NULL : (mstruct_exact.isUndefined() ? mstruct : &mstruct_exact)), !auto_result.empty() ? QString::fromStdString(unhtmlize(auto_exact_text)) : (expressionEdit->expressionHasChanged() ? expressionEdit->toPlainText() : QString::fromStdString(exact_text)), &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); expressionObjectsUpdated(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); } } void QalculateWindow::newVariable() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newVariable(this, NULL, NULL, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newMatrix() { ExpressionItem *replaced_item = NULL; KnownVariable *v = VariableEditDialog::newMatrix(this, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newUnknown() { ExpressionItem *replaced_item = NULL; UnknownVariable *v = UnknownEditDialog::newVariable(this, &replaced_item); if(v) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); expressionObjectsUpdated(); } } void QalculateWindow::newUnit() { ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::newUnit(this, &replaced_item); if(u) { expressionEdit->updateCompletion(); if(variablesDialog) variablesDialog->updateVariables(); if(unitsDialog) unitsDialog->updateUnits(); variablesMenu->clear(); unitsMenu->clear(); if(u != replaced_item && !u->isHidden()) settings->favourite_units.push_back(u); expressionObjectsUpdated(); } } void QalculateWindow::newFunction() { MathFunction *replaced_item = NULL; MathFunction *f = FunctionEditDialog::newFunction(this, &replaced_item); if(f) { expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); if(f != replaced_item && !f->isHidden()) settings->favourite_functions.push_back(f); expressionObjectsUpdated(); } } void QalculateWindow::showNumpad(bool b) { keypad->hideNumpad(!b); settings->hide_numpad = !b; workspace_changed = true; nKeypadAction->setEnabled(!b); if(b && settings->keypad_type == KEYPAD_NUMBERPAD) gKeypadAction->trigger(); } void QalculateWindow::showCustomKeypadColumn(bool b) { keypad->showCustomButtonColumn(b); settings->show_custom_keypad_column = b; workspace_changed = true; } void QalculateWindow::showSeparateKeypadMenuButtons(bool b) { settings->separate_keypad_menu_buttons = b; keypad->showSeparateKeypadMenuButtons(b); } void QalculateWindow::resetKeypadPosition() { keypadDock->setFloating(false); if(dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea) { bool b = keypadDock->isVisible(); removeDockWidget(keypadDock); addDockWidget(Qt::BottomDockWidgetArea, keypadDock); keypadDock->setVisible(b); } } void QalculateWindow::initFinished() { init_in_progress = false; } #define DOCK_IN_WINDOW(dock) (!dock->isFloating() && (dockWidgetArea(dock) == Qt::BottomDockWidgetArea || dockWidgetArea(dock) == Qt::TopDockWidgetArea)) #define DOCK_VISIBLE_IN_WINDOW(dock) (dock->isVisible() && DOCK_IN_WINDOW(dock)) void QalculateWindow::beforeShowDockCleanUp(QDockWidget*) { if(emhTimer && emhTimer->isActive()) { emhTimer->stop(); onEMHTimeout(); } if(resizeTimer && resizeTimer->isActive()) { resizeTimer->stop(); onResizeTimeout(); } } void QalculateWindow::beforeShowDock(QDockWidget *w, bool b) { beforeShowDockCleanUp(w); if(!init_in_progress && b && DOCK_IN_WINDOW(w)) { expressionEdit->setMinimumHeight(expressionEdit->height()); if(!w->isVisible() && (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && historyView->height() < w->sizeHint().height()))) { if(settings->preserve_history_height < 0) { if(w == keypadDock) settings->keypad_appended = true; else if(w == basesDock) settings->bases_appended = true; } historyView->setMinimumHeight(historyView->height()); } else { if(w == keypadDock) settings->keypad_appended = false; else if(w == basesDock) settings->bases_appended = false; } } } void QalculateWindow::afterShowDock(QDockWidget *w) { if(!init_in_progress && w->isVisible()) { if(!emhTimer) { emhTimer = new QTimer(); emhTimer->setSingleShot(true); connect(emhTimer, SIGNAL(timeout()), this, SLOT(onEMHTimeout())); } emhTimer->start(100); } } void QalculateWindow::onEMHTimeout() { expressionEdit->updateMinimumHeight(); historyView->updateMinimumHeight(); } void QalculateWindow::onResizeTimeout() { if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(QWIDGETSIZE_MAX); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(QWIDGETSIZE_MAX); setMinimumWidth(0); setMaximumWidth(QWIDGETSIZE_MAX); centralWidget()->setMaximumHeight(QWIDGETSIZE_MAX); centralWidget()->setMinimumHeight(0); } // minimum width when dock is shown void QalculateWindow::keypadTypeActivated() { int v = qobject_cast(sender())->data().toInt(); beforeShowDock(keypadDock, v >= 0 || !keypadDock->isVisible()); if(v < 0) { bool b = !keypadDock->isVisible(); bool b_resize = (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->keypad_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(keypadDock); if(b_resize) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(basesDock->height()); } keypadDock->setVisible(b); if(b) keypadDock->raise(); if(b_resize) { setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } settings->show_keypad = b ? 1 : 0; } else { if(settings->keypad_type == v && keypadDock->isVisible()) v = KEYPAD_GENERAL; settings->keypad_type = v; keypad->setKeypadType(v); keypadDock->setVisible(true); keypadDock->raise(); settings->show_keypad = 1; updateKeypadTitle(); } afterShowDock(keypadDock); resetKeypadPositionAction->setEnabled(keypadDock->isVisible() && (keypadDock->isFloating() || dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea)); workspace_changed = true; } void QalculateWindow::onKeypadVisibilityChanged(bool b) { beforeShowDockCleanUp(keypadDock); QAction *action = find_child_data(this, "group_keypad", b ? settings->keypad_type : -1); if(action) action->setChecked(true); settings->show_keypad = b ? 1 : 0; resetKeypadPositionAction->setEnabled(keypadDock->isVisible() && (keypadDock->isFloating() || dockWidgetArea(keypadDock) != Qt::BottomDockWidgetArea)); if(!b && settings->keypad_type == KEYPAD_PROGRAMMING && settings->programming_base_changed) { settings->programming_base_changed = false; onBaseClicked(BASE_DECIMAL, true, false); } if((settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->keypad_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(keypadDock)) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(basesDock)) basesDock->setMaximumHeight(basesDock->height()); setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } } void QalculateWindow::onToolbarVisibilityChanged(bool b) { expressionEdit->setMenuAndToolbarItems(b ? NULL : modeAction_t->menu(), b ? NULL : menuAction_t->menu(), b ? NULL : tbAction); historyView->setMenuAndToolbarItems(b ? NULL : modeAction_t->menu(), b ? NULL : menuAction_t->menu(), b ? NULL : tbAction); tbAction->setChecked(b); } void QalculateWindow::onBasesActivated(bool b) { if(b == basesDock->isVisible()) return; beforeShowDock(basesDock, b); bool b_resize = (settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->bases_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(basesDock); if(b_resize) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(keypadDock->height()); } basesDock->setVisible(b); if(b) basesDock->raise(); if(b_resize) { setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } afterShowDock(basesDock); } void QalculateWindow::onBasesVisibilityChanged(bool b) { beforeShowDockCleanUp(basesDock); basesAction->setChecked(b); if((settings->preserve_history_height > 0 || (settings->preserve_history_height < 0 && settings->bases_appended)) && !b && !init_in_progress && DOCK_IN_WINDOW(basesDock)) { centralWidget()->setFixedHeight(centralWidget()->height()); if(DOCK_VISIBLE_IN_WINDOW(keypadDock)) keypadDock->setMaximumHeight(keypadDock->height()); setFixedWidth(width()); adjustSize(); if(!resizeTimer) { resizeTimer = new QTimer(); resizeTimer->setSingleShot(true); connect(resizeTimer, SIGNAL(timeout()), this, SLOT(onResizeTimeout())); } resizeTimer->start(100); } if(b && expressionEdit->expressionHasChanged()) onExpressionChanged(); else if(b && !settings->history_answer.empty()) updateResultBases(); } bool QalculateWindow::displayMessages() { return settings->displayMessages(this); } void QalculateWindow::updateWindowTitleResult(const std::string &str) { if(!title_modified && (settings->title_type == TITLE_RESULT || settings->title_type == TITLE_APP_RESULT)) { updateWindowTitle(QString::fromStdString(unhtmlize(ellipsize_result(str, 1000))), true); } } bool QalculateWindow::updateWindowTitle(const QString &str, bool is_result, bool type_change) { if(title_modified) return false; if(type_change) { if(settings->title_type == TITLE_APP_RESULT || settings->title_type == TITLE_APP_WORKSPACE || settings->title_type == TITLE_APP) { qApp->setApplicationDisplayName("Qalculate!"); setWindowTitle(QString()); } else if(settings->title_type == TITLE_RESULT) { qApp->setApplicationDisplayName(QString()); setWindowTitle(QString()); } if(settings->title_type == TITLE_RESULT || settings->title_type == TITLE_APP_RESULT) { if(result_text.empty()) { if(!auto_result_text.empty()) setWindowTitle(QString::fromStdString(unhtmlize(ellipsize_result(auto_result_text, 1000)))); else if(settings->title_type == TITLE_RESULT) setWindowTitle("Qalculate!"); } else { setWindowTitle(QString::fromStdString(unhtmlize(ellipsize_result(result_text, 1000)))); } } } switch(settings->title_type) { case TITLE_RESULT: { if(str.isEmpty()) { if(is_result) { setWindowTitle("Qalculate!"); return true; } return false; } setWindowTitle(str); break; } case TITLE_APP_RESULT: { if(str.isEmpty() && !is_result) { return false; } setWindowTitle(str); break; } case TITLE_WORKSPACE: { if(is_result) return false; if(settings->workspaceTitle().isEmpty()) qApp->setApplicationDisplayName("Qalculate!"); else qApp->setApplicationDisplayName(settings->workspaceTitle()); setWindowTitle(str); break; } case TITLE_APP_WORKSPACE: { if(is_result) return false; if(str.isEmpty()) setWindowTitle(settings->workspaceTitle()); else setWindowTitle(str); break; } default: { if(is_result) return false; setWindowTitle(str); } } return true; } void QalculateWindow::angleUnitActivated() { QAction *action = qobject_cast(sender()); settings->evalops.parse_options.angle_unit = (AngleUnit) action->data().toInt(); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM) { CALCULATOR->setCustomAngleUnit(CALCULATOR->getActiveUnit(action->objectName().mid(18).toStdString())); } expressionFormatUpdated(true); } void QalculateWindow::normalActivated() { settings->printops.sort_options.minus_last = true; settings->printops.min_exp = EXP_PRECISION; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = true; settings->printops.negative_exponents = false; to_form = TO_FORM_OFF; resultFormatUpdated(); } void QalculateWindow::scientificActivated() { settings->printops.sort_options.minus_last = false; settings->printops.min_exp = EXP_SCIENTIFIC; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = false; settings->printops.negative_exponents = true; to_form = TO_FORM_OFF; resultFormatUpdated(); } void QalculateWindow::engineeringActivated() { settings->printops.sort_options.minus_last = false; settings->printops.min_exp = EXP_BASE_3; settings->printops.show_ending_zeroes = true; if(settings->prefixes_default) settings->printops.use_unit_prefixes = false; settings->printops.negative_exponents = false; to_form = TO_FORM_OFF; resultFormatUpdated(); } void QalculateWindow::simpleActivated() { settings->printops.sort_options.minus_last = true; settings->printops.min_exp = EXP_NONE; settings->printops.show_ending_zeroes = false; if(settings->prefixes_default) settings->printops.use_unit_prefixes = true; settings->printops.negative_exponents = false; to_form = TO_FORM_OFF; resultFormatUpdated(); } void QalculateWindow::onPrecisionChanged(int v) { CALCULATOR->setPrecision(v); settings->previous_precision = 0; expressionCalculationUpdated(500); } void QalculateWindow::syncDecimals() { if(settings->printops.use_min_decimals && settings->printops.use_max_decimals && settings->printops.max_decimals >= 0 && settings->printops.min_decimals > 0 && settings->printops.min_decimals > settings->printops.max_decimals) { settings->printops.min_decimals = settings->printops.max_decimals; minDecimalsEdit->blockSignals(true); minDecimalsEdit->setValue(settings->printops.min_decimals); minDecimalsEdit->blockSignals(false); } } void QalculateWindow::onMinDecimalsChanged(int v) { settings->printops.use_min_decimals = (v > 0); settings->printops.min_decimals = v; if(decimalsTimer) decimalsTimer->stop(); if(settings->printops.use_min_decimals && settings->printops.use_max_decimals && settings->printops.max_decimals >= 0 && settings->printops.min_decimals > 0 && settings->printops.min_decimals > settings->printops.max_decimals) { settings->printops.max_decimals = settings->printops.min_decimals; maxDecimalsEdit->blockSignals(true); maxDecimalsEdit->setValue(settings->printops.max_decimals); maxDecimalsEdit->blockSignals(false); } resultFormatUpdated(500); } void QalculateWindow::onMaxDecimalsChanged(int v) { settings->printops.use_max_decimals = (v >= 0); settings->printops.max_decimals = v; if(decimalsTimer) { decimalsTimer->stop(); } else { decimalsTimer = new QTimer(); decimalsTimer->setSingleShot(true); connect(decimalsTimer, SIGNAL(timeout()), this, SLOT(syncDecimals())); } decimalsTimer->start(2000); resultFormatUpdated(500); } void QalculateWindow::approximationActivated() { int v = qobject_cast(sender())->data().toInt(); if(v < 0) { settings->evalops.approximation = APPROXIMATION_TRY_EXACT; if(v == -2) {settings->dual_approximation = 1; settings->dual_fraction = 1;} else {settings->dual_approximation = -1; settings->dual_fraction = -1;} } else { settings->evalops.approximation = (ApproximationMode) v; settings->dual_fraction = 0; settings->dual_approximation = 0; } if(settings->evalops.approximation == APPROXIMATION_EXACT) settings->printops.number_fraction_format = FRACTION_DECIMAL_EXACT; else settings->printops.number_fraction_format = FRACTION_DECIMAL; expressionCalculationUpdated(); } void QalculateWindow::outputBaseActivated() { int v = qobject_cast(sender())->data().toInt(); to_base = 0; to_bits = 0; to_duo_syms = false; if(v == BASE_CUSTOM) { v = customOutputBaseEdit->value(); if(v > 2 && v <= 36) { settings->printops.base = v; } else { settings->printops.base = BASE_CUSTOM; CALCULATOR->setCustomOutputBase(v); } } else { settings->printops.base = v; } keypad->updateBase(); resultFormatUpdated(); } void QalculateWindow::onCustomOutputBaseChanged(int v) { customOutputBaseAction->setChecked(true); to_base = 0; to_bits = 0; to_duo_syms = false; if(v > 2 && v <= 36) { settings->printops.base = v; } else { settings->printops.base = BASE_CUSTOM; CALCULATOR->setCustomOutputBase(Number(v, 1)); } keypad->updateBase(); resultFormatUpdated(); } void QalculateWindow::inputBaseActivated() { int v = qobject_cast(sender())->data().toInt(); if(v == BASE_CUSTOM) { v = customOutputBaseEdit->value(); if(v > 2 && v <= 36) { settings->evalops.parse_options.base = v; } else { settings->evalops.parse_options.base = BASE_CUSTOM; CALCULATOR->setCustomInputBase(v); } } else { settings->evalops.parse_options.base = v; } keypad->updateBase(); expressionFormatUpdated(false); } void QalculateWindow::onCustomInputBaseChanged(int v) { customInputBaseAction->setChecked(true); if(v > 2 && v <= 36) { settings->evalops.parse_options.base = v; } else { settings->evalops.parse_options.base = BASE_CUSTOM; CALCULATOR->setCustomInputBase(Number(v, 1)); } keypad->updateBase(); expressionFormatUpdated(false); } void QalculateWindow::assumptionsTypeActivated() { int v = qobject_cast(sender())->data().toInt(); CALCULATOR->defaultAssumptions()->setType((AssumptionType) v); for(int i = 0; i < 5; i++) { if(assumptionSignActions[i]->data().toInt() == CALCULATOR->defaultAssumptions()->sign()) { assumptionSignActions[i]->setChecked(true); break; } } settings->assumptions_warning_shown = true; expressionCalculationUpdated(); } void QalculateWindow::assumptionsSignActivated() { int v = qobject_cast(sender())->data().toInt(); CALCULATOR->defaultAssumptions()->setSign((AssumptionSign) v); for(int i = 0; i < 4; i++) { if(assumptionTypeActions[i]->data().toInt() == CALCULATOR->defaultAssumptions()->type()) { assumptionTypeActions[i]->setChecked(true); break; } } settings->assumptions_warning_shown = true; expressionCalculationUpdated(); } void QalculateWindow::onAlwaysOnTopChanged() { if(settings->always_on_top) { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); if(datasetsDialog) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(functionsDialog) functionsDialog->setWindowFlags(functionsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(variablesDialog) variablesDialog->setWindowFlags(variablesDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(unitsDialog) unitsDialog->setWindowFlags(unitsDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(fpConversionDialog) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(percentageDialog) percentageDialog->setWindowFlags(percentageDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(plotDialog) plotDialog->setWindowFlags(plotDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(calendarConversionDialog) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(preferencesDialog) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() | Qt::WindowStaysOnTopHint); if(historyView->searchDialog) historyView->searchDialog->setWindowFlags(historyView->searchDialog->windowFlags() | Qt::WindowStaysOnTopHint); } else { setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); if(datasetsDialog) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(functionsDialog) functionsDialog->setWindowFlags(functionsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(variablesDialog) variablesDialog->setWindowFlags(variablesDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(unitsDialog) unitsDialog->setWindowFlags(unitsDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(fpConversionDialog) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(percentageDialog) percentageDialog->setWindowFlags(percentageDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(plotDialog) plotDialog->setWindowFlags(plotDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(calendarConversionDialog) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(preferencesDialog) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); if(historyView->searchDialog) historyView->searchDialog->setWindowFlags(historyView->searchDialog->windowFlags() & ~Qt::WindowStaysOnTopHint); } if(periodicTableDialog) periodicTableDialog->onAlwaysOnTopChanged(); show(); } void QalculateWindow::onEnableTooltipsChanged() { if(settings->enable_tooltips == 0) qApp->installEventFilter(this); else qApp->removeEventFilter(this); QList buttons = keypad->findChildren(); for(int i = 0; i < buttons.count(); i++) { if(settings->enable_tooltips > 1) buttons.at(i)->installEventFilter(this); else buttons.at(i)->removeEventFilter(this); } } void QalculateWindow::onTitleTypeChanged() { title_modified = false; updateWindowTitle(QString(), false, true); } void QalculateWindow::onPreferencesClosed() { if(preferencesDialog) { preferencesDialog->deleteLater(); preferencesDialog = NULL; } } void QalculateWindow::onResultFontChanged() { if(settings->use_custom_result_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_result_font)); historyView->setFont(font); rpnView->setFont(font);} else {historyView->setFont(QApplication::font()); rpnView->setFont(QApplication::font());} } void QalculateWindow::onExpressionFontChanged() { if(settings->use_custom_expression_font) { QFont font; font.fromString(QString::fromStdString(settings->custom_expression_font)); expressionEdit->setFont(font); } else { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * RESULT_FONT_FACTOR); else font.setPointSize(font.pointSize() * RESULT_FONT_FACTOR); expressionEdit->setFont(font); } } void QalculateWindow::onStatusFontChanged() { if(settings->use_custom_status_font) { QFont font; font.fromString(QString::fromStdString(settings->custom_status_font)); statusLabelLeft->setFont(font); statusLabelRight->setFont(font); } else { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * STATUS_FONT_FACTOR); else font.setPointSize(font.pointSize() * STATUS_FONT_FACTOR); statusLabelLeft->setFont(font); statusLabelRight->setFont(font); } } void QalculateWindow::onKeypadFontChanged() { if(settings->use_custom_keypad_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_keypad_font)); keypad->setFont(font);} else keypad->setFont(QApplication::font()); } void QalculateWindow::onAppFontTimer() { onAppFontChanged(); loadInitialHistory(); } void QalculateWindow::onAppFontChanged() { if(settings->use_custom_app_font) {QFont font; font.fromString(QString::fromStdString(settings->custom_app_font)); QApplication::setFont(font);} else QApplication::setFont(settings->saved_app_font); if(!settings->use_custom_expression_font) { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * RESULT_FONT_FACTOR); else font.setPointSize(font.pointSize() * RESULT_FONT_FACTOR); expressionEdit->setFont(font); } if(expressionEdit->completionInitialized()) expressionEdit->updateCompletion(); if(!settings->use_custom_status_font) { QFont font = QApplication::font(); if(font.pixelSize() >= 0) font.setPixelSize(font.pixelSize() * STATUS_FONT_FACTOR); else font.setPointSize(font.pointSize() * STATUS_FONT_FACTOR); statusLabelLeft->setFont(font); statusLabelRight->setFont(font); } if(!settings->use_custom_result_font) { historyView->setFont(QApplication::font()); rpnView->setFont(QApplication::font()); } if(!settings->use_custom_keypad_font) keypad->setFont(QApplication::font()); } void QalculateWindow::onExpressionStatusModeChanged(bool b) { if(preferencesDialog) preferencesDialog->updateExpressionStatus(); if(b) { if(!settings->status_in_history) historyView->clearTemporary(); auto_expression = ""; auto_error = false; mauto.setAborted(); if(!settings->status_in_history) updateWindowTitle(QString::fromStdString(unhtmlize(result_text)), true); statusBar()->setVisible(settings->status_in_statusbar || settings->show_statusbar); if(autoCalculateTimer) autoCalculateTimer->stop(); expressionEdit->displayParseStatus(true); } } void QalculateWindow::removeShortcutClicked() { QTreeWidgetItem *item = shortcutList->currentItem(); if(!item) return; keyboard_shortcut *ks = (keyboard_shortcut*) item->data(0, Qt::UserRole).value(); if(!ks) return; keyboardShortcutRemoved(ks); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] == ks) { settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); break; } } settings->default_shortcuts = false; delete ks; delete item; } void QalculateWindow::updateShortcutActionOK() { QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) { shortcutActionOKButton->setEnabled(edited_keyboard_shortcut->type.size() > 0); shortcutActionAddButton->setEnabled(false); } else if(!SHORTCUT_REQUIRES_VALUE(item->data(0, Qt::UserRole).toInt()) || !shortcutActionValueEdit->currentText().isEmpty()) { shortcutActionOKButton->setEnabled(true); shortcutActionAddButton->setEnabled(true); } else { shortcutActionOKButton->setEnabled(false); shortcutActionAddButton->setEnabled(false); } } void QalculateWindow::shortcutActionOKClicked() { QString value = shortcutActionValueEdit->currentText(); QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) { if(edited_keyboard_shortcut->type.size() > 0) shortcutActionDialog->accept(); return; } if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, shortcutActionDialog)) { edited_keyboard_shortcut->type.push_back((shortcut_type) shortcutActionList->currentItem()->data(0, Qt::UserRole).toInt()); edited_keyboard_shortcut->value.push_back(value.toStdString()); shortcutActionDialog->accept(); } else { shortcutActionValueEdit->setFocus(); } if(item->data(0, Qt::UserRole).toInt() == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(value); } } void QalculateWindow::shortcutActionAddClicked() { QString value = shortcutActionValueEdit->currentText(); QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected()) return; if(settings->testShortcutValue(item->data(0, Qt::UserRole).toInt(), value, shortcutActionDialog)) { edited_keyboard_shortcut->type.push_back((shortcut_type) shortcutActionList->currentItem()->data(0, Qt::UserRole).toInt()); edited_keyboard_shortcut->value.push_back(value.toStdString()); shortcutActionValueEdit->clear(); shortcutActionList->setCurrentItem(NULL); shortcutActionAddButton->setText(tr("Add Action (%1)").arg(edited_keyboard_shortcut->type.size() + 1)); } else { shortcutActionValueEdit->setFocus(); if(item->data(0, Qt::UserRole).toInt() == SHORTCUT_TYPE_COPY_RESULT) { int v = value.toInt(); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(value); } } } void QalculateWindow::currentShortcutActionChanged() { QTreeWidgetItem *item = shortcutActionList->currentItem(); if(!item || !item->isSelected() || !SHORTCUT_USES_VALUE(item->data(0, Qt::UserRole).toInt())) { shortcutActionValueEdit->clear(); shortcutActionValueEdit->clearEditText(); shortcutActionValueEdit->setEnabled(false); shortcutActionValueLabel->setEnabled(false); return; } int i = item->data(0, Qt::UserRole).toInt(); shortcutActionValueEdit->setEnabled(true); shortcutActionValueLabel->setEnabled(true); if(i == SHORTCUT_TYPE_FUNCTION || i == SHORTCUT_TYPE_FUNCTION_WITH_DIALOG) { QStringList citems; for(size_t i = 0; i < CALCULATOR->functions.size(); i++) { MathFunction *f = CALCULATOR->functions[i]; if(f->isActive() && !f->isHidden()) citems << QString::fromStdString(f->referenceName()); } if(shortcutActionValueEdit->count() != citems.count()) { shortcutActionValueEdit->clear(); citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); shortcutActionValueEdit->clearEditText(); } } else { shortcutActionValueEdit->clear(); if(i == SHORTCUT_TYPE_UNIT || i == SHORTCUT_TYPE_CONVERT_TO) { QStringList citems; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(u->isActive() && !u->isHidden()) citems << QString::fromStdString(u->referenceName()); } citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_VARIABLE) { QStringList citems; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(v->isActive() && !v->isHidden()) citems << QString::fromStdString(v->referenceName()); } citems.sort(Qt::CaseInsensitive); shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_OPERATOR) { QStringList citems; citems << "+" << (settings->printops.use_unicode_signs ? SIGN_MINUS : "-") << settings->multiplicationSign(false) << settings->divisionSign(false) << "^" << ".+" << (QStringLiteral(".") + (settings->printops.use_unicode_signs ? SIGN_MINUS : "-")) << (QStringLiteral(".") + settings->multiplicationSign(false)) << (QStringLiteral(".") + settings->divisionSign(false)) << ".^" << "mod" << "rem" << "//" << "&" << "|" << "<<" << ">>" << "&&" << "||" << "xor" << "=" << SIGN_NOT_EQUAL << "<" << SIGN_LESS_OR_EQUAL << SIGN_GREATER_OR_EQUAL << ">"; shortcutActionValueEdit->addItems(citems); } else if(i == SHORTCUT_TYPE_COPY_RESULT) { settings->updateActionValueTexts(); shortcutActionValueEdit->addItems(settings->copy_action_value_texts); } if(i == SHORTCUT_TYPE_COPY_RESULT) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[0]); else shortcutActionValueEdit->clearEditText(); } } class QalculateKeySequenceEdit : public QKeySequenceEdit { public: QalculateKeySequenceEdit(QWidget *parent) : QKeySequenceEdit(parent) { installEventFilter(this); } protected: bool eventFilter(QObject*, QEvent *event) { if(event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if(keyEvent->key() == Qt::Key_Tab || keyEvent->key() == Qt::Key_Backtab) { keyPressEvent(keyEvent); return true; } return false; } else { return false; } } }; bool QalculateWindow::editKeyboardShortcut(keyboard_shortcut *new_ks, keyboard_shortcut *ks, int type) { if(!ks) type = 0; QDialog *dialog = NULL; shortcutActionList = NULL; shortcutActionValueEdit = NULL; shortcutActionDialog = NULL; new_ks->type.clear(); new_ks->value.clear(); edited_keyboard_shortcut = new_ks; if(type != 2) { dialog = new QDialog(this); shortcutActionDialog = dialog; if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(ks ? tr("Edit Keyboard Shortcut") : tr("New Keyboard Shortcut")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); shortcutActionList = new QTreeWidget(dialog); shortcutActionList->setColumnCount(1); shortcutActionList->setHeaderLabel(tr("Action")); shortcutActionList->setSelectionMode(QAbstractItemView::SingleSelection); shortcutActionList->setRootIsDecorated(false); shortcutActionList->header()->setVisible(true); shortcutActionList->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); shortcutActionList->setSortingEnabled(true); shortcutActionList->sortByColumn(-1, Qt::AscendingOrder); grid->addWidget(shortcutActionList, 0, 0, 1, 2); for(int i = SHORTCUT_TYPE_FUNCTION; i <= SHORTCUT_TYPE_QUIT; i++) { if(i < SHORTCUT_TYPE_EXPRESSION_CLEAR || i > SHORTCUT_TYPE_CALCULATE_EXPRESSION) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i))); item->setData(0, Qt::UserRole, i); if(new_ks->type.size() == 0 && ((!ks && i == 0) || (ks && i == ks->type[0]))) shortcutActionList->setCurrentItem(item); } if(i == SHORTCUT_TYPE_HISTORY_SEARCH) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText(SHORTCUT_TYPE_HISTORY_CLEAR))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_HISTORY_CLEAR); if(new_ks->type.size() == 0 && ks && ks->type[0] == SHORTCUT_TYPE_HISTORY_CLEAR) shortcutActionList->setCurrentItem(item); } else if(i == SHORTCUT_TYPE_SIMPLE_NOTATION) { for(int i2 = SHORTCUT_TYPE_PRECISION; i2 <= SHORTCUT_TYPE_MINMAX_DECIMALS; i2++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i2))); item->setData(0, Qt::UserRole, i2); if(new_ks->type.size() == 0 && ks && i2 == ks->type[0]) shortcutActionList->setCurrentItem(item); } } else if(i == SHORTCUT_TYPE_MENU) { for(int i2 = SHORTCUT_TYPE_FUNCTIONS_MENU; i2 <= SHORTCUT_TYPE_VARIABLES_MENU; i2++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText((shortcut_type) i2))); item->setData(0, Qt::UserRole, i2); if(new_ks->type.size() == 0 && ks && i2 == ks->type[0]) shortcutActionList->setCurrentItem(item); } } else if(i == SHORTCUT_TYPE_APPROXIMATE) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutActionList, QStringList(settings->shortcutTypeText(SHORTCUT_TYPE_TOGGLE_FRACTION))); item->setData(0, Qt::UserRole, SHORTCUT_TYPE_TOGGLE_FRACTION); if(new_ks->type.size() == 0 && ks && ks->type[0] == SHORTCUT_TYPE_TOGGLE_FRACTION) shortcutActionList->setCurrentItem(item); } } shortcutActionValueLabel = new QLabel(tr("Value:"), dialog); grid->addWidget(shortcutActionValueLabel, 1, 0); shortcutActionValueEdit = new QComboBox(dialog); shortcutActionValueEdit->setEditable(true); shortcutActionValueEdit->setLineEdit(new MathLineEdit()); grid->addWidget(shortcutActionValueEdit, 1, 1); grid->setColumnStretch(1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); shortcutActionAddButton = buttonBox->addButton(tr("Add Action (%1)").arg(1), QDialogButtonBox::ApplyRole); connect(shortcutActionAddButton, SIGNAL(clicked()), this, SLOT(shortcutActionAddClicked())); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(shortcutActionOKClicked())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); connect(shortcutActionList, SIGNAL(itemSelectionChanged()), this, SLOT(currentShortcutActionChanged()), Qt::QueuedConnection); connect(shortcutActionList, SIGNAL(itemSelectionChanged()), this, SLOT(updateShortcutActionOK()), Qt::QueuedConnection); connect(shortcutActionValueEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(updateShortcutActionOK())); shortcutActionOKButton = buttonBox->button(QDialogButtonBox::Ok); currentShortcutActionChanged(); if(ks) { if(ks->type[0] == SHORTCUT_TYPE_COPY_RESULT) { int v = s2i(ks->value[0]); if(v >= 0 && v < settings->copy_action_value_texts.size()) shortcutActionValueEdit->setCurrentText(settings->copy_action_value_texts[v]); } else { shortcutActionValueEdit->setCurrentText(QString::fromStdString(ks->value[0])); } } updateShortcutActionOK(); shortcutActionList->setFocus(); dialog->resize(dialog->sizeHint().width(), dialog->sizeHint().width() * 1.25); if(dialog->exec() != QDialog::Accepted) { dialog->deleteLater(); return false; } dialog->deleteLater(); } if(type == 1) { new_ks->key = ks->key; new_ks->action = NULL; new_ks->new_action = false; return true; } dialog = new QDialog(this); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Set key combination")); QVBoxLayout *box = new QVBoxLayout(dialog); QGridLayout *grid = new QGridLayout(); grid->addWidget(new QLabel("" + tr("Press the key combination you wish to use for the action.") + "", dialog), 0, 0); QKeySequenceEdit *keyEdit = new QalculateKeySequenceEdit(dialog); grid->addWidget(keyEdit, 1, 0); box->addLayout(grid); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, dialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); connect(keyEdit, SIGNAL(editingFinished()), dialog, SLOT(accept())); keyEdit->setFocus(); while(dialog->exec() == QDialog::Accepted && !keyEdit->keySequence().isEmpty()) { QString key = keyEdit->keySequence().toString(); if(keyEdit->keySequence() == QKeySequence::Undo || keyEdit->keySequence() == QKeySequence::Redo || keyEdit->keySequence() == QKeySequence::Copy || keyEdit->keySequence() == QKeySequence::Paste || keyEdit->keySequence() == QKeySequence::Delete || keyEdit->keySequence() == QKeySequence::Cut || keyEdit->keySequence() == QKeySequence::SelectAll || #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) keyEdit->keySequence() == QKeySequence::Backspace || (keyEdit->keySequence().count() == 1 && keyEdit->keySequence()[0].keyboardModifiers() == Qt::NoModifier && keyEdit->keySequence()[0].key() != Qt::Key_Tab && keyEdit->keySequence()[0].key() != Qt::Key_Backtab && (keyEdit->keySequence()[0].key() < Qt::Key_F1 || (keyEdit->keySequence()[0].key() >= Qt::Key_Space && keyEdit->keySequence()[0].key() <= Qt::Key_ydiaeresis) || (keyEdit->keySequence()[0].key() >= Qt::Key_Multi_key && keyEdit->keySequence()[0].key() < Qt::Key_Back))) #else (keyEdit->keySequence().count() == 1 && keyEdit->keySequence()[0] != Qt::Key_Tab && keyEdit->keySequence()[0] != Qt::Key_Backtab && (keyEdit->keySequence()[0] < Qt::Key_F1 || (keyEdit->keySequence()[0] >= Qt::Key_Space && keyEdit->keySequence()[0] <= Qt::Key_ydiaeresis) || (keyEdit->keySequence()[0] >= Qt::Key_Multi_key && keyEdit->keySequence()[0] < Qt::Key_Back))) #endif ) { QMessageBox::critical(this, tr("Error"), tr("Reserved key combination"), QMessageBox::Ok); keyEdit->clear(); keyEdit->setFocus(); continue; } for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] != ks && settings->keyboard_shortcuts[i]->key == key) { if(QMessageBox::question(this, tr("Question"), tr("The key combination is already in use.\nDo you wish to replace the current action (%1)?").arg(settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { for(int index = 0; index < shortcutList->topLevelItemCount(); index++) { if(shortcutList->topLevelItem(index)->data(0, Qt::UserRole).value() == (void*) settings->keyboard_shortcuts[i]) { delete shortcutList->topLevelItem(index); break; } } keyboardShortcutRemoved(settings->keyboard_shortcuts[i]); delete settings->keyboard_shortcuts[i]; settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); settings->default_shortcuts = false; break; } else { dialog->deleteLater(); return false; } } } new_ks->key = key; if(type == 2) { new_ks->type = ks->type; new_ks->value = ks->value; } new_ks->action = NULL; new_ks->new_action = false; dialog->deleteLater(); return true; } dialog->deleteLater(); return false; } void QalculateWindow::addShortcutClicked() { keyboard_shortcut *ks = new keyboard_shortcut; if(editKeyboardShortcut(ks, NULL)) { settings->keyboard_shortcuts.push_back(ks); size_t i = settings->keyboard_shortcuts.size() - 1; keyboardShortcutAdded(settings->keyboard_shortcuts[i]); QTreeWidgetItem *item = new QTreeWidgetItem(shortcutList); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); settings->default_shortcuts = false; } else { delete ks; } } void QalculateWindow::editShortcutClicked() { shortcutDoubleClicked(shortcutList->currentItem(), -1); } void QalculateWindow::currentShortcutChanged(QTreeWidgetItem *item, QTreeWidgetItem*) { editShortcutButton->setEnabled(item != NULL); removeShortcutButton->setEnabled(item != NULL); } void QalculateWindow::shortcutDoubleClicked(QTreeWidgetItem *item, int c) { if(!item) return; keyboard_shortcut *ks_old = (keyboard_shortcut*) item->data(0, Qt::UserRole).value(); keyboard_shortcut *ks = new keyboard_shortcut; if(editKeyboardShortcut(ks, ks_old, c + 1)) { keyboardShortcutRemoved(ks_old); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { if(settings->keyboard_shortcuts[i] == ks_old) { settings->keyboard_shortcuts.erase(settings->keyboard_shortcuts.begin() + i); break; } } settings->keyboard_shortcuts.push_back(ks); size_t i = settings->keyboard_shortcuts.size() - 1; keyboardShortcutAdded(settings->keyboard_shortcuts[i]); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); settings->default_shortcuts = false; } else { delete ks; } } void QalculateWindow::editKeyboardShortcuts() { if(shortcutsDialog) { shortcutsDialog->setWindowState((shortcutsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); shortcutsDialog->show(); qApp->processEvents(); shortcutsDialog->raise(); shortcutsDialog->activateWindow(); return; } shortcutsDialog = new QDialog(this); try_resize(shortcutsDialog, 700, 500); if(settings->always_on_top) shortcutsDialog->setWindowFlags(shortcutsDialog->windowFlags() | Qt::WindowStaysOnTopHint); shortcutsDialog->setWindowTitle(tr("Keyboard Shortcuts")); QVBoxLayout *box = new QVBoxLayout(shortcutsDialog); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); shortcutList = new QTreeWidget(shortcutsDialog); shortcutList->setSelectionMode(QAbstractItemView::SingleSelection); shortcutList->setRootIsDecorated(false); shortcutList->setColumnCount(2); QStringList list; list << tr("Action"); list << tr("Key combination"); shortcutList->setHeaderLabels(list); shortcutList->header()->setVisible(true); shortcutList->header()->setStretchLastSection(false); shortcutList->header()->setSectionResizeMode(0, QHeaderView::Stretch); shortcutList->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); for(size_t i = 0; i < settings->keyboard_shortcuts.size(); i++) { QTreeWidgetItem *item = new QTreeWidgetItem(shortcutList); item->setText(0, settings->shortcutText(settings->keyboard_shortcuts[i]->type, settings->keyboard_shortcuts[i]->value)); item->setText(1, QKeySequence::fromString(settings->keyboard_shortcuts[i]->key).toString()); item->setData(0, Qt::UserRole, QVariant::fromValue((void*) settings->keyboard_shortcuts[i])); } shortcutList->setCurrentItem(NULL); shortcutList->setSortingEnabled(true); shortcutList->sortByColumn(1, Qt::AscendingOrder); connect(shortcutList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(shortcutDoubleClicked(QTreeWidgetItem*, int))); connect(shortcutList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentShortcutChanged(QTreeWidgetItem*, QTreeWidgetItem*))); grid->addWidget(shortcutList); QVBoxLayout *vbox = new QVBoxLayout(); grid->addLayout(vbox, 0, 1); addShortcutButton = new QPushButton(tr("Add…"), this); connect(addShortcutButton, SIGNAL(clicked()), this, SLOT(addShortcutClicked())); vbox->addWidget(addShortcutButton); editShortcutButton = new QPushButton(tr("Edit…"), this); editShortcutButton->setEnabled(false); connect(editShortcutButton, SIGNAL(clicked()), this, SLOT(editShortcutClicked())); vbox->addWidget(editShortcutButton); removeShortcutButton = new QPushButton(tr("Remove"), this); removeShortcutButton->setEnabled(false); connect(removeShortcutButton, SIGNAL(clicked()), this, SLOT(removeShortcutClicked())); vbox->addWidget(removeShortcutButton); vbox->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, shortcutsDialog); box->addWidget(buttonBox); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), shortcutsDialog, SLOT(reject())); shortcutsDialog->show(); } void QalculateWindow::editPreferences() { if(preferencesDialog) { preferencesDialog->setWindowState((preferencesDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); preferencesDialog->show(); qApp->processEvents(); preferencesDialog->raise(); preferencesDialog->activateWindow(); return; } preferencesDialog = new PreferencesDialog(this); connect(preferencesDialog, SIGNAL(resultFormatUpdated()), this, SLOT(resultFormatUpdated())); connect(preferencesDialog, SIGNAL(resultDisplayUpdated()), this, SLOT(resultDisplayUpdated())); connect(preferencesDialog, SIGNAL(expressionFormatUpdated(bool)), this, SLOT(expressionFormatUpdated(bool))); connect(preferencesDialog, SIGNAL(expressionCalculationUpdated(int)), this, SLOT(expressionCalculationUpdated(int))); connect(preferencesDialog, SIGNAL(alwaysOnTopChanged()), this, SLOT(onAlwaysOnTopChanged())); connect(preferencesDialog, SIGNAL(enableTooltipsChanged()), this, SLOT(onEnableTooltipsChanged())); connect(preferencesDialog, SIGNAL(titleTypeChanged()), this, SLOT(onTitleTypeChanged())); connect(preferencesDialog, SIGNAL(resultFontChanged()), this, SLOT(onResultFontChanged())); connect(preferencesDialog, SIGNAL(expressionFontChanged()), this, SLOT(onExpressionFontChanged())); connect(preferencesDialog, SIGNAL(statusFontChanged()), this, SLOT(onStatusFontChanged())); connect(preferencesDialog, SIGNAL(keypadFontChanged()), this, SLOT(onKeypadFontChanged())); connect(preferencesDialog, SIGNAL(appFontChanged()), this, SLOT(onAppFontChanged())); connect(preferencesDialog, SIGNAL(symbolsUpdated()), keypad, SLOT(updateSymbols())); connect(preferencesDialog, SIGNAL(historyExpressionTypeChanged()), historyView, SLOT(reloadHistory())); connect(preferencesDialog, SIGNAL(binaryBitsChanged()), this, SLOT(onBinaryBitsChanged())); connect(preferencesDialog, SIGNAL(twosChanged()), this, SLOT(onTwosChanged())); connect(preferencesDialog, SIGNAL(statusModeChanged()), this, SLOT(onExpressionStatusModeChanged())); connect(preferencesDialog, SIGNAL(buttonLocationChanged()), keypad, SLOT(updateButtonLocation())); connect(preferencesDialog, SIGNAL(automaticDigitGroupingChanged()), expressionEdit, SLOT(updateDigitGroups())); connect(preferencesDialog, SIGNAL(expressionPositionChanged()), this, SLOT(onExpressionPositionChanged())); connect(preferencesDialog, SIGNAL(showStatusBarChanged()), this, SLOT(onShowStatusBarChanged())); connect(preferencesDialog, SIGNAL(dialogClosed()), this, SLOT(onPreferencesClosed())); if(settings->always_on_top) preferencesDialog->setWindowFlags(preferencesDialog->windowFlags() | Qt::WindowStaysOnTopHint); preferencesDialog->show(); } void QalculateWindow::openSettingsFolder() { if(getLocalDir() != getLocalDataDir()) { std::string dir = buildPath(getLocalDataDir(), "definitions"); if(dirExists(dir) || recursiveMakeDir(dir)) QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(dir))); } std::string dir = getLocalDir(); if(dirExists(dir) || recursiveMakeDir(dir)) QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(dir))); } void QalculateWindow::onDatasetsChanged() { expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); functionsMenu->clear(); } void QalculateWindow::onFunctionsChanged() { expressionEdit->updateCompletion(); if(datasetsDialog) datasetsDialog->updateDatasets(); functionsMenu->clear(); } void QalculateWindow::insertProperty(DataObject *o, DataProperty *dp) { expressionEdit->blockCompletion(); DataSet *ds = dp->parentSet(); std::string str = ds->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true); str += "("; str += o->getProperty(ds->getPrimaryKeyProperty()); str += CALCULATOR->getComma(); str += " "; str += dp->getName(); str += ")"; expressionEdit->insertText(QString::fromStdString(str)); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::openDatasets() { if(datasetsDialog) { datasetsDialog->setWindowState((datasetsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); datasetsDialog->show(); qApp->processEvents(); datasetsDialog->raise(); datasetsDialog->activateWindow(); return; } datasetsDialog = new DataSetsDialog(); connect(datasetsDialog, SIGNAL(itemsChanged()), this, SLOT(onDatasetsChanged())); connect(datasetsDialog, SIGNAL(insertPropertyRequest(DataObject*, DataProperty*)), this, SLOT(insertProperty(DataObject*, DataProperty*))); if(settings->always_on_top) datasetsDialog->setWindowFlags(datasetsDialog->windowFlags() | Qt::WindowStaysOnTopHint); datasetsDialog->show(); } void QalculateWindow::applyFunction(MathFunction *f) { if(b_busy) return; if(settings->rpn_mode) { calculateRPN(f); return; } QString str = QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)); if(f->args() == 0) { str += "()"; } else { str += "("; str += expressionEdit->toPlainText(); str += ")"; } expressionEdit->blockParseStatus(); expressionEdit->setExpression(str); expressionEdit->blockParseStatus(false); calculate(); } void QalculateWindow::openFunctions() { if(functionsDialog) { functionsDialog->setWindowState((functionsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); functionsDialog->show(); qApp->processEvents(); functionsDialog->raise(); functionsDialog->activateWindow(); return; } functionsDialog = new FunctionsDialog(); connect(functionsDialog, SIGNAL(itemsChanged()), this, SLOT(onFunctionsChanged())); connect(functionsDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(functionsDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteFunctions())); connect(functionsDialog, SIGNAL(applyFunctionRequest(MathFunction*)), this, SLOT(applyFunction(MathFunction*))); connect(functionsDialog, SIGNAL(applyFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); connect(functionsDialog, SIGNAL(insertFunctionRequest(MathFunction*)), this, SLOT(onInsertFunctionRequested(MathFunction*))); connect(functionsDialog, SIGNAL(insertFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); connect(functionsDialog, SIGNAL(calculateFunctionRequest(MathFunction*)), this, SLOT(onCalculateFunctionRequested(MathFunction*))); connect(functionsDialog, SIGNAL(calculateFunctionRequest(MathFunction*)), this, SLOT(addToRecentFunctions(MathFunction*))); if(settings->always_on_top) functionsDialog->setWindowFlags(functionsDialog->windowFlags() | Qt::WindowStaysOnTopHint); functionsDialog->show(); } void QalculateWindow::onUnitRemoved(Unit *u) { if(unitsDialog) unitsDialog->unitRemoved(u); } void QalculateWindow::onUnitDeactivated(Unit *u) { if(unitsDialog) unitsDialog->unitDeactivated(u); } void QalculateWindow::resetUnitsAndVariablesMenus() { unitsMenu->clear(); variablesMenu->clear(); } void QalculateWindow::openVariables() { if(variablesDialog) { variablesDialog->setWindowState((variablesDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); variablesDialog->show(); qApp->processEvents(); variablesDialog->raise(); variablesDialog->activateWindow(); return; } variablesDialog = new VariablesDialog(); connect(variablesDialog, SIGNAL(itemsChanged()), expressionEdit, SLOT(updateCompletion())); connect(variablesDialog, SIGNAL(itemsChanged()), this, SLOT(resetUnitsAndVariablesMenus())); connect(variablesDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(variablesDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteVariables())); connect(variablesDialog, SIGNAL(unitRemoved(Unit*)), this, SLOT(onUnitRemoved(Unit*))); connect(variablesDialog, SIGNAL(unitDeactivated(Unit*)), this, SLOT(onUnitDeactivated(Unit*))); connect(variablesDialog, SIGNAL(insertVariableRequest(Variable*)), this, SLOT(onVariableClicked(Variable*))); connect(variablesDialog, SIGNAL(insertVariableRequest(Variable*)), this, SLOT(addToRecentVariables(Variable*))); if(settings->always_on_top) variablesDialog->setWindowFlags(variablesDialog->windowFlags() | Qt::WindowStaysOnTopHint); variablesDialog->show(); } void QalculateWindow::onVariableRemoved(Variable *v) { if(variablesDialog) variablesDialog->variableRemoved(v); } void QalculateWindow::onVariableDeactivated(Variable *v) { if(variablesDialog) variablesDialog->variableDeactivated(v); } void QalculateWindow::openUnits() { Unit *u = NULL; if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { u = CALCULATOR->findMatchingUnit(*mstruct); } else if(!auto_result.empty()) { u = CALCULATOR->findMatchingUnit(mauto); } if(unitsDialog) { if(u && !u->category().empty()) unitsDialog->selectCategory(u->category()); else unitsDialog->selectCategory("All"); unitsDialog->setWindowState((unitsDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); unitsDialog->show(); qApp->processEvents(); unitsDialog->raise(); unitsDialog->activateWindow(); return; } unitsDialog = new UnitsDialog(); if(u && !u->category().empty()) unitsDialog->selectCategory(u->category()); connect(unitsDialog, SIGNAL(itemsChanged()), expressionEdit, SLOT(updateCompletion())); connect(unitsDialog, SIGNAL(itemsChanged()), this, SLOT(expressionObjectsUpdated())); connect(unitsDialog, SIGNAL(itemsChanged()), this, SLOT(resetUnitsAndVariablesMenus())); connect(unitsDialog, SIGNAL(favouritesChanged()), this, SLOT(updateFavouriteUnits())); connect(unitsDialog, SIGNAL(variableRemoved(Variable*)), this, SLOT(onVariableRemoved(Variable*))); connect(unitsDialog, SIGNAL(variableDeactivated(Variable*)), this, SLOT(onVariableDeactivated(Variable*))); connect(unitsDialog, SIGNAL(insertUnitRequest(Unit*)), this, SLOT(onUnitClicked(Unit*))); connect(unitsDialog, SIGNAL(insertUnitRequest(Unit*)), this, SLOT(addToRecentUnits(Unit*))); connect(unitsDialog, SIGNAL(convertToUnitRequest(Unit*)), this, SLOT(convertToUnit(Unit*))); connect(unitsDialog, SIGNAL(unitActivated(Unit*)), this, SLOT(onUnitActivated(Unit*))); if(settings->always_on_top) unitsDialog->setWindowFlags(unitsDialog->windowFlags() | Qt::WindowStaysOnTopHint); unitsDialog->show(); } void remove_nonunits(MathStructure &m) { if(m.isUnit()) { if(m.unit()->defaultPrefix() != 0) m.setPrefix(CALCULATOR->getExactDecimalPrefix(m.unit()->defaultPrefix())); else m.setPrefix(NULL); } if(m.size() > 0) { for(size_t i = m.size(); i > 0; i--) { if(!m.isUnit_exp() && !m[i - 1].containsType(STRUCT_UNIT, true)) { m.delChild(i); } else { remove_nonunits(m[i - 1]); } } if(m.size() == 1) m.setToChild(1); else if(m.size() == 0) m.clear(); } } void QalculateWindow::onUnitActivated(Unit *u) { if(expressionEdit->expressionHasChanged() || settings->history_answer.empty() || ((settings->replace_expression != CLEAR_EXPRESSION || !expressionEdit->document()->isEmpty()) && (expressionEdit->document()->isEmpty() || expressionEdit->selectedText() != expressionEdit->toPlainText())) || !mstruct) { onUnitClicked(u); addToRecentUnits(u); } else { if(!mstruct->containsType(STRUCT_UNIT, true)) { MathStructure m_u(u); m_u.unformat(settings->evalops); MathStructure moptimal(CALCULATOR->convertToOptimalUnit(m_u, settings->evalops, true)); remove_nonunits(moptimal); moptimal.unformat(settings->evalops); if(moptimal.compare(m_u) == COMPARISON_RESULT_EQUAL) { onUnitClicked(u); return; } } convertToUnit(u); } } void QalculateWindow::openFPConversion() { if(fpConversionDialog) { fpConversionDialog->setWindowState((fpConversionDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); fpConversionDialog->show(); qApp->processEvents(); fpConversionDialog->raise(); fpConversionDialog->activateWindow(); } else { fpConversionDialog = new FPConversionDialog(this); if(settings->always_on_top) fpConversionDialog->setWindowFlags(fpConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); fpConversionDialog->show(); } if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { if(mstruct && mstruct->isNumber()) { fpConversionDialog->setValue(*mstruct); } } else if(!auto_result.empty()) { if(mauto.isNumber()) { fpConversionDialog->setValue(mauto); } } else { QString str = expressionEdit->selectedText(true).trimmed(); int base = settings->evalops.parse_options.base; if(base <= BASE_FP16 && base >= BASE_FP80) base = BASE_BINARY; if(str.isEmpty()) { fpConversionDialog->clear(); } else { switch(base) { case BASE_BINARY: { fpConversionDialog->setBin(str); break; } case BASE_HEXADECIMAL: { fpConversionDialog->setHex(str); break; } case BASE_DECIMAL: { fpConversionDialog->setValue(str); break; } default: { fpConversionDialog->clear(); break; } } } } } void QalculateWindow::openPercentageCalculation() { if(percentageDialog) { percentageDialog->setWindowState((percentageDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); percentageDialog->show(); qApp->processEvents(); percentageDialog->raise(); percentageDialog->activateWindow(); } else { percentageDialog = new PercentageCalculationDialog(this); if(settings->always_on_top) percentageDialog->setWindowFlags(percentageDialog->windowFlags() | Qt::WindowStaysOnTopHint); percentageDialog->show(); } QString str; if(!expressionEdit->expressionHasChanged() && !settings->history_answer.empty()) { if(mstruct && mstruct->isNumber()) { str = QString::fromStdString(unhtmlize(result_text)); } } else if(!auto_result.empty()) { if(mauto.isNumber()) { str = QString::fromStdString(unhtmlize(auto_result)); } } else { str = expressionEdit->selectedText(true); } percentageDialog->resetValues(str); } void QalculateWindow::openPlot() { if(!CALCULATOR->canPlot()) { QMessageBox::critical(this, tr("Gnuplot was not found"), tr("%1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work.").arg("Gnuplot").arg("http://www.gnuplot.info/"), QMessageBox::Ok); return; } if(plotDialog) { plotDialog->setWindowState((plotDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); plotDialog->show(); qApp->processEvents(); plotDialog->raise(); plotDialog->activateWindow(); } else { plotDialog = new PlotDialog(this); if(settings->always_on_top) plotDialog->setWindowFlags(plotDialog->windowFlags() | Qt::WindowStaysOnTopHint); plotDialog->show(); } if(settings->evalops.parse_options.base == 10) { std::string str = expressionEdit->selectedText(true).toStdString(), str2; CALCULATOR->separateToExpression(str, str2, settings->evalops, true); remove_blank_ends(str); plotDialog->setExpression(QString::fromStdString(str)); } else { plotDialog->setExpression(QString()); } } void QalculateWindow::openPeriodicTable() { if(periodicTableDialog) { periodicTableDialog->setWindowState((periodicTableDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); periodicTableDialog->show(); qApp->processEvents(); periodicTableDialog->raise(); periodicTableDialog->activateWindow(); } else { periodicTableDialog = new PeriodicTableDialog(this); connect(periodicTableDialog, SIGNAL(insertPropertyRequest(DataObject*, DataProperty*)), this, SLOT(insertProperty(DataObject*, DataProperty*))); if(settings->always_on_top) periodicTableDialog->setWindowFlags(periodicTableDialog->windowFlags() | Qt::WindowStaysOnTopHint); periodicTableDialog->show(); } } void QalculateWindow::openCalendarConversion() { if(calendarConversionDialog) { if(!auto_result.empty() && mauto.isDateTime()) calendarConversionDialog->setDate(*mauto.datetime()); else if(auto_result.empty() && mstruct && mstruct->isDateTime()) calendarConversionDialog->setDate(*mstruct->datetime()); calendarConversionDialog->setWindowState((calendarConversionDialog->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); calendarConversionDialog->show(); qApp->processEvents(); calendarConversionDialog->raise(); calendarConversionDialog->activateWindow(); return; } calendarConversionDialog = new CalendarConversionDialog(this); if(settings->always_on_top) calendarConversionDialog->setWindowFlags(calendarConversionDialog->windowFlags() | Qt::WindowStaysOnTopHint); QalculateDateTime dt; if(!auto_result.empty() && mauto.isDateTime()) dt.set(*mauto.datetime()); else if(auto_result.empty() && mstruct && mstruct->isDateTime()) dt.set(*mstruct->datetime()); else dt.setToCurrentDate(); calendarConversionDialog->setDate(dt); calendarConversionDialog->show(); } struct FunctionDialog { MathFunction *f; QDialog *dialog; QPushButton *b_cancel, *b_exec, *b_insert; QCheckBox *b_keepopen; QLabel *w_result; QScrollArea *w_scrollresult; std::vector label; std::vector entry; std::vector boolean_buttons; std::vector boolean_index; bool keep_open, rpn; int args; }; MathSpinBox::MathSpinBox(QWidget *parent) : QSpinBox(parent) { setLineEdit(new MathLineEdit(this)); connect(lineEdit(), SIGNAL(returnPressed()), this, SIGNAL(returnPressed())); #ifndef _WIN32 setAttribute(Qt::WA_InputMethodEnabled, settings->enable_input_method); #endif } MathSpinBox::~MathSpinBox() {} int MathSpinBox::valueFromText(const QString &text) const { if(settings->evalops.parse_options.base != BASE_DECIMAL) return QSpinBox::valueFromText(text); std::string str = text.toStdString(); if(str.find_first_not_of(NUMBERS) == std::string::npos) { return text.toInt(); } MathStructure value; CALCULATOR->beginTemporaryStopMessages(); EvaluationOptions eo = settings->evalops; eo.parse_options.base = 10; CALCULATOR->calculate(&value, CALCULATOR->unlocalizeExpression(str, eo.parse_options), 100, eo); CALCULATOR->endTemporaryStopMessages(); return value.number().intValue(); } QValidator::State MathSpinBox::validate(QString &text, int &pos) const { if(settings->evalops.parse_options.base != BASE_DECIMAL) return QSpinBox::validate(text, pos); std::string str = text.trimmed().toStdString(); if(str.empty()) return QValidator::Intermediate; return QValidator::Acceptable; } QLineEdit *MathSpinBox::entry() const { return lineEdit(); } void MathSpinBox::keyPressEvent(QKeyEvent *event) { QSpinBox::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } class MathDateTimeEdit : public QDateTimeEdit { public: MathDateTimeEdit(QWidget *parent = NULL) : QDateTimeEdit(parent) {} virtual ~MathDateTimeEdit() {} QLineEdit *entry() const {return lineEdit();} protected: void keyPressEvent(QKeyEvent *event) override { QDateTimeEdit::keyPressEvent(event); if(event->key() == Qt::Key_Return) event->accept(); } }; void QalculateWindow::onCalculateFunctionRequested(MathFunction *f) { insertFunction(f, functionsDialog); } void QalculateWindow::onInsertFunctionRequested(MathFunction *f) { expressionEdit->blockCompletion(); if(!expressionEdit->expressionHasChanged()) { expressionEdit->blockUndo(true); expressionEdit->clear(); expressionEdit->blockUndo(false); } QTextCursor cur = expressionEdit->textCursor(); expressionEdit->wrapSelection(QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)), true, true); if(!expressionEdit->hasFocus()) expressionEdit->setFocus(); expressionEdit->blockCompletion(false); } void QalculateWindow::insertFunction(MathFunction *f, QWidget *parent) { if(!f) return; //if function takes no arguments, do not display dialog and insert function directly if(f->args() == 0) { expressionEdit->insertText(QString::fromStdString(f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true)) + "()"); //function_inserted(f); return; } FunctionDialog *fd = new FunctionDialog; int args = 0; bool has_vector = false; if(f->args() > 0) { args = f->args(); } else if(f->minargs() > 0) { args = f->minargs(); while(!f->getDefaultValue(args + 1).empty()) args++; if(args == 1 || f->id() == FUNCTION_ID_PLOT) args++; } else { args = 1; has_vector = true; } fd->args = args; fd->rpn = settings->rpn_mode && expressionEdit->document()->isEmpty() && CALCULATOR->RPNStackSize() >= (f->minargs() <= 0 ? 1 : (size_t) f->minargs()); fd->f = f; std::string f_title = f->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) this); fd->dialog = new QDialog(parent ? parent : this); if(settings->always_on_top) fd->dialog->setWindowFlags(fd->dialog->windowFlags() | Qt::WindowStaysOnTopHint); fd->dialog->setWindowTitle(QString::fromStdString(f_title)); QVBoxLayout *box = new QVBoxLayout(fd->dialog); box->addSpacing(box->spacing()); QLabel *titleLabel = new QLabel("" + QString::fromStdString(f_title) + ""); box->addWidget(titleLabel); box->addSpacing(box->spacing()); QGridLayout *table = new QGridLayout(); box->addLayout(table); box->addSpacing(box->spacing()); if(!f->description().empty() || !f->example(true).empty()) { QPlainTextEdit *descr = new QPlainTextEdit(); descr->setReadOnly(true); box->addWidget(descr); QString str = QString::fromStdString(f->description()); if(!f->example(true).empty()) { if(!str.isEmpty()) str += "\n\n"; str += tr("Example:", "Example of function usage"); str += " "; str += QString::fromStdString(f->example(false)); } str.replace(">=", SIGN_GREATER_OR_EQUAL); str.replace("<=", SIGN_LESS_OR_EQUAL); str.replace("!=", SIGN_NOT_EQUAL); str.replace("...", "…"); descr->setPlainText(str); int n = str.count("\n"); if(n < 5) n = 5; QFontMetrics fm(descr->font()); descr->setFixedHeight(fm.lineSpacing() * n + descr->frameWidth() * 2 + descr->contentsMargins().top() + descr->contentsMargins().bottom()); } fd->w_scrollresult = new QScrollArea(); fd->w_scrollresult->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); fd->w_result = new QLabel(); fd->w_result->setTextInteractionFlags(Qt::TextSelectableByMouse); fd->w_result->setWordWrap(true); fd->w_result->setAlignment(Qt::AlignRight); QFont font(fd->w_result->font()); font.setWeight(QFont::Bold); QFontMetrics fm(font); fd->w_scrollresult->setMinimumWidth(fm.averageCharWidth() * 40); titleLabel->setMinimumWidth(fm.averageCharWidth() * 40); fd->w_scrollresult->setWidget(fd->w_result); fd->w_scrollresult->setWidgetResizable(true); fd->w_scrollresult->setFrameShape(QFrame::NoFrame); fd->w_scrollresult->setFixedHeight(fm.lineSpacing() * 2 + fd->w_scrollresult->frameWidth() * 2 + fd->w_scrollresult->contentsMargins().top() + fd->w_scrollresult->contentsMargins().bottom()); box->addWidget(fd->w_scrollresult, Qt::AlignRight); QHBoxLayout *hbox = new QHBoxLayout(); box->addLayout(hbox); fd->b_keepopen = new QCheckBox(tr("Keep open")); fd->keep_open = settings->keep_function_dialog_open; fd->b_keepopen->setChecked(fd->keep_open); hbox->addWidget(fd->b_keepopen); hbox->addStretch(1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, fd->dialog); hbox->addWidget(buttonBox); fd->b_cancel = buttonBox->button(QDialogButtonBox::Close); fd->b_exec = buttonBox->addButton(settings->rpn_mode ? tr("Enter", "RPN Enter") : tr("Calculate"), QDialogButtonBox::ApplyRole); fd->b_insert = buttonBox->addButton(settings->rpn_mode ? tr("Apply to Stack") : tr("Insert"), QDialogButtonBox::AcceptRole); fd->b_insert->setEnabled(!settings->rpn_mode || CALCULATOR->RPNStackSize() >= (f->minargs() <= 0 ? 1 : (size_t) f->minargs())); fd->label.resize(args, NULL); fd->entry.resize(args, NULL); fd->boolean_index.resize(args, 0); int bindex = 0; QString argstr, typestr, defstr; QString freetype = QString::fromStdString(Argument().printlong()); Argument *arg; int r = 0; for(int i = 0; i < args; i++) { arg = f->getArgumentDefinition(i + 1); if(!arg || arg->name().empty()) { if(args == 1) { argstr = tr("Value"); } else { argstr = tr("Argument"); if(i > 0 || f->maxargs() != 1) { argstr += " "; argstr += QString::number(i + 1); } } } else { argstr = QString::fromStdString(arg->name()); } typestr = ""; ParseOptions pa = settings->evalops.parse_options; pa.base = 10; defstr = QString::fromStdString(CALCULATOR->localizeExpression(f->getDefaultValue(i + 1), pa)); if(arg && (arg->suggestsQuotes() || arg->type() == ARGUMENT_TYPE_TEXT) && defstr.length() >= 2 && defstr[0] == '\"' && defstr[defstr.length() - 1] == '\"') { defstr = defstr.mid(1, defstr.length() - 2); } fd->label[i] = new QLabel(tr("%1:").arg(argstr)); fd->label[i]->setAlignment(Qt::AlignRight); QWidget *entry = NULL; if(arg) { if(arg->type() == ARGUMENT_TYPE_INTEGER) { IntegerArgument *iarg = (IntegerArgument*) arg; int min = INT_MIN, max = INT_MAX; if(iarg->min()) { min = iarg->min()->intValue(); } if(iarg->max()) { max = iarg->max()->intValue(); } MathSpinBox *spin = new MathSpinBox(); entry = spin; fd->entry[i] = spin->entry(); spin->setRange(min, max); if(!defstr.isEmpty()) { spin->setValue(defstr.toInt()); } else if(!arg->zeroForbidden() && min <= 0 && max >= 0) { spin->setValue(0); } else { if(max < 0) { spin->setValue(max); } else if(min <= 1) { spin->setValue(1); } else { spin->setValue(min); } } spin->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); connect(spin, SIGNAL(textChanged(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(spin, SIGNAL(valueChanged(int)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } else if(arg->type() == ARGUMENT_TYPE_DATE) { MathDateTimeEdit *dateEdit = new MathDateTimeEdit(); entry = dateEdit; if(defstr == "now") { dateEdit->setDateTime(QDateTime::currentDateTime()); dateEdit->setDisplayFormat("yyyy-MM-ddTHH:mm:ss"); } else { dateEdit->setDate(QDate::currentDate()); dateEdit->setDisplayFormat("yyyy-MM-dd"); dateEdit->setCalendarPopup(true); } dateEdit->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->entry[i] = dateEdit->entry(); connect(dateEdit, SIGNAL(dateTimeChanged(const QDateTime&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } else if(arg->type() == ARGUMENT_TYPE_BOOLEAN) { fd->boolean_index[i] = bindex; bindex += 2; fd->entry[i] = new QWidget(); hbox = new QHBoxLayout(fd->entry[i]); QButtonGroup *group = new QButtonGroup(this); group->setExclusive(true); QRadioButton *w = new QRadioButton(tr("True")); group->addButton(w); hbox->addWidget(w); w->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->boolean_buttons.push_back(w); w = new QRadioButton(tr("False")); group->addButton(w); hbox->addWidget(w); w->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->boolean_buttons.push_back(w); w->setChecked(true); hbox->addStretch(1); connect(fd->boolean_buttons[fd->boolean_buttons.size() - 2], SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionChanged())); connect(fd->boolean_buttons[fd->boolean_buttons.size() - 1], SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionChanged())); } else if(arg->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { QComboBox *w = new QComboBox(); fd->entry[i] = w; DataPropertyIter it; DataSet *ds = (DataSet*) f; DataProperty *dp = ds->getFirstProperty(&it); if(fd->rpn && (size_t) i < CALCULATOR->RPNStackSize()) { QTableWidgetItem *item = rpnView->item(i, 0); if(item) defstr = item->text(); } int active_index = -1; for(int i2 = 0; dp; i2++) { if(!dp->isHidden()) { w->addItem(QString::fromStdString(dp->title()), QVariant::fromValue((void*) dp)); if(active_index < 0 && defstr.toStdString() == dp->getName()) { active_index = i2; } } dp = ds->getNextProperty(&it); } w->addItem(tr("Info"), QVariant::fromValue((void*) NULL)); if(active_index < 0) active_index = w->count() - 1; w->setCurrentIndex(active_index); connect(w, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onInsertFunctionChanged())); } else { typestr = QString::fromStdString(arg->printlong()); if(typestr == freetype) typestr = ""; if(arg->type() == ARGUMENT_TYPE_DATA_OBJECT && f->subtype() == SUBTYPE_DATA_SET && ((DataSet*) f)->getPrimaryKeyProperty()) { QComboBox *combo = new QComboBox(); combo->setEditable(true); DataObjectIter it; DataSet *ds = (DataSet*) f; DataObject *obj = ds->getFirstObject(&it); DataProperty *dp = ds->getProperty("name"); if(!dp || !dp->isKey()) dp = ds->getPrimaryKeyProperty(); while(obj) { combo->addItem(QString::fromStdString(obj->getPropertyInputString(dp))); obj = ds->getNextObject(&it); } combo->setCurrentText(QString()); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(i == 1 && f->id() == FUNCTION_ID_ASCII && arg->type() == ARGUMENT_TYPE_TEXT) { QComboBox *combo = new QComboBox(); combo->setEditable(true); combo->addItem("UTF-8"); combo->addItem("UTF-16"); combo->addItem("UTF-32"); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(i == 3 && f->id() == FUNCTION_ID_DATE && arg->type() == ARGUMENT_TYPE_TEXT) { QComboBox *combo = new QComboBox(); combo->setEditable(true); combo->addItem("chinese"); combo->addItem("coptic"); combo->addItem("egyptian"); combo->addItem("ethiopian"); combo->addItem("gregorian"); combo->addItem("hebrew"); combo->addItem("indian"); combo->addItem("islamic"); combo->addItem("julian"); combo->addItem("milankovic"); combo->addItem("persian"); fd->entry[i] = combo->lineEdit(); entry = combo; } else if(USE_QUOTES(arg, f)) { fd->entry[i] = new QLineEdit(); } else { fd->entry[i] = new MathLineEdit(); } if(i >= f->minargs() && !has_vector) { ((QLineEdit*) fd->entry[i])->setPlaceholderText(tr("optional", "optional argument")); } connect(fd->entry[i], SIGNAL(textEdited(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } } else { fd->entry[i] = new MathLineEdit(); if(i >= f->minargs() && !has_vector) { ((QLineEdit*) fd->entry[i])->setPlaceholderText(tr("optional", "optional argument")); } connect(fd->entry[i], SIGNAL(textEdited(const QString&)), this, SLOT(onInsertFunctionChanged())); connect(fd->entry[i], SIGNAL(returnPressed()), this, SLOT(onInsertFunctionEntryActivated())); } if(arg && arg->type() == ARGUMENT_TYPE_FILE) { QAction *action = ((QLineEdit*) fd->entry[i])->addAction(LOAD_ICON("document-open"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) ((QLineEdit*) fd->entry[i])->setTextMargins(0, 0, 22, 0); # endif #endif action->setProperty("QALCULATE ENTRY", QVariant::fromValue((void*) fd->entry[i])); typestr = ""; connect(action, SIGNAL(triggered()), this, SLOT(onEntrySelectFile())); } else if(arg && arg->type() == ARGUMENT_TYPE_MATRIX) { QAction *action = ((QLineEdit*) fd->entry[i])->addAction(LOAD_ICON("table"), QLineEdit::TrailingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) ((QLineEdit*) fd->entry[i])->setTextMargins(0, 0, 22, 0); # endif #endif action->setProperty("QALCULATE ENTRY", QVariant::fromValue((void*) fd->entry[i])); typestr = ""; connect(action, SIGNAL(triggered()), this, SLOT(onEntryEditMatrix())); } if(fd->rpn && (size_t) i < CALCULATOR->RPNStackSize()) { QTableWidgetItem *item = rpnView->item(i, 0); if(item) { if(arg && arg->type() == ARGUMENT_TYPE_BOOLEAN) { if(item->text() == "1") { fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(true); fd->boolean_buttons[fd->boolean_buttons.size() - 1]->setChecked(false); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->setChecked(true); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(false); } } else if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY || f->subtype() != SUBTYPE_DATA_SET) { fd->entry[i]->blockSignals(true); if(i == 0 && args == 1 && (has_vector || arg->type() == ARGUMENT_TYPE_VECTOR)) { QString rpn_vector = item->text(); for(int i2 = i + 1; i2 < rpnView->rowCount(); i2++) { item = rpnView->item(i, 0); if(item) { rpn_vector += QString::fromStdString(CALCULATOR->getComma()); rpn_vector += " "; rpn_vector += item->text(); } } ((QLineEdit*) fd->entry[i])->setText(rpn_vector); } else { ((QLineEdit*) fd->entry[i])->setText(item->text()); } fd->entry[i]->blockSignals(false); } } } else if(arg && arg->type() == ARGUMENT_TYPE_BOOLEAN) { if(defstr == "1") { fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(true); fd->boolean_buttons[fd->boolean_buttons.size() - 1]->setChecked(false); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->setChecked(true); fd->boolean_buttons[fd->boolean_buttons.size() - 2]->blockSignals(false); } } else if(!arg || arg->type() != ARGUMENT_TYPE_DATA_PROPERTY || f->subtype() != SUBTYPE_DATA_SET) { fd->entry[i]->blockSignals(true); if(!defstr.isEmpty() && (!arg || (arg->type() != ARGUMENT_TYPE_DATE && arg->type() != ARGUMENT_TYPE_INTEGER)) && (i < f->minargs() || has_vector || (defstr != "undefined" && defstr != "\"\""))) { ((QLineEdit*) fd->entry[i])->setText(defstr); } if(i == 0) { std::string seltext, str2; if(expressionEdit->textCursor().hasSelection()) seltext = expressionEdit->textCursor().selectedText().toStdString(); else seltext = expressionEdit->toPlainText().toStdString(); bool use_current_result = (!auto_exact_text.empty() || (!expressionEdit->expressionHasChanged() && !settings->history_answer.empty() && settings->current_result)) && (!expressionEdit->textCursor().hasSelection() || seltext == expressionEdit->toPlainText().toStdString()); CALCULATOR->separateToExpression(seltext, str2, settings->evalops, true); remove_blank_ends(seltext); if(!seltext.empty()) { if(arg && arg->type() == ARGUMENT_TYPE_INTEGER) { MathStructure m; CALCULATOR->beginTemporaryStopMessages(); if(use_current_result) { m = auto_result.empty() ? *settings->current_result : mauto; } else { CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(seltext, settings->evalops.parse_options), 200, settings->evalops); } if(!CALCULATOR->endTemporaryStopMessages() && m.isInteger()) { bool overflow = false; int v = m.number().intValue(&overflow); QSpinBox *spin = (QSpinBox*) entry; if(!overflow && v >= spin->minimum() && v <= spin->maximum()) spin->setValue(v); } } else if(arg && arg->type() == ARGUMENT_TYPE_DATE) { MathStructure m; CALCULATOR->beginTemporaryStopMessages(); if(use_current_result) { m = auto_result.empty() ? *settings->current_result : mauto; } else { CALCULATOR->calculate(&m, CALCULATOR->unlocalizeExpression(seltext, settings->evalops.parse_options), 200, settings->evalops); } if(!CALCULATOR->endTemporaryStopMessages() && m.isDateTime()) { QDateTime d; d.setDate(QDate(m.datetime()->year(), m.datetime()->month(), m.datetime()->day())); Number nr_sec = m.datetime()->second(); Number nr_msec(nr_sec); nr_msec.frac(); nr_msec *= 1000; nr_msec.round(); nr_sec.trunc(); d.setTime(QTime(m.datetime()->hour(), m.datetime()->minute(), nr_sec.intValue(), nr_msec.intValue())); ((QDateTimeEdit*) entry)->setDateTime(d); } } else { if(use_current_result) { if(!auto_exact_text.empty()) { ((QLineEdit*) fd->entry[i])->setText(QString::fromStdString(auto_exact_text)); } else if(exact_text.empty()) { Number nr(settings->history_answer.size(), 1, 0); ((QLineEdit*) fd->entry[i])->setText(QStringLiteral("%1(%2)").arg(QString::fromStdString(settings->f_answer->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) fd->entry[i]).formattedName(TYPE_FUNCTION, true))).arg(QString::fromStdString(print_with_evalops(nr)))); } else { ((QLineEdit*) fd->entry[i])->setText(QString::fromStdString(exact_text)); } } else { ((QLineEdit*) fd->entry[i])->setText(QString::fromStdString(seltext)); } } } } fd->entry[i]->blockSignals(false); } table->addWidget(fd->label[i], r, 0, 1, 1); if(entry) table->addWidget(entry, r, 1, 1, 1); else table->addWidget(fd->entry[i], r, 1, 1, 1); r++; fd->entry[i]->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); if(i == 0) fd->entry[i]->setFocus(); if(!typestr.isEmpty()) { typestr.replace(">=", SIGN_GREATER_OR_EQUAL); typestr.replace("<=", SIGN_LESS_OR_EQUAL); typestr.replace("!=", SIGN_NOT_EQUAL); QLabel *w = new QLabel("" + typestr.toHtmlEscaped() + THIN_SPACE ""); w->setWordWrap(true); w->setAlignment(Qt::AlignRight | Qt::AlignTop); table->addWidget(w, r, 1, 1, 1); r++; } } table->setColumnStretch(1, 1); if(!fd->keep_open) fd->w_scrollresult->hide(); fd->b_exec->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_cancel->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_insert->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_keepopen->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); fd->b_cancel->setDefault(false); fd->b_exec->setDefault(fd->keep_open || settings->rpn_mode); fd->b_insert->setDefault(!fd->keep_open && !settings->rpn_mode); fd->dialog->setProperty("QALCULATE FD", QVariant::fromValue((void*) fd)); connect(fd->b_exec, SIGNAL(clicked()), this, SLOT(onInsertFunctionExec())); connect(fd->b_insert, SIGNAL(clicked()), this, SLOT(onInsertFunctionInsertRPN())); connect(fd->b_cancel, SIGNAL(clicked()), fd->dialog, SLOT(reject())); connect(fd->b_keepopen, SIGNAL(toggled(bool)), this, SLOT(onInsertFunctionKeepOpen(bool))); connect(fd->dialog, SIGNAL(rejected()), this, SLOT(onInsertFunctionClosed())); box->setSizeConstraint(QLayout::SetFixedSize); fd->dialog->show(); functionDialogs << fd; } void QalculateWindow::onEntrySelectFile() { QLineEdit *w = (QLineEdit*) sender()->property("QALCULATE ENTRY").value(); FunctionDialog *fd = (FunctionDialog*) w->property("QALCULATE FD").value(); QString str = QFileDialog::getOpenFileName(fd->dialog, QString(), w->text()); if(!str.isEmpty()) w->setText(str); } void QalculateWindow::onEntryEditMatrix() { QLineEdit *entry = (QLineEdit*) sender()->property("QALCULATE ENTRY").value(); FunctionDialog *fd = (FunctionDialog*) entry->property("QALCULATE FD").value(); QDialog *dialog = new QDialog(fd->dialog); if(settings->always_on_top) dialog->setWindowFlags(dialog->windowFlags() | Qt::WindowStaysOnTopHint); dialog->setWindowTitle(tr("Matrix")); QVBoxLayout *box = new QVBoxLayout(dialog); MatrixWidget *w = new MatrixWidget(dialog); w->setMatrixString(entry->text()); box->addWidget(w); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, dialog); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); box->addWidget(buttonBox); w->setFocus(); connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), dialog, SLOT(accept())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), dialog, SLOT(reject())); if(dialog->exec() == QDialog::Accepted) { if(!w->isEmpty()) { entry->setText(w->getMatrixString()); } } dialog->deleteLater(); } void QalculateWindow::insertFunctionDo(FunctionDialog *fd) { MathFunction *f = fd->f; std::string str = f->preferredInputName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionEdit).formattedName(TYPE_FUNCTION, true) + "(", str2; int argcount = fd->args; if((f->maxargs() < 0 || f->minargs() < f->maxargs()) && argcount > f->minargs()) { while(true) { ParseOptions pa = settings->evalops.parse_options; pa.base = 10; std::string defstr = CALCULATOR->localizeExpression(f->getDefaultValue(argcount), pa); remove_blank_ends(defstr); if(f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_BOOLEAN) { if(fd->boolean_buttons[fd->boolean_index[argcount - 1]]->isChecked()) str2 = "1"; else str2 = "0"; } else if(settings->evalops.parse_options.base != BASE_DECIMAL && f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_INTEGER) { Number nr(((QLineEdit*) fd->entry[argcount - 1])->text().toStdString()); str2 = print_with_evalops(nr); } else if(f->getArgumentDefinition(argcount) && f->getArgumentDefinition(argcount)->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { DataProperty *dp = (DataProperty*) ((QComboBox*) fd->entry[argcount - 1])->currentData().value(); if(dp) { str2 = dp->getName(); } else { str2 = "info"; } } else { str2 = ((QLineEdit*) fd->entry[argcount - 1])->text().toStdString(); remove_blank_ends(str2); } if(!str2.empty() && USE_QUOTES(f->getArgumentDefinition(argcount), f) && (unicode_length(str2) <= 2 || str2.find_first_of("\"\'") == std::string::npos)) { if(str2.find("\"") != std::string::npos) { str2.insert(0, "\'"); str2 += "\'"; } else { str2.insert(0, "\""); str2 += "\""; } } if(str2.empty() || str2 == defstr) argcount--; else break; if(argcount == 0 || argcount == f->minargs()) break; } } int i_vector = f->maxargs() > 0 ? f->maxargs() : argcount; for(int i = 0; i < argcount; i++) { if(f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_BOOLEAN) { if(fd->boolean_buttons[fd->boolean_index[i]]->isChecked()) str2 = "1"; else str2 = "0"; } else if((i != (f->maxargs() > 0 ? f->maxargs() : argcount) - 1 || i_vector == i - 1) && f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_VECTOR) { i_vector = i; str2 = ((QLineEdit*) fd->entry[i])->text().toStdString(); remove_blank_ends(str2); if(str2.find_first_of(PARENTHESISS VECTOR_WRAPS) == std::string::npos && str2.find_first_of(CALCULATOR->getComma() == COMMA ? COMMAS : CALCULATOR->getComma()) != std::string::npos) { str2.insert(0, 1, '['); str2 += ']'; } } else if(settings->evalops.parse_options.base != BASE_DECIMAL && f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_INTEGER) { Number nr(((QLineEdit*) fd->entry[i])->text().toStdString()); str2 = print_with_evalops(nr); } else if(f->getArgumentDefinition(i + 1) && f->getArgumentDefinition(i + 1)->type() == ARGUMENT_TYPE_DATA_PROPERTY && f->subtype() == SUBTYPE_DATA_SET) { DataProperty *dp = (DataProperty*) ((QComboBox*) fd->entry[i])->currentData().value(); if(dp) { str2 = dp->getName(); } else { str2 = "info"; } } else { str2 = ((QLineEdit*) fd->entry[i])->text().toStdString(); remove_blank_ends(str2); } if((i < f->minargs() || !str2.empty()) && USE_QUOTES(f->getArgumentDefinition(i + 1), f) && (unicode_length(str2) <= 2 || str2.find_first_of("\"\'") == std::string::npos)) { if(str2.find("\"") != std::string::npos) { str2.insert(0, "\'"); str2 += "\'"; } else { str2.insert(0, "\""); str2 += "\""; } } if(i > 0) { str += CALCULATOR->getComma(); str += " "; } str += str2; } str += ")"; expressionEdit->blockCompletion(true); expressionEdit->insertText(QString::fromStdString(str)); expressionEdit->blockCompletion(false); } void QalculateWindow::onInsertFunctionChanged() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->w_result->clear(); } void QalculateWindow::onInsertFunctionEntryActivated() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); for(int i = 0; i < fd->args; i++) { if(fd->entry[i] == sender()) { if(i == fd->args - 1) { if(fd->keep_open || settings->rpn_mode) onInsertFunctionExec(); else onInsertFunctionInsertRPN(); } else { if(fd->f->getArgumentDefinition(i + 2) && fd->f->getArgumentDefinition(i + 2)->type() == ARGUMENT_TYPE_BOOLEAN) { fd->boolean_buttons[fd->boolean_index[i + 1]]->setFocus(); } else { fd->entry[i + 1]->setFocus(); } } break; } } } void QalculateWindow::updateInsertFunctionDialogs() { for(int i = 0; i < functionDialogs.size(); i++) { FunctionDialog *fd = functionDialogs.at(i); fd->b_insert->setEnabled(!settings->rpn_mode || CALCULATOR->RPNStackSize() >= (fd->f->minargs() <= 0 ? 1 : (size_t) fd->f->minargs())); fd->b_insert->setText(settings->rpn_mode ? tr("Apply to Stack") : tr("Insert")); fd->b_exec->setDefault(fd->keep_open || settings->rpn_mode); fd->b_insert->setDefault(!fd->keep_open && !settings->rpn_mode); } } void QalculateWindow::onInsertFunctionExec() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); expressionEdit->blockUndo(true); expressionEdit->clear(); expressionEdit->blockUndo(false); if(!fd->keep_open) fd->dialog->hide(); insertFunctionDo(fd); calculateExpression(); if(fd->keep_open) { QString str; bool b_approx = *settings->printops.is_approximate || (mstruct && mstruct->isApproximate()); str = ""; if(!b_approx) str += "= "; else str += SIGN_ALMOST_EQUAL " "; if(result_text.length() > 100000) str += QString::fromStdString(ellipsize_result(result_text, 20000)); else str += QString::fromStdString(result_text); str += ""; fd->w_scrollresult->show(); fd->w_result->setText(str); fd->entry[0]->setFocus(); expressionEdit->selectAll(); } else { fd->dialog->deleteLater(); functionDialogs.removeAll(fd); delete fd; } } void QalculateWindow::onInsertFunctionInsertRPN() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); if(!fd->keep_open) fd->dialog->hide(); if(settings->rpn_mode) calculateRPN(fd->f); else insertFunctionDo(fd); if(fd->keep_open) { fd->entry[0]->setFocus(); expressionEdit->selectAll(); } else { fd->dialog->deleteLater(); functionDialogs.removeAll(fd); delete fd; } } void QalculateWindow::onInsertFunctionKeepOpen(bool b) { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->keep_open = b; settings->keep_function_dialog_open = b; if(!b) fd->w_scrollresult->hide(); fd->b_exec->setDefault(fd->keep_open || settings->rpn_mode); fd->b_insert->setDefault(!fd->keep_open && !settings->rpn_mode); } void QalculateWindow::onInsertFunctionClosed() { FunctionDialog *fd = (FunctionDialog*) sender()->property("QALCULATE FD").value(); fd->dialog->deleteLater(); functionDialogs.removeAll(fd); delete fd; } void QalculateWindow::executeFromFile(const QString &file) { QFile qfile(file); if(!qfile.open(QIODevice::ReadOnly)) { qDebug() << tr("Failed to open %1.\n%2").arg(file).arg(qfile.errorString()); return; } char buffer[10000]; std::string str, scom; size_t ispace; bool rpn_save = settings->rpn_mode; settings->rpn_mode = false; previous_expression = ""; expressionEdit->blockUndo(true); expressionEdit->blockCompletion(true); expressionEdit->blockParseStatus(true); block_expression_history = true; while(qfile.readLine(buffer, 10000) >= 0) { str = buffer; remove_blank_ends(str); ispace = str.find_first_of(SPACES); if(ispace == std::string::npos) scom = ""; else scom = str.substr(0, ispace); if(equalsIgnoreCase(str, "exrates") || equalsIgnoreCase(str, "stack") || equalsIgnoreCase(str, "swap") || equalsIgnoreCase(str, "rotate") || equalsIgnoreCase(str, "copy") || equalsIgnoreCase(str, "clear stack") || equalsIgnoreCase(str, "exact") || equalsIgnoreCase(str, "approximate") || equalsIgnoreCase(str, "approx") || equalsIgnoreCase(str, "factor") || equalsIgnoreCase(str, "partial fraction") || equalsIgnoreCase(str, "simplify") || equalsIgnoreCase(str, "expand") || equalsIgnoreCase(str, "mode") || equalsIgnoreCase(str, "help") || equalsIgnoreCase(str, "?") || equalsIgnoreCase(str, "list") || equalsIgnoreCase(str, "exit") || equalsIgnoreCase(str, "quit") || equalsIgnoreCase(str, "clear") || equalsIgnoreCase(str, "clear history") || equalsIgnoreCase(scom, "variable") || equalsIgnoreCase(scom, "function") || equalsIgnoreCase(scom, "set") || equalsIgnoreCase(scom, "save") || equalsIgnoreCase(scom, "store") || equalsIgnoreCase(scom, "swap") || equalsIgnoreCase(scom, "delete") || equalsIgnoreCase(scom, "keep") || equalsIgnoreCase(scom, "unkeep") || equalsIgnoreCase(scom, "assume") || equalsIgnoreCase(scom, "base") || equalsIgnoreCase(scom, "rpn") || equalsIgnoreCase(scom, "move") || equalsIgnoreCase(scom, "rotate") || equalsIgnoreCase(scom, "copy") || equalsIgnoreCase(scom, "pop") || equalsIgnoreCase(scom, "convert") || (equalsIgnoreCase(scom, "to") && scom != "to") || equalsIgnoreCase(scom, "list") || equalsIgnoreCase(scom, "find") || equalsIgnoreCase(scom, "info") || equalsIgnoreCase(scom, "help")) str.insert(0, 1, '/'); if(!str.empty() && str[0] == '#') { if(str.length() == 1) { str = ""; } else if(str[1] != '#') { str.insert(0, 1, '#'); } } if(!str.empty()) calculateExpression(true, false, OPERATION_ADD, NULL, false, 0, "", str, false); } expressionEdit->clear(); expressionEdit->setExpressionHasChanged(true); if(parsed_mstruct) parsed_mstruct->clear(); if(parsed_tostruct) parsed_tostruct->setUndefined(); matrix_mstruct.clear(); expressionEdit->blockUndo(false); expressionEdit->blockCompletion(false); expressionEdit->blockParseStatus(false); block_expression_history = false; settings->rpn_mode = rpn_save; previous_expression = ""; if(mstruct) { if(settings->rpn_mode) { mstruct->unref(); mstruct = CALCULATOR->getRPNRegister(1); if(!mstruct) mstruct = new MathStructure(); else mstruct->ref(); } else { mstruct->clear(); } } updateInsertFunctionDialogs(); qfile.close(); } void QalculateWindow::convertToUnit(Unit *u) { executeCommand(COMMAND_CONVERT_UNIT, true, "", u); } void QalculateWindow::normalModeActivated() { settings->rpn_mode = false; settings->chain_mode = false; rpnDock->hide(); CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); updateInsertFunctionDialogs(); } void QalculateWindow::onRPNVisibilityChanged(bool b) { if(settings->rpn_mode != b) { if(b) { settings->rpn_mode = true; settings->chain_mode = false; if(!settings->rpn_shown) { rpnDock->blockSignals(true); rpnDock->hide(); rpnDock->setFloating(true); settings->rpn_shown = true; rpnDock->resize(rpnDock->sizeHint()); rpnDock->show(); rpnDock->blockSignals(false); } QAction *w = findChild("action_rpnmode"); if(w) w->setChecked(true); toAction_t->setEnabled(settings->useColoredIcon(this)); updateInsertFunctionDialogs(); } } } void QalculateWindow::onRPNClosed() { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } void QalculateWindow::rpnModeActivated() { if(settings->rpn_mode) { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } else { settings->rpn_mode = true; settings->chain_mode = false; if(!settings->rpn_shown) {rpnDock->setFloating(true); settings->rpn_shown = true;} rpnDock->show(); rpnDock->raise(); toAction_t->setEnabled(settings->useColoredIcon(this)); updateInsertFunctionDialogs(); } } void QalculateWindow::chainModeActivated() { if(settings->chain_mode) { normalModeActivated(); QAction *w = findChild("action_normalmode"); if(w) w->setChecked(true); } else { settings->rpn_mode = false; settings->chain_mode = true; rpnDock->hide(); CALCULATOR->clearRPNStack(); rpnView->clear(); rpnView->setRowCount(0); updateInsertFunctionDialogs(); } } void QalculateWindow::checkVersion() { settings->checkVersion(true, this); } void QalculateWindow::reportBug() { QDesktopServices::openUrl(QUrl("https://github.com/Qalculate/qalculate-qt/issues")); } void QalculateWindow::help() { QDesktopServices::openUrl(QUrl("https://qalculate.github.io/manual/index.html")); } void QalculateWindow::loadInitialHistory() { historyView->loadInitial(); } void QalculateWindow::loadWorkspace(const QString &filename) { bool rpn_mode_prev = settings->rpn_mode; bool chain_mode_prev = settings->chain_mode; if(settings->loadWorkspace(filename.toLocal8Bit().data())) { mstruct->unref(); mstruct = new MathStructure(); mstruct_exact.setUndefined(); parsed_mstruct->clear(); expressionEdit->clear(); historyView->loadInitial(); if(expressionEdit->completionInitialized()) expressionEdit->updateCompletion(); if(functionsDialog) functionsDialog->updateFunctions(); if(unitsDialog) unitsDialog->updateUnits(); if(variablesDialog) variablesDialog->updateVariables(); if(datasetsDialog) datasetsDialog->updateDatasets(); functionsMenu->clear(); unitsMenu->clear(); variablesMenu->clear(); keypad->updateBase(); keypad->updateSymbols(); if(settings->show_keypad >= 0 && settings->show_keypad != keypadDock->isVisible()) keypadAction->trigger(); onBasesActivated(settings->show_bases > 0); QAction *action = find_child_data(this, "group_keypad", settings->show_keypad == 0 ? -1 : settings->keypad_type); if(action) action->setChecked(true); showNumpadAction->setChecked(!settings->hide_numpad); showCustomKeypadColumnAction->setChecked(settings->show_custom_keypad_column); keypad->setKeypadType(settings->keypad_type); updateKeypadTitle(); keypad->hideNumpad(settings->hide_numpad); keypad->showCustomButtonColumn(settings->show_custom_keypad_column); nKeypadAction->setEnabled(settings->hide_numpad); if(preferencesDialog) { preferencesDialog->hide(); preferencesDialog->deleteLater(); preferencesDialog = NULL; } if(settings->rpn_mode != rpn_mode_prev || settings->chain_mode != chain_mode_prev) { if(settings->rpn_mode) action = findChild("action_rpnmode"); else if(settings->chain_mode) action = findChild("action_chainmode"); else action = findChild("action_normalmode"); if(action) action->setChecked(true); if(settings->rpn_mode) rpnModeActivated(); else if(settings->chain_mode) chainModeActivated(); else normalModeActivated(); } action = find_child_data(this, "group_outbase", settings->printops.base); if(!action) action = customOutputBaseAction; if(action) action->setChecked(true); if(action == customOutputBaseAction) customOutputBaseEdit->setValue(settings->printops.base == BASE_CUSTOM ? CALCULATOR->customOutputBase().intValue() : settings->printops.base); action = find_child_data(this, "group_inbase", settings->evalops.parse_options.base); if(!action) action = customInputBaseAction; if(action) action->setChecked(true); if(action == customInputBaseAction) customInputBaseEdit->setValue(settings->evalops.parse_options.base == BASE_CUSTOM ? CALCULATOR->customInputBase().intValue() : settings->evalops.parse_options.base); action = find_child_data(this, "group_general", settings->printops.min_exp); if(action) action->setChecked(true); QSpinBox *w = findChild("spinbox_precision"); if(w) { w->blockSignals(true); w->setValue(CALCULATOR->getPrecision()); w->blockSignals(false); } settings->setCustomAngleUnit(); action = find_child_data(this, "group_type", CALCULATOR->defaultAssumptions()->type()); if(action) action->setChecked(true); action = find_child_data(this, "group_sign", CALCULATOR->defaultAssumptions()->sign()); if(action) action->setChecked(true); if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM && !CALCULATOR->customAngleUnit()) settings->evalops.parse_options.angle_unit = ANGLE_UNIT_NONE; if(settings->evalops.parse_options.angle_unit == ANGLE_UNIT_CUSTOM) { action = findChild("action_angle_unit" + QString::fromStdString(CALCULATOR->customAngleUnit()->referenceName())); } else { action = find_child_data(this, "group_angleunit", settings->evalops.parse_options.angle_unit); } if(action) action->setChecked(true); action = NULL; if(settings->dual_approximation < 0) action = findChild("action_autoappr"); else if(settings->dual_approximation > 0) action = findChild("action_dualappr"); else if(settings->evalops.approximation == APPROXIMATION_EXACT) action = findChild("action_exact"); else if(settings->evalops.approximation == APPROXIMATION_TRY_EXACT) action = findChild("action_approximate"); else if(settings->evalops.approximation == APPROXIMATION_APPROXIMATE) action = findChild("action_approximate"); if(action) { action->setChecked(true); } w = findChild("spinbox_maxdecimals"); if(w) { w->blockSignals(true); w->setValue(!settings->printops.use_max_decimals || settings->printops.max_decimals < 0 ? -1 : settings->printops.max_decimals); w->blockSignals(false); } w = findChild("spinbox_mindecimals"); if(w) { w->blockSignals(true); w->setValue(!settings->printops.use_min_decimals || settings->printops.min_decimals < 0 ? 0 : settings->printops.min_decimals); w->blockSignals(false); } updateWSActions(); updateWindowTitle(); workspace_changed = false; } else { QMessageBox::critical(this, tr("Error"), tr("Failed to open workspace"), QMessageBox::Ok); } } void QalculateWindow::saveWorkspaceAs() { while(true) { QString str = QFileDialog::getSaveFileName(this); if(str.isEmpty()) break; settings->show_bases = basesDock->isVisible(); if(settings->saveWorkspace(str.toLocal8Bit().data())) { workspace_changed = false; updateWSActions(); break; } else { QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Ok); } } } void QalculateWindow::saveWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->saveWorkspace(settings->current_workspace.c_str())) { workspace_changed = false; updateWSActions(); } else { QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Ok); } } int QalculateWindow::askSaveWorkspace() { if(!workspace_changed) return true; bool b_noask = settings->save_workspace >= 0; int b = 0; if(b_noask) { if(settings->save_workspace > 0) b = QMessageBox::Yes; else b = QMessageBox::No; } else { QMessageBox *dialog = new QMessageBox(QMessageBox::Question, tr("Save file?"), tr("Do you want to save the current workspace?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this); dialog->setCheckBox(new QCheckBox(tr("Do not ask again"))); b = dialog->exec(); b_noask = dialog->checkBox()->isChecked(); dialog->deleteLater(); } if(b == QMessageBox::Yes) { settings->show_bases = basesDock->isVisible(); while(!settings->saveWorkspace(settings->current_workspace.c_str())) { int answer = QMessageBox::critical(this, tr("Error"), tr("Couldn't save workspace"), QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Cancel); if(answer == QMessageBox::Ignore) return 0; else if(answer == QMessageBox::Cancel) return -1; } workspace_changed = false; if(b_noask) settings->save_workspace = 1; return 1; } else if(b == QMessageBox::Cancel) { return -1; } if(b_noask) settings->save_workspace = 0; return 0; } void QalculateWindow::openRecentWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->current_workspace.empty()) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); if(settings->savePreferences() < 0) return; } else { if(askSaveWorkspace() < 0) return; } loadWorkspace(qobject_cast(sender())->data().toString()); updateWSActions(); } void QalculateWindow::openWorkspace() { settings->show_bases = basesDock->isVisible(); if(settings->current_workspace.empty()) { settings->window_state = saveState(); if(height() != DEFAULT_HEIGHT || width() != DEFAULT_WIDTH) settings->window_geometry = saveGeometry(); else settings->window_geometry = QByteArray(); settings->splitter_state = ehSplitter->saveState(); if(settings->savePreferences() < 0) return; } else { if(askSaveWorkspace() < 0) return; } QString str = QFileDialog::getOpenFileName(this); if(!str.isEmpty()) { loadWorkspace(str); } updateWSActions(); } void QalculateWindow::openDefaultWorkspace() { if(askSaveWorkspace() < 0) return; loadWorkspace(QString()); workspace_changed = false; updateWSActions(); } void QalculateWindow::updateWSActions() { saveWSAction->setEnabled(!settings->current_workspace.empty()); defaultWSAction->setEnabled(!settings->current_workspace.empty()); if(settings->recent_workspaces.empty() && recentWSSeparator) { recentWSMenu->removeAction(recentWSSeparator); recentWSSeparator = NULL; } for(int i = 0; i < recentWSAction.count(); i++) { recentWSMenu->removeAction(recentWSAction.at(i)); } recentWSAction.clear(); if(!settings->recent_workspaces.empty() && !recentWSSeparator) { recentWSSeparator = recentWSMenu->addSeparator(); } for(size_t i = settings->recent_workspaces.size(); i > 0; i--) { std::string str = (settings->recent_workspaces[i - 1]); #ifdef _WIN32 size_t index = str.rfind('\\'); #else size_t index = str.rfind('/'); #endif if(index != std::string::npos) str = str.substr(index + 1); recentWSAction << recentWSMenu->addAction(QString::fromStdString(str), this, SLOT(openRecentWorkspace())); recentWSAction.last()->setData(QString::fromStdString(settings->recent_workspaces[i - 1])); } } qalculate-qt-5.11.0/src/qalculatewindow.h000066400000000000000000000351451520501070600203420ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef QALCULATE_WINDOW_H #define QALCULATE_WINDOW_H #include #include #include #include #include #include #include #include class QLocalSocket; class QLocalServer; class QCommandLineParser; class ExpressionEdit; class HistoryView; class QSplitter; class QLabel; class KeypadWidget; class QAction; class QToolBar; class QTextEdit; class QTimer; class PreferencesDialog; class FunctionsDialog; class DataSetsDialog; class VariablesDialog; class UnitsDialog; class FPConversionDialog; class PercentageCalculationDialog; class PlotDialog; class PeriodicTableDialog; class CalendarConversionDialog; class QTableWidget; class QMenu; class QTreeWidget; class QTreeWidgetItem; class QPushButton; class QLineEdit; class QLabel; class QDialog; class QComboBox; struct FunctionDialog; struct keyboard_shortcut; class QalculateWindow : public QMainWindow { Q_OBJECT public: QalculateWindow(); virtual ~QalculateWindow(); void setCommandLineParser(QCommandLineParser*); bool displayMessages(); void updateWindowTitleResult(const std::string &str); bool updateWindowTitle(const QString &str = QString(), bool is_result = false, bool type_change = false); void executeFromFile(const QString&); void initFinished(); protected: QLocalSocket *socket; QLocalServer *server; QCommandLineParser *parser; Thread *viewThread, *commandThread; ExpressionEdit *expressionEdit; HistoryView *historyView; QSplitter *ehSplitter; QLabel *statusLabelLeft, *statusLabelRight; PreferencesDialog *preferencesDialog; DataSetsDialog *datasetsDialog; FunctionsDialog *functionsDialog; VariablesDialog *variablesDialog; UnitsDialog *unitsDialog; FPConversionDialog *fpConversionDialog; PercentageCalculationDialog *percentageDialog; PlotDialog *plotDialog; PeriodicTableDialog *periodicTableDialog; CalendarConversionDialog *calendarConversionDialog; QDialog *shortcutsDialog, *shortcutActionDialog; QComboBox *shortcutActionValueEdit; QTreeWidget *shortcutActionList; QLabel *shortcutActionValueLabel; QTreeWidget *shortcutList; QPushButton *addShortcutButton, *editShortcutButton, *removeShortcutButton, *shortcutActionOKButton, *shortcutActionAddButton; keyboard_shortcut *edited_keyboard_shortcut; QList functionDialogs; KeypadWidget *keypad; QDockWidget *keypadDock, *basesDock, *rpnDock; QLabel *binEdit, *octEdit, *decEdit, *hexEdit; QLabel *binLabel, *octLabel, *decLabel, *hexLabel; QToolBar *tb; QToolButton *menuAction_t, *modeAction_t, *keypadAction_t, *storeAction_t, *functionsAction_t, *unitsAction_t, *toAction_t; QMenu *tmenu, *basesMenu; QAction *plotAction_t, *basesAction, *customOutputBaseAction, *customInputBaseAction, *newVariableAction, *newFunctionAction, *variablesAction, *functionsAction, *unitsAction, *datasetsAction, *plotAction, *fpAction, *calendarsAction, *percentageAction, *periodicTableAction, *exratesAction, *quitAction, *helpAction, *keypadAction, *rpnAction, *chainAction, *gKeypadAction, *pKeypadAction, *xKeypadAction, *cKeypadAction, *nKeypadAction, *showNumpadAction, *showCustomKeypadColumnAction, *resetKeypadPositionAction, *radAction, *degAction, *graAction, *normalAction, *sciAction, *engAction, *simpleAction, *copyBasesAction, *tbAction; QMenu *recentVariablesMenu, *favouriteVariablesMenu, *variablesMenu, *functionsMenu, *recentFunctionsMenu, *favouriteFunctionsMenu, *unitsMenu, *recentUnitsMenu, *favouriteUnitsMenu, *angleMenu, *toMenu; QAction *assumptionTypeActions[5], *assumptionSignActions[6]; QMenu *recentWSMenu; QAction *recentWSSeparator, *openWSAction, *defaultWSAction, *saveWSAction, *saveWSAsAction; QAction *firstFunctionsMenuOptionAction, *firstVariablesMenuOptionAction, *firstUnitsMenuOptionAction; QList recentWSAction, recentVariableActions, favouriteVariableActions, recentFunctionActions, favouriteFunctionActions, recentUnitActions, favouriteUnitActions; QSpinBox *customOutputBaseEdit, *customInputBaseEdit, *minDecimalsEdit, *maxDecimalsEdit; QTimer *ecTimer, *rfTimer, *autoCalculateTimer, *decimalsTimer, *resizeTimer, *emhTimer, *testTimer; qint64 prev_test_time; int prev_test_type; QTableWidget *rpnView; QAction *rpnUpAction, *rpnDownAction, *rpnSwapAction, *rpnCopyAction, *rpnLastxAction, *rpnDeleteAction, *rpnClearAction; bool send_event; bool workspace_changed; bool init_in_progress; void calculateExpression(bool force = true, bool do_mathoperation = false, MathOperation op = OPERATION_ADD, MathFunction *f = NULL, bool do_stack = false, size_t stack_index = 0, std::string execute_str = std::string(), std::string str = std::string(), bool check_exrates = true, bool calculate_selection = false); void setResult(Prefix *prefix = NULL, bool update_history = true, bool update_parse = false, bool force = false, std::string transformation = "", bool do_stack = false, size_t stack_index = 0, bool register_moved = false, bool supress_dialog = false, bool calculate_selection = false); void executeCommand(int command_type, bool show_result = true, std::string ceu_str = "", Unit *u = NULL, int run = 1); void changeEvent(QEvent *e) override; void resizeEvent(QResizeEvent *e) override; bool warnAssumptions(MathStructure&, bool = false); bool askTC(MathStructure&, bool = false); bool askSinc(MathStructure&, bool = false); bool askDot(const std::string&, bool = false); bool askImplicit(); bool askPercent(bool = false); void keyPressEvent(QKeyEvent*) override; bool eventFilter(QObject*, QEvent*) override; void closeEvent(QCloseEvent*) override; void setPreviousExpression(); void setOption(std::string); void updateResultBases(); void calculateRPN(MathFunction*); void RPNRegisterAdded(std::string, int = 0); void RPNRegisterRemoved(int); void RPNRegisterChanged(std::string, int); void triggerShortcut(int, const std::string&); void loadShortcuts(); bool editKeyboardShortcut(keyboard_shortcut*, keyboard_shortcut* = NULL, int = 0); void loadWorkspace(const QString &filename); void updateWSActions(); int askSaveWorkspace(); void beforeShowDockCleanUp(QDockWidget*); void beforeShowDock(QDockWidget*, bool); void afterShowDock(QDockWidget*); void updateInsertFunctionDialogs(); void updateStatusText(); protected slots: void testTimeout(); void updateBinEditSize(QFont* = NULL); void onBinaryBitsChanged(); void onTwosChanged(); void onSymbolClicked(const QString&); void onOperatorClicked(const QString&); void onFunctionClicked(MathFunction*); void onVariableClicked(Variable*); void onUnitClicked(Unit*); void onPrefixClicked(Prefix*); void onClearClicked(); void onDelClicked(); void onEqualsClicked(); void onParenthesesClicked(); void onBracketsClicked(); void onBackspaceClicked(); void onLeftClicked(); void onRightClicked(); void onStartClicked(); void onEndClicked(); void onMSClicked(); void onMRClicked(); void onMCClicked(); void onMPlusClicked(); void onMMinusClicked(); void onAnswerClicked(); void onBaseClicked(int, bool, bool); void onFactorizeClicked(); void onExpandClicked(); void onExpandPartialFractionsClicked(); void onToActivated(bool = true); void onToActivatedAlt(); void onStoreActivated(); void keypadTypeActivated(); void showNumpad(bool); void showCustomKeypadColumn(bool); void showSeparateKeypadMenuButtons(bool); void resetKeypadPosition(); void onEMHTimeout(); void onResizeTimeout(); void onKeypadVisibilityChanged(bool); void onToolbarVisibilityChanged(bool); void onBasesActivated(bool); void onBasesVisibilityChanged(bool); void onRPNVisibilityChanged(bool); void onRPNClosed(); void onExpressionChanged(); void onHistoryReloaded(); void onStatusChanged(QString, bool, bool, bool, bool); void autoCalculateTimeout(); void onToConversionRequested(std::string); void onInsertTextRequested(std::string); void onInsertValueRequested(int); void onAlwaysOnTopChanged(); void onEnableTooltipsChanged(); void onPreferencesClosed(); void onTitleTypeChanged(); void onResultFontChanged(); void onExpressionFontChanged(); void onStatusFontChanged(); void onKeypadFontChanged(); void onAppFontChanged(); void onAppFontTimer(); void fixSplitterPos(); void angleUnitActivated(); void normalActivated(); void scientificActivated(); void engineeringActivated(); void simpleActivated(); void onPrecisionChanged(int); void syncDecimals(); void onMinDecimalsChanged(int); void onMaxDecimalsChanged(int); void outputBaseActivated(); void onCustomOutputBaseChanged(int); void inputBaseActivated(); void onCustomInputBaseChanged(int); void assumptionsTypeActivated(); void assumptionsSignActivated(); void approximationActivated(); void openCalendarConversion(); void onInsertFunctionExec(); void onInsertFunctionInsertRPN(); void onInsertFunctionKeepOpen(bool); void onInsertFunctionClosed(); void onInsertFunctionChanged(); void onInsertFunctionEntryActivated(); void insertFunctionDo(FunctionDialog*); void onEntrySelectFile(); void onEntryEditMatrix(); void onCalculateFunctionRequested(MathFunction*); void onInsertFunctionRequested(MathFunction*); void onUnitActivated(Unit *u); void onUnitRemoved(Unit*); void onVariableRemoved(Variable*); void onUnitDeactivated(Unit*); void onVariableDeactivated(Variable*); void normalModeActivated(); void rpnModeActivated(); void chainModeActivated(); void registerUp(); void registerDown(); void registerSwap(); void copyRegister(); void rpnLastX(); void deleteRegister(); void clearStack(); void registerChanged(int); void calculateRPN(int); void approximateResult(); void toggleResultFraction(); void onExpressionStatusModeChanged(bool = true); void functionActivated(); void unitActivated(); void prefixActivated(); void variableActivated(); void updateAngleUnitsMenu(); void initializeFunctionsMenu(); void initializeVariablesMenu(); void initializeUnitsMenu(); void updateFunctionsMenu(); void useFunctionDialog(bool); void showAllFunctions(bool); void updateFavouriteFunctions(); void updateRecentFunctions(); void addToRecentFunctions(MathFunction*); void updateUnitsMenu(); void addCurrencyFlagsToMenu(); void showAllUnits(bool); void updateFavouriteUnits(); void updateRecentUnits(); void addToRecentUnits(Unit*); void updateVariablesMenu(); void showAllVariables(bool); void updateFavouriteVariables(); void updateRecentVariables(); void addToRecentVariables(Variable*); void shortcutActivated(); void shortcutClicked(int, const QString&); void keyboardShortcutAdded(keyboard_shortcut *ks); void keyboardShortcutRemoved(keyboard_shortcut *ks); void addShortcutClicked(); void editShortcutClicked(); void removeShortcutClicked(); void shortcutActionOKClicked(); void shortcutActionAddClicked(); void updateShortcutActionOK(); void currentShortcutActionChanged(); void currentShortcutChanged(QTreeWidgetItem*, QTreeWidgetItem*); void shortcutDoubleClicked(QTreeWidgetItem*, int); void saveWorkspace(); void saveWorkspaceAs(); void openWorkspace(); void openDefaultWorkspace(); void openRecentWorkspace(); void onColorSchemeChanged(); void showToolbarContextMenu(const QPoint&); void setToolbarStyle(); void showKeypadContextMenu(const QPoint&); void updateKeypadTitle(); void keypadPreferencesChanged(); void resultBasesLinkActivated(const QString&); void showBasesContextMenu(const QPoint&); void copyBases(); void onExpressionPositionChanged(); void onShowStatusBarChanged(); public slots: void serverNewConnection(); void socketReadyRead(); void calculate(); void calculate(const QString&); void calculateSelection(); void onActivateRequested(const QStringList&, const QString&); void abort(); void abortCommand(); void fetchExchangeRates(); void showAbout(); void expressionCalculationUpdated(int delay = 0); void resultFormatUpdated(int delay = 0); void resultDisplayUpdated(); void expressionObjectsUpdated(); void expressionFormatUpdated(bool); void insertFunction(MathFunction*, QWidget* = NULL); void newVariable(); void newUnit(); void newMatrix(); void newUnknown(); void newFunction(); void convertToUnit(Unit*); void importCSV(); void exportCSV(); void editKeyboardShortcuts(); void editPreferences(); void openSettingsFolder(); void onDatasetsChanged(); void onFunctionsChanged(); void insertProperty(DataObject*, DataProperty*); void openDatasets(); void openFunctions(); void resetUnitsAndVariablesMenus(); void openUnits(); void openVariables(); void applyFunction(MathFunction*); void openFPConversion(); void openPercentageCalculation(); void openPlot(); void openPeriodicTable(); void negate(); void checkVersion(); void reportBug(); void help(); void loadInitialHistory(); void startTest(); signals: }; class QalculateTranslator : public QTranslator { Q_OBJECT public: QalculateTranslator(); QString translate(const char *context, const char *sourceText, const char *disambiguation = NULL, int n = -1) const; }; class MathSpinBox : public QSpinBox { Q_OBJECT public: MathSpinBox(QWidget *parent = NULL); virtual ~MathSpinBox(); QLineEdit *entry() const; protected: int valueFromText(const QString &text) const override; QValidator::State validate(QString &text, int &pos) const override; void keyPressEvent(QKeyEvent *event) override; signals: void returnPressed(); }; class QalculateDockWidget : public QDockWidget { Q_OBJECT; public: QalculateDockWidget(const QString &name, QWidget *parent, ExpressionEdit *editwidget); QalculateDockWidget(QWidget *parent, ExpressionEdit *editwidget); virtual ~QalculateDockWidget(); protected: ExpressionEdit *expressionEdit; void keyPressEvent(QKeyEvent *e) override; void closeEvent(QCloseEvent *e) override; signals: void dockClosed(); }; class QalculateToolButton : public QToolButton { Q_OBJECT public: QalculateToolButton(QWidget *parent = NULL); ~QalculateToolButton(); protected: QTimer *longPressTimer; bool b_longpress; void mouseReleaseEvent(QMouseEvent*) override; void mousePressEvent(QMouseEvent*) override; protected slots: void longPressTimeout(); signals: void middleButtonClicked(); }; #endif //QALCULATE_WINDOW_H qalculate-qt-5.11.0/src/uniteditdialog.cpp000066400000000000000000000514351520501070600204770ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "uniteditdialog.h" #include "functioneditdialog.h" UnitEditDialog::UnitEditDialog(QWidget *parent) : QDialog(parent) { o_unit = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); tabs->addTab(w1, tr("General")); tabs->addTab(w2, tr("Relation")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); namesAction = nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition); connect(namesAction, SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); grid->addWidget(new QLabel(tr("Category:"), this), 1, 0); categoryEdit = new QComboBox(this); QMap hash; for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(!CALCULATOR->units[i]->category().empty()) { if(hash.find(CALCULATOR->units[i]->category()) == hash.end()) { hash[CALCULATOR->units[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString()); grid->addWidget(categoryEdit, 1, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 2, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 2, 1); grid->addWidget(new QLabel(tr("System:"), this), 3, 0); systemEdit = new QComboBox(this); systemEdit->addItem("SI"); systemEdit->addItem("CGS"); systemEdit->addItem(tr("Imperial")); systemEdit->addItem(tr("US Survey")); systemEdit->setEditable(true); systemEdit->setCurrentText(QString()); grid->addWidget(systemEdit, 3, 1); hideBox = new QCheckBox(tr("Hide unit"), this); grid->addWidget(hideBox, 4, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Description:"), this), 5, 0, 1, 2); descriptionEdit = new SmallTextEdit(2, this); grid->addWidget(descriptionEdit, 6, 0, 1, 2); grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Class:"), this), 0, 0); typeCombo = new QComboBox(this); typeCombo->setToolTip("
" + tr("The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units.") + "
"); typeCombo->setEditable(false); typeCombo->addItem(tr("Base unit")); typeCombo->addItem(tr("Named derived unit")); typeCombo->addItem(tr("Derived unit")); typeCombo->setCurrentIndex(0); grid->addWidget(typeCombo, 0, 1); baseLabel = new QLabel(tr("Base unit(s):"), this); grid->addWidget(baseLabel, 1, 0); baseEdit = new MathLineEdit(this, true); baseEdit->setToolTip("
" + tr("Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to") + "
"); grid->addWidget(baseEdit, 1, 1); exponentLabel = new QLabel(tr("Exponent:"), this); grid->addWidget(exponentLabel, 2, 0); exponentEdit = new QSpinBox(this); exponentEdit->setRange(-9, 9); exponentEdit->setValue(1); grid->addWidget(exponentEdit, 2, 1); relationLabel = new QLabel(tr("Relation:"), this); grid->addWidget(relationLabel, 3, 0); relationEdit = new MathLineEdit(this); relationEdit->setToolTip("
" + tr("Relation to the base unit. For linear relations this should just be a number.

For non-linear relations use \\x for the factor and \\y for the exponent (e.g. \"\\x + 273.15\" for the relation between degrees Celsius and Kelvin).") + "
"); grid->addWidget(relationEdit, 3, 1); inverseLabel = new QLabel(tr("Inverse relation:"), this); grid->addWidget(inverseLabel, 4, 0); inverseEdit = new MathLineEdit(this); inverseEdit->setToolTip(tr("Specify for non-linear relation, for conversion back to the base unit.")); grid->addWidget(inverseEdit, 4, 1); mixBox = new QCheckBox(tr("Mix with base unit"), this); grid->addWidget(mixBox, 5, 0, 1, 2, Qt::AlignLeft); priorityLabel = new QLabel(tr("Priority:"), this); grid->addWidget(priorityLabel, 6, 0); priorityEdit = new QSpinBox(this); priorityEdit->setToolTip(tr("Example: priority of the unit \"hand\" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in \"17 in = 1 ft + 5 in\", instead of \"17 in = 1 ft + 1 hand + 1 in\".")); priorityEdit->setRange(1, 100); priorityEdit->setValue(1); grid->addWidget(priorityEdit, 6, 1); mbunLabel = new QLabel(tr("Minimum base unit number:"), this); grid->addWidget(mbunLabel, 7, 0); mbunEdit = new QSpinBox(this); mbunEdit->setToolTip(tr("Example: minimum base unit number of yd (yard) is set to 12, which results in \"3 × 3 ft = 9 ft\" (instead of \"3 yd\") and \"4 × 3 ft = 4 yd\".")); mbunEdit->setRange(1, 100000); mbunEdit->setValue(1); grid->addWidget(mbunEdit, 7, 1); prefixBox = new QCheckBox(tr("Use with prefixes by default"), this); grid->addWidget(prefixBox, 8, 0, 1, 2, Qt::AlignLeft); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); typeChanged(0); nameEdit->setFocus(); connect(priorityEdit, SIGNAL(valueChanged(int)), this, SLOT(onUnitChanged())); connect(exponentEdit, SIGNAL(valueChanged(int)), this, SLOT(exponentChanged(int))); connect(mbunEdit, SIGNAL(valueChanged(int)), this, SLOT(onUnitChanged())); connect(prefixBox, SIGNAL(toggled(bool)), this, SLOT(onUnitChanged())); connect(mixBox, SIGNAL(toggled(bool)), this, SLOT(onUnitChanged())); connect(mixBox, SIGNAL(toggled(bool)), priorityEdit, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), mbunEdit, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), priorityLabel, SLOT(setEnabled(bool))); connect(mixBox, SIGNAL(toggled(bool)), mbunLabel, SLOT(setEnabled(bool))); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(typeChanged(int))); connect(typeCombo, SIGNAL(activated(int)), this, SLOT(onUnitChanged())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onUnitChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onUnitChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(relationEdit, SIGNAL(textEdited(const QString&)), this, SLOT(relationChanged(const QString&))); connect(inverseEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(baseEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onUnitChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(onUnitChanged())); connect(systemEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(systemChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } UnitEditDialog::~UnitEditDialog() {} void UnitEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_UNIT, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_unit, nameEdit->text()); } else { namesEditDialog->setName(nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onUnitChanged(); } Unit *UnitEditDialog::createUnit(ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Unit *unit = NULL; Unit *bu = NULL; if(typeCombo->currentIndex() == 1) { bu = CALCULATOR->getUnit(baseEdit->text().trimmed().toStdString()); if(!bu) bu = CALCULATOR->getCompositeUnit(baseEdit->text().trimmed().toStdString()); if(!bu) { tabs->setCurrentIndex(1); baseEdit->setFocus(); QMessageBox::critical(this, tr("Error"), tr("Base unit does not exist."), QMessageBox::Ok); return NULL; } } if(CALCULATOR->unitNameTaken(nameEdit->text().trimmed().toStdString())) { unit = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!unit || unit->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!unit) *replaced_item = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = unit; } } Unit *u = NULL; if(unit && unit->isLocal()) { unit->clearNames(); return modifyUnit(unit); } if(typeCombo->currentIndex() == 1) { u = new AliasUnit("", "", "", "", "", bu, settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString()), exponentEdit->value(), settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()), true); if(mixBox->isChecked()) { ((AliasUnit*) u)->setMixWithBase(priorityEdit->value()); ((AliasUnit*) u)->setMixWithBaseMinimum(mbunEdit->value()); } } else if(typeCombo->currentIndex() == 2) { u = new CompositeUnit("", "", "", settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString()), true); } else { u = new Unit(); } if(namesEditDialog && typeCombo->currentIndex() != 2) { namesEditDialog->modifyNames(u, nameEdit->text()); } else { NamesEditDialog::modifyName(u, nameEdit->text()); } u->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); u->setTitle(titleEdit->text().trimmed().toStdString()); u->setCategory(categoryEdit->currentText().trimmed().toStdString()); u->setSystem(systemEdit->currentText().trimmed().toStdString()); u->setHidden(hideBox->isChecked()); if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u->setUseWithPrefixesByDefault(prefixBox->isChecked()); } u->setChanged(false); CALCULATOR->addUnit(u); return u; } Unit *UnitEditDialog::modifyUnit(Unit *u, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Unit *bu = NULL; if(typeCombo->currentIndex() == 1) { bu = CALCULATOR->getUnit(baseEdit->text().trimmed().toStdString()); if(!bu) bu = CALCULATOR->getCompositeUnit(baseEdit->text().trimmed().toStdString()); if(!bu || bu == u) { tabs->setCurrentIndex(1); baseEdit->setFocus(); QMessageBox::critical(this, tr("Error"), tr("Base unit does not exist."), QMessageBox::Ok); return NULL; } } if(CALCULATOR->unitNameTaken(nameEdit->text().trimmed().toStdString(), u)) { Unit *unit = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!unit || unit->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!unit) *replaced_item = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); else if(unit != u) *replaced_item = unit; } } Unit *old_u = u; switch(typeCombo->currentIndex()) { case 1: { AliasUnit *au; if(u->subtype() != SUBTYPE_ALIAS_UNIT) { au = new AliasUnit("", "", "", "", "", bu, settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString()), exponentEdit->value(), settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()), true); u = au; } else { au = (AliasUnit*) u; au->setBaseUnit(bu); au->setExpression(settings->unlocalizeExpression(relationEdit->text().trimmed().toStdString())); au->setInverseExpression(au->hasNonlinearExpression() ? settings->unlocalizeExpression(inverseEdit->text().trimmed().toStdString()) : ""); au->setExponent(exponentEdit->value()); } if(mixBox->isChecked()) { ((AliasUnit*) u)->setMixWithBase(priorityEdit->value()); ((AliasUnit*) u)->setMixWithBaseMinimum(mbunEdit->value()); } else { ((AliasUnit*) u)->setMixWithBase(0); } break; } case 2: { if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u = new CompositeUnit("", "", "", settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString()), true); } else { ((CompositeUnit*) u)->setBaseExpression(settings->unlocalizeExpression(baseEdit->text().trimmed().toStdString())); } break; } default: { if(u->subtype() != SUBTYPE_BASE_UNIT) { u = new Unit(); } break; } } if(typeCombo->currentIndex() == 2) { u->clearNames(); NamesEditDialog::modifyName(u, nameEdit->text()); } else if(namesEditDialog) { namesEditDialog->modifyNames(u, nameEdit->text()); } else { if(old_u != u) u->set(old_u); NamesEditDialog::modifyName(u, nameEdit->text()); } u->setApproximate(false); u->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); u->setTitle(titleEdit->text().trimmed().toStdString()); u->setCategory(categoryEdit->currentText().trimmed().toStdString()); u->setSystem(systemEdit->currentText().trimmed().toStdString()); u->setHidden(hideBox->isChecked()); if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { u->setUseWithPrefixesByDefault(prefixBox->isChecked()); } if(u != old_u) { old_u->destroy(); u->setChanged(false); CALCULATOR->addUnit(u); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { if(CALCULATOR->units[i]->subtype() == SUBTYPE_ALIAS_UNIT && ((AliasUnit*) CALCULATOR->units[i])->firstBaseUnit() == old_u) { ((AliasUnit*) CALCULATOR->units[i])->setBaseUnit(u); } else if(CALCULATOR->units[i]->subtype() == SUBTYPE_COMPOSITE_UNIT) { size_t i2 = ((CompositeUnit*) CALCULATOR->units[i])->find(old_u); if(i2 > 0) { int exp = 1; Prefix *p = NULL; ((CompositeUnit*) CALCULATOR->units[i])->get(i2, &exp, &p); ((CompositeUnit*) CALCULATOR->units[i])->del(i2); ((CompositeUnit*) CALCULATOR->units[i])->add(u, exp, p); } } } } return u; } void UnitEditDialog::setUnit(Unit *u) { name_edited = false; nameEdit->setText(QString::fromStdString(u->getName(1).name)); if(namesEditDialog) namesEditDialog->setNames(u, nameEdit->text()); o_unit = u; switch(u->subtype()) { case SUBTYPE_BASE_UNIT: { typeCombo->setCurrentIndex(0); typeChanged(0); break; } case SUBTYPE_ALIAS_UNIT: { AliasUnit *au = (AliasUnit*) u; mixBox->setChecked(au->mixWithBase() > 0); baseEdit->setText(QString::fromStdString(au->firstBaseUnit()->preferredInputName(settings->printops.abbreviate_names, true, false, false, &can_display_unicode_string_function, (void*) baseEdit).formattedName(STRUCT_UNIT, true))); exponentEdit->setValue(au->firstBaseExponent()); mbunEdit->setValue(au->mixWithBaseMinimum() > 1 ? au->mixWithBaseMinimum() : 1); priorityEdit->setValue(au->mixWithBase()); typeCombo->setCurrentIndex(1); bool is_relative = false; if(au->uncertainty(&is_relative).empty()) { relationEdit->setText(QString::fromStdString(settings->localizeExpression(au->expression()))); } else if(is_relative) { std::string value = CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY)->referenceName(); value += "("; value += settings->localizeExpression(au->expression()); value += CALCULATOR->getComma(); value += " "; value += settings->localizeExpression(au->uncertainty()); value += CALCULATOR->getComma(); value += " 1)"; relationEdit->setText(QString::fromStdString(value)); } else { relationEdit->setText(QString::fromStdString(settings->localizeExpression(au->expression() + SIGN_PLUSMINUS + au->uncertainty()))); } inverseEdit->setText(QString::fromStdString(settings->localizeExpression(au->inverseExpression()))); break; } case SUBTYPE_COMPOSITE_UNIT: { typeCombo->setCurrentIndex(2); PrintOptions po = settings->printops; po.is_approximate = NULL; po.can_display_unicode_string_arg = (void*) baseEdit; baseEdit->setText(QString::fromStdString(((CompositeUnit*) u)->print(po, false, TAG_TYPE_HTML, true, false))); break; } } prefixBox->setChecked(u->useWithPrefixesByDefault()); exponentEdit->setReadOnly(!u->isLocal()); priorityEdit->setReadOnly(!u->isLocal()); mbunEdit->setReadOnly(!u->isLocal()); nameEdit->setReadOnly(!u->isLocal()); baseEdit->setReadOnly(!u->isLocal()); relationEdit->setReadOnly(!u->isLocal()); inverseEdit->setReadOnly(!u->isLocal()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(u->description())); descriptionEdit->blockSignals(false); titleEdit->setText(QString::fromStdString(u->title(false))); categoryEdit->setCurrentText(QString::fromStdString(u->category())); systemEdit->blockSignals(true); systemEdit->setCurrentText(QString::fromStdString(u->system())); systemEdit->blockSignals(false); descriptionEdit->setReadOnly(!u->isLocal()); titleEdit->setReadOnly(!u->isLocal()); hideBox->setChecked(u->isHidden()); okButton->setEnabled(false); } void UnitEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->unitNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidUnitName(str.trimmed().toStdString()))); } name_edited = true; onUnitChanged(); } void UnitEditDialog::relationChanged(const QString &str) { inverseEdit->setEnabled(str.indexOf("\\x") >= 0); if(!inverseEdit->isEnabled()) inverseEdit->clear(); inverseLabel->setEnabled(inverseEdit->isEnabled()); onUnitChanged(); } void UnitEditDialog::systemChanged(const QString &str) { if(str == "SI" || str == "CGS") { prefixBox->setChecked(true); } } void UnitEditDialog::typeChanged(int i) { baseEdit->setEnabled(i > 0); exponentEdit->setEnabled(i == 1); relationEdit->setEnabled(i == 1); inverseEdit->setEnabled(i == 1 && relationEdit->text().indexOf("\\x") >= 0); mixBox->setEnabled(i == 1 && exponentEdit->value() == 1); if(i != 1 || exponentEdit->value() != 1) mixBox->setChecked(false); if(i == 2) prefixBox->setChecked(false); if(i != 1) { exponentEdit->setValue(1); relationEdit->setText("1"); } if(i == 0) baseEdit->clear(); if(!inverseEdit->isEnabled()) inverseEdit->clear(); priorityEdit->setEnabled(mixBox->isChecked()); mbunEdit->setEnabled(mixBox->isChecked()); prefixBox->setEnabled(i != 2); baseLabel->setEnabled(baseEdit->isEnabled()); exponentLabel->setEnabled(exponentEdit->isEnabled()); relationLabel->setEnabled(relationEdit->isEnabled()); inverseLabel->setEnabled(inverseEdit->isEnabled()); priorityLabel->setEnabled(priorityEdit->isEnabled()); mbunLabel->setEnabled(mbunEdit->isEnabled()); namesAction->setEnabled(i != 2); } void UnitEditDialog::onUnitChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && (typeCombo->currentIndex() == 0 || (!baseEdit->text().trimmed().isEmpty() && (typeCombo->currentIndex() != 1 || !relationEdit->text().trimmed().isEmpty())))); } void UnitEditDialog::exponentChanged(int i) { if(i != 1) { mixBox->setChecked(false); priorityEdit->setEnabled(false); mbunEdit->setEnabled(false); priorityLabel->setEnabled(false); mbunLabel->setEnabled(false); } mixBox->setEnabled(i == 1); onUnitChanged(); } void UnitEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } Unit *UnitEditDialog::editUnit(QWidget *parent, Unit *u, ExpressionItem **replaced_item) { UnitEditDialog *d = new UnitEditDialog(parent); d->setWindowTitle(tr("Edit Unit")); d->setUnit(u); while(d->exec() == QDialog::Accepted) { Unit *u_new = d->modifyUnit(u, replaced_item); if(u_new) { d->deleteLater(); return u_new; } } d->deleteLater(); return NULL; } Unit *UnitEditDialog::newUnit(QWidget *parent, ExpressionItem **replaced_item) { UnitEditDialog *d = new UnitEditDialog(parent); d->setWindowTitle(tr("New Unit")); Unit *u = NULL; while(d->exec() == QDialog::Accepted) { u = d->createUnit(replaced_item); if(u) break; } d->deleteLater(); return u; } qalculate-qt-5.11.0/src/uniteditdialog.h000066400000000000000000000035701520501070600201410ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef UNIT_EDIT_DIALOG_H #define UNIT_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class QComboBox; class QPlainTextEdit; class QSpinBox; class QLabel; class NamesEditDialog; class QTabWidget; class QAction; class UnitEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit, *baseEdit, *relationEdit, *inverseEdit; QComboBox *categoryEdit, *systemEdit, *typeCombo; QCheckBox *hideBox, *mixBox, *prefixBox; QSpinBox *exponentEdit, *priorityEdit, *mbunEdit; QPlainTextEdit *descriptionEdit; QPushButton *okButton; QTabWidget *tabs; QAction *namesAction; QLabel *relationLabel, *baseLabel, *inverseLabel, *priorityLabel, *mbunLabel, *exponentLabel; NamesEditDialog *namesEditDialog; Unit *o_unit; bool name_edited; protected slots: void onNameEdited(const QString&); void relationChanged(const QString&); void systemChanged(const QString&); void onUnitChanged(); void editNames(); void typeChanged(int); void exponentChanged(int); public: UnitEditDialog(QWidget *parent = NULL); virtual ~UnitEditDialog(); Unit *createUnit(ExpressionItem **replaced_item = NULL); Unit *modifyUnit(Unit *u, ExpressionItem **replaced_item = NULL); void setUnit(Unit *u); void setName(const QString&); static Unit *editUnit(QWidget *parent, Unit *u, ExpressionItem **replaced_item = NULL); static Unit *newUnit(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //UNIT_EDIT_DIALOG_H qalculate-qt-5.11.0/src/unitsdialog.cpp000066400000000000000000001130401520501070600200030ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "unitsdialog.h" #include "itemproxymodel.h" #include "uniteditdialog.h" UnitsDialog::UnitsDialog(QWidget *parent) : QDialog(parent, Qt::Window) { last_from = true; QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Units")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); unitsView = new QTreeView(this); unitsView->setSelectionMode(QAbstractItemView::SingleSelection); unitsView->setRootIsDecorated(false); unitsView->installEventFilter(this); unitsModel = new ItemProxyModel(this); sourceModel = new QStandardItemModel(this); unitsModel->setSourceModel(sourceModel); unitsModel->setShowHidden(false); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Unit"))); unitsView->setModel(unitsModel); selected_item = NULL; vbox->addWidget(unitsView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 3); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New…"), this); box->addWidget(newButton); connect(newButton, SIGNAL(clicked()), this, SLOT(newClicked())); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); convertButton = new QPushButton(tr("Convert"), this); box->addWidget(convertButton); connect(convertButton, SIGNAL(clicked()), this, SLOT(convertClicked())); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); insertButton->setDefault(true); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QGridLayout *grid = new QGridLayout(); equalsLabel = new QLabel("=", this); equalsLabel->setAlignment(Qt::AlignRight); QFontMetrics fm(equalsLabel->font()); equalsLabel->setMinimumWidth(fm.boundingRect(SIGN_ALMOST_EQUAL).width()); equalsLabel->setMinimumHeight(fm.boundingRect(SIGN_ALMOST_EQUAL).height()); grid->addWidget(equalsLabel, 1, 0); fromEdit = new MathLineEdit(this); fromEdit->setText("1"); fromEdit->setAlignment(Qt::AlignRight); grid->addWidget(fromEdit, 0, 1); toEdit = new MathLineEdit(this); toEdit->setText("1"); toEdit->setAlignment(Qt::AlignRight); grid->addWidget(toEdit, 1, 1); fromLabel = new QLabel(this); grid->addWidget(fromLabel, 0, 2); toCombo = new QComboBox(this); toModel = new ItemProxyModel(this); toSourceModel = new QStandardItemModel(this); toSourceModel->setColumnCount(1); toModel->setSourceModel(toSourceModel); toCombo->setModel(toModel); grid->addWidget(toCombo, 1, 2); topbox->addLayout(grid); topbox->addSpacing(topbox->spacing() * 2); hbox = new QHBoxLayout(); showHiddenButton = new QCheckBox(tr("Show hidden units"), this); hbox->addWidget(showHiddenButton, Qt::AlignLeft); showHiddenButton->setChecked(false); connect(showHiddenButton, SIGNAL(toggled(bool)), this, SLOT(showHiddenToggled(bool))); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); hbox->addWidget(buttonBox, 1); topbox->addLayout(hbox); selected_category = "All"; updateUnits(); unitsView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(fromEdit, SIGNAL(textEdited(const QString&)), this, SLOT(fromChanged())); connect(toEdit, SIGNAL(textEdited(const QString&)), this, SLOT(toChanged())); connect(toCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(toUnitChanged())); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(unitsView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedUnitChanged(const QModelIndex&, const QModelIndex&))); connect(unitsView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(onUnitActivated(const QModelIndex&))); if(!settings->units_geometry.isEmpty()) restoreGeometry(settings->units_geometry); else try_resize(this, 900, 800); if(!settings->units_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->units_vsplitter_state); if(!settings->units_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->units_hsplitter_state); } UnitsDialog::~UnitsDialog() {} void UnitsDialog::convert(bool from) { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid() || toCombo->currentIndex() < 0) {toEdit->clear(); return;} last_from = from; Unit *from_u, *to_u; std::string str; if(from) { str = fromEdit->text().trimmed().toStdString(); if(str == CALCULATOR->timedOutString()) return; from_u = (Unit*) index.data(Qt::UserRole).value(); to_u = (Unit*) toCombo->currentData(Qt::UserRole).value(); if(from_u == to_u || str.empty()) {toEdit->setText(fromEdit->text().trimmed()); return;} } else { str = toEdit->text().trimmed().toStdString(); if(str == CALCULATOR->timedOutString()) return; to_u = (Unit*) index.data(Qt::UserRole).value(); from_u = (Unit*) toCombo->currentData(Qt::UserRole).value(); if(from_u == to_u || str.empty()) {fromEdit->setText(toEdit->text().trimmed()); return;} } bool b = false; EvaluationOptions eo; eo.approximation = APPROXIMATION_APPROXIMATE; eo.parse_options = settings->evalops.parse_options; eo.parse_options.base = 10; if(eo.parse_options.parsing_mode == PARSING_MODE_RPN || eo.parse_options.parsing_mode == PARSING_MODE_CHAIN) eo.parse_options.parsing_mode = PARSING_MODE_ADAPTIVE; if(!settings->simplified_percentage) eo.parse_options.parsing_mode = (ParsingMode) (eo.parse_options.parsing_mode | PARSE_PERCENT_AS_ORDINARY_CONSTANT); eo.parse_options.read_precision = DONT_READ_PRECISION; PrintOptions po; po.is_approximate = &b; po.number_fraction_format = FRACTION_DECIMAL; po.interval_display = INTERVAL_DISPLAY_SIGNIFICANT_DIGITS; CALCULATOR->resetExchangeRatesUsed(); CALCULATOR->beginTemporaryStopMessages(); MathStructure v_mstruct = CALCULATOR->convert(CALCULATOR->unlocalizeExpression(str, eo.parse_options), from_u, to_u, 1500, eo); if(!v_mstruct.isAborted() && settings->checkExchangeRates(this)) v_mstruct = CALCULATOR->convert(CALCULATOR->unlocalizeExpression(str, eo.parse_options), from_u, to_u, 1500, eo); if(v_mstruct.isAborted()) { str = CALCULATOR->timedOutString(); } else { str = CALCULATOR->print(v_mstruct, 300, po); } if(from) toEdit->setText(QString::fromStdString(str)); else fromEdit->setText(QString::fromStdString(str)); b = b || v_mstruct.isApproximate(); if(b) equalsLabel->setText(SIGN_ALMOST_EQUAL); else equalsLabel->setText("="); CALCULATOR->endTemporaryStopMessages(); } void UnitsDialog::fromChanged() { convert(true); } void UnitsDialog::toChanged() { convert(false); } void UnitsDialog::toUnitChanged() { convert(last_from); } void UnitsDialog::fromUnitChanged() { convert(last_from); } bool UnitsDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { unitsView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(unitsView, eventCopy); return true; } } else if(o != fromEdit && o != toEdit && (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier)) { if(event->key() >= Qt::Key_0 && event->key() <= Qt::Key_9) { if(fromEdit->isEnabled()) { fromEdit->setFocus(); fromEdit->setText(event->text()); convert(true); } return true; } else if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void UnitsDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); unitsView->setFocus(); return; } if(event->key() == Qt::Key_Escape && (fromEdit->hasFocus() || toEdit->hasFocus())) { fromEdit->clear(); toEdit->clear(); return; } if(event->key() == Qt::Key_Return && unitsView->hasFocus()) { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(index.isValid()) { onUnitActivated(index); return; } } if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(event->key() >= Qt::Key_0 && event->key() <= Qt::Key_9 && fromEdit->isEnabled() && !searchEdit->hasFocus() && !fromEdit->hasFocus() && !toEdit->hasFocus()) { fromEdit->setFocus(); fromEdit->setText(event->text()); convert(true); return; } } QDialog::keyPressEvent(event); } void UnitsDialog::onUnitActivated(const QModelIndex &index) { if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) emit unitActivated(u); } void UnitsDialog::closeEvent(QCloseEvent *e) { settings->units_geometry = saveGeometry(); settings->units_vsplitter_state = vsplitter->saveState(); settings->units_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void UnitsDialog::reject() { settings->units_geometry = saveGeometry(); settings->units_vsplitter_state = vsplitter->saveState(); settings->units_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void UnitsDialog::searchChanged(const QString &str) { unitsModel->setSecondaryFilter(str.toStdString()); unitsView->selectionModel()->setCurrentIndex(unitsModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) unitsView->setFocus(); } void UnitsDialog::showHiddenToggled(bool b) { unitsModel->setShowHidden(b); } #define SET_TO_STR if(u->isCurrency()) qstr = QString::fromStdString(u->referenceName());\ else qstr = QString::fromStdString(u->print(true, true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) toCombo));\ if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) {\ qstr.replace("^-1", "�" SIGN_POWER_1);\ qstr.replace("^-2", "�" SIGN_POWER_2);\ qstr.replace("^-3", "�" SIGN_POWER_3);\ qstr.replace("^-4", "�" SIGN_POWER_4);\ qstr.replace("^4", SIGN_POWER_4);\ qstr.remove("_unit");\ } void UnitsDialog::newClicked() { ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::newUnit(this, &replaced_item); if(u) { if(replaced_item) { if(!CALCULATOR->stillHasVariable((Variable*) replaced_item)) { emit variableRemoved((Variable*) replaced_item); } else if(replaced_item == u || !CALCULATOR->stillHasUnit((Unit*) replaced_item) || (replaced_item->type() == TYPE_UNIT && !CALCULATOR->hasUnit((Unit*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_VARIABLE) { if(!CALCULATOR->hasVariable((Variable*) replaced_item)) emit variableRemoved((Variable*) replaced_item); else if(!replaced_item->isActive()) emit variableDeactivated((Variable*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = u; if(u->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(u->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(u->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateUnits(); emit itemsChanged(); return; } } QString qstr; SET_TO_STR QStandardItem *item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + u->category() && (selected_category != "Uncategorized" || !u->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { unitsModel->invalidate(); toModel->invalidate(); } sourceModel->sort(0); QModelIndex index = unitsModel->mapFromSource(item->index()); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } if(u != replaced_item && !u->isHidden()) settings->favourite_units.push_back(u); emit itemsChanged(); } } void UnitsDialog::unitRemoved(Unit *u) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } void UnitsDialog::unitDeactivated(Unit*) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } unitsModel->invalidate(); toModel->invalidate(); } void UnitsDialog::editClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *old_u = (Unit*) index.data(Qt::UserRole).value(); if(!old_u) return; ExpressionItem *replaced_item = NULL; Unit *u = UnitEditDialog::editUnit(this, old_u, &replaced_item); if(u) { sourceModel->removeRow(unitsModel->mapToSource(unitsView->selectionModel()->currentIndex()).row()); QModelIndexList list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) old_u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); if(replaced_item) { if(!CALCULATOR->stillHasVariable((Variable*) replaced_item)) { emit variableRemoved((Variable*) replaced_item); } else if(!CALCULATOR->stillHasUnit((Unit*) replaced_item) || (replaced_item->type() == TYPE_UNIT && !CALCULATOR->hasUnit((Unit*) replaced_item))) { list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_VARIABLE) { if(!CALCULATOR->hasVariable((Variable*) replaced_item)) emit variableRemoved((Variable*) replaced_item); else if(!replaced_item->isActive()) emit variableDeactivated((Variable*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = u; if(u->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(u->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(u->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateUnits(); emit itemsChanged(); return; } } QString qstr; SET_TO_STR QStandardItem *item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + u->category() && (selected_category != "Uncategorized" || !u->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { unitsModel->invalidate(); toModel->invalidate(); } sourceModel->sort(0); toSourceModel->sort(0); QModelIndex index = unitsModel->mapFromSource(item->index()); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } emit itemsChanged(); } } void UnitsDialog::favouriteClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(!u) return; if(favouriteButton->isChecked()) { settings->favourite_units.push_back(u); } else { for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) { settings->favourite_units.erase(settings->favourite_units.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_units.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; unitsModel->invalidate(); selectedUnitChanged(unitsView->selectionModel()->currentIndex(), unitsView->selectionModel()->currentIndex()); } } } settings->favourite_units_changed = true; emit favouritesChanged(); } void UnitsDialog::delClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u && u->isLocal()) { sourceModel->removeRow(unitsModel->mapToSource(unitsView->selectionModel()->currentIndex()).row()); QModelIndexList list = toSourceModel->match(toSourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) u), 1, Qt::MatchExactly); if(!list.isEmpty()) toSourceModel->removeRow(list[0].row()); selected_item = NULL; u->destroy(); emit itemsChanged(); } } void UnitsDialog::convertClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { emit convertToUnitRequest(u); } } void UnitsDialog::insertClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { emit insertUnitRequest(u); } } void UnitsDialog::deactivateClicked() { QModelIndex index = unitsView->selectionModel()->currentIndex(); if(!index.isValid()) return; Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(u) { u->setActive(!u->isActive()); QList list = categoriesView->findItems(u->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!u->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void UnitsDialog::selectedUnitChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { Unit *u = (Unit*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasUnit(u)) { selected_item = u; std::string str; if(u->subtype() != SUBTYPE_COMPOSITE_UNIT) { const ExpressionName *ename = &u->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_UNIT, true, true); str += ""; for(size_t i2 = 1; i2 <= u->countNames(); i2++) { if(&u->getName(i2) != ename) { str += ", "; str += u->getName(i2).formattedName(TYPE_UNIT, true, true); } } str += "

"; } bool is_approximate = false; PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) descriptionView; po.is_approximate = &is_approximate; po.allow_non_usable = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.use_unit_prefixes = false; if(u->subtype() == SUBTYPE_ALIAS_UNIT) { AliasUnit *au = (AliasUnit*) u; MathStructure m(1, 1, 0), mexp(1, 1, 0); if(au->hasNonlinearExpression()) { m.set("x"); if(au->expression().find("\\y") != std::string::npos) mexp.set("y"); str += "x "; str += u->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView).formattedName(TYPE_UNIT, true, true); if(au->expression().find("\\y") != std::string::npos) str += "y"; str += " "; } au->convertToFirstBaseUnit(m, mexp); if(au->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT) m.multiply(((CompositeUnit*) au->firstBaseUnit())->generateMathStructure()); else m.multiply(au->firstBaseUnit()); if(!mexp.isOne()) m.last() ^= mexp; m.format(po); std::string value = m.print(po, true, false, TAG_TYPE_HTML); if(m.isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; str += value; if(au->hasNonlinearExpression() && !au->inverseExpression().empty()) { str += "
"; m.set("x"); if(au->inverseExpression().find("\\y") != std::string::npos) mexp.set("y"); else mexp.set(1, 1, 0); str += "x "; bool b_y = au->inverseExpression().find("\\y") != std::string::npos; if(au->firstBaseUnit()->subtype() == SUBTYPE_COMPOSITE_UNIT) { if(b_y) str += "("; MathStructure m2(((CompositeUnit*) au->firstBaseUnit())->generateMathStructure()); m2.format(po); str += m2.print(po, true, false, TAG_TYPE_HTML); if(b_y) str += ")y"; } else { str += au->firstBaseUnit()->preferredDisplayName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView).formattedName(TYPE_UNIT, true, true); if(b_y) str += "y"; } str += " "; au->convertFromFirstBaseUnit(m, mexp); m.multiply(au); if(!mexp.isOne()) m.last() ^= mexp; m.format(po); value = m.print(po, true, false, TAG_TYPE_HTML); if(m.isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; str += value; } } else if(u->subtype() == SUBTYPE_COMPOSITE_UNIT) { str += "= "; MathStructure m(((CompositeUnit*) u)->generateMathStructure()); m.format(po); str += m.print(po, true, false, TAG_TYPE_HTML); } if(!u->description().empty()) { if(u->subtype() != SUBTYPE_BASE_UNIT) str += "
"; str += "
"; str += to_html_escaped(u->description()); } if(u->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(u->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(true); insertButton->setEnabled(u->isActive()); convertButton->setEnabled(u->isActive()); delButton->setEnabled(u->isLocal()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_units.size(); i++) { if(settings->favourite_units[i] == u) { favouriteButton->setChecked(true); break; } } deactivateButton->setEnabled(true); descriptionView->setHtml(QString::fromStdString(str)); std::string to_filter; if(u->category().empty()) { if(u->isLocal()) to_filter = "Uncategorized"; else to_filter = "User items"; } else { to_filter = "/"; to_filter += u->category(); } bool change_index = false; if(u->baseUnit()->referenceName() == "m" && u->baseExponent() == 3) { size_t i = to_filter.find("/", 1); if(i != std::string::npos) to_filter = to_filter.substr(0, i); } if(to_filter != toModel->currentFilter()) { toModel->setFilter(to_filter); toModel->sort(0); change_index = toCombo->count() > 0; } else if(toCombo->currentIndex() >= 0 && toCombo->currentData(Qt::UserRole).value() == u) { change_index = true; } if(change_index) { if(toCombo->itemData(0, Qt::UserRole).value() == u && toCombo->count() >= 2) toCombo->setCurrentIndex(1); else toCombo->setCurrentIndex(0); } fromEdit->setEnabled(u->isActive()); toEdit->setEnabled(u->isActive()); toCombo->setEnabled(u->isActive()); QString qstr; SET_TO_STR fromLabel->setText(qstr); fromUnitChanged(); return; } } fromUnitChanged(); fromEdit->setEnabled(false); toEdit->setEnabled(false); toCombo->setEnabled(false); fromLabel->setText(QString()); editButton->setEnabled(false); insertButton->setEnabled(false); convertButton->setEnabled(false); delButton->setEnabled(false); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); deactivateButton->setEnabled(false); descriptionView->clear(); selected_item = NULL; } void UnitsDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); unitsModel->setFilter(selected_category); QModelIndex index = unitsView->selectionModel()->currentIndex(); if(index.isValid()) { selectedUnitChanged(index, QModelIndex()); unitsView->scrollTo(index); } else if(selected_category != "All" && selected_category != "Inactive" && selected_category != toModel->currentFilter()) { toModel->setFilter(selected_category); toModel->sort(0); if(toCombo->count()) toCombo->setCurrentIndex(0); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void UnitsDialog::updateUnits() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; QString qstr; tree_struct unit_cats; unit_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; unitsView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Unit"))); toSourceModel->clear(); toSourceModel->setColumnCount(1); for(size_t i = 0; i < CALCULATOR->units.size(); i++) { Unit *u = CALCULATOR->units[i]; if(!u->isActive()) { has_inactive = true; } else { tree_struct *item = &unit_cats; if(!u->category().empty()) { cat = u->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(u->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) unitsView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); sourceModel->appendRow(item); if(u == selected_item) item_sel = item; SET_TO_STR item = new QStandardItem(qstr); item->setEditable(false); item->setData(QVariant::fromValue((void*) u), Qt::UserRole); toSourceModel->appendRow(item); } unitsView->selectionModel()->blockSignals(false); sourceModel->sort(0); toSourceModel->sort(0); unit_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User units"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive units l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All units"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; unit_cats.it = unit_cats.items.begin(); if(unit_cats.it != unit_cats.items.end()) { item = &*unit_cats.it; ++unit_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are units without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); unitsModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = unitsModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = unitsModel->index(0, 0); if(index.isValid()) { unitsView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); unitsView->scrollTo(index); } selectedUnitChanged(index, QModelIndex()); } void UnitsDialog::setSearch(const QString &str) { searchEdit->setText(str); } void UnitsDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.11.0/src/unitsdialog.h000066400000000000000000000047601520501070600174600ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef UNITS_DIALOG_H #define UNITS_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QComboBox; class QLabel; class QAbstractButton; class UnitsDialog : public QDialog { Q_OBJECT protected: QTreeView *unitsView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *unitsModel, *toModel; QStandardItemModel *sourceModel, *toSourceModel; QPushButton *deactivateButton, *insertButton, *delButton, *editButton, *newButton, *convertButton; QAbstractButton *favouriteButton, *showHiddenButton; QLineEdit *searchEdit, *fromEdit, *toEdit; QSplitter *vsplitter, *hsplitter; QLabel *fromLabel, *equalsLabel; QComboBox *toCombo; bool last_from; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; void convert(bool from); protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedUnitChanged(const QModelIndex&, const QModelIndex&); void newClicked(); void editClicked(); void delClicked(); void insertClicked(); void convertClicked(); void deactivateClicked(); void searchChanged(const QString&); void fromChanged(); void toChanged(); void toUnitChanged(); void fromUnitChanged(); void favouriteClicked(); void showHiddenToggled(bool); void onUnitActivated(const QModelIndex&); public: UnitsDialog(QWidget *parent = NULL); virtual ~UnitsDialog(); void updateUnits(); void setSearch(const QString&); void selectCategory(std::string); void unitRemoved(Unit*); void unitDeactivated(Unit*); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void variableRemoved(Variable*); void variableDeactivated(Variable*); void insertUnitRequest(Unit*); void convertToUnitRequest(Unit*); void unitActivated(Unit*); }; #endif //UNITS_DIALOG_H qalculate-qt-5.11.0/src/unknowneditdialog.cpp000066400000000000000000000242421520501070600212130ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "unknowneditdialog.h" #include "functioneditdialog.h" UnknownEditDialog::UnknownEditDialog(QWidget *parent) : QDialog(parent) { o_variable = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QGridLayout *grid = new QGridLayout(); box->addLayout(grid); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif grid->addWidget(nameEdit, 0, 1); customBox = new QCheckBox(tr("Custom assumptions"), this); customBox->setChecked(true); grid->addWidget(customBox, 1, 0, 1, 2); grid->addWidget(new QLabel(tr("Type:"), this), 2, 0); typeCombo = new QComboBox(this); typeCombo->addItem("Number", ASSUMPTION_TYPE_NUMBER); typeCombo->addItem("Real number", ASSUMPTION_TYPE_REAL); typeCombo->addItem("Rational number", ASSUMPTION_TYPE_RATIONAL); typeCombo->addItem("Integer", ASSUMPTION_TYPE_INTEGER); typeCombo->addItem("Boolean", ASSUMPTION_TYPE_BOOLEAN); grid->addWidget(typeCombo, 2, 1); grid->addWidget(new QLabel(tr("Sign:"), this), 3, 0); signCombo = new QComboBox(this); signCombo->addItem("Unknown", ASSUMPTION_SIGN_UNKNOWN); signCombo->addItem("Non-zero", ASSUMPTION_SIGN_NONZERO); signCombo->addItem("Positive", ASSUMPTION_SIGN_POSITIVE); signCombo->addItem("Non-negative", ASSUMPTION_SIGN_NONNEGATIVE); signCombo->addItem("Negative", ASSUMPTION_SIGN_NEGATIVE); signCombo->addItem("Non-positive", ASSUMPTION_SIGN_NONPOSITIVE); grid->addWidget(signCombo, 3, 1); temporaryBox = new QCheckBox(tr("Temporary"), this); temporaryBox->setChecked(false); grid->addWidget(temporaryBox, 4, 0, 1, 2, Qt::AlignRight); typeCombo->setCurrentIndex(typeCombo->findData(CALCULATOR->defaultAssumptions()->type())); signCombo->setCurrentIndex(signCombo->findData(CALCULATOR->defaultAssumptions()->sign())); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onTypeChanged(int))); connect(signCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSignChanged(int))); connect(customBox, SIGNAL(toggled(bool)), this, SLOT(onCustomToggled(bool))); connect(temporaryBox, SIGNAL(clicked()), this, SLOT(onVariableChanged())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } UnknownEditDialog::~UnknownEditDialog() {} void UnknownEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_VARIABLE, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_variable, nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onVariableChanged(); } void UnknownEditDialog::onTypeChanged(int i) { int t = typeCombo->itemData(i).toInt(); int s = signCombo->currentData().toInt(); if((t == ASSUMPTION_TYPE_NUMBER && s != ASSUMPTION_SIGN_NONZERO && s != ASSUMPTION_SIGN_UNKNOWN) || (t == ASSUMPTION_TYPE_BOOLEAN && s != ASSUMPTION_SIGN_UNKNOWN)) { signCombo->blockSignals(true); signCombo->setCurrentIndex(signCombo->findData(ASSUMPTION_SIGN_UNKNOWN)); signCombo->blockSignals(false); } onVariableChanged(); } void UnknownEditDialog::onSignChanged(int i) { int t = typeCombo->currentData().toInt(); int s = signCombo->itemData(i).toInt(); if((t == ASSUMPTION_TYPE_NUMBER && s != ASSUMPTION_SIGN_NONZERO && s != ASSUMPTION_SIGN_UNKNOWN) || (t == ASSUMPTION_TYPE_BOOLEAN && s != ASSUMPTION_SIGN_UNKNOWN)) { typeCombo->blockSignals(true); typeCombo->setCurrentIndex(typeCombo->findData(ASSUMPTION_TYPE_REAL)); typeCombo->blockSignals(false); } onVariableChanged(); } void UnknownEditDialog::onVariableChanged() { okButton->setEnabled(!nameEdit->text().trimmed().isEmpty()); } void UnknownEditDialog::onCustomToggled(bool b) { typeCombo->setEnabled(b); signCombo->setEnabled(b); onVariableChanged(); } UnknownVariable *UnknownEditDialog::createVariable(ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Variable *var = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString())) { var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = var; } } UnknownVariable *v; if(var && var->isLocal() && !var->isKnown()) { v = (UnknownVariable*) var; v->clearNames(); v->setHidden(false); v->setApproximate(false); v->setDescription(""); v->setTitle(""); if(!modifyVariable(v)) return NULL; return v; } v = new UnknownVariable("", ""); if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); if(temporaryBox->isChecked()) v->setCategory(CALCULATOR->temporaryCategory()); else v->setCategory(CALCULATOR->getVariableById(VARIABLE_ID_X)->category()); if(customBox->isChecked()) { v->setAssumptions(new Assumptions()); v->assumptions()->setType((AssumptionType) typeCombo->currentData().toInt()); v->assumptions()->setSign((AssumptionSign) signCombo->currentData().toInt()); } v->setChanged(false); CALCULATOR->addVariable(v); return v; } bool UnknownEditDialog::modifyVariable(UnknownVariable *v, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString(), v)) { Variable *var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else if(var != v) *replaced_item = var; } } if(v->isLocal()) { if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); if(temporaryBox->isChecked()) v->setCategory(CALCULATOR->temporaryCategory()); else if(v->category() == CALCULATOR->temporaryCategory()) v->setCategory(CALCULATOR->getVariableById(VARIABLE_ID_X)->category()); } if(!customBox->isChecked()) { v->setAssumptions(NULL); } else { if(!v->assumptions()) v->setAssumptions(new Assumptions()); v->assumptions()->setType((AssumptionType) typeCombo->currentData().toInt()); v->assumptions()->setSign((AssumptionSign) signCombo->currentData().toInt()); } return true; } void UnknownEditDialog::setVariable(UnknownVariable *v) { o_variable = v; name_edited = false; nameEdit->setText(QString::fromStdString(v->getName(1).name)); nameEdit->setEnabled(v->isLocal()); if(namesEditDialog) namesEditDialog->setNames(v, nameEdit->text()); Assumptions *ass = v->assumptions(); customBox->setChecked(ass); if(!ass) ass = CALCULATOR->defaultAssumptions(); typeCombo->setCurrentIndex(typeCombo->findData(ass->type())); signCombo->setCurrentIndex(signCombo->findData(ass->sign())); temporaryBox->setChecked(v->category() == CALCULATOR->temporaryCategory()); temporaryBox->setEnabled(v->isLocal()); okButton->setEnabled(false); } void UnknownEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } name_edited = true; okButton->setEnabled(!nameEdit->text().trimmed().isEmpty()); } void UnknownEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } bool UnknownEditDialog::editVariable(QWidget *parent, UnknownVariable *v, ExpressionItem **replaced_item) { UnknownEditDialog *d = new UnknownEditDialog(parent); d->setWindowTitle(tr("Edit Unknown Variable")); d->setVariable(v); while(d->exec() == QDialog::Accepted) { if(d->modifyVariable(v, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } UnknownVariable* UnknownEditDialog::newVariable(QWidget *parent, ExpressionItem **replaced_item) { UnknownEditDialog *d = new UnknownEditDialog(parent); d->setWindowTitle(tr("New Unknown Variable")); std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); UnknownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { v = d->createVariable(replaced_item); if(v) break; } d->deleteLater(); return v; } qalculate-qt-5.11.0/src/unknowneditdialog.h000066400000000000000000000030561520501070600206600ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef UNKNOWN_EDIT_DIALOG_H #define UNKNOWN_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class QComboBox; class NamesEditDialog; class UnknownEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit; QCheckBox *customBox, *temporaryBox; QComboBox *typeCombo, *signCombo; QPushButton *okButton; NamesEditDialog *namesEditDialog; Variable *o_variable; bool name_edited; protected slots: void onNameEdited(const QString&); void onVariableChanged(); void onTypeChanged(int); void onSignChanged(int); void onCustomToggled(bool); void editNames(); public: UnknownEditDialog(QWidget *parent = NULL); virtual ~UnknownEditDialog(); UnknownVariable *createVariable(ExpressionItem **replaced_item = NULL); bool modifyVariable(UnknownVariable *v, ExpressionItem **replaced_item = NULL); void setVariable(UnknownVariable *v); void setName(const QString&); static bool editVariable(QWidget *parent, UnknownVariable *, ExpressionItem **replaced_item = NULL); static UnknownVariable* newVariable(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //UNKNOWN_EDIT_DIALOG_H qalculate-qt-5.11.0/src/variableeditdialog.cpp000066400000000000000000000403731520501070600213040ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "variableeditdialog.h" #include "functioneditdialog.h" #include "matrixwidget.h" VariableEditDialog::VariableEditDialog(QWidget *parent, bool allow_empty_value, bool edit_matrix) : QDialog(parent), b_empty(allow_empty_value), b_matrix(edit_matrix), b_changed(false) { o_variable = NULL; name_edited = false; namesEditDialog = NULL; QVBoxLayout *box = new QVBoxLayout(this); QTabWidget *tabs = new QTabWidget(this); tabs->setUsesScrollButtons(false); box->addWidget(tabs); QWidget *w1 = new QWidget(this); QWidget *w2 = new QWidget(this); tabs->addTab(w1, tr("Required")); tabs->addTab(w2, tr("Description")); QGridLayout *grid = new QGridLayout(w1); grid->addWidget(new QLabel(tr("Name:"), this), 0, 0); nameEdit = new QLineEdit(this); connect(nameEdit->addAction(LOAD_ICON("configure"), QLineEdit::TrailingPosition), SIGNAL(triggered()), this, SLOT(editNames())); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) nameEdit->setTextMargins(0, 0, 22, 0); # endif #endif int r = 0; grid->addWidget(nameEdit, r, 1); r++; if(b_matrix) { matrixEdit = new MatrixWidget(this); grid->addWidget(matrixEdit, r, 0, 1, 2); r++; connect(matrixEdit, SIGNAL(matrixChanged()), this, SLOT(onMatrixChanged())); connect(matrixEdit, SIGNAL(dimensionChanged(int, int)), this, SLOT(onMatrixDimensionChanged())); } else { grid->addWidget(new QLabel(tr("Value:"), this), r, 0); r++; valueEdit = new MathTextEdit(this); #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) if(b_empty) valueEdit->setPlaceholderText(tr("current result")); #endif grid->addWidget(valueEdit, r, 0, 1, 2); r++; connect(valueEdit, SIGNAL(textChanged()), this, SLOT(onValueEdited())); } temporaryBox = new QCheckBox(tr("Temporary"), this); temporaryBox->setChecked(true); grid->addWidget(temporaryBox, r, 0, 1, 2, Qt::AlignRight); r++; grid = new QGridLayout(w2); grid->addWidget(new QLabel(tr("Category:"), this), 0, 0); categoryEdit = new QComboBox(this); categoryEdit->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); int l = unicode_length(CALCULATOR->temporaryCategory()); if(l < 20) l = 20; categoryEdit->setMinimumContentsLength(l); QMap hash; for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { if(!CALCULATOR->variables[i]->category().empty()) { if(hash.find(CALCULATOR->variables[i]->category()) == hash.end()) { hash[CALCULATOR->variables[i]->category()] = true; } } } for(QMap::const_iterator it = hash.constBegin(); it != hash.constEnd(); ++it) { categoryEdit->addItem(QString::fromStdString(it.key())); } categoryEdit->setEditable(true); categoryEdit->setCurrentText(QString::fromStdString(CALCULATOR->temporaryCategory())); grid->addWidget(categoryEdit, 0, 1); grid->addWidget(new QLabel(tr("Descriptive name:"), this), 1, 0); titleEdit = new QLineEdit(this); grid->addWidget(titleEdit, 1, 1); hideBox = new QCheckBox(tr("Hide variable"), this); grid->addWidget(hideBox, 2, 1, Qt::AlignRight); grid->addWidget(new QLabel(tr("Description:"), this), 3, 0, 1, 2); descriptionEdit = new SmallTextEdit(2, this); grid->addWidget(descriptionEdit, 4, 0, 1, 2); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok, Qt::Horizontal, this); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Cancel)->setAutoDefault(false); okButton = buttonBox->button(QDialogButtonBox::Ok); box->addWidget(buttonBox); nameEdit->setFocus(); connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onNameEdited(const QString&))); connect(temporaryBox, SIGNAL(clicked()), this, SLOT(temporaryClicked())); connect(descriptionEdit, SIGNAL(textChanged()), this, SLOT(onVariableChanged())); connect(hideBox, SIGNAL(clicked()), this, SLOT(onVariableChanged())); connect(titleEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onVariableChanged())); connect(categoryEdit, SIGNAL(currentTextChanged(const QString&)), this, SLOT(categoryChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); okButton->setEnabled(false); if(settings->always_on_top) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } VariableEditDialog::~VariableEditDialog() {} void VariableEditDialog::editNames() { if(!namesEditDialog) { namesEditDialog = new NamesEditDialog(TYPE_VARIABLE, this, nameEdit->isReadOnly()); namesEditDialog->setNames(o_variable, nameEdit->text()); } else { namesEditDialog->setName(nameEdit->text()); } namesEditDialog->exec(); nameEdit->setText(namesEditDialog->firstName()); name_edited = false; onVariableChanged(); } void VariableEditDialog::categoryChanged(const QString &str) { temporaryBox->setChecked(str == QString::fromStdString(CALCULATOR->temporaryCategory())); onVariableChanged(); } void VariableEditDialog::temporaryClicked() { categoryEdit->blockSignals(true); if(temporaryBox->isChecked()) { categoryEdit->setCurrentText(QString::fromStdString(CALCULATOR->temporaryCategory())); } else { categoryEdit->setCurrentText(QString()); } categoryEdit->blockSignals(false); onVariableChanged(); } void VariableEditDialog::onMatrixDimensionChanged() { b_changed = true; } void VariableEditDialog::onMatrixChanged() { b_changed = true; onVariableChanged(); } bool VariableEditDialog::valueHasChanged() const { return b_changed; } KnownVariable *VariableEditDialog::createVariable(MathStructure *default_value, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; Variable *var = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString())) { var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return NULL; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else *replaced_item = var; } } KnownVariable *v; if(var && var->isLocal() && var->isKnown()) { v = (KnownVariable*) var; v->clearNames(); if(!modifyVariable(v, default_value)) return NULL; return v; } if(default_value && ((!b_matrix && valueEdit->toPlainText().isEmpty()) || !b_changed)) { v = new KnownVariable("", "", *default_value); } else { std::string str; if(b_matrix) { str = matrixEdit->getMatrixString().toStdString(); } else { str = settings->unlocalizeExpression(valueEdit->toPlainText().toStdString()); } v = new KnownVariable("", "", str); } if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); v->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); v->setTitle(titleEdit->text().trimmed().toStdString()); v->setCategory(categoryEdit->currentText().trimmed().toStdString()); v->setHidden(hideBox->isChecked()); v->setChanged(false); CALCULATOR->addVariable(v); return v; } bool VariableEditDialog::modifyVariable(KnownVariable *v, MathStructure *default_value, ExpressionItem **replaced_item) { if(replaced_item) *replaced_item = NULL; if(CALCULATOR->variableNameTaken(nameEdit->text().trimmed().toStdString(), v)) { Variable *var = CALCULATOR->getActiveVariable(nameEdit->text().trimmed().toStdString(), true); if(name_edited && (!var || var->category() != CALCULATOR->temporaryCategory()) && QMessageBox::question(this, tr("Question"), tr("A unit or variable with the same name already exists.\nDo you want to overwrite it?")) != QMessageBox::Yes) { nameEdit->setFocus(); return false; } if(replaced_item) { if(!var) *replaced_item = CALCULATOR->getActiveUnit(nameEdit->text().trimmed().toStdString(), true); else if(var != v) *replaced_item = var; } } if(namesEditDialog) namesEditDialog->modifyNames(v, nameEdit->text()); else NamesEditDialog::modifyName(v, nameEdit->text()); v->setApproximate(false); v->setUncertainty(""); v->setUnit(""); if(default_value && ((!b_matrix && valueEdit->toPlainText().isEmpty()) || !b_changed)) { v->set(*default_value); } else { std::string str; if(b_matrix) { str = matrixEdit->getMatrixString().toStdString(); } else { str = settings->unlocalizeExpression(valueEdit->toPlainText().toStdString()); } v->set(str); } v->setDescription(descriptionEdit->toPlainText().trimmed().toStdString()); v->setTitle(titleEdit->text().trimmed().toStdString()); v->setCategory(categoryEdit->currentText().trimmed().toStdString()); v->setHidden(hideBox->isChecked()); return true; } void VariableEditDialog::setVariable(KnownVariable *v) { nameEdit->setText(QString::fromStdString(v->getName(1).name)); name_edited = false; if(!nameEdit->text().isEmpty()) o_variable = v; else o_variable = NULL; if(namesEditDialog) namesEditDialog->setNames(o_variable, nameEdit->text()); if(v->isExpression() && !b_matrix) { std::string value_str = settings->localizeExpression(v->expression()); bool is_relative = false; if((!v->uncertainty(&is_relative).empty() || !v->unit().empty()) && !is_relative && v->expression().find_first_not_of(NUMBER_ELEMENTS) != std::string::npos) { value_str.insert(0, 1, '('); value_str += ')'; } if(!v->uncertainty(&is_relative).empty()) { if(is_relative) { value_str.insert(0, "("); value_str.insert(0, CALCULATOR->getFunctionById(FUNCTION_ID_UNCERTAINTY)->referenceName()); value_str += CALCULATOR->getComma(); value_str += " "; value_str += settings->localizeExpression(v->uncertainty()); value_str += CALCULATOR->getComma(); value_str += " 1)"; } else { value_str += SIGN_PLUSMINUS; value_str += settings->localizeExpression(v->uncertainty()); } } else if(v->isApproximate() && value_str.find(CALCULATOR->getFunctionById(FUNCTION_ID_INTERVAL)->referenceName()) == std::string::npos && value_str.find("±") == std::string::npos && value_str.find("+/-") == std::string::npos) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.restrict_to_parent_precision = false; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; value_str = CALCULATOR->print(v->get(), 1000, po); } if(!v->unit().empty() && v->unit() != "auto") { value_str += " "; value_str += settings->localizeExpression(v->unit(), true); } valueEdit->setPlainText(QString::fromStdString(value_str)); } else if(b_matrix) { matrixEdit->setMatrix(v->get()); } else { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.restrict_to_parent_precision = false; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; valueEdit->setPlainText(QString::fromStdString(CALCULATOR->print(v->get(), 1000, po))); } nameEdit->setReadOnly(!v->isLocal()); if(b_matrix) { matrixEdit->setEditable(v->isLocal()); } else { valueEdit->setReadOnly(!v->isLocal()); } temporaryBox->setChecked(v->category() == CALCULATOR->temporaryCategory()); descriptionEdit->blockSignals(true); descriptionEdit->setPlainText(QString::fromStdString(v->description())); descriptionEdit->blockSignals(false); titleEdit->setText(QString::fromStdString(v->title(false))); categoryEdit->blockSignals(true); categoryEdit->setCurrentText(QString::fromStdString(v->category())); categoryEdit->blockSignals(false); descriptionEdit->setReadOnly(!v->isLocal()); titleEdit->setReadOnly(!v->isLocal()); hideBox->setChecked(v->isHidden()); okButton->setEnabled(false); b_changed = false; } void VariableEditDialog::onNameEdited(const QString &str) { if(!str.trimmed().isEmpty() && !CALCULATOR->variableNameIsValid(str.trimmed().toStdString())) { nameEdit->setText(QString::fromStdString(CALCULATOR->convertToValidVariableName(str.trimmed().toStdString()))); } name_edited = true; onVariableChanged(); } void VariableEditDialog::onVariableChanged() { okButton->setEnabled(!nameEdit->isReadOnly() && !nameEdit->text().trimmed().isEmpty() && (b_empty || (!b_matrix && !valueEdit->toPlainText().trimmed().isEmpty()) || (b_matrix && b_changed))); } void VariableEditDialog::onValueEdited() { b_changed = true; onVariableChanged(); } void VariableEditDialog::setValue(const QString &str) { valueEdit->setPlainText(str); if(!b_empty) onValueEdited(); b_changed = false; } void VariableEditDialog::disableValue() { valueEdit->setReadOnly(true); } void VariableEditDialog::setName(const QString &str) { nameEdit->setText(str); onNameEdited(str); } QString VariableEditDialog::value() const { return valueEdit->toPlainText(); } bool VariableEditDialog::editVariable(QWidget *parent, KnownVariable *v, ExpressionItem **replaced_item) { VariableEditDialog *d = new VariableEditDialog(parent, false, v->get().isMatrix() && v->get().rows() * v->get().columns() <= 10000); d->setWindowTitle(tr("Edit Variable")); d->setVariable(v); while(d->exec() == QDialog::Accepted) { if(d->modifyVariable(v, NULL, replaced_item)) { d->deleteLater(); return true; } } d->deleteLater(); return false; } KnownVariable* VariableEditDialog::newVariable(QWidget *parent, MathStructure *default_value, const QString &value_str, ExpressionItem **replaced_item) { bool edit_matrix = default_value && default_value->isMatrix() && default_value->rows() * default_value->columns() <= 10000; VariableEditDialog *d = new VariableEditDialog(parent, default_value != NULL && (value_str.isEmpty() || value_str.length() > 1000 || edit_matrix), edit_matrix); d->setWindowTitle(tr("New Variable")); QString vstr = value_str; if(edit_matrix) { KnownVariable v(CALCULATOR->temporaryCategory(), "", *default_value); d->setVariable(&v); } else if(vstr.length() > 1000) { d->setValue(QString()); } else { if(vstr.isEmpty() && default_value) { PrintOptions po = settings->printops; po.is_approximate = NULL; po.allow_non_usable = false; po.preserve_precision = true; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.show_ending_zeroes = false; if(po.number_fraction_format == FRACTION_DECIMAL) po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.base = 10; vstr = QString::fromStdString(CALCULATOR->print(*default_value, 1000, po)); } d->setValue(vstr); } std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); KnownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { if(edit_matrix) { v = d->createVariable(default_value, replaced_item); if(v) break; } else { QString str = d->value().trimmed(); if(default_value && str == vstr) d->setValue(""); v = d->createVariable(default_value, replaced_item); if(v) break; d->setValue(str); } } d->deleteLater(); return v; } KnownVariable *VariableEditDialog::newMatrix(QWidget *parent, ExpressionItem **replaced_item) { VariableEditDialog *d = new VariableEditDialog(parent, false, true); d->setWindowTitle(tr("New Variable")); std::string v_name; int i = 1; do { v_name = "v"; v_name += i2s(i); i++; } while(CALCULATOR->nameTaken(v_name)); d->setName(QString::fromStdString(v_name)); KnownVariable *v = NULL; while(d->exec() == QDialog::Accepted) { v = d->createVariable(NULL, replaced_item); if(v) break; } d->deleteLater(); return v; } qalculate-qt-5.11.0/src/variableeditdialog.h000066400000000000000000000042351520501070600207460ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef VARIABLE_EDIT_DIALOG_H #define VARIABLE_EDIT_DIALOG_H #include #include class QLineEdit; class QCheckBox; class QPushButton; class MatrixWidget; class QComboBox; class QPlainTextEdit; class NamesEditDialog; class VariableEditDialog : public QDialog { Q_OBJECT protected: QLineEdit *nameEdit, *titleEdit; QComboBox *categoryEdit; QCheckBox *temporaryBox, *hideBox; QPlainTextEdit *descriptionEdit, *valueEdit; QPushButton *okButton; MatrixWidget *matrixEdit; NamesEditDialog *namesEditDialog; Variable *o_variable; bool b_empty, b_matrix, b_changed, name_edited; protected slots: void onNameEdited(const QString&); void onValueEdited(); void onVariableChanged(); void onMatrixDimensionChanged(); void onMatrixChanged(); void editNames(); void temporaryClicked(); void categoryChanged(const QString&); public: VariableEditDialog(QWidget *parent = NULL, bool allow_empty_value = true, bool edit_matrix = false); virtual ~VariableEditDialog(); KnownVariable *createVariable(MathStructure *default_value = NULL, ExpressionItem **replaced_item = NULL); bool modifyVariable(KnownVariable *v, MathStructure *default_value = NULL, ExpressionItem **replaced_item = NULL); void setVariable(KnownVariable *v); void setValue(const QString&); void disableValue(); bool valueHasChanged() const; QString value() const; void setName(const QString&); static bool editVariable(QWidget *parent, KnownVariable *v, ExpressionItem **replaced_item = NULL); static KnownVariable *newVariable(QWidget *parent, MathStructure *default_value = NULL, const QString &value_str = QString(), ExpressionItem **replaced_item = NULL); static KnownVariable *newMatrix(QWidget *parent, ExpressionItem **replaced_item = NULL); }; #endif //VARIABLE_EDIT_DIALOG_H qalculate-qt-5.11.0/src/variablesdialog.cpp000066400000000000000000000735041520501070600206230ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qalculateqtsettings.h" #include "variablesdialog.h" #include "itemproxymodel.h" #include "unknowneditdialog.h" #include "variableeditdialog.h" #include "csvdialog.h" VariablesDialog::VariablesDialog(QWidget *parent) : QDialog(parent, Qt::Window) { QVBoxLayout *topbox = new QVBoxLayout(this); setWindowTitle(tr("Variables")); QHBoxLayout *hbox = new QHBoxLayout(); topbox->addLayout(hbox); vsplitter = new QSplitter(Qt::Vertical, this); hbox->addWidget(vsplitter, 1); hsplitter = new QSplitter(Qt::Horizontal, this); categoriesView = new QTreeWidget(this); categoriesView->setSelectionMode(QAbstractItemView::SingleSelection); categoriesView->setRootIsDecorated(false); categoriesView->headerItem()->setText(0, tr("Category")); categoriesView->setColumnCount(2); categoriesView->setColumnHidden(1, true); categoriesView->installEventFilter(this); hsplitter->addWidget(categoriesView); QWidget *w = new QWidget(this); QVBoxLayout *vbox = new QVBoxLayout(w); vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); variablesView = new QTreeView(this); variablesView->setSelectionMode(QAbstractItemView::SingleSelection); variablesView->setRootIsDecorated(false); variablesView->installEventFilter(this); variablesModel = new ItemProxyModel(this); sourceModel = new QStandardItemModel(this); variablesModel->setSourceModel(sourceModel); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Variable"))); variablesView->setModel(variablesModel); selected_item = NULL; vbox->addWidget(variablesView, 1); searchEdit = new QLineEdit(this); searchEdit->addAction(LOAD_ICON("edit-find"), QLineEdit::LeadingPosition); #ifdef _WIN32 # if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0)) searchEdit->setTextMargins(22, 0, 0, 0); # endif #endif searchEdit->installEventFilter(this); vbox->addWidget(searchEdit, 0); hsplitter->addWidget(w); vsplitter->addWidget(hsplitter); descriptionView = new QTextEdit(this); descriptionView->setReadOnly(true); vsplitter->addWidget(descriptionView); vsplitter->setStretchFactor(0, 3); vsplitter->setStretchFactor(1, 1); hsplitter->setStretchFactor(0, 2); hsplitter->setStretchFactor(1, 3); QVBoxLayout *box = new QVBoxLayout(); newButton = new QPushButton(tr("New"), this); box->addWidget(newButton); QMenu *menu = new QMenu(this); menu->addAction(tr("Variable/Constant…"), this, SLOT(newVariable())); menu->addAction(tr("Unknown Variable…"), this, SLOT(newUnknown())); menu->addAction(tr("Matrix…"), this, SLOT(newMatrix())); newButton->setMenu(menu); editButton = new QPushButton(tr("Edit…"), this); box->addWidget(editButton); connect(editButton, SIGNAL(clicked()), this, SLOT(editClicked())); exportButton = new QPushButton(tr("Export…"), this); box->addWidget(exportButton); connect(exportButton, SIGNAL(clicked()), this, SLOT(exportClicked())); deactivateButton = new QPushButton(tr("Deactivate"), this); box->addWidget(deactivateButton); connect(deactivateButton, SIGNAL(clicked()), this, SLOT(deactivateClicked())); delButton = new QPushButton(tr("Delete"), this); box->addWidget(delButton); connect(delButton, SIGNAL(clicked()), this, SLOT(delClicked())); box->addSpacing(12); insertButton = new QPushButton(tr("Insert"), this); box->addWidget(insertButton); connect(insertButton, SIGNAL(clicked()), this, SLOT(insertClicked())); insertButton->setDefault(true); box->addSpacing(12); favouriteButton = new QCheckBox(tr("Favorite"), this); box->addWidget(favouriteButton); connect(favouriteButton, SIGNAL(clicked()), this, SLOT(favouriteClicked())); box->addStretch(1); hbox->addLayout(box, 0); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, this); topbox->addWidget(buttonBox); selected_category = "All"; updateVariables(); variablesView->setFocus(); connect(searchEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged(const QString&))); connect(buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(reject())); connect(categoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); connect(variablesView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(selectedVariableChanged(const QModelIndex&, const QModelIndex&))); connect(variablesView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(insertClicked())); if(!settings->variables_geometry.isEmpty()) restoreGeometry(settings->variables_geometry); else try_resize(this, 900, 700); if(!settings->variables_vsplitter_state.isEmpty()) vsplitter->restoreState(settings->variables_vsplitter_state); if(!settings->variables_hsplitter_state.isEmpty()) hsplitter->restoreState(settings->variables_hsplitter_state); } VariablesDialog::~VariablesDialog() {} void VariablesDialog::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Find)) { searchEdit->setFocus(); return; } if(event->key() == Qt::Key_Escape && searchEdit->hasFocus()) { searchEdit->clear(); variablesView->setFocus(); return; } if(event->key() == Qt::Key_Return && variablesView->hasFocus()) { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(index.isValid()) { insertClicked(); return; } } QDialog::keyPressEvent(event); } bool VariablesDialog::eventFilter(QObject *o, QEvent *e) { if(e->type() == QEvent::KeyPress) { QKeyEvent *event = static_cast(e); if(o == searchEdit) { if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_PageUp) { variablesView->setFocus(); QKeyEvent *eventCopy = new QKeyEvent(event->type(), event->key(), event->modifiers(), event->text(), event->isAutoRepeat(), event->count()); QApplication::postEvent(variablesView, eventCopy); return true; } } else if(event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::GroupSwitchModifier || event->modifiers() == Qt::ShiftModifier || event->modifiers() == Qt::KeypadModifier) { if(!event->text().isEmpty() && event->text()[0].isLetterOrNumber()) { searchEdit->setFocus(); searchEdit->setText(event->text()); return true; } } } return QDialog::eventFilter(o, e); } void VariablesDialog::closeEvent(QCloseEvent *e) { settings->variables_geometry = saveGeometry(); settings->variables_vsplitter_state = vsplitter->saveState(); settings->variables_hsplitter_state = hsplitter->saveState(); QDialog::closeEvent(e); } void VariablesDialog::reject() { settings->variables_geometry = saveGeometry(); settings->variables_vsplitter_state = vsplitter->saveState(); settings->variables_hsplitter_state = hsplitter->saveState(); QDialog::reject(); } void VariablesDialog::searchChanged(const QString &str) { variablesModel->setSecondaryFilter(str.toStdString()); variablesView->selectionModel()->setCurrentIndex(variablesModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); if(str.isEmpty()) variablesView->setFocus(); } void VariablesDialog::newMatrix() {newVariable(2);} void VariablesDialog::newVariable() {newVariable(0);} void VariablesDialog::newVariable(int type) { ExpressionItem *replaced_item = NULL; Variable *v; if(type == 2) v = VariableEditDialog::newMatrix(this, &replaced_item); else if(type == 1) v = UnknownEditDialog::newVariable(this, &replaced_item); else v = VariableEditDialog::newVariable(this, NULL, QString(), &replaced_item); if(v) { if(replaced_item) { if(!CALCULATOR->stillHasUnit((Unit*) replaced_item)) { emit unitRemoved((Unit*) replaced_item); } else if(replaced_item == v || !CALCULATOR->stillHasVariable((Variable*) replaced_item) || (replaced_item->type() == TYPE_VARIABLE && !CALCULATOR->hasVariable((Variable*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_UNIT) { if(!CALCULATOR->hasUnit((Unit*) replaced_item)) emit unitRemoved((Unit*) replaced_item); else if(!replaced_item->isActive()) emit unitDeactivated((Unit*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = v; if(v->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(v->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(v->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateVariables(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + v->category() && (selected_category != "Uncategorized" || !v->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { variablesModel->invalidate(); } sourceModel->sort(0); QModelIndex index = variablesModel->mapFromSource(item->index()); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } if(v != replaced_item && !v->isHidden()) settings->favourite_variables.push_back(v); emit itemsChanged(); } } void VariablesDialog::newUnknown() {newVariable(1);} void VariablesDialog::variableRemoved(Variable *v) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) v), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } void VariablesDialog::variableDeactivated(Variable*) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } variablesModel->invalidate(); } void VariablesDialog::editClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(!v) return; bool b = false; ExpressionItem *replaced_item = NULL; if(v->isKnown()) { b = VariableEditDialog::editVariable(this, (KnownVariable*) v, &replaced_item); } else { b = UnknownEditDialog::editVariable(this, (UnknownVariable*) v, &replaced_item); } if(b) { sourceModel->removeRow(variablesModel->mapToSource(variablesView->selectionModel()->currentIndex()).row()); if(replaced_item) { if(!CALCULATOR->stillHasUnit((Unit*) replaced_item)) { emit unitRemoved((Unit*) replaced_item); } else if(!CALCULATOR->stillHasVariable((Variable*) replaced_item) || (replaced_item->type() == TYPE_VARIABLE && !CALCULATOR->hasVariable((Variable*) replaced_item))) { QModelIndexList list = sourceModel->match(sourceModel->index(0, 0), Qt::UserRole, QVariant::fromValue((void*) replaced_item), 1, Qt::MatchExactly); if(!list.isEmpty()) sourceModel->removeRow(list[0].row()); } else if(replaced_item->type() == TYPE_UNIT) { if(!CALCULATOR->hasUnit((Unit*) replaced_item)) emit unitRemoved((Unit*) replaced_item); else if(!replaced_item->isActive()) emit unitDeactivated((Unit*) replaced_item); } else if(!replaced_item->isActive()) { QList list = categoriesView->findItems("Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); } } } selected_item = v; if(v->category().empty()) { QList list = categoriesView->findItems("Uncategorized", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { QStringList l; l << tr("Uncategorized"); l << "Uncategorized"; list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); new QTreeWidgetItem(list.isEmpty() ? categoriesView->topLevelItem(2) : list[0], l); } } else if(v->category() != CALCULATOR->temporaryCategory()) { QList list = categoriesView->findItems(QStringLiteral("/") + QString::fromStdString(v->category()), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(list.isEmpty()) { if(selected_category != "All") selected_category = "User items"; updateVariables(); emit itemsChanged(); return; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView))); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(selected_category != "All" && selected_category != "User items" && selected_category != std::string("/") + v->category() && (selected_category != "Uncategorized" || !v->category().empty())) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } else { variablesModel->invalidate(); } sourceModel->sort(0); QModelIndex index = variablesModel->mapFromSource(item->index()); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } emit itemsChanged(); } } void VariablesDialog::favouriteClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(!v) return; if(favouriteButton->isChecked()) { settings->favourite_variables.push_back(v); } else { for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) { settings->favourite_variables.erase(settings->favourite_variables.begin() + i); break; } } if(selected_category == "Favorites") { if(settings->favourite_variables.empty()) { QList list = categoriesView->findItems("All", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else { selected_item = NULL; variablesModel->invalidate(); selectedVariableChanged(variablesView->selectionModel()->currentIndex(), variablesView->selectionModel()->currentIndex()); } } } settings->favourite_variables_changed = true; emit favouritesChanged(); } void VariablesDialog::delClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v && v->isLocal()) { sourceModel->removeRow(variablesModel->mapToSource(variablesView->selectionModel()->currentIndex()).row()); selected_item = NULL; v->destroy(); emit itemsChanged(); } } void VariablesDialog::insertClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v) { emit insertVariableRequest(v); } } void VariablesDialog::exportClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v && v->isKnown()) CSVDialog::exportCSVFile(this, NULL, (KnownVariable*) v); } void VariablesDialog::deactivateClicked() { QModelIndex index = variablesView->selectionModel()->currentIndex(); if(!index.isValid()) return; Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(v) { v->setActive(!v->isActive()); QList list = categoriesView->findItems(v->isActive() ? "All" : "Inactive", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } else if(!v->isActive()) { QList list = categoriesView->findItems("User items", Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); QStringList l; l << tr("Inactive"); l << "Inactive"; QTreeWidgetItem *i = new QTreeWidgetItem(categoriesView, list.isEmpty() ? NULL : list[0]); i->setText(0, tr("Inactive")); i->setText(1, "Inactive"); categoriesView->setCurrentItem(i, 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } emit itemsChanged(); } } void VariablesDialog::selectedVariableChanged(const QModelIndex &index, const QModelIndex&) { if(index.isValid()) { Variable *v = (Variable*) index.data(Qt::UserRole).value(); if(CALCULATOR->stillHasVariable(v)) { selected_item = v; std::string str; const ExpressionName *ename = &v->preferredName(settings->printops.abbreviate_names, settings->printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionView); str = ""; str += ename->formattedName(TYPE_VARIABLE, true, true); str += ""; for(size_t i2 = 1; i2 <= v->countNames(); i2++) { if(&v->getName(i2) != ename) { str += ", "; str += v->getName(i2).formattedName(TYPE_VARIABLE, true, true); } } str += "

"; if(v->isKnown()) { bool is_approximate = false; if(((KnownVariable*) v)->get().isMatrix() && ((KnownVariable*) v)->get().columns() * ((KnownVariable*) v)->get().rows() > 16) { str += tr("a matrix").toStdString(); } else if(((KnownVariable*) v)->get().isVector() && ((KnownVariable*) v)->get().size() > 10) { str += tr("a vector").toStdString(); } else { PrintOptions po = settings->printops; po.can_display_unicode_string_arg = (void*) descriptionView; po.interval_display = INTERVAL_DISPLAY_PLUSMINUS; po.base = 10; po.number_fraction_format = FRACTION_DECIMAL_EXACT; po.restrict_to_parent_precision = false; po.allow_non_usable = true; po.is_approximate = &is_approximate; std::string value = CALCULATOR->print(((KnownVariable*) v)->get(), 1000, po, settings->format_result, settings->colorize_result ? settings->color : 0, TAG_TYPE_HTML); if(v->isApproximate() || is_approximate) str += SIGN_ALMOST_EQUAL " "; else str += "= "; str += value; } } else { if(((UnknownVariable*) v)->assumptions()) { QString value; if(((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_BOOLEAN) { switch(((UnknownVariable*) v)->assumptions()->sign()) { case ASSUMPTION_SIGN_POSITIVE: {value = tr("positive"); break;} case ASSUMPTION_SIGN_NONPOSITIVE: {value = tr("non-positive"); break;} case ASSUMPTION_SIGN_NEGATIVE: {value = tr("negative"); break;} case ASSUMPTION_SIGN_NONNEGATIVE: {value = tr("non-negative"); break;} case ASSUMPTION_SIGN_NONZERO: {value = tr("non-zero"); break;} default: {} } } if(!value.isEmpty() && ((UnknownVariable*) v)->assumptions()->type() != ASSUMPTION_TYPE_NONE) value += " "; switch(((UnknownVariable*) v)->assumptions()->type()) { case ASSUMPTION_TYPE_INTEGER: {value += tr("integer"); break;} case ASSUMPTION_TYPE_BOOLEAN: {value += tr("boolean"); break;} case ASSUMPTION_TYPE_RATIONAL: {value += tr("rational"); break;} case ASSUMPTION_TYPE_REAL: {value += tr("real"); break;} case ASSUMPTION_TYPE_COMPLEX: {value += tr("complex"); break;} case ASSUMPTION_TYPE_NUMBER: {value += tr("number"); break;} case ASSUMPTION_TYPE_NONMATRIX: {value += tr("not matrix"); break;} default: {} } if(value.isEmpty()) value = tr("unknown"); str += value.toStdString(); } else { str += tr("Default assumptions").toStdString(); } } if(!v->description().empty()) { str += "

"; str += to_html_escaped(v->description()); } if(v->isActive() != (deactivateButton->text() == tr("Deactivate"))) { deactivateButton->setMinimumWidth(deactivateButton->width()); if(v->isActive()) { deactivateButton->setText(tr("Deactivate")); } else { deactivateButton->setText(tr("Activate")); } } editButton->setEnabled(!v->isBuiltin()); exportButton->setEnabled(v->isKnown() && ((KnownVariable*) v)->get().isVector()); insertButton->setEnabled(v->isActive()); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); for(size_t i = 0; i < settings->favourite_variables.size(); i++) { if(settings->favourite_variables[i] == v) { favouriteButton->setChecked(true); break; } } delButton->setEnabled(v->isLocal() && !settings->isAnswerVariable(v) && v != settings->v_memory && v != CALCULATOR->getVariableById(VARIABLE_ID_X) && v != CALCULATOR->getVariableById(VARIABLE_ID_Y) && v != CALCULATOR->getVariableById(VARIABLE_ID_Z)); deactivateButton->setEnabled(!settings->isAnswerVariable(v) && v != settings->v_memory); descriptionView->setHtml(QString::fromStdString(str)); return; } } editButton->setEnabled(false); insertButton->setEnabled(false); exportButton->setEnabled(false); delButton->setEnabled(false); favouriteButton->setEnabled(true); favouriteButton->setChecked(false); deactivateButton->setEnabled(false); descriptionView->clear(); selected_item = NULL; } void VariablesDialog::selectedCategoryChanged(QTreeWidgetItem *iter, QTreeWidgetItem*) { if(!iter) selected_category = ""; else selected_category = iter->text(1).toStdString(); searchEdit->clear(); variablesModel->setFilter(selected_category); QModelIndex index = variablesView->selectionModel()->currentIndex(); if(index.isValid()) { selectedVariableChanged(index, QModelIndex()); variablesView->scrollTo(index); } } struct tree_struct { std::string item; std::list items; std::list::iterator it; std::list::reverse_iterator rit; tree_struct *parent; void sort() { items.sort(); for(std::list::iterator it = items.begin(); it != items.end(); ++it) { it->sort(); } } bool operator < (const tree_struct &s1) const { return string_is_less(item, s1.item); } }; void VariablesDialog::updateVariables() { size_t cat_i, cat_i_prev; bool b; std::string str, cat, cat_sub; tree_struct variable_cats; variable_cats.parent = NULL; bool has_inactive = false, has_uncat = false; std::list::iterator it; QStandardItem *item_sel = NULL; variablesView->selectionModel()->blockSignals(true); sourceModel->clear(); sourceModel->setColumnCount(1); sourceModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Variable"))); for(size_t i = 0; i < CALCULATOR->variables.size(); i++) { Variable *v = CALCULATOR->variables[i]; if(!v->isActive()) { has_inactive = true; } else { tree_struct *item = &variable_cats; if(!v->category().empty()) { cat = v->category(); cat_i = cat.find("/"); cat_i_prev = 0; b = false; while(true) { if(cat_i == std::string::npos) { cat_sub = cat.substr(cat_i_prev, cat.length() - cat_i_prev); } else { cat_sub = cat.substr(cat_i_prev, cat_i - cat_i_prev); } b = false; for(it = item->items.begin(); it != item->items.end(); ++it) { if(cat_sub == it->item) { item = &*it; b = true; break; } } if(!b) { tree_struct cat; item->items.push_back(cat); it = item->items.end(); --it; it->parent = item; item = &*it; item->item = cat_sub; } if(cat_i == std::string::npos) { break; } cat_i_prev = cat_i + 1; cat_i = cat.find("/", cat_i_prev); } } else { has_uncat = true; } } QStandardItem *item = new QStandardItem(QString::fromStdString(v->title(true, settings->printops.use_unicode_signs, &can_display_unicode_string_function, (void*) variablesView)).replace("MeV/c^2", "MeV/c²")); item->setEditable(false); item->setData(QVariant::fromValue((void*) v), Qt::UserRole); sourceModel->appendRow(item); if(v == selected_item) item_sel = item; } variablesView->selectionModel()->blockSignals(false); sourceModel->sort(0); variable_cats.sort(); categoriesView->blockSignals(true); categoriesView->clear(); categoriesView->blockSignals(false); QTreeWidgetItem *iter, *iter2, *iter3; QStringList l; l.clear(); l << tr("Favorites"); l << "Favorites"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Favorites") { iter->setSelected(true); } l.clear(); l << tr("User variables"); l << "User items"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "User items") { iter->setSelected(true); } if(has_inactive) { //add "Inactive" category if there are inactive variables l.clear(); l << tr("Inactive"); l << "Inactive"; iter = new QTreeWidgetItem(categoriesView, l); if(selected_category == "Inactive") { iter->setSelected(true); } } l.clear(); l << tr("All", "All variables"); l << "All"; iter3 = new QTreeWidgetItem(categoriesView, l); tree_struct *item, *item2; variable_cats.it = variable_cats.items.begin(); if(variable_cats.it != variable_cats.items.end()) { item = &*variable_cats.it; ++variable_cats.it; item->it = item->items.begin(); } else { item = NULL; } str = ""; iter2 = iter3; while(item) { str += "/"; str += item->item; l.clear(); l << QString::fromStdString(item->item).replace("MeV*c^(-2)", "MeV/c²"); l << QString::fromStdString(str); iter = new QTreeWidgetItem(iter2, l); if(str == selected_category) { iter->setExpanded(true); iter->setSelected(true); } while(item && item->it == item->items.end()) { size_t str_i = str.rfind("/"); if(str_i == std::string::npos) { str = ""; } else { str = str.substr(0, str_i); } item = item->parent; iter2 = iter->parent(); iter = iter2; } if(item) { item2 = &*item->it; if(item->it == item->items.begin()) iter2 = iter; ++item->it; item = item2; item->it = item->items.begin(); } } if(has_uncat) { //add "Uncategorized" category if there are variables without category l.clear(); l << tr("Uncategorized"); l << "Uncategorized"; iter = new QTreeWidgetItem(iter3, l); if(selected_category == "Uncategorized") { iter->setSelected(true); } } iter3->setExpanded(true); if(categoriesView->selectedItems().isEmpty()) { //if no category has been selected (previously selected has been renamed/deleted), select "All" selected_category = "All"; iter3->setSelected(true); } searchEdit->blockSignals(true); searchEdit->clear(); searchEdit->blockSignals(false); variablesModel->setFilter(selected_category); QModelIndex index; if(item_sel) index = variablesModel->mapFromSource(item_sel->index()); if(!index.isValid()) index = variablesModel->index(0, 0); if(index.isValid()) { variablesView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); variablesView->scrollTo(index); } selectedVariableChanged(index, QModelIndex()); } void VariablesDialog::setSearch(const QString &str) { searchEdit->setText(str); } void VariablesDialog::selectCategory(std::string str) { QList list = categoriesView->findItems((str.empty() || str == "All") ? "All" : "/" + QString::fromStdString(str), Qt::MatchExactly | Qt::MatchRecursive | Qt::MatchWrap, 1); if(!list.isEmpty()) { categoriesView->setCurrentItem(list[0], 0, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Clear); } } qalculate-qt-5.11.0/src/variablesdialog.h000066400000000000000000000043321520501070600202610ustar00rootroot00000000000000/* Qalculate (QT UI) Copyright (C) 2021 Hanna Knutsson (hanna.knutsson@protonmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef VARIABLES_DIALOG_H #define VARIABLES_DIALOG_H #include #include class QTreeView; class QTreeWidget; class QTextEdit; class QTreeWidgetItem; class QStandardItemModel; class QPushButton; class QLineEdit; class QSplitter; class ItemProxyModel; class QAbstractButton; class VariablesDialog : public QDialog { Q_OBJECT protected: QTreeView *variablesView; QTreeWidget *categoriesView; QTextEdit *descriptionView; ItemProxyModel *variablesModel; QStandardItemModel *sourceModel; QPushButton *deactivateButton, *insertButton, *delButton, *exportButton, *editButton, *newButton; QAbstractButton *favouriteButton; QLineEdit *searchEdit; QSplitter *vsplitter, *hsplitter; std::string selected_category; ExpressionItem *selected_item; void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent*) override; void newVariable(int); protected slots: void selectedCategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*); void selectedVariableChanged(const QModelIndex&, const QModelIndex&); void newVariable(); void newMatrix(); void newUnknown(); void editClicked(); void delClicked(); void insertClicked(); void exportClicked(); void deactivateClicked(); void favouriteClicked(); void searchChanged(const QString&); public: VariablesDialog(QWidget *parent = NULL); virtual ~VariablesDialog(); void updateVariables(); void setSearch(const QString&); void selectCategory(std::string); void variableRemoved(Variable*); void variableDeactivated(Variable*); bool eventFilter(QObject*, QEvent*) override; public slots: void reject() override; signals: void itemsChanged(); void favouritesChanged(); void unitRemoved(Unit*); void unitDeactivated(Unit*); void applyVariableRequest(Variable*); void insertVariableRequest(Variable*); }; #endif //VARIABLES_DIALOG_H qalculate-qt-5.11.0/translations.qrc000066400000000000000000000013041520501070600174150ustar00rootroot00000000000000 translations/qalculate-qt_ca.qm translations/qalculate-qt_de.qm translations/qalculate-qt_en.qm translations/qalculate-qt_es.qm translations/qalculate-qt_fr.qm translations/qalculate-qt_ka.qm translations/qalculate-qt_nl.qm translations/qalculate-qt_pt_BR.qm translations/qalculate-qt_pt_PT.qm translations/qalculate-qt_ru.qm translations/qalculate-qt_sl.qm translations/qalculate-qt_sv.qm translations/qalculate-qt_zh_CN.qm translations/qalculate-qt_zh_TW.qm qalculate-qt-5.11.0/translations/000077500000000000000000000000001520501070600167105ustar00rootroot00000000000000qalculate-qt-5.11.0/translations/qalculate-qt_ca.ts000066400000000000000000017025551520501070600223370ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora poderosa i fàcil a usar calculation;arithmetic;scientific;financial; calculation;arithmetic;scientific;financial; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). El Qalculate! és una calculadora d'escriptori per a diverses plataformes i finalitats. És senzill a usar però proporciona poder i versatilitat que normalment es reserva als paquets de matemàtica complicats, així com eines útils per a necessitats diàries (com la conversió de monedes i calculació de percentatge). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Les característiques inclouen una biblioteca amplia de funcions personalitzables, calculació i conversió d'unitat, constants físics, càlculs simbòlics (incloent integrals i equacions), precisió arbitrària, propagació d'incertesa, aritmètica d'interval, dibuix i una interfície fàcil d'emprar. Argument Rules Regles d'argument _Cancel _Cancel·la Do not save modifications No desis modificacions _OK _D'acord Accept the modification of argument rules Accepta la modificació de regles d'argument Enable rules and type test Habilita regles i verificació de tipus Custom condition Condició personalitzada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Per exemple, si l'argument és una matriu que ha de tenir un nombre igual de files i columnes: rows(\x) = columns(\x) Allow matrix Permet matriu Forbid zero Prohibeix zero Handle vector Tractar amb vectors Calculate function for each separate element in vector. Calcula la funció per cada element distint en el vector. Min Mín Include equals Inclusiu Max Màx Keyboard Shortcuts Dreceres de teclat _Close _Tanca Label Etiqueta Left-click Clic esquerre Right-click Clic dret Middle-click Clic del mig Reset Restableix Button Action Acció del botó Value Valor Argument name Nom d'argument Calendar Conversion Conversió de calendari Export CSV File Exporta fitxer CSV Current result Resultat actual Matrix/vector variable Variable de matriu/vector File Fitxer Delimiter Delimitador Comma Coma Tabulator Tabulador Semicolon Punt i coma Space Espai Other Altre Import CSV File Importació de fitxer CSV Do not import the file No importis el fitxer Import the file Importa el fitxer Name of the data file to import Nom del fitxer de dades a importar Select a file Selecciona un fitxer Import as Importa com a Matrix Matriu If a matrix shall be generated from the contents of the file Si es generarà una matriu dels continguts del fitxer Vectors Vectors If vectors shall be generated from the contents of the file Si es generaran vectors dels continguts del fitxer Name Nom Name (or name prefix) used to reference generated variable(s) in expressions Nom (o prefix de nom) usat per a referir a les variables generades en expressions Descriptive name Nom descriptiu Title displayed in menus and in variable manager Títol mostrat en els menús i en el gestor de variables Category Categoria First row Primera fila The first row with data to import in the file La primera fila amb dades a importar en el fitxer Includes headings Inclou encapçalaments If the first row contains column headings Si la primera fila conté encapçalaments de columna Delimiter used to separate columns in the file Delimitador usat per a separar les columnes en el fitxer Custom delimiter Delimitador personalitzat Edit Data Property Edició de propietat de dades Do not create/modify this data set No creis o no modifiques aquest conjunt de dades Accept the creation/modification of this data set Accepta la creació o modificació d'aquest conjunt de dades Name used for reference Nom usat per a referència Properties Propietats Title displayed in menus and in data set manager Títol mostrat en els menús i en el gestor de conjunts de dades Description Descripció Description of this data property Descripció d'aquesta propietat de dades Value Type Tipus de valor Text Text Number Nombre Expression Expressió Hide Amaga Use as key Usa com a clau Approximate value Valor aproximat Case sensitive value Valor sensitiu a majúscules i minúscules Value uses brackets El valor usa claudàtors Unit expression Expressió d'unitat Edit Data Set Edició de conjunt de dades Title Títol Data file Fitxer de dades Description of this data set Descripció d'aquest conjunt de dades Copyright Dret d'autor General General Properties: Propietats: Definition of the properties of this data set Definició de les propietats d'aquest conjunt de dades _New _Nou _Edit _Edita _Delete _Suprimeix Name used to invoke the function in expressions Nom usat per a invocar la funció en les expressions Object argument name Nom d'argument d'objecte Property argument name Nom d'argument de propietat Default property Propietat predeterminat Function Funció Edit Data Object Edició d'objecte de dades Do not create/modify this data object No creis o no modifiques aquest objecte de dades Accept the creation/modification of this data object Accepta la creació o modificació d'aquest object de dades Data Sets new dataset Conjunts de dades Data Set Conjunt de dades Create a new data set Crea un conjunt de dades nou Edit the selected data set Edita el conjunt de dades seleccionat Delete the selected data set Suprimeix el conjunt de dades seleccionat Objects Objectes Create a new data object Crea un objecte de dades nou Edit the selected data object Edita l'objecte de dades seleccionat Remove the selected data object Elimina l'object de dades seleccionat Data Set Description Descripció de conjunt de dades Object Attributes Atributs d'objecte Decimals Decimals Close this window Tanca aquesta finestra Min decimals Mín de decimals Max decimals Màx de decimals Minimal number of displayed decimals Nombre mínim de decimals mostrats Maximal number of decimals to display (and round to) Nombre màxim de decimals a mostrar (i al qual arrodonir) Floating Point Conversion Conversió de punt flotant Decimal value Valor decimal Binary value Valor binari Octal value Valor octal Hexadecimal representation Representació hexadecimal Conversion error Error de conversió Binary representation Representació binària Floating point value Valor de punt flotant Format Format 16-bit (half precision) 16 bits (precisió mitja) 32-bit (single precision) 32 bits (precisió singular) 64-bit (double precision) 64 bits (precisió doble) 80-bit (x86 extended format) 80 bits (format x86 estès) 128-bit (quadruple precision) 128 bits (precisió quàdruple) Hexadecimal value Valor hexadecimal Edit Function Edició de funció _Help A_juda Do not create/modify this function No creis ni modifiques aquesta funció Accept the creation/modification of this function Accepta la creació o modificació d'aquesta funció Name used to invoke this function in expressions Nom usat per a invocar aquesta funció en les expressions Title displayed in menus and in function manager Títol que es mostra en els menús i en el gestor de funcions Hide function Amaga la funció If this function shall be hidden in menus Si aquesta funció es deu amagar en els menús Description of this function Descripció d'aquesta funció Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Useu \x pel primer, \y pel segon i \z pel tercer argument. Per més informació, feu clic en el botó d'ajuda. Condition Condició Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") La condició que ha de ser cert per a la funció (per exemple, si el segon argument ha de ser més gran que el primer: "\y > \x") Sub-Functions Subfuncions Arguments: Arguments: Definition of this function's arguments Definició dels arguments d'aquesta funció Free Libre Integer Enter Symbol Símbol Date Dada Vector Vector Positive number Nombre positiu Non-zero number Nombre no zero Non-negative number Nombre no negatiu Positive integer Enter positiu Non-zero integer Enter no zero Non-negative integer Enter no negatiu Boolean Booleà Object Objecte Unit Unitat Variable Variable Angle Angle Data object Objecte de dades Data property Propietat d'objecte _Add _Afegeix Add entered argument definition Afegeix la definició d'argument introduïda _Apply _Aplica Modify selected argument Modifica l'argument seleccionat Remove selected argument Elimina l'argument seleccionat Rules Regles Edit conditions for selected argument Edita les condicions per a l'argument seleccionat Close this dialog Tanca aquest diàleg Precalculate Precalcula Calculate the subfunction only once, before the parent function Calcula la subfunció només una vegada, abans de la funció mare Add entered subfunction Afegeix la subfunció introduïda Apply changes to the selected subfunction Aplica els canvis a la subfunció seleccionada Remove the selected subfunction Elimina la subfunció seleccionada Functions Funcions Create a new function Crea una funció nova Edit the selected function Edita la funció seleccionada _Insert _Insereix Insert (or execute) the selected function into the expression entry Insereix (o executa) la funció seleccionada en l'entrada d'expressió Delete the selected function Elimina la funció seleccionada (De)activate the selected function (Des)activa la funció seleccionada Deacti_vate Desacti_va Apply the selected function to the current expression Aplica la funció seleccionada a l'expressió actual Categor_y Categor_ia _Function _Funció Descri_ption Descri_pció Degrees Graus Radians Radians Gradians Gradians Default assumptions Suposicions predeterminades Unknown Desconeguda Not Matrix No matriu Complex Complex Real Real Rational Racional Non-Zero No zero Positive Positiu Non-Negative No negatiu Negative Negatiu Non-Positive No positiu _File _Fitxer Unknown Variable Variable desconeguda Function (simplified) Funció (simplificada) Import CSV File… Importa un fitxer CSV… Export CSV File… Exporta un fitxer CSV… _Store Result… _Desa el resultat… Save Result Image… Desa una imatge del resultat… Save local functions, variables and units Desa les funcions, variables i unitats locals Save Definitions Desa les definicions Import Definitions File… Importa un fitxer de definicions… Fetch current exchange rates from the Internet Obté taxes d'intercanvi actuals de l'Internet Update Exchange Rates Actualitza les taxes d'intercanvi Plot Functions/Data Dibuixa funcions/dades Convert Number Bases Converteix bases numèriques Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Percentage Calculation Tool Eina de càlcul de percentatge Periodic Table Taula periòdica Minimal Window Finestra mìmima _Quit _Surt Manage Variables Gestiona les variables Manage Functions Gestiona les funcions Manage Units Gestiona les unitats Manage Data Sets Gestiona els conjunts de dades Factorize Factoritza Expand Expandeix Apply partial fraction decomposition to the current result. Aplica la descomposició en fraccions parcials al resultat actual. Expand Partial Fractions Expandeix fraccions parcials Set Unknowns… Estableix les desconegudes… Convert to Unit Converteix a unitat Set Prefix Estableix prefix Convert to Unit Expression… Converteix a una expressió d'unitat… Convert to Base Units Converteix a unitats bases Convert to Optimal Unit Converteix a la unitat òptima Insert Date… Insereix data… Insert Matrix… Insereix matriu… Insert Vector… Insereix vector… _Copy Result _Copia el resultat Customize Keypad Buttons Personalitza els botons de teclat numèric _Preferences _Preferències _Mode _Mode Number Base Base numèrica Select Result and Expression Base… Selecciona la base del resultat i de l'expressió… Binary Binària Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Altra… Sexagesimal Sexagesimal Time Format Format de temps Roman Numerals Nombres romans Numerical Display Presentació numèrica Normal Normal Engineering Enginyeria Scientific Científica Purely Scientific Científica pura Simple Senzill Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desactivat: 1/7 ≈ 0,14285714 Activat: 1/7 = 0,142857 142857... Indicate Repeating Decimals Indica els decimals periòdics Show Ending Zeroes Mostra els zeros finals Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desactivat: 2,5 ≈ 3, 1,5 ≈ 2 Activat: 2,5 ≈ 2, 1,5 ≈ 2 Round Halfway Numbers to Even Arrodoneix els nombres a mig camí al par Off: -x + y On: y - x Desactivat: -x + y Activat: y - x Sort Minus Last Ordena els negatius al final Complex Rectangular Form Forma rectangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notació complexa d'angle o de fasor Rational Number Form Forma de nombres racionals 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Fraccions decimals 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Fraccions decimals exactes 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fraccions senzilles 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fraccions mixtes Interval Display Presentació d'intervals Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desactivat: 1/2*pi ≈ 1,5707963 Activat: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula un interval de valors possibles i rastreja els canvis de precisió. Significant Digits Xifres significants Interval Interval Plus/Minus Més/Menys Midpoint Punt mitjà Unit Display Presentació d'unitats Do not use any prefixes in result No usis cap prefix en el resultat Show prefixes for primarily SI and CGS units. Mostra els prefixes per a unitats principalment SI i CGS. Use prefixes for selected units Usa prefixes per a les unitats seleccionades Use prefixes also for currencies Usa prefixes també per a les monedes Use prefixs for all units Usa prefixes per a totes les unitats Enables automatic use of hekto, deka, deci and centi when prefixes are enabled Habilita l'ús automàtic de hecto, deka, deci i centi quan els prefixes estén habilitades Enable All SI Prefixes Habilita tots els prefixes SI Enables automatic setting of prefix for denominator in addition to the numerator Habilita l'establiment automàtic del prefix del denominador a més del numerador Enable Denominator Prefixes Habilita els prefixes de denominador Off: J / K On: J * K^-1 Desactivat: J / K Activat: J * K^-1 Negative Exponents Exponents negatius Off: (2 m)/s On: 2 (m/s) Desactivat: (2 m)/s Activat: 2 (m/s) Place Units Separately Separa les unitats No Additional Conversion Cap conversió addicional Convert to Optimal SI Unit Converteix a la unitat SI òptima If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si està habilitat: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Convert to Mixed Units Converteix a unitats mixtes Abbreviate Names Abrevia els noms Enabled Objects Objectes habilitats Variables Variables Units Unitats Unknowns Desconegudes Units in Physical Constants Unitats en constants físics If not enabled, treats all variables as unknown Si no està habilitat, tracta totes les variables com a desconegudes Calculate Variables Calcula les variables Disables/enables complex numbers in result Deshabilita/habilita els nombres complexes en el resultat Allow Complex Result Permet un result complex Disables/enables infinite numbers in result Deshabilita/habilita nombres infinits en el resultat Allow Infinite Result Permet resultat d'infinit Approximation Aproximació Always Exact Sempre sigues exacte Try Exact Intenta ser exacte Approximate Aproxima Interval Arithmetic Aritmètica d'interval Interval Calculation Càlcul d'interval Variance Formula Fórmula de variància Change angle unit used in trigonometric functions Canvia la unitat d'angle que s'usa en les funcions trigonomètriques Angle Unit Unitat d'angle None Cap Assumptions Suposicions Algebraic Mode Mode algebraic Assume that unknown denominators are non-zero Presumeix que els denominadors desconeguts no siguin zero Non-Zero Denominators Denominadors no zero Warn when unknown denominators are assumed non-zero Adverteix quan es presumeix que els denominadors desconeguts no siguin zero Warn About Denominators Assumed Non-Zero Adverteix en quant als denominadors presumiblement no zeros Parsing Mode Mode d'anàlisi Adaptive Parsing Anàlisi adaptiva Parse Implicit Multiplication First Analitza primer la multiplicació implícita Conventional Parsing Anàlisi convencional Chain Syntax Sintaxi de cadena RPN Syntax Sintaxi NPI Off: xy = x*y On: xy != x*y Desactivat: xy = x*y Activat: xy != x*y Limit Implicit Multiplication Limita la multiplicació implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analitza els nombres decimals com a aproximats amb precisió igual al nombre de xifres. Desactivat: 1.1 * 1.1 = 1.21 Activat: 1.1 * 1.1 ≈ 1.2 Read Precision Llegeix la precisió _Precision _Precisió _Decimals _Decimals Calculate As You Type Calcula mentre teclegeu Chain Mode Mode de cadena Activate the RPN stack. Activa la pila NPI. RPN Mode Mode NPI Meta Modes Metamodes Save Mode… Desa el mode… Delete Mode… Suprimeix el mode… Save Default _Mode Desa com al _mode predeterminat Fu_nctions Fu_ncions _Variables _Variables _Units _Unitats _Contents _Continguts Report a Bug Informa d'un error Check for Updates Cercar actualitzacions _About _Quant al Toggle minimal window Commuta la finestra mínima Calculation result Resultat del càlcul _Keypad _Teclat numèric Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Commuta el teclat numèric persistent (fa possible mostrar el teclat numèric i l'historial simultàniament) _History _Historial C_onversion C_onversió RPN Stack Pila NPI Insert the selected value Insereix el valor seleccionat Insert the selected text Insereix el text seleccionat Copy the selected text Copia el text seleccionat Add the selected value(s) Addiciona el(s) valor(s) seleccionat(s) Subtract the selected value(s) Sostreu el(s) valor(s) seleccionat(s) Multiply the selected value(s) Multiplica el(s) valor(s) seleccionat(s) Divide the the selected value(s) Divideix el(s) valor(s) seleccionat(s) Raise to the power of the selected value Exponencia al valor seleccionat Calculate the square root of the selected value Calcula l'arrel quadrada del valor seleccionat History Historial Subtract the top value from the second value Sostreu el últim valor del penúltim Multiply the top two values Multiplica el dos últims valors Divide the second value by the top value Divideix el penúltim valor pel últim Raise the second value to the power of the top value Exponencia el penúltim valor al últim Negate the top value (Ctrl+-) Negar el últim valor (Ctrl+-) Invert the top value Inverteix el últim valor Calculate the square root of the top value Calcula l'arrel quadrada del últim valor Calculate the sum of all values Calcula la suma de tots els valors Rotate the stack or move selected register up Roda la pila o mou el registre seleccionat amunt Rotate the stack or move selected register down Roda la pila o mou el registre seleccionat avall Swap the two top values or move the selected value to the top of the stack Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila Copy the selected or top value to the top of the stack Copia el valor seleccionat o el últim al cim de la pila Enter the top value from before the last numeric operation Introdueix el úlim valor d'abans de la darrera operació numèrica Delete the top or selected value Suprimeix el últim valor o el seleccionat Edit the selected value Edita el valor seleccionat Clear the RPN stack Neteja la pila NPI Unit(s) and prefix to convert result to Unitat(s) i prefix als quals convertir el resultat Convert Converteix Continuous conversion Conversió contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Automàticament converteix el resultat a l'expressió d'unitat actual sempre que la caixa de conversió sigui visible. Add prefix Afegeix un prefix If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si l'expressió d'unitat no conté cap prefix, usa el prefix òptim. Això es pot anular preposant l'expressió d'unitat amb "?" o "0". Conversion Conversió Show/hide programming keypad Mostra/amaga el teclat programari Exact Exacte Fraction Fracció Numerical display Presentació numèrica Pure Pura Number base Base numèrica Time format Format de temps Roman Romana sin sin cos cos tan tan ln ln Equals És sqrt arrelq sum suma Unknown variable Variable desconeguda mod mod mean mitjana Store result as a variable Desa el resultat com a variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converteix entre bases numèriques Imaginary unit i (√-1) Unitat imaginària i (√-1) Manage units Gestiona les unitats Conversion operator Operador de conversió Kilogram Quilograma Two's complement input Entrada de complement a dos Two's complement output Sortida de complement a dos Bitwise Exclusive OR OR exclusiu bit a bit Bitwise Left Shift Desplaçament a l'esquerra bit a bit Bitwise Right Shift Desplaçament a la dreta bit a bit Floating point conversion Conversió de punt flotant Show/hide left keypad Mostra/amaga el teclat numèric esquerre Show/hide right keypad Mostra/amaga el teclat numèric dret DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultat prèvi ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Afegeix a l'expressió Persistent Keypad Teclat numèric persistent Edit Edita Delete Suprimeix Update Actualitza Insert Value Insereix el valor Insert Text Insereix el text Insert Parsed Text Insereix el text analitzat Copy Copia Copy Full Text Copia el text complet Search… Cerca… Add Bookmark… Afegeix un marcador… Bookmarks Marcadors Protect Protegeix Move To Top Mou al cim Remove Elimina Clear All Neteja tot _Copy _Copia _Store… _Desa… Save Image… Desa una imatge… _Factorize _Factoritza _Expand _Expandeix _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Cientifica P_ura Simp_le Senzi_lla _Binary _Binaria _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fracció decimal Exact Decimal Fraction Fracció decimal exacta Simple Fraction Fracció senzilla Mixed Fraction Fracció mixta _Abbreviate Names _Abrevia els noms C_onvert… C_onverteix… Convert to Base _Units Converteix a _unitats bases Convert _to Optimal Unit Converteix a la unitat òp_tima Use Optimal Prefix Usa el prefix òptim Convert to Converteix a Convert to UTC Converteix a UTC Convert to Calendars Converteix entre calendaris Use prefixes for all units Usa prefixes per a totes les unitats Enable All SI Prefi_xes Habilita tots els prefi_xes SI View/Edit Matrix Visualitza/edita la matriu View/Edit Vector Visualitza/edita el vector Copy Text Copia el text To Top Al cim Swap Intercanvia Up Amunt Down Avall Negate Nega Invert Inverteix Square Quadra Square Root Arrel quadrada Clear Stack Neteja la pila Select Number Base… Selecciona la base numèrica… Store result Desa el resultat Add result Add current result to variable value Addiciona el resultat Subtract result Subtruct current result from variable value Sostreu el resultat Insert the matrix/vector into the expression Insereix la matriu o el vector en l'expressió Rows Files Number of rows in this matrix (rows displayed for vectors) Nombre de files en aquesta matriu (files mostrades per als vectors) Columns Columnes Number of columns in this matrix (columns displayed for vectors) Nombre de columnes en aquesta matriu (columnes mostrades per als vectors) If this is a matrix or vector Si això és una matriu o un vector Elements Elements Current element: Element actual: Edit Matrix Edició de matriu Do not create/modify this matrix/vector No creis/modifiques aquesta matriu o aquest vector Create/modify the matrix/vector Crea/modifica la matriu o el vector Accept the creation/modification of this matrix/vector Accepta la creació/modificació d'aquesta matriu o d'aquest vector Name used to reference this variable in expressions Nom usat per a referir a aquesta variable en les expressions Names Noms Add new name Afegeix un nom nou Apply changes to the selected name Aplica els canvis al nom seleccionat Remove the selected name Elimina el nom seleccionat Abbreviation Abreviatura Unicode Unicode Plural Plural Suffix Sufix Reference Referència Avoid input Evita l'entrada Case sensitive Distingeix entre majúscules i minúscules Completion only Només compleció Number Bases Bases numèriques Roman numerals Numerals romans BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Sostreu Multiply Multiplica Divide Divideix Bitwise AND AND bit a bit Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear Neteja Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduïu dos valors, dels quals al màxim un és percentatge, i es calcularan els altres per a vostè. Percentage Porcentatge Calculate Calcula Value 1 Valor 1 2 compared to 1 2 comparat amb 1 Change from 1 to 2 Canvi de 1 a 2 Value 2 Valor 2 1 compared to 2 1 comparat amb 2 Change from 2 to 1 Canvi de 2 a 1 Plot Dibuix _Save _Desa Save as png, svg, postscript, eps, latex or fig Desa com a png, svg, postscript, eps, latex o fig Vector/matrix Vector/matriu Paired matrix Matriu emparellada if you want to split matrix in rows instead of columns si voleu dividir la matriu en files en lloc de columnes X variable Variable X The variable name used in expression El nom de variable usat en l'expressió Style Estil Line Línia Points Punts Line with points Línia amb punts Boxes/bars Caixes/barres Histogram Histograma Steps Pasos Candlesticks Candelers Dots Cercles Smoothing Suavitzat Monotonic Monotònic Natural cubic splines Spline cúbic natural Bezier Bézier Bezier (monotonic) Bézier (monotònic) Y-axis Eix Y Primary Principal Secondary Secondari _Remove _Elimina Data Dades Minimum x value Valor x mìnim Maximum x value Valor x màxim Sampling rate Taxa de mostreig Step size Mida de passos Function Range Rang de funció Display grid Mostra una graella Display full border Mostra la vora completa Minimum y value Valor y mínim Maximum y value Valor y màxim Logarithmic x scale Escala x logarítmica Logarithmic y scale Escala y logarítmica X-axis label Etiqueta de l'eix X Y-axis label Etiqueta de l'eix Y Line width Amplada de línia Color display Presentació acolorida Color Color Monochrome Monocrom Legend placement Posició de la llegenda Top-left Superior-esquerra Top-right Superior-dreta Bottom-left Inferior-esquerra Bottom-right Inferior-dreta Below A baix Outside A fora Appearance Aparència Precision Precisió _Recalculate _Recalcula Recalculate expression Recalcula l'expressió The number of significant digits to display/calculate (simple arithmetics are always calculated exact) El nombre de xifres significats a mostrar/calcular (l'aritmètica senzilla sempre es calcula amb exactitud) Preferences Preferències Save mode on exit Desa el mode en surtir If the mode of the calculator shall be restored Si el mode del calculador es restaurarà Save definitions on exit Desa les definicions en surtir If changes to functions, units and variables shall be saved automatically Si els canvis a les funcions, unitats i variables es desaran automàticament Clear history on exit Neteja l'historial en surtir Allow multiple instances Permet múltiples instàncies Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permet que s'obrin múltiples instàncies de la finestra principal a la vegada. Tingueu en compte que només es desaran el mode, l'historial i les definicions de la última instància tancada. Notify when a new version is available Notifica quan una versió nova estigui disponible Use keyboard keys for RPN Usa les tecles del teclat per a la NPI Use keyboard operator keys for RPN operations (+-*/^). Usa les tecles d'operador del teclat per a les operacions NPI (+-*/^). Use caret for bitwise XOR Usa el caret per XOR bit a bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Introdueix el XOR (⊻) mitjançant el caret (^) en el teclat (d'altra manera, usa Ctrl+^). Sempre es pot introduir l'operador d'exponenciació (^) mitjançant Ctrl+*. Add calculate-as-you-type result to history Afegeix, mentre teclegeu, el resultat del càlcul a l'historial Delay: Retard: Time limit for plot: Limit de temps del dibuix: Behavior Comportament Enable Unicode symbols Habilita els símbols d'Unicode Disable this if you have problems with some fancy characters Deshabilita això si teniu problemes amb alguns caràcters sofisticats Ignore system language (requires restart) Ignora la llengua del sistema (requereix reinici) Use system tray icon Usa una icona en la safata del sistema Hides the application in the system tray when the main window is closed Amaga l'aplicació en la safata del sistema quan es tanca la finestra principal Hide on startup Amaga en iniciar Remember window position Recorda la posició de la finestra Keep above other windows Manté superior a les altres finestres Keep the main window above other windows (depending on platform and settings this might not work) Manté la finestra principal superior a les altres finestres (depenent del plataforma i de la configuració del sistema, potser no funciona) Application name Nom d'aplicació Result Resultat Application name + result Nom d'aplicació + resultat Mode Mode Application name + mode Nom d'aplicació + mode Window title Títol de finestra Default Predeterminat Light Clar Dark Fosc High contrast Contrast alt Dark high contrast Contrast alt fosc Theme Tema Button padding Espaiat de botó / / Number of expression lines Nombre de línies d'expressió 3 3 Display expression status Mostra l'estat de l'expressió If as-you-type expression status shall be displayed below the expression entry Si, mentre teclegeu, l'estat d'expressió es mostrarà abaix de l'entrada d'expressió Persistent keypad Teclat numèric persistent Look & Feel Aparença Binary two's complement representation Representació binaria de complement a dos If two's complement representation shall be used for negative binary numbers. Si la representació de complement a dos s'usarà pels nombres binaris negatius. Hexadecimal two's complement representation Representació hexadecimal de complement a dos If two's complement representation shall be used for negative hexadecimal numbers. Si la representació de complement a dos s'usarà pels nombres hexadecimals negatius. Use lower case letters in non-decimal numbers Usa lletres minúscules en nombres no decimals If lower case letters should be used in numbers with non-decimal base Si es deuen usar lletres minúscules en els nombres amb base no decimal Alternative base prefixes Prefixes de base alternatius If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si es mostraran els nombres hexadecimals amb "0x0" i els nombres binaris amb "0b00" com a prefixes Spell out logical operators Enuncia els operadors lògics If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si i/o lògics es mostraran com a "&&"/"||" o "and"/"or" If "e" shall be used instead of "E" in numbers Si s'usarà "e" en lloc de "E" en nombres Use E-notation instead of 10<sup><i>n</i></sup> Usa la notació E en lloc de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usa "e" minúscula (tal com 1e10) Use 'j' as imaginary unit Usa 'j' com a unitat imaginària Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front of the imaginary part. Usa 'j' (en lloc de 'i') com al símbol predeterminat pela unitat imaginària, i col·loca'l davant la part imaginària. Use comma as decimal separator Usa la coma com a separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permet que els punts, '.', s'usin com a separador de millars en lloc d'un signe decimal alternatiu Ignore comma in numbers Ignora comas en els nombres Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permet que les comes, ',', s'usin com a separador de millars en lloc de ser un separador dels arguments d'una funció Ignore dots in numbers Ignora els punts en els nombres Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permet que els punts, '.', s'usin com a separador de millars en lloc d'un signe decimal alternatiu Digit grouping Agrupament de xifres off desactivat standard estàndar local local Multiplication sign Signe de multiplicació Division sign Signe de divisó Copy digit separator Copia els separadors de xifres Deactivate to remove digit separator when copying result Desactiva per a eliminar els separadors de xifres quan es copia el resultat Numbers & Operators Nombres i operadors Use binary prefixes for information units Una els prefixes binaris per a les unitats d'informació Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usa els prefixes binaris, en lloc dels decimals, per defecte per a les unitats d'informació (e.g. bytes). Conversion to local currency Conversió a la moneda local Automatically convert to the local currency when optimal unit conversion is activated. Converteix a la moneda local automàticament quan la conversió d'unitat òptima està activada. Update exchange rates on start Actualitza les taxes d'intercanvi en iniciar If current exchange rates shall be downloaded from the internet at program start Si les taxes d'intercanvi actuals es descarregaran de l'Internet a l'inici del programa Exchange rates updates Actualitzacions de taxes d'intercanvi Temperature calculation mode: Mode de càlcul de temperatura: Absolute Absolut Relative Relatiu Hybrid Híbrid Units & Currencies Unitats i monedes Show expression completion suggestions Mostra els suggeriments de compleció d'expressió Search titles and countries Cerca en els títols i països Minimum characters Caràcters mínims Popup delay (ms) Retard de caixa emergent (ms) Completion Compleció Status warning color Color d'estat d'advertència Status error color Color d'estat d'error Custom status font Tipus de lletra personalitzat per a l'estat If you want to use a font other than the default in the status display below the expression entry Si voleu usar altre tipus de lletra que el predeterminat en la presentació de l'estat abaix de l'entrada d'expressió Custom expression font Tipus de lletra personalitzat per a l'expressió If you want to use a font other than the default in the expression entry Si voleu usar altre tipus de lletra que el predeterminat en l'entrada d'expressió Custom result font Tipus de lletra personalitzat per al resultat If you want to use a font other than the default in the result display Si voleu usar altre tipus de lletra que el predeterminat en la presentació del resultat Custom keypad font Tipus de lletra personalitzat per al teclat numèric If you want to use a font other than the default in the keypad Si voleu usar altre tipus de lletra que el predeterminat en el teclat numèric Custom application font Tipus de lletra personalitzat per a l'aplicació If you want to use a font other than the default for the whole application Si voleu usar altre tipus de lletra que el predeterminat per a l'aplicació sencera Text color Color de text Fonts & Colors Tipus de lletra i colors Other: Altra: Bijective base-26 Base 26 bijectiva <b>Result Base</b> <b>Base del resultat</b> <b>Expression Base</b> <b>Base de l'expressió</b> New Keyboard Shortcut Drecera de teclat nova Edit Variable Edita la variable Advanced Avançat Accept the creation/modification of this variable Accepta la creació/modificació d'aquesta variable x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Usa x, y i z pel primer, segon i tercer argument de funció, respectivament. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Usa \x, \y i \z pel primer, segon i tercer argument de funció, respectivament. Això evita conflictes potencials amb variables, funcions i unitats. Edit Unit Edita la unitat Do not create/modify this unit No creis/modifiquis aquesta unitat Accept the creation/modification of this unit Accepta la creació/modificació d'aquesta unitat Singular form of this unit's name Forma singular del nom d'aquesta unitat Title displayed in menus and in unit manager Títol mostrat en els menús i en el gestor d'unitats System Sistema Imperial Imperial US Survey Agrimensura estatunidenca Hide unit Amaga la unitat If this unit shall be hidden in menus Si s'amagarà aquesta unitat en els menús Class Classe The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe a la qual pertany aquesta unitat. Es defineixen les unitats derivades anomenades en relació a una sola altra unitat, amb un exponent opcional, mentre es defineixen les unitats derivades (sense nom) per una expressió d'unitat amb una unitat o múltiples unitats. Base unit Unitat base Named derived unit Unitat derivada anomenada Derived unit Unitat derivada Base unit(s) Unitat(s) base(s) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unitat (per a una unitat derivada amb nom) o expressió d'unitat (per a una unitat derivada sense nom) a la qual aquesta unitat està definida Exponent Exponent Exponent of the base unit Exponent de la unitat base Relation Relació Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relació a la unitat base. Per als relacions linears això només deu ser un nombre. Per a les relacions no linears useu \x pel factor i \y pel exponent (per exemple "\x + 273.15" pela relació entre graus Celsius i Kelvin). Relation is exact La relació és exacta If the relation is precise Si la relació és precisa Inverse relation Relació inversa Specify for non-linear relation, for conversion back to the base unit. Especifiqueu per a relació no linear, per a conversió de retorn a la unitat base. Mix with base unit Mescla amb la unitat base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decideix amb quines unitats es mescla la unitat base si existeixen múltiples opcions. - No es mesclarà la unitat original amb unitats de prioritat més baixa. - Un valor inferior vol dir prioritat superior. Priority Prioritat Minimum base unit number Nombre d'unitat base mínim Use with prefixes by default Usa amb prefixes per defecte Create a new unit Crea una unitat nova Edit the selected unit Edita la unitat seleccionada Insert the selected unit into the expression entry Insereix la unitat seleccionada en l'entrada d'expressió C_onvert C_onverteix Convert the result to the selected unit Converteix el resultat a la unitat seleccionada Delete the selected unit Suprimeix la unitat seleccionada (De)activate the selected unit (Des)activa la unitat seleccionada _Unit _Unitat Convert between units Converteix entre unitats = = Conver_sion Conver_sió Converted value Valor convertit Value to convert from Valor del qual convertir Type anywhere Teclegeu en qualsevol lloc Edit Unknown Variable Edició de variable desconeguda Do not create/modify this unknown variable No creis/modifiques aquesta variable desconeguda Accept the creation/modification of this unknown variable Accepta la creació/modificació d'aquesta variable desconeguda Name used to reference this unknown variable in expressions El nom usat per a referir a aquesta variable desconeguda en les expressions Use custom assumptions Usa suposicions personalitzades Type Tipus Real Number Nombre real Rational Number Nombre racional Sign Signe The category this unknown variable belongs to La categoria a la qual pertany aquesta variable desconeguda Value of this variable (expression) Valor d'aquesta variable (expressió) value is exact el valor és exacte If the value is precise Si el valor es precise The category this variable belongs to La categoria a la qual pertany aquesta variable Create a new variable Crea una variable nova Edit the selected variable Edita la variable seleccionada Insert the selected variable into the expression entry Insereix la variable seleccionada a l'entrada d'expressió Delete the selected variable Elimina la variable seleccionada (De)activate the selected variable (Des)activa la variable seleccionada E_xport E_xporta _Variable _Variable Execute expressions and commands from a file Executa expressions i ordres d'un fitxer Start a new instance of the application Inicia una instància nova de l'aplicació Display the application version Mostra la versió de l'aplicació Specify the window title Especifica el títol de finestra TITLE TÃ�TOL Expression to calculate Expressió a calcular [EXPRESSION] [EXPRESSIÓ] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. ans res Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memòria Failed to load global definitions! S'ha fallat en carregar les definicions globals! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Tot By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Per defecte, es permet només una instància (una finestra principal) de %s. Si s'obren múltiples instàncies simultàniament, només es desaran les definicions (variables, funcions etc.), el mode, les preferències i l'historial de la última finestra tancada Voleu, malgrat això, canviar el comportament predeterminat i permetre múltiples instàncies simultànies? c-format Right-click/long press: %s Clic dret o premuda llarga: %s c-format Right-click: %s Clic dret: %s c-format Middle-click: %s Clic del mig: %s c-format Cycle through previous expression Mou per les expressions prèvies Move cursor left or right Mou el cursor a l'esquerra o a la dreta Move cursor to beginning or end Mou el cursor al principi o al fin Uncertainty/interval Incertesa/interval Relative error Error relatiu Argument separator Separador d'arguments Blank space Espai en blanc New line Línia nova Smart parentheses Parèntesis intel·ligents Vector brackets Claudàtors de vector Left parenthesis Parèntesi esquerre Left vector bracket Claudàtor esquerre de vector Right parenthesis Parèntesi dret Right vector bracket Claudàtor dret de vector Decimal point Punt decimal Raise (Ctrl+*) Exponencia (Ctrl+*) Add Addiciona M+ (memory plus) M+ (afegeix a la memòria) MC (memory clear) MC (neteja la memòria) Backspace Retrocés M− (memory minus) M− (elimina de la memòria) Previous result (static) Resultat previ (estàtic) Calculate expression Calcula l'expressió MR (memory recall) MR (retira de la memòria) MS (memory store) MS (desa a la memòria) Set unknowns Estableix les desconegudes more Show further items in a submenu més Logical AND AND lógic Logical OR OR lógic Logical NOT NOT lógic Toggle Result Base Commuta la base del resultat Open menu with stored variables Obre un menú amb les variables emmagatzemades Index Ã�ndex ENTER RPN Enter (calculate and add to stack) RETORN Calculate expression and add to stack Calcula l'expressió i afegeix-la a la pila Flag Bandera Matrices Matrius Gregorian Gregorià Revised Julian (Milanković) Julià revisat (Milanković) Julian Julià Islamic (Hijri) Islàmic (Hijri) Hebrew Hebreu Chinese Xinés Persian (Solar Hijri) Persià (Hijri solar) Coptic Copt Ethiopian Etíop Indian (National) Indi (nacional) Action Acció Key combination Combinació de teclats Raise Exponencia History Answer Value Valor de resposta de l'historial History Index(es) Ã�ndex(es) de l'historial History index %s does not exist. L'índex d'historial %s no existeix. c-format expression expressió History Parsed Expression Expressió analitzada de l'historial Set Window Title Estableix el títol de la finestra Failed to open %s. %s S'ha fallat en obrir %s. %s c-format Could not display help for Qalculate!. No s'ha pogut mostrar l'ajuda del Qalculate!. Could not display help for Qalculate!. %s No s'ha pogut mostrar l'ajuda del Qalculate!. %s c-format approx. aprox. Stop process Atura el procés Clear expression Neteja l'expressió EXACT EXACTE APPROX APROX RPN NPI CHN Chain mode CDN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Voleu actualitzar les taxes d'intercanvi ara? It has been %s day since the exchange rates last were updated. Fa %s dia que es van actualitzar les taxes d'intercanvi. Fa %s dies que es van actualitzar les taxes d'intercanvi. c-format It has been %s days since the exchange rates last were updated. Do not ask again No tornis a preguntar It took too long to generate the plot data. Ha trigat massa temps generar les dades a dibuixar. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Ha trigat massa temps generar les dades a dibuixar. Si us plau, disminuïu la taxa de mostreig o augmenta el límit de temps en les preferències. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quan es generen errors, advertències i altra informació durant el càlcul, la icona en la cantonada dreta superior de l'entrada d'expressió canvia per a reflectir això. Si mantingueu el punter sobre la icona o feu clic en ella, el missatge es mostrarà. Path of executable not found. No s'ha trobat el camí de l'executable. curl not found. No s'ha trobat curl. Failed to run update script. %s S'ha fallat en executar l'script d'actualització. %s c-format Failed to check for updates. S'ha fallat en cercar actualitzacions. No updates found. No s'ha trobat cap actualització. A new version of %s is available at %s. Do you wish to update to version %s? Una versió nova de %s està disponible a %s. Voleu actualitzar a la versió %s? c-format A new version of %s is available. You can get version %s at %s. Una versió nova de %s està disponible. Podeu aconseguir la versió %s a %s. c-format Too many arguments for %s(). Hi ha massa arguments per a %s(). c-format argument argument Temperature Calculation Mode Mode de càlcul de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu el mode de càlcul de temperatura (es pot canviar el mode després en les preferències). Interpretation of dots Interpretació de punts Please select interpretation of dots (".") (this can later be changed in preferences). Si us plau, seleccioneu la interpretació de punts (".") (es pot canviar això després en les preferències). Both dot and comma as decimal separators Ambdós punt i coma com a separadors decimals Dot as thousands separator Punt com a separador de millars Only dot as decimal separator Només punt com a separador decimal Uncategorized Sense categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binària roman romana bijective bijectiva sexagesimal sexagesimal latitude latitud longitude longitud time temps bases bases calendars calendaris rectangular rectangular cartesian cartesià exponential exponencial polar polar angle angle phasor fasor optimal òptima base base mixed mixta fraction fracció factors factors partial fraction fracció parcial factorize factoritza expand expandeix hexadecimal number nombre hexadecimal octal number nombre octal decimal number nombre decimal duodecimal number nombre duodecimal binary number nombre binari roman numerals numerals romans bijective base-26 base 26 bijectiva sexagesimal number nombre sexagesimal 32-bit floating point punt flotant de 32 bits 64-bit floating point punt flotant de 64 bits 16-bit floating point punt flotant de 16 bis 80-bit (x86) floating point punt flotant de 80 bits (x86) 128-bit floating point punt flotant de 128 bits time format format de temps number bases bases numèriques optimal unit unitat òptima base units unitats bases mixed units unitats mixtes expanded partial fractions fraccions parcials expandides complex rectangular form forma rectangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notació complexa d'angle complex phasor notation notació complexa de fasor UTC time zone Zona horària UTC number base %s base numèrica %s c-format Inactive Desactivat Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Obté dades del conjunt de dades %s per a un objecte i una propietat donats. Si "info" és de tipus propietat, una finestra de diàleg emergirà amb totes les propietats de l'objecte. c-format Example: Exemple: Arguments Arguments optional optional argument opcional default: argument default, in description default: Requirement Requisit key indicating that the property is a data set key clau Acti_vate Acti_va a previous result un resultat prèvi matrix matriu vector vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero boolean booleà integer enter rational racional real real complex complex number nombre (not matrix) (no matriu) unknown desconegut default assumptions suposicions predeterminades Variable does not exist anymore. La variable ja no existeix. Data Retrieval Function Funció d'obteniment de dades Insert function Insereix una funció Insert function (dialog) Insereix una funció (diàleg) Insert variable Insereix una variable Insert unit Insereix una unitat Insert text Insereix text Insert date Insereix una data Insert vector Insereix un vector Insert matrix Insereix una matriu Insert smart parentheses Insereix parèntesis intel·ligents Convert to unit Converteix a altra unitat Convert to unit (entry) Converteix a altra unitat (entrada) Convert to optimal unit Converteix a la unitat òptima Convert to base units Converteix a les unitats bases Convert to optimal prefix Converteix al prefix òptim Convert to number base Converteix a la base numèrica Factorize result Factoritza el resultat Expand result Expandeix el resultat Expand partial fractions Expandeix les fraccions parcials RPN: down NPI: avall RPN: up NPI: amunt RPN: swap NPI: intercanvia RPN: copy NPI: copia RPN: lastx RPN: última x RPN: delete register NPI: suprimeix el registre RPN: clear stack NPI: neteja la pila Load meta mode Carrega el mode meta Set expression base Estableix la base d'expressió Set result base Estableix la base del resultat Toggle exact mode Commuta el mode exacte Set angle unit to degrees Estableix la unitat d'angle com a graus Set angle unit to radians Estableix la unitat d'angle com a radians Set angle unit to gradians Estableix la unitat d'angle com a gradians Toggle simple fractions Commuta les fraccions senzilles Toggle mixed fractions Commuta les fraccions mixtes Toggle scientific notation Commuta la notació científica Toggle simple notation Commuta la notació senzilla Toggle RPN mode Commuta el mode NPI Toggle calculate as you type Commuta el càlcul mentre teclegeu Toggle programming keypad Commuta el teclat programari Show keypad Mostra el teclat numèric Show history Mostra l'historial Search history Cerca en l'historial Show conversion Mostra la conversió Show RPN stack Mostra la pila NPI Manage variables Gestiona les variables Manage functions Gestiona les funcions Manage data sets Gestiona els conjunts de dades New variable Variable nova New function Funció nova Open plot functions/data Obre el dibuix de funcions/dades Open convert number bases Obre la conversió de bases numèriques Open floating point conversion Obre la conversió de punt flotant Open calender conversion Obre la conversió de calendari Open percentage calculation tool Obre l'eina de càlcul de percentatge Open periodic table Obre la taula periòdica Update exchange rates Actualitza les taxes d'intercanvi Copy result Copia el resultat Insert result Insereix el resultat Save result image Desa una imatge del resultat Help Ajuda Quit Surt Toggle chain mode Commuta el mode de cadena Toggle keep above Commuta el manteniment amunt Show/hide completion Mostra/amaga la compleció Perform completion (activate first item) Realitza la compleció (activa el primer element) Prefixes Prefixes No Prefix Cap prefix Optimal Prefix Prefix òptim Prefix Prefix Complex angle/phasor notation Notació complexa d'angle o de fasor Number bases Bases numèriques Base units Unitats bases Binary number Nombre binari Calendars Calendaris Complex cis form Forma cis complexa Decimal number Nombre decimal Duodecimal number Nombre duodecimal Complex exponential form Forma exponencial complexa Factors Factors 16-bit floating point binary format Format binari de punt flotant de 16 bits 32-bit floating point binary format Format binari de punt flotant de 32 bits 64-bit floating point binary format Format binari de punt flotant de 64 bits 80-bit (x86) floating point binary format Format binari de punt flotant de 80 bits (x86) 128-bit floating point binary format Format binari de punt flotant de 128 bits Hexadecimal number Nombre hexadecimal Latitude Latitud Longitude Longitud Mixed units Unitats mixtes Octal number Nombre octal Optimal units Unitats òptimes Expanded partial fractions Fraccions parcials expandides Complex polar form Forma polar complex Complex rectangular form Forma rectangular complex Sexagesimal number Nombre sexagesimal and and or or undefined sense definir result is too long see history el resultat és massa llarg vegeu l'historial calculation was aborted s'ha avortat el càlcul RPN Register Moved S'ha mogut el registre NPI RPN Operation Operació NPI Processing… S'està processant… result processing was aborted s'ha avortat el processament del resultat Factorizing… S'està factoritzant… Expanding partial fractions… S'estan expandint les fraccions parcials… Expanding… S'està expandint… Calculating… S'està calculant… Converting… S'està convertint… Fetching exchange rates. S'estan obtenint les taxes d'intercanvi. Time zone parsing failed. L'anàlisi de la zona horària ha fallat. Keep open Manté obert Enter RPN Enter (calculate and add to stack) Introdueix C_alculate C_alcula Apply to Stack Aplica a la pila Argument Argment True Cert False Fals Info Info Edit Unit (global) Edita la unitat (global) New Unit Unitat nova Empty name field. El camp de nom està buit. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Una variable o unitat amb el mateix nom ja existeix. Voleu sobreescriure-la? Base unit does not exist. La unitat base no existeix. Edit Function (global) Edita la funció (global) New Function Funció nova Yes Sí No No Empty expression field. El camp d'expressió està buit. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Unit does not exist La unitat no existeix Edit Unknown Variable (global) Edita la variable desconeguda (global) New Unknown Variable Variable desconeguda nova An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Variable (global) Edita la variable (global) New Variable Variable nova Empty value field. El camp de valor està buit. Edit Vector Edita el vector Edit Vector (global) Edita el vector (global) New Vector Vector nou Edit Matrix (global) Edita la matriu (global) New Matrix Matriu nova Vector Result Resultat vector Matrix Result Resultat de matriu New Data Object Objecte de dades nou text text approximate aproximat Edit Data Set (global) Edita el conjunt de dades (global) New Data Set Conjunt de dades nou info info Property Propietat No file name entered. No s'ha introduït cap nom de fitxer. No delimiter selected. No s'ha seleccionat cap delimitador. Could not import from file %s No s'ha pogut importar del fitxer %s c-format No variable name entered. No s'ha introduït cap nom de variable. No known variable with entered name found. No s'ha trobat cap variable coneguda amb el nom introduït. Could not export to file %s No s'ha pogut exportar al fitxer %s c-format My Variables Les meves variables Couldn't write definitions No s'ha pogut escriure les definicions Preset Preestablert Abort Avorta Undo Desfés Redo Refés Completion Mode Mode de compleció Limited strict completion Compleció estricta limitada Strict completion Compleció estricta Limited full completion Compleció plena limitada Full completion Compleció plena No completion Cap compleció Delayed completion Compleció retardada Customize completion… Personalitza la compleció… Save Mode Desa el mode Preset mode cannot be overwritten. No es pot sobreescriure el mode preestablert. Delete Mode Suprimeix el mode Couldn't write preferences to %s No s'ha pogut escriure les preferèncias a %s c-format never mai ask pregunta %i day %i dia %i dies c-format %i days Copied Result was copied Copiat log10 function not found. No s'ha trobat la funció log10. Search Cerca _Search _Cerca Remove Bookmark Elimina el marcador Add Bookmark Afegeix un marcador A bookmark with the selected name already exists. Do you want to overwrite it? Un marcador amb el nom seleccionat ja existeix. Voleu sobreescriure'l? No items found No s'ha trobat cap element Select date Selecció de data Rectangular form Forma rectangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notació d'angle o de fasor Optimal unit Unitat òptima Optimal prefix Prefix òptim All functions Totes les funcions All variables Totes les variables Select definitions file Selecció del fitxer de definicions _Import _Importa Could not copy %s to %s. No s'ha pogut copiar %s a %s. c-format Could not read %s. No s'ha pogut llegir %s. c-format Could not copy file to %s. No s'ha pogut copiar el fitxer a %s. c-format Unsupported base. La base no és admesa. The selected Chinese year does not exist. L'any xinés seleccionat no existeix. Conversion to Gregorian calendar failed. La conversió al calendari gregorià ha fallat. Calendar conversion failed for: %s. La conversió de calendari ha fallat per a: %s. c-format Gnuplot was not found. No s'ha trobat el Gnuplot. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) necessita instal·lar-se separadament, i trobar-se en el camí de cerca d'executables, per a que funcioni el dibuix. c-format Select file to save PNG image to Selecció del fitxer al qual desar la imatge PNG Allowed File Types Tipus de fitxer permesos All Files Tots els fitxers Cannot delete unit as it is needed by other units. do not delete units that are used by other units No es pot suprimir la unitat perquè altres unitats la necessiten. none cap result is too long el resultat és massa llarg translator-credits Alex Henrie <alexhenrie24@gmail.com> Mode not found. No s'ha trobat el mode. Elements (in horizontal order) Elements (en ordre horitzontal) Select file to import Selecció del fitxer a importar _Open _Obre Select file to export to Selecció del fitxer al qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Un objecte conflictiu amb el mateix nom existeix. Si procediu i deseu els canvis, l'objecte conflictiu se sobreescriurà o es desactivarà. Voleu procedir? Set key combination Establiment de combinació de tecles Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Premeu la combinació de tecles que voleu usar per l'acció (premeu Escapa per a cancel·lar.) No keys Sense claus Empty value. El valor està buit. Function not found. No s'ha trobat la funció. Variable not found. No s'ha trobat la variable. Unit not found. No s'ha trobat la unitat. The key combination is already in use. Do you wish to replace the current action? La combinació de tecles ja està en ús. Voleu reemplaçar l'acció actual? Select file to export Selecció del fitxer a exportar Empty expression. L'expressió està buida. Empty x variable. La variable x està buida. Element Data Dades d'element Classification Classificació Alkali Metal Metall alcalí Alkaline-Earth Metal Metall alcalinoterri Lanthanide Lantanoide Actinide Actinoide Transition Metal Metall de transició Metal Metall Metalloid Metal·loide Polyatomic Non-Metal Poliatòmic no metal Diatomic Non-Metal Diatòmic no metal Noble Gas Gas noble Unknown chemical properties Propietats químiques desconegudes No unknowns in result. No hi ha cap desconeguda en el resultat. Set Unknowns Estableix les desconegudes Copy result to clipboard Copia el resultat al porta-retalls ArgumentEditDialog Name: Nom: Type: Tipus: Free Libre Number Nombre Integer Enter Symbol Símbol Text Text Date Dada Vector Vector Matrix Matriu Boolean Booleà Angle Angle Object Objecte Function Funció Unit Unitat Variable Variable File Fitxer Enable rules and type test Habilita regles i verificació de tipus Custom condition: Condició personalitzada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Per exemple, si l'argument és una matriu que ha de tenir un nombre igual de files i columnes: rows(\x) = columns(\x) Allow matrix Permet matriu Forbid zero Prohibeix zero Handle vector Tractar amb vectors Calculate function for each separate element in vector. Calcula la funció per cada element distint en el vector. Min Mín Include equals Inclusiu Max Màx CSVDialog Import CSV File Importació de fitxer CSV Export CSV File Exporta fitxer CSV Current result Resultat actual Matrix/vector variable: Variable de matriu/vector: File: Fitxer: Import as Importa com a matrix matriu vectors vectors Name: Nom: First row: Primera fila: Includes headings Inclou encapçalaments Delimiter: Delimitador: Comma Coma Tabulator Tabulador Semicolon Punt i coma Space Espai Other Altre Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? An unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Error Error Could not import from file %1 No s'ha pogut importar del fitxer %1 No matrix or vector variable with the entered name was found. No s'ha trobat cap variable de matriu ni de vector amb el nom introduït. Could not export to file %1 No s'ha pogut exportar al fitxer %1 CalendarConversionDialog Calendar Conversion Conversió de calendari Gregorian Gregorià Hebrew Hebreu Islamic (Hijri) Islàmic (Hijri) Persian (Solar Hijri) Persià (Hijri solar) Indian (National) Indi (nacional) Chinese Xinés Julian Julià Revised Julian (Milanković) Julià revisat (Milanković) Coptic Copt Ethiopian Etíop Error Error The selected Chinese year does not exist. L'any xinés seleccionat no existeix. Conversion to Gregorian calendar failed. La conversió al calendari gregorià ha fallat. Calendar conversion failed for: %1. La conversió de calendari ha fallat per a: %1. DataObjectEditDialog %1: %1: Default Predeterminat Approximate Aproxima Exact Exacte Edit Data Object Edició d'objecte de dades New Data Object Objecte de dades nou DataPropertyEditDialog Name: Nom: Title: Títol: Descriptive name: Nom descriptiu: Description: Descripció: Value type: Tipus de valor: Expression Expressió Number Nombre Text Text Unit expression: Expressió d'unitat: Use as key Usa com a clau Case sensitive value Valor sensitiu a majúscules i minúscules Approximate value Valor aproximat Value uses brackets El valor usa claudàtors Hide Amaga Edit Data Property Edició de propietat de dades DataSetEditDialog General General Properties Propietats Function Funció Title: Títol: Descriptive name: Nom descriptiu: Data file: Fitxer de dades: Description: Descripció: Copyright: Dret d'autor: Title Títol Name Nom Type Tipus Add Afegeix Edit Edita Remove Elimina Name: Nom: Object argument name: Nom d'argument d'objecte: Property argument name: Nom d'argument de propietat: Default property: Propietat predeterminat: text text approximate aproximat number nombre expression expressió key clau Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Data Sets Conjunts de dades Object Objecte Property Propietat Edit Data Set Edició de conjunt de dades New Data Set Conjunt de dades nou DataSetsDialog Data Sets Conjunts de dades Data sets: Conjunts de dades: New… Nou… Edit… Edita… Delete Suprimeix Objects: Objectes: Data set description: Descripció de conjunt de dades: Object attributes: Atributs d'objecte: Properties Propietats key clau Data Retrieval Function Funció d'obteniment de dades argument argument ExpressionEdit matrix matriu vector vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero boolean booleà integer enter rational racional real real complex complex number nombre (not matrix) (no matriu) unknown desconegut default assumptions suposicions predeterminades Prefix: Prefix: Complex Angle/Phasor Notation Notació complexa d'angle o de fasor Base units Unitats bases Number Base Base numèrica Binary-Coded Decimal Decimal codificat en binari (BCD) Bijective Base-26 Base 26 bijectiva Binary Number Nombre binari Calendars Calendaris Complex cis Form Forma cis complexa Decimal Number Nombre decimal Duodecimal Number Nombre duodecimal Complex Exponential Form Forma exponencial complexa Factors Factors 16-bit Floating Point Binary Format Format binari de punt flotant de 16 bits 32-bit Floating Point Binary Format Format binari de punt flotant de 32 bits 64-bit Floating Point Binary Format Format binari de punt flotant de 64 bits 80-bit (x86) Floating Point Binary Format Format binari de punt flotant de 80 bits (x86) 128-bit Floating Point Binary Format Format binari de punt flotant de 128 bits Fraction Fracció Decimal Fraction Fracció decimal Hexadecimal Number Nombre hexadecimal Latitude Latitud Longitude Longitud Mixed Units Unitats mixtes Octal Number Nombre octal Optimal Unit Unitat òptima Optimal Prefix Prefix òptim Expanded Partial Fractions Fraccions parcials expandides Complex Polar Form Forma polar complexa Complex Rectangular Form Forma rectangular complexa Roman Numerals Nombres romans Sexagesimal Number Nombre sexagesimal Time Format Format de temps Unicode Unicode UTC Time Zone Zona horària UTC Scientific Notation Notació científica Simple Notation Notació senzilla Custom Personalitzat Undo Desfés Redo Refés Cut Retalla Copy Copia Paste Enganxa Delete Suprimeix Calculate Selection Calcular la selecció Insert Date… Insereix data… Insert Matrix… Insereix matriu… Select All Selleciona-ho tot Clear Neteja Clear History Neteja l'historial Completion Compleció No completion Cap compleció Limited strict completion Compleció estricta limitada Strict completion Compleció estricta Limited full completion Compleció plena limitada Full completion Compleció plena Delayed completion Compleció retardada Expression Status L'estat de l'expressió Off Desactivat In history list In expression field In status bar With delay Amb retard With adaptive delay Amb retard adaptatiu Without delay Sense demora Automatically calculate selection Use input method Utilitzeu el mètode d’entrada Enable input method Activa el mètode d'entrada Matrix Matriu Too many arguments for %1(). Hi ha massa arguments per a %1(). argument argument %1: %1: comment comentari MC (memory clear) MC (neteja la memòria) MS (memory store) MS (desa a la memòria) M+ (memory plus) M+ (afegeix a la memòria) M− (memory minus) M− (elimina de la memòria) factorize factoritza expand expandeix hexadecimal hexadecimal hexadecimal number nombre hexadecimal octal octal octal number nombre octal decimal decimal decimal number nombre decimal duodecimal duodecimal duodecimal number nombre duodecimal binary binària binary number nombre binari roman romana roman numerals numerals romans bijective bijectiva bijective base-26 base 26 bijectiva binary-coded decimal BCD sexagesimal sexagesimal sexagesimal number nombre sexagesimal latitude latitud longitude longitud 32-bit floating point punt flotant de 32 bits 64-bit floating point punt flotant de 64 bits 16-bit floating point punt flotant de 16 bis 80-bit (x86) floating point punt flotant de 80 bits (x86) 128-bit floating point punt flotant de 128 bits time temps time format format de temps scientific científica scientific notation notació científica engineering enginyeria engineering notation notació enginyeria simple senzilla simple notation notació senzilla bases bases number bases bases numèriques calendars calendaris optimal òptima optimal unit unitat òptima prefix prefix optimal prefix base base base units unitats bases mixed mixta mixed units unitats mixtes decimals decimal fraction fraction fracció factors factors Engineering Notation Notació enginyeria base base units base partial fraction fracció parcial expanded partial fractions fraccions parcials expandides rectangular rectangular cartesian cartesià complex rectangular form forma rectangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle angle complex angle notation notació complexa d'angle phasor fasor complex phasor notation notació complexa de fasor UTC time zone zona horària UTC base number base base number base %1 base numèrica %1 Data object Objecte de dades FPConversionDialog Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Format Format 16-bit (half precision) 16 bits (precisió mitja) 32-bit (single precision) 32 bits (precisió singular) 64-bit (double precision) 64 bits (precisió doble) 80-bit (x86 extended format) 80 bits (format x86 estès) 128-bit (quadruple precision) 128 bits (precisió quàdruple) Microchip 24-bit Microchip 32-bit Value Valor Decimal value Valor decimal Binary representation Representació binària Hexadecimal representation Representació hexadecimal Floating point value Valor de punt flotant Conversion error Error de conversió FunctionEditDialog Required Necessari Details Detalls Description Descripció Name: Nom: Expression: Expressió: Argument references: Referències d'arguments: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y i z (p. ex., "(x+y)/2"), o \x, \y, \z, \a, \b, … (p. ex., "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilitzeu x, y i z (per exemple "(x+y)/2"), o \x, \y, \z, \a, \b, … (per exemple "(\x+\y)/2") Category: Categoria: Descriptive name: Nom descriptiu: Hide function Amaga la funció Example: Exemple: Description: Descripció: Condition: Condició: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") La condició que ha de ser cert per a la funció (per exemple, si el segon argument ha de ser més gran que el primer: "\y > \x") Sub-functions: Subfuncions: Expression Expressió Precalculate Precalcula Reference Referència Add Afegeix Edit Edita Remove Elimina Arguments: Arguments: Name Nom Type Tipus Warning Advertiment Conversion (using "to") is not supported in functions. Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una funció amb el mateix nom ja existeix. Voleu sobreescriure la funció? Edit Function Edició de funció New Function Funció nova FunctionsDialog Functions Funcions Category Categoria Function Funció New… Nou… Edit… Edita… Deactivate Desactiva Delete Suprimeix Calculate… Calcula… Apply Aplica Insert Insereix Favorite Favorit argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Obté dades del conjunt de dades %1 per a un objecte i una propietat donats. Si "info" és de tipus propietat, una finestra de diàleg emergirà amb totes les propietats de l'objecte. Example: Exemple: Arguments Arguments optional optional argument opcional default: argument default default: Requirement: Required condition for function Requisit: Properties Propietats %1: %1: key indicating that the property is a data set key clau Activate Activa All All functions Tot Uncategorized Sense categoria User functions Funcions de l'usuari Favorites Favorits Inactive Desactivat HistoryView Insert Value Insereix el valor Insert Text Insereix el text Copy Copia Copy Formatted Text Copia text formatat Copy unformatted ASCII Copiar ASCII sense format Select All Selleciona-ho tot Search… Cerca… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a dalt, per exemple "5 + 2 / 3", i premeu el teclat Retorn. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Teclegeu una expressió matemàtica a sota, per exemple "5 + 2 / 3", i premeu el teclat Retorn. Exchange rate source(s): updated %1 Comment Comentari Protect Protegeix Add Comment… Afegeix un comentari… Move to Top Mou al cim Remove Elimina Clear Neteja Edit Comment… Edita el comentari… Text: Text: Search Cerca KeypadButton <i>Right-click/long press</i>: %1 <i>Clic dret o premuda llarga</i>: %1 <i>Right-click</i>: %1 <i>Clic dret</i>: %1 <i>Long press</i>: %1 <i>Premuda llarga</i>: %1 Open menu Obre el menú <i>Middle-click</i>: %1 <i>Clic del mig</i>: %1 KeypadWidget Memory store Desa a la memòria) Memory clear Neteja la memòria Memory recall Retira de la memòria Memory add Afegeix a la memòria Memory subtract Elimina de la memòria STO Standard calculator button. Do not use more than three characters. STO Store Desa New function Funció nova sin sin cos cos tan tan Exponentiation Potenciació Percent or remainder Per cent o residu Uncertainty/interval Incertesa/interval Relative error Error relatiu Interval Interval Move cursor left Mou el cursor a l'esquerra Move cursor to start Mou el cursor al principi Move cursor right Mou el cursor a la dreta Move cursor to end Mou el cursor al fin Logical AND AND lógic Logical OR OR lógic Bitwise Exclusive OR OR exclusiu bit a bit Logical NOT NOT lógic Bitwise Left Shift Desplaçament a l'esquerra bit a bit Bitwise Right Shift Desplaçament a la dreta bit a bit cmp rot a→1 Expand partial fractions Expandeix les fraccions parcials DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants Activa les unitats en constants físics All constants Totes les constants Percentage Calculation Tool Eina de càlcul de percentatge more més All units Totes les unitats All variables Totes les variables Action Acció Interval Display Presentació d'intervals Adaptive Adaptativa Significant digits Xifres significants Plus/minus Més/menys Relative Relatiu Concise Interval Calculation Càlcul d'interval Variance formula Fórmula de variància Interval arithmetic Aritmètica d'interval Allow concise uncertainty input Complex number form Forma de nombre complex Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Angle o fasor Type Assumptions type Tipus Sign Assumptions sign Signe Default assumptions Suposicions predeterminades Number Nombre Real Real Rational Racional Integer Enter Boolean Booleà Unknown Unknown assumptions sign Desconeguda Non-zero No zero Positive Positiu Non-negative No negatiu Negative Negatiu Non-positive No positiu Factorize Factoritza Expand Expandeix Add column Add row Remove column Remove row Left parenthesis Parèntesi esquerre Left vector bracket Claudàtor esquerre de vector Right parenthesis Parèntesi dret Right vector bracket Claudàtor dret de vector Smart parentheses Parèntesis intel·ligents Vector brackets Claudàtors de vector Argument separator Separador d'arguments Blank space Espai en blanc New line Línia nova Decimal point Punt decimal Previous result (static) Resultat previ (estàtic) Multiplication Multiplicació Button Action Acció del botó Label: Etiqueta: Action: Acció: None Cap Value: Valor: Bitwise AND AND bit a bit Bitwise Shift Desplaçament bit a bit Delete Suprimeix Backspace Retrocés Addition Addició Plus Més Subtraction Sostracció Minus Menys Division Divisó Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear expression Neteja l'expressió Calculate expression Calcula l'expressió NamesEditDialog Name Nom Abbreviation Abreviatura Plural Plural Reference Referència Avoid input Evita l'entrada Unicode Unicode Suffix Sufix Case sensitive Distingeix entre majúscules i minúscules Completion only Només compleció Add Edit Edita Remove Elimina Warning Advertiment Illegal name El nom és il ilegal A function with the same name already exists. Una funció amb el mateix nom ja existeix. A unit or variable with the same name already exists. Una unitat o variable amb el mateix nom ja existeix. PercentageCalculationDialog Percentage Porcentatge Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Canvi de 1 a 2 Change from 2 to 1 Canvi de 2 a 1 2 compared to 1 2 comparat amb 1 1 compared to 2 1 comparat amb 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduïu dos valors, dels quals al màxim un és percentatge, i es calcularan els altres per a vostè. Clear Neteja PeriodicTableDialog Periodic Table Taula periòdica Element Data Dades d'element Alkali Metal Metall alcalí Alkaline-Earth Metal Metall alcalinoterri Lanthanide Lantanoide Actinide Actinoide Transition Metal Metall de transició Metal Metall Metalloid Metal·loide Polyatomic Non-Metal Poliatòmic no metal Diatomic Non-Metal Diatòmic no metal Noble Gas Gas noble Unknown chemical properties Propietats químiques desconegudes Unknown Desconeguda %1: %1: PlotDialog Plot Dibuix Data Dades Title: Títol: Expression: Expressió: Function Funció Vector/matrix Vector/matriu Paired matrix Matriu emparellada Rows Files X variable: Variable X: Style: Estil: Line Línia Points Punts Line with points Línia amb punts Boxes/bars Caixes/barres Histogram Histograma Steps Pasos Candlesticks Candelers Dots Cercles Polar Polar Smoothing: Suavitzat: None Cap Monotonic Monotònic Natural cubic splines Spline cúbic natural Bezier Bézier Bezier (monotonic) Bézier (monotònic) Y-axis: Eix Y: Primary Principal Secondary Secondari Add Afegeix Apply Aplica Remove Elimina Category Categoria Title Títol Expression Expressió Function Range Rang de funció Minimum x value: Valor x mìnim: Maximum x value: Valor x màxim: Sampling rate: Taxa de mostreig: Step size: Mida de passos: Show real and imaginary parts Appearance Aparència Display grid Mostra una graella Display full border Mostra la vora completa Minimum y value: Valor y mínim: Maximum y value: Valor y màxim: Logarithmic x scale: Escala x logarítmica: Logarithmic y scale: Escala y logarítmica: X-axis label: Etiqueta de l'eix X: Y-axis label: Etiqueta de l'eix Y: Line width: Amplada de línia: Legend placement: Posició de la llegenda: Top-left Superior-esquerra Top-right Superior-dreta Bottom-left Inferior-esquerra Bottom-right Inferior-dreta Below A baix Outside A fora Calculating… S'està calculant… Cancel Cancel·la Processing… S'està processant… PreferencesDialog Look && Feel Aparença Numbers && Operators Nombres i operadors Units && Currencies Unitats i monedes Parsing && Calculation Anàlisi i càlcul Ignore system language (requires restart) Ignora la llengua del sistema (requereix reinici) Allow multiple instances Permet múltiples instàncies Clear history on exit Neteja l'historial en surtir Close application with Escape key Keep above other windows Manté superior a les altres finestres Window title: Títol de finestra: Application name Nom d'aplicació Result Resultat Application name + result Nom d'aplicació + resultat Workspace Espai de treball Application name + workspace Nom d'aplicació + espai de treball Style: Estil: Default (requires restart) Default style Predeterminat (requereix reinici) Dark mode Mode fosc Colorize result Coloritzar el resultat Custom result font Tipus de lletra personalitzat per al resultat Custom expression font Tipus de lletra personalitzat per a l'expressió Custom keypad font Tipus de lletra personalitzat per al teclat numèric Custom application font Tipus de lletra personalitzat per a l'aplicació Custom result font: Tipus de lletra personalitzat per al resultat: Custom expression font: Tipus de lletra personalitzat per a l'expressió: Custom status bar font: Custom keypad font: Tipus de lletra personalitzat per al teclat numèric: Custom application font: Tipus de lletra personalitzat per a l'aplicació: Display expression status Mostra l'estat de l'expressió Delay: Retard: Expression after calculation: Expressió després del càlcul: Keep expression Clear expression Neteja l'expressió Replace with result Replace with result if shorter Use keyboard keys for RPN Usa les tecles del teclat per a la NPI Parsing mode: Mode d'anàlisi: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primer la multiplicació implícita Chain Cadena RPN NPI Read precision Llegeix la precisió Limit implicit multiplication Limita la multiplicació implícita Interval calculation: Càlcul d'interval: Variance formula Fórmula de variància Interval arithmetic Aritmètica d'interval Factorize result Factoritza el resultat Binary two's complement representation Representació binaria de complement a dos Hexadecimal two's complement representation Representació hexadecimal de complement a dos Use lower case letters in non-decimal numbers Usa lletres minúscules en nombres no decimals Spell out logical operators Enuncia els operadors lògics Use E-notation instead of 10^x Usa la notació E en lloc de 10^x Preferences Preferències ms milliseconds ms Use E-notation instead of 10^n Usa la notació E en lloc de 10^n Use 'j' as imaginary unit Usa 'j' com a unitat imaginària Use comma as decimal separator Usa la coma com a separador decimal Ignore comma in numbers Ignora comas en els nombres Ignore dots in numbers Ignora els punts en els nombres Round halfway numbers away from zero Arrodoneix els nombres a mig camí lluny de zero Round halfway numbers to even Arrodoneix els nombres a mig camí al par Indicate repeating decimals Indica els decimals periòdics Language: Idioma: Max history lines saved: Use caret for bitwise XOR Usa el caret per XOR bit a bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Custom history font: Tipus de lletra personalitzat per al històrial: Expression status: Estat de l'expressió: Place expression field below history Off Desactivat In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Parsed Parsed (compact) Entered Entered + parsed Entered + parsed (compact) Automatically copy result Simplified percentage calculation Càlcul de percentatges simplificat Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binària Hexadecimal Hexadecimal Binary bits: Automatic Automàtica Use special duodecimal symbols Use Unicode division slash in output Copy unformatted ASCII by default Place percent button in number pad Indicate repeating decimals: Indica els decimals periòdics: Ellipsis Overline Digit grouping: Agrupament de xifres: None Cap Standard Estàndar Local Local Custom Personalitzat Interval display: Presentació d'intervals: Significant digits Xifres significants Interval Interval Plus/minus Més/menys Concise Midpoint Punt mitjà Lower Inferior Upper Superior Rounding: Truncate all numbers Trunca tots els números Complex number form: Forma de nombre complex: Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Angle o fasor Enable units Abbreviate names Abrevia els noms Use binary prefixes for information units Una els prefixes binaris per a les unitats d'informació Automatic unit conversion: Conversió automàtica d’unitats: No conversion Cap conversió Base units Unitats bases Optimal units Unitats òptimes Optimal SI units Unitats SI òptimes Convert to mixed units Converteix a unitats mixtes Automatic unit prefixes: Prefixos automàtics: Copy unformatted ASCII without units Default currency: Fonts Tipus de lletra Units Unitats Calculation Càlcul Restart required Please restart the program for the language change to take effect. Default Predeterminat Notify when a new version is available Notifica quan una versió nova estigui disponible Calculate as you type delay: Multiplication sign: Signe de multiplicació: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Cap prefixos Prefixes for some units Prefixes per a les unitats seleccionades Prefixes also for currencies Prefixes també per a les monedes Prefixes for all units Prefixes per a totes les unitats Enable all SI-prefixes Habilita tots els prefixes SI Enable denominator prefixes Habilita els prefixes de denominador Enable units in physical constants Activa les unitats en constants físics Temperature calculation: Càlcul de temperatura: Absolute Absolut Relative Relatiu Hybrid Híbrid Exchange rates updates: Actualitzacions de taxes d'intercanvi: %n day(s) %n dia %n dies days dia dies QApplication Execute expressions and commands from a file Executa expressions i ordres d'un fitxer FILE FITXER Start a new instance of the application Inicia una instància nova de l'aplicació Specify the window title Especifica el títol de finestra TITLE TÃ�TOL Update exchange rates Actualitza les taxes d'intercanvi Display the application version Mostra la versió de l'aplicació Open workspace Expression to calculate Expressió a calcular [EXPRESSION] [EXPRESSIÓ] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Per defecte, es permet només una instància (una finestra principal) de %1. Si s'obren múltiples instàncies simultàniament, només es desaran les definicions (variables, funcions etc.), el mode, les preferències i l'historial de la última finestra tancada Voleu, malgrat això, canviar el comportament predeterminat i permetre múltiples instàncies simultànies? Allow multiple instances? %1 is already running. Failed to load global definitions! S'ha fallat en carregar les definicions globals! answer resposta History Answer Value Valor de resposta de l'historial History Index(es) Ã�ndex(es) de l'historial History index %s does not exist. L'índex d'historial %s no existeix. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memòria Error Error Couldn't write preferences to %1 No s'ha pogut escriure les preferèncias a %1 Function not found. No s'ha trobat la funció. Variable not found. No s'ha trobat la variable. Unit not found. No s'ha trobat la unitat. Unsupported base. La base no és admesa. Unsupported value. QalculateQtSettings Update exchange rates? Actualitza les taxes d'intercanvi? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Fa %n dia que es van actualitzar les taxes d'intercanvi. Voleu actualitzar les taxes d'intercanvi ara? Fa %n dies que es van actualitzar les taxes d'intercanvi. Voleu actualitzar les taxes d'intercanvi ara? Fetching exchange rates. S'estan obtenint les taxes d'intercanvi. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… S'estan obtenint les taxes d'intercanvi… Error Error Warning Advertiment Information Informació Path of executable not found. No s'ha trobat el camí de l'executable. curl not found. No s'ha trobat curl. Failed to run update script. %1 S'ha fallat en executar l'script d'actualització. %1 Failed to check for updates. S'ha fallat en cercar actualitzacions. No updates found. No s'ha trobat cap actualització. A new version of %1 is available at %2. Do you wish to update to version %3? Una versió nova de %1 està disponible a %2. Voleu actualitzar a la versió %3? A new version of %1 is available. You can get version %3 at %2. Una versió nova de %1 està disponible. Podeu aconseguir la versió %3 a %2. Download %1: %2 Insert function Insereix una funció Insert function (dialog) Insereix una funció (diàleg) Insert variable Insereix una variable Approximate result Negate Nega Invert Inverteix Insert unit Insereix una unitat Insert text Insereix text Insert operator Insert date Insereix una data Insert matrix Insereix una matriu Insert smart parentheses Insereix parèntesis intel·ligents Convert to unit Converteix a altra unitat Convert Converteix Convert to optimal unit Converteix a la unitat òptima Convert to base units Converteix a les unitats bases Convert to optimal prefix Converteix al prefix òptim Convert to number base Converteix a la base numèrica Factorize result Factoritza el resultat Expand result Expandeix el resultat Expand partial fractions Expandeix les fraccions parcials RPN: down NPI: avall RPN: up NPI: amunt RPN: swap NPI: intercanvia RPN: copy NPI: copia RPN: lastx RPN: última x RPN: delete register NPI: suprimeix el registre RPN: clear stack NPI: neteja la pila Set expression base Estableix la base d'expressió Set result base Estableix la base del resultat Set angle unit to degrees Estableix la unitat d'angle com a graus Set angle unit to radians Estableix la unitat d'angle com a radians Set angle unit to gradians Estableix la unitat d'angle com a gradians Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Commuta el mode NPI Show general keypad Toggle programming keypad Commuta el teclat programari Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Cerca en l'historial Clear history Neteja l'historial Show variables Show functions Show units Show data sets Store result Desa el resultat MC (memory clear) MC (neteja la memòria) MR (memory recall) MR (retira de la memòria) MS (memory store) MS (desa a la memòria) M+ (memory plus) M+ (afegeix a la memòria) M− (memory minus) M− (elimina de la memòria) New variable Variable nova New function Funció nova Open plot functions/data Obre el dibuix de funcions/dades Open convert number bases Obre la conversió de bases numèriques Open floating point conversion Obre la conversió de punt flotant Open calender conversion Obre la conversió de calendari Open percentage calculation tool Obre l'eina de càlcul de percentatge Open periodic table Obre la taula periòdica Update exchange rates Actualitza les taxes d'intercanvi Copy result Copia el resultat Insert result Insereix el resultat Open mode menu Open menu Obre el menú Help Ajuda Quit Surt Toggle chain mode Commuta el mode de cadena Toggle keep above Commuta el manteniment amunt Show completion (activate first item) Clear expression Neteja l'expressió Delete Suprimeix Backspace Retrocés Home End Right Left Up Amunt Down Avall Undo Desfés Redo Refés Calculate expression Calcula l'expressió Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Predeterminat Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancel·la Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menú Menu (%1) Menú (%1) New Nou Function… Funció… Variable/Constant… Variable/constant… Unknown Variable… Variable desconeguda… Matrix… Matriu… Workspaces Espais de treball Open… Obre… Open default Obre predeterminat Save Guardar Save As… Guardar com… Import CSV File… Importa un fitxer CSV… Export CSV File… Exporta un fitxer CSV… Functions Funcions Variables and Constants Variables i constants Units Unitats Plot Functions/Data Dibuixa funcions/dades Floating Point Conversion (IEEE 754) Conversió de punt flotant (IEEE 754) Calendar Conversion Conversió de calendari Update Exchange Rates Actualitza les taxes d'intercanvi Normal Mode Mode normal RPN Mode Mode NPI Chain Mode Mode de cadena Keyboard Shortcuts Dreceres de teclat Preferences Preferències Help Ajuda Report a Bug Informa d'un error Check for Updates Cercar actualitzacions About %1 Quant a %1 Quit Surt Mode Mode Mode (%1) Mode (%1) General Display Mode Mode de presentació general Normal Normal Scientific Científica Engineering Enginyeria Simple Senzilla Angle Unit Unitat d'angle Radians Radians Degrees Graus Gradians Gradians Approximation Aproximació Automatic Automatic approximation Automàtica Dual Dual approximation Doble Exact Exact approximation Exacte Approximate Aproxima Assumptions Suposicions Type Assumptions type Tipus Number Nombre Real Real Rational Racional Integer Enter Boolean Booleà Sign Assumptions sign Signe Unknown Unknown assumptions sign Desconeguda Non-zero No zero Positive Positiu Non-negative No negatiu Negative Negatiu Non-positive No positiu Result Base Base del resultat Binary Binària Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Altre Approximation and Fractions Aproximació i fraccions Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Format de temps Roman numerals Numerals romans Unicode Unicode Bijective base-26 Base 26 bijectiva Binary-coded decimal (BCD) Decimal codificat en binari (BCD) Custom: Number base Expression Base Base d'expressió Other: Number base Altra: Precision: Precisió: Min decimals: Mín de decimals: Max decimals: Màx de decimals: off Max decimals desactivat Convert Converteix Convert (%1) Converteix (%1) Store Desa Store (%1) Desa (%1) Functions (%1) Funcions (%1) Keypad Teclat numèric Keypad (%1) Teclat numèric (%1) Number bases Bases numèriques Unit… Unitat… Data Sets Conjunts de dades Percentage Calculation Tool Eina de càlcul de percentatge Periodic Table Taula periòdica Units (%1) Unitats (%1) Plot Functions/Data (%1) Dibuixa funcions/dades (%1) Number Bases (%1) Bases numèriques (%1) Binary: Binària: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pila NPI Rotate the stack or move the selected register up (%1) Roda la pila o mou el registre seleccionat amunt (%1) Rotate the stack or move the selected register down (%1) Roda la pila o mou el registre seleccionat avall (%1) Swap the top two values or move the selected value to the top of the stack (%1) Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila (%1) Copy the selected or top value to the top of the stack (%1) Copia el valor seleccionat o el últim al cim de la pila (%1) Enter the top value from before the last numeric operation (%1) Introdueix el úlim valor d'abans de la darrera operació numèrica (%1) Delete the top or selected value (%1) Suprimeix el últim valor o el seleccionat (%1) Clear the RPN stack (%1) Neteja la pila NPI (%1) New Function… Funció nova… Favorites Favorits Recent User functions Funcions de l'usuari Open dialog Show all functions User units Unitats d'usuari more més Prefixes Prefixes Show all units User variables Variables d'usuari Show all variables Powerful and easy to use calculator Calculadora poderosa i fàcil a usar License: GNU General Public License version 2 or later Error Error Couldn't write definitions No s'ha pogut escriure les definicions hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binària roman romana bijective bijectiva sexagesimal sexagesimal latitude latitud longitude longitud time temps Time zone parsing failed. L'anàlisi de la zona horària ha fallat. bases bases calendars calendaris rectangular rectangular cartesian cartesià exponential exponencial polar polar phasor fasor angle angle optimal òptima base base mixed mixta fraction fracció factors factors Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad EXACT EXACTE APPROX APROX RPN NPI CHN CDN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy Copia <i>Middle-click</i>: %1 <i>Clic del mig</i>: %1 scientific científica engineering enginyeria simple senzill prefix prefix base base units base partial fraction fracció parcial base number base base decimals factorize factoritza expand expandeix Calculating… S'està calculant… Cancel Cancel·la RPN Operation Operació NPI Factorizing… S'està factoritzant… Expanding partial fractions… S'estan expandint les fraccions parcials… Expanding… S'està expandint… Converting… S'està convertint… RPN Register Moved S'ha mogut el registre NPI Processing… S'està processant… Matrix Matriu Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode Mode de càlcul de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu el mode de càlcul de temperatura (es pot canviar el mode després en les preferències). Absolute Absolut Relative Relatiu Hybrid Híbrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretació de punts Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Si us plau, seleccioneu la interpretació de punts (".") (es pot canviar això després en les preferències). Both dot and comma as decimal separators Ambdós punt i coma com a separadors decimals Dot as thousands separator Punt com a separador de millars Comma as thousands separator Only dot as decimal separator Només punt com a separador decimal Parsing Mode Mode d'anàlisi The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expressió és ambigua. Si us plau, seleccioneu la interpretació de l'expressió amb multiplicació implícita (es pot canviar aixó després en les preferències). Implicit multiplication first Primer la multiplicació implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Afegeix acció (%1) Edit Keyboard Shortcut New Keyboard Shortcut Drecera de teclat nova Action: Acció: Value: Valor: Set key combination Establiment de combinació de tecles Press the key combination you wish to use for the action. Premeu la combinació de tecles que voleu usar per l'acció. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? La combinació de tecles ja està en ús. Voleu reemplaçar l'acció actual (%1)? Question Pregunta Add… Afegeix… Edit… Edita… Remove Elimina Gnuplot was not found No s'ha trobat el Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) necessita instal·lar-se separadament, i trobar-se en el camí de cerca d'executables, per a que funcioni el dibuix. Example: Example of function usage Exemple: Enter RPN Enter Introdueix Calculate Calcula Apply to Stack Aplica a la pila Insert Insereix Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again No tornis a preguntar Keep open Manté obert Value Valor Argument Argument %1: %1: Approximation && Fractions Aproximació i fraccions Plot Dibuix General General Programming Programari Algebra Àlgebra Custom Personalitzat None Cap Show Custom Column Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Clic dret o premuda llarga</i>: %1 Open menu Obre el menú Number Bases Bases numèriques Conversion operator Operador de conversió Rotate the stack or move the selected register up Roda la pila o mou el registre seleccionat amunt Rotate the stack or move the selected register down Roda la pila o mou el registre seleccionat avall Swap the top two values or move the selected value to the top of the stack Intercanvia els últims dos valors o mou el valor seleccionat al cim de la pila Delete the top or selected value Suprimeix el últim valor o el seleccionat Enter the top value from before the last numeric operation Introdueix el úlim valor d'abans de la darrera operació numèrica Copy the selected or top value to the top of the stack Copia el valor seleccionat o el últim al cim de la pila Clear the RPN stack Neteja la pila NPI Comma as separator for function arguments and matrix/vector elements Action Acció Key combination Combinació de teclats True Cert False Fals Info Info optional optional argument opcional Failed to open %1. %2 S'ha fallat en obrir %1. %2 UnitEditDialog General General Relation Relació Name: Nom: Category: Categoria: Descriptive name: Nom descriptiu: System: Sistema: Imperial Imperial US Survey Agrimensura estatunidenca Hide unit Amaga la unitat Description: Descripció: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe a la qual pertany aquesta unitat. Es defineixen les unitats derivades anomenades en relació a una sola altra unitat, amb un exponent opcional, mentre es defineixen les unitats derivades (sense nom) per una expressió d'unitat amb una unitat o múltiples unitats. Base unit Unitat base Named derived unit Unitat derivada anomenada Derived unit Unitat derivada Base unit(s): Unitat(s) base(s): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unitat (per a una unitat derivada amb nom) o expressió d'unitat (per a una unitat derivada sense nom) a la qual aquesta unitat està definida Exponent: Exponent: Relation: Relació: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relació a la unitat base. Per als relacions linears això només deu ser un nombre.<br><br>Per a les relacions no linears useu \x pel factor i \y pel exponent (per exemple "\x + 273,15" pela relació entre graus Celsius i Kelvin). Inverse relation: Relació inversa: Specify for non-linear relation, for conversion back to the base unit. Especifiqueu per a relació no linear, per a conversió de retorn a la unitat base. Mix with base unit Mescla amb la unitat base Priority: Prioritat: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Nombre d'unitat base mínim: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Usa amb prefixes per defecte Error Error Base unit does not exist. La unitat base no existeix. Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? A variable or unit with the same name already exists. Do you want to overwrite it? Una variable o unitat amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Unit Edita la unitat New Unit Unitat nova UnitsDialog Units Unitats Category Categoria Unit Unitat New… Nou… Edit… Edita… Deactivate Desactiva Delete Suprimeix Convert Converteix Insert Insereix Favorite Favorit Show hidden units Mostra unitats amagades Activate Activa All All units Tot Uncategorized Sense categoria User units Unitats d'usuari Favorites Favorits Inactive Desactivat UnknownEditDialog Name: Nom: Custom assumptions Suposicions personalitzades Type: Tipus: Sign: Signe: Temporary Temporal Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Unknown Variable Edició de variable desconeguda New Unknown Variable Variable desconeguda nova VariableEditDialog Name: Nom: Temporary Temporal Value: Valor: Required Necessari Description Descripció current result resultat actual Category: Categoria: Descriptive name: Nom descriptiu: Hide variable Amaga la variable Description: Descripció: Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unitat o variable amb el mateix nom ja existeix. Voleu sobreescriure-la? Edit Variable Edita la variable New Variable Variable nova VariablesDialog Variables Variables Category Categoria Variable Variable New Nou Variable/Constant… Variable/constant… Unknown Variable… Variable desconeguda… Matrix… Matriu… Edit… Edita… Export… Exporta… Deactivate Desactiva Delete Suprimeix Insert Insereix Favorite Favorit a matrix una matriu a vector un vector positive positiu non-positive no positiu negative negatiu non-negative no negatiu non-zero no zero integer enter boolean booleà rational racional real real complex complex number nombre not matrix no matriu unknown desconegut Default assumptions Suposicions predeterminades Activate Activa All All variables Tot Uncategorized Sense categoria User variables Variables d'usuari Favorites Favorits Inactive Desactivat qalculate-qt-5.11.0/translations/qalculate-qt_de.ts000066400000000000000000017240511520501070600223370ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Taschenrechner Powerful and easy to use calculator Leistungsstarker und einfach zu bedienender Taschenrechner calculation;arithmetic;scientific;financial; Berechnung;Arithmetik; Wissenschaft;Finanzen; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! ist ein vielseitig einsetzbarer, plattformübergreifender Desktop-Rechner. Er ist einfach zu bedienen, bietet aber Leistung und Vielseitigkeit die normalerweise nur für komplizierte mathematische Pakete vorbehalten sind, sowie nützliche ls auch für den täglichen Bedarf (wie Währungsumrechnung und Prozentrechnung). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Zu den Leistungsmerkmalen gehören eine große Bibliothek anpassbarer Funktionen, Einheiten-berechnungen und -umrechnungen, physikalische Konstanten, symbolische Berechnungen (einschließlich Integrale und Gleichungen), beliebige Genauigkeit, Unsicherheits-fortpflanzung, Intervallarithmetik, Plotten und eine benutzerfreundliche Oberfläche. Argument Rules Regeln für Argumente _Cancel _Abbruch Do not save modifications Änderungen nicht speichern _OK _OK Accept the modification of argument rules Änderung der Argumentregeln akzeptieren Enable rules and type test Regeln und Typenprüfung einschalten Custom condition Benutzerdefinierte Bedingung For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Wenn das Argument zum Beispiel eine Matrix ist, die die gleiche Anzahl von Zeilen und Spalten haben muss Spalten: Zeilen(\x) = Spalten(\x) Allow matrix Matrix zulassen Forbid zero Null verbieten Handle vector Vektor verarbeiten Calculate function for each separate element in vector. Funktion für jedes einzelne Element im Vektor berechnen. Min Min Include equals Schließe Gleichheiten ein Max Max Keyboard Shortcuts Tastaturkürzel _Close _Schließen Label Beschriftung Left-click Linksklick Right-click Rechtsklick Middle-click Mittelklick Reset Zurücksetzen Button Action Aktion für Schaltfläche Value Wert Argument name Argumentname Calendar Conversion Kalender Konvertierung Export CSV File CSV-Datei exportieren Current result Aktuelles Ergebnis Matrix/vector variable Matrix/Vektor-Variable File Datei Delimiter Begrenzungszeichen Comma Komma Tabulator Tabulator Semicolon Semikolon Space Leerzeichen Other Andere Import CSV File CSV-Datei importieren Do not import the file Die Datei nicht importieren Import the file Die Datei importieren Name of the data file to import Name der zu importierenden Datendatei Select a file Wählen Sie eine Datei Import as Importieren als Matrix Matrix If a matrix shall be generated from the contents of the file Wenn aus dem Inhalt der Datei eine Matrix erzeugt werden soll Vectors Vektoren If vectors shall be generated from the contents of the file Wenn aus dem Inhalt der Datei Vektoren generiert werden sollen Name Name Name (or name prefix) used to reference generated variable(s) in expressions Name (oder Namenspräfix), der verwendet wird, um die erzeugte(n) Variable(n) in Ausdrücken zu referenzieren Descriptive name Beschreibender Name Title displayed in menus and in variable manager Titel, der in Menüs und im Variablen-Manager angezeigt wird Category Kategorie First row Erste Zeile The first row with data to import in the file Die erste Zeile mit zu importierenden Daten in der Datei Includes headings Enthält Überschriften If the first row contains column headings Wenn die erste Zeile Spaltenüberschriften enthält Delimiter used to separate columns in the file Trennzeichen, das zum Trennen von Spalten in der Datei verwendet wird Custom delimiter Benutzerdefiniertes Begrenzungszeichen Edit Data Property Dateneigenschaft bearbeiten Do not create/modify this data set Diesen Datensatz nicht erstellen/verändern Accept the creation/modification of this data set Erstellung/Änderung dieses Datensatzes akzeptieren Name used for reference Name als Referenz verwendet Properties Eigenschaften Title displayed in menus and in data set manager Titel wird in Menüs und im Datensatzmanager angezeigt Description Beschreibung Description of this data property Beschreibung dieser Dateneigenschaft Value Type Wert Typ Text Text Number Zahl Expression Ausdruck Hide Ausblenden Use as key Als Schlüssel verwenden Approximate value Näherungswert Case sensitive value Wert unterscheidet Groß-/Kleinschreibung Value uses brackets Wert verwendet Klammern Unit expression Einheitenausdruck Edit Data Set Datensatz bearbeiten Title Titel Data file Daten Datei Description of this data set Beschreibung dieses Datensatzes Copyright Urheberrecht General Allgemein Properties: Eigenschaften Definition of the properties of this data set Definition der Eigenschaften dieses Datensatzes _New _Neu _Edit _Bearbeiten _Delete _Löschen Name used to invoke the function in expressions Name, mit dem die Funktion in Ausdrücken aufgerufen wird Object argument name Objekt-Argumentname Property argument name Name des Eigenschaftsarguments Default property Standard-Eigenschaft Function Funktion Edit Data Object Datenobjekt bearbeiten Do not create/modify this data object Dieses Datenobjekt nicht anlegen/verändern Accept the creation/modification of this data object Anlegen/Ändern dieses Datenobjekts zulassen Data Sets new dataset Datensätze Data Set Datensatz Create a new data set Einen neuen Datensatz anlegen Edit the selected data set Ausgewählten Datensatz bearbeiten Delete the selected data set Löschen des ausgewählten Datensatzes Objects Objekte Create a new data object Anlegen eines neuen Datenobjekts Edit the selected data object Ausgewähltes Datenobjekt bearbeiten Remove the selected data object Ausgewähltes Datenobjekt entfernen Data Set Description Datensatz Beschreibung Object Attributes Objekt-Attribute Decimals Dezimalstellen Close this window Dieses Fenster schließen Min decimals Min Dezimalen Max decimals Max Dezimalen Minimal number of displayed decimals Minimale Anzahl der angezeigten Nachkommastellen Maximal number of decimals to display (and round to) Maximale Anzahl der anzuzeigenden (und zu rundenden) Nachkommastellen Floating Point Conversion Gleitkomma-Umrechnung Decimal value Dezimaler Wert Binary value Binärer Wert Octal value Oktalwert Hexadecimal representation Hexadezimale Darstellung Conversion error Konvertierungsfehler Binary representation Binäre Darstellung Floating point value Gleitkommawert Format Format 16-bit (half precision) 16-Bit (halbe Genauigkeit) 32-bit (single precision) 32-Bit (einfache Genauigkeit) 64-bit (double precision) 64-Bit (doppelte Genauigkeit) 80-bit (x86 extended format) 80-Bit (erweitertes x86-Format) 128-bit (quadruple precision) 128-Bit (vierfache Genauigkeit) Hexadecimal value Hexadezimalwert Edit Function Bearbeite Funktion _Help _Hilfe Do not create/modify this function Diese Funktion nicht erstellen/verändern Accept the creation/modification of this function Erstellung/Änderung dieser Funktion zulassen Name used to invoke this function in expressions Name, der zum Aufrufen dieser Funktion in Ausdrücken verwendet wird Title displayed in menus and in function manager Titel, der in Menüs und im Funktionsmanager angezeigt wird Hide function Funktion ausblenden If this function shall be hidden in menus Wenn diese Funktion in Menüs ausgeblendet werden soll Description of this function Beschreibung dieser Funktion Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Verwenden Sie \x für das erste, \y für das zweite und \z für das dritte Argument. Für weitere Informationen klicken Sie auf die Schaltfläche Hilfe. Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Bedingung, die für die Funktion wahr sein muss (z. B. wenn das zweite Argument größer sein muss als das erste: "\y > \x") Sub-Functions Unterfunktionen Arguments: Argumente: Definition of this function's arguments Definition der Argumente für diese Funktion Free Frei Integer Ganzzahl Symbol Symbol Date Datum Vector Vektor Positive number Positive Zahl Non-zero number Nicht-Null-Zahl Non-negative number Nicht-negative Zahl Positive integer Positive Ganzzahl Non-zero integer Nicht-Null-Ganzzahl Non-negative integer Nicht-negative ganze Zahl Boolean Boolescher Wert Object Objekt Unit Einheit Variable Variable Angle Winkel Data object Daten-Objekt Data property Daten-Eigenschaft _Add _Hinzufügen Add entered argument definition Eingegebene Argumentdefinition hinzufügen _Apply _Anwenden Modify selected argument Selektiertes Argument modifizieren Remove selected argument Ausgewähltes Argument entfernen Rules Regeln Edit conditions for selected argument Bedingungen für ausgewähltes Argument bearbeiten Close this dialog Diesen Dialog schließen Precalculate Vorberechnen Calculate the subfunction only once, before the parent function Die Unterfunktion nur einmal berechnen, vor der übergeordneten Funktion Add entered subfunction Eingegebene Unterfunktion hinzufügen Apply changes to the selected subfunction Änderungen auf die ausgewählte Unterfunktion anwenden Remove the selected subfunction Markierte Teilfunktion entfernen Functions Funktionen Create a new function Eine neue Funktion erstellen Edit the selected function Ausgewählte Funktion bearbeiten _Insert _Einfügen Insert (or execute) the selected function into the expression entry Einfügen (oder Ausführen) der markierten Funktion in den Ausdruckseintrag Delete the selected function Löschen der markierten Funktion (De)activate the selected function Die gewählte Funktion (de)aktivieren Deacti_vate Deakti_vieren Apply the selected function to the current expression Anwenden der ausgewählten Funktion auf den aktuellen Ausdruck Categor_y Kategorie_y _Function _Funktion Descri_ption Beschrei_bung Degrees Grad Radians Bogenmaß Gradians Neugrad Default assumptions Standardannahmen Unknown Unbekannt Not Matrix Nicht Matrix Complex Komplex Real Real Rational Rational Non-Zero Nicht-Null Positive Positiv Non-Negative Nicht-Negativ Negative Negativ Non-Positive Nicht-Positiv _File _Datei Unknown Variable Unbekannte Variable Function (simplified) Funktion (vereinfacht) Import CSV File… CSV-Datei importieren... Export CSV File… CSV-Datei exportieren... _Store Result… _Ergebnis speichern... Save Result Image… Ergebnisbild speichern... Save local functions, variables and units Lokale Funktionen, Variablen und Einheiten speichern Save Definitions Definitionen speichern Import Definitions File… Definitionsdatei importieren... Fetch current exchange rates from the Internet Aktuelle Wechselkurse aus dem Internet abrufen Update Exchange Rates Wechselkurse aktualisieren Plot Functions/Data Funktionen/Daten plotten Convert Number Bases Zahlenbasen umwandeln Floating Point Conversion (IEEE 754) Gleitkomma-Konvertierung (IEEE 754) Percentage Calculation Tool Werkzeug zur Prozentberechnung Periodic Table Periodensystem Minimal Window Minimales Fenster _Quit _Beenden Manage Variables Variablen verwalten Manage Functions Funktionen verwalten Manage Units Einheiten verwalten Manage Data Sets Datensätze verwalten Factorize Faktorisieren Expand Erweitern Apply partial fraction decomposition to the current result. Teilbruchzerlegung auf das aktuelle Ergebnis anwenden. Expand Partial Fractions Partielle Brüche expandieren Set Unknowns… Unbekannte bestimmen... Convert to Unit In Einheit umrechnen Set Prefix Präfix setzen Convert to Unit Expression… In Einheitsausdruck umrechnen... Convert to Base Units In Basiseinheiten umrechnen Convert to Optimal Unit In optimale Einheit umrechnen Insert Date… Datum einfügen... Insert Matrix… Matrix einfügen... Insert Vector… Vektor einfügen... _Copy Result _Ergebnis kopieren Customize Keypad Buttons Tastenfeld-Schaltflächen anpassen _Preferences _Voreinstellungen _Mode _Modus Number Base Zahlenbasis Select Result and Expression Base… Ergebnis und Ausdrucksbasis wählen... Binary Binär Octal Oktal Decimal Dezimal Duodecimal Duodezimal Hexadecimal Hexadezimal Other… Andere... Sexagesimal Sexagesimal Time Format Zeitformat Roman Numerals Römische Ziffern Numerical Display Numerische Anzeige Normal Normal Engineering Technisch Scientific Wissenschaftlich Purely Scientific Rein wissenschaftlich Simple Einfach Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Aus: 1/7 ≈ 0.14285714 Ein: 1/7 = 0.142857 142857... Indicate Repeating Decimals Wiederholte Dezimalstellen anzeigen Show Ending Zeroes Endnullen anzeigen Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Aus: 2.5 ≈ 3, 1.5 ≈ 2 Ein: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Halbe Zahlen auf gerade Zahlen runden Off: -x + y On: y - x Aus: -x + y Ein: y - x Sort Minus Last Minus zuletzt sortieren Complex Rectangular Form Komplexe Rechtwinklige Form Complex Exponential Form Komplexe Exponentialform Complex Polar Form Komplexe Polarform Complex Angle/Phasor Notation Komplexe Winkel-/Phasenschreibweise Rational Number Form Rationale Zahlenform 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Dezimalbrüche 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Exakte Dezimalbrüche 6/4 = 3/2 6/4 = 3/2 Simple Fractions Einfache Brüche 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Gemischte Brüche Interval Display Intervall-Anzeige Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Aus: 1/2*pi ≈ 1.5707963 Ein: 1/2*pi = 0.5 pi Adaptive Adaptiv Calculates an interval of possible values and keeps track of precision changes. Berechnet ein Intervall möglicher Werte und verfolgt die Präzisions-.änderungen Significant Digits Signifikante Ziffern Interval Intervall Plus/Minus Plus/Minus Midpoint Mittelwert Unit Display Anzeige der Einheit Do not use any prefixes in result Keine Präfixe im Ergebnis verwenden Show prefixes for primarily SI and CGS units. Präfixe für primär SI- und CGS-Einheiten anzeigen. Use prefixes for selected units Präfixe für ausgewählte Einheiten verwenden Use prefixes also for currencies Präfixe auch für Währungen verwenden Use prefixs for all units Präfixe für alle Einheiten verwenden Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Ermöglicht die automatische Verwendung von Hekto, Deka, Dezi und Centi, wenn Präfixe aktiviert sind Enable All SI Prefixes Alle SI-Präfixe einschalten Enables automatic setting of prefix for denominator in addition to the numerator Ermöglicht das automatische Setzen des Präfixes für den Nenner zusätzlich zum Zähler Enable Denominator Prefixes Nenner-Präfixe einschalten Off: J / K On: J * K^-1 Aus: J / K Ein: J * K^-1 Negative Exponents Negative Exponenten Off: (2 m)/s On: 2 (m/s) Aus: (2 m)/s Ein: 2 (m/s) Place Units Separately Einheiten gesondert platzieren No Additional Conversion Keine zusätzliche Umrechnung Convert to Optimal SI Unit In optimale SI-Einheit umrechnen If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Wenn aktiviert: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units In gemischte Einheiten umrechnen Abbreviate Names Namen abkürzen Enabled Objects Aktivierte Objekte Variables Variablen Units Einheiten Unknowns Unbekannte Units in Physical Constants Einheiten in physikalischen Konstanten If not enabled, treats all variables as unknown Wenn nicht aktiviert, werden alle Variablen als unbekannt behandelt Calculate Variables Variablen berechnen Disables/enables complex numbers in result Deaktiviert/aktiviert komplexe Zahlen im Ergebnis Allow Complex Result Komplexes Ergebnis zulassen Disables/enables infinite numbers in result Deaktiviert/aktiviert unendliche Zahlen im Ergebnis Allow Infinite Result Unendliches Ergebnis zulassen Approximation Annäherung Always Exact Immer genau Try Exact Exakt versuchen Approximate Annähern Interval Arithmetic Intervall-Arithmetik Interval Calculation Intervall-Berechnung Variance Formula Varianz-Formel Change angle unit used in trigonometric functions Ändern der in trigonometrischen Funktionen verwendeten Winkeleinheit Angle Unit Winkeleinheit None Keine Assumptions Annahmen Algebraic Mode Algebraischer Modus Assume that unknown denominators are non-zero Annehmen, dass unbekannte Nenner ungleich Null sind Non-Zero Denominators Nicht-Null-Nenner Warn when unknown denominators are assumed non-zero Warnen, wenn unbekannte Nenner als ungleich Null angenommen werden Warn About Denominators Assumed Non-Zero Warnung bei angenommenen Nennern ungleich Null Parsing Mode Analyse-Modus Adaptive Parsing Adaptive Analyse Parse Implicit Multiplication First Implizite Multiplikation zuerst analysieren Conventional Parsing Konventionelles Analysieren Chain Syntax Verketteter Syntax RPN Syntax RPN-Syntax Off: xy = x*y On: xy != x*y Aus: xy = x*y Ein: xy != x*y Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analysiert Dezimalzahlen als Näherungswerte mit einer Genauigkeit, die der Anzahl der Ziffern entspricht. Aus: 1.1 * 1.1 = 1.21 Ein: 1.1 * 1.1 ≈ 1.2 Read Precision Genauigkeit lesen _Precision _Genauigkeit _Decimals _Dezimalstellen Calculate As You Type Berechnen während der Eingabe Chain Mode Methodenverkettung Activate the RPN stack. Aktivieren Sie den RPN-Stapel. RPN Mode RPN-Modus Meta Modes Meta-Modi Save Mode… Speichere Modus... Delete Mode… Modus löschen... Save Default _Mode Standard _Modus speichern Fu_nctions Fu_nktionen _Variables _Variablen _Units _Einheiten _Contents _Inhalte Report a Bug Einen Fehler melden Check for Updates Nach Updates suchen _About _Über Toggle minimal window Schalte um auf minimales Fenster Calculation result Berechnungsergebnis _Keypad _Tastatur Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Schaltet das beständige Tastenfeld um (ermöglicht die gleichzeitige Anzeige von Tastenfeld und Verlauf) _History _Historie C_onversion U_mrechnung RPN Stack RPN-Stack Insert the selected value Einfügen des markierten Wertes Insert the selected text Einfügen des markierten Textes Copy the selected text Kopieren des markierten Textes Add the selected value(s) Addiert den/die markierten Wert(e) Subtract the selected value(s) Subtrahiert den/die markierten Wert(e) Multiply the selected value(s) Multiplizieren des/der markierten Werte(s) Divide the the selected value(s) Dividieren des/der markierten Werte(s) Raise to the power of the selected value Erhöhen mit der Potenz des markierten Wertes Calculate the square root of the selected value Berechnen der Quadratwurzel des gewählten Wertes History Verlauf Subtract the top value from the second value Subtrahieren des oberen Wertes vom zweiten Wert Multiply the top two values Multiplizieren der beiden oberen Werte Divide the second value by the top value Dividieren des zweiten Wertes durch den oberen Wert Raise the second value to the power of the top value Erhöhen des zweiten Wertes mit der Potenz des oberen Wertes Negate the top value (Ctrl+-) Negieren des oberen Wertes (Strg+-) Invert the top value Invertieren des oberen Wertes Calculate the square root of the top value Quadratwurzel des obersten Wertes berechnen Calculate the sum of all values Summe aller Werte berechnen Rotate the stack or move selected register up Drehen des Stapels oder Verschieben des ausgewählten Register nach oben Rotate the stack or move selected register down Drehen des Stapels oder Verschieben des ausgewählten Register nach unten Swap the two top values or move the selected value to the top of the stack Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels Copy the selected or top value to the top of the stack Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels Enter the top value from before the last numeric operation Eingabe des obersten Wertes von vor der letzten numerischen Operation Delete the top or selected value Löschen des oberen oder ausgewählten Wertes Edit the selected value Bearbeiten des ausgewählten Wertes Clear the RPN stack Löschen des RPN-Stack Unit(s) and prefix to convert result to Einheit(en) und Präfix zum Umrechnen des Ergebnisses in Convert Umrechnen Continuous conversion Kontinuierliche Konvertierung Automatically convert result to the current unit expression as long as the conversion box is visible. Ergebnis automatisch in den aktuellen Einheitenausdruck umrechnen, solange das Umrechnungsfeld sichtbar ist. Add prefix Präfix hinzufügen If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Wenn der Einheitsausdruck keine Präfixe enthält, verwenden Sie das optimale Präfix. Dies kann außer Kraft gesetzt werden, indem dem Einheitenausdruck ein "?" oder "0" vorangestellt wird. Conversion Konvertierung Show/hide programming keypad Programmiertastatur ein-/ausblenden Exact Genau Fraction Bruchteil Numerical display Numerische Anzeige Pure Rein Number base Zahlenbasis Time format Zeitformat Roman Römisch sin sin cos cos tan tan ln ln Equals Entspricht sqrt sqrt sum sum Unknown variable Unbekannte Variable mod mod mean Mittelwert Store result as a variable Ergebnis als Variable speichern STO Standard calculator button. Do not use more than three characters. STO Convert number bases Zahlenbasen umrechnen Imaginary unit i (√-1) Imaginäre Einheit i (√-1) Manage units Einheiten verwalten Conversion operator Umrechnungsoperator Kilogram Kilogramm Two's complement input Zweierkomplement Eingabe Two's complement output Zweierkomplement-Ausgabe Bitwise Exclusive OR Bitweise Exklusiv-ODER Bitwise Left Shift Bitweise Linksverschiebung Bitwise Right Shift Bitweise Rechtsverschiebung Floating point conversion Gleitkomma-Konvertierung Show/hide left keypad Linkes Tastenfeld ein-/ausblenden Show/hide right keypad Rechtes Tastenfeld ein-/ausblenden DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Vorheriges Ergebnis ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Zum Ausdruck hinzufügen Persistent Keypad Beständiges Tastenfeld Edit Bearbeiten Delete Löschen Update Aktualisieren Insert Value Wert einfügen Insert Text Text einfügen Insert Parsed Text Analysierten Text einfügen Copy Kopieren Copy Full Text Vollständigen Text kopieren Search… Suchen... Add Bookmark… Lesezeichen hinzufügen... Bookmarks Lesezeichen Protect Schützen Move To Top Nach oben verschieben Remove Entfernen Clear All Alles löschen _Copy _Kopieren _Store… _Sichern... Save Image… Bild speichern... _Factorize _Faktorisieren _Expand _Expandieren _Normal _Normal Sc_ientific Wi_ssenschaftlich Purel_y Scientific Rei_n Wissenschaftlich Simp_le Simp_le _Binary _Binär _Octal _Oktal _Decimal _Dezimal _Hexadecimal _Hexadezimal Decimal Fraction Dezimalbruch Exact Decimal Fraction Exakter Dezimalbruch Simple Fraction Einfacher Bruch Mixed Fraction Gemischter Bruch _Abbreviate Names _Namen abkürzen C_onvert… U_mrechnen... Convert to Base _Units Umrechnen in Basis _Einheiten Convert _to Optimal Unit Umrechnen _in optimale Einheit Use Optimal Prefix Optimalen Präfix verwenden Convert to Konvertiere in Convert to UTC Konvertiere in UTC Convert to Calendars Konvertiere in Kalender Use prefixes for all units Präfixe für alle Einheiten verwenden Enable All SI Prefi_xes Alle SI-Präfi_xe aktivieren View/Edit Matrix Matrix anzeigen/bearbeiten View/Edit Vector Vektor anzeigen/bearbeiten Copy Text Text kopieren To Top Nach oben Swap Tauschen Up Hoch Down Runter Negate Negieren Invert Invertieren Square Quadratisch Square Root Quadratische Wurzel Clear Stack Stapel löschen Select Number Base… Zahlenbasis wählen... Store result Ergebnis speichern Add result Add current result to variable value Ergebnis addieren Subtract result Subtruct current result from variable value Ergebnis subtrahieren Insert the matrix/vector into the expression Einfügen der Matrix/des Vektors in den Ausdruck Rows Zeilen Number of rows in this matrix (rows displayed for vectors) Anzahl der Zeilen in dieser Matrix (bei Vektoren werden die Zeilen angezeigt) Columns Spalten Number of columns in this matrix (columns displayed for vectors) Anzahl der Spalten in dieser Matrix (bei Vektoren werden die Spalten angezeigt) If this is a matrix or vector Wenn dies eine Matrix oder ein Vektor ist Elements Elemente Current element: Aktuelles Element: Edit Matrix Matrix bearbeiten Do not create/modify this matrix/vector Diese Matrix/Vektor nicht erstellen/verändern Create/modify the matrix/vector Matrix/Vektor erstellen/verändern Accept the creation/modification of this matrix/vector Anlegen/Ändern dieser Matrix/des Vektors übernehmen Name used to reference this variable in expressions Name, der verwendet wird, um diese Variable in Ausdrücken zu referenzieren Names Namen Add new name Neuen Namen hinzufügen Apply changes to the selected name Änderungen auf den ausgewählten Namen anwenden Remove the selected name Den ausgewählten Namen entfernen Abbreviation Abkürzung Unicode Unicode Plural Plural Suffix Nachsilbe Reference Referenz Avoid input Eingabe vermeiden Case sensitive Groß-/Kleinschreibung beachten Completion only Nur Vervollständigung Number Bases Zahlen-Basen Roman numerals Römische Ziffern BIN BIN OCT OKT DEC DEZ DUO DUO HEX HEX ROM ROM Subtract Subtrahieren Multiply Multiplizieren Divide Dividieren Bitwise AND Bitweise UND Bitwise OR Bitweises ODER Bitwise NOT Bitweises NICHT Clear Löschen Enter two values, of which at most one is a percentage, and the others will be calculated for you. Geben Sie zwei Werte ein, von denen höchstens einer ein Prozentwert ist, und die anderen werden für Sie berechnet. Percentage Prozentsatz Calculate Berechnen Value 1 Wert 1 2 compared to 1 2 im Vergleich zu 1 Change from 1 to 2 Änderung von 1 auf 2 Value 2 Wert 2 1 compared to 2 1 im Vergleich zu 2 Change from 2 to 1 Änderung von 2 auf 1 Plot Plotten _Save _Speichern Save as png, svg, postscript, eps, latex or fig Speichern als png, svg, postscript, eps, latex oder fig Vector/matrix Vektor/Matrix Paired matrix Gepaarte Matrix if you want to split matrix in rows instead of columns wenn Sie die Matrix in Zeilen statt in Spalten aufteilen wollen X variable X Variable The variable name used in expression Der Name der Variable, die im Ausdruck verwendet wird Style Stil Line Zeile Points Punkte Line with points Linie mit Punkten Boxes/bars Boxen/Balken Histogram Histogramm Steps Stufen Candlesticks Kerzenständer Dots Punkte Smoothing Glättung Monotonic Monoton Natural cubic splines Natürliche kubische Splines Bezier Bézier Bezier (monotonic) Bézier (monoton) Y-axis Y-Achse Primary Primär Secondary Sekundär _Remove _Entfernen Data Daten Minimum x value Minimaler x-Wert Maximum x value Maximaler x-Wert Sampling rate Abtastrate Step size Schrittweite Function Range Funktionsbereich Display grid Raster anzeigen Display full border Vollen Rand anzeigen Minimum y value Minimaler y-Wert Maximum y value Maximaler y-Wert Logarithmic x scale Logarithmische x-Skala Logarithmic y scale Logarithmische y-Skala X-axis label X-Achsen-Beschriftung Y-axis label Y-Achsen-Beschriftung Line width Linienbreite Color display Farbdarstellung Color Farbe Monochrome Monochrom Legend placement Platzierung der Legende Top-left Oben-links Top-right Oben-rechts Bottom-left Unten-links Bottom-right Unten-rechts Below Unterhalb Outside Außerhalb Appearance Erscheinungsbild Precision Genauigkeit _Recalculate _Neuberechnen Recalculate expression Ausdruck neu berechnen The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Die Anzahl der signifikanten Stellen, die angezeigt/berechnet werden sollen (einfache Arithmetik wird immer exakt berechnet) Preferences Einstellungen Save mode on exit Modus beim Beenden speichern If the mode of the calculator shall be restored Wenn der Modus des Taschenrechners wiederhergestellt werden soll Save definitions on exit Definitionen beim Beenden speichern If changes to functions, units and variables shall be saved automatically Wenn Änderungen an Funktionen, Einheiten und Variablen automatisch gespeichert werden sollen Clear history on exit Verlauf beim Beenden löschen Allow multiple instances Mehrere Instanzen zulassen Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Erlaubt, dass mehrere Instanzen des Hauptfensters von Qalculate! gleichzeitig geöffnet sein können. Beachten Sie, dass nur der Modus, der Verlauf und die Definitionen der zuletzt geschlossenen Instanz gespeichert werden. Notify when a new version is available Benachrichtigen, wenn eine neue Version verfügbar ist Use keyboard keys for RPN Tasten auf der Tastatur für RPN verwenden Use keyboard operator keys for RPN operations (+-*/^). Tastaturoperatortasten für RPN-Operationen verwenden (+-*/^). Use caret for bitwise XOR Einfügezeichen für bitweises XOR verwenden Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Eingabe von XOR (⊻) mit Einfügezeichen (^) auf der Tastatur (sonst mit Strg+^). Der Potenzierungsoperator (^) kann immer mit Strg+* eingegeben werden. Add calculate-as-you-type result to history Berechne-während-du-tippst-Ergebnis zur Historie hinzufügen Delay: Verzögern: Time limit for plot: Zeitlimit für Plot: Behavior Verhalten Enable Unicode symbols Unicode-Symbole einschalten Disable this if you have problems with some fancy characters Deaktivieren Sie dies, wenn Sie Probleme mit einigen ausgefallenen Zeichen haben Ignore system language (requires restart) Systemsprache ignorieren (erfordert Neustart) Use system tray icon Systemtray-Symbol verwenden Hides the application in the system tray when the main window is closed Versteckt die Anwendung in der Taskleiste, wenn das Hauptfenster geschlossen wird Hide on startup Beim Starten ausblenden Remember window position Fensterposition merken Application name Name der Anwendung Result Ergebnis Application name + result Anwendungsname + Ergebnis Mode Modus Application name + mode Anwendungsname + Modus Window title Fenstertitel Default Standard Light Hell Dark Dunkel High contrast Hoher Kontrast Dark high contrast Dunkel Hochkontrast Theme Design Button padding Schaltflächen Abstand / / Number of expression lines Anzahl der Ausdruckszeilen 3 3 Display expression status Anzeige des Ausdrucksstatus If as-you-type expression status shall be displayed below the expression entry Wenn der Status des Ausdrucks "während-du-tippst" unterhalb des Ausdruckseintrags angezeigt werden soll Persistent keypad Beständiges tastenfeld Look & Feel Aussehen & Bedienung Binary two's complement representation Binäre Zweierkomplement-Darstellung If two's complement representation shall be used for negative binary numbers. Ob die Zweierkomplement-Darstellung für negative Binärzahlen verwendet werden soll. Hexadecimal two's complement representation Hexadezimale Zweierkomplement-Darstellung If two's complement representation shall be used for negative hexadecimal numbers. Wenn die Zweierkomplement-Darstellung für negative Hexadezimalzahlen verwendet werden soll. Use lower case letters in non-decimal numbers Kleinbuchstaben in Zahlen mit nicht-dezimaler Basis verwenden If lower case letters should be used in numbers with non-decimal base Wenn Kleinbuchstaben in Zahlen mit nicht dezimaler Basis verwendet werden sollen Alternative base prefixes Alternative Basis-Präfixe If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Wenn hexadezimale Zahlen mit "0x0" und binäre Zahlen mit "0b00" als Präfixe dargestellt werden sollen Spell out logical operators Logische Operatoren ausbuchstabieren If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Wenn logisch und/oder als "&&"/"||" oder "and"/"or" dargestellt werden soll If "e" shall be used instead of "E" in numbers Wenn "e" statt "E" in Zahlen verwendet werden soll Use E-notation instead of 10<sup><i>n</i></sup> E-Notation anstelle von 10<sup><i>n</i></sup> verwenden Use lower case "e" (as in 1e10) Kleinschreibung von "e" verwenden (wie in 1e10) Use 'j' as imaginary unit 'j' als imaginäre Einheit verwenden Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Verwenden Sie 'j' (anstelle von 'i') als Standardsymbol für die imaginäre Einheit, und platzieren Sie es vor dem Imaginärteil. Use comma as decimal separator Komma als Dezimaltrennzeichen verwenden Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Punkt, '.', als Tausendertrennzeichen anstelle eines alternativen Dezimalzeichens zulassen Ignore comma in numbers Komma in Zahlen ignorieren Allow commas, ',', to be used as thousands separator instead of as an function argument separator Erlaubt die Verwendung von Kommas, ',', als Tausendertrennzeichen statt als Funktionsargumenttrennzeichen Ignore dots in numbers Punkte in Zahlen ignorieren Digit grouping Zifferngruppierung off aus standard Standard local lokal Multiplication sign Multiplikationszeichen Division sign Divisionszeichen Copy digit separator Zifferntrennzeichen kopieren Deactivate to remove digit separator when copying result Deaktivieren, um Zifferntrennzeichen beim Kopieren des Ergebnisses zu entfernen Numbers & Operators Zahlen & Operatoren Use binary prefixes for information units Binäre Präfixe für Informationseinheiten verwenden Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Verwenden Sie standardmäßig binäre, statt dezimale Präfixe für Informationseinheiten (z.B. Bytes). Conversion to local currency Umrechnung in Landeswährung Automatically convert to the local currency when optimal unit conversion is activated. Konvertieren Sie automatisch in die lokale Währung, wenn die optimale Einheitenumrechnung aktiviert ist. Update exchange rates on start Wechselkurse beim Start aktualisieren If current exchange rates shall be downloaded from the internet at program start Wenn die aktuellen Wechselkurse beim Programmstart aus dem Internet geladen werden sollen Exchange rates updates Wechselkurse aktualisieren Temperature calculation mode: Temperatur-Berechnungsmodus: Absolute Absolut Relative Relativ Hybrid Hybrid Units & Currencies Einheiten & Währungen Show expression completion suggestions Vorschläge zur Vervollständigung von Ausdrücken anzeigen Search titles and countries Titel und Länder suchen Minimum characters Minimale Zeichen Popup delay (ms) Popup-Verzögerung (ms) Completion Vervollständigung Status warning color Farbe der Status-Warnung Status error color Farbe für Status-Fehler Custom status font Benutzerdefinierte Schriftart für den Status If you want to use a font other than the default in the status display below the expression entry Wenn Sie in der Statusanzeige unter dem Ausdruckseintrag eine andere als die Standardschriftart verwenden möchten Custom expression font Benutzerdefinierte Ausdrucksschriftart If you want to use a font other than the default in the expression entry Wenn Sie in der Ausdruckseingabe eine andere als die Standardschriftart verwenden möchten Custom result font Benutzerdefinierte Ergebnisschriftart If you want to use a font other than the default in the result display Wenn Sie in der Ergebnisanzeige eine andere Schriftart als die Standardschriftart verwenden möchten Custom keypad font Benutzerdefinierte Tastenfeldschriftart If you want to use a font other than the default in the keypad Wenn Sie eine andere Schriftart als die Standardschriftart im Tastenfeld verwenden möchten Custom application font Benutzerdefinierte Anwendungsschriftart If you want to use a font other than the default for the whole application Wenn Sie eine andere als die Standardschriftart für die gesamte Anwendung verwenden möchten Text color Textfarbe Fonts & Colors Schriftarten und Farben Other: Andere: Bijective base-26 Bijektive Basis-26 <b>Result Base</b> <b>Ergebnisbasis</b> <b>Expression Base</b> <b>Ausdrucksbasis</b> New Keyboard Shortcut Neues Tastaturkürzel Edit Variable Variable bearbeiten Advanced Erweitert Accept the creation/modification of this variable Erstellen/Ändern dieser Variable übernehmen. x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Verwenden Sie x, y und z jeweils für das erste, zweite und dritte Funktionsargument. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Verwenden Sie \x, \y und \z für das erste, zweite bzw. dritte Funktionsargument. Dadurch werden mögliche Konflikte mit Variablen, Funktionen und Einheiten vermieden. Edit Unit Einheit bearbeiten Do not create/modify this unit Diese Einheit nicht erstellen/verändern Accept the creation/modification of this unit Erstellen/Ändern dieser Einheit übernehmen. Singular form of this unit's name Singularform des Einheitennamens Title displayed in menus and in unit manager Titel wird in Menüs und im Einheitenmanager angezeigt System System Imperial Imperial US Survey US-Umfrage Hide unit Einheit ausblenden If this unit shall be hidden in menus Wenn diese Einheit in Menüs ausgeblendet werden soll Class Klasse The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Die Klasse, zu der diese Einheit gehört. Benannte abgeleitete Einheiten werden in Bezug auf eine einzelne andere Einheit definiert, mit einem optionalen Exponenten, während (unbenannte) abgeleitete Einheiten durch einen Einheitenausdruck mit einer oder mehreren Einheiten definiert werden. Base unit Basiseinheit Named derived unit Benannte abgeleitete Einheit Derived unit Abgeleitete Einheit Base unit(s) Basiseinheit(en) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Einheit (für benannte abgeleitete Einheit) oder Einheitenausdruck (für unbenannte abgeleitete Einheit), die diese Einheit in Bezug auf Exponent Exponent Exponent of the base unit Exponent der Basiseinheit Relation Relation Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation zur Basiseinheit. Für lineare Beziehungen sollte dies einfach eine Zahl sein. Für nicht lineare Beziehungen verwenden Sie \x für den Faktor und \y für den Exponenten (z.B. "\x + 273,15" für die Beziehung zwischen Grad Celsius und Kelvin). Relation is exact Relation ist exakt If the relation is precise Wenn die Relation exakt ist Inverse relation Inverse Relation Specify for non-linear relation, for conversion back to the base unit. Bei nicht-linearer Relation angeben, zur Umrechnung zurück in die Basiseinheit. Mix with base unit Mit Basiseinheit mischen - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Entscheidet, mit welchen Einheiten die Basiseinheit gemischt wird, wenn mehrere Optionen vorhanden sind. - Die ursprüngliche Einheit wird nicht mit Einheiten mit niedrigerer Priorität gemischt. - Ein niedrigerer Wert bedeutet höhere Priorität. Priority Vorrangig Minimum base unit number Minimale Nummer der Basiseinheit Use with prefixes by default Standardmäßig mit Präfixen verwenden Create a new unit Eine neue Einheit erstellen Edit the selected unit Die ausgewählte Einheit bearbeiten Insert the selected unit into the expression entry Einfügen der ausgewählten Einheit in den Ausdruckseintrag C_onvert U_mrechnen Convert the result to the selected unit Das Ergebnis in die ausgewählte Einheit umrechnen Delete the selected unit Löschen der selektierten Einheit (De)activate the selected unit Selektierte Einheit (de)aktivieren _Unit _Einheit Convert between units Zwischen Einheiten umrechnen = = Conver_sion Umrech_nung Converted value Umgerechneter Wert Value to convert from Umzurechnender Wert von Type anywhere Eingabe irgendwo Edit Unknown Variable Unbekannte Variable bearbeiten Do not create/modify this unknown variable Diese unbekannte Variable nicht erstellen/verändern Accept the creation/modification of this unknown variable Erstellung/Änderung dieser unbekannten Variable übernehmen Name used to reference this unknown variable in expressions Name, der verwendet wird, um diese unbekannte Variable in Ausdrücken zu referenzieren Use custom assumptions Benutzerdefinierte Annahmen verwenden Type Typ Real Number Reelle Zahl Rational Number Rationale Zahl Sign Vorzeichen The category this unknown variable belongs to Die Kategorie, zu der diese unbekannte Variable gehört Value of this variable (expression) Wert der Variable (Ausdruck) value is exact Wert ist genau If the value is precise Wenn der Wert genau ist The category this variable belongs to Die Kategorie, zu der diese Variable gehört Create a new variable Eine neue Variable erstellen Edit the selected variable Bearbeiten Sie die ausgewählte Variable Insert the selected variable into the expression entry Einfügen der ausgewählten Variable in den Ausdruckseintrag Delete the selected variable Löschen der ausgewählten Variable (De)activate the selected variable Ausgewählte Variable (de)aktivieren E_xport E_xportieren _Variable _Variable Execute expressions and commands from a file Ausdrücke und Befehle aus einer Datei ausführen Start a new instance of the application Eine neue Instanz der Applikation starten Display the application version Anzeigen der Applikationsversion Specify the window title Festlegen des Fenstertitels TITLE TITEL Expression to calculate Zu berechnender Ausdruck [EXPRESSION] [AUSDRUCK] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. ans ans Last Answer Letzte Antwort answer antwort Answer 2 Antwort 2 Answer 3 Antwort 3 Answer 4 Antwort 4 Answer 5 Antwort 5 Memory Speicher Failed to load global definitions! Das Laden der globalen Definitionen ist fehlgeschlagen! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alle By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Standardmäßig ist nur eine Instanz (ein Hauptfenster) von %s erlaubt. Wenn mehrere Instanzen gleichzeitig geöffnet werden, werden nur die Definitionen (Variablen, Funktionen usw.), der Modus, die Einstellungen und der Verlauf des zuletzt geschlossenen Fensters gespeichert. Möchten Sie trotzdem die Standardvorgabe ändern und mehrere gleichzeitige Instanzen zulassen? c-format Right-click/long press: %s Rechtsklick/Lang drücken: %s c-format Right-click: %s Rechtsklick: %s c-format Middle-click: %s Mittelklick: %s c-format Cycle through previous expression Durchlaufen vorheriger Ausdrücke Move cursor left or right Mauszeiger nach links oder rechts bewegen Move cursor to beginning or end Mauszeiger zum Anfang oder Ende bewegen Uncertainty/interval Ungenauigkeit/Intervall Relative error Relativer Fehler Argument separator Argument-Trennzeichen Blank space Leerzeichen New line Neue Zeile Smart parentheses Intelligente Klammern Vector brackets Vektorielle Klammern Left parenthesis Linke Klammer Left vector bracket Linke Vektor-Klammer Right parenthesis Rechte Klammer Right vector bracket Rechte Vektor-Klammer Decimal point Dezimalpunkt Raise (Ctrl+*) Erhöhen (Strg+*) Add Hinzufügen M+ (memory plus) M+ (Speicher plus) MC (memory clear) MC (Speicher löschen) Backspace Rücktaste M− (memory minus) M- (Speicher minus) Previous result (static) Vorheriges Ergebnis (statisch) Calculate expression Ausdruck berechnen MR (memory recall) MR (Speicherabruf) MS (memory store) MS (Speicher speichern) Set unknowns Unbekannte setzen more Show further items in a submenu mehr Logical AND Logisches UND Logical OR Logisches ODER Logical NOT logisches NICHT Toggle Result Base Ergebnisbasis umschalten Open menu with stored variables Menü mit gespeicherten Variablen öffnen Index Index ENTER RPN Enter (calculate and add to stack) EINGABE Calculate expression and add to stack Ausdruck berechnen und zum Stapel hinzufügen Flag Flagge Matrices Matrizen Gregorian Gregorianisch Revised Julian (Milanković) Neujulianisch (Milanković) Julian Julianisch Islamic (Hijri) Islamisch (Hijri) Hebrew Hebräisch Chinese Chinesisch Persian (Solar Hijri) Persisch (Solar Hijri) Coptic Koptisch Ethiopian Äthiopisch Indian (National) Indisch (National) Action Aktion Key combination Tastenkombination Raise Erhöhen History Answer Value Verlauf Ergebniswert History Index(es) Verlaufsindex(e) History index %s does not exist. Verlaufsindex %s existiert nicht. c-format expression ausdruck History Parsed Expression Verlauf des analysierten Ausdrucks Set Window Title Fenstertitel setzen Failed to open %s. %s Konnte %s. nicht öffnen %s c-format Could not display help for Qalculate!. Konnte keine Hilfe für Qalculate! anzeigen. Could not display help for Qalculate!. %s Konnte keine Hilfe für Qalculate! anzeigen. %s c-format approx. ca. Stop process Prozess anhalten Clear expression Ausdruck löschen EXACT EXAKT APPROX CIRCA RPN RPN CHN Chain mode CHN ROMAN RÖMISCH DEG DEG RAD RAD GRA GRA PREC PREZ FUNC FUNK UNIT EINHEIT VAR VAR INF INF CPLX KPLX Do you wish to update the exchange rates now? Möchten Sie die Wechselkurse jetzt aktualisieren? It has been %s day since the exchange rates last were updated. Es ist %s Tag seit der letzten Aktualisierung der Wechselkurse vergangen. Es sind %s Tage seit der letzten Aktualisierung der Wechselkurse vergangen. c-format It has been %s days since the exchange rates last were updated. Do not ask again Nicht erneut fragen It took too long to generate the plot data. Es hat zu lange gedauert, die Plotdaten zu generieren. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Es hat zu lange gedauert, die Plotdaten zu generieren. Bitte verringern Sie die Abtast-rate oder erhöhen Sie das Zeitlimit in den Einstellungen. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Wenn während der Berechnung Fehler, Warnungen und andere Informationen generiert werden, ändert sich das Symbol in der oberen rechten Ecke des Ausdruckseintrags, um dies anzuzeigen. Wenn Sie den Zeiger über das Symbol halten oder darauf klicken, wird die Meldung angezeigt. Path of executable not found. Pfad der ausführbaren Datei nicht gefunden. curl not found. curl nicht gefunden. Failed to run update script. %s Update-Skript konnte nicht ausgeführt werden. %s c-format Failed to check for updates. Prüfung auf Updates fehlgeschlagen. No updates found. Keine Updates gefunden. A new version of %s is available at %s. Do you wish to update to version %s. Eine neue Version von %s ist verfügbar unter %s. Möchten Sie auf die Version %s aktualisieren. c-format A new version of %s is available. You can get version %s at %s. Eine neue Version von %s ist verfügbar. Sie können die Version %s unter %s erhalten. c-format Too many arguments for %s(). Zu viele Argumente für %s(). c-format argument argument Temperature Calculation Mode Temperatur-Berechnungsmodus The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Der Ausdruck ist mehrdeutig. Bitte wählen Sie den Temperaturberechnungsmodus (der Modus kann später in den Einstellungen geändert werden). Interpretation of dots Interpretation von Punkten Please select interpretation of dots (".") (this can later be changed in preferences). Bitte wählen Sie die Interpretation der Punkte (".") (dies kann später in den Einstellungen geändert werden). Both dot and comma as decimal separators Sowohl Punkt als auch Komma als Dezimaltrennzeichen Dot as thousands separator Punkt als Tausendertrennzeichen Only dot as decimal separator Nur Punkt als Dezimaltrennzeichen Uncategorized Nicht kategorisiert hexadecimal hexadezimal octal oktal decimal dezimal duodecimal duodezimal binary binär roman römisch bijective bijektiv sexagesimal sexagesimal latitude breitengrad longitude längengrad time zeit bases basen calendars kalendarien rectangular rechtwinklig cartesian kartesisch exponential exponentiell polar polar angle winkel phasor phase optimal optimal base basis mixed gemischt fraction bruchteil factors faktoren partial fraction teilbruch factorize faktorisieren expand erweitern hexadecimal number hexadezimale zahl octal number oktalzahl decimal number dezimalzahl duodecimal number duodezimalzahl binary number binärzahl roman numerals römische Ziffern bijective base-26 bijektive basis-26 sexagesimal number sexagesimale Zahl 32-bit floating point 32-Bit-Gleitkomma 64-bit floating point 64-Bit-Gleitkomma 16-bit floating point 16-Bit Gleitkomma 80-bit (x86) floating point 80-Bit (x86) Gleitkomma 128-bit floating point 128-Bit Gleitkomma time format zeitformat number bases zahlenbasen optimal unit optimale einheit base units basiseinheiten mixed units gemischte einheiten expanded partial fractions erweiterte teilbrüche complex rectangular form komplexe rechteckform complex exponential form komplexe exponentialform complex polar form komplexe polarform complex cis form komplexe cis-form complex angle notation komplexe winkeldarstellung complex phasor notation komplexe Phasenschreibweise UTC time zone UTC-Zeitzone number base %s zahlenbasis %s c-format Inactive Inaktiv Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Ruft Daten aus dem %s-Datensatz für ein angegebenes Objekt und eine Eigenschaft ab. Wenn "info" als Eigenschaft eingegeben wird, wird ein Dialogfenster mit allen Eigenschaften des Objekts angezeigt. c-format Example: Beispiel: Arguments Argumente optional optional argument optional default: argument default, in description standard: Requirement Bedingung key indicating that the property is a data set key Taste Acti_vate Akti_vate a previous result ein vorheriges Ergebnis matrix matrix vector vektor positive positiv non-positive nicht-positiv negative negativ non-negative nicht-negativ non-zero nicht-null boolean boolesch integer ganzzahlig rational rational real reell complex komplex number zahl (not matrix) (nicht Matrix) unknown unbekannt default assumptions standardmäßige Annahmen Variable does not exist anymore. Variable existiert nicht mehr. Data Retrieval Function Funktion zum Abrufen von Daten Insert function Funktion einfügen Insert function (dialog) Funktion einfügen (Dialog) Insert variable Variable einfügen Insert unit Einheit einfügen Insert text Text einfügen Insert date Datum einfügen Insert vector Vektor einfügen Insert matrix Matrix einfügen Insert smart parentheses Intelligente Klammern einfügen Convert to unit In Einheit umrechnen Convert to unit (entry) In Einheit umrechnen (Eingabe) Convert to optimal unit In optimale Einheit umrechnen Convert to base units In Basiseinheiten umrechnen Convert to optimal prefix In optimales Präfix umrechnen Convert to number base In Zahlenbasis umrechnen Factorize result Ergebnis faktorisieren Expand result Expandieren des Ergebnisses Expand partial fractions Expandieren von Teilbrüchen RPN: down RPN: abwärts RPN: up RPN: aufwärts RPN: swap RPN: tauschen RPN: copy RPN: kopieren RPN: lastx RPN: lastx RPN: delete register RPN: Register löschen RPN: clear stack RPN: Stapel löschen Load meta mode Metamodus laden Set expression base Ausdrucksbasis einstellen Set result base Ergebnisbasis einstellen Toggle exact mode Exakten Modus einstellen Set angle unit to degrees Winkeleinheit auf Grad stellen Set angle unit to radians Winkeleinheit auf Bogenmaß stellen Set angle unit to gradians Winkeleinheit auf Gradienten stellen Toggle simple fractions Einfache Brüche umschalten Toggle mixed fractions Gemischte Brüche umschalten Toggle scientific notation Umschalten der wissenschaftlichen Schreibweise Toggle simple notation Umschalten der einfachen Schreibweise Toggle RPN mode RPN-Modus umschalten Toggle calculate as you type Umschalten zwischen Rechnen während der Eingabe Toggle programming keypad Programmiertastatur ein- und ausschalten Show keypad Tastenfeld anzeigen Show history Verlauf anzeigen Search history Verlauf suchen Show conversion Umrechnung anzeigen Show RPN stack RPN-Stack anzeigen Manage variables Variablen verwalten Manage functions Funktionen verwalten Manage data sets Datensätze verwalten New variable Neue Variable New function Neue Funktion Open plot functions/data Plotfunktionen/Daten öffnen Open convert number bases Aufruf Zahlenbasis konvertieren Open floating point conversion Gleitkomma-Konvertierung öffnen Open calender conversion Kalenderkonvertierung öffnen Open percentage calculation tool Prozentrechnungs-Tool öffnen Open periodic table Periodensystem öffnen Update exchange rates Wechselkurse aktualisieren Copy result Ergebnis kopieren Insert result Text einfügen Save result image Ergebnisbild speichern Help Hilfe Quit Beenden Toggle chain mode Schalte um auf Methodenverkettung Toggle keep above Exakten Modus einstellen Show/hide completion Keine Fertigstellung Prefixes Präfixe No Prefix Kein Präfix Optimal Prefix Optimales Präfix Prefix Präfix Complex angle/phasor notation Komplexe Winkel-/Phasenschreibweise Number bases Zahlenbasen Base units Basiseinheiten Binary number Binäre Zahlen Calendars Kalendarien Complex cis form Komplexe cis-Form Decimal number Dezimalzahl Duodecimal number Duodezimale Zahl Complex exponential form Komplexe Exponentialform Factors Faktoren 16-bit floating point binary format 16-Bit-Gleitkomma-Binärformat 32-bit floating point binary format 32-Bit-Gleitkomma-Binärformat 64-bit floating point binary format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) floating point binary format 80-Bit (x86) Fließkomma-Binärformat 128-bit floating point binary format 128-Bit Fließkomma-Binärformat Hexadecimal number Hexadezimalzahl Latitude Breitengrad Longitude Längengrad Mixed units Gemischte Einheiten Octal number Oktalzahl Optimal units Optimale Einheiten Expanded partial fractions Erweiterte Teilbrüche Complex polar form Komplexe Polarform Complex rectangular form Komplexe Rechteckform Sexagesimal number Sexagesimalzahl and und or oder undefined undefiniert result is too long see history Ergebnis ist zu lang siehe Verlauf calculation was aborted Berechnung wurde abgebrochen RPN Register Moved RPN-Register verschoben RPN Operation RPN-Operation Processing… Verarbeitung... result processing was aborted ergebnisverarbeitung wurde abgebrochen Factorizing… Faktorisieren... Expanding partial fractions… Expandieren von Teilbrüchen... Expanding… Expandieren... Calculating… Berechnen... Converting… Konvertieren... Fetching exchange rates. Abrufen von Wechselkursen. Time zone parsing failed. Zeitzonenanalyse fehlgeschlagen. Keep open Offen halten Enter RPN Enter (calculate and add to stack) eingeben C_alculate B_erechnen Apply to Stack Auf Stapel anwenden Argument Argument True Wahr False Falsch Info Info Edit Unit (global) Einheit bearbeiten (global) New Unit Neue Einheit Empty name field. Leeres Namensfeld. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Eine Variable oder Einheit mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Base unit does not exist. Basiseinheit ist nicht vorhanden. Edit Function (global) Funktion bearbeiten (global) New Function Neue Funktion Yes Ja No Nein Empty expression field. Leeres Ausdrucksfeld. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Unit does not exist Einheit ist nicht vorhanden Edit Unknown Variable (global) Unbekannte Variable bearbeiten (global) New Unknown Variable Neue Unbekannte Variable An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Variable (global) Variable bearbeiten (global) New Variable Neue Variable Empty value field. Leeres Wertefeld. Edit Vector Vektor bearbeiten Edit Vector (global) Vektor bearbeiten (global) New Vector Neuer Vektor Edit Matrix (global) Matrix bearbeiten (global) New Matrix Neue Matrix Vector Result Vektor Ergebnis Matrix Result Matrix-Ergebnis New Data Object Neues Datenobjekt text text approximate ungefähr Edit Data Set (global) Datensatz bearbeiten (global) New Data Set Neuer Datensatz info info Property Eigenschaft No file name entered. Kein Dateiname eingegeben. No delimiter selected. Kein Begrenzungszeichen ausgewählt. Could not import from file %s Konnte nicht aus Datei importieren %s c-format No variable name entered. Es wurde kein Variablenname eingegeben. No known variable with entered name found. Keine bekannte Variable mit eingegebenem Namen gefunden. Could not export to file %s Konnte nicht in eine Datei exportieren %s c-format My Variables Meine Variablen Couldn't write definitions Definitionen konnten nicht geschrieben werden Preset Voreinstellung Abort Abbrechen Undo Rückgängig Redo Wiederholen Completion Mode Fertigstellungsmodus Limited strict completion Eingeschränkte strenge Fertigstellung Strict completion Strenge Fertigstellung Limited full completion Eingeschränkte vollständige Fertigstellung Full completion Vollständige Fertigstellung No completion Keine Fertigstellung Delayed completion Verzögertes Fertigstellung Customize completion… Fertigstellung anpassen... Save Mode Modus speichern Preset mode cannot be overwritten. Der voreingestellte Modus kann nicht überschrieben werden. Delete Mode Modus löschen Couldn't write preferences to %s Konnte Einstellungen nicht schreiben in %s c-format never nie ask fragen %i day %i Tag %i Tage c-format %i days Copied Result was copied Kopiert log10 function not found. log10 Funktion nicht gefunden. Search Suche _Search _Suche Remove Bookmark Lesezeichen entfernen Add Bookmark Lesezeichen hinzufügen A bookmark with the selected name already exists. Do you want to overwrite it? Es existiert bereits ein Lesezeichen mit dem gewählten Namen. Möchten Sie es überschreiben? No items found Keine Einträge gefunden Select date Datum auswählen Rectangular form Rechteckige Form Exponential form Exponentialform Polar form Polarform Angle/phasor notation Winkel/Phasenschreibweise Optimal unit Optimale Einheit Optimal prefix Optimales Präfix All functions Alle Funktionen All variables Alle Variablen Select definitions file Definitionsdatei auswählen _Import _Importieren Could not copy %s to %s. Konnte %s nicht nach %s kopieren. c-format Could not read %s. Konnte %s nicht lesen. c-format Could not copy file to %s. Konnte Datei nicht nach %s kopieren. c-format Unsupported base. Nicht unterstützte Basis. The selected Chinese year does not exist. Das ausgewählte chinesische Jahr existiert nicht. Conversion to Gregorian calendar failed. Die Konvertierung in den gregorianischen Kalender ist fehlgeschlagen. Calendar conversion failed for: %s. Kalenderkonvertierung fehlgeschlagen für: %s. c-format Gnuplot was not found. Gnuplot wurde nicht gefunden. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) muss separat installiert werden und im Such-pfad für ausführbare Dateien gefunden werden, damit das Plotten funktioniert. c-format Select file to save PNG image to Datei zum Speichern des PNG-Bildes auswählen Allowed File Types Erlaubte Dateitypen All Files Alle Dateien Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kann Einheit nicht löschen, da sie von anderen Einheiten benötigt wird. none keine result is too long Ergebnis ist zu lang translator-credits Alexander Krause <akay.devel@protonmail.com> leveltrauma <rhade_tm@t-online.de> Mode not found. Modus nicht gefunden. Elements (in horizontal order) Elemente (in horizontaler Reihenfolge) Select file to import Datei zum Importieren auswählen _Open _Öffnen Select file to export to Datei zum Exportieren wählen A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Es existiert ein kollidierendes Objekt mit demselben Namen. Wenn Sie fortfahren und die Änderungen speichern, wird das kollidierende Objekt überschrieben oder deaktiviert. Möchten Sie fortfahren? Set key combination Tastenkombination einstellen Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Drücken Sie die Tastenkombination, die Sie für die Aktion verwenden möchten (zum Abbrechen Escape drücken). No keys Keine Tasten Empty value. Leerer Wert. Function not found. Funktion nicht gefunden. Variable not found. Variable nicht gefunden. Unit not found. Einheit nicht gefunden. The key combination is already in use. Do you wish to replace the current action? Die Tastenkombination ist bereits in Gebrauch. Möchten Sie die aktuelle Aktion ersetzen? Select file to export Datei zum Exportieren auswählen Empty expression. Leerer Ausdruck. Empty x variable. Leere Variable x. Element Data Element Daten Classification Klassifizierung Alkali Metal Alkalimetall Alkaline-Earth Metal Erdalkalimetall Lanthanide Lanthanid Actinide Aktinid Transition Metal Übergangsmetall Metal Metall Metalloid Halbmetall Polyatomic Non-Metal Polyatomares Nicht-Metall Diatomic Non-Metal Diatomares Nichtmetall Noble Gas Edelgas Unknown chemical properties Unbekannte chemische Eigenschaften No unknowns in result. Keine Unbekannten im Ergebnis. Set Unknowns Unbekannte setzen Copy result to clipboard Ergebnis in die Zwischenablage kopieren ArgumentEditDialog Name: Name: Type: Typ: Free Frei Number Zahl Integer Ganzzahl Symbol Symbol Text Text Date Datum Vector Vektor Matrix Matrix Boolean Boolescher Wert Angle Winkel Object Objekt Function Funktion Unit Einheit Variable Variable File Datei Enable rules and type test Regeln und Typenprüfung aktivieren Custom condition: Benutzerdefinierte Bedingung: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Wenn das Argument z.B. eine Matrix ist, die die gleiche Anzahl von Zeilen und Spalten haben muss: Zeilen(\x) = Spalten(\x) Allow matrix Matrix zulassen Forbid zero Null verbieten Handle vector Vektor verarbeiten Calculate function for each separate element in vector. Funktion für jedes einzelne Element im Vektor berechnen. Min Min Include equals Schließe Gleichheiten ein Max Max CSVDialog Import CSV File CSV-Datei importieren Export CSV File CSV-Datei exportieren Current result Aktuelles Ergebnis Matrix/vector variable: Matrix-/Vektorvariable: File: Datei: Import as Importieren als matrix Matrix vectors Vektoren Name: Name: First row: Erste Zeile: Includes headings Enthält Überschriften Delimiter: Begrenzungszeichen: Comma Komma Tabulator Tabulator Semicolon Semikolon Space Leerzeichen Other Andere Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Error Error Could not import from file %1 Konnte nicht aus Datei importieren %1 No matrix or vector variable with the entered name was found. Keine Matrix- oder Vektorvariable mit eingegebenem Namen gefunden. Could not export to file %1 Konnte nicht in eine Datei exportieren %1 CalendarConversionDialog Calendar Conversion Kalenderumrechnung Gregorian Gregorianisch Hebrew Hebräisch Islamic (Hijri) Islamisch (Hijri) Persian (Solar Hijri) Persisch (Solar Hijri) Indian (National) Indisch (national) Chinese Chinesisch Julian Julianisch Revised Julian (Milanković) Neujulianisch (Milanković) Coptic Koptisch Ethiopian Äthiopisch Error Error The selected Chinese year does not exist. Das ausgewählte chinesische Jahr existiert nicht. Conversion to Gregorian calendar failed. Die Umrechnung in gregorianischen Kalender fehlgeschlagen. Calendar conversion failed for: %1. Kalenderumrechnung fehlgeschlagen für: %1. DataObjectEditDialog %1: %1: Default Standard Approximate Annähern Exact Genau Edit Data Object Datenobjekt bearbeiten New Data Object Neues Datenobjekt DataPropertyEditDialog Name: Name: Title: Titel: Descriptive name: Beschreibender Name: Description: Beschreibung: Value type: Wertetyp: Expression Rechenausdruck Number Zahl Text Text Unit expression: Einheitenausdruck: Use as key Als Schlüssel verwenden Case sensitive value Groß-/Kleinschreibung unterscheidender Wert Approximate value Näherungswert Value uses brackets Wert verwendet Klammern Hide Ausblenden Edit Data Property Dateneigenschaft bearbeiten DataSetEditDialog General Allgemein Properties Eigenschaften Function Funktion Title: Titel: Descriptive name: Beschreibender Name: Data file: Datendatei: Description: Beschreibung: Copyright: Urheberrecht: Title Titel Name Name Type Typ Add Hinzufügen Edit Bearbeiten Remove Entfernen Name: Name: Object argument name: Objektargumentname: Property argument name: Name des Eigenschaftsarguments: Default property: Standardeigenschaft: text Text approximate ungefähr number Zahl expression Rechenausdruck key Schlüssel Question Frage A function with the same name already exists. Do you want to overwrite the function? Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Data Sets Datensätze Object Objekt Property Eigenschaft Edit Data Set Datensatz bearbeiten New Data Set Neuer Datensatz DataSetsDialog Data Sets Datensätze Data sets: Datensätze: New… Neu… Edit… Bearbeiten… Delete Löschen Objects: Objekte: Data set description: Datensatzbeschreibung: Object attributes: Objektattribute: Properties Eigenschaften key Schlüssel Data Retrieval Function Funktion zum Abrufen von Daten argument argument ExpressionEdit matrix Matrix vector Vektor positive positiv non-positive nicht positiv negative negativ non-negative nicht negativ non-zero ungleich null boolean boolesch integer ganzzahlig rational rational real reell complex komplex number zahl (not matrix) (nicht Matrix) unknown unbekannt default assumptions standardmäßige Annahmen Scientific Notation Wissenschaftlichen Schreibweise Simple Notation Einfachen Schreibweise Prefix Präfix Prefix: Präfix: Complex angle/phasor notation Komplexe Winkel-/Phasenschreibweise Base units Basiseinheiten Number base Zahlenbasis Bijective base-26 Bijektive Basis-26 Binary number Binäre Zahlen Calendars Kalendarien Complex cis form Komplexe cis-Form Decimal number Dezimalzahl Duodecimal number Duodezimale Zahl Complex exponential form Komplexe Exponentialform Factors Faktoren 16-bit floating point binary format 16-Bit-Gleitkomma-Binärformat 32-bit floating point binary format 32-Bit-Gleitkomma-Binärformat 64-bit floating point binary format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) floating point binary format 80-Bit (x86) Fließkomma-Binärformat 128-bit floating point binary format 128-Bit Fließkomma-Binärformat Fraction Bruchteil Hexadecimal number Hexadezimalzahl Latitude Breitengrad Longitude Längengrad Mixed units Gemischte Einheiten Octal number Oktalzahl Optimal units Optimale Einheiten Expanded partial fractions Erweiterte Teilbrüche Complex polar form Komplexe Polarform Complex rectangular form Komplexe Rechteckform Roman numerals Römische Ziffern Sexagesimal number Sexagesimalzahl Time format Zeitformat Unicode Unicode Expression Status Analysierten Rechenausdruck Off Aus With delay Mit Verzögerung Without delay Ohne Verzögerung Use input method Eingabemethode verwenden UTC time zone UTC-Zeitzone Undo Rückgängig Complex Angle/Phasor Notation Komplexe Winkel-/Phasorschreibweise Number Base Zahlenbasis Binary-Coded Decimal BCD-Code Bijective Base-26 Bijektives Basis-26-System Binary Bumber Binäre Zahlen Complex Cis Form Komplexe cis-Form Binary Number Binärzahl Complex cis Form Komplexe cis-Form Decimal Number Dezimalzahl Duodecimal Number Duodezimalzahl Complex Exponential Form Komplexe Exponentialform 16-bit Floating Point Binary Format 16-Bit-Gleitkomma-Binärformat 32-bit Floating Point Binary Format 32-Bit-Gleitkomma-Binärformat 64-bit Floating Point Binary Format 64-Bit-Gleitkomma-Binärformat 80-bit (x86) Floating Point Binary Format 80-Bit-x86-Gleitkomma-Binärformat 128-bit Floating Point Binary Format 128-Bit-Gleitkomma-Binärformat Hexadecimal Number Hexadezimalzahl Mixed Units Gemischte Einheiten Octal Number Oktalzahl Optimal Units Optimale Einheiten Optimal Unit Optimale Einheit Optimal Prefix Optimales Präfix Expanded Partial Fractions Erweiterte Teilbrüche Complex Polar Form Komplexe Polarform Complex Rectangular Form Komplexe rechtwinklige Form Roman Numerals Römische Ziffern Sexagesimal Number Sexagesimalzahl Time Format Zeitformat UTC Time Zone UTC-Zeitzone Engineering Notation Technischen Schreibweise Custom Benutzerdefiniert Redo Wiederholen Cut Ausschneiden Copy Kopieren Paste Einfügen Delete Löschen Calculate Selection Auswahl berechnen Insert Date… Datum einfügen … Insert Matrix… Matrix einfügen … Select All Alles markieren Clear Löschen Clear History Verlauf löschen Completion Vervollständigung No completion Keine Vervollständigung Limited strict completion Eingeschränkte strenge Vervollständigung Strict completion Strenge Vervollständigung Limited full completion Eingeschränkte vollständige Vervollständigung Full completion Vollständige Vervollständigung Delayed completion Verzögerte Vervollständigung Enable input method Eingabemethode aktivieren Matrix Matrix Too many arguments for %1(). Zu viele Argumente für %1(). argument argument %1: %1: comment Kommentar MC (memory clear) MC (memory clear – Speicher löschen) MS (memory store) MS (memory store – speichern) M+ (memory plus) M+ (auf Speicher addieren) M− (memory minus) M- (von Speicher abziehen) factorize faktorisieren expand erweitern hexadecimal hexadezimal hexadecimal number Hexadezimalzahl octal oktal octal number Oktalzahl decimal dezimal decimal number Dezimalzahl duodecimal duodezimal duodecimal number Duodezimalzahl binary binär binary number Binärzahl roman römisch roman numerals römische Ziffern bijective bijektiv bijective base-26 bijektives Basis-26-System binary-coded decimal BCD-code sexagesimal sexagesimal sexagesimal number Sexagesimalzahl latitude Breitengrad longitude Längengrad 32-bit floating point 32-Bit-Gleitkomma 64-bit floating point 64-Bit-Gleitkomma 16-bit floating point 16-Bit-Gleitkomma 80-bit (x86) floating point 80-Bit-x86-Gleitkomma 128-bit floating point 128-Bit-Gleitkomma time Zeit time format Zeitformat scientific wissenschaftlich scientific notation wissenschaftlichen Schreibweise engineering technisch engineering notation technischen Schreibweise simple einfach simple notation einfachen Schreibweise bases Basen number bases Zahlenbasen calendars Kalendarien optimal optimal optimal unit optimale Einheit prefix präfix optimal prefix base basis base units Basiseinheiten mixed gemischt mixed units gemischte Einheiten decimals decimal fraction fraction Bruchteil factors Faktoren Decimal Fraction Dezimalbruch In history list In expression field In status bar With adaptive delay Mit adaptiver Verzögerung Automatically calculate selection base base units basis partial fraction Teilbruch expanded partial fractions erweiterte Teilbrüche rectangular rechtwinklig cartesian kartesisch complex rectangular form komplexe Rechteckform exponential exponentiell complex exponential form komplexe Exponentialform polar polar complex polar form komplexe Polarform complex cis form komplexe cis-Form angle Winkel complex angle notation komplexe Winkeldarstellung phasor Phasor complex phasor notation komplexe Phaorschreibweise base number base basis number base %1 Zahlenbasis %1 Data object Datenobjekt FPConversionDialog Floating Point Conversion (IEEE 754) Gleitkomma-Umrechnung (IEEE 754) Format Format 16-bit (half precision) 16 Bit (halbe Genauigkeit) 32-bit (single precision) 32 Bit (einfache Genauigkeit) 64-bit (double precision) 64 Bit (doppelte Genauigkeit) 80-bit (x86 extended format) 80 Bit (erweitertes x86-Format) 128-bit (quadruple precision) 128 Bit (vierfache Genauigkeit) Microchip 24-bit Microchip 32-bit Value Wert Decimal value Dezimalwert Binary representation Binärschreibweise Hexadecimal representation Hexadezimalschreibweise Floating point value Gleitkommawert Conversion error Umrechnungsfehler FunctionEditDialog Required Erforderlich Details Einzelheiten Description Beschreibung Name: Name: Expression: Rechenausdruck: Argument references: Argumentreferenzen: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y und z (z. B. "(x+y)/2"), oder \x, \y, \z, \a, \b, … (z. B. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Verwenden Sie x, y und z (z. B. „(x+y)/2“), oder \x, \y, \z, \a, \b, … (z. B. „(\x+\y)/2“) Category: Kategorie: Descriptive name: Beschreibender Name: Hide function Funktion ausblenden Example: Beispiel: Description: Beschreibung: Condition: Bedingung: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Bedingung, die für die Funktion wahr sein muss (z. B. wenn das zweite Argument größer sein muss als das erste: "\y > \x") Sub-functions: Unterfunktionen: Expression Rechenausdruck Precalculate Vorberechnen Reference Referenz Add Hinzufügen Edit Bearbeiten Remove Entfernen Arguments: Argumente: Name Name Type Typ Warning Warnung Conversion (using "to") is not supported in functions. Question Frage A function with the same name already exists. Do you want to overwrite the function? Eine Funktion mit demselben Namen existiert bereits. Möchten Sie die Funktion überschreiben? Edit Function Bearbeite Funktion New Function Neue Funktion FunctionsDialog Functions Funktionen Category Kategorie Function Funktion New… Neu… Edit… Bearbeiten… Deactivate Deaktivieren Delete Löschen Calculate… Berechnen… Apply Anwenden Insert Einfügen Favorite Favorit argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Ruft Daten aus dem %1-Datensatz für ein angegebenes Objekt und eine Eigenschaft ab. Wenn "info" als Eigenschaft eingegeben wird, wird ein Dialogfenster mit allen Eigenschaften des Objekts angezeigt. Example: Beispiel: Arguments Argumente optional optional argument optional default: argument default Standard: Requirement: Required condition for function Bedingung: Favorites Favoriten default: argument default standard: Requirement Bedingung Properties Eigenschaften %1: %1: key indicating that the property is a data set key Schlüssel Activate Aktivieren All All functions Alle Uncategorized Nicht kategorisierte User functions Benutzerfunktionen Inactive Inaktive HistoryView Insert Value Wert einfügen Insert Text Text einfügen Copy Kopieren Copy Formatted Text Formatierten Text kopieren Copy unformatted ASCII Unformatiertes ASCII kopieren Select All Alles markieren Search… Suchen … Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Geben Sie oben einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Geben Sie unten einen mathematischen Ausdruck ein, z. B. "5 + 2 / 3", und drücken Sie die Eingabetaste. Exchange rate source(s): updated %1 Comment Kommentar Protect Schützen Add Comment… Kommentar hinzufügen … Move to Top Nach oben verschieben Remove Entfernen Clear Löschen Edit Comment… Kommentar bearbeiten … Text: Text: Search Suche KeypadButton <i>Right-click/long press</i>: %1 <i>Rechtsklick/lang drücken</i>: %1 <i>Right-click</i>: %1 <i>Rechtsklick</i>: %1 <i>Long press</i>: %1 <i>Lang drücken</i>: %1 Open menu Menü öffnen <i>Middle-click</i>: %1 <i>Mittelklick</i>: %1 KeypadWidget Memory store Speicher speichern Memory clear Speicher löschen Memory recall Speicherabruf Memory add Speicher plus Memory subtract Speicher minus STO Standard calculator button. Do not use more than three characters. STO Store Intern speichern New function Neue Funktion sin sin cos cos tan tan Exponentiation Percent or remainder Prozent oder Rest Uncertainty/interval Unsicherheit/Intervall Relative error Relativer Fehler Interval Intervall Move cursor left Cursor nach links bewegen Move cursor to start Cursor zum Anfang Move cursor right Cursor nach rechts bewegen Move cursor to end Cursor zum Ende bewegen Logical AND Logisches Und Logical OR Logisches Oder Bitwise Exclusive OR Bitweises Exklusiv-Oder Logical NOT logisches Nicht Bitwise Left Shift Bitweise Linksverschiebung Bitwise Right Shift Bitweise Rechtsverschiebung cmp rot a→1 Expand partial fractions Expandieren von Teilbrüchen DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants Einheiten in physikalischen Konstanten einschalten All constants Alles Konstanten Percentage Calculation Tool Prozentrechnungswerkzeug more mehr All units Alle Einheiten All variables Alle Variablen Action Aktion Interval Display Intervall-Anzeige Adaptive Adaptiv Significant digits Signifikante Ziffern Plus/minus Plus/minus Relative Relativ Concise Interval Calculation Intervall-Berechnung Variance formula Varianzformel Interval arithmetic Intervallarithmetik Allow concise uncertainty input Complex number form Komplexe Zahlenform Rectangular Algebraischen Form Exponential Exponentialform Polar Polarform Angle/phasor Winkel/Phasorschreibweise Type Assumptions type Typ Sign Assumptions sign Vorzeichen Default assumptions Standardannahmen Number Zahl Real Real Rational Rational Integer Ganzzahl Boolean Boolescher Wert Unknown Unknown assumptions sign Unbekannt Non-zero Ungleich null Positive Positiv Non-negative Nicht negativ Negative Negativ Non-positive Nicht positiv Factorize Faktorisieren Expand Erweitern Add column Add row Remove column Remove row Left parenthesis Linke Klammer Left vector bracket Linke Vektor-Klammer Right parenthesis Rechte Klammer Right vector bracket Rechte Vektor-Klammer Smart parentheses Intelligente Klammern Vector brackets Vektorielle Klammern Argument separator Argumenttrennzeichen Blank space Leerzeichen New line Neue Zeile Decimal point Dezimaltrennzeichen Previous result (static) Voriges Ergebnis (statisch) Multiplication Button Action Aktion für Schaltfläche Label: Beschriftung: Action: Aktion: None Keine Value: Wert: Bitwise AND Bitweises Und Bitwise Shift Bitweise Verschiebung Delete Löschen Backspace Backspace Addition Plus Plus Subtraction Subtraktion Minus Minus Division Bitwise OR Bitweises Oder Bitwise NOT Bitweises Nicht Clear expression Rechenausdruck löschen Calculate expression Rechenausdruck berechnen NamesEditDialog Name Name Abbreviation Abkürzung Plural Plural Reference Referenz Avoid input Eingabe vermeiden Unicode Unicode Suffix Nachsilbe Case sensitive Groß-/Kleinschreibung beachten Completion only Nur Vervollständigung Add Hinzufügen Edit Bearbeiten Remove Entfernen Warning Warnung Illegal name Unzulässiger Name A function with the same name already exists. Eine Funktion mit demselben Namen existiert bereits. A unit or variable with the same name already exists. Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. PercentageCalculationDialog Percentage Prozentsatz Value 1 Wert 1 Value 2 Wert 2 Change from 1 to 2 Änderung von 1 auf 2 Change from 2 to 1 Änderung von 2 auf 1 2 compared to 1 2 im Vergleich zu 1 1 compared to 2 1 im Vergleich zu 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Geben Sie zwei Werte ein, von denen höchstens einer ein Prozentwert ist, und die anderen werden für Sie berechnet. Clear Löschen PeriodicTableDialog Periodic Table Periodensystem Element Data Element Daten Alkali Metal Alkalimetall Alkaline-Earth Metal Erdalkalimetall Lanthanide Lanthanid Actinide Aktinid Transition Metal Übergangsmetall Metal Metall Metalloid Halbmetall Polyatomic Non-Metal Polyatomares Nichtmetall Diatomic Non-Metal Diatomares Nichtmetall Noble Gas Edelgas Unknown chemical properties Unbekannte chemische Eigenschaften Unknown Unbekannt %1: %1: PlotDialog Plot Plotten Data Daten Title: Titel: Expression: Rechenausdruck: Function Funktion Vector/matrix Vektor/Matrix Paired matrix Gepaarte Matrix Rows Zeilen X variable: X Variable: Style: Stil: Line Zeile Points Punkte Line with points Linie mit Punkten Boxes/bars Boxen/Balken Histogram Histogramm Steps Stufen Candlesticks Kerzenständer Dots Kleine Punkte Polar Polarform Smoothing: Glättung: None Keine Monotonic Monoton Natural cubic splines Natürliche kubische Splines Bezier Bézier Bezier (monotonic) Bézier (monoton) Y-axis: Y-Achse: Primary Primär Secondary Sekundär Add Hinzufügen Apply Anwenden Remove Entfernen Category Kategorie Title Titel Expression Rechenausdruck Function Range Funktionsbereich Minimum x value: Minimaler x-Wert: Maximum x value: Maximaler x-Wert: Sampling rate: Abtastrate: Step size: Schrittweite: Show real and imaginary parts Appearance Erscheinungsbild Display grid Raster anzeigen Display full border Vollen Rand anzeigen Minimum y value: Minimaler y-Wert: Maximum y value: Maximaler y-Wert: Logarithmic x scale: Logarithmische x-Skala: Logarithmic y scale: Logarithmische y-Skala: Calculating… Berechne … Cancel Abbruch Processing… Verarbeite … Minimum y value Minimaler y-Wert Maximum y value Maximaler y-Wert Logarithmic x scale Logarithmische x-Skala Logarithmic y scale Logarithmische y-Skala X-axis label: X-Achsen-Beschriftung: Y-axis label: Y-Achsen-Beschriftung: Line width: Linienbreite: Legend placement: Platzierung der Legende: Top-left Oben links Top-right Oben rechts Bottom-left Unten links Bottom-right Unten rechts Below Unterhalb Outside Außerhalb Error Error It took too long to generate the plot data. Es hat zu lange gedauert, die Plotdaten zu generieren. PreferencesDialog Look && Feel Aussehen && Bedienung Numbers && Operators Zahlen && Operatoren Units && Currencies Einheiten && Währungen Parsing && Calculation Analysierung && Berechnung Ignore system language (requires restart) Systemsprache ignorieren (erfordert Neustart) Allow multiple instances Mehrere Instanzen zulassen Clear history on exit Verlauf beim Beenden löschen Close application with Escape key Keep above other windows Fenster immer im Vordergrund halten Window title: Fenstertitel: Application name Name der Anwendung Result Ergebnis Application name + result Anwendungsname + Ergebnis Workspace Arbeitsbereich Application name + workspace Anwendungsname + Arbeitsbereich Style: Stil: Default (requires restart) Default style Standard (erfordert Neustart) Dark mode Dunkelmodus Colorize result Ergebnis einfärben Custom result font Benutzerdefinierte Ergebnisschriftart Custom expression font Benutzerdefinierte Ausdrucksschriftart Custom keypad font Benutzerdefinierte Tastenfeldschriftart Custom application font Benutzerdefinierte Anwendungsschriftart Custom result font: Benutzerdefinierte Ergebnisschriftart: Custom expression font: Benutzerdefinierte Rechenausdrucksschriftart: Custom status bar font: Benutzerdefinierte Schriftart für die Statusleiste: Custom keypad font: Benutzerdefinierte Tastenfeld-Schriftart: Custom application font: Benutzerdefinierte Anwendungsschriftart: Display expression status Analysierten Rechenausdruck anzeigen Delay: Verzögerung: Expression after calculation: Rechenausdruck nach Berechnung: Keep expression Rechenausdruck behalten Clear expression Rechenausdruck löschen Replace with result Durch Ergebnisse ersetzen Replace with result if shorter Durch Ergebnis ersetzen, falls kürzer Use keyboard keys for RPN Tasten auf der Tastatur für UPN verwenden Parsing mode: Analysemodus: Adaptive Adaptiv Conventional Konventionell Implicit multiplication first Implizite Multiplikation zuerst Chain Verkettete RPN UPN Read precision Genauigkeit lesen Limit implicit multiplication Implizite Multiplikation begrenzen Interval calculation: Intervallberechnung: Variance formula Varianzformel Interval arithmetic Intervallarithmetik Factorize result Ergebnis faktorisieren Binary two's complement representation Binäre Zweierkomplement-Darstellung Hexadecimal two's complement representation Hexadezimale Zweierkomplement-Darstellung Use lower case letters in non-decimal numbers Kleinbuchstaben in Zahlen mit nicht-dezimaler Basis verwenden Spell out logical operators Logische Operatoren ausbuchstabieren Use E-notation instead of 10^x E-Notation anstelle von 10^x verwenden Preferences Einstellungen ms milliseconds ms Use E-notation instead of 10^n E-Notation anstelle von 10^n verwenden Use 'j' as imaginary unit 'j' als imaginäre Einheit verwenden Use comma as decimal separator Komma als Dezimaltrennzeichen verwenden Ignore comma in numbers Komma in Zahlen ignorieren Ignore dots in numbers Punkte in Zahlen ignorieren Copy unformatted ASCII by default Standardmäßig als unformatiertes ASCII kopieren Round halfway numbers away from zero Halbe Zahlen von null weg runden Round halfway numbers to even Halbe Zahlen auf gerade Zahlen runden Indicate repeating decimals Wiederholte Dezimalstellen anzeigen Language: Sprache: Max history lines saved: Use caret for bitwise XOR Zirkumflex für bitweises Exklusiv-Oder verwenden Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Ergebnis formatieren Custom history font: Benutzerdefinierte Schriftart für Verlauf: Expression status: Analysierten Rechenausdruck: Place expression field below history Off Aus In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Rechenausdruck in Verlauf: Parsed Analysiert Parsed (compact) Entered Wie eingegeben Entered + parsed Wie eingegeben & analysiert Entered + parsed (compact) Automatically copy result Ergebnis automatisch kopieren Simplified percentage calculation Vereinfachte Prozentrechnung Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binär Hexadecimal Hexadezimal Binary bits: Automatic Automatisch Use special duodecimal symbols Use Unicode division slash in output Place percent button in number pad Indicate repeating decimals: Wiederholte Dezimalstellen anzeigen: Ellipsis Overline Digit grouping: Zifferngruppierung: None Keine Standard Standard Local Lokal Custom Benutzerdefiniert Interval display: Intervallanzeige: Significant digits Signifikante Ziffern Interval Intervall Plus/minus Plus/minus Concise Midpoint Mittelwert Lower Untere Upper Obere Rounding: Truncate all numbers Alle Zahlen abschneiden Complex number form: Komplexe form: Rectangular Algebraischen Form Exponential Exponentialform Polar Polarform Angle/phasor Winkel/Phasorschreibweise Enable units Abbreviate names Namen abkürzen Use binary prefixes for information units Binäre Präfixe für Informationseinheiten verwenden Automatic unit conversion: Automatische Einheitenumrechnung: No conversion Keine Umrechning Base units Basiseinheiten Optimal units Optimale Einheiten Optimal SI units Optimale SI-Einheiten Convert to mixed units In gemischte Einheiten umrechnen Automatic unit prefixes: Automatische Einheitenpräfixe: Copy unformatted ASCII without units Unformatiertes ASCII ohne Einheiten kopieren Default currency: Standardwährung: Fonts Schriftarten Units Einheiten Calculation Berechnung Restart required Please restart the program for the language change to take effect. Default Standard Notify when a new version is available Benachrichtigen, wenn eine neue Version verfügbar ist Calculate as you type delay: Multiplication sign: Multiplikationszeichen: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Keine Präfixe Prefixes for some units Präfixe für einige Einheiten Prefixes also for currencies Präfixe auch für Währungen Prefixes for all units Präfixe für alle Einheiten Enable all SI-prefixes Alle SI-Präfixe aktivieren Enable denominator prefixes Nennerpräfixe aktivieren Enable units in physical constants Einheiten in physikalischen Konstanten einschalten Temperature calculation: Temperaturberechnung: Absolute Absolut Relative Relativ Hybrid Hybrid Exchange rates updates: Wechselkurse aktualisieren: %n day(s) %n Tag %n Tage days Tag Tage QApplication Execute expressions and commands from a file Ausdrücke und Befehle aus einer Datei ausführen FILE DATEI Start a new instance of the application Eine neue Instanz der Applikation starten Specify the window title Festlegen des Fenstertitels TITLE TITEL Update exchange rates Wechselkurse aktualisieren Display the application version Anzeigen der Applikationsversion Open workspace Expression to calculate Zu berechnender Rechenausdruck [EXPRESSION] [RECHENAUSDRUCK] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Standardmäßig ist nur eine Instanz (ein Hauptfenster) von %1 erlaubt. Wenn mehrere Instanzen gleichzeitig geöffnet werden, werden nur die Definitionen (Variablen, Funktionen usw.), der Modus, die Einstellungen und der Verlauf des zuletzt geschlossenen Fensters gespeichert. Möchten Sie trotzdem die Standardvorgabe ändern und mehrere gleichzeitige Instanzen zulassen? Allow multiple instances? %1 is already running. Failed to load global definitions! Das Laden der globalen Definitionen ist fehlgeschlagen! answer antwort History Answer Value Verlauf Antwortwert History Index(es) Verlaufsindex(e) History index %s does not exist. Verlaufsindex %s existiert nicht. Last Answer Letzte Antwort Answer 2 Antwort 2 Answer 3 Antwort 3 Answer 4 Antwort 4 Answer 5 Antwort 5 Memory Speicher Error Error Couldn't write preferences to %1 Konnte Einstellungen nicht schreiben in %1 Function not found. Funktion nicht gefunden. Variable not found. Variable nicht gefunden. Unit not found. Einheit nicht gefunden. Unsupported base. Nicht unterstützte Basis. Unsupported value. Nicht unterstützte Wert. QalculateQtSettings Update exchange rates? Wechselkurse aktualisieren? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Es ist %n Tag seit der letzten Aktualisierung der Wechselkurse vergangen. Möchten Sie die Wechselkurse jetzt aktualisieren? Es sind %n Tage seit der letzten Aktualisierung der Wechselkurse vergangen. Möchten Sie die Wechselkurse jetzt aktualisieren? Fetching exchange rates. Abrufen von Wechselkursen. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Abrufen von Wechselkursen… Error Error Warning Warnung Information Information Path of executable not found. Pfad der ausführbaren Datei nicht gefunden. curl not found. curl nicht gefunden. Failed to run update script. %1 Updateskript konnte nicht ausgeführt werden. %1 Failed to check for updates. Prüfung auf Updates fehlgeschlagen. No updates found. Keine Updates gefunden. A new version of %1 is available at %2. Do you wish to update to version %3? Eine neue Version von %1 ist verfügbar unter %2. Möchten Sie auf die Version %3 aktualisieren? A new version of %1 is available. You can get version %3 at %2. Eine neue Version von %1 ist verfügbar. Sie können die Version %3 unter %2 erhalten. Download %1: %2 Insert function Funktion einfügen Insert function (dialog) Funktion einfügen (Dialog) Insert variable Variable einfügen Approximate result Negate Negieren Invert Invertieren Insert unit Einheit einfügen Insert text Text einfügen Insert operator Insert date Datum einfügen Insert matrix Matrix einfügen Insert smart parentheses Intelligente Klammern einfügen Convert to unit In Einheit umrechnen Convert Umrechnen Convert to optimal unit In optimale Einheit umrechnen Convert to base units In Basiseinheiten umrechnen Convert to optimal prefix In optimales Präfix umrechnen Convert to number base In Zahlenbasis umrechnen Factorize result Ergebnis faktorisieren Expand result Expandieren des Ergebnisses Expand partial fractions Expandieren von Teilbrüchen RPN: down UPN: abwärts RPN: up UPN: aufwärts RPN: swap UPN: tauschen RPN: copy UPN: kopieren RPN: lastx UPN: lastx RPN: delete register UPN: Register löschen RPN: clear stack UPN: Stapel löschen Set expression base Rechenausdrucksbasis einstellen Set result base Ergebnisbasis einstellen Set angle unit to degrees Winkeleinheit auf Grad stellen Set angle unit to radians Winkeleinheit auf Bogenmaß stellen Set angle unit to gradians Winkeleinheit auf Gradienten stellen Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Genauigkeit umschalten Toggle max decimals Max Dezimalen umschalten Toggle min decimals Min Dezimalen umschalten Toggle max/min decimals Min/max Dezimalen umschalten Toggle RPN mode UPN-Modus umschalten Show general keypad Toggle programming keypad Programmiertastenfeld ein- und ausschalten Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Verlauf durchsuchen Clear history Verlauf löschen Show variables Show functions Show units Show data sets Store result Ergebnis intern speichern MC (memory clear) MC (Speicher löschen) MR (memory recall) MR (Speicherabruf) MS (memory store) MS (Speicher speichern) M+ (memory plus) M+ (Speicher plus) M− (memory minus) M- (Speicher minus) New variable Neue Variable New function Neue Funktion Open plot functions/data Funktionen-/Datenplotten öffnen Open convert number bases Zahlenbasenumrechnung öffnen Open floating point conversion Gleitkomma-Umrechnung öffnen Open calender conversion Kalenderumrechnung öffnen Open percentage calculation tool Prozentrechnungswerkzeug öffnen Open periodic table Periodensystem öffnen Update exchange rates Wechselkurse aktualisieren Copy result Ergebnis kopieren Insert result Text einfügen Open mode menu Open menu Menü öffnen Help Hilfe Quit Beenden Toggle chain mode Auf Methodenverkettung umschalten Toggle keep above Immer-im-Vordergrund umschalten Show completion (activate first item) Vervollständigung einblenden (erstes Element aktivieren) Clear expression Rechenausdruck löschen Delete Löschen Backspace Rücktaste Home End Right Left Up Hoch Down Runter Undo Rückgängig Redo Wiederholen Calculate expression Rechenausdruck berechnen Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Standard Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Abbruch Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menü Menu (%1) Menü (%1) New Neu Function… Funktion… Variable/Constant… Variable/Konstante… Unknown Variable… Unbekannte Variable… Matrix… Matrix… Workspaces Arbeitsbereichen Open… Öffnen… Open default Standard öffnen Save Speichern Save As… Speichern als… Import CSV File… CSV-Datei importieren … Export CSV File… CSV-Datei exportieren … Functions Funktionen Variables and Constants Variablen und Konstanten Units Einheiten Plot Functions/Data Funktionen/Daten plotten Floating Point Conversion (IEEE 754) Gleitkomma-Umrechnung (IEEE 754) Calendar Conversion Kalenderumrechnung Update Exchange Rates Wechselkurse aktualisieren Normal Mode Normal Modus RPN Mode UPN-Modus Chain Mode Methodenverkettung Keyboard Shortcuts Tastaturkürzel Preferences Einstellungen Help Hilfe Report a Bug Fehler melden Check for Updates Nach Updates suchen About %1 Über %1 Quit Beenden Mode Modus Mode (%1) Modus (%1) General Display Mode Allgemeiner Anzeigemodus Normal Normal Scientific Wissenschaftlich Engineering Technisch Simple Einfach Angle Unit Winkeleinheit Radians Bogenmaß Degrees Grad Gradians Neugrad Approximation Annäherung Automatic Automatic approximation Automatisch Dual Dual approximation Zweifach Exact Exact approximation Genau Approximate Annähern Assumptions Annahmen Type Assumptions type Typ Number Zahl Real Real Rational Rational Integer Ganzzahl Boolean Boolescher Wert Sign Assumptions sign Vorzeichen Unknown Unknown assumptions sign Unbekannt Non-zero Ungleich null Positive Positiv Non-negative Nicht negativ Negative Negativ Non-positive Nicht positiv Result Base Ergebnisbasi Binary Binär Octal Oktal Decimal Dezimal Hexadecimal Hexadezimal Other Andere Approximation and Fractions Annäherung und Brüche Duodecimal Duodezimal Sexagesimal Sexagesimal Time format Zeitformat Roman numerals Römische Ziffern Unicode Unicode Bijective base-26 Bijektive Basis-26 Binary-coded decimal (BCD) BCD-Code Custom: Number base Benutzerdefiniert: Expression Base Rechenausdrucksbasis Other: Number base Andere: Precision: Genauigkeit: Min decimals: Min Dezimalen: Max decimals: Max Dezimalen: off Max decimals aus Convert Umrechnen Convert (%1) Umrechnen (%1) Store Intern speichern Store (%1) Sichern (%1) Functions (%1) Funktionen (%1) Keypad Tastenfeld Keypad (%1) Tastatur (%1) Number bases Zahlenbasen Unit… Einheit… Data Sets Datensätze Percentage Calculation Tool Prozentrechnungswerkzeug Periodic Table Periodensystem Units (%1) Einheiten (%1) Plot Functions/Data (%1) Funktionen/Daten plotten (%1) Number Bases (%1) Zahlenbasen (%1) Binary: Binär: Octal: Oktal: Decimal: Dezimal: Hexadecimal: Hexadezimal: RPN Stack UPN-Stapel Rotate the stack or move the selected register up (%1) Drehen des Stapels oder Verschieben des ausgewählten Register nach oben (%1) Rotate the stack or move the selected register down (%1) Drehen des Stapels oder Verschieben des ausgewählten Register nach unten (%1) Swap the top two values or move the selected value to the top of the stack (%1) Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels (%1) Copy the selected or top value to the top of the stack (%1) Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels (%1) Enter the top value from before the last numeric operation (%1) Eingabe des obersten Wertes von vor der letzten numerischen Operation (%1) Delete the top or selected value (%1) Löschen des oberen oder ausgewählten Wertes (%1) Clear the RPN stack (%1) Löschen des RPN-Stack (%1) New Function… Neue Funktion… Favorites Favoriten Recent Aktuelle User functions Benutzerfunktionen Open dialog Dialogfeld öffnen Show all functions Alle Funktionen anzeigen User units Benutzereinheiten more mehr Prefixes Präfixe Show all units Alle Einheiten anzeigen User variables Benutzervariablen Show all variables Alle Variabeln anzeigen Powerful and easy to use calculator Leistungsstarker und einfach zu bedienender Taschenrechner License: GNU General Public License version 2 or later Error Error Couldn't write definitions Definitionen konnten nicht geschrieben werden hexadecimal hexadezimal octal oktal decimal dezimal duodecimal duodezimal binary binär roman römisch bijective bijektiv sexagesimal sexagesimal latitude Breitengrad longitude Längengrad time Zeit Time zone parsing failed. Zeitzonenanalyse fehlgeschlagen. bases basen calendars Kalendarien rectangular rechtwinklig cartesian kartesisch exponential exponential polar polar phasor Phasor angle Winkel optimal optimal base basis mixed gemischt fraction Bruchteil factors Faktoren Show toolbar Open Settings Folder(s) Number Pad Ziffernblock Always Show Number Pad Immer Ziffernblock anzeigen EXACT EXAKT APPROX CIRCA CHN CHN BIN BIN OCT OKT DUO DUO HEX HEX ROMAN RÖMISCH DEG DEG RAD RAD GRA GRA PREC PREZ FUNC FUNK UNIT EINHEIT VAR VAR INF INF CPLX KPLX Copy Kopieren <i>Middle-click</i>: %1 <i>Mittelklick</i>: %1 scientific wissenschaftlich engineering technisch simple einfach prefix präfix base base units basis partial fraction Teilbruch base number base basis decimals factorize faktorisieren expand erweitern Calculating… Berechne … Cancel Abbruch RPN Operation UPN-Operation Factorizing… Faktorisiere … Expanding partial fractions… Expandiere Teilbrüchen … Expanding… Expandiere … Converting… Rechne um … RPN Register Moved UPN-Register verschoben Processing… Verarbeite … Matrix Matrix Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode Temperaturberechnungsmodus The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Der Rechenausdruck ist mehrdeutig. Bitte wählen Sie den Temperaturberechnungsmodus (der Modus kann später in den Einstellungen geändert werden). Absolute Absolut Relative Relativ Hybrid Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation von Punkten Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Bitte wählen Sie die Interpretation der Punkte (".") (dies kann später in den Einstellungen geändert werden). Both dot and comma as decimal separators Sowohl Punkt als auch Komma als Dezimaltrennzeichen Dot as thousands separator Punkt als Tausendertrennzeichen Comma as thousands separator Only dot as decimal separator Nur Punkt als Dezimaltrennzeichen Parsing Mode Analysemodus The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Der Rechenausdruck ist mehrdeutig. Bitte wählen Sie die Interpretation von Ausdrücken mit implizite Multiplikation (dies kann später in den Einstellungen geändert werden). Implicit multiplication first Implizite Multiplikation zuerst Conventional Konventionell Adaptive Adaptiv Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Aktion hinzufügen (%1) Edit Keyboard Shortcut New Keyboard Shortcut Neues Tastaturkürzel Action: Aktion: Value: Wert: Set key combination Tastenkombination einstellen Press the key combination you wish to use for the action. Drücken Sie die Tastenkombination, die Sie für die Aktion verwenden möchten. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? Die Tastenkombination ist bereits in Gebrauch. Möchten Sie die aktuelle Aktion (%1) ersetzen? Question Frage Add… Hinzufügen… Edit… Bearbeiten… Remove Entfernen Gnuplot was not found Gnuplot wurde nicht gefunden %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) muss separat installiert werden und im Suchpfad für ausführbare Dateien gefunden werden, damit das Plotten funktioniert. Example: Example of function usage Beispiel: Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Nicht erneut fragen Example: Beispiel: Enter RPN Enter Eingeben Calculate Berechnen Apply to Stack Auf Stapel anwenden Insert Einfügen Keep open Offen halten Value Wert Argument Argument %1: %1: Approximation && Fractions Annäherung && Brüche Plot Plotten General Allgemein Programming Programmier Algebra Custom Benutzerdefiniert None Keine Show Custom Column Benutzerdefinierte Spalte anzeigen Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Rechtsklick/lang drücken</i>: %1 Open menu Menü öffnen Number Bases Zahlenbasen Conversion operator Umrechnungsoperator Rotate the stack or move the selected register up Drehen des Stapels oder Verschieben des ausgewählten Register nach oben Rotate the stack or move the selected register down Drehen des Stapels oder Verschieben des ausgewählten Register nach unten Swap the top two values or move the selected value to the top of the stack Vertauschen Sie die beiden oberen Werte oder verschieben Sie den ausgewählten Wert an die Spitze des Stapels Delete the top or selected value Löschen des oberen oder ausgewählten Wertes Enter the top value from before the last numeric operation Eingabe des obersten Wertes von vor der letzten numerischen Operation Copy the selected or top value to the top of the stack Kopieren des ausgewählten oder obersten Wertes an die Spitze des Stapels Clear the RPN stack Löschen des UPN-Stapels Comma as separator for function arguments and matrix/vector elements Action Aktion Key combination Tastenkombination True Wahr False Falsch Info Info optional optional argument optional optional optional parameter optional Failed to open %1. %2 Konnte %1. nicht öffnen %2 UnitEditDialog General Allgemein Relation Relation Name: Name: Category: Kategorie: Descriptive name: Beschreibender Name: System: System: Imperial Imperial US Survey US-Umfrage Hide unit Einheit ausblenden Description: Beschreibung: Class: Klasse: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Die Klasse, zu der diese Einheit gehört. Benannte abgeleitete Einheiten werden in Bezug auf eine einzelne andere Einheit definiert, mit einem optionalen Exponenten, während (unbenannte) abgeleitete Einheiten durch einen Einheitenausdruck mit einer oder mehreren Einheiten definiert werden. Base unit Basiseinheit Named derived unit Benannte abgeleitete Einheit Derived unit Abgeleitete Einheit Base unit(s): Basiseinheit(en): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Einheit (für benannte abgeleitete Einheit) oder Einheitenausdruck (für unbenannte abgeleitete Einheit), in Bezug worauf diese Einheit definiert ist Exponent: Exponent: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation zur Basiseinheit. Für lineare Beziehungen sollte dies einfach eine Zahl sein.<br><br>Für nichtlineare Beziehungen verwenden Sie \x für den Faktor und \y für den Exponenten (z.B. "\x + 273,15" für die Beziehung zwischen Grad Celsius und Kelvin). Inverse relation: Inverse Relation: Specify for non-linear relation, for conversion back to the base unit. Bei nichtlinearer Relation angeben, zur Umrechnung zurück in die Basiseinheit. Mix with base unit Mit Basiseinheit mischen Priority: Vorrangig: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Minimale Zahl der Basiseinheit: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Standardmäßig mit Präfixen verwenden Error Error Base unit does not exist. Basiseinheit ist nicht vorhanden. Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? A variable or unit with the same name already exists. Do you want to overwrite it? Eine Variable oder Einheit mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Unit Einheit bearbeiten New Unit Neue Einheit UnitsDialog Units Einheiten Category Kategorie Unit Einheit New… Neu… Edit… Bearbeiten… Deactivate Deaktivieren Delete Löschen Convert Umrechnen Insert Einfügen Favorite Favorit Show hidden units Ausgeblendete Einheiten anzeigen Activate Aktivieren All All units Alle Uncategorized Nicht kategorisiert User units Benutzereinheiten Favorites Favoriten Inactive Inaktiv UnknownEditDialog Name: Name: Custom assumptions Benutzerdefinierte Annahmen Type: Typ: Sign: Vorzeichen: Temporary Temporär Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Unknown Variable Unbekannte Variable bearbeiten New Unknown Variable Neue Unbekannte Variable VariableEditDialog Name: Name: Temporary Temporär Value: Wert: Required Erforderlich Description Beschreibung current result Aktuelles Ergebnis Category: Kategorie: Descriptive name: Beschreibender Name: Hide variable Variable ausblenden Description: Beschreibung: Question Frage A unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? An unit or variable with the same name already exists. Do you want to overwrite it? Eine Einheit oder Variable mit demselben Namen ist bereits vorhanden. Möchten Sie sie überschreiben? Edit Variable Variable bearbeiten New Variable Neue Variable VariablesDialog Variables Variablen Category Kategorie Variable Variable New Neu Variable/Constant… Variable/Konstante… Unknown Variable… Unbekannte Variable… Matrix… Matrix… Edit… Bearbeiten… Export… Exportieren… Deactivate Deaktivieren Delete Löschen Insert Einfügen Favorite Favorit a matrix eine Matrix a vector ein Vektor positive positiv non-positive nicht positiv negative negativ non-negative nicht negativ non-zero ungleich null integer ganzzahlig boolean boolesch rational rational real reell complex komplex number zahl not matrix nicht Matrix unknown unbekannt Default assumptions Standardannahmen Activate Aktivieren All All variables Alle Uncategorized Nicht kategorisiert User variables Benutzervariablen Favorites Favoriten Inactive Inaktiv qalculate-qt-5.11.0/translations/qalculate-qt_en.ts000066400000000000000000010256601520501070600223510ustar00rootroot00000000000000 ArgumentEditDialog Name: Type: Free Number Integer Symbol Text Date Vector Matrix Boolean Angle Object Function Unit Variable File Enable rules and type test Custom condition: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Allow matrix Forbid zero Handle vector Calculate function for each separate element in vector. Min Include equals Max CSVDialog Import CSV File Export CSV File Current result Matrix/vector variable: File: Import as matrix vectors Name: First row: Includes headings Delimiter: Comma Tabulator Semicolon Space Other Question A unit or variable with the same name already exists. Do you want to overwrite it? Error Could not import from file %1 No matrix or vector variable with the entered name was found. Could not export to file %1 CalendarConversionDialog Calendar Conversion Gregorian Hebrew Islamic (Hijri) Persian (Solar Hijri) Indian (National) Chinese Julian Revised Julian (Milanković) Coptic Ethiopian Error The selected Chinese year does not exist. Conversion to Gregorian calendar failed. Calendar conversion failed for: %1. DataObjectEditDialog %1: Default Approximate Exact Edit Data Object New Data Object DataPropertyEditDialog Name: Descriptive name: Description: Value type: Expression Number Text Unit expression: Use as key Case sensitive value Approximate value Value uses brackets Hide Edit Data Property DataSetEditDialog General Properties Function Descriptive name: Data file: Description: Copyright: Title Name Type Add Edit Remove Name: Object argument name: Property argument name: Default property: text approximate number expression key Question A function with the same name already exists. Do you want to overwrite the function? Data Sets Object Property Edit Data Set New Data Set DataSetsDialog Data Sets Data sets: New… Edit… Delete Objects: Data set description: Object attributes: Properties key Data Retrieval Function argument ExpressionEdit matrix vector positive non-positive negative non-negative non-zero boolean integer rational real complex number (not matrix) unknown default assumptions Prefix: Complex Angle/Phasor Notation Base units Number Base Binary-Coded Decimal Bijective Base-26 Binary Number Calendars Complex cis Form Decimal Number Duodecimal Number Complex Exponential Form Factors 16-bit Floating Point Binary Format 32-bit Floating Point Binary Format 64-bit Floating Point Binary Format 80-bit (x86) Floating Point Binary Format 128-bit Floating Point Binary Format Fraction Decimal Fraction Hexadecimal Number Latitude Longitude Mixed Units Octal Number Optimal Unit Optimal Prefix Expanded Partial Fractions Complex Polar Form Complex Rectangular Form Roman Numerals Sexagesimal Number Time Format Unicode UTC Time Zone Scientific Notation Engineering Notation Undo Redo Cut Copy Paste Delete Calculate Selection Insert Date… Insert Matrix… Select All Clear Clear History Completion No completion Limited strict completion Strict completion Limited full completion Full completion Delayed completion Expression Status Off In history list In expression field In status bar With delay With adaptive delay Without delay Automatically calculate selection Use input method Matrix Too many arguments for %1(). argument %1: comment MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize expand hexadecimal hexadecimal number octal octal number decimal decimal number duodecimal duodecimal number binary binary number roman roman numerals bijective bijective base-26 binary-coded decimal sexagesimal sexagesimal number latitude longitude 32-bit floating point 64-bit floating point 16-bit floating point 80-bit (x86) floating point 128-bit floating point time time format scientific scientific notation engineering engineering notation simple simple notation bases number bases calendars optimal optimal unit prefix optimal prefix base base units base units mixed mixed units factors partial fraction expanded partial fractions rectangular cartesian complex rectangular form exponential complex exponential form polar complex polar form complex cis form angle complex angle notation phasor complex phasor notation UTC time zone base number base number base %1 decimals decimal fraction fraction Data object Simple Notation Custom FPConversionDialog Floating Point Conversion (IEEE 754) Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Binary representation Hexadecimal representation Floating point value Conversion error FunctionEditDialog Required Details Description Name: Expression: Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Category: Descriptive name: Hide function Example: Description: Condition: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Sub-functions: Expression Precalculate Reference Add Edit Remove Arguments: Name Type Warning Conversion (using "to") is not supported in functions. Question A function with the same name already exists. Do you want to overwrite the function? Edit Function New Function FunctionsDialog Functions Category Function New… Edit… Deactivate Delete Calculate… Apply Insert Favorite Inactive Uncategorized argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Example: Arguments optional optional argument default: argument default Requirement: Required condition for function Properties %1: key indicating that the property is a data set key Activate Favorites User functions All All functions HistoryView Search… Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Exchange rate source(s): Exchange rate source: Exchange rate sources: updated %1 Comment Insert Value Insert Text Copy Copy unformatted ASCII Select All Protect Add Comment… Move to Top Remove Clear Edit Comment… Search Text: KeypadButton <i>Right-click/long press</i>: %1 <i>Right-click</i>: %1 <i>Long press</i>: %1 Open menu <i>Middle-click</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. Store New function sin cos tan Exponentiation Factorize Expand Percent or remainder Uncertainty/interval Relative error Interval Move cursor left Move cursor to start Move cursor right Move cursor to end Bitwise AND Logical AND Bitwise OR Logical OR Bitwise Exclusive OR Bitwise NOT Logical NOT Bitwise Left Shift Bitwise Right Shift cmp rot a→1 Expand partial fractions Add column Add row Remove column Remove row Left parenthesis Left vector bracket Right parenthesis Right vector bracket Smart parentheses Vector brackets Argument separator Blank space New line Decimal point Previous result (static) Multiplication Bitwise Shift DEL Standard calculator button. Do not use more than three characters. Delete Backspace Addition Plus Subtraction Minus Division C Standard calculator button. Do not use more than three characters. Clear expression Calculate expression Enable units in physical constants All constants Percentage Calculation Tool more All units All variables Button Action Label: Action None Value: Interval Display Adaptive Significant digits Plus/minus Relative Concise Interval Calculation Variance formula Interval arithmetic Allow concise uncertainty input Complex number form Rectangular Exponential Polar Angle/phasor Type Assumptions type Number Real Rational Integer Boolean Sign Assumptions sign Unknown Unknown assumptions sign Non-zero Positive Non-negative Negative Non-positive Default assumptions NamesEditDialog Name Reference Abbreviation Plural Avoid input Suffix Case sensitive Completion only Add Edit Remove Warning Illegal name A function with the same name already exists. A unit or variable with the same name already exists. PercentageCalculationDialog Percentage Value 1 Value 2 Change from 1 to 2 Change from 2 to 1 2 compared to 1 1 compared to 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Clear PeriodicTableDialog Periodic Table Element Data Alkali Metal Alkaline-Earth Metal Lanthanide Actinide Transition Metal Metal Metalloid Polyatomic Non-Metal Diatomic Non-Metal Noble Gas Unknown chemical properties Unknown %1: PlotDialog Plot Data Title: Expression: Function Vector/matrix Paired matrix Rows X variable: Style: Line Points Line with points Boxes/bars Histogram Steps Candlesticks Dots Polar Smoothing: None Monotonic Natural cubic splines Bezier Bezier (monotonic) Y-axis: Primary Secondary Add Apply Remove Title Expression Function Range Minimum x value: Maximum x value: Sampling rate: Step size: Show real and imaginary parts Appearance Display grid Display full border Minimum y value: Maximum y value: Logarithmic x scale: Logarithmic y scale: X-axis label: Y-axis label: Line width: Legend placement: Top-left Top-right Bottom-left Bottom-right Below Outside Calculating… Cancel Processing… PreferencesDialog Preferences Ignore system language (requires restart) Language: Default Allow multiple instances Notify when a new version is available Clear history on exit Max history lines saved: Close application with Escape key Use keyboard keys for RPN Use caret for bitwise XOR Keep above other windows Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Window title: Application name Result Application name + result Workspace Application name + workspace Tooltips: Show all Hide in keypad Hide all Style: Default (requires restart) Default style Dark mode Disable cursor blinking Colorize result Format result Custom history font: Custom expression font: Custom status bar font: Custom keypad font: Custom application font: Expression status: Place expression field below history Off In history list In expression field In status bar Status tooltip delay: ms milliseconds Calculate as you type delay: Adaptive delay Automatically calculate selection Expression in history: Parsed Parsed (compact) Entered Entered + parsed Entered + parsed (compact) Expression after calculation: Keep expression Clear expression Replace with result Replace with result if shorter Automatically copy result Parsing mode: Adaptive Conventional Implicit multiplication first Chain RPN Simplified percentage calculation Read precision Allow concise uncertainty input Limit implicit multiplication Interpret unrecognized symbols as variables Interval calculation: Variance formula Interval arithmetic Factorize result Two's complement output: Two's complement input: Binary Hexadecimal Binary bits: Automatic Use lower case letters in non-decimal numbers Use special duodecimal symbols Multiplication sign: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Use Unicode division slash in output Spell out logical operators Use E-notation instead of 10^n Use 'j' as imaginary unit Use comma as decimal separator Ignore comma in numbers Ignore dots in numbers Copy unformatted ASCII by default Place percent button in number pad Indicate repeating decimals: Ellipsis Overline Digit grouping: None Standard Local Custom Automatically group digits in input Interval display: Significant digits Interval Plus/minus Relative Concise Midpoint Lower Upper Rounding: Round halfway numbers away from zero Round halfway numbers to even Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Use binary prefixes for information units Automatic unit conversion: No conversion Base units Optimal units Optimal SI units Convert to mixed units Automatic unit prefixes: No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Copy unformatted ASCII without units Temperature calculation: Absolute Hybrid Exchange rates updates: %n day(s) %n day %n days Default currency: Look && Feel Fonts Numbers && Operators Units Calculation Restart required Please restart the program for the language change to take effect. QApplication Execute expressions and commands from a file FILE Start a new instance of the application Specify the window title TITLE Update exchange rates Display the application version Open workspace Expression to calculate [EXPRESSION] Allow multiple instances? By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? %1 is already running. Failed to load global definitions! History Answer Value answer History Index(es) History index %s does not exist. Last Answer Answer 2 Answer 3 Answer 4 Answer 5 Memory Error Couldn't write preferences to %1 Function not found. Variable not found. Unit not found. Unsupported base. Unsupported value. QalculateQtSettings Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? It has been %n day since the exchange rates last were updated. Do you wish to update the exchange rates now? It has been %n days since the exchange rates last were updated. Do you wish to update the exchange rates now? Update exchange rates? Fetching exchange rates… Error Warning Information Path of executable not found. curl not found. Failed to run update script. %1 Failed to check for updates. No updates found. A new version of %1 is available at %2. Do you wish to update to version %3? A new version of %1 is available. You can get version %3 at %2. Download %1: %2 Insert function Insert function (dialog) Insert variable Approximate result Negate Invert Insert unit Insert text Insert operator Insert date Insert matrix Insert smart parentheses Convert to unit Convert Convert to optimal unit Convert to base units Convert to optimal prefix Convert to number base Factorize result Expand result Expand partial fractions RPN: down RPN: up RPN: swap RPN: copy RPN: lastx RPN: delete register RPN: clear stack Set expression base Set result base Set angle unit to degrees Set angle unit to radians Set angle unit to gradians Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Show general keypad Toggle programming keypad Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Clear history Show variables Show functions Show units Show data sets Store result MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable New function Open plot functions/data Open convert number bases Open floating point conversion Open calender conversion Open percentage calculation tool Open periodic table Update exchange rates Copy result Insert result Open mode menu Open menu Help Quit Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Delete Backspace Home End Right Left Up Down Undo Redo Calculate expression Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Show toolbar Menu New Function… Variable/Constant… Unknown Variable… Matrix… Unit… Workspaces Open… Open default Save Save As… Import CSV File… Export CSV File… Functions Variables and Constants Units Data Sets Plot Functions/Data Floating Point Conversion (IEEE 754) Calendar Conversion Percentage Calculation Tool Periodic Table Update Exchange Rates Normal Mode RPN Mode Chain Mode Keyboard Shortcuts Preferences Open Settings Folder(s) Open Settings Folder Open Settings Folders Help Report a Bug Check for Updates About %1 Quit Mode General Display Mode Normal Scientific Engineering Simple Angle Unit Radians Degrees Gradians Other Approximation and Fractions Automatic Automatic approximation Dual Dual approximation Exact Exact approximation Approximate Assumptions Type Assumptions type Number Real Rational Integer Boolean Sign Assumptions sign Unknown Unknown assumptions sign Non-zero Positive Non-negative Negative Non-positive Result Base Binary Octal Decimal Hexadecimal Duodecimal Sexagesimal Time format Roman numerals Unicode Bijective base-26 Binary-coded decimal (BCD) Custom: Number base Expression Base Precision: Min decimals: Max decimals: off Max decimals Convert Store Plot Number bases Keypad General Programming Algebra Custom Number Pad None Always Show Number Pad Show Custom Column Separate Menu Buttons Reset Keypad Position Binary: Octal: Decimal: Hexadecimal: RPN Stack Icons only Text only Text beside icons Text under icons Copy <i>Right-click/long press</i>: %1 Open menu Number Bases <i>Middle-click</i>: %1 Conversion operator Rotate the stack or move the selected register up Rotate the stack or move the selected register down Swap the top two values or move the selected value to the top of the stack Delete the top or selected value Enter the top value from before the last numeric operation Copy the selected or top value to the top of the stack Clear the RPN stack New Function… Favorites Recent User functions Open dialog Show all functions User units more Prefixes Show all units User variables Show all variables Powerful and easy to use calculator License: GNU General Public License version 2 or later %1: Error Couldn't write definitions hexadecimal octal decimal duodecimal binary roman bijective sexagesimal latitude longitude time scientific engineering simple Time zone parsing failed. bases calendars rectangular cartesian exponential polar phasor angle optimal prefix base base units mixed factors partial fraction base number base decimals fraction factorize expand Calculating… Cancel RPN Operation Factorizing… Expanding partial fractions… Expanding… Converting… RPN Register Moved Processing… Matrix Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Comma as thousands separator Only dot as decimal separator Comma as separator for function arguments and matrix/vector elements Parsing Mode The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Conventional Adaptive Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Edit Keyboard Shortcut New Keyboard Shortcut Action Value: Set key combination Press the key combination you wish to use for the action. Reserved key combination Question The key combination is already in use. Do you wish to replace the current action (%1)? Key combination Add… Edit… Remove Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Keep open Enter RPN Enter Calculate Apply to Stack Insert Value Argument True False Info optional optional argument Failed to open %1. %2 Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again UnitEditDialog General Relation Name: Category: Descriptive name: System: Imperial US Survey Hide unit Description: Class: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Named derived unit Derived unit Base unit(s): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Inverse relation: Specify for non-linear relation, for conversion back to the base unit. Mix with base unit Priority: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Error Base unit does not exist. Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Unit New Unit UnitsDialog Units Category Unit New… Edit… Deactivate Delete Convert Insert Favorite Show hidden units Inactive Uncategorized Activate Favorites User units All All units UnknownEditDialog Name: Custom assumptions Type: Sign: Temporary Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Unknown Variable New Unknown Variable VariableEditDialog Required Description Name: Value: current result Temporary Category: Descriptive name: Hide variable Description: Question A unit or variable with the same name already exists. Do you want to overwrite it? Edit Variable New Variable VariablesDialog Variables Category Variable New Variable/Constant… Unknown Variable… Matrix… Edit… Export… Deactivate Delete Insert Favorite Inactive Uncategorized a matrix a vector positive non-positive negative non-negative non-zero integer boolean rational real complex number not matrix unknown Default assumptions Activate Favorites User variables All All variables qalculate-qt-5.11.0/translations/qalculate-qt_es.ts000066400000000000000000016666411520501070600223700ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora poderosa y fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financiera; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! es una calculadora para escritorio multiplataforma y multiuso. Es simple de usar pero dispone de poder y versatilidad normalmente reservada para paquetes de matemática complicados, así como herramientas útiles para necesidades diarias (como conversión de monedas y cálculo de porcentajes). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Las características incluyen una gran librería de funciones personalizables, cálculo y conversión de unidades, constantes físicas, cálculos simbólicos (incluyendo integrales y ecuaciones), precisión arbitraria, propagación de incertidumbre, aritmética de intervalos, graficado, y una interfaz amigable. Argument Rules Reglas de argumento _Cancel _Cancelar Do not save modifications No guardar modificaciones _OK _Aceptar Accept the modification of argument rules Aceptar la modificación de las reglas de argumento Enable rules and type test Habilitar reglas y prueba de tipo Custom condition Condición personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por ejemplo, si el argumento es una matriz que debe tener igual número de filas y columnas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Prohibir cero Handle vector Manejar vector Calculate function for each separate element in vector. Calcular función por cada elemento del vector por separado Min Mínimo Include equals Incluir igual Max Máximo Keyboard Shortcuts Atajos de teclado _Close _Cerrar Label Etiqueta Left-click Clic izquierdo Right-click Clic derecho Middle-click Clic medio Reset Reiniciar Value Valor Argument name Nombre del argumento Calendar Conversion Conversión de calendario Export CSV File Exportar archivo CSV Current result Resultado actual Matrix/vector variable Variable de matriz/vector File Archivo Delimiter Delimitador Comma Coma Tabulator Tabulador Semicolon Punto y coma Space Espacio Other Otro Import CSV File Importar archivo CSV Do not import the file No importar el archivo Import the file Importar el archivo Name of the data file to import Nombre del archivo de datos a importar Select a file Seleccionar un archivo Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Vectors Vectores If vectors shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Name Nombre Name (or name prefix) used to reference generated variable(s) in expressions Nombre (o prefijo) usado para referenciar variable(s) generada(s) en las expresiones Descriptive name Nombre descriptivo Title displayed in menus and in variable manager Título mostrado en menús y en el administrador de variables Category Categoría First row Primera fila The first row with data to import in the file La primera fila del archivo con datos para importar Includes headings Incluye encabezados If the first row contains column headings Si la primera fila contiene encabezados de columna Delimiter used to separate columns in the file Delimitador usado para separar columnas en el archivo Custom delimiter Delimitador personalizado Edit Data Property Editar propiedades de datos Do not create/modify this data set No crear/modificar este conjunto de datos Accept the creation/modification of this data set Aceptar la creación/modificación de este conjunto de datos Name used for reference Nombre usado para referencia Properties Propiedades Title displayed in menus and in data set manager Título mostrado en menús y en el administrador de conjunto de datos Description Descripción Description of this data property Descripción de esta propiedad de datos Value Type Tipo de valor Text Texto Number Número Expression Expresión Hide Ocultar Use as key Usar como clave Approximate value Valor aproximado Case sensitive value Valor sensible a mayúsculas y minúsculas Value uses brackets Usa llaves Unit expression Expresión de unidad Edit Data Set Editar conjunto de datos Title Título Data file Archivo de datos Description of this data set Descripción de este conjunto de datos Copyright Derechos de autor General General Properties: Propiedades: Definition of the properties of this data set Definición de las propiedades de este conjunto de datos _New _Nuevo _Edit _Editar _Delete _Eliminar Name used to invoke the function in expressions Nombre usado para llamar la función en expresiones Object argument name Nombre del argumento de objeto Property argument name Nombre del argumento de propiedad Default property Propiedad por defecto Function Función Edit Data Object Editar objeto de datos Do not create/modify this data object No crear/modificar este objeto de datos Accept the creation/modification of this data object Aceptar la creación/modificación de este objeto de datos Data Sets new dataset Conjuntos de datos Data Set Conjunto de datos Create a new data set Crear un nuevo conjunto de datos Edit the selected data set Editar el conjunto de datos seleccionado Delete the selected data set Eliminar el conjunto de datos seleccionado Objects Objetos Create a new data object Crear un nuevo objeto de datos Edit the selected data object Editar el objeto de datos seleccionado Remove the selected data object Eliminar el objeto de datos Data Set Description Descripción del conjunto de datos Object Attributes Atributos de objeto Decimals Decimales Close this window Cerrar esta ventana Min decimals Decimales mínimos Max decimals Decimales máximos Minimal number of displayed decimals Número mínimo de decimales mostrados Maximal number of decimals to display (and round to) Número máximo de decimales a mostrar (y a redondear) Floating Point Conversion Conversión de punto flotante Decimal value Valor decimal Binary value Valor binario Octal value Valor octal Hexadecimal representation Representación hexadecimal Conversion error Error de conversión Binary representation Representación binaria Floating point value Valor de punto flotante Format Formato 16-bit (half precision) 16-bit (precisión media) 32-bit (single precision) 32-bit (precisión simple) 64-bit (double precision) 64-bit (precisión doble) 80-bit (x86 extended format) 80-bit (formato extendido x86) 128-bit (quadruple precision) 128-bit (precisión cuádruple) Hexadecimal value Valor hexadecimal Edit Function Editar función _Help _Ayuda Do not create/modify this function No crear/modificar esta función Accept the creation/modification of this function Aceptar la creación/modificación de esta función Name used to invoke this function in expressions Nombre usado para llamar esta función en expresiones Title displayed in menus and in function manager Título mostrado en menús y el administrador de funciones Hide function Ocultar función If this function shall be hidden in menus Si esta función debe ser ocultada de los menús Description of this function Descripción de esta función Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para el primer, \y para el segundo y \z para el tercer argumento. Para más información, haga clic en el botón de ayuda. Condition Condición Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condición que debe ser verdadera para la función (por ejemplo, si el segundo argumento debe ser mayor que el primero: "\y > \x") Sub-Functions Subfunciones Arguments: Argumentos: Definition of this function's arguments Definición de los argumentos de esta función Free Libre Integer Entero Symbol Símbolo Date Fecha Vector Vector Positive number Número positivo Non-zero number Número distinto de cero Non-negative number Número no negativo Positive integer Entero positivo Non-zero integer Entero distinto de cero Non-negative integer Entero no negativo Boolean Booleano Object Objeto Unit Unidad Variable Variable Angle Ã�ngulo Data object Objeto de datos Data property Propiedad de datos _Add _Añadir Add entered argument definition Añadir la definición de argumento ingresada _Apply _Aplicar Modify selected argument Modificar argumento seleccionado Remove selected argument Eliminar argumento seleccionado Rules Reglas Edit conditions for selected argument Editar condiciones para el argumento seleccionado Close this dialog Cerrar este diálogo Precalculate Precalcular Calculate the subfunction only once, before the parent function Calcular la subfunción solo una vez, antes que la función padre Add entered subfunction Añadir subfunción ingresada Apply changes to the selected subfunction Aplicar cambios a la subfunción seleccionada Remove the selected subfunction Eliminar la subfunción seleccionada Functions Funciones Create a new function Crear una nueva función Edit the selected function Editar la función seleccionada _Insert _Insertar Insert (or execute) the selected function into the expression entry Insertar (o ejecutar) la función seleccionada en la entrada de expresión Delete the selected function Eliminar la función seleccionada (De)activate the selected function (Des)activar la función seleccionada Deacti_vate Desacti_var Apply the selected function to the current expression Aplicar la función seleccionada a la expresión actual Categor_y Catego_ría _Function _Función Descri_ption Descri_pción Degrees Grados Radians Radianes Gradians Gradianes Default assumptions Suposiciones predeterminadas Unknown Desconocido Not Matrix No matriz Complex Complejo Real Real Rational Racional Non-Zero No cero Positive Positivo Non-Negative No negativo Negative Negativo Non-Positive No positivo _File _Archivo Unknown Variable Variable desconocida Function (simplified) Función (simplificada) Import CSV File… Importar archivo CSV… Export CSV File… Exportar archivo CSV… _Store Result… _Guardar resultado Save Result Image… Guardar imagen de resultado… Save local functions, variables and units Guardar funciones, variables y unidades locales Save Definitions Guardar definiciones Import Definitions File… Importar archivo de definiciones… Fetch current exchange rates from the Internet Obtener tasas de cambio actuales de Internet Update Exchange Rates Actualizar tasas de cambio Plot Functions/Data Graficar funciones/datos Convert Number Bases Convertir bases de números Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Percentage Calculation Tool Herramienta de cálculo de porcentaje Periodic Table Tabla periódica Minimal Window Ventana mínima _Quit _Cerrar Manage Variables Administrar variables Manage Functions Administrar funciones Manage Units Administrar unidades Manage Data Sets Administrar conjuntos de datos Factorize Factorizar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar descomposición de fracción parcial al resultado actual. Expand Partial Fractions Expandir fracciones parciales Set Unknowns… Definir incógnitas… Convert to Unit Convertir a unidad Set Prefix Definir prefijo Convert to Unit Expression… Convertir a expresión de unidad… Convert to Base Units Convertir a unidades base Convert to Optimal Unit Convertir a unidades óptimas Insert Date… Insertar fecha… Insert Matrix… Insertar matriz… Insert Vector… Insertar vector… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botones del teclado _Preferences _Preferencias _Mode _Modo Number Base Base numérica Select Result and Expression Base… Seleccionar base del resultado y la expresión… Binary Binario Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Otro… Sexagesimal Sexagesimal Time Format Formato de hora Roman Numerals Números romanos Numerical Display Visualización numérica Normal Normal Engineering Ingeniería Scientific Científica Purely Scientific Puramente científica Simple Simple Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desactivado: 1/7 ≈ 0.14285714 Activado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimales repetidos Show Ending Zeroes Mostrar ceros finales Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desactivado: 2.5 ≈ 3, 1.5 ≈ 2 Activado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Redondear números intermedios a pares Off: -x + y On: y - x Desactivado: -x + y Activado: y - x Sort Minus Last Ordenar menos al final Complex Rectangular Form Forma compleja rectangular Complex Exponential Form Forma compleja exponencial Complex Polar Form Forma compleja polar Complex Angle/Phasor Notation Notación compleja de ángulo/fasor Rational Number Form Forma de número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Fracciones decimales 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Fracciones decimales exactas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fracciones simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fracciones mixtas Interval Display Visualización de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desactivado: 1/2*pi ≈ 1.5707963 Activado: 1/2*pi = 0.5 pi Adaptive Adaptativo Calculates an interval of possible values and keeps track of precision changes. Calcula un rango de valores posibles y mantiene un registro de cambios de precisión. Significant Digits Cifras significativas Interval Intervalo Plus/Minus Más/Menos Midpoint Punto medio Unit Display Visualización de unidad Do not use any prefixes in result No usar ningún prefijo en el resultado Show prefixes for primarily SI and CGS units. Mostrar prefijos principalmente para unidades del SI y CGS. Use prefixes for selected units Usar prefijos para las unidades seleccionadas Use prefixes also for currencies Usar prefijos también para monedas Use prefixs for all units Usar prefijos para todas las unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Habilita el uso automático de hecto, deci y centi cuando los prefijos están habilitados Enable All SI Prefixes Habilitar todos los prefijos del SI Enables automatic setting of prefix for denominator in addition to the numerator Habilita el uso automático de prefijos para el denominador, además del numerador Enable Denominator Prefixes Habilitar prefijos de denominador Off: J / K On: J * K^-1 Desactivado: J / K Activado: J * K^-1 Negative Exponents Exponentes negativos Off: (2 m)/s On: 2 (m/s) Desactivado: (2 m)/s Activado: 2 (m/s) Place Units Separately Colocar unidades por separado No Additional Conversion Ninguna conversión adicional Convert to Optimal SI Unit Convertir a unidades del SI óptimas If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si habilitado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Convertir a unidades mixtas Abbreviate Names Abreviar nombres Enabled Objects Objetos habilitados Variables Variables Units Unidades Unknowns Incógnitas Units in Physical Constants Unidades en constantes físicas If not enabled, treats all variables as unknown Si no activado, trata todas las variables como desconocidas Calculate Variables Calcular variables Disables/enables complex numbers in result Habilita/deshabilita números complejos en el resultado Allow Complex Result Permitir resultado complejo Disables/enables infinite numbers in result Habilita/deshabilita números infinitos en el resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximación Always Exact Siempre exacto Try Exact Intentar exacto Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de varianza Change angle unit used in trigonometric functions Cambiar unidad de ángulo usada en funciones trigonométricas Angle Unit Unidad de ángulo None Ninguna Assumptions Suposiciones Algebraic Mode Modo algebraico Assume that unknown denominators are non-zero Asumir que denominadores desconocidos son distintos de cero Non-Zero Denominators Denominadores distintos de cero Warn when unknown denominators are assumed non-zero Advertir cuando denominadores desconocidos se asumen como distintos de cero Warn About Denominators Assumed Non-Zero Advertir por denominadores asumidos como distintos de cero Parsing Mode Modo de análisis Adaptive Parsing Análisis adaptativo Parse Implicit Multiplication First Analizar multiplicación implícita primero Conventional Parsing Análisis convencional Off: xy = x*y On: xy != x*y Desactivado: xy = x*y Activado: xy != x*y Limit Implicit Multiplication Limitar multiplicación implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analizar números decimales como aproximados con precisión igual a la cantidad de dígitos. Desactivado: 1.1 * 1.1 = 1.21 Activado: 1.1 * 1.1 ≈ 1.2 Read Precision Leer precisión _Precision _Precisión _Decimals _Decimales Calculate As You Type Calcular al escribir Chain Mode Modo de análisis Activate the RPN stack. Activar la pila de RPN. RPN Mode Modo RPN Meta Modes Meta modos Save Mode… Guardar modo… Delete Mode… Eliminar modo… Save Default _Mode Guardar _modo predeterminado Fu_nctions Fu_nciones _Variables _Variables _Units _Unidades _Contents _Contenidos Report a Bug Reportar un error Check for Updates Buscar actualizaciones _About _Acerca de Toggle minimal window Alternar ventana mínima Calculation result Resultado de cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Alterna el teclado persistente (permite mostrar el teclado y el historial simultáneamente) _History _Historial C_onversion C_onversión RPN Stack Pila RPN Insert the selected value Insertar el valor seleccionado Insert the selected text Insertar el texto seleccionado Copy the selected text Copiar el texto seleccionado Add the selected value(s) Sumar los valores seleccionados Subtract the selected value(s) Restar los valores seleccionados Multiply the selected value(s) Multiplicar los valores seleccionados Divide the the selected value(s) Dividir los valores seleccionados Raise to the power of the selected value Elevar a la potencia del valor seleccionado Calculate the square root of the selected value Calcular la raíz cuadrada del valor seleccionado History Historial Subtract the top value from the second value Restar el primer valor al segundo valor Multiply the top two values Multiplicar los dos primeros valores Divide the second value by the top value Divide el segundo valor entre el primer valor Raise the second value to the power of the top value Elevar el segundo valor a la potencia del primer valor Negate the top value (Ctrl+-) Negar el primer valor (Ctrl+-) Invert the top value Invertir el primer valor Calculate the square root of the top value Calcular la raíz cuadrada del primer valor Calculate the sum of all values Calcular la suma de todos los valores Rotate the stack or move selected register up Rotar la pila o mover el registro seleccionado hacia arriba Rotate the stack or move selected register down Rotar la pila o mover el registro seleccionado hacia abajo Swap the two top values or move the selected value to the top of the stack Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila Copy the selected or top value to the top of the stack Copiar el primer valor o el seleccionado encima de la pila Enter the top value from before the last numeric operation Ingresar el primer valor previo a la última operación numérica Delete the top or selected value Eliminar el primer valor o el valor seleccionado Edit the selected value Editar el valor seleccionado Clear the RPN stack Limpiar la pila RPN Unit(s) and prefix to convert result to Unidad(es) y prefijo(s) a los que convertir el resultado Convert Convertir Continuous conversion Conversión continua Automatically convert result to the current unit expression as long as the conversion box is visible. Convertir el resultado automáticamente a la expresión de unidad actual mientras la caja de conversión sea visible. Add prefix Añadir prefijo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si la expresión de unidad no contiene ningún prefijo, usar el prefijo óptimo. Esto puede ser anulado anteponiendo la expresión de unidad con "?" o "0". Conversion Conversión Show/hide programming keypad Mostrar/Ocultar teclado de programación Exact Exacto Fraction Fracción Numerical display Visualización numérica Pure Pura Number base Base numérica Time format Formato de fecha Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variable desconocida mod mod mean mean Store result as a variable Guardar resultado como variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Convertir bases numéricas Imaginary unit i (√-1) Unidad imaginaria i (√-1) Manage units Administrar unidades Conversion operator Operador de conversión Kilogram Kilogramo Two's complement input Entrada de complemento a dos Two's complement output Salida de complemento a dos Bitwise Exclusive OR OR exclusivo bit a bit Bitwise Left Shift Desplazamiento a la izquierda bit a bit Bitwise Right Shift Desplazamiento a la derecha bit a bit Floating point conversion Conversión de punto flotante Show/hide left keypad Mostrar/Ocultar teclado izquierdo Show/hide right keypad Mostrar/Ocultar teclado derecho DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Añadir a expresión Persistent Keypad Teclado persistente Edit Editar Delete Eliminar Update Actualizar Insert Value Insertar valor Insert Text Insertar texto Insert Parsed Text Insertar texto analizado Copy Copiar Copy Full Text Copiar texto completo Search… Buscar… Add Bookmark… Añadir marcador… Bookmarks Marcadores Protect Proteger Move To Top Mover a la cima Remove Eliminar Clear All Limpiar todo _Copy _Copiar _Store… _Guardar… Save Image… Guardar imagen… _Factorize _Factorizar _Expand _Expandir _Normal _Normal Sc_ientific C_ientifica Purel_y Scientific Pura_mente científica Simp_le Simp_le _Binary _Binaria _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fracción decimal Exact Decimal Fraction Fracción decimal exacta Simple Fraction Fracción simple Mixed Fraction Fracción mixta _Abbreviate Names _Abreviar nombres C_onvert… C_onvertir… Convert to Base _Units Convertir a _unidades base Convert _to Optimal Unit Convertir a unidad óp_tima Use Optimal Prefix Usar prefijo óptimo Convert to Convertir a Convert to UTC Convertir a UTC Convert to Calendars Convertir a calendario Use prefixes for all units Usar prefijos para todas las unidades Enable All SI Prefi_xes Habilitar todos los prefi_jos del SI View/Edit Matrix Ver/Editar matriz View/Edit Vector Ver/Editar vector Copy Text Copiar texto To Top A la cima Swap Intercambiar Up Arriba Down Abajo Negate Negar Invert Invertir Square Cuadrado Square Root Raíz cuadrada Clear Stack Limpiar pila Select Number Base… Seleccionar base numérica… Store result Guardar resultado Insert the matrix/vector into the expression Insertar la matriz/vector en la expresión Rows Filas Number of rows in this matrix (rows displayed for vectors) Número de filas en esta matriz (filas mostradas para vectores) Columns Columnas Number of columns in this matrix (columns displayed for vectors) Número de columnas en esta matriz (columnas mostradas para vectores) If this is a matrix or vector Si esto es una matriz o un vector Elements Elementos Current element: Elemento actual: Edit Matrix Editar matriz Do not create/modify this matrix/vector No crear/modificar esta matriz/vector Create/modify the matrix/vector Crear/Modificar esta matriz/vector Accept the creation/modification of this matrix/vector Aceptar la creación/modificación de esta matriz/vector Name used to reference this variable in expressions Nombre usado para referenciar esta variable en expresiones Names Nombres Add new name Añadir nuevo nombre Apply changes to the selected name Aplicar cambios al nombre seleccionado Remove the selected name Eliminar el nombre seleccionado Abbreviation Abreviación Unicode Unicode Plural Plural Suffix Sufijo Reference Referencia Avoid input Evitar entrada Case sensitive Distingue mayúsculas y minúsculas Completion only Solo completado Number Bases Bases numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Restar Multiply Multiplicar Divide Dividir Bitwise AND AND bit a bit Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear Limpiar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ingresa dos valores, de los cuales como máximo uno es un porcentaje, y los otros serán calculados por tí Percentage Porcentaje Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Cambio de 1 a 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Cambio de 2 a 1 Plot Graficar _Save _Guardar Save as png, svg, postscript, eps, latex or fig Guardar como png, svg, postscript, eps, latex o fig Vector/matrix Vector/Matriz Paired matrix Matriz emparejada if you want to split matrix in rows instead of columns Si quiere separar la matriz el filas en lugar de columnas X variable Variable X The variable name used in expression La variable usada en la expresión Style Estilo Line Línea Points Puntos Line with points Linea con puntos Boxes/bars Cajas/Barras Histogram Histograma Steps Pasos Candlesticks Candelabros Dots Punteado Smoothing Suavizado Monotonic Monotónico Natural cubic splines Spline cúbica natural Bezier Bezier Bezier (monotonic) Bezier (monotónico) Y-axis Eje Y Primary Primario Secondary Secundario _Remove _Eliminar Data Datos Minimum x value Valor mínimo de x Maximum x value Valor máximo de x Sampling rate Tasa de muestreo Step size Tamaño de paso Function Range Rango de función Display grid Mostrar cuadrícula Display full border Mostrar borde completo Minimum y value Valor mínimo de y Maximum y value Valor máximo de y Logarithmic x scale Escala logarítmica de x Logarithmic y scale Escala logarítmica de y X-axis label Etiqueta de eje x Y-axis label Etiqueta de eje y Line width Ancho de línea Color display Visualización de color Color Color Monochrome Monocromo Legend placement Ubicación de leyenda Top-left Superior izquierda Top-right Superior derecha Bottom-left Inferior izquierda Bottom-right Inferior derecha Below Abajo Outside Afuera Appearance Apariencia Precision Precisión _Recalculate _Recalcular Recalculate expression Recalcular expresión The number of significant digits to display/calculate (simple arithmetics are always calculated exact) El número de cifras significativas a mostrar/calcular (la aritmética simple siempre se calcula exactamente) Preferences Preferencias Save mode on exit Guardar modo al salir If the mode of the calculator shall be restored Si el modo de la calculadora debe ser restaurado Save definitions on exit Guardar definiciones al salir If changes to functions, units and variables shall be saved automatically Si los cambios a las funciones, unidades y variables deben ser guardados automáticamente Clear history on exit Limpiar historial al salir Allow multiple instances Permitir múltiples instancias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permitir que múltiples instancias de la ventana principal de Qalculate! estén abiertas al mismo tiempo. Tenga en cuenta que solo el modo, historia y definiciones de última la instancia cerrada serán guardados. Notify when a new version is available Notificar cuando una nueva versión está disponible Use keyboard keys for RPN Usar teclas del teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar teclas de operación del teclado para las operaciones RPN (+-*/^). Use caret for bitwise XOR Usar circunflejo para XOR bit a bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Ingresar XOR (⊻) usando el circunflejo (^) del teclado (de lo contrario usar Ctrl+^). El operador de exponenciación (^) siempre puede ser ingresado usando Ctrl+*. Time limit for plot: Límite de tiempo para graficado: Behavior Comportamiento Enable Unicode symbols Habilitar símbolos unicode Disable this if you have problems with some fancy characters Deshabilita esto si tienes problemas con algunos caracteres especiales Ignore system language (requires restart) Ignorar idioma del sistema (requiere reinicio) Application name Nombre de aplicación Result Resultado Application name + result Nombre de aplicación + resultado Mode Modo Application name + mode Nombre de aplicación + modo Window title Título de ventana Default Predeterminado Button padding Función Number of expression lines Número de lineas para la expresión Display expression status Mostrar estado de la expresión If as-you-type expression status shall be displayed below the expression entry Si el estado de la expresión al escribir debe ser mostrado debajo de la entrada de expresión Persistent keypad Teclado persistente Look & Feel Aparencia Binary two's complement representation Representación binaria de complemento a dos If two's complement representation shall be used for negative binary numbers. Si la representación de complemento a dos debe ser usada para números binarios negativos Hexadecimal two's complement representation Representación hexadecimal de complemento a dos If two's complement representation shall be used for negative hexadecimal numbers. Si la representación de complemento a dos debe ser usada para números hexadecimales negativos Use lower case letters in non-decimal numbers Usar letras minúsculas en números no decimales If lower case letters should be used in numbers with non-decimal base Si las letras minúsculas deben ser usadas en números con base no decimal Alternative base prefixes Prefijos de base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si los números hexadecimales deben ser mostrados con "0x0" y los números binarios con "0b00" como prefijos Spell out logical operators Deletrear operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si los operadores lógicos deben ser mostrados como "&&"/"||" o "and"/"or" If "e" shall be used instead of "E" in numbers Si "e" debe ser usado en lugar de "E" en números Use E-notation instead of 10<sup><i>n</i></sup> Usar notación E en vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar "e" minúscula (como en 1e10) Use 'j' as imaginary unit Usar "j" como la unidad imaginaria Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar "j" (en lugar de "i") como símbolo predeterminado para la unidad imaginaria, y colocarlo en frente de la parte imaginaria Use comma as decimal separator Usar coma como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permitir puntos "." como separadores de miles en lugar de un separador decimal alternativo Ignore comma in numbers Ignorar comas en números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permitir comas "," como separadores de miles en lugar de un separador de argumentos de función Ignore dots in numbers Ignorar puntos en números Digit grouping Agrupamiento de dígitos off Desactivado standard Estándar local Local Multiplication sign Signo de multiplicación Division sign Signo de división Copy digit separator Copiar dígito separador Deactivate to remove digit separator when copying result Desactivar para eliminar el separador de dígitos al copiar el resultado Numbers & Operators Números y operadores Use binary prefixes for information units Usar prefijos binarios para unidades de información Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefijos binarios en lugar de decimales, como predeterminados para unidades de información (ej. bytes). Conversion to local currency Conversión a moneda local Automatically convert to the local currency when optimal unit conversion is activated. Automáticamente convertir a la moneda local cuando la conversión a unidad óptima esta activada. Update exchange rates on start Actualizar tasas de cambio al iniciar If current exchange rates shall be downloaded from the internet at program start Si las tasas de cambio deben ser descargadas del internet cuando el programa se inicia Exchange rates updates Actualizaciones de tasas de cambio Units & Currencies Unidades y monedas Show expression completion suggestions Mostrar sugerencias para completar expresiones Search titles and countries Buscar títulos y países Minimum characters Caracteres mínimos Popup delay (ms) Retraso de aparición (ms) Completion Completado Status warning color Color del estado de advertencia Status error color Color del estado de error Custom status font Fuente de estado personalizada If you want to use a font other than the default in the status display below the expression entry Si quiere usar una fuente distinta de la predeterminada en la visualización de estado debajo de la entrada de expresión Custom expression font Fuente de expresión personalizada If you want to use a font other than the default in the expression entry Si quiere usar una fuente distinta de la predeterminada en la entrada de expresión Custom result font Fuente de resultado personalizada If you want to use a font other than the default in the result display Si quiere usar una fuente distinta de la predeterminada en la visualización de resultado Custom keypad font Fuente de teclado personalizada If you want to use a font other than the default in the keypad Si quiere usar una fuente distinta de la predeterminada en el teclado Custom application font Fuente de aplicación personalizada If you want to use a font other than the default for the whole application Si quiere usar una fuente distinta de la predeterminada para toda la aplicación Text color Color de texto Fonts & Colors Fuentes y colores Other: Otro: Bijective base-26 Base biyectiva 26 <b>Result Base</b> <b>Base de resultado</b> <b>Expression Base</b> <b>Base de expresión</b> New Keyboard Shortcut Nuevo atajo de teclado Edit Variable Editar variable Advanced Avanzado Accept the creation/modification of this variable Aceptar la creación/modificación de esta variable x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Usar x, y, y z para el 1er, 2do y 3ro argumento de función respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Usar \x, \y, y \z para el 1er, 2do y 3ro argumento de función respectivamente. Esto evita conflictos potenciales entre variables, funciones y unidades. Edit Unit Editar unidades Do not create/modify this unit No crear/modificar esta unidad Accept the creation/modification of this unit Aceptar la creación/modificación de esta unidad Singular form of this unit's name Forma singular de el nombre de esta unidad Title displayed in menus and in unit manager Título mostrado en menús y en el administrador de unidades System Sistema Imperial Imperial US Survey Tradicional EE.UU. (US Survey) Hide unit Ocultar unidad If this unit shall be hidden in menus Si esta unidad debe ser mostrada en menús Class Clase The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La clase a la que esta unidad pertenece. Las unidades de alias son definidas en relación a otra unidad, las unidades compuestas son una composición de un número de otras unidades. Las unidades base no son definidas en relación a otras unidades Base unit Unidad base Named derived unit Unidad derivada nombrada Derived unit Unidad derivada Base unit(s) Unidad(es) base Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Unidad (para unidad alias) o unidades (para unidades compuestas) con las que esta unidad está definida Exponent Exponente Exponent of the base unit Exponente de la unidad base Relation Relación Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relación con la unidad base. Para relaciones lineares esto debería ser un número. Para relaciones no lineares use \x para el factor e \y para el exponente (ej: "\x + 273.15" para la relación entre grados Celsius y Kelvin). Relation is exact La relación es exacta If the relation is precise Si la relación es precisa Inverse relation Relación inversa Specify for non-linear relation, for conversion back to the base unit. Especificar para relación no linear, para la conversión de vuelta a la unidad base. Mix with base unit Combinar con la base unidad - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide con qué unidades se combina la unidad base si existen múltiples opciones. - La unidad original no será combinada con unidades de prioridad menor. - Un número más bajo indica una más alta prioridad. Priority Prioridad Minimum base unit number Número mínimo de unidad base Use with prefixes by default Usar con prefijos por defecto Create a new unit Crear una nueva unidad Edit the selected unit Editar la unidad seleccionada Insert the selected unit into the expression entry Insertar la unidad seleccionada en la entrada de expresión C_onvert C_onvertir Convert the result to the selected unit Convertir el resultado a la unidad seleccionada Delete the selected unit Eliminar la unidad seleccionada (De)activate the selected unit (Des)activar la unidad seleccionada _Unit _Unidad Convert between units Convertir entre unidades = = Conver_sion Conver_sión Converted value Valor convertido Value to convert from Valor a convertir Type anywhere Escribir en cualquier lado Edit Unknown Variable Editar variable desconocida Do not create/modify this unknown variable No crear/modificar esta variable desconocida Accept the creation/modification of this unknown variable Aceptar la creación/modificación de esta variable desconocida Name used to reference this unknown variable in expressions Nombre usado para referenciar esta variable desconocida en expresiones Use custom assumptions Usar suposiciones personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Signo The category this unknown variable belongs to La categoría a la que esta variable desconocida pertenece Value of this variable (expression) Valor de esta variable (expresión) value is exact El valor es exacto If the value is precise Si el valor es preciso The category this variable belongs to La categoría a la que esta variable pertenece Create a new variable Crear una nueva variable Edit the selected variable Editar la variable seleccionada Insert the selected variable into the expression entry Insertar la variable seleccionada en la entrada de expresión Delete the selected variable Eliminar la variable seleccionada (De)activate the selected variable (Des)activar la variable seleccionada E_xport E_xportar _Variable _Variable Start a new instance of the application Iniciar una nueva instancia de la aplicación Display the application version Mostrar la versión de la aplicación Specify the window title Especificar el título de la ventana TITLE TÃ�TULO Expression to calculate Expresión a calcular [EXPRESSION] [EXPRESIÓN] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. ans ans Last Answer Última respuesta answer respuesta Answer 2 Respuesta 2 Answer 3 Respuesta 3 Answer 4 Respuesta 4 Answer 5 Respuesta 5 Failed to load global definitions! Falla al cargar las definiciones globales! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por defecto, solo una instancia (una ventana principal) de %s es permitida. Si múltiples instancias están abiertas simultáneamente, solo las definiciones (variables, funciones, etc.), modo, preferencias, e historia de la última ventana serán guardadas. ¿Quiere, a pesar de esto, cambiar el comportamiento predeterminado y permitir múltiples instancias simultáneas? c-format Right-click/long press: %s Clic derecho / pulsación larga: %s c-format Right-click: %s Clic derecho: %s c-format Middle-click: %s Clic medio: %s c-format Cycle through previous expression Recorrer expresiones previas Move cursor left or right Mover cursor a la izquierda o derecha Move cursor to beginning or end Mover cursor al principio o final Uncertainty/interval Incertidumbre/Intervalo Relative error Error relativo Argument separator Separador de argumentos Blank space Espacio en blanco New line Nueva línea Smart parentheses Paréntesis inteligentes Vector brackets Corchetes para vectores Left parenthesis Paréntesis izquierdo Left vector bracket Paréntesis recto izquierdo de vector Right parenthesis Paréntesis derecho Right vector bracket Paréntesis recto derecho de vector Decimal point Punto decimal Raise (Ctrl+*) Elevar (Ctrl+*) Add Añadir Backspace Retroceso Previous result (static) Resultado anterior (estático) Calculate expression Calcular expresión Set unknowns Definir incógnitas more Show further items in a submenu más Logical AND AND lógico Logical OR OR lógico Logical NOT NOT lógico Toggle Result Base Alternar base de resultado Open menu with stored variables Abrir menú con variables almacenadas Index Ã�ndice Calculate expression and add to stack Calcular expresión y añadir a la pila Flag Bandera Matrices Matrices Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Julian Islamic (Hijri) Islámico (Hijri) Hebrew Hebreo Chinese Chino Persian (Solar Hijri) Persa (Hijri solar) Coptic Copto Ethiopian Etíope Indian (National) Indio (nacional) Action Acción Key combination Combinación de teclas Raise Elevar History Answer Value Valor de respuesta de historial History Index(es) Ã�ndice(s) de historial History index %s does not exist. Ã�ndice de historial %s no existe. c-format expression expresión History Parsed Expression Expresión de historia analizada Set Window Title Definir título de ventana Failed to open %s. %s Fallo al abrir %s. %s c-format Could not display help for Qalculate!. No se pudo mostrar la ayuda de Qalculate!. Could not display help for Qalculate!. %s No se pudo mostrar la ayuda de Qalculate!. %s c-format approx. aprox. Stop process Detener proceso Clear expression Limpiar expresión EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? ¿Quiere actualizar las tasas de cambio ahora? It has been %s day since the exchange rates last were updated. Ha pasado %s día desde la última actualización de las tasas de cambio. Han pasado %s días desde la última actualización de las tasas de cambio. c-format It has been %s days since the exchange rates last were updated. Do not ask again No preguntar de nuevo It took too long to generate the plot data. Tomó demasiado tiempo generar los datos de graficado. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Tomó demasiado tiempo generar los datos de graficado. Por favor disminuya la tasa de muestreo o aumente el límite de tiempo en las preferencias. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Cuando errores, advertencias u otra información son generados durante el cálculo, el icono a la derecha de la entrada de expresión cambia para indicar esto. Si mantienes el puntero sobre o hace clic en el icono, el mensaje aparecerá Path of executable not found. Ruta de ejecutable no encontrada. curl not found. No se encontró curl. Failed to run update script. %s Error al ejecutar el script de actualización. %s c-format Failed to check for updates. Fallo al buscar actualizaciones. No updates found. No se encontró ninguna actualización. A new version of %s is available at %s. Do you wish to update to version %s. Una nueva versión de %s está disponible en %s. ¿Quiere actualizar a la versión %s? c-format A new version of %s is available. You can get version %s at %s. Una nueva versión de %s está disponible. Puedes obtener la versión %s en %s. c-format Too many arguments for %s(). Demasiados argumentos para %s() c-format argument argumento Uncategorized No categorizado hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binario roman romano bijective biyectivo sexagesimal sexagesimal latitude Relación time tiempo bases bases calendars calendarios rectangular rectangular cartesian cartesiano exponential exponencial polar polar angle ángulo phasor fasor optimal óptimo base base mixed mixto fraction fracción factors factores partial fraction fracción parcial factorize factorizar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binario roman numerals números romanos bijective base-26 base biyectiva 26 sexagesimal number número sexagesimal 32-bit floating point punto flotante de 32 bits 64-bit floating point punto flotante de 64 bits 16-bit floating point punto flotante de 16 bits 80-bit (x86) floating point punto flotante de 80 bits (x86) 128-bit floating point punto flotante de 128 bits time format formato de tiempo number bases bases numéricas optimal unit unidad óptima base units unidades base mixed units unidades mixtas expanded partial fractions fracciones parciales expandidas complex rectangular form forma compleja rectangular complex exponential form forma compleja exponencial complex polar form forma compleja polar complex cis form forma compleja cis complex angle notation Notación compleja de ángulo complex phasor notation notación compleja de fasor UTC time zone huso horario UTC number base %s base numérica %s c-format Inactive Inactivo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera datos del conjunto de datos %s para un objeto y propiedad determinada. Si "info" es ingresado como una propiedad, aparecerá una ventana de diálogo con todas las propiedades del objeto. c-format Example: Ejemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description predeterminado: Requirement Requisito key indicating that the property is a data set key clave Acti_vate Acti_var a previous result un resultado anterior matrix matriz vector vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero boolean booleano integer entero rational racional real real complex complejo number número (not matrix) (no matriz) unknown desconocido default assumptions suposiciones predeterminadas Variable does not exist anymore. La variable ya no existe más. Data Retrieval Function Función de recuperación de datos Insert function Insertar función Insert function (dialog) Insertar función (diálogo) Insert variable Insertar variable Insert unit Insertar unidad Insert text Insertar texto Insert date Insertar fecha Insert vector Insertar vector Insert matrix Insertar matriz Insert smart parentheses Insertar paréntesis inteligentes Convert to unit Convertir a unidad Convert to unit (entry) Convertir a unidad (entrada) Convert to optimal unit Convertir a unidades óptimas Convert to base units Convertir a unidades base Convert to optimal prefix Convertir a prefijo óptimo Convert to number base Convertir a base numérica Factorize result Factorizar resultado Expand result Expandir resultado Expand partial fractions Expandir fracciones parciales RPN: down RPN: abajo RPN: up RPN: arriba RPN: swap RPN: intercambiar RPN: copy RPN: copiar RPN: lastx RPN: último x RPN: delete register RPN: eliminar registro RPN: clear stack RPN: limpiar pila Load meta mode Cargar modo meta Set expression base Definir base de expresión Set result base Definir base de resultado Toggle exact mode Alternar modo exacto Set angle unit to degrees Definir unidad de ángulos a grados Set angle unit to radians Definir unidad de ángulos a radianes Set angle unit to gradians Definir unidad de ángulos a gradianes Toggle simple fractions Alternar fracciones simples Toggle mixed fractions Alternar fracciones mixtas Toggle scientific notation Alternar notación científica Toggle simple notation Alternar notación simple Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar calcular al escribir Toggle programming keypad Alternar teclado de programación Show keypad Mostrar teclado Show history Mostrar historial Search history Buscar historial Show conversion Mostrar conversión Show RPN stack Mostrar pila RPN Manage variables Administrar variables Manage functions Administrar funciones Manage data sets Administrar conjuntos de datos New variable Nueva variable New function Nueva función Open plot functions/data Abrir graficado de función/datos Open convert number bases Abrir conversión de bases numéricas Open floating point conversion Abrir conversión de punto flotante Open calender conversion Abrir conversión de calendario Open percentage calculation tool Abrir herramienta de cálculo de porcentaje Open periodic table Abrir tabla periódica Update exchange rates Actualizar tasas de cambio Copy result Copiar resultado Insert result Insertar texto Save result image Guardar imagen de resultado Help Ayuda Quit Salir Prefixes Prefijos No Prefix Ningún prefijo Optimal Prefix Prefijo óptimo Prefix Prefijo Complex angle/phasor notation Notación compleja de ángulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binario Calendars Calendarios Complex cis form Forma compleja cis Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma compleja exponencial Factors Factores 16-bit floating point binary format Formato binario de punto flotante de 16 bits 32-bit floating point binary format Formato binario de punto flotante de 32 bits 64-bit floating point binary format Formato binario de punto flotante de 64 bits 80-bit (x86) floating point binary format Formato binario de punto flotante de 80 bits (x86) 128-bit floating point binary format Formato binario de punto flotante de 128 bits Hexadecimal number Número hexadecimal Mixed units Unidades mixtas Octal number Número octal Optimal units Unidades óptimas Expanded partial fractions Fracciones parciales expandidas Complex polar form Forma compleja polar Complex rectangular form Forma compleja rectangular Sexagesimal number Número sexagesimal and y or o undefined indefinido result is too long see history resultado es muy largo ver historial calculation was aborted calculo fue detenido RPN Register Moved Registro RPN movido RPN Operation Operación RPN Processing… Procesando… result processing was aborted procesamiento de resultados fue detenido Factorizing… Factorizando… Expanding partial fractions… Expandiendo fracciones parciales… Expanding… Expandiendo… Calculating… Calculando… Converting… Convirtiendo… Fetching exchange rates. Buscando tasas de cambio. Time zone parsing failed. Analizado de husos horarios falló. Keep open Mantener abierto Enter RPN Enter (calculate and add to stack) Ingresar C_alculate C_alcular Apply to Stack Aplicar a la pila Argument Argumento True Verdadero False False Info Información Edit Unit (global) Editar unidad (global) New Unit Nueva unidad Empty name field. Campo de nombre vacío. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Una variable o unidad con el mismo nombre ya existe. ¿Quiere sobreescribirla? Base unit does not exist. La unidad base no existe. Edit Function (global) Editar función (global) New Function Nueva función Yes Sí No No Empty expression field. Campo de expresión vacío. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Unit does not exist La unidad no existe Edit Unknown Variable (global) Editar variable desconocida (global) New Unknown Variable Nueva variable desconocida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Variable (global) Editar variable (global) New Variable Nueva variable Empty value field. Campo de valor vacío. Edit Vector Editar vector Edit Vector (global) Editar vector (global) New Vector Nuevo vector Edit Matrix (global) Editar matriz (global) New Matrix Nueva matriz Vector Result Resultado de vector Matrix Result Resultado de matriz New Data Object Nuevo objeto de datos text texto approximate aproximado Edit Data Set (global) Editar conjunto de datos (global) New Data Set Nuevo conjunto de datos info información Property Propiedad No file name entered. Nombre de archivo no ingresado. No delimiter selected. Delimitador no seleccionado. Could not import from file %s No se pudo importar el archivo %s c-format No variable name entered. Nombre de variable no ingresado. No known variable with entered name found. No se encontró una variable conocida con nombre ingresado. Could not export to file %s No se pudo exportar el archivo %s c-format My Variables Mis variables Couldn't write definitions No se pudo guardar las definiciones Preset Predefinido Abort Abortar Undo Deshacer Redo Rehacer Completion Mode Modo de completado Limited strict completion Completado estricto limitado Strict completion Completado estricto Limited full completion Completado completo limitado Full completion Completado completo No completion Sin completado Save Mode Guardar modo Preset mode cannot be overwritten. Modo predefinido no puede ser sobreescrito. Delete Mode Eliminar modo Couldn't write preferences to %s No se pudieron guardar las preferencias en %s c-format never nunca ask preguntar %i day %i día %i días c-format %i days Copied Result was copied Copiado log10 function not found. Función log10 no encontrada. Search Buscar _Search _Buscar Remove Bookmark Eliminar marcador Add Bookmark Añadir marcador A bookmark with the selected name already exists. Do you want to overwrite it? Un marcador con el nombre seleccionado ya existe. ¿Quiere sobreescribirlo? No items found No se encontraron ítems Select date Seleccionar fecha Rectangular form Forma rectangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notación ángulo/fasor Optimal unit Unidad óptima Optimal prefix Prefijo óptimo All functions Todas las funciones All variables Todas las variables Select definitions file Seleccionar archivo de definiciones _Import _Importar Could not copy %s to %s. No se pudo copiar %s a %s. c-format Could not read %s. No se pudo leer %s. c-format Could not copy file to %s. No se pudo copiar el archivo a %s. c-format Unsupported base. Base no soportada. The selected Chinese year does not exist. El año chino seleccionado no existe. Conversion to Gregorian calendar failed. La conversión al calendario gregoriano falló. Calendar conversion failed for: %s. La conversión de calendario falló por: %s. c-format Select file to save PNG image to Seleccionar archivo al que guardar la imagen PNG. Allowed File Types Tipos de archivo permitidos All Files Todos los archivos Cannot delete unit as it is needed by other units. do not delete units that are used by other units No se puede eliminar la unidad porque está siendo usada por otras unidades. none ninguno result is too long resultado es muy largo translator-credits VicSanRoPe Mode not found. Modo no encontrado Elements (in horizontal order) Elementos (en orden horizontal) Select file to import Seleccionar archivo a importar _Open _Abrir Select file to export to Seleccionar archivo al que exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe un objeto en conflicto con el mismo nombre. Si continúas y guardas los cambios, el objeto en conflicto será sobreescrito o desactivado. ¿Quiere continuar? Set key combination Definir combinación de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Presiona la combinación de teclas que quieres usar para la acción (presiona Escape para cancelar). No keys Ninguna tecla Empty value. Valor vacío. Function not found. Función no encontrada. Variable not found. Variable no encontrada. Unit not found. Unidad no encontrada. The key combination is already in use. Do you wish to replace the current action? La combinación de teclas ta está en uso. ¿Quiere remplazar la acción actual? Select file to export Seleccionar archivo al que exportar Empty expression. Expresión vacía. Empty x variable. Variable x vacía. Element Data Datos de elementos Classification Clasificación Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalinotérreo Lanthanide Lantánido Actinide Actínido Transition Metal Metal de transición Metal Metal Metalloid Metaloide Polyatomic Non-Metal No metal poliatómico Diatomic Non-Metal No metal diatómico Noble Gas Gas noble Unknown chemical properties Propiedades químicas desconocidas No unknowns in result. No hay incógnitas en el resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Si se debe generar una matriz o vectores a partir del contenido del archivo Use dark theme Usar el tema oscuro Add the two top values Keypad Sumar los dos primeros valores u Manage units button u to Button for convert to operator a Add Keypad Sumar Base Unit Unidad base Alias Alias Composite Unit Unidad compuesta Fonts Fuentes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nombre</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relación</b> Adaptive parsing Análisis adaptativo 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Predeterminados Customize Buttons Fuente de estado personalizada Names details Detalle de nombres ArgumentEditDialog Name: Nombre: Type: Tipo: Free Libre Number Número Integer Entero Symbol Símbolo Text Texto Date Fecha Vector Vector Matrix Matriz Boolean Booleano Angle Ã�ngulo Object Objeto Function Función Unit Unidad Variable Variable File Archivo Enable rules and type test Habilitar reglas y prueba de tipo Custom condition: Condición personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por ejemplo, si el argumento es una matriz que debe tener igual número de filas y columnas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Prohibir cero Handle vector Manejar vector Calculate function for each separate element in vector. Calcular función por cada elemento del vector por separado. Min Mínimo Include equals Incluir igual Max Máximo CSVDialog Import CSV File Importar archivo CSV Export CSV File Exportar archivo CSV Current result Resultado actual Matrix/vector variable: Variable de matriz/vector: File: Archivo: Import as Importar como matrix matriz vectors vectores Name: Nombre: First row: Primera fila: Includes headings Incluye encabezados Delimiter: Delimitador: Comma Coma Tabulator Tabulador Semicolon Punto y coma Space Espacio Other Otro Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? An unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Error Error Could not import from file %1 No se pudo importar el archivo %1 No matrix or vector variable with the entered name was found. No se encontró una variable de matriz o vector con nombre ingresado. Could not export to file %1 No se pudo exportar el archivo %1 CalendarConversionDialog Calendar Conversion Conversión de calendario Gregorian Gregoriano Hebrew Hebreo Islamic (Hijri) Islámico (Hijri) Persian (Solar Hijri) Persa (Hijri solar) Indian (National) Indio (nacional) Chinese Chino Julian Julian Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Copto Ethiopian Etíope Error Error The selected Chinese year does not exist. El año chino seleccionado no existe. Conversion to Gregorian calendar failed. La conversión al calendario gregoriano falló. Calendar conversion failed for: %1. La conversión de calendario falló por: %1. DataObjectEditDialog %1: %1: Default Predeterminado Approximate Aproximado Exact Exacto Edit Data Object Editar objeto de datos New Data Object Nuevo objeto de datos DataPropertyEditDialog Name: Nombre: Title: Título: Descriptive name: Nombre descriptivo: Description: Descripción: Value type: Tipo de valor: Expression Expresión Number Número Text Texto Unit expression: Expresión de unidad: Use as key Usar como clave Case sensitive value Valor sensible a mayúsculas y minúsculas Approximate value Valor aproximado Value uses brackets Usa llaves Hide Ocultar Edit Data Property Editar propiedades de datos DataSetEditDialog General General Properties Propiedades Function Función Title: Título: Descriptive name: Nombre descriptivo: Data file: Archivo de datos: Description: Descripción: Copyright: Derechos de autor: Title Título Name Nombre Type Tipo Add Añadir Edit Editar Remove Eliminar Name: Nombre: Object argument name: Nombre del argumento de objeto: Property argument name: Nombre del argumento de propiedad: Default property: Propiedad por defecto: text texto approximate aproximado number número expression expresión key clave Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Data Sets Conjuntos de datos Object Objeto Property Propiedad Edit Data Set Editar conjunto de datos New Data Set Nuevo conjunto de datos DataSetsDialog Data Sets Conjuntos de datos Data sets: Conjuntos de datos: New… Nuevo… Edit… Editar… Delete Eliminar Objects: Objetos: Data set description: Descripción del conjunto de datos: Object attributes: Atributos de objeto: Properties Propiedades key clave Data Retrieval Function Función de recuperación de datos argument argumento ExpressionEdit matrix matriz vector vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero boolean booleano integer entero rational racional real real complex complejo number número (not matrix) (no matriz) unknown desconocido default assumptions suposiciones predeterminadas Prefix: Prefijo: Complex Angle/Phasor Notation Notación compleja de ángulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Decimal codificado en binario Bijective Base-26 Base biyectiva 26 Scientific Notation Notación científica Simple Notation Notación simple Binary Bumber número binario Binary Number Número binario Calendars Calendarios Complex cis Form Forma compleja cis Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma compleja exponencial Factors Factores 16-bit Floating Point Binary Format Formato binario de punto flotante de 16 bits 32-bit Floating Point Binary Format Formato binario de punto flotante de 32 bits 64-bit Floating Point Binary Format Formato binario de punto flotante de 64 bits 80-bit (x86) Floating Point Binary Format Formato binario de punto flotante de 80 bits (x86) 128-bit Floating Point Binary Format Formato binario de punto flotante de 128 bits Fraction Fracción Decimal Fraction Fracción decimal Hexadecimal Number Número hexadecimal Latitude Latitud Longitude Longitud Mixed Units Unidades mixtas Octal Number Número octal Optimal Units Unidades óptimas Optimal Unit Unidad óptima Optimal Prefix Prefijo óptimo Expanded Partial Fractions Fracciones parciales expandidas Complex Polar Form Forma compleja polar Complex Rectangular Form Forma compleja rectangular Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato de hora Unicode Unicode UTC Time Zone Huso horario UTC Engineering Notation Notación ingeniería Custom Personalizado Undo Deshacer Redo Rehacer Cut Cortar Copy Copiar Paste Pegar Delete Eliminar Calculate Selection Calcular selección Insert Date… Insertar fecha… Insert Matrix… Insertar matriz… Select All Seleccionar todos Clear Limpiar Clear History Limpiar historial Completion Completado No completion Sin completado Limited strict completion Completado estricto limitado Strict completion Completado estricto Limited full completion Completado completo limitado Full completion Completado completo Delayed completion Completado retrasado Enable input method Habilitar método de entrada Expression Status Estado de la expresión Off Desactivado In history list In expression field In status bar With delay Con retraso With adaptive delay Con retraso adaptativo Without delay Sin demora Automatically calculate selection Use input method Usar método de entrada Matrix Matriz Too many arguments for %1(). Demasiados argumentos para %1(). argument argumento %1: %1: comment comentario MC (memory clear) MC (limpiar la memoria) MS (memory store) MS (guardar en la memoria) M+ (memory plus) M+ (añadir a la memoria) M− (memory minus) M− (quitar de la memoria) factorize factorizar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binario binary number número binario roman romano roman numerals números romanos bijective biyectivo bijective base-26 base biyectiva 26 binary-coded decimal decimal codificado en binario sexagesimal sexagesimal sexagesimal number número sexagesimal latitude latitud longitude longitud 32-bit floating point punto flotante de 32 bits 64-bit floating point punto flotante de 64 bits 16-bit floating point punto flotante de 16 bits 80-bit (x86) floating point punto flotante de 80 bits (x86) 128-bit floating point punto flotante de 128 bits time tiempo time format formato de tiempo scientific científica scientific notation notación científica engineering ingeniería engineering notation notación ingeniería simple simple simple notation notación simple bases bases number bases bases numéricas calendars calendarios optimal óptima optimal unit unidad óptima prefix prefijo optimal prefix base base base units unidades base mixed mixtas mixed units unidades mixtas decimals decimal fraction fraction fracción factors factores base base units base partial fraction fracción parcial expanded partial fractions fracciones parciales expandidas rectangular rectangular cartesian cartesiano complex rectangular form forma compleja rectangular exponential exponencial complex exponential form forma compleja exponencial polar polar complex polar form forma compleja polar complex cis form forma compleja cis angle ángulo complex angle notation Notación compleja de ángulo phasor fasor complex phasor notation notación compleja de fasor UTC time zone huso horario UTC base number base base number base %1 base numérica %1 Data object Objeto de datos FPConversionDialog Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Format Formato 16-bit (half precision) 16-bit (precisión media) 32-bit (single precision) 32-bit (precisión simple) 64-bit (double precision) 64-bit (precisión doble) 80-bit (x86 extended format) 80-bit (formato extendido x86) 128-bit (quadruple precision) 128-bit (precisión cuádruple) Microchip 24-bit Microchip 32-bit Value Valor Decimal value Valor decimal Binary representation Representación binaria Hexadecimal representation Representación hexadecimal Floating point value Valor de punto flotante Conversion error Error de conversión FunctionEditDialog Required Requerido Details Detalles Description Descripción Name: Nombre: Expression: Expresión: Argument references: Referencias de argumentos: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y y z (per ejemplo, "(x+y)/2"), o \x, \y, \z, \a, \b, … (per ejemplo, "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilice x, y y z (ej: "(x+y)/2"), o \x, \y, \z, \a, \b, … (ej: "(\x+\y)/2") Category: Categoría: Descriptive name: Nombre descriptivo: Hide function Ocultar función Example: Ejemplo: Description: Descripción: Condition: Condición: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condición que debe ser verdadera para la función (por ejemplo, si el segundo argumento debe ser mayor que el primero: "\y > \x") Sub-functions: Subfunciones: Expression Expresión Precalculate Precalcular Reference Referencia Add Añadir Edit Editar Remove Eliminar Arguments: Argumentos: Name Nombre Type Tipo Warning Advertencia Conversion (using "to") is not supported in functions. Question Pregunta A function with the same name already exists. Do you want to overwrite the function? Una función con el mismo nombre ya existe. ¿Quiere sobreescribir la función? Edit Function Editar función New Function Nueva función FunctionsDialog Functions Funciones Category Categoría Function Función New… Nuevo… Edit… Editar… Deactivate Desactivar Delete Eliminar Calculate… Calcular… Apply Aplicar Insert Insertar Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera datos del conjunto de datos %1 para un objeto y propiedad determinada. Si "info" es ingresado como una propiedad, aparecerá una ventana de diálogo con todas las propiedades del objeto. Example: Ejemplo: Arguments Argumentos optional optional argument opcional default: argument default predeterminado: Requirement: Required condition for function Requisito: Properties Propiedades %1: %1: key indicating that the property is a data set key clave Activate Activar All All functions Todas Uncategorized Sin categorizar User functions Funciones de usuario Favorites Favoritos Inactive Inactivas HistoryView Insert Value Insertar valor Insert Text Insertar texto Copy Copiar Copy Formatted Text Copiar texto formateado Copy unformatted ASCII Copiar ASCII sin formato Select All Seleccionar todos Search… Buscar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática encima, ej: "5 + 2 / 3", y presiona la tecla enter. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Escribe una expresión matemática abajo, ej: "5 + 2 / 3", y presiona la tecla enter. Exchange rate source(s): updated %1 Comment Comentario Protect Proteger Add Comment… Añadir comentario… Move to Top Mover a la cima Remove Eliminar Clear Limpiar Edit Comment… Editar comentario… Text: Texto: Search Buscar KeypadButton <i>Right-click/long press</i>: %1 <i>Clic derecho / pulsación larga</i>: %1 <i>Right-click</i>: %1 <i>Clic derecho</i>: %1 <i>Long press</i>: %1 <i>Pulsación larga</i>: %1 Open menu Menú abierto <i>Middle-click</i>: %1 <i>Clic medio</i>: %1 KeypadWidget Memory store Guardar en la memoria Memory clear Limpiar la memoria Memory recall Valor de la memoria Memory add Añadir a la memoria Memory subtract Quitar de la memoria STO Standard calculator button. Do not use more than three characters. STO Store Guardar New function Nueva función sin sin cos cos tan tan Exponentiation Potenciación Percent or remainder Por ciento o resto Uncertainty/interval Incertidumbre/intervalo Relative error Error relativo Interval Intervalo Move cursor left Mover cursor a la izquierda Move cursor to start Mover cursor al principio Move cursor right Mover cursor a la derecha Move cursor to end Mover cursor al final Logical AND AND lógico Logical OR OR lógico Bitwise Exclusive OR OR exclusivo bit a bit Logical NOT NOT lógico Bitwise Left Shift Desplazamiento a la izquierda bit a bit Bitwise Right Shift Desplazamiento a la derecha bit a bit cmp rot a→1 Expand partial fractions Expandir fracciones parciales DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants Habilitar unidades en constantes físicas All constants Todas las constantes Percentage Calculation Tool Herramienta de cálculo de porcentaje more más All units Todas las unidades All variables Todas las variables Action Acción Interval Display Visualización de intervalo Adaptive Adaptativo Significant digits Cifras significativas Plus/minus Más/menos Relative Relativo Concise Interval Calculation Cálculo de intervalo Variance formula Fórmula de varianza Interval arithmetic Aritmética de intervalo Allow concise uncertainty input Complex number form Forma de número complejo Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Ã�ngulo/fasor Type Assumptions type Tipo Sign Assumptions sign Signo Default assumptions Suposiciones predeterminadas Number Número Real Real Rational Racional Integer Entero Boolean Booleano Unknown Unknown assumptions sign Desconocido Non-zero No cero Positive Positivo Non-negative No negativo Negative Negativo Non-positive No positivo Factorize Factorizar Expand Expandir Add column Add row Remove column Remove row Left parenthesis Paréntesis izquierdo Left vector bracket Paréntesis recto izquierdo de vector Right parenthesis Paréntesis derecho Right vector bracket Paréntesis recto derecho de vector Smart parentheses Paréntesis inteligentes Vector brackets Paréntesis rectos de vectores Argument separator Separador de argumentos Blank space Espacio en blanco New line Nueva línea Decimal point Punto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicación Button Action Label: Etiqueta: Action: Acción: None Ninguna Value: Valor: Bitwise AND AND bit a bit Bitwise Shift Desplazamiento bit a bit Delete Eliminar Backspace Retroceso Addition Suma Plus Más Subtraction Resta Minus Menos Division División Bitwise OR OR bit a bit Bitwise NOT NOT bit a bit Clear expression Limpiar expresión Calculate expression Calcular expresión NamesEditDialog Name Nombre Abbreviation Abreviación Plural Plural Reference Referencia Avoid input Evitar entrada Unicode Unicode Suffix Sufijo Case sensitive Distingue mayúsculas y minúsculas Completion only Solo completado Add Edit Editar Remove Eliminar Warning Advertencia Illegal name Nombre ilegal A function with the same name already exists. Una función con el mismo nombre ya existe. A unit or variable with the same name already exists. Una unidad o variable con el mismo nombre ya existe. PercentageCalculationDialog Percentage Porcentaje Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Cambio de 1 a 2 Change from 2 to 1 Cambio de 2 a 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ingresa dos valores, de los cuales como máximo uno es un porcentaje, y los otros serán calculados por tí. Clear Limpiar PeriodicTableDialog Periodic Table Tabla periódica Element Data Datos de elementos Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalinotérreo Lanthanide Lantánido Actinide Actínido Transition Metal Metal de transición Metal Metal Metalloid Metaloide Polyatomic Non-Metal No metal poliatómico Diatomic Non-Metal No metal diatómico Noble Gas Gas noble Unknown chemical properties Propiedades químicas desconocidas Unknown Desconocido %1: %1: PlotDialog Plot Graficar Data Datos Title: Título: Expression: Expresión: Function Función Vector/matrix Vector/matriz Paired matrix Matriz emparejada Rows Filas X variable: Variable X: Style: Estilo: Line Línea Points Puntos Line with points Linea con puntos Boxes/bars Cajas/barras Histogram Histograma Steps Pasos Candlesticks Candelabros Dots Punteado Polar Polar Smoothing: Suavizado: None Ninguna Monotonic Monotónico Natural cubic splines Spline cúbica natural Bezier Bezier Bezier (monotonic) Bezier (monotónico) Y-axis: Eje Y: Primary Primario Secondary Secundario Add Añadir Apply Aplicar Remove Eliminar Category Categoría Title Título Expression Expresión Function Range Rango de función Minimum x value: Valor mínimo de x: Maximum x value: Valor máximo de x: Sampling rate: Tasa de muestreo: Step size: Tamaño de paso: Show real and imaginary parts Appearance Apariencia Display grid Mostrar cuadrícula Display full border Mostrar borde completo Minimum y value: Valor mínimo de y: Maximum y value: Valor máximo de y: Logarithmic x scale: Escala logarítmica de x: Logarithmic y scale: Escala logarítmica de y: X-axis label: Etiqueta de eje x: Y-axis label: Etiqueta de eje y: Line width: Ancho de línea: Legend placement: Ubicación de leyenda: Top-left Superior izquierda Top-right Superior derecha Bottom-left Inferior izquierda Bottom-right Inferior derecha Below Abajo Outside Afuera Calculating… Calculando… Cancel Cancelar Processing… Procesando… PreferencesDialog Look && Feel Aparencia Numbers && Operators Números y operadores Units && Currencies Unidades y monedas Parsing && Calculation Cálculo y análisis Ignore system language (requires restart) Ignorar idioma del sistema (requiere reinicio) Allow multiple instances Permitir múltiples instancias Clear history on exit Limpiar historial al salir Close application with Escape key Keep above other windows Mantener encima de otras ventanas Window title: Título de ventana: Application name Nombre de aplicación Result Resultado Application name + result Nombre de aplicación + resultado Workspace Espacio de trabajo Application name + workspace Nombre de aplicación + espacio de trabajo Style: Estilo: Default (requires restart) Default style Predeterminado (requiere reinicio) Dark mode Modo oscuro Colorize result Colorear resultado Custom result font Fuente de resultado personalizada Custom expression font Fuente de expresión personalizada Custom keypad font Fuente de teclado personalizada Custom application font Fuente de aplicación personalizada Custom result font: Fuente de resultado personalizada: Custom expression font: Fuente de expresión personalizada: Custom status bar font: Fuente de la barra de estado personalizada: Custom keypad font: Fuente de teclado personalizada: Custom application font: Fuente de aplicación personalizada: Display expression status Mostrar estado de la expresión Delay: Retraso: Expression after calculation: Expresión después del cálculo: Keep expression Mantén la expresión Clear expression Limpiar expresión Replace with result Reemplazar con resultado Replace with result if shorter Reemplazar con resultado si es más corto Use keyboard keys for RPN Usar teclas del teclado para RPN Parsing mode: Modo de análisis: Adaptive Adaptativo Conventional Convencional Implicit multiplication first Multiplicación implícita primero Chain Cadena RPN RPN Read precision Leer precisión Limit implicit multiplication Limitar multiplicación implícita Interval calculation: Cálculo de intervalo: Variance formula Fórmula de varianza Interval arithmetic Aritmética de intervalo Factorize result Factorizar resultado Binary two's complement representation Representación binaria de complemento a dos Hexadecimal two's complement representation Representación hexadecimal de complemento a dos Use lower case letters in non-decimal numbers Usar letras minúsculas en números no decimales Spell out logical operators Deletrear operadores lógicos Use E-notation instead of 10^x Usar notación E en vez de 10^x Preferences Preferencias ms milliseconds ms Use E-notation instead of 10^n Usar notación E en vez de 10^n Use 'j' as imaginary unit Usar "j" como la unidad imaginaria Use comma as decimal separator Usar coma como separador decimal Ignore comma in numbers Ignorar comas en números Ignore dots in numbers Ignorar puntos en números Copy unformatted ASCII by default Copiar como ASCII no formateado por defecto Round halfway numbers away from zero Redondear números intermedios lejos de cero Round halfway numbers to even Redondear números intermedios a pares Indicate repeating decimals Indicar decimales repetidos Language: Idioma: Max history lines saved: Use caret for bitwise XOR Usar circunflejo para XOR bit a bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Formatear resultado Custom history font: Fuente de historial personalizada: Expression status: Estado de la expresión: Place expression field below history Off Desactivado In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Expresión en el historial: Parsed Analizado Parsed (compact) Entered Ingresado Entered + parsed Ingresado + analizado Entered + parsed (compact) Automatically copy result Copiar automáticamente el resultado Simplified percentage calculation Cálculo porcentual simplificado Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binario Hexadecimal Hexadecimal Binary bits: Automatic Automática Use special duodecimal symbols Use Unicode division slash in output Place percent button in number pad Indicate repeating decimals: Indicar decimales repetidos: Ellipsis Overline Digit grouping: Agrupamiento de dígitos: None Ninguna Standard Estándar Local Local Custom Personalizado Interval display: Visualización de intervalo: Significant digits Cifras significativas Interval Intervalo Plus/minus Más/menos Concise Midpoint Punto medio Lower Inferior Upper Superior Rounding: Truncate all numbers Truncar todos los números Complex number form: Forma de número complejo: Rectangular Rectangular Exponential Exponencial Polar Polar Angle/phasor Ã�ngulo/fasor Enable units Abbreviate names Abreviar nombres Use binary prefixes for information units Usar prefijos binarios para unidades de información Automatic unit conversion: Conversión automática de unidades: No conversion Sin conversión Base units Unidades base Optimal units Unidades óptimas Optimal SI units Unidades del SI óptimas Convert to mixed units Convertir a unidades mixtas Automatic unit prefixes: Prefijos automáticos: Copy unformatted ASCII without units Copiar como ASCII no formateado sin unidades Default currency: Moneda predeterminada: Fonts Fuentes Units Unidades Calculation Cálculo Restart required Please restart the program for the language change to take effect. Default Predeterminado Notify when a new version is available Notificar cuando una nueva versión está disponible Calculate as you type delay: Multiplication sign: Signo de multiplicación: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Ningún prefijos Prefixes for some units Prefijos para las unidades seleccionadas Prefixes also for currencies Prefijos también para monedas Prefixes for all units Prefijos para todas las unidades Enable all SI-prefixes Habilitar todos los prefijos del SI Enable denominator prefixes Habilitar prefijos de denominador Enable units in physical constants Habilitar unidades en constantes físicas Temperature calculation: Cálculo de temperatura: Absolute Absoluto Relative Relativo Hybrid Hibrido Exchange rates updates: Actualizaciones de tasas de cambio: %n day(s) %n día %n días days día día QApplication Execute expressions and commands from a file Ejecutar expresiones y comandos desde un archivo FILE ARCHIVO Start a new instance of the application Iniciar una nueva instancia de la aplicación Specify the window title Especificar el título de la ventana TITLE TÃ�TULO Update exchange rates Actualizar tasas de cambio Display the application version Mostrar la versión de la aplicación Open workspace Expression to calculate Expresión a calcular [EXPRESSION] [EXPRESIÓN] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por defecto, solo una instancia (una ventana principal) de %1 es permitida. Si múltiples instancias están abiertas simultáneamente, solo las definiciones (variables, funciones, etc.), modo, preferencias, e historia de la última ventana serán guardadas. ¿Quiere, a pesar de esto, cambiar el comportamiento predeterminado y permitir múltiples instancias simultáneas? Allow multiple instances? %1 is already running. Failed to load global definitions! Falla al cargar las definiciones globales! answer respuesta History Answer Value Valor de respuesta de historial History Index(es) Ã�ndice(s) de historial History index %s does not exist. Ã�ndice de historial %s no existe. Last Answer Última respuesta Answer 2 Respuesta 2 Answer 3 Respuesta 3 Answer 4 Respuesta 4 Answer 5 Respuesta 5 Memory Memoria Error Error Couldn't write preferences to %1 No se pudieron guardar las preferencias en %1 Function not found. Función no encontrada. Variable not found. Variable no encontrada. Unit not found. Unidad no encontrada. Unsupported base. Base no soportada. Unsupported value. QalculateQtSettings Update exchange rates? ¿Actualizar tasas de cambio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Ha pasado %n día desde la última actualización de las tasas de cambio. ¿Quiere actualizar las tasas de cambio ahora? Han pasado %n días desde la última actualización de las tasas de cambio. ¿Quiere actualizar las tasas de cambio ahora? Fetching exchange rates. Buscando tasas de cambio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Buscando tasas de cambio… Error Error Warning Advertencia Information Información Path of executable not found. Ruta de ejecutable no encontrada. curl not found. No se encontró curl. Failed to run update script. %1 Error al ejecutar el script de actualización. %1 Failed to check for updates. Fallo al buscar actualizaciones. No updates found. No se encontró ninguna actualización. A new version of %1 is available at %2. Do you wish to update to version %3? Una nueva versión de %1 está disponible en %2. ¿Quiere actualizar a la versión %3? A new version of %1 is available. You can get version %3 at %2. Una nueva versión de %1 está disponible. Puedes obtener la versión %3 en %2. Download %1: %2 Insert function Insertar función Insert function (dialog) Insertar función (diálogo) Insert variable Insertar variable Approximate result Negate Negar Invert Invertir Insert unit Insertar unidad Insert text Insertar texto Insert operator Insert date Insertar fecha Insert matrix Insertar matriz Insert smart parentheses Insertar paréntesis inteligentes Convert to unit Convertir a unidad Convert Convertir Convert to optimal unit Convertir a unidades óptimas Convert to base units Convertir a unidades base Convert to optimal prefix Convertir a prefijo óptimo Convert to number base Convertir a base numérica Factorize result Factorizar resultado Expand result Expandir resultado Expand partial fractions Expandir fracciones parciales RPN: down RPN: abajo RPN: up RPN: arriba RPN: swap RPN: intercambiar RPN: copy RPN: copiar RPN: lastx RPN: último x RPN: delete register RPN: eliminar registro RPN: clear stack RPN: limpiar pila Set expression base Definir base de expresión Set result base Definir base de resultado Set angle unit to degrees Definir unidad de ángulos a grados Set angle unit to radians Definir unidad de ángulos a radianes Set angle unit to gradians Definir unidad de ángulos a gradianes Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Alternar precisión Toggle max decimals Alternar decimales máximos Toggle min decimals Alternar decimales mínimos Toggle max/min decimals Alternar decimales máximos/mínimos Toggle RPN mode Alternar modo RPN Show general keypad Toggle programming keypad Alternar teclado de programación Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Buscar historial Clear history Limpiar historial Show variables Show functions Show units Show data sets Store result Guardar resultado MC (memory clear) MC (limpiar la memoria) MR (memory recall) MS (memory store) MS (guardar en la memoria) M+ (memory plus) M+ (añadir a la memoria) M− (memory minus) M− (quitar de la memoria) New variable Nueva variable New function Nueva función Open plot functions/data Abrir graficado de función/datos Open convert number bases Abrir conversión de bases numéricas Open floating point conversion Abrir conversión de punto flotante Open calender conversion Abrir conversión de calendario Open percentage calculation tool Abrir herramienta de cálculo de porcentaje Open periodic table Abrir tabla periódica Update exchange rates Actualizar tasas de cambio Copy result Copiar resultado Insert result Insertar texto Open mode menu Open menu Menú abierto Help Ayuda Quit Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Limpiar expresión Delete Eliminar Backspace Retroceso Home End Right Left Up Arriba Down Abajo Undo Deshacer Redo Rehacer Calculate expression Calcular expresión Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Predeterminado Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Menú Menu (%1) Menú (%1) New Nuevo Function… Función… Variable/Constant… Variable/constante… Unknown Variable… Variable desconocida… Matrix… Matriz… Workspaces Espacios de trabajo Open… Abrir… Open default Abrir predeterminado Save Guardar Save As… Guardar como… Import CSV File… Importar archivo CSV… Export CSV File… Exportar archivo CSV… Functions Funciones Variables and Constants Variables y constantes Units Unidades Plot Functions/Data Graficar funciones/datos Floating Point Conversion (IEEE 754) Conversión de punto decimal (IEEE 754) Calendar Conversion Conversión de calendario Update Exchange Rates Actualizar tasas de cambio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Modo de cadena Keyboard Shortcuts Atajos de teclado Preferences Preferencias Help Ayuda Report a Bug Reportar un error Check for Updates Buscar actualizaciones About %1 Acerca de %1 Quit Cerrar Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de visualización general Normal Normal Scientific Científica Engineering Ingeniería Simple Simple Angle Unit Unidad de ángulo Radians Radianes Degrees Grados Gradians Gradianes Approximation Aproximación Automatic Automatic approximation Automática Dual Dual approximation Dual Exact Exact approximation Exacto Approximate Aproximado Assumptions Suposiciones Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Entero Boolean Booleano Sign Assumptions sign Signo Unknown Unknown assumptions sign Desconocido Non-zero No cero Positive Positivo Non-negative No negativo Negative Negativo Non-positive No positivo Result Base Base de resultado Binary Binario Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Otra Approximation and Fractions Aproximación y fracciones Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de fecha Roman numerals Números romanos Unicode Unicode Bijective base-26 Base biyectiva 26 Binary-coded decimal (BCD) Decimal codificado en binario Custom: Number base Expression Base Base de expresión Other: Number base Otro: Precision: Precisión: Min decimals: Decimales mínimos: Max decimals: Decimales máximos: off Max decimals Desactivado Convert Convertir Convert (%1) Convertir (%1) Store Guardar Store (%1) Guardar (%1) Functions (%1) Funciones (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidad… Data Sets Conjuntos de datos Percentage Calculation Tool Herramienta de cálculo de porcentaje Periodic Table Tabla periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Graficar funciones/datos (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binario: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pila RPN Rotate the stack or move the selected register up (%1) Rotar la pila o mover el registro seleccionado hacia arriba (%1) Rotate the stack or move the selected register down (%1) Rotar la pila o mover el registro seleccionado hacia abajo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila (%1) Copy the selected or top value to the top of the stack (%1) Copiar el primer valor o el seleccionado encima de la pila (%1) Enter the top value from before the last numeric operation (%1) Ingresar el primer valor previo a la última operación numérica (%1) Delete the top or selected value (%1) Eliminar el primer valor o el valor seleccionado (%1) Clear the RPN stack (%1) Limpiar la pila RPN (%1) New Function… Nueva función… Favorites Favoritos Recent Recientes User functions Funciones de usuario Open dialog Abrir cuadro de diálogo Show all functions Mostrar todas las funciones User units Unidades de usuario more más Prefixes Prefijos Show all units Mostrar todas las unidades User variables Variables de usuario Show all variables Mostrar todas las variables Powerful and easy to use calculator Calculadora poderosa y fácil de usar License: GNU General Public License version 2 or later Error Error Couldn't write definitions No se pudo guardar las definiciones hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binario roman romano bijective biyectivo sexagesimal sexagesimal latitude latitud longitude longitud time tiempo Time zone parsing failed. Analizado de husos horarios falló. bases bases calendars calendarios rectangular rectangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ángulo optimal óptimas base base mixed mixtas fraction fracción factors factores Show toolbar Open Settings Folder(s) Number Pad Teclado numérico Always Show Number Pad Mostrar siempre el teclado numérico EXACT EXACT APPROX APPROX RPN RPN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy Copiar <i>Middle-click</i>: %1 <i>Clic medio</i>: %1 scientific científica engineering ingeniería simple simple prefix prefijo base base units base partial fraction fracción parcial base number base base decimals factorize factorizar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operación RPN Factorizing… Factorizando… Expanding partial fractions… Expandiendo fracciones parciales… Expanding… Expandiendo… Converting… Convirtiendo… RPN Register Moved Registro RPN movido Processing… Procesando… Matrix Matriz Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode Modo de cálculo de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). La expresión es ambigua. Por favor seleccione el modo de cálculo de temperatura (el modo puede ser cambiado después en las preferencias). Absolute Absoluto Relative Relativo Hybrid Hibrido Please select desired variant of the sinc function. Por favor seleccione la variante deseada de la función sinc. Unnormalized No normalizado Normalized Normalizado Interpretation of dots Interpretación de los puntos Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Por favor seleccione la interpretación de los puntos (\".\") (esto puede ser cambiado después en las preferencias). Both dot and comma as decimal separators Ambos punto y coma como separadores decimales Dot as thousands separator Punto como separador de miles Comma as thousands separator Only dot as decimal separator Solo punto como separador decimal Parsing Mode Modo de análisis The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). La expresión es ambigua. Por favor seleccione interpretación de expresiones con multiplicación implícita (esto puede ser cambiado después en las preferencias). Implicit multiplication first Multiplicación implícita primero Conventional Convencional Adaptive Adaptativo Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Añadir acción (%1) Edit Keyboard Shortcut New Keyboard Shortcut Nuevo atajo de teclado Action: Acción: Value: Valor: Set key combination Definir combinación de teclas Press the key combination you wish to use for the action. Presiona la combinación de teclas que quieres usar para la acción. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? La combinación de teclas ta está en uso. ¿Quiere remplazar la acción actual (%1)? Question Pregunta Add… Añadir… Edit… Editar… Remove Eliminar Gnuplot was not found No se encontró Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) tiene que estar instalado por separado, tiene que y encontrarse en la ruta de búsqueda para que el graficado funcione. Example: Example of function usage Ejemplo: Enter RPN Enter Ingresar Calculate Calcular Apply to Stack Aplicar a la pila Insert Insertar Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again No preguntar de nuevo Keep open Mantener abierto Value Valor Argument Argumento %1: %1: Approximation && Fractions Aproximación y fracciones Plot Graficar General General Programming Programación Algebra Ã�lgebra Custom Personalizado None Ninguna Show Custom Column Mostrar columna personalizada Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Clic derecho / pulsación larga</i>: %1 Open menu Menú abierto Number Bases Bases numéricas Conversion operator Operador de conversión Rotate the stack or move the selected register up Rotar la pila o mover el registro seleccionado hacia arriba Rotate the stack or move the selected register down Rotar la pila o mover el registro seleccionado hacia abajo Swap the top two values or move the selected value to the top of the stack Intercambiar los dos primeros valores o mover el valor seleccionado encima de la pila Delete the top or selected value Eliminar el primer valor o el valor seleccionado Enter the top value from before the last numeric operation Ingresar el primer valor previo a la última operación numérica Copy the selected or top value to the top of the stack Copiar el primer valor o el seleccionado encima de la pila Clear the RPN stack Limpiar la pila RPN Comma as separator for function arguments and matrix/vector elements Action Acción Key combination Combinación de teclas True Verdadero False False Info Información optional optional argument opcional Failed to open %1. %2 Fallo al abrir %1. %2 UnitEditDialog General General Relation Relación Name: Nombre: Category: Categoría: Descriptive name: Nombre descriptivo: System: Sistema: Imperial Imperial US Survey Tradicional EE.UU. (US Survey) Hide unit Ocultar unidad Description: Descripción: Class: Clase: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La clase a la que esta unidad pertenece. Las unidades de alias son definidas en relación a otra unidad, las unidades compuestas son una composición de un número de otras unidades. Las unidades base no son definidas en relación a otras unidades. Base unit Unidad base Named derived unit Unidad derivada nombrada Derived unit Unidad derivada Base unit(s): Unidad(es) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unidad (para unidad alias) o unidades (para unidades compuestas) con las que esta unidad está definida Exponent: Exponente: Relation: Relación: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relación con la unidad base. Para relaciones lineares esto debería ser un número.<br><br>Para relaciones no lineares use \x para el factor e \y para el exponente (ej: "\x + 273,15" para la relación entre grados Celsius y Kelvin). Inverse relation: Relación inversa: Specify for non-linear relation, for conversion back to the base unit. Especificar para relación no linear, para la conversión de vuelta a la unidad base. Mix with base unit Combinar con la base unidad Priority: Prioridad: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Número mínimo de unidad base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Usar con prefijos por defecto Error Error Base unit does not exist. La unidad base no existe. Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? A variable or unit with the same name already exists. Do you want to overwrite it? Una variable o unidad con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Unit Editar unidades New Unit Nueva unidad UnitsDialog Units Unidades Category Categoría Unit Unidad New… Nuevo… Edit… Editar… Deactivate Desactivar Delete Eliminar Convert Convertir Insert Insertar Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Activar All All units Todas Uncategorized Sin categorizar User units Unidades de usuario Favorites Favoritos Inactive Inactivas UnknownEditDialog Name: Nombre: Custom assumptions Suposiciones personalizadas Type: Tipo: Sign: Signo: Temporary Temporal Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Unknown Variable Editar variable desconocida New Unknown Variable Nueva variable desconocida VariableEditDialog Name: Nombre: Temporary Temporal Value: Valor: Required Requerido Description Descripción current result resultado actual Category: Categoría: Descriptive name: Nombre descriptivo: Hide variable Ocultar variable Description: Descripción: Question Pregunta A unit or variable with the same name already exists. Do you want to overwrite it? Una unidad o variable con el mismo nombre ya existe. ¿Quiere sobreescribirla? Edit Variable Editar variable New Variable Nueva variable VariablesDialog Variables Variables Category Categoría Variable Variable New Nuevo Variable/Constant… Variable/constante… Unknown Variable… Variable desconocida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desactivar Delete Eliminar Insert Insertar Favorite Favorito a matrix una matriz a vector un vector positive positivo non-positive no positivo negative negativo non-negative no negativo non-zero no cero integer entero boolean booleano rational racional real real complex complejo number número not matrix no matriz unknown desconocido Default assumptions Suposiciones predeterminadas Activate Activar All All variables Todas Uncategorized Sin categorizar User variables Variables de usuario Favorites Favoritos Inactive Inactivas qalculate-qt-5.11.0/translations/qalculate-qt_fr.ts000066400000000000000000017226571520501070600223700ustar00rootroot00000000000000 Calculator Calculatrice Powerful and easy to use calculator Une calculatrice puissante et facile d'utilisation calculation;arithmetic;scientific;financial; calcul;arithmétique;scientifique;financier; Qalculate! (GTK UI) Qalculate! (GTK UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! est une calculatrice de bureau polyvalente et multi-plateforme. Elle est simple d'utilisation mais offre une puissance et une polyvalence normalement réservées aux logiciels de mathématique complexe, ainsi que d'outils utiles au quotidien (tels que la conversion de devises et le calcul de pourcentages). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Les fonctionnalités incluent une grande bibliothèque de fonctions personnalisables, d'unités de calculs et de conversion, de constantes physiques, de calculs symboliques (y compris les intégrales et équations), de précision arbitraire, de propagation des incertitudes, d'arithmétique d'intervalle, de traçage et une interface facile d'utilisation. Argument Rules Règles d'argument _Cancel _Fermer Do not save modifications Ne pas sauvegarder les modifications _OK _OK Accept the modification of argument rules Accepter la modification des règles d'argument Argument name Nom d'argument Free Libre Number Nombre Integer Entier Symbol Symbole Text Texte Date Date Vector Vecteur Matrix Matrice Positive number Nombre positif Non-zero number Nombre non nul Non-negative number Nombre positif ou nul Positive integer Entier positif Non-zero integer Entier non nul Non-negative integer Entier positif ou nul Boolean Booléen Object Objet Function Fonction Unit Unité Variable Variable File Fichier Angle Angle Data object Données de l'objet Data property Propriété des données Enable rules and type test Activer les règles et le type de test Custom condition Condition personnalisée For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Par exemple, si l'argument est une matrice qui doit être égal au nombre de lignes et de colonnes : lignes(\x) = colonnes(\x) Allow matrix Autoriser matrice Forbid zero Interdire zéro Handle vector Manche de vecteur Calculate function for each separate element in vector. Calculer la fonction de chaque élément distinct du vecteur. Min Min Include equals Inclure les égalités Max Max Type Type Name Nom Customize Keypad Buttons Personnaliser les boutons du clavier _Close _Fermer Label Intitulé Left-click Clic gauche Right-click Clic droit Middle-click Clic du milieu Reset Réinitialiser Button Action Bouton d'action Value Valeur Calendar Conversion Conversion calendrier Export CSV File Exporter en fichier CSV Current result Résultat actuel Matrix/vector variable Variable matrice/vecteur Delimiter Délimiteur Comma Virgule Tabulator Tabulation Semicolon Point virgule Space Espace Other Autre Import CSV File Importer un fichier CSV Do not import the file Ne pas importer le fichier Import the file Importer le fichier Import as Importer comme Descriptive name Nom descriptif Category Catégorie First row Première ligne Name of the data file to import Nom du fichier de données à importer If a matrix shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Vectors Vecteurs If vectors shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Name (or name prefix) used to reference generated variable(s) in expressions Nom (ou préfixe de nom) utilisé pour référencer les variables générées dans les expressions Title displayed in menus and in variable manager Titre affiché dans les menus et dans le gestionnaire de variables The first row with data to import in the file La première ligne de données à importer dans le fichier Includes headings Inclure les en-têtes If the first row contains column headings Si la première ligne contient des en-têtes de colonne Delimiter used to separate columns in the file Délimiteur utilisé pour séparer les colonnes du fichier Custom delimiter Délimiteur personnalisé Edit Data Property Éditer propriété des données Description Description Value Type Type de valeur Use as key Utiliser comme clé Case sensitive value Valeur sensible à la casse Approximate value Valeur approximative Value uses brackets Valeur utilise des crochets Hide Cacher Unit expression Expression d'unité Expression Expression Name used for reference Nom utilisé pour référencement Title displayed in menus and in data set manager Titre affiché dans les menus et dans le gestionnaire d'ensembles de données Description of this data property Description de cette propriété de données Edit Data Set Éditer l'ensemble de données Data file Fichier de données Copyright Copyright Description of this data set Description de cet ensemble de données General Général Properties: Propriétés : Definition of the properties of this data set Définition des propriétés de cet ensemble de données _New _Nouveau _Edit _Éditer _Delete _Supprimer Properties Propriétés Object argument name Nom d'argument de l'objet Property argument name Nom d'argument de propriété Default property Propriété par défaut Name used to invoke the function in expressions Nom utilisé pour invoquer la fonction dans les expressions Edit Data Object Éditer les données d'objet Do not create/modify this data object Ne pas créer/modifier cette donnée de l'objet Accept the creation/modification of this data object Accepter la création/modification de cette donnée d'objet Data Sets Ensembles de données Data Set Ensemble de données Create a new data set Créer un nouvel ensemble de données Edit the selected data set Éditer l'ensemble de données sélectionné Delete the selected data set Supprimer l'ensemble de données sélectionné Objects Objets Create a new data object Créer un nouveau objet de données Edit the selected data object Éditer les données de l'objet sélectionné Remove the selected data object Supprimer les données de l'objet sélectionné Data Set Description Description de l'ensemble de données Object Attributes Attributs d'objet Decimals Décimales Close this window Fermer cette fenêtre Min decimals Décimales min Max decimals Décimales max Minimal number of displayed decimals Nombre minimal de décimales à afficher Maximal number of decimals to display (and round to) Nombre maximal de décimales à afficher (et arrondir à). Floating Point Conversion Conversion en virgule flottante Hexadecimal representation Représentation hexadécimale Conversion error Erreur de conversion Binary representation Représentation binaire Floating point value Valeur en virgule flottante Format Format 16-bit (half precision) 16-bit (demi-précision) 32-bit (single precision) 32-bit (simple précision) 64-bit (double precision) 64-bit (double précision) 80-bit (x86 extended format) 80-bit (format x86 étendu) 128-bit (quadruple precision) 128-bit (quadruple précision) Microchip 24-bit Microchip 24-bit Microchip 32-bit Microchip 32-bit Edit Function Éditer la fonction _Help _Aide Name used to invoke this function in expressions Nom utilisé pour invoquer la fonction dans les expressions Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Utiliser \x pour le premier, \y pour le second et \z pour le troisième argument. Pour plus d'informations, cliquer sur le bouton d'Aide. Required Requis Condition Condition Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condition qui doit être vraie pour la fonction (ex : si le second argument doit être plus grand que le premier : "\y > \x") Sub-functions Sous-fonctions _Add _Ajouter _Remove _Supprimer Arguments Arguments Details Détails Title displayed in menus and in function manager Titre affiché dans les menus et dans le gestionnaire des fonctions Hide function Cacher fonction Example Exemple Precalculate Précalculer If this function shall be hidden in menus Si cette fonction doit être cachée dans les menus Functions Fonctions Categor_y Catégor_ie _Function _Fonction Descri_ption Descri_ption Create a new function Créer une nouvelle fonction Edit the selected function Éditer la fonction sélectionnée Delete the selected function Supprimer la fonction sélectionnée (De)activate the selected function (Dés)activer la fonction sélectionnée Deacti_vate Désacti_ver _Calculate _Calculer Insert (or execute) the selected function into the expression entry Insérer (ou exécuter) la fonction sélectionnée dans l'expression entrée _Apply _Appliquer Apply the selected function to the current expression Appliquer la fonction sélectionnée à l'expression actuelle Degrees Degrés Radians Radians Gradians Grades Default assumptions Suppositions par défaut Unknown Inconnue Not Matrix Pas de matrice Complex Complexe Real Réel Rational Rationnel Non-Zero Non nul Positive Positif Non-Negative Positif ou nul Negative Négatif Non-Positive Négatif ou nul _File _Fichier Unknown Variable Variable de l'inconnue Import CSV File… Importer un fichier CSV… Export CSV File… Exporter en fichier CSV… _Store Result… _Enregistrer le résultat… Save Result Image… Sauvegarder l'image de résultat… Save local functions, variables and units Sauvegarder les fonctions locales, variables et unités Save Definitions Sauvegarder les définitions Import Definitions File… Importer fichier de définitions… Fetch current exchange rates from the Internet Récupérer les taux de change actuels sur Internet Update Exchange Rates Mettre à jour les taux de change Plot Functions/Data Fonctions/Données du Graph Convert Number Bases Convertir les bases numériques Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Percentage Calculation Tool Outil de calcul de pourcentages Periodic Table Tableau périodique Minimal Window Fenêtre minimale _Quit _Quitter Variables Variables Units Unités Factorize Factoriser Expand Développer Apply partial fraction decomposition to the current result. Appliquer une décomposition de fraction partielle au résultat actuel. Expand Partial Fractions Développer les fractions partielles Set Unknowns… Définir les inconnues… Convert to Unit Convertir vers l'unité Set Prefix Définir le préfixe Convert to Unit Expression… Convertir en expression unitaire… Convert to Base Units Convertir en unités de base Convert to Optimal Unit Convertir en unité optimale Insert Date… Insérer une date… Insert Matrix… Insérer une matrice… Insert Vector… Insérer un vecteur… _Copy Result _Copier le résultat Copy Result as Unformatted ASCII Copier le résultat en ASCII non formaté Keyboard Shortcuts Raccourcis clavier _Preferences _Préférences _Mode _Mode Number Base Base numérique Select Result and Expression Base… Sélectionner le résultat et la base d'expression… Binary Binaire Octal Octal Decimal Décimal Duodecimal Duodécimal Hexadecimal Hexadécimal Other… Autre… Sexagesimal Sexagésimal Time Format Format de l'heure Roman Numerals Chiffres romains Numerical Display Affichage numérique Normal Normal Engineering Ingénieur Scientific Scientifique Purely Scientific Purement scientifique Simple Simple Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Désactivé : 1/7 ≈ 0,14285714 Activé : 1/7 = 0,142857 142857... Indicate Repeating Decimals Indiquer les décimales répétitives Show Ending Zeroes Afficher les zéros de fin Off: -x + y On: y - x Désactivé : -x + y Activé : y - x Sort Minus Last Trier les moins en dernier Round Halfway Numbers Away from Zero Arrondir les nombres à mi-chemin par rapport à zéro Round Halfway Numbers to Even Arrondir les nombres à mi-chemin pour égaliser Other Rounding Methods Autres méthodes d'arrondi Round Halfway Numbers to Odd Arrondir les nombres à mi-chemin à impairs Round Halfway Numbers Toward Zero Arrondir les nombres à mi-chemin vers zéro Round Halfway Numbers to Random Arrondir les nombres à mi-chemin au hasard Round Halfway Numbers Up Arrondir les chiffres à mi-chemin vers le haut Round Halfway Numbers Down Arrondir les chiffres à mi-chemin vers le bas Round Toward Zero Arrondir vers zéro Round Away from Zero Arrondir à partir de zéro Round Up Rassembler Round Down Arrondir vers le bas Complex Rectangular Form Forme algébrique complexe Complex Exponential Form Forme exponentielle complexe Complex Polar Form Forme polaire complexe Complex Angle/Phasor Notation Notation complexe angle/phaseur Rational Number Form Forme nombre rationnel 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Fractions décimales 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Fractions décimales exactes 6/4 = 3/2 6/4 = 3/2 Simple Fractions Fractions simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Fractions mixtes Mixed Mixed fraction Mixte Interval Display Affichage d'intervalle Off: 1/2 × pi ≈ 1.5707963 On: 1/2 × pi = 0.5 pi Désactivé : 1/2 × pi ≈ 1,5707963 Activé : 1/2 × pi = 0,5 pi Adaptive Adaptif Calculates an interval of possible values and keeps track of precision changes. Calcule un intervalle de valeurs possibles et assure le suivi des modifications de précision. Significant Digits Chiffres significatifs Interval Intervalle Plus/Minus Plus/Moins Relative Relatif Concise Concis Midpoint Point du milieu Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Unit Display Affichage de l'unité Do not use any prefixes in result Ne pas utiliser de préfixes dans le résultat Show prefixes for primarily SI and CGS units. Afficher les préfixes pour les unités principalement SI et CGS. Use prefixes for selected units Utiliser des préfixes pour les unités sélectionnées Use prefixes also for currencies Utiliserz également des préfixes pour les devises Use prefixs for all units Utiliser des préfixes pour toutes les unités Enables automatic use of hekto, deka, deci and centi when prefixes are enabled Active automatiquement l'utilisation de hekto, déka, déci et centi lorsque les préfixes sont activés Enable All SI Prefixes Activer tous les préfixes SI Enables automatic setting of prefix for denominator in addition to the numerator Permet la définition automatique du préfixe du dénominateur en plus du numérateur Enable Denominator Prefixes Activer les préfixes du dénominateur Off: J / K On: J·K^-1 Désactivé : J / K Activé : J·K^-1 Negative Exponents Exposants négatifs Off: (2 m)/s On: 2 (m/s) Désactivé : (2 m)/s Activé : 2 (m/s) Place Units Separately Placer les unités séparément No Additional Conversion Aucune conversion supplémentaire Convert to Optimal SI Unit Convertir en unité SI optimale If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Si activé : 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Convertir en unités mixtes Abbreviate Names Noms abrégés Enabled Objects Objets activés Unknowns Inconnues Units in Physical Constants Unités en constantes physiques If not enabled, treats all variables as unknown S'il n'est pas activé, traite toutes les variables comme des inconnues Calculate Variables Calculer les variables Disables/enables complex numbers in result Désactive/active les nombres complexes dans le résultat Allow Complex Result Autoriser les résultats complexes Disables/enables infinite numbers in result Désactive/active les nombres infinis comme résultat Allow Infinite Result Autoriser infini comme résultat Approximation Approximation Always Exact Toujours exact Try Exact Essayer exactitude Approximate Approximatif Interval Arithmetic Arithmétique des intervalles Interval Calculation Calcul d'intervalle Variance Formula Formule d'écart Change angle unit used in trigonometric functions Changer l'unité d'angle utilisée dans les fonctions trigonométriques Angle Unit Unité d'angle None Aucune Assumptions Suppositions Algebraic Mode Mode algébrique Assume that unknown denominators are non-zero Supposons que les dénominateurs inconnus soient différents de zéro Non-Zero Denominators Dénominateurs non nuls Warn when unknown denominators are assumed non-zero Avertir lorsque des dénominateurs inconnus sont supposés différents de zéro Warn About Denominators Assumed Non-Zero Avertir des dénominateurs supposés non nuls Parsing Mode Mode d'analyse Adaptive Parsing Analyse adaptative Parse Implicit Multiplication First Analyser d'abord la multiplication implicite Conventional Parsing Analyse conventionnelle Chain Syntax Syntaxe de la chaîne RPN Syntax Syntaxe NPI Off: 100 + 20% = 100 + 20/100 = 100.2 On: 100 + 20% = 100 × 120% = 120 Désactivé: 100 + 20% = 100 + 20/100 = 100,2 Activé: 100 + 20% = 100 × 120% = 120 no-c-format Simplified Percentage Calculation Calcul de pourcentage simplifié Off: xy = x × y On: xy != x × y Désactivé : xy = x × y Activé : xy != x × y Limit Implicit Multiplication Limiter la multiplication implicite Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 × 1.1 = 1.21 On: 1.1 × 1.1 ≈ 1.2 Analyser les nombres décimaux de manière approximative avec une précision égale au nombre de chiffres. Désactivé: 1.1 × 1.1 = 1.21 Activé: 1.1 × 1.1 ≈ 1.2 Read Precision Lire précision _Precision _Précision _Decimals _Décimals Calculate As You Type Calcul lors de la saisie Chain Mode Mode chaîne Activate the RPN stack. Activer la pile NPI. RPN Mode Mode NPI Meta Modes Modes méta Save Mode… Sauvegarder mode… Delete Mode… Supprimer mode… Save Default _Mode Sauvegarder _Mode par défaut Fu_nctions Fo_nctions _Variables _Variables _Units _Unités _Contents Manuel Report a Bug Reporter un bug Check for Updates Vérifier les mises à jour _About _À propos Toggle minimal window Basculer en fenêtre minimale Calculation result Résultat du calcul _Keypad _Clavier Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Active/désactive le clavier permanent (permet d'afficher simultanément le clavier et l'historique) _History _Historique C_onversion C_onversion RPN Stack Pile NPI Insert the selected value Insérer la valeur sélectionnée Insert the selected text Insérer le texte sélectionné Copy the selected text Copier le texte sélectionné Add the selected value(s) Ajouter la valeur selectionnée Subtract the selected value(s) Soustraire les valeurs sélectionnées Multiply the selected value(s) Multiplier les valeurs sélectionnées Divide the the selected value(s) Diviser les valeurs sélectionnées Raise to the power of the selected value Élever la valeur sélectionnée à la puissance Calculate the square root of the selected value Calculer la racine carrée de la valeur sélectionnée History Historique Subtract the top value from the second value Soustrayez la valeur supérieure de la deuxième valeur Multiply the top two values Multipliez les deux premières valeurs Divide the second value by the top value Divisez la deuxième valeur par la valeur supérieure Raise the second value to the power of the top value Augmentez la deuxième valeur à la puissance de la valeur supérieure Negate the top value (Ctrl+-) Annuler la valeur supérieure (Ctrl+-) Invert the top value Inverser la valeur supérieure Calculate the square root of the top value Calculer la racine carrée de la valeur supérieure Calculate the sum of all values Calcule la somme de toutes les valeurs Rotate the stack or move selected register up Faire pivoter la pile ou déplacer le registre sélectionné vers le haut Rotate the stack or move selected register down Faire pivoter la pile ou déplacer le registre sélectionné vers le bas Swap the two top values or move the selected value to the top of the stack Échangez les deux valeurs supérieures ou déplacez la valeur sélectionnée vers le haut de la pile Copy the selected or top value to the top of the stack Copiez la valeur sélectionnée ou supérieure en haut de la pile Enter the top value from before the last numeric operation Entrez la valeur supérieure avant la dernière opération numérique Delete the top or selected value Supprimer la valeur supérieure ou sélectionnée Edit the selected value Éditer la valeur sélectionnée Clear the RPN stack Vider la pile NPI Unit(s) and prefix to convert result to Unité(s) et préfixe vers lesquels convertir le résultat Convert Convertir Continuous conversion Conversion continue Automatically convert result to the current unit expression as long as the conversion box is visible. Converti automatiquement le résultat dans l'expression unité actuel aussi longtemps que la boîte de conversion est visible. Add prefix Ajouter préfixe If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Si l'expression unitaire ne contient pas de préfixe, utiliser le préfixe optimal. Ceci peut être écrasé en ajoutant à l'expression unitaire "?" ou "0". Conversion Conversion Show/hide programming keypad Afficher/masquer le clavier de programmation Exact Exact Fraction Fraction Numerical display Affichage numérique Pure Pur Number base Base numérique Time format Format de l'heure Roman Romain sin sin cos cos tan tan ln ln Equals Égal sqrt sqrt sum sum Unknown variable Variable inconnue mod mod mean moyenne Store result as a variable Enregistrer le résultat sous forme de variable STO Standard calculator button. Do not use more than three characters. STO Convert number bases Convertir des bases numériques Imaginary unit i (√-1) Unité imaginaire i (√-1) Manage units Gérer les unités Conversion operator Opérateur de conversion Kilogram Kilogramme Two's complement input Entrée du complément à deux Two's complement output Sortie du complément à deux Bitwise Exclusive OR Bitwise Exclusive OR Bitwise Left Shift Décalage gauche Bitwise Bitwise Right Shift Décalage droite Bitwise Floating point conversion Conversion en virgule flottante Show/hide left keypad Afficher/masquer le clavier gauche Show/hide right keypad Afficher/masquer le clavier droite DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Résultat précédent ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Ajouter à l'expression Persistent Keypad Clavier permanent Edit Éditer Delete Supprimer Update Mettre à jour Insert Value Insérer valeur Insert Text Insérer texte Insert Parsed Text Insérer texte analysé Copy Copier Copy Unformatted ASCII Copier ASCII non formaté Copy Full Text Copier le texte entier Search… Rechercher… Search by Date… Rechercher par date… Add Bookmark… Ajouter favoris… Bookmarks Favoris Protect Protéger Move To Top Se déplacer en haut Remove Supprimer Clear All Effacer tout Show Parsed Expression Afficher l'expression analysée Show Result Afficher le résultat _Copy _Copier _Store… _Enregistrer… Save Image… Sauvegarder l'image… _Factorize _Factoriser _Expand _Développer _Normal _Normal Sc_ientific Sc_ientifique Purel_y Scientific Puremen_t scientifique Simp_le Simp_le _Binary _Binaire _Octal _Octal _Decimal _Décimal _Hexadecimal _Hexadécimal Decimal Fraction Fraction décimale Exact Decimal Fraction Fraction décimale exacte Simple Fraction Fraction simple Mixed Fraction Fraction mixte _Abbreviate Names _Noms abrégés C_onvert… C_onvertir… Convert to Base _Units Convertir en _unités de base Convert _to Optimal Unit Convertir _en unité optimale Use Optimal Prefix Utiliser le préfixe optimal Convert to Convertir vers Convert to UTC Convertir vers UTC Convert to Calendars Convertir vers calendriers Use prefixes for all units Utiliser des préfixes pour toutes les unités Enable All SI Prefi_xes Activer tous SI Prefi_xes View/Edit Matrix Afficher/éditer matrice View/Edit Vector Afficher/Éditer vecteur Show Parsed Expression in Result Field Afficher l'expression analysée dans le champ de résultat Copy Text Copier texte To Top En haut Swap Échanger Up Haut Down Bas Negate Rejeter Invert Intervertir Square Carré Square Root Racine carrée Clear Stack Vider pile Select Number Base… Sélectionner la base numérique… Display Expression Status Afficher l'état de l'expression Store result Enregistrer résultat Add result Add current result to variable value Ajouter résultat Subtract result Subtruct current result from variable value Soustraire résultat _Insert _Insérer Insert the matrix/vector into the expression Insérer la matrice/vecteur dans l'expression Elements Éléments Number of rows in this matrix (rows displayed for vectors) Nombre de lignes dans cette matrice (lignes affichées pour les vecteurs) Number of columns in this matrix (columns displayed for vectors) Nombre de colonnes dans cette matrice (colonnes affichées pour les vecteurs) If this is a matrix or vector Si c'est une matrice ou un vecteur Current element: Élément actuel : Edit Matrix Éditer matrice Accept the creation/modification of this matrix/vector Accepter la création/modification de cette matrice/vecteur Name used to reference this variable in expressions Nom utilisé pour référencer cette variable dans les expressions Temporary Temporaire Hide variable Cacher variable Names Noms Number Bases Bases numériques Binary value Valeur binaire Decimal value Valeur décimale Octal value Valeur octale Roman numerals Chiffres romains Hexadecimal value Valeur hexadécimale Show/hide keypad Afficher/masquer le clavier BIN BIN OCT OCT DEC DÉC DUO DUO HEX HEX ROM ROM Subtract Soustraire Multiply Multiplier Divide Diviser Bitwise AND Bitwise AND Bitwise OR Bitwise OR Bitwise NOT Bitwise NOT Clear Effacer Enter two values, of which at most one is a percentage, and the others will be calculated for you. Entrez deux valeurs, dont au plus une est un pourcentage, et les autres seront calculées pour vous. Percentage Pourcentage Calculate Calculer Value 1 Valeur 1 2 compared to 1 2 comparé à 1 Change from 1 to 2 Différence de 1 à 2 Value 2 Valeur 2 1 compared to 2 1 comparé à 2 Change from 2 to 1 Différence de 2 à 1 Plot Graph _Save _Sauvegarder Save as png, svg, postscript, eps, latex or fig Sauvegarder en png, svg, postscript, eps, latex ou fig Title Titre Vector/matrix Vecteur/matrice Paired matrix Matrice appariée Rows Lignes if you want to split matrix in rows instead of columns si vous souhaitez diviser la matrice en lignes au lieu de colonnes X variable Variable X The variable name used in expression Le nom de la variable utilisé dans l'expression Style Style Line Lignes Points Points Line with points Ligne avec des points Boxes/bars Boîtes/barres Histogram Histogramme Steps Etapes Candlesticks Chandeliers Dots Points Polar Polaire Smoothing Lissage Monotonic Monotonie Natural cubic splines Cannelures cubiques naturelles Bezier Bézier Bezier (monotonic) Bézier (monotonie) Y-axis Axe Y Primary Primaire Secondary Secondaire Data Données Minimum x value Valeur minimum de x Maximum x value Valeur maximum de x Sampling rate Taux d'échantillonnage Step size Taille de l'étape Function Range Portée de la fonction Display grid Afficher la grille Display full border Afficher la bordure complète Minimum y value Valeur minimum de y Maximum y value Valeur maximum de y Logarithmic x scale Échelle logarithmique x Logarithmic y scale Échelle logarithmique y X-axis label Intitulé axe X Y-axis label Intitulé axe Y Line width Largeur de ligne Color display Couleur d'affichage Color Couleur Monochrome Monochrome Legend placement Placement de la légende Top-left Haut à gauche Top-right Haut à droite Bottom-left Bas à gauche Bottom-right Bas à droite Below Au dessous Outside À l'extérieur Appearance Apparence Precision Précision _Recalculate _Recalculer Recalculate expression Recalculer l'expression The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Le nombre de chiffres significatifs à afficher/calculer (l'arithmétique simple est toujours calculé exactement). Preferences Préférences Save definitions on exit Sauvegarder les définitions à la fermeture If changes to functions, units and variables shall be saved automatically Si les modifications effectuées sur les fonctions, unités et variables doivent être enregistrées automatiquement Clear history on exit Effacer l'historique à la fermeture Max history lines saved Nombre maximum de lignes d'historique enregistrées Save history to separate file Enregistrer l'historique dans un fichier séparé Allow multiple instances Permettre plusieurs instances Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permet d'ouvrir plusieurs instances de Qalculate! en même temps. Noter que seulement le mode, historique et définitions de la dernière instance fermée seront sauvegardés. Notify when a new version is available Avertir lorsqu'une nouvelle version est disponible Save mode on exit Sauvegarder le mode à la fermeture If the mode of the calculator shall be restored Si le mode de la calculatrice doit être restauré Close application with Escape key Fermez l'application avec la touche Échap Close the application with the Escape key if the expression field is empty. Fermez l'application avec la touche Échap si le champ d'expression est vide. Use keyboard keys for RPN Utiliser les touches du clavier pour NPI Use keyboard operator keys for RPN operations (+-*/^). Utiliser les touches d'opérateur du clavier pour les opérations NPI (+-*/^). Use caret for bitwise XOR Utiliser le caret pour le bitwise XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. L'entrée XOR (⊻) utilisera le caret (^) du clavier (sinon utiliser Ctrl+^). L'opérateur d'exponentiation (^) peut être toujours saisi grâce à Ctrl+*. Expression in history Expression dans l'historique Parsed Analysé Entered Entré Entered + parsed Entré + analysé Add calculate-as-you-type result to history Ajouter le résultat calculer au fur et à mesure de la saisie à l'historique Delay: Délai: Time limit for plot: Durée maximale des graphs: Behavior Comportement Use system tray icon Utiliser l'icône de la barre d'état système Hides the application in the system tray when the main window is closed Masque l'application dans la barre d'état système lorsque la fenêtre principale est fermée Hide on startup Masquer au démarrage Remember window position Garder la position de la fenêtre Keep above other windows Rester au-dessus des autres fenêtres Keep the main window above other windows (depending on platform and settings this might not work) Gardez la fenêtre principale au-dessus des autres fenêtres (en fonction de la plate-forme et des paramètres, cela peut ne pas fonctionner) Enable Unicode symbols Activer les symboles Unicode Disable this if you have problems with some fancy characters Désactiver cette option, si vous rencontrez des problèmes avec certains caractères spéciaux Ignore system language (requires restart) Ignorer la langue du système (redémarrage nécessaire) Button padding Garniture de bouton Default Défaut / / Application name Nom de l'application Result Résultat Application name + result Nom de l'application + résultat Mode Mode Application name + mode Nom de l'application + mode Window title Titre de la fenêtre Theme Thème Light Clair Dark Sombre High contrast Contraste élevé Dark high contrast Contraste élevé et sombre Language Langue Tooltips Info-bulles Show all Afficher tout Hide in keypad Masquer dans le clavier Hide all Tout masquer Number of expression lines Nombre de lignes d'expression Display expression status Afficher l'état de l'expression If as-you-type expression status shall be displayed below the expression entry Si l'état de l'expression au fur et à mesure doit être affiché sous l'entrée de l'expression Show parsed expression in result field Afficher l'expression analysée dans le champ de résultat If as-you-type expression interpretation shall be displayed in the result field Si l'interprétation de l'expression au fur et à mesure de la frappe doit être affichée dans le champ de résultat Persistent keypad Clavier permanent Look & Feel Apparence et présentation If two's complement representation shall be used for negative binary numbers. Si la représentation en complément à deux doit être utilisée pour les nombres binaires négatifs. If two's complement representation shall be used for negative hexadecimal numbers. Si la représentation en complément à deux doit être utilisée pour les nombres hexadécimaux négatifs. Enables two's complement representation for input of negative binary numbers. All binary numbers starting with 1 are negative, unless binary bits is set. Active la représentation en complément à deux pour la saisie de nombres binaires négatifs. Tous les nombres binaires commençant par 1 sont négatifs, sauf si des bits binaires sont définis. Enables two's complement representation for input of negative hexadecimal numbers. All hexadecimal numbers starting with 8 or higher are negative, unless binary bits is set. Active la représentation en complément à deux pour la saisie de nombres hexadécimaux négatifs. Tous les nombres hexadécimaux commençant par 8 ou plus sont négatifs, sauf si des bits binaires sont définis. Binary bits Bits binaires Automatic Automatique Use lower case letters in non-decimal numbers Utiliser les lettres minuscules pour les nombres non décimaux If lower case letters should be used in numbers with non-decimal base Si des lettres minuscules doivent être utilisées dans des nombres avec une base non décimale Use special duodecimal symbols Utilisez des symboles duodécimaux spéciaux If ↊ and ↋ (or X and E) shall be used instead of A and B for digits 10 and 11 in numbers with base 12 Si ↊ et ↋ (ou X et E)doivent être utilisés à la place de A et B pour les chiffres 10 et 11 dans les nombres en base 12 Alternative base prefixes Préfixes de base alternatifs If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Si les nombres hexadécimaux doivent être affichés avec "0x0" et les nombres binaires avec "0b00" comme préfixes Spell out logical operators Épelez les opérateurs logiques If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Si logique et/ou doit être affiché comme "&&"/"||" ou "et"/"ou" If "e" shall be used instead of "E" in numbers Si "e" doit être utilisé à la place de "E" dans les chiffres Use E-notation instead of 10<sup><i>n</i></sup> Utilisez la notation E au lieu de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Utilisez un "e" minuscule (comme dans 1e10) Use comma as decimal separator Utiliser la virgule comme séparateur décimal Use 'j' as imaginary unit Utilisez 'j' comme unité imaginaire Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front of the imaginary part. Utilisez 'j' (au lieu de 'i') comme symbole par défaut pour l'unité imaginaire et placez-le devant la partie imaginaire. Ignore comma in numbers Ignorer la virgule dans les nombres Allow commas, ',', to be used as thousands separator instead of as an function argument separator Autoriser l'utilisation des virgules, ',', comme séparateur de milliers au lieu de séparateur d'argument de fonction Copy result as unformatted ASCII by default Copier le résultat au format ASCII non formaté par défaut Ignore dots in numbers Ignorer les points dans les nombres Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Autoriser l'utilisation des points, '.', comme séparateur de milliers plutôt que comme signe décimal alternatif Digit grouping Regroupement de chiffres off désactivé standard standard local local Multiplication sign Signe de multiplication Division sign Signe de division Numbers & Operators Nombres et opérateurs Use binary prefixes for information units Utiliser des préfixes binaires pour les unités d'information Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Utiliser les préfixes binaires, à la place des décimales, pour les informations (ex : bytes). Copy unformatted ASCII without units Copier l'ASCII non formaté sans unités Conversion to local currency Conversion vers devise locale Automatically convert to the local currency when optimal unit conversion is activated. Conversion automatique vers la devise locale lorsque la conversion d'unités optimale est activée. Exchange rates updates Mises à jour des taux de change Temperature calculation mode: Mode calcul de la température: Absolute Absolu Hybrid Hybride Units & Currencies Unités et devises Show expression completion suggestions Afficher les suggestions de complétion d'expression Search titles and countries Rechercher les titres et pays Minimum characters Caractères minimum Popup delay (ms) Délai d'apparition (ms) Completion Complétion Custom status font Police du status personnalisée If you want to use a font other than the default in the status display below the expression entry Si vous voulez utiliser une autre police que celle par défaut pour l'affichage du status en dessous de l'expression entrée Custom expression font Police d'expression personnalisée If you want to use a font other than the default in the expression entry Si vous voulez utiliser une autre police que celle utilisé par défaut dans l'expression entrée Custom result font Police personnalisée des résultats If you want to use a font other than the default in the result display Si vous voulez utiliser une autre police que celle par défaut pour l'affichage des résultats Custom keypad font Police personnalisée du clavier If you want to use a font other than the default in the keypad Si vous voulez utiliser une autre police que celle par défaut pour le clavier Status warning color Couleur avertisseur du status Status error color Couleur erreur du status Text color Couleur de texte Custom application font Police de l'application personnalisée If you want to use a font other than the default for the whole application Si vous voulez utiliser une police différence que celle utilisée par défaut pour toute l'application Custom history font Police de l'historique personnalisée Fonts & Colors Polices et couleurs Other: Autre : Bijective base-26 Bijectif base-26 <b>Result Base</b> <b>Résultat base</b> <b>Expression Base</b> <b>Expression base</b> New Keyboard Shortcut Nouveau raccourci clavier Add Action Ajouter action Edit Unit Éditer unité Do not create/modify this unit Ne pas créer/modifier cette unité Accept the creation/modification of this unit Accepter la création/modification de cette unité System Système Hide unit Cacher unité Imperial Impérial US Survey US étude Title displayed in menus and in unit manager Titre affiché dans les menus et le gestionnaire d'unités Singular form of this unit's name Nom au singulier de cette unité Class Classe The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe à laquelle appartient cette unité. Les unités dérivées nommées sont définies par rapport à une seule autre unité, avec un exposant facultatif, tandis que les unités dérivées (non nommées) sont définies par une expression d'unité avec une ou plusieurs unités. Base unit Unité de base Named derived unit Unité dérivée nommée Derived unit Unité dérivée Base unit(s) Unité(s) de base Exponent Exposant Relation Relation Inverse relation Rapport inversé Mix with base unit Mélanger avec l'unité de base Priority Priorité Minimum base unit number Numéro d'unité de base minimum Exponent of the base unit Exposant de l'unité de base Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unité (pour une unité dérivée nommée) ou expression d'unité (pour une unité dérivée non nommée) par rapport à laquelle cette unité est définie Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation avec l'unité de base. Pour les relations linéaires, cela devrait simplement être un nombre. Pour les relations non linéaires, utilisez \x pour le facteur et \y pour l'exposant (par exemple "\x + 273,15" pour la relation entre les degrés Celsius et Kelvin). Specify for non-linear relation, for conversion back to the base unit. Spécifiez pour une relation non linéaire, pour la reconversion vers l'unité de base. Use with prefixes by default Utiliser avec des préfixes par défaut Convert between units Convertir entre les unités = = Conver_sion Conver_sion Converted value Valeur convertie Value to convert from Valeur à convertir _Unit _Unité Create a new unit Créer une nouvelle unité Edit the selected unit Éditer l'unité sélectionnée Delete the selected unit Supprimer l'unité sélectionnée (De)activate the selected unit (Dés)activer l'unité sélectionnée Insert the selected unit into the expression entry Insérer l'unité sélectionnée dans l'expression entrée C_onvert C_onvertir Convert the result to the selected unit Convertir le résultat vers l'unité sélectionnée Type anywhere Taper n'importe où Edit Unknown Variable Éditer la variable de l'inconnue Use custom assumptions Utiliser des suppositions personnalisées Sign Signe Real Number Nombre réel Rational Number Nombre rationnel Name used to reference this unknown variable in expressions Nom utilisé pour référencer cette variable de l'inconnue dans les expressions Edit Variable Éditer variable The category this variable belongs to La catégorie à laquelle appartient cette variable _Variable _Variable Create a new variable Crée une nouvelle variable Edit the selected variable Modifie la variable sélectionnée Delete the selected variable Supprime la variable sélectionnée (De)activate the selected variable (Dés)active la variable sélectionnée Insert the selected variable into the expression entry Insérer la variable sélectionnée dans l'expression entrée E_xport E_xporter Empty value. La valeur est vide. Function not found. La fonction n'a pas été trouvée. Variable not found. La variable n'a pas été trouvée. Unit not found. L'unité n'a pas été trouvée. Mode not found. Le mode n'a pas été trouvé. Unsupported base. La base n'est pas supportée. Unsupported value. Valeur non prise en charge. Cycle through previous expression Parcourir l'expression précédente Move cursor left or right Déplacer le curseur de gauche ou droite Move cursor to beginning or end Déplacer le curseur au début ou à la fin Uncertainty/interval Incertitude/intervalle Relative error Erreur relative Argument separator Séparateur d'arguments Blank space Espace vide New line Nouvelle ligne Smart parentheses Parenthèses intelligentes Vector brackets Crochets de vecteur Left parenthesis Parenthèse gauche Left vector bracket Crochet gauche du vecteur Right parenthesis Parenthèse droite Right vector bracket Crochet droit du vecteur Decimal point Virgule Raise Élever Add Ajouter M+ (memory plus) M+ (mémoire +) MC (memory clear) MC (mémoire effacée) Backspace Retour arrière M− (memory minus) M− (mémoire -) Previous result (static) Résultat précédent (statique) Calculate expression Calculer l'expression MR (memory recall) MR (rappel de mémoire) MS (memory store) MS (magasin de mémoire) Action Action The selected Chinese year does not exist. L'année chinoise sélectionnée n'existe pas. Conversion to Gregorian calendar failed. La conversion au format du calendrier grégorien a échoué. Calendar conversion failed for: %s. Conversion vers le calendrier impossible pour : %s. c-format Gregorian Grégorien Revised Julian (Milanković) Julien révisé (Milanković) Julian Julien Islamic (Hijri) Islamique (Hijri) Hebrew Hébraïque Chinese Chinois Persian (Solar Hijri) Persan (Hijri solaire) Coptic Copte Ethiopian Éthiopien Indian (National) Indien (National) All if no category has been selected (previously selected has been renamed/deleted), select "All" Tout Uncategorized Non classé Clear expression Effacer l'expression Flag Drapeau text texte approximate approximatif number nombre expression expression key indicating that the property is a data set key clé Empty name field. Nom du champ vide. Edit Data Set (global) Éditer ensemble de données (global) New Data Set Nouveau ensemble de données A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Property Propriété Data Retrieval Function Fonction de récupération de données argument argument New Data Object Nouveau objet de données approx. approx. and et or ou undefined indéfini Fetching exchange rates. Récupération des taux de change. Do you wish to update the exchange rates now? Souhaitez-vous mettre à jour les taux de change maintenant ? It has been %s day since the exchange rates last were updated. Cela fait %s jour que les taux de change ont été mis à jour pour la dernière fois. Cela fait %s jours que les taux de change ont été mis à jour pour la dernière fois. c-format It has been %s days since the exchange rates last were updated. Do not ask again Ne plus demander Select file to export to Sélectionner le fichier à exporter _Open _Ouvrir No file name entered. Pas de nom de fichier entré. No delimiter selected. Pas de délimiteur sélectionné. No variable name entered. Pas de nom de variable entré. No known variable with entered name found. Aucune variable connue avec le nom saisi n'a été trouvée. Could not export to file %s Ne peut exporter depuis le fichier %s c-format a previous result un résultat précédent matrix matrice vector vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul boolean booléen integer entier rational rationnel real réel complex complexe (not matrix) (pas de matrice) unknown inconnue default assumptions suppositions par défaut Prefix Préfixe Base Units Unités de base Binary-Coded Decimal Décimal codé en binaire Bijective Base-26 Bijectif base-26 Binary Number Nombre binaire Calendars Calendriers Complex cis Form Forme cis complexe Decimal Number Nombre décimal Duodecimal Number Nombre duodécimal Factors Facteurs 16-bit Floating Point Binary Format Format binaire à virgule flottante - 16 bits 32-bit Floating Point Binary Format Format binaire à virgule flottante - 32 bits 64-bit Floating Point Binary Format Format binaire à virgule flottante - 64 bits 80-bit (x86) Floating Point Binary Format Format binaire à virgule flottante - 80 bits (x86) 128-bit Floating Point Binary Format Format binaire à virgule flottante - 128 bits Hexadecimal Number Nombre hexadécimale Latitude Latitude Longitude Longitude Mixed Units Unités mixtes Octal Number Nombre octal Optimal Units Unités optimales Expanded Partial Fractions Fractions partielles développées Optimal Prefix Préfixe optimal Sexagesimal Number Nombre sexagésimal Unicode Unicode UTC Time Zone Fuseau horaire UTC Stop process Arrêter le processus Calculate expression and add to stack Calculer l'expression et l'ajouter à la pile Select date Sélectionner date Clear History Effacer l'historique Abort Interrompre Undo Défaire Redo Refaire Completion Mode Mode complétion Limited strict completion Complétion stricte limitée Strict completion Complétion stricte Limited full completion Complétion complète limitée Full completion Complétion complète No completion Pas de complétion Delayed completion Complétion retardée Customize completion… Personnaliser complétion… EXACT EXACTE APPROX APPROX RPN NPI CHN Chain mode CHN ROMAN ROMAIN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FONC UNIT UNITÉ VAR VAR INF INF CPLX CPLX Too many arguments for %s(). Trop d'arguments pour %s(). c-format factorize factoriser expand développer hexadecimal hexadécimal hexadecimal number nombre hexadécimal octal octal octal number nombre octal decimal décimal decimal number nombre décimal duodecimal duodécimal duodecimal number nombre duodécimal binary binaire binary number nombre binaire roman romain roman numerals chiffres romains bijective bijectif bijective base-26 bijectif base-26 binary-coded decimal décimal codé en binaire sexagesimal sexagésimal sexagesimal number nombre sexagésimal latitude latitude longitude longitude 32-bit floating point Virgule flottante 32-bits 64-bit floating point Virgule flottante 64-bits 16-bit floating point Virgule flottante 16-bits 80-bit (x86) floating point Virgule flottante 80-bits (x86) 128-bit floating point Virgule flottante 128-bits time temps time format fuseau horaire bases bases number bases bases numériques calendars calendriers optimal optimal optimal unit unité optimale prefix préfixe optimal prefix préfixe optimal base base base units unités de base mixed mixte mixed units unités mixtes factors facteurs partial fraction fraction partielle expanded partial fractions fractions partielles développées rectangular algébrique cartesian cartésien complex rectangular form form algébrique complexe exponential exponentielle complex exponential form forme exponentielle complexe polar polaire complex polar form forme polaire complexe complex cis form forme cis complexe angle angle complex angle notation notation complexe angle phasor phaseur complex phasor notation notation complexe phaseur UTC time zone fuseau horaire UTC number base %s base numérique %s c-format decimals décimales decimal fraction fraction décimale fraction fraction Reference Référence Edit Function (global) Éditer fonction (global) New Function Nouvelle fonction Empty expression field. Expression du champ vide. User functions Fonctions utilisateur Inactive Inactif Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Retrouve les données depuis l'ensemble de données %s pour un objet et propriété donnés. Si "info" est inscrit comme propriété, une fenêtre de dialogue apparaîtra avec toutes les propriétés de l'objet. c-format Example: Exemple : optional optional argument optionnel default: argument default, in description par défaut: Requirement Nécessaire Acti_vate Acti_ver History Answer Value Valeur de réponse de l'historique answer résultat History Index(es) Index(es) de l'historique History index %s does not exist. L'index de l'historique %s n'existe pas. c-format History Parsed Expression Expression analysée par l'historique It took too long to generate the plot data. Cela a pris trop de temps pour générer les données du graph. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. La génération des données de tracé a pris trop de temps. Veuillez diminuer le taux d'échantillonnage ou augmenter la limite de temps dans les préférences. RPN Register Moved Registre NPI déplacé RPN Operation Opération NPI Search Rechercher _Search _Rechercher Remove Bookmark Suppriver favoris Add Bookmark Ajouter favoris A bookmark with the selected name already exists. Do you want to overwrite it? Un favoris portant le même nom existe déjà. Voulez-vous l'écraser ? No items found Aucun élément trouvé Index Index Select file to import Sélectionner le fichier à importer A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Could not import from file %s Ne peut importer depuis le fichier %s c-format Select file Sélectionner un fichier Keep open Garder ouvert Enter RPN Enter (calculate and add to stack) Entrer C_alculate C_alculer Apply to Stack Appliquer à la pile Argument Argument True Vrai False Faux Info Info Right-click/long press: %s Clic droit/pression longue : %s c-format Right-click: %s Clic droit : %s c-format Middle-click: %s Clic du milieu : %s c-format Raise (Ctrl+*) Élever (Ctrl+*) Set unknowns Définir inconnues more Show further items in a submenu plus Logical AND Logical AND Logical OR Logical OR Logical NOT Logical NOT Toggle Result Base Basculer la base de résultats Open menu with stored variables Ouvrir le menu avec les variables enregistrées log10 function not found. fonction log10 n'a pas été trouvée. All functions Toutes les fonctions All variables Toutes les variables Variable does not exist anymore. La variable n'existe plus. ENTER Entr Execute expressions and commands from a file Exécuter des expressions et des commandes à partir d'un fichier FILE FICHIER Start a new instance of the application Démarre une nouvelle instance de l'application Display the application version Affiche la version de l'application Specify the window title Spécifie le titre de la fenêtre TITLE TITRE Expression to calculate L'expression à calculer [EXPRESSION] [EXPRESSION] Failed to load global definitions! Impossible de charger les définitions globales ! c-format By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Par défaut, seulement une instance (une fenêtre principale) de %s est autorisée. Si plusieurs instances sont ouvertes simultanément, seulement les définitions (variables, fonctions, etc.), mode, préférences et l'historique de la dernière fenêtre fermée seront sauvegardés. Voulez-vous, malgré cela, changer le comportement par défaut et autoriser plusieurs instances simultanées ? c-format Set Window Title Définir le titre de la fenêtre Exchange rate source: Source du taux de change: Sources de taux de change: Exchange rate sources: updated %s %s mis à jour %s mis à jour c-format When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Lorsque des erreurs, des avertissements et d'autres informations sont générés pendant le calcul, l'icône dans le coin supérieur droit de l'entrée d'expression change pour refléter cela. Si vous maintenez le pointeur sur l'icône ou cliquez sur l'icône, le message s'affichera. Path of executable not found. Impossible de trouver le chemin de l'exécutable. curl not found. impossible de trouver curl. Failed to run update script. %s Impossible d'exécuter le script de mise à jour. %s c-format Failed to check for updates. Échec de la vérification des mises à jour. No updates found. Aucune mise à jour trouvée. _Download _Télécharger A new version of %s is available at %s. Do you wish to update to version %s? Une nouvelle version de %s est disponible à %s. Souhaitez-vous le mettre à jour vers la version %s ? c-format A new version of %s is available. You can get version %s at %s. Une nouvelle version de %s est disponible. Vous pouvez télécharger la version %s de %s. c-format Temperature Calculation Mode Mode de calcul de température The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner le mode de calcul de la température (le mode pourra être modifié ultérieurement dans les préférences). Sinc Function Fonction Sinc Please select desired variant of the sinc function. Veuillez sélectionner la variante souhaitée de la fonction sinc. Unnormalized Non normalisé Normalized Normalisé Interpretation of dots Interprétation des points Please select interpretation of dots (".") (this can later be changed in preferences). Veuillez sélectionner l'interprétation des points (".") (cela peut être modifié ultérieurement dans les préférences). Both dot and comma as decimal separators Le point et la virgule comme séparateurs décimaux Dot as thousands separator Point comme séparateur de milliers Only dot as decimal separator Seul un point comme séparateur décimal The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner l'interprétation des expressions avec multiplication implicite (cela peut être modifié ultérieurement dans les préférences). Implicit multiplication first Multiplication implicite en premier Conventional Conventionnelle Percentage Interpretation Interprétation du pourcentage Please select interpretation of percentage addition. Veuillez sélectionner l'interprétation de l'addition en pourcentage. Add percentage of original value Ajouter un pourcentage de la valeur d'origine Add percentage multiplied by 1/100 Ajouter un pourcentage multiplié par 1/100 My Variables Mes variables Processing… Traitement en cours… Factorizing… Factorisation en cours… Expanding partial fractions… Développement des fractions partielles… Expanding… Développement en cours… Calculating… Calcul en cours… Converting… Conversion en cours… Time zone parsing failed. L'analyse du fuseau horaire a échoué. Failed to open %s. %s Impossible d'ouvrir %s. %s c-format Couldn't write definitions Ne peut pas écrire de définitions Ignore Ignorer Cancel Annuler Retry Réessayer Couldn't write history to %s L'historique n'a pas pu être écrite pour %s c-format Couldn't write preferences to %s Impossible d'écrire les préférences dans %s c-format Select definitions file Sélectionner le fichier de définitions _Import _Importer XML Files Fichiers XML Could not copy %s to %s. Ne peut pas copier %s vers %s. c-format Could not read %s. Ne peut pas lire %s. c-format Could not copy file to %s. Ne peut pas copier le fichier vers %s. c-format translator-credits crédits-traducteur User variables Variables utilisateur User units Unités utilisateur No unknowns in result. Aucune inconnue dans le résultat. Set Unknowns Définir les inconnues Qalculate! Qalculate! ans résultat Last Answer Dernier résultat Answer 2 Résultat 2 Answer 3 Résultat 3 Answer 4 Résultat 4 Answer 5 Résultat 5 Memory Mémoire none aucun Elements (in horizontal order) Éléments (dans l'ordre horizontale) Vector Result Résultat vecteur Matrix Result Résultat matrice Edit Vector Éditer vecteur Edit Vector (global) Éditer vecteur (global) New Vector Nouveau vecteur Edit Matrix (global) Éditer matrice (global) New Matrix Nouvelle matrice Unit does not exist L'unité n'existe pas Save Mode Sauvegarder mode Preset mode cannot be overwritten. Le mode préréglage ne peut pas être écrasé. Delete Mode Supprimer mode Prefixes Préfixes No Prefix Pas de préfixe Preset Prédéfini Illegal name Nom illégale A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Un objet portant le même nom existe déjà. Si vous continuez et sauvegardez les changements, l'objet en conflit sera écrasé ou désactivé. Abbreviation Abréviation Plural Pluriel Avoid input Évitez les entrées Suffix Suffixe Case sensitive Sensible à la casse Completion only Complétion seulement result is too long le résultat est trop long Could not display help for Qalculate!. Impossible d'afficher l'aide pour Qalculate!. Could not display help for Qalculate!. %s Impossible d'afficher l'aide pour Qalculate!. %s c-format Element Data Données de l'élément Classification Classification Alkali Metal Métal alcalin Alkaline-Earth Metal Métal alcalino-terreux Lanthanide Lanthanide Actinide Actinide Transition Metal Métal de transition Metal Métal Metalloid Métalloïde Polyatomic Non-Metal Polyatomique (Non-métal) Diatomic Non-Metal Diatomique (Non-métal) Noble Gas Gaz noble Unknown chemical properties Propriétés chimiques inconnues Select file to export Sélectionner le fichier à exporter Allowed File Types Types de fichiers autorisés All Files Tous les fichiers Empty expression. L'expression est vide. Empty x variable. La variable x est vide. Gnuplot was not found. Impossible de trouver Gnuplot. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) a besoin d'être installé séparement, et indiquer son chemin d'installation dans la recherche de chemin de l'exécutable, pour faire fonctionner les graphs. c-format never jamais ask demandé %i day %i jour %i jours c-format %i days Please restart the program for the language change to take effect. Veuillez redémarrer l'application pour que le changement de langue prenne effet. result processing was aborted le traitement du résultat a été interrompu result is too long see history le résultat est trop long voir l'historique calculation was aborted le calcul a été interrompu Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Entrer une expression mathématique au dessus, ex : "5 + 2 / 3", et appuyer sur le bouton entrée. Select file to save PNG image to Sélectionner le fichier à enregistrer en image PNG Copied Result was copied Copié Copy result to clipboard Copier le résultat dans le presse-papier Set key combination Définir la combinaison de touches Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Appuyer sur la combinaison de touches que vous souhaitez utiliser pour l'action (appuyer sur Echap pour annuler). No keys Pas de touches The key combination is already in use. Do you wish to replace the current action? La combinaison de touches est déjà utilisée. Souhaitez-vous remplacer l'action en cours ? Key combination Combinaison de touches Edit Unit (global) Éditer unité (global) New Unit Nouvelle unité Base unit does not exist. L'unité de base n'existe pas. Cannot delete unit as it is needed by other units. do not delete units that are used by other units Impossible de supprimer l'unité car d'autres unités en ont besoin. Edit Unknown Variable (global) Éditer variable d'inconnue (global) New Unknown Variable Nouvelle variable de l'inconnue Insert function Insérer fonction Insert function (dialog) Insérer fonction (dialogue) Insert variable Insérer variable Insert unit Insérer unité Insert text Insérer texte Insert date Insérer date Insert vector Insérer vecteur Insert matrix Insérer matrice Insert smart parentheses Insérer parenthèses intelligentes Convert to unit Convertir en unité Convert to unit (entry) Convertir en unité (entrée) Convert to optimal unit Convertir en unité optimale Convert to base units Convertir en unités de base Convert to optimal prefix Convertir en préfixe optimal Convert to number base Convertir en base numérique Factorize result Factoriser le résultat Expand result Développer le résultat Expand partial fractions Développer les fractions partielles RPN: down NPI : down RPN: up NPI : up RPN: swap NPI : swap RPN: copy NPI : copier RPN: lastx NPI : lastx RPN: delete register NPI : supprimer registre RPN: clear stack NPI : vider pile Load meta mode Charger le mode méta Set expression base Définir la base d'expression Set result base Définir la base de résultats Toggle exact mode Basculer en mode exact Set angle unit to degrees Définir l'unité d'angle en degrés Set angle unit to radians Définir l'unité d'angle en radians Set angle unit to gradians Définir l'unité d'angle sur les grades Toggle simple fractions Bascule fractions simples Toggle mixed fractions Bascule fractions mixtes Toggle scientific notation Bascule notation scientifique Toggle simple notation Bascule notation simple Toggle precision Basculer la précision Toggle max decimals Basculer le nombre maximum de décimales Toggle min decimals Basculer le nombre minimal de décimales Toggle max/min decimals Basculer les décimales max/min Toggle RPN mode Bascule mode NPI Toggle calculate as you type Active/Désactive le calcul lors de la saisie Toggle programming keypad Basculer le clavier de programmation Show keypad Afficher le clavier Show history Afficher l'historique Search history Historique des recherches Clear history Effacer l'historique Show conversion Afficher conversion Show RPN stack Afficher la pile NPI Manage variables Gérer les variables Manage functions Gérer les fonctions Manage data sets Gérer les ensembles de données New variable Nouvelle variable New function Nouvelle fonction Open plot functions/data Ouvrir graph fonctions/données Open convert number bases Ouvrir convertisseur de bases numériques Open floating point conversion Ouvrir convertisseur à virgule flottante Open calendar conversion Ouvrir conversion calendrier Open percentage calculation tool Ouvrir l'outil de calcul de pourcentages Open periodic table Ouvrir le tableau périodique Update exchange rates Mettre à jour les taux de change Copy result Copier le résultat Insert result Insérer le résultat Save result image Sauvegarder le résultat en image Help Aide Quit Quitter Toggle chain mode Basculer le mode chaîne Toggle keep above Basculer garder au-dessus Show/hide completion Afficher/masquer l'achèvement Perform completion (activate first item) Effectuer la complétion (activer le premier élément) Formatted result Résultat formaté Unformatted ASCII result Résultat ASCII non formaté Unformatted ASCII result without units Résultat ASCII non formaté sans unités Formatted expression Expression formatée Unformatted ASCII expression Expression ASCII non formatée Formatted expression + result Expression formatée + résultat Unformatted ASCII expression + result Expression ASCII non formatée + résultat Edit Variable (global) Éditer variable (global) New Variable Nouvelle variable Empty value field. Valeur du champ vide. a matrix une matrice a vector un vecteur not matrix pas de matrice Update exchange rates on start Mettre à jour les taux de change au démarrage If current exchange rates shall be downloaded from the internet at program start Si les taux de change actuels doivent être téléchargés à partir d'Internet au démarrage du programme. Truncate All Numbers Nombre octal Number bases Bases numériques Binary-coded decimal Décimales min. Rectangular form Forme algébrique Exponential form Forme exponentielle Polar form Forme polaire Angle/phasor notation Notation angle/phaseur Base units Unités de base Optimal unit Unité optimale Description of this function Description de cette fonction Definition of this function's arguments Définition des arguments de cette fonction Add entered argument definition Ajouter une définition d'argument entrée Modify selected argument Éditer l'argument sélectionné Remove selected argument Supprimer l'argument sélectionné Rules Règles Edit conditions for selected argument Éditer les conditions pour l'argument sélectionné Calculate the subfunction only once, before the parent function Calculer la sous-fonction qu'une seule fois, avant la fonction parente Add entered subfunction Ajouter sous-fonction entrée Apply changes to the selected subfunction Appliquer les changement à la sous-fonction sélectionnée Remove the selected subfunction Supprimer la sous-fonction sélectionnée Function (simplified) Fonction (simplifiée) Columns Colonnes Add new name Ajouter nouveau nom Apply changes to the selected name Appliquer les changements au nom selectionné Remove the selected name Supprimer le nom sélectionné Advanced Avancé Accept the creation/modification of this variable Accepter la création/modification de cette variable x, y, z x, y, z \x, \y, \z \x, \y, \z If the relation is precise Si la relation est précise Value of this variable (expression) Valeur de cette variable (expresion) value is exact la valeur est exacte If the value is precise Si la valeur est précise Matrices Matrices Yes Oui No Non A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Un objet portant le même nom existe déjà. Si vous continuez et sauvegardez les changements, l'objet en conflit sera écrasé ou désactivé. Voulez-vous réellement continuer ? expression function expression Deactivate to remove digit separator when copying result Désactiver pour supprimer le séparateur de chiffres lors de la copie du résultat Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Désactivé : 2.5 ≈ 3, 1.5 ≈ 2 Activé : 2.5 ≈ 2, 1.5 ≈ 2 Manage Variables Gestion des variables Manage Functions Gestion des fonctions Manage Units Gestion des unités Manage Data Sets Gestion des ensembles de données Arguments: Arguments : info info A variable or unit with the same name already exists. Do you want to overwrite it? Une variable ou unité portant le même nom existe déjà. Voulez-vous l'écraser ? Do not create/modify this data set Ne pas créer/modifier cet ensemble de données Accept the creation/modification of this data set Accepter la création/modification de cet ensemble de données Do not create/modify this function Ne pas créer/modifier cette fonction Accept the creation/modification of this function Accepter la création/modification de cette fonction Close this dialog Fermer cette boîte de dialogue Do not create/modify this matrix/vector Ne pas créer/modifier cette matrice/vecteur Create/modify the matrix/vector Créer/modifier cette matrice/vecteur Do not create/modify this unknown variable Ne pas créer/modifier cette variable de l'inconnue Accept the creation/modification of this unknown variable Accepter la création/modification de cette variable de l'inconnue Select a file Sélectionner un fichier Complex angle/phasor notation Notation complexe angle/phaseur Complex exponential form Forme exponentielle complexe Expanded partial fractions Fractions partielles développées Complex polar form Forme polaire complexe Complex rectangular form Forme algébrique complexe x x If a matrix or vectors shall be generated from the contents of the file Si une matrice ou des vecteurs doivent être générés à partir du contenu du fichier Use dark theme Utiliser le thème sombre u Manage units button u to Button for convert to operator vers Add Keypad Ajouter Alias Alias Fonts Polices Chain Calculation Calculatrice <b>Name</b> <b>Nom</b> <b>Relation</b> <b>Relation</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i secondes c-format ArgumentEditDialog Name: Nom : Type: Type : Free Libre Number Nombre Integer Entier Symbol Symbole Text Texte Date Date Vector Vecteur Matrix Matrice Boolean Booléen Angle Angle Object Objet Function Fonction Unit Unité Variable Variable File Fichier Enable rules and type test Activer les règles et le type de test Custom condition: Condition personnalisée : For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Par exemple, si l'argument est une matrice qui doit être égal au nombre de lignes et de colonnes : lignes(\x) = colonnes(\x) Allow matrix Autoriser matrice Forbid zero Interdire zéro Handle vector Manche de vecteur Calculate function for each separate element in vector. Calculer la fonction de chaque élément distinct du vecteur. Min Min Include equals Inclure les égalités Max Max CSVDialog Import CSV File Importer un fichier CSV Export CSV File Exporter en fichier CSV Current result Résultat actuel Matrix/vector variable: Variable matrice/vecteur : File: Fichier : Import as Importer comme matrix matrice vectors vecteurs Name: Nom : First row: Première ligne : Includes headings Inclure les en-têtes Delimiter: Délimiteur : Comma Virgule Tabulator Tabulation Semicolon Point virgule Space Espace Other Autre Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Error Erreur Could not import from file %1 Ne peut importer depuis le fichier %1 No matrix or vector variable with the entered name was found. Aucune variable matricielle ou vectorielle avec le nom saisi n'a été trouvée. Could not export to file %1 Ne peut exporter depuis le fichier %1 CalendarConversionDialog Calendar Conversion Conversion calendrier Gregorian Grégorien Hebrew Hébraïque Islamic (Hijri) Islamique (Hijri) Persian (Solar Hijri) Persan (Hijri solaire) Indian (National) Indien (National) Chinese Chinois Julian Julien Revised Julian (Milanković) Julien révisé (Milanković) Coptic Copte Ethiopian Éthiopien Error Erreur The selected Chinese year does not exist. L'année chinoise sélectionnée n'existe pas. Conversion to Gregorian calendar failed. La conversion au format du calendrier grégorien a échoué. Calendar conversion failed for: %1. Conversion vers le calendrier impossible pour : %1. DataObjectEditDialog %1: %1 : Default Défaut Approximate Approximatif Exact Exact Edit Data Object Éditer les données d'objet New Data Object Nouveau objet de données DataPropertyEditDialog Name: Nom : Descriptive name: Nom descriptif : Description: Description : Value type: Type de valeur : Expression Expression Number Nombre Text Texte Unit expression: Expression d'unité : Use as key Utiliser comme clé Case sensitive value Valeur sensible à la casse Approximate value Valeur approximative Value uses brackets Valeur utilise des crochets Hide Cacher Edit Data Property Éditer propriété des données DataSetEditDialog General Général Properties Propriétés Function Fonction Descriptive name: Nom descriptif : Data file: Fichier de données : Description: Description : Copyright: Copyright : Title Titre Name Nom Type Type Add Ajouter Edit Éditer Remove Supprimer Name: Nom : Object argument name: Nom d'argument de l'objet : Property argument name: Nom d'argument de propriété : Default property: Propriété par défaut : text texte approximate approximatif number nombre expression expression key clé Question Question A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Data Sets Ensembles de données Object Objet Property Propriété Edit Data Set Éditer l'ensemble de données New Data Set Nouveau ensemble de données DataSetsDialog Data Sets Ensembles de données Data sets: Ensembles de données : New… Nouveau… Edit… Éditer… Delete Supprimer Objects: Objets : Data set description: Description de l'ensemble de données : Object attributes: Attributs d'objet : Properties Propriétés key clé Data Retrieval Function Fonction de récupération de données argument argument ExpressionEdit matrix matrice vector vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul boolean booléen integer entier rational rationnel real réel complex complexe number nombre (not matrix) (pas de matrice) unknown inconnue default assumptions suppositions par défaut Prefix: Préfixe : Complex Angle/Phasor Notation Notation complexe angle/phaseur Base units Unités de base Number Base Base numérique Binary-Coded Decimal Décimal codé en binaire Bijective Base-26 Bijectif base-26 Binary Number Nombre binaire Calendars Calendriers Complex cis Form Forme cis complexe Decimal Number Nombre décimal Duodecimal Number Nombre duodécimal Complex Exponential Form Forme exponentielle complexe Factors Facteurs 16-bit Floating Point Binary Format Format binaire à virgule flottante - 16 bits 32-bit Floating Point Binary Format Format binaire à virgule flottante - 32 bits 64-bit Floating Point Binary Format Format binaire à virgule flottante - 64 bits 80-bit (x86) Floating Point Binary Format Format binaire à virgule flottante - 80 bits (x86) 128-bit Floating Point Binary Format Format binaire à virgule flottante - 128 bits Fraction Fraction Decimal Fraction Fraction décimale Hexadecimal Number Nombre hexadécimale Latitude Latitude Longitude Longitude Mixed Units Unités mixtes Octal Number Nombre octal Optimal Unit Unité optimale Optimal Prefix Préfixe optimal Expanded Partial Fractions Fractions partielles développées Complex Polar Form Forme polaire complexe Complex Rectangular Form Forme algébrique complexe Roman Numerals Chiffres romains Sexagesimal Number Nombre sexagésimal Time Format Format de l'heure Unicode Unicode UTC Time Zone Fuseau horaire UTC Scientific Notation Notation scientifique Engineering Notation Notation ingénieur Simple Notation Notation simple Custom Personnalisé Undo Défaire Redo Refaire Cut Couper Copy Copier Paste Coller Delete Supprimer Calculate Selection Calculer la sélection Insert Date… Insérer une date… Insert Matrix… Insérer une matrice… Select All Sélectionner tout Clear Effacer Clear History Effacer l'historique Completion Complétion No completion Pas de complétion Limited strict completion Complétion stricte limitée Strict completion Complétion stricte Limited full completion Complétion complète limitée Full completion Complétion complète Delayed completion Complétion retardée Expression Status L'état de l'expression Off Désactivé In history list Dans la liste historique In expression field Dans le champ d'expression In status bar With delay Avec retard With adaptive delay Avec retard adaptative Without delay Sans délai Automatically calculate selection Use input method Utiliser la méthode de saisie Matrix Matrice Too many arguments for %1(). Trop d'arguments pour %1(). argument argument %1: %1 : comment commentaire MC (memory clear) MC (mémoire effacée) MS (memory store) MS (magasin de mémoire) M+ (memory plus) M+ (mémoire +) M− (memory minus) M− (mémoire −) factorize factoriser expand développer hexadecimal hexadécimal hexadecimal number nombre hexadécimal octal octal octal number nombre octal decimal décimal decimal number nombre décimal duodecimal duodécimal duodecimal number nombre duodécimal binary binaire binary number nombre binaire roman romain roman numerals chiffres romains bijective bijectif bijective base-26 bijectif base-26 binary-coded decimal décimal codé en binaire sexagesimal sexagésimal sexagesimal number nombre sexagésimal latitude latitude longitude longitude 32-bit floating point Virgule flottante 32-bits 64-bit floating point Virgule flottante 64-bits 16-bit floating point Virgule flottante 16-bits 80-bit (x86) floating point Virgule flottante 80-bits (x86) 128-bit floating point Virgule flottante 128-bits time temps time format fuseau horaire scientific scientifique scientific notation notation scientifique engineering ingénieur engineering notation notation ingénieur simple simple simple notation notation simple bases bases number bases bases numériques calendars calendriers optimal optimal optimal unit unité optimale prefix préfixe optimal prefix préfixe optimal base base units base base base base units unités de base mixed mixte mixed units unités mixtes factors facteurs partial fraction fraction partielle expanded partial fractions fractions partielles développées rectangular algébrique cartesian cartésien complex rectangular form form algébrique complexe exponential exponentielle complex exponential form forme exponentielle complexe polar polaire complex polar form forme polaire complexe complex cis form forme cis complexe angle angle complex angle notation notation complexe angle phasor phaseur complex phasor notation notation complexe phaseur UTC time zone fuseau horaire UTC base number base base number base %1 base numérique %1 decimals décimales decimal fraction fraction décimale fraction fraction Data object Données de l'objet FPConversionDialog Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Format Format 16-bit (half precision) 16-bit (demi-précision) 32-bit (single precision) 32-bit (simple précision) 64-bit (double precision) 64-bit (double précision) 80-bit (x86 extended format) 80-bit (format x86 étendu) 128-bit (quadruple precision) 128-bit (quadruple précision) Microchip 24-bit Microchip 24-bit Microchip 32-bit Microchip 32-bit Value Valeur Binary representation Représentation binaire Hexadecimal representation Représentation hexadécimale Floating point value Valeur en virgule flottante Conversion error Erreur de conversion FunctionEditDialog Required Requis Details Détails Description Description Name: Nom : Expression: Expression : Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Utilisez x, y et z (ex : "(x+y)/2"), ou \x, \y, \z, \a, \b, … (ex : "(\x+\y)/2") Category: Catégorie : Descriptive name: Nom descriptif : Hide function Cacher fonction Example: Exemple : Description: Description : Condition: Condition : Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condition qui doit être vraie pour la fonction (ex : si le second argument doit être plus grand que le premier : "\y > \x") Sub-functions: Sous-fonctions : Expression Expression Precalculate Précalculer Reference Référence Add Ajouter Edit Éditer Remove Supprimer Arguments: Arguments : Name Nom Type Type Warning Avertissement Conversion (using "to") is not supported in functions. Question Question A function with the same name already exists. Do you want to overwrite the function? Une fonction portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Function Éditer la fonction New Function Nouvelle fonction FunctionsDialog Functions Fonctions Category Catégorie Function Fonction New… Nouveau… Edit… Éditer… Deactivate Désactiver Delete Supprimer Calculate… Calculer… Apply Appliquer Insert Insérer Favorite Favori Inactive Inactif Uncategorized Non classé argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Retrouve les données depuis l'ensemble de données %1 pour un objet et propriété donnés. Si "info" est inscrit comme propriété, une fenêtre de dialogue apparaîtra avec toutes les propriétés de l'objet. Example: Exemple : Arguments Arguments optional optional argument optionnel default: argument default par défaut : Requirement: Required condition for function Nécessaire : Properties Propriétés %1: %1 : key indicating that the property is a data set key clé Activate Activer Favorites Favoris User functions Fonctions utilisateur All All functions Tout HistoryView Search… Rechercher… Search by Date… Rechercher par date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Entrer une expression mathématique au dessus, ex : "5 + 2 / 3", et appuyer sur le bouton entrée. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Entrer une expression mathématique au dessous, ex : "5 + 2 / 3", et appuyer sur le bouton entrée. Exchange rate source(s): Source du taux de change: Sources du taux de change: updated %1 %1 mis à jour %1 mis à jour Comment Commentaire Insert Value Insérer valeur Insert Text Insérer texte Copy Copier Copy unformatted ASCII Copier ASCII non formaté Select All Sélectionner tout Protect Protéger Add Comment… Ajouter un commentaire… Move to Top Se déplacer en haut Remove Supprimer Clear Effacer Edit Comment… Éditer le commentaire… Search Rechercher Text: Texte : KeypadButton <i>Right-click/long press</i>: %1 <i>Clic droit/pression longue</i> : %1 <i>Right-click</i>: %1 <i>Clic droit</i> : %1 <i>Long press</i>: %1 <i>Pression longue</i> : %1 Open menu Ouvrir le menu <i>Middle-click</i>: %1 <i>Clic du milieu</i> : %1 KeypadWidget Memory store Magasin de mémoire Memory clear Mémoire effacée Memory recall Rappel de mémoire Memory add Mémoire + Memory subtract Mémoire − STO Standard calculator button. Do not use more than three characters. STO Store Enregistrer New function Nouvelle fonction sin sin cos cos tan tan Exponentiation Exponentiation Factorize Factoriser Expand Développer Percent or remainder Pourcentage ou reste Uncertainty/interval Incertitude/intervalle Relative error Erreur relative Interval Intervalle Move cursor left Déplacer le curseur vers la gauche Move cursor to start Déplacer le curseur au début Move cursor right Déplacer le curseur vers la droite Move cursor to end Déplacer le curseur à la fin Bitwise AND Bitwise AND Logical AND Logical AND Bitwise OR Bitwise OR Logical OR Logical OR Bitwise Exclusive OR Bitwise Exclusive OR Bitwise NOT Bitwise NOT Logical NOT Logical NOT Bitwise Left Shift Décalage gauche Bitwise Bitwise Right Shift Décalage droite Bitwise cmp cmp rot rot a→1 a→1 Expand partial fractions Développer les fractions partielles Add column Ajouter une colonne Add row Ajouter une ligne Remove column Supprimer la colonne Remove row Supprimer la ligne Left parenthesis Parenthèse gauche Left vector bracket Crochet gauche du vecteur Right parenthesis Parenthèse droite Right vector bracket Crochet droit du vecteur Smart parentheses Parenthèses intelligentes Vector brackets Crochets de vecteur Argument separator Séparateur d'arguments Blank space Espace vide New line Nouvelle ligne Decimal point Virgule Previous result (static) Résultat précédent (statique) Multiplication Multiplication Bitwise Shift Décalage Bitwise DEL Standard calculator button. Do not use more than three characters. DEL Delete Supprimer Backspace Retour arrière Addition Addition Plus Plus Subtraction Soustraction Minus Moins Division Division C Standard calculator button. Do not use more than three characters. Clear expression Effacer l'expression Calculate expression Calculer l'expression Enable units in physical constants Activer unités en constantes physiques All constants Toutes les constantes Percentage Calculation Tool Outil de calcul de pourcentages more plus All units Toutes les unités All variables Toutes les variables Button Action Bouton d'action Label: Intitulé : Action Action None Aucune Value: Valeur : Interval Display Affichage d'intervalle Adaptive Adaptif Significant digits Chiffres significatifs Plus/minus Plus/moins Relative Relatif Concise Concis Interval Calculation Calcul d'intervalle Variance formula Formule d'écart Interval arithmetic Arithmétique des intervalles Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Complex number form Forme de nombre complexe Rectangular Rectangulaire Exponential Exponentielle Polar Polaire Angle/phasor Angle/phaseur Type Assumptions type Type Number Nombre Real Réel Rational Rationnel Integer Entier Boolean Booléen Sign Assumptions sign Signe Unknown Unknown assumptions sign Inconnue Non-zero Non nul Positive Positif Non-negative Positif ou nul Negative Négatif Non-positive Négatif ou nul Default assumptions Suppositions par défaut NamesEditDialog Name Nom Reference Référence Abbreviation Abréviation Plural Pluriel Avoid input Évitez les entrées Suffix Suffixe Case sensitive Sensible à la casse Completion only Complétion seulement Add Ajouter Edit Éditer Remove Supprimer Warning Avertissement Illegal name Nom illégale A function with the same name already exists. Une fonction portant le même nom existe déjà. A unit or variable with the same name already exists. Une unité ou variable portant le même nom existe déjà. PercentageCalculationDialog Percentage Pourcentage Value 1 Valeur 1 Value 2 Valeur 2 Change from 1 to 2 Différence de 1 à 2 Change from 2 to 1 Différence de 2 à 1 2 compared to 1 2 comparé à 1 1 compared to 2 1 comparé à 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Entrez deux valeurs, dont au plus une est un pourcentage, et les autres seront calculées pour vous. Clear Effacer PeriodicTableDialog Periodic Table Tableau périodique Element Data Données de l'élément Alkali Metal Métal alcalin Alkaline-Earth Metal Métal alcalino-terreux Lanthanide Lanthanide Actinide Actinide Transition Metal Métal de transition Metal Métal Metalloid Métalloïde Polyatomic Non-Metal Polyatomique (Non-métal) Diatomic Non-Metal Diatomique (Non-métal) Noble Gas Gaz noble Unknown chemical properties Propriétés chimiques inconnues Unknown Inconnue %1: %1 : PlotDialog Plot Graph Data Données Title: Titre : Expression: Expression : Function Fonction Vector/matrix Vecteur/matrice Paired matrix Matrice appariée Rows Lignes X variable: Variable X : Style: Style : Line Lignes Points Points Line with points Ligne avec des points Boxes/bars Boîtes/barres Histogram Histogramme Steps Etapes Candlesticks Chandeliers Dots Points Polar Polaire Smoothing: Lissage : None Aucune Monotonic Monotonie Natural cubic splines Cannelures cubiques naturelles Bezier Bézier Bezier (monotonic) Bézier (monotonie) Y-axis: Axe Y : Primary Primaire Secondary Secondaire Add Ajouter Apply Appliquer Remove Supprimer Title Titre Expression Expression Function Range Portée de la fonction Minimum x value: Valeur minimum de x : Maximum x value: Valeur maximum de x : Sampling rate: Taux d'échantillonnage : Step size: Taille de l'étape : Show real and imaginary parts Montrer des pièces réelles et imaginaires Appearance Apparence Display grid Afficher la grille Display full border Afficher la bordure complète Minimum y value: Valeur minimum de y : Maximum y value: Valeur maximum de y : Logarithmic x scale: Échelle logarithmique x : Logarithmic y scale: Échelle logarithmique y : X-axis label: Intitulé axe X : Y-axis label: Intitulé axe Y : Line width: Largeur de ligne : Legend placement: Placement de la légende : Top-left Haut à gauche Top-right Haut à droite Bottom-left Bas à gauche Bottom-right Bas à droite Below Au dessous Outside À l'extérieur Calculating… Calcul en cours… Cancel Annuler Processing… Traitement en cours… PreferencesDialog Preferences Préférences Ignore system language (requires restart) Ignorer la langue du système (redémarrage nécessaire) Language: Langue : Default Défaut Allow multiple instances Permettre plusieurs instances Notify when a new version is available Avertir lorsqu'une nouvelle version est disponible Clear history on exit Effacer l'historique à la fermeture Max history lines saved: The length of "Nombre maximum de lignes d'historique enregistrées" is problematic Lignes d'historique enregistrées : Close application with Escape key Fermez l'application avec la touche Échap Use keyboard keys for RPN Utiliser les touches du clavier pour NPI Use caret for bitwise XOR Utiliser le caret pour le bitwise XOR Keep above other windows Rester au-dessus des autres fenêtres Preserve history height Préserver la hauteur de l'historique Do not change the height of history list when keypad or number bases are show or hidden. Ne modifiez pas la hauteur de la liste historique lorsque le clavier ou les bases numériques sont affichés ou masqués. Window title: Titre de la fenêtre : Application name Nom de l'application Result Résultat Application name + result Nom de l'application + résultat Workspace Espace de travail Application name + workspace Nom de l'application + espace de travail Tooltips: Info-bulles : Show all Afficher tout Hide in keypad Masquer dans le clavier Hide all Tout masquer Style: Style: Default (requires restart) Default style Défaut (redémarrage nécessaire) Dark mode Thème sombre Disable cursor blinking Colorize result Coloriser le résultat Format result Formater le résultat Custom result font: Police de résultat personnalisée: Custom expression font: Police d'expression personnalisée : Custom status bar font: Police de la barre d'état personnalisée : Custom keypad font: Police du clavier personnalisée : Custom application font: Police de l'application personnalisée : Expression status: État de l'expression : Place expression field below history Off Désactivé In history list Dans la liste historique In expression field Dans le champ d'expression In status bar Status tooltip delay: Délai de l'info-bulle d'état : ms milliseconds ms Calculate as you type delay: Calculez au fur et à mesure que vous tapez le délai : Adaptive delay Automatically calculate selection Expression in history: Expression dans l'historique : Parsed Analysé Parsed (compact) Entered Entré Entered + parsed Entré + analysé Entered + parsed (compact) Expression after calculation: Expression après calcul : Keep expression Gardez l'expression Clear expression Effacer l'expression Replace with result Remplacer par le résultat Replace with result if shorter Remplacer par le résultat s'il est plus court Automatically copy result Copier automatiquement le résultat Parsing mode: Mode d'analyse : Adaptive Adaptif Conventional Conventionnelle Implicit multiplication first Multiplication implicite en premier Chain Chaîne RPN NPI Simplified percentage calculation Calcul de pourcentage simplifié Read precision Lire précision Allow concise uncertainty input Autoriser une saisie concise de l'incertitude Limit implicit multiplication Limiter la multiplication implicite Interpret unrecognized symbols as variables Interpréter les symboles non reconnus comme des variables Interval calculation: Calcul d'intervalle : Variance formula Formule d'écart Interval arithmetic Arithmétique des intervalles Factorize result Factoriser le résultat Two's complement output: Sortie du complément à deux : Two's complement input: Entrée du complément à deux : Binary Binaire Hexadecimal Hexadécimal Binary bits: Bits binaires : Automatic Automatique Use lower case letters in non-decimal numbers Utiliser les lettres minuscules pour les nombres non décimaux Use special duodecimal symbols Utilisez des symboles duodécimaux spéciaux Use dot as multiplication sign Utiliser le point comme signe de multiplication Use Unicode division slash in output Utiliser la barre oblique de division Unicode en sortie Spell out logical operators Épelez les opérateurs logiques Use E-notation instead of 10^n Utilisez la notation E au lieu de 10^n Use 'j' as imaginary unit Utilisez 'j' comme unité imaginaire Use comma as decimal separator Utiliser la virgule comme séparateur décimal Ignore comma in numbers Ignorer la virgule dans les nombres Ignore dots in numbers Ignorer les points dans les nombres Indicate repeating decimals Indiquer les décimales répétitives Show status bar Custom Personnalisé Custom history font: Police de l'historique personnalisée : Multiplication sign: Signe de multiplication : multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Copy unformatted ASCII by default Copier ASCII non formaté par défault Place percent button in number pad Indicate repeating decimals: Indiquer les décimales répétitives : Ellipsis Overline Digit grouping: Regroupement de chiffres : None Aucune Standard Standard Local Local Automatically group digits in input (experimental) Groupement automatique des chiffres en entrée (expérimental) Automatically group digits in input Groupement automatique des chiffres en entrée Interval display: Affichage d'intervalle : Significant digits Chiffres significatifs Interval Intervalle Plus/minus Plus/moins Relative Relatif Concise Concis Midpoint Point du milieu Lower Inférieure Upper Supérieure Rounding: Arrondi : Round halfway numbers away from zero Arrondir les nombres à mi-chemin par rapport à zéro Round halfway numbers to even Arrondir les nombres à mi-chemin pour égaliser Round halfway numbers to odd Arrondir les nombres à mi-chemin à impairs Round halfway numbers toward zero Arrondir les nombres à mi-chemin vers zéro Round halfway numbers to random Arrondir les nombres à mi-chemin au hasard Round halfway numbers up Arrondir les chiffres à mi-chemin vers le haut Round halfway numbers down Arrondir les chiffres à mi-chemin vers le bas Round toward zero Arrondir vers zéro Round away from zero Arrondir à partir de zéro Round up Rassembler Round down Arrondir vers le bas Complex number form: Forme de nombre complexe : Rectangular Rectangulaire Exponential Exponentielle Polar Polaire Angle/phasor Angle/phaseur Enable units Activer les unités Abbreviate names Noms abrégés Use binary prefixes for information units Utiliser des préfixes binaires pour les unités d'information Automatic unit conversion: Conversion automatique des unités : No conversion Pas de conversion Base units Unités de base Optimal units Unités optimales Optimal SI units Unités SI optimales Convert to mixed units Convertir en unités mixtes Automatic unit prefixes: Préfixes d'unités automatiques : No prefixes Pas de préfixes Prefixes for some units Préfixes pour les unités sélectionnées Prefixes also for currencies Également des préfixes pour les devises Prefixes for all units Préfixes pour toutes les unités Enable all SI-prefixes Activer tous les préfixes SI Enable denominator prefixes Activer les préfixes du dénominateur Enable units in physical constants Activer unités en constantes physiques Copy unformatted ASCII without units Copier l'ASCII non formaté sans unités Temperature calculation: Mode de calcul de température : Absolute Absolu Hybrid Hybride Exchange rates updates: Mises à jour des taux de change : %n day(s) %n jour %n jours Default currency: Devise par défaut : Look && Feel Apparence et présentation Fonts Polices Numbers && Operators Nombres et opérateurs Units Unités Calculation Calcul Units && Currencies Unités et devises Parsing && Calculation Analyse && Calcul Restart required Redémarrage nécessaire Please restart the program for the language change to take effect. Veuillez redémarrer l'application pour que le changement de langue prenne effet. QApplication Execute expressions and commands from a file Exécuter des expressions et des commandes à partir d'un fichier FILE FICHIER Start a new instance of the application Démarre une nouvelle instance de l'application Specify the window title Spécifie le titre de la fenêtre TITLE TITRE Update exchange rates Mettre à jour les taux de change Display the application version Affiche la version de l'application Open workspace Espace de travail ouvert Expression to calculate L'expression à calculer [EXPRESSION] [EXPRESSION] Allow multiple instances? Permettre plusieurs instances? By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Par défaut, seulement une instance (une fenêtre principale) de %1 est autorisée. Si plusieurs instances sont ouvertes simultanément, seulement les définitions (variables, fonctions, etc.), mode, préférences et l'historique de la dernière fenêtre fermée seront sauvegardés. Voulez-vous, malgré cela, changer le comportement par défaut et autoriser plusieurs instances simultanées ? %1 is already running. %1 est déjà en cours d'exécution. Failed to load global definitions! Impossible de charger les définitions globales ! History Answer Value Valeur de réponse de l'historique answer résultat History Index(es) Index(es) de l'historique History index %s does not exist. L'index de l'historique %s n'existe pas. Last Answer Dernier résultat Answer 2 Résultat 2 Answer 3 Résultat 3 Answer 4 Résultat 4 Answer 5 Résultat 5 Memory Mémoire Error Erreur Couldn't write preferences to %1 Impossible d'écrire les préférences dans %1 Function not found. La fonction n'a pas été trouvée. Variable not found. La variable n'a pas été trouvée. Unit not found. L'unité n'a pas été trouvée. Unsupported base. La base n'est pas supportée. Unsupported value. Valeur non prise en charge. QalculateQtSettings Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Update exchange rates? Mettre à jour les taux de change ? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Cela fait %n jour que les taux de change ont été mis à jour pour la dernière fois. Souhaitez-vous mettre à jour les taux de change maintenant? Cela fait %n jours que les taux de change ont été mis à jour pour la dernière fois. Souhaitez-vous mettre à jour les taux de change maintenant? Fetching exchange rates… Récupération des taux de change… Error Erreur Warning Avertissement Information Information Path of executable not found. Impossible de trouver le chemin de l'exécutable. curl not found. impossible de trouver curl. Failed to run update script. %1 Impossible d'exécuter le script de mise à jour. %1 Failed to check for updates. Échec de la vérification des mises à jour. No updates found. Aucune mise à jour trouvée. A new version of %1 is available at %2. Do you wish to update to version %3? Une nouvelle version de %1 est disponible à %2. Souhaitez-vous le mettre à jour vers la version %3? A new version of %1 is available. You can get version %3 at %2. Une nouvelle version de %1 est disponible. Vous pouvez télécharger la version %3 de %2. Download Télécharger %1: %2 %1 : %2 Insert function Insérer fonction Insert function (dialog) Insérer fonction (dialogue) Insert variable Insérer variable Approximate result Résultat approximatif Negate Rejeter Invert Intervertir Insert unit Insérer unité Insert text Insérer texte Insert operator Insérer un opérateur Insert date Insérer date Insert matrix Insérer matrice Insert smart parentheses Insérer parenthèses intelligentes Convert to unit Convertir en unité Convert Convertir Convert to optimal unit Convertir en unité optimale Convert to base units Convertir en unités de base Convert to optimal prefix Convertir en préfixe optimal Convert to number base Convertir en base numérique Factorize result Factoriser le résultat Expand result Développer le résultat Expand partial fractions Développer les fractions partielles RPN: down NPI : down RPN: up NPI : up RPN: swap NPI : swap RPN: copy NPI : copier RPN: lastx NPI : lastx RPN: delete register NPI : supprimer registre RPN: clear stack NPI : vider pile Set expression base Définir la base d'expression Set result base Définir la base de résultats Set angle unit to degrees Définir l'unité d'angle en degrés Set angle unit to radians Définir l'unité d'angle en radians Set angle unit to gradians Définir l'unité d'angle sur les grades Active normal display mode Mode d'affichage normal actif Activate normal display mode Activer le mode d'affichage normal Activate scientific display mode Activer le mode d'affichage scientifique Activate engineering display mode Activer le mode d'affichage ingénierie Activate simple display mode Activer le mode d'affichage simple Toggle precision Basculer la précision Toggle max decimals Basculer le nombre maximum de décimales Toggle min decimals Basculer le nombre minimal de décimales Toggle max/min decimals Basculer les décimales max/min Toggle RPN mode Bascule mode NPI Show general keypad Afficher le clavier général Toggle programming keypad Basculer le clavier de programmation Toggle algebra keypad Basculer le clavier en algèbre Toggle custom keypad Basculer le clavier en personnalisé Show/hide keypad Afficher/masquer le clavier Search history Historique des recherches Clear history Effacer l'historique Show variables Afficher les variables Show functions Afficher les fonctions Show units Afficher les unités Show data sets Afficher les ensembles de données Store result Enregistrer résultat MC (memory clear) MC (mémoire effacée) MR (memory recall) MR (rappel de mémoire) MS (memory store) MS (magasin de mémoire) M+ (memory plus) M+ (mémoire +) M− (memory minus) M− (mémoire −) New variable Nouvelle variable New function Nouvelle fonction Open plot functions/data Ouvrir graph fonctions/données Open convert number bases Ouvrir convertisseur de bases numériques Open floating point conversion Ouvrir convertisseur à virgule flottante Open calender conversion Ouvrir conversion calendrier Open percentage calculation tool Ouvrir l'outil de calcul de pourcentages Open periodic table Ouvrir le tableau périodique Update exchange rates Mettre à jour les taux de change Copy result Copier le résultat Insert result Insérer le résultat Open mode menu Menu du mode ouvert Open menu Ouvrir le menu Help Aide Quit Quitter Toggle chain mode Basculer le mode chaîne Toggle keep above Basculer garder au-dessus Show completion (activate first item) Afficher l'achèvement (activer le premier élément) Clear expression Effacer l'expression Delete Supprimer Backspace Retour arrière Home Accueil End Fin Right Droite Left Gauche Up Haut Down Bas Undo Défaire Redo Refaire Calculate expression Calculer l'expression Expression history next Historique des expressions suivant Expression history previous Historique des expressions précédent Open functions menu Ouvrir le menu des fonctions Open units menu Ouvrir le menu des unités Open variables menu Ouvrir le menu des variables Toggle fraction format in current result Default Défaut Formatted result Résultat formaté Unformatted ASCII result Résultat ASCII non formaté Unformatted ASCII result without units Résultat ASCII non formaté sans unités Formatted expression Expression formatée Unformatted ASCII expression Expression ASCII non formatée Formatted expression + result Expression formatée + résultat Unformatted ASCII expression + result Expression ASCII non formatée + résultat QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Annuler Close Only used when Qt translation is missing Fermer &Yes Only used when Qt translation is missing &Oui &No Only used when Qt translation is missing &Non &Open Only used when Qt translation is missing &Ouvrir &Save Only used when Qt translation is missing &Sauvegarder &Select All Only used when Qt translation is missing &Sélectionner tout Look in: Only used when Qt translation is missing Regarder dans: File &name: Only used when Qt translation is missing Nom de &fichier: Files of type: Only used when Qt translation is missing QalculateWindow Show toolbar Afficher la barre d'outils Menu Menu New Nouveau Function… Fonction… Variable/Constant… Variable/constante… Unknown Variable… Variable de l'inconnue… Matrix… Matrice… Unit… Unité… Workspaces Espaces de travail Open… Ouvrir… Open default Ouvrir par défaut Save Enregistrer Save As… Enregistrer sous… Import CSV File… Importer un fichier CSV… Export CSV File… Exporter en fichier CSV… Functions Fonctions Variables and Constants Variables et constantes Units Unités Data Sets Ensembles de données Plot Functions/Data Fonctions/Données du Graph Floating Point Conversion (IEEE 754) Conversion en virgule flottante (IEEE 754) Calendar Conversion Conversion calendrier Percentage Calculation Tool Outil de calcul de pourcentages Periodic Table Tableau périodique Update Exchange Rates Mettre à jour les taux de change Normal Mode Mode normal RPN Mode Mode NPI Chain Mode Mode chaîne Keyboard Shortcuts Raccourcis clavier Preferences Préférences Open Settings Folder(s) Ouvrir le dossier de paramètres Ouvrir les dossiers de paramètres Help Aide Report a Bug Reporter un bug Check for Updates Vérifier les mises à jour About %1 À propos de %1 Quit Quitter Mode Mode General Display Mode Mode d'affichage général Normal Normal Scientific Scientifique Engineering Ingénierie Simple Simple Angle Unit Unité d'angle Radians Radians Degrees Degrés Gradians Grades Other Autre Approximation Approximation Automatic Automatic approximation Automatique Dual Dual approximation Double Exact Exact approximation Exact Approximate Approximatif Assumptions Suppositions Type Assumptions type Type Number Nombre Real Réel Rational Rationnel Integer Entier Boolean Booléen Sign Assumptions sign Signe Unknown Unknown assumptions sign Inconnue Non-zero Non nul Positive Positif Non-negative Positif ou nul Negative Négatif Non-positive Négatif ou nul Result Base Base de résultats Binary Binaire Octal Octal Decimal Décimal Hexadecimal Hexadécimal Duodecimal Duodécimal Sexagesimal Sexagésimal Time format Format de l'heure Roman numerals Chiffres romains Unicode Unicode Bijective base-26 Bijectif base-26 Binary-coded decimal (BCD) Décimal codé en binaire Custom: Number base Personnalisée: Expression Base Base d'expression Precision: Précision: Min decimals: Décimales min: Max decimals: Décimales max: off Max decimals désactivé Convert Convertir Store Magasin Plot Graph Number bases Bases numériques Keypad Clavier General Général Programming Programmation Algebra Algèbre Custom Personnalisé Number Pad Pavé numérique None Aucune Always Show Number Pad Toujours afficher le pavé numérique Separate Menu Buttons Boutons de menu séparés Reset Keypad Position Réinitialiser la position du clavier Binary: Binaire: Octal: Octal: Decimal: Décimal: Hexadecimal: Hexadécimal: RPN Stack Pile NPI EXACT EXACTE APPROX APPROX RPN NPI CHN CHN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAIN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FONC UNIT UNITÉ VAR VAR INF INF CPLX CPLX Approximation && Fractions Approximation et fractions Approximation and Fractions Approximation et fractions Show Custom Column Afficher la colonne personnalisée Icons only Icônes uniquement Text only Texte uniquement Text beside icons Texte à côté des icônes Text under icons Texte sous les icônes Copy Copier <i>Right-click/long press</i>: %1 <i>Clic droit/pression longue</i> : %1 Open menu Ouvrir le menu Number Bases Bases numériques <i>Middle-click</i>: %1 <i>Clic du milieu</i> : %1 Conversion operator Opérateur de conversion Rotate the stack or move the selected register up Faire pivoter la pile ou déplacer le registre sélectionné vers le haut Rotate the stack or move the selected register down Faire pivoter la pile ou déplacer le registre sélectionné vers le bas Swap the top two values or move the selected value to the top of the stack Échangez les deux valeurs supérieures ou déplacez la valeur sélectionnée vers le haut de la pile Delete the top or selected value Supprimer la valeur supérieure ou sélectionnée Enter the top value from before the last numeric operation Entrez la valeur supérieure avant la dernière opération numérique Copy the selected or top value to the top of the stack Copiez la valeur sélectionnée ou supérieure en haut de la pile Clear the RPN stack Vider la pile NPI New Function… Nouvelle fonction… Favorites Favoris Recent Récent User functions Fonctions utilisateur Open dialog Ouvrir la boîte de dialogue Show all functions Afficher toutes les fonctions User units Unités utilisateur more plus Prefixes Préfixes Show all units Afficher toutes les unités User variables Variables utilisateur Show all variables Afficher toutes les variables Powerful and easy to use calculator Une calculatrice puissante et facile d'utilisation License: GNU General Public License version 2 or later Licence : GNU General Public License version 2 ou ultérieure %1: %1 : Error Erreur Couldn't write definitions Ne peut pas écrire de définitions hexadecimal hexadécimal octal octal decimal décimal duodecimal duodécimal binary binaire roman romain bijective bijectif sexagesimal sexagésimal latitude latitude longitude longitude time temps scientific scientifique engineering ingénieur simple simple Time zone parsing failed. L'analyse du fuseau horaire a échoué. bases bases calendars calendriers rectangular algébrique cartesian cartésien exponential exponentielle polar polaire phasor phaseur angle angle optimal optimal prefix préfixe base base base base units base mixed mixte factors facteurs partial fraction fraction partielle base number base base decimals décimales fraction fraction factorize factoriser expand développer Calculating… Calcul en cours… Cancel Annuler RPN Operation Opération NPI Factorizing… Factorisation en cours… Expanding partial fractions… Développement des fractions partielles… Expanding… Développement en cours… Converting… Conversion en cours… RPN Register Moved Registre NPI déplacé Processing… Traitement en cours… Matrix Matrice Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode Mode de calcul de température The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner le mode de calcul de la température (le mode pourra être modifié ultérieurement dans les préférences). Absolute Absolu Relative Relatif Hybrid Hybride Please select desired variant of the sinc function. Veuillez sélectionner la variante souhaitée de la fonction sinc. Unnormalized Non normalisé Normalized Normalisé Interpretation of dots Interprétation des points Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Veuillez sélectionner l'interprétation des points (".") (cela peut être modifié ultérieurement dans les préférences). Both dot and comma as decimal separators Le point et la virgule comme séparateurs décimaux Dot as thousands separator Point comme séparateur de milliers Comma as thousands separator Only dot as decimal separator Seul un point comme séparateur décimal Comma as separator for function arguments and matrix/vector elements Parsing Mode Mode d'analyse The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). L'expression est ambiguë. Veuillez sélectionner l'interprétation des expressions avec multiplication implicite (cela peut être modifié ultérieurement dans les préférences). Implicit multiplication first Multiplication implicite en premier Conventional Conventionnelle Adaptive Adaptif Percentage Interpretation Interprétation du pourcentage Please select interpretation of percentage addition Veuillez sélectionner l'interprétation de l'addition en pourcentage Add percentage of original value Ajouter un pourcentage de la valeur d'origine Add percentage multiplied by 1/100 Ajouter un pourcentage multiplié par 1/100 Add Action (%1) Ajouter action (%1) Edit Keyboard Shortcut Éditer raccourci clavier New Keyboard Shortcut Nouveau raccourci clavier Action Action Value: Valeur: Set key combination Définir la combinaison de touches Press the key combination you wish to use for the action. Appuyer sur la combinaison de touches que vous souhaitez utiliser pour l'action. Reserved key combination Combinaison de touches réservée Question Question The key combination is already in use. Do you wish to replace the current action (%1)? La combinaison de touches est déjà utilisée. Souhaitez-vous remplacer l'action en cours (%1)? Key combination Combinaison de touches Add… Ajouter… Edit… Éditer… Remove Supprimer Gnuplot was not found Impossible de trouver Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) a besoin d'être installé séparement, et indiquer son chemin d'installation dans la recherche de chemin de l'exécutable, pour faire fonctionner les graphs. Example: Example of function usage Exemple : Keep open Garder ouvert Enter RPN Enter Entrer Calculate Calculer Apply to Stack Appliquer à la pile Insert Insérer Value Valeur Argument Argument True Vrai False Faux Info Info optional optional argument optionnel Failed to open %1. %2 Impossible d'ouvrir %1. %2 Failed to open workspace Échec de l'ouverture de l'espace de travail Couldn't save workspace Impossible d'enregistrer l'espace de travail Save file? Enregistrer le fichier? Do you want to save the current workspace? Voulez-vous enregistrer l'espace de travail actuel? Do not ask again Ne plus demander UnitEditDialog General Général Relation Relation Name: Nom : Category: Catégorie : Descriptive name: Nom descriptif : System: Système: Imperial Impérial US Survey US étude Hide unit Cacher unité Description: Description : Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. La classe à laquelle appartient cette unité. Les unités dérivées nommées sont définies par rapport à une seule autre unité, avec un exposant facultatif, tandis que les unités dérivées (non nommées) sont définies par une expression d'unité avec une ou plusieurs unités. Base unit Unité de base Named derived unit Unité dérivée nommée Derived unit Unité dérivée Base unit(s): Unité(s) de base : Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unité (pour une unité dérivée nommée) ou expression d'unité (pour une unité dérivée non nommée) par rapport à laquelle cette unité est définie Exponent: Exposant: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relation avec l'unité de base. Pour les relations linéaires, cela devrait simplement être un nombre<br><br>Pour les relations non linéaires, utilisez \x pour le facteur et \y pour l'exposant (par exemple "\x + 273,15" pour la relation entre les degrés Celsius et Kelvin). Inverse relation: Rapport inversé: Specify for non-linear relation, for conversion back to the base unit. Spécifiez pour une relation non linéaire, pour la reconversion vers l'unité de base. Mix with base unit Mélanger avec l'unité de base Priority: Priorité: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Numéro d'unité de base minimum : Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Utiliser avec des préfixes par défaut Error Erreur Base unit does not exist. L'unité de base n'existe pas. Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Unit Éditer unité New Unit Nouvelle unité UnitsDialog Units Unités Category Catégorie Unit Unité New… Nouveau… Edit… Éditer… Deactivate Désactiver Delete Supprimer Convert Convertir Insert Insérer Favorite Favori Show hidden units Afficher les unités cachées Inactive Inactif Uncategorized Non classé Activate Activer Favorites Favoris User units Unités utilisateur All All units Tout UnknownEditDialog Name: Nom : Custom assumptions Suppositions personnalisées Type: Type: Sign: Signe: Temporary Temporaire Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Unknown Variable Éditer la variable de l'inconnue New Unknown Variable Nouvelle variable de l'inconnue VariableEditDialog Required Requis Description Description Name: Nom : Value: Valeur : current result résultat actuel Temporary Temporaire Category: Catégorie : Descriptive name: Nom descriptif : Hide variable Cacher variable Description: Description : Question Question A unit or variable with the same name already exists. Do you want to overwrite it? Une unité ou variable portant le même nom existe déjà. Voulez-vous l'écraser ? Edit Variable Éditer variable New Variable Nouvelle variable VariablesDialog Variables Variables Category Catégorie Variable Variable New Nouveau Variable/Constant… Variable/constante… Unknown Variable… Variable inconnue… Matrix… Matrice… Edit… Éditer… Export… Exporter… Deactivate Désactiver Delete Supprimer Insert Insérer Favorite Favori Inactive Inactif Uncategorized Non classé a matrix une matrice a vector un vecteur positive positif non-positive négatif et non nul negative négatif non-negative positif et non nul non-zero non nul integer entier boolean booléen rational rationnel real réel complex complexe number nombre not matrix pas de matrice unknown inconnue Default assumptions Suppositions par défaut Activate Activer Favorites Favoris User variables Variables utilisateur All All variables Tout qalculate-qt-5.11.0/translations/qalculate-qt_ka.ts000066400000000000000000012135301520501070600223350ustar00rootroot00000000000000 ArgumentEditDialog Name: სáƒ�ხელი: Type: ტიპი: Free უფáƒ�სáƒ� Number რიცხვი Integer მთელი რიცხვი Symbol სიმბáƒ�ლáƒ� Text ტექსტი Date თáƒ�რიღი Vector ვექტáƒ�რი Matrix მáƒ�ტრიცáƒ� Boolean ბულევი Angle კუთხე Object áƒ�ბიექტი Function ფუნქციáƒ� Unit ერთეული Variable ცვლáƒ�დი File ფáƒ�ილი Enable rules and type test წესების ჩáƒ�რთვáƒ� დáƒ� ტიპის შემáƒ�წმებáƒ� Custom condition: მáƒ�რგებული პირáƒ�ბáƒ�: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) მáƒ�გáƒ�ლითáƒ�დ, თუ áƒ�რგუმენტი მáƒ�ტრიცáƒ�áƒ�, რáƒ�მელსáƒ�ც მწკრივებისáƒ� დáƒ� სვეტების ტáƒ�ლი რáƒ�áƒ�დენáƒ�ბáƒ� უნდáƒ� ჰქáƒ�ნდეთ: rows(\x) = columns(\x) Allow matrix მáƒ�ტრიცის დáƒ�შვებáƒ� Forbid zero ნულის áƒ�კრძáƒ�ლვáƒ� Handle vector ვექტáƒ�რის დáƒ�მშáƒ�ვებáƒ� Calculate function for each separate element in vector. ფუნქციის გáƒ�მáƒ�თვლáƒ� ვექტáƒ�რის თითáƒ�ეული ცáƒ�ლკეული ელემენტისთვის. Min მინ Include equals ტáƒ�ლáƒ�ბების ჩáƒ�სმáƒ� Max მáƒ�ქს CSVDialog Import CSV File CSV ფáƒ�ილის შემáƒ�ტáƒ�ნáƒ� Export CSV File CSV ფáƒ�ილის გáƒ�ტáƒ�ნáƒ� Current result მიმდინáƒ�რე შედეგი Matrix/vector variable: მáƒ�ტრიცული/ვექტáƒ�რული ცვლáƒ�დი: File: ფáƒ�ილი: Import as შემáƒ�ტáƒ�ნáƒ�, რáƒ�გáƒ�რც matrix მáƒ�ტრიცáƒ� vectors ვექტáƒ�რები Name: სáƒ�ხელი: First row: პირველი მწკრივი: Includes headings სáƒ�თáƒ�ურების ჩáƒ�სმáƒ� Delimiter: გáƒ�მყáƒ�ფი: Comma მძიმე Tabulator ტáƒ�ბულáƒ�ტáƒ�რი Semicolon წერტილმძიმე Space ჰáƒ�რე Other სხვáƒ� Question კითხვáƒ� A unit or variable with the same name already exists. Do you want to overwrite it? ერთეული, áƒ�ნ ცვლáƒ�დი იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Error შეცდáƒ�მáƒ� Could not import from file %1 შემáƒ�ტáƒ�ნის შეცდáƒ�მáƒ� ფáƒ�ილიდáƒ�ნ %1 No matrix or vector variable with the entered name was found. შეყვáƒ�ნილი სáƒ�ხელის მქáƒ�ნე ცნáƒ�ბილი მáƒ�ტრიცული áƒ�ნ ვექტáƒ�რული ცვლáƒ�დი áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. Could not export to file %1 გáƒ�ტáƒ�ნის შეცდáƒ�მáƒ� ფáƒ�ილში %1 CalendarConversionDialog Calendar Conversion კáƒ�ლენდრის გáƒ�დáƒ�ყვáƒ�ნáƒ� Gregorian გრეგáƒ�რიáƒ�ნული Hebrew ივრითი Islamic (Hijri) ისლáƒ�მური (ჰიჯრი) Persian (Solar Hijri) სპáƒ�რსული (მზის ჰიჯრი) Indian (National) ინდური (ნáƒ�ციáƒ�ნáƒ�ლური) Chinese ჩინური Julian ჯულიენი Revised Julian (Milanković) იულიუსისეული ჩáƒ�სწáƒ�რებული (მილáƒ�ნკáƒ�ვიჩი) Coptic კáƒ�პტური Ethiopian ეთიáƒ�პიური Error შეცდáƒ�მáƒ� The selected Chinese year does not exist. áƒ�რჩეული ჩინური წელიწáƒ�დი áƒ�რ áƒ�რსებáƒ�ბს. Conversion to Gregorian calendar failed. გრეგáƒ�რიáƒ�ნულ კáƒ�ლენდáƒ�რზე გáƒ�დáƒ�ყვáƒ�ნáƒ� ჩáƒ�ვáƒ�რდáƒ�. Calendar conversion failed for: %1. კáƒ�ლენდრის გáƒ�დáƒ�ყვáƒ�ნáƒ� ჩáƒ�ვáƒ�რდáƒ�: %1. DataObjectEditDialog %1: %1: Default ნáƒ�გულისხმევი Approximate დáƒ�áƒ�ხლáƒ�ებით Exact ზუსტი Edit Data Object მáƒ�ნáƒ�ცემთáƒ� áƒ�ბიექტის ცáƒ�სწáƒ�რებáƒ� New Data Object áƒ�ხáƒ�ლი მáƒ�ნáƒ�ცემთáƒ� áƒ�ბიექტი DataPropertyEditDialog Name: სáƒ�ხელი: Descriptive name: გáƒ�სáƒ�გები სáƒ�ხელი: Description: áƒ�ღწერáƒ�: Value type: მნიშვნელáƒ�ბის ტიპი: Expression გáƒ�მáƒ�სáƒ�ხულებáƒ� Number რიცხვი Text ტექსტი Unit expression: ერთეულის გáƒ�მáƒ�სáƒ�ხულებáƒ�: Use as key გáƒ�მáƒ�ყენებáƒ� გáƒ�სáƒ�ღების სáƒ�ხით Case sensitive value მნიშვნელáƒ�ბáƒ�ში დიდი დáƒ� პáƒ�ტáƒ�რáƒ� áƒ�სáƒ�ები გáƒ�ნსხვáƒ�ვდებáƒ� Approximate value დáƒ�áƒ�ხლáƒ�ებითი მნისვნელáƒ�ბáƒ� Value uses brackets მნიშვნელáƒ�ბáƒ� იყენებს ფრჩხილებს Hide დáƒ�მáƒ�ლვáƒ� Edit Data Property მáƒ�ნáƒ�ცემთáƒ� თვისების ჩáƒ�სწáƒ�რებáƒ� DataSetEditDialog General ზáƒ�გáƒ�დი Properties თვისებები Function ფუნქციáƒ� Descriptive name: გáƒ�სáƒ�გები სáƒ�ხელი: Data file: მáƒ�ნáƒ�ცემების ფáƒ�ილი: Description: áƒ�ღწერáƒ�: Copyright: უფლებები: Title სáƒ�თáƒ�ური Name სáƒ�ხელი Type ტიპი Add დáƒ�მáƒ�ტებáƒ� Edit ჩáƒ�სწáƒ�რებáƒ� Remove წáƒ�შლáƒ� Name: სáƒ�ხელი: Object argument name: áƒ�ბიექტის áƒ�რგუმენტის სáƒ�ხელი: Property argument name: თვისების áƒ�რგუმენტის სáƒ�ხელი: Default property: ნáƒ�გულისხმევი თვისებáƒ�: text ტექსტი approximate approximate number ნáƒ�მერი expression გáƒ�მსáƒ�ხულებáƒ� key გáƒ�სáƒ�ღები Question კითხვáƒ� A function with the same name already exists. Do you want to overwrite the function? ფუნქციáƒ� იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Data Sets მáƒ�ნáƒ�ცემის სეტები Object áƒ�ბიექტი Property თვისებáƒ� Edit Data Set მáƒ�ნáƒ�ცემთáƒ� ნáƒ�კრების ჩáƒ�სწáƒ�რებáƒ� New Data Set áƒ�ხáƒ�ლი მáƒ�ნáƒ�ცემთáƒ� ნáƒ�კრები DataSetsDialog Data Sets მáƒ�ნáƒ�ცემის სეტები Data sets: მáƒ�ნáƒ�ცემთáƒ� სეტები: New… áƒ�ხáƒ�ლი… Edit… ჩáƒ�სწáƒ�რებáƒ�… Delete წáƒ�შლáƒ� Objects: áƒ�ბიექტები: Data set description: მáƒ�ნáƒ�ცემთáƒ� სეტის áƒ�ღწერáƒ�: Object attributes: áƒ�ბიექტის áƒ�ტრიბუტები: Properties თვისებები key გáƒ�სáƒ�ღები Data Retrieval Function მáƒ�ნáƒ�ცემების მიღების ფუნქციáƒ� argument áƒ�რგუმენტი ExpressionEdit matrix მáƒ�ტრიცáƒ� vector ვექტáƒ�რი positive დáƒ�დებითი non-positive áƒ�რáƒ�-დáƒ�დებითი negative უáƒ�რყáƒ�ფითი non-negative áƒ�რáƒ�-უáƒ�რყáƒ�ფითი non-zero áƒ�რáƒ�-ნულáƒ�ვáƒ�ნი boolean ლáƒ�გიკური integer მთელი რიცხვი rational რáƒ�ციáƒ�ნáƒ�ლური real რეáƒ�ლი complex კáƒ�მპლექსური number ნáƒ�მერი (not matrix) (მáƒ�ტრიცáƒ� áƒ�რáƒ�áƒ�) unknown უცნáƒ�ბი default assumptions ნáƒ�გულისხმევი დáƒ�შვებები Prefix: პრეფიქსი: Complex Angle/Phasor Notation კáƒ�მპლექსური რიცხვის კუთხის/ვექტáƒ�რის ნáƒ�ტáƒ�ციáƒ� Base units ძირითáƒ�დი ერთეულები Number Base áƒ�თვლის სისტემáƒ� Binary-Coded Decimal ბინáƒ�რულáƒ�დ კáƒ�დირებული áƒ�თáƒ�ბითი Bijective Base-26 ბიექტური სáƒ�ბáƒ�ზისáƒ�-26 Binary Number áƒ�რáƒ�ბითი რიცხვი Calendars კáƒ�ლენდრები Complex cis Form კáƒ�მპლექსური ცის ფáƒ�რმáƒ� Decimal Number áƒ�თáƒ�ბითი რიცხვი Duodecimal Number თáƒ�რმეტáƒ�ბითი რიცხვი Complex Exponential Form კáƒ�მპლექსური რიცხვის ექსპáƒ�ნენტური ფáƒ�რმáƒ� Factors მáƒ�მრáƒ�ვლები 16-bit Floating Point Binary Format 16-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი áƒ�რáƒ�ბითი ფáƒ�რმáƒ�ტი 32-bit Floating Point Binary Format 32-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი áƒ�რáƒ�ბითი ფáƒ�რმáƒ�ტი 64-bit Floating Point Binary Format 64-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი áƒ�რáƒ�ბითი ფáƒ�რმáƒ�ტი 80-bit (x86) Floating Point Binary Format 80-ბიტიáƒ�ნი(x86) მცურáƒ�ვმძიმიáƒ�ნი áƒ�რáƒ�ბითი ფáƒ�რმáƒ�ტი 128-bit Floating Point Binary Format 128-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი áƒ�რáƒ�ბითი ფáƒ�რმáƒ�ტი Fraction ნáƒ�წილი Decimal Fraction áƒ�თწილáƒ�დები Hexadecimal Number თექვსმეტáƒ�ბითი რიცხვი Latitude გáƒ�ნედი Longitude გრძედი Mixed Units შერეული ერთეულები Octal Number რვáƒ�áƒ�ბითი რიცხვი Optimal Unit áƒ�პტიმáƒ�ლური ერთეული Optimal Prefix áƒ�პტიმáƒ�ლური პრეფიქსი Expanded Partial Fractions გáƒ�ფáƒ�რთáƒ�ებული áƒ�თწილáƒ�დის წილáƒ�დები Complex Polar Form კáƒ�მპლექსური რიცხვის პáƒ�ლáƒ�რული ფáƒ�რმáƒ� Complex Rectangular Form კáƒ�მპლექსური რიცხვის áƒ�თხკუთხედი ფáƒ�რმáƒ� Roman Numerals რáƒ�მáƒ�ული ციფრები Sexagesimal Number ექვსáƒ�ბითი რიცხვი Time Format დრáƒ�ის ფáƒ�რმáƒ�ტი Unicode უნიკáƒ�დი UTC Time Zone UTC დრáƒ�ის სáƒ�რტყელი Scientific Notation სáƒ�მეცნიერáƒ� ნáƒ�ტáƒ�ციáƒ� Engineering Notation სáƒ�ინჟინრáƒ� ნáƒ�ტáƒ�ცáƒ� Undo გáƒ�უქმებáƒ� Redo გáƒ�მეáƒ�რებáƒ� Cut áƒ�მáƒ�ჭრáƒ� Copy კáƒ�პირებáƒ� Paste ჩáƒ�სმáƒ� Delete წáƒ�შლáƒ� Calculate Selection მáƒ�ნიშნულის გáƒ�მáƒ�თვლáƒ� Insert Date… თáƒ�რიღის ჩáƒ�სმáƒ�… Insert Matrix… მáƒ�ტრიცის ჩáƒ�სმáƒ�… Select All ყველáƒ�ფრის მáƒ�ნიშვნáƒ� Clear გáƒ�სუფთáƒ�ვებáƒ� Clear History ისტáƒ�რიის გáƒ�წმენდáƒ� Completion დáƒ�სრულებáƒ� No completion დáƒ�სრულების გáƒ�რეშე Limited strict completion შეზღუდული მკáƒ�ცრი დáƒ�სრულებáƒ� Strict completion მკáƒ�ცრი დáƒ�სრულებáƒ� Limited full completion შეზღუდული სრული დáƒ�სრულებáƒ� Full completion სრული დáƒ�სრულებáƒ� Delayed completion დáƒ�ყáƒ�ვნებული დáƒ�სრულებáƒ� Expression Status გáƒ�მáƒ�სáƒ�ხულების სტáƒ�ტუსი Off გáƒ�მáƒ�რთ In history list ისტáƒ�რიის სიáƒ�ში In expression field გáƒ�მáƒ�სáƒ�ხულების ველში In status bar სტáƒ�ტუსის ზáƒ�ლში With delay დáƒ�ყáƒ�ვნებით With adaptive delay áƒ�დáƒ�პტიური დáƒ�ყáƒ�ვნებით Without delay დáƒ�ყáƒ�ვნების გáƒ�რეშე Automatically calculate selection მáƒ�ნიშნულის áƒ�ვტáƒ�მáƒ�ტური გáƒ�მáƒ�თვლáƒ� Use input method შეყვáƒ�ნის მეთáƒ�დის გáƒ�მáƒ�ყენებáƒ� Matrix მáƒ�ტრიცáƒ� Too many arguments for %1(). მეტისმეტáƒ�დ ბევრი áƒ�რგუმენტი ფუნქციისთვის %1(). argument áƒ�რგუმენტი %1: %1: comment კáƒ�მენტáƒ�რი MC (memory clear) MC (მეხსიერების გáƒ�სუფთáƒ�ვებáƒ�) MS (memory store) MS (მეხსიერებáƒ�ში დáƒ�მáƒ�ხსáƒ�ვრებáƒ�) M+ (memory plus) M+ (მიმáƒ�ტებáƒ� მეხსიერებáƒ�ში მყáƒ�ფ მნიშვნელáƒ�ბáƒ�ზე) M− (memory minus) M- (მეხსიერებáƒ�ში მყáƒ�ფ მნიშვნელáƒ�ბáƒ�ზე გáƒ�მáƒ�კლებáƒ�) factorize მáƒ�მრáƒ�ვლებáƒ�დ დáƒ�შლáƒ� expand áƒ�მáƒ�კეცვáƒ� hexadecimal თექვსმეტáƒ�ბითი hexadecimal number თექვსმეტáƒ�ბითი რიცხვი octal რვáƒ�áƒ�ბითი octal number რვáƒ�áƒ�ბითი რიცხვი decimal áƒ�თáƒ�ბითი decimal number áƒ�თáƒ�ბითი რიცხვი duodecimal თáƒ�რმეტáƒ�ბითი duodecimal number თáƒ�რმეტáƒ�ბითი რიცხვი binary ბინáƒ�რული binary number áƒ�რáƒ�ბითი რიცხვი roman რáƒ�მáƒ�ნული roman numerals რáƒ�მáƒ�ული რიცხვები bijective ბიექტურáƒ�ბáƒ� bijective base-26 ბიექტური სáƒ�ბáƒ�ზისáƒ�-26 binary-coded decimal ბინáƒ�რულáƒ�დ კáƒ�დირებული áƒ�თáƒ�ბითი sexagesimal ექვსáƒ�ბითი sexagesimal number ექვსáƒ�ბითი რიცხვი latitude გáƒ�ნედი longitude გრძედი 32-bit floating point 32-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი რიცხვი 64-bit floating point 64-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი რიცხვი 16-bit floating point 16-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი რიცხვი 80-bit (x86) floating point 80-ბიტიáƒ�ნი(x86) მცურáƒ�ვმძიმიáƒ�ნი 128-bit floating point 128-ბიტიáƒ�ნი მცურáƒ�ვმძიმიáƒ�ნი time დრáƒ� time format დრáƒ�ის ფáƒ�რმáƒ�ტი scientific სáƒ�მეცნიერáƒ� scientific notation სáƒ�მეცნიერáƒ� ჩáƒ�ნáƒ�წერი engineering სáƒ�ინჟინრáƒ� engineering notation სáƒ�ინჟინრáƒ� ნáƒ�ტáƒ�ცáƒ� simple მáƒ�რტივი simple notation მáƒ�რტივი ნáƒ�ტáƒ�ციáƒ� bases ფუძეები number bases რიცხვის ფუძეები calendars კáƒ�ლენდრები optimal áƒ�პტიმáƒ�ლური optimal unit áƒ�პტიმáƒ�ლური ერთეული prefix პრეფიქსი optimal prefix áƒ�პტიმáƒ�ლური პრეფიქსი base base units ბáƒ�ზáƒ� base units ძირითáƒ�დი ერთეულები mixed შერეული mixed units შერეული ერთეულები factors factors partial fraction ნáƒ�წილáƒ�ბრივი წილáƒ�დი expanded partial fractions გáƒ�ფáƒ�რთáƒ�ებული áƒ�თწილáƒ�დის წილáƒ�დები rectangular მáƒ�რთკუთხედი cartesian დეკáƒ�რტის complex rectangular form კáƒ�მპლექსური áƒ�თხკუთხედი ფáƒ�რმáƒ� exponential ექსპáƒ�ტენციáƒ�ლური complex exponential form კáƒ�მპლექსური ექსპáƒ�ნენტური ფáƒ�რმáƒ� polar პáƒ�ლáƒ�რული complex polar form კáƒ�მპლექსური პáƒ�ლáƒ�რული ფáƒ�რმáƒ� complex cis form კáƒ�მპლექსური ცის ფáƒ�რმáƒ� angle angle complex angle notation კáƒ�მპლექსური რიცხვის კუთხის ნáƒ�ტáƒ�ციáƒ� phasor ფáƒ�ზური complex phasor notation კáƒ�მპლექსური რიცხვის ვექტáƒ�რის ნáƒ�ტáƒ�ციáƒ� UTC time zone UTC დრáƒ�ის სáƒ�რტყელი base number base ბáƒ�ზáƒ� number base %1 რიცხვის ბáƒ�ზáƒ�áƒ� %1 decimals áƒ�თწილáƒ�დები decimal fraction áƒ�თწილáƒ�დის წილáƒ�დი fraction ნáƒ�წილი Data object მáƒ�ნáƒ�ცემის áƒ�ბიექტი Simple Notation მáƒ�რტივი ნáƒ�ტáƒ�ციáƒ� Custom ხელით FPConversionDialog Floating Point Conversion (IEEE 754) მცურáƒ�ვმძიმიáƒ�ნის გáƒ�დáƒ�ყვáƒ�ნáƒ� (IEEE 754) Format ფáƒ�რმáƒ�ტი 16-bit (half precision) 16-ბიტიáƒ�ნი (ნáƒ�ხევრáƒ�დ სიზუსტე) 32-bit (single precision) 32-ბიტიáƒ�ნი (ერთჯერáƒ�დი სიზუსტე) 64-bit (double precision) 64-ბიტიáƒ�ნი (áƒ�რმáƒ�გი სიზუსტე) 80-bit (x86 extended format) 80-ბიტიáƒ�ნი (x86 გáƒ�ფáƒ�რთáƒ�ებული ფáƒ�რმáƒ�ტი) 128-bit (quadruple precision) 128-ბიტიáƒ�ნი (áƒ�თხმáƒ�გი სიზუსტე) Microchip 24-bit 24-ბიტიáƒ�ნი მიკრáƒ�ჩიპი Microchip 32-bit 32-ბიტიáƒ�ნი მიკრáƒ�ჩიპი Value მნიშვნელáƒ�ბáƒ� Binary representation áƒ�რáƒ�ბითი წáƒ�რმáƒ�დგენáƒ� Hexadecimal representation თექვსმეტáƒ�ბითი რიცხვების გáƒ�დáƒ�ყვáƒ�ნáƒ� Floating point value მცურáƒ�ვმძიმიáƒ�ნი მნიშვნელáƒ�ბáƒ� Conversion error გáƒ�დáƒ�ყვáƒ�ნის შეცდáƒ�მáƒ� FunctionEditDialog Required áƒ�უცილებელიáƒ� Details დეტáƒ�ლები Description áƒ�ღწერáƒ� Name: სáƒ�ხელი: Expression: გáƒ�მáƒ�სáƒ�ხულებáƒ�: Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") გáƒ�მáƒ�იყენეთ x, y, დáƒ� z (e.g. "(x+y)/2"), áƒ�ნ \x, \y, \z, \a, \b, … (მáƒ�გ: "(\x+\y)/2") Category: კáƒ�ტეგáƒ�რიáƒ�: Descriptive name: გáƒ�სáƒ�გები სáƒ�ხელი: Hide function ფუნქციის დáƒ�მáƒ�ლვáƒ� Example: მáƒ�გáƒ�ლითი: Description: áƒ�ღწერáƒ�: Condition: პირáƒ�ბáƒ�: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") პირáƒ�ბáƒ�, რáƒ�მელიც ჭეშმáƒ�რიტი უნდáƒ� იყáƒ�ს ფუნქციისთვის (მáƒ�გ: თუ მეáƒ�რე áƒ�რგუმენტი პირველზე მეტი უნდáƒ� იყáƒ�ს: "\y > \x") Sub-functions: ქვეფუნქციები: Expression გáƒ�მáƒ�სáƒ�ხულებáƒ� Precalculate წინáƒ�სწáƒ�რი გáƒ�მáƒ�თვლáƒ� Reference მითითებáƒ� Add დáƒ�მáƒ�ტებáƒ� Edit ჩáƒ�სწáƒ�რებáƒ� Remove წáƒ�შლáƒ� Arguments: áƒ�რგუმენტები: Name სáƒ�ხელი Type ტიპი Warning გáƒ�ფრთხილებáƒ� Conversion (using "to") is not supported in functions. გáƒ�დáƒ�ყვáƒ�ნáƒ� ("to"-ის გáƒ�მáƒ�ყენებით) ფუნქციებში მხáƒ�რდáƒ�ჭერილი áƒ�რáƒ�áƒ�. Question კითხვáƒ� A function with the same name already exists. Do you want to overwrite the function? ფუნქციáƒ� იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Edit Function ფუნქციის ჩáƒ�სწáƒ�რებáƒ� New Function áƒ�ხáƒ�ლი ფუნქციáƒ� FunctionsDialog Functions ფუნქციები Category კáƒ�ტეგáƒ�რიáƒ� Function ფუნქციáƒ� New… áƒ�ხáƒ�ლი… Edit… ჩáƒ�სწáƒ�რებáƒ�… Deactivate დეáƒ�ქტივáƒ�ციáƒ� Delete წáƒ�შლáƒ� Calculate… გáƒ�მáƒ�თვლáƒ�… Apply გáƒ�დáƒ�ტáƒ�რებáƒ� Insert ჩáƒ�სმáƒ� Favorite რჩეული Inactive áƒ�რáƒ�áƒ�ქტიური Uncategorized კáƒ�ტეგáƒ�რიის გáƒ�რეშე argument áƒ�რგუმენტი Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. მიიღებს მáƒ�ნáƒ�ცემებს %1 მáƒ�ნáƒ�ცემთáƒ� ნáƒ�კრებიდáƒ�ნ მáƒ�ცემული áƒ�ბიექტისთვის დáƒ� თვისებისთვის თუ თვისებáƒ�დ შეყვáƒ�ნილიáƒ� "info", გáƒ�იხსნებáƒ� დიáƒ�ლáƒ�გი áƒ�ბიექტის ყველáƒ� თვისებით. Example: მáƒ�გáƒ�ლითი: Arguments áƒ�რგუმენტები optional optional argument áƒ�რáƒ�სáƒ�ვáƒ�ლდებულáƒ� default: argument default ნáƒ�გულისხმები: Requirement: Required condition for function მáƒ�თხáƒ�ვნáƒ�: Properties თვისებები %1: %1: key indicating that the property is a data set key გáƒ�სáƒ�ღები Activate áƒ�ქტივáƒ�ციáƒ� Favorites რჩეულები User functions მáƒ�მხმáƒ�რებლის ფუნქციები All All functions ყველáƒ� HistoryView Search… ძებნáƒ�… Search by Date… ძებნáƒ� თáƒ�რიღით… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. შეიყვáƒ�ნეთ ზემáƒ�თ მáƒ�თემáƒ�ტიკური გáƒ�მáƒ�სáƒ�ხულებáƒ� "5 + 2 / 3" დáƒ� დáƒ�áƒ�ჭირეთ ღილáƒ�კს Enter. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. შეიყვáƒ�ნეთ ქვემáƒ�თ მáƒ�თემáƒ�ტიკური გáƒ�მáƒ�სáƒ�ხულებáƒ� "5 + 2 / 3" დáƒ� დáƒ�áƒ�ჭირეთ ღილáƒ�კს Enter. Exchange rate source(s): გáƒ�ცვლის კურსის წყáƒ�რáƒ�:გáƒ�ცვლის კურსის წყáƒ�რáƒ�: updated %1 %1 გáƒ�ნáƒ�ხლდáƒ�%1 გáƒ�ნáƒ�ხლდáƒ� Comment კáƒ�მენტáƒ�რი Insert Value მნიშვნელáƒ�ბის ჩáƒ�სმáƒ� Insert Text ტექსტის ჩáƒ�სმáƒ� Copy კáƒ�პირებáƒ� Copy unformatted ASCII დáƒ�უფáƒ�რმáƒ�ტებელი ASCII-ის კáƒ�პირებáƒ� Select All ყველáƒ�ფრის მáƒ�ნიშვნáƒ� Protect დáƒ�ცვáƒ� Add Comment… კáƒ�მენტáƒ�რის დáƒ�მáƒ�ტებáƒ�… Move to Top თáƒ�ვში áƒ�ტáƒ�ნáƒ� Remove წáƒ�შლáƒ� Clear გáƒ�სუფთáƒ�ვებáƒ� Edit Comment… კáƒ�მენტáƒ�რის ჩáƒ�სწáƒ�რებáƒ�… Search ძებნáƒ� Text: ტექსტი: KeypadButton <i>Right-click/long press</i>: %1 <i>მáƒ�რჯვენáƒ� წკáƒ�პი/დიდხáƒ�ნს დáƒ�ჭერáƒ�</i>: %1 <i>Right-click</i>: %1 <i>მáƒ�რჯვენáƒ� წკáƒ�პი</i>: %1 <i>Long press</i>: %1 <i>დიდხáƒ�ნს დáƒ�ჭერáƒ�</i>: %1 Open menu მენიუს გáƒ�ხსნáƒ� <i>Middle-click</i>: %1 <i>შუáƒ� წკáƒ�პი</i>: %1 KeypadWidget Memory store მეხსიერებáƒ�ში დáƒ�მáƒ�ხსáƒ�ვრებáƒ� Memory clear მეხსიერების გáƒ�სუფთáƒ�ვებáƒ� Memory recall მეხსერებიდáƒ�ნ გáƒ�ხსენებáƒ� Memory add მეხსიერებიდáƒ�ნ მიმáƒ�ტებáƒ� Memory subtract მეხსიერებიდáƒ�ნ გáƒ�მáƒ�კლებáƒ� STO Standard calculator button. Do not use more than three characters. შნხ Store მáƒ�ღáƒ�ზიáƒ� New function áƒ�ხáƒ�ლი ფუნქციáƒ� sin სინ cos კáƒ�ს tan tan Exponentiation ხáƒ�რისხში áƒ�ყვáƒ�ნáƒ� Factorize მáƒ�მრáƒ�ვლებáƒ�დ დáƒ�შლáƒ� Expand áƒ�მáƒ�კეცვáƒ� Percent or remainder პრáƒ�ცენტი, áƒ�ნ ნáƒ�შთი Uncertainty/interval გáƒ�ურკვევლáƒ�ბáƒ�/ინტერვáƒ�ლი Relative error ფáƒ�რდáƒ�ბითი შეცდáƒ�მáƒ� Interval ინტერვáƒ�ლი Move cursor left კურსáƒ�რის მáƒ�რცხნივ გáƒ�დáƒ�ტáƒ�ნáƒ� Move cursor to start კურსáƒ�რის გáƒ�დáƒ�ტáƒ�ნáƒ� დáƒ�სáƒ�წყისში Move cursor right კურსáƒ�რის მáƒ�რჯვნივ გáƒ�დáƒ�ტáƒ�ნáƒ� Move cursor to end კურსáƒ�რის გáƒ�დáƒ�ტáƒ�ნáƒ� ბáƒ�ლáƒ�ში Bitwise AND ბიტური დáƒ� Logical AND ლáƒ�გიკური დáƒ� Bitwise OR ბიტური áƒ�ნ Logical OR ლáƒ�გიკური áƒ�ნ Bitwise Exclusive OR ბიტური ექსკლუზიური áƒ�ნ Bitwise NOT ბიტური áƒ�რáƒ�-áƒ�რ Logical NOT ლáƒ�გიკური áƒ�რáƒ� Bitwise Left Shift ბიტური წáƒ�ნáƒ�ცვლებáƒ� მáƒ�რცხნივ Bitwise Right Shift ბიტური წáƒ�ნáƒ�ცვლებáƒ� მáƒ�რჯვნივ cmp შედ rot შებრ a→1 a→1 Expand partial fractions გáƒ�ფáƒ�რთáƒ�ებული áƒ�თწილáƒ�დის წილáƒ�დები Add column სვეტის დáƒ�მáƒ�ტებáƒ� Add row მწკრივის დáƒ�მáƒ�ტებáƒ� Remove column სვეტის წáƒ�შლáƒ� Remove row მწკრივის წáƒ�შლáƒ� Left parenthesis მáƒ�რცხენáƒ� მრგვáƒ�ლი ფრჩხილი Left vector bracket მáƒ�რცხენáƒ� ვექტáƒ�რული ფრჩხილი Right parenthesis მáƒ�რჯვენáƒ� მრგვáƒ�ლი ფრჩხილი Right vector bracket მáƒ�რჯვენáƒ� ვექტáƒ�რული ფრჩხილი Smart parentheses ჭკვიáƒ�ნი ფრჩხილები Vector brackets ვექტáƒ�რული ფრჩხილები Argument separator áƒ�რგუმენტის გáƒ�მყáƒ�ფი Blank space ცáƒ�რიელი სივრცე New line áƒ�ხáƒ�ლი ხáƒ�ზი Decimal point áƒ�თáƒ�ბითი წერტილი Previous result (static) წინáƒ� შედეგი (სტáƒ�ტიკური) Multiplication გáƒ�მრáƒ�ვლებáƒ� Bitwise Shift ბიტური წáƒ�ნáƒ�ცვლებáƒ� DEL Standard calculator button. Do not use more than three characters. წშლ Delete წáƒ�შლáƒ� Backspace Backspace Addition დáƒ�მáƒ�ტებáƒ� Plus პლუსი Subtraction გáƒ�მáƒ�კლებáƒ� Minus მინუსი Division გáƒ�ნყáƒ�ფილებáƒ� C Standard calculator button. Do not use more than three characters. ცენტრ Clear expression გáƒ�მáƒ�სáƒ�ხულების გáƒ�სუფთáƒ�ვებáƒ� Calculate expression გáƒ�მáƒ�სáƒ�ხულების გáƒ�მáƒ�თვლáƒ� Enable units in physical constants ერთეულების ჩáƒ�რთვáƒ� ფიზიკურ მუდმივებში All constants ყველáƒ� მუდმივáƒ� Percentage Calculation Tool პრáƒ�ცენტის გáƒ�მáƒ�თვლის ხელსáƒ�წყáƒ� more მეტი All units ყველáƒ� ერთეული All variables ყველáƒ� ცვლáƒ�დი Button Action ღილáƒ�კის ქმედებáƒ� Label: ჭდე: Action ქმედებáƒ� None áƒ�რცერთი Value: მნიშვნელáƒ�ბáƒ�: Interval Display ინტერვáƒ�ლის ჩვენებáƒ� Adaptive შეგუებáƒ�დი Significant digits მნიშვნელáƒ�ვáƒ�ნი ციფრები Plus/minus პლუს/მინუს Relative ფáƒ�რდáƒ�ბითი Concise მáƒ�კლე Interval Calculation ინტერვáƒ�ლის გáƒ�მáƒ�თვლáƒ� Variance formula დისპერსიის ფáƒ�რმულáƒ� Interval arithmetic ინტერვáƒ�ლების áƒ�რითმეტიკáƒ� Allow concise uncertainty input მáƒ�კლე გáƒ�ურკვევლáƒ�ბის შეყვáƒ�ნის დáƒ�შვებáƒ� Complex number form კáƒ�მპლექსური რიცხვის ფáƒ�რმáƒ� Rectangular მáƒ�რთკუთხედი Exponential ექსპáƒ�ნენტური Polar პáƒ�ლáƒ�რული Angle/phasor კუთხე/ვექტáƒ�რი Type Assumptions type ტიპი Number რიცხვი Real ნáƒ�მდვილი Rational რáƒ�ციáƒ�ნáƒ�ლური Integer მთელი რიცხვი Boolean ბულევი Sign Assumptions sign ხელმáƒ�წერáƒ� Unknown Unknown assumptions sign უცნáƒ�ბი Non-zero áƒ�რáƒ�-ნულáƒ�ვáƒ�ნი Positive დáƒ�დებითი Non-negative áƒ�რáƒ�-უáƒ�რყáƒ�ფითი Negative უáƒ�რყáƒ�ფითი Non-positive áƒ�რáƒ�-დáƒ�დებითი Default assumptions ნáƒ�გულისხმევი დáƒ�შვებები NamesEditDialog Name სáƒ�ხელი Reference მითითებáƒ� Abbreviation áƒ�ბრევიáƒ�ტურáƒ� Plural მრáƒ�ვლáƒ�ბითი Avoid input შეყვáƒ�ნის თáƒ�ვიდáƒ�ნ áƒ�ცილებáƒ� Suffix სუფიქსი Case sensitive დიდი დáƒ� პáƒ�ტáƒ�რáƒ� áƒ�სáƒ�ების გáƒ�ნსხვáƒ�ვებáƒ� Completion only მხáƒ�ლáƒ�დ დáƒ�სრულებáƒ� Add დáƒ�მáƒ�ტებáƒ� Edit ჩáƒ�სწáƒ�რებáƒ� Remove წáƒ�შლáƒ� Warning გáƒ�ფრთხილებáƒ� Illegal name დáƒ�უშვებელი სáƒ�ხელი A function with the same name already exists. ფუნქციáƒ� იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. A unit or variable with the same name already exists. ერთეული, áƒ�ნ ცვლáƒ�დი იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. PercentageCalculationDialog Percentage პრáƒ�ცენტი Value 1 მნიშვნელáƒ�ბáƒ� 1 Value 2 მნიშვნელáƒ�ბáƒ� 2 Change from 1 to 2 ცვლილებáƒ� 1-დáƒ�ნ 2-მდე Change from 2 to 1 ცვლილებáƒ� 2-დáƒ�ნ 1-მდე 2 compared to 1 2 შედáƒ�რებული 1-თáƒ�ნ 1 compared to 2 1 შედáƒ�რებული 2-თáƒ�ნ Enter two values, of which at most one is a percentage, and the others will be calculated for you. შეიყვáƒ�ნეთ áƒ�რი მნიშვნელáƒ�ბáƒ�, რáƒ�მლიდáƒ�ნáƒ�ც ერთი პრáƒ�ცენტიáƒ� დáƒ� დáƒ�ნáƒ�რჩენებს ჩვენ გáƒ�მáƒ�ვთვლით. Clear გáƒ�სუფთáƒ�ვებáƒ� PeriodicTableDialog Periodic Table პერიáƒ�დული სისტემáƒ� Element Data ელემენტის მáƒ�ნáƒ�ცემები Alkali Metal ტუტე ლითáƒ�ნი Alkaline-Earth Metal ტუტემიწáƒ� ლითáƒ�ნი Lanthanide ლáƒ�ნთáƒ�ნიდი Actinide áƒ�ქტინიდი Transition Metal გáƒ�რდáƒ�მáƒ�ვáƒ�ლი ლითáƒ�ნი Metal მეტáƒ�ლი Metalloid მეტáƒ�ლáƒ�იდები Polyatomic Non-Metal პáƒ�ლიáƒ�ტáƒ�მური áƒ�რáƒ�ლითáƒ�ნი Diatomic Non-Metal დიáƒ�ტáƒ�მური áƒ�რáƒ�ლითáƒ�ნი Noble Gas კეთილშáƒ�ბილი áƒ�ირები Unknown chemical properties უცნáƒ�ბი ქიმიური თვისებები Unknown უცნáƒ�ბი %1: %1: PlotDialog Plot გრáƒ�ფიკი Data მáƒ�ნáƒ�ცემები Title: სáƒ�თáƒ�ური: Expression: გáƒ�მáƒ�სáƒ�ხულებáƒ�: Function ფუნქციáƒ� Vector/matrix ვექტáƒ�რი/მáƒ�ტრიცáƒ� Paired matrix დáƒ�წყვილებული მáƒ�ტრიცáƒ� Rows მწკრივები X variable: X ცვლáƒ�დი: Style: სტილი: Line ხáƒ�ზი Points ქულები Line with points ხáƒ�ზი წერტილებით Boxes/bars მáƒ�რთკუთხედები/დáƒ�შვების ხáƒ�ზები Histogram ჰისტáƒ�გრáƒ�მáƒ� Steps ბიჯები Candlesticks იáƒ�პáƒ�ნური სáƒ�ნთლები Dots წერტილები Polar პáƒ�ლáƒ�რული Smoothing: მáƒ�გლუვებáƒ�: None áƒ�რცერთი Monotonic მáƒ�ნáƒ�ტáƒ�ნური Natural cubic splines ნáƒ�ტურáƒ�ლური კუბური სპლáƒ�ინები Bezier ბეზიე Bezier (monotonic) ბეზიე (მáƒ�ნáƒ�ტáƒ�ნური) Y-axis: Y-ღერძი: Primary ძირითáƒ�დი Secondary მეáƒ�რáƒ�დი Add დáƒ�მáƒ�ტებáƒ� Apply გáƒ�დáƒ�ტáƒ�რებáƒ� Remove წáƒ�შლáƒ� Title სáƒ�თáƒ�ური Expression გáƒ�მáƒ�სáƒ�ხულებáƒ� Function Range ფუნქციის დიáƒ�პáƒ�ზáƒ�ნი Minimum x value: მინიმáƒ�ლური x-ის მნიშვნელáƒ�ბáƒ�: Maximum x value: მáƒ�ქსიმáƒ�ლური x-ის მნიშვნელáƒ�ბáƒ�: Sampling rate: სემპლინგის სიჩქáƒ�რე: Step size: ბიჯის ზáƒ�მáƒ�: Show real and imaginary parts რეáƒ�ლური დáƒ� წáƒ�რმáƒ�სáƒ�ხვითი ნáƒ�წილების ჩვენებáƒ� Appearance გáƒ�რეგნáƒ�ბáƒ� Display grid ბáƒ�დის ჩვენებáƒ� Display full border სრული სáƒ�ზღვრის ჩვენებáƒ� Minimum y value: მინიმáƒ�ლური y მნიშვნელáƒ�ბáƒ�: Maximum y value: მáƒ�ქსიმáƒ�ლური y მნიშვნელáƒ�ბáƒ�: Logarithmic x scale: X-ის ლáƒ�გáƒ�რითმული მáƒ�სშტáƒ�ბირებáƒ�: Logarithmic y scale: Y-ის ლáƒ�გáƒ�რითმული მáƒ�სშტáƒ�ბირებáƒ�: X-axis label: X-ღერძის ჭდე: Y-axis label: Y-ღერძის ჭდე: Line width: ხáƒ�ზის სიგáƒ�ნე: Legend placement: áƒ�ხსნის მდებáƒ�რეáƒ�ბáƒ�: Top-left ზედáƒ� მáƒ�რცხენáƒ� Top-right ზედáƒ� მáƒ�რჯვენáƒ� Bottom-left ქვედáƒ� მáƒ�რცხენáƒ� Bottom-right ქვედáƒ� მáƒ�რჯვენáƒ� Below ქვემáƒ�თ Outside გáƒ�რედáƒ�ნ Calculating… გáƒ�მáƒ�თვლáƒ�… Cancel გáƒ�უქმებáƒ� Processing… დáƒ�მუშáƒ�ვებáƒ�… PreferencesDialog Preferences მáƒ�რგებáƒ� Ignore system language (requires restart) სისტემის ენის იგნáƒ�რირებáƒ� (სáƒ�ჭირáƒ�áƒ� რესტáƒ�რტი) Language: ენáƒ�: Default ნáƒ�გულისხმევი Allow multiple instances ერთზე მეტი გáƒ�შვებული áƒ�სლის დáƒ�შვებáƒ� Notify when a new version is available გáƒ�მáƒ�ფრთხილე, რáƒ�ცáƒ� ხელმისáƒ�წვდáƒ�მი იქნებáƒ� áƒ�ხáƒ�ლი ვერსიáƒ� Clear history on exit ისტáƒ�რიის გáƒ�სუფთáƒ�ვებáƒ� გáƒ�სვლისáƒ�ს Max history lines saved: მáƒ�ქს. შენáƒ�ხული ისტáƒ�რიის ხáƒ�ზები: Close application with Escape key áƒ�პლიკáƒ�ციის დáƒ�ხურვáƒ� ღილáƒ�კით Escape Use keyboard keys for RPN კლáƒ�ვიáƒ�ტურის ღილáƒ�კების გáƒ�მáƒ�ყენებáƒ� RPN-ისთვის Use caret for bitwise XOR კáƒ�რეტის გáƒ�მáƒ�ყენებáƒ� ბიტური XOR-ისთვის Keep above other windows დáƒ�ნáƒ�რჩენი ფáƒ�ნჯრების ზემáƒ�თ ქáƒ�ნáƒ� Preserve history height ისტáƒ�რიის სიმáƒ�ღლის შენáƒ�რჩუნებáƒ� Do not change the height of history list when keypad or number bases are show or hidden. ისტáƒ�რიის სიის სიმáƒ�ღლე áƒ�რ შეიცვლებáƒ�, რáƒ�ცáƒ� ციფრული კლáƒ�ვიáƒ�ტურáƒ�, áƒ�ნ რიცხვის ფუძეები ნáƒ�ჩვენები, áƒ�ნ დáƒ�მáƒ�ლულიáƒ�. Show status bar მდგáƒ�მáƒ�რეáƒ�ბის ზáƒ�ლის ჩვენებáƒ� Window title: ფáƒ�ნჯრის სáƒ�თáƒ�ური: Application name áƒ�პლიკáƒ�ციის სáƒ�ხელი Result შედეგი Application name + result áƒ�პლიკáƒ�ციის სáƒ�ხელი + შედეგი Workspace სáƒ�მუშáƒ�áƒ� სივრცე Application name + workspace áƒ�პლიკáƒ�ციის სáƒ�ხელი + სáƒ�მუშáƒ�áƒ� სივრცე Tooltips: მინიშნებები: Show all ყველáƒ�ს ჩვენებáƒ� Hide in keypad დáƒ�მáƒ�ლვáƒ� ციფრულ კლáƒ�ვიáƒ�ტურáƒ�ში Hide all ყველáƒ�ს დáƒ�მáƒ�ლვáƒ� Style: სტილი: Default (requires restart) Default style ნáƒ�გულისხმევი (სáƒ�ჭირáƒ�ებს გáƒ�დáƒ�ტვირთვáƒ�ს) Dark mode მუქი რეჟიმი Disable cursor blinking კურსáƒ�რის ციმციმის გáƒ�მáƒ�რთვáƒ� Colorize result შედეგის გáƒ�ფერáƒ�დებáƒ� Format result შედეგის დáƒ�ფáƒ�რმáƒ�ტებáƒ� Custom history font: მáƒ�რგებული ისტáƒ�რიის ფáƒ�ნტი: Custom expression font: მáƒ�რგებული გáƒ�მáƒ�ხáƒ�ტულების ფáƒ�ნტი: Custom status bar font: მáƒ�რგებული სტáƒ�ტუსის ზáƒ�ლის ფáƒ�ნტი: Custom keypad font: მáƒ�რგებული ციფრული კლáƒ�ვიáƒ�ტურის ფáƒ�ნტი: Custom application font: მáƒ�რგებული áƒ�პლიკáƒ�ციის ფáƒ�ნტი: Expression status: გáƒ�მáƒ�სáƒ�ხულების სტáƒ�ტუსი: Place expression field below history გáƒ�მáƒ�სáƒ�ხულების ველის ისტáƒ�რიის ქვემáƒ�თ მáƒ�თáƒ�ვსებáƒ� Off გáƒ�მáƒ�რთ In history list ისტáƒ�რიის სიáƒ�ში In expression field გáƒ�მáƒ�სáƒ�ხულების ველში In status bar სტáƒ�ტუსის ზáƒ�ლში Status tooltip delay: სტáƒ�ტუსის მინიშნების დáƒ�ყáƒ�ვნებáƒ�: ms milliseconds მწმ Calculate as you type delay: áƒ�კრეფისáƒ�ს გáƒ�მáƒ�თვლის დáƒ�ყáƒ�ვნებáƒ�: Adaptive delay áƒ�დáƒ�პტიური დáƒ�ყáƒ�ვნებით Automatically calculate selection მáƒ�ნიშნულის áƒ�ვტáƒ�მáƒ�ტური გáƒ�მáƒ�თვლáƒ� Expression in history: გáƒ�მáƒ�სáƒ�ხულებáƒ� ისტáƒ�რიáƒ�ში: Parsed დáƒ�მუშáƒ�ვებული Parsed (compact) დáƒ�მუშáƒ�ვებული (კáƒ�მპáƒ�ქტური) Entered შეყვáƒ�ნილი Entered + parsed შეყვáƒ�ნილი + დáƒ�მუშáƒ�ვებული Entered + parsed (compact) შეყვáƒ�ნილი + დáƒ�მუშáƒ�ვებული (კáƒ�მპáƒ�ქტური) Expression after calculation: გáƒ�მáƒ�სáƒ�ხულებáƒ� გáƒ�მáƒ�თვლის შემდეგ: Keep expression გáƒ�მáƒ�სáƒ�ხულების შენáƒ�რჩუნებáƒ� Clear expression გáƒ�მáƒ�სáƒ�ხულების გáƒ�სუფთáƒ�ვებáƒ� Replace with result ჩáƒ�ნáƒ�ცვლებáƒ� შედეგით Replace with result if shorter ჩáƒ�ნáƒ�ცვლებáƒ� შედეგით, თუ უფრáƒ� მáƒ�კლეáƒ� Automatically copy result შედეგის áƒ�ვტáƒ�მáƒ�ტური კáƒ�პირებáƒ� Parsing mode: áƒ�ნáƒ�ლიზის რეჟიმი: Adaptive შეგუებáƒ�დი Conventional მიღებული Implicit multiplication first ჯერ მáƒ�ხდებáƒ� áƒ�რáƒ�ცხáƒ�დი გáƒ�მრáƒ�ვლებების áƒ�ნáƒ�ლიზი Chain ჯáƒ�ჭვი RPN RPN Simplified percentage calculation გáƒ�áƒ�დვილებული პრáƒ�ცენტულáƒ�ბის გáƒ�მáƒ�თვლáƒ� Read precision კითხვის სიზუსტე Allow concise uncertainty input მáƒ�კლე გáƒ�ურკვევლáƒ�ბის შეყვáƒ�ნის დáƒ�შვებáƒ� Limit implicit multiplication áƒ�რáƒ�სწáƒ�რი გáƒ�მრáƒ�ვლების შეზღუდვáƒ� Interpret unrecognized symbols as variables უცნáƒ�ბი სიმბáƒ�ლáƒ�ების ცვლáƒ�დებáƒ�დ ჩáƒ�თვლáƒ� Interval calculation: ინტერვáƒ�ლის გáƒ�მáƒ�თვლáƒ�: Variance formula დისპერსიის ფáƒ�რმულáƒ� Interval arithmetic ინტერვáƒ�ლების áƒ�რითმეტიკáƒ� Factorize result შედეგის მáƒ�მრáƒ�ვლებáƒ�დ დáƒ�შლáƒ� Two's complement output: დáƒ�მáƒ�ტებითი კáƒ�დი გáƒ�მáƒ�ტáƒ�ნისთვის: Two's complement input: áƒ�რის დáƒ�მáƒ�ტებითი კáƒ�დი: Binary áƒ�რáƒ�ბითი Hexadecimal თექვსმეტáƒ�ბითი Binary bits: áƒ�რáƒ�ბითი ბიტები: Automatic áƒ�ვტáƒ�მáƒ�ტური Use lower case letters in non-decimal numbers პáƒ�ტáƒ�რáƒ� áƒ�სáƒ�ების გáƒ�მáƒ�ყენებáƒ� áƒ�რáƒ�-áƒ�თáƒ�ბით რიცხვებში Use special duodecimal symbols სპეციáƒ�ლური თáƒ�რმეტáƒ�ბითის სიმბáƒ�ლáƒ�ების გáƒ�მáƒ�ყენებáƒ� Multiplication sign: გáƒ�მრáƒ�ვლების ნიშáƒ�ნი: multiplication sign Unicode character name გáƒ�მრáƒ�ვლების ნიშáƒ�ნი dot operator Unicode character name წერტილის áƒ�პერáƒ�ტáƒ�რი middle dot Unicode character name შუáƒ� წერტილი asterisk Unicode character name ვáƒ�რსკვლáƒ�ვი Use Unicode division slash in output უნიკáƒ�დის გáƒ�ყáƒ�ფის დáƒ�ხრილი ხáƒ�ზის გáƒ�მáƒ�ყენებáƒ� გáƒ�მáƒ�ტáƒ�ნისáƒ�ს Spell out logical operators ლáƒ�გიკური áƒ�პერáƒ�ციების ლáƒ�გიკურáƒ�დ გáƒ�დმáƒ�ცემáƒ� Use E-notation instead of 10^n E-ნáƒ�ტáƒ�ციის გáƒ�მáƒ�ყენებáƒ� 10^n-ის მáƒ�გიერ Use 'j' as imaginary unit "j"-ის გáƒ�მáƒ�ყენებáƒ� წáƒ�რმáƒ�სáƒ�ხვითი ერთეულისთვის Use comma as decimal separator მძიმის გáƒ�მáƒ�ყენებáƒ� áƒ�თწილáƒ�დის გáƒ�მყáƒ�ფáƒ�დ Ignore comma in numbers მძიმის გáƒ�მáƒ�ტáƒ�ვებáƒ� რიცხვებში Ignore dots in numbers რიცხვებში წერტილების დáƒ�იგნáƒ�რებáƒ� Copy unformatted ASCII by default კáƒ�პირებáƒ� ნáƒ�გულისხმევáƒ�დ დáƒ�უფáƒ�რმáƒ�ტებელი ASCII-ის სáƒ�ხით Place percent button in number pad პრáƒ�ცენტის ღილáƒ�კის მáƒ�თáƒ�ვსებáƒ� ციფრულ კლáƒ�ვიáƒ�ტურáƒ�ზე Indicate repeating decimals: გáƒ�ნმეáƒ�რებáƒ�დ áƒ�თწილáƒ�დებზე მითითებáƒ�: Ellipsis მრáƒ�ვáƒ�ლწერტილი Overline ხáƒ�ზი ზემáƒ�დáƒ�ნ Digit grouping: ციფრების დáƒ�ჯგუფებáƒ�: None áƒ�რცერთი Standard სტáƒ�ნდáƒ�რტული Local ლáƒ�კáƒ�ლური Custom ხელით Automatically group digits in input შეყვáƒ�ნისáƒ�ს ციფრების áƒ�ვტáƒ�მáƒ�ტური დáƒ�ჯგუფებáƒ� Interval display: ინტერვáƒ�ლის ჩვენებáƒ�: Significant digits მნიშვნელáƒ�ვáƒ�ნი ციფრები Interval ინტერვáƒ�ლი Plus/minus პლუს/მინუს Relative ფáƒ�რდáƒ�ბითი Concise მáƒ�კლე Midpoint შუáƒ� წერტილი Lower დáƒ�წევáƒ� Upper ზედáƒ� Rounding: დáƒ�მრგვáƒ�ლებáƒ�: Round halfway numbers away from zero ნáƒ�ხევრáƒ�მდე რიცხვების ნულიდáƒ�ნ დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers to even ნáƒ�ხევრáƒ�მდე რიცხვების ლუწáƒ�მდე დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers to odd ნáƒ�ხევრáƒ�მდე რიცხვების კენტáƒ�მდე დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers toward zero ნáƒ�ხევრáƒ�მდე რიცხვების ნულისკენ დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers to random ნáƒ�ხევრáƒ�მდე რიცხვების შემთხვევითáƒ�მდე დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers up ნáƒ�ხევრáƒ�მდე რიცხვების ზემáƒ�თ დáƒ�მრგვáƒ�ლებáƒ� Round halfway numbers down ნáƒ�ხევრáƒ�მდე რიცხვების ქვემáƒ�თ დáƒ�მრგვáƒ�ლებáƒ� Round toward zero დáƒ�მრგვáƒ�ლებáƒ� ნულისკენ Round away from zero დáƒ�მრგვáƒ�ლებáƒ� ნულიდáƒ�ნ Round up დáƒ�მრგვáƒ�ლებáƒ� ზემáƒ�თ Round down დáƒ�მრგვáƒ�ლებáƒ� ქვემáƒ�თ Complex number form: კáƒ�მპლექსური რიცხვის ფáƒ�რმáƒ�: Rectangular მáƒ�რთკუთხედი Exponential ექსპáƒ�ნენტური Polar პáƒ�ლáƒ�რული Angle/phasor კუთხე/ვექტáƒ�რი Enable units ერთეულების ჩáƒ�რთვáƒ� Abbreviate names სáƒ�ხელების შემáƒ�კლებáƒ� Use binary prefixes for information units áƒ�რáƒ�ბითი პრეფიქსების გáƒ�მáƒ�ყენებáƒ� ინფáƒ�რმáƒ�ციის ერთეულებისთვის Automatic unit conversion: ერთეულის áƒ�ვტáƒ�მáƒ�ტური გáƒ�დáƒ�ყვáƒ�ნáƒ�: No conversion გáƒ�დáƒ�ყვáƒ�ნის გáƒ�რეშე Base units ძირითáƒ�დი ერთეულები Optimal units áƒ�პტიმáƒ�ლური ერთეულები Optimal SI units áƒ�პტიმáƒ�ლური SI ერთეულები Convert to mixed units გáƒ�დáƒ�ყვáƒ�ნáƒ� შერეულ ერთეულებში Automatic unit prefixes: áƒ�ვტáƒ�მáƒ�ტური ერთეულის პრეფიქსები: No prefixes პრეფიქსების გáƒ�რეშე Prefixes for some units პრეფიქსები ზáƒ�გიერთი ერთეულისთვის Prefixes also for currencies პრეფიქსები, áƒ�სევე, ვáƒ�ლუტებისთვის Prefixes for all units პრეფიქსების ყველáƒ� ერთეულისთვის Enable all SI-prefixes ყველáƒ� SI პრეფიქსის ჩáƒ�რთვáƒ� Enable denominator prefixes მნიშვნელის პრეფიქსების ჩáƒ�რთვáƒ� Enable units in physical constants ერთეულების ჩáƒ�რთვáƒ� ფიზიკურ მუდმივებში Copy unformatted ASCII without units დáƒ�უფáƒ�რმáƒ�ტებელი ASCII-ის კáƒ�პირებáƒ� ერთეულების გáƒ�რეშე Temperature calculation: ტემპერáƒ�ტურის გáƒ�მáƒ�თვლáƒ�: Absolute áƒ�ბსáƒ�ლუტური Hybrid ჰიბრიდული Exchange rates updates: გáƒ�ცვლის კურსების გáƒ�ნáƒ�ხლებáƒ�: %n day(s) %n დღე%n დღე Default currency: ნáƒ�გულისხმევი ვáƒ�ლუტáƒ�: Look && Feel გáƒ�რეგნáƒ�ბáƒ� Fonts ფáƒ�ნტები Numbers && Operators რიცხვები && áƒ�პერáƒ�ტáƒ�რები Units სáƒ�ზáƒ�მი ერთეულები Calculation გáƒ�მáƒ�თვლáƒ� Restart required სáƒ�ჭირáƒ�áƒ� გáƒ�დáƒ�ტვირთვáƒ� Please restart the program for the language change to take effect. ენის ცვლილებების ძáƒ�ლáƒ�ში შესáƒ�სვლელáƒ�დ გáƒ�დáƒ�ტვირთეთ პრáƒ�გრáƒ�მáƒ�. QApplication Execute expressions and commands from a file გáƒ�მáƒ�სáƒ�ხულებებისáƒ� დáƒ� ბრძáƒ�ნებების შესრულებáƒ� ფáƒ�ილიდáƒ�ნ FILE FILE Start a new instance of the application áƒ�პლიკáƒ�ციის áƒ�ხáƒ�ლი áƒ�სლის გáƒ�შვებáƒ� Specify the window title მიუთითეთ ფáƒ�ნჯრის სáƒ�თáƒ�ური TITLE სáƒ�თáƒ�ური Update exchange rates გáƒ�ცვლის კურსების გáƒ�ნáƒ�ხლებáƒ� Display the application version áƒ�პლიკáƒ�ციის ვერსიის ჩვენებáƒ� Open workspace სáƒ�მუშáƒ�áƒ� სივრცის გáƒ�ხსნáƒ� Expression to calculate გáƒ�მáƒ�სáƒ�თვლელი გáƒ�მáƒ�სáƒ�ხულებáƒ� [EXPRESSION] [გáƒ�მáƒ�სáƒ�ხულებáƒ�] Allow multiple instances? დáƒ�შვებული იყáƒ�ს ერთზე მეტი გáƒ�შვებული áƒ�სლი? By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? ნáƒ�გულისხმევáƒ�დ დáƒ�შვებულიáƒ�, მხáƒ�ლáƒ�დ, ერთი %1-ის (ერთი მთáƒ�ვáƒ�რი ფáƒ�ნჯáƒ�რáƒ�) გáƒ�შვებული áƒ�სლი. თუ ერთდრáƒ�ულáƒ�დ გáƒ�ეშვებáƒ� ერთზე მეტი áƒ�სლი, მáƒ�ხდებáƒ�, მხáƒ�ლáƒ�დ, áƒ�ღწერების (ცვლáƒ�დების, ფუნქციების დáƒ� áƒ�.შ.), რეჟიმის, პáƒ�რáƒ�მეტრების დáƒ� ბáƒ�ლáƒ�ს დáƒ�ხურული ფáƒ�ნჯრების ისტáƒ�რიის შენáƒ�ხვáƒ�. áƒ�მის მიუხედáƒ�ვáƒ�დ, გნებáƒ�ვთ, შეცვáƒ�ლáƒ�თ ნáƒ�გულისხმევი ქცევáƒ� დáƒ� დáƒ�უშვáƒ�თ ერთდრáƒ�ულáƒ�დ მრáƒ�ვáƒ�ლი გáƒ�შვებული áƒ�სლის ქáƒ�ნáƒ�? %1 is already running. %1 უკვე გáƒ�შვებულიáƒ�. Failed to load global definitions! გლáƒ�ბáƒ�ლური áƒ�ღწერების ჩáƒ�ტვირთვáƒ� ვერ მáƒ�ხერხდáƒ�! History Answer Value პáƒ�სუხის მნიშვნელáƒ�ბáƒ� ისტáƒ�რიáƒ�ში answer პáƒ�სუხი History Index(es) ისტáƒ�რიის ინდექს(ებ)-ი History index %s does not exist. ისტáƒ�რიის ინდექსი %s áƒ�რ áƒ�რსებáƒ�ბს. Last Answer ბáƒ�ლáƒ� პáƒ�სუხი Answer 2 პáƒ�სუხი 2 Answer 3 პáƒ�სუხი 3 Answer 4 პáƒ�სუხი 4 Answer 5 პáƒ�სუხი 5 Memory მეხსიერებáƒ� Error შეცდáƒ�მáƒ� Couldn't write preferences to %1 პáƒ�რáƒ�მეტრების შენáƒ�ხვáƒ� შეუძლებელიáƒ� ფáƒ�ილში %1 Function not found. ფუქციáƒ� áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. Variable not found. ცვლáƒ�დი áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. Unit not found. ერთეული áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. Unsupported base. მხáƒ�რდáƒ�უჭერელი ფუძე. Unsupported value. მხáƒ�რდáƒ�უჭერელი მნიშვნელáƒ�ბáƒ�. QalculateQtSettings Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). შეიცáƒ�ვს უáƒ�ხლესი გáƒ�მáƒ�თვლის შედეგს. ტáƒ�ლáƒ�ბის ერთზე მეტი შედეგი ვექტáƒ�რáƒ�დáƒ�áƒ� წáƒ�რმáƒ�დგენილი. იქáƒ�ნიეთ წვდáƒ�მáƒ� ცáƒ�ლ-ცáƒ�ლკე შედეგებთáƒ�ნ ფუნქციით ans(n) (მáƒ�გ: ans(1) პირველი áƒ�მáƒ�ხსნისთვის). It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? ვáƒ�ლუტის გáƒ�ცვლის კურსის ბáƒ�ლáƒ� გáƒ�ნáƒ�ხლებიდáƒ�ნ %n დღე გáƒ�ვიდáƒ�. გნებáƒ�ვთ გáƒ�ცვლილს კურსების გáƒ�ნáƒ�ხლებáƒ� áƒ�ხლáƒ�?ვáƒ�ლუტის გáƒ�ცვლის კურსის ბáƒ�ლáƒ� გáƒ�ნáƒ�ხლებიდáƒ�ნ %n დღე გáƒ�ვიდáƒ�. გნებáƒ�ვთ გáƒ�ცვლილს კურსების გáƒ�ნáƒ�ხლებáƒ� áƒ�ხლáƒ�? Update exchange rates? გáƒ�ნáƒ�ხლდეს გáƒ�ცვლის კურსები? Fetching exchange rates… გáƒ�ცვლის კურსების მიღებáƒ�… Error შეცდáƒ�მáƒ� Warning გáƒ�ფრთხილებáƒ� Information ინფáƒ�რმáƒ�ციáƒ� Path of executable not found. გáƒ�მშვები ფáƒ�ილის ბილიკი áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. curl not found. curl áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ�. Failed to run update script. %1 გáƒ�ნáƒ�ხლების სკრიპტის გáƒ�შვებáƒ� ჩáƒ�ვáƒ�რდáƒ�. %1 Failed to check for updates. გáƒ�ნáƒ�ხლებების შემáƒ�წმებáƒ� ჩáƒ�ვáƒ�რდáƒ�. No updates found. გáƒ�ნáƒ�ხლებები áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�. A new version of %1 is available at %2. Do you wish to update to version %3? ხელმისáƒ�წვდáƒ�მიáƒ� %1-ის áƒ�ხáƒ�ლი ვერსიáƒ� მისáƒ�მáƒ�რთზე %2. გნებáƒ�ვთ გáƒ�ნáƒ�ხლებáƒ� ვერსიáƒ�მდე %3? A new version of %1 is available. You can get version %3 at %2. ხელმისáƒ�წვდáƒ�მიáƒ� %1-ის áƒ�ხáƒ�ლი ვერსიáƒ�. %2-ის áƒ�ხáƒ�ლი ვერსიის გáƒ�დმáƒ�წერáƒ� შეგიძლიáƒ�თ მისáƒ�მáƒ�რთიდáƒ�ნ %3. Download გáƒ�დმáƒ�წერáƒ� %1: %2 %1: %2 Insert function ფუნქციის ჩáƒ�სმáƒ� Insert function (dialog) ფუნქციის ჩáƒ�სმáƒ� (დიáƒ�ლáƒ�გი) Insert variable ცვლáƒ�დის ჩáƒ�სმáƒ� Approximate result დáƒ�áƒ�ხლáƒ�ებითი შედეგი Negate უáƒ�რყáƒ�ფáƒ� Invert ინვერსიáƒ� Insert unit ერთეულის ჩáƒ�სმáƒ� Insert text ტექსტის ჩáƒ�სმáƒ� Insert operator áƒ�პერáƒ�ტáƒ�რის ჩáƒ�სმáƒ� Insert date თáƒ�რიღის ჩáƒ�სმáƒ� Insert matrix მáƒ�ტრიცის ჩáƒ�სმáƒ� Insert smart parentheses ჭკვიáƒ�ნი ფრჩხილების ჩáƒ�სმáƒ� Convert to unit გáƒ�დáƒ�ყვáƒ�ნáƒ� ერთეულში Convert გáƒ�დáƒ�ყვáƒ�ნáƒ� Convert to optimal unit გáƒ�დáƒ�ყვáƒ�ნáƒ� áƒ�პტიმáƒ�ლურ ერთეულში Convert to base units გáƒ�დáƒ�ყვáƒ�ნáƒ� ძირითáƒ�დ ერთეულებში Convert to optimal prefix გáƒ�დáƒ�ყვáƒ�ნáƒ� áƒ�პტიმáƒ�ლურ პრეფიქსში Convert to number base გáƒ�დáƒ�ყვáƒ�ნáƒ� რიცხვის ბáƒ�ზáƒ�ში Factorize result შედეგის მáƒ�მრáƒ�ვლებáƒ�დ დáƒ�შლáƒ� Expand result შედეგის გáƒ�შლáƒ� Expand partial fractions ნáƒ�წილáƒ�ბრივი წილáƒ�დების გáƒ�ფáƒ�რთáƒ�ებáƒ� RPN: down RPN: ქვემáƒ�თ RPN: up RPN: მáƒ�ღლáƒ� RPN: swap RPN: მიმáƒ�ცვლáƒ� RPN: copy RPN: კáƒ�პირებáƒ� RPN: lastx RPN: ბáƒ�ლáƒ� x RPN: delete register RPN: რეგისტრის წáƒ�შლáƒ� RPN: clear stack RPN: სტეკის გáƒ�სუფთáƒ�ვებáƒ� Set expression base გáƒ�მáƒ�სáƒ�ხულების ბáƒ�ზის დáƒ�ყენებáƒ� Set result base შედეგის ბáƒ�ზის დáƒ�ყენებáƒ� Set angle unit to degrees კუთხის ერთეულის გრáƒ�დუსებზე დáƒ�ყენებáƒ� Set angle unit to radians კუთხის ერთეულის რáƒ�დიáƒ�ნებზე დáƒ�ყენებáƒ� Set angle unit to gradians კუთხის ერთეულის გრáƒ�დიáƒ�ნებზე დáƒ�ყენებáƒ� Activate normal display mode ნáƒ�რმáƒ�ლური ჩვენების რეჟიმის გáƒ�áƒ�ქტიურებáƒ� Activate scientific display mode სáƒ�მეცნიერáƒ� ჩვენების რეჟიმის გáƒ�áƒ�ქტიურებáƒ� Activate engineering display mode სáƒ�ინჟინრáƒ� ჩვენების რეჟიმის გáƒ�áƒ�ქტიურებáƒ� Activate simple display mode მáƒ�რტივი ჩვენების რეჟიმის გáƒ�áƒ�ქტიურებáƒ� Toggle precision სიზუსტის გáƒ�დáƒ�რთვáƒ� Toggle max decimals მáƒ�ქს. áƒ�თწილáƒ�დების გáƒ�დáƒ�რთვáƒ� Toggle min decimals მინ. áƒ�თწილáƒ�დების გáƒ�დáƒ�რთვáƒ� Toggle max/min decimals მáƒ�ქს./მინ. áƒ�თწილáƒ�დების გáƒ�დáƒ�რთვáƒ� Toggle RPN mode RPN რეჟიმის გáƒ�დáƒ�რთვáƒ� Show general keypad ზáƒ�გáƒ�დი ციფრული კლáƒ�ვიáƒ�ტურის ჩვენებáƒ� Toggle programming keypad პრáƒ�გრáƒ�მირების ციფრული კლáƒ�ვიáƒ�ტურის გáƒ�დáƒ�რთვáƒ� Toggle algebra keypad áƒ�ლგებრის ციფრული კლáƒ�ვიáƒ�ტურის გáƒ�დáƒ�რთვáƒ� Toggle custom keypad მáƒ�რგებული ციფრული კლáƒ�ვიáƒ�ტურის გáƒ�დáƒ�რთვáƒ� Show/hide keypad ციფრული კლáƒ�ვიáƒ�ტურის ჩვენებáƒ�/დáƒ�მáƒ�ლვáƒ� Search history ძებნის ისტáƒ�რიáƒ� Clear history ისტáƒ�რიის გáƒ�სუფთáƒ�ვებáƒ� Show variables ცვლáƒ�დების ჩვენებáƒ� Show functions ფუნქციების ჩვენებáƒ� Show units ერთეულების ჩვენებáƒ� Show data sets მáƒ�ნáƒ�ცემთáƒ� ნáƒ�კრებების ჩვენებáƒ� Store result შედეგის შენáƒ�ხვáƒ� MC (memory clear) MC (მეხსიერების გáƒ�სუფთáƒ�ვებáƒ�) MR (memory recall) MR (მეხსიერებიდáƒ�ნ გáƒ�ხსენებáƒ�) MS (memory store) MS (მეხსიერებáƒ�ში დáƒ�მáƒ�ხსáƒ�ვრებáƒ�) M+ (memory plus) M+ (მიმáƒ�ტებáƒ� მეხსიერებáƒ�ში მყáƒ�ფ მნიშვნელáƒ�ბáƒ�ზე) M− (memory minus) M- (მეხსიერებáƒ�ში მყáƒ�ფ მნიშვნელáƒ�ბáƒ�ზე გáƒ�მáƒ�კლებáƒ�) New variable áƒ�ხáƒ�ლი ცვლáƒ�დი New function áƒ�ხáƒ�ლი ფუნქციáƒ� Open plot functions/data ფუნქციების/მáƒ�ნáƒ�ცემების გრáƒ�ფიკების გáƒ�ხსნáƒ� Open convert number bases რიცხვების ფუძის გáƒ�დáƒ�ყვáƒ�ნის გáƒ�ხსნáƒ� Open floating point conversion მცურáƒ�ვმძიმიáƒ�ნი რიცხვების გáƒ�დáƒ�ყვáƒ�ნის გáƒ�ხსნáƒ� Open calender conversion კáƒ�ლენდრის გáƒ�დáƒ�ყვáƒ�ნის გáƒ�ხსნáƒ� Open percentage calculation tool პრáƒ�ცენტის გáƒ�მáƒ�თვლის ხელსáƒ�წყáƒ�ს გáƒ�ხსნáƒ� Open periodic table პერიáƒ�დული სისტემის გáƒ�ხსნáƒ� Update exchange rates გáƒ�ცვლის კურსების გáƒ�ნáƒ�ხლებáƒ� Copy result შედეგის კáƒ�პირებáƒ� Insert result შედეგის ჩáƒ�სმáƒ� Open mode menu რეჟიმის მენიუს გáƒ�ხსნáƒ� Open menu მენიუს გáƒ�ხსნáƒ� Help დáƒ�ხმáƒ�რებáƒ� Quit გáƒ�სვლáƒ� Toggle chain mode ჯáƒ�ჭვის რეჟიმის გáƒ�დáƒ�რთვáƒ� Toggle keep above ზემáƒ�თ შენáƒ�რჩუნების გáƒ�დáƒ�რთვáƒ� Show completion (activate first item) დáƒ�სრულების ჩვენებáƒ� (პირველი ელემენტის áƒ�ქტივáƒ�ციáƒ�) Clear expression გáƒ�მáƒ�სáƒ�ხულების გáƒ�სუფთáƒ�ვებáƒ� Delete წáƒ�შლáƒ� Backspace Backspace Home სáƒ�წყისი End დáƒ�სáƒ�სრული Right მáƒ�რჯვენáƒ� Left მáƒ�რცხენáƒ� Up ჩáƒ�რთულიáƒ� Down გáƒ�მáƒ�რთულიáƒ� Undo გáƒ�უქმებáƒ� Redo გáƒ�მეáƒ�რებáƒ� Calculate expression გáƒ�მáƒ�სáƒ�ხულების გáƒ�მáƒ�თვლáƒ� Expression history next შემდეგი გáƒ�მáƒ�სáƒ�ხულებáƒ� ისტáƒ�რიáƒ�ში Expression history previous წინáƒ� გáƒ�მáƒ�სáƒ�ხულებáƒ� ისტáƒ�რიáƒ�ში Open functions menu ფუნქციების მენიუს გáƒ�ხსნáƒ� Open units menu ერთეულების მენიუს გáƒ�ხსნáƒ� Open variables menu ცვლáƒ�დების მენიუს გáƒ�ხსნáƒ� Toggle fraction format in current result წილáƒ�დის ფáƒ�რმáƒ�ტის გáƒ�დáƒ�რთვáƒ� მიმდინáƒ�რე შედეგში Default ნáƒ�გულისხმევი Formatted result დáƒ�ფáƒ�რმáƒ�ტებული შედეგი Unformatted ASCII result დáƒ�უფáƒ�რმáƒ�ტებელი ASCII შედეგი Unformatted ASCII result without units დáƒ�უფáƒ�რმáƒ�ტებელი ASCII შედეგი ერთეულების გáƒ�რეშე Formatted expression დáƒ�ფáƒ�რმáƒ�ტებული გáƒ�მáƒ�სáƒ�ხულებáƒ� Unformatted ASCII expression დáƒ�უფáƒ�რმáƒ�ტებელი ASCII გáƒ�მáƒ�სáƒ�ხულებáƒ� Formatted expression + result დáƒ�ფáƒ�რმáƒ�ტებული გáƒ�მáƒ�სáƒ�ხულებáƒ� + შედეგი Unformatted ASCII expression + result დáƒ�უფáƒ�რმáƒ�ტებელი ASCII გáƒ�მáƒ�სáƒ�ხულებáƒ� + შედეგი QalculateTranslator OK Only used when Qt translation is missing დიáƒ�ხ Cancel Only used when Qt translation is missing გáƒ�უქმებáƒ� Close Only used when Qt translation is missing დáƒ�ხურვáƒ� &Yes Only used when Qt translation is missing &დიáƒ�ხ &No Only used when Qt translation is missing &áƒ�რáƒ� &Open Only used when Qt translation is missing &გáƒ�ხსნáƒ� &Save Only used when Qt translation is missing &შენáƒ�ხვáƒ� &Select All Only used when Qt translation is missing ყვე&ლáƒ�ფრის მáƒ�ნიშვნáƒ� Look in: Only used when Qt translation is missing ჩáƒ�იხედე: File &name: Only used when Qt translation is missing ფáƒ�ილის &სáƒ�ხელი: Files of type: Only used when Qt translation is missing ტიპები: QalculateWindow Show toolbar ხელსáƒ�წყáƒ�თáƒ� ზáƒ�ლის ჩვენებáƒ� Menu მენიუ New áƒ�ხáƒ�ლი Function… ფუნქციáƒ�… Variable/Constant… Variable/Constant… Unknown Variable… უცნáƒ�ბი ცვლáƒ�დი… Matrix… მáƒ�ტრიცáƒ�… Unit… ერთეული… Workspaces სáƒ�მუშáƒ�áƒ� სივრცეები Open… გáƒ�ხსნáƒ�… Open default ნáƒ�გულისხმევის გáƒ�ხსნáƒ� Save შენáƒ�ხვáƒ� Save As… შენáƒ�ხვáƒ�, რáƒ�გáƒ�რც… Import CSV File… CSV ფáƒ�ილის შემáƒ�ტáƒ�ნáƒ�… Export CSV File… CSV ფáƒ�ილის გáƒ�ტáƒ�ნáƒ�… Functions ფუნქციები Variables and Constants ცვლáƒ�დები დáƒ� მუდმივები Units სáƒ�ზáƒ�მი ერთეულები Data Sets მáƒ�ნáƒ�ცემის სეტები Plot Functions/Data ფუნქციების/მáƒ�ნáƒ�ცემების გრáƒ�ფიკები Floating Point Conversion (IEEE 754) მცურáƒ�ვმძიმიáƒ�ნის გáƒ�დáƒ�ყვáƒ�ნáƒ� (IEEE 754) Calendar Conversion კáƒ�ლენდრის გáƒ�დáƒ�ყვáƒ�ნáƒ� Percentage Calculation Tool პრáƒ�ცენტის გáƒ�მáƒ�თვლის ხელსáƒ�წყáƒ� Periodic Table პერიáƒ�დული სისტემáƒ� Update Exchange Rates გáƒ�ცვლის კურსების გáƒ�ნáƒ�ხლებáƒ� Normal Mode ნáƒ�რმáƒ�ლური რეჟიმი RPN Mode RPN რეჟიმი Chain Mode რეჟიმი 'ჯáƒ�ჭვი' Keyboard Shortcuts კლáƒ�ვიáƒ�ტურის მáƒ�ლსáƒ�ხმáƒ�ბები Preferences მáƒ�რგებáƒ� Open Settings Folder(s) პáƒ�რáƒ�მეტრების სáƒ�ქáƒ�ღáƒ�ლდის გáƒ�ხსნáƒ�პáƒ�რáƒ�მეტრების სáƒ�ქáƒ�ღáƒ�ლდის გáƒ�ხსნáƒ� Help დáƒ�ხმáƒ�რებáƒ� Report a Bug შეცდáƒ�მის áƒ�ნგáƒ�რიში Check for Updates გáƒ�ნáƒ�ხლებების &შემáƒ�წმებáƒ� About %1 %1-ის შესáƒ�ხებ Quit გáƒ�სვლáƒ� Mode რეჟიმი General Display Mode ზáƒ�გáƒ�დი ჩვენების რეჟიმი Normal ნáƒ�რმáƒ�ლური Scientific სáƒ�მეცნიერáƒ� Engineering სáƒ�ინჟინრáƒ� Simple მáƒ�რტივი Angle Unit კუთხის ერთეული Radians რáƒ�დიáƒ�ნები Degrees გრáƒ�დუსი Gradians გრáƒ�დიáƒ�ნები Other სხვáƒ� Approximation and Fractions დáƒ�áƒ�ხლáƒ�ებáƒ� დáƒ� წილáƒ�დები Automatic Automatic approximation áƒ�ვტáƒ�მáƒ�ტური Dual Dual approximation áƒ�რმáƒ�გი Exact Exact approximation ზუსტი Approximate დáƒ�áƒ�ხლáƒ�ებით Assumptions დáƒ�შვებები Type Assumptions type ტიპი Number რიცხვი Real ნáƒ�მდვილი Rational რáƒ�ციáƒ�ნáƒ�ლური Integer მთელი რიცხვი Boolean ბულევი Sign Assumptions sign ხელმáƒ�წერáƒ� Unknown Unknown assumptions sign უცნáƒ�ბი Non-zero áƒ�რáƒ�-ნულáƒ�ვáƒ�ნი Positive დáƒ�დებითი Non-negative áƒ�რáƒ�-უáƒ�რყáƒ�ფითი Negative უáƒ�რყáƒ�ფითი Non-positive áƒ�რáƒ�-დáƒ�დებითი Result Base შედეგის ბáƒ�ზáƒ� Binary áƒ�რáƒ�ბითი Octal რვáƒ�áƒ�ბითი Decimal áƒ�თáƒ�ბითი Hexadecimal თექვსმეტáƒ�ბითი Duodecimal თáƒ�რმეტáƒ�ბითი Sexagesimal ექვსáƒ�ბითი Time format დრáƒ�ის ფáƒ�რმáƒ�ტი Roman numerals რáƒ�მáƒ�ული რიცხვები Unicode უნიკáƒ�დი Bijective base-26 ბიექტური სáƒ�ბáƒ�ზისáƒ�-26 Binary-coded decimal (BCD) ბინáƒ�რულáƒ�დ კáƒ�დირებული წილáƒ�დი (BCD) Custom: Number base ხელით: Expression Base გáƒ�მáƒ�სáƒ�ხულების ბáƒ�ზáƒ� Precision: სიზუსტე: Min decimals: მინ. ციფრები: Max decimals: მáƒ�ქს. ციფრები: off Max decimals გáƒ�მáƒ�რთვáƒ� Convert გáƒ�დáƒ�ყვáƒ�ნáƒ� Store მáƒ�ღáƒ�ზიáƒ� Plot გრáƒ�ფიკი Number bases რიცხვის ფუძეები Keypad ციფრული კლáƒ�ვიáƒ�ტურáƒ� General ზáƒ�გáƒ�დი Programming პრáƒ�გრáƒ�მირებáƒ� Algebra áƒ�ლგებრáƒ� Custom ხელით Number Pad ციფრული კლáƒ�ვიáƒ�ტურáƒ� None áƒ�რცერთი Always Show Number Pad ციფრული კლáƒ�ვიáƒ�ტურის ყáƒ�ველთვის ჩვენებáƒ� Show Custom Column მáƒ�რგებული სვეტის ჩვენებáƒ� Separate Menu Buttons მენიუს ღილáƒ�კების გáƒ�ყáƒ�ფáƒ� Reset Keypad Position ციფრული კლáƒ�ვიáƒ�ტურის მდებáƒ�რეáƒ�ბის ჩáƒ�მáƒ�ყრáƒ� Binary: áƒ�რáƒ�ბითი: Octal: რვáƒ�áƒ�ბითი: Decimal: áƒ�თáƒ�ბითი: Hexadecimal: თექვსმეტáƒ�ბითი: RPN Stack RPN სტეკი Icons only მხáƒ�ლáƒ�დ ხáƒ�ტულები Text only მხáƒ�ლáƒ�დ ტექსტი Text beside icons ტექსტი ხáƒ�ტულის გვერდზე Text under icons ტექსტი ხáƒ�ტულების ქვეშ Copy კáƒ�პირებáƒ� <i>Right-click/long press</i>: %1 <i>მáƒ�რჯვენáƒ� წკáƒ�პი/დიდხáƒ�ნს დáƒ�ჭერáƒ�</i>: %1 Open menu მენიუს გáƒ�ხსნáƒ� Number Bases რიცხვის ფუძეები <i>Middle-click</i>: %1 <i>შუáƒ� წკáƒ�პი</i>: %1 Conversion operator გáƒ�დáƒ�ყვáƒ�ნის áƒ�პერáƒ�ტáƒ�რი Rotate the stack or move the selected register up სტეკის მáƒ�ბრუნებáƒ�, áƒ�ნ მáƒ�ნიშნული რეგისტრის áƒ�ტáƒ�ნáƒ� Rotate the stack or move the selected register down სტეკის მáƒ�ბრუნებáƒ�, áƒ�ნ მáƒ�ნიშნული რეგისტრის ჩáƒ�მáƒ�ტáƒ�ნáƒ� Swap the top two values or move the selected value to the top of the stack ზედáƒ� áƒ�რი მნიშვნელáƒ�ბის მიმáƒ�ცვლáƒ�, áƒ�ნ მáƒ�ნიშნული მნიშვნელáƒ�ბის სტეკის თáƒ�ვში áƒ�ტáƒ�ნáƒ� Delete the top or selected value ზედáƒ�, áƒ�ნ მáƒ�ნიშნული მნიშვნელáƒ�ბის წáƒ�შლáƒ� Enter the top value from before the last numeric operation შეიყვáƒ�ნეთ ზედáƒ� მნიშვნელáƒ�ბáƒ� ბáƒ�ლáƒ� რიცხვით áƒ�პერáƒ�ციáƒ�მდე Copy the selected or top value to the top of the stack მáƒ�ნიშნული, áƒ�ნ ზედáƒ� მნიშვნელáƒ�ბის სტეკის თáƒ�ვში áƒ�ტáƒ�ნáƒ� Clear the RPN stack RPN სტეკის გáƒ�სუფთáƒ�ვებáƒ� New Function… áƒ�ხáƒ�ლი ფუნქციáƒ�… Favorites რჩეულები Recent უáƒ�ხლესი User functions მáƒ�მხმáƒ�რებლის ფუნქციები Open dialog დიáƒ�ლáƒ�გის გáƒ�ხსნáƒ� Show all functions ყველáƒ� ფუნქციის ჩვენებáƒ� User units მáƒ�მხმáƒ�რებლის ერთეულები more მეტი Prefixes პრეფიქსები Show all units ყველáƒ� ერთეულის ჩვენებáƒ� User variables მáƒ�მხმáƒ�რებლის ცვლáƒ�დები Show all variables ყველáƒ� ცვლáƒ�დის ჩვენებáƒ� Powerful and easy to use calculator ძლიერი დáƒ� მáƒ�რტივი გáƒ�მáƒ�სáƒ�ყენებელი კáƒ�ლკულáƒ�ტáƒ�რი License: GNU General Public License version 2 or later ლიცენზიáƒ�: GNU General Public License version 2 áƒ�ნ უფრáƒ� áƒ�ხáƒ�ლი %1: %1: Error შეცდáƒ�მáƒ� Couldn't write definitions áƒ�ღწერების ჩáƒ�წერის შეცდáƒ�მáƒ� hexadecimal თექვსმეტáƒ�ბითი octal რვáƒ�áƒ�ბითი decimal áƒ�თáƒ�ბითი duodecimal თáƒ�რმეტáƒ�ბითი binary ბინáƒ�რული roman რáƒ�მáƒ�ნული bijective ბიექტურáƒ�ბáƒ� sexagesimal ექვსáƒ�ბითი latitude გáƒ�ნედი longitude გრძედი time დრáƒ� scientific სáƒ�მეცნიერáƒ� engineering სáƒ�ინჟინრáƒ� simple მáƒ�რტივი Time zone parsing failed. დრáƒ�ის სáƒ�რტყელის დáƒ�მუშáƒ�ვების შეცდáƒ�მáƒ�. bases ფუძეები calendars კáƒ�ლენდრები rectangular მáƒ�რთკუთხედი cartesian დეკáƒ�რტის exponential ექსპáƒ�ტენციáƒ�ლური polar პáƒ�ლáƒ�რული phasor ფáƒ�ზური angle angle optimal áƒ�პტიმáƒ�ლური prefix პრეფიქსი base base units ბáƒ�ზáƒ� mixed შერეული factors factors partial fraction ნáƒ�წილáƒ�ბრივი წილáƒ�დი base number base ბáƒ�ზáƒ� decimals áƒ�თწილáƒ�დები fraction ნáƒ�წილი factorize მáƒ�მრáƒ�ვლებáƒ�დ დáƒ�შლáƒ� expand áƒ�მáƒ�კეცვáƒ� Calculating… გáƒ�მáƒ�თვლáƒ�… Cancel გáƒ�უქმებáƒ� RPN Operation RPN áƒ�პერáƒ�ციáƒ� Factorizing… ფáƒ�ქტáƒ�რიზáƒ�ციáƒ�… Expanding partial fractions… წილáƒ�დი რიცხვების გáƒ�ფáƒ�რთáƒ�ებáƒ�… Expanding… გáƒ�ფáƒ�რთáƒ�ებáƒ�… Converting… გáƒ�დáƒ�ყვáƒ�ნáƒ�… RPN Register Moved RPM რეგისტრი გáƒ�დáƒ�ტáƒ�ნილიáƒ� Processing… დáƒ�მუშáƒ�ვებáƒ�… Matrix მáƒ�ტრიცáƒ� Unknown variables (e.g. x, y, z) are by default assumed real. უცნáƒ�ბი ცვლáƒ�დები (მáƒ�გ: x, y, z) ნáƒ�გულისხმევáƒ�დ ითვლებáƒ� რეáƒ�ლურáƒ�დ. Temperature Calculation Mode ტემპერáƒ�ტურის გáƒ�მáƒ�თვლის რეჟიმი The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). გáƒ�მáƒ�სáƒ�ხულებáƒ� გáƒ�ურკვეველიáƒ�. áƒ�ირჩიეთ ტემპერáƒ�ტურის გáƒ�მáƒ�თვლის რეჟიმი (რეჟიმის შეცვლáƒ� მáƒ�გვიáƒ�ნებით, მáƒ�რგების ფáƒ�ნჯáƒ�რáƒ�ში შეგიძლიáƒ�თ). Absolute áƒ�ბსáƒ�ლუტური Relative ფáƒ�რდáƒ�ბითი Hybrid ჰიბრიდული Please select desired variant of the sinc function. áƒ�ირჩიეთ sinc ფუნქციის სáƒ�სურველი ვáƒ�რიáƒ�ნტი. Unnormalized დáƒ�უნáƒ�რმáƒ�ლიზებელი Normalized ნáƒ�რმáƒ�ლიზებულიáƒ� Interpretation of dots წერტილების ინტერპრეტáƒ�ციáƒ� Interpretation of comma მძიმის ინტერპრეტáƒ�ციáƒ� Please select interpretation of comma (",") (this can later be changed in preferences). áƒ�ირჩიეთ მძიმის (",") ინტერპრეტáƒ�ციáƒ�. (áƒ�მის შეცვლáƒ� მáƒ�გვიáƒ�ნებით, მáƒ�რგების ფáƒ�ნჯáƒ�რáƒ�ში შეგიძლიáƒ�თ). Please select interpretation of dots (".") (this can later be changed in preferences). áƒ�ირჩიეთ წერტილის (".") ინტერპრეტáƒ�ციáƒ�. (áƒ�მის შეცვლáƒ� მáƒ�გვიáƒ�ნებით, მáƒ�რგების ფáƒ�ნჯáƒ�რáƒ�ში შეგიძლიáƒ�თ). Both dot and comma as decimal separators áƒ�რივე, წერტილიც დáƒ� მძიმეც, რáƒ�გáƒ�რც წილáƒ�დის გáƒ�მყáƒ�ფი Dot as thousands separator წერტილი, რáƒ�გáƒ�რც áƒ�თáƒ�სების გáƒ�მყáƒ�ფი Comma as thousands separator მძიმე, რáƒ�გáƒ�რც áƒ�თáƒ�სების გáƒ�მყáƒ�ფი Only dot as decimal separator წილáƒ�დების გáƒ�მყáƒ�ფáƒ�დ მხáƒ�ლáƒ�დ წერტილის გáƒ�მáƒ�ყენებáƒ� Comma as separator for function arguments and matrix/vector elements მძიმე, რáƒ�გáƒ�რც გáƒ�მყáƒ�ფი ფუნქციის áƒ�რგუმენტებისთვის დáƒ� მáƒ�ტრიცის/ვექტáƒ�რის ელემენტებისთვის Parsing Mode áƒ�ნáƒ�ლიზის რეჟიმი The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). გáƒ�მáƒ�სáƒ�ხულებáƒ� გáƒ�ურკვეველიáƒ�. áƒ�ირჩიეთ გáƒ�ურკვეველი გáƒ�მრáƒ�ვლების მქáƒ�ნე გáƒ�მáƒ�სáƒ�ხულებების ინტერპრეტáƒ�ციáƒ� (áƒ�მის შეცვლáƒ� მáƒ�გვიáƒ�ნებით, მáƒ�რგების ფáƒ�ნჯáƒ�რáƒ�ში შეგიძლიáƒ�თ). Implicit multiplication first ჯერ მáƒ�ხდებáƒ� áƒ�რáƒ�ცხáƒ�დი გáƒ�მრáƒ�ვლებების áƒ�ნáƒ�ლიზი Conventional მიღებული Adaptive შეგუებáƒ�დი Percentage Interpretation პრáƒ�ცენტების ინტერპრეტáƒ�ციáƒ� Please select interpretation of percentage addition áƒ�ირჩიეთ პრáƒ�ცენტების მიმáƒ�ტების ინტერპრეტáƒ�ციáƒ� Add percentage of original value áƒ�რიგინáƒ�ლი მნიშვნელáƒ�ბის პრáƒ�ცენტების მიმáƒ�ტებáƒ� Add percentage multiplied by 1/100 1/100-ზე გáƒ�მრáƒ�ვლებული პრáƒ�ცენტების მიმáƒ�ტებáƒ� Add Action (%1) ქმედების დáƒ�მáƒ�ტებáƒ� (%1) Edit Keyboard Shortcut კლáƒ�ვიáƒ�ტურის მáƒ�ლსáƒ�ხმáƒ�ბის ჩáƒ�სწáƒ�რებáƒ� New Keyboard Shortcut áƒ�ხáƒ�ლი კლáƒ�ვიáƒ�ტურის მáƒ�ლსáƒ�ხმáƒ�ბი Action ქმედებáƒ� Value: მნიშვნელáƒ�ბáƒ�: Set key combination ღილáƒ�კების მიმდევრáƒ�ბის დáƒ�ყენებáƒ� Press the key combination you wish to use for the action. დáƒ�áƒ�ჭირეთ ღილáƒ�კების კáƒ�მბინáƒ�ციáƒ�ს, რáƒ�მელიც გნებáƒ�ვთ, ქმედებისთვის გáƒ�მáƒ�იყენáƒ�თ. Reserved key combination დáƒ�ცული ღილáƒ�კების კáƒ�მბინáƒ�ციáƒ� Question კითხვáƒ� The key combination is already in use. Do you wish to replace the current action (%1)? ღილáƒ�კების კáƒ�მბინáƒ�ციáƒ� უკვე გáƒ�მáƒ�იყენებáƒ�. გნებáƒ�ვთ მიმდინáƒ�რე ქმედების (%1) ჩáƒ�ნáƒ�ცვლებáƒ�? Key combination ღილáƒ�კების მიმდევრáƒ�ბáƒ� Add… დáƒ�მáƒ�ტებáƒ�… Edit… ჩáƒ�სწáƒ�რებáƒ�… Remove წáƒ�შლáƒ� Gnuplot was not found Gnuplot áƒ�ღმáƒ�ჩენილი áƒ�რáƒ�áƒ� %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. გრáƒ�ფიკების დáƒ�სáƒ�ხáƒ�ზáƒ�დ %1-ის (%2) ცáƒ�ლკე უნდáƒ� დáƒ�áƒ�ყენáƒ�თ დáƒ� ხელმისáƒ�წვდáƒ�მი უნდáƒ� იყáƒ�ს ძებნის ბილიკში. Example: Example of function usage მáƒ�გáƒ�ლითი: Keep open ღიáƒ�დ დáƒ�ტáƒ�ვებáƒ� Enter RPN Enter შესვლáƒ� Calculate გáƒ�მáƒ�თვლáƒ� Apply to Stack სტეკზე გáƒ�დáƒ�ტáƒ�რებáƒ� Insert ჩáƒ�სმáƒ� Value მნიშვნელáƒ�ბáƒ� Argument áƒ�რგუმენტი True ჭეშმáƒ�რიტი False მცდáƒ�რი Info ინფáƒ�რმáƒ�ციáƒ� optional optional argument áƒ�რáƒ�სáƒ�ვáƒ�ლდებულáƒ� Failed to open %1. %2 %1-ის გáƒ�ხსნის შეცდáƒ�მáƒ�. %2 Failed to open workspace სáƒ�მუშáƒ�áƒ� სივრცის გáƒ�ხსნáƒ� ჩáƒ�ვáƒ�რდáƒ� Couldn't save workspace სáƒ�მუშáƒ�áƒ� სივრცის შენáƒ�ხვáƒ� შეუძლებელიáƒ� Save file? შევინáƒ�ხáƒ� ფáƒ�ილი? Do you want to save the current workspace? გნებáƒ�ვთ მიმდინáƒ�რე სáƒ�მუშáƒ�áƒ� სივრცის შენáƒ�ხვáƒ�? Do not ask again áƒ�ღáƒ�რ მკითხáƒ� UnitEditDialog General ზáƒ�გáƒ�დი Relation ურთიერთáƒ�ბáƒ� Name: სáƒ�ხელი: Category: კáƒ�ტეგáƒ�რიáƒ�: Descriptive name: გáƒ�სáƒ�გები სáƒ�ხელი: System: სისტემáƒ�: Imperial იმპერიული US Survey áƒ�მერიკული გეáƒ�დეზიური Hide unit ერთეულის დáƒ�მáƒ�ლვáƒ� Description: áƒ�ღწერáƒ�: Class: კლáƒ�სი: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. კლáƒ�სი, რáƒ�მელსáƒ�ც ეს ერთეული ეკუთვნით. სáƒ�ხელიáƒ�ნი მიღებული ერთეულები áƒ�ღწერილიáƒ� ერთი სხვáƒ� ერთეულთáƒ�ნ დáƒ�მáƒ�კიდებულებით áƒ�რáƒ�სáƒ�ვáƒ�ლდებულáƒ� ხáƒ�რისხით, რáƒ�ცáƒ� (უსáƒ�ხელáƒ�) მიღებული ერთეულები áƒ�ღიწერებáƒ� ერთეულის გáƒ�მáƒ�სáƒ�ხულებით ერთი, áƒ�ნ მეტი ერთეულით. Base unit სáƒ�ბáƒ�ზისáƒ� ერთეული Named derived unit სáƒ�ხელიáƒ�ნი წáƒ�რმáƒ�ებული ერთეული Derived unit წáƒ�რმáƒ�ებული ერთეული Base unit(s): სáƒ�ბáƒ�ზისáƒ� ერთეულ(ებ)-ი: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to ერთეული (სáƒ�ხელიáƒ�ნი მიღებული ერთეულისთვის), áƒ�ნ ერთეულის გáƒ�მáƒ�სáƒ�ხულებáƒ� (უსáƒ�ხელáƒ� მიღებულისთვის), რáƒ�მლიდáƒ�ნáƒ�ც ეს ერთეული áƒ�ღიწერებáƒ� Exponent: ხáƒ�რისხი: Relation: ურთიერთáƒ�ბáƒ�: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). სáƒ�ბáƒ�ზისáƒ� ერთეულთáƒ�ნ ურთიერთáƒ�ბáƒ�. წრფივი ურთიერთáƒ�ბებისთვის ეს უბრáƒ�ლáƒ�დ რიცხვი უნდáƒ� იყáƒ�ს.<br><br>áƒ�რáƒ�წრფივი ურთიერთáƒ�ბებისთვის გáƒ�მáƒ�იყენეთ \x მáƒ�მრáƒ�ვლისთვის დáƒ� \y ხáƒ�რისხისთვის (მáƒ�გ "\x + 273.15" ცელსიუსსáƒ� დáƒ� კელვინს შáƒ�რის ურთიერთáƒ�ბისთვის). Inverse relation: ინვერსიული ურთიერთáƒ�ბáƒ�: Specify for non-linear relation, for conversion back to the base unit. მიუთითეთ áƒ�რáƒ�წრფივი დáƒ�მáƒ�კიდებულებáƒ� უკáƒ�ნ, სáƒ�ბáƒ�ზისáƒ� ერთეულში გáƒ�დáƒ�სáƒ�ყვáƒ�ნáƒ�დ. Mix with base unit შერევáƒ� სáƒ�ბáƒ�ზისáƒ� ერთეულთáƒ�ნ Priority: პრიáƒ�რიტეტი: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". მáƒ�გ: ერთეულის "hand" დáƒ�ყენებულიáƒ� 2-ზე. ფუტის დáƒ� დუიმი დáƒ�ყენებულიáƒ� 1-ზე. რáƒ�ც მáƒ�გვცემს "17 დუიმი = 1 ფუტი + 5 დუიმი". იმის მáƒ�გიერ, რáƒ�მ "17 დუიმი = 1 ფუტი + 1 ხელი + 1 დუიმი". Minimum base unit number: მინიმáƒ�ლური სáƒ�ბáƒ�ზისáƒ� ერთეულის რáƒ�áƒ�დენáƒ�ბáƒ�: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default ნáƒ�გულისხმევáƒ�დ პრეფიქსებით გáƒ�მáƒ�ყენებáƒ� Error შეცდáƒ�მáƒ� Base unit does not exist. სáƒ�ბáƒ�ზისáƒ� ერთეული áƒ�რ áƒ�რსებáƒ�ბს. Question კითხვáƒ� A unit or variable with the same name already exists. Do you want to overwrite it? ერთეული, áƒ�ნ ცვლáƒ�დი იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Edit Unit ერთეულის ჩáƒ�სწáƒ�რებáƒ� New Unit áƒ�ხáƒ�ლი სექციáƒ� UnitsDialog Units სáƒ�ზáƒ�მი ერთეულები Category კáƒ�ტეგáƒ�რიáƒ� Unit ერთეული New… áƒ�ხáƒ�ლი… Edit… ჩáƒ�სწáƒ�რებáƒ�… Deactivate დეáƒ�ქტივáƒ�ციáƒ� Delete წáƒ�შლáƒ� Convert გáƒ�დáƒ�ყვáƒ�ნáƒ� Insert ჩáƒ�სმáƒ� Favorite რჩეული Show hidden units დáƒ�მáƒ�ლული ერთეულების ჩვენებáƒ� Inactive áƒ�რáƒ�áƒ�ქტიური Uncategorized კáƒ�ტეგáƒ�რიის გáƒ�რეშე Activate áƒ�ქტივáƒ�ციáƒ� Favorites რჩეულები User units მáƒ�მხმáƒ�რებლის ერთეულები All All units ყველáƒ� UnknownEditDialog Name: სáƒ�ხელი: Custom assumptions მáƒ�რგებული დáƒ�შვებები Type: ტიპი: Sign: შესვლáƒ�: Temporary დრáƒ�ებითი Question კითხვáƒ� A unit or variable with the same name already exists. Do you want to overwrite it? ერთეული, áƒ�ნ ცვლáƒ�დი იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Edit Unknown Variable უცნáƒ�ბი ცვლáƒ�დის ჩáƒ�სწáƒ�რებáƒ� New Unknown Variable áƒ�ხáƒ�ლი უცნáƒ�ბი ცვლáƒ�დი VariableEditDialog Required áƒ�უცილებელიáƒ� Description áƒ�ღწერáƒ� Name: სáƒ�ხელი: Value: მნიშვნელáƒ�ბáƒ�: current result მიმდინáƒ�რე შედეგი Temporary დრáƒ�ებითი Category: კáƒ�ტეგáƒ�რიáƒ�: Descriptive name: გáƒ�სáƒ�გები სáƒ�ხელი: Hide variable ცვლáƒ�დის დáƒ�მáƒ�ლვáƒ� Description: áƒ�ღწერáƒ�: Question კითხვáƒ� A unit or variable with the same name already exists. Do you want to overwrite it? ერთეული, áƒ�ნ ცვლáƒ�დი იგივე სáƒ�ხელით უკვე áƒ�რსებáƒ�ბს. გნებáƒ�ვთ გáƒ�დáƒ�áƒ�წერáƒ�თ თáƒ�ვზე? Edit Variable ცვლáƒ�დის ჩáƒ�სწáƒ�რებáƒ� New Variable áƒ�ხáƒ�ლი ცვლáƒ�დი VariablesDialog Variables ცვლáƒ�დები Category კáƒ�ტეგáƒ�რიáƒ� Variable ცვლáƒ�დი New áƒ�ხáƒ�ლი Variable/Constant… Variable/Constant… Unknown Variable… უცნáƒ�ბი ცვლáƒ�დი… Matrix… მáƒ�ტრიცáƒ�… Edit… ჩáƒ�სწáƒ�რებáƒ�… Export… გáƒ�ტáƒ�ნáƒ�… Deactivate დეáƒ�ქტივáƒ�ციáƒ� Delete წáƒ�შლáƒ� Insert ჩáƒ�სმáƒ� Favorite რჩეული Inactive áƒ�რáƒ�áƒ�ქტიური Uncategorized კáƒ�ტეგáƒ�რიის გáƒ�რეშე a matrix მáƒ�ტრიცáƒ� a vector ვექტáƒ�რი positive დáƒ�დებითი non-positive áƒ�რáƒ�-დáƒ�დებითი negative უáƒ�რყáƒ�ფითი non-negative áƒ�რáƒ�-უáƒ�რყáƒ�ფითი non-zero áƒ�რáƒ�-ნულáƒ�ვáƒ�ნი integer მთელი რიცხვი boolean ლáƒ�გიკური rational რáƒ�ციáƒ�ნáƒ�ლური real რეáƒ�ლი complex კáƒ�მპლექსური number ნáƒ�მერი not matrix áƒ�რáƒ� მáƒ�ტრიცáƒ� unknown უცნáƒ�ბი Default assumptions ნáƒ�გულისხმევი დáƒ�შვებები Activate áƒ�ქტივáƒ�ციáƒ� Favorites რჩეულები User variables მáƒ�მხმáƒ�რებლის ცვლáƒ�დები All All variables ყველáƒ� qalculate-qt-5.11.0/translations/qalculate-qt_nl.ts000066400000000000000000015116371520501070600223640ustar00rootroot00000000000000 Qalculate! Qalculate! Powerful and easy to use calculator Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden Argument Rules Regels met betrekking tot argumenten Do not save modifications Wijzigingen niet opslaan Accept the modification of argument rules De wijziging van de regels accepteren met betrekking tot argumenten Enable rules and type test Test voor regels en type toestaan Custom condition Aangepaste conditie For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Vb. indien het argument een matrix is die evenveel rijen als kolommen moet hebben: rijen(\x) = kolommen(\x) Allow matrix Matrix toestaan Forbid zero Nul niet toestaan Min Min Include equals Ook is gelijk aan Max Max Value Waarde Argument name Naam van argument Calendar Conversion Kalenderconversie Export CSV File CSV-bestand exporteren Current result Huidig antwoord Matrix/vector variable Matrix/vector-variabele File Bestand Delimiter Scheidingsteken Comma Komma Tabulator Tabtoets Semicolon Puntkomma Space Spatie Other Overig Import CSV File CSV-bestand importeren Do not import the file Bestand niet importeren Import the file Het bestand importeren Name of the data file to import Naam van het te importeren gegevensbestand Select a file Selecteer een bestand Import as Importeren als Matrix Matrix Vectors Vectoren Name Naam Name (or name prefix) used to reference generated variable(s) in expressions Naam (of voorvoegsel voor naam) gebruikt voor aangemaakte variabele(n) in expressies Descriptive name Beschrijvende naam Title displayed in menus and in variable manager Titel getoond in menu's en in variabelenbeheerder Category Categorie First row Eerste rij The first row with data to import in the file De eerste rij gegevens die in het bestand moet worden geïmporteerd Includes headings Koppen inbegrepen If the first row contains column headings Of de eerste rij kolomkoppen bevat Delimiter used to separate columns in the file Scheidingsteken voor de kolommen in het bestand Custom delimiter Standaard scheidingsteken Edit Data Property Gegevenseigenschap bewerken Do not create/modify this data set Deze gegevensverzameling niet aanmaken/wijzigen Accept the creation/modification of this data set Aanmaken/wijziging accepteren van deze gegevensverzameling Name used for reference Naam voor referentie Properties Eigenschappen Title displayed in menus and in data set manager Titel getoond in menu's en in beheerder voor gegevensverzamelingen Description Beschrijving Description of this data property Beschrijving van deze gegevenseigenschap Value Type Waardetype Text Tekst Number Getal Expression Expressie Hide Verbergen Use as key Gebruiken als sleutelwaarde Approximate value Benaderde waarde Case sensitive value Hoofdlettergevoelige waarde Value uses brackets Waarde met vierkante haakjes Unit expression Eenheidexpressie Edit Data Set Gegevensverzameling bewerken Title Titel Data file Gegevensbestand Description of this data set Beschrijving van deze gegevensverzameling Copyright Copyright General Algemeen Properties: Eigenschappen: Definition of the properties of this data set Definitie van de eigenschappen van deze gegevensverzameling _New _Nieuw _Edit B_ewerken _Delete Wissen Name used to invoke the function in expressions Naam voor functie in expressies Object argument name Naam objectargument Property argument name Naam eigenschapsargument Default property Standaardeigenschap Function Functie Edit Data Object Gegevensobject bewerken Do not create/modify this data object Dit gegevensobject niet aanmaken/wijzigen Accept the creation/modification of this data object Aanmaken/wijzigen accepteren van dit gegevensobject Data Sets new dataset Gegevensverzamelingen Data Set Gegevensverzameling Create a new data set Een nieuwe gegevensverzameling aanmaken Edit the selected data set De geselecteerde gegevensverzameling bewerken Delete the selected data set De geselecteerde gegevensverzameling wissen Objects Objecten Create a new data object Een nieuwe gegevensobject aanmaken Edit the selected data object De geselecteerde gegevensobject bewerken Remove the selected data object Geselecteerd gegevensobject verwijderen Data Set Description Beschrijving gegevensverzameling Object Attributes Objectattributen Decimals Decimalen Close this window Dit venster sluiten Min decimals Min decimalen Max decimals Max decimalen Minimal number of displayed decimals Minimum aantal te tonen decimalen Maximal number of decimals to display (and round to) Maximum aantal te tonen decimalen (en voor afronden) Decimal value Decimale waarde Binary value Binaire waarde Octal value Octale waarde Hexadecimal value Hexadecimale waarde Edit Function Functie bewerken _Help _Help Do not create/modify this function Deze functie niet aanmaken/wijzigen Accept the creation/modification of this function Aanmaken/wijzigen accepteren van deze functie Name used to invoke this function in expressions Naam voor deze functie in expressies Title displayed in menus and in function manager Titel getoond in menu's en in functiebeheerder Hide function Functie verbergen If this function shall be hidden in menus Of deze functie in de menu's verborgen moet zijn Description of this function Beschrijving van deze functie Condition Conditie Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Conditie die waar moet zijn voor de functie (bv. indien het tweede argument groter moet zijn dan het eerste: "\y > \x") Sub-Functions Subfuncties Arguments: Argumenten: Definition of this function's arguments Definitie van de argumenten voor deze functie Free Vrij Integer Geheel Symbol Symbool Date Datum Vector Vector Positive number Positief getal Non-zero number Getal ongelijk aan nul Non-negative number Niet negatief getal Positive integer Positief geheel getal Non-zero integer Geheel getal ongelijk aan nul Non-negative integer Niet-negatief geheel getal Boolean Booleaans Object Object Unit Eenheid Variable Variabele Angle Hoek Data object Gegevensobject Data property Gegevenseigenschap _Add _Toevoegen Add entered argument definition Ingevoerde argumentdefinitie toevoegen _Apply _Toepassen Modify selected argument Geselecteerd argument wijzigen Remove selected argument Geselecteerd argument verwijderen Rules Regels Edit conditions for selected argument Condities bewerken voor geselecteerd argument Close this dialog Dit dialoog sluiten Precalculate Voorberekenen Calculate the subfunction only once, before the parent function Bereken de subfunctie slechts een keer, nog voor de functie waarin die wordt gebruikt Add entered subfunction Ingevoerde subfunctie toevoegen Functions Functies Create a new function Maak een nieuwe functie aan Edit the selected function De geselecteerde functie bewerken _Insert _Invoegen Insert (or execute) the selected function into the expression entry De geselecteerde functie invoegen (of uitvoeren) bij het invoeren van de expressie Delete the selected function De geselecteerde functie wissen (De)activate the selected function De geselecteerde functie (de)activeren Deacti_vate Uit_schakelen Apply the selected function to the current expression Pas de geselecteerde functie toe op het huidige expressie Categor_y Categor_y _Function _Functie Descri_ption Beschrij_ving Degrees Booggraden Radians Radialen Gradians Decimale graden Default assumptions Standaard aannames Unknown Onbekende Not Matrix Geen matrix Complex Complex Real Reëel Rational Rationaal Non-Zero Ongelijk aan nul Positive Positief Non-Negative Niet-negatief Negative Negatief Non-Positive Niet-positief _File _Bestand Unknown Variable Onbekende variabele Function (simplified) Functie (vereenvoudigd) Import CSV File… CSV-bestand importeren… Export CSV File… CSV-bestand exporteren… _Store Result… _Antwoord opslaan… Save Result Image… Afbeelding van het antwoord opslaan… Save local functions, variables and units Lokale functies, variabelen en eenheden opslaan Save Definitions Definities opslaan Import Definitions File… Definitiesbestand importeren… Fetch current exchange rates from the Internet Haal huidige wisselkoersen op van het internet Update Exchange Rates Wisselkoersen bijwerken Plot Functions/Data Functies/gegevens plotten Convert Number Bases Getallen converteren naar ander grondtal Percentage Calculation Tool Percentage berekenen Periodic Table Periodiek systeem _Quit A_fsluiten Manage Variables Variabelen beheren Manage Functions Functies beheren Manage Units Eenheden beheren Manage Data Sets Gegevensverzamelingen beheren Factorize Ontbinden in factoren Expand Uitwerken Expand Partial Fractions Splitsen in partiële breuken Set Unknowns… Onbekenden een waarde geven… Convert to Unit Converteren naar eenheid Set Prefix Voorvoegsel instellen Convert to Unit Expression… Converteren naar eenheidexpressie… Convert to Base Units Converteren naar basiseenheden Convert to Optimal Unit Converteren naar meest geschikte eenheid Insert Date… Datum invoegen… Insert Matrix… Matrix invoegen… Insert Vector… Vector invoegen… _Copy Result _Antwoord kopiëren _Preferences _Voorkeuren _Mode _Modus Number Base Grondtal talstelsel Select Result and Expression Base… Selecteer grondtal voor antwoord en expressie… Binary Binair Octal Octaal Decimal Decimaal Duodecimal Duodecimaal Hexadecimal Hexadecimaal Other… Overig… Sexagesimal Sexagesimaal Time Format Tijdnotatie Roman Numerals Romeinse cijfers Numerical Display Tonen getal Normal Normaal Engineering Technisch Scientific Wetenschappelijk Purely Scientific Zuiver wetenschappelijk Simple Eenvoudig Indicate Repeating Decimals Oneindige reeksen aangeven Show Ending Zeroes Afsluitende nullen weergeven Round Halfway Numbers to Even Tussenliggende getallen naar even afronden Sort Minus Last Minus laatst sorteren Complex Rectangular Form Complexe rechthoekige vorm Complex Exponential Form Complexe exponentiële vorm Complex Polar Form Complexe polaire vorm Complex Angle/Phasor Notation Complexe hoeknotatie Rational Number Form Vorm van rationale getallen Decimal Fractions Decimale vorm Exact Decimal Fractions Exacte decimale vorm Simple Fractions Onegte breuken Mixed Fractions Gemengde getallen Interval Display Tonen interval Unit Display Tonen eenheid Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Automatisch gebruik van hecto, deca, deci en centi is mogelijk wanneer voorvoegsels zijn toegestaan Enable All SI Prefixes Alle SI-voorvoegsels toestaan Enables automatic setting of prefix for denominator in addition to the numerator Hiermee is het automatisch instellen van een voorvoegsel mogelijk voor de noemer naast dat voor de teller Enable Denominator Prefixes Voorvoegsel voor noemer toestaan Negative Exponents Negatieve exponenten Place Units Separately Eenheden afzonderlijk plaatsen No Additional Conversion Geen extra conversie Convert to Optimal SI Unit Converteren naar meest geschikte SI-eenheid Convert to Mixed Units Converteren naar gemengde eenheden Abbreviate Names Namen afkorten Enabled Objects Ingeschakelde objecten Variables Variabelen Units Eenheden Unknowns Onbekenden Units in Physical Constants Eenheden in natuurkundige constanten If not enabled, treats all variables as unknown Indien niet ingeschakeld worden alle variabelen als onbekenden beschouwd Calculate Variables Variabelen berekenen Disables/enables complex numbers in result Complexe antwoorden wel/niet toestaan Allow Complex Result Complexe antwoorden toestaan Disables/enables infinite numbers in result Oneindige antwoorden wel/niet toestaan Allow Infinite Result Oneindige antwoorden toestaan Approximation Benadering Always Exact Altijd exact Try Exact Exact proberen Approximate Benaderd Interval Calculation Interval berekening Change angle unit used in trigonometric functions Hoekeenheid in goniometrische functies wijzigen Angle Unit Hoekeenheid None Geen Assumptions Aannames Algebraic Mode Algebraïsche modus Assume that unknown denominators are non-zero Onbekende noemers ongelijk aan nul aannemen Non-Zero Denominators Noemers ongelijk aan nul Warn when unknown denominators are assumed non-zero Waarschuwen wanneer onbekende noemers ongelijk nul worden aangenomen Warn About Denominators Assumed Non-Zero Waarschuwen als noemers ongelijk nul worden aangenomen Parsing Mode Interpretatie modus RPN Syntax RPN-notatie Limit Implicit Multiplication Impliciet vermenigvuldigen beperken Read Precision Nauwkeurigheid lezen _Precision _Nauwkeurigheid _Decimals _Decimalen RPN Mode RPN-modus Meta Modes Metamodes Save Mode… Modus opslaan… Delete Mode… Modus wissen… Save Default _Mode Standaard _modus opslaan Fu_nctions F_uncties _Variables _Variabelen _Units _Eenheden _Contents _Inhoud _About _Info over _Keypad Numerie_ke toetse _History Gesc_hiedenis C_onversion C_onversie RPN Stack RPN-stapelgeheugen History Geschiedenis Unit(s) and prefix to convert result to Eenhe(i)d(en) en voorvoegsel waarin antwoord moet worden uitgedrukt Convert Converteren Continuous conversion Continue conversie Add prefix Voeg voorvoegsel toe Conversion Conversie Exact Exact Fraction Breuk Numerical display Tonen getal Number base Grondtal Time format Tijdnotatie Roman Romeins sin sin cos cos tan tan ln ln sqrt sqrt Unknown variable Onbekende variabele Store result as a variable Antwoord opslaan als variabele Convert number bases Getallen converteren naar ander grondtal Manage units Eenheden beheren DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Vorig antwoord EXP EXP Edit Bewerken Delete Wissen Copy Kopiëren _Copy _Kopiëren _Store… _Opslaan… Save Image… Afbeelding opslaan… _Factorize _Ontbinden in factoren _Expand _Uitwerken _Normal _Normaal Sc_ientific Wetenschappel_ijk Purel_y Scientific _Zuiver wetenschappelijk Simp_le Een_voudig _Binary _Binair _Octal _Octaal _Decimal _Decimaal _Hexadecimal _Hexadecimaal Decimal Fraction Decimale vorm Exact Decimal Fraction Exacte decimale vorm Simple Fraction Onegte breuk Mixed Fraction Gemengde getal _Abbreviate Names Namen _afkorten C_onvert… C_onverteren… Convert to Base _Units Converteren naar basis_eenheden Convert _to Optimal Unit Converteren _naar meest geschikte eenheid Use Optimal Prefix Converteren naar meest geschikte voorvoegsel Convert to Converteren naar Convert to UTC Converteren naar UTC Convert to Calendars Converteren naar kalendars Enable All SI Prefi_xes Alle _SI-voorvoegsels toestaan View/Edit Matrix Matrix bekijken/bewerken View/Edit Vector Vector bekijken/bewerken Select Number Base… Selecteer grondtal… Store result Antwoord opslaan Insert the matrix/vector into the expression De geselecteerde matrix/vector in de expressie invoegen Rows Rijen Number of rows in this matrix (rows displayed for vectors) Aantal rijen in deze matrix (vectoren worden als rijen getoond) Columns Kolommen Number of columns in this matrix (columns displayed for vectors) Aantal kolommen in deze matrix (vectoren worden als kolommen getoond) If this is a matrix or vector Indien dit een matrix of vector is Elements Elementen Current element: Huidig element: Edit Matrix Matrix bewerken Do not create/modify this matrix/vector Deze matrix/vector niet aanmaken/wijzigen Create/modify the matrix/vector Aanmaken/wijzigen van de matrix/vector Accept the creation/modification of this matrix/vector Aanmaken/wijzigen van deze matrix/vector accepteren Name used to reference this variable in expressions Naam voor deze variabele in expressies Names Namen Abbreviation Afkorting Unicode Unicode Plural Meervoud Suffix Achtervoegsel Reference Referentie Avoid input Invoer vermijden Case sensitive Hoofdlettergevoelig Number Bases Grondtallen voor talstelsels Roman numerals Romeinse cijfers BIN BIN OCT OCT HEX HEX Subtract Aftrekken Multiply Vermenigvuldigen Divide Delen Clear Leegmaken Value 1 Waarde 1 Value 2 Waarde 2 Plot Plot _Save Opslaan Save as png, svg, postscript, eps, latex or fig Opslaan als png, svg, postscript, eps, latex of fig Vector/matrix Vector/matrix Paired matrix Gepaarde matrix if you want to split matrix in rows instead of columns indien u matrix wilt splitsen in rijen in plaats van kolommen X variable Variabele x The variable name used in expression De naam van de variabele in expressie Style Stijl Line Lijn Points Punten Line with points Lijn met punten Boxes/bars Balken Histogram Histogram Steps Stappen Candlesticks Kaarsdiagrammen Dots Puntjes Smoothing Gladstrijken Monotonic Monotoon Natural cubic splines Natuurlijke kubische splines Bezier Bézier Bezier (monotonic) Bézier (monotoon) Y-axis Y-as: Primary Primair Secondary Secondair _Remove _Wissen Data Gegevens Sampling rate Bemonsteringsfrequentie Step size Stapgrootte Function Range Functiebereik Display grid Rooster tonen Display full border Volledige rand tonen Logarithmic x scale Logaritmische schaal x-as Logarithmic y scale Logaritmische schaal y-as X-axis label Tekst bij de x-as Y-axis label Tekst bij de y-as Color display Kleuren Color Kleur Monochrome Zwartwit Legend placement Plaatsen legenda Top-left Linksboven Top-right Rechtsboven Bottom-left Linksonder Bottom-right Rechtsonder Below Onder Outside Er buiten Appearance Uiterlijk Precision Nauwkeurigheid _Recalculate _Opnieuw berekenen Recalculate expression Expressie opnieuw berekenen The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Het aantal te tonen/berekenen significante cijfers (eenvoudige berekeningen zijn altijd exact) Preferences Voorkeuren Save mode on exit Modus opslaan bij verlaten If the mode of the calculator shall be restored Indien de modus van de rekenmachine moet worden teruggezet Save definitions on exit Definities opslaan bij verlaten If changes to functions, units and variables shall be saved automatically Indien veranderingen in functies, eenheden en variabelen automatisch moeten worden opgeslagen Behavior Gedrag Enable Unicode symbols Unicode toestaan Disable this if you have problems with some fancy characters Dit uitschakelen als er problemen zijn met bijzondere karakters Result Antwoord Mode Modus Default Standaard / / 3 3 Display expression status Expressiestatus tonen If as-you-type expression status shall be displayed below the expression entry Indien status expressie zoals u-die-intypt moet worden getoond onder de invoer van de expressie Look & Feel Uitstraling & gevoel If lower case letters should be used in numbers with non-decimal base Indien kleine letters moeten worden gebruikt in niet-decimale getallen Alternative base prefixes Alternatieve voorvoegsels voor het grondtal If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Of hexadecimale getallen moeten worden getoond met het voorvoegsel "0x0" en binaire getallen net het voorvoegsel "0b00" Spell out logical operators Logische operatoren voluit spellen If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Indien logische and/or moeten worden getoond als "&&"/"||" of als "and"/"or" If "e" shall be used instead of "E" in numbers Indien in getallen "e" moet worden gebruikt in plaats van "E" Use lower case "e" (as in 1e10) Kleine letter "e" gebruiken (Bv. 1e10) Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Toestaan dat punten, '.', worden gebruikt als scheidingsteken voor duizendtallen in plaats van als een alternatief decimaal teken Ignore comma in numbers Komma in getallen negeren Ignore dots in numbers Punten in getallen negeren Multiplication sign Teken voor vermenigvuldigen Division sign Teken voor deling Update exchange rates on start Wisselkoersen ophalen bij opstarten If current exchange rates shall be downloaded from the internet at program start Indien huidige wisselkoersen moeten worden opgehaald van het internet bij het starten van het programma Exchange rates updates Wisselkoersen ophalen Status warning color Kleur waarschuwingstatus Status error color Kleur foutstatus Custom status font Aangepast lettertype voor status If you want to use a font other than the default in the status display below the expression entry Indien u voor het tonen van de status onder de invoer van expressies een ander dan het standaardfont wilt gebruiken Custom expression font Aangepast lettertype voor expressie If you want to use a font other than the default in the expression entry Indien u bij het invoeren van expressies een ander dan het standaardfont wilt gebruiken Custom result font Aangepast lettertype voor antwoord If you want to use a font other than the default in the result display Indien u voor het tonen van het antwoord een ander dan het standaardfont wilt gebruiken Fonts & Colors Lettertypen & kleuren Other: Overig: <b>Result Base</b> <b>Grondtal van antwoord</b> <b>Expression Base</b> <b>Grondtal van expressie</b> Edit Variable Variabele bewerken Accept the creation/modification of this variable Aanmaken/wijzigen van deze variabele accepteren Edit Unit Eenheid bewerken Do not create/modify this unit Deze eenheid niet aanmaken/wijzigen Accept the creation/modification of this unit Aanmaken/wijzigen van deze eenheid accepteren Singular form of this unit's name Enkelvoud voor deze eenheid Title displayed in menus and in unit manager Titel getoond in menu's en in eenheidbeheerder System Systeem Imperial Imperial US Survey US Survey Hide unit Eenheid verbergen If this unit shall be hidden in menus Indien deze eenheid in de menu's verborgen moet zijn Class Klasse Base unit Basiseenheid Named derived unit Benoemde afgeleide eenheid Derived unit Afgeleide eenheid Base unit(s) Basiseenheid(en) Exponent Exponent Exponent of the base unit Exponent van de basiseenheid Relation Relatie Relation is exact Relatie is exact If the relation is precise Indien de relatie precies is Inverse relation Inverse relatie Create a new unit Een nieuwe eenheid aanmaken Edit the selected unit De geselecteerde eenheid bewerken Insert the selected unit into the expression entry De geselecteerde eenheid in de ingevoerde expressie invoegen C_onvert C_onverteren Convert the result to the selected unit Het antwoord converteren naar de geselecteerde eenheid Delete the selected unit De geselecteerde eenheid wissen (De)activate the selected unit De geselecteerde eenheid (de)activeren _Unit _Eenheid Convert between units Converteren tussen eenheden = = Conver_sion Conver_sie Converted value Geconverteerde waarde Value to convert from Waarde die moet worden geconverteerd Edit Unknown Variable Onbekende variabele bewerken Do not create/modify this unknown variable Deze onbekende variabele niet aanmaken/wijzigen Accept the creation/modification of this unknown variable Aanmaken/wijzigen van deze onbekende variabele accepteren Name used to reference this unknown variable in expressions Naam voor deze onbekende variabele in expressies Use custom assumptions Aangepaste aannames gebruiken Type Type Real Number Reëel getal Rational Number Rationaal getal Sign Teken The category this unknown variable belongs to De categorie van deze onbekende variabele Value of this variable (expression) Waarde van deze variabele (expressie) value is exact waarde is exact If the value is precise Indien de waarde precies is The category this variable belongs to De categorie van deze variabele Create a new variable Een nieuwe variabele aanmaken Edit the selected variable De geselecteerde variabele bewerken Insert the selected variable into the expression entry De geselecteerde variabele invoegen in de ingevoerde expressie Delete the selected variable De geselecteerde variabele wissen (De)activate the selected variable De geselecteerde variabele (de)activeren E_xport E_xporteren _Variable _Variabele ans antw Last Answer Laatste antwoord answer antwoord Answer 2 Antwoord 2 Answer 3 Antwoord 3 Answer 4 Antwoord 4 Answer 5 Antwoord 5 Failed to load global definitions! Inlezen van globale definities is mislukt! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alles Decimal point Decimale komma Raise (Ctrl+*) Machtsverheffen (Ctrl+*) Add Optellen Calculate expression Expressie berekenen Set unknowns Onbekenden een waarde geven Index Index Calculate expression and add to stack Expressie berekenen en aan het stapelregister toevoegen Matrices Matrices Action Actie Raise Machtsverheffen expression expressie Could not display help for Qalculate!. %s Help kan niet worden getoond voor Qalculate!. %s c-format approx. benadering EXACT EXACT APPROX BENADERING RPN RPN ROMAN ROMEINS DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT EENH VAR VAR INF INF CPLX CPLX Too many arguments for %s(). Te veel argumenten voor %s(). c-format argument argument Uncategorized Niet-gecategoriseerd hexadecimal hexadecimaal octal octaal decimal decimaal duodecimal duodecimaal binary binair roman romeins sexagesimal sexagesimaal time tijd bases grondtallen calendars kalenders rectangular rechthoekig cartesian cartesisch exponential exponentiële polar polair angle hoek optimal optimale base basis mixed gemengde fraction breuk factors factoren partial fraction partiële breuken hexadecimal number hexadecimaal getal octal number octaal getal decimal number decimaal getal duodecimal number dodecimaal getal binary number binair getal roman numerals romeinse cijfers sexagesimal number sexagesimaal getal time format tijdnotatie number bases grondtallen optimal unit meest geschikte eenheid base units basiseenheden mixed units gemengde eenheden expanded partial fractions splitsen in partiële breuken complex rectangular form complexe rechthoekige vorm complex exponential form complexe exponentiële vorm complex polar form complexe polaire vorm complex cis form complexe cis-vorm complex angle notation complexe hoeknotatie complex phasor notation complexe hoeknotatie UTC time zone UTC-tijdzone number base %s grondtal %s c-format Inactive Inactief Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Haalt gegevens op van een gegeven object of eigenschap uit de gegevensverzameling %s. Indien als eigenschap "info" wordt ingetypt krijgt u een dialoogvenster te zien waarin alle eigenschappen van het object worden genoemd. c-format Example: bv. Arguments Argumenten optional optional argument optioneel default: argument default, in description standaard: Requirement Vereiste key indicating that the property is a data set key toets Acti_vate Acti_veren a previous result een vorig antwoord matrix matrix vector vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul boolean booleaans integer geheel rational rationaal real reëel complex complex number getal (not matrix) (geen matrix) unknown onbekend default assumptions standaard aannames Variable does not exist anymore. Variabele bestaat niet meer. Data Retrieval Function Functie voor ophalen gegevens Convert to unit Converteren naar eenheid Manage variables Variabelen beheren Manage functions Functies beheren Manage data sets Gegevensverzamelingen beheren New variable Nieuwe variabele New function Nieuwe functie Open plot functions/data Functies/gegevens plotten Open convert number bases Getallen converteren naar ander grondtal Open calender conversion Kalenderconversie Open percentage calculation tool Percentage berekenen Open periodic table Periodiek systeem Update exchange rates Wisselkoersen bijwerken Copy result Antwoord kopiëren Save result image Afbeelding van het antwoord opslaan Help Help Quit Afsluiten Prefixes Voorvoegsels No Prefix Geen voorvoegsel Optimal Prefix Meest geschikte voorvoegsel Prefix Voorvoegsel Complex angle/phasor notation Complexe hoeknotatie Number bases Grondtallen Base units Basiseenheden Binary number Binair getal Calendars Kalendars Complex cis form Complexe cis-vorm Decimal number Decimaal getal Duodecimal number Duodecimaal getal Complex exponential form Complexe exponentiële vorm Factors Factoren Hexadecimal number Hexadecimaal getal Mixed units Gemengde eenheden Octal number Octaal getal Optimal units Meest geschikte eenheden Expanded partial fractions Partiële breuken Complex polar form Complexe polaire vorm Complex rectangular form Complexe rechthoekige vorm Sexagesimal number Sexagesimaal getal and and or or undefined ongedefinieerd result is too long see history antwoord te lang zie geschiedenis calculation was aborted berekening werd afgebroken RPN Register Moved RPN-register is verplaatst RPN Operation RPN-bewerking Processing… Verwerken… result processing was aborted berekening werd afgebroken Factorizing… Ontbinden in factoren… Expanding partial fractions… Splitsen in partiële breuken… Expanding… Uitwerken… Calculating… Berekenen… Converting… Converteert… Fetching exchange rates. Wisselkoersen worden opgehaald. C_alculate _Berekenen Argument Argument True Waar False Onwaar Info Info Edit Unit (global) Eenheid bewerken (globaal) New Unit Nieuwe eenheid Empty name field. Geen naam opgegeven. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Er bestaat al een variabele of eenheid met deze naam. Wilt u die overschrijven? Base unit does not exist. Basiseenheid bestaat niet. Edit Function (global) Functie bewerken (globaal) New Function Nieuwe functie Yes Ja No Nee Empty expression field. Expressieveld is leeg. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Er bestaat al een functie met deze naam. Wilt u die overschrijven? Unit does not exist Eenheid bestaat niet Edit Unknown Variable (global) Onbekende variabele bewerken (globaal) New Unknown Variable Nieuwe onbekende variabele An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Variable (global) Variabele bewerken (globaal) New Variable Nieuwe variabele Empty value field. Geen waarde opgegeven. Edit Vector Vector bewerken Edit Vector (global) Vector bewerken (globaal) New Vector Nieuwe vector Edit Matrix (global) Matrix bewerken (globaal) New Matrix Nieuwe matrix Vector Result Vector-antwoord Matrix Result Matrix-antwoord New Data Object Nieuw gegevensobject text tekst approximate benaderd Edit Data Set (global) Gegevensverzameling bewerken (globaal) New Data Set Nieuwe gegevensverzameling info info Property Eigenschap No file name entered. Geen bestandsnaam opgegeven. No delimiter selected. Geen scheidingsteken geselecteerd. Could not import from file %s Kon niet importeren uit bestand %s c-format No variable name entered. Geen naam opgegeven voor variabele. No known variable with entered name found. Geen bekende variabele met opgegeven naam gevonden. Could not export to file %s Kon niet exporteren naar bestand %s c-format My Variables Mijn variabelen Couldn't write definitions Kon definities niet schrijven Preset Voorinstelling Save Mode Modus opslaan Preset mode cannot be overwritten. Vooringestelde modus kan niet worden overschreven. Delete Mode Modus wissen Couldn't write preferences to %s Kon de voorkeurinstellingen niet schrijven naar %s c-format never nooit ask vragen %i day %i dag %i dagen c-format %i days Copied Result was copied Gekopieerd log10 function not found. kon log10-functie niet vinden. Select date Datum selecteren Rectangular form Rechthoekig vorm Exponential form Exponentiële vorm Polar form Polaire vorm Angle/phasor notation Hoeknotatie Optimal unit Meest geschikte eenheid Optimal prefix Meest geschikte voorvoegsel All functions Alle functies All variables Alle variabelen Select file to save PNG image to Bestand voor opslaan PNG-afbeelding selecteren Allowed File Types Toegestane bestandstypes All Files Alle bestanden Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kan eenheid niet wissen omdat die nodig is voor andere eenheden. none geen result is too long antwoord te lang translator-credits Rinse de Vries <RinseDeVries@home.nl> Jaap Woldringh <jjh.woldringh@planet.nl> Elements (in horizontal order) Elementen (horizontale volgorde) Select file to import Te importeren bestand selecteren Select file to export to Bestand waarnaar moet worden geëxporteerd selecteren A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Er is een conflicterend object met dezelfde naam. Indien u verder gaat en veranderingen opslaat wordt dit conflicterend object overschreven of inactief gemaakt. Wilt u verdergaan? Select file to export Te exporteren bestand selecteren Empty expression. Expressie niet gegeven. Empty x variable. Variabele x niet gegeven. Classification Indeling Alkali Metal Alkalisch metaal Alkaline-Earth Metal Alkalisch aardmetaal Lanthanide Lanthanide Actinide Actinide Transition Metal Overgangsmetaal Metal Metaal Metalloid Metalloïde (halfmetaal) Polyatomic Non-Metal Polyatomisch niet-metaal Diatomic Non-Metal Diatomisch niet-metaal Noble Gas Edelgas No unknowns in result. Geen onbekenden in antwoord. Set Unknowns Onbekenden een waarde geven Copy result to clipboard Antwoord kopiëren x x If a matrix or vectors shall be generated from the contents of the file Of een matrix of vectoren moeten worden aangemaakt van de inhoud van het bestand Add Keypad Optellen 1 1 Base Unit Basiseenheid Alias Alias Composite Unit Samengestelde eenheid Fonts Lettertypen Chain Calculation Interval berekening <b>Name</b> <b>Naam</b> <b>Type</b> <b>Type</b> <b>Relation</b> <b>Relatie</b> Never nooit %i seconds %i seconden c-format Ent Ent Defaults Standaard Customize Buttons Aangepast lettertype voor status Names details Namen details approx benadering Rational number form Rationale getalform Decimal fractions Decimale vorm Exact decimal fractions Exacte decimale vorm Simple fractions Onegte breuken Mixed fractions Gemengde getallen settitle Titel 0 0 10 10 7 7 General Keypad Algemeen 2 2 float16 binary number binair getal float32 binary number binair getal float64 binary number binair getal float128 binary number binair getal Clear the RPN stack (Ctrl+Shift+Delete) Het RPN-stapelgeheugen (stack) wissen Open plot dialog Dit dialoog sluiten ∠ (angle) ∠ (hoek) Copy Value Text Waardetype number base %li grondtal %li Base Units Basiseenheden 10^x (Ctrl+Shift+E) 10^x (Ctrl+Shift+E) <i>e</i> <i>f(x)</i> x<sup>2</sup> x<sup>2</sup> 1/2 2 x<sup>3</sup> x<sup>y</sup> 1/3 1 x<sup>4</sup> x<sup>y</sup> 1/4 1 x<sup>5</sup> x<sup>y</sup> 1/5 1 x<sup>6</sup> x<sup>y</sup> 1/6 1 x<sup>7</sup> x<sup>y</sup> 1/7 1 x<sup>8</sup> x<sup>y</sup> 1/8 1 x<sup>9</sup> x<sup>y</sup> Insert Date... Invoegen Percent Procent Simplify Vereenvoudigen _Simplify _Vereenvoudigen Simplifying… Vereenvoudigen… Sine Sinus Cosine Cosinus Tangent Tangens Natural logarithm Natuurlijke logaritme Summation function Sommatie functie Factorial Faculteit Archimedes' constant Archimede's constante 4 4 5 5 6 6 8 8 9 9 11 1 * * ** * Forms of Fractions F_ractionele breuk Form of Fractions F_ractionele breuk Fractional Display Tonen breuk Decimal (Try Exact) Decimaal (Exact proberen) Combined Gecombineerd Fractional display Tonen breuk Exact rationals Exacte rationale getallen Fraction D_ecimal D_ecimale breuk Fraction Decimal (Try Exact) Decimale breuk (Exact proberen) Fraction Co_mbined Breuk geco_mbineerd Utilities Hulpmiddelen Always exact Altijd exact Try exact Exact proberen Relation to the base unit (usually just a number) Relatie tot de basiseenheid (gewoonlijk een getal) You probably do not need to define this U hoeft dit waarschijnlijk niet te definiëren _Execute _Uitvoeren Unit to convert to Eenheid waarnaar moet worden geconverteerd Indicate Infinite Series Oneindige reeksen aangeven RPN Stack Only RPN-stapelgeheugen Use only keypad keys for RPN operations (+-*/^) and use the rest of the keyboard for expression entry Voor RPN-bewerkingen alleen het numerieke deel van het toetsenbord gebruiken, en het hele toetsenbord voor het invoeren van expressies Complex Number Complex getal + + - - . . No default angle unit Een nieuwe eenheid aanmaken Create new function Maak een nieuwe functie aan Use default assumptions standaard aannames <b>7</b> <b>Naam</b> <b>8</b> <b>Naam</b> <b>9</b> <b>Naam</b> <b>4</b> <b>Naam</b> <b>5</b> <b>Naam</b> <b>6</b> <b>Naam</b> <b>*</b> <b>Naam</b> <b>/</b> <b>Naam</b> <b>1</b> <b>Naam</b> <b>2</b> <b>Naam</b> <b>3</b> <b>Naam</b> <b>+</b> <b>Naam</b> <b>-</b> <b>Naam</b> <b>0</b> <b>Naam</b> <b>.</b> <b>Naam</b> <b>=</b> <b>Naam</b> <i>x<sup>y</sup></i> x<sup>y</sup> <i>x</i> <i>f(x)</i> <i>y</i> <i>f(x)</i> <i>z</i> <i>f(x)</i> <i>x</i>! <i>f(x)</i> <i>f(x)</i> <i>f(x)</i> Toggle fractional number display Tonen van breuken aan/uit Raise by two Tot de tweede macht Base-10 logarithm Logaritme met grondtal 10 log log Toggle hyperbolic functions Hyperbolische functies aan/uit hyp hyp Toggle inverse functions Inverse functies aan/uit inv inv Deg Deg Rad Rad Gra Gra Wget arguments Argumenten voor wget Arguments (in addition to timeout and output file) passed to wget when fetching exchange rates Argumenten (naast tijdlimiet en uitvoerbestand) doorgegeven aan wget wanneer wisselkoersen worden opgehaald You need to download exchange rates to be able to convert between different currencies. You can later get current exchange rates by selecting “Update Exchange Ratesâ€� under the File menu. Do you want to fetch exchange rates now from the Internet? U moet de wisselkoersen ophalen om van de ene naar de andere munteenheid te kunnen converteren. U kunt de huidige wisselkoersen ophalen door "Wisselkoersen ophalen" te selecteren in het menu Bestand. Wilt u de wisselkoersen nu ophalen van het internet? Could not display help. %s Help kan niet worden getoond. %s (De)activate use of Reverse Polish Notation syntax in expressions Gebruik van expressies in RPN (omgekeerde Poolse notatie) (de)activeren (De)activate the Reverse Polish Notation mode De RPN-modus (omgekeerde Poolse notatie) (de)activeren x! x! Edit value of selected register Inhoud van het geselecteerde register bewerken _Clear _Leegmaken Enables separate placement of units Afzonderlijk plaatsen van eenheden wordt toegestaan (De)activate limits to implicit multiplication Beperkingen (de)activeren voor impliciete vermenigvuldiging Convert result to entered unit expression Antwoord converteren naar ingevoerde expressie voor eenheid Do the conversion and close this window De conversie doorvoeren en dit venster sluiten _Selector _Keuze <span size="small"> </span> <span size="small"> </span> <span size="small">STATUS</span> <span size="small">STATUS</span> SI SI CGS CGS Temporary Tijdelijk Import CSV File... CSV-bestand importeren... Export CSV File... CSV-bestand exporteren... Set Unknowns... Onbekenden een waarde geven... Other... Overig... Save Mode... Modus opslaan... Delete Mode... Modus wissen... C_onvert... C_onverteren... <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- the queer calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- de "queer" rekenmachine</span> <i>http://qalculate.sourceforge.net/</i> <i>Licentie:</i> GNU General Public Licence <i>Auteur:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson About Qalculate! Over Qalculate! Category that the generated variable(s) shall belong to Categorie voor de nieuwe varabele(n) Argument type Type van argument Modify selected subfunction Geselecteerde subfunctie wijzigen The category this function belongs to De categorie waartoe deze functie behoort a function, unit or variable een functie, eenheid of variabele Abort operation Bewerking afbreken Ans Antw Binary Octal Decimal Hexadecimal Sexagesimal Time format Roman Other... Binair Octaal Decimaal Hexadecimaal Sexagesimaal Tijdnotatie Romeins Overig... Enable Prefixes Voorvoegsels toestaan Enable _Prefixes _Voorvoegsels toestaan Normal Engineering Scientific Pure Simple Normaal Wetenschappelijk Technisch Zuiver Eenvoudig Progress... Voortgang... Category that this variable belongs to Categorie waartoe deze variabele behoort Font Lettertype Select custom font Aangepast lettertype selecteren The category this unit belongs to De categorie van deze eenheid C_onvert Result Antwoord c_onverteren Select status font Lettertype voor status selecteren Halogen Halogeen Transactinide Transactinide ArgumentEditDialog Name: Naam: Type: Type: Free Vrij Number Getal Integer Geheel Symbol Symbool Text Tekst Date Datum Vector Vector Matrix Matrix Boolean Booleaans Angle Hoek Object Object Function Functie Unit Eenheid Variable Variabele File Bestand Enable rules and type test Test voor regels en type toestaan Custom condition: Aangepaste conditie: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Vb. indien het argument een matrix is die evenveel rijen als kolommen moet hebben: rijen(\x) = kolommen(\x) Allow matrix Matrix toestaan Forbid zero Nul niet toestaan Handle vector Calculate function for each separate element in vector. Min Min Include equals Ook is gelijk aan Max Max CSVDialog Import CSV File CSV-bestand importeren Export CSV File CSV-bestand exporteren Current result Huidig antwoord Matrix/vector variable: Matrix/vector-variabele: File: Bestand: Import as Importeren als matrix matrix vectors vectoren Name: Naam: First row: Eerste rij: Includes headings Koppen inbegrepen Delimiter: Scheidingsteken: Comma Komma Tabulator Tabtoets Semicolon Puntkomma Space Spatie Other Overig Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Error Fout Could not import from file %1 Kon niet importeren uit bestand %1 No matrix or vector variable with the entered name was found. Geen matrix of vectorvariabele met opgegeven naam gevonden. Could not export to file %1 Kon niet exporteren naar bestand %1 CalendarConversionDialog Calendar Conversion Kalenderconversie Gregorian Hebrew Islamic (Hijri) Persian (Solar Hijri) Indian (National) Chinese Julian Revised Julian (Milanković) Coptic Ethiopian Error Fout The selected Chinese year does not exist. Conversion to Gregorian calendar failed. Calendar conversion failed for: %1. DataObjectEditDialog %1: %1: Default Standaard Approximate Benaderd Exact Exact Edit Data Object Gegevensobject bewerken New Data Object Nieuw gegevensobject DataPropertyEditDialog Name: Naam: Title: Titel: Descriptive name: Beschrijvende naam: Description: Beschrijving: Value type: Waardetype: Expression Expressie Number Getal Text Tekst Unit expression: Eenheidexpressie: Use as key Gebruiken als sleutelwaarde Case sensitive value Hoofdlettergevoelige waarde Approximate value Benaderde waarde Value uses brackets Waarde met vierkante haakjes Hide Verbergen Edit Data Property Gegevenseigenschap bewerken DataSetEditDialog General Algemeen Properties Eigenschappen Function Functie Title: Titel: Descriptive name: Beschrijvende naam: Data file: Gegevensbestand: Description: Beschrijving: Copyright: Copyright: Title Titel Name Naam Type Type Add Toevoegen Edit Bewerken Remove Wissen Name: Naam: Object argument name: Naam objectargument: Property argument name: Naam eigenschapsargument: Default property: Standaardeigenschap: text tekst approximate benaderd number getal expression expressie key sleutel Question Vraag A function with the same name already exists. Do you want to overwrite the function? Er bestaat al een functie met deze naam. Wilt u die overschrijven? Data Sets Gegevensverzamelingen Object Object Property Eigenschap Edit Data Set Gegevensverzameling bewerken New Data Set Nieuwe gegevensverzameling DataSetsDialog Data Sets Gegevensverzamelingen Data sets: Gegevensverzamelingen: New… Nieuw… Edit… Bewerken… Delete Wissen Objects: Objecten: Data set description: Beschrijving gegevensverzameling: Object attributes: Objectattributen: Properties Eigenschappen key sleutel Data Retrieval Function Functie voor ophalen gegevens argument argument ExpressionEdit matrix matrix vector vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul boolean booleaans integer geheel rational rationaal real reëel complex complex number getal (not matrix) (geen matrix) unknown onbekend default assumptions standaard aannames Prefix: voorvoegsel: Complex Angle/Phasor Notation Complexe hoeknotatie Base units Basiseenheden Number Base Grondtal talstelsel Binary-Coded Decimal BCD-code Bijective Base-26 Binary Number Binair getal Calendars Kalendars Complex cis Form Complexe cis-vorm Decimal Number Decimaal getal Duodecimal Number Duodecimaal getal Complex Exponential Form Complexe exponentiële vorm Factors Factoren 16-bit Floating Point Binary Format 32-bit Floating Point Binary Format 64-bit Floating Point Binary Format 80-bit (x86) Floating Point Binary Format 128-bit Floating Point Binary Format Fraction Breuk Decimal Fraction Decimale vorm Hexadecimal Number Hexadecimaal getal Latitude Breedtegraad Longitude Lengtegraad Mixed Units Gemengde eenheden Octal Number Octaal getal Optimal Unit Meest geschikte eenheid Optimal Prefix Meest geschikte voorvoegsel Expanded Partial Fractions Partiële breuken Complex Polar Form Complexe polaire vorm Complex Rectangular Form Complexe rechthoekige vorm Roman Numerals Romeinse cijfers Sexagesimal Number Sexagesimaal getal Time Format Tijdnotatie Unicode Unicode UTC Time Zone UTC-tijdzone Scientific Notation Simple Notation Custom Undo Ongedaan maken Redo Opnieuw doen Cut Knippen Copy Kopiëren Paste Plakken Delete Wissen Calculate Selection Selectie bereken Insert Date… Datum invoegen… Insert Matrix… Matrix invoegen… Select All Alles selecteren Clear Leegmaken Clear History Completion No completion Limited strict completion Strict completion Limited full completion Full completion Delayed completion Expression Status Expressiestatus Off Uit In history list In expression field In status bar With delay Met vertraging With adaptive delay Met adaptieve vertraging Without delay Zonder vertraging Automatically calculate selection Use input method Invoermethode gebruiken Matrix Matrix Too many arguments for %1(). Te veel argumenten voor %1(). argument argument %1: %1: comment opmerking MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize expand hexadecimal hexadecimaal hexadecimal number hexadecimaal getal octal octaal octal number octaal getal decimal decimaal decimal number decimaal getal duodecimal duodecimaal duodecimal number dodecimaal getal binary binair binary number binair getal roman romeins roman numerals romeinse cijfers bijective bijective base-26 binary-coded decimal BCD-code sexagesimal sexagesimaal sexagesimal number sexagesimaal getal latitude breedtegraad longitude langtegraad 32-bit floating point 64-bit floating point 16-bit floating point 80-bit (x86) floating point 128-bit floating point time tijd time format tijdnotatie scientific wetenschappelijk scientific notation engineering technisch engineering notation simple eenvoudig simple notation bases grondtallen number bases grondtallen calendars kalenders optimal optimale optimal unit meest geschikte eenheid prefix voorvoegsel optimal prefix base basis base units basiseenheden mixed gemengde mixed units gemengde eenheden phasor decimals decimal fraction fraction breuk factors factoren Engineering Notation base base units basis partial fraction partiële breuken expanded partial fractions splitsen in partiële breuken rectangular rechthoekig cartesian cartesisch complex rectangular form complexe rechthoekige vorm exponential exponentiële complex exponential form complexe exponentiële vorm polar polair complex polar form complexe polaire vorm complex cis form complexe cis-vorm angle hoek complex angle notation complexe hoeknotatie complex phasor notation complexe hoeknotatie UTC time zone UTC-tijdzone base number base grondtal number base %1 grondtal %1 Data object Gegevensobject FPConversionDialog Floating Point Conversion (IEEE 754) Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Waarde Decimal value Decimale waarde Binary representation Hexadecimal representation Floating point value Conversion error FunctionEditDialog Required Vereist Details Details Description Beschrijving Name: Naam: Expression: Expressie: Argument references: Verwijzingen naar argumenten: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y en z (bijv. "(x+y)/2"), of \x, \y, \z, \a, \b, … (bijv. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Gebruik x, y en z (bv. "(x+y)/2"), of \x, \y, \z, \a, \b, … (bv. "(\x+\y)/2") Category: Categorie: Descriptive name: Beschrijvende naam: Hide function Functie verbergen Example: Description: Beschrijving: Condition: Conditie: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Conditie die waar moet zijn voor de functie (bv. indien het tweede argument groter moet zijn dan het eerste: "\y > \x") Sub-functions: Subfuncties: Expression Expressie Precalculate Voorberekenen Reference Referentie Add Toevoegen Edit Bewerken Remove Wissen Arguments: Argumenten: Name Naam Type Type Warning Conversion (using "to") is not supported in functions. Question Vraag A function with the same name already exists. Do you want to overwrite the function? Er bestaat al een functie met deze naam. Wilt u die overschrijven? Edit Function Functie bewerken New Function Nieuwe functie FunctionsDialog Functions Functies Category Categorie Function Functie New… Nieuw… Edit… Bewerken… Deactivate Uitschakelen Delete Wissen Calculate… Berekenen… Apply Toepassen Insert Invoegen Favorite Favoriet argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Haalt gegevens op van een gegeven object of eigenschap uit de gegevensverzameling %1. Indien als eigenschap "info" wordt ingetypt krijgt u een dialoogvenster te zien waarin alle eigenschappen van het object worden genoemd. Example: Voorbeeld: Arguments Argumenten optional optional argument optioneel default: argument default standaard: Requirement: Required condition for function Vereiste: Properties Eigenschappen %1: %1: key indicating that the property is a data set key sleutel Activate Activeren All All functions Alles Uncategorized Niet-gecategoriseerd User functions Gebruikersfuncties Favorites Favorieten Inactive Inactief HistoryView Insert Value Insert Text Copy Kopiëren Copy Formatted Text Opgemaakte tekst kopiëren Copy unformatted ASCII Niet-opgemaakte ASCII kopiëren Select All Alles selecteren Search… Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Exchange rate source(s): updated %1 Comment Opmerking Protect Add Comment… Voeg opmerking toe… Move to Top Remove Wissen Clear Leegmaken Edit Comment… Opmerking bewerken… Text: Tekst: Search KeypadButton <i>Right-click/long press</i>: %1 <i>Right-click</i>: %1 <i>Long press</i>: %1 Open menu Menu openen <i>Middle-click</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. Store Opslaan New function Nieuwe functie sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval Relative error Interval Move cursor left Move cursor to start Move cursor right Move cursor to end Logical AND Logical OR Bitwise Exclusive OR Logical NOT Bitwise Left Shift Bitwise Right Shift cmp rot a→1 Expand partial fractions DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants Eenheden in natuurkundige constanten All constants Alle constanten Percentage Calculation Tool Percentage berekenen more All units Alle eenheden All variables Alle variabelen Action Actie Interval Display Tonen interval Adaptive Significant digits Plus/minus Relative Concise Interval Calculation Interval berekening Variance formula Interval arithmetic Allow concise uncertainty input Complex number form Complexe form Rectangular Exponential Polar Angle/phasor Type Assumptions type Type Sign Assumptions sign Teken Default assumptions Standaard aannames Number Getal Real Reëel Rational Rationaal Integer Geheel Boolean Booleaans Unknown Unknown assumptions sign Onbekende Non-zero Ongelijk aan nul Positive Positief Non-negative Niet-negatief Negative Negatief Non-positive Niet-positief Factorize Ontbinden in factoren Expand Uitwerken Add column Add row Remove column Remove row Left parenthesis Left vector bracket Right parenthesis Right vector bracket Smart parentheses Vector brackets Argument separator Blank space New line Decimal point Decimale komma Previous result (static) Multiplication Button Action Label: Action: Actie: None Geen Value: Bitwise AND Bitwise Shift Delete Wissen Backspace Addition Plus Subtraction Minus Division Bitwise OR Bitwise NOT Clear expression Calculate expression Expressie berekenen NamesEditDialog Name Naam Abbreviation Afkorting Plural Meervoud Reference Referentie Avoid input Invoer vermijden Unicode Unicode Suffix Achtervoegsel Case sensitive Hoofdlettergevoelig Completion only Add Edit Bewerken Remove Wissen Warning Illegal name Ongeldige naam A function with the same name already exists. Er bestaat al een functie met deze naam. A unit or variable with the same name already exists. Er bestaat al een eenheid of variabele met deze naam. PercentageCalculationDialog Percentage Value 1 Waarde 1 Value 2 Waarde 2 Change from 1 to 2 Change from 2 to 1 2 compared to 1 1 compared to 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Clear Leegmaken PeriodicTableDialog Periodic Table Periodiek systeem Element Data Alkali Metal Alkalisch metaal Alkaline-Earth Metal Alkalisch aardmetaal Lanthanide Lanthanide Actinide Actinide Transition Metal Overgangsmetaal Metal Metaal Metalloid Metalloïde (halfmetaal) Polyatomic Non-Metal Polyatomisch niet-metaal Diatomic Non-Metal Diatomisch niet-metaal Noble Gas Edelgas Unknown chemical properties Unknown Onbekende %1: %1: PlotDialog Plot Plot Data Gegevens Title: Titel: Expression: Expressie: Function Functie Vector/matrix Vector/matrix Paired matrix Gepaarde matrix Rows Rijen X variable: Variabele x: Style: Stijl: Line Lijn Points Punten Line with points Lijn met punten Boxes/bars Balken Histogram Histogram Steps Stappen Candlesticks Kaarsdiagrammen Dots Puntjes Polar Smoothing: Gladstrijken: None Geen Monotonic Monotoon Natural cubic splines Natuurlijke kubische splines Bezier Bézier Bezier (monotonic) Bézier (monotoon) Y-axis: Y-as: Primary Primair Secondary Secondair Add Toevoegen Apply Toepassen Remove Wissen Title Titel Expression Expressie Function Range Functiebereik Minimum x value: Maximum x value: Sampling rate: Bemonsteringsfrequentie: Step size: Stapgrootte: Show real and imaginary parts Appearance Uiterlijk Display grid Rooster tonen Display full border Volledige rand tonen Minimum y value: Maximum y value: Logarithmic x scale: Logaritmische schaal x-as: Logarithmic y scale: Logaritmische schaal y-as: X-axis label: Tekst bij de x-as: Y-axis label: Tekst bij de y-as: Line width: Legend placement: Plaatsen legenda: Top-left Linksboven Top-right Rechtsboven Bottom-left Linksonder Bottom-right Rechtsonder Below Onder Outside Er buiten Calculating… Berekenen… Cancel Annuleren Processing… Verwerken… PreferencesDialog Look && Feel Numbers && Operators Ignore system language (requires restart) Allow multiple instances Clear history on exit Close application with Escape key Keep above other windows Window title: Application name Result Antwoord Application name + result Style: Stijl: Default (requires restart) Default style Dark mode Colorize result Custom result font Aangepast lettertype voor antwoord Custom expression font Aangepast lettertype voor expressie Preferences Voorkeuren Workspace Application name + workspace Custom expression font: Custom status bar font: Custom keypad font: Custom application font: Display expression status Expressiestatus tonen ms milliseconds ms Expression after calculation: Keep expression Clear expression Replace with result Replace with result if shorter Use keyboard keys for RPN Language: Taal: Max history lines saved: Use caret for bitwise XOR Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Custom history font: Expression status: Expressiestatus: Place expression field below history Off Uit In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Parsed Parsed (compact) Entered Entered + parsed Entered + parsed (compact) Automatically copy result Parsing mode: Adaptive Conventional Implicit multiplication first Chain RPN RPN Simplified percentage calculation Read precision Allow concise uncertainty input Limit implicit multiplication Interpret unrecognized symbols as variables Interval calculation: Variance formula Interval arithmetic Factorize result Use lower case letters in non-decimal numbers Use special duodecimal symbols Use Unicode division slash in output Spell out logical operators Logische operatoren voluit spellen Use E-notation instead of 10^n Use 'j' as imaginary unit Use comma as decimal separator Ignore comma in numbers Komma in getallen negeren Ignore dots in numbers Punten in getallen negeren Copy unformatted ASCII by default Place percent button in number pad Indicate repeating decimals: Oneindige reeksen aangeven: Ellipsis Overline Digit grouping: None Geen Standard Local Custom Interval display: Significant digits Interval Plus/minus Concise Midpoint Lower Upper Rounding: Round halfway numbers away from zero Round halfway numbers to even Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Use binary prefixes for information units Automatic unit conversion: No conversion Base units Basiseenheden Optimal units Meest geschikte eenheden Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Default currency: Fonts Lettertypen Units Eenheden Calculation Restart required Please restart the program for the language change to take effect. Default Standaard Notify when a new version is available Calculate as you type delay: Two's complement output: Two's complement input: Binary Binair Hexadecimal Hexadecimaal Binary bits: Automatic Automatisch Multiplication sign: Teken voor vermenigvuldigen: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Eenheden in natuurkundige constanten Temperature calculation: Absolute Relative Hybrid Exchange rates updates: %n day(s) %n dag %n dagen days dag dagen QApplication Execute expressions and commands from a file FILE Start a new instance of the application Specify the window title TITLE Update exchange rates Wisselkoersen bijwerken Display the application version Open workspace Expression to calculate [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Allow multiple instances? %1 is already running. Failed to load global definitions! Inlezen van globale definities is mislukt! answer antwoord History Answer Value History Index(es) History index %s does not exist. Last Answer Laatste antwoord Answer 2 Antwoord 2 Answer 3 Antwoord 3 Answer 4 Antwoord 4 Answer 5 Antwoord 5 Memory Error Fout Couldn't write preferences to %1 Kon de voorkeurinstellingen niet schrijven naar %1 Function not found. Variable not found. Unit not found. Unsupported base. Unsupported value. QalculateQtSettings Update exchange rates? Wisselkoersen bijwerken? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Fetching exchange rates. Wisselkoersen worden opgehaald. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Error Fout Warning Information Path of executable not found. curl not found. Failed to run update script. %1 Failed to check for updates. No updates found. A new version of %1 is available at %2. Do you wish to update to version %3? A new version of %1 is available. You can get version %3 at %2. Download %1: %2 Insert function Insert function (dialog) Insert variable Approximate result Negate Invert Insert unit Insert text Insert operator Insert date Insert matrix Insert smart parentheses Convert to unit Converteren naar eenheid Convert Converteren Convert to optimal unit Convert to base units Convert to optimal prefix Convert to number base Factorize result Expand result Expand partial fractions RPN: down RPN: up RPN: swap RPN: copy RPN: lastx RPN: delete register RPN: clear stack Set expression base Set result base Set angle unit to degrees Set angle unit to radians Set angle unit to gradians Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Show general keypad Toggle programming keypad Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Clear history Show variables Show functions Show units Show data sets Store result Antwoord opslaan MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable Nieuwe variabele New function Nieuwe functie Open plot functions/data Functies/gegevens plotten Open convert number bases Getallen converteren naar ander grondtal Open floating point conversion Open calender conversion Kalenderconversie Open percentage calculation tool Percentage berekenen Open periodic table Periodiek systeem Update exchange rates Wisselkoersen bijwerken Copy result Antwoord kopiëren Insert result Open mode menu Open menu Menu openen Help Help Quit Afsluiten Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Delete Wissen Backspace Home End Right Left Up Down Undo Ongedaan maken Redo Opnieuw doen Calculate expression Expressie berekenen Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Standaard Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Annuleren Close Only used when Qt translation is missing Sluiten &Yes Only used when Qt translation is missing &Ja &No Only used when Qt translation is missing &Nee &Open Only used when Qt translation is missing &Openen &Save Only used when Qt translation is missing Op&slaan &Select All Only used when Qt translation is missing &Alles selecteren Look in: Only used when Qt translation is missing Kijk in: File &name: Only used when Qt translation is missing Bestands&naam: Files of type: Only used when Qt translation is missing Bestanden van type: QalculateWindow Menu Menu Menu (%1) Menu (%1) New Nieuw Function… Functie… Variable/Constant… Variabel/constant… Unknown Variable… Onbekende variabele… Matrix… Matrix… Workspaces Werkruimten Open… Open default Standaard openen Save Opslaan Save As… Opslaan als… Import CSV File… CSV-bestand importeren… Export CSV File… CSV-bestand exporteren… Functions Functies Variables and Constants Variabelen en constanten Units Eenheden Plot Functions/Data Functies/gegevens plotten Floating Point Conversion (IEEE 754) Calendar Conversion Kalenderconversie Update Exchange Rates Wisselkoersen bijwerken Normal Mode Normale modus RPN Mode RPN-modus Chain Mode Keyboard Shortcuts Preferences Voorkeuren Help Help Report a Bug Check for Updates About %1 Over %1 Quit Afsluiten Mode Modus Mode (%1) Modus (%1) General Display Mode Algemene weergavemodus Normal Normaal Scientific Wetenschappelijk Engineering Technisch Simple Eenvoudig Angle Unit Hoekeenheid Radians Radialen Degrees Booggraden Gradians Decimale graden Approximation Benadering Automatic Automatic approximation Automatisch Dual Dual approximation Dubbel Exact Exact approximation Exact Approximate Benaderd Assumptions Aannames Type Assumptions type Type Number Getal Real Reëel Rational Rationaal Integer Geheel Boolean Booleaans Sign Assumptions sign Teken Unknown Unknown assumptions sign Onbekende Non-zero Ongelijk aan nul Positive Positief Non-negative Niet-negatief Negative Negatief Non-positive Niet-positief Result Base Grondtal voor antwoord Binary Binair Octal Octaal Decimal Decimaal Hexadecimal Hexadecimaal Other Overig Duodecimal Duodecimaal Sexagesimal Sexagesimaal Time format Tijdnotatie Roman numerals Romeinse cijfers Unicode Unicode Bijective base-26 Binary-coded decimal (BCD) BCD-Code Custom: Number base Expression Base Grondtal voor expressie Other: Number base Overig: Precision: Nauwkeurigheid: Min decimals: Min decimalen: Max decimals: Max decimalen: off Max decimals Convert Converteren Convert (%1) Converteren (%1) Store Opslaan Store (%1) Opslaan (%1) Functions (%1) Functies (%1) Keypad Numerieke toetse Keypad (%1) Numerieke toetse (%1) Number bases Grondtallen Unit… Eenheid… Data Sets Gegevensverzamelingen Percentage Calculation Tool Percentage berekenen Periodic Table Periodiek systeem Units (%1) Eenheden (%1) Plot Functions/Data (%1) Functies/gegevens plotten (%1) Number Bases (%1) Grondtallen (%1) Binary: Binair: Octal: Octaal: Decimal: Decimaal: Hexadecimal: Hexadecimaal: RPN Stack RPN-stapelgeheugen EXACT EXACT APPROX BENADERING RPN RPN BIN BIN OCT OCT HEX HEX ROMAN ROMEINS DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT EENH VAR VAR INF INF CPLX CPLX Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 Open menu Menu openen <i>Middle-click</i>: %1 New Function… Nieuwe functie… Favorites Favorieten Recent User functions Gebruikersfuncties Open dialog Show all functions User units Gebruikerseenheden more Prefixes Voorvoegsels Show all units User variables Gebruikersvariabelen Show all variables Powerful and easy to use calculator Gemakkelijk te gebruiken rekenmachine met veel mogelijkheden License: GNU General Public License version 2 or later Error Fout Couldn't write definitions Kon definities niet schrijven hexadecimal hexadecimaal octal octaal decimal decimaal duodecimal duodecimaal binary binair roman romeins bijective sexagesimal sexagesimaal latitude breedtegraad longitude lengtegraad time tijd scientific wetenschappelijk engineering technisch simple eenvoudig Time zone parsing failed. bases grondtallen calendars kalenders rectangular rechthoekig cartesian cartesisch exponential exponentiële polar polair phasor angle hoek optimal optimale base basis mixed gemengde fraction breuk factors factoren Show toolbar Open Settings Folder(s) Approximation && Fractions Benadering en breuken Number Pad Always Show Number Pad Show Custom Column Copy Kopiëren Conversion operator prefix voorvoegsel base base units basis partial fraction partiële breuken base number base grondtal decimals factorize expand Calculating… Berekenen… Cancel Annuleren RPN Operation RPN-bewerking Factorizing… Ontbinden in factoren… Expanding partial fractions… Splitsen in partiële breuken… Expanding… Uitwerken… Converting… Converteert… RPN Register Moved RPN-register is verplaatst Processing… Verwerken… Matrix Matrix Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Comma as thousands separator Only dot as decimal separator Parsing Mode Interpretatie modus The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Conventional Adaptive Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Actie toevoegen (%1) Edit Keyboard Shortcut New Keyboard Shortcut Action: Actie: Value: Set key combination Press the key combination you wish to use for the action. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? Question Vraag Add… Toevoegen… Edit… Bewerken… Remove Wissen Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Voorbeeld: Enter RPN Enter Calculate Berekenen Apply to Stack Insert Invoegen Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Keep open Value Waarde Argument Argument %1: %1: Approximation and Fractions Benadering en breuken Plot Plot General Algemeen Programming Algebra Custom None Geen Separate Menu Buttons Reset Keypad Position Number Bases Grondtallen voor talstelsels Rotate the stack or move the selected register up Rotate the stack or move the selected register down Swap the top two values or move the selected value to the top of the stack Delete the top or selected value Enter the top value from before the last numeric operation Copy the selected or top value to the top of the stack Clear the RPN stack Comma as separator for function arguments and matrix/vector elements Action Actie Key combination True Waar False Onwaar Info Info optional optional argument optioneel Failed to open %1. %2 UnitEditDialog General Algemeen Relation Relatie Name: Naam: Category: Categorie: Descriptive name: Beschrijvende naam: System: Systeem: Imperial Imperial US Survey US Survey Hide unit Eenheid verbergen Description: Beschrijving: Class: Klasse: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Basiseenheid Named derived unit Benoemde afgeleide eenheid Derived unit Afgeleide eenheid Base unit(s): Basiseenheid(en): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Exponent: Relation: Relatie: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Inverse relation: Inverse relatie: Specify for non-linear relation, for conversion back to the base unit. Mix with base unit Priority: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Error Fout Base unit does not exist. Basiseenheid bestaat niet. Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? A variable or unit with the same name already exists. Do you want to overwrite it? Er bestaat al een variabele of eenheid met deze naam. Wilt u die overschrijven? Edit Unit Eenheid bewerken New Unit Nieuwe eenheid UnitsDialog Units Eenheden Category Categorie Unit Eenheid New… Nieuw… Edit… Bewerken… Deactivate Uitschakelen Delete Wissen Convert Converteren Insert Invoegen Favorite Favoriet Show hidden units Toon verborgen eenheden Activate Activeren All All units Alles Uncategorized Niet-gecategoriseerd User units Gebruikerseenheden Favorites Favorieten Inactive Inactief UnknownEditDialog Name: Naam: Custom assumptions Aangepaste aannames Type: Type: Sign: Teken: Temporary Tijdelijk Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Unknown Variable Onbekende variabele bewerken New Unknown Variable Nieuwe onbekende variabele VariableEditDialog Name: Naam: Temporary Tijdelijk Value: Required Vereist Description Beschrijving current result huidig antwoord Category: Categorie: Descriptive name: Beschrijvende naam: Hide variable Variabele verbergen Description: Beschrijving: Question Vraag A unit or variable with the same name already exists. Do you want to overwrite it? Er bestaat al een eenheid of variabele met deze naam. Wilt u die overschrijven? Edit Variable Variabele bewerken New Variable Nieuwe variabele VariablesDialog Variables Variabelen Category Categorie Variable Variabele New Nieuw Variable/Constant… Variabel/constant… Unknown Variable… Onbekende variabele… Matrix… Matrix… Edit… Bewerken… Export… Exporteren… Deactivate Uitschakelen Delete Wissen Insert Invoegen Favorite Favoriet a matrix een matrix a vector een vector positive positief non-positive niet-positief negative negatief non-negative niet-negatief non-zero ongelijk nul integer geheel boolean booleaans rational rationaal real reëel complex complex number getal not matrix geen matrix unknown onbekend Default assumptions Standaard aannames Activate Activeren All All variables Alles Uncategorized Niet-gecategoriseerd User variables Gebruikersvariabelen Favorites Favorieten Inactive Inactief qalculate-qt-5.11.0/translations/qalculate-qt_pt_BR.ts000066400000000000000000016626401520501070600227620ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora potente e fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financeira; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de porcentagem). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável. Argument Rules Regras de argumento _Cancel _Cancelar Do not save modifications Não salvar modificações _OK _OK Accept the modification of argument rules Aceitar modificação de regras de argumento Enable rules and type test Ativar regras e teste de tipo Custom condition Condição personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx Keyboard Shortcuts Atalhos do teclado _Close _Fechar Label Etiqueta Left-click Botão esquerdo Right-click Botão direito Middle-click Botão do meio Reset Redefinir Value Valor Argument name Nome do argumento Calendar Conversion Conversão de calendário Export CSV File Exportar arquivo CSV Current result Resultado atual Matrix/vector variable Variável matriz/vetor File Arquivo Delimiter Delimitador Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Import CSV File Importar arquivo CSV Do not import the file Não importar o arquivo Import the file Importar o arquivo Name of the data file to import Nome do arquivo de dados a ser importado Select a file Selecionar um arquivo Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Vectors Vetores If vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Name Nome Name (or name prefix) used to reference generated variable(s) in expressions Nome (ou prefixo do nome) usado para referenciar variáveis geradas em expressões Descriptive name Nome descritivo Title displayed in menus and in variable manager Título exibido nos menus e no gerenciador de variáveis Category Categoria First row Primeira linha The first row with data to import in the file A primeira linha com dados a serem importados no arquivo Includes headings Incluir cabeçalhos If the first row contains column headings Se a primeira linha deve conter cabeçalhos de coluna Delimiter used to separate columns in the file Delimitador usado para separar colunas no arquivo Custom delimiter Delimitador personalizado Edit Data Property Editar propriedades de dados Do not create/modify this data set Não criar/modificar este conjunto de dados Accept the creation/modification of this data set Aceitar a criação/modificação deste conjunto de dados Name used for reference Nome usado para referência Properties Propriedades Title displayed in menus and in data set manager Título exibido nos menus e no gerenciador de conjunto de dados Description Descrição Description of this data property Descrição desta propriedade de dados Value Type Tipo de valor Text Texto Number Número Expression Expressão Hide Ocultar Use as key Usar como chave Approximate value Valor aproximado Case sensitive value Valor sensível a maiúsculas e minúsculas Value uses brackets Valor usa colchetes Unit expression Expressão de unidade Edit Data Set Editar conjunto de dados Title Título Data file Arquivo de dados Description of this data set Descrição deste conjunto de dados Copyright Direitos autorais General Geral Properties: Propriedades: Definition of the properties of this data set Definição das propriedades deste conjunto de dados _New _Novo _Edit _Editar _Delete _Excluir Name used to invoke the function in expressions Nome usado para chamar a função em expressões Object argument name Nome do argumento do objeto Property argument name Nome do argumento da propriedade Default property Propriedade padrão Function Função Edit Data Object Editar Objeto de Dados Do not create/modify this data object Não criar/modificar este objeto de dados Accept the creation/modification of this data object Aceitar a criação/modificação deste objeto de dados Data Sets new dataset Conjuntos de dados Data Set Conjunto de dados Create a new data set Criar um novo conjunto de dados Edit the selected data set Editar o conjunto de dados selecionado Delete the selected data set Excluir o conjunto de dados selecionado Objects Objetos Create a new data object Criar um novo objeto de dados Edit the selected data object Editar o objeto de dados selecionado Remove the selected data object Remover o objeto de dados selecionados Data Set Description Descrição do conjunto de dados Object Attributes Atributos do objeto Decimals Decimais Close this window Fechar esta janela Min decimals Decimais mínimos Max decimals Decimais máximos Minimal number of displayed decimals Número mínimo de casas decimais exibidas Maximal number of decimals to display (and round to) Número máximo de casas decimais a serem exibidas (e arredondadas) Floating Point Conversion Conversão de ponto flutuante Decimal value Valor decimal Binary value Valor binário Octal value Valor octal Hexadecimal representation Representação hexadecimal Conversion error Erro de conversão Binary representation Representação binária Floating point value Valor do ponto flutuante Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Hexadecimal value Valor hexadecimal Edit Function Editar Função _Help _Ajuda Do not create/modify this function Não criar/modificar esta função Accept the creation/modification of this function Aceitar a criação/modificação desta função Name used to invoke this function in expressions Nome usado para chamar esta função em expressões Title displayed in menus and in function manager Título exibido nos menus e no gerenciador de funções Hide function Ocultar função If this function shall be hidden in menus Caso a função esteja oculta nos menus Description of this function Descrição desta função Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para o primeiro, \y para o segundo e \z para o terceiro argumento. Para mais informações, clique no botão de ajuda. Condition Condição Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-Functions Subfunções Arguments: Argumentos: Definition of this function's arguments Definição dos argumentos desta função Free Livre Integer Inteiro Symbol Símbolo Date Data Vector Vetor Positive number Número positivo Non-zero number Número diferente de zero Non-negative number Número não-negativo Positive integer Número inteiro positivo Non-zero integer Inteiro diferente de zero Non-negative integer Inteiro não-negativo Boolean Boleano Object Objeto Unit Unidade Variable Variável Angle Ângulo Data object Onjeto de dados Data property Propriedade de dados _Add _Adicionar Add entered argument definition Adicionar definição de argumento inserido _Apply _Aplicar Modify selected argument Modificar argumento selecionado Remove selected argument Remover argumento selecionado Rules Regras Edit conditions for selected argument Editar condições para o argumento selecionado Close this dialog Fechar este diálogo Precalculate Pré-calcular Calculate the subfunction only once, before the parent function Calcular a subfunção apenas uma vez, antes da função pai Add entered subfunction Adicionar subfunção inserida Apply changes to the selected subfunction Aplicar alterações à subfunção selecionada Remove the selected subfunction Remover a subfunção selecionada Functions Funções Create a new function Criar uma nova função Edit the selected function Editar a função selecionada _Insert _Inserir Insert (or execute) the selected function into the expression entry Inserir (ou executar) a função selecionada na entrada da expressão Delete the selected function Excluir a função selecionada (De)activate the selected function Desativar a função selecionada Deacti_vate Desati_var Apply the selected function to the current expression Aplicar função selecionada à expressão atual Categor_y Categor_ia _Function _Função Descri_ption Desc_rição Degrees Graus Radians Radianos Gradians Grados Default assumptions Suposições padrão Unknown Desconhecido Not Matrix Não-matriz Complex Complexo Real Real Rational Racional Non-Zero Diferente de zero Positive Positivo Non-Negative Não-negativo Negative Negativo Non-Positive Não-positivo _File _Arquivo Unknown Variable Variável desconhecida Function (simplified) Função (simplificada) Import CSV File… Importar arquivo CSV… Export CSV File… Exportar arquivo CSV… _Store Result… _Guardar resultado… Save Result Image… Salvar imagem do resultado… Save local functions, variables and units Salvar funções, variáveis e unidades Save Definitions Salvar definições Import Definitions File… Importar arquivo de definições… Fetch current exchange rates from the Internet Buscar taxas de câmbio atualizadas na Internet Update Exchange Rates Atualizar taxas de câmbio Plot Functions/Data Funções/dados de plotagem Convert Number Bases Converter bases numéricas Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem Periodic Table Tabela Periódica Minimal Window Janela mínima _Quit _Sair Manage Variables Gerenciar Variáveis Manage Functions Gerenciar Funções Manage Units Gerenciar Unidades Manage Data Sets Gerenciar Conjuntos de Dados Factorize Fatorar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar decomposição de fração parcial ao resultado atual. Expand Partial Fractions Expandir Frações Parciais Set Unknowns… Definir Incógnitos… Convert to Unit Converter em Unidade Set Prefix Definir Prefixo Convert to Unit Expression… Converter em Expressão de Unidade… Convert to Base Units Converter em Unidades Base Convert to Optimal Unit Converter em Unidade Ideal Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Insert Vector… Inserir Vetor… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botões do teclado _Preferences _Preferências _Mode _Modo Number Base Base numérica Select Result and Expression Base… Selecionar resultado e base de expressão… Binary Binário Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Outro… Sexagesimal Sexagesimal Time Format Formato da hora Roman Numerals Números romanos Numerical Display Exibição numérica Normal Normal Engineering Engenharia Scientific Científica Purely Scientific Puramente Científica Simple Simples Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desativado: 1/7 ≈ 0.14285714 Ativado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimais repetidos Show Ending Zeroes Mostrar zeros finais Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desativado: 2.5 ≈ 3, 1.5 ≈ 2 Ativado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Arredondar números até a metade Off: -x + y On: y - x Desativado: -x + y Ativado: y - x Sort Minus Last Classificar menos último Complex Rectangular Form Forma retangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Rational Number Form Forma do número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Frações decimais 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Frações decimais exatas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Frações simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Frações mistas Interval Display Exibição de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desativado: 1/2*pi ≈ 1.5707963 Ativado: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula um intervalo de valores possíveis e acompanha mudanças de precisão. Significant Digits Dígitos Significativos Interval Intervalo Plus/Minus Mais/Menos Midpoint Ponto médio Unit Display Exibir Unidade Do not use any prefixes in result Não usar nenhum prefixo no resultado Show prefixes for primarily SI and CGS units. Mostrar prefixos principalmente para unidades SI e CGS. Use prefixes for selected units Usar prefixos para unidades selecionadas Use prefixes also for currencies Usar prefixos também para moedas Use prefixs for all units Usar prefixos em todas as unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Permite o uso automático de hekto, deka, deci e centi quando os prefixos estão ativados Enable All SI Prefixes Ativar Todos os Prefixos SI Enables automatic setting of prefix for denominator in addition to the numerator Ativar a configuração automática de prefixo para o denominador, além do numerador Enable Denominator Prefixes Ativar Prefixos de Denominador Off: J / K On: J * K^-1 Desativado: J / K Ativado: J * K^-1 Negative Exponents Expoentes negativos Off: (2 m)/s On: 2 (m/s) Desativado: (2 m)/s Ativado: 2 (m/s) Place Units Separately Colocar unidades separadamente No Additional Conversion Nenhuma conversão adicional Convert to Optimal SI Unit Converter em unidade SI ideal If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Se ativado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Converter em unidades mistas Abbreviate Names Abreviar nomes Enabled Objects Objetos ativados Variables Variáveis Units Unidades Unknowns Desconhecidos Units in Physical Constants Unidades em constantes físicas If not enabled, treats all variables as unknown Se não estiver ativado, trata todas as variáveis como desconhecidas Calculate Variables Calcular variáveis Disables/enables complex numbers in result Desativar/ativar números complexos no resultado Allow Complex Result Permitir resultado complexo Disables/enables infinite numbers in result Desativar/ativar números infinitos no resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximação Always Exact Sempre exato Try Exact Tentar exato Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de variância Change angle unit used in trigonometric functions Alterar unidade de ângulo usada em funções trigonimétricas Angle Unit Unidade de ângulo None Nenhum Assumptions Suposições Algebraic Mode Modo Algébrico Assume that unknown denominators are non-zero Assume que os denominadores incógnitos são diferentes de zero Non-Zero Denominators Denominadores diferentes de zero Warn when unknown denominators are assumed non-zero Avisar quando denominadores incógnitos são assumidos diferentes de zero Warn About Denominators Assumed Non-Zero Avisar sobre denominadores considerados diferentes de zero Parsing Mode Modo de análise Adaptive Parsing Análise adaptativa Parse Implicit Multiplication First Analisar primeiro multiplicação implícita Conventional Parsing Análise convencional RPN Syntax Sintaxe RPN Off: xy = x*y On: xy != x*y Desativado: xy = x*y Ativado: xy != x*y Limit Implicit Multiplication Limitar multiplicação implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analisa números decimais como aproximados com precisão igual ao número de dígitos. Desativado: 1.1 * 1.1 = 1.21 Ativado: 1.1 * 1.1 ≈ 1.2 Read Precision Ler precisão _Precision _Precisão _Decimals _Decimais Calculate As You Type Calcular ao digitar Activate the RPN stack. Ative a pilha RPN. RPN Mode Modo RPN Meta Modes Meta Modos Save Mode… Salvar modo… Delete Mode… Excluir modo… Save Default _Mode Salvar _modo padrão Fu_nctions Fu_nções _Variables _Variáveis _Units _Unidades _Contents _Conteúdo Report a Bug Reportar um erro Check for Updates Verificar atualizações _About _Sobre Toggle minimal window Alternar janela mínima Calculation result Resultado do cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Ativar teclado persistente (permite exibir o teclado e o histórico simultaneamente) _History _Histórico C_onversion C_onversão RPN Stack Pilha RPN Insert the selected value Inserir o valor selecionado Insert the selected text Inserir o texto selecionado Copy the selected text Copiar o texto selecionado Add the selected value(s) Adicionar os valores selecionados Subtract the selected value(s) Subtrair os valores selecionados Multiply the selected value(s) Multiplicar os valores selecionados Divide the the selected value(s) Dividir os valores selecionados Raise to the power of the selected value Aumentar a potência do valor selecionado Calculate the square root of the selected value Calcular a raiz quadrada do valor selecionado History Histórico Subtract the top value from the second value Subtrair o valor superior do segundo valor Multiply the top two values Multiplicar os dois principais valores Divide the second value by the top value Dividir o segundo valor pelo valor superior Raise the second value to the power of the top value Aumentar o segundo valor para a potência do valor superior Negate the top value (Ctrl+-) Negar o valor superior (Ctrl+-) Invert the top value Inverter o valor superior Calculate the square root of the top value Calcular a raiz quadrada do valor superior Calculate the sum of all values Calcular a soma de todos os valores Rotate the stack or move selected register up Gire a pilha ou mova o registro selecionado para cima Rotate the stack or move selected register down Gire a pilha ou mova o registro selecionado para baixo Swap the two top values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Delete the top or selected value Excluir o valor selecionado ou superior Edit the selected value Editar o valor selecionado Clear the RPN stack Limpar a pilha RPN Unit(s) and prefix to convert result to Unidade(s) e prefixo para converter o resultado em Convert Converter Continuous conversion Conversão contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Converter automaticamente o resultado na expressão de unidade atual, desde que a caixa de conversão esteja visível. Add prefix Adicionar prefixo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Se a expressão da unidade não contiver nenhum prefixo, use o prefixo ideal. Isso pode ser substituído ao adicionar a expressão da unidade com "?" ou "0". Conversion Conversão Show/hide programming keypad Mostrar/ocultar teclado de programação Exact Exato Fraction Fração Numerical display Exibição numérica Pure Puro Number base Base numérica Time format Formato de tempo Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variável desconhecida mod mod mean mean Store result as a variable Guardar o resultado como uma variável STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converter bases numéricas Imaginary unit i (√-1) Unidade imaginária i (√-1) Manage units Gerenciar unidades Conversion operator Operador de conversão Kilogram Quilograma Two's complement input Entrada do complemento para dois Two's complement output Saída do complemento para dois Bitwise Exclusive OR OR exclusivo bit-a-bit Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit Floating point conversion Conversão de ponto flutuante Show/hide left keypad Mostrar/ocultar teclado esquerdo Show/hide right keypad Mostrar/ocultar teclado direito DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Adicionar à Expressão Persistent Keypad Teclado persistente Edit Editar Delete Excluir Update Atualizar Insert Value Inserir valor Insert Text Inserir texto Insert Parsed Text Inserir texto analisado Copy Copiar Copy Full Text Copiar todo o texto Search… Procurar… Add Bookmark… Adicionar marcador… Bookmarks Marcador Protect Proteger Move To Top Mover para o topo Remove Remover Clear All Limpar tudo _Copy _Copiar _Store… _Armazenar… Save Image… Salvar imagem… _Factorize _Fatorar _Expand _Expandir _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Pura_mente científica Simp_le Simp_les _Binary _Binária _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fração decimal Exact Decimal Fraction Fração decimal exata Simple Fraction Fração simples Mixed Fraction Fração mista _Abbreviate Names _Abreviar nomes C_onvert… C_onverter… Convert to Base _Units Converter em _unidades base Convert _to Optimal Unit Conver_ter em unidade ideal Use Optimal Prefix Usar prefixo ideal Convert to Converter para Convert to UTC Converter para UTC Convert to Calendars Converter em calendários Use prefixes for all units Usar prefixos em todas as unidades Enable All SI Prefi_xes Ativar Todos os Prefi_xos SI View/Edit Matrix Ver/Editar Matriz View/Edit Vector Ver/Editar Vetor Copy Text Copiar texto To Top Para cima Swap Trocar Up Acima Down Abaixo Negate Negar Invert Inverter Square Quadrado Square Root Raiz quadrada Clear Stack Limpar pilha Select Number Base… Selecionar Base Numérica… Store result Guardar resultado Insert the matrix/vector into the expression Inserir a matriz/vetor na expressão Rows Linhas Number of rows in this matrix (rows displayed for vectors) Número de linhas nesta matriz (linhas exibidas para vetores) Columns Colunas Number of columns in this matrix (columns displayed for vectors) Número de colunas nesta matriz (colunas exibidas para vetores) If this is a matrix or vector Se isso é uma matriz ou vetor Elements Elementos Current element: Elemento atual: Edit Matrix Editar Matriz Do not create/modify this matrix/vector Não criar/modificar esta matriz/vetor Create/modify the matrix/vector Criar/modificar esta matriz/vetor Accept the creation/modification of this matrix/vector Aceitar a criação/modificação desta matriz/vetor Name used to reference this variable in expressions Nome usado para referenciar esta variável em expressões Names Nomes Add new name Adicionar novo nome Apply changes to the selected name Aplicar alterações ao nome selecionado Remove the selected name Remover o nome selecionado Abbreviation Abreviação Unicode Unicode Plural Plural Suffix Sufixo Reference Referência Avoid input Evitar entrada Case sensitive Maiúsc. e Minúsculas Completion only Apenas conclusão Number Bases Bases Numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrair Multiply Multiplicar Divide Dividir Bitwise AND Bit-a-bit AND Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear Limpar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma porcentagem, e os outros serão calculados para você. Percentage Percentagem Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Alterar de 1 para 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Alterar de 2 para 1 Plot Plotagem _Save _Salvar Save as png, svg, postscript, eps, latex or fig Salvar como png, svg, postscript, eps, latex ou fig Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada if you want to split matrix in rows instead of columns se desejar dividir a matriz em linhas em vez de colunas X variable Variável X The variable name used in expression O nome da variável usada na expressão Style Estilo Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Smoothing Suavização Monotonic Monotônica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotônica) Y-axis Eixo Y Primary Primário Secondary Secundário _Remove _Remover Data Dados Minimum x value Valor mínimo x Maximum x value Valor máximo x Sampling rate Taxa de amostragem Step size Tamanho do passo Function Range Faixa de Funções Display grid Exibir grade Display full border Exibir borda completa Minimum y value Valor mínimo y Maximum y value Valor máximo y Logarithmic x scale Escala logarítmica x Logarithmic y scale Escala logarítmica y X-axis label Etiqueta do eixo X Y-axis label Etiqueta do eixo Y Line width Espessura da linha Color display Exibição de cores Color Cores Monochrome Monocromática Legend placement Posição da legenda Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Appearance Aparência Precision Precisão _Recalculate _Recalcular Recalculate expression Recalcular expressão The number of significant digits to display/calculate (simple arithmetics are always calculated exact) O número de dígitos significativos a serem exibidos/calculados (aritmética simples é sempre calculada exatamente) Preferences Preferências Save mode on exit Salvar modo ao sair If the mode of the calculator shall be restored Para que o modo da calculadora seja restaurado Save definitions on exit Salvar definições ao sair If changes to functions, units and variables shall be saved automatically Para que alterações em funções, unidades e variáveis sejam salvas automaticamente Clear history on exit Limpar histórico ao sair Allow multiple instances Permitir várias instâncias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permite que várias instâncias da janela principal do Qalculate! sejam abertas. Observe que apenas o modo, histórico e definições da última instância fechada serão salvos. Notify when a new version is available Notificar quando uma nova versão estiver disponível Use keyboard keys for RPN Usar teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar as teclas de operação no teclado para operações RPN (+-*/^). Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Inserir XOR (⊻) usando circunflexo (^) no teclado (caso contrário, use Ctrl+^). O operador de exponenciação (^) sempre pode ser inserido ao usar Ctrl+*. Time limit for plot: Tempo limite para plotagem: Behavior Comportamento Enable Unicode symbols Ativar símbolos Unicode Disable this if you have problems with some fancy characters Desative isso se você tiver problemas com alguns caracteres extravagantes Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Remember window position Lembrar posição da janela Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Mode Modo Application name + mode Nome do programa + modo Window title Título da janela Default Padrão Number of expression lines Número de linhas de expressão Display expression status Exibir status da expressão If as-you-type expression status shall be displayed below the expression entry Para que o status da expressão, conforme você digita, seja exibido abaixo da entrada da expressão Persistent keypad Teclado persistente Look & Feel Aparência Binary two's complement representation Representação binária do complemento para dois If two's complement representation shall be used for negative binary numbers. Para que a representação do complemento para dois seja usada para números binários negativos. Hexadecimal two's complement representation Representação hexadecimal do complemento para dois If two's complement representation shall be used for negative hexadecimal numbers. Para que a representação do complemento para dois seja usada para números hexadecimais negativos. Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais If lower case letters should be used in numbers with non-decimal base Para que letras minúsculas sejam usadas em números com base não-decimal Alternative base prefixes Prefixos base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Para que números hexadecimais sejam exibidos com "0x0" e números binários com "0b00" como prefixos Spell out logical operators Soletrar operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Para que o lógico and/or seja exibido como "&&"/"||" ou "and"/"or" If "e" shall be used instead of "E" in numbers Para que "e" seja usado em vez de "E" em números Use E-notation instead of 10<sup><i>n</i></sup> Usar notação E em vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar letras minúsculas "e" (como em 1e10) Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar 'j' (em vez de 'i') como símbolo padrão para a unidade imaginária e coloque-o na frente da parte imaginária. Use comma as decimal separator Usar vírgula como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permite que pontos, '.', sejam usados como separador de milhares em vez de como um sinal decimal alternativo Ignore comma in numbers Ignorar vírgula em números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permite que vírgulas, ',', sejam usadas como separador de milhares em vez de como separador de argumentos de função Ignore dots in numbers Ignorar pontos em números Digit grouping Agrupamento de dígitos off desligado standard padrão local local Multiplication sign Sinal de multiplicação Division sign Sinal de divisão Copy digit separator Copiar separador de dígitos Deactivate to remove digit separator when copying result Desative para remover o separador de dígitos ao copiar o resultado Numbers & Operators Números e operadores Use binary prefixes for information units Usar prefixos binários para unidades de informações Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefixos binários, em vez de decimais, como padrão para unidades de informação (ex. bytes). Conversion to local currency Conversão para moeda local Automatically convert to the local currency when optimal unit conversion is activated. Converter automaticamente para a moeda local quando a conversão ideal de unidades estiver ativada. Update exchange rates on start Atualizar taxas de câmbio ao inicializar If current exchange rates shall be downloaded from the internet at program start Para que as taxas de câmbio sejam baixadas da internet no início do programa Exchange rates updates Atualizações das taxas de câmbio Units & Currencies Unidades e moedas Show expression completion suggestions Mostrar sugestões de conclusão de expressão Search titles and countries Pesquisar títulos e países Minimum characters Caracteres mínimos Popup delay (ms) Atraso da janela pop-up (ms) Completion Conclusão Status warning color Cor do status de erro Status error color Cor do status de erro Custom status font Fonte de status personalizada If you want to use a font other than the default in the status display below the expression entry Se você desejar usar uma fonte diferente da padrão na exibição de status abaixo da entrada da expressão Custom expression font Fonte da expressão personalizada If you want to use a font other than the default in the expression entry Se você desejar usar uma fonte diferente da padrão na entrada da expressão Custom result font Fonte do resultado personalizada If you want to use a font other than the default in the result display Se você desejar usar uma fonte diferente da padrão na exibição do resultado Custom keypad font Fonte do teclado personalizada If you want to use a font other than the default in the keypad Se você desejar usar uma fonte diferente da padrão no teclado Custom application font Fonte do programa personalizada If you want to use a font other than the default for the whole application Se você desejar usar uma fonte diferente da padrão em todo o programa Text color Cor do texto Fonts & Colors Fontes e cores Other: Outra: Bijective base-26 Base bijetiva-26 <b>Result Base</b> <b>Resultado da Base</b> <b>Expression Base</b> <b>Base de Expressão</b> New Keyboard Shortcut Novo atalho de teclado Edit Variable Editar Variável Advanced Avançado Accept the creation/modification of this variable Aceitar a criação/modificação desta variável x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Use x, y e z para o 1º, 2º e 3º argumento da função, respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. Isso evita possíveis conflitos com variáveis, funções e unidades. Edit Unit Editar Unidade Do not create/modify this unit Não criar/modificar esta unidade Accept the creation/modification of this unit Aceitar a criação/modificação desta unidade Singular form of this unit's name Forma singular do nome desta unidade Title displayed in menus and in unit manager Título exibido nos menus e no gerenciador de unidades System Sistema Imperial Imperial US Survey US Survey Hide unit Ocultar unidade If this unit shall be hidden in menus Caso a unidade esteja oculta nos menus Class Classe Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s) Unidade(s) base Exponent Expoente Exponent of the base unit Exponent of the base unit Relation Relação Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número. Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273.15" para a relação entre graus Celsius e Kelvin). Relation is exact Relação é exata If the relation is precise Se a relação é precisa Inverse relation Relação inversa Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide com quais unidades a unidade base é mesclada se existirem várias opções. - A unidade original não será mesclada com unidades de menor prioridade. - Um valor mais baixo significa prioridade mais alta. Priority Prioridade Minimum base unit number Número mínimo da unidade base Use with prefixes by default Use com prefixos por padrão Create a new unit Criar uma nova unidade Edit the selected unit Editar a unidade selecionada Insert the selected unit into the expression entry Inserir a unidade selecionada na entrada da expressão C_onvert C_onverter Convert the result to the selected unit Converter o resultado na unidade selecionada Delete the selected unit Excluir a unidade selecionada (De)activate the selected unit Desativar a unidade selecionada _Unit _Unidade Convert between units Converter entre unidades = = Conver_sion Conver_são Converted value Valor convertido Value to convert from Valor para converter Type anywhere Digitar em qualquer lugar Edit Unknown Variable Editar Variável Desconhecida Do not create/modify this unknown variable Não criar/modificar esta variável desconhecida Accept the creation/modification of this unknown variable Aceitar a criação/modificação desta variável desconhecida Name used to reference this unknown variable in expressions Nome usado para referenciar esta variável desconhecida em expressões Use custom assumptions Usar suposições personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Sinal The category this unknown variable belongs to A categoria à qual essa variável pertence Value of this variable (expression) Valor desta variável (expressão) value is exact valor é exato If the value is precise Se o valor for preciso The category this variable belongs to A categoria à qual essa variável pretence Create a new variable Criar uma nova variável Edit the selected variable Editar a variável selecionada Insert the selected variable into the expression entry Insira a variável selecionada na entrada da expressão Delete the selected variable Excluir a variável selecionada (De)activate the selected variable Desativar a variável selecionada E_xport E_xportar _Variable _Variável Start a new instance of the application Iniciar uma nova instância do programa Display the application version Exibir a versão do programa Specify the window title Especifica o título da janela TITLE TITLE Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. ans ans Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Failed to load global definitions! Falha ao carregar definições globais! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %s é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão salvas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? c-format Right-click/long press: %s Botão direito/pressionar e segurar: %s c-format Right-click: %s Botão direito: %s c-format Middle-click: %s Botão do meio: %s c-format Cycle through previous expression Percorrer pela expressão anterior Move cursor left or right Mover cursor para esquerda ou direita Move cursor to beginning or end Mover cursor para o início ou fim Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Decimal point Ponto decimal Raise (Ctrl+*) Aumentar (Ctrl+*) Add Adicionar Backspace Backspace Previous result (static) Resultado anterior (estático) Calculate expression Calcular expressão Set unknowns Definir incógnitos more Show further items in a submenu mais Logical AND Lógico AND Logical OR Lógico OR Logical NOT Lógico NOT Toggle Result Base Alternar base de resultados Open menu with stored variables Abrir menu com variáveis armazenadas Index Ã�ndice Calculate expression and add to stack Calcular expressão e adicionar à pilha Flag Bandeira Matrices Matrizes Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Juliano Islamic (Hijri) Islâmico (Hijri) Hebrew Hebreu Chinese Chinês Persian (Solar Hijri) Persa (Hijri Solar) Coptic Cóptico Ethiopian Etíope Indian (National) Indiano (Nacional) Action Ação Key combination Combinação de teclas Raise Aumentar History Answer Value Valor da resposta do histórico History Index(es) Ã�ndice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. c-format expression expressão History Parsed Expression Expressão analisada historicamente Set Window Title Definir título da janela Failed to open %s. %s Falha ao abrir %s. %s c-format Could not display help for Qalculate!. Não foi possível exibir a ajuda do Qalculate!. Could not display help for Qalculate!. %s Não foi possível exibir a ajuda do Qalculate!. %s c-format approx. aprox. Stop process Parar processo Clear expression Limpar expressão EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Deseja atualizar as taxas de câmbio agora? It has been %s day since the exchange rates last were updated. Faz %s dia desde a última atualização das taxas de câmbio. Faz %s dias desde a última atualização das taxas de câmbio. c-format It has been %s days since the exchange rates last were updated. Do not ask again Não perguntar novamente It took too long to generate the plot data. Demorou muito para gerar os dados da plotagem. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Demorou muito para gerar os dados da plotagem. Diminua a taxa de amostragem ou aumente o limite de tempo nas preferências. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quando erros, avisos e outras informações são geradas durante o cálculo, o ícone à direita da entrada da expressão é alterado para exibir isso. Ao segurar o ponteiro do mouse ou clicar no ícone, a mensagem será mostrada. Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %s Falha ao executar o script de atualização. %s c-format Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %s is available at %s. Do you wish to update to version %s. Uma nova versão do %s está disponível em %s. Deseja atualizar para a versão %s. c-format A new version of %s is available. You can get version %s at %s. Uma nova versão do %s está disponível. Você pode obter a versão %s em %s. c-format Too many arguments for %s(). Argumentos em excesso para %s(). c-format argument argumento Uncategorized Sem categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal time hora bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar angle ângulo phasor fasor optimal ideal base base mixed mesclado fraction fração factors fatores partial fraction fração parcial factorize fatorar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binário roman numerals numerais romanos bijective base-26 base bijetiva-26 sexagesimal number número sexagesimal 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time format formato de hora number bases bases numéricas optimal unit unidade ideal base units unidades de base mixed units unidades mescladas expanded partial fractions frações parciais expandidas complex rectangular form forma retangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notação complexa de ângulo complex phasor notation notação complexa de fasor UTC time zone Fuso horário UTC number base %s número base %s c-format Inactive Inativo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %s para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. c-format Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description padrão: Requirement Requerimento key indicating that the property is a data set key chave Acti_vate Ati_var a previous result um resultado anterior matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Variable does not exist anymore. A variável não existe mais. Data Retrieval Function Função de Recuperação de Dados Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Insert unit Inserir unidade Insert text Inserir texto Insert date Inserir data Insert vector Inserir vetor Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert to unit (entry) Converter em unidade (entrada) Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: excluir registro RPN: clear stack RPN: limpar pilha Load meta mode Carregar modo meta Set expression base Definir base de expressão Set result base Definir base de resultados Toggle exact mode Alternar modo exato Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Toggle simple fractions Alternar frações simples Toggle mixed fractions Alternar frações mescladas Toggle scientific notation Alternar notação científica Toggle simple notation Alternar notação simples Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar para calcular ao digitar Toggle programming keypad Alternar teclado de programação Show keypad Mostrar teclado Show history Mostrar histórico Search history Pesquisar no histórico Show conversion Mostrar conversão Show RPN stack Mostrar pilha RPN Manage variables Gerenciar variáveis Manage functions Gerenciar funções Manage data sets Gerenciar conjuntos de dados New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de porcentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Save result image Salvar imagem do resultado Help Ajuda Quit Sair Prefixes Prefixos No Prefix Nenhum prefixo Optimal Prefix Prefixo ideal Prefix Prefixo Complex angle/phasor notation Notação completa de ângulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binário Calendars Calendários Complex cis form Forma cis complexa Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma exponencial complexa Factors Fatores 16-bit floating point binary format Formato binário de ponto flutuante de 16-bit 32-bit floating point binary format Formato binário de ponto flutuante de 32-bit 64-bit floating point binary format Formato binário de ponto flutuante de 64-bit 80-bit (x86) floating point binary format Formato binário de ponto flutuante de 80-bit (x86) 128-bit floating point binary format Formato binário de ponto flutuante de 128-bit Hexadecimal number Número hexadecimal Mixed units Unidades mistas Octal number Número octal Optimal units Unidades ideais Expanded partial fractions Frações parciais expandidas Complex polar form Forma polar complexa Complex rectangular form Forma retangular complexa Sexagesimal number Número sexagesimal and e or ou undefined indefinido result is too long see history resultado é muito longo ver histórico calculation was aborted cálculo abortado RPN Register Moved Registro RPN Movido RPN Operation Operação RPN Processing… Processando… result processing was aborted processamento de resultado abortado Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Calculating… Calculando… Converting… Convertendo… Fetching exchange rates. Buscando taxas de câmbio. Time zone parsing failed. Falha na análise do fuso horário. Keep open Manter aberto Enter RPN Enter (calculate and add to stack) Enter C_alculate C_alcular Apply to Stack Aplicar à pilha Argument Argumento True Verdadeiro False Falso Info Informação Edit Unit (global) Editar unidade (global) New Unit Nova unidade Empty name field. Campo de nome vazio. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Base unit does not exist. A unidade base não existe. Edit Function (global) Editar Função (global) New Function Nova Função Yes Sim No Não Empty expression field. Campo de expressão vazio. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Unit does not exist A unidade não existe Edit Unknown Variable (global) Editar Variável Desconhecida (global) New Unknown Variable Nova variável desconhecida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable (global) Editar Variáveis (global) New Variable Nova Variável Empty value field. Campo de valor vazio. Edit Vector Editar Vetor Edit Vector (global) Editar Vetor (global) New Vector Novo Vetor Edit Matrix (global) Editar Matriz (global) New Matrix Nova Matriz Vector Result Resultado do Vetor Matrix Result Resultado da Matriz New Data Object Novo Objeto de Dados text texto approximate aproximado Edit Data Set (global) Editar Conjunto de Dados (global) New Data Set Novo conjunto de dados info info Property Propriedade No file name entered. Nenhum nome de arquivo digitado. No delimiter selected. Nenhum delimitador selecionado. Could not import from file %s Não foi possível importar do arquivo %s c-format No variable name entered. Nenhum nome de variável digitado. No known variable with entered name found. Nenhuma variável conhecida com o nome digitado encontrada. Could not export to file %s Não foi possível exportar para o arquivo %s c-format My Variables Minhas Variáveis Couldn't write definitions Não foi possível gravar definições Preset Predefinição Abort Abortar Undo Desfazer Redo Refazer Completion Mode Modo de conclusão Limited strict completion Conclusão estrita limitada Strict completion Conclusão estrita Limited full completion Conclusão completa limitada Full completion Conclusão completa No completion Sem conclusão Save Mode Salvar modo Preset mode cannot be overwritten. O modo predefinido não pode ser substituído. Delete Mode Excluir modo Couldn't write preferences to %s Não foi possível gravar preferências em %s c-format never nunca ask perguntar %i day %i dia %i dias c-format %i days Copied Result was copied Copiado log10 function not found. função log10 não encontrada. Search Pesquisar _Search _Pesquisar Remove Bookmark Remover marcador Add Bookmark Adicionar marcador A bookmark with the selected name already exists. Do you want to overwrite it? Um marcador com o nome selecionado já existe. Você deseja sobrescrevê-lo? No items found Nenhum item encontrado Select date Selecionar data Rectangular form Forma retangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notação de ângulo/fasor Optimal unit Unidade ideal Optimal prefix Prefixo ideal All functions Todas as funções All variables Todas as variáveis Select definitions file Selecionar arquivo de definições _Import _Importar Could not copy %s to %s. Não foi possível copiar %s para %s. c-format Could not read %s. Não foi possível ler %s. c-format Could not copy file to %s. Não foi possível copiar o arquivo para %s. c-format Unsupported base. Base não suportada. The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %s. Falha na conversão do calendário para: %s. c-format Gnuplot was not found. Gnuplot não encontrado. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. c-format Select file to save PNG image to Selecione o arquivo para salvar a imagem PNG Allowed File Types Tipos de arquivo permitidos All Files Todos os arquivos Cannot delete unit as it is needed by other units. do not delete units that are used by other units Não é possível excluir a unidade, pois ela é necessária para outras unidades. none nenhum result is too long resultado é muito longo translator-credits Fúlvio Alves <fga.fulvio@gmail.com> Mode not found. Modo não encontrado. Elements (in horizontal order) Elementos (em ordem horizontal) Select file to import Selecionar arquivo para importar _Open _Abrir Select file to export to Selecionar o arquivo para o qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe um objeto conflitante com o mesmo nome. Se você continuar e salvar as alterações, o objeto conflitante será substituído ou desativado. Você quer continuar? Set key combination Definir combinação de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pressione a combinação de teclas que deseja usar para a ação (pressione Escape para cancelar). No keys Sem teclas Empty value. Valor vazio. Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. The key combination is already in use. Do you wish to replace the current action? A combinação de teclas já está em uso. Deseja substituir a ação atual? Select file to export Selecionar arquivo para exportar Empty expression. Expressão vazia. Empty x variable. Variável x vazia. Element Data Dados do elemento Classification Classificação Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatômico Diatomic Non-Metal Não-metal diatômico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas No unknowns in result. Não há incógnitas no resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do arquivo Use dark theme Usar tema escuro Add the two top values Keypad Adicionar os dois principais valores u Manage units button u to Button for convert to operator em Add Keypad Adicionar Base Unit Unidade base Alias Alias Composite Unit Unidade composta Fonts Fontes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nome</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relação</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Padrões Customize Buttons Fonte de status personalizada Names details Detalhes dos nomes Rational number form Forma do número racional Decimal fractions Frações decimais Exact decimal fractions Frações decimais exatas Simple fractions Frações simples Mixed fractions Frações mistas ArgumentEditDialog Name: Nome: Type: Tipo: Free Livre Number Número Integer Inteiro Symbol Símbolo Text Texto Date Data Vector Vetor Matrix Matriz Boolean Boleano Angle Ângulo Object Objeto Function Função Unit Unidade Variable Variável File Arquivo Enable rules and type test Ativar regras e teste de tipo Custom condition: Condição personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx CSVDialog Import CSV File Importar arquivo CSV Export CSV File Exportar arquivo CSV Current result Resultado atual Matrix/vector variable: Variável matriz/vetor: File: Arquivo: Import as Importar como matrix matriz vectors vetores Name: Nome: First row: Primeira linha: Includes headings Incluir cabeçalhos Delimiter: Delimitador: Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Error Could not import from file %1 Não foi possível importar do arquivo %1 No matrix or vector variable with the entered name was found. Could not export to file %1 Não foi possível exportar para o arquivo %1 CalendarConversionDialog Calendar Conversion Conversão de calendário Gregorian Gregoriano Hebrew Hebreu Islamic (Hijri) Islâmico (Hijri) Persian (Solar Hijri) Persa (Hijri Solar) Indian (National) Indiano (Nacional) Chinese Chinês Julian Juliano Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Cóptico Ethiopian Etíope Error The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %1. Falha na conversão do calendário para: %1. DataObjectEditDialog %1: %1: Default Padrão Approximate Aproximado Exact Exato Edit Data Object Editar Objeto de Dados New Data Object Novo Objeto de Dados DataPropertyEditDialog Name: Nome: Title: Título: Descriptive name: Nome descritivo: Description: Descrição: Value type: Tipo de valor: Expression Expressão Number Número Text Texto Unit expression: Expressão de unidade: Use as key Usar como chave Case sensitive value Valor sensível a maiúsculas e minúsculas Approximate value Valor aproximado Value uses brackets Valor usa colchetes Hide Ocultar Edit Data Property Editar propriedades de dados DataSetEditDialog General Geral Properties Propriedades Function Função Title: Título: Descriptive name: Nome descritivo: Data file: Arquivo de dados: Description: Descrição: Copyright: Direitos autorais: Title Título Name Nome Type Tipo Add Adicionar Edit Editar Remove Remover Name: Nome: Object argument name: Nome do argumento do objeto: Property argument name: Nome do argumento da propriedade: Default property: Propriedade padrão: text texto approximate aproximado number número expression expressão key chave Question A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Data Sets Conjuntos de dados Object Objeto Property Propriedade Edit Data Set Editar conjunto de dados New Data Set Novo conjunto de dados DataSetsDialog Data Sets Conjuntos de dados Data sets: Conjuntos de dados: New… Novo… Edit… Editar… Delete Excluir Objects: Objetos: Data set description: Descrição do conjunto de dados: Object attributes: Atributos do objeto: Properties Propriedades key chave Data Retrieval Function Função de Recuperação de Dados argument argumento ExpressionEdit matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Prefix: Prefixo: Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Codificação binária decimal Bijective Base-26 Base bijetiva-26 Binary Number Número binário Calendars Calendários Complex cis Form Forma cis complexa Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma exponencial complexa Factors Fatores 16-bit Floating Point Binary Format Formato binário de ponto flutuante de 16-bit 32-bit Floating Point Binary Format Formato binário de ponto flutuante de 32-bit 64-bit Floating Point Binary Format Formato binário de ponto flutuante de 64-bit 80-bit (x86) Floating Point Binary Format Formato binário de ponto flutuante de 80-bit (x86) 128-bit Floating Point Binary Format Formato binário de ponto flutuante de 128-bit Fraction Fração Decimal Fraction Fração decimal Hexadecimal Number Número hexadecimal Latitude Latitude Longitude Longitude Mixed Units Unidades mistas Octal Number Número octal Optimal Unit Unidade ideal Optimal Prefix Prefixo ideal Expanded Partial Fractions Frações parciais expandidas Complex Polar Form Forma polar complexa Complex Rectangular Form Forma retangular complexa Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato da hora Unicode Unicode UTC Time Zone Fuso horário UTC Scientific Notation Notação científica Simple Notation Notação simples Custom Undo Desfazer Redo Refazer Cut Cortar Copy Copiar Paste Colar Delete Excluir Calculate Selection Calcular seleção Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Select All Selecionar tudo Clear Limpar Clear History Limpar histórico Completion Conclusão No completion Sem conclusão Limited strict completion Conclusão estrita limitada Strict completion Conclusão estrita Limited full completion Conclusão completa limitada Full completion Conclusão completa Delayed completion Atraso na conclusão Expression Status Status da expressão Off Desligado In history list In expression field In status bar With delay Com atraso With adaptive delay Sem atraso adaptativo Without delay Sem atraso Automatically calculate selection Use input method Use o método de entrada Matrix Matriz Too many arguments for %1(). Argumentos em excesso para %1(). argument argumento %1: %1: comment comentário MC (memory clear) MC (limpar memória) MS (memory store) MS (armazenar memória) M+ (memory plus) M+ (mais memória) M− (memory minus) M− (menos memória) factorize fatorar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binário binary number número binário roman romanos roman numerals numerais romanos bijective bijetivo bijective base-26 base bijetiva-26 binary-coded decimal codificação binária decimal sexagesimal sexagesimal sexagesimal number número sexagesimal latitude latitude longitude longitude 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time hora time format formato de hora scientific científica scientific notation notação científica engineering engenharia engineering notation notação engenharia simple simples simple notation notação simples bases bases number bases bases numéricas calendars calendários optimal ideal optimal unit unidade ideal prefix prefixo optimal prefix base base base units unidades de base mixed mesclado mixed units unidades mescladas decimals decimais decimal fraction fração decimal fraction fração factors fatores Engineering Notation Notação engenharia base base units base partial fraction fração parcial expanded partial fractions frações parciais expandidas rectangular retangular cartesian cartesiano complex rectangular form forma retangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle ângulo complex angle notation notação complexa de ângulo phasor fasor complex phasor notation notação complexa de fasor UTC time zone fuso horário UTC base number base base number base %1 número base %1 Data object Onjeto de dados FPConversionDialog Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Microchip 24-bit Microchip de 24 bits Microchip 32-bit Microchip de 32 bits Value Valor Decimal value Valor decimal Binary representation Representação binária Hexadecimal representation Representação hexadecimal Floating point value Valor do ponto flutuante Conversion error Erro de conversão FunctionEditDialog Required Obrigatório Details Detalhes Description Descrição Name: Nome: Expression: Expressão: Argument references: Referência de argumento: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y e z (por exemplo "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Usar x, y e z (por exemplo, "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo, "(\x+\y)/2") Category: Categoria: Descriptive name: Nome descritivo: Hide function Ocultar função Example: Exemplo: Description: Descrição: Condition: Condição: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-functions: Subfunções: Expression Expressão Precalculate Pré-calcular Reference Referência Add Adicionar Edit Editar Remove Remover Arguments: Argumentos: Name Nome Type Tipo Warning Conversion (using "to") is not supported in functions. A conversão (usando \"to\") não é suportada em funções. Question A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Edit Function Editar Função New Function Nova Função FunctionsDialog Functions Funções Category Categoria Function Função New… Novo… Edit… Editar… Deactivate Desativar Delete Excluir Calculate… Calcular… Apply Aplicar Insert Inserir Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %1 para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default padrão: Requirement: Required condition for function Requerimento: Properties Propriedades %1: %1: key indicating that the property is a data set key chave Activate Ativar All All functions Todas Uncategorized Sem categoria User functions Funções de usuário Favorites Favoritos Inactive Inativo HistoryView Insert Value Inserir valor Insert Text Inserir texto Copy Copiar Copy Formatted Text Copiar texto formatado Copy unformatted ASCII Copiar ASCII não formatado Select All Selecionar tudo Search… Procurar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática abaixo, ex. "5 + 2 / 3" e pressione a tecla Enter. Exchange rate source(s): Fonte das taxas de câmbio: Fontes das taxas de câmbio: updated %1 atualizado %1 atualizados %1 Comment Comentário Protect Proteger Add Comment… Adicionar comentário… Move to Top Mover para o topo Remove Remover Clear Limpar Edit Comment… Editar comentário… Text: Texto: Search Pesquisar KeypadButton <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 <i>Right-click</i>: %1 <i>Botão direito</i>: %1 <i>Long press</i>: %1 <i>Pressionar e segurar</i>: %1 Open menu <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. STO Store Armazenar New function Nova função sin sin cos cos tan tan Exponentiation Exponenciação Percent or remainder Por cento ou resto Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Interval Intervalo Move cursor left Mover cursor para esquerda Move cursor to start Mover cursor para o início Move cursor right Mover cursor para direita Move cursor to end Mover cursor para fim Logical AND Lógico AND Logical OR Lógico OR Bitwise Exclusive OR OR exclusivo bit-a-bit Logical NOT Lógico NOT Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit cmp rot a→1 Expand partial fractions Expandir frações parciais DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants Activar unidades em constantes físicas All constants Todas as constantes Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem more mais All units Todas as unidades All variables Todas as variáveis Action Ação Interval Display Exibição de intervalo Adaptive Adaptativa Significant digits Dígitos Significativos Plus/minus Mais/menos Relative Relativo Concise Conciso Interval Calculation Cálculo de intervalo Variance formula Interval arithmetic Allow concise uncertainty input Permitir entrada de incerteza concisa Complex number form Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Type Assumptions type Tipo Sign Assumptions sign Sinal Default assumptions Suposições padrão Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Factorize Fatorar Expand Expandir Add column Add row Remove column Remove row Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Decimal point Ponto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicação Button Action Botão de ação Label: Etiqueta: Action: Ação: None Nenhum Value: Valor: Bitwise AND Bit-a-bit AND Bitwise Shift Deslocamento bit-a-bit Delete Excluir Backspace Backspace Addition Adição Plus Mais Subtraction Subtração Minus Menos Division Divisão Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear expression Limpar expressão Calculate expression Calcular expressão NamesEditDialog Name Nome Abbreviation Abreviação Plural Plural Reference Referência Avoid input Evitar entrada Unicode Unicode Suffix Sufixo Case sensitive Maiúsc. e Minúsculas Completion only Apenas conclusão Add Adicionar Edit Editar Remove Remover Warning Illegal name Nome ilegal A function with the same name already exists. Uma função com o mesmo nome já existe. A unit or variable with the same name already exists. Uma unidade ou variável com o mesmo nome já existe. PercentageCalculationDialog Percentage Percentagem Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Alterar de 1 para 2 Change from 2 to 1 Alterar de 2 para 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma porcentagem, e os outros serão calculados para você. Clear Limpar PeriodicTableDialog Periodic Table Tabela Periódica Element Data Dados do elemento Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatômico Diatomic Non-Metal Não-metal diatômico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas Unknown Desconhecido %1: %1: PlotDialog Plot Plotagem Data Dados Title: Título: Expression: Expressão: Function Função Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada Rows Linhas X variable: Variável X: Style: Estilo: Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Polar Polar Smoothing: Suavização: None Nenhum Monotonic Monotônica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotônica) Y-axis: Eixo Y: Primary Primário Secondary Secundário Add Adicionar Apply Aplicar Remove Remover Title Título Expression Expressão Function Range Faixa de Funções Minimum x value: Valor mínimo x: Maximum x value: Valor máximo x: Sampling rate: Taxa de amostragem: Step size: Tamanho do passo: Show real and imaginary parts Appearance Aparência Display grid Exibir grade Display full border Exibir borda completa Minimum y value: Valor mínimo y: Maximum y value: Valor máximo y: Logarithmic x scale: Escala logarítmica x: Logarithmic y scale: Escala logarítmica y: X-axis label: Etiqueta do eixo X: Y-axis label: Etiqueta do eixo Y: Line width: Espessura da linha: Legend placement: Posição da legenda: Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Calculating… Calculando… Cancel Cancelar Processing… Processando… PreferencesDialog Look && Feel Aparência Numbers && Operators Números e operadores Units && Currencies Unidades e moedas Parsing && Calculation Análise e cálculo Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Allow multiple instances Permitir várias instâncias Clear history on exit Limpar histórico ao sair Close application with Escape key Fechar aplicativo com a tecla Escape Keep above other windows Manter acima de outras janelas Window title: Título da janela: Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Workspace Espaço de trabalho Application name + workspace Nome do programa + espaço de trabalho Style: Estilo: Default (requires restart) Default style Dark mode Tema escuro Colorize result Custom result font Fonte do resultado personalizada Custom expression font Fonte da expressão personalizada Custom keypad font Fonte do teclado personalizada Custom application font Fonte do programa personalizada Custom result font: Fonte do resultado personalizada: Custom expression font: Fonte da expressão personalizada: Custom status bar font: Custom keypad font: Fonte do teclado personalizada: Custom application font: Fonte do programa personalizada: Display expression status Exibir status da expressão Expression after calculation: Expressão após o cálculo: Keep expression Manter a expressão Clear expression Limpar expressão Replace with result Substituir pelo resultado Replace with result if shorter Substituir pelo resultado se for mais curto Use keyboard keys for RPN Usar teclado para RPN Parsing mode: Modo de análise: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primeiro multiplicação implícita Chain Cadeia RPN RPN Read precision Ler precisão Limit implicit multiplication Limitar multiplicação implícita Interval calculation: Cálculo de intervalo: Variance formula Interval arithmetic Factorize result Fatorar resultado Binary two's complement representation Representação binária do complemento para dois Hexadecimal two's complement representation Representação hexadecimal do complemento para dois Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais Spell out logical operators Soletrar operadores lógicos Use E-notation instead of 10^x Usar notação E em vez de 10^x Preferences Preferências ms milliseconds ms Use E-notation instead of 10^n Usar notação E em vez de 10^n Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use comma as decimal separator Usar vírgula como separador decimal Ignore comma in numbers Ignorar vírgula em números Ignore dots in numbers Ignorar pontos em números Round halfway numbers away from zero Arredondar números pela metade a partir de zero Round halfway numbers to even Arredondar números até a metade Indicate repeating decimals Indicar decimais repetidos Language: Idioma: Max history lines saved: Máximo de linhas de histórico salvas: Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Dicas de ferramentas: Show all Mostrar tudo Hide in keypad Ocultar no teclado Hide all Ocultar tudo Disable cursor blinking Desativar o piscar do cursor Format result Custom history font: Fonte do histórico personalizado: Expression status: Status da expressão: Place expression field below history Off Desligado In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Expressão na história: Parsed Analisado Parsed (compact) Entered Digitado Entered + parsed Digitado + analisado Entered + parsed (compact) Automatically copy result Simplified percentage calculation Cálculo de porcentagem simplificado Allow concise uncertainty input Permitir entrada de incerteza concisa Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binário Hexadecimal Hexadecimal Binary bits: Bits binários: Automatic Automático Use special duodecimal symbols Usar símbolos duodecimais especiais Use Unicode division slash in output Copy unformatted ASCII by default Copiar como ASCII não formatado por padrão Place percent button in number pad Indicate repeating decimals: Indicar decimais repetidos: Ellipsis Reticências Overline Linha superior Digit grouping: Agrupamento de dígitos: None Nenhum Standard Padrão Local Local Custom Interval display: Exibição de intervalo: Significant digits Dígitos Significativos Interval Intervalo Plus/minus Mais/menos Concise Conciso Midpoint Ponto médio Lower Upper Rounding: Complex number form: Forma de nùmero complexo: Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Enable units Abbreviate names Abreviar nomes Use binary prefixes for information units Usar prefixos binários para unidades de informações Automatic unit conversion: No conversion Base units Unidades base Optimal units Unidades ideais Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Copiar ASCII não formatado sem unidades Default currency: Fonts Fontes Units Unidades Calculation Cálculo Restart required Reinício necessário Please restart the program for the language change to take effect. Reinicie o programa para que a alteração de idioma tenha efeito. Default Padrão Notify when a new version is available Notificar quando uma nova versão estiver disponível Calculate as you type delay: Multiplication sign: Sinal de multiplicação: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Arredondar números pela metade para ímpares Round halfway numbers toward zero Arredondar números pela metade em direção a zero Round halfway numbers to random Arredondar números pela metade para aleatórios Round halfway numbers up Arredondar números pela metade para cima Round halfway numbers down Arredondar números pela metade para baixo Round toward zero Arredondar para zer Round away from zero Arredondar a partir de zero Round up Arredondar para cima Round down Arredondar para baixo No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Ativar prefixos de denominador Enable units in physical constants Activar unidades em constantes físicas Temperature calculation: Modo de cálculo de temperatura: Absolute Absoluto Relative Relativo Hybrid Híbrido Exchange rates updates: Atualizações das taxas de câmbio: %n day(s) %n dia %n dias days dia dias QApplication Execute expressions and commands from a file Executar expressões e comandos a partir de um arquivo FILE FILE Start a new instance of the application Iniciar uma nova instância do programa Specify the window title Especifica o título da janela TITLE TITLE Update exchange rates Atualizar taxas de câmbio Display the application version Exibir a versão do programa Open workspace Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %1 é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão salvas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? Allow multiple instances? %1 is already running. Failed to load global definitions! Falha ao carregar definições globais! answer resposta History Answer Value Valor da resposta do histórico History Index(es) Ã�ndice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Error Couldn't write preferences to %1 Não foi possível gravar preferências em %1 Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. Unsupported base. Base não suportada. Unsupported value. Valor não suportado. QalculateQtSettings Update exchange rates? Atualizações das taxas de câmbio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Faz %n dia desde a última atualização das taxas de câmbio. Deseja atualizar as taxas de câmbio agora? Faz %n dias desde a última atualização das taxas de câmbio. Deseja atualizar as taxas de câmbio agora? Fetching exchange rates. Buscando taxas de câmbio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Contém o resultado do cálculo mais recente. Múltiplos resultados de uma equação são representados como um vetor. Acesse soluções separadas usando ans(n) (por exemplo, ans(1) para a primeira solução). Fetching exchange rates… Buscando taxas de câmbio… Error Warning Information Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %1 Falha ao executar o script de atualização. %1 Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %1 is available at %2. Do you wish to update to version %3? Uma nova versão do %1 está disponível em %2. Deseja atualizar para a versão %3. A new version of %1 is available. You can get version %3 at %2. Uma nova versão do %1 está disponível. Você pode obter a versão %3 em %2. Download Baixar %1: %2 Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Approximate result Negate Negar Invert Inverter Insert unit Inserir unidade Insert text Inserir texto Insert operator Insert date Inserir data Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert Converter Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: excluir registro RPN: clear stack RPN: limpar pilha Set expression base Definir base de expressão Set result base Definir base de resultados Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Alternar precisão Toggle max decimals Alternar decimais máximos Toggle min decimals Alternar decimais mínimos Toggle max/min decimals Alternar decimais máximos/mínimos Toggle RPN mode Alternar modo RPN Show general keypad Toggle programming keypad Alternar teclado de programação Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Pesquisar no histórico Clear history Limpar histórico Show variables Show functions Show units Show data sets Store result Guardar resultado MC (memory clear) MC (limpar memória) MR (memory recall) MR (recuperar memória) MS (memory store) MS (armazenar memória) M+ (memory plus) M+ (mais memória) M− (memory minus) M− (menos memória) New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de porcentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Insert result Open mode menu Open menu Help Ajuda Quit Sair Toggle chain mode Alternar manter acima Toggle keep above Show completion (activate first item) Clear expression Limpar expressão Delete Excluir Backspace Backspace Home End Right Left Up Acima Down Abaixo Undo Desfazer Redo Refazer Calculate expression Calcular expressão Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Padrão Formatted result Resultado formatado Unformatted ASCII result Resultado ASCII não formatado Unformatted ASCII result without units Resultado ASCII não formatado sem unidades Formatted expression Expressão formatada Unformatted ASCII expression Expressão ASCII não formatada Formatted expression + result Expressão formatada + resultado Unformatted ASCII expression + result Expressão ASCII não formatada + resultado QalculateTranslator OK Only used when Qt translation is missing Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing &Yes Only used when Qt translation is missing &No Only used when Qt translation is missing &Open Only used when Qt translation is missing &Save Only used when Qt translation is missing &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu New Novo Function… Função… Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Workspaces Espaços de trabalho Open… Abrir… Open default Abrir padrão Save Salvar Save As… Salvar como… Import CSV File… Importar arquivo CSV… Export CSV File… Exportar arquivo CSV… Functions Funções Variables and Constants Variáveis e constantes Units Unidades Plot Functions/Data Funções/dados de plotagem Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Calendar Conversion Conversão de calendário Update Exchange Rates Atualizar taxas de câmbio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Modo de cadeia Keyboard Shortcuts Atalhos do teclado Preferences Preferências Help Ajuda Report a Bug Reportar um erro Check for Updates Verificar atualizações About %1 Sobre o %1 Quit Sair Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de exibição geral Normal Normal Scientific Científica Engineering Engenharia Simple Simples Angle Unit Unidade de ângulo Radians Radianos Degrees Graus Gradians Grados Approximation Aproximação Automatic Automatic approximation Automática Dual Dual approximation Dupla Exact Exact approximation Exato Approximate Aproximado Assumptions Suposições Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Sign Assumptions sign Sinal Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Result Base Base de resultados Binary Binário Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Outro Approximation and Fractions Aproximação e frações Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de hora Roman numerals Números romanos Unicode Unicode Bijective base-26 Base bijetiva-26 Binary-coded decimal (BCD) Codificação binária decimal Custom: Number base Expression Base Base de expressão Other: Number base Outra: Precision: Precisão: Min decimals: Decimais mínimos: Max decimals: Decimais máximos: off Max decimals desligado Convert Converter Convert (%1) Converter (%1) Store Armazenar Store (%1) Guardar (%1) Functions (%1) Funções (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidade… Data Sets Conjuntos de dados Percentage Calculation Tool Ferramenta de Cálculo de Porcentagem Periodic Table Tabela Periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Funções/dados de plotagem (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binário: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pilha RPN Rotate the stack or move the selected register up (%1) Gire a pilha ou mova o registro selecionado para cima (%1) Rotate the stack or move the selected register down (%1) Gire a pilha ou mova o registro selecionado para baixo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Troque os valores superiores ou mova o valor selecionado para o topo da pilha (%1) Copy the selected or top value to the top of the stack (%1) Copie o valor selecionado ou superior para o topo da pilha (%1) Enter the top value from before the last numeric operation (%1) Digite o valor superior antes da última operação numérica (%1) Delete the top or selected value (%1) Excluir o valor selecionado ou superior (%1) Clear the RPN stack (%1) Limpar a pilha RPN (%1) New Function… Nova função… Favorites Favoritos Recent Recentes User functions Funções de usuário Open dialog Show all functions User units Unidades de usuário more mais Prefixes Prefixos Show all units User variables Variáveis de usuário Show all variables Powerful and easy to use calculator Calculadora potente e fácil de usar License: GNU General Public License version 2 or later Error Couldn't write definitions Não foi possível gravar definições hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal latitude latitude longitude longitude time hora Time zone parsing failed. Falha na análise do fuso horário. bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ângulo optimal ideal base base mixed mesclado fraction fração factors fatores Show toolbar Open Settings Folder(s) Abrir pasta de configurações Abrir pastas de configurações Number Pad Always Show Number Pad EXACT EXACT APPROX APPROX RPN RPN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy Copiar <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 scientific científica engineering engenharia simple simples prefix prefixo base base units base partial fraction fração parcial base number base base decimals decimais factorize fatorar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operação RPN Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Converting… Convertendo… RPN Register Moved Registro RPN Movido Processing… Processando… Matrix Matriz Unknown variables (e.g. x, y, z) are by default assumed real. Variáveis ​​desconhecidas (por exemplo, x, y, z) são consideradas reais por padrão. Temperature Calculation Mode Modo de cálculo de temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). A expressão é ambígua. "Selecione o modo de cálculo de temperatura "(o modo pode ser alterado posteriormente nas preferências). Absolute Absoluto Relative Relativo Hybrid Híbrido Please select desired variant of the sinc function. Selecione a variante desejada da função sinc. Unnormalized Não normalizado Normalized Normalizado Interpretation of dots Interpretação de pontos Interpretation of comma Interpretação da vírgula Please select interpretation of comma (",") (this can later be changed in preferences). Selecione a interpretação da vírgula (",") (isso pode ser alterado posteriormente nas preferências). Please select interpretation of dots (".") (this can later be changed in preferences). Selecione a interpretação dos pontos (".") (isso pode ser alterado posteriormente nas preferências). Both dot and comma as decimal separators Ponto e vírgula como separadores decimais Dot as thousands separator Ponto como separador de milhares Comma as thousands separator Vírgula como separador de milhares Only dot as decimal separator Apenas ponto como separador decimal Parsing Mode Modo de análise The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). A expressão é ambígua. Selecione a interpretação de expressões com multiplicação implícita (isso pode ser alterado posteriormente nas preferências). Implicit multiplication first Primeiro multiplicação implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Interpretação de Porcentagem Please select interpretation of percentage addition Selecione a interpretação da adição de porcentagem Add percentage of original value Adicionar porcentagem do valor original Add percentage multiplied by 1/100 Adicione a porcentagem multiplicada por 1/100 Add Action (%1) Adicionar ação (%1) Edit Keyboard Shortcut New Keyboard Shortcut Novo atalho de teclado Action: Ação: Value: Valor: Set key combination Definir combinação de teclas Press the key combination you wish to use for the action. Pressione a combinação de teclas que deseja usar para a ação. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? A combinação de teclas já está em uso. Deseja substituir a ação atual (%1)? Question Add… Adicionar… Edit… Editar… Remove Remover Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. Example: Example of function usage Exemplo: Enter RPN Enter Enter Calculate Calcular Apply to Stack Aplicar à pilha Insert Inserir Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Não perguntar novamente Keep open Manter aberto Value Valor Argument Argumento %1: %1: Approximation && Fractions Aproximação e frações Plot Plotagem General Geral Programming Programação Algebra Ã�lgebra Custom None Nenhum Show Custom Column Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 Open menu Number Bases Bases Numéricas Conversion operator Operador de conversão Rotate the stack or move the selected register up Gire a pilha ou mova o registro selecionado para cima Rotate the stack or move the selected register down Gire a pilha ou mova o registro selecionado para baixo Swap the top two values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Delete the top or selected value Excluir o valor selecionado ou superior Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Clear the RPN stack Limpar a pilha RPN Comma as separator for function arguments and matrix/vector elements Vírgula como separador para argumentos de função e elementos de matriz/vetor Action Ação Key combination Combinação de teclas True Verdadeiro False Falso Info Informação optional optional argument opcional Failed to open %1. %2 Falha ao abrir %1. %2 UnitEditDialog General Geral Relation Relação Name: Nome: Category: Categoria: Descriptive name: Nome descritivo: System: Sistema: Imperial Imperial US Survey US Survey Hide unit Ocultar unidade Description: Descrição: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. A classe à qual esta unidade pertence. As unidades derivadas nomeadas são definidas em relação a uma única outra unidade, com um expoente opcional, enquanto as unidades derivadas (sem nome) são definidas por uma expressão unitária com uma ou várias unidades. Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s): Unidade(s) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Unidade (para unidades derivadas nomeadas) ou expressão de unidade (para unidades derivadas não nomeadas) em relação à qual esta unidade é definida Exponent: Expoente: Relation: Relação: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número.<br><br>Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273,15" para a relação entre graus Celsius e Kelvin). Inverse relation: Relação inversa: Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base Priority: Prioridade: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Exemplo: a prioridade da unidade "mão" é definida como 2, enquanto a prioridade de ft (pé) e in (polegada) é definida como 1, o que resulta em "17 pol = 1 pé + 5 pol", em vez de "17 pol = 1 pé + 1 mão + 1 pol". Minimum base unit number: Número mínimo da unidade base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Exemplo: o número mínimo de unidade base de yd (jarda) é definido como 12, o que resulta em "3 × 3 pés = 9 pés" (em vez de "3 jardas") e "4 × 3 pés = 4 jardas". Use with prefixes by default Use com prefixos por padrão Base unit does not exist. A unidade base não existe. Error A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Question A variable or unit with the same name already exists. Do you want to overwrite it? Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unit Editar Unidade New Unit Nova unidade UnitsDialog Units Unidades Category Categoria Unit Unidade New… Novo… Edit… Editar… Deactivate Desativar Delete Excluir Convert Converter Insert Inserir Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Ativar All All units Todas Uncategorized Sem categoria User units Unidades de usuário Favorites Favoritos Inactive Inativo UnknownEditDialog Name: Nome: Custom assumptions Suposições personalizadas Type: Tipo: Sign: Sinal: Temporary Temporária Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unknown Variable Editar Variável Desconhecida New Unknown Variable Nova variável desconhecida VariableEditDialog Name: Nome: Temporary Temporária Value: Valor: Required Obrigatório Description Descrição current result resultado atual Category: Categoria: Descriptive name: Nome descritivo: Hide variable Ocultar variável Description: Descrição: Question A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable Editar Variável New Variable Nova Variável VariablesDialog Variables Variáveis Category Categoria Variable Variável New Novo Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desativar Delete Excluir Insert Inserir Favorite Favorito a matrix uma matriz a vector um vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero integer inteiro boolean boleano rational racional real real complex complexo number número not matrix não matriz unknown desconhecido Default assumptions Suposições padrão Activate Ativar All All variables Todas Uncategorized Sem categoria User variables Variáveis de usuário Favorites Favoritos Inactive Inativo qalculate-qt-5.11.0/translations/qalculate-qt_pt_PT.ts000066400000000000000000016442071520501070600230010ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Calculadora Powerful and easy to use calculator Calculadora potente e fácil de usar calculation;arithmetic;scientific;financial; calculadora;aritmética;científica;financeira; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! é uma calculadora para desktop multiplataforma e multiuso. É simples de usar, mas fornece poder e versatilidade normalmente vistas em pacotes de matemática complicados, além de ferramentas úteis para as necessidades diárias (como conversão de moeda e cálculo de percentagem). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Os recursos incluem uma grande biblioteca de funções personalizáveis, cálculos e conversão de unidades, constantes físicas, cálculos simbólicos (incluindo integrais e equações), precisão arbitrária, propagação de erros, aritmética de intervalos, plotagem e uma interface amigável. Argument Rules Regras de argumento _Cancel _Cancelar Do not save modifications Não gravar modificações _OK _OK Accept the modification of argument rules Aceitar modificação de regras de argumento Enable rules and type test Ativar regras e teste de tipo Custom condition Condição personalizada For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx Keyboard Shortcuts Atalhos do teclado _Close _Fechar Label Etiqueta Left-click Botão esquerdo Right-click Botão direito Middle-click Botão do meio Reset Redefinir Value Valor Argument name Nome do argumento Calendar Conversion Conversão de calendário Export CSV File Exportar ficheiro CSV Current result Resultado atual Matrix/vector variable Variável matriz/vetor File Ficheiro Delimiter Delimitador Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Import CSV File Importar ficheiro CSV Do not import the file Não importar o ficheiro Import the file Importar o ficheiro Name of the data file to import Nome do ficheiro de dados a ser importado Select a file Selecionar um ficheiro Import as Importar como Matrix Matriz If a matrix shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Vectors Vetores If vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Name Nome Name (or name prefix) used to reference generated variable(s) in expressions Nome (ou prefixo do nome) usado para referenciar variáveis geradas em expressões Descriptive name Nome descritivo Title displayed in menus and in variable manager Título exibido nos menus e no gestor de variáveis Category Categoria First row Primeira linha The first row with data to import in the file A primeira linha com dados a serem importados no ficheiro Includes headings Incluir cabeçalhos If the first row contains column headings Se a primeira linha deve conter cabeçalhos de coluna Delimiter used to separate columns in the file Delimitador usado para separar colunas no ficheiro Custom delimiter Delimitador personalizado Edit Data Property Editar propriedades de dados Do not create/modify this data set Não criar/modificar este conjunto de dados Accept the creation/modification of this data set Aceitar a criação/modificação deste conjunto de dados Name used for reference Nome usado para referência Properties Propriedades Title displayed in menus and in data set manager Título exibido nos menus e no gestor de conjunto de dados Description Descrição Description of this data property Descrição desta propriedade de dados Value Type Tipo de valor Text Texto Number Número Expression Expressão Hide Ocultar Use as key Usar como chave Approximate value Valor aproximado Case sensitive value Valor sensível a maiúsculas e minúsculas Value uses brackets Valor usa colchetes Unit expression Expressão de unidade Edit Data Set Editar conjunto de dados Title Título Data file Ficheiro de dados Description of this data set Descrição deste conjunto de dados Copyright Direitos autorais General Geral Properties: Propriedades: Definition of the properties of this data set Definição das propriedades deste conjunto de dados _New _Novo _Edit _Editar _Delete _Eliminar Name used to invoke the function in expressions Nome usado para chamar a função em expressões Object argument name Nome do argumento do objeto Property argument name Nome do argumento da propriedade Default property Propriedade padrão Function Função Edit Data Object Editar Objeto de Dados Do not create/modify this data object Não criar/modificar este objeto de dados Accept the creation/modification of this data object Aceitar a criação/modificação deste objeto de dados Data Sets new dataset Conjuntos de dados Data Set Conjunto de dados Create a new data set Criar um novo conjunto de dados Edit the selected data set Editar o conjunto de dados selecionado Delete the selected data set Eliminar o conjunto de dados selecionado Objects Objetos Create a new data object Criar um novo objeto de dados Edit the selected data object Editar o objeto de dados selecionado Remove the selected data object Remover o objeto de dados selecionados Data Set Description Descrição do conjunto de dados Object Attributes Atributos do objeto Decimals Decimais Close this window Fechar esta janela Min decimals Decimais mínimos Max decimals Decimais máximos Minimal number of displayed decimals Número mínimo de casas decimais exibidas Maximal number of decimals to display (and round to) Número máximo de casas decimais a serem exibidas (e arredondadas) Floating Point Conversion Conversão de ponto flutuante Decimal value Valor decimal Binary value Valor binário Octal value Valor octal Hexadecimal representation Representação hexadecimal Conversion error Erro de conversão Binary representation Representação binária Floating point value Valor do ponto flutuante Format Formato 16-bit (half precision) 16-bit (precisão média) 32-bit (single precision) 32-bit (precisão única) 64-bit (double precision) 64-bit (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Hexadecimal value Valor hexadecimal Edit Function Editar Função _Help _Ajuda Do not create/modify this function Não criar/modificar esta função Accept the creation/modification of this function Aceitar a criação/modificação desta função Name used to invoke this function in expressions Nome usado para chamar esta função em expressões Title displayed in menus and in function manager Título exibido nos menus e no gestor de funções Hide function Ocultar função If this function shall be hidden in menus Caso a função esteja oculta nos menus Description of this function Descrição desta função Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Use \x para o primeiro, \y para o segundo e \z para o terceiro argumento. Para mais informações, clique no botão de ajuda. Condition Condição Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-Functions Subfunções Arguments: Argumentos: Definition of this function's arguments Definição dos argumentos desta função Free Livre Integer Inteiro Symbol Símbolo Date Data Vector Vetor Positive number Número positivo Non-zero number Número diferente de zero Non-negative number Número não-negativo Positive integer Número inteiro positivo Non-zero integer Inteiro diferente de zero Non-negative integer Inteiro não-negativo Boolean Boleano Object Objeto Unit Unidade Variable Variável Angle Ângulo Data object Onjeto de dados Data property Propriedade de dados _Add _Adicionar Add entered argument definition Adicionar definição de argumento inserido _Apply _Aplicar Modify selected argument Modificar argumento selecionado Remove selected argument Remover argumento selecionado Rules Regras Edit conditions for selected argument Editar condições para o argumento selecionado Close this dialog Fechar este diálogo Precalculate Pré-calcular Calculate the subfunction only once, before the parent function Calcular a subfunção apenas uma vez, antes da função pai Add entered subfunction Adicionar subfunção inserida Apply changes to the selected subfunction Aplicar alterações à subfunção selecionada Remove the selected subfunction Remover a subfunção selecionada Functions Funções Create a new function Criar uma nova função Edit the selected function Editar a função selecionada _Insert _Inserir Insert (or execute) the selected function into the expression entry Inserir (ou executar) a função selecionada na entrada da expressão Delete the selected function Eliminar a função selecionada (De)activate the selected function Desativar a função selecionada Deacti_vate Desati_var Apply the selected function to the current expression Aplicar função selecionada à expressão atual Categor_y Categor_ia _Function _Função Descri_ption Desc_rição Degrees Graus Radians Radianos Gradians Grados Default assumptions Suposições padrão Unknown Desconhecido Not Matrix Não-matriz Complex Complexo Real Real Rational Racional Non-Zero Diferente de zero Positive Positivo Non-Negative Não-negativo Negative Negativo Non-Positive Não-positivo _File _Ficheiro Unknown Variable Variável desconhecida Function (simplified) Função (simplificada) Import CSV File… Importar ficheiro CSV… Export CSV File… Exportar ficheiro CSV… _Store Result… _Guardar resultado… Save Result Image… Gravar imagem do resultado… Save local functions, variables and units Gravar funções, variáveis e unidades Save Definitions Gravar definições Import Definitions File… Importar ficheiro de definições… Fetch current exchange rates from the Internet Buscar taxas de câmbio atualizadas na Internet Update Exchange Rates Atualizar taxas de câmbio Plot Functions/Data Funções/dados de plotagem Convert Number Bases Converter bases numéricas Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Percentage Calculation Tool Ferramenta de Cálculo de Percentagem Periodic Table Tabela Periódica Minimal Window Janela mínima _Quit _Sair Manage Variables Gerenciar Variáveis Manage Functions Gerenciar Funções Manage Units Gerenciar Unidades Manage Data Sets Gerenciar Conjuntos de Dados Factorize Fatorar Expand Expandir Apply partial fraction decomposition to the current result. Aplicar decomposição de fração parcial ao resultado atual. Expand Partial Fractions Expandir Frações Parciais Set Unknowns… Definir Incógnitos… Convert to Unit Converter em Unidade Set Prefix Definir Prefixo Convert to Unit Expression… Converter em Expressão de Unidade… Convert to Base Units Converter em Unidades Base Convert to Optimal Unit Converter em Unidade Ideal Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Insert Vector… Inserir Vetor… _Copy Result _Copiar resultado Customize Keypad Buttons Personalizar botões do teclado _Preferences _Preferências _Mode _Modo Number Base Base numérica Select Result and Expression Base… Selecionar resultado e base de expressão… Binary Binário Octal Octal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Outro… Sexagesimal Sexagesimal Time Format Formato da hora Roman Numerals Números romanos Numerical Display Exibição numérica Normal Normal Engineering Engenharia Scientific Científica Purely Scientific Puramente Científica Simple Simples Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Desativado: 1/7 ≈ 0.14285714 Ativado: 1/7 = 0.142857 142857... Indicate Repeating Decimals Indicar decimais repetidos Show Ending Zeroes Mostrar zeros finais Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Desativado: 2.5 ≈ 3, 1.5 ≈ 2 Ativado: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Arredondar números até a metade Off: -x + y On: y - x Desativado: -x + y Ativado: y - x Sort Minus Last Classificar menos último Complex Rectangular Form Forma retangular complexa Complex Exponential Form Forma exponencial complexa Complex Polar Form Forma polar complexa Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Rational Number Form Forma do número racional 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions Frações decimais 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions Frações decimais exatas 6/4 = 3/2 6/4 = 3/2 Simple Fractions Frações simples 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Frações mistas Interval Display Exibição de intervalo Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Desativado: 1/2*pi ≈ 1.5707963 Ativado: 1/2*pi = 0.5 pi Adaptive Adaptativa Calculates an interval of possible values and keeps track of precision changes. Calcula um intervalo de valores possíveis e acompanha mudanças de precisão. Significant Digits Dígitos Significativos Interval Intervalo Plus/Minus Mais/Menos Midpoint Ponto médio Unit Display Exibir Unidade Do not use any prefixes in result Não usar nenhum prefixo no resultado Show prefixes for primarily SI and CGS units. Mostrar prefixos principalmente para unidades SI e CGS. Use prefixes for selected units Usar prefixos para unidades selecionadas Use prefixes also for currencies Usar prefixos também para moedas Use prefixs for all units Usar prefixos em todas as unidades Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Permite o uso automático de hekto, deka, deci e centi quando os prefixos estão ativados Enable All SI Prefixes Ativar Todos os Prefixos SI Enables automatic setting of prefix for denominator in addition to the numerator Ativar a configuração automática de prefixo para o denominador, além do numerador Enable Denominator Prefixes Ativar Prefixos de Denominador Off: J / K On: J * K^-1 Desativado: J / K Ativado: J * K^-1 Negative Exponents Expoentes negativos Off: (2 m)/s On: 2 (m/s) Desativado: (2 m)/s Ativado: 2 (m/s) Place Units Separately Colocar unidades separadamente No Additional Conversion Nenhuma conversão adicional Convert to Optimal SI Unit Converter em unidade SI ideal If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Se ativado: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Converter em unidades mistas Abbreviate Names Abreviar nomes Enabled Objects Objetos ativados Variables Variáveis Units Unidades Unknowns Desconhecidos Units in Physical Constants Unidades em constantes físicas If not enabled, treats all variables as unknown Se não estiver ativado, trata todas as variáveis como desconhecidas Calculate Variables Calcular variáveis Disables/enables complex numbers in result Desativar/ativar números complexos no resultado Allow Complex Result Permitir resultado complexo Disables/enables infinite numbers in result Desativar/ativar números infinitos no resultado Allow Infinite Result Permitir resultado infinito Approximation Aproximação Always Exact Sempre exato Try Exact Tentar exato Approximate Aproximado Interval Arithmetic Aritmética de intervalo Interval Calculation Cálculo de intervalo Variance Formula Fórmula de variância Change angle unit used in trigonometric functions Alterar unidade de ângulo usada em funções trigonimétricas Angle Unit Unidade de ângulo None Nenhum Assumptions Suposições Algebraic Mode Modo Algébrico Assume that unknown denominators are non-zero Assume que os denominadores incógnitos são diferentes de zero Non-Zero Denominators Denominadores diferentes de zero Warn when unknown denominators are assumed non-zero Avisar quando denominadores incógnitos são assumidos diferentes de zero Warn About Denominators Assumed Non-Zero Avisar sobre denominadores considerados diferentes de zero Parsing Mode Modo de análise Adaptive Parsing Análise adaptativa Parse Implicit Multiplication First Analisar primeiro multiplicação implícita Conventional Parsing Análise convencional RPN Syntax Sintaxe RPN Off: xy = x*y On: xy != x*y Desativado: xy = x*y Ativado: xy != x*y Limit Implicit Multiplication Limitar multiplicação implícita Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Analisa números decimais como aproximados com precisão igual ao número de dígitos. Desativado: 1.1 * 1.1 = 1.21 Ativado: 1.1 * 1.1 ≈ 1.2 Read Precision Ler precisão _Precision _Precisão _Decimals _Decimais Calculate As You Type Calcular ao digitar Activate the RPN stack. Ative a pilha RPN. RPN Mode Modo RPN Meta Modes Meta Modos Save Mode… Gravar modo… Delete Mode… Eliminar modo… Save Default _Mode Gravar _modo padrão Fu_nctions Fu_nções _Variables _Variáveis _Units _Unidades _Contents _Conteúdo Report a Bug Reportar um erro Check for Updates Verificar atualizações _About _Sobre Toggle minimal window Alternar janela mínima Calculation result Resultado do cálculo _Keypad _Teclado Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Ativar teclado persistente (permite exibir o teclado e o histórico simultaneamente) _History _Histórico C_onversion C_onversão RPN Stack Pilha RPN Insert the selected value Inserir o valor selecionado Insert the selected text Inserir o texto selecionado Copy the selected text Copiar o texto selecionado Add the selected value(s) Adicionar os valores selecionados Subtract the selected value(s) Subtrair os valores selecionados Multiply the selected value(s) Multiplicar os valores selecionados Divide the the selected value(s) Dividir os valores selecionados Raise to the power of the selected value Aumentar a potência do valor selecionado Calculate the square root of the selected value Calcular a raiz quadrada do valor selecionado History Histórico Subtract the top value from the second value Subtrair o valor superior do segundo valor Multiply the top two values Multiplicar os dois principais valores Divide the second value by the top value Dividir o segundo valor pelo valor superior Raise the second value to the power of the top value Aumentar o segundo valor para a potência do valor superior Negate the top value (Ctrl+-) Negar o valor superior (Ctrl+-) Invert the top value Inverter o valor superior Calculate the square root of the top value Calcular a raiz quadrada do valor superior Calculate the sum of all values Calcular a soma de todos os valores Rotate the stack or move selected register up Gire a pilha ou mova o registo selecionado para cima Rotate the stack or move selected register down Gire a pilha ou mova o registo selecionado para baixo Swap the two top values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Enter the top value from before the last numeric operation Digite o valor superior antes da última operação numérica Delete the top or selected value Eliminar o valor selecionado ou superior Edit the selected value Editar o valor selecionado Clear the RPN stack Limpar a pilha RPN Unit(s) and prefix to convert result to Unidade(s) e prefixo para converter o resultado em Convert Converter Continuous conversion Conversão contínua Automatically convert result to the current unit expression as long as the conversion box is visible. Converter automaticamente o resultado na expressão de unidade atual, desde que a caixa de conversão esteja visível. Add prefix Adicionar prefixo If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Se a expressão da unidade não contiver nenhum prefixo, use o prefixo ideal. Isso pode ser substituído ao adicionar a expressão da unidade com "?" ou "0". Conversion Conversão Show/hide programming keypad Mostrar/ocultar teclado de programação Exact Exato Fraction Fração Numerical display Exibição numérica Pure Puro Number base Base numérica Time format Formato de tempo Roman Romano sin sin cos cos tan tan ln ln Equals Igual a sqrt sqrt sum sum Unknown variable Variável desconhecida mod mod mean mean Store result as a variable Guardar o resultado como uma variável STO Standard calculator button. Do not use more than three characters. STO Convert number bases Converter bases numéricas Imaginary unit i (√-1) Unidade imaginária i (√-1) Manage units Gerenciar unidades Conversion operator Operador de conversão Kilogram Quilograma Two's complement input Entrada do complemento para dois Two's complement output Saída do complemento para dois Bitwise Exclusive OR OR exclusivo bit-a-bit Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit Floating point conversion Conversão de ponto flutuante Show/hide left keypad Mostrar/ocultar teclado esquerdo Show/hide right keypad Mostrar/ocultar teclado direito DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Resultado anterior ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Adicionar à Expressão Persistent Keypad Teclado persistente Edit Editar Delete Eliminar Update Atualizar Insert Value Inserir valor Insert Text Inserir texto Insert Parsed Text Inserir texto analisado Copy Copiar Copy Full Text Copiar todo o texto Search… Procurar… Add Bookmark… Adicionar marcador… Bookmarks Marcador Protect Proteger Move To Top Mover para o topo Remove Remover Clear All Limpar tudo _Copy _Copiar _Store… _Armazenar… Save Image… Gravar imagem… _Factorize _Fatorar _Expand _Expandir _Normal _Normal Sc_ientific C_ientífica Purel_y Scientific Pura_mente científica Simp_le Simp_les _Binary _Binária _Octal _Octal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Fração decimal Exact Decimal Fraction Fração decimal exata Simple Fraction Fração simples Mixed Fraction Fração mista _Abbreviate Names _Abreviar nomes C_onvert… C_onverter… Convert to Base _Units Converter em _unidades base Convert _to Optimal Unit Conver_ter em unidade ideal Use Optimal Prefix Usar prefixo ideal Convert to Converter para Convert to UTC Converter para UTC Convert to Calendars Converter em calendários Use prefixes for all units Usar prefixos em todas as unidades Enable All SI Prefi_xes Ativar Todos os Prefi_xos SI View/Edit Matrix Ver/Editar Matriz View/Edit Vector Ver/Editar Vetor Copy Text Copiar texto To Top Para cima Swap Trocar Up Acima Down Abaixo Negate Negar Invert Inverter Square Quadrado Square Root Raiz quadrada Clear Stack Limpar pilha Select Number Base… Selecionar Base Numérica… Store result Guardar resultado Insert the matrix/vector into the expression Inserir a matriz/vetor na expressão Rows Linhas Number of rows in this matrix (rows displayed for vectors) Número de linhas nesta matriz (linhas exibidas para vetores) Columns Colunas Number of columns in this matrix (columns displayed for vectors) Número de colunas nesta matriz (colunas exibidas para vetores) If this is a matrix or vector Se isso é uma matriz ou vetor Elements Elementos Current element: Elemento atual: Edit Matrix Editar Matriz Do not create/modify this matrix/vector Não criar/modificar esta matriz/vetor Create/modify the matrix/vector Criar/modificar esta matriz/vetor Accept the creation/modification of this matrix/vector Aceitar a criação/modificação desta matriz/vetor Name used to reference this variable in expressions Nome usado para referenciar esta variável em expressões Names Nomes Add new name Adicionar novo nome Apply changes to the selected name Aplicar alterações ao nome selecionado Remove the selected name Remover o nome selecionado Abbreviation Abreviação Unicode Unicode Plural Plural Suffix Sufixo Reference Referência Avoid input Evitar entrada Case sensitive Maiúsc. e Minúsculas Completion only Apenas preenchimento Number Bases Bases Numéricas Roman numerals Números romanos BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrair Multiply Multiplicar Divide Dividir Bitwise AND Bit-a-bit AND Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear Limpar Enter two values, of which at most one is a percentage, and the others will be calculated for you. Digite dois valores, dos quais no máximo um é uma percentagem, e os outros serão calculados para você. Percentage Percentagem Calculate Calcular Value 1 Valor 1 2 compared to 1 2 comparado a 1 Change from 1 to 2 Alterar de 1 para 2 Value 2 Valor 2 1 compared to 2 1 comparado a 2 Change from 2 to 1 Alterar de 2 para 1 Plot Plotagem _Save _Gravar Save as png, svg, postscript, eps, latex or fig Gravar como png, svg, postscript, eps, latex ou fig Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada if you want to split matrix in rows instead of columns se desejar dividir a matriz em linhas em vez de colunas X variable Variável X The variable name used in expression O nome da variável usada na expressão Style Estilo Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontilhado Smoothing Suavização Monotonic Monotónica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotónica) Y-axis Eixo Y Primary Primário Secondary Secundário _Remove _Remover Data Dados Minimum x value Valor mínimo x Maximum x value Valor máximo x Sampling rate Taxa de amostragem Step size Tamanho do passo Function Range Faixa de Funções Display grid Exibir grade Display full border Exibir borda completa Minimum y value Valor mínimo y Maximum y value Valor máximo y Logarithmic x scale Escala logarítmica x Logarithmic y scale Escala logarítmica y X-axis label Etiqueta do eixo X Y-axis label Etiqueta do eixo Y Line width Espessura da linha Color display Exibição de cores Color Cores Monochrome Monocromática Legend placement Posição da legenda Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Appearance Aparência Precision Precisão _Recalculate _Recalcular Recalculate expression Recalcular expressão The number of significant digits to display/calculate (simple arithmetics are always calculated exact) O número de dígitos significativos a serem exibidos/calculados (aritmética simples é sempre calculada exatamente) Preferences Preferências Save mode on exit Gravar modo ao sair If the mode of the calculator shall be restored Para que o modo da calculadora seja restaurado Save definitions on exit Gravar definições ao sair If changes to functions, units and variables shall be saved automatically Para que alterações em funções, unidades e variáveis sejam guardadas automaticamente Clear history on exit Limpar histórico ao sair Allow multiple instances Permitir várias instâncias Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Permite que várias instâncias da janela principal do Qalculate! sejam abertas. Observe que apenas o modo, histórico e definições da última instância fechada serão guardados. Notify when a new version is available Notificar quando uma nova versão estiver disponível Use keyboard keys for RPN Usar teclado para RPN Use keyboard operator keys for RPN operations (+-*/^). Usar as teclas de operação no teclado para operações RPN (+-*/^). Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Inserir XOR (⊻) usando circunflexo (^) no teclado (caso contrário, use Ctrl+^). O operador de exponenciação (^) sempre pode ser inserido ao usar Ctrl+*. Time limit for plot: Tempo limite para plotagem: Behavior Comportamento Enable Unicode symbols Ativar símbolos Unicode Disable this if you have problems with some fancy characters Desative isso se você tiver problemas com alguns caracteres extravagantes Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Remember window position Lembrar posição da janela Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Mode Modo Application name + mode Nome do programa + modo Window title Título da janela Default Padrão Number of expression lines Número de linhas de expressão Display expression status Exibir estado da expressão If as-you-type expression status shall be displayed below the expression entry Para que o estado da expressão, conforme você digita, seja exibido abaixo da entrada da expressão Persistent keypad Teclado persistente Look & Feel Aparência Binary two's complement representation Representação binária do complemento para dois If two's complement representation shall be used for negative binary numbers. Para que a representação do complemento para dois seja usada para números binários negativos. Hexadecimal two's complement representation Representação hexadecimal do complemento para dois If two's complement representation shall be used for negative hexadecimal numbers. Para que a representação do complemento para dois seja usada para números hexadecimais negativos. Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais If lower case letters should be used in numbers with non-decimal base Para que letras minúsculas sejam usadas em números com base não-decimal Alternative base prefixes Prefixos base alternativos If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Para que números hexadecimais sejam exibidos com "0x0" e números binários com "0b00" como prefixos Spell out logical operators Soletrar operadores lógicos If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Para que o lógico and/or seja exibido como "&&"/"||" ou "and"/"or" If "e" shall be used instead of "E" in numbers Para que "e" seja usado em vez de "E" em números Use E-notation instead of 10<sup><i>n</i></sup> Usar notação E em vez de 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Usar letras minúsculas "e" (como em 1e10) Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Usar 'j' (em vez de 'i') como símbolo padrão para a unidade imaginária e coloque-o na frente da parte imaginária. Use comma as decimal separator Usar vírgula como separador decimal Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Permite que pontos, '.', sejam usados como separador de milhares em vez de como um sinal decimal alternativo Ignore comma in numbers Ignorar vírgula em números Allow commas, ',', to be used as thousands separator instead of as an function argument separator Permite que vírgulas, ',', sejam usadas como separador de milhares em vez de como separador de argumentos de função Ignore dots in numbers Ignorar pontos em números Digit grouping Agrupamento de dígitos off desligado standard padrão local local Multiplication sign Sinal de multiplicação Division sign Sinal de divisão Copy digit separator Copiar separador de dígitos Deactivate to remove digit separator when copying result Desative para remover o separador de dígitos ao copiar o resultado Numbers & Operators Números e operadores Use binary prefixes for information units Usar prefixos binários para unidades de informações Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Usar prefixos binários, em vez de decimais, como padrão para unidades de informação (ex. bytes). Conversion to local currency Conversão para moeda local Automatically convert to the local currency when optimal unit conversion is activated. Converter automaticamente para a moeda local quando a conversão ideal de unidades estiver ativada. Update exchange rates on start Atualizar taxas de câmbio ao inicializar If current exchange rates shall be downloaded from the internet at program start Para que as taxas de câmbio sejam baixadas da internet no início do programa Exchange rates updates Atualizações das taxas de câmbio Units & Currencies Unidades e moedas Show expression completion suggestions Mostrar sugestões de preenchimento de expressão Search titles and countries Pesquisar títulos e países Minimum characters Caracteres mínimos Popup delay (ms) Atraso da janela pop-up (ms) Completion Preenchimento Status warning color Cor do estado de erro Status error color Cor do estado de erro Custom status font Fonte de estado personalizada If you want to use a font other than the default in the status display below the expression entry Se você desejar usar uma fonte diferente da padrão na exibição de estado abaixo da entrada da expressão Custom expression font Fonte da expressão personalizada If you want to use a font other than the default in the expression entry Se você desejar usar uma fonte diferente da padrão na entrada da expressão Custom result font Fonte do resultado personalizada If you want to use a font other than the default in the result display Se você desejar usar uma fonte diferente da padrão na exibição do resultado Custom keypad font Fonte do teclado personalizada If you want to use a font other than the default in the keypad Se você desejar usar uma fonte diferente da padrão no teclado Custom application font Fonte do programa personalizada If you want to use a font other than the default for the whole application Se você desejar usar uma fonte diferente da padrão em todo o programa Text color Cor do texto Fonts & Colors Fontes e cores Other: Outra: Bijective base-26 Base bijetiva-26 <b>Result Base</b> <b>Resultado da Base</b> <b>Expression Base</b> <b>Base de Expressão</b> New Keyboard Shortcut Novo atalho de teclado Edit Variable Editar Variável Advanced Avançado Accept the creation/modification of this variable Aceitar a criação/modificação desta variável x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Use x, y e z para o 1º, 2º e 3º argumento da função, respectivamente. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. Isso evita possíveis conflitos com variáveis, funções e unidades. Edit Unit Editar Unidade Do not create/modify this unit Não criar/modificar esta unidade Accept the creation/modification of this unit Aceitar a criação/modificação desta unidade Singular form of this unit's name Forma singular do nome desta unidade Title displayed in menus and in unit manager Título exibido nos menus e no gestor de unidades System Sistema Imperial Imperial US Survey US Survey Hide unit Ocultar unidade If this unit shall be hidden in menus Caso a unidade esteja oculta nos menus Class Classe Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s) Unidade(s) base Exponent Expoente Exponent of the base unit Exponent of the base unit Relation Relação Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número. Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273.15" para a relação entre graus Celsius e Kelvin). Relation is exact Relação é exata If the relation is precise Se a relação é precisa Inverse relation Relação inversa Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Decide com quais unidades a unidade base é mesclada se existirem várias opções. - A unidade original não será mesclada com unidades de menor prioridade. - Um valor mais baixo significa prioridade mais alta. Priority Prioridade Minimum base unit number Número mínimo da unidade base Use with prefixes by default Use com prefixos por padrão Create a new unit Criar uma nova unidade Edit the selected unit Editar a unidade selecionada Insert the selected unit into the expression entry Inserir a unidade selecionada na entrada da expressão C_onvert C_onverter Convert the result to the selected unit Converter o resultado na unidade selecionada Delete the selected unit Eliminar a unidade selecionada (De)activate the selected unit Desativar a unidade selecionada _Unit _Unidade Convert between units Converter entre unidades = = Conver_sion Conver_são Converted value Valor convertido Value to convert from Valor para converter Type anywhere Digitar em qualquer lugar Edit Unknown Variable Editar Variável Desconhecida Do not create/modify this unknown variable Não criar/modificar esta variável desconhecida Accept the creation/modification of this unknown variable Aceitar a criação/modificação desta variável desconhecida Name used to reference this unknown variable in expressions Nome usado para referenciar esta variável desconhecida em expressões Use custom assumptions Usar suposições personalizadas Type Tipo Real Number Número real Rational Number Número racional Sign Sinal The category this unknown variable belongs to A categoria à qual essa variável pertence Value of this variable (expression) Valor desta variável (expressão) value is exact valor é exato If the value is precise Se o valor for preciso The category this variable belongs to A categoria à qual essa variável pretence Create a new variable Criar uma nova variável Edit the selected variable Editar a variável selecionada Insert the selected variable into the expression entry Insira a variável selecionada na entrada da expressão Delete the selected variable Eliminar a variável selecionada (De)activate the selected variable Desativar a variável selecionada E_xport E_xportar _Variable _Variável Start a new instance of the application Iniciar uma nova instância do programa Display the application version Exibir a versão do programa Specify the window title Especifica o título da janela TITLE TITLE Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. ans ans Last Answer Última resposta answer resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Failed to load global definitions! Falha ao carregar definições globais! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Todas By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %s é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão guardadas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? c-format Right-click/long press: %s Botão direito/pressionar e segurar: %s c-format Right-click: %s Botão direito: %s c-format Middle-click: %s Botão do meio: %s c-format Cycle through previous expression Percorrer pela expressão anterior Move cursor left or right Mover cursor para esquerda ou direita Move cursor to beginning or end Mover cursor para o início ou fim Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Decimal point Ponto decimal Raise (Ctrl+*) Aumentar (Ctrl+*) Add Adicionar Backspace Backspace Previous result (static) Resultado anterior (estático) Calculate expression Calcular expressão Set unknowns Definir incógnitos more Show further items in a submenu mais Logical AND Lógico AND Logical OR Lógico OR Logical NOT Lógico NOT Toggle Result Base Alternar base de resultados Open menu with stored variables Abrir menu com variáveis armazenadas Index Ã�ndice Calculate expression and add to stack Calcular expressão e adicionar à pilha Flag Bandeira Matrices Matrizes Gregorian Gregoriano Revised Julian (Milanković) Juliano revisado (Milanković) Julian Juliano Islamic (Hijri) Islâmico (Hijri) Hebrew Hebreu Chinese Chinês Persian (Solar Hijri) Persa (Hijri Solar) Coptic Cóptico Ethiopian Etíope Indian (National) Indiano (Nacional) Action Ação Key combination Combinação de teclas Raise Aumentar History Answer Value Valor da resposta do histórico History Index(es) Ã�ndice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. c-format expression expressão History Parsed Expression Expressão analisada historicamente Set Window Title Definir título da janela Failed to open %s. %s Falha ao abrir %s. %s c-format Could not display help for Qalculate!. Não foi possível exibir a ajuda do Qalculate!. Could not display help for Qalculate!. %s Não foi possível exibir a ajuda do Qalculate!. %s c-format approx. aprox. Stop process Parar processo Clear expression Limpar expressão EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Deseja atualizar as taxas de câmbio agora? It has been %s day since the exchange rates last were updated. Faz %s dia desde a última atualização das taxas de câmbio. Faz %s dias desde a última atualização das taxas de câmbio. c-format It has been %s days since the exchange rates last were updated. Do not ask again Não perguntar novamente It took too long to generate the plot data. Demorou muito para gerar os dados da plotagem. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Demorou muito para gerar os dados da plotagem. Diminua a taxa de amostragem ou aumente o limite de tempo nas preferências. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Quando erros, avisos e outras informações são geradas durante o cálculo, o ícone à direita da entrada da expressão é alterado para exibir isso. Ao segurar o ponteiro do mouse ou clicar no ícone, a mensagem será mostrada. Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %s Falha ao executar o script de atualização. %s c-format Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %s is available at %s. Do you wish to update to version %s. Uma nova versão do %s está disponível em %s. Deseja atualizar para a versão %s. c-format A new version of %s is available. You can get version %s at %s. Uma nova versão do %s está disponível. Você pode obter a versão %s em %s. c-format Too many arguments for %s(). Argumentos em excesso para %s(). c-format argument argumento Uncategorized Sem categoria hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal time hora bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar angle ângulo phasor fasor optimal ideal base base mixed mesclado fraction fração factors fatores partial fraction fração parcial factorize fatorar expand expandir hexadecimal number número hexadecimal octal number número octal decimal number número decimal duodecimal number número duodecimal binary number número binário roman numerals numerais romanos bijective base-26 base bijetiva-26 sexagesimal number número sexagesimal 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time format formato de hora number bases bases numéricas optimal unit unidade ideal base units unidades de base mixed units unidades mescladas expanded partial fractions frações parciais expandidas complex rectangular form forma retangular complexa complex exponential form forma exponencial complexa complex polar form forma polar complexa complex cis form forma cis complexa complex angle notation notação complexa de ângulo complex phasor notation notação complexa de fasor UTC time zone Fuso horário UTC number base %s número base %s c-format Inactive Inativo Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %s para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. c-format Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default, in description padrão: Requirement Requerimento key indicating that the property is a data set key chave Acti_vate Ati_var a previous result um resultado anterior matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Variable does not exist anymore. A variável não existe mais. Data Retrieval Function Função de Recuperação de Dados Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Insert unit Inserir unidade Insert text Inserir texto Insert date Inserir data Insert vector Inserir vetor Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert to unit (entry) Converter em unidade (entrada) Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: eliminar registo RPN: clear stack RPN: limpar pilha Load meta mode Carregar modo meta Set expression base Definir base de expressão Set result base Definir base de resultados Toggle exact mode Alternar modo exato Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Toggle simple fractions Alternar frações simples Toggle mixed fractions Alternar frações mescladas Toggle scientific notation Alternar notação científica Toggle simple notation Alternar notação simples Toggle RPN mode Alternar modo RPN Toggle calculate as you type Alternar para calcular ao digitar Toggle programming keypad Alternar teclado de programação Show keypad Mostrar teclado Show history Mostrar histórico Search history Pesquisar no histórico Show conversion Mostrar conversão Show RPN stack Mostrar pilha RPN Manage variables Gerenciar variáveis Manage functions Gerenciar funções Manage data sets Gerenciar conjuntos de dados New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de percentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Save result image Gravar imagem do resultado Help Ajuda Quit Sair Prefixes Prefixos No Prefix Nenhum prefixo Optimal Prefix Prefixo ideal Prefix Prefixo Complex angle/phasor notation Notação completa de ângulo/fasor Number bases Bases numéricas Base units Unidades base Binary number Número binário Calendars Calendários Complex cis form Forma cis complexa Decimal number Número decimal Duodecimal number Número duodecimal Complex exponential form Forma exponencial complexa Factors Fatores 16-bit floating point binary format Formato binário de ponto flutuante de 16-bit 32-bit floating point binary format Formato binário de ponto flutuante de 32-bit 64-bit floating point binary format Formato binário de ponto flutuante de 64-bit 80-bit (x86) floating point binary format Formato binário de ponto flutuante de 80-bit (x86) 128-bit floating point binary format Formato binário de ponto flutuante de 128-bit Hexadecimal number Número hexadecimal Mixed units Unidades mistas Octal number Número octal Optimal units Unidades ideais Expanded partial fractions Frações parciais expandidas Complex polar form Forma polar complexa Complex rectangular form Forma retangular complexa Sexagesimal number Número sexagesimal and e or ou undefined indefinido result is too long see history resultado é muito longo ver histórico calculation was aborted cálculo abortado RPN Register Moved Registro RPN Movido RPN Operation Operação RPN Processing… Processando… result processing was aborted processamento de resultado abortado Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Calculating… Calculando… Converting… Convertendo… Fetching exchange rates. Buscando taxas de câmbio. Time zone parsing failed. Falha na análise do fuso horário. Keep open Manter aberto Enter RPN Enter (calculate and add to stack) Enter C_alculate C_alcular Apply to Stack Aplicar à pilha Argument Argumento True Verdadeiro False Falso Info Informação Edit Unit (global) Editar unidade (global) New Unit Nova unidade Empty name field. Campo de nome vazio. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Base unit does not exist. A unidade base não existe. Edit Function (global) Editar Função (global) New Function Nova Função Yes Sim No Não Empty expression field. Campo de expressão vazio. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Unit does not exist A unidade não existe Edit Unknown Variable (global) Editar Variável Desconhecida (global) New Unknown Variable Nova variável desconhecida An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable (global) Editar Variáveis (global) New Variable Nova Variável Empty value field. Campo de valor vazio. Edit Vector Editar Vetor Edit Vector (global) Editar Vetor (global) New Vector Novo Vetor Edit Matrix (global) Editar Matriz (global) New Matrix Nova Matriz Vector Result Resultado do Vetor Matrix Result Resultado da Matriz New Data Object Novo Objeto de Dados text texto approximate aproximado Edit Data Set (global) Editar Conjunto de Dados (global) New Data Set Novo conjunto de dados info info Property Propriedade No file name entered. Nenhum nome de ficheiro digitado. No delimiter selected. Nenhum delimitador selecionado. Could not import from file %s Não foi possível importar do ficheiro %s c-format No variable name entered. Nenhum nome de variável digitado. No known variable with entered name found. Nenhuma variável conhecida com o nome digitado encontrada. Could not export to file %s Não foi possível exportar para o ficheiro %s c-format My Variables Minhas Variáveis Couldn't write definitions Não foi possível gravar definições Preset Predefinição Abort Abortar Undo Desfazer Redo Refazer Completion Mode Modo de preenchimento Limited strict completion Preenchimento rigoroso limitado Strict completion Preenchimento rigoroso Limited full completion Preenchimento total limitado Full completion Preenchimento total No completion Sem preenchimento Save Mode Gravar modo Preset mode cannot be overwritten. O modo predefinido não pode ser substituído. Delete Mode Eliminar modo Couldn't write preferences to %s Não foi possível gravar preferências em %s c-format never nunca ask perguntar %i day %i dia %i dias c-format %i days Copied Result was copied Copiado log10 function not found. função log10 não encontrada. Search Pesquisar _Search _Pesquisar Remove Bookmark Remover marcador Add Bookmark Adicionar marcador A bookmark with the selected name already exists. Do you want to overwrite it? Um marcador com o nome selecionado já existe. Você deseja sobrescrevê-lo? No items found Nenhum item encontrado Select date Selecionar data Rectangular form Forma retangular Exponential form Forma exponencial Polar form Forma polar Angle/phasor notation Notação de ângulo/fasor Optimal unit Unidade ideal Optimal prefix Prefixo ideal All functions Todas as funções All variables Todas as variáveis Select definitions file Selecionar ficheiro de definições _Import _Importar Could not copy %s to %s. Não foi possível copiar %s para %s. c-format Could not read %s. Não foi possível ler %s. c-format Could not copy file to %s. Não foi possível copiar o ficheiro para %s. c-format Unsupported base. Base não suportada. The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %s. Falha na conversão do calendário para: %s. c-format Gnuplot was not found. Gnuplot não encontrado. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. c-format Select file to save PNG image to Selecione o ficheiro para gravar a imagem PNG Allowed File Types Tipos de ficheiro permitidos All Files Todos os ficheiros Cannot delete unit as it is needed by other units. do not delete units that are used by other units Não é possível eliminar a unidade, pois ela é necessária para outras unidades. none nenhum result is too long resultado é muito longo translator-credits Fúlvio Alves <fga.fulvio@gmail.com> Mode not found. Modo não encontrado. Elements (in horizontal order) Elementos (em ordem horizontal) Select file to import Selecionar ficheiro para importar _Open _Abrir Select file to export to Selecionar o ficheiro para o qual exportar A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Existe um objeto conflitante com o mesmo nome. Se você continuar e gravar as alterações, o objeto conflitante será substituído ou desativado. Você quer continuar? Set key combination Definir combinação de teclas Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pressione a combinação de teclas que deseja usar para a ação (pressione Escape para cancelar). No keys Sem teclas Empty value. Valor vazio. Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. The key combination is already in use. Do you wish to replace the current action? A combinação de teclas já está em uso. Deseja substituir a ação atual? Select file to export Selecionar ficheiro para exportar Empty expression. Expressão vazia. Empty x variable. Variável x vazia. Element Data Dados do elemento Classification Classificação Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatómico Diatomic Non-Metal Não-metal diatómico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas No unknowns in result. Não há incógnitas no resultado. Set Unknowns Definir incógnitas Copy result to clipboard Copiar resultado x x If a matrix or vectors shall be generated from the contents of the file Se uma matriz ou vetores devem ser gerados a partir do conteúdo do ficheiro Use dark theme Usar tema escuro Add the two top values Keypad Adicionar os dois principais valores u Manage units button u to Button for convert to operator em Add Keypad Adicionar Base Unit Unidade base Alias Alias Composite Unit Unidade composta Fonts Fontes Chain Calculation Cálculo de intervalo <b>Name</b> <b>Nome</b> <b>Type</b> <b>Tipo</b> <b>Relation</b> <b>Relação</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i segundos c-format Ent Ent Defaults Padrões Customize Buttons Fonte de estado personalizada Names details Detalhes dos nomes Rational number form Forma do número racional Decimal fractions Frações decimais Exact decimal fractions Frações decimais exatas Simple fractions Frações simples Mixed fractions Frações mistas ArgumentEditDialog Name: Nome: Type: Tipo: Free Livre Number Número Integer Inteiro Symbol Símbolo Text Texto Date Data Vector Vetor Matrix Matriz Boolean Boleano Angle Ângulo Object Objeto Function Função Unit Unidade Variable Variável File Ficheiro Enable rules and type test Ativar o teste de regras e tipo Custom condition: Condição personalizada: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Por exemplo, se o argumento for uma matriz que deve ter igual número de linhas e colunas: rows(\x) = columns(\x) Allow matrix Permitir matriz Forbid zero Proibir zero Handle vector Trabalhar com vetor Calculate function for each separate element in vector. Calcular a função para cada elemento separado no vetor. Min Mín Include equals Incluir iguais Max Máx CSVDialog Import CSV File Importar ficheiro CSV Export CSV File Exportar ficheiro CSV Current result Resultado atual Matrix/vector variable: Variável matriz/vetor: File: Ficheiro: Import as Importar como matrix matriz vectors vetores Name: Nome: First row: Primeira linha: Includes headings Incluir cabeçalhos Delimiter: Delimitador: Comma Vírgula Tabulator Tabulador Semicolon Ponto-e-vírgula Space Espaço Other Outro Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Error Erro Could not import from file %1 Não foi possível importar do ficheiro %1 No matrix or vector variable with the entered name was found. Não foi encontrada nenhuma variável matriz ou vetorial com o nome introduzido. Could not export to file %1 Não foi possível exportar para o ficheiro %1 CalendarConversionDialog Calendar Conversion Conversão de calendário Gregorian Gregoriano Hebrew Hebreu Islamic (Hijri) Islâmico (Hijri) Persian (Solar Hijri) Persa (Hijri Solar) Indian (National) Indiano (Nacional) Chinese Chinês Julian Juliano Revised Julian (Milanković) Juliano revisado (Milanković) Coptic Cóptico Ethiopian Etíope Error Erro The selected Chinese year does not exist. O ano chinês selecionado não existe. Conversion to Gregorian calendar failed. A conversão para o calendário gregoriano falhou. Calendar conversion failed for: %1. Falha na conversão do calendário para: %1. DataObjectEditDialog %1: %1: Default Padrão Approximate Aproximado Exact Exato Edit Data Object Editar Objeto de Dados New Data Object Novo Objeto de Dados DataPropertyEditDialog Name: Nome: Title: Título: Descriptive name: Nome descritivo: Description: Descrição: Value type: Tipo de valor: Expression Expressão Number Número Text Texto Unit expression: Expressão de unidade: Use as key Usar como chave Case sensitive value Valor sensível a maiúsculas e minúsculas Approximate value Valor aproximado Value uses brackets Valor usa parênteses Hide Ocultar Edit Data Property Editar propriedades de dados DataSetEditDialog General Geral Properties Propriedades Function Função Title: Título: Descriptive name: Nome descritivo: Data file: Ficheiro de dados: Description: Descrição: Copyright: Direitos de autor: Title Título Name Nome Type Tipo Add Adicionar Edit Editar Remove Remover Name: Nome: Object argument name: Nome do argumento do objeto: Property argument name: Nome do argumento da propriedade: Default property: Propriedade padrão: text texto approximate aproximado number número expression expressão key chave Question Questão A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja substituir a função? Data Sets Conjuntos de dados Object Objeto Property Propriedade Edit Data Set Editar conjunto de dados New Data Set Novo conjunto de dados DataSetsDialog Data Sets Conjuntos de dados Data sets: Conjuntos de dados: New… Novo… Edit… Editar… Delete Eliminar Objects: Objetos: Data set description: Descrição do conjunto de dados: Object attributes: Atributos do objeto: Properties Propriedades key chave Data Retrieval Function Função de recuperação de dados argument argumento ExpressionEdit matrix matriz vector vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero boolean boleano integer inteiro rational racional real real complex complexo number número (not matrix) (não matriz) unknown desconhecido default assumptions suposições padrão Prefix: Prefixo: Complex Angle/Phasor Notation Notação complexa de ângulo/fasor Base units Unidades base Number Base Base numérica Binary-Coded Decimal Codificação binária decimal Bijective Base-26 Base bijetiva-26 Binary Number Número binário Calendars Calendários Complex cis Form Forma cis complexa Decimal Number Número decimal Duodecimal Number Número duodecimal Complex Exponential Form Forma exponencial complexa Factors Fatores 16-bit Floating Point Binary Format Formato binário de ponto flutuante de 16-bit 32-bit Floating Point Binary Format Formato binário de ponto flutuante de 32-bit 64-bit Floating Point Binary Format Formato binário de ponto flutuante de 64-bit 80-bit (x86) Floating Point Binary Format Formato binário de ponto flutuante de 80-bit (x86) 128-bit Floating Point Binary Format Formato binário de ponto flutuante de 128-bit Fraction Fração Decimal Fraction Fração decimal Hexadecimal Number Número hexadecimal Latitude Latitude Longitude Longitude Mixed Units Unidades mistas Octal Number Número octal Optimal Unit Unidade ideal Optimal Prefix Prefixo ideal Expanded Partial Fractions Frações parciais expandidas Complex Polar Form Forma polar complexa Complex Rectangular Form Forma retangular complexa Roman Numerals Números romanos Sexagesimal Number Número sexagesimal Time Format Formato da hora Unicode Unicode UTC Time Zone Fuso horário UTC Scientific Notation Notação científica Simple Notation Notação simples Custom Personalizado Undo Desfazer Redo Refazer Cut Cortar Copy Copiar Paste Colar Delete Eliminar Calculate Selection Calcular seleção Insert Date… Inserir Data… Insert Matrix… Inserir Matriz… Select All Selecionar tudo Clear Limpar Clear History Limpar histórico Completion Preenchimento No completion Sem preenchimento Limited strict completion Preenchimento rigoroso limitado Strict completion Preenchimento estrita Limited full completion Preenchimento total limitado Full completion Preenchimento total Delayed completion Preenchimento atrasado Expression Status Estado da expressão Off Desligado In history list Na lista do histórico In expression field No campo de expressão In status bar With delay Com atraso With adaptive delay Sem atraso adaptativo Without delay Sem atraso Automatically calculate selection Calcular automaticamente a seleção Use input method Use o método de entrada Matrix Matriz Too many arguments for %1(). Argumentos em excesso para %1(). argument argumento %1: %1: comment comentário MC (memory clear) MC(limpar memória) MS (memory store) MS (armazenar memória) M+ (memory plus) M+ (mais memória) M− (memory minus) M− (menos memória) factorize fatorar expand expandir hexadecimal hexadecimal hexadecimal number número hexadecimal octal octal octal number número octal decimal decimal decimal number número decimal duodecimal duodecimal duodecimal number número duodecimal binary binário binary number número binário roman romanos roman numerals numerais romanos bijective bijetivo bijective base-26 base bijetiva-26 binary-coded decimal codificação binária decimal sexagesimal sexagesimal sexagesimal number número sexagesimal latitude latitude longitude longitude 32-bit floating point ponto flutuante de 32-bit 64-bit floating point ponto flutuante de 64-bit 16-bit floating point ponto flutuante de 16-bit 80-bit (x86) floating point ponto flutuante de 80-bit (x86) 128-bit floating point ponto flutuante de 128-bit time hora time format formato de hora scientific científica scientific notation notação científica engineering engenharia engineering notation notação engenharia simple simples simple notation notação simples bases bases number bases bases numéricas calendars calendários optimal ideal optimal unit unidade ideal prefix prefixo optimal prefix prefixo ideal base base base units unidades de base mixed mesclado mixed units unidades mescladas decimals decimais decimal fraction fração decimal fraction fração factors fatores Engineering Notation Notação engenharia base base units base partial fraction fração parcial expanded partial fractions frações parciais expandidas rectangular retangular cartesian cartesiano complex rectangular form forma retangular complexa exponential exponencial complex exponential form forma exponencial complexa polar polar complex polar form forma polar complexa complex cis form forma cis complexa angle ângulo complex angle notation notação complexa de ângulo phasor fasor complex phasor notation notação complexa de fasor UTC time zone fuso horário UTC base number base base number base %1 número base %1 Data object Onjeto de dados FPConversionDialog Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Format Formato 16-bit (half precision) 16-bits (precisão média) 32-bit (single precision) 32-bits (precisão única) 64-bit (double precision) 64-bits (precisão dupla) 80-bit (x86 extended format) 80-bit (formato estendido x86) 128-bit (quadruple precision) 128-bit (precisão quádrupla) Microchip 24-bit Microchip 24-bits Microchip 32-bit Microchip 32-bits Value Valor Decimal value Valor decimal Binary representation Representação binária Hexadecimal representation Representação hexadecimal Floating point value Valor do ponto flutuante Conversion error Erro de conversão FunctionEditDialog Required Obrigatório Details Detalhes Description Descrição Name: Nome: Expression: Expressão: Argument references: Referência de argumento: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y e z (por exemplo "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Usar x, y e z (por exemplo, "(x+y)/2"), ou \x, \y, \z, \a, \b, … (por exemplo, "(\x+\y)/2") Category: Categoria: Descriptive name: Nome descritivo: Hide function Ocultar função Example: Exemplo: Description: Descrição: Condition: Condição: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Condição que deve ser verdadeira para a função (por exemplo, se o segundo argumento deve ser maior que o primeiro: "\y > \x") Sub-functions: Subfunções: Expression Expressão Precalculate Pré-calcular Reference Referência Add Adicionar Edit Editar Remove Remover Arguments: Argumentos: Name Nome Type Tipo Warning Aviso Conversion (using "to") is not supported in functions. A conversão (usando "para") não é suportada em funções. Question Questão A function with the same name already exists. Do you want to overwrite the function? Uma função com o mesmo nome já existe. Deseja sobrescrever a função? Edit Function Editar Função New Function Nova Função FunctionsDialog Functions Funções Category Categoria Function Função New… Novo… Edit… Editar… Deactivate Desativar Delete Eliminar Calculate… Calcular… Apply Aplicar Insert Inserir Favorite Favorito argument argumento Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Recupera dados do conjunto de dados %1 para um determinado objeto e propriedade. Se "info" for digitado como propriedade, uma janela de diálogo será exibida com todas as propriedades do objeto. Example: Exemplo: Arguments Argumentos optional optional argument opcional default: argument default padrão: Requirement: Required condition for function Requerimento: Properties Propriedades %1: %1: key indicating that the property is a data set key chave Activate Ativar All All functions Todas Uncategorized Sem categoria User functions Funções de utilizador Favorites Favoritos Inactive Inativo HistoryView Insert Value Inserir valor Insert Text Inserir texto Copy Copiar Copy Formatted Text Copiar texto formatado Copy unformatted ASCII Copiar ASCII não formatado Select All Selecionar tudo Search… Procurar… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e pressione a tecla Enter. Search by Date… Pesquisar por data… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática acima, ex. "5 + 2 / 3" e prima a tecla Enter. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Digite a expressão matemática abaixo, ex. "5 + 2 / 3" e prima a tecla Enter. Exchange rate source(s): Fonte da taxa de câmbio: Fontes da taxa de câmbio: updated %1 atualizado %1 atualizados %1 Comment Comentário Protect Proteger Add Comment… Adicionar comentário… Move to Top Mover para o topo Remove Remover Clear Limpar Edit Comment… Editar comentário… Text: Texto: Search Pesquisar KeypadButton <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar e segurar</i>: %1 <i>Right-click</i>: %1 <i>Botão direito</i>: %1 <i>Long press</i>: %1 <i>Pressionar e segurar</i>: %1 Open menu Abrir menu <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 KeypadWidget Memory store Armazenamento de memória Memory clear Limpar memória Memory recall Recuperação da memória Memory add Adicionar memória Memory subtract Subtração de memória STO Standard calculator button. Do not use more than three characters. STO Store Armazenar New function Nova função sin sin cos cos tan tan Exponentiation Exponenciação Percent or remainder Por cento ou resto Uncertainty/interval Incerteza/intervalo Relative error Erro relativo Interval Intervalo Move cursor left Mover cursor para esquerda Move cursor to start Mover cursor para o início Move cursor right Mover cursor para direita Move cursor to end Mover cursor para fim Logical AND Lógico AND Logical OR Lógico OR Bitwise Exclusive OR OR exclusivo bit-a-bit Logical NOT Lógico NOT Bitwise Left Shift Deslocamento à esquerda bit-a-bit Bitwise Right Shift Deslocamento à direita bit-a-bit cmp cmp rot rot a→1 a→1 Expand partial fractions Expandir frações parciais DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. C Enable units in physical constants Ativar unidades em constantes físicas All constants Todas as constantes Percentage Calculation Tool Ferramenta de cálculo de percentagem more mais All units Todas as unidades All variables Todas as variáveis Action Ação Interval Display Exibição de intervalo Adaptive Adaptativa Significant digits Dígitos significativos Plus/minus Mais/menos Relative Relativo Concise Conciso Interval Calculation Cálculo de intervalo Variance formula Fórmula de desvio Interval arithmetic Aritmética de intervalos Allow concise uncertainty input Permitir a introdução concisa de incertezas Complex number form Forma de número complexo Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Type Assumptions type Tipo Sign Assumptions sign Sinal Default assumptions Suposições padrão Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Factorize Fatorar Expand Expandir Add column Adicionar coluna Add row Adicionar linha Remove column Remover coluna Remove row Remover linha Left parenthesis Parêntese esquerdo Left vector bracket Parêntese esquerdo do vetor Right parenthesis Parêntese direito Right vector bracket Parêntese direito do vetor Smart parentheses Parênteses inteligentes Vector brackets Colchetes para vetores Argument separator Separador de argumentos Blank space Espaço em branco New line Nova linha Decimal point Ponto decimal Previous result (static) Resultado anterior (estático) Multiplication Multiplicação Button Action Ação do botão Label: Etiqueta: Action: Ação: None Nenhum Value: Valor: Bitwise AND Bitwise AND Bitwise Shift Bitwise Shift Delete Eliminar Backspace Backspace Addition Adição Plus Mais Subtraction Subtração Minus Menos Division Divisão Bitwise OR Bit-a-bit OR Bitwise NOT Bit-a-bit NOT Clear expression Limpar expressão Calculate expression Calcular expressão NamesEditDialog Name Nome Abbreviation Abreviação Plural Plural Reference Referência Avoid input Evitar entrada Unicode Unicode Suffix Sufixo Case sensitive Maiúsc. e Minúsculas Completion only Apenas preenchimento Add Adicionar Edit Editar Remove Remover Warning Aviso Illegal name Nome ilegal A function with the same name already exists. Uma função com o mesmo nome já existe. A unit or variable with the same name already exists. Uma unidade ou variável com o mesmo nome já existe. PercentageCalculationDialog Percentage Percentagem Value 1 Valor 1 Value 2 Valor 2 Change from 1 to 2 Alterar de 1 para 2 Change from 2 to 1 Alterar de 2 para 1 2 compared to 1 2 comparado a 1 1 compared to 2 1 comparado a 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Introduza dois valores, dos quais no máximo um é uma percentagem, e os outros serão calculados para si. Clear Limpar PeriodicTableDialog Periodic Table Tabela periódica Element Data Dados do elemento Alkali Metal Metal alcalino Alkaline-Earth Metal Metal alcalino-terroso Lanthanide Lantanídeo Actinide Actinídeo Transition Metal Metal de transição Metal Metal Metalloid Metaloide Polyatomic Non-Metal Não-metal poliatómico Diatomic Non-Metal Não-metal diatómico Noble Gas Gás nobre Unknown chemical properties Propriedades químicas desconhecidas Unknown Desconhecido %1: %1: PlotDialog Plot Plotagem Data Dados Title: Título: Expression: Expressão: Function Função Vector/matrix Vetor/matriz Paired matrix Matriz emparelhada Rows Linhas X variable: Variável X: Style: Estilo: Line Linha Points Pontos Line with points Linha com pontos Boxes/bars Caixas/barras Histogram Histograma Steps Passos Candlesticks Castiçais Dots Pontos Polar Polar Smoothing: Suavização: None Nenhum Monotonic Monotónica Natural cubic splines Splines cúbicos naturais Bezier Bézier Bezier (monotonic) Bézier (monotónica) Y-axis: Eixo Y: Primary Primário Secondary Secundário Add Adicionar Apply Aplicar Remove Remover Title Título Expression Expressão Function Range Faixa de Funções Minimum x value: Valor mínimo x: Maximum x value: Valor máximo x: Sampling rate: Taxa de amostragem: Step size: Tamanho do passo: Show real and imaginary parts Mostrar partes reais e imaginárias Appearance Aparência Display grid Exibir grade Display full border Exibir borda completa Minimum y value: Valor mínimo y: Maximum y value: Valor máximo y: Logarithmic x scale: Escala logarítmica x: Logarithmic y scale: Escala logarítmica y: X-axis label: Etiqueta do eixo X: Y-axis label: Etiqueta do eixo Y: Line width: Espessura da linha: Legend placement: Posição da legenda: Top-left Superior esquerdo Top-right Superior direito Bottom-left Inferior esquerdo Bottom-right Inferior direito Below Abaixo Outside Fora Calculating… Calculando… Cancel Cancelar Processing… Processando… PreferencesDialog Look && Feel Aparência Numbers && Operators Números e operadores Units && Currencies Unidades e moedas Parsing && Calculation Análise e cálculo Ignore system language (requires restart) Ignorar o idioma do sistema (requer reinício) Allow multiple instances Permitir várias instâncias Clear history on exit Limpar histórico ao sair Close application with Escape key Fechar a aplicação com a tecla Esc Keep above other windows Manter acima das outras janelas Window title: Título da janela: Application name Nome do programa Result Resultado Application name + result Nome do programa + resultado Workspace Ã�rea de trabalho Application name + workspace Nome da aplicação + área de trabalho Style: Estilo: Default (requires restart) Default style Padrão (requer reinício) Dark mode Modo escuro Colorize result Colorir resultado Custom result font Fonte do resultado personalizada Custom expression font Fonte da expressão personalizada Custom keypad font Fonte do teclado personalizada Custom application font Fonte do programa personalizada Custom result font: Fonte do resultado personalizada: Custom expression font: Fonte da expressão personalizada: Custom status bar font: Custom keypad font: Fonte do teclado personalizada: Custom application font: Fonte do programa personalizada: Display expression status Exibir estado da expressão Delay: Atraso: Expression after calculation: Expressão após cálculo: Keep expression Manter expressão Clear expression Limpar expressão Replace with result Substituir pelo resultado Replace with result if shorter Substituir pelo resultado se for mais curto Use keyboard keys for RPN Usar teclado para RPN Parsing mode: Modo de análise: Adaptive Adaptativa Conventional Convencional Implicit multiplication first Primeiro multiplicação implícita Chain Cadeia RPN RPN Read precision Ler precisão Limit implicit multiplication Limitar multiplicação implícita Interval calculation: Cálculo de intervalo: Variance formula Interval arithmetic Factorize result Fatorar resultado Binary two's complement representation Representação binária do complemento para dois Hexadecimal two's complement representation Representação hexadecimal do complemento para dois Use lower case letters in non-decimal numbers Usar letras minúsculas em números não-decimais Use special duodecimal symbols Usar símbolos duodecimais especiais Spell out logical operators Soletrar operadores lógicos Use E-notation instead of 10^x Usar notação E em vez de 10^x Preferences Preferências ms milliseconds ms Use dot as multiplication sign Usar o ponto como sinal de multiplicação Use Unicode division slash in output Usar a barra de divisão Unicode na saída Use E-notation instead of 10^n Usar notação E em vez de 10^n Use 'j' as imaginary unit Usar 'j' como unidade imaginária Use comma as decimal separator Usar vírgula como separador decimal Ignore comma in numbers Ignorar vírgula em números Ignore dots in numbers Ignorar pontos em números Copy unformatted ASCII by default Copiar ASCII não formatado por padrão Automatically group digits in input Agrupar automaticamente os dígitos na entrada Round halfway numbers away from zero Arredondar números intermediários de zero Round halfway numbers to even Arredondar números até a metade Indicate repeating decimals Indicar decimais repetidos Language: Idioma: Max history lines saved: Máx. de linhas de histórico guardadas: Use caret for bitwise XOR Usar acento circunflexo para XOR bit-a-bit Preserve history height Preservar a altura do histórico Do not change the height of history list when keypad or number bases are show or hidden. Não altere a altura da lista de histórico quando o teclado ou as bases numéricas estiverem à vista ou ocultas. Show status bar Tooltips: Dicas: Show all Mostrar tudo Hide in keypad Ocultar no teclado Hide all Ocultar tudo Disable cursor blinking Desativar o cursor intermitente Format result Resultado do formato Custom history font: Fonte do histórico personalizado: Expression status: Estado da expressão: Place expression field below history Off Desligado In history list Na lista do histórico In expression field No campo de expressão In status bar Status tooltip delay: Atraso da dica do estado: Calculate as you type delay: Calcular à medida que digita o atraso: Adaptive delay Automatically calculate selection Calcular automaticamente a seleção Expression in history: Expressão no histórico: Parsed Analisado Parsed (compact) Entered Introduzido Entered + parsed Introduzido + analisado Entered + parsed (compact) Automatically copy result Copiar automaticamente o resultado Simplified percentage calculation Cálculo simplificado da percentagem Allow concise uncertainty input Permitir a introdução concisa de incertezas Interpret unrecognized symbols as variables Interpretar símbolos não reconhecidos como variáveis Two's complement output: Saída de complemento de dois: Two's complement input: Entrada de complemento de dois: Binary Binário Hexadecimal Hexadecimal Binary bits: Bits binários: Automatic Automática Multiplication sign: Sinal de multiplicação: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Place percent button in number pad Coloque o botão de percentagem no teclado numérico Indicate repeating decimals: Indicar decimais repetidos: Ellipsis Elipse Overline Linha superior Digit grouping: Agrupamento de dígitos: None Nenhum Standard Padrão Local Local Automatically group digits in input (experimental) Agrupar automaticamente os dígitos na entrada (experimental) Interval display: Exibição de intervalo: Significant digits Dígitos Significativos Interval Intervalo Plus/minus Mais/menos Concise Conciso Midpoint Ponto médio Lower Inferior Upper Superior Rounding: Arredondamento: Complex number form: Forma de nùmero complexo: Rectangular Retangular Exponential Exponencial Polar Polar Angle/phasor Ângulo/fasor Enable units Ativar unidades Abbreviate names Abreviar nomes Use binary prefixes for information units Usar prefixos binários para unidades de informações Automatic unit conversion: Conversão automática de unidades: No conversion Sem conversão Base units Unidades base Optimal units Unidades ideais Optimal SI units Unidades ideais SI Convert to mixed units Converter para unidades mistas Automatic unit prefixes: Prefixos automáticos de unidades: Copy unformatted ASCII without units Copiar ASCII não formatado sem unidades Default currency: Fonts Fontes Units Unidades Calculation Cálculo Restart required Reinício necessário Please restart the program for the language change to take effect. Reinicie a aplicação para que a alteração de idioma tenha efeito. Default Padrão Notify when a new version is available Notificar quando uma nova versão estiver disponível Custom Personalizado Round halfway numbers to odd Arredondar números intermediários para ímpares Round halfway numbers toward zero Arredondar números intermediários para zero Round halfway numbers to random Arredondar números intermediários para aleatórios Round halfway numbers up Arredondar os números intermediários para cima Round halfway numbers down Arredondar números intermediários para baixo Round toward zero Arredondar para zero Round away from zero Arredondar do zero Round up Arredondar para cima Round down Arredondar para baixo No prefixes Sem prefixos Prefixes for some units Prefixos para algumas unidades Prefixes also for currencies Prefixos também para moedas Prefixes for all units Prefixos para todas as unidades Enable all SI-prefixes Ativar todos os prefixos SI Enable denominator prefixes Ativar prefixos de denominador Enable units in physical constants Activar unidades em constantes físicas Temperature calculation: Cálculo da temperatura: Absolute Absoluta Relative Relativa Hybrid Híbrido Exchange rates updates: Atualizações das taxas de câmbio: %n day(s) %n dia %n dias days dia dias QApplication Execute expressions and commands from a file Executar expressões e comandos a partir de um ficheiro FILE FICHEIRO Start a new instance of the application Iniciar uma nova instância do programa Specify the window title Especifica o título da janela TITLE TÃ�TULO Update exchange rates Atualizar taxas de câmbio Display the application version Exibir a versão do programa Open workspace Abrir área de trabalho Expression to calculate Expressão para calcular [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Por padrão, apenas uma instância (uma janela principal) de %1 é permitida. Se várias instâncias forem abertas simultaneamente, apenas as definições (variáveis, funções, etc.), modo, preferências e histórico da última janela serão guardadas. Mesmo assim, você deseja alterar o comportamento padrão e permitir várias instâncias simultaneamente? Allow multiple instances? Permitir várias instâncias? %1 is already running. %1 já está em execução. Failed to load global definitions! Falha ao carregar definições globais! answer resposta History Answer Value Valor da resposta do histórico History Index(es) Ã�ndice(s) do histórico History index %s does not exist. O índice do histórico %s não existe. Last Answer Última resposta Answer 2 Resposta 2 Answer 3 Resposta 3 Answer 4 Resposta 4 Answer 5 Resposta 5 Memory Memória Error Erro Couldn't write preferences to %1 Não foi possível gravar preferências em %1 Function not found. Função não encontrada. Variable not found. Variável não encontrada. Unit not found. Unidade não encontrada. Unsupported base. Base não suportada. Unsupported value. Valor não suportado. QalculateQtSettings Update exchange rates? Atualizações das taxas de câmbio? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Faz %n dia desde a última atualização das taxas de câmbio. Pretende atualizar as taxas de câmbio agora? Faz %n dias desde a última atualização das taxas de câmbio. Pretende atualizar as taxas de câmbio agora? Fetching exchange rates. A obter taxas de câmbio. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Contém o resultado do cálculo mais recente. Os vários resultados de uma equação são representados como um vetor. Aceder a soluções separadas utilizando ans(n) (por exemplo, ans(1) para a primeira solução). Fetching exchange rates… A obter taxas de câmbio… Error Erro Warning Aviso Information Informação Path of executable not found. Caminho do executável não encontrado. curl not found. curl não encontrado. Failed to run update script. %1 Falha ao executar o script de atualização. %1 Failed to check for updates. Falha ao verificar por atualizações. No updates found. Nenhuma atualização encontrada. A new version of %1 is available at %2. Do you wish to update to version %3? Uma nova versão do %1 está disponível em %2. Pretende atualizar para a versão %3? A new version of %1 is available. You can get version %3 at %2. Uma nova versão do %1 está disponível. Você pode obter a versão %3 em %2. Download Transferir %1: %2 %1: %2 Insert function Inserir função Insert function (dialog) Inserir função (diálogo) Insert variable Inserir variável Approximate result Resultado aproximado Negate Negar Invert Inverter Insert unit Inserir unidade Insert text Inserir texto Insert operator Inserir operador Insert date Inserir data Insert matrix Inserir matriz Insert smart parentheses Inserir parênteses inteligentes Convert to unit Converter em unidade Convert Converter Convert to optimal unit Converter em unidade ideal Convert to base units Converter em unidades base Convert to optimal prefix Converter em prefixo ideal Convert to number base Converter em número base Factorize result Fatorar resultado Expand result Expandir resultado Expand partial fractions Expandir frações parciais RPN: down RPN: para baixo RPN: up RPN: para cima RPN: swap RPN: trocar RPN: copy RPN: copiar RPN: lastx RPN: lastx RPN: delete register RPN: eliminar registo RPN: clear stack RPN: limpar pilha Set expression base Definir base de expressão Set result base Definir base de resultados Set angle unit to degrees Definir unidade de ângulo em graus Set angle unit to radians Definir unidade de ângulo em radianos Set angle unit to gradians Definir unidade de ângulo em gradianos Active normal display mode Modo de exibição normal ativo Activate normal display mode Ativar o modo de exibição normal Activate scientific display mode Ativar o modo de exibição científica Activate engineering display mode Ativar o modo de exibição de engenharia Activate simple display mode Ativar o modo de exibição simples Toggle precision Alternar precisão Toggle max decimals Alternar decimais máximos Toggle min decimals Alternar decimais mínimos Toggle max/min decimals Alternar decimais máx/mín Toggle RPN mode Alternar modo RPN Show general keypad Mostrar teclado geral Toggle programming keypad Alternar teclado de programação Toggle algebra keypad Alternar teclado de álgebra Toggle custom keypad Alternar teclado personalizado Show/hide keypad Mostrar/ocultar teclado Search history Pesquisar no histórico Clear history Limpar histórico Show variables Mostrar variáveis Show functions Mostrar funções Show units Mostrar unidades Show data sets Mostrar conjuntos de dados Store result Armazenar resultado MC (memory clear) MC (limpar memória) MR (memory recall) MR (recordar memória) MS (memory store) MS (memória de armazenamento) M+ (memory plus) M+ (memória mais) M− (memory minus) M- (memória menos) New variable Nova variável New function Nova função Open plot functions/data Abrir funções/dados de plotagem Open convert number bases Abrir números base convertidos Open floating point conversion Abrir conversão de ponto flutuante Open calender conversion Abrir conversão de calendário Open percentage calculation tool Abrir ferramenta de cálculo de percentagem Open periodic table Abrir tabela periódica Update exchange rates Atualizar taxas de câmbio Copy result Copiar resultado Insert result Inserir resultado Open mode menu Abrir menu de modo Open menu Abrir menu Help Ajuda Quit Sair Toggle chain mode Alternar modo de cadeia Toggle keep above Alternar manter acima Show completion (activate first item) Mostrar preenchimento (ativar o primeiro item) Clear expression Limpar expressão Delete Eliminar Backspace Backspace Home Home End End Right Direita Left Esquerda Up Acima Down Abaixo Undo Desfazer Redo Refazer Calculate expression Calcular expressão Expression history next Histórico de expressões seguinte Expression history previous Histórico de expressões anterior Open functions menu Abrir menu de funções Open units menu Abrir menu de unidades Open variables menu Toggle fraction format in current result Alternar o formato da fração no resultado atual Default Padrão Formatted result Resultado formatado Unformatted ASCII result Resultado ASCII não formatado Unformatted ASCII result without units Resultado ASCII não formatado sem unidades Formatted expression Expressão formatada Unformatted ASCII expression Expressão ASCII não formatada Formatted expression + result Expressão formatada + resultado Unformatted ASCII expression + result Expressão ASCII não formatada + resultado QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Cancelar Close Only used when Qt translation is missing Fechar &Yes Only used when Qt translation is missing &Sim &No Only used when Qt translation is missing &Não &Open Only used when Qt translation is missing &Abrir &Save Only used when Qt translation is missing &Guardar &Select All Only used when Qt translation is missing &Selecionar tudo Look in: Only used when Qt translation is missing Ver em: File &name: Only used when Qt translation is missing &Nome do ficheiro: Files of type: Only used when Qt translation is missing Ficheiros do tipo: QalculateWindow Menu Menu New Novo Function… Função… Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Workspaces Ã�reass de trabalho Open… Abrir… Open default Abrir padrão Save Guardar Save As… Guardar como… Import CSV File… Importar ficheiro CSV… Export CSV File… Exportar ficheiro CSV… Functions Funções Variables and Constants Variáveis e constantes Units Unidades Plot Functions/Data Funções/dados de plotagem Floating Point Conversion (IEEE 754) Conversão de ponto flutuante (IEEE 754) Calendar Conversion Conversão de calendário Update Exchange Rates Atualizar taxas de câmbio Normal Mode Modo normal RPN Mode Modo RPN Chain Mode Modo de cadeia Keyboard Shortcuts Teclas de atalho Preferences Preferências Help Ajuda Report a Bug Reportar um erro Check for Updates Verificar atualizações About %1 Acerca do %1 Quit Sair Mode Modo Mode (%1) Modo (%1) General Display Mode Modo de exibição geral Normal Normal Scientific Científica Engineering Engenharia Simple Simples Angle Unit Unidade de ângulo Radians Radianos Degrees Graus Gradians Grados Approximation Aproximação Automatic Automatic approximation Automática Dual Dual approximation Dupla Exact Exact approximation Exato Approximate Aproximado Assumptions Suposições Type Assumptions type Tipo Number Número Real Real Rational Racional Integer Inteiro Boolean Boleano Sign Assumptions sign Sinal Unknown Unknown assumptions sign Desconhecido Non-zero Diferente de zero Positive Positivo Non-negative Não-negativo Negative Negativo Non-positive Não-positivo Result Base Base de resultados Binary Binário Octal Octal Decimal Decimal Hexadecimal Hexadecimal Other Outro Approximation && Fractions Aproximação e frações Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Formato de hora Roman numerals Números romanos Unicode Unicode Bijective base-26 Base bijetiva-26 Binary-coded decimal (BCD) Codificação binária decimal (BCD) Custom: Number base Personalizada: Expression Base Base de expressão Other: Number base Outra: Precision: Precisão: Min decimals: Decimais mínimos: Max decimals: Decimais máximos: off Max decimals desligado Convert Converter Convert (%1) Converter (%1) Store Armazenar Store (%1) Guardar (%1) Functions (%1) Funções (%1) Keypad Teclado Keypad (%1) Teclado (%1) Number bases Bases numéricas Unit… Unidade… Data Sets Conjuntos de dados Percentage Calculation Tool Ferramenta de cálculo de percentagem Periodic Table Tabela periódica Units (%1) Unidades (%1) Plot Functions/Data (%1) Funções/dados de plotagem (%1) Number Bases (%1) Bases numéricas (%1) Binary: Binário: Octal: Octal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack Pilha RPN Rotate the stack or move the selected register up (%1) Gire a pilha ou mova o registo selecionado para cima (%1) Rotate the stack or move the selected register down (%1) Gire a pilha ou mova o registo selecionado para baixo (%1) Swap the top two values or move the selected value to the top of the stack (%1) Troque os valores superiores ou mova o valor selecionado para o topo da pilha (%1) Copy the selected or top value to the top of the stack (%1) Copie o valor selecionado ou superior para o topo da pilha (%1) Enter the top value from before the last numeric operation (%1) Digite o valor superior antes da última operação numérica (%1) Delete the top or selected value (%1) Eliminar o valor selecionado ou superior (%1) Clear the RPN stack (%1) Limpar a pilha RPN (%1) New Function… Nova função… Favorites Favoritos Recent Recentes User functions Funções de utilizador Open dialog Abrir diálogo Show all functions Mostrar todas as funções User units Unidades de utilizador more mais Prefixes Prefixos Show all units Mostrar todas as unidades User variables Variáveis de utilizador Show all variables Mostrar todas as variáveis Powerful and easy to use calculator Calculadora potente e fácil de usar License: GNU General Public License version 2 or later Licença: GNU General Public License versão 2 ou posterior Error Erro Couldn't write definitions Não foi possível gravar definições hexadecimal hexadecimal octal octal decimal decimal duodecimal duodecimal binary binário roman romanos bijective bijetivo sexagesimal sexagesimal latitude latitude longitude longitude time hora Time zone parsing failed. Falha na análise do fuso horário. bases bases calendars calendários rectangular retangular cartesian cartesiano exponential exponencial polar polar phasor fasor angle ângulo optimal ideal base base mixed mesclado fraction fração factors fatores Show toolbar Mostrar barra de ferrementas Open Settings Folder(s) Abrir a pasta de definições Abrir as pastas de definições Number Pad Teclado numérico Always Show Number Pad Mostrar sempre o teclado numérico EXACT EXACT APPROX APPROX RPN RPN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC VAR FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy Copiar <i>Middle-click</i>: %1 <i>Botão do meio</i>: %1 scientific científica engineering engenharia simple simples prefix prefixo base base units base partial fraction fração parcial base number base base decimals decimais factorize fatorar expand expandir Calculating… Calculando… Cancel Cancelar RPN Operation Operação RPN Factorizing… Fatorando… Expanding partial fractions… Expandindo frações parciais… Expanding… Expandindo… Converting… Convertendo… RPN Register Moved Registro RPN Movido Processing… Processando… Matrix Matriz Unknown variables (e.g. x, y, z) are by default assumed real. Variáveis desconhecidas (por exemplo, x, y, z) são consideradas verdadeiras por padrão. Temperature Calculation Mode Modo de cálculo da temperatura The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). A expressão é ambígua. Selecione o modo de cálculo da temperatura (o modo pode ser alterado mais tarde nas preferências). Absolute Absoluto Relative Relativo Hybrid Híbrido Please select desired variant of the sinc function. Seleccione a variante desejada da função sinc. Unnormalized Não normalizado Normalized Normalizado Interpretation of dots Interpretação dos pontos Interpretation of comma Interpretação de vírgula Please select interpretation of comma (",") (this can later be changed in preferences). Selecione a interpretação de vírgula (",") (isto pode ser alterado mais tarde nas preferências). Please select interpretation of dots (".") (this can later be changed in preferences). Selecione a interpretação dos pontos (".") (isto pode ser alterado mais tarde nas preferências). Both dot and comma as decimal separators Ponto e vírgula como separadores decimais Dot as thousands separator Ponto como separador de milhares Comma as thousands separator Vírgula como separador de milhares Only dot as decimal separator Apenas o ponto como separador decimal Parsing Mode Modo de análise The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). A expressão é ambígua. Selecione a interpretação de expressões com multiplicação implícita (isto pode ser alterado mais tarde nas preferências). Implicit multiplication first Primeiro multiplicação implícita Conventional Convencional Adaptive Adaptativa Percentage Interpretation Interpretação das percentagens Please select interpretation of percentage addition Selecionar a interpretação da percentagem de adição Add percentage of original value Adicionar percentagem do valor original Add percentage multiplied by 1/100 Adicionar percentagem multiplicada por 1/100 Add Action (%1) Adicionar ação (%1) Edit Keyboard Shortcut Editar tecla de atalho New Keyboard Shortcut Nova tecla de atalho Action: Ação: Value: Valor: Set key combination Definir combinação de teclas Press the key combination you wish to use for the action. Pressione a combinação de teclas que deseja usar para a ação. Reserved key combination Combinação de teclas reservada The key combination is already in use. Do you wish to replace the current action (%1)? A combinação de teclas já está em uso. Deseja substituir a ação atual (%1)? Question Questão Add… Adicionar… Edit… Editar… Remove Remover Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) precisa ser instalado separadamente e localizado no caminho de pesquisa do executável para que a plotagem funcione. Example: Example of function usage Exemplo: Enter RPN Enter Enter Calculate Calcular Apply to Stack Aplicar à pilha Insert Inserir Failed to open workspace Falha ao abrir área de trabalho Couldn't save workspace Não foi possível guardar a área de trabalho Save file? Guardar ficheiro? Do you want to save the current workspace? Pretende guardar a área de trabalho atual? Do not ask again Não perguntar novamente Keep open Manter aberto Show Custom Column Mostrar coluna personalizada Value Valor Argument Argumento %1: %1: Approximation and Fractions Aproximação e frações Plot Plotagem General Geral Programming Programação Algebra Ã�lgebra Custom Personalizado None Nenhum Hide Number Pad Ocultar teclado numérico Separate Menu Buttons Botões de menu separados Reset Keypad Position Repor a posição do teclado Icons only Apenas ícones Text only Apenas texto Text beside icons Texto ao lado dos ícones Text under icons Texto por baixo dos ícones <i>Right-click/long press</i>: %1 <i>Botão direito/pressionar</i>: %1 Open menu Abrir menu Number Bases Bases numéricas Conversion operator Operador de conversão Rotate the stack or move the selected register up Rode a pilha ou mova o registo selecionado para cima Rotate the stack or move the selected register down Rode a pilha ou mova o registo selecionado para baixo Swap the top two values or move the selected value to the top of the stack Troque os valores superiores ou mova o valor selecionado para o topo da pilha Delete the top or selected value Eliminar o valor selecionado ou superior Enter the top value from before the last numeric operation Introduza o valor superior antes da última operação numérica Copy the selected or top value to the top of the stack Copie o valor selecionado ou superior para o topo da pilha Clear the RPN stack Limpar a pilha RPN Comma as separator for function arguments and matrix/vector elements Vírgula como separador para argumentos de função e elementos de matriz/vetor Action Ação Key combination Combinação de teclas True Verdadeiro False Falso Info Informação optional optional argument opcional Failed to open %1. %2 Falha ao abrir %1. %2 UnitEditDialog General Geral Relation Relação Name: Nome: Category: Categoria: Descriptive name: Nome descritivo: System: Sistema: Imperial Imperial US Survey US Survey Hide unit Ocultar unidade Description: Descrição: Class: Classe: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. A classe a que esta unidade pertence. As unidades derivadas nomeadas são definidas em relação a uma única outra unidade, com um expoente opcional, enquanto as unidades derivadas (não nomeadas) são definidas por uma expressão de unidade com uma ou várias unidades. Base unit Unidade base Named derived unit Unidade derivada nomeada Derived unit Unidade derivada Base unit(s): Unidade(s) base: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to A classe a que esta unidade pertence. As unidades derivadas nomeadas são definidas em relação a uma única outra unidade, com um expoente opcional, enquanto as unidades derivadas (não nomeadas) são definidas por uma expressão de unidade com uma ou mais unidades Exponent: Expoente: Relation: Relação: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Relação com a unidade base. Para relações lineares, isso deve ser apenas um número.<br><br>Para relações não-lineares, use \x para o fator e \y para o expoente (por exemplo, "\x + 273,15" para a relação entre graus Celsius e Kelvin). Inverse relation: Relação inversa: Specify for non-linear relation, for conversion back to the base unit. Específica para relação não-linear, para converter de volta para a unidade base. Mix with base unit Mesclar com a unidade base Priority: Prioridade: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Exemplo: a prioridade da unidade “handâ€� está definida para 2, enquanto a prioridade de ft (pé) e in (polegada) está definida para 1, o que resulta em “17 in = 1 ft + 5 inâ€�, em vez de “17 in = 1 ft + 1 hand + 1 inâ€�. Minimum base unit number: Número mínimo da unidade base: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Exemplo: o número mínimo da unidade de base yd (jarda) é fixado em 12, o que resulta em “3 × 3 ft = 9 ftâ€� (em vez de “3 ydâ€�) e “4 × 3 ft = 4 ydâ€�. Use with prefixes by default Use com prefixos por padrão Error Erro Base unit does not exist. A unidade base não existe. Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Pretendes substituí-la? A variable or unit with the same name already exists. Do you want to overwrite it? Uma variável ou unidade com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unit Editar unidade New Unit Nova unidade UnitsDialog Units Unidades Category Categoria Unit Unidade New… Novo… Edit… Editar… Deactivate Desativar Delete Eliminar Convert Converter Insert Inserir Favorite Favorito Show hidden units Mostrar unidades ocultas Activate Ativar All All units Todas Uncategorized Sem categoria User units Unidades de utilizador Favorites Favoritos Inactive Inativo UnknownEditDialog Name: Nome: Custom assumptions Suposições personalizadas Type: Tipo: Sign: Sinal: Temporary Temporária Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Unknown Variable Editar Variável Desconhecida New Unknown Variable Nova variável desconhecida VariableEditDialog Name: Nome: Temporary Temporária Value: Valor: Required Obrigatório Description Descrição current result resultado atual Category: Categoria: Descriptive name: Nome descritivo: Hide variable Ocultar variável Description: Descrição: Question Questão A unit or variable with the same name already exists. Do you want to overwrite it? Uma unidade ou variável com o mesmo nome já existe. Deseja sobrescrevê-la? Edit Variable Editar Variável New Variable Nova Variável VariablesDialog Variables Variáveis Category Categoria Variable Variável New Novo Variable/Constant… Variável/constante… Unknown Variable… Variável desconhecida… Matrix… Matriz… Edit… Editar… Export… Exportar… Deactivate Desativar Delete Eliminar Insert Inserir Favorite Favorito a matrix uma matriz a vector um vetor positive positivo non-positive não-positivo negative negativo non-negative não-negativo non-zero diferente de zero integer inteiro boolean boleano rational racional real real complex complexo number número not matrix não matriz unknown desconhecido Default assumptions Suposições padrão Activate Ativar All All variables Todas Uncategorized Sem categoria User variables Variáveis de utilizador Favorites Favoritos Inactive Inativo qalculate-qt-5.11.0/translations/qalculate-qt_ru.ts000066400000000000000000005732011520501070600223730ustar00rootroot00000000000000 ArgumentEditDialog Name: ИмÑ�: Type: Тип: Free Произвольное значение Number ЧиÑ�ло Integer Целое Symbol Символ Text ТекÑ�Ñ‚ Date Дата Vector Вектор Matrix Матрица Boolean ЛогичеÑ�кое Angle Угол Object Объект Function ФункциÑ� Unit Единица измерениÑ� Variable ПеременнаÑ� File Файл Enable rules and type test Включить правила и проверку типа Custom condition: УÑ�ловие: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Ð�апример, еÑ�ли аргумент — Ñ�то матрица, котораÑ� должна Ñ�одержать равное количеÑ�тво Ñ�трок и Ñ�толбцов: Ñ�троки(\\x) = Ñ�толбцы(\\x) Allow matrix Разрешить матрицы Forbid zero Запретить ноль Handle vector ОбращатьÑ�Ñ� Ñ� вектором Calculate function for each separate element in vector. ВычиÑ�лить функцию длÑ� каждого отдельного Ñ�лемента вектора. Min Мин Include equals ВключаÑ� равенÑ�тва Max МакÑ� CSVDialog Import CSV File Загрузить файл типа CSV Export CSV File ЭкÑ�порт в файл типа CSV Current result Текущий результат Matrix/vector variable: МатричнаÑ�/векторнаÑ� переменнаÑ�: File: Файл: Import as Импортировать как matrix матрица vectors векторы Name: ИмÑ�: First row: ПерваÑ� Ñ�трока: Includes headings Включает заголовки Delimiter: Разделитель: Comma ЗапÑ�таÑ� Tabulator ТабулÑ�циÑ� Semicolon Точка Ñ� запÑ�той Space Пробел Other Другой A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерениÑ� или переменнаÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Ð’Ñ‹ хотите её перезапиÑ�ать? Could not import from file %1 Ð�е удалоÑ�ÑŒ импортировать из файла %1 Could not export to file %1 Ð�е удалоÑ�ÑŒ Ñ�кÑ�портировать в файл %1 Question ВопроÑ� Error Ошибка No matrix or vector variable with the entered name was found. МатричнаÑ� или векторнаÑ� переменнаÑ� Ñ� указанным именем не найдена. CalendarConversionDialog Calendar Conversion Преобразование календарÑ� Gregorian ГригорианÑ�кий Hebrew ЕврейÑ�кий Islamic (Hijri) ИÑ�ламÑ�кий (Хиджра) Persian (Solar Hijri) ИранÑ�кий (Ñ�олнечнаÑ� Хиджра) Indian (National) ИндийÑ�кий (национальный) Chinese КитайÑ�кий Julian ЮлианÑ�кий Revised Julian (Milanković) Ð�овоюлианÑ�кий (Миланкович) Coptic КоптÑ�кий Ethiopian ЭфиопÑ�кий The selected Chinese year does not exist. Выбранный китайÑ�кий год не Ñ�ущеÑ�твует. Conversion to Gregorian calendar failed. Преобразование в григорианÑ�кий календарь не удалоÑ�ÑŒ. Calendar conversion failed for: %1. Ошибка преобразованиÑ� календарÑ� длÑ�: %1. Error Ошибка DataObjectEditDialog %1: %1: Default По умолчанию Approximate Приблизительное Exact Точное Edit Data Object Изменить объект данных New Data Object Ð�овый объект данных DataPropertyEditDialog Name: ИмÑ�: Descriptive name: Краткое опиÑ�ание: Description: РаÑ�ширенное опиÑ�ание: Value type: Тип значениÑ�: Expression Выражение Number ЧиÑ�ло Text ТекÑ�Ñ‚ Unit expression: Выражение единицы измерениÑ�: Use as key ИÑ�пользовать как ключ Case sensitive value Значение Ñ� учётом региÑ�тра Approximate value Приближённое значение Value uses brackets Значение иÑ�пользует Ñ�кобки Hide Скрыть Edit Data Property Изменить Ñ�войÑ�тво данных DataSetEditDialog General ОÑ�новное Properties СвойÑ�тва Function ФункциÑ� Descriptive name: Краткое опиÑ�ание: Data file: Файл данных: Description: РаÑ�ширенное опиÑ�ание: Copyright: Ð�вторÑ�кие права: Title Заголовок Name ИмÑ� Type Тип Add Добавить Edit Правка Remove Удалить Name: ИмÑ�: Object argument name: ИмÑ� аргумента объекта: Property argument name: ИмÑ� аргумента Ñ�войÑ�тва: Default property: СвойÑ�тво по умолчанию: text текÑ�Ñ‚ approximate приблизительно number чиÑ�ло expression выражение key ключ Question ВопроÑ� A function with the same name already exists. Do you want to overwrite the function? ФункциÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Хотите перезапиÑ�ать функцию? Data Sets Ð�аборы данных Object Объект Property СвойÑ�тво Edit Data Set Изменить набор данных New Data Set Ð�овый набор данных DataSetsDialog Data Sets Ð�аборы данных Data sets: Ð�аборы данных: New… Ð�оваÑ�… Edit… Правка… Delete Удалить Objects: Объекты: Data set description: ОпиÑ�ание набора данных: Object attributes: Ð�трибуты объекта: Properties СвойÑ�тва key ключ Data Retrieval Function ФункциÑ� поиÑ�ка данных argument аргумент ExpressionEdit matrix матрица vector вектор positive положительное non-positive не положительное negative отрицательное non-negative неотрицательное non-zero ненулевое boolean логичеÑ�кое integer целое rational рациональное real вещеÑ�твенное complex комплекÑ�ное number чиÑ�ло (not matrix) (не матрица) unknown неизвеÑ�тное default assumptions предположениÑ� по умолчанию Prefix: ПрефикÑ�: Base units ОÑ�новные единицы измерениÑ� Calendars Календари Factors Множители Fraction Дробь Latitude Широта Longitude Долгота Unicode Юникод UTC time zone ЧаÑ�овой поÑ�Ñ� UTC Undo Отменить Complex Angle/Phasor Notation Обозначение угла/вектора комплекÑ�ных чиÑ�ел Number Base ОÑ�нование Ñ�иÑ�темы Ñ�чиÑ�лениÑ� Binary-Coded Decimal Двоично-деÑ�Ñ�тичный код Bijective Base-26 Биективное оÑ�нование-26 Binary Number Двоичное чиÑ�ло Complex cis Form ЦиÑ�оидальнаÑ� форма комплекÑ�ных чиÑ�ел Decimal Number ДеÑ�Ñ�тичное чиÑ�ло Duodecimal Number Двенадцатеричное чиÑ�ло Complex Exponential Form ЭкÑ�поненциальнаÑ� форма комплекÑ�ных чиÑ�ел 16-bit Floating Point Binary Format 16-битное в двоичном формате Ñ� плавающей запÑ�той 32-bit Floating Point Binary Format 32-битное в двоичном формате Ñ� плавающей запÑ�той 64-bit Floating Point Binary Format 64-битное в двоичном формате Ñ� плавающей запÑ�той 80-bit (x86) Floating Point Binary Format 80-битное (x86) в двоичном формате Ñ� плавающей запÑ�той 128-bit Floating Point Binary Format 128-битное в двоичном формате Ñ� плавающей запÑ�той Hexadecimal Number ШеÑ�тнадцатеричное чиÑ�ло Mixed Units Смешанные единицы измерениÑ� Octal Number ВоÑ�ьмеричное чиÑ�ло Optimal Unit ОптимальнаÑ� единица измерениÑ� Expanded Partial Fractions РаÑ�ширенные чаÑ�тичные дроби Complex Polar Form ПолÑ�рнаÑ� форма комплекÑ�ных чиÑ�ел Complex Rectangular Form ПрÑ�моугольнаÑ� форма комплекÑ�ных чиÑ�ел Roman Numerals РимÑ�кие цифры Sexagesimal Number ШеÑ�тидеÑ�Ñ�теричное чиÑ�ло Time Format Формат времени UTC Time Zone ЧаÑ�овой поÑ�Ñ� UTC Redo Повторить Cut Вырезать Copy Копировать Paste Ð’Ñ�тавить Delete Удалить Insert Date… Ð’Ñ�тавить дату… Insert Matrix… Ð’Ñ�тавить матрицу… Select All Выделите вÑ�Ñ‘ Clear ОчиÑ�тить Clear History Очищать иÑ�торию Completion Завершение No completion Без завершениÑ� Limited strict completion Ограниченное Ñ�трогое завершение Strict completion Строгое завершение Limited full completion Ограниченное полное завершение Full completion Полное завершение Delayed completion Отложенное завершение Expression Status СтатуÑ� выражениÑ� Off Откл With delay С задержкой Without delay Без задержки Matrix Матрица Too many arguments for %1(). Слишком много аргументов длÑ� %1(). argument аргумент %1: %1: MC (memory clear) MC (отчиÑ�тить памÑ�ть) MS (memory store) MS (Ñ�охранить в памÑ�ти) M+ (memory plus) M+ (прибавить к значению в памÑ�ти) M− (memory minus) M− (отнÑ�ть от значениÑ� в памÑ�ти) factorize разложить на множители expand раÑ�крывать hexadecimal шеÑ�тнадцатеричное hexadecimal number шеÑ�тнадцатеричное чиÑ�ло octal воÑ�ьмеричное octal number воÑ�ьмеричное чиÑ�ло decimal деÑ�Ñ�теричное decimal number деÑ�Ñ�тичное чиÑ�ло duodecimal двенадцатеричное duodecimal number двенадцатеричное чиÑ�ло binary двоичное binary number двоичное чиÑ�ло roman римÑ�кое чиÑ�ло roman numerals римÑ�кие цифры bijective биективное bijective base-26 биективное оÑ�нование-26 binary-coded decimal двоично-деÑ�Ñ�тичный код sexagesimal шеÑ�тидеÑ�Ñ�теричное sexagesimal number шеÑ�тидеÑ�Ñ�теричное чиÑ�ло latitude широта longitude долгота 32-bit floating point 32-битное Ñ� плавающей запÑ�той 64-bit floating point 64-битное Ñ� плавающей запÑ�той 16-bit floating point 16-битное Ñ� плавающей запÑ�той 80-bit (x86) floating point 80-битное (x86) Ñ� плавающей запÑ�той 128-bit floating point 128-битное Ñ� плавающей запÑ�той time времÑ� time format формат времени bases оÑ�нованиÑ� number bases оÑ�нованиÑ� Ñ�иÑ�тем Ñ�чиÑ�лениÑ� calendars календари optimal оптимально optimal unit оптимальнаÑ� единица измерениÑ� base оÑ�нование base units оÑ�новные единицы измерениÑ� mixed Ñ�мешано mixed units Ñ�мешанные единицы fraction дробь factors множители partial fraction чаÑ�тичнаÑ� дробь expanded partial fractions раÑ�ширенные дробные чиÑ�ла rectangular прÑ�моугольнаÑ� cartesian декартова complex rectangular form прÑ�моугольнаÑ� форма комплекÑ�ных чиÑ�ел exponential Ñ�кÑ�поненциальнаÑ� complex exponential form Ñ�кÑ�поненциальнаÑ� форма комплекÑ�ных чиÑ�ел polar полÑ�рнаÑ� complex polar form полÑ�рнаÑ� форма комплекÑ�ных чиÑ�ел complex cis form циÑ�оидальнаÑ� форма комплекÑ�ных чиÑ�ел angle угловаÑ� complex angle notation комплекÑ�ные чиÑ�ла в обозначении угла phasor фазоваÑ� complex phasor notation КомплекÑ�ные чиÑ�ла в обозначении вектора number base %1 оÑ�нование Ñ�иÑ�темы Ñ�чиÑ�лениÑ� %1 Data object Объект данных Use input method ИÑ�пользовать метод ввода Decimal Fraction ДеÑ�Ñ�тичнаÑ� дробь Optimal Prefix Оптимальный префикÑ� prefix префикÑ� optimal prefix оптимальный префикÑ� decimals деÑ�Ñ�тичные decimal fraction деÑ�Ñ�тичнаÑ� дробь In history list Ð’ Ñ�пиÑ�ке иÑ�тории In expression field Ð’ поле выражениÑ� comment комментарий Calculate Selection ВычиÑ�лить выделение Automatically calculate selection Ð�втоматичеÑ�ки вычиÑ�лÑ�ть выделение Custom ПользовательÑ�кий scientific научный engineering инженерный simple проÑ�той Scientific Notation Simple Notation Engineering Notation scientific notation engineering notation simple notation In status bar With adaptive delay base base units оÑ�нование base number base оÑ�нование FPConversionDialog Floating Point Conversion (IEEE 754) Преобразование чиÑ�ел Ñ� плавающей запÑ�той (IEEE 754) Format Формат 16-bit (half precision) 128-битное (половиннаÑ� точноÑ�ть) 32-bit (single precision) 32-битное (одинарнаÑ� точноÑ�ть) 64-bit (double precision) 64-битное (двойнаÑ� точноÑ�ть) 80-bit (x86 extended format) 80-битное (x86 раÑ�ширенный формат) 128-bit (quadruple precision) 128 -битное (четырехкратнаÑ� точноÑ�ть) Decimal value ДеÑ�Ñ�тичное значение Binary representation Двоичное предÑ�тавление Hexadecimal representation ШеÑ�тнадцатеричное предÑ�тавление Floating point value Значение чиÑ�ла Ñ� плавающей запÑ�той Conversion error Ошибка преобразованиÑ� Microchip 24-bit Формат чиÑ�ла Ñ� плавающей точкой Microship (PIC16/17) Микрочип 24-битный Microchip 32-bit Формат чиÑ�ла Ñ� плавающей точкой Microship (PIC16/17) Микрочип 32-битный Value Значение FunctionEditDialog Name: ИмÑ�: Expression: Выражение: Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") ИÑ�пользуйте x, y и z (например, «(x+y)/2»), или \x, \y, \z, \a, \b, … (например, «(\x+\y)/2») Category: КатегориÑ�: Descriptive name: Краткое опиÑ�ание: Hide function Скрыть функцию Example: Пример: Description: РаÑ�ширенное опиÑ�ание: Condition: УÑ�ловие: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") УÑ�ловие, которое должно выполнÑ�тьÑ�Ñ� длÑ� функции (например, еÑ�ли второй аргумент должен быть больше первого: «\\y > \\x») Sub-functions: Подфункции: Expression Выражение Precalculate Предварительно раÑ�Ñ�читать Reference СÑ�ылка Add Добавить Edit Правка Remove Удалить Arguments: Ð�ргументы: Name ИмÑ� Type Тип A function with the same name already exists. Do you want to overwrite the function? ФункциÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Хотите перезапиÑ�ать функцию? Edit Function Изменить функцию New Function Ð�оваÑ� функциÑ� Required ОбÑ�зательно Details Детали Description РаÑ�ширенное опиÑ�ание Question ВопроÑ� Warning Предупреждение Conversion (using "to") is not supported in functions. Преобразование (Ñ� иÑ�пользованием «to») не поддерживаетÑ�Ñ� в функциÑ�Ñ…. FunctionsDialog Functions Функции Category КатегориÑ� Function ФункциÑ� New… Ð�оваÑ�… Edit… Правка… Deactivate Деактивировать Delete Удалить Calculate… РаÑ�Ñ�читать… Apply Применить Insert Ð’Ñ�тавить Favorite Избранный argument аргумент Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Извлекает данные из набора данных %1 длÑ� заданного объекта и Ñ�войÑ�тва. ЕÑ�ли «инфо» введено как Ñ�войÑ�тво, поÑ�витÑ�Ñ� диалоговое окно Ñ�о вÑ�еми Ñ�войÑ�твами объекта. Example: Пример: Arguments Ð�ргументы optional optional argument необÑ�зательный default: argument default по умолчанию: Requirement: Required condition for function Требование: Properties СвойÑ�тва %1: %1: key indicating that the property is a data set key ключ Activate Ð�ктивировать All All functions Ð’Ñ�е Uncategorized Без категорий User functions ПользовательÑ�кие функции Favorites Избранное Inactive Ð�еактивные HistoryView Copy Копировать Select All Выделите вÑ�Ñ‘ Insert Value Ð’Ñ�тавить значение Insert Text Ð’Ñ�тавить текÑ�Ñ‚ Copy unformatted ASCII Копировать неформатированный ASCII Search… ПоиÑ�к… Protect Защитить Move to Top Передвинуть наверх Remove Удалить Clear ОчиÑ�тить Text: ТекÑ�Ñ‚: Search ПоиÑ�к Exchange rate source(s): ИÑ�точник курÑ�ов валют: ИÑ�точники курÑ�ов валют: ИÑ�точники курÑ�ов валют: updated %1 обновлён %1 обновлены %1 обновлены %1 Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Введите математичеÑ�кое выражение выше, например «5 + 2 / 3», и нажмите клавишу ВВОД (Enter). Search by Date… ПоиÑ�к по дате… Comment Комментарий Add Comment… Добавить комментарий… Edit Comment… Изменить комментарий… Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Введите математичеÑ�кое выражение ниже, например «5 + 2 / 3», и нажмите клавишу ВВОД (Enter). KeypadButton <i>Right-click/long press</i>: %1 <i>Щелчок правой кнопкой/долгое нажатие</i>: %1 <i>Right-click</i>: %1 <i>Щелчок правой кнопкой</i>: %1 <i>Middle-click</i>: %1 <i>Щелчок Ñ�редней кнопкой</i>: %1 <i>Long press</i>: %1 <i>Долгое нажатие</i>: %1 Open menu Открыть меню KeypadWidget Memory store Сохранить в памÑ�ти Memory clear ОтчиÑ�тить памÑ�ть Memory recall Вызвать из памÑ�ти Memory add Прибавить к значению в памÑ�ти Memory subtract ОтнÑ�ть от значениÑ� в памÑ�ти sin sin cos cos tan tg Uncertainty/interval Ð�еопределённоÑ�ть/интервал Relative error ОтноÑ�ительнаÑ� ошибка Interval Интервал Move cursor left Перемещать курÑ�ор влево Move cursor to start ПеремеÑ�тить курÑ�ор в начало Move cursor right Перемещать курÑ�ор вправо Move cursor to end ПеремеÑ�тить курÑ�ор в конец Logical AND ЛогичеÑ�кое И Logical OR ЛогичеÑ�кое ИЛИ Bitwise Exclusive OR Побитовое иÑ�ключающее ИЛИ Logical NOT ЛогичеÑ�кое Ð�Е Bitwise Left Shift Побитовый Ñ�двиг влево Bitwise Right Shift Побитовый Ñ�двиг вправо cmp доп rot рот a→1 Ð�→1 Default assumptions ПредположениÑ� по умолчанию Number ЧиÑ�ло Real ВещеÑ�твенное Rational Рациональное Integer Целое Boolean ЛогичеÑ�кое Unknown Unknown assumptions sign Ð�еизвеÑ�тное Non-zero Ð�енулевое Positive Положительное Non-negative Ð�еотрицательное Negative Отрицательное Non-positive Ð�е положительное Factorize Разложить на множители Expand РаÑ�крывать Add column Добавить Ñ�толбец Add row Добавить Ñ�троку Remove column Удалить Ñ�толбец Remove row Удалить Ñ�троку Left parenthesis ЛеваÑ� Ñ�кобка Left vector bracket ЛеваÑ� векторнаÑ� Ñ�кобка Right parenthesis ПраваÑ� Ñ�кобка Right vector bracket ПраваÑ� векторнаÑ� Ñ�кобка Smart parentheses Умные Ñ�кобки Vector brackets Векторные Ñ�кобки Argument separator Разделитель аргументов Blank space ПуÑ�той пробел New line Ð�оваÑ� Ñ�трока Decimal point ДеÑ�Ñ�тичнаÑ� точка Previous result (static) Предыдущий результат (Ñ�татичеÑ�кий) Button Action ДейÑ�твие клавиши Label: Метка: Action: ДейÑ�твие: None Ð�ичего Value: Значение: Bitwise AND Побитовое И Delete Удалить Backspace Обратное перемещение Bitwise OR Побитовое ИЛИ Bitwise NOT Побитовое Ð�Е Clear expression ОтчиÑ�тить выражение Calculate expression ВычиÑ�лить выражение Exponentiation Возведение в Ñ�тепень Percent or remainder Процент или оÑ�таток Multiplication Умножение Bitwise Shift Побитовый Ñ�двиг Addition Сложение Plus ПлюÑ� Subtraction Вычитание Minus МинуÑ� Division Деление Store Сохранить New function Ð�оваÑ� функциÑ� Expand partial fractions Развернуть чаÑ�тичные дроби Enable units in physical constants Включить единицы измерениÑ� в физичеÑ�ких конÑ�тантах All constants Ð’Ñ�е конÑ�танты Percentage Calculation Tool ИнÑ�трумент раÑ�чёта процентов more ещё All units Ð’Ñ�е единицы All variables Ð’Ñ�е переменные Interval Display Отображение интервалов Adaptive Ð�даптивный Significant digits Значимые цифры Plus/minus ПлюÑ�/минуÑ� Relative ОтноÑ�ительный Concise КраткаÑ� Interval Calculation РаÑ�чёт интервала Variance formula Формула диÑ�перÑ�ии Interval arithmetic Ð�рифметика интервалов Allow concise uncertainty input Разрешить ввод краткой неопределенноÑ�ти Complex number form КомплекÑ�наÑ� форма Rectangular ПрÑ�моугольнаÑ� Exponential ЭкÑ�поненциальнаÑ� Polar ПолÑ�рнаÑ� Angle/phasor УгловаÑ�/векторнаÑ� Type Assumptions type Тип предположений Тип Sign Assumptions sign Знак предположений Знак STO Standard calculator button. Do not use more than three characters. СтандартнаÑ� кнопка калькулÑ�тора. Ð�е иÑ�пользуйте более трёх Ñ�имволов. СХР Action ДейÑ�твие DEL Standard calculator button. Do not use more than three characters. УДЛ C Standard calculator button. Do not use more than three characters. NamesEditDialog Name ИмÑ� Abbreviation Сокращение Plural МножеÑ�твеннаÑ� форма Reference СÑ�ылка Avoid input Избегать ввода Unicode Юникод Suffix СуффикÑ� Case sensitive С учётом региÑ�тра Completion only Только завершение Add Добавить Edit Правка Remove Удалить Warning Предупреждение Illegal name Ð�едопуÑ�тимое имÑ� A function with the same name already exists. ФункциÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. A unit or variable with the same name already exists. Единица измерениÑ� или переменнаÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. PercentageCalculationDialog Percentage Проценты Value 1 Значение 1 Value 2 Значение 2 Change from 1 to 2 Изменение от 1 к 2 Change from 2 to 1 Изменение от 2 к 1 2 compared to 1 2 по Ñ�равнению к 1 1 compared to 2 1 по Ñ�равнению к 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Введите два значениÑ�, макÑ�имум одно из которых Ñ�влÑ�етÑ�Ñ� процентом, а оÑ�тальные будут раÑ�Ñ�читаны за ваÑ�. Clear ОчиÑ�тить PeriodicTableDialog Periodic Table ПериодичеÑ�каÑ� таблица Element Data Данные Ñ�лемента Alkali Metal Щелочной металл Alkaline-Earth Metal Щелочноземельный металл Lanthanide Лантаноид Actinide Ð�ктиноид Transition Metal Переходный металл Metal Металл Metalloid Металлоид Polyatomic Non-Metal Многоатомный неметалл Diatomic Non-Metal Двухатомный неметалл Noble Gas Благородный газ Unknown chemical properties Ð�еизвеÑ�тные химичеÑ�кие Ñ�войÑ�тва Unknown Ð�еизвеÑ�тное %1: %1: PlotDialog Plot График Data Данные Title: Заголовок: Expression: Выражение: Function ФункциÑ� Vector/matrix Вектор/матрица Paired matrix ПарнаÑ� матрица Rows Строки X variable: ПеременнаÑ� X: Style: Стиль: Line ЛиниÑ� Points Символы Line with points ЛиниÑ� Ñ� Ñ�имволами Boxes/bars ПрÑ�моугольники/планки погрешноÑ�тей Histogram ГиÑ�тограмма Steps Ступенчатый Candlesticks ЯпонÑ�кие Ñ�вечи Dots Точки Polar ПолÑ�рнаÑ� Smoothing: Сглаживание: None Ð�ет Monotonic Монотонное Natural cubic splines ЕÑ�теÑ�твенные кубичеÑ�кие Ñ�плайны Bezier Безье Bezier (monotonic) Безье (монотонное) Y-axis: ОÑ�ÑŒ Y: Primary ОÑ�новнаÑ� Secondary ВторичнаÑ� Add Добавить Apply Применить Remove Удалить Title Заголовок Expression Выражение Function Range Диапазон функции Minimum x value: Минимальное значение x: Maximum x value: МакÑ�имальное значение x: Sampling rate: ЧаÑ�тота диÑ�кретизации: Step size: Размер шага: Show real and imaginary parts Показать дейÑ�твительную и мнимую чаÑ�ти Appearance Внешний вид Display grid Показать Ñ�етку Display full border Показать полную рамку Minimum y value: Минимальное значение y: Maximum y value: МакÑ�имальное значение y: Logarithmic x scale: ЛогарифмичеÑ�каÑ� шкала абÑ�циÑ�Ñ� x: Logarithmic y scale: ЛогарифмичеÑ�каÑ� шкала ординат y: X-axis label: ПодпиÑ�ÑŒ длÑ� оÑ�и абÑ�циÑ�Ñ� X: Y-axis label: ПодпиÑ�ÑŒ длÑ� оÑ�и ординат Y: Line width: Толщина линии: Legend placement: Размещение легенды: Top-left Сверху Ñ�лева Top-right Сверху Ñ�права Bottom-left Снизу Ñ�лева Bottom-right Снизу Ñ�права Below Ð�иже Outside Извне Calculating… РаÑ�чёт… Cancel Отмена Processing… Обработка… PreferencesDialog Look && Feel Внешний вид Numbers && Operators ЧиÑ�ла и операторы Units && Currencies Единицы измерениÑ� и валюты Parsing && Calculation Разбор и вычиÑ�ление Ignore system language (requires restart) Игнорировать Ñ�иÑ�темный Ñ�зык (требуетÑ�Ñ� перезапуÑ�к) Allow multiple instances Разрешить неÑ�колько Ñ�кземплÑ�ров Clear history on exit Очищать иÑ�торию при выходе Keep above other windows Поддерживать поверх других окон Window title: Заголовок окна: Application name ИмÑ� приложениÑ� Result Результат Application name + result ИмÑ� приложениÑ� + результат Workspace Рабочее проÑ�транÑ�тво Application name + workspace ИмÑ� приложениÑ� + рабочее проÑ�транÑ�тво Style: Стиль: Default (requires restart) Default style По умолчанию (требуетÑ�Ñ� перезапуÑ�к) Dark mode Тёмный режим Colorize result РаÑ�краÑ�ить результат Custom result font: Шрифт результатов: Custom expression font: Шрифт выражениÑ�: Custom keypad font: Шрифт клавиатуры: Custom application font: Шрифт приложениÑ�: Display expression status Показывать Ñ�татуÑ� выражениÑ� Delay: Задержка: Expression after calculation: Выражение поÑ�ле раÑ�чёта: Keep expression Сохранить выражение Clear expression ОтчиÑ�тить выражение Replace with result Заменить на результат Replace with result if shorter Заменить на результат, еÑ�ли он короче Use keyboard keys for RPN ИÑ�пользовать клавиатуру длÑ� ПОЛИЗ Parsing mode: Режим анализа: Adaptive Ð�даптивный Conventional ОбщепринÑ�тый Implicit multiplication first Ð�еÑ�вный первый Chain Цепь RPN ПОЛИЗ Truncate all numbers Обрезать вÑ�е чиÑ�ла Read precision ТочноÑ�ть чтениÑ� Limit implicit multiplication Ограничить неÑ�вное умножение Interval calculation: РаÑ�чёт интервала: Variance formula Формула диÑ�перÑ�ии Interval arithmetic Ð�рифметика интервалов Factorize result Разложить результат на множители Binary two's complement representation ПредÑ�тавление двоичных чиÑ�ел Ñ� дополнительным кодом Hexadecimal two's complement representation ПредÑ�тавление шеÑ�тнадцатеричных чиÑ�ел Ñ� дополнительным кодом Use lower case letters in non-decimal numbers ИÑ�пользовать Ñ�трочные буквы в недеÑ�Ñ�тичных чиÑ�лах Spell out logical operators Изложить логично логичеÑ�кие операции Preferences Параметры ms milliseconds мÑ� Use dot as multiplication sign ИÑ�пользовать точку как знак умножениÑ� Use Unicode division slash in output ИÑ�пользовать коÑ�ую черту делениÑ� Юникода в выводе Use E-notation instead of 10^n ИÑ�пользовать E-нотацию вмеÑ�то 10^n Use 'j' as imaginary unit ИÑ�пользовать «j» длÑ� мнимой единицы Use comma as decimal separator ИÑ�пользовать запÑ�тую в качеÑ�тве деÑ�Ñ�тичного разделителÑ� Ignore comma in numbers Игнорировать запÑ�тую в чиÑ�лах Ignore dots in numbers Игнорировать точки в чиÑ�лах Copy unformatted ASCII by default Копировать неформатированный ASCII по умолчанию Round halfway numbers away from zero ОкруглÑ�ть половинные чиÑ�ла от нулÑ� Round halfway numbers to even ОкруглÑ�ть половинные чиÑ�ла до чётного чиÑ�ла Indicate repeating decimals Указывать повторÑ�ющиеÑ�Ñ� деÑ�Ñ�тичные дроби Use caret for bitwise XOR ИÑ�пользовать карет длÑ� побитового иÑ�ключающего ИЛИ Expression in history: Выражение в иÑ�тории: Parsed Разобранное Entered Введённое Entered + parsed Введённое + разобранное Simplified percentage calculation Упрощённый процентный раÑ�чёт Digit grouping: Группировка цифр: None Ð�икакой Standard Стандарт Local Локаль Interval display: Режим отображениÑ� интервалов: Significant digits Значимые цифры Interval Интервал Plus/minus ПлюÑ�/минуÑ� Midpoint Середина Lower Ð�иже Upper Выше Rounding: Округление: Complex number form: КомплекÑ�наÑ� форма: Rectangular ПрÑ�моугольнаÑ� Exponential ЭкÑ�поненциальнаÑ� Polar ПолÑ�рнаÑ� Angle/phasor УгловаÑ�/векторнаÑ� Abbreviate names Сокращённые имена Use binary prefixes for information units ИÑ�пользовать двоичные префикÑ�Ñ‹ длÑ� информационных единиц Automatic unit conversion: Ð�втоматичеÑ�кое преобразование единиц: No conversion Без преобразованиÑ� Base units ОÑ�новные единицы измерениÑ� Optimal units Оптимальные единицы измерениÑ� Optimal SI units Оптимальные единицы СИ Convert to mixed units Преобразовать в Ñ�мешанные единицы Automatic unit prefixes: Ð�втоматичеÑ�кие префикÑ�Ñ‹ единиц: Default По умолчанию No prefixes Без префикÑ�ов Prefixes for some units ПрефикÑ�Ñ‹ длÑ� выбранных единиц Prefixes also for currencies ПрефикÑ�Ñ‹ также длÑ� валют Prefixes for all units ПрефикÑ�Ñ‹ длÑ� вÑ�ех единиц Enable all SI-prefixes Включить вÑ�е префикÑ�Ñ‹ СИ Enable denominator prefixes Включить префикÑ�Ñ‹ знаменателÑ� Enable units in physical constants Включить единицы измерениÑ� в физичеÑ�ких конÑ�тантах Temperature calculation: Режим раÑ�чёта температуры: Absolute Ð�бÑ�олютный Relative ОтноÑ�ительный Hybrid Гибридный Exchange rates updates: ОбновлениÑ� курÑ�ов валют: %n day(s) %n день %n днÑ� %n дней Format result Форматировать результат Use special duodecimal symbols ИÑ�пользовать Ñ�пециальные двенадцатеричные Ñ�имволы Language: Язык: Restart required ТребуетÑ�Ñ� перезапуÑ�к Please restart the program for the language change to take effect. ПожалуйÑ�та, перезапуÑ�тите приложение, чтобы изменение Ñ�зыка вÑ�тупили в Ñ�илу. Automatically copy result Ð�втоматичеÑ�ки копировать результат Copy unformatted ASCII without units Копировать неформатированный ASCII без единиц измерениÑ� Tooltips: ПодÑ�казки: Show all Показывать вÑ�Ñ‘ Hide in keypad Скрывать на клавиатуре Hide all Скрывать вÑ�Ñ‘ Interpret unrecognized symbols as variables Интерпретировать нераÑ�познанные Ñ�имволы как переменные Concise КраткаÑ� Enable units Включить единицы измерений Allow concise uncertainty input Разрешить ввод краткой неопределенноÑ�ти Close application with Escape key Закрывать приложение клавишей Esc Round halfway numbers to odd ОкруглÑ�ть половинные чиÑ�ла до нечётного чиÑ�ла Round halfway numbers toward zero ОкруглÑ�ть половинные чиÑ�ла к нулю Round halfway numbers to random ОкруглÑ�ть половинные чиÑ�ла Ñ�лучайно Round halfway numbers up ОкруглÑ�ть половинные чиÑ�ла вверх Round halfway numbers down ОкруглÑ�ть половинные чиÑ�ла вниз Round toward zero ОкруглÑ�ть к нулю Round away from zero ОкруглÑ�ть от нулÑ� Round up ОкруглÑ�ть вверх Round down ОкруглÑ�ть вниз Two's complement output: Дополнительный код длÑ� вывода: Two's complement input: Дополнительный код длÑ� ввода: Binary Двоичное Hexadecimal ШеÑ�тнадцатеричное Binary bits: Двоичные биты: Automatic Ð�втоматичеÑ�ки Max history lines saved: МакÑ�имальное количеÑ�тво Ñ�охранённых Ñ�трок иÑ�тории: Preserve history height СохранÑ�ть выÑ�оту Ñ�пиÑ�ка иÑ�тории Do not change the height of history list when keypad or number bases are show or hidden. Ð�е изменÑ�ть выÑ�оту Ñ�пиÑ�ка иÑ�тории, когда клавиатура или чиÑ�ловые базы показаны или Ñ�крыты. Expression status: СтатуÑ� выражениÑ�: Off Откл In history list Ð’ Ñ�пиÑ�ке иÑ�тории In expression field Ð’ поле выражениÑ� Status tooltip delay: Задержка подÑ�казки о Ñ�татуÑ�е: Calculate as you type delay: Задержка раÑ�чёта по мере ввода: Automatically group digits in input (experimental) Ð�втоматичеÑ�ки группировать цифры во входных данных (Ñ�кÑ�периментально) Disable cursor blinking Отключить мигание курÑ�ора Automatically calculate selection Ð�втоматичеÑ�ки вычиÑ�лÑ�ть выделение Indicate repeating decimals: Указывать повторÑ�ющиеÑ�Ñ� деÑ�Ñ�тичные дроби: Ellipsis Многоточие Overline Черта Ñ�верху Place percent button in number pad РазмеÑ�тить кнопку процентов на цифровой клавиатуре Custom history font: Шрифт иÑ�ториÑ�: Multiplication sign: Знак умножениÑ�: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Show status bar Automatically group digits in input Ð�втоматичеÑ�ки группировать цифры во входных данных In status bar Fonts Шрифты Units Единицы измерениÑ� Calculation ВычиÑ�ление Custom status bar font: Default currency: Notify when a new version is available Parsed (compact) Entered + parsed (compact) Custom Adaptive delay Place expression field below history QApplication Execute expressions and commands from a file Выполнить выражениÑ� и команды из файла FILE ФÐ�ЙЛ Start a new instance of the application ЗапуÑ�тить новый Ñ�кземплÑ�Ñ€ приложениÑ� Specify the window title Укажите заголовок окна TITLE Ð�Ð�ЗВÐ�Ð�ИЕ Display the application version Показать верÑ�ию приложениÑ� Open workspace Открыть рабочее проÑ�транÑ�тво Expression to calculate Выражение длÑ� вычиÑ�лениÑ� [EXPRESSION] [ВЫРÐ�ЖЕÐ�ИЕ] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? По умолчанию разрешён только один Ñ�кземплÑ�Ñ€ (одно главное окно) %1. ЕÑ�ли неÑ�колько Ñ�кземплÑ�ров открыты одновременно, будут Ñ�охранены только определениÑ� (переменные, функции и Ñ‚. д.), режим, наÑ�тройки и иÑ�ториÑ� поÑ�леднего закрытого окна. Ð’Ñ‹, неÑ�мотрÑ� на Ñ�то, хотите изменить поведение по умолчанию и разрешить одновременную работу неÑ�кольких Ñ�кземплÑ�ров? %1 is already running. %1 уже иÑ�полнÑ�етÑ�Ñ�. Failed to load global definitions! Ð�е удалоÑ�ÑŒ загрузить глобальные определениÑ�! answer ответ History Answer Value Значение ответа в иÑ�тории History Index(es) ИндекÑ�(Ñ‹) иÑ�тории History index %s does not exist. ИндекÑ� иÑ�тории %s не Ñ�ущеÑ�твует. Last Answer ПоÑ�ледний ответ Answer 2 Ответ 2 Answer 3 Ответ 3 Answer 4 Ответ 4 Answer 5 Ответ 5 Memory ПамÑ�ть Couldn't write preferences to %1 Ð�е удалоÑ�ÑŒ запиÑ�ать наÑ�тройки в %1 Error Ошибка Function not found. ФункциÑ� не найдена. Variable not found. ПеременнаÑ� не найдена. Unit not found. Единица измерениÑ� не найдена. Unsupported base. Ð�еподдерживаемое оÑ�нование. Unsupported value. Ð�еподдерживаемое значение. Allow multiple instances? Разрешить неÑ�колько Ñ�кземплÑ�ров? Update exchange rates Обновить курÑ�Ñ‹ валют QalculateQtSettings Update exchange rates? Обновить курÑ�Ñ‹ валют? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Прошёл %n день Ñ� момента поÑ�леднего обновлениÑ� курÑ�ов обмена. Хотите обновить курÑ�Ñ‹ обмена Ñ�ейчаÑ�? Прошло %n днÑ� Ñ� момента поÑ�леднего обновлениÑ� курÑ�ов обмена. Хотите обновить курÑ�Ñ‹ обмена Ñ�ейчаÑ�? Прошло %n дней Ñ� момента поÑ�леднего обновлениÑ� курÑ�ов обмена. Хотите обновить курÑ�Ñ‹ обмена Ñ�ейчаÑ�? Fetching exchange rates… Получение курÑ�ов валют… Path of executable not found. Путь к иÑ�полнÑ�емому файлу не найден. curl not found. Программа curl не найдена. Failed to run update script. %1 Ð�е удалоÑ�ÑŒ запуÑ�тить Ñ�крипт обновлениÑ�. %1 Failed to check for updates. Ð�е удалоÑ�ÑŒ проверить наличие обновлений. No updates found. Обновлений не найдено. A new version of %1 is available at %2. Do you wish to update to version %3? Ð�оваÑ� верÑ�иÑ� %1 доÑ�тупна: %2. Ð’Ñ‹ хотите обновитьÑ�Ñ� до верÑ�ии %3? A new version of %1 is available. You can get version %3 at %2. ДоÑ�тупна новаÑ� верÑ�иÑ� %1. Ð’Ñ‹ можете получить верÑ�ию %3: %2. %1: %2 %1: %2 Insert function Ð’Ñ�тавить функцию Insert function (dialog) Ð’Ñ�тавить функцию (на выбор) Insert variable Ð’Ñ�тавить переменную Approximate result Приблизительный результат Negate Отрицание Invert Обратить Insert unit Ð’Ñ�тавить единицу измерениÑ� Insert text Ð’Ñ�тавить текÑ�Ñ‚ Insert operator Ð’Ñ�тавить оператор Insert date Ð’Ñ�тавить дату Insert matrix Ð’Ñ�тавить матрицу Insert smart parentheses Ð’Ñ�тавить умные Ñ�кобки Convert to unit Преобразовать в единицу измерениÑ� Convert Преобразовать Convert to optimal unit Преобразовать в оптимальную единицу измерениÑ� Convert to base units Преобразовать в базовые единицы измерениÑ� Convert to optimal prefix Преобразовать в оптимальный префикÑ� Convert to number base Преобразовать к оÑ�нованию Ñ�иÑ�тем Ñ�чиÑ�лениÑ� Factorize result Разложить результат на множители Expand result Развернуть результат Expand partial fractions Развернуть чаÑ�тичные дроби RPN: down ПОЛИЗ: вниз RPN: up ПОЛИЗ: вверх RPN: swap ПОЛИЗ: обменÑ�ть RPN: copy ПОЛИЗ: копировать RPN: lastx ПОЛИЗ: поÑ�ледний x RPN: delete register ПОЛИЗ: удалить RPN: clear stack ПОЛИЗ: очиÑ�тить Ñ�тек Set expression base УÑ�тановить оÑ�нование длÑ� выражениÑ� Set result base УÑ�тановить оÑ�нование длÑ� результата Set angle unit to degrees УÑ�тановить угловую единицу измерениÑ� в градуÑ�Ñ‹ Set angle unit to radians УÑ�тановить угловую единицу измерениÑ� в радианы Set angle unit to gradians УÑ�тановить угловую единицу измерениÑ� в грады Active normal display mode Ð�ктивировать проÑ�той режим отображениÑ� Activate scientific display mode Ð�ктивировать научный режим отображениÑ� Activate engineering display mode Ð�ктивировать инженерный режим отображениÑ� Activate simple display mode Ð�ктивировать упрощённый режим отображениÑ� Toggle RPN mode Ð’(Ñ‹)ключить режим ПОЛИЗ Show general keypad Показать оÑ�новную клавиатуру Toggle programming keypad Ð’(Ñ‹)ключить клавиатуру программированиÑ� Toggle algebra keypad Ð’(Ñ‹)ключить алгебраичеÑ�кую клавиатуру Toggle custom keypad Ð’(Ñ‹)ключить пользовательÑ�кую клавиатуру Show/hide keypad Показать/Ñ�крыть клавиатуру Search history ИÑ�кать в иÑ�тории Show variables Показать переменные Show functions Показать функции Show units Показать единицы измерениÑ� Show data sets Показать наборы данных Store result Сохранить результат MC (memory clear) MC (отчиÑ�тить памÑ�ть) MR (memory recall) MR (вызвать из памÑ�ти) MS (memory store) MS (Ñ�охранить в памÑ�ти) M+ (memory plus) M+ (прибавить к значению в памÑ�ти) M− (memory minus) M− (отнÑ�ть от значениÑ� в памÑ�ти) New variable Ð�оваÑ� переменнаÑ� New function Ð�оваÑ� функциÑ� Open plot functions/data Открыть график функций/данных Open convert number bases Открыть преобразование между оÑ�нованиÑ�ми Ñ�иÑ�тем Ñ�чиÑ�лениÑ� Open floating point conversion Открыть окно преобразованиÑ� чиÑ�ел Ñ� плавающей запÑ�той Open calender conversion Открыть окно преобразованиÑ� календарей Open percentage calculation tool Открыть окно инÑ�трумента раÑ�чёта процентов Open periodic table Открыть окно Ñ� периодичеÑ�кой таблицей Update exchange rates Обновить курÑ�Ñ‹ валют Copy result Копировать результат Insert result Ð’Ñ�тавить результат Open mode menu Открыть меню режимов Open menu Открыть меню Help Справка Quit Выход Toggle chain mode Ð’(Ñ‹)ключить режим цепочки Toggle keep above Поддерживать поверх других Show completion (activate first item) Показать завершение (активировать первый Ñ�лемент) Clear expression ОтчиÑ�тить выражение Delete Удалить Backspace Обратное перемещение Home Ð�ачало End Конец Right Вправо Left Влево Up Вверх Down Вниз Undo Отменить Redo Повторить Calculate expression ВычиÑ�лить выражение Expression history next Следующее выражение в иÑ�тории Expression history previous Предыдущее выражение в иÑ�тории Error Ошибка Warning Предупреждение Information Информирование Clear history ОчиÑ�тить иÑ�торию Toggle precision Переключить точноÑ�ть Toggle max decimals Переключить макÑ�имальное количеÑ�тво деÑ�Ñ�тичных знаков Toggle min decimals Переключить минимальное количеÑ�тво деÑ�Ñ�тичных знаков Toggle max/min decimals Переключить макÑ�имальное/минимальное количеÑ�тво деÑ�Ñ�тичных знаков Default По умолчанию Formatted result Форматированный результат Unformatted ASCII result Ð�еформатированный ASCII результат Unformatted ASCII result without units Ð�еформатированное ASCII выражение без единиц измерениÑ� Formatted expression Форматированное выражение Unformatted ASCII expression Ð�еформатированное ASCII выражение Formatted expression + result Форматированное выражение + результат Unformatted ASCII expression + result Ð�еформатированные ASCII выражение + результат Open functions menu Открыть меню функций Open units menu Открыть меню единиц измерениÑ� Open variables menu Открыть меню переменных Download Скачать Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Содержит результат поÑ�леднего вычиÑ�лениÑ�. Ð�еÑ�колько результатов уравнениÑ� предÑ�тавлÑ�ÑŽÑ‚Ñ�Ñ� в виде вектора. ДоÑ�туп к отдельным решениÑ�м оÑ�ущеÑ�твлÑ�етÑ�Ñ� Ñ� помощью ans(n) (напр., ans(1) длÑ� первого решениÑ�). Toggle fraction format in current result Переключить формат дробей в текущем результате Activate normal display mode Ð�ктивировать проÑ�той режим отображениÑ� QalculateTranslator Cancel Only used when Qt translation is missing Отменить Close Only used when Qt translation is missing Закрыть OK Only used when Qt translation is missing ОК &Yes Only used when Qt translation is missing &Да &No Only used when Qt translation is missing &Ð�ет &Open Only used when Qt translation is missing &Открыть &Save Only used when Qt translation is missing &Сохранить &Select All Only used when Qt translation is missing &Выбрать вÑ�е Look in: Only used when Qt translation is missing Смотреть в: File &name: Only used when Qt translation is missing ИмÑ� &файла: Files of type: Only used when Qt translation is missing Тип файлов: QalculateWindow Menu Меню New Ð�оваÑ� Function… ФункциÑ�… Variable/Constant… ПеременнаÑ�/конÑ�танта… Unknown Variable… ПеременнаÑ� неизвеÑ�тного… Matrix… Матрица… Workspaces Рабочие проÑ�транÑ�тва Open… Открыть… Open default Открыть по умолчанию Save Сохранить Save As… Сохранить как… Import CSV File… Загрузить файл CSV… Export CSV File… ЭкÑ�порт в файл CSV… Functions Функции Variables and Constants Переменные и конÑ�танты Units Единицы измерениÑ� Plot Functions/Data Графики функций/данных Floating Point Conversion (IEEE 754) Преобразование чиÑ�ел Ñ� плавающей запÑ�той (IEEE 754) Calendar Conversion Преобразование календарÑ� Update Exchange Rates Обновить курÑ�Ñ‹ валют Normal Mode Режим нормальный RPN Mode Режим ПОЛИЗ Chain Mode Режим «цепь» Keyboard Shortcuts Клавиатурные комбинации Preferences Параметры Help Справка Report a Bug Сообщить об ошибке Check for Updates Проверить обновлениÑ� About %1 О %1 Quit Выход Mode Режим General Display Mode Режим общего отображениÑ� Normal Обычный Scientific Ð�аучный Engineering Инженерный Simple ПроÑ�той Angle Unit Единица измерениÑ� углов Radians Радианы Degrees ГрадуÑ�Ñ‹ Gradians Грады Approximation Приближение Automatic Automatic approximation Ð�втоматичеÑ�кое Dual Dual approximation Двойное Exact Exact approximation Точное Approximate Приблизительное Assumptions ПредположениÑ� Type Assumptions type Тип Number ЧиÑ�ло Real ВещеÑ�твенное Rational Рациональное Integer Целое Boolean ЛогичеÑ�кое Sign Assumptions sign Знак Unknown Unknown assumptions sign Ð�еизвеÑ�тное Non-zero Ð�енулевое Positive Положительное Non-negative Ð�еотрицательное Negative Отрицательное Non-positive Ð�е положительное Result Base ОÑ�нование длÑ� результата Binary Двоичное Octal ВоÑ�ьмеричное Decimal ДеÑ�Ñ�тичное Hexadecimal ШеÑ�тнадцатеричное Other Другое Duodecimal Двенадцатеричное Sexagesimal ШеÑ�тидеÑ�Ñ�теричное Time format Формат времени Roman numerals РимÑ�кие цифры Unicode Юникод Bijective base-26 Биективное оÑ�нование-26 Binary-coded decimal (BCD) Двоично-деÑ�Ñ�тичный код Custom: Number base ПользовательÑ�кое: Expression Base ОÑ�нование длÑ� выражениÑ� Other: Number base Другое: Precision: ТочноÑ�ть: Min decimals: Минимум цифр: Max decimals: МакÑ�имум цифр: off Max decimals откл Convert ПеревеÑ�ти Store Сохранить Keypad Клавиатура Number bases ОÑ�нованиÑ� Ñ�иÑ�тем Ñ�чиÑ�лениÑ� Unit… Единица измерениÑ�… Data Sets Ð�аборы данных Percentage Calculation Tool ИнÑ�трумент раÑ�чёта процентов Periodic Table ПериодичеÑ�каÑ� таблица Binary: Двоичное: Octal: ВоÑ�ьмеричное: Decimal: ДеÑ�Ñ�тичное: Hexadecimal: ШеÑ�тнадцатеричное: RPN Stack Стек ПОЛИЗ New Function… Ð�оваÑ� функциÑ�… Powerful and easy to use calculator Мощный и проÑ�той в иÑ�пользовании калькулÑ�тор Couldn't write definitions Ð�е удалоÑ�ÑŒ запиÑ�ать определениÑ� hexadecimal шеÑ�тнадцатеричное octal воÑ�ьмеричное decimal деÑ�Ñ�теричное duodecimal двенадцатеричное binary двоичное roman римÑ�кое чиÑ�ло bijective биективное sexagesimal шеÑ�тидеÑ�Ñ�теричное latitude широта longitude долгота time времÑ� Time zone parsing failed. Ð�е удалоÑ�ÑŒ выполнить Ñ�интакÑ�ичеÑ�кий анализ чаÑ�ового поÑ�Ñ�а. bases оÑ�нованиÑ� calendars календари rectangular прÑ�моугольнаÑ� cartesian декартова exponential Ñ�кÑ�поненциальнаÑ� polar полÑ�рнаÑ� phasor фазоваÑ� angle угловаÑ� optimal оптимально base оÑ�нование mixed Ñ�мешано fraction дробь factors множители partial fraction чаÑ�тичнаÑ� дробь factorize разложить на множители expand раÑ�крывать Calculating… РаÑ�чёт… Cancel Отмена RPN Operation ПОЛИЗ операциÑ� Factorizing… ФакторизациÑ�… Expanding partial fractions… РаÑ�ширение дробных чиÑ�ел… Expanding… РаÑ�ширение… Converting… Преобразование… RPN Register Moved РегиÑ�тр ПОЛИЗ перемещён Processing… Обработка… Matrix Матрица Temperature Calculation Mode Режим раÑ�чёта температуры The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Выражение неоднозначное. Выберите режим раÑ�чёта температуры (режим позже можно изменить в наÑ�тройках). Absolute Ð�бÑ�олютный Relative ОтноÑ�ительный Hybrid Гибридный Please select desired variant of the sinc function. ПожалуйÑ�та, выберите нужный вариант функции sinc. Unnormalized Ð�енормированный Normalized Ð�ормированный Interpretation of dots ИÑ�пользование точки Please select interpretation of dots (".") (this can later be changed in preferences). ПожалуйÑ�та, выберите интерпретацию точки («.») (можно изменить позже в наÑ�тройках). Both dot and comma as decimal separators Точка и запÑ�таÑ� в качеÑ�тве деÑ�Ñ�тичных разделителей Dot as thousands separator Точка как разделитель тыÑ�Ñ�ч Only dot as decimal separator Только точка в качеÑ�тве деÑ�Ñ�тичного разделителÑ� Parsing Mode Режим анализа The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Выражение неоднозначное. Выберите интерпретацию выражений Ñ� неÑ�вным умножением (позже Ñ�то можно изменить в наÑ�тройках). Implicit multiplication first Сначала анализировать неÑ�вное умножение Conventional ОбщепринÑ�тый Ñ�интакÑ�ичеÑ�кий анализ Adaptive Ð�даптивный Edit Keyboard Shortcut Править клавиатурную комбинацию New Keyboard Shortcut Ð�оваÑ� клавиатурнаÑ� комбинациÑ� Action: ДейÑ�твие: Value: Значение: Set key combination Ð�азначить комбинацию клавиш Press the key combination you wish to use for the action. Ð�ажмите комбинацию клавиш, которую хотите иÑ�пользовать длÑ� дейÑ�твиÑ�. Reserved key combination ЗарезервированнаÑ� комбинациÑ� клавиш The key combination is already in use. Do you wish to replace the current action (%1)? КомбинациÑ� клавиш уже иÑ�пользуетÑ�Ñ�. Ð’Ñ‹ хотите заменить текущее дейÑ�твие (%1)? Question ВопроÑ� Add… Добавить… Edit… Правка… Remove Удалить Gnuplot was not found Программа Gnuplot не найдена %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. ДлÑ� поÑ�троениÑ� графиков %1 (%2) должен быть уÑ�тановлен дополнительно и находитьÑ�Ñ� по переменной окружениÑ� PATH. Example: Example of function usage Пример: Enter RPN Enter Ввод Calculate РаÑ�Ñ�читать Apply to Stack Применить к Ñ�теку Insert Ð’Ñ�тавить Failed to open workspace удалоÑ�ÑŒ открыть рабочее проÑ�транÑ�тво Couldn't save workspace Ð�е удалоÑ�ÑŒ Ñ�охранить рабочее проÑ�транÑ�тво Save file? Сохранить файл? Do you want to save the current workspace? Ð’Ñ‹ хотите Ñ�охранить текущую рабочее проÑ�транÑ�тво? Do not ask again Ð�е Ñ�прашивать Ñ�нова Keep open Держать открытым Value Значение Argument Ð�ргумент %1: %1: General ОÑ�новнаÑ� Programming Программирование Algebra Ð�лгебра Custom ПользовательÑ�каÑ� None Ð�ичего Hide Number Pad Скрыть цифровую клавиатуру Reset Keypad Position СброÑ�ить положение цифровой клавиатуры Number Bases ОÑ�нованиÑ� Ñ�иÑ�тем Ñ�чиÑ�лениÑ� Rotate the stack or move the selected register up Повернуть Ñ�тек или перемеÑ�тить выбранный региÑ�тр вверх Rotate the stack or move the selected register down Повернуть Ñ�тек или перемеÑ�тить выбранный региÑ�тр вниз Swap the top two values or move the selected value to the top of the stack ПоменÑ�ть меÑ�тами два верхних значениÑ� или перемеÑ�тить выбранное значение в вершину Ñ�тека Delete the top or selected value Удалить верхнее или выбранное значение Enter the top value from before the last numeric operation Введите верхнее значение перед поÑ�ледней чиÑ�ловой операцией Copy the selected or top value to the top of the stack Скопировать выбранное или верхнее значение в вершину Ñ�тека Clear the RPN stack ОчиÑ�тить Ñ�тек ПОЛИЗ True ИÑ�тина False Ложь Info Инфо optional optional argument необÑ�зательный Failed to open %1. %2 Ð�е удалоÑ�ÑŒ открыть %1. %2 License: GNU General Public License version 2 or later ЛицензиÑ�: GNU General Public License, верÑ�иÑ� 2 или новее Error Ошибка Add Action (%1) Добавить дейÑ�твие (%1) Plot График Separate Menu Buttons Отделить меню клавиш Icons only Только значки Text only Только текÑ�Ñ‚ Text beside icons ТекÑ�Ñ‚ Ñ€Ñ�дом Ñ�о значками Text under icons ТекÑ�Ñ‚ под значками <i>Right-click/long press</i>: %1 <i>Щелчок правой кнопкой/долгое нажатие</i>: %1 Favorites Избранное Recent Ð�едавние User functions ПользовательÑ�кие функции Open dialog Открыть диалоговое окно Show all functions Показать вÑ�е функции User units ПользовательÑ�кие единицы more ещё Prefixes ПрефикÑ�Ñ‹ Show all units Показать вÑ�е единицы измерениÑ� User variables ПользовательÑ�кие переменные Show all variables Показать вÑ�е переменные Open menu Открыть меню Copy Копировать prefix префикÑ� decimals деÑ�Ñ�тичные дроби Percentage Interpretation ПроцентнаÑ� интерпретациÑ� Please select interpretation of percentage addition ПожалуйÑ�та, выберите интерпретацию процентного Ñ�ложениÑ� Add percentage of original value Добавить процент от первоначального значениÑ� Add percentage multiplied by 1/100 Добавить процент, умноженный на 1/100 Show toolbar Показать панель инÑ�трументов Action ДейÑ�твие Key combination КомбинациÑ� клавиш Number Pad Цифровой блок Always Show Number Pad Ð’Ñ�егда показывать цифровой блок Open Settings Folder(s) Открыть папку наÑ�троек Открыть папки наÑ�троек Открыть папки наÑ�троек <i>Middle-click</i>: %1 <i>Щелчок Ñ�редней кнопкой</i>: %1 Conversion operator Оператор преобразованиÑ� Interpretation of comma ИнтерпретациÑ� запÑ�той Please select interpretation of comma (",") (this can later be changed in preferences). ПожалуйÑ�та, выберите интерпретацию запÑ�той («,») (можно изменить позже в наÑ�тройках). Comma as thousands separator ЗапÑ�таÑ� как разделитель тыÑ�Ñ�ч Comma as separator for function arguments and matrix/vector elements ЗапÑ�таÑ� как разделитель аргументов функции и Ñ�лементов матрицы/вектора Unknown variables (e.g. x, y, z) are by default assumed real. scientific научный engineering инженерный simple проÑ�той RPN ПОЛИЗ Approximation && Fractions Приближение и дроби Approximation and Fractions Приближение и дроби base base units оÑ�нование base number base оÑ�нование Show Custom Column UnitEditDialog General ОÑ�новное Relation Отношение Name: ИмÑ�: Category: КатегориÑ�: Descriptive name: Краткое опиÑ�ание: System: СиÑ�тема: Imperial ИмперÑ�каÑ�/БританÑ�каÑ� US Survey Ð�мериканÑ�каÑ� геодезичеÑ�каÑ� Hide unit Скрыть единицу измерениÑ� Description: РаÑ�ширенное опиÑ�ание: Class: КлаÑ�Ñ�: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. КлаÑ�Ñ�, к которому принадлежит Ñ�та единица измерениÑ�. Именованные производные единицы измерениÑ� определÑ�ÑŽÑ‚Ñ�Ñ� по отношению к другой единице измерениÑ� Ñ� необÑ�зательным показателем, в то времÑ� как безымÑ�нные производные единицы измерениÑ� определÑ�ÑŽÑ‚Ñ�Ñ� выражением через одну или неÑ�колько единиц измерениÑ�. Base unit ОÑ�новнаÑ� единица измерениÑ� Named derived unit ИменованнаÑ� производнаÑ� единица измерениÑ� Derived unit ПроизводнаÑ� единица измерениÑ� Base unit(s): ОÑ�новнаÑ�(ые) единица(Ñ‹) измерениÑ�: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Единица измерениÑ� (длÑ� именованной производной единицы измерениÑ�) или выражение единицы измерениÑ� (длÑ� безымÑ�нной производной единицы измерениÑ�), в отношении которой определена редактируемаÑ� единица измерениÑ� Exponent: Показатель: Relation: Отношение: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Отношение к оÑ�новной единице измерениÑ�. ДлÑ� линейных отношений Ñ�то должно быть проÑ�то чиÑ�ло.<br><br>ДлÑ� нелинейных отношений иÑ�пользуйте \\ x длÑ� множителÑ� и \\ y длÑ� показателÑ� Ñ�тепени (например, «\\x + 273,15» длÑ� отношениÑ� между градуÑ�ами ЦельÑ�иÑ� и Кельвина). Inverse relation: Обратное отношение: Specify for non-linear relation, for conversion back to the base unit. Указать длÑ� нелинейного отношениÑ�, чтобы обратно преобразовать в базовую единицу измерениÑ�. Mix with base unit Смешивать Ñ� базовой единицей измерениÑ� Priority: Приоритет: Minimum base unit number: Минимальное количеÑ�тво базовой единицы измерениÑ�: Use with prefixes by default По умолчанию иÑ�пользовать Ñ� префикÑ�ами Error Ошибка Base unit does not exist. ОÑ�новнаÑ� единица измерениÑ� не Ñ�ущеÑ�твует. Question ВопроÑ� A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерениÑ� или переменнаÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Ð’Ñ‹ хотите её перезапиÑ�ать? Edit Unit Изменить единицу измерениÑ� New Unit Ð�оваÑ� единица измерениÑ� Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Пример: приоритет единицы измерениÑ� «хÑ�нд» уÑ�тановлен на 2, а приоритет единиц измерениÑ� ft (фут) и in (дюйм) на 1, в результате чего вмеÑ�то «17 in = 1 ft + 5 in» получаетÑ�Ñ� «17 in = 1 ft + 1 hand + 1 in». Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Пример: минимальное чиÑ�ло базовых единиц измерениÑ� yd (Ñ�рд) уÑ�тановлено на 12, в результате чего получаетÑ�Ñ� «3 × 3 ft = 9 ft» (вмеÑ�то Э3 yd») и «4 × 3 ft = 4 yd». UnitsDialog Units Единицы измерениÑ� Category КатегориÑ� Unit Единица измерениÑ� New… Ð�оваÑ�… Edit… Правка… Deactivate Деактивировать Delete Удалить Convert ПеревеÑ�ти Insert Ð’Ñ�тавить Favorite Избранный Activate Ð�ктивировать All All units Ð’Ñ�е Uncategorized Без категорий User units ПользовательÑ�кие единицы Favorites Избранное Inactive Ð�еактивные Show hidden units Показать Ñ�крытые единицы измерениÑ� UnknownEditDialog Name: ИмÑ�: Custom assumptions СобÑ�твенные предположениÑ� Type: Тип: Sign: Знак: A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерениÑ� или переменнаÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Ð’Ñ‹ хотите её перезапиÑ�ать? Edit Unknown Variable Изменить переменную неизвеÑ�тного New Unknown Variable Ð�оваÑ� переменнаÑ� неизвеÑ�тного Question ВопроÑ� Temporary ВременнаÑ� VariableEditDialog Name: ИмÑ�: Temporary ВременнаÑ� Value: Значение: Required ОбÑ�зательно Description РаÑ�ширенное опиÑ�ание current result текущий результат Category: КатегориÑ�: Descriptive name: Краткое опиÑ�ание: Hide variable Скрыть переменную Description: РаÑ�ширенное опиÑ�ание: A unit or variable with the same name already exists. Do you want to overwrite it? Единица измерениÑ� или переменнаÑ� Ñ� таким именем уже Ñ�ущеÑ�твует. Ð’Ñ‹ хотите её перезапиÑ�ать? Edit Variable Изменить переменную New Variable Ð�оваÑ� переменнаÑ� Question ВопроÑ� VariablesDialog Variables Переменные Category КатегориÑ� Variable ПеременнаÑ� New Ð�оваÑ� переменнаÑ�/конÑ�танта/матрица Ð�оваÑ� Variable/Constant… ПеременнаÑ�/конÑ�танта… Unknown Variable… ПеременнаÑ� неизвеÑ�тного… Matrix… Матрица… Edit… Правка… Export… ЭкÑ�портировать… Deactivate Деактивировать Delete Удалить Insert Ð’Ñ�тавить Favorite Избранный a matrix матрица a vector вектор positive положительное non-positive не положительное negative отрицательное non-negative неотрицательное non-zero ненулевое integer целое boolean логичеÑ�кое rational рациональное real вещеÑ�твенное complex комплекÑ�ное number чиÑ�ло not matrix не матрица unknown неизвеÑ�тное Default assumptions ПредположениÑ� по умолчанию Activate Ð�ктивировать All All variables Ð’Ñ�е Uncategorized Без категорий User variables ПользовательÑ�кие переменные Favorites Избранное Inactive Ð�еактивные qalculate-qt-5.11.0/translations/qalculate-qt_sl.ts000066400000000000000000016656111520501070600223730ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator RaÄ�unalo Powerful and easy to use calculator Zmogljivo raÄ�unalo, preprosto za uporabo calculation;arithmetic;scientific;financial; izraÄ�un;aritmetika;znanstveno;finanÄ�no;raÄ�unalo;kalkulator; Qalculate! (Qt UI) Qalculate! (vmesnik Qt) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate! je veÄ�namensko namizno raÄ�unalo, ki deluje na veÄ� platformah. Je preprosto za uporabo, prinaÅ¡a pa tako napredna orodja, ponavadi znaÄ�ilna le za kompleksno matematiÄ�no programje, kot tudi uporabna orodja za vsakodnevne potrebe (npr. pretvorbe valut ali izraÄ�un odstotkov). Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. Program vsebuje obsežno knjižnjico prilagodljivih funkcij, enot, izraÄ�unov in pretvorb, fizikalnih konstant, simbolnih izraÄ�unov (tudi integrale in enaÄ�be), poljubno natanÄ�nost, statistiÄ�no negotovost, intervalno aritmetiko, grafe in uporabniku prijazen vmesnik. Argument Rules Pravila za argumente _Cancel _PrekliÄ�i Do not save modifications Ne shrani sprememb _OK _Vredu Accept the modification of argument rules Sprejmi spremembe pravil za argumente Enable rules and type test OmogoÄ�i pravila in piÅ¡i hitro Custom condition Pogoj po meri For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) ÄŒe je na primer argument matrika, ki mora imeti isto Å¡tevilo vrstic in stolpcev: rows(\x) = columns(\x) Allow matrix Dovoli matriko Forbid zero Prepovej niÄ�lo Handle vector Obravnavaj vektor Calculate function for each separate element in vector. IzraÄ�unaj funkcijo za posamezni element vektorja. Min Min Include equals VkljuÄ�i enaÄ�aje Max Max Keyboard Shortcuts Tipkovne bližnjice _Close _Zapri Label Oznaka Left-click Levi klik Right-click Desni klik Middle-click Srednji klik Reset Ponastaviti Value Vrednost Argument name Ime argumenta Calendar Conversion Pretvorba koledarjev Export CSV File Izvozi datoteko CSV Current result Trenutni rezultat Matrix/vector variable Matrika/vektorska spremenljivka File Datoteka Delimiter LoÄ�ilnik Comma Vejica Tabulator Tabulator Semicolon PodpiÄ�je Space Presledek Other Drugo Import CSV File Uvozi datoteko CSV Do not import the file Ne uvozi datoteke Import the file Uvozi datoteko Name of the data file to import Ime datoteke za uvoz Select a file Izberite datoteko Import as Uvozi kot Matrix Matrika If a matrix shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Vectors Vektorji If vectors shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Name Ime Name (or name prefix) used to reference generated variable(s) in expressions Ime (ali njegova predpona), uporabljeno za sklice ustvarjenih spremenljivk v izrazih Descriptive name Opis Title displayed in menus and in variable manager Naslov, prikazan v menijih in upravljalniku spremenljivk Category Kategorija First row Prva vrstica The first row with data to import in the file Prva vrstica s podatki za uvoz v datoteko Includes headings Dodaj naslove If the first row contains column headings Naj prva vrstica vsebuje naslove stolpcev Delimiter used to separate columns in the file LoÄ�ilnik za stolpce v datoteki Custom delimiter LoÄ�ilnik po meri Edit Data Property Uredi lastnost podatka Do not create/modify this data set Ne ustvari/uredi tega podatkovnega nabora Accept the creation/modification of this data set Sprejmi izdelavo/urejevanje tega podatkovnega nabora Name used for reference Ime, uporabljeno za sklic Properties Lastnosti Title displayed in menus and in data set manager Naslov, prikazan v menijih in upravljalniku podatkovnih naborov Description Opis Description of this data property Opis lastnosti podatka Value Type Vrsta vrednosti Text Besedilo Number Å tevilka Expression Izraz Hide Skrij Use as key Uporabi kot kljuÄ� Approximate value Približna vrednost Case sensitive value Vrednost, obÄ�utljiva na velikost Ä�rk Value uses brackets Vrednost uporablja oklepaje Unit expression Izraz enote Edit Data Set Uredi podatkovni nabor Title Naslov Data file Podatkovna datoteka Description of this data set Opis podatkovnega nabora Copyright Copyright General SploÅ¡no Properties: Lastnosti: Definition of the properties of this data set Definicija lastnosti podatkovnega nabora _New _Novo _Edit _Uredi _Delete _IzbriÅ¡i Name used to invoke the function in expressions Ime za klic funkcije v izrazih Object argument name Ime objekta argumenta Property argument name Ime lastnosti argumenta Default property Privzeta lastnost Function Funkcija Edit Data Object Uredi podatkovni objekt Do not create/modify this data object Ne ustvari/uredi tega podatkovnega objekta Accept the creation/modification of this data object Sprejmi izdelavo/urejevanje tega podatkovnega objekta Data Sets new dataset Podatkovni nabori Data Set Podatkovni nabor Create a new data set Ustvari nov podatkovni nabor Edit the selected data set Uredi izbran podatkovni nabor Delete the selected data set IzbriÅ¡i izbran podatkovni nabor Objects Objekti Create a new data object Ustvari nov podatkovni objekt Edit the selected data object Uredi izbran podatkovni objekt Remove the selected data object Odstrani izbran podatkovni objekt Data Set Description Opis podatkovnega nabora Object Attributes Atributi objekta Decimals Decimalke Close this window Zapri okno Min decimals Min. decimalke Max decimals Maks. decimalke Minimal number of displayed decimals NajmanjÅ¡e Å¡tevilo prikazanih decimalk Maximal number of decimals to display (and round to) NajveÄ�je Å¡tevilo decimalk za prikaz (in zaokrožitev) Floating Point Conversion Pretvorba plavajoÄ�e vejice Decimal value DesetiÅ¡ka vrednost Binary value Binarna vrednost Octal value OsmiÅ¡ka vrednost Hexadecimal representation Å estnajstiÅ¡ka predstavitev Conversion error Napaka pri pretvorbi Binary representation Binarna predstavitev Floating point value Vrednost s plavajoÄ�o vejico Format Oblika 16-bit (half precision) 16-bitno (poloviÄ�na natanÄ�nost) 32-bit (single precision) 32-bitno (enojna natanÄ�nost) 64-bit (double precision) 64-bitno (dvojna natanÄ�nost) 80-bit (x86 extended format) 80-bitno (razÅ¡irjena oblika x86) 128-bit (quadruple precision) 128-bitno (Ä�etvorna natanÄ�nost) Hexadecimal value Å estnajstiÅ¡ka vrednost Edit Function Uredi funkcijo _Help _PomoÄ� Do not create/modify this function Ne ustvari/uredi te funkcije Accept the creation/modification of this function Sprejmi izdelavo/urejevanje te funkcije Name used to invoke this function in expressions Ime za klic funkcije v izrazih Title displayed in menus and in function manager Naslov, prikazan v menijih in upravljalniku funkcij Hide function Skrij funkcijo If this function shall be hidden in menus Naj bo ta funkcija skrita v menijih Description of this function Opis funkcije Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Uporabi \x za prvi, \y za drugi in \z za tretji argument. Za veÄ� informacij kliknite gumb za pomoÄ�. Condition Pogoj Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Pogoj, ki mora biti pravilen za funkcijo (npr. Ä�e mora biti drugi argument veÄ�ji od prvega: "\y > \x") Sub-Functions Podfunkcije Arguments: Argumenti: Definition of this function's arguments Definicija funkcijskega argumenta Free Prosto Integer Celo Å¡tevilo Symbol Simbol Date Datum Vector Vektor Positive number Pozitivno Å¡tevilo Non-zero number NeniÄ�elno Å¡tevilo Non-negative number Nenegativno Å¡tevilo Positive integer Pozitivno celo Å¡tevilo Non-zero integer NeniÄ�elno celo Å¡tevilo Non-negative integer Nenegativno celo Å¡tevilo Boolean LogiÄ�na vrednost Object Objekt Unit Enota Variable Spremenljivka Angle Kot Data object Podatkovni objekt Data property Podatkovna lastnost _Add _Dodaj Add entered argument definition Dodaj vneÅ¡eno definicijo argumenta _Apply _Uporabi Modify selected argument Uredi izbran argument Remove selected argument Odstrani izbran argument Rules Pravila Edit conditions for selected argument Uredi pogoje za izbran argument Close this dialog Zapri to okno Precalculate IzraÄ�unaj vnaprej Calculate the subfunction only once, before the parent function IzraÄ�unaj podfunkcijo le enkrat, pred glavno Add entered subfunction Dodaj vneÅ¡eno podfunkcijo Apply changes to the selected subfunction Uporabi spremembe izbrane podfunkcije Remove the selected subfunction Odstrani izbrano funkcijo Functions Funkcije Create a new function Ustvari novo funkcijo Edit the selected function Uredi izbrano funkcijo _Insert _Vnesi Insert (or execute) the selected function into the expression entry Vnesi (ali izvrÅ¡i) izbrano funkcijo v polje za izraz Delete the selected function IzbriÅ¡i izbrano funkcijo (De)activate the selected function O(ne)mogoÄ�i izbrano funkcijo Deacti_vate O_nemogoÄ�i Apply the selected function to the current expression Uporabi izbrano funkcijo v trenutnem izrazu Categor_y Kategor_ija _Function _Funkcija Descri_ption O_pis Degrees Stopinje Radians Radiani Gradians Gradiani Default assumptions Privzete predpostavke Unknown Neznano Not Matrix Ni matrika Complex Kompleksno Real Realno Rational Racionalno Non-Zero NeniÄ�elno Positive Pozitivno Non-Negative Nenegativno Negative Negativno Non-Positive Nepozitivno _File _Datoteka Unknown Variable Neznana spremenljivka Function (simplified) Funkcija (poenostavljena) Import CSV File… Uvozi datoteko CSV... Export CSV File… Izvozi datoteko CSV... _Store Result… _Shrani rezultat... Save Result Image… Shrani sliko rezultata... Save local functions, variables and units Shrani lokalne funkcije, spremenljivke in enote Save Definitions Shrani definicije Import Definitions File… Uvozi datoteko z definicijami... Fetch current exchange rates from the Internet Pridobi trenutna menjalna razmerja iz Interneta Update Exchange Rates Posodobi menjalna razmerja Plot Functions/Data IzriÅ¡i funkcije/podatke Convert Number Bases Pretvori Å¡tevilske osnove Floating Point Conversion (IEEE 754) Pretvorba plavajoÄ�e vejice (IEEE 754) Percentage Calculation Tool Orodje za izraÄ�un odstotkov Periodic Table Periodni sistem Minimal Window Majhno okno _Quit _Izhod Manage Variables Upravljaj spremenljivke Manage Functions Upravljaj funkcije Manage Units Upravljaj enote Manage Data Sets Upravljaj podatkovne nabore Factorize Faktoriziraj Expand RazÅ¡iri Apply partial fraction decomposition to the current result. Uporabi parcialno dekompozicijo ulomkov v trenutnem rezultatu Expand Partial Fractions RazÅ¡iri parcialne ulomke Set Unknowns… Nastavi neznanke... Convert to Unit Pretvori v enoto Set Prefix Nastavi predpono Convert to Unit Expression… Pretvori v enoto izraza... Convert to Base Units Pretvori v osnovne enote Convert to Optimal Unit Pretvori v najustreznejÅ¡o enoto Insert Date… Vnesi datum... Insert Matrix… Vnesi matriko... Insert Vector… Vnesi vektor... _Copy Result _Kopiraj rezultat Customize Keypad Buttons Prilagodite gumbe na tipkovnici _Preferences _Nastavitve _Mode N_aÄ�in Number Base Å tevilska osnova Select Result and Expression Base… Nastavi rezultat in osnovo izraza... Binary Binarno Octal OsmiÅ¡ko Decimal DesetiÅ¡ko Duodecimal DvanajstiÅ¡ko Hexadecimal Å estnajstiÅ¡ko Other… Drugo... Sexagesimal Å estdesetiÅ¡ko Time Format ÄŒasovna oblika Roman Numerals Rimske Å¡tevilke Numerical Display Å tevilski prikaz Normal ObiÄ�ajen Engineering Inženirski Scientific Znanstveni Purely Scientific Le znanstveni Simple Preprost Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Izklopljeno: 1/7 ≈ 0.14285714 Vklopljeno: 1/7 = 0.142857 142857... Indicate Repeating Decimals Navedi ponavljajoÄ�e se decimalke Show Ending Zeroes Prikaži konÄ�ne niÄ�le Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Izklopljeno: 2.5 ≈ 3, 1.5 ≈ 2 Vklopljeno: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even Zaokroži poloviÄ�na Å¡tevila na soda Off: -x + y On: y - x Izklopljeno: -x + y Vklopljeno: y - x Sort Minus Last Minuse razvrsti na koncu Complex Rectangular Form Kompleksna pravokotna oblika Complex Exponential Form Kompleksna eksponentna oblika Complex Polar Form Kompleksna polarna oblika Complex Angle/Phasor Notation Kompleksna kazalÄ�na/fazorska notacija Rational Number Form Racionalna Å¡tevilska oblika 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions DesetiÅ¡ki ulomki 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions ToÄ�ni desetiÅ¡ki ulomki 6/4 = 3/2 6/4 = 3/2 Simple Fractions Preprosti ulomki 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions MeÅ¡ani ulomki Interval Display Intervalni prikaz Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Izklopljeno: 1/2*pi ≈ 1.5707963 Vklopljeno: 1/2*pi = 0.5 pi Adaptive Prilagodljivo Calculates an interval of possible values and keeps track of precision changes. IzraÄ�una interval možnih vrednosti in si zapomni spremembe natanÄ�nosti vmesnih korakov. Significant Digits Pomembne Å¡tevke Interval Interval Plus/Minus Plus/minus Midpoint Sredina Unit Display Prikaz enot Do not use any prefixes in result V rezultatu ne uporabi predpon Show prefixes for primarily SI and CGS units. Prikaži predpone za enote sistemov SI in CGS. Use prefixes for selected units Uporabi predpone za izbrane enote Use prefixes also for currencies Uporabi predpone tudi za valute Use prefixs for all units Uporabi predpone za vse enote Enables automatic use of hekto, deka, deci and centi when prefixes is enabled OmogoÄ�i samodejno uporabo besed hekta, deka, deci in centi, ko so predpone vklopljene. Enable All SI Prefixes OmogoÄ�i vse predpone SI Enables automatic setting of prefix for denominator in addition to the numerator OmogoÄ�i samodejno dodajanje predpon tudi imenovalcu, ne le Å¡tevcu Enable Denominator Prefixes OmogoÄ�i predpone imenovalca Off: J / K On: J * K^-1 Izklopljeno: J / K Vklopljeno: J * K^-1 Negative Exponents Negativni eksponenti Off: (2 m)/s On: 2 (m/s) Izklopljeno: (2 m)/s Vklopljeno: 2 (m/s) Place Units Separately Enote zapiÅ¡i loÄ�eno No Additional Conversion Brez dodatne pretvorbe Convert to Optimal SI Unit Pretvori v najboljÅ¡o enoto SI If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min ÄŒe omogoÄ�eno: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Pretvori v meÅ¡ane enote Abbreviate Names SkrajÅ¡aj imena Enabled Objects OmogoÄ�eni objekti Variables Spremenljivke Units Enote Unknowns Neznanke Units in Physical Constants Enote v fizikalnih konstantah If not enabled, treats all variables as unknown Obravnavaj vse spremenljivke kot neznane, Ä�e onemogoÄ�eno Calculate Variables IzraÄ�unaj spremenljivke Disables/enables complex numbers in result OnemogoÄ�i/omogoÄ�i kompleksna Å¡tevila v rezultatu Allow Complex Result Dovoli kompleksen rezultat Disables/enables infinite numbers in result OnemogoÄ�i/omogoÄ�i neskonÄ�na Å¡tevila v rezultatu Allow Infinite Result Dovoli neskonÄ�en rezultat Approximation Približek Always Exact Vselej toÄ�no Try Exact Poskusi toÄ�no Approximate IzraÄ�unaj približek Interval Arithmetic Intervalna aritmetika Interval Calculation IzraÄ�un intervala Variance Formula EnaÄ�ba za varianco Change angle unit used in trigonometric functions Spremeni kotne enote v trigonometriÄ�nih funkcijah Angle Unit Kotne enote None Brez Assumptions Predpostavke Algebraic Mode AlgebraiÄ�en naÄ�in Assume that unknown denominators are non-zero Predpostavi, da so neznani imenovalci neniÄ�elni Non-Zero Denominators NeniÄ�elni imenovalci Warn when unknown denominators are assumed non-zero Opozori, ko so neznani imenovalci lahko niÄ�elni Warn About Denominators Assumed Non-Zero Opozori o neniÄ�elnih imenovalcih Parsing Mode NaÄ�in obdelave Adaptive Parsing Prilagodljiva obdelava Parse Implicit Multiplication First Sprva obdelaj implicitno množenje Conventional Parsing ObiÄ�ajna obdelava RPN Syntax Sintaksa RPN Off: xy = x*y On: xy != x*y Izklopljeno: xy = x*y Vklopljeno: xy != x*y Limit Implicit Multiplication Omejitev implicitnega množenja Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Obdelaj decimalna Å¡tevila kot približke z natanÄ�nostjo, enako Å¡tevilu Å¡tevk. Izklopljeno: 1.1 * 1.1 = 1.21 Vklopljeno: 1.1 * 1.1 ≈ 1.2 Read Precision ToÄ�nost branja _Precision _ToÄ�nost _Decimals _Decimalke Calculate As You Type RaÄ�unaj med vnaÅ¡anjem Activate the RPN stack. Vklopi sklad RPN. RPN Mode NaÄ�in RPN Meta Modes MetanaÄ�ini Save Mode… Shrani naÄ�in... Delete Mode… IzbriÅ¡i naÄ�in... Save Default _Mode Shrani privzet _naÄ�in Fu_nctions F_unkcije _Variables _Spremenljivke _Units _Enote _Contents _Vsebina Report a Bug PoroÄ�aj o hroÅ¡Ä�u Check for Updates Preveri za posodobitve _About _O programu Toggle minimal window Prikaži/skrij majhno okno Calculation result Rezultat izraÄ�una _Keypad _Tipkovnica Toggles persistent keypad (makes it possible to show keypad and history simultaneously) Prikaže/skrije stalno tipkovnico (omogoÄ�i hkraten prikaz tipkovnice in zgodovine) _History _Zgodovina C_onversion Pretv_orbe RPN Stack Sklad RPN Insert the selected value Vnesi izbrano vrednost Insert the selected text Vnesi izbrano besedilo Copy the selected text Kopiraj izbrano besedilo Add the selected value(s) PriÅ¡tej izbrane vrednosti Subtract the selected value(s) OdÅ¡tej izbrane vrednosti Multiply the selected value(s) Zmnoži izbrane vrednosti Divide the the selected value(s) Zdeli izbrane vrednosti Raise to the power of the selected value Potenciraj na potenco izbrane vrednosti Calculate the square root of the selected value IzraÄ�unaj kvadratni koren izbranih vrednosti History Zgodovina Subtract the top value from the second value OdÅ¡tej vrhnjo vrednost od druge Multiply the top two values Zmnoži vrhnji dve vrednosti Divide the second value by the top value Zdeli drugo vrednost od vrhnje Raise the second value to the power of the top value Potenciraj drugo vrednost na potenco vrhnje Negate the top value (Ctrl+-) Negiraj vrhnjo vrednost (Ctrl+-) Invert the top value Inverz vrhnje vrednosti Calculate the square root of the top value IzraÄ�unaj kvadratni koren vrhnje vrednosti Calculate the sum of all values IzraÄ�unaj seÅ¡tevek vseh vrednosti Rotate the stack or move selected register up Zavrti sklad ali premakni izbran register gor Rotate the stack or move selected register down Zavrti sklad ali premakni izbran register dol Swap the two top values or move the selected value to the top of the stack Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada Copy the selected or top value to the top of the stack Kopiraj izbrano ali vrhnjo vrednost na vrh sklada Enter the top value from before the last numeric operation Vnesi vrhnjo vrednost na mesto pred zadnjo Å¡tevilsko operacijo Delete the top or selected value IzbriÅ¡i vrhnjo ali izbrano vrednost Edit the selected value Uredi izbrano vrednost Clear the RPN stack PoÄ�isti sklad RPN Unit(s) and prefix to convert result to Enote in predpone za pretvorbo rezultata v Convert Pretvori Continuous conversion Nenehna pretvorba Automatically convert result to the current unit expression as long as the conversion box is visible. Samodejno pretvori rezultat v trenutno enoto izraza, doker je viden obrazec za pretvorbo. Add prefix Dodaj predpono If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". ÄŒe enota izraza ne vsebuje predpon, dodaj najustreznejÅ¡o. To operacijo lahko prekliÄ�ete s predponama "?" ali "0" pred izrazom. Conversion Pretvorba Show/hide programming keypad Prikaži/skrij programirno tipkovnico Exact ToÄ�no Fraction Ulomek Numerical display Å tevilski prikaz Pure ÄŒisto Number base Å tevilska osnova Time format ÄŒasovna oblika Roman Rimsko sin sin cos cos tan tan ln ln Equals EnaÄ�aji sqrt sqrt sum sum Unknown variable Neznana spremenljivka mod mod mean srednja vrednost Store result as a variable Shrani rezultat kot spremenljivko STO Standard calculator button. Do not use more than three characters. STO Convert number bases Pretvori Å¡tevilske osnove Imaginary unit i (√-1) Imaginarna enota i (√-1) Manage units Upravljaj enote Conversion operator Operator za pretvorbo Kilogram Kilogram Two's complement input Vhod dvojiÅ¡kega komplementa Two's complement output Izhod dvojiÅ¡kega komplementa Bitwise Exclusive OR LogiÄ�ni ekskluzivni OR Bitwise Left Shift LogiÄ�ni pomik v levo Bitwise Right Shift LogiÄ�ni pomik v desno Floating point conversion Pretvorba plavajoÄ�e vejice Show/hide left keypad Prikaži/skrij levo tipkovnico Show/hide right keypad Prikaži/skrij desno tipkovnico DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result PrejÅ¡nji rezultat ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Dodaj v izraz Persistent Keypad Stalna tipkovnica Edit Uredi Delete IzbriÅ¡i Update Posodobi Insert Value Vnesi vrednost Insert Text Vnesi besedilo Insert Parsed Text Vnesi obdelano besedilo Copy Kopiraj Copy Full Text Kopiraj celotno besedilo Search… IÅ¡Ä�i... Add Bookmark… Dodaj zaznamek... Bookmarks Zaznamki Protect ZaÅ¡Ä�iti Move To Top Premakni na vrh Remove Odstrani Clear All PoÄ�isti vse _Copy _Kopiraj _Store… _Shrani... Save Image… Shrani sliko... _Factorize _Faktoriziraj _Expand _RazÅ¡iri _Normal _ObiÄ�ajno Sc_ientific _Znanstveno Purel_y Scientific _Le znanstveno Simp_le Pr_eprosto _Binary D_vojiÅ¡ko _Octal _OsmiÅ¡ko _Decimal _DesetiÅ¡ko _Hexadecimal _Å estnajstiÅ¡ko Decimal Fraction DesetiÅ¡ki ulomek Exact Decimal Fraction ToÄ�en desetiÅ¡ki ulomek Simple Fraction Preprost ulomek Mixed Fraction MeÅ¡an ulomek _Abbreviate Names Skr_ajÅ¡aj imena C_onvert… Pretv_ori... Convert to Base _Units Pretvori v osnovne _enote Convert _to Optimal Unit Pretvori v na_justreznejÅ¡o enoto Use Optimal Prefix Uporabi najustreznejÅ¡o predpono Convert to Pretvori v Convert to UTC Pretvori v UTC Convert to Calendars Pretvori v koledarje Use prefixes for all units Uporabi predpone za vse enote Enable All SI Prefi_xes OmogoÄ�i vse pre_dpone SI View/Edit Matrix Poglej/uredi matriko View/Edit Vector Poglej/uredi vektor Copy Text Kopiraj besedilo To Top Na vrh Swap Zamenjaj Up Gor Down Dol Negate Negiraj Invert Inverz Square Kvadrat Square Root Kvadratni koren Clear Stack PoÄ�isti sklad Select Number Base… Izberi Å¡tevilsko osnovo... Store result Shrani rezultat Insert the matrix/vector into the expression Vstavi matriko/vektor v izraz Rows Vrste Number of rows in this matrix (rows displayed for vectors) Å tevilo vrst v matriki (za vektorje) Columns Stolpci Number of columns in this matrix (columns displayed for vectors) Å tevilo stolpcev v matriki (prikazane za vektorje) If this is a matrix or vector ÄŒe je to matrika ali vektor Elements Elementi Current element: Trenutni element: Edit Matrix Uredi matriko Do not create/modify this matrix/vector Ne ustvari/uredi te matrike/vektorja Create/modify the matrix/vector Ustvari/uredi to matriko/vektor Accept the creation/modification of this matrix/vector Sprejmi izdelavo/urejevanje te matrike/vektorja Name used to reference this variable in expressions Ime za klic te spremenljivke v izrazih Names Imena Add new name Dodaj novo ime Apply changes to the selected name Uporabi spremembe izbranega imena Remove the selected name Odstrani izbrano ime Abbreviation OkrajÅ¡ava Unicode Unicode Plural Množina Suffix Pripona Reference Sklic Avoid input Izogni se vhodu Case sensitive Razlikuj velikosti Ä�rk Completion only Le dopolnjevanje Number Bases Å tevilske osnove Roman numerals Rimske Å¡tevilke BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract OdÅ¡tej Multiply Zmnoži Divide Zdeli Bitwise AND Bitni AND Bitwise OR Bitni OR Bitwise NOT Bitni NOT Clear PoÄ�isti Enter two values, of which at most one is a percentage, and the others will be calculated for you. Vnesite dve vrednosti, kjer je vsaj ena v odstotkih. Druge bodo izraÄ�unane samodejno. Percentage Odstotek Calculate IzraÄ�unaj Value 1 Vrednost 1 2 compared to 1 2 v primerjavi z 1 Change from 1 to 2 Spremeni iz 1 v 2 Value 2 Vrednost 2 1 compared to 2 1 v primerjavi z 2 Change from 2 to 1 Spremeni iz 2 v 1 Plot IzriÅ¡i _Save S_hrani Save as png, svg, postscript, eps, latex or fig Shrani kot png, svg, postscript, eps, latex ali fig Vector/matrix Vektor/matrika Paired matrix Parna matrika if you want to split matrix in rows instead of columns ÄŒe želite razdeliti matriko po vrsticah namesto po stolpcih X variable Spremenljivka X The variable name used in expression Ime spremenljivke, uporabljene v izrazu Style Slog Line ÄŒrta Points ToÄ�ke Line with points ÄŒrta s toÄ�kami Boxes/bars Zaboji/stolpci Histogram Histogram Steps Koraki Candlesticks SveÄ�e Dots Pike Smoothing Glajenje Monotonic Monotonsko Natural cubic splines Naravni kubiÄ�ni zlepek Bezier Bezier Bezier (monotonic) Bezier (monotonsko) Y-axis Os Y Primary Primarno Secondary Sekundarno _Remove Odst_rani Data Podatki Minimum x value NajmanjÅ¡a vrednost x Maximum x value NajveÄ�ja vrednost x Sampling rate Hitrost vzorÄ�enja Step size Velikost koraka Function Range Funkcijsko obmoÄ�je Display grid Prikaži mrežo Display full border Prikaži cel rob Minimum y value NajmanjÅ¡a vrednost y Maximum y value NajveÄ�ja vrednost y Logarithmic x scale Logaritemska skala x Logarithmic y scale Logaritemska skala y X-axis label Oznaka osi X Y-axis label Oznaka osi Y Line width Å irina Ä�rt Color display Barvni prikaz Color Barva Monochrome Enobarvno Legend placement Postavitev legende Top-left Zgoraj levo Top-right Zgoraj desno Bottom-left Spodaj levo Bottom-right Spodaj desno Below Spodaj Outside Izven Appearance Videz Precision ToÄ�nost _Recalculate Znova iz_raÄ�unaj Recalculate expression Znova izraÄ�unaj izraz The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Prikazano Å¡tevilo pomembnih Å¡tevk (preprosti aritmetiÄ�ni izraÄ�uni so vedno toÄ�ni) Preferences Nastavitve Save mode on exit NaÄ�in shranjevanja ob izhodu If the mode of the calculator shall be restored Naj se naÄ�in raÄ�unala ohrani Save definitions on exit Shrani definicije ob izhodu If changes to functions, units and variables shall be saved automatically Naj se spremembe funkcij, enot in spremenljivk shranijo samodejno Clear history on exit PoÄ�isti zgodovino ob izhodu Allow multiple instances Dovoli veÄ� oken naenkrat Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Dovoli, da je veÄ� oken raÄ�unala odprtih naenkrat. Vedite, da se bodo shranili le naÄ�in, zgodovina in definicije zadnjega zaprtega raÄ�unala. Notify when a new version is available Obvesti, ko je na voljo nova razliÄ�ica Use keyboard keys for RPN Uporabi tipkovniÄ�ne tipke za RPN Use keyboard operator keys for RPN operations (+-*/^). Uporabi tipkovniÄ�ne tipke za operacije RPN (+-*/^). Use caret for bitwise XOR Uporabi streÅ¡ico za bitni XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Vnesite operacijo XOR (⊻) s streÅ¡ico (^) na tipkovnici (AltGr+3). Eksponentni operator (^) je lahko vneÅ¡en kot Ctrl+*. Time limit for plot: ÄŒasovna omejitev za izris: Behavior Vedenje Enable Unicode symbols OmogoÄ�i simbole Unicode Disable this if you have problems with some fancy characters OnemogoÄ�ite, Ä�e imate težave z nestandardnimi znaki Ignore system language (requires restart) Prezri sistemski jezik (zahteva vnoviÄ�en zagon) Application name Ime programa Result Rezultat Application name + result Ime programa + rezultat Mode NaÄ�in Application name + mode Ime programa + naÄ�in Window title Naslov okna Default Privzeto Number of expression lines Å tevilo vrstic izraza Display expression status Prikaži stanje izraza If as-you-type expression status shall be displayed below the expression entry Naj se med vpisovanjem pod izrazom prikazuje njegovo stanje Persistent keypad Stalna tipkovnica Look & Feel Videz in obÄ�utek Binary two's complement representation Upodobitev binarnega dvojiÅ¡kega komplementa If two's complement representation shall be used for negative binary numbers. Naj se dvojiÅ¡ki komplement uporabi za negativna dvojiÅ¡ka Å¡tevila. Hexadecimal two's complement representation Upodobitev Å¡estnajstiÅ¡kega dvojiÅ¡kega komplementa If two's complement representation shall be used for negative hexadecimal numbers. Naj se dvojiÅ¡ki komplement uporabi za negativna Å¡estnajstiÅ¡ka Å¡tevila. Use lower case letters in non-decimal numbers Uporabi male Ä�rke v nedesetiÅ¡kih Å¡tevilih If lower case letters should be used in numbers with non-decimal base Naj se male Ä�rke uporabljajo v Å¡tevilih z nedesetiÅ¡ko osnovo Alternative base prefixes Alternativne predpone osnov If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Naj se Å¡estnajstiÅ¡ka Å¡tevila prikazujejo s predpono "0x0" in dvojiÅ¡ka s "0b00" Spell out logical operators ÄŒrkuj logiÄ�ne operatorje If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Naj se logiÄ�na in/ali prikažeta kot "&&"/"||" ali "and"/"or" If "e" shall be used instead of "E" in numbers Naj se v Å¡tevilih namesto "E" uporabi "e" Use E-notation instead of 10<sup><i>n</i></sup> Uporabi E-notacijo namesto 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Uporabi mali "e" (kot v 1e10) Use 'j' as imaginary unit Uporabi 'j' za imaginarno enoto Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Uporabi 'j' namesto 'i' za privzet simbol imaginarne enote, ki bo postavljen pred imaginarni del Å¡tevila. Use comma as decimal separator Uporabi vejico kot desetiÅ¡ki loÄ�ilnik Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Dovoli, da se pika uporabi za loÄ�ilnik tisoÄ�ic namesto za alternativni decimalni znak. Ignore comma in numbers Prezri vejice v Å¡tevilih Allow commas, ',', to be used as thousands separator instead of as an function argument separator Dovoli, da se vejica uporabi za loÄ�ilnik tisoÄ�ic namesto za loÄ�ilnik funkcijskih argumentov Ignore dots in numbers Prezri pike v Å¡tevilih Digit grouping Å tevke v skupinah off izklopljeno standard obiÄ�ajno local lokalno Multiplication sign Znak za množenje Division sign Znak za deljenje Copy digit separator Kopiraj desetiÅ¡ki loÄ�ilnik Deactivate to remove digit separator when copying result OnemogoÄ�ite za odstranitev loÄ�ilnika Å¡tevk med kopiranjem rezultata Numbers & Operators Å tevilke & operatorji Use binary prefixes for information units Uporabi binarne predpone za informacijske enote Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Za informacijske enote uporabi dvojiÅ¡ke predpone namesto desetiÅ¡kih (npr. bajti) Conversion to local currency Pretvorba v krajevno valuto Automatically convert to the local currency when optimal unit conversion is activated. Samodejno pretvori v krajevno valuto, Ä�e je omogoÄ�ena izbira najustreznejÅ¡e enote za pretvrobo. Update exchange rates on start Posodobi menjalna razmerja ob zagonu If current exchange rates shall be downloaded from the internet at program start Naj se trenutna menjalna razmerja prenesejo iz Interneta ob zagonu programa Exchange rates updates Posodobitve menjalnih razmerij Units & Currencies Enote & valute Show expression completion suggestions Prikaži predloge za dopolnitev izraza Search titles and countries IÅ¡Ä�i naslove in države Minimum characters Najmanj znakov Popup delay (ms) Zamik prikaza pojavnega okna (ms) Completion Dopolnjevanje Status warning color Barva opozorila o stanju Status error color Barva opozorila o napaki Custom status font Pisava opozorila If you want to use a font other than the default in the status display below the expression entry ÄŒe želite uporabiti neprivzeto pisavo v prikazu stanja pod obrazcem za vnos izraza Custom expression font Pisava izraza If you want to use a font other than the default in the expression entry ÄŒe želite uporabiti neprivzeto pisavo v obrazcu za vnos izraza Custom result font Pisava rezultata If you want to use a font other than the default in the result display ÄŒe želite uporabiti neprivzeto pisavo v prikazu rezultata Custom keypad font Pisava tipkovnice If you want to use a font other than the default in the keypad ÄŒe želite uporabiti neprivzeto pisavo na tipkovnici Custom application font Pisava programa If you want to use a font other than the default for the whole application ÄŒe želite uporabiti neprivzeto pisavo v celotnem programu Text color Barva besedila Fonts & Colors Pisave in barve Other: Drugo: Bijective base-26 Bijektivna osnova 26 <b>Result Base</b> <b>Osnova rezultata</b> <b>Expression Base</b> <b>Osnova izraza</b> New Keyboard Shortcut Nova tipkovna bližnjica Edit Variable Uredi spremenljivko Advanced Napredno Accept the creation/modification of this variable Sprejmi izdelavo/urejevanje te spremenljivke x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Uporabi x, y in z po vrsti za prvi, drugi in tretji funkcijski argument. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Uporabi \x, \y in \z po vrsti za prvi, drugi in tretji funkcijski argument.S tem se izognete morebitnim sporom s spremenljivkami, funkcijami in enotami. Edit Unit Uredi enoto Do not create/modify this unit Ne ustvari/uredi te enote Accept the creation/modification of this unit Sprejmi izdelavo/urejevanje te enote Singular form of this unit's name Edninska oblika imena enote Title displayed in menus and in unit manager Naslov, prikazan v menijih in upravljalniku enot System Sistem Imperial imperialni US Survey ameriÅ¡ki Hide unit Skrij enoto If this unit shall be hidden in menus Naj enota ne bo prikazana v menijih Class Razred Base unit Osnovna enota Named derived unit Imenovana izpeljana enota Derived unit Izpeljana enota Base unit(s) Osnovne enote Exponent Eksponent Exponent of the base unit Eksponent osnovne enote Relation Razmerje Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Razmerje z osnovno enoto. Za linearno odvisnost je to le Å¡tevilo. Za nelinearna razmerja uporabite \x kot faktor in \y kot eksponent (npr. "\x + 273.15" za razmerje med stopinjami Celzija in Kelvina). Relation is exact Razmerje je toÄ�no If the relation is precise ÄŒe je razmerje toÄ�no Inverse relation Inverzno razmerje Specify for non-linear relation, for conversion back to the base unit. DoloÄ�ite za nelinearna razmerja, za pretvorbo nazaj v osnono enoto. Mix with base unit MeÅ¡aj z osnovno enoto - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Se odliÄ�i, s katerimi enotami je meÅ¡ana osnovna, Ä�e obstaja veÄ� možnosti. - Izvirna enota ne bo bila meÅ¡ana z enotami nižje prioritete. - Nižja vrednost pomeni viÅ¡jo prioriteto. Priority Prioriteta Minimum base unit number Å tevilo najmanjÅ¡e osnovne enote Use with prefixes by default Privzeto uporabi s predponami Create a new unit Ustvari novo enoto Edit the selected unit Uredi izbrano enoto Insert the selected unit into the expression entry Vstavi izbrano funkcijo v obrazec za izraz C_onvert Pretv_ori Convert the result to the selected unit Pretvori rezultat v izbrano enoto Delete the selected unit IzbriÅ¡i izbrano enoto (De)activate the selected unit O(ne)mogoÄ�i izbrano enoto _Unit _Enota Convert between units Pretvarjaj med enotami = = Conver_sion Pretvor_ba Converted value Pretvorjena vrednost Value to convert from Vrednost, iz katere se pretvarja Type anywhere PiÅ¡ite kamorkoli Edit Unknown Variable Uredi neznano spremenljivko Do not create/modify this unknown variable Ne ustvari/uredi te neznane spremenljivke Accept the creation/modification of this unknown variable Sprejmi izdelavo/urejevanje te neznane spremenljivke Name used to reference this unknown variable in expressions Ime za klic te neznane spremenljivke v izrazih Use custom assumptions Uporabi predpostavke po meri Type Vrsta Real Number Realno Å¡tevilo Rational Number Racionalno Å¡tevilo Sign Znak The category this unknown variable belongs to Kategorija, kateri neznana spremenljivka pripada Value of this variable (expression) Vrednost te spremenljivke (izraz) value is exact vrednost je toÄ�na If the value is precise ÄŒe je vrednost toÄ�na The category this variable belongs to Kategorija, kateri spremenljivka pripada Create a new variable Ustvari novo spremenljivko Edit the selected variable Uredi izbrano spremenljivko Insert the selected variable into the expression entry Vstavi izbrano spremenljivko v obrazec za izraz Delete the selected variable IzbriÅ¡i izbrano spremenljivko (De)activate the selected variable O(ne)mogoÄ�i izbrano spremenljivko E_xport I_zvozi _Variable Spremenlji_vka Start a new instance of the application Zaženi nov primerek programa Display the application version Prikaži razliÄ�ico programa Specify the window title Dolo�i ime okna TITLE TITLE Expression to calculate Izraz za izra�un [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matemati�en izraz, npr. "5 + 2 / 3", in pritisnite Enter. ans ans Last Answer Zadnji odgovor answer odgovor Answer 2 Odgovor 2 Answer 3 Odgovor 3 Answer 4 Odgovor 4 Answer 5 Odgovor 5 Failed to load global definitions! Napaka pri nalaganju globalnih definicij! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Vse By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Privzeto je dovoljen le en primerek (eno glavno okno) %s. Če je odprtih ve� primerkov, se bodo shranile definicije, spremenljivke, funkcije, zgodovina ... le zadnjega okna. Želite vseeno dovoliti ve� primerkov programa? c-format Right-click/long press: %s Desni klik/dolg klik: %s c-format Right-click: %s Desni klik: %s c-format Middle-click: %s Srednji klik: %s c-format Cycle through previous expression Kroži med prejšnjimi izrazi Move cursor left or right Premakni kazalko levo ali desno Move cursor to beginning or end Premakni kazalko na za�etek ali konec Uncertainty/interval Negotovost/interval Relative error Relativna napaka Argument separator Lo�ilnik argumentov Blank space Prazen prostor New line Nova vrstica Smart parentheses Pametni oklepaji Vector brackets Oklepaji za vektorje Left parenthesis Levi oklepaj Left vector bracket Levi vektorski oklepaj Right parenthesis Desni oklepaj Right vector bracket Desni vektorski oklepaj Decimal point Decimalno mesto Raise (Ctrl+*) Dvigni (Ctrl+*) Add Dodaj Backspace Backspace Previous result (static) Prejšnji stati�ni rezultat Calculate expression Izra�unaj izraz Set unknowns Nastavi neznanke more Show further items in a submenu ve� Logical AND Logi�ni AND Logical OR Logi�ni OR Logical NOT Logi�ni NOT Toggle Result Base Preklopi osnovo rezultata Open menu with stored variables Odpri meni s shranjenimi spremenljivkami Index Indeks Calculate expression and add to stack Izra�unaj izraz in dodaj na sklad Flag Zastavica Matrices Matrike Gregorian gregorijansko Revised Julian (Milanković) popravljeno julijansko (Milanković) Julian julijansko Islamic (Hijri) islamsko (Hijri) Hebrew hebrejsko Chinese kitajsko Persian (Solar Hijri) perzijsko (Solar Hijri) Coptic koptsko Ethiopian etiopsko Indian (National) indijsko (nacionalno) Action Dejanje Key combination Tipkovno zaporedje Raise Dvigni History Answer Value Zgodovinska vrednost odgovora History Index(es) Zgodovinski indeks(i) History index %s does not exist. Zgodovinski indeks %s ne obstaja. c-format expression izraz History Parsed Expression Zgodovinsko obdelan izraz Set Window Title Nastavi ime okna Failed to open %s. %s Napaka pri odpiranju datoteke %s. %s c-format Could not display help for Qalculate!. Napaka pri prikazu pomo�i za Qalculate!. Could not display help for Qalculate!. %s Napaka pri prikazu pomo�i za Qalculate!. %s c-format approx. približno Stop process Ustavi operacijo Clear expression Po�isti izraz EXACT EXACT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Želite posodobiti menjalna razmerja zdaj? It has been %s day since the exchange rates last were updated. Od posodobitve menjalnih razmerij je minil %s dan. Od posodobitve menjalnih razmerij sta minila %s dni. Od posodobitve menjalnih razmerij so minili %s dnevi. Od posodobitve menjalnih razmerij je minilo %s dni. c-format It has been %s days since the exchange rates last were updated. Do not ask again Ne vprašaj znova It took too long to generate the plot data. Izdelava grafa je trajala predolgo. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Izdelava grafa je trajala predolgo. Prosimo, zmanjšajte hitrost vzor�enja ali povišajte �asovno omejitev v nastavitvah. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. Ko se med izra�unom pojavijo napake, opozorila in druge informacije, se spremeni ikono desno od izraza. Če miškin kazalec pridržite nad njem ali ga kliknete, se bo prikazalo sporo�ilo. Path of executable not found. Pot do zagonske datoteke ni bila najdena. curl not found. Orodje curl ni bilo najdeno. Failed to run update script. %s Napaka pri zagonu posodobitvenega skripta. %s c-format Failed to check for updates. Napaka pri preverjanju posodobitev. No updates found. Ni novih posodobitev. A new version of %s is available at %s. Do you wish to update to version %s. Nova razli�ica %s je na voljo na %s. Želite nadgraditi na razli�ico %s? c-format A new version of %s is available. You can get version %s at %s. Nova razli�ica %s je na voljo. Razli�ico %s lahko pridobite na %s. c-format Too many arguments for %s(). Preve� argumentov za %s(). c-format argument argument Uncategorized nekategorizirano hexadecimal šestnajstiško octal osmiško decimal desetiško duodecimal dvanajstiško binary binarno roman rimsko bijective bijektivno sexagesimal šestdesetiško time �as bases osnove calendars koledarji rectangular pravokotno cartesian kartezi�no exponential eksponentno polar polarno angle kot phasor fazor optimal najustreznejše base osnova mixed mešano fraction ulomek factors deleži partial fraction parcialni ulomek factorize faktoriziraj expand razširi hexadecimal number šestnajstiško število octal number osmiško število decimal number desetiško število duodecimal number dvanajstiško število binary number binarno število roman numerals rimske številke bijective base-26 bijektivna osnova 26 sexagesimal number šestdesetiško število 32-bit floating point 32-bitna plavajo�a vejica 64-bit floating point 64-bitna plavajo�a vejica 16-bit floating point 16-bitna plavajo�a vejica 80-bit (x86) floating point 80-bitna (x86) plavajo�a vejica 128-bit floating point 128-bitna plavajo�a vejica time format �asovna oblika number bases številske osnove optimal unit najustreznejša enota base units osnovne enote mixed units mešane enote expanded partial fractions razširjeni parcialni ulomki complex rectangular form kompleksna pravokotna oblika complex exponential form kompleksna eksponentna oblika complex polar form kompleksna polarna oblika complex cis form kompleksna oblika cis complex angle notation kompleksna kazal�na notacija complex phasor notation kompleksna fazorska notacija UTC time zone Časovni pas UTC number base %s številska osnova %s c-format Inactive Neaktivno Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Pridobi podatke iz nabora %s za dan objekt in lastnost. Če je "info" vnešen kot objekt, se bo odprlo pojavno okno z njegovimi lastnostmi. c-format Example: Primer: Arguments Argumenti optional optional argument neobvezno default: argument default, in description privzeto: Requirement Zahteva key indicating that the property is a data set key tipka Acti_vate Akti_viraj a previous result prejšnji rezultat matrix matrika vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neni�elno boolean logi�na vrednost integer celo število rational racionalno real realno complex kompleksno number številka (not matrix) (ni matrika) unknown neznano default assumptions privzete predpostavke Variable does not exist anymore. Spremenljivka ne obstaja ve�. Data Retrieval Function Funkcija za pridobitev podatkov Insert function Vnesi funkcijo Insert function (dialog) Vnesi funkcijo (obrazec) Insert variable Vnesi spremenljivko Insert unit Vnesi enoto Insert text Vnesi besedilo Insert date Vnesi datum Insert vector Vnesi vektor Insert matrix Vnesi matriko Insert smart parentheses Vnesi pametne oklepaje Convert to unit Pretvori v enoto Convert to unit (entry) Pretvori v enoto (vnos) Convert to optimal unit Pretvori v najustreznejšo enoto Convert to base units Pretvori v osnovne enote Convert to optimal prefix Pretvori v najustreznejšo predpono Convert to number base Pretvori v številsko osnovo Factorize result Faktoriziraj rezultat Expand result Razširi rezultat Expand partial fractions Razširi parcialne ulomke RPN: down RPN: dol RPN: up RPN: gor RPN: swap RPN: izmenjaj RPN: copy RPN: kopiraj RPN: lastx RPN: lastx RPN: delete register RPN: izbriši register RPN: clear stack RPN: po�isti sklad Load meta mode Naloži metana�in Set expression base Nastavi osnovo izraza Set result base Nastavi osnovo rezultata Toggle exact mode Prikaži/skrij to�en na�in Set angle unit to degrees Nastavi kotne enote v stopinje Set angle unit to radians Nastavi kotne enote v radiane Set angle unit to gradians Nastavi kotne enote v gradiane Toggle simple fractions Prikaži/skrij preproste ulomke Toggle mixed fractions Prikaži/skrij mešane ulomke Toggle scientific notation Prikaži/skrij znanstveno notacijo Toggle simple notation Prikaži/skrij preprosto notacijo Toggle RPN mode Prikaži/skrij na�in RPN Toggle calculate as you type Prikaži/skrij izra�un med pisanjem Toggle programming keypad Prikaži/skrij tipkovnico Show keypad Prikaži tipkovnico Show history Prikaži zgodovino Search history Zgodovina iskanj Show conversion Prikaži pretvorbo Show RPN stack Prikaži sklad RPN Manage variables Upravljaj spremenljivke Manage functions Upravljaj funkcije Manage data sets Upravljaj nabore podatkov New variable Nova spremenljivka New function Nova funkcija Open plot functions/data Odpri orodje za izris funkcij/podatkov Open convert number bases Odpri orodje za pretvorbo številskih osnov Open floating point conversion Odpri orodje za pretvorbo plavajo�e vejice Open calender conversion Odpri orodje za pretvorbo koledarjev Open percentage calculation tool Odpri orodje za izra�un odstotkov Open periodic table Odpri periodni sistem Update exchange rates Posodobi menjalna razmerja Copy result Kopiraj rezultat Save result image Shrani sliko rezultata Help Pomo� Quit Izhod Prefixes Predpone No Prefix Ni predpone Optimal Prefix Najustreznejša predpona Prefix Predpona Complex angle/phasor notation Kompleksna kazal�na/fazorska notacija Number bases Številske osnove Base units Osnovne enote Binary number Binarno število Calendars Koledarji Complex cis form Kompleksna oblika cis Decimal number Desetiško število Duodecimal number Dvanajstiško število Complex exponential form Kompleksna eksponentna oblika Factors Deleži 16-bit floating point binary format 16-bitna binarna oblika s plavajo�o vejico 32-bit floating point binary format 32-bitna binarna oblika s plavajo�o vejico 64-bit floating point binary format 64-bitna binarna oblika s plavajo�o vejico 80-bit (x86) floating point binary format 80-bitna (x86) binarna oblika s plavajo�o vejico 128-bit floating point binary format 128-bitna binarna oblika s plavajo�o vejico Hexadecimal number Šestnajstiško število Mixed units Mešane enote Octal number Osmiško število Optimal units Najustreznejše enote Expanded partial fractions Razširjeni parcialni ulomki Complex polar form Kompleksna polarna oblika Complex rectangular form Kompleksna pravokotna oblika Sexagesimal number Šestdesetiško število and in or ali undefined nedefinirano result is too long see history rezultat je predolg poglej zgodovino calculation was aborted izra�un prekinjen RPN Register Moved Register RPN premaknjen RPN Operation Operacija RPN Processing… Obdelujem... result processing was aborted obdelava rezultata je bila prekinjena Factorizing… Faktoriziram... Expanding partial fractions… Razširjam parcialne ulomke... Expanding… Razširjam... Calculating… Ra�unam... Converting… Pretvarjam... Fetching exchange rates. Pridobivam menjalna razmerja. Time zone parsing failed. Obdelava �asovnega pasu spodletela. Keep open Obdrži odprto C_alculate Izr_a�unaj Apply to Stack Premakni na sklad Argument Argument True Pravilno False Napa�no Info Info Edit Unit (global) Uredi enoto (globalno) New Unit Nova enota Empty name field. Prazno polje za ime. A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Base unit does not exist. Osnovna enota ne obstaja. Edit Function (global) Uredi funkcijo (globalno) New Function Nova funkcija Yes Da No Ne Empty expression field. Prazno polje za izraz. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again Funkcija s tem imenom že obstaja. Jo želite prepisati? Unit does not exist Enota ne obstaja Edit Unknown Variable (global) Uredi neznano spremenljivko (globalno) New Unknown Variable Nova neznana spremenljivka An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Variable (global) Uredi spremenljivko (globalno) New Variable Nova spremenljivka Empty value field. Prazno polje za vrednost. Edit Vector Uredi vektor Edit Vector (global) Uredi vektor (globalno) New Vector Nov vektor Edit Matrix (global) Uredi matriko (globalno) New Matrix Nova matrika Vector Result Vektorski rezultat Matrix Result Matri�ni rezultat New Data Object Nov podatkovni objekt text besedilo approximate približno Edit Data Set (global) Uredi podatkovni nabor (globalni) New Data Set Nov podatkovni nabor info info Property Lastnost No file name entered. Ime datoteke ni vnešeno. No delimiter selected. Lo�ilnik ni izbran. Could not import from file %s Uvoz iz datoteke %s spodletel c-format No variable name entered. Ime spremenljivke ni vnešeno. No known variable with entered name found. Spremenljivke s takim imenom ne obstajajo. Could not export to file %s Izvoz v datoteko %s spodletel c-format My Variables Moje spremenljivke Couldn't write definitions Pisanje definicij neuspešno Preset Predloga Abort Prekli�i Undo Razveljavi Redo Uveljavi Completion Mode Na�in dopolnjevanja Limited strict completion Omejeno strogo dopolnjevanje Strict completion Strogo dopolnjevanje Limited full completion Omejeno polno dopolnjevanje Full completion Polno dopolnjevanje No completion Brez dopolnjevanja Save Mode Shranjevalni na�in Preset mode cannot be overwritten. Predložen na�in ne more biti prepisan. Delete Mode Brisalni na�in Couldn't write preferences to %s Pisanje nastavitev v %s neuspešno c-format never nikoli ask vprašaj %i day %i dan %i dni %i dnevi %i dni c-format %i days log10 function not found. Funkcija log10 ni bila najdena. Search Iskanje _Search I_skanje Remove Bookmark Odstrani zaznamek Add Bookmark Dodaj zaznamek A bookmark with the selected name already exists. Do you want to overwrite it? Zaznamek s tem imenom že obstaja. Ga želite prepisati? No items found Ni najdenih elementov Select date Izberi datum Rectangular form Pravokotna oblika Exponential form Eksponentna oblika Polar form Polarna oblika Angle/phasor notation Kazal�na/fazorska notacija Optimal unit Najustreznejša enota Optimal prefix Najustreznejša predpona All functions Vse funkcije All variables Vse spremenljivke Select definitions file Izberite definicijsko datoteko _Import _Uvozi Could not copy %s to %s. Kopiranje %s v %s ni mogo�e. c-format Could not read %s. Branje %s spodletelo. c-format Could not copy file to %s. Kopiranje v %s ni mogo�e. c-format Unsupported base. Nepodprta osnova. The selected Chinese year does not exist. Izbrano kitajsko leto ne obstaja. Conversion to Gregorian calendar failed. Pretvorba v gregorijanski koledar spodletela. Calendar conversion failed for: %s. Pretvorba koledarja spodletela: %s c-format Select file to save PNG image to Izberite datoteko za izvoz slike PNG Allowed File Types Dovoljene datote�ne vrste All Files Vse datoteke Cannot delete unit as it is needed by other units. do not delete units that are used by other units Brisanje enote neuspešno, saj je potrebovana pri drugih enotah none ni� result is too long rezultat je predolg translator-credits Nejc Bertoncelj <nejc@bertoncelj.eu.org> bertronika <nejc@bertoncelj.eu.org> Mode not found. Na�in ni bil najden. Elements (in horizontal order) Elementi (v vodoravnem zaporedju) Select file to import Izberite datoteko za uvoz _Open _Odpri Select file to export to Izberite datoteko za izvoz A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Nastal je spor z objetkom z istim imenom. Če nadaljujete in shranite spremembe, bo obstoje�i objekt prepisan ali deaktiviran. Ali želite nadaljevati? Set key combination Nastavi zaporedje tipk Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Pritisnite zaporedje tipk, ki ga želite uporabiti za to dejanje (pritisnite Esc za preklic) No keys Ni tipk Empty value. Prazna vrednost. Function not found. Funkcija ni bila najdena. Variable not found. Spremenljivka ni bila najdena. Unit not found. Enota ni bila najdena. The key combination is already in use. Do you wish to replace the current action? To zaporedje tipk je že v uporabi. Ali ga želite prepisati s tem dejanjem? Select file to export Izberite datoteko za izvoz Empty expression. Prazen izraz. Empty x variable. Prazna spremenljivka x. Element Data Podatki o elementu Classification Klasifikacija Alkali Metal Alkalijska kovina Alkaline-Earth Metal Zemljoalkalijska kovina Lanthanide Lantanoid Actinide Aktinoid Transition Metal Prehodni element Metal Kovina Metalloid Polkovina Polyatomic Non-Metal Poliatomske nekovine Diatomic Non-Metal Dvoatomske nekovine Noble Gas Žlahtni plin Unknown chemical properties Neznane kemijske lastnosti No unknowns in result. V rezultatu ni neznank. Set Unknowns Nastavi neznanke Copy result to clipboard Kopiraj rezultat x x If a matrix or vectors shall be generated from the contents of the file Naj se matrike ali vektorji ustvarijo iz vsebine datoteke Use dark theme Uporabi temno temo Add the two top values Keypad Prištej vrhnji dve vrednosti u Manage units button u to Button for convert to operator v Add Keypad Prištej Base Unit Osnovna enota Alias Vzdevek Composite Unit Kompozitum enot Fonts Pisave Chain Calculation Izra�un intervala <b>Name</b> <b>Ime</b> <b>Type</b> <b>Vrsta</b> <b>Relation</b> <b>Razmerje</b> 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i sekund c-format Ent Ent Defaults Privzete Customize Buttons Pisava opozorila Names details Podrobnosti imen Rational number form Racionalna številska oblika Decimal fractions Desetiški ulomki Exact decimal fractions To�ni desetiški ulomki Simple fractions Preprosti ulomki Mixed fractions Mešani ulomki settitle settitle ArgumentEditDialog Name: Ime: Type: Vrsta: Free Prosto Number Številka Integer Celo število Symbol Simbol Text Besedilo Date Datum Vector Vektor Matrix Matrika Boolean Logi�na vrednost Angle Kot Object Objekt Function Funkcija Unit Enota Variable Spremenljivka File Datoteka Enable rules and type test Omogo�i pravila in piši hitro Custom condition: Pogoj po meri: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Če je na primer argument matrika, ki mora imeti isto število vrstic in stolpcev: rows(\x) = columns(\x) Allow matrix Dovoli matriko Forbid zero Prepovej ni�lo Handle vector Obravnavaj vektor Calculate function for each separate element in vector. Izra�unaj funkcijo za posamezni element vektorja. Min Min Include equals Vklju�i ena�aje Max Max CSVDialog Import CSV File Uvozi datoteko CSV Export CSV File Izvozi datoteko CSV Current result Trenutni rezultat Matrix/vector variable: Matrika/vektorska spremenljivka: File: Datoteka: Import as Uvozi kot matrix matrika vectors vektorji Name: Ime: First row: Prva vrstica: Includes headings Dodaj naslove Delimiter: Lo�ilnik: Comma Vejica Tabulator Tabulator Semicolon Podpi�je Space Presledek Other Drugo Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Error Could not import from file %1 Uvoz iz datoteke %1 spodletel No matrix or vector variable with the entered name was found. Could not export to file %1 Izvoz v datoteko %1 spodletel CalendarConversionDialog Calendar Conversion Pretvorba koledarjev Gregorian gregorijansko Hebrew hebrejsko Islamic (Hijri) islamsko (Hijri) Persian (Solar Hijri) perzijsko (Solar Hijri) Indian (National) indijsko (nacionalno) Chinese kitajsko Julian julijansko Revised Julian (Milanković) popravljeno julijansko (Milanković) Coptic koptsko Ethiopian etiopsko Error The selected Chinese year does not exist. Izbrano kitajsko leto ne obstaja. Conversion to Gregorian calendar failed. Pretvorba v gregorijanski koledar spodletela. Calendar conversion failed for: %1. Pretvorba koledarja spodletela: %1. DataObjectEditDialog %1: %1: Default Privzeto Approximate Izra�unaj približek Exact To�no Edit Data Object Uredi podatkovni objekt New Data Object Nov podatkovni objekt DataPropertyEditDialog Name: Ime: Title: Naslov: Descriptive name: Opisno ime: Description: Opis: Value type: Vrsta vrednosti: Expression Izraz Number Številka Text Besedilo Unit expression: Izraz enote: Use as key Uporabi kot klju� Case sensitive value Vrednost, ob�utljiva na velikost �rk Approximate value Približna vrednost Value uses brackets Vrednost uporablja oklepaje Hide Skrij Edit Data Property Uredi lastnost podatka DataSetEditDialog General Splošno Properties Lastnosti Function Funkcija Title: Naslov: Descriptive name: Opisno ime: Data file: Podatkovna datoteka: Description: Opis: Copyright: Copyright: Title Naslov Name Ime Type Vrsta Add Dodaj Edit Uredi Remove Odstrani Name: Ime: Object argument name: Ime objekta argumenta: Property argument name: Ime lastnosti argumenta: Default property: Privzeta lastnost: text besedilo approximate približno number številka expression izraz key tipka Question A function with the same name already exists. Do you want to overwrite the function? Funkcija s tem imenom že obstaja. Jo želite prepisati? Data Sets Podatkovni nabori Object Objekt Property Lastnost Edit Data Set Uredi podatkovni nabor New Data Set Nov podatkovni nabor DataSetsDialog Data Sets Podatkovni nabori Data sets: Podatkovni nabori: New… Novo… Edit… Uredi… Delete Izbriši Objects: Objekti: Data set description: Opis podatkovnega nabora: Object attributes: Atributi objekta: Properties Lastnosti key tipka Data Retrieval Function Funkcija za pridobitev podatkov argument argument ExpressionEdit matrix matrika vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neni�elno boolean logi�na vrednost integer celo število rational racionalno real realno complex kompleksno number številka (not matrix) (ni matrika) unknown neznano default assumptions privzete predpostavke Prefix: Predpona: Complex Angle/Phasor Notation Kompleksna kazal�na/fazorska notacija Base units Osnovne enote Number Base Številska osnova Binary-Coded Decimal Bijective Base-26 Bijektivna osnova 26 Binary Number Binarno število Calendars Koledarji Complex cis Form Kompleksna oblika cis Decimal Number Desetiško število Duodecimal Number Dvanajstiško število Complex Exponential Form Kompleksna eksponentna oblika Factors Deleži 16-bit Floating Point Binary Format 16-bitna binarna oblika s plavajo�o vejico 32-bit Floating Point Binary Format 32-bitna binarna oblika s plavajo�o vejico 64-bit Floating Point Binary Format 64-bitna binarna oblika s plavajo�o vejico 80-bit (x86) Floating Point Binary Format 80-bitna (x86) binarna oblika s plavajo�o vejico 128-bit Floating Point Binary Format 128-bitna binarna oblika s plavajo�o vejico Fraction Ulomek Decimal Fraction Desetiški ulomek Hexadecimal Number Šestnajstiško število Latitude Zemljepisna širina Longitude Zemljepisne dolžine Mixed Units Mešane enote Octal Number Osmiško število Optimal Unit Najustreznejša enota Optimal Prefix Najustreznejša predpona Expanded Partial Fractions Razširjeni parcialni ulomki Complex Polar Form Kompleksna polarna oblika Complex Rectangular Form Kompleksna pravokotna oblika Roman Numerals Rimske številke Sexagesimal Number Šestdesetiško število Time Format Časovna oblika Unicode Unicode UTC Time Zone Časovna oblika Scientific Notation Znanstveno notacijo Simple Notation Preprosto notacijo Custom Po meri Undo Razveljavi Redo Uveljavi Cut Copy Kopiraj Paste Delete Izbriši Calculate Selection Insert Date… Vnesi datum... Insert Matrix… Vnesi matriko... Select All Clear Po�isti Clear History Po�isti zgodovino Completion Dopolnjevanje No completion Brez dopolnjevanja Limited strict completion Omejeno strogo dopolnjevanje Strict completion Strogo dopolnjevanje Limited full completion Omejeno polno dopolnjevanje Full completion Polno dopolnjevanje Delayed completion Expression Status Stanje izraza Off Izklopljeno In history list In expression field In status bar With delay Z zamudo With adaptive delay Without delay Brez zamude Automatically calculate selection Use input method Matrix Matrika Too many arguments for %1(). Preve� argumentov za %1(). argument argument %1: %1: comment komentar MC (memory clear) MS (memory store) M+ (memory plus) M− (memory minus) factorize faktoriziraj expand razširi hexadecimal šestnajstiško hexadecimal number šestnajstiško število octal osmiško octal number osmiško število decimal desetiško decimal number desetiško število duodecimal dvanajstiško duodecimal number dvanajstiško število binary binarno binary number binarno število roman rimsko roman numerals rimske številke bijective bijektivno bijective base-26 bijektivna osnova 26 binary-coded decimal BCD sexagesimal šestdesetiško sexagesimal number šestdesetiško število latitude longitude 32-bit floating point 32-bitna plavajo�a vejica 64-bit floating point 64-bitna plavajo�a vejica 16-bit floating point 16-bitna plavajo�a vejica 80-bit (x86) floating point 80-bitna (x86) plavajo�a vejica 128-bit floating point 128-bitna plavajo�a vejica time �as time format �asovna oblika scientific znanstveni scientific notation znanstveno notacijo engineering inženirski engineering notation simple preprost simple notation preprosto notacijo bases osnove number bases številske osnove calendars koledarji optimal najustreznejše optimal unit najustreznejša enota prefix predpona optimal prefix base osnova base units osnovne enote mixed mešano mixed units mešane enote decimals decimal fraction fraction ulomek factors deleži Engineering Notation base base units osnova partial fraction parcialni ulomek expanded partial fractions razširjeni parcialni ulomki rectangular pravokotno cartesian kartezi�no complex rectangular form kompleksna pravokotna oblika exponential eksponentno complex exponential form kompleksna eksponentna oblika polar polarno complex polar form kompleksna polarna oblika complex cis form kompleksna oblika cis angle kot complex angle notation kompleksna kazal�na notacija phasor fazor complex phasor notation kompleksna fazorska notacija UTC time zone Časovni pas UTC base number base osnova number base %1 številska osnova %1 Data object Podatkovni objekt FPConversionDialog Floating Point Conversion (IEEE 754) Pretvorba plavajo�e vejice (IEEE 754) Format Oblika 16-bit (half precision) 16-bitno (polovi�na natan�nost) 32-bit (single precision) 32-bitno (enojna natan�nost) 64-bit (double precision) 64-bitno (dvojna natan�nost) 80-bit (x86 extended format) 80-bitno (razširjena oblika x86) 128-bit (quadruple precision) 128-bitno (�etvorna natan�nost) Microchip 24-bit Microchip 32-bit Value Vrednost Decimal value Desetiška vrednost Binary representation Binarna predstavitev Hexadecimal representation Šestnajstiška predstavitev Floating point value Vrednost s plavajo�o vejico Conversion error Napaka pri pretvorbi FunctionEditDialog Required Zahtevano Details Podrobnosti Description Opis Name: Ime: Expression: Izraz: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y oz z (npr. "(x+y)/2") oz \x, \y, \z, \a, \b, … (npr. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Uporabite x, y oz z (npr. "(x+y)/2") oz \x, \y, \z, \a, \b, … (npr. "(\x+\y)/2") Category: Kategorija: Descriptive name: Opisno ime: Hide function Skrij funkcijo Example: Primer: Description: Opis: Condition: Pogoj: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Pogoj, ki mora biti pravilen za funkcijo (npr. �e mora biti drugi argument ve�ji od prvega: "\y > \x") Sub-functions: Podfunkcije: Expression Izraz Precalculate Izra�unaj vnaprej Reference Sklic Add Dodaj Edit Uredi Remove Odstrani Arguments: Argumenti: Name Ime Type Vrsta Warning Conversion (using "to") is not supported in functions. Question A function with the same name already exists. Do you want to overwrite the function? Funkcija s tem imenom že obstaja. Jo želite prepisati? Edit Function Uredi funkcijo New Function Nova funkcija FunctionsDialog Functions Funkcije Category Kategorija Function Funkcija New… Novo… Edit… Uredi… Deactivate Onemogo�i Delete Izbriši Calculate… Izra�unaj… Apply Uporabi Insert Vnesi Favorite Priljubljeni argument argument Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Pridobi podatke iz nabora %1 za dan objekt in lastnost. Če je "info" vnešen kot objekt, se bo odprlo pojavno okno z njegovimi lastnostmi. Example: Primer: Arguments Argumenti optional optional argument neobvezno default: argument default privzeto: Requirement: Required condition for function Zahteva: Properties Lastnosti %1: %1: key indicating that the property is a data set key tipka Activate Aktiviraj All All functions Vse Uncategorized nekategorizirano User functions Uporabniške funkcije Favorites Priljubljene Inactive Neaktivno HistoryView Insert Value Vnesi vrednost Insert Text Vnesi besedilo Copy Kopiraj Copy unformatted ASCII Kopiraj neoblikovano ASCII Select All Search… Iš�i... Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matemati�en izraz, npr. "5 + 2 / 3", in pritisnite Enter. Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Zgoraj vpišite matemati�en izraz, npr. "5 + 2 / 3", in pritisnite Enter. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Spodaj vpišite matemati�en izraz, npr. "5 + 2 / 3", in pritisnite Enter. Exchange rate source(s): updated %1 Comment Komentar Protect Zaš�iti Add Comment… Dodaj komentar… Move to Top Premakni na vrh Remove Odstrani Clear Po�isti Edit Comment… Uredi komentar… Text: Besedilo: Search Iskanje KeypadButton <i>Right-click/long press</i>: %1 <i>Desni klik/dolg klik</i>: %1 <i>Right-click</i>: %1 <i>Desni klik</i>: %1 <i>Long press</i>: %1 <i>Dolg klik</i>: %1 Open menu <i>Middle-click</i>: %1 <i>Srednji klik</i>: %1 KeypadWidget Memory store Memory clear Memory recall Memory add Memory subtract STO Standard calculator button. Do not use more than three characters. STO Store Shrani New function Nova funkcija sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval Negotovost/interval Relative error Relativna napaka Interval Interval Move cursor left Premakni kazalko levo Move cursor to start Premakni kazalko na za�etek Move cursor right Premakni kazalko desno Move cursor to end Premakni kazalko na konec Logical AND Logi�ni AND Logical OR Logi�ni OR Bitwise Exclusive OR Logi�ni ekskluzivni OR Logical NOT Logi�ni NOT Bitwise Left Shift Logi�ni pomik v levo Bitwise Right Shift Logi�ni pomik v desno cmp rot a→1 Expand partial fractions Razširi parcialne ulomke DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants All constants Percentage Calculation Tool Orodje za izra�un odstotkov more ve� All units Vse enote All variables Vse spremenljivke Action Dejanje Interval Display Intervalni prikaz Adaptive Prilagodljivo Significant digits Pomembne števke Plus/minus Plus/minus Relative Concise Interval Calculation Izra�un intervala Variance formula Ena�ba za varianco Interval arithmetic Intervalna aritmetika Allow concise uncertainty input Complex number form Rectangular Exponential Polar Angle/phasor Type Assumptions type Vrsta Sign Assumptions sign Znak Default assumptions Privzete predpostavke Number Številka Real Realno Rational Racionalno Integer Celo število Boolean Logi�na vrednost Unknown Unknown assumptions sign Neznano Non-zero Neni�elno Positive Pozitivno Non-negative Nenegativno Negative Negativno Non-positive Nepozitivno Factorize Faktoriziraj Expand Razširi Add column Add row Remove column Remove row Left parenthesis Levi oklepaj Left vector bracket Levi vektorski oklepaj Right parenthesis Desni oklepaj Right vector bracket Desni vektorski oklepaj Smart parentheses Pametni oklepaji Vector brackets Oklepaji za vektorje Argument separator Lo�ilnik argumentov Blank space Prazen prostor New line Nova vrstica Decimal point Decimalno mesto Previous result (static) Prejšnji stati�ni rezultat Multiplication Button Action Label: Oznaka: Action: Dejanje: None Brez Value: Vrednost: Bitwise AND Bitni AND Bitwise Shift Delete Izbriši Backspace Backspace Addition Plus Subtraction Minus Division Bitwise OR Bitni OR Bitwise NOT Bitni NOT Clear expression Po�isti izraz Calculate expression Izra�unaj izraz NamesEditDialog Name Ime Abbreviation Okrajšava Plural Množina Reference Sklic Avoid input Izogni se vhodu Unicode Unicode Suffix Pripona Case sensitive Razlikuj velikosti �rk Completion only Le dopolnjevanje Add Edit Uredi Remove Odstrani Warning Illegal name A function with the same name already exists. Funkcija s tem imenom že obstaja. A unit or variable with the same name already exists. Enota ali spremenljivka s tem imenom že obstaja. PercentageCalculationDialog Percentage Odstotek Value 1 Vrednost 1 Value 2 Vrednost 2 Change from 1 to 2 Spremeni iz 1 v 2 Change from 2 to 1 Spremeni iz 2 v 1 2 compared to 1 2 v primerjavi z 1 1 compared to 2 1 v primerjavi z 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Vnesite dve vrednosti, kjer je vsaj ena v odstotkih. Druge bodo izra�unane samodejno. Clear Po�isti PeriodicTableDialog Periodic Table Periodni sistem Element Data Podatki o elementu Alkali Metal Alkalijska kovina Alkaline-Earth Metal Zemljoalkalijska kovina Lanthanide Lantanoid Actinide Aktinoid Transition Metal Prehodni element Metal Kovina Metalloid Polkovina Polyatomic Non-Metal Poliatomske nekovine Diatomic Non-Metal Dvoatomske nekovine Noble Gas Žlahtni plin Unknown chemical properties Neznane kemijske lastnosti Unknown Neznano %1: %1: PlotDialog Plot Izriši Data Podatki Title: Naslov: Expression: Izraz: Function Funkcija Vector/matrix Vektor/matrika Paired matrix Parna matrika Rows Vrste X variable: Spremenljivka X: Style: Slog: Line Črta Points To�ke Line with points Črta s to�kami Boxes/bars Zaboji/stolpci Histogram Histogram Steps Koraki Candlesticks Sve�e Dots Pike Polar Smoothing: Glajenje: None Brez Monotonic Monotonsko Natural cubic splines Naravni kubi�ni zlepek Bezier Bezier Bezier (monotonic) Bezier (monotonsko) Y-axis: Os Y: Primary Primarno Secondary Sekundarno Add Dodaj Apply Uporabi Remove Odstrani Title Naslov Expression Izraz Function Range Funkcijsko obmo�je Minimum x value: Najmanjša vrednost x: Maximum x value: Najve�ja vrednost x: Sampling rate: Hitrost vzor�enja: Step size: Velikost koraka: Show real and imaginary parts Appearance Videz Display grid Prikaži mrežo Display full border Prikaži cel rob Minimum y value: Najmanjša vrednost y: Maximum y value: Najve�ja vrednost y: Logarithmic x scale: Logaritemska skala x: Logarithmic y scale: Logaritemska skala y: X-axis label: Oznaka osi X: Y-axis label: Oznaka osi Y: Line width: Širina �rt: Legend placement: Postavitev legende: Top-left Zgoraj levo Top-right Zgoraj desno Bottom-left Spodaj levo Bottom-right Spodaj desno Below Spodaj Outside Izven Calculating… Ra�unam... Cancel Prekli�i Processing… Obdelujem... PreferencesDialog Look && Feel Videz && ob�utek Numbers && Operators Številke && operatorji Units && Currencies Enote & valute Ignore system language (requires restart) Prezri sistemski jezik (zahteva vnovi�en zagon) Allow multiple instances Dovoli ve� oken naenkrat Clear history on exit Po�isti zgodovino ob izhodu Close application with Escape key Keep above other windows Window title: Nastavi ime okna: Application name Ime programa Result Rezultat Application name + result Ime programa + rezultat Workspace Application name + workspace Style: Slog: Default (requires restart) Default style Dark mode Temni na�in Colorize result Custom result font Pisava rezultata Custom expression font Pisava izraza Custom keypad font Pisava tipkovnice Custom application font Pisava programa Custom result font: Pisava rezultata: Custom expression font: Pisava izraza: Custom status bar font: Custom keypad font: Pisava tipkovnice: Custom application font: Pisava programa: Display expression status Prikaži stanje izraza Expression after calculation: Keep expression Clear expression Po�isti izraz Replace with result Replace with result if shorter Use keyboard keys for RPN Uporabi tipkovni�ne tipke za RPN Parsing mode: Na�in obdelave: Adaptive Prilagodljivo Conventional Obi�ajna Implicit multiplication first Sprva implicitno množenje Chain RPN RPN Read precision To�nost branja Limit implicit multiplication Omejitev implicitnega množenja Interval calculation: Izra�un intervala: Variance formula Ena�ba za varianco Interval arithmetic Intervalna aritmetika Factorize result Faktoriziraj rezultat Binary two's complement representation Upodobitev binarnega dvojiškega komplementa Hexadecimal two's complement representation Upodobitev šestnajstiškega dvojiškega komplementa Use lower case letters in non-decimal numbers Uporabi male �rke v nedesetiških številih Spell out logical operators Črkuj logi�ne operatorje Use E-notation instead of 10^x Uporabi E-notacijo namesto 10^x Preferences Nastavitve ms milliseconds ms Use E-notation instead of 10^n Uporabi E-notacijo namesto 10^n Use 'j' as imaginary unit Uporabi 'j' za imaginarno enoto Use comma as decimal separator Uporabi vejico kot desetiški lo�ilnik Ignore comma in numbers Prezri vejice v številih Ignore dots in numbers Prezri pike v številih Round halfway numbers away from zero Round halfway numbers to even Zaokroži polovi�na števila na soda Indicate repeating decimals Navedi ponavljajo�e se decimalke Language: Jezik: Max history lines saved: Use caret for bitwise XOR Uporabi strešico za bitni XOR Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Custom history font: Pisava za zgodovino: Expression status: Stanje izraza: Place expression field below history Off Izklopljeno In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Parsed Parsed (compact) Entered Entered + parsed Entered + parsed (compact) Automatically copy result Simplified percentage calculation Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary Binarno Hexadecimal Šestnajstiško Binary bits: Automatic Samodejno Use special duodecimal symbols Use Unicode division slash in output Copy unformatted ASCII by default Place percent button in number pad Indicate repeating decimals: Navedi ponavljajo�e se decimalke: Ellipsis Overline Digit grouping: Števke v skupinah: None Brez Standard Obi�ajno Local Lokalno Custom Po meri Interval display: Intervalni prikaz: Significant digits Pomembne števke Interval Interval Plus/minus Plus/minus Concise Midpoint Sredina Lower Upper Rounding: Complex number form: Rectangular Exponential Polar Angle/phasor Enable units Abbreviate names Skrajšaj imena Use binary prefixes for information units Uporabi binarne predpone za informacijske enote Automatic unit conversion: No conversion Base units Osnovne enote Optimal units Najustreznejše enote Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Default currency: Fonts Pisave Units Enote Calculation Restart required Please restart the program for the language change to take effect. Default Privzeto Notify when a new version is available Obvesti, ko je na voljo nova razli�ica Calculate as you type delay: Multiplication sign: Znak za množenje: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes Enable denominator prefixes Enable units in physical constants Temperature calculation: Absolute Relative Hybrid Exchange rates updates: Posodobitve menjalnih razmerij: %n day(s) %n dan %n dni %n dnevi %n dni days dan dni dnevi dni QApplication Execute expressions and commands from a file FILE DATOTEKA Start a new instance of the application Zaženi nov primerek programa Specify the window title Dolo�i ime okna TITLE TITLE Update exchange rates Posodobi menjalna razmerja Display the application version Prikaži razli�ico programa Open workspace Expression to calculate Izraz za izra�un [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Privzeto je dovoljen le en primerek (eno glavno okno) %1. Če je odprtih ve� primerkov, se bodo shranile definicije, spremenljivke, funkcije, zgodovina ... le zadnjega okna. Želite vseeno dovoliti ve� primerkov programa? Allow multiple instances? %1 is already running. Failed to load global definitions! Napaka pri nalaganju globalnih definicij! answer odgovor History Answer Value Zgodovinska vrednost odgovora History Index(es) Zgodovinski indeks(i) History index %s does not exist. Zgodovinski indeks %s ne obstaja. Last Answer Zadnji odgovor Answer 2 Odgovor 2 Answer 3 Odgovor 3 Answer 4 Odgovor 4 Answer 5 Odgovor 5 Memory Error Couldn't write preferences to %1 Pisanje nastavitev v %1 neuspešno Function not found. Funkcija ni bila najdena. Variable not found. Spremenljivka ni bila najdena. Unit not found. Enota ni bila najdena. Unsupported base. Nepodprta osnova. Unsupported value. QalculateQtSettings Update exchange rates? Posodobi menjalna razmerja? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Od posodobitve menjalnih razmerij je minil %n dan. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij sta minila %n dni. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij so minili %n dnevi. Želite posodobiti menjalna razmerja zdaj? Od posodobitve menjalnih razmerij je minilo %n dni. Želite posodobiti menjalna razmerja zdaj? Fetching exchange rates. Pridobivam menjalna razmerja. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… Pridobivam menjalna razmerja… Error Warning Information Path of executable not found. Pot do zagonske datoteke ni bila najdena. curl not found. Orodje curl ni bilo najdeno. Failed to run update script. %1 Napaka pri zagonu posodobitvenega skripta. %1 Failed to check for updates. Napaka pri preverjanju posodobitev. No updates found. Ni novih posodobitev. A new version of %1 is available at %2. Do you wish to update to version %3? Nova razli�ica %1 je na voljo na %2. Želite nadgraditi na razli�ico %3? A new version of %1 is available. You can get version %3 at %2. Nova razli�ica %1 je na voljo. Razli�ico %3 lahko pridobite na %2. Download %1: %2 Insert function Vnesi funkcijo Insert function (dialog) Vnesi funkcijo (obrazec) Insert variable Vnesi spremenljivko Approximate result Negate Negiraj Invert Inverz Insert unit Vnesi enoto Insert text Vnesi besedilo Insert operator Insert date Vnesi datum Insert matrix Vnesi matriko Insert smart parentheses Vnesi pametne oklepaje Convert to unit Pretvori v enoto Convert Pretvori Convert to optimal unit Pretvori v najustreznejšo enoto Convert to base units Pretvori v osnovne enote Convert to optimal prefix Pretvori v najustreznejšo predpono Convert to number base Pretvori v številsko osnovo Factorize result Faktoriziraj rezultat Expand result Razširi rezultat Expand partial fractions Razširi parcialne ulomke RPN: down RPN: dol RPN: up RPN: gor RPN: swap RPN: izmenjaj RPN: copy RPN: kopiraj RPN: lastx RPN: lastx RPN: delete register RPN: izbriši register RPN: clear stack RPN: po�isti sklad Set expression base Nastavi osnovo izraza Set result base Nastavi osnovo rezultata Set angle unit to degrees Nastavi kotne enote v stopinje Set angle unit to radians Nastavi kotne enote v radiane Set angle unit to gradians Nastavi kotne enote v gradiane Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode Prikaži/skrij na�in RPN Show general keypad Toggle programming keypad Prikaži/skrij tipkovnico Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history Zgodovina iskanj Clear history Po�isti zgodovino Show variables Show functions Show units Show data sets Store result Shrani rezultat MC (memory clear) MR (memory recall) MS (memory store) M+ (memory plus) M− (memory minus) New variable Nova spremenljivka New function Nova funkcija Open plot functions/data Odpri orodje za izris funkcij/podatkov Open convert number bases Odpri orodje za pretvorbo številskih osnov Open floating point conversion Odpri orodje za pretvorbo plavajo�e vejice Open calender conversion Odpri orodje za pretvorbo koledarjev Open percentage calculation tool Odpri orodje za izra�un odstotkov Open periodic table Odpri periodni sistem Update exchange rates Posodobi menjalna razmerja Copy result Kopiraj rezultat Insert result Open mode menu Open menu Help Pomo� Quit Izhod Toggle chain mode Toggle keep above Show completion (activate first item) Clear expression Po�isti izraz Delete Izbriši Backspace Backspace Home End Right Left Up Gor Down Dol Undo Razveljavi Redo Uveljavi Calculate expression Izra�unaj izraz Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default Privzeto Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing Vredu Cancel Only used when Qt translation is missing Prekli�i Close Only used when Qt translation is missing Zapri &Yes Only used when Qt translation is missing &Da &No Only used when Qt translation is missing &Ne &Open Only used when Qt translation is missing &Odpri &Save Only used when Qt translation is missing &Shrani &Select All Only used when Qt translation is missing Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu Meni Menu (%1) Meni (%1) New Novo Function… Funkcije… Variable/Constant… Spremenljivka/konstanta… Unknown Variable… Neznana spremenljivka… Matrix… Matrika… Workspaces Open… Odpri… Open default Odpri privzeto Save Shrani Save As… Shrani kot… Import CSV File… Uvozi datoteko CSV... Export CSV File… Izvozi datoteko CSV... Functions Funkcije Variables and Constants Spremenljivke in konstante Units Enote Plot Functions/Data Izriši funkcije/podatke Floating Point Conversion (IEEE 754) Pretvorba plavajo�e vejice (IEEE 754) Calendar Conversion Pretvorba koledarjev Update Exchange Rates Posodobi menjalna razmerja Normal Mode Obi�ajen na�in RPN Mode Na�in RPN Chain Mode Keyboard Shortcuts Tipkovne bližnjice Preferences Nastavitve Help Pomo� Report a Bug Poro�aj o hroš�u Check for Updates Preveri za posodobitve About %1 O %1 Quit Izhod Mode Na�in Mode (%1) Na�in (%1) General Display Mode Splošni na�in prikaza Normal Obi�ajen Scientific Znanstveni Engineering Inženirski Simple Preprost Angle Unit Kotne enote Radians Radiani Degrees Stopinje Gradians Gradiani Approximation Približek Automatic Automatic approximation Samodejno Dual Dual approximation Dvojno Exact Exact approximation To�no Approximate Izra�unaj približek Assumptions Predpostavke Type Assumptions type Vrsta Number Številka Real Realno Rational Racionalno Integer Celo število Boolean Logi�na vrednost Sign Assumptions sign Znak Unknown Unknown assumptions sign Neznano Non-zero Neni�elno Positive Pozitivno Non-negative Nenegativno Negative Negativno Non-positive Nepozitivno Result Base Osnovo rezultata Binary Binarno Octal Osmiško Decimal Desetiško Hexadecimal Šestnajstiško Other Drugo Approximation and Fractions Približek in ulomki Duodecimal Dvanajstiško Sexagesimal Šestdesetiško Time format Časovna oblika Roman numerals Rimske številke Unicode Unicode Bijective base-26 Bijektivna osnova 26 Binary-coded decimal (BCD) Custom: Number base Expression Base Osnovo izraza Other: Number base Drugo: Precision: To�nost: Min decimals: Min. decimalke: Max decimals: Maks. decimalke: off Max decimals izklopljeno Convert Pretvori Convert (%1) Pretvori (%1) Store Shrani Store (%1) Shrani (%1) Functions (%1) Funkcije (%1) Keypad Tipkovnica Keypad (%1) Tipkovnica (%1) Number bases Številske osnove Unit… Enote… Data Sets Podatkovni nabori Percentage Calculation Tool Orodje za izra�un odstotkov Periodic Table Periodni sistem Units (%1) Enote (%1) Plot Functions/Data (%1) Izriši funkcije/podatke (%1) Number Bases (%1) Številske osnove (%1) Binary: Binarno: Octal: Osmiško: Decimal: Desetiško: Hexadecimal: Šestnajstiško: RPN Stack Sklad RPN Rotate the stack or move the selected register up (%1) Zavrti sklad ali premakni izbran register gor (%1) Rotate the stack or move the selected register down (%1) Zavrti sklad ali premakni izbran register dol (%1) Swap the top two values or move the selected value to the top of the stack (%1) Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada (%1) Copy the selected or top value to the top of the stack (%1) Kopiraj izbrano ali vrhnjo vrednost na vrh sklada (%1) Enter the top value from before the last numeric operation (%1) Vnesi vrhnjo vrednost na mesto pred zadnjo številsko operacijo (%1) Delete the top or selected value (%1) Izbriši vrhnjo ali izbrano vrednost (%1) Clear the RPN stack (%1) Po�isti sklad RPN (%1) New Function… Nova funkcija… Favorites Priljubljene Recent User functions Uporabniške funkcije Open dialog Show all functions User units Uporabniške enote more ve� Prefixes Predpone Show all units User variables Uporabniške spremenljivke Show all variables Powerful and easy to use calculator Zmogljivo ra�unalo, preprosto za uporabo License: GNU General Public License version 2 or later Error Couldn't write definitions Pisanje definicij neuspešno hexadecimal šestnajstiško octal osmiško decimal desetiško duodecimal dvanajstiško binary binarno roman rimsko bijective bijektivno sexagesimal šestdesetiško latitude longitude time �as Time zone parsing failed. Obdelava �asovnega pasu spodletela. bases osnove calendars koledarji rectangular pravokotno cartesian kartezi�no exponential eksponentno polar polarno phasor fazor angle kot optimal najustreznejše base osnova mixed mešano fraction ulomek factors deleži Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad EXACT EXACT APPROX APPROX RPN RPN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy Kopiraj <i>Middle-click</i>: %1 <i>Srednji klik</i>: %1 scientific znanstveni engineering inženirski simple preprost prefix predpona base base units osnova partial fraction parcialni ulomek base number base osnova decimals factorize faktoriziraj expand razširi Calculating… Ra�unam... Cancel Prekli�i RPN Operation Operacija RPN Factorizing… Faktoriziram... Expanding partial fractions… Razširjam parcialne ulomke... Expanding… Razširjam... Converting… Pretvarjam... RPN Register Moved Register RPN premaknjen Processing… Obdelujem... Matrix Matrika Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Absolute Relative Hybrid Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Comma as thousands separator Only dot as decimal separator Parsing Mode Na�in obdelave The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first Sprva implicitno množenje Conventional Obi�ajna Adaptive Prilagodljivo Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) Dodaj dejanje (%1) Edit Keyboard Shortcut New Keyboard Shortcut Nova tipkovna bližnjica Action: Dejanje: Value: Vrednost: Set key combination Nastavi zaporedje tipk Press the key combination you wish to use for the action. Pritisnite zaporedje tipk, ki ga želite uporabiti za to dejanje. Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? To zaporedje tipk je že v uporabi. Ali ga želite prepisati s tem dejanjem (%1)? Question Add… Dodaj… Edit… Uredi… Remove Odstrani Gnuplot was not found %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. Example: Example of function usage Primer: Enter RPN Enter Calculate Izra�unaj Apply to Stack Premakni na sklad Insert Vnesi Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again Ne vprašaj znova Keep open Obdrži odprto Value Vrednost Argument Argument %1: %1: Approximation && Fractions Približek && ulomki Plot Izriši General Splošno Programming Programirno Algebra Custom Po meri None Brez Show Custom Column Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>Desni klik/dolg klik</i>: %1 Open menu Number Bases Številske osnove Conversion operator Operator za pretvorbo Rotate the stack or move the selected register up Zavrti sklad ali premakni izbran register gor Rotate the stack or move the selected register down Zavrti sklad ali premakni izbran register dol Swap the top two values or move the selected value to the top of the stack Izmenjaj vrhnji dve vrednosti ali premakni izbrano vrednost na vrh sklada Delete the top or selected value Izbriši vrhnjo ali izbrano vrednost Enter the top value from before the last numeric operation Vnesi vrhnjo vrednost na mesto pred zadnjo številsko operacijo Copy the selected or top value to the top of the stack Kopiraj izbrano ali vrhnjo vrednost na vrh sklada Clear the RPN stack Po�isti sklad RPN Comma as separator for function arguments and matrix/vector elements Action Dejanje Key combination Tipkovno zaporedje True Pravilno False Napa�no Info Info optional optional argument neobvezno Failed to open %1. %2 Napaka pri odpiranju datoteke %1. %2 UnitEditDialog General Splošno Relation Razmerje Name: Ime: Category: Kategorija: Descriptive name: Opisno ime: System: Sistem: Imperial imperialni US Survey ameriški Hide unit Skrij enoto Description: Opis: Class: Razred: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Base unit Osnovna enota Named derived unit Imenovana izpeljana enota Derived unit Izpeljana enota Base unit(s): Osnovne enote: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Exponent: Eksponent: Relation: Razmerje: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Razmerje z osnovno enoto. Za linearno odvisnost je to le število.<br><br>Za nelinearna razmerja uporabite \x kot faktor in \y kot eksponent (npr. "\x + 273.15" za razmerje med stopinjami Celzija in Kelvina). Inverse relation: Inverzno razmerje: Specify for non-linear relation, for conversion back to the base unit. Dolo�ite za nelinearna razmerja, za pretvorbo nazaj v osnono enoto. Mix with base unit Mešaj z osnovno enoto Priority: Prioriteta: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Število najmanjše osnovne enote: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default Privzeto uporabi s predponami Base unit does not exist. Osnovna enota ne obstaja. Error A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Question A variable or unit with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Unit Uredi enoto New Unit Nova enota UnitsDialog Units Enote Category Kategorija Unit Enota New… Novo… Edit… Uredi… Deactivate Onemogo�i Delete Izbriši Convert Pretvori Insert Vnesi Favorite Priljubljeni Show hidden units Prikaži skrite enote Activate Aktiviraj All All units Vse Uncategorized nekategorizirano User units Uporabniške enote Favorites Priljubljene Inactive Neaktivno UnknownEditDialog Name: Ime: Custom assumptions Predpostavke po meri Type: Vrsta: Sign: Znak: Temporary Za�asno Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Unknown Variable Uredi neznano spremenljivko New Unknown Variable Nova neznana spremenljivka VariableEditDialog Name: Ime: Temporary Za�asno Value: Vrednost: Required Zahtevano Description Opis current result trenutni rezultat Category: Kategorija: Descriptive name: Opisno ime: Hide variable Skrij spremenljivko Description: Opis: Question A unit or variable with the same name already exists. Do you want to overwrite it? Enota ali spremenljivka s tem imenom že obstaja. Jo želite prepisati? Edit Variable Uredi spremenljivko New Variable Nova spremenljivka VariablesDialog Variables Spremenljivke Category Kategorija Variable Spremenljivka New Novo Variable/Constant… Spremenljivka/konstanta… Unknown Variable… Neznana spremenljivka… Matrix… Matrika… Edit… Uredi… Export… Izvozi… Deactivate Onemogo�i Delete Izbriši Insert Vnesi Favorite Priljubljeni a matrix matrika a vector vektor positive pozitivno non-positive nepozitivno negative negativno non-negative nenegativno non-zero neni�elno integer celo število boolean logi�na vrednost rational racionalno real realno complex kompleksno number številka not matrix ni matrika unknown neznano Default assumptions Privzete predpostavke Activate Aktiviraj All All variables Vse Uncategorized nekategorizirano User variables Uporabniške spremenljivke Favorites Priljubljene Inactive Neaktivno qalculate-qt-5.11.0/translations/qalculate-qt_sv.ts000066400000000000000000017675061520501070600224130ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator Kalkylator Powerful and easy to use calculator Kraftfull och användarvänlig miniräknare Qalculate! (Qt UI) Qalculate! (Qt UI) Argument Rules Parameterregler _Cancel _Avbryt Do not save modifications Spara inte modifikationerna _OK _OK Accept the modification of argument rules Godkänn modifiering av parameterregler Enable rules and type test Aktivera villkor- och klass-test Custom condition Anpassat villkor For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Till exempel om parametern är en matris och måste ha lika antal rader och kolumner: rows(\x) = columns(\x) Allow matrix Tillåt matriser Forbid zero Förbjud noll Handle vector Hantera vektor Calculate function for each separate element in vector. Beräkna funktionen för varje separat element i vektor. Min Min Include equals Inkludera lika med Max Max Keyboard Shortcuts Kortkommandon _Close _Stäng Label Etikett Left-click Vänsterklick Right-click Högerklick Middle-click Mittenklick Reset Återställ Button Action Knappåtgärd Value Värde Argument name Parameternamn Calendar Conversion Kalenderomvandling Export CSV File Exportera CSV-fil Current result Nuvarande resultat Matrix/vector variable Matris/vektorvariabel File Fil Delimiter Avgränsare Comma Komma Tabulator Tabulator Semicolon Semikolon Space Mellanslag Other Annan Import CSV File Importera CSV-fil Do not import the file Avbryt filimport Import the file Importera filen Name of the data file to import Namn för filen som skall importeras Select a file Välj en fil Import as Importera som Matrix Matris If a matrix shall be generated from the contents of the file Om en matris ska genereras från filinnehållet Vectors Vektorer If vectors shall be generated from the contents of the file Om flera vektorer ska genereras från filinnehållet Name Namn Name (or name prefix) used to reference generated variable(s) in expressions Namn (eller namnprefix) för referenser till genererade variabler i uttryck Descriptive name Beskrivande namn Title displayed in menus and in variable manager Rubrik som skall visas i menyer och variabelhanteraren Category Kategori First row Första raden The first row with data to import in the file Första raden som innehåller data att importera Includes headings Inkludera kolumnnamn If the first row contains column headings Huruvida den första raden är kolumnrubriker Delimiter used to separate columns in the file Avgränsare använd för att separera kolumner i filen Custom delimiter Anpassad avgränsare Edit Data Property Redigera dataegenskap Do not create/modify this data set Avbryt skapande/modifiering av detta dataset Accept the creation/modification of this data set Godkänn skapande/modifiering av detta dataset Name used for reference Namn använt som referens Properties Egenskaper Title displayed in menus and in data set manager Rubrik som skall visas i menyer och datasetshanteraren Description Beskrivning Description of this data property Beskrivning av dataegenskapen Value Type Värdetyp Text Text Number Nummer Expression Uttryck Hide Göm Use as key Använd som nyckel Approximate value Approximerat värde Case sensitive value Storlekskänsligt värde Value uses brackets Värdet använder klammrar Unit expression Enhetsuttryck Edit Data Set Redigera dataset Title Titel Data file Datafil Description of this data set Beskrivning av detta dataset Copyright Upphovsrätt General Allmänt Properties: Egenskaper: Definition of the properties of this data set Definiering av detta datasets egenskaper _New _Ny _Edit _Redigera _Delete _Ta bort Name used to invoke the function in expressions Namn som används för att referera till funktionen i uttryck Object argument name Objektargumentets namn Property argument name Egenskapsargumentets namn Default property Förvald egenskap Function Funktion Edit Data Object Redigera dataobjekt Do not create/modify this data object Avbryt skapande/modifiering av dataobjektet Accept the creation/modification of this data object Godkänn skapande/modifiering av dataobjektet Data Sets new dataset Dataset Data Set Dataset Create a new data set Skapa ett nytt dataset Edit the selected data set Redigera valt dataset Delete the selected data set Ta bort valt dataset Objects Objekt Create a new data object Skapa ett nytt dataobjekt Edit the selected data object Redigera valt dataobjekt Remove the selected data object Ta bort valt dataobjekt Data Set Description Beskrivning av dataset Object Attributes Objektegenskaper Decimals Decimaler Close this window Stäng fönstret Min decimals Min decimaler Max decimals Max decimaler Minimal number of displayed decimals Minimalt antal visade decimaler Maximal number of decimals to display (and round to) Maximalt antal decimaler att visa (och avrunda till) Floating Point Conversion Flyttalsomvandling Decimal value Decimalt värde Binary value Binärt värde Octal value Oktalt värde Hexadecimal representation Hexadecimal representation Conversion error Förlorad precision Binary representation Binär representation Floating point value Flyttalsvärde Format Format Hexadecimal value Hexadecimalt värde Edit Function Redigera funktion _Help _Hjälp Do not create/modify this function Avbryt skapande/modifiering av funktionen Accept the creation/modification of this function Godta skapande/modifiering av funktionen Name used to invoke this function in expressions Namn som används för att referera till funktionen i uttryck Title displayed in menus and in function manager Rubrik som skall visas i menyer och funktionshanteraren Hide function Dölj funktionen If this function shall be hidden in menus Huruvida funktionen skall döljas i menyer Description of this function Beskrivning av funktionen Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. Använd \x för den första, \y för den andra och \z för den tredje parametern. För mer information klicka på hjälpknappen. Condition Förutsättning Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Förutsättning som måste infrias för funktionen (t.ex. om den andra parametern måste var större än den första: "\y > \x") Sub-Functions Subfunktioner Arguments: Parametrar: Definition of this function's arguments Definiering av funktionens parametrar Free Valfri Integer Heltal Symbol Symbol Date Datum Vector Vektor Positive number Positivt nummer Non-zero number Icke-noll nummer Non-negative number Icke-negativt nummer Positive integer Positivt heltal Non-zero integer Icke-noll heltal Non-negative integer Icke-negativt nummer Boolean Booleskt värde Object Objekt Unit Enhet Variable Variabel Angle Vinkel Data object Dataobjekt Data property Dataegenskap _Add _Lägg till Add entered argument definition Lägg till parameterdefinitionen _Apply _Applicera Modify selected argument Modifiera vald parameter Remove selected argument Ta bort vald parameter Rules Villkor Edit conditions for selected argument Modifiera villkor vald parameter Close this dialog Stäng dialogfönstret Precalculate Förberäkna Calculate the subfunction only once, before the parent function Beräkna subfunktionen endast en gång, innan huvudfunktionen Add entered subfunction Lägg till subfunktionen Apply changes to the selected subfunction Verkställ ändringar av vald subfunktion Remove the selected subfunction Ta bort vald subfunktion Functions Funktioner Create a new function Skapa en ny funktion Edit the selected function Redigera vald funktion _Insert _Infoga Insert (or execute) the selected function into the expression entry Sätt in (eller exekvera) vald funktion i uttrycket Delete the selected function Ta bort vald funktion (De)activate the selected function (Av)aktivera vald funktion Deacti_vate Avakti_vera Apply the selected function to the current expression Applicera vald funktion på det nuvarande uttrycket Categor_y Kategor_i _Function _Funktion Descri_ption Beskri_vning Degrees Grader Radians Radianer Gradians Gradienter Default assumptions Förvalda antaganden Unknown Okänd Not Matrix Inte matris Complex Komplex Real Reell Rational Rationell Non-Zero Ej noll Positive Positiv Non-Negative Ej negativ Negative Negativ Non-Positive Ej positiv _File _Arkiv Unknown Variable Okänd variabel Function (simplified) Funktion (förenklad) Import CSV File… Importera CSV-fil… Export CSV File… Exportera CSV-fil… _Store Result… _Spara resultatet… Save Result Image… Spara resulatbild… Save local functions, variables and units Spara lokala funktioner, variabler och enheter Save Definitions Spara definitioner Import Definitions File… Importera definitionsfil… Fetch current exchange rates from the Internet Hämta nuvarande växelkurser från internet Update Exchange Rates Uppdatera växelkurser Plot Functions/Data Rita funktions-/datadiagram Convert Number Bases Omvandla mellan talbaser Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Percentage Calculation Tool Procentberäkningsverktyg Periodic Table Periodiska systemet Minimal Window Minimalt fönster _Quit _Avsluta Manage Variables Hantera variabler Manage Functions Hantera funktioner Manage Units Hantera enheter Manage Data Sets Hantera dataset Factorize Faktorisera Expand Expandera Apply partial fraction decomposition to the current result. Tillämpa partialbråksuppdelning på nuvarande resultat. Expand Partial Fractions Expandera partialbråk Set Unknowns… Ange okända värden… Convert to Unit Omvandla till enhet Set Prefix Sätt prefix Convert to Unit Expression… Omvandla till enhetsuttryck… Convert to Base Units Omvandla till basenheter Convert to Optimal Unit Omvandla till optimal enhet Insert Date… Infoga datum… Insert Matrix… Infoga matris… Insert Vector… Infoga vektor… _Copy Result _Kopiera resultatet Customize Keypad Buttons Anpassa knappar i knappsatsen _Preferences _Inställningar _Mode _Läge Number Base Talbas Select Result and Expression Base… Välj bas i resultat och uttryck… Binary Binär Octal Oktal Decimal Decimal Duodecimal Duodecimal Hexadecimal Hexadecimal Other… Annan… Sexagesimal Sexagesimal Time Format Tidsformat Roman Numerals Romerska siffror Numerical Display Numerisk visning Normal Normal Engineering Teknisk Scientific Vetenskaplig Purely Scientific Fullt vetenskaplig Simple Enkel Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... Av: 1/7 ≈ 0,14285714 På: 1/7 = 0,142857 142857... Indicate Repeating Decimals Indikera upprepande decimaler Show Ending Zeroes Visa avslutande nollor Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 Av: 2,5 ≈ 3; 1,5 ≈ 2 På: 2,5 ≈ 2; 1,5 ≈ 2 Round Halfway Numbers to Even Avrunda mittemellan-tal till jämn siffra Off: -x + y On: y - x Av: -x + y På: y - x Sort Minus Last Sortera minus sist Complex Rectangular Form Komplex rektangulär form Complex Exponential Form Komplex exponentiell form Complex Polar Form Komplex polär form Complex Angle/Phasor Notation Komplex vinkelnotation Rational Number Form Form för rationella tal 1/3 ≈ 0.33333 1/3 ≈ 0,33333 Decimal Fractions Decimalform 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1,5 Exact Decimal Fractions Exakt decimalform 6/4 = 3/2 6/4 = 3/2 Simple Fractions Bråkform 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions Blandad form Interval Display Intervallvisning Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi Av: 1/2*pi ≈ 1,5707963 På: 1/2*pi = 0,5 pi Adaptive Adaptiv Calculates an interval of possible values and keeps track of precision changes. Beräknar ett intervall av möjliga värden och håller reda på förändringar i precision. Significant Digits Signifikanta siffror Interval Intervall Plus/Minus Plus/minus Midpoint Medelpunkt Unit Display Enehetsvisning Do not use any prefixes in result Använd inga prefix i resultatet Show prefixes for primarily SI and CGS units. Visa prefix för huvudsakligen SI och CGS enheter. Use prefixes for selected units Använd prefix för vissa enheter Use prefixes also for currencies Använd prefix även för valutor Use prefixs for all units Använd prefix med alla enheter Enables automatic use of hekto, deka, deci and centi when prefixes is enabled Aktiverar automatisk användning av hekto, deka, deci och centi när prefix är aktiverade Enable All SI Prefixes Använd alla SI-prefix Enables automatic setting of prefix for denominator in addition to the numerator Aktiverar automatisk användande av prefix för nämnaren utöver i täljaren Enable Denominator Prefixes Aktivera prefix i nämnaren Off: J / K On: J * K^-1 Av: J / K På: J * K^-1 Negative Exponents Negativa exponenter Off: (2 m)/s On: 2 (m/s) Av: (2 m)/s På: 2 (m/s) Place Units Separately Placera enheter separat No Additional Conversion Ingen ytterligare omvandling Convert to Optimal SI Unit Omvandla till optimal SI-enhet If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Om aktiverat: 15 in = 1 ft + 3 in 3,2 h = 3 h + 12 min Convert to Mixed Units Omvandla till blandade enheter Abbreviate Names Förkorta namn Enabled Objects Aktiverade objekt Variables Variabler Units Enheter Unknowns Okända Units in Physical Constants Enheter i fysiska konstanter If not enabled, treats all variables as unknown Om avaktiverad behandlas alla variabler som okända Calculate Variables Beräkna variabler Disables/enables complex numbers in result (Av)aktiverar komplexa tal i resultat Allow Complex Result Tillåt complext resultat Disables/enables infinite numbers in result (Av)aktiverar oändliga tal i resultat Allow Infinite Result Tillåt oändligt resultat Approximation Approximering Always Exact Alltid exakt Try Exact Försök exakt Approximate Approximera Interval Arithmetic Intervallaritmetik Interval Calculation Intervallberäkning Variance Formula Variansformel Change angle unit used in trigonometric functions Ändra vinkelenhet för trigonometriska funktioner Angle Unit Vinkelenhet None Ingen Assumptions Antaganden Algebraic Mode Algebraiskt läge Assume that unknown denominators are non-zero Anta att nämnare ej är noll Non-Zero Denominators Nämnare ej noll Warn when unknown denominators are assumed non-zero Varna när okända nämnare är antagna som ej noll Warn About Denominators Assumed Non-Zero Varna om nämnare antagna som ej noll Parsing Mode Tolkningsläge Adaptive Parsing Adaptiv tolkning Parse Implicit Multiplication First Läs implicit multiplikation först Conventional Parsing Konventionell tolkning Chain Syntax Kedjesyntax RPN Syntax RPN-syntax Off: xy = x*y On: xy != x*y Av: xy = x*y På: xy != x*y Limit Implicit Multiplication Begränsa implicit multiplikation Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 Behandla decimala tal som approximativa med en precision lika med antalet siffror. Av: 1,1 * 1,1 = 1,21 På: 1,1 * 1,1 ≈ 1,2 Read Precision Läs precision _Precision _Precision _Decimals _Decimaler Calculate As You Type Fortgående beräkningar Chain Mode Kedjeläge Activate the RPN stack. Aktivera RPN-stacken. RPN Mode RPN-läge Meta Modes Metalägen Save Mode… Spara läge… Delete Mode… Radera läge… Save Default _Mode Spara förvalt _programläge Fu_nctions Fu_nktioner _Variables _Variabler _Units _Enheter _Contents _Innehåll Report a Bug Rapportera ett problem Check for Updates Sök efter uppdateringar _About _Om Toggle minimal window (Av)aktivera minimalt fönster Calculation result Beräkningsresultat _Keypad _Knappsats Toggles persistent keypad (makes it possible to show keypad and history simultaneously) (Av)aktiverar beständig knappsats (gör det möjligt att visa knappsats och historik samtidigt) _History _Historik C_onversion _Omvandling RPN Stack RPN-stack Insert the selected value Infoga valt värde Insert the selected text Infoga valt värde som text Copy the selected text Kopiera vald text Add the selected value(s) Addera valda värden Subtract the selected value(s) Subtrahera valda värden Multiply the selected value(s) Multiplicera valda värden Divide the the selected value(s) Dela valda värden Raise to the power of the selected value Höj med det valda värdet Calculate the square root of the selected value Beräkna kvadratroten av det valda värdet History Historik Subtract the top value from the second value Subtrahera det översta värdet från det andra värdet Multiply the top two values Multiplicera de två översta värdena Divide the second value by the top value Dividera det andra med det översta värdet Raise the second value to the power of the top value Höj det andra värdet med det översta värdet Negate the top value (Ctrl+-) Negera det översta värdet (Ctrl+-) Invert the top value Invertera det översta värdet Calculate the square root of the top value Beräkna kvadratroten av det översta värdet Calculate the sum of all values Beräkna summa av alla värden Rotate the stack or move selected register up Rotera stacken eller flytta markerat register uppåt Rotate the stack or move selected register down Rotera stacken eller flytta markerat register nedåt Swap the two top values or move the selected value to the top of the stack Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken Copy the selected or top value to the top of the stack Kopiera det valda eller det översta värdet till toppen av stacken Enter the top value from before the last numeric operation Lägg till det översta värdet från innan den senaste numeriska operationen Delete the top or selected value Ta bort det översta eller det markerade värdet Edit the selected value Redigera valt värde Clear the RPN stack Töm RPN-stacken. Unit(s) and prefix to convert result to Enhet(er) och prefix att omvandla resultatet till Convert Omvandla Continuous conversion Fortgående omvandling Automatically convert result to the current unit expression as long as the conversion box is visible. Omvandla automatiskt resultat till det nuvarande enhetsuttrycket så länge som omvandlingsrutan är synlig. Add prefix Lägg till prefix If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". Om enhetsuttrycket saknar prefix, sätt optimalt prefix. Detta kan åsidosättas med "?" or "0" framför enhetsuttrycket. Conversion Omvandling Show/hide programming keypad Visa/dölj programmeringsknappsats Exact Exakt Fraction Bråktal Numerical display Numerisk visning Pure Strikt Number base Talbas Time format Tidsformat Roman Romersk sin sin cos cos tan tan ln ln Equals Lika med sqrt sqrt sum sum Unknown variable Okänd variabel mod mod mean medel Store result as a variable Spara resultatet som en variabel STO Standard calculator button. Do not use more than three characters. STO Convert number bases Omvandla mellan talbaser Imaginary unit i (√-1) Imaginär enhet i (√-1) Manage units Hantera enheter Conversion operator Omvandlingsoperand Kilogram Kilogram Two's complement input Tvåkomplementsform för indata Two's complement output Tvåkomplementsform för utdata Bitwise Exclusive OR Bitvist exklusivt OR Bitwise Left Shift Bitvist högerskift Bitwise Right Shift Bitvist vänsterskift Floating point conversion Flyttalsomvandling Show/hide left keypad Visa/dölj vänster knappsats Show/hide right keypad Visa/dölj höger knappsats DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result Föregående resultat ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression Lägg till i uttryck Persistent Keypad Beständig knappsats Edit Redigera Delete Ta bort Update Uppdatera Insert Value Infoga värde Insert Text Infoga text Insert Parsed Text Infoga tolkad text Copy Kopiera Copy Full Text Kopiera hel text Search… Sök… Add Bookmark… Lägg till bokmärke… Bookmarks Bokmärken Protect Skydda Move To Top Lägg överst Remove Ta bort Clear All Rensa allt _Copy _Kopiera _Store… _Spara… Save Image… Spara bild… _Factorize _Faktorisera _Expand _Expandera _Normal _Normal Sc_ientific Vetenskapl_ig Purel_y Scientific Fu_llt vetenskaplig Simp_le Enke_l _Binary _Binär _Octal _Oktal _Decimal _Decimal _Hexadecimal _Hexadecimal Decimal Fraction Decimaltal Exact Decimal Fraction Exakt decimaltal Simple Fraction Bråkform Mixed Fraction Blandad form _Abbreviate Names F_örkorta namn C_onvert… _Omvandla… Convert to Base _Units Omvandla till bas_enheter Convert _to Optimal Unit Omvandla _till optimal enhet Use Optimal Prefix Använd optimalt prefix Convert to Omvandla till Convert to UTC Omvandla till UTC Convert to Calendars Omvandla till kalendrar Use prefixes for all units Använd prefix för alla enheter Enable All SI Prefi_xes Använd alla SI-prefi_x View/Edit Matrix Visa/redigera matris View/Edit Vector Visa/redigera vektor Copy Text Kopiera text To Top Till toppen Swap Byt plats Up Upp Down Ner Negate Negera Invert Invertera Square Kvadrat Square Root Kvadratrot Clear Stack Töm stacken Select Number Base… Välj talbas… Store result Spara resultatet Add result Add current result to variable value Addera resultatet Subtract result Subtruct current result from variable value Subtrahera resultatet Insert the matrix/vector into the expression Sätt in matrisen/vektorn i uttrycket Rows Rader Number of rows in this matrix (rows displayed for vectors) Antal rader i matrisen (visade rader för vektorer) Columns Kolumner Number of columns in this matrix (columns displayed for vectors) Antal kolumner i matrisen (visade kolumner för vektorer) If this is a matrix or vector Huruvida det är en matris eller vektor Elements Element Current element: Nuvarande element: Edit Matrix Redigera matris Do not create/modify this matrix/vector Avbryt skapande/modifiering av matrisen/vektorn Create/modify the matrix/vector Skapa/modifiera matrisen/vektorn Accept the creation/modification of this matrix/vector Godkänn skapande/modifiering av matrisen/vektorn Name used to reference this variable in expressions Namn för att referera till variabeln i uttryck Names Namn Add new name Lägg till nytt namn Apply changes to the selected name Verkställ modifikationer av valt namn Remove the selected name Ta bort valt namn Abbreviation Förkortning Unicode Unicode Plural Pluralform Suffix Suffix Reference Referens Avoid input Undvik input Case sensitive Storlekskänslig Completion only Enbart komplettering Number Bases Talbaser Roman numerals Romerska siffror BIN BIN OCT OKT DEC DEC DUO DUO HEX HEX ROM ROM Subtract Subtrahera Multiply Multiplicera Divide Dela Bitwise AND Bitvist AND Bitwise OR Bitvist OR Bitwise NOT Bitvist NOT Clear Rensa Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ange två värden, av vilka högst en får vara ett procenttal, och de övriga kommer att beräknas åt dig. Percentage Procent Calculate Beräkna Value 1 Värde 1 2 compared to 1 2 jämfört med 1 Change from 1 to 2 Förändring från 1 till 2 Value 2 Värde 2 1 compared to 2 1 jämfört med 2 Change from 2 to 1 Förändring från 2 till 1 Plot Diagram _Save _Spara Save as png, svg, postscript, eps, latex or fig Spara som png, svg, postscript, eps, latex eller fig Vector/matrix Vektor/matris Paired matrix Parvis matris if you want to split matrix in rows instead of columns huruvida du vill dela matriser i rader istället för kolumner X variable X-variabel The variable name used in expression Variabel namn använt i uttryck Style Stil Line Kurva Points Punkter Line with points Kurva med punkter Boxes/bars Boxar/staplar Histogram Histogram Steps Steg Candlesticks Ljusstakar Dots Små punkter Smoothing Utjämning Monotonic Monoton Natural cubic splines Naturliga kubiska splines Bezier Bezier Bezier (monotonic) Bezier (monoton) Y-axis Y-axel Primary Primär Secondary Sekundär _Remove _Ta bort Data Data Minimum x value Lägsta x-värde Maximum x value Högsta x-värde Sampling rate Frekvens Step size Stegstorlek Function Range Funktionsomfång Display grid Visa rutnät Display full border Visa alla kanter Minimum y value Lägsta y-värde Maximum y value Högst y-värde Logarithmic x scale Logaritmisk x-skala Logarithmic y scale Logaritmisk y-skala X-axis label Namn på x-axeln Y-axis label Namn på y-axeln Line width Linjetjocklek Color display Färgvisning Color Färg Monochrome Monokrom Legend placement Textplacering Top-left Uppe till vänster Top-right Uppe till höger Bottom-left Nere till vänster Bottom-right Nere till höger Below Under Outside Utanför Appearance Utseende Precision Precision _Recalculate _Omräkna Recalculate expression Räkna om uttrycket The number of significant digits to display/calculate (simple arithmetics are always calculated exact) Antal signifikanta enheter som skall visas/beräknas (enkel aritmetik beräknas alltid exakt) Preferences Inställningar Save mode on exit Spara programläge vid avslut If the mode of the calculator shall be restored Huruvida kalkylatorns läge skall återskapas Save definitions on exit Spara definitioner vid programavslut If changes to functions, units and variables shall be saved automatically Huruvida modifieringar av funktioner, enheter och variabler skall sparas automatiskt Clear history on exit Töm historiken vid programavslut Allow multiple instances Tillåt flera instanser Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. Tillåt flera instanser av Qalculate!:s huvudfönster att vara öppna samtidigt. Notera att läge, historik och definitioner enbart sparas för den sist stängda instansen. Notify when a new version is available Meddela när en ny version finns tillgänglig Use keyboard keys for RPN Använd tangentbordet för RPN Use keyboard operator keys for RPN operations (+-*/^). Använd tangenter med matematiska operatorer för RPN-operation (+-*/^) Use caret for bitwise XOR Använd insättningstecken för bitvis XOR Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. Infoga XOR (⊻) med ^-tecknet på tangentbordet (annars använd Ctrl+^). Exponentieringstecknet (^) kan alltid infogas med Ctrl+*. Add calculate-as-you-type result to history Lägg till fortgående beräkningar i historiken Delay: Fördröjning: Time limit for plot: Tidsgräns for diagram: Behavior Beteende Enable Unicode symbols Använd Unicodetecken Disable this if you have problems with some fancy characters Avaktivera om du har problem med konstiga tecken Ignore system language (requires restart) Bortse från systemspråket (kräver omstart) Use system tray icon Använd systemfältsikon Hides the application in the system tray when the main window is closed Gömmer programmet i systemfältet när huvudfönstret stängs Hide on startup Göm vid uppstart Remember window position Kom ihåg fönsterposition Keep above other windows Placera över andra fönster Keep the main window above other windows (depending on platform and settings this might not work) Behåll huvudfönstret placerat över andra fönstret (beroende på plattform och inställningar är det möjligt att detta inte fungerar) Application name Programnamn Result Resultat Application name + result Programnamn + resultat Mode Läge Application name + mode Programnamn + läge Window title Fönstertitel Default Förval Light Ljus Dark Mörk High contrast Hög kontrast Dark high contrast Mörk med hög kontrast Theme Tema Button padding Knapputfyllnad / / Number of expression lines Antal rader för uttryck 3 3 Display expression status Visa uttrycksstatus If as-you-type expression status shall be displayed below the expression entry Om uttrycksstatus skall visas under uttrycksfältet medans text skrivs Persistent keypad Beständig knappsats Look & Feel Utseende och känsla Binary two's complement representation Binär tvåkomplementsform If two's complement representation shall be used for negative binary numbers. Om tvåkomplementsform ska användas för negativa binära tal. Hexadecimal two's complement representation Hexadecimal tvåkomplementsform If two's complement representation shall be used for negative hexadecimal numbers. Om tvåkomplementsform ska användas för negativa hexadecimala tal. Use lower case letters in non-decimal numbers Använd små bokstäver i icke-decimala nummer If lower case letters should be used in numbers with non-decimal base Huruvida små bokstäver skall användas i nummer med icke-decimal bas Alternative base prefixes Alternativa basprefix If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes Om hexadecimala tal ska visas med "0x0" och binära tal med "0b00" som prefix Spell out logical operators Visa ord för logiska operatorer If logical and/or shall be displayed as "&&"/"||" or "and"/"or" Om logiskt och/eller ska visas som "&&"/"||" eller "och"/"eller" If "e" shall be used instead of "E" in numbers Om "e" skall användas istället för "E" i nummer Use E-notation instead of 10<sup><i>n</i></sup> Använd E istället för 10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) Använd litet "e" (som i 1e10) Use 'j' as imaginary unit Använd 'j' som imaginär enhet Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. Använd 'j' (istället för 'i') som förvald symbol för den imaginära enheten och placera den framför den imaginära delen av komplexa tal. Use comma as decimal separator Använd komma som decimaltecken Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign Tillåt att punkter, '.', används som tusentalsavgränsare istället för som ett alternativt decimaltecken Ignore comma in numbers Bortse från komma i nummer Allow commas, ',', to be used as thousands separator instead of as an function argument separator Tillåt att kommatecken, ',', används som tusentalsavgränsare istället för som avskiljare för funktionsargument Ignore dots in numbers Bortse från punkter i nummer Digit grouping Siffergruppering off av standard standard local lokal Multiplication sign Multiplikationstecken Division sign Divisionstecken Copy digit separator Kopiera tusentalsavgränsare Deactivate to remove digit separator when copying result Avaktivera för att avlägsna tusentalsavgränsare vid kopiering av resultat Numbers & Operators Nummer och operatorer Use binary prefixes for information units Använd binära prefix för informationsenheter Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). Använd binära, istället för decimala, prefix som förval för informationsenheter (t.ex. byte). Conversion to local currency Omvandling till lokal valuta Automatically convert to the local currency when optimal unit conversion is activated. Omvandla automatiskt till den lokala valutan när optimal enhetsomvandling är aktiverad. Update exchange rates on start Uppdatera växelkurser vid start If current exchange rates shall be downloaded from the internet at program start Huruvida uppdaterade växelkurser skall hämtas från internet vid programstart Exchange rates updates Växelkursuppdatering Temperature calculation mode: Läge för temperaturberäkningar: Absolute Absolut Relative Relativ Hybrid Hybrid Units & Currencies Enheter och valutor Show expression completion suggestions Visa uttryckskompletteringsförslag Search titles and countries Sök i titlar och länder Minimum characters Lägsta antal tecken Popup delay (ms) Popupfördröjning (ms) Completion Komplettering Status warning color Färg för statusvarning Status error color Färg för statusfel Custom status font Anpassat teckensnitt för status If you want to use a font other than the default in the status display below the expression entry Huruvida du vill använda ett annat teckensnitt än det som är standard i statusvisningen under uttrycksfältet Custom expression font Anpassat teckensnitt för uttryck If you want to use a font other than the default in the expression entry Huruvida du vill använda ett annat teckensnitt än det som är standard vid skrivning av uttryck Custom result font Anpassat teckensnitt för resultat If you want to use a font other than the default in the result display Huruvida du vill använda ett annat teckensnitt än det som är standard vid visning av resultat Custom keypad font Anpassat teckensnitt för knappsats If you want to use a font other than the default in the keypad Huruvida du vill använda ett annat teckensnitt än det som är standard på knappsatsen Custom application font Anpassat programteckensnitt If you want to use a font other than the default for the whole application Huruvida du vill använda ett annat teckensnitt än det som är standard på för hela programmet Text color Textfärg Fonts & Colors Teckensnitt och färger Other: Annan: Bijective base-26 Bijektiv talbas 26 <b>Result Base</b> <b>Resultatbas</b> <b>Expression Base</b> <b>Uttrycksbas</b> New Keyboard Shortcut Nytt kortkommando Edit Variable Redigera variabel Advanced Avancerad Accept the creation/modification of this variable Godkänn skapande/modifiering av variabeln x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. Använd x, y och z för den 1:a, 2:a, respektive 3:e funktionsparametern. \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. Använd x, y och z för 1:a, 2:a, respektive 3:e funktionsparametern.Detta undviker potentiella konflikter med variabler, funktioner och enheter. Edit Unit Redigera enhet Do not create/modify this unit Avbryt skapande/modifiering av enheten Accept the creation/modification of this unit Godta skapande/modifiering av enheten Singular form of this unit's name Singularis av enhetens namn Title displayed in menus and in unit manager Rubrik som skall visas i menyer och enhetshanteraren System System Imperial Imperial US Survey US Survey Hide unit Dölj enheten If this unit shall be hidden in menus Huruvida enheten skall döljas i menyer Class Klass The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Klassificering av enheten. Namngivna härledda enheter är definierade i relation till en annan enhet, med en valfri exponent, medan (icke namngivna) härledda enheter definieras av ett enhetsuttryck med en eller flera enheter. Base unit Grundenhet Named derived unit Namngiven härledd enhet Derived unit Härledd enhet Base unit(s) Grundenhet(er) Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to Enhet (för alias-enheter) eller enheter (för sammansatta enheter) som enheten är definierad i förhållande till Exponent Exponent Exponent of the base unit Exponent för grundenhet Relation Relation Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Förhållande till baseenheten. Utgör för linjära förhållanden enbart ett nummer. För icke-linjära förhållanden, används \x för faktorn och \y för exponenten (t.ex. "\x + 273,15" för relationen mellan grader Celsius och Kelvin) Relation is exact Förhållandet är exakt If the relation is precise Huruvida relationen är exakt Inverse relation Omvänd relation Specify for non-linear relation, for conversion back to the base unit. Anges för icke-linjära förhållanden, för omvandling tillbaka till basenheten. Mix with base unit Blanda med basenhet - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - Avgör vilka enheten en basenhet blandas med om flera alternativ finns. - Den ursprungliga enheten blandas inte med enheter med lägre prioritet. - Ett lägre värde innebär högre prioritet. Priority Prioritet Minimum base unit number Minsta antal av basenhet Use with prefixes by default Använd med prefix som förval Create a new unit Skapa en ny enhet Edit the selected unit Redigera vald enhet Insert the selected unit into the expression entry Sätt in vald enhet i uttrycket C_onvert _Omvandla... Convert the result to the selected unit Omvandla resultatet till vald enhet Delete the selected unit Ta bort vald enhet (De)activate the selected unit (Av)aktivera vald enhet _Unit _Enhet Convert between units Omvandla mellan enheter = = Conver_sion Omvan_dling Converted value Omvandla Value to convert from Värde att omvandla från Type anywhere Skriv varsomhelst Edit Unknown Variable Modifiera okänd variabel Do not create/modify this unknown variable Avbryt skapande/modifiering av den okända variabeln Accept the creation/modification of this unknown variable Godkänn skapande/modifiering av den okända variabeln Name used to reference this unknown variable in expressions Namn för att referera till den okända variabeln i uttryck Use custom assumptions Använd anpassade antaganden Type Typ Real Number Reellt tal Rational Number Rationellt tal Sign Tecken The category this unknown variable belongs to Kategorin som den okända variabeln tillhör Value of this variable (expression) Variabelns värde (uttryck) value is exact värdet är exakt If the value is precise Huruvida värdet är exakt The category this variable belongs to Kategorin som variabeln tillhör Create a new variable Skapa en ny variabel Edit the selected variable Redigera vald variabel Insert the selected variable into the expression entry Sätt in vald variabel i uttrycket Delete the selected variable Ta bort vald variabel (De)activate the selected variable (Av)aktivera vald variabel E_xport E_xportera _Variable _Variabel Execute expressions and commands from a file Beräkna uttryck och utför kommandon från en fil Start a new instance of the application Starta en ny instans av programmet Display the application version Visa programversion Specify the window title Ange fönstertitel TITLE TITEL Expression to calculate Uttryck att beräkna [EXPRESSION] [UTTRYCK] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. ans ans Last Answer Senaste svaret answer svar Answer 2 Svar 2 Answer 3 Svar 3 Answer 4 Svar 4 Answer 5 Svar 5 Memory Minne Failed to load global definitions! Fel vid inhämtande av systemvida definitioner! c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" Alla By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? Enligt förinställningar tillåts enbart en instans av %s. Om flera instanser är öppna samtidigt, kommer enbart definitioner (variabler, funktioner, etc.) , läge, inställningar och historik för det sist stängda fönstret att sparas. Vill du trots det ändra förinställt beteende och tillåta flera samtidiga instanser? c-format Right-click/long press: %s Högerklick/långtryck: %s c-format Right-click: %s Högerklick: %s c-format Middle-click: %s Mittenklick: %s c-format Cycle through previous expression Bläddra genom tidigare uttryck Move cursor left or right Flytta markören åt vänster eller höger Move cursor to beginning or end Flytta markören till början eller slutet Uncertainty/interval Osäkerhet/intervall Relative error Relativt fel Argument separator Parameteravgränsare Blank space Blanksteg New line Ny rad Smart parentheses Smarta parenteser Vector brackets Hakparenteser för vektorer Left parenthesis Vänsterparentes Left vector bracket Vänster hakparentes för vektorer Right parenthesis Högerparentes Right vector bracket Höger hakparentes för vektorer Decimal point Decimalkomma Raise (Ctrl+*) Upphöj (Ctrl+*) Add Addera M+ (memory plus) M+ (minnesoperation) MC (memory clear) MC (töm minne) Backspace Backsteg M− (memory minus) M− (minnesoperation) Previous result (static) Föregående resultat (statiskt) Calculate expression Beräkna uttrycket MR (memory recall) MR (återkalla minne) MS (memory store) MS (spara i minne) Set unknowns Ange okända värden more Show further items in a submenu fler Logical AND Logiskt AND Logical OR Logiskt OR Logical NOT Logiskt NOT Toggle Result Base Växla resultatbas Open menu with stored variables Öppna meny med lagrade variabler Index Index ENTER RPN Enter (calculate and add to stack) ENTER Calculate expression and add to stack Beräkna uttrycket och lägg till i stacken Flag Flagga Matrices Matriser Gregorian Gregoriansk Revised Julian (Milanković) Reviderad juliansk Julian Juliansk Islamic (Hijri) Muslimsk Hebrew Hebreisk Chinese Kinesisk Persian (Solar Hijri) Persisk Coptic Koptisk Ethiopian Etiopisk Indian (National) Indisk (nationell) Action Åtgärd Key combination Tangentkombination Raise Upphöj History Answer Value Svarsvärde från historiken History Index(es) Index i historiken History index %s does not exist. Index %s finns inte i historiken. c-format expression uttryck History Parsed Expression Tolkat uttryck från historiken Set Window Title Angle fönstertitel Failed to open %s. %s Misslyckades med att öppna %s. %s c-format Could not display help for Qalculate!. Kunde inte visa hjälp för Qalculate!. Could not display help for Qalculate!. %s Kunde inte visa hjälp för Qalculate!. %s c-format approx. ca Stop process Stoppa förloppet Clear expression Töm uttrycket EXACT EXAKT APPROX APPROX RPN RPN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNK UNIT ENHET VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? Vill du uppdatera växelkurserna nu? It has been %s day since the exchange rates last were updated. Det var %s dag sedan växelkurserna senast uppdaterades. Det var %s dagar sedan växelkurserna senast uppdaterades. c-format It has been %s days since the exchange rates last were updated. Do not ask again Fråga inte igen It took too long to generate the plot data. Det tog för lång tid att generera data till diagrammet. It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. Det tog för lång tid att generera data till diagrammet. Vänligen minska frekvensen eller höj tidsgränsen i inställningar. When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. När fel, varningar eller annan information skapas under beräkningen ändras ikonen i övre högra hörnet i uttrycksfältet för att reflektera detta. Om du håller pekaren över eller klickar på ikonen, så kommer meddelandet att visas. Path of executable not found. Sökvägen till programmet hittades ej. curl not found. curl hittades ej. Failed to run update script. %s Misslyckades med att köra sriptet. %s c-format Failed to check for updates. Misslyckades med att söka efter uppdateringar. No updates found. Inga uppdatering hittades. A new version of %s is available at %s. Do you wish to update to version %s. En ny version av %s finns tillgänglig på %s. Vill du uppdatera till version %s. c-format A new version of %s is available. You can get version %s at %s. En ny version av %s finns tillgänglig. Du kan hämta version %s på %s. c-format Too many arguments for %s(). För många parametrar för %s(). c-format argument parameter Temperature Calculation Mode Läge för temperaturberäkningar The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj ett läge för temperaturberäkningar (läget kan senare ändras i inställningarna). Interpretation of dots Tolkning av punkter Please select interpretation of dots (".") (this can later be changed in preferences). Vänligen välj hur punkter ska tolkas (detta kan senare ändras i inställningarna). Both dot and comma as decimal separators Använd både punkt komma som decimaltecken Dot as thousands separator Punkt som tusentalsavgränsare Only dot as decimal separator Enbart punkt som decimaltecken Uncategorized Okategoriserad hexadecimal hexadecimal octal oktal decimal decimal duodecimal duodecimal binary binär roman romersk bijective bijektiv sexagesimal sexagesimal latitude latitud longitude longitud time tid bases baser calendars kalendrar rectangular rektangulär cartesian kartesisk exponential exponentiell polar polär angle vinkel phasor fasvektor optimal optimal base bas mixed blandade fraction bråktal factors faktorer partial fraction partialbråk factorize faktorisera expand expandera hexadecimal number hexadecimalt tal octal number oktalt tal decimal number decimalt tal duodecimal number duodecimalt tal binary number binärt tal roman numerals romerska siffror bijective base-26 bijektiv talbas 26 sexagesimal number sexagesimalt tal 32-bit floating point 32-bit flyttal 64-bit floating point 64-bit flyttal 16-bit floating point 16-bit flyttal 80-bit (x86) floating point 80-bit (x86) flyttal 128-bit floating point 128-bit flyttal time format tidsformat number bases talbaser optimal unit optimal enhet base units basenheter mixed units blandade enheter expanded partial fractions expanderade partialbråk complex rectangular form komplex rektangulär form complex exponential form komplex exponentiell form complex polar form komplex polär form complex cis form komplex cis-form complex angle notation komplex vinkelnotation complex phasor notation komplex fasvektornotation UTC time zone UTC-tidszon number base %s talbas %s c-format Inactive Inaktiva Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Hämtar data från dataset %s för ett givet objekt och egenskap. Om "info" är angivet som egenskap, ett dialogfönster öppnas med alla objektets egenskaper. c-format Example: Exempel: Arguments Parametrar optional optional argument frivillig default: argument default, in description förval: Requirement Krav key indicating that the property is a data set key nyckel Acti_vate Akti_vera a previous result ett föregående resultat matrix matris vector vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll boolean boolesk integer heltal rational rationell real reell complex komplex number nummer (not matrix) (inte matris) unknown okänd default assumptions förvalda antaganden Variable does not exist anymore. Variabel existerar inte längre. Data Retrieval Function Dataåtkomstfunktion Insert function Infoga funktion Insert function (dialog) Infoga funktion (dialog) Insert variable Infoga variabel Insert unit Infoga enhet Insert text Infoga text Insert date Infoga datum Insert vector Infoga vektor Insert matrix Infoga matris Insert smart parentheses Infoga smarta parenteser Convert to unit Omvandla till enhet Convert to unit (entry) Omvandla till enhet (inmatning) Convert to optimal unit Omvandla till optimal enhet Convert to base units Omvandla till basenheter Convert to optimal prefix Omvandla till optimalt prefix Convert to number base Omvandla till talbas Factorize result Faktorisera resultatet Expand result Expandera resultatet Expand partial fractions Expandera partialbråk RPN: down RPN: ner RPN: up RPN: upp RPN: swap RPN: byt plats RPN: copy RPN: kopiera RPN: lastx RPN: lastx RPN: delete register RPN: ta bort register RPN: clear stack RPN: töm stacken Load meta mode Aktivera metaläge Set expression base Ange talbas i uttryck Set result base Ange talbas i resultat Toggle exact mode (Av)aktivera exakt läge Set angle unit to degrees Ange vinkelenhet till grader Set angle unit to radians Ange vinkelenhet till radianer Set angle unit to gradians Ange vinkelenhet till gradienter Toggle simple fractions (Av)aktivera bråkform Toggle mixed fractions (Av)aktivera blandad form Toggle scientific notation (Av)aktivera vetenskaplig form Toggle simple notation (Av)aktivera enkel form Toggle RPN mode (Av)aktivera RPN-läge Toggle calculate as you type (Av)aktivera fortgående beräkningar Toggle programming keypad Visa/dölj programmeringsknappsatsen Show keypad Visa knappsatsen Show history Visa historik Search history Sök i historiken Show conversion Visa omvandling Show RPN stack Visa RPN-stack Manage variables Hantera variabler Manage functions Hantera funktioner Manage data sets Hantera dataset New variable Ny variabel New function Ny funktion Open plot functions/data Öppna rita funktions-/datadiagram Open convert number bases Öppna omvandla mellan talbaser Open floating point conversion Öppna flyttalsomvandling Open calender conversion Öppna kalenderomvandling Open percentage calculation tool Öppna procentberäkningsverktyg Open periodic table Öppna periodiska systemet Update exchange rates Uppdatera växelkurser Copy result Kopiera resultatet Insert result Infoga resultat Save result image Spara resulatbild Help Hjälp Quit Avsluta Toggle chain mode (Av)aktivera kedjeläge Toggle keep above (Av)aktivera placera överst Show/hide completion Visa/dölj komplettering Perform completion (activate first item) Utför komplettering (aktivera första posten) Prefixes Prefix No Prefix Inget prefix Optimal Prefix Optimalt prefix Prefix Prefix Complex angle/phasor notation Komplex vinkelnotation Number bases Talbaser Base units Grundenheter Binary number Binärt tal Calendars Kalendrar Complex cis form Komplex cis-form Decimal number Decimalt tal Duodecimal number Duodecimalt tal Complex exponential form Komplex exponentiell form Factors Faktorer 16-bit floating point binary format 16-bit binärt flyttal 32-bit floating point binary format 32-bit binärt flyttal 64-bit floating point binary format 64-bit binärt flyttal 80-bit (x86) floating point binary format 80-bit (x86) binärt flyttal 128-bit floating point binary format 128-bit binärt flyttal Hexadecimal number Hexadecimalt tal Latitude Latitud Longitude Longitud Mixed units Blandade enheter Octal number Oktalt tal Optimal units Optimala enheter Expanded partial fractions Expanderade partialbråk Complex polar form Komplex polär form Complex rectangular form Komplex rektangulär form Sexagesimal number Sexagesimalt tal and och or eller undefined odefinierad result is too long see history resultet är för långt se historiken calculation was aborted beräkningarna avbröts RPN Register Moved RPN-register flyttades RPN Operation RPN operation Processing… Behandlar… result processing was aborted resultatbehandlingen avbröts Factorizing… Faktoriserar… Expanding partial fractions… Expanderar partialbråk… Expanding… Expanderar… Calculating… Beräknar… Converting… Omvandlar… Fetching exchange rates. Hämtar växelkurser. Time zone parsing failed. Läsning av tidszon misslyckades. Keep open Håll öppen Enter RPN Enter (calculate and add to stack) Enter C_alculate _Beräkna Apply to Stack Applicera på stacken Argument Parameter True Sant False Falskt Info Info Edit Unit (global) Redigera enhet (systemvid) New Unit Ny enhet Empty name field. Tomt namnfält A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again En variabel eller enhet med samma namn finns redan. Vill du ersätta den? Base unit does not exist. Angiven grundenhet finns inte. Edit Function (global) Redigera funktion (systemvid) New Function Ny funktion Yes Ja No Nej Empty expression field. Tom uttrycksfält. A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again En funktion med samma namn finns redan. Vill du ersätta den? Unit does not exist Enheten finns inte Edit Unknown Variable (global) Redigera okänd variabel (systemvid) New Unknown Variable Ny okänd variabel An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Variable (global) Redigera variabel (systemvid) New Variable Ny variabel Empty value field. Tomt värdefält. Edit Vector Redigera vektor Edit Vector (global) Redigera vektor (systemvid) New Vector Ny vektor Edit Matrix (global) Redigera matris (systemvid) New Matrix Ny matris Vector Result Vektorresultat Matrix Result Matrisresultat New Data Object Nytt dataobjekt text text approximate approximerat Edit Data Set (global) Redigera dataset (systemvitt) New Data Set Nytt dataset info info Property Egenskap No file name entered. Filnamn måste anges No delimiter selected. En avgränsare måste anges Could not import from file %s Kunde inte importera fil: %s c-format No variable name entered. Inget variabelnamn angivet. No known variable with entered name found. Fann ingen känd variabel med angivet namn. Could not export to file %s Kunde inte exportera till fil: %s c-format My Variables Mina variabler Couldn't write definitions Kunde inte spara definitioner Preset Förinställt Abort Avbryt Undo Ångra Redo Gör om Completion Mode Kompletteringsläge Limited strict completion Begränsad strikt komplettering Strict completion Strikt komplettering Limited full completion Begränsad fullständig komplettering Full completion Fullständig komplettering No completion Ingen komplettering Delayed completion Fördröjd komplettering Customize completion… Anpassa komplettering… Save Mode Spara läge Preset mode cannot be overwritten. Förinställt läge kan inte skrivas över. Delete Mode Radera läge Couldn't write preferences to %s Kunde inte spara inställningar till %s c-format never aldrig ask fråga %i day %i dag %i dagar c-format %i days Copied Result was copied Kopierat log10 function not found. Kunde inte finna log10 funktionen. Search Sök _Search _Sök Remove Bookmark Ta bort bokmärkde Add Bookmark Lägg till bokmärke A bookmark with the selected name already exists. Do you want to overwrite it? Ett bokmärke med samma namn finns redan. Vill du ersätta den? No items found Inga objekt funna Select date Välj datum Rectangular form Rektangulär form Exponential form Exponentiell form Polar form Polär form Angle/phasor notation Vinkelnotation Optimal unit Optimal enhet Optimal prefix Optimalt prefix All functions Alla funktioner All variables Alla variabler Select definitions file Välj definitionsfil _Import _Importera Could not copy %s to %s. Kunde inte kopiera %s till %s. c-format Could not read %s. Kunde inte läsa %s. c-format Could not copy file to %s. Kunde inte kopiera fil till %s. c-format Unsupported base. Basen stöds ej. The selected Chinese year does not exist. Det valda kinesiska året finns inte. Conversion to Gregorian calendar failed. Omvandling to gregoriansk kalender misslyckades Calendar conversion failed for: %s. Kalenderomvandling misslyckades för: %s. c-format Gnuplot was not found. Gnuplot hittades ej. %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) måste installeras separat, och hittas i sökvägen för binärer, för att för att diagram ska kunna visas. c-format Select file to save PNG image to Välj fil att att spara PNG bild till Allowed File Types Tillåtna filtyper All Files Alla filer Cannot delete unit as it is needed by other units. do not delete units that are used by other units Kan inte ta bort enheten eftersom den används av andra enheter. none ingen result is too long resultet är för långt translator-credits Hanna Knutsson <hanna.knutsson@protonmail.com> Mode not found. Läge hittades ej. Elements (in horizontal order) Element (radvis) Select file to import Välj fil att importera _Open _Öppna Select file to export to Välj fil att exportera till A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? Ett konflikterande objekt med samma namn existerar. Om du fortsätter och sparar ändringar, kommer det konflikterande objektet att skrivas över eller deaktiveras. Vill du fortsätta? Set key combination Ange tangentkombination Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) Tryck tangentkombinationen som du önskar använda för åtgärden (tryck Escape för att avbryta). No keys Inga tangenter Empty value. Tomt värde. Function not found. Funktionen hittades ej. Variable not found. Variabeln hittades ej. Unit not found. Enheten hittades ej. The key combination is already in use. Do you wish to replace the current action? Tangentkombinationen används redan. Vill du ersätta den nuvarande åtgärden? Select file to export Välj fil att exportera till Empty expression. Tomt uttryck. Empty x variable. Tom x-variabel Element Data Grundämnesdata Classification Klassificering Alkali Metal Alkalimetall Alkaline-Earth Metal Alkalisk jordartsmetall Lanthanide Lantanid Actinide Aktinid Transition Metal Övergångsmetall Metal Metall Metalloid Halvmetall Polyatomic Non-Metal Polyatomisk icke-metall Diatomic Non-Metal Diatomisk icke-metall Noble Gas Ädelgas Unknown chemical properties Okända kemiska egenskaper No unknowns in result. Inga okända värden i resultatet. Set Unknowns Ange okända värden Copy result to clipboard Kopiera resultat till urklipp x x If a matrix or vectors shall be generated from the contents of the file Huruvida en matris eller vektor skall genereras från filinnehållet Use dark theme Använd mörkt tema Add the two top values Keypad Addera de två översta värdena u Manage units button u to Button for convert to operator till Add Keypad Addera 1 1 Base Unit Grundenhet Alias Alias Composite Unit Sammansatt enhet Fonts Teckensnitt <b>Name</b> <b>Namn</b> <b>Type</b> <b>Typ</b> <b>Relation</b> <b>Relation</b> Chain Calculation Sekventiell beräkning to till Adaptive parsing Adaptiv tolkning 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2x = 1/(2*x) 1/2 x = (1/2)*x 1 m / 1 m/s = (1 m)/(1 m/s) 1/2 x = 1/(2*x) 1/2 x = 1/(2*x) 1/2x = 1/2*x 1/2x = 1/2*x %i seconds %i sekunder c-format Ent Ent Defaults Förval Customize Buttons Anpassat teckensnitt för status Names details Namnegenskaper Rational number form Form för rationella tal Decimal fractions Decimalform Exact decimal fractions Exakt decimalform Simple fractions Bråkform Mixed fractions Blandad form 0 0 10 10 7 7 General Keypad Allmän knappsats Programming Keypad Programmeringsknappsats 2 2 Floating point error Flyttalsfel float16 binary number float16 binärt tal float32 binary number float32 binärt tal float64 binary number float64 binärt tal float128 binary number float128 binärt tal Clear the RPN stack (Ctrl+Shift+Delete) Töm RPN-stacken (Ctrl+Shift+Delete) set shortcut ange genväg set key combination Ange tangentkombination Press shortcut keys Tryck på tangenter för kortkommando Keyboard shortcut Kortkommando Shortcut Tangenter ∠ (angle) ∠ (vinkel) complex angle form komplex vinkelnotation Copy Value Text Kopiera värdetext CUSTOM ANPASSAD number base %li talbas %li Base Units Grundenheter Show Programming Keypad Visa programmeringsknappsats Are you sure you want to delete the bookmark? Är du säker på att du vill ta bort bokmärket? Are you sure you want to delete the function? Är du säker på att du vill ta bort funktionen? Are you sure you want to delete the variable? Är du säker på att du vill ta bort variabeln? 10^x (Ctrl+Shift+E) 10^x (Ctrl+Shift+E) pi pi <i>e</i> <i>f(x)</i> x<sup>2</sup> x<sup>2</sup> 1/2 2 x<sup>3</sup> x<sup>2</sup> 1/3 1 x<sup>4</sup> x<sup>2</sup> 1/4 1 x<sup>5</sup> x<sup>2</sup> 1/5 1 x<sup>6</sup> x<sup>2</sup> 1/6 1 x<sup>7</sup> x<sup>2</sup> 1/7 1 x<sup>8</sup> x<sup>2</sup> 1/8 1 x<sup>9</sup> x<sup>2</sup> 1/9 1/x Percent Procent ALL ALL Close Programming Keypad Stäng programmeringsknappsatsen Simplify Förenkla _Simplify _Förenkla Simplifying… Förenklar… Sine Sinus Cosine Cosinus Tangent Tangens Natural logarithm Naturlig logaritm Summation function Summafunktion Modulus Modulus Factorial Fakultet Archimedes' constant Archimedes konstant Statistical mean Statistiskt medelvärde 4 4 5 5 6 6 8 8 9 9 11 1 * * ** * Interval Form Intervallvisning Forms of Fractions Visning av bråk Form of Fractions Visning av bråk Fractional Display Bråktalsvisning Decimal (Try Exact) Decimal (försök exakt) Combined Kombinerad Fractional display Bråktalsvisning Exact rationals Exakta rationella tal Fraction D_ecimal Bråkvisning d_ecimaler Fraction Decimal (Try Exact) Bråkvisning d_ecimaler (exakt) Fraction Co_mbined Bråkvisning ko_mbinerad Utilities Verktyg Always exact Alltid exakt Interval arithmetics Intervallaritmetik Try exact Försök exakt INTVL INTVL Relation to the base unit (usually just a number) Relation till grundenheten (vanligtvis enbart ett nummer) You probably do not need to define this Du behöver troligen inte ange detta _Execute _Exekvera Completion Level Kompletteringsnivå Egyptian Egyptisk Unit to convert to Enhet att omvandla till The number of decimals shown will always be limited by the precision and the min decimal setting is therefor only useful for exact numbers. Antalet decimaler som vissa begränsas alltid av precisionen och inställningen för minimalt antal decimaler är därför enbart användbar för exakta nummer. Indicate Infinite Series Indikera oändliga talserier Activate infix notation and disable the RPN stack. Aktiverar infix notation och avaktiverar RPN-stacken. Activate both the RPN stack and RPN syntax. Aktiverar både RPN-stacken och RPN-syntax. RPN Stack Only Enbart RPN-stack Use only keypad keys for RPN operations (+-*/^) and use the rest of the keyboard for expression entry Använd enbart knappsatstangenter för RPN operationer (+-*/^) och använd resten av tangentbordet för att skriva uttryck Complex Number Komplext nummer Errors, warnings and other information generated during the last calculation is shown when holding the pointer over the icon that appears to the right of the expression entry. Felmeddelanden, varningar och annan information från den senaste beräkningen visas när du håller pekaren över eller klickar knappen till höger om uttrycksfältet. + + - - x<sup><small>y</small></sup> x<sup>y</sup> . . % % Old value Gammalt värde Percent change Procent förändring New total percent Ny total procent No default angle unit Ingen förvald vinkelenhet Create new function Skapa en ny funktion <i>x<sup>y</sup></i> x<sup>y</sup> <i>x</i>! <i>f(x)</i> <i>f(x)</i> <i>f(x)</i> <b>=</b> <b>=</b> <b>7</b> <b>Namn</b> <b>8</b> <b>Namn</b> <b>9</b> <b>Namn</b> <b>4</b> <b>4</b> <b>5</b> <b>5</b> <b>6</b> <b>6</b> <b>*</b> <b>*</b> <b>/</b> <b>Namn</b> <b>1</b> <b>Namn</b> <b>2</b> <b>Namn</b> <b>3</b> <b>Namn</b> <b>+</b> <b>Namn</b> <b>-</b> <b>Namn</b> <b>0</b> <b>Namn</b> <b>.</b> <b>Namn</b> <i>x</i> <i>f(x)</i> <i>y</i> <i>f(x)</i> <i>z</i> <i>f(x)</i> Use default assumptions förvalda antaganden Toggle fractional number display (Av)aktivera bråktalsvisning Raise by two Upphöj med två Base-10 logarithm Bas-10-logaritm log log Reciprocal Invertera Toggle hyperbolic functions (Av)aktivera hyperbola funktioner hyp hyp Toggle inverse functions (Av)aktivera inversa funktioner inv inv Deg Deg Rad Rad Gra Gra Wget arguments Wget parameter Arguments (in addition to timeout and output file) passed to wget when fetching exchange rates Parametrar (utöver timeout och output-fil) som används för wget när växelkurser hämtas You need to download exchange rates to be able to convert between different currencies. You can later get current exchange rates by selecting “Update Exchange Rates� under the File menu. Do you want to fetch exchange rates now from the Internet? Du behöver ladda ner växelkurser för att kunna omvandla mellan olika valutor. Du kan senare hämta nuvarande växelkurser genom att välja "Uppdatera växelkurser" under filmenyn. Vill du hämta växelkurser från Internet? Could not display help. %s Kunde inte visa hjälp. %s RPN Register Operation RPN-registeroperation _Clear _Rensa (De)activate use of Reverse Polish Notation syntax in expressions (Av)aktivera RPN-notation i uttryck (De)activate the Reverse Polish Notation mode (Av)aktivera RPN-läget x! x! Edit value of selected register Redigera värdet för valt register Convert to Mixed Units (default units) Omvandla till blandade enheter (förvalda enheter) Convert to Mixed Units (all units) Omvandla till blandade enheter (alla enheter) Keypad Knappsats Enables separate placement of units Aktiverar separat plaering av enheter Ignore Whitespace Ignorera mellanslag No Special Implicit Multiplication Ingen speciell implicit multiplikation xy != x*y xy != x*y (De)activate limits to implicit multiplication (Av)aktivera begränsningar av implicit multiplikation Convert result to entered unit expression Omvandla resultatet till enhetsuttrycket Do the conversion and close this window Utför omvandling och stäng fönstret _Selector _Väljare H_istory H_istorik _RPN Stack _RPN-stack Temporary Temporära SI SI CGS CGS Import CSV File... Importera CSV-fil... Export CSV File... Exportera CSV-fil... Set Unknowns... Ange okända värden... Other... Annan... Save Mode... Spara läge... Delete Mode... Radera läge... C_onvert... _Omvandla... Transactinide Transaktinid <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- a multifuntional calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson <span weight="bold" size="xx-large"><span foreground="#cc4499">Q</span>alculate!</span> (v. 0.9.7) <span size="large">- en multifuntionell calculator</span> <i>http://qalculate.sourceforge.net/</i> <i>License:</i> GNU General Public Licence <i>Author:</i> Hanna Knutsson Copyright (c) 2003-2006 Hanna Knutsson About Qalculate! Om Qalculate! Category that the generated variable(s) shall belong to Kategorin som de genererade variablerna skall tillhöra Argument type Parameterklass Modify selected subfunction Modifiera vald subfunktion The category this function belongs to Kategorin som funktionen tillhör a function, unit or variable en funktion, enhet eller variabel Abort operation Avbryt operationen Ans Ans Binary Octal Decimal Hexadecimal Sexagesimal Time format Roman Other... Binä Oktal Decimal Hexadecimal Sexagesimal Tidsformat Romerska Other... Enable Prefixes Använd prefix Enable _Prefixes Använd _prefix Normal Engineering Scientific Pure Simple Normal Teknisk Vetenskaplig Strikt Enkel Progress... Framåtskridande... Category that this variable belongs to Kategorin variabeln tillhör Font Teckensnitt Select custom font Välj ett teckensnitt The category this unit belongs to Kategorin som enheten tillhör C_onvert Result _Omvandla resultat Select result font Välj teckensnitt Select status font Välj teckensnitt 10^x 10^x ArgumentEditDialog Name: Namn: Type: Typ: Free Valfri Number Nummer Integer Heltal Symbol Symbol Text Text Date Datum Vector Vektor Matrix Matris Boolean Boolesk Angle Vinkel Object Objekt Function Funktion Unit Enhet Variable Variabel File Fil Enable rules and type test Aktivera villkor- och klass-test Custom condition: Anpassat villkor: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) Till exempel om parametern är en matris och måste ha lika antal rader och kolumner: rows(\x) = columns(\x) Allow matrix Tillåt matriser Forbid zero Förbjud noll Handle vector Hantera vektor Calculate function for each separate element in vector. Beräkna funktionen för varje separat element i vektor. Min Min Include equals Inkludera lika med Max Max CSVDialog Import CSV File Importera CSV-fil Export CSV File Exportera CSV-fil Current result Nuvarande resultat Matrix/vector variable: Matris/vektorvariabel: File: Fil: Import as Importera som matrix matris vectors vektorer Name: Namn: First row: Första raden: Includes headings Inkluderar kolumnnamn Delimiter: Avgränsare: Comma Komma Tabulator Tabulator Semicolon Semikolon Space Mellanslag Other Annan Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Error Fel Could not import from file %1 Kunde inte importera fil: %1 No matrix or vector variable with the entered name was found. Fann ingen matris- eller vektorvariabel med angivet namn. Could not export to file %1 Kunde inte exportera till fil: %1 CalendarConversionDialog Calendar Conversion Kalenderomvandling Gregorian Gregoriansk Hebrew Hebreisk Islamic (Hijri) Muslimsk Persian (Solar Hijri) Persisk Indian (National) Indisk (nationell) Chinese Kinesisk Julian Juliansk Revised Julian (Milanković) Reviderad juliansk Coptic Koptisk Ethiopian Etiopisk Error Fel The selected Chinese year does not exist. Det valda kinesiska året finns inte. Conversion to Gregorian calendar failed. Omvandling to gregoriansk kalender misslyckades. Calendar conversion failed for: %1. Kalenderomvandling misslyckades för: %1. DataObjectEditDialog %1: %1: Default Förval Approximate Approximerad Exact Exakt Edit Data Object Redigera dataobjekt New Data Object Nytt dataobjekt DataPropertyEditDialog Name: Namn: Title: Titel: Descriptive name: Beskrivande namn: Description: Beskrivning: Value type: Värdetyp: Expression Uttryck Number Nummer Text Text Unit expression: Enhetsuttryck: Use as key Använd som nyckel Case sensitive value Storlekskänsligt värde Approximate value Approximerat värde Value uses brackets Värdet använder klammrar Hide Göm Edit Data Property Redigera dataegenskap DataSetEditDialog General Allmänt Properties Egenskaper Function Funktion Title: Titel: Descriptive name: Beskrivande namn: Data file: Datafil: Description: Beskrivning: Copyright: Upphovsrätt: Title Titel Name Namn Type Typ Add Lägg till Edit Redigera Remove Ta bort Name: Namn: Object argument name: Objektargumentets namn: Property argument name: Egenskapsargumentets namn: Default property: Förvald egenskap: text text approximate approximerat number nummer expression uttryck key nyckel Question Fråga A function with the same name already exists. Do you want to overwrite the function? En funktion med samma namn finns redan. Vill du ersätta den? Data Sets Dataset Object Objekt Property Egenskap Edit Data Set Redigera dataset New Data Set Nytt dataset DataSetsDialog Data Sets Dataset Data sets: Dataset: New… Ny… Edit… Redigera… Delete Ta bort Objects: Objekt: Data set description: Beskrivning av dataset: Object attributes: Objektegenskaper: Properties Egenskaper key nyckel Data Retrieval Function Dataåtkomstfunktion argument parameter ExpressionEdit matrix matris vector vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll boolean boolesk integer heltal rational rationell real reell complex komplex number nummer (not matrix) (inte matris) unknown okänd default assumptions förvalda antaganden Scientific Notation Vetenskaplig form Simple Notation Enkel form Prefix Prefix Prefix: Prefix: Complex angle/phasor notation Komplex vinkelnotation Base units Grundenheter Number base Talbas Bijective base-26 Bijektiv talbas 26 Binary number Binärt tal Calendars Kalendrar Complex cis form Komplex cis-form Decimal number Decimalt tal Duodecimal number Duodecimalt tal Complex exponential form Komplex exponentiell form Factors Faktorer 16-bit floating point binary format 16-bit binärt flyttal 32-bit floating point binary format 32-bit binärt flyttal 64-bit floating point binary format 64-bit binärt flyttal 80-bit (x86) floating point binary format 80-bit (x86) binärt flyttal 128-bit floating point binary format 128-bit binärt flyttal Fraction Bråktal Hexadecimal number Hexadecimalt tal Latitude Latitud Longitude Longitud Mixed units Blandade enheter Octal number Oktalt tal Optimal units Optimala enheter Expanded partial fractions Expanderade partialbråk Complex polar form Komplex polär form Complex rectangular form Komplex rektangulär form Roman numerals Romerska siffror Sexagesimal number Sexagesimalt tal Time format Tidsformat Unicode Unicode Expression Status Uttrycksstatus Off Av With delay Med fördröjning Without delay Utan fördröjning Use input method Använd inmatningsmetod UTC time zone UTC-tidszon Undo Ångra Complex Angle/Phasor Notation Komplex vinkelnotation Number Base Talbas Binary-Coded Decimal Binärkodat decimalt tal (BCD) Bijective Base-26 Bijektiv talbas 26 Binary Bumber Binärt tal Complex Cis Form Komplex cis-form Binary Number Binärt tal Complex cis Form Komplex cis-form Decimal Number Decimalt tal Duodecimal Number Duodecimalt tal Complex Exponential Form Komplex exponentiell form 16-bit Floating Point Binary Format 16-bit binärt flyttal 32-bit Floating Point Binary Format 32-bit binärt flyttal 64-bit Floating Point Binary Format 64-bit binärt flyttal 80-bit (x86) Floating Point Binary Format 80-bit (x86) binärt flyttal 128-bit Floating Point Binary Format 128-bit binärt flyttal Hexadecimal Number Hexadecimalt tal Mixed Units Blandade enheter Octal Number Oktalt tal Optimal Units Optimala enheter Optimal Unit Optimal enhet Optimal Prefix Optimalt prefix Expanded Partial Fractions Expanderade partialbråk Complex Polar Form Komplex polär form Complex Rectangular Form Komplex rektangulär form Roman Numerals Romerska siffror Sexagesimal Number Sexagesimalt tal Time Format Tidsformat UTC Time Zone UTC-tidszon Scientific Form Vetenskapligt format Engineering Form Tekniskt format Simple Form Enkelt format Custom Anpassad Redo Gör om Cut Klipp ut Copy Kopiera Paste Klistra in Delete Ta bort Calculate Selection Beräkna markering Insert Date… Infoga datum… Insert Matrix… Infoga matris… Select All Markera allt Clear Rensa Clear History Töm historiken Completion Komplettering No completion Ingen komplettering Limited strict completion Begränsad strikt komplettering Strict completion Strikt komplettering Limited full completion Begränsad fullständig komplettering Full completion Fullständig komplettering Delayed completion Fördröjd komplettering Enable input method Aktivera inmatningsmetod Matrix Matris Too many arguments for %1(). För många parametrar för %1(). argument parameter %1: %1: comment kommentar MC (memory clear) MC (töm minne) MS (memory store) MS (spara i minne) M+ (memory plus) M+ (minnesoperation) M− (memory minus) M− (minnesoperation) factorize faktorisera expand expandera hexadecimal hexadecimal hexadecimal number hexadecimalt tal octal oktal octal number oktalt tal decimal decimal decimal number decimalt tal duodecimal duodecimal duodecimal number duodecimalt tal binary binär binary number binärt tal roman romersk roman numerals romerska siffror bijective bijektiv bijective base-26 bijektiv talbas 26 binary-coded decimal BCD sexagesimal sexagesimal sexagesimal number sexagesimalt tal latitude latitud longitude longitud 32-bit floating point 32-bit flyttal 64-bit floating point 64-bit flyttal 16-bit floating point 16-bit flyttal 80-bit (x86) floating point 80-bit (x86) flyttal 128-bit floating point 128-bit flyttal time tid time format tidsformat scientific vetenskaplig scientific form vetenskapligt format engineering teknisk engineering form Tekniskt format simple enkel simple form Enkelt format bases baser number bases talbaser calendars kalendrar optimal optimal optimal unit optimal enhet prefix prefix optimal prefix optimalt prefix base bas base units basenheter mixed blandade mixed units blandade enheter decimals decimaler decimal fraction decimalform fraction bråktal factors faktorer Decimal Fraction Decimalform Engineering Notation Teknisk form In history list I historiken In expression field I uttrycksfältet In status bar I statusfältet With adaptive delay Med adaptiv fördröjning Automatically calculate selection Beräkna markering automatiskt scientific notation vetenskaplig form engineering notation teknisk form simple notation enkel form base base units bas partial fraction partialbråk expanded partial fractions expanderade partialbråk rectangular rektangulär cartesian kartesisk complex rectangular form komplex rektangulär form exponential exponentiell complex exponential form komplex exponentiell form polar polär complex polar form komplex polär form complex cis form komplex cis-form angle vinkel complex angle notation komplex vinkelnotation phasor fasvektor complex phasor notation komplex fasvektornotation base number base bas number base %1 talbas %1 Data object Dataobjekt FPConversionDialog Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Format Format 16-bit (half precision) 32-bit (single precision) 64-bit (double precision) 80-bit (x86 extended format) 128-bit (quadruple precision) Microchip 24-bit Microchip 32-bit Value Värde Decimal value Decimalt värde Binary representation Binär representation Hexadecimal representation Hexadecimal representation Floating point value Flyttalsvärde Conversion error Förlorad precision FunctionEditDialog Name: Namn: Expression: Uttryck: Parameter references: Parameterreferenser: Required Nödvändigt Details Detaljer Description Beskrivning Argument references: Parameterreferenser: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x, y och z (t.ex. "(x+y)/2"), eller \x, \y, \z, \a, \b, … (t.ex. "(\x+\y)/2") Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") Använd x, y och z (t.ex. "(x+y)/2"), eller \x, \y, \z, \a, \b, … (t.ex. "(\x+\y)/2") Category: Kategori: Descriptive name: Beskrivande namn: Hide function Dölj funktionen Example: Exempel: Description: Beskrivning: Condition: Förutsättning: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") Förutsättning som måste infrias för funktionen (t.ex. om den andra parametern måste var större än den första: "\y > \x") Sub-functions: Subfunktioner: Expression Uttryck Precalculate Förberäkna Reference Referens Add Lägg till Edit Redigera Remove Ta bort Arguments: Parametrar: Name Namn Type Typ Warning Varning Conversion (using "to") is not supported in functions. Omvandling (med \"till\") stöds inte i funktioner. Question Fråga A function with the same name already exists. Do you want to overwrite the function? En funktion med samma namn finns redan. Vill du ersätta den? Edit Function Redigera funktion New Function Ny funktion FunctionsDialog Functions Funktioner Category Kategori Function Funktion New… Ny… Edit… Redigera… Deactivate Avaktivera Delete Ta bort Calculate… Beräkna… Apply Applicera Insert Infoga Favorite Favorit argument parameter Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. Hämtar data från dataset %1 för ett givet objekt och egenskap. Om "info" är angivet som egenskap, ett dialogfönster öppnas med alla objektets egenskaper. Example: Exempel: Arguments Parametrar optional optional argument frivillig default: argument default förval: Requirement: Required condition for function Krav: Favorites Favoriter default: argument default förval: Requirement Krav Properties Egenskaper %1: %1: key indicating that the property is a data set key nyckel Activate Aktivera All All functions Alla Uncategorized Okategoriserade User functions Användarfunktioner Inactive Inaktiva HistoryView Copy Kopiera Copy (formatted) Kopiera med format Insert Value Infoga värde Insert Text Infoga text Copy Formatted Text Kopiera formaterad text Copy unformatted ASCII Kopiera oformaterad ASCII Select All Markera allt Search… Sök… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. Search by Date… Sök efter datum… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck ovan, t.ex. "5 + 2 / 3", och tryck på entertangenten. Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. Skriv in ett matematiskt uttryck nedan, t.ex. "5 + 2 / 3", och tryck på entertangenten. Exchange rate source(s): Växelkurskälla: Växelkurskällor: updated %1 uppdaterad %1 uppdaterade %1 Comment Kommentar Protect Skydda Add Comment… Lägg till kommenar… Move to Top Lägg överst Remove Ta bort Clear Rensa Edit Comment… Redigera kommentar… Text: Text: Search Sök KeypadButton <i>Right-click/long press</i>: %1 <i>Högerklick/långtryck</i>: %1 <i>Right-click</i>: %1 <i>Högerklick</i>: %1 <i>Long press</i>: %1 <i>Långtryck</i>: %1 Open menu Öppna menyn <i>Middle-click</i>: %1 <i>Mittenklick</i>: %1 KeypadWidget Memory store Spara i minne Memory clear Töm minne Memory recall Återkalla minne Memory add Addera till minnet Memory subtract Subtrahera från minnet STO Standard calculator button. Do not use more than three characters. STO Store Spara New function Ny funktion sin sin cos cos tan tan Exponentiation Exponentiering Percent or remainder Procent eller rest Uncertainty/interval Osäkerhet/intervall Relative error Relativt fel Interval Intervall Move cursor left Flytta markören åt vänster Move cursor to start Flytta markören till början Move cursor right Flytta markören åt höger Move cursor to end Flytta markören till slutet Logical AND Logiskt AND Logical OR Logiskt OR Bitwise Exclusive OR Bitvist exklusivt OR Logical NOT Logiskt NOT Bitwise Left Shift Bitvist högerskift Bitwise Right Shift Bitvist vänsterskift cmp cmp rot rot a→1 a→1 Expand partial fractions Expandera partialbråk DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. C Enable units in physical constants Aktivera enheter i fysiska konstanter All constants Alla konstanter Percentage Calculation Tool Procentberäkningsverktyg more fler All units Alla enheter All variables Alla variabler Action Åtgärd Interval Display Intervallvisning Adaptive Adaptiv Significant digits Signifikanta siffror Plus/minus Plus/minus Relative Relativ Concise Koncis Interval Calculation Intervallberäkning Variance formula Variansformel Interval arithmetic Intervallaritmetik Allow concise uncertainty input Tillåt koncis notation för inmatning av osäkerhet Complex number form Form för komplexa tal Rectangular Rektangulär Exponential Exponentiell Polar Polär Angle/phasor Vinkel Type Assumptions type Typ Sign Assumptions sign Tecken Default assumptions Förvalda antaganden Number Nummer Real Reell Rational Rationell Integer Heltal Boolean Boolesk Unknown Unknown assumptions sign Okänd Non-zero Ej noll Positive Positiv Non-negative Ej negativ Negative Negativ Non-positive Ej positiv Factorize Faktorisera Expand Expandera Add column Lägg till kolumn Add row Lägg till rad Remove column Ta bort kolumn Remove row Ta bort rad Left parenthesis Vänsterparentes Left vector bracket Vänster hakparentes för vektorer Right parenthesis Högerparentes Right vector bracket Höger hakparentes för vektorer Smart parentheses Smarta parenteser Vector brackets Hakparenteser för vektorer Argument separator Parameteravgränsare Blank space Blanksteg New line Ny rad Decimal point Decimalkomma Previous result (static) Föregående resultat (statiskt) Button Action Knappåtgärd Label: Etikett: Action: Åtgärd: None Ingen Value: Värde: Previous answer (static) Föregående resultat (statiskt) Multiplication Multiplikation Bitwise AND Bitvist AND Bitwise Shift Bitvist skift Delete Ta bort Backspace Backsteg Addition Addition Plus Plus Subtraction Subraktion Minus Minus Division Division Bitwise OR Bitvist OR Bitwise NOT Bitvist NOT Clear expression Töm uttrycket Calculate expression Beräkna uttrycket NamesEditDialog Name Namn Abbreviation Förkortning Plural Pluralform Reference Referens Avoid input Undvik input Unicode Unicode Suffix Suffix Case sensitive Storlekskänslig Completion only Enbart komplettering Add Lägg till Edit Redigera Remove Ta bort Warning Varning Illegal name Otillåtet namn A function with the same name already exists. En funktion med samma namn finns redan. A unit or variable with the same name already exists. En enhet eller variabel med samma namn finns redan. PercentageCalculationDialog Percentage Procent Value 1 Värde 1 Value 2 Värde 2 Change from 1 to 2 Förändring från 1 till 2 Change from 2 to 1 Förändring från 2 till 1 2 compared to 1 2 jämfört med 1 1 compared to 2 1 jämfört med 2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. Ange två värden, av vilka högst en får vara ett procenttal, och de övriga kommer att beräknas åt dig. Clear Rensa PeriodicTableDialog Periodic Table Periodiska systemet Element Data Grundämnesdata Alkali Metal Alkalimetall Alkaline-Earth Metal Alkalisk jordartsmetall Lanthanide Lantanid Actinide Aktinid Transition Metal Övergångsmetall Metal Metall Metalloid Halvmetall Polyatomic Non-Metal Polyatomisk icke-metall Diatomic Non-Metal Diatomisk icke-metall Noble Gas Ädelgas Unknown chemical properties Okända kemiska egenskaper Unknown Okänd %1: %1: PlotDialog Plot Diagram Data Data Title: Rubrik: Expression: Uttryck: Function Funktion Vector/matrix Vektor/matris Paired matrix Parvis matris Rows Rader X variable: X-variabel: Style: Stil: Line Kurva Points Punkter Line with points Kurva med punkter Boxes/bars Boxar/staplar Histogram Histogram Steps Steg Candlesticks Ljusstakar Dots Små punkter Polar Polär Smoothing: Utjämning: None Ingen Monotonic Monoton Natural cubic splines Naturliga kubiska splines Bezier Bezier Bezier (monotonic) Bezier (monoton) Y-axis: Y-axel: Primary Primär Secondary Sekundär Add Lägg till Apply Applicera Remove Ta bort Category Kategori Title Rubrik Expression Uttryck Function Range Funktionsomfång Minimum x value: Lägsta x-värde: Maximum x value: Högsta x-värde: Sampling rate: Frekvens: Step size: Stegstorlek: Show real and imaginary parts Visa real- och imaginärdel Appearance Utseende Display grid Visa rutnät Display full border Visa alla kanter Minimum y value: Lägsta y-värde: Maximum y value: Högst y-värde: Logarithmic x scale: Logaritmisk x-skala: Logarithmic y scale: Logaritmisk y-skala: Calculating… Beräknar… Cancel Avbryt Processing… Behandlar… Minimum y value Lägsta y-värde Maximum y value Högst y-värde Logarithmic x scale Logaritmisk x-skala Logarithmic y scale Logaritmisk y-skala X-axis label: Namn på x-axeln: Y-axis label: Namn på y-axeln: Line width: Linjetjocklek: Legend placement: Textplacering: Top-left Uppe till vänster Top-right Uppe till höger Bottom-left Nere till vänster Bottom-right Nere till höger Below Under Outside Utanför Error Fel It took too long to generate the plot data. Det tog för lång tid att generera data till diagrammet. PreferencesDialog Look && Feel Utseende och känsla Numbers && Operators Nummer och operatorer Units && Currencies Enheter och valutor Parsing && Calculation Tolkning och beräkning Ignore system language (requires restart) Bortse från systemspråket (kräver omstart) Language: Språk: Allow multiple instances Tillåt flera instanser Notify when a new version is available Meddela när en ny version finns tillgänglig Clear history on exit Töm historiken vid programavslut Use caret for bitwise XOR Använd insättningstecken för bitvis XOR Close application with Esc key Stäng programmet med Escape Keep above other windows Placera över andra fönster Preserve history height Bevara höjden på historiken Do not change the height of history list when keypad or number bases are show or hidden. Ändra inte höjden på historiklistan när knappsats eller talbaser visas eller döljs. Place expression field below history (experimental) Placera uttrycksfältet under historiken (experimentellt) Show status bar Visa statusfält Window title: Fönstertitel: Application name Programnamn Result Resultat Application name + result Programnamn + resultat Workspace Arbetsyta Application name + workspace Programnamn + arbetsyta Tooltips: Verktygstips: Show all Visa alla Hide in keypad Dölj i knappsats Hide all Dölj alla Style: Stil: Default (requires restart) Default style Förval (kräver omstart) Dark mode Mörkt läge Disable cursor blinking Inaktivera blinkande markör Colorize result Färglägg resultat In status bar I statusfältet Adaptive delay Adaptiv fördröjning Parsed (compact) Tolkat uttryck (kompakt) Entered + parsed (compact) Inknappat + tolkat uttryck (kompakt) Custom Anpassad Default currency: Förvald valuta: Custom history font: Anpassat teckensnitt för historik: Expression status: Uttrycksstatus: Off Av In history list I historiken In expression field I uttrycksfältet Status tooltip delay: Fördröjning för statusverktygsstips: Calculate-as-you-type delay: Fördröjning för fortgående beräkningar: Automatically copy result Kopiera resultat automatiskt Allow concise uncertainty input Tillåt koncis notation för inmatning av osäkerhet Interpret unrecognized symbols as variables Tolka okända symboler som variabler Two's complement output: Tvåkomplementsform för utdata: Two's complement input: Tvåkomplementsform för indata: Binary Binär Hexadecimal Hexadecimal Binary bits: Binära bitar: Automatic Automatiskt Multiplication sign: Multiplikationstecken: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Place percent button in number pad Placera procentknappen i den numeriska knappsatsen Indicate repeating decimals: Indikera upprepande decimaler: Ellipsis Tre punkter Overline Överstreck Automatically group digits in input (experimental) Gruppera siffor automatiskt i indata (experimentellt) Concise Koncis Round halfway numbers to odd Avrunda mittemellan-tal till udda siffra Round halfway numbers toward zero Avrunda mittemellan-mot noll Round halfway numbers to random Avrunda mittemellan-tal slumpmässigt Round halfway numbers up Avrunda mittemellan-tal uppåt Round halfway numbers down Avrunda mittemellan-tal nedåt Round toward zero Avrunda mot noll Round away from zero Avrunda bort från noll Round up Avrunda uppåt Round down Avrunda nedåt Enable units Aktivera enheter Copy unformatted ASCII without units Kopiera oformaterad ASCII utan enheter Fonts Teckensnitt Units Enheter Calculation Beräkning Restart required Omstart krävs Please restart the program for the language change to take effect. Vängligen starta om programmet för att språkändringen skall ha effekt. Custom result font Anpassat teckensnitt för resultat Custom expression font Anpassat teckensnitt för uttryck Custom keypad font Anpassat teckensnitt för knappsats Custom application font Anpassat programteckensnitt Custom result font: Anpassat teckensnitt för resultat: Custom expression font: Anpassat teckensnitt för uttryck: Custom status bar font: Anpassat teckensnitt för statusfältet: Custom keypad font: Anpassat teckensnitt för knappsats: Custom application font: Anpassat programteckensnitt: Display expression status Visa uttrycksstatus Delay: Fördröjning: Expression after calculation: Uttryck efter beräkning: Keep expression Behåll uttrycket Clear expression Töm uttrycket Replace with result Ersätt med resultatet Replace with result if shorter Ersätt med resultatet om kortare Use keyboard keys for RPN Använd tangentbordet för RPN Parsing mode: Tolkningsläge: Adaptive Adaptiv Conventional Konventionell Implicit multiplication first Implicit multiplikation först Chain Kedjeläge RPN RPN Simplified percentage Förenklad procentberäkning Read precision Läs precision Limit implicit multiplication Begränsa implicit multiplikation Interval calculation: Intervallberäkning: Variance formula Variansformel Interval arithmetic Intervallaritmetik Factorize result Faktorisera resultatet Binary two's complement representation Binär tvåkomplementsform Hexadecimal two's complement representation Hexadecimal tvåkomplementsform Use lower case letters in non-decimal numbers Använd små bokstäver i icke-decimala nummer Use special duodecimal symbols Använd särskilda duodecimala symboler Spell out logical operators Visa ord för logiska operatorer Use E-notation instead of 10^x Använd E istället för 10^x Preferences Inställningar Format result Formattera resultat ms milliseconds ms Use special symbols in duodecimal numbers Använd särkilda symboler i duodecimala tal Use dot as multiplication sign Använd punkt som multiplikationstecken Use Unicode division slash in output Använd Unicode-snedstreck som divisionstecken Use E-notation instead of 10^n Använd E istället för 10^n Use 'j' as imaginary unit Använd 'j' som imaginär enhet Use comma as decimal separator Använd komma som decimaltecken Ignore comma in numbers Bortse från komma i nummer Ignore dots in numbers Bortse från punkter i nummer Copy unformatted ASCII by default Kopiera oformaterad ASCII som förval Round halfway numbers away from zero Avrunda mittemellan-tal bort från noll Round halfway numbers to even Avrunda mittemellan-tal till jämn siffra Indicate repeating decimals Indikera upprepande decimaler Expression in history: Uttryck i historiken: Parsed Tolkat uttryck Entered Inknappat uttryck Entered + parsed Inknappat + tolkat uttryck Simplified percentage calculation Förenklad procentberäkning Copy result as unformatted ASCII by default Kopiera resultat som oformatterad ASCII som förval Digit grouping: Siffergruppering: None Ingen Standard Standard Local Lokal Automatically group digits in input Gruppera siffor automatiskt i indata Interval display: Intervallvisning: Significant digits Signifikanta siffror Interval Intervall Plus/minus Plus/minus Midpoint Medelpunkt Lower Undre Upper Övre Rounding: Avrundning: Round halfway upwards Avrunda mittemellan-uppåt Round halfway away from zero Avrunda mittemellan bort från noll Round halfway to even Avrunda mittemellan till jämn Truncate Trunkera Truncate all numbers Avrunda all tal mot noll Complex number form: Form för komplexa tal: Rectangular Rektangulär Exponential Exponentiell Polar Polär Angle/phasor Vinkel Abbreviate names Förkorta namn Use binary prefixes for information units Använd binära prefix för informationsenheter Automatic unit conversion: Automatisk enhetsomvandling: No conversion Ingen omvandling Base units Grundenheter Optimal units Optimala enheter Optimal SI units Optimala SI-enheter Convert to mixed units Omvandla till blandade enheter Automatic unit prefixes: Automatiska enhetsprefix: Default Förval Max history lines saved: Högst antal historikrader sparade: Close application with Escape key Stäng programmet med Escape Place expression field below history Placera uttrycksfältet under historiken Calculate as you type delay: Fördröjning för fortgående beräkningar: Automatically calculate selection Beräkna markering automatiskt No prefixes Inga prefix Prefixes for some units Prefix för vissa enheter Prefixes also for currencies Prefix även för valutor Prefixes for all units Prefix för alla enheter Enable all SI-prefixes Använd alla SI-prefix Enable denominator prefixes Aktivera prefix i nämnaren Enable units in physical constants Aktivera enheter i fysiska konstanter Temperature calculation: Temperaturberäkning: Absolute Absolut Relative Relativ Hybrid Hybrid Exchange rates updates: Växelkursuppdateringer: %n day(s) %n dag %n dagar days dag dagar QApplication Execute expressions and commands from a file Beräkna uttryck och utför kommandon från en fil FILE FIL Start a new instance of the application Starta en ny instans av programmet Specify the window title Ange fönstertitel TITLE TITEL Update exchange rates Uppdatera växelkurser Display the application version Visa programversion Open workspace Öppna arbetsyta Expression to calculate Uttryck att beräkna [EXPRESSION] [UTTRYCK] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? Enligt förinställningar tillåts enbart en instans av %1. Om flera instanser är öppna samtidigt, kommer enbart definitioner (variabler, funktioner, etc.) , läge, inställningar och historik för det sist stängda fönstret att sparas. Vill du trots det ändra förinställt beteende och tillåta flera samtidiga instanser? Allow multiple instances? Tillåt flera instanser? %1 is already running. %1 körs redan. Failed to load global definitions! Fel vid inhämtande av systemvida definitioner! answer svar History Answer Value Svarsvärde från historiken History Index(es) Index i historiken History index %s does not exist. Index %s finns inte i historiken. Last Answer Senaste svaret Answer 2 Svar 2 Answer 3 Svar 3 Answer 4 Svar 4 Answer 5 Svar 5 Memory Minne Error Fel Couldn't write preferences to %1 Kunde inte spara inställningar till %1 Function not found. Funktionen hittades ej. Variable not found. Variabeln hittades ej. Unit not found. Enheten hittades ej. Unsupported base. Basen stöds ej. Unsupported value. Värdet stöds ej. QalculateQtSettings Update exchange rates? Uppdatera växelkurser? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? Det var %n dag sedan växelkurserna senast uppdaterades. Vill du uppdatera växelkurserna nu? Det var %n dagar sedan växelkurserna senast uppdaterades. Vill du uppdatera växelkurserna nu? Fetching exchange rates. Hämtar växelkurser. Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). msgstr "" Håller värdet av den senaste beräkningen. Multipla resultat av en ekvation representeras av en vektor. För åtkomst till separata lösningar använd ans(n) (t.ex. ans(1) för den först lösningen). Fetching exchange rates… Hämtar växelkurser… Error Fel Warning Varning Information Information Path of executable not found. Sökvägen till programmet hittades ej. curl not found. curl hittades ej. Failed to run update script. %1 Misslyckades med att köra sriptet. %1 Download Ladda ner %1: %2 %1: %2 Insert function Infoga funktion Insert function (dialog) Infoga funktion (dialog) Insert variable Infoga variabel Approximate result Approximera resultat Negate Negera Invert Invertera Insert unit Infoga enhet Insert text Infoga text Insert operator Infoga operator Insert date Infoga datum Insert matrix Infoga matris Insert smart parentheses Infoga smarta parenteser Convert to unit Omvandla till enhet Convert Omvandla Convert to optimal unit Omvandla till optimal enhet Convert to base units Omvandla till basenheter Convert to optimal prefix Omvandla till optimalt prefix Convert to number base Omvandla till talbas Factorize result Faktorisera resultatet Expand result Expandera resultatet Expand partial fractions Expandera partialbråk RPN: down RPN: ner RPN: up RPN: upp RPN: swap RPN: byt plats RPN: copy RPN: kopiera RPN: lastx RPN: lastx RPN: delete register RPN: ta bort register RPN: clear stack RPN: töm stacken Set expression base Ange talbas i uttryck Set result base Ange talbas i resultat Set angle unit to degrees Ange vinkelenhet till grader Set angle unit to radians Ange vinkelenhet till radianer Set angle unit to gradians Ange vinkelenhet till gradienter Active normal display mode Aktivera normalt visningsläge Activate normal display mode Aktivera normalt visningsläge Activate scientific display mode Aktivera vetenskapligt visningsläge Activate engineering display mode Aktivera tekniskt visningsläge Activate simple display mode Aktivera enkelt visningsläge Toggle precision Växla precision Toggle max decimals (Av)aktivera max decmaler Toggle min decimals (Av)aktivera min decmaler Toggle max/min decimals (Av)aktivera min/max decmaler Toggle RPN mode (Av)aktivera RPN-läge Show general keypad Visa/dölj generell knappsats Toggle programming keypad Visa/dölj programmeringsknappsatsen Toggle algebra keypad Visa/dölj alegbraknappsatsen Toggle custom keypad Visa/dölj anpassad knappsats Show/hide keypad Visa/göm knappsatsen Search history Sök i historiken Clear history Töm historiken Show variables Visa variabler Show functions Visa funktioner Show units Visa enheter Show data sets Visa dataset Store result Spara resultatet MC (memory clear) MC (töm minne) MR (memory recall) MR (återkalla minne) MS (memory store) MS (spara i minne) M+ (memory plus) M+ (minnesoperation) M− (memory minus) M− (minnesoperation) New variable Ny variabel New function Ny funktion Open plot functions/data Öppna rita funktions-/datadiagram Open convert number bases Öppna omvandla mellan talbaser Open floating point conversion Öppna flyttalsomvandling Open calender conversion Öppna kalenderomvandling Open percentage calculation tool Öppna procentberäkningsverktyg Open periodic table Öppna periodiska systemet Update exchange rates Uppdatera växelkurser Copy result Kopiera resultatet Insert result Infoga resultat Open mode menu Öppna lägesmenyn Open menu Öppna menyn Help Hjälp Quit Avsluta Toggle chain mode (Av)aktivera kedjeläge Toggle keep above (Av)aktivera placera överst Show completion (activate first item) Visa komplettering (aktivera första posten) Clear expression Töm uttrycket Delete Ta bort Backspace Backsteg Home Till början End Till slutet Right Höger Left Vänster Up Upp Down Ner Undo Ångra Redo Gör om Calculate expression Beräkna uttrycket Expression history next Nästa uttryck i historiken Expression history previous Föregående uttryck i historiken Open functions menu Öppna functionsmenyn Open units menu Öppna enhetsmenyn Open variables menu Öppna variabelmenyn Toggle fraction format in current result Växla bråktal i nuvarande resultat Default Förval Formatted result Formaterat resultat Unformatted ASCII result Oformaterat ASCII-resultat Unformatted ASCII result without units Oformaterat ASCII-resultat utan enheter Formatted expression Formaterat uttryck Unformatted ASCII expression Oformaterat ASCII-uttryck Formatted expression + result Formaterat uttryck + resultat Unformatted ASCII expression + result Oformaterat ASCII-uttryck + resultat Unformatted ASCII expression + result without units Oformaterat ASCII-uttryck + resultat utan enheter Failed to run update script. %s Misslyckades med att köra sriptet. %s Failed to check for updates. Misslyckades med att söka efter uppdateringar. No updates found. Inga uppdatering hittades. A new version of %1 is available at %2. Do you wish to update to version %3? En ny version av %1 finns tillgänglig på %2. Vill du uppdatera till version %3? A new version of %1 is available. You can get version %3 at %2. En ny version av %1 finns tillgänglig. Du kan hämta version %3 på %2. QalculateTranslator OK Only used when Qt translation is missing OK Cancel Only used when Qt translation is missing Avbryt Close Only used when Qt translation is missing Stäng &Yes Only used when Qt translation is missing &Ja &No Only used when Qt translation is missing &Nej &Open Only used when Qt translation is missing &Öppna &Save Only used when Qt translation is missing &Spara &Select All Only used when Qt translation is missing &Markera allt Look in: Only used when Qt translation is missing Sök i: File &name: Only used when Qt translation is missing Fil&namn: Files of type: Only used when Qt translation is missing Filer av typen: QalculateWindow Menu Meny New Ny Function… Funktion… Variable/Constant… Variabel/konstant… Unknown Variable… Okänd variabel… Matrix… Matris… Import CSV File… Importera CSV-fil… Export CSV File… Exportera CSV-fil… Variables and Constants List Variabler och konstanter Plot Functions/Data Rita funktions-/datadiagram Floating Point Conversion (IEEE 754) Flyttalsomvandling (IEEE 754) Calendar Conversion Kalenderomvandling Update Exchange Rates Uppdatera växelkurser Normal Mode Normalt läge RPN Mode RPN-läge Chain Mode Kedjeläge Preferences Inställningar Report a Bug Rapportera ett problem Check for Updates Sök efter uppdateringar About %1 Om %1 Quit Avsluta Mode Läge General display mode Generellt visningsläge Normal Normalt Scientific Vetenskapligt Engineering Tekniskt Simple Enkelt Angle unit Vinkelenhet Radians Radianer Degrees Grader Gradians Gradienter Approximation Approximering Automatic Automatic approximation Automatisk Dual Dual approximation Dubbel Exact Exact approximation Exakt Approximate Approximerad Assumptions Antaganden Type Assumptions type Typ Number Nummer Real Reell Rational Rationell Integer Heltal Boolean Boolesk Sign Assumptions sign Tecken Unknown Unknown assumptions sign Okänd Non-zero Ej noll Positive Positiv Non-negative Ej negativ Negative Negativ Non-positive Ej positiv Binary Binär Octal Oktal Decimal Decimal Hexadecimal Hexadecimal Other Annan Approximation and Fractions Approximering och bråk Duodecimal Duodecimal Sexagesimal Sexagesimal Time format Tidsformat Roman numerals Romerska siffror Unicode Unicode Bijective base-26 Bijektiv talbas 26 Binary-coded decimal (BCD) Binärkodat decimalt tal (BCD) Custom: Number base Anpassad: Precision: Precision: Min decimals: Min decimaler: Max decimals: Max decimaler: off Max decimals av Convert Omvandla Store Spara Functions Funktioner Menu (%1) Meny (%1) Variables and Constants Variabler och konstanter Units Enheter Help Hjälp Mode (%1) Läge (%1) General Display Mode Generellt visningsläge Angle Unit Vinkelenhet Result Base Talbas i resultat Other: Number base Annan: Expression Base Talbas i uttryck Convert (%1) Omvandla (%1) Store (%1) Spara (%1) Functions (%1) Funktioner (%1) Keypad Knappsats Keypad (%1) Knappsats (%1) Number bases Talbaser Unit… Enhet… Data Sets Dataset Percentage Calculation Tool Procentberäkningsverktyg Periodic Table Periodiska systemet Units (%1) Enheter (%1) Plot Functions/Data (%1) Rita funktions-/datadiagram (%1) Number Bases (%1) Talbaser (%1) Binary: Binär: Octal: Oktal: Decimal: Decimal: Hexadecimal: Hexadecimal: RPN Stack RPN-stack Rotate the stack or move the selected register up (%1) Rotera stacken eller flytta markerat register uppåt (%1) Rotate the stack or move the selected register down (%1) Rotera stacken eller flytta markerat register nedåt (%1) Swap the top two values or move the selected value to the top of the stack (%1) Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken (%1) Copy the selected or top value to the top of the stack (%1) Kopiera det valda eller det översta värdet till toppen av stacken (%1) Enter the top value from before the last numeric operation (%1) Lägg till det översta värdet från innan den senaste numeriska operationen (%1) Delete the top or selected value (%1) Ta bort det översta eller det markerade värdet (%1) Clear the RPN stack (%1) Töm RPN-stacken (%1) New Function… Ny funktion… Favorites Favoriter Recent Tidigare User functions Användarfunktioner Open dialog Öppna dialogruta Show all functions Visa alla funktioner User units Användarenheter more fler Prefixes Prefix Show all units Visa alla enheter User variables Användarvariabler Show all variables Visa alla variabler Powerful and easy to use calculator Kraftfull och användarvänlig miniräknare License: GNU General Public License version 2 or later Licens: GNU General Public License version 2 eller senare Error Fel Couldn't write definitions Kunde inte spara definitioner hexadecimal hexadecimal octal oktal decimal decimal duodecimal duodecimal binary binär roman romersk bijective bijektiv sexagesimal sexagesimal latitude latitud longitude longitud time tid scientific vetenskaplig engineering teknisk simple enkel Time zone parsing failed. Läsning av tidszon misslyckades. bases baser calendars kalendrar rectangular rektangulär cartesian kartesisk exponential exponentiell polar polär phasor fasvektor angle vinkel optimal optimal base bas mixed blandade fraction bråktal factors faktorer Open Settings Folder(s) Öppna inställningsmappen Öppna inställningsmappar Approximation && Fractions Approximering och bråk Number Pad Numerisk knappsats Always Show Number Pad Visa alltid numerisk knappsats Show Custom Column Visa anpassad kolumn Conversion operator Omvandlingsoperand partial fraction partialbråk factorize faktorisera expand expandera Calculating… Beräknar… Cancel Avbryt RPN Operation RPN operation Factorizing… Faktoriserar… Expanding partial fractions… Expanderar partialbråk… Expanding… Expanderar… Converting… Omvandlar… Temperature Calculation Mode Läge för temperaturberäkningar Please select desired variant of the sinc function. Vänligen välj önskad variant av sinc-funktionen. Unnormalized Onormaliserad Normalized Normaliserad Comma as separator for function arguments and matrix/vector elements Komma som avgränsare för funktionsparametrar och matrix-/vektorelement Parsing Mode Tolkningsläge The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj tolkning av uttryck med implicit multiplikation (detta kan senare ändras i inställningarna). Implicit multiplication first Implicit multiplikation först Conventional Konventionell Adaptive Adaptiv Add Action (%1) Lägg till åtgärd (%1) Edit Keyboard Shortcut Redigera kortkommando New Keyboard Shortcut Nytt kortkommando Action: Åtgärd: Value: Värde: Set key combination Ange tangentkombination Press the key combination you wish to use for the action. Tryck tangentkombinationen som du önskar använda för åtgärden. Reserved key combination Reserverad tangentkombination The key combination is already in use. Do you wish to replace the current action (%1)? Tangentkombinationen används redan. Vill du ersätta den nuvarande åtgärden (%1)? Question Fråga Add… Lägg till… Edit… Redigera… Remove Ta bort Example: Example of function usage Exempel: Failed to open workspace Misslyckades med att öppna arbetsyta Couldn't save workspace Misslyckades med att spara arbetsyta Save file? Spara fil? Do you want to save the current workspace? Vill du spara den öppna arbetsytan? Do not ask again Fråga inte igen %1: %1: optional optional argument frivillig Failed to open %1. %2 Misslyckades med att öppna %1. %2 RPN Register Moved RPN-register flyttades Show toolbar Visa vertkygsfält Workspaces Arbetsytor Open… Öppna… Open default Öppna förvald Save Spara Save As… Spara som… Keyboard Shortcuts Kortkommandon Plot Diagram General Allmän Programming Programmering Algebra Algebra Custom Anpassad None Ingen Hide Number Pad Dölj numerisk knappsats Separate Menu Buttons Separata menyknappar Reset Keypad Position Återställ knappsatsposition EXACT EXAKT APPROX APPROX RPN RPN BIN BIN OCT OKT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNK UNIT ENHET VAR VAR INF INF CPLX CPLX Icons only Enbart ikoner Text only Enbart text Text beside icons Text bredvid ikoner Text under icons Text under ikoner Copy Kopiera <i>Right-click/long press</i>: %1 <i>Högerklick/långtryck</i>: %1 Open menu Öppna menyn Number Bases Talbaser <i>Middle-click</i>: %1 <i>Mittenklick</i>: %1 Rotate the stack or move the selected register up Rotera stacken eller flytta markerat register uppåt Rotate the stack or move the selected register down Rotera stacken eller flytta markerat register nedåt Swap the top two values or move the selected value to the top of the stack Byt plats på de två översta värdena eller flytta markerat värdet till toppen av stacken Delete the top or selected value Ta bort det översta eller det markerade värdet Enter the top value from before the last numeric operation Lägg till det översta värdet från innan den senaste numeriska operationen Copy the selected or top value to the top of the stack Kopiera det valda eller det översta värdet till toppen av stacken Clear the RPN stack Töm RPN-stacken prefix prefix base base units bas base number base bas decimals decimaler Processing… Behandlar… Matrix Matris Unknown variables (e.g. x, y, z) are by default assumed real. Okända variabler (t.ex. x, y, z) antas som förval representera reella tal. The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). Uttrycket är tvetydigt. Vänligen välj ett läge för temperaturberäkningar (läget kan senare ändras i inställningarna). Absolute Absolut Relative Relativ Hybrid Hybrid Interpretation of dots Tolkning av punkter Interpretation of comma Tolkning av komma Please select interpretation of comma (",") (this can later be changed in preferences). Vänligen välj hur komma ska tolkas (detta kan senare ändras i inställningarna). Please select interpretation of dots (".") (this can later be changed in preferences). Vänligen välj hur punkter ska tolkas (detta kan senare ändras i inställningarna). Both dot and comma as decimal separators Både punkt och komma som decimaltecken Dot as thousands separator Punkt som tusentalsavgränsare Comma as thousands separator Komma som tusentalsavgränsare Only dot as decimal separator Enbart punkt som decimaltecken Comma as separator for function arguments and matrix/vector elements Komma som avgränsare för funktionsparametrar och matrix-/vektorelement Percentage Interpretation Procenttolkning Please select interpretation of percentage addition Vänligen välj tolkning av procentaddition Add percentage of original value Addera procent av ursprungligt värde Add percentage multiplied by 1/100 Addera procentenheter multiplicerade med 1/100 Action Åtgärd Key combination Tangentkombination Gnuplot was not found Gnuplot hittades ej %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) måste installeras separat, och hittas i sökvägen för binärer, för att för att diagram ska kunna visas. Example: Exempel: Enter RPN Enter Enter Calculate Beräkna Insert Infoga Apply to Stack Applicera på stacken Keep open Håll öppen Value Värde Argument Parameter True Sant False Falskt Info Info optional optional parameter frivillig UnitEditDialog General Allmänt Relation Relation Name: Namn: Category: Kategori: Descriptive name: Beskrivande namn: System: System: Imperial Imperial US Survey US Survey Hide unit Dölj enheten Description: Beskrivning: Class: Klass: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. Klassificering av enheten. Namngivna härledda enheter är definierade i relation till en annan enhet, med en valfri exponent, medan (icke namngivna) härledda enheter definieras av ett enhetsuttryck med en eller flera enheter. Base unit Grundenhet Named derived unit Namngiven härledd enhet Derived unit Härledd enhet Base unit(s): Grundenhet(er): Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to Enhet (för namngivna härledda enheter) eller enheter (för icke namngivna härledda enheter) som enheten är definierad i förhållande till Exponent: Exponent: Relation: Relation: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). Förhållande till baseenheten. Utgör för linjära förhållanden enbart ett nummer.<br><br>För icke-linjära förhållanden, används \x för faktorn och \y för exponenten (t.ex. "\x + 273,15" för relationen mellan grader Celsius och Kelvin). Inverse relation: Omvänd relation: Specify for non-linear relation, for conversion back to the base unit. Anges för icke-linjära förhållanden, för omvandling tillbaka till basenheten. Mix with base unit Blanda med basenhet Priority: Prioritet: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Exempel: prioritet för enheten hand är 2, medan prioritet för ft (fot) och in (tum) är 1, vilket resulterar i "17 in = 1 ft + 5 in", istället för "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: Minsta antal av basenhet: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Exempel: minsta antal av basenhet för yd (yard) är 12, vilket resulterar i "3 × 3 ft = 9 ft" (istället for "3 yd") och "4 × 3 ft = 4 yd". Use with prefixes by default Använd med prefix som förval Error Fel Base unit does not exist. Angiven grundenhet finns inte. Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? A variable or unit with the same name already exists. Do you want to overwrite it? En variabel eller enhet med samma namn finns redan. Vill du ersätta den? Edit Unit Redigera enhet New Unit Ny enhet UnitsDialog Units Enheter Category Kategori Unit Enhet New… Ny… Edit… Redigera… Deactivate Avaktivera Delete Ta bort Convert Omvandla Insert Infoga Favorite Favorit Show hidden units Visa dolda enheter Activate Aktivera All All units Alla Uncategorized Okategoriserade User units Användarenheter Favorites Favoriter Inactive Inaktiva UnknownEditDialog Name: Namn: Custom assumptions Anpassade antaganden Type: Typ: Sign: Tecken: Temporary Temporär Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Unknown Variable Modifiera okänd variabel New Unknown Variable Ny okänd variabel VariableEditDialog Name: Namn: Temporary Temporär Value: Värde: Required Nödvändigt Description Beskrivning current result nuvarande resultat Category: Kategori: Descriptive name: Beskrivande namn: Hide variable Dölj variabeln Description: Beskrivning: Question Fråga A unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? An unit or variable with the same name already exists. Do you want to overwrite it? En enhet eller variabel med samma namn finns redan. Vill du ersätta den? Edit Variable Redigera variabel New Variable Ny variabel VariablesDialog Variables Variabler Category Kategori Variable Variabel New Ny Variable/Constant… Variabel/konstant… Unknown Variable… Okänd variabel… Matrix… Matris… Edit… Redigera… Export… Exportera… Deactivate Avaktivera Delete Ta bort Insert Infoga Favorite Favorit a matrix en matris a vector en vektor positive positiv non-positive ej positiv negative negativ non-negative ej negativ non-zero ej noll integer heltal boolean boolesk rational rationell real reell complex komplex number nummer not matrix ej matris Favorites Favoriter non-matrix ej matris unknown okänd Default assumptions Förvalda antaganden Activate Aktivera All All variables Alla Uncategorized Okategoriserade User variables Användarvariabler Inactive Inaktiva qalculate-qt-5.11.0/translations/qalculate-qt_zh_CN.ts000066400000000000000000016530661520501070600227570ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator 计算器 Powerful and easy to use calculator 强大而易用的计算器 calculation;arithmetic;scientific;financial; 计算;算术;科学;金�; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate!是一款多功能的跨平�桌�计算器。它简�易用,但�具有通常��的数学软件包所需的强大功能和多样性,以�满足日常所需的实用工具(如货��算和百分比计算)。 Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. 功能包括大��定制函数库���计算与�算�物�常数�符�计算(包括积分和方程)�高精度计算�误差传递�区间�算�绘图和用户�好的界�。 Argument Rules �数规则 _Cancel �消(_C) Do not save modifications ��存修改 _OK 确定(_O) Accept the modification of argument rules 接��数规则的修改 Enable rules and type test �用规则和类型测试 Custom condition 自定义�件 For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,若�数必须是一个有相�数�行和列的矩阵:rows(\x) = columns(\x) Allow matrix �许矩阵 Forbid zero �用零 Handle vector 处��� Calculate function for each separate element in vector. 对��中�个�独元素计算函数。 Min 最� Include equals 包�等于 Max 最大 Keyboard Shortcuts 键盘快�键 _Close 关闭(_C) Label 标签 Left-click 左键 Right-click �键 Middle-click 中键 Reset �置 Button Action 按钮动作 Value 值 Argument name �数� Calendar Conversion 日历�算 Export CSV File 导出CSV文件 Current result 当�结果 Matrix/vector variable 矩阵/���� File 文件 Delimiter 分隔符 Comma 逗� Tabulator 制表符 Semicolon 分� Space 空格 Other 其他 Import CSV File 导入CSV文件 Do not import the file �导入文件 Import the file 导入文件 Name of the data file to import �导入的数�文件的�称 Select a file 选择文件 Import as 导入为 Matrix 矩阵 If a matrix shall be generated from the contents of the file 若�从文件内容生�矩阵或�� Vectors �� If vectors shall be generated from the contents of the file 若�从文件内容生�矩阵或�� Name �称 Name (or name prefix) used to reference generated variable(s) in expressions 用于引用表达�中生�的���(或�称�缀) Descriptive name �述性�称 Title displayed in menus and in variable manager ��和��管�器中显示的�称 Category 类别 First row 第一行 The first row with data to import in the file 文件中�导入数�的第一行 Includes headings 包括标题 If the first row contains column headings 若第一行包�列标题 Delimiter used to separate columns in the file 文件中用于分隔列的分隔符 Custom delimiter 自定义分隔符 Edit Data Property 编辑数�属性 Do not create/modify this data set �创建/修改此数�集 Accept the creation/modification of this data set 接�此数�集的创建/修改 Name used for reference 引用�称 Properties 属性 Title displayed in menus and in data set manager ��和数�集管�器中显示的标题 Description �述 Description of this data property 此数�属性的说明 Value Type 值类型 Text 文本 Number 数字 Expression 表达� Hide �� Use as key 用作键 Approximate value 近似值 Case sensitive value 区分大�写的值 Value uses brackets 值使用括� Unit expression ��表达� Edit Data Set 编辑数�集 Title 标题 Data file 数�文件 Description of this data set 此数�集的说明 Copyright 版� General 通用 Properties: 属性: Definition of the properties of this data set 此数�集的属性定义 _New 新建(_N) _Edit 编辑(_E) _Delete 删除(_D) Name used to invoke the function in expressions 用于在表达�中调用的函数� Object argument name 对象�数�称 Property argument name 属性�数�称 Default property 默认属性 Function 函数 Edit Data Object 编辑数�对象 Do not create/modify this data object �创建/修改此数�对象 Accept the creation/modification of this data object 接�此数�对象的创建/修改 Data Sets new dataset 数�集 Data Set 数�集 Create a new data set 创建新数�集 Edit the selected data set 编辑所选数�集 Delete the selected data set 删除所选数�集 Objects 对象 Create a new data object 创建新的数�对象 Edit the selected data object 编辑所选数�对象 Remove the selected data object 删除所选数�对象 Data Set Description 数�集�述 Object Attributes 对象属性 Decimals �数 Close this window 关闭此窗� Min decimals 最��数 Max decimals 最大�数 Minimal number of displayed decimals 显示�数的最�数目 Maximal number of decimals to display (and round to) 所显示的最大�数(并�入) Floating Point Conversion 浮点�算 Decimal value �进制值 Binary value 二进制值 Octal value 八进制值 Hexadecimal representation �六进制表示 Conversion error �算误差 Binary representation 二进制表示 Floating point value 浮点值 Format 格� 16-bit (half precision) 16�(�精度) 32-bit (single precision) 32�(�精度) 64-bit (double precision) 64�(�精度) 80-bit (x86 extended format) 80� (x86扩展格�) 128-bit (quadruple precision) 128�(四�精度) Hexadecimal value �六进制值 Edit Function 编辑函数 _Help 帮助(_H) Do not create/modify this function �创建/修改此函数 Accept the creation/modification of this function 接�此函数的创建/修改 Name used to invoke this function in expressions 用于在表达�中调用的函数� Title displayed in menus and in function manager ��和函数管�器中显示的标题 Hide function ��函数 If this function shall be hidden in menus 若�在��中��此函数 Description of this function 此函数的说明 Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. 第一个�数使用\x,第二个�数使用\y,第三个�数使用\z。 更多信�请点击帮助按钮。。 Condition �件 Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") 函数必须为真的�件。例如,若第二个�数必须大于第一个�数: “\y > \x� Sub-Functions �函数 Arguments: �数: Definition of this function's arguments 此函数的�数定义 Free 任� Integer 整数 Symbol 符� Date 日期 Vector �� Positive number 正数 Non-zero number �零数 Non-negative number �负数 Positive integer 正整数 Non-zero integer �零整数 Non-negative integer �负整数 Boolean 布尔值 Object 对象 Unit �� Variable �� Angle 角度 Data object 数�对象 Data property 数�属性 _Add 添加(_A) Add entered argument definition 添加输入�数的定义 _Apply 应用(_A) Modify selected argument 修改所选�数 Remove selected argument 删除所选�数 Rules 规则 Edit conditions for selected argument 编辑所选�数的�件 Close this dialog 关闭此对�框 Precalculate 预计算 Calculate the subfunction only once, before the parent function 在父函数之��计算一次�函数 Add entered subfunction 增加输入的�函数 Apply changes to the selected subfunction 将更改应用于所选�函数 Remove the selected subfunction 删除选定的�函数 Functions 函数 Create a new function 创建新函数 Edit the selected function 编辑所选函数 _Insert �入(_I) Insert (or execute) the selected function into the expression entry 在表达�框中�入(或执行)所选函数 Delete the selected function 删除所选函数 (De)activate the selected function (�消)激活所选函数 Deacti_vate �用(_v) Apply the selected function to the current expression 将所选函数应用于当�表达� Categor_y 类别(_y) _Function 函数(_F) Descri_ption �述(_P) Degrees 度 Radians 弧度 Gradians 梯度 Default assumptions 默认�设 Unknown 未知数 Not Matrix �矩阵 Complex �数 Real 实数 Rational 有�数 Non-Zero �零数 Positive 正数 Non-Negative �负数 Negative 负数 Non-Positive �正数 _File 文件(_F) Unknown Variable 未知�� Function (simplified) 函数(简化) Import CSV File… 导入CSV文件… Export CSV File… 导出CSV文件… _Store Result… 存储结果(_S)… Save Result Image… �存结果图�… Save local functions, variables and units �存局部函数,��和�� Save Definitions �存定义 Import Definitions File… 导入定义文件… Fetch current exchange rates from the Internet 从网络上获�当�汇率 Update Exchange Rates 更新汇率 Plot Functions/Data 函数/数�绘图 Convert Number Bases 数字进制�算 Floating Point Conversion (IEEE 754) 浮点�算(IEEE 754) Percentage Calculation Tool 百分比计算 Periodic Table 元素周期表 Minimal Window 最�窗� _Quit 退出(_Q) Manage Variables 管��� Manage Functions 管�函数 Manage Units 管��� Manage Data Sets 管�数�集 Factorize 分解 Expand 展开 Apply partial fraction decomposition to the current result. 部分分�分解当�结果。 Expand Partial Fractions 展开部分分� Set Unknowns… 设置未知数… Convert to Unit �算�� Set Prefix 设置�缀 Convert to Unit Expression… �算为��表达�… Convert to Base Units �算为基本�� Convert to Optimal Unit �算为最优�� Insert Date… �入日期… Insert Matrix… �入矩阵… Insert Vector… �入��… _Copy Result �制结果(_C) Customize Keypad Buttons 自定义键盘按钮 _Preferences 首选项(_P) _Mode 模�(_M) Number Base 数字进制 Select Result and Expression Base… 选择结果和表达�进制… Binary 二进制 Octal 八进制 Decimal �进制 Duodecimal �二进制 Hexadecimal �六进制 Other… 其他… Sexagesimal 六�进制 Time Format 时间格� Roman Numerals 罗马数字 Numerical Display 数值显示 Normal 常规 Engineering 工程 Scientific 科学 Purely Scientific 纯科学 Simple 简� Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... 关: 1/7 ≈ 0.14285714 开: 1/7 = 0.142857 142857... Indicate Repeating Decimals 指示循环�数 Show Ending Zeroes 显示结尾的零 Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 关: 2.5 ≈ 3, 1.5 ≈ 2 开: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even 中数约至�数 Off: -x + y On: y - x 关: -x + y 开: y - x Sort Minus Last ��排至末尾 Complex Rectangular Form �矩形形� Complex Exponential Form �指数形� Complex Polar Form ���标形� Complex Angle/Phasor Notation �角/相�记� Rational Number Form 有�数形� 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions �数 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions 精确�数 6/4 = 3/2 6/4 = 3/2 Simple Fractions 简�分数 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions 混�分数 Interval Display 区间显示 Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi 关: 1/2*pi ≈ 1.5707963 开: 1/2*pi = 0.5 pi Adaptive 自适应 Calculates an interval of possible values and keeps track of precision changes. 计算�能值的区间,并跟踪精度�化。 Significant Digits 有效数字 Interval 区间 Plus/Minus 加/� Midpoint 中点 Unit Display ��显示 Do not use any prefixes in result 结果�使用任何�缀 Show prefixes for primarily SI and CGS units. 显示主�的SI和CGS���缀。 Use prefixes for selected units 为所选��使用�缀 Use prefixes also for currencies 对货�也使用�缀 Use prefixs for all units 对所有��使用�缀 Enables automatic use of hekto, deka, deci and centi when prefixes is enabled �用�缀时,自动使用百���分和厘 Enable All SI Prefixes �用所有SI�缀 Enables automatic setting of prefix for denominator in addition to the numerator 除分�外,还�自动设置分�的�缀 Enable Denominator Prefixes �用分��缀 Off: J / K On: J * K^-1 关: J / K 开: J * K^-1 Negative Exponents 负指数 Off: (2 m)/s On: 2 (m/s) 关: (2 m)/s 开: 2 (m/s) Place Units Separately �独放置�� No Additional Conversion 无�外�算 Convert to Optimal SI Unit �算为最优SI�� If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min 若�用: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Convert to Mixed Units �算为混��� Abbreviate Names 缩写�称 Enabled Objects �用对象 Variables �� Units �� Unknowns 未知数 Units in Physical Constants 物�常数�� If not enabled, treats all variables as unknown 若未�用,则将所有��视为未知 Calculate Variables 计算�� Disables/enables complex numbers in result �用/�用结果中的�数 Allow Complex Result �许�数结果 Disables/enables infinite numbers in result �用/�用结果中的无穷数 Allow Infinite Result �许无�结果 Approximation 近似估算 Always Exact 总是精确 Try Exact �试精确 Approximate 近似值 Interval Arithmetic 区间�算 Interval Calculation 区间计算 Variance Formula 方差公� Change angle unit used in trigonometric functions 改�三角函数中的角度�� Angle Unit 角度�� None 无 Assumptions ���设 Algebraic Mode 代数模� Assume that unknown denominators are non-zero �设未知分��零 Non-Zero Denominators �零分� Warn when unknown denominators are assumed non-zero �设未知分�为�零时�出警告 Warn About Denominators Assumed Non-Zero 警告分��定�零 Parsing Mode 解�模� Adaptive Parsing 自适应解� Parse Implicit Multiplication First ��乘法优先解� Conventional Parsing 常规解� Chain Syntax 链�语法 RPN Syntax 逆波兰�语法 Off: xy = x*y On: xy != x*y 关: xy = x*y 开: xy != x*y Limit Implicit Multiplication �制��乘法 Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 将�进制数解�为近似数,其精度等于�数。 关: 1.1 * 1.1 = 1.21 开: 1.1 * 1.1 ≈ 1.2 Read Precision 读�精度 _Precision 精度(_P) _Decimals �数(_D) Calculate As You Type 输入时计算 Chain Mode 链�模� Activate the RPN stack. 激活RPN栈。 RPN Mode 逆波兰模� Meta Modes 元模� Save Mode… �存模�… Delete Mode… 删除模�… Save Default _Mode �存默认模�(_M) Fu_nctions 函数(_n) _Variables ��(_V) _Units ��(_U) _Contents 内容(_C) Report a Bug 报告错误 Check for Updates 检查更新 _About 关于(_A) Toggle minimal window 切�最�窗� Calculation result 计算结果 _Keypad 键盘(_K) Toggles persistent keypad (makes it possible to show keypad and history simultaneously) 切�常驻键盘(��时显示键盘和历�) _History 历�(_H) C_onversion �算(_o) RPN Stack RPN栈 Insert the selected value �入所选值 Insert the selected text �入所选文本 Copy the selected text �制所选文本 Add the selected value(s) 加上所选值 Subtract the selected value(s) �去所选值 Multiply the selected value(s) 乘以所选值 Divide the the selected value(s) 除以所选值 Raise to the power of the selected value 幂乘所选值 Calculate the square root of the selected value 计算所选值的平方根 History 历� Subtract the top value from the second value 从第二值�去顶部值 Multiply the top two values 将顶部两个值相乘 Divide the second value by the top value 将第二个值除以顶部值 Raise the second value to the power of the top value 将第二个值幂乘顶部值 Negate the top value (Ctrl+-) ��顶部值(Ctrl+-) Invert the top value �倒顶部值 Calculate the square root of the top value 计算顶部值的平方根 Calculate the sum of all values 计算所有值的和 Rotate the stack or move selected register up 循环栈或上移选定寄存器 Rotate the stack or move selected register down 循环栈或下移选定寄存器 Swap the two top values or move the selected value to the top of the stack 交�顶部两个值或将所选值移到栈顶 Copy the selected or top value to the top of the stack 将选定的或顶部值�制到栈顶 Enter the top value from before the last numeric operation 输入上次数值�作�的顶部值 Delete the top or selected value 删除顶部值或所选值 Edit the selected value 编辑所选值 Clear the RPN stack 清空RPN栈 Unit(s) and prefix to convert result to �算结果的��和�缀 Convert �算 Continuous conversion 连续�算 Automatically convert result to the current unit expression as long as the conversion box is visible. ���算框��,就自动将结果�算为当���表达�。 Add prefix 添加�缀 If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". 若��表达��包�任何�缀,则使用最优�缀。 这�以通过在��表达��加上 ? 或 0 �覆盖。 Conversion �算 Show/hide programming keypad 显示/��编程键盘 Exact 精确 Fraction 分数 Numerical display 数值显示 Pure 纯净 Number base 数字进制 Time format 时间格� Roman 罗马 sin sin cos cos tan tan ln ln Equals 等于 sqrt sqrt sum sum Unknown variable 未知�� mod mod mean mean Store result as a variable 将结果储存为�� STO Standard calculator button. Do not use more than three characters. STO Convert number bases �算数字进制 Imaginary unit i (√-1) 虚数�� i (√-1) Manage units 管��� Conversion operator �算�算符 Kilogram �克 Two's complement input 二的补�输入 Two's complement output 二的补�输出 Bitwise Exclusive OR 按�异或 Bitwise Left Shift 按�左移 Bitwise Right Shift 按��移 Floating point conversion 浮点�算 Show/hide left keypad 显示/��左侧键盘 Show/hide right keypad 显示/���侧键盘 DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result �一结果 ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression 添加到表达� Persistent Keypad 常驻键盘 Edit 编辑 Delete 删除 Update 更新 Insert Value �入值 Insert Text �入文本 Insert Parsed Text �入已解�文本 Copy �制 Copy Full Text �制全文 Search… �索… Add Bookmark… 添加书签… Bookmarks 书签 Protect �护 Move To Top 移动到顶部 Remove 移除 Clear All 全部清除 _Copy �制(_C) _Store… 存储(_S)… Save Image… �存图�… _Factorize 因�分解(_F) _Expand 展开(_E) _Normal 常规(_N) Sc_ientific 科学(_i) Purel_y Scientific 纯科学(_y) Simp_le 简�(_l) _Binary 二进制(_B) _Octal 八进制(_O) _Decimal �进制(_D) _Hexadecimal �六进制(_H) Decimal Fraction �进分数 Exact Decimal Fraction 精确�进分数 Simple Fraction 简�分数 Mixed Fraction 混�分数 _Abbreviate Names 缩写�称(_A) C_onvert… �算…(_o) Convert to Base _Units �算为基本��(_U) Convert _to Optimal Unit �算为最优��(_t) Use Optimal Prefix 使用最优�缀 Convert to �算为 Convert to UTC �算为UTC Convert to Calendars �算为日历 Use prefixes for all units 对所有��使用�缀 Enable All SI Prefi_xes �用所有SI�缀(_x) View/Edit Matrix 查看/编辑矩阵 View/Edit Vector 查看/编辑矢� Copy Text �制文本 To Top 到顶部 Swap 交� Up �上 Down �下 Negate �� Invert �倒 Square 平方 Square Root 平方根 Clear Stack 清空栈 Select Number Base… 选择数字进制… Store result 存储结果 Add result Add current result to variable value 加上结果 Subtract result Subtruct current result from variable value �去结果 Insert the matrix/vector into the expression 将矩阵/���入表达� Rows 行 Number of rows in this matrix (rows displayed for vectors) 此矩阵的行数(��显示的行) Columns 列 Number of columns in this matrix (columns displayed for vectors) 此矩阵的列数(��显示的列) If this is a matrix or vector 若这是矩阵或�� Elements 元素 Current element: 当�元素: Edit Matrix 编辑矩阵 Do not create/modify this matrix/vector �创建/修改此矩阵/�� Create/modify the matrix/vector 创建/修改矩阵/�� Accept the creation/modification of this matrix/vector 接�此矩阵/��的创建/修改 Name used to reference this variable in expressions 用于在表达�中引用的��� Names �称 Add new name 添加新�称 Apply changes to the selected name 将更改应用于所选�称 Remove the selected name 删除所选�称 Abbreviation 缩写 Unicode Unicode Plural �数 Suffix �缀 Reference �考 Avoid input ��输入 Case sensitive 区分大�写 Completion only 仅补全 Number Bases 数字进制 Roman numerals 罗马数字 BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract � Multiply 乘 Divide 除 Bitwise AND 按�与 Bitwise OR 按�或 Bitwise NOT 按�� Clear 清除 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 输入两个值,其中最多一个是百分比,其他值会帮你计算。 Percentage 百分比 Calculate 计算 Value 1 甲值 2 compared to 1 乙相比于甲 Change from 1 to 2 甲转�为乙 Value 2 乙值 1 compared to 2 甲相比于乙 Change from 2 to 1 乙转�为甲 Plot 作图 _Save �存(_S) Save as png, svg, postscript, eps, latex or fig �存为png,svg,postscript,eps,latex或fig Vector/matrix ��/矩阵 Paired matrix �对矩阵 if you want to split matrix in rows instead of columns 若�按行而�是按列拆分矩阵 X variable X�� The variable name used in expression 表达�中使用的��� Style 风格 Line 线 Points 点 Line with points 点+线 Boxes/bars 框/� Histogram 直方图 Steps 步骤 Candlesticks K线图 Dots 点 Smoothing 平滑 Monotonic �调 Natural cubic splines 自然三次样� Bezier �塞尔 Bezier (monotonic) �塞尔(�调) Y-axis Y轴 Primary 主�标轴 Secondary 次�标轴 _Remove 移除(_R) Data 数� Minimum x value 最�x值 Maximum x value 最大x值 Sampling rate 采样率 Step size 步长 Function Range 函数范围 Display grid 显示网格 Display full border 显示完整边框 Minimum y value 最�y值 Maximum y value 最大y值 Logarithmic x scale 对数x刻度 Logarithmic y scale 对数y刻度 X-axis label X轴标签 Y-axis label Y轴标签 Line width 线宽 Color display 彩色显示 Color 颜色 Monochrome �色 Legend placement 图例�置 Top-left 左上 Top-right �上 Bottom-left 左下 Bottom-right �下 Below 下� Outside 外� Appearance 外观 Precision 精确度 _Recalculate �新计算(_R) Recalculate expression �新计算表达� The number of significant digits to display/calculate (simple arithmetics are always calculated exact) �显示/计算的有效�数(简��算总是精确计算) Preferences 首选项 Save mode on exit 退出时�存模� If the mode of the calculator shall be restored 若���计算器模� Save definitions on exit 退出时�存定义 If changes to functions, units and variables shall be saved automatically 若�函数���和��在�生�化时自动�存 Clear history on exit 退出时清除历�记录 Allow multiple instances �许多个实例 Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. �许�时打开 Qalculate! 主窗�的多个实例。 请注�,�有最�关闭的实例模��历�和定义会被�存。 Notify when a new version is available 当有新版本时通知我 Use keyboard keys for RPN 用键盘键�作RPN Use keyboard operator keys for RPN operations (+-*/^). 使用键盘�作键进行RPN�作(+-*/^)。 Use caret for bitwise XOR �入符�(^)作为按�异或 Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. 使用键盘上的�入符(^)输入XOR (⊻)(�则使用Ctrl+^)。指数�算符(^)总是�以用Ctrl+*输入。 Add calculate-as-you-type result to history �历�记录中添加“输入时计算�的结果。 Delay: 延时: Time limit for plot: 作图时间�制: Behavior 行为 Enable Unicode symbols �用Unicode符� Disable this if you have problems with some fancy characters 若您觉得�些花哨的字符有问题,请�用此功能 Ignore system language (requires restart) 忽略系统语言(需���) Use system tray icon 使用系统托盘图标 Hides the application in the system tray when the main window is closed 当主窗�关闭时,将应用程���在系统托盘中 Hide on startup �动时�� Remember window position 记�窗��置 Application name 应用程��称 Result 结果 Application name + result 应用程��称+结果 Mode 模� Application name + mode 应用程��称+模� Window title 窗�标题 Default 默认值 Number of expression lines 表达�行数 3 3 Display expression status 显示表达�状� If as-you-type expression status shall be displayed below the expression entry 若�在表达�框下方显示表达�键入状� Persistent keypad 常驻键盘 Look & Feel 外观 Binary two's complement representation 二进制二的补�表示 If two's complement representation shall be used for negative binary numbers. 若�对负二进制数应用二的补�表示法。 Hexadecimal two's complement representation �六进制二进制补�表示 If two's complement representation shall be used for negative hexadecimal numbers. 若�对负�六进制数应用二的补�表示法。 Use lower case letters in non-decimal numbers ��进制数使用�写 If lower case letters should be used in numbers with non-decimal base 若�在��进制数字中使用�写字� Alternative base prefixes �选进制�缀 If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes 若��六进制数以“0x0�为�缀,二进制数以“0b00�为�缀 Spell out logical operators 拼出逻辑�算符 If logical and/or shall be displayed as "&&"/"||" or "and"/"or" 若�逻辑与/或应显示为 &&/|| 或 and/or If "e" shall be used instead of "E" in numbers 若�在数字中以e代替E Use E-notation instead of 10<sup><i>n</i></sup> 使用E符�代替10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) 使用�写e(如1e10) Use 'j' as imaginary unit 用 j 作虚数�� Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. 将j(而�i)作为虚部默认符�并放在虚部��。 Use comma as decimal separator 将逗�作为�数分隔符 Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign �许使用点“.�作为��分隔符而��数点符�。 Ignore comma in numbers 忽略数字中的逗� Allow commas, ',', to be used as thousands separator instead of as an function argument separator �许将逗�“,�作为��分隔符而�函数�数分隔符 Ignore dots in numbers 忽略数字中的点 Digit grouping 数字分节 off 关 standard 标准 local 本地 Multiplication sign 乘� Division sign 除� Copy digit separator �制数字分隔符 Deactivate to remove digit separator when copying result �制结果时�用以去除数字分隔符 Numbers & Operators 数字和�算符 Use binary prefixes for information units 信���使用二进制�缀 Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). 对于信���(例如字节),默认情况下使用二进制而��进制�缀。 Conversion to local currency �算为本地货� Automatically convert to the local currency when optimal unit conversion is activated. 激活最优���算时,自动�算为本地货�。 Update exchange rates on start �动时更新汇率 If current exchange rates shall be downloaded from the internet at program start 若�在程��动时从网上下载最新汇率 Exchange rates updates 汇率更新 Temperature calculation mode: 温度计算模�: Absolute �对 Relative 相对 Hybrid 混� Units & Currencies ��和货� Show expression completion suggestions 显示表达�补全建议 Search titles and countries �索标题和国家/地区 Minimum characters 最少字符 Popup delay (ms) 弹出延迟(ms) Completion 补全 Status warning color 警告状�颜色 Status error color 错误状�颜色 Custom status font 自定义状�字体 If you want to use a font other than the default in the status display below the expression entry 若�在表达�框下方的状�显示中使用默认字体以外的字体 Custom expression font 自定义表达�字体 If you want to use a font other than the default in the expression entry 若�在表达�框中使用默认字体以外的字体 Custom result font 自定义结果字体 If you want to use a font other than the default in the result display 若�在结果显示中使用默认字体以外的字体 Custom keypad font 自定义键盘字体 If you want to use a font other than the default in the keypad 若�在键盘中使用默认字体以外的字体 Custom application font 自定义应用程�字体 If you want to use a font other than the default for the whole application 若�整个应用程�使用默认字体以外的字体 Text color 文字颜色 Fonts & Colors 字体与颜色 Other: 其他: Bijective base-26 Bijective base-26 <b>Result Base</b> <b>结果进制</b> <b>Expression Base</b> <b>表达�进制</b> New Keyboard Shortcut 新建键盘快�键 Edit Variable 编辑�� Advanced 高级 Accept the creation/modification of this variable 接�此��的创建/修改 x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. 分别使用x,y和z作为第一个,第二个和第三个函数�数。 \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. 分别使用\x,\y和\z作为第一,二和三个函数�数。这能��和��,函数和��的潜在冲�。 Edit Unit 编辑�� Do not create/modify this unit �创建/修改此�� Accept the creation/modification of this unit 接�此��的创建/修改 Singular form of this unit's name 该���称的�数形� Title displayed in menus and in unit manager ��和��管�器中显示的标题 System 系统 Imperial 英制 US Survey 美制 Hide unit ���� If this unit shall be hidden in menus 若�该��在��中�� Class 类 The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此��所属的类。命�派生��是相对于一个�一的其他��而定义的,�以带有指数,而(未命�)派生��是由�一个或多个��的��表达�定义的。 Base unit 基本�� Named derived unit 命�派生�� Derived unit 派生�� Base unit(s) 基本�� Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to 该��(对于命�派生��)或��表达�(对于未命�派生��)的定义所关�(基于)的�� Exponent 指数 Exponent of the base unit 基本��的指数 Relation 关系 Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 与基本��的关系。 对于线性关系,这应该�是一个数字。 对于�线性关系,用\x表示因�,用\y表示指数(例如,“\x + 273.15�表示摄�度和开尔文之间的关系)。 Relation is exact 精确关系 If the relation is precise 若关系是精确的 Inverse relation 逆关系 Specify for non-linear relation, for conversion back to the base unit. 指定�线性关系,以便�算回基本��。 Mix with base unit 与基本��混� - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - 若存在多个选项,决定基本��与哪些��混�。 - 原���会与优先级较低的��混�。 - 数值越低表示优先级越高。 Priority 优先级 Minimum base unit number 最�基本��数 Use with prefixes by default 默认使用�缀 Create a new unit 创建新�� Edit the selected unit 编辑所选�� Insert the selected unit into the expression entry 将所选���入表达�框 C_onvert �算(_o) Convert the result to the selected unit 将结果�算到所选�� Delete the selected unit 删除所选�� (De)activate the selected unit (�消)激活所选�� _Unit ��(_U) Convert between units 在��间�算 = = Conver_sion �算(_s) Converted value �算�的值 Value to convert from �算�的值 Type anywhere 在任何地方输入 Edit Unknown Variable 编辑未知�� Do not create/modify this unknown variable �创建/修改此未知�� Accept the creation/modification of this unknown variable 接�此未知��的创建/修改 Name used to reference this unknown variable in expressions 用于在表达�中引用此未知��的�称 Use custom assumptions 使用自定义�设 Type 类型 Real Number 实数 Rational Number 有�数 Sign 符� The category this unknown variable belongs to 此未知��所属的类别 Value of this variable (expression) 此��的值(表达�) value is exact 精确值 If the value is precise 若该值是精确的 The category this variable belongs to 此��所属的类别 Create a new variable 创建新�� Edit the selected variable 编辑所选�� Insert the selected variable into the expression entry 将所选���入表达�项 Delete the selected variable 删除所选�� (De)activate the selected variable (�消)激活所选�� E_xport 导出(_x) _Variable ��(_V) Execute expressions and commands from a file 执行文件中的表达�和命令 Start a new instance of the application �动一个新的程�实例 Display the application version 显示应用程�版本 Specify the window title 指定窗�标题 TITLE TITLE Expression to calculate �计算的表达� [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上�键入一个数学表达�,例如“5+2/3�, 然�按Enter键。</span> ans ans Last Answer 上一答案 answer 答案 Answer 2 答案二 Answer 3 答案三 Answer 4 答案四 Answer 5 答案五 Memory 存值 Failed to load global definitions! 加载全局定义失败� c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" 全部 By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? 默认情况下,��许打开%s的一个实例(一个主窗�)。 若�时打开多个实例,�有最�一个关闭窗�的定义(���函数等)�模���好和历�记录会被�存。 尽管这样,你是�想改�默认的行为,�许�时打开多个实例? c-format Right-click/long press: %s �键/长按: %s c-format Right-click: %s �键: %s c-format Middle-click: %s 中键: %s c-format Cycle through previous expression 在��的表达�中循环 Move cursor left or right �左或��移动光标 Move cursor to beginning or end 将光标移动到开头或末尾 Uncertainty/interval �确定度/区间 Relative error 相对误差 Argument separator �数分隔符 Blank space 空白处 New line 新建行 Smart parentheses 智能括� Vector brackets ��括� Left parenthesis 左括� Left vector bracket 左��括� Right parenthesis �括� Right vector bracket ���括� Decimal point �数点 Raise (Ctrl+*) 幂(Ctrl+*) Add 加 M+ (memory plus) M+(存值加上) MC (memory clear) MC(存值清除) Backspace 退格键 M− (memory minus) M−(存值�去) Previous result (static) �一个结果(��) Calculate expression 计算表达� MR (memory recall) MR(存值读�) MS (memory store) MS(存值存入) Set unknowns 设置未知数 more Show further items in a submenu 更多 Logical AND 逻辑与 Logical OR 逻辑或 Logical NOT 逻辑� Toggle Result Base 切�结果进制 Open menu with stored variables 打开存储��的�� Index 索引 ENTER RPN Enter (calculate and add to stack) ENTER Calculate expression and add to stack 计算表达�并添加到栈 Flag 标志 Matrices 矩阵 Gregorian 格里高利历(公历/阳历) Revised Julian (Milanković) 修订儒略历(Milanković) Julian 儒略历 Islamic (Hijri) 伊斯兰历(回历/Hijri) Hebrew 希伯�历(犹太历) Chinese 中国历(农历/阴历) Persian (Solar Hijri) 波斯历(Solar Hijri) Coptic 科普特历(Coptic) Ethiopian 埃塞俄比亚历(Ethiopian) Indian (National) �度历(国立) Action 动作 Key combination 组�键 Raise 幂 History Answer Value 历�答案 History Index(es) 历�索引 History index %s does not exist. 历�索引 %s �存在。 c-format expression expression History Parsed Expression 已解�表达� Set Window Title 设置窗�标题 Failed to open %s. %s 无法打开 %s 。 %s c-format Could not display help for Qalculate!. 无法显示 Qalculate! 的帮助。 Could not display help for Qalculate!. %s 无法显示 Qalculate! 的帮助。 %s c-format approx. 约 Stop process �止进程 Clear expression 清除表达� EXACT EXACT APPROX APPROX RPN RPN CHN Chain mode CHN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? 您想现在更新汇率�? It has been %s day since the exchange rates last were updated. �上次更新汇率已过了%s天。 c-format It has been %s days since the exchange rates last were updated. Do not ask again ��询问 It took too long to generate the plot data. 生�绘图数�的时间太长。 It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. 生�绘图数�的时间太长。 请�低采样率或增加首选项中的时间�制。 When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. 当计算过程中产生错误�警告和其他信�时,表达�框�上角的图标会�生�化以�映。此时�以长按鼠标或点击图标�显示信�。 Path of executable not found. 未找到�执行文件的路径。 curl not found. 未找到 curl。 Failed to run update script. %s �行更新脚本失败。 %s c-format Failed to check for updates. 无法检查更新。 No updates found. 无更新。 A new version of %s is available at %s. Do you wish to update to version %s. %s 的新版本�在 %s 获得。 是��更新到版本 %s 。 c-format A new version of %s is available. You can get version %s at %s. %s 有�用的新版本 %s。 您�以在 %s 获�。 c-format Too many arguments for %s(). %s()的�数太多。 c-format argument �数 Temperature Calculation Mode 温度计算模� The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表达方�有歧义。 请选择温度计算模� (以��以在�好设置中更改)。 Uncategorized 未分类 hexadecimal �六进制 octal 八进制 decimal �进制 duodecimal �二进制 binary 二进制 roman 罗马 bijective �射 sexagesimal 六�进制 latitude 纬度 longitude �度 time 时间 bases 进制 calendars 日历 rectangular 矩形 cartesian 笛�尔 exponential 指数型 polar ��标 angle 角度 phasor 相� optimal 最优 base 基本 mixed 混� fraction 分数 factors 因� partial fraction 部分分� factorize 分解 expand 展开 hexadecimal number �六进制数 octal number 八进制数 decimal number �进制数 duodecimal number �二进制数 binary number 二进制数 roman numerals 罗马数字 bijective base-26 �射基-26 sexagesimal number 六进制数 32-bit floating point 32�浮点 64-bit floating point 64�浮点 16-bit floating point 16�浮点 80-bit (x86) floating point 80�(x86)浮点 128-bit floating point 128�浮点 time format 时间格� number bases 数字进制 optimal unit 最优�� base units 基本�� mixed units 混��� expanded partial fractions 已展开部分分� complex rectangular form �矩形形� complex exponential form �指数形� complex polar form ���标形� complex cis form �纯虚数指数(cis)形� complex angle notation �角记� complex phasor notation �相�记� UTC time zone UTC时区 number base %s 数字进制 %s c-format Inactive �常用 Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 从 %s 数�集中检索与所给对象和属性相关的数�。若将“info�键入为属性,则会弹出一个包�该对象的所有属性的对�框窗�。 c-format Example: 示例: Arguments �数 optional optional argument �选 default: argument default, in description 默认值: Requirement �求 key indicating that the property is a data set key 键 Acti_vate 激活(_v) a previous result 一个先�的结果 matrix 矩阵 vector �� positive 正数 non-positive �正数 negative 负数 non-negative �负数 non-zero �零 boolean 布尔值 integer 整数 rational 有�数 real 实数 complex �数 number 数 (not matrix) (�矩阵) unknown 未知 default assumptions 默认�设 Variable does not exist anymore. ����存在。 Data Retrieval Function 数�检索函数 Insert function �入函数 Insert function (dialog) �入函数(对�框) Insert variable �入�� Insert unit �入�� Insert text �入文本 Insert date �入日期 Insert vector �入�� Insert matrix �入矩阵 Insert smart parentheses �入智能括� Convert to unit �算为�� Convert to unit (entry) �算为��(输入框) Convert to optimal unit �算为最优�� Convert to base units �算为基本�� Convert to optimal prefix �算为最优�缀 Convert to number base �算为数字进制 Factorize result 分解结果 Expand result 展开结果 Expand partial fractions 展开部分分� RPN: down RPN: �下 RPN: up RPN: �上 RPN: swap RPN: 交� RPN: copy RPN: �制 RPN: lastx RPN: lastx RPN: delete register RPN: 删除寄存器 RPN: clear stack RPN: 清空栈 Load meta mode 加载元模� Set expression base 设置表达�进制 Set result base 设置结果进制 Toggle exact mode 切�精确模� Set angle unit to degrees 将角度��设为度 Set angle unit to radians 将角度��设为弧度 Set angle unit to gradians 将角度��设为梯度 Toggle simple fractions 切�简�分数 Toggle mixed fractions 切�混�分数 Toggle scientific notation 切�科学记数 Toggle simple notation 切�简�记数 Toggle RPN mode 切�RPN模� Toggle calculate as you type 切�键入时计算 Toggle programming keypad 切�编程键盘 Show keypad 显示键盘 Show history 显示历�记录 Search history �索历�记录 Show conversion 显示�算 Show RPN stack 显示RPN栈 Manage variables 管��� Manage functions 管�函数 Manage data sets 管�数�集 New variable 新建�� New function 新建函数 Open plot functions/data 打开函数/数�作图 Open convert number bases 打开进制�算 Open floating point conversion 打开浮点�算 Open calender conversion 打开日历�算 Open percentage calculation tool 打开百分比计算 Open periodic table 打开元素周期表 Update exchange rates 更新汇率 Copy result �制结果 Save result image �存结果图� Help 帮助 Quit 退出 Toggle chain mode 切�链�模� Prefixes �缀 No Prefix 无�缀 Optimal Prefix 最优�缀 Prefix �缀 Complex angle/phasor notation �角/相�记� Number bases 数字进制 Base units 基本�� Binary number 二进制数 Calendars 日历 Complex cis form �纯虚数指数形� Decimal number �进制数 Duodecimal number �二进制数 Complex exponential form �指数形� Factors 因� 16-bit floating point binary format 16�浮点二进制格� 32-bit floating point binary format 32�浮点二进制格� 64-bit floating point binary format 64�浮点二进制格� 80-bit (x86) floating point binary format 80�(x86)浮点二进制格� 128-bit floating point binary format 128�浮点二进制格� Hexadecimal number �六进制数 Latitude 纬度 Longitude �度 Mixed units 混��� Octal number 八进制数 Optimal units 最优�� Expanded partial fractions 展开部分分� Complex polar form ���标形� Complex rectangular form �矩形形� Sexagesimal number 六�进制数 and 且 or 或 undefined 未定义 result is too long see history 结果太长 查看历�记录 calculation was aborted 计算已中止 RPN Register Moved RPN寄存器已移动 RPN Operation RPN�作 Processing… 处�中… result processing was aborted 结果处�已中止 Factorizing… 分解中… Expanding partial fractions… 展开部分分�… Expanding… 展开中… Calculating… 计算中… Converting… �算中… Fetching exchange rates. 获�汇率。 Time zone parsing failed. 时区分�失败。 Keep open ��打开状� Enter RPN Enter (calculate and add to stack) 开始 C_alculate 计算(_a) Apply to Stack 应用于栈 Argument �数 True 真 False � Info 信� Edit Unit (global) 编辑��(全局) New Unit 新建�� Empty name field. �称字段为空。 A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again 已存在��的��或��。 是��覆盖它? Base unit does not exist. 基本���存在。 Edit Function (global) 编辑函数(全局) New Function 新建函数 Yes 是 No � Empty expression field. 表达�字段为空。 A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again 已存在��函数。 是��覆盖函数? Unit does not exist ���存在 Edit Unknown Variable (global) 编辑未知��(全局) New Unknown Variable 新建未知�� An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again 已存在��的��或��。 是��覆盖它? Edit Variable (global) 编辑��(全局) New Variable 新建�� Empty value field. 值字段为空。 Edit Vector 编辑�� Edit Vector (global) 编辑��(全局) New Vector 新建�� Edit Matrix (global) 编辑矩阵(全局) New Matrix 新建矩阵 Vector Result ��结果 Matrix Result 矩阵结果 New Data Object 新建数�对象 text 文本 approximate 近似 Edit Data Set (global) 编辑数�集(全局) New Data Set 新建数�集 info 信� Property 属性 No file name entered. 未输入文件�。 No delimiter selected. 未选择分隔符。 Could not import from file %s 无法从文件导入 %s c-format No variable name entered. 未输入���。 No known variable with entered name found. 未找到所输入�称的已知��。 Could not export to file %s 无法导出到文件 %s c-format My Variables 我的�� Couldn't write definitions 无法写入定义 Preset 预置 Abort 中止 Undo 撤消 Redo �� Completion Mode 补全模� Limited strict completion 有�严格补全 Strict completion 严格补全 Limited full completion 有�全�补全 Full completion 全�补全 No completion 无补全 Delayed completion 延迟补全 Customize completion… 自定义补全… Save Mode �存模� Preset mode cannot be overwritten. 无法覆盖预设模�。 Delete Mode 删除模� Couldn't write preferences to %s 无法将首选项写入 %s c-format never 从� ask 询问 %i day %i天 c-format %i days Copied Result was copied 已�制 log10 function not found. 未找到函数log10。 Search �索 _Search �索(_S) Remove Bookmark 删除书签 Add Bookmark 添加书签 A bookmark with the selected name already exists. Do you want to overwrite it? 已存在��的书签。 是��覆盖它? No items found 未找到�目 Select date 选择日期 Rectangular form 矩形形� Exponential form 指数形� Polar form ��标形� Angle/phasor notation 角/相�记� Optimal unit 最优�� Optimal prefix 最优�缀 All functions 所有函数 All variables 所有�� Select definitions file 选择定义文件 _Import 导入(_I) Could not copy %s to %s. 无法将%s�制到%s。 c-format Could not read %s. 无法读� %s 。 c-format Could not copy file to %s. 无法将文件�制到 %s 。 c-format Unsupported base. �支�该进制。 The selected Chinese year does not exist. 所选的农历年份�存在。 Conversion to Gregorian calendar failed. �算为公历失败。 Calendar conversion failed for: %s. 日历�算失败: %s。 c-format Gnuplot was not found. 未找到gnuplot。 %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) 需��独安装,并在�执行的�索路径中找到,�能进行绘图。 c-format Select file to save PNG image to 将PNG图��存为 Allowed File Types �许的文件类型 All Files 所有文件 Cannot delete unit as it is needed by other units. do not delete units that are used by other units 无法删除��,因为它被其他���赖。 none 无 result is too long 结果过长 translator-credits tuberry <orzun@foxmail.com> Mode not found. 未找到模�。 Elements (in horizontal order) 元素(按水平顺�) Select file to import 选择�导入的文件 _Open 打开(_O) Select file to export to 选择导出到文件 A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? 存在��的冲�对象。 若继续并�存更改,冲�对象将被覆盖或�用。 你想继续�? Set key combination 设置组�键 Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) 按�用于�作的组�键 (按Escape�消)。 No keys 未按键 Empty value. 值为空。 Function not found. 未找到函数。 Variable not found. 未找到��。 Unit not found. 未找到��。 The key combination is already in use. Do you wish to replace the current action? 组�键已被�用。 是��替�当��作? Select file to export 选择�导出的文件 Empty expression. 表达�为空。 Empty x variable. x��为空。 Element Data 元素数� Classification 分类 Alkali Metal 碱金属 Alkaline-Earth Metal 碱土金属 Lanthanide 镧系元素 Actinide 锕系 Transition Metal 过渡金属 Metal 金属 Metalloid 类金属 Polyatomic Non-Metal 多原��金属 Diatomic Non-Metal �原��金属 Noble Gas 惰性气体 Unknown chemical properties 未知化学性质 No unknowns in result. 结果中没有未知数。 Set Unknowns 设置未知数 Copy result to clipboard 将结果�制到剪贴� x x If a matrix or vectors shall be generated from the contents of the file 若�从文件内容生�矩阵或�� Use dark theme 使用深色主题 Add the two top values Keypad 将顶部两个值相加 u Manage units button u to Button for convert to operator to Add Keypad 加 ArgumentEditDialog Name: �称: Type: 类型: Free 任� Number 数字 Integer 整数 Symbol 符� Text 文本 Date 日期 Vector �� Matrix 矩阵 Boolean 布尔值 Angle 角度 Object 对象 Function 函数 Unit �� Variable �� File 文件 Enable rules and type test �用规则和类型测试 Custom condition: 自定义�件: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,若�数必须是一个有相�数�行和列的矩阵:rows(\x) = columns(\x) Allow matrix �许矩阵 Forbid zero �用零 Handle vector 处��� Calculate function for each separate element in vector. 对��中�个�独元素计算函数。 Min 最� Include equals 包�等于 Max 最大 CSVDialog Import CSV File 导入CSV文件 Export CSV File 导出CSV文件 Current result 当�结果 Matrix/vector variable: 矩阵/����: File: 文件: Import as 导入为 matrix 矩阵 vectors �� Name: �称: First row: 第一行: Includes headings 包括标题 Delimiter: 分隔符: Comma 逗� Tabulator 制表符 Semicolon 分� Space 空格 Other 其他 Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在��的��或��。 是��覆盖它? Error Could not import from file %1 无法从文件导入 %1 No matrix or vector variable with the entered name was found. Could not export to file %1 无法导出到文件 %1 CalendarConversionDialog Calendar Conversion 日历�算 Gregorian 格里高利历(公历/阳历) Hebrew 希伯�历(犹太历) Islamic (Hijri) 伊斯兰历(回历/Hijri) Persian (Solar Hijri) 波斯历(Solar Hijri) Indian (National) �度历(国立) Chinese 中国历(农历/阴历) Julian 儒略历 Revised Julian (Milanković) 修订儒略历(Milanković) Coptic 科普特历(Coptic) Ethiopian 埃塞俄比亚历(Ethiopian) Error The selected Chinese year does not exist. 所选的农历年份�存在。 Conversion to Gregorian calendar failed. �算为公历失败。 Calendar conversion failed for: %1. 日历�算失败: %1。 DataObjectEditDialog %1: %1: Default 默认值 Approximate 近似值 Exact 精确 Edit Data Object 编辑数�对象 New Data Object 新建数�对象 DataPropertyEditDialog Name: �称: Title: 标题: Descriptive name: �述性�称: Description: �述: Value type: 值类型: Expression 表达� Number 数字 Text 文本 Unit expression: ��表达�: Use as key 用作键 Case sensitive value 区分大�写的值 Approximate value 近似值 Value uses brackets 值使用括� Hide �� Edit Data Property 编辑数�属性 DataSetEditDialog General 通用 Properties 属性 Function 函数 Title: 标题: Descriptive name: �述性�称: Data file: 数�文件: Description: �述: Copyright: 版�: Title 标题 Name �称 Type 类型 Add 加 Edit 编辑 Remove 移除 Name: �称: Object argument name: 对象�数�称: Property argument name: 属性�数�称: Default property: 默认属性: text 文本 approximate 近似 number 数 expression expression key 键 Question A function with the same name already exists. Do you want to overwrite the function? 已存在��函数。 是��覆盖函数? Data Sets 数�集 Object 对象 Property 属性 Edit Data Set 编辑数�集 New Data Set 新建数�集 DataSetsDialog Data Sets 数�集 Data sets: 数�集: New… 新建… Edit… 编辑… Delete 删除 Objects: 对象: Data set description: 数�集�述: Object attributes: 对象属性: Properties 属性 key 键 Data Retrieval Function 数�检索函数 argument �数 ExpressionEdit matrix 矩阵 vector �� positive 正数 non-positive �正数 negative 负数 non-negative �负数 non-zero �零 boolean 布尔值 integer 整数 rational 有�数 real 实数 complex �数 number 数 (not matrix) (�矩阵) unknown 未知 default assumptions 默认�设 Prefix: �缀: Complex Angle/Phasor Notation �角/相�记� Base units 基本�� Number Base 数字进制 Binary-Coded Decimal 二進碼�進數 Bijective Base-26 �射基-26 Binary Number 二进制数 Calendars 日历 Complex cis Form �纯虚数指数形� Decimal Number �进制数 Duodecimal Number �二进制数 Complex Exponential Form �指数形� Factors 因� 16-bit Floating Point Binary Format 16�浮点二进制格� 32-bit Floating Point Binary Format 32�浮点二进制格� 64-bit Floating Point Binary Format 64�浮点二进制格� 80-bit (x86) Floating Point Binary Format 80�(x86)浮点二进制格� 128-bit Floating Point Binary Format 128�浮点二进制格� Fraction 分数 Decimal Fraction �进分数 Hexadecimal Number �六进制数 Latitude 纬度 Longitude �度 Mixed Units 混��� Octal Number 八进制数 Optimal Unit 最优�� Optimal Prefix 最优�缀 Expanded Partial Fractions 展开部分分� Complex Polar Form ���标形� Complex Rectangular Form �矩形形� Roman Numerals 罗马数字 Sexagesimal Number 六�进制数 Time Format 时间格� Unicode Unicode UTC Time Zone UTC时区 Scientific Notation 科学记数 Simple Notation 简�记数 Custom 定制 Undo 撤消 Redo �� Cut 剪切 Copy �制 Paste 粘贴 Delete 删除 Calculate Selection 计算选择 Insert Date… �入日期… Insert Matrix… �入矩阵… Select All 全选 Clear 清除 Clear History 清除历�记录 Completion 补全 No completion 无补全 Limited strict completion 有�严格补全 Strict completion 严格补全 Limited full completion 有�全�补全 Full completion 全�补全 Delayed completion 延迟补全 Expression Status 表达�状� Off 关 In history list In expression field In status bar With delay 有延迟 With adaptive delay Without delay �延误 Automatically calculate selection Use input method 使用输入法 Matrix 矩阵 Too many arguments for %1(). %1()的�数太多。 argument �数 %1: %1: comment MC (memory clear) MC(存值清除) MS (memory store) MS(存值存入) M+ (memory plus) M+(存值加上) M− (memory minus) M−(存值�去) factorize 分解 expand 展开 hexadecimal �六进制 hexadecimal number �六进制数 octal 八进制 octal number 八进制数 decimal �进制 decimal number �进制数 duodecimal �二进制 duodecimal number �二进制数 binary 二进制 binary number 二进制数 roman 罗马 roman numerals 罗马数字 bijective �射 bijective base-26 �射基-26 binary-coded decimal 二進碼�進數 sexagesimal 六�进制 sexagesimal number 六进制数 latitude 纬度 longitude �度 32-bit floating point 32�浮点 64-bit floating point 64�浮点 16-bit floating point 16�浮点 80-bit (x86) floating point 80�(x86)浮点 128-bit floating point 128�浮点 time 时间 time format 时间格� scientific 科学 scientific notation 科学记数 engineering 工程 engineering notation 工程记数 simple 简� simple notation 简�记数 bases 进制 number bases 数字进制 calendars 日历 optimal 最优 optimal unit 最优�� prefix �缀 optimal prefix base 基本 base units 基本�� mixed 混� mixed units 混��� decimals decimal fraction fraction 分数 factors 因� Engineering Notation 工程记数 base base units 基本 partial fraction 部分分� expanded partial fractions 已展开部分分� rectangular 矩形 cartesian 笛�尔 complex rectangular form �矩形形� exponential 指数型 complex exponential form �指数形� polar ��标 complex polar form ���标形� complex cis form �纯虚数指数(cis)形� angle 角度 complex angle notation �角记� phasor 相� complex phasor notation �相�记� UTC time zone UTC时区 base number base 进制 number base %1 数字进制 %1 Data object 数�对象 FPConversionDialog Floating Point Conversion (IEEE 754) 浮点�算(IEEE 754) Format 格� 16-bit (half precision) 16�(�精度) 32-bit (single precision) 32�(�精度) 64-bit (double precision) 64�(�精度) 80-bit (x86 extended format) 80� (x86扩展格�) 128-bit (quadruple precision) 128�(四�精度) Microchip 24-bit Microchip 32-bit Value 值 Decimal value �进制值 Binary representation 二进制表示 Hexadecimal representation �六进制表示 Floating point value 浮点值 Conversion error �算误差 FunctionEditDialog Required 必需的 Details 细节 Description �述 Name: �称: Expression: 表达�: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x�y 和 z(例如“(x+y)/2�)或 \x�\y�\z�\a�\b�…(例如“(\x+\y)/2�) Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") 使用x�y 和 z(例如“(x+y)/2�)或 \x�\y�\z�\a�\b�…(例如“(\x+\y)/2�) Category: 类别: Descriptive name: �述性�称: Hide function ��函数 Example: 示例: Description: �述: Condition: �件: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") 函数必须为真的�件。例如,若第二个�数必须大于第一个�数: “\y > \x� Sub-functions: �函数: Expression 表达� Precalculate 预计算 Reference �考 Add 加 Edit 编辑 Remove 移除 Arguments: �数: Name �称 Type 类型 Warning Conversion (using "to") is not supported in functions. Question A function with the same name already exists. Do you want to overwrite the function? 已存在��函数。 是��覆盖函数? Edit Function 编辑函数 New Function 新建函数 FunctionsDialog Functions 函数 Category 类别 Function 函数 New… 新建… Edit… 编辑… Deactivate �用 Delete 删除 Calculate… 计算… Apply 应用 Insert �入 Favorite 收�夹 argument �数 Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 从 %1 数�集中检索与所给对象和属性相关的数�。若将“info�键入为属性,则会弹出一个包�该对象的所有属性的对�框窗�。 Example: 示例: Arguments �数 optional optional argument �选 default: argument default 默认值: Requirement: Required condition for function �求: Properties 属性 %1: %1: key indicating that the property is a data set key 键 Activate 激活 All All functions 全部 Uncategorized 未分类 User functions 用户功能 Favorites 收�夹 Inactive �常用 HistoryView Insert Value �入值 Insert Text �入文本 Copy �制 Copy Formatted Text �制格�化文本 Copy unformatted ASCII �制未格�化的 ASCII Select All 全选 Search… �索… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上�键入一个数学表达�,例如“5+2/3�, 然�按Enter键。</span> Search by Date… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. 在上�键入一个数学表达�,例如“5+2/3�,然�按Enter键。 Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. 在下�键入一个数学表达�,例如“5+2/3�,然�按Enter键。 Exchange rate source(s): updated %1 Comment Protect �护 Add Comment… Move to Top 移动到顶部 Remove 移除 Clear 清除 Edit Comment… Text: 文本: Search �索 KeypadButton <i>Right-click/long press</i>: %1 <i>�键/长按</i>: %1 <i>Right-click</i>: %1 <i>�键</i>: %1 <i>Long press</i>: %1 <i>长按</i>: %1 Open menu <i>Middle-click</i>: %1 <i>中键</i>: %1 KeypadWidget Memory store 存值存入 Memory clear 存值清除 Memory recall 存值读� Memory add 存值加上 Memory subtract 存值�去 STO Standard calculator button. Do not use more than three characters. STO Store 存储 New function 新建函数 sin sin cos cos tan tan Exponentiation Percent or remainder Uncertainty/interval �确定度/区间 Relative error 相对误差 Interval 区间 Move cursor left Move cursor to start Move cursor right Move cursor to end Logical AND 逻辑与 Logical OR 逻辑或 Bitwise Exclusive OR 按�异或 Logical NOT 逻辑� Bitwise Left Shift 按�左移 Bitwise Right Shift 按��移 cmp rot a→1 Expand partial fractions 展开部分分� DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. Enable units in physical constants 物�常数�� All constants Toutes les constantes Percentage Calculation Tool 百分比计算 more 更多 All units 所有�� All variables 所有�� Action 动作 Interval Display 区间显示 Adaptive 自适应 Significant digits 有效数字 Plus/minus 加/� Relative 相对 Concise Interval Calculation 区间计算 Variance formula 方差公� Interval arithmetic 区间�算 Allow concise uncertainty input Complex number form �数形� Rectangular 矩形 Exponential 指数型 Polar ��标 Angle/phasor 角/相� Type Assumptions type 类型 Sign Assumptions sign 符� Default assumptions 默认�设 Number 数字 Real 实数 Rational 有�数 Integer 整数 Boolean 布尔值 Unknown Unknown assumptions sign 未知数 Non-zero �零数 Positive 正数 Non-negative �负数 Negative 负数 Non-positive �正数 Factorize 分解 Expand 展开 Add column Add row Remove column Remove row Left parenthesis 左括� Left vector bracket 左��括� Right parenthesis �括� Right vector bracket ���括� Smart parentheses 智能括� Vector brackets ��括� Argument separator �数分隔符 Blank space 空白处 New line 新建行 Decimal point �数点 Previous result (static) �一个结果(��) Multiplication Button Action 按钮动作 Label: 标签: Action: 动作: None 无 Value: 值: Bitwise AND 按�与 Bitwise Shift 按�移� Delete 删除 Backspace 退格键 Addition Plus Subtraction Minus Division Bitwise OR 按�或 Bitwise NOT 按�� Clear expression 清除表达� Calculate expression 计算表达� NamesEditDialog Name �称 Abbreviation 缩写 Plural �数 Reference �考 Avoid input ��输入 Unicode Unicode Suffix �缀 Case sensitive 区分大�写 Completion only 仅补全 Add 加 Edit 编辑 Remove 移除 Warning Illegal name �法�称 A function with the same name already exists. 已存在��函数。 A unit or variable with the same name already exists. 已存在��的��或��。 PercentageCalculationDialog Percentage 百分比 Value 1 甲值 Value 2 乙值 Change from 1 to 2 甲转�为乙 Change from 2 to 1 乙转�为甲 2 compared to 1 乙相比于甲 1 compared to 2 甲相比于乙 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 输入两个值,其中最多一个是百分比,其他值会帮你计算。 Clear 清除 PeriodicTableDialog Periodic Table 元素周期表 Element Data 元素数� Alkali Metal 碱金属 Alkaline-Earth Metal 碱土金属 Lanthanide 镧系元素 Actinide 锕系 Transition Metal 过渡金属 Metal 金属 Metalloid 类金属 Polyatomic Non-Metal 多原��金属 Diatomic Non-Metal �原��金属 Noble Gas 惰性气体 Unknown chemical properties 未知化学性质 Unknown 未知数 %1: %1: PlotDialog Plot 作图 Data 数� Title: 标题: Expression: 表达�: Function 函数 Vector/matrix ��/矩阵 Paired matrix �对矩阵 Rows 行 X variable: X��: Style: 风格: Line 线 Points 点 Line with points 点+线 Boxes/bars 框/� Histogram 直方图 Steps 步骤 Candlesticks K线图 Dots �点 Polar ��标 Smoothing: 平滑: None 无 Monotonic �调 Natural cubic splines 自然三次样� Bezier �塞尔 Bezier (monotonic) �塞尔(�调) Y-axis: Y轴: Primary 主�标轴 Secondary 次�标轴 Add 加 Apply 应用 Remove 移除 Title 标题 Expression 表达� Function Range 函数范围 Minimum x value: 最�x值: Maximum x value: 最大x值: Sampling rate: 采样率: Step size: 步长: Show real and imaginary parts Appearance 外观 Display grid 显示网格 Display full border 显示完整边框 Minimum y value: 最�y值: Maximum y value: 最大y值: Logarithmic x scale: 对数x刻度: Logarithmic y scale: 对数y刻度: X-axis label: X轴标签: Y-axis label: Y轴标签: Line width: 线宽: Legend placement: 图例�置: Top-left 左上 Top-right �上 Bottom-left 左下 Bottom-right �下 Below 下� Outside 外� Calculating… 计算中… Cancel �消 Processing… 处�中… PreferencesDialog Look && Feel 外观 Numbers && Operators 数字和�算符 Units && Currencies ��和货� Parsing && Calculation 解�计算 Ignore system language (requires restart) 忽略系统语言(需���) Allow multiple instances �许多个实例 Clear history on exit 退出时清除历�记录 Keep above other windows Window title: 窗�标题: Application name 应用程��称 Result 结果 Application name + result 应用程��称+结果 Style: 风格: Default (requires restart) Default style 默认值(需���) Dark mode 黑暗模� Colorize result Custom result font 自定义结果字体 Custom expression font 自定义表达�字体 Custom keypad font 自定义键盘字体 Custom application font 自定义应用程�字体 Preferences 首选项 Workspace 工作区 Application name + workspace 应用程��称+工作区 Custom result font: 自定义结果字体: Custom expression font: 自定义表达�字体: Custom status bar font: Custom keypad font: 自定义键盘字体: Custom application font: 自定义应用程�字体: Display expression status 显示表达�状� Delay: 延时: ms milliseconds ms Expression after calculation: Keep expression Clear expression 清除表达� Replace with result Replace with result if shorter Use keyboard keys for RPN 用键盘键�作RPN Close application with Escape key Parsing mode: 解�模�: Adaptive 自适应 Conventional 常规 Implicit multiplication first ��优先 Chain 链� RPN RPN Read precision 读�精度 Limit implicit multiplication �制��乘法 Interval calculation: 区间计算: Variance formula 方差公� Interval arithmetic 区间�算 Factorize result 分解结果 Binary two's complement representation 二进制二的补�表示 Hexadecimal two's complement representation �六进制二进制补�表示 Use lower case letters in non-decimal numbers ��进制数使用�写 Spell out logical operators 拼出逻辑�算符 Use E-notation instead of 10^n 使用E符�代替10^n Use 'j' as imaginary unit 用 j 作虚数�� Use comma as decimal separator 将逗�作为�数分隔符 Ignore comma in numbers 忽略数字中的逗� Ignore dots in numbers 忽略数字中的点 Round halfway numbers to even 中数约至�数 Indicate repeating decimals 指示循环�数 Language: 语言: Max history lines saved: Use caret for bitwise XOR �入符�(^)作为按�异或 Preserve history height Do not change the height of history list when keypad or number bases are show or hidden. Show status bar Tooltips: Show all Hide in keypad Hide all Disable cursor blinking Format result Custom history font: Expression status: 表达�状�: Place expression field below history Off 关 In history list In expression field In status bar Status tooltip delay: Adaptive delay Automatically calculate selection Expression in history: Parsed Parsed (compact) Entered Entered + parsed Entered + parsed (compact) Automatically copy result Simplified percentage calculation Allow concise uncertainty input Interpret unrecognized symbols as variables Two's complement output: Two's complement input: Binary 二进制 Hexadecimal �六进制 Binary bits: Automatic 自动的 Use special duodecimal symbols Use Unicode division slash in output Copy unformatted ASCII by default Place percent button in number pad Indicate repeating decimals: 指示循环�数: Ellipsis Overline Digit grouping: 数字分节: None 无 Standard 标准 Local 本地 Custom 定制 Interval display: 区间显示: Significant digits 有效数字 Interval 区间 Plus/minus 加/� Concise Midpoint 中点 Lower Upper Rounding: Round halfway numbers away from zero Complex number form: �数形�: Rectangular 矩形 Exponential 指数型 Polar ��标 Angle/phasor 角/相� Enable units Abbreviate names 缩写�称 Use binary prefixes for information units 信���使用二进制�缀 Automatic unit conversion: No conversion Base units 基本�� Optimal units 最优�� Optimal SI units Convert to mixed units Automatic unit prefixes: Copy unformatted ASCII without units Default currency: Fonts 字体 Units �� Calculation 计算 Restart required Please restart the program for the language change to take effect. Default 默认值 Notify when a new version is available 当有新版本时通知我 Calculate as you type delay: Multiplication sign: 乘�: multiplication sign Unicode character name dot operator Unicode character name middle dot Unicode character name asterisk Unicode character name Automatically group digits in input Round halfway numbers to odd Round halfway numbers toward zero Round halfway numbers to random Round halfway numbers up Round halfway numbers down Round toward zero Round away from zero Round up Round down No prefixes 无�缀 Prefixes for some units Prefixes also for currencies Prefixes for all units Enable all SI-prefixes �用所有SI�缀 Enable denominator prefixes �用分��缀 Enable units in physical constants 物�常数�� Temperature calculation: 温度计算模�: Absolute �对 Relative 相对 Hybrid 混� Exchange rates updates: 汇率更新: %n day(s) %n天 days 天 QApplication Execute expressions and commands from a file 执行文件中的表达�和命令 FILE 文件 Start a new instance of the application �动一个新的程�实例 Specify the window title 指定窗�标题 TITLE TITLE Update exchange rates 更新汇率 Display the application version 显示应用程�版本 Open workspace Expression to calculate �计算的表达� [EXPRESSION] [EXPRESSION] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? 默认情况下,��许打开%1的一个实例(一个主窗�)。 若�时打开多个实例,�有最�一个关闭窗�的定义(���函数等)�模���好和历�记录会被�存。 尽管这样,你是�想改�默认的行为,�许�时打开多个实例? Allow multiple instances? %1 is already running. Failed to load global definitions! 加载全局定义失败� answer 答案 History Answer Value 历�答案 History Index(es) 历�索引 History index %s does not exist. 历�索引 %s �存在。 Last Answer 上一答案 Answer 2 答案二 Answer 3 答案三 Answer 4 答案四 Answer 5 答案五 Memory 存值 Error Couldn't write preferences to %1 无法将首选项写入 %1 Function not found. 未找到函数。 Variable not found. 未找到��。 Unit not found. 未找到��。 Unsupported base. �支�该进制。 Unsupported value. QalculateQtSettings Update exchange rates? 更新汇率? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? �上次更新汇率已过了%n天。 您想现在更新汇率�? Fetching exchange rates. 获�汇率。 Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). Fetching exchange rates… 获�汇率… Error Warning Information Path of executable not found. 未找到�执行文件的路径。 curl not found. 未找到 curl。 Failed to run update script. %1 �行更新脚本失败。 %1 Failed to check for updates. 无法检查更新。 No updates found. 无更新。 A new version of %1 is available at %2. Do you wish to update to version %3? %1 的新版本�在 %2 获得。 是��更新到版本 %3? A new version of %1 is available. You can get version %3 at %2. %1 有�用的新版本 %3。 您�以在 %2 获�。 Download %1: %2 Insert function �入函数 Insert function (dialog) �入函数(对�框) Insert variable �入�� Approximate result Negate �� Invert �倒 Insert unit �入�� Insert text �入文本 Insert operator Insert date �入日期 Insert matrix �入矩阵 Insert smart parentheses �入智能括� Convert to unit �算为�� Convert �算 Convert to optimal unit �算为最优�� Convert to base units �算为基本�� Convert to optimal prefix �算为最优�缀 Convert to number base �算为数字进制 Factorize result 分解结果 Expand result 展开结果 Expand partial fractions 展开部分分� RPN: down RPN: �下 RPN: up RPN: �上 RPN: swap RPN: 交� RPN: copy RPN: �制 RPN: lastx RPN: lastx RPN: delete register RPN: 删除寄存器 RPN: clear stack RPN: 清空栈 Set expression base 设置表达�进制 Set result base 设置结果进制 Set angle unit to degrees 将角度��设为度 Set angle unit to radians 将角度��设为弧度 Set angle unit to gradians 将角度��设为梯度 Activate normal display mode Activate scientific display mode Activate engineering display mode Activate simple display mode Toggle precision Toggle max decimals Toggle min decimals Toggle max/min decimals Toggle RPN mode 切�RPN模� Show general keypad Toggle programming keypad 切�编程键盘 Toggle algebra keypad Toggle custom keypad Show/hide keypad Search history �索历�记录 Clear history 清除历�记录 Show variables Show functions Show units Show data sets Store result 存储结果 MC (memory clear) MC(存值清除) MR (memory recall) MR(存值读�) MS (memory store) MS(存值存入) M+ (memory plus) M+(存值加上) M− (memory minus) M−(存值�去) New variable 新建�� New function 新建函数 Open plot functions/data 打开函数/数�作图 Open convert number bases 打开进制�算 Open floating point conversion 打开浮点�算 Open calender conversion 打开日历�算 Open percentage calculation tool 打开百分比计算 Open periodic table 打开元素周期表 Update exchange rates 更新汇率 Copy result �制结果 Insert result Open mode menu Open menu Help 帮助 Quit 退出 Toggle chain mode 切�链�模� Toggle keep above Show completion (activate first item) Clear expression 清除表达� Delete 删除 Backspace 退格键 Home End Right Left Up �上 Down �下 Undo 撤消 Redo �� Calculate expression 计算表达� Expression history next Expression history previous Open functions menu Open units menu Open variables menu Toggle fraction format in current result Default 默认值 Formatted result Unformatted ASCII result Unformatted ASCII result without units Formatted expression Unformatted ASCII expression Formatted expression + result Unformatted ASCII expression + result QalculateTranslator OK Only used when Qt translation is missing 确定 Cancel Only used when Qt translation is missing �消 Close Only used when Qt translation is missing 关闭 &Yes Only used when Qt translation is missing 是 &No Only used when Qt translation is missing � &Open Only used when Qt translation is missing 打开 &Save Only used when Qt translation is missing �存 &Select All Only used when Qt translation is missing 全选 Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing Files of type: Only used when Qt translation is missing QalculateWindow Menu New 新建 Function… 函数… Variable/Constant… ��/常数… Unknown Variable… 未知��… Matrix… 矩阵… Workspaces 工作区 Open… 打开… Open default 打开默认 Save �存 Save As… �存为… Import CSV File… 导入CSV文件… Export CSV File… 导出CSV文件… Functions 函数 Variables and Constants ��和常数 Units �� Plot Functions/Data 函数/数�绘图 Floating Point Conversion (IEEE 754) 浮点�算(IEEE 754) Calendar Conversion 日历�算 Update Exchange Rates 更新汇率 Normal Mode 正常模� RPN Mode 逆波兰模� Chain Mode 链�模� Keyboard Shortcuts 键盘快�键 Preferences 首选项 Help 帮助 Report a Bug 报告错误 Check for Updates 检查更新 About %1 关于%1 Quit 退出 Mode 模� Mode (%1) 模�(%1) General Display Mode 一般显示模� Normal 常规 Scientific 科学 Engineering 工程 Simple 简� Angle Unit 角度�� Radians 弧度 Degrees 度 Gradians 梯度 Approximation 近似估算 Automatic Automatic approximation 自动的 Dual Dual approximation � Exact Exact approximation 精确 Approximate 近似值 Assumptions ���设 Type Assumptions type 类型 Number 数字 Real 实数 Rational 有�数 Integer 整数 Boolean 布尔值 Sign Assumptions sign 符� Unknown Unknown assumptions sign 未知数 Non-zero �零数 Positive 正数 Non-negative �负数 Negative 负数 Non-positive �正数 Result Base 设置结果进制 Binary 二进制 Octal 八进制 Decimal �进制 Hexadecimal �六进制 Other 其他 Approximation and Fractions 近似估算与分数 Duodecimal �二进制 Sexagesimal 六�进制 Time format 时间格� Roman numerals 罗马数字 Unicode Unicode Bijective base-26 Bijective base-26 Binary-coded decimal (BCD) 二進碼�進數 Custom: Number base Expression Base 设置表达�进制 Other: Number base 其他: Precision: 精确度: Min decimals: 最��数: Max decimals: 最大�数: off Max decimals 关 Convert �算 Convert (%1) �算(%1) Store 存储 Store (%1) 存储(%1) Functions (%1) 函数(%1) Keypad 键盘 Keypad (%1) 键盘(%1) Number bases 数字进制 Unit… ��… Data Sets 数�集 Percentage Calculation Tool 百分比计算 Periodic Table 元素周期表 Units (%1) �� (%1) Plot Functions/Data (%1) 函数/数�绘图 (%1) Number Bases (%1) 数字进制(%1) Binary: 二进制: Octal: 八进制: Decimal: �进制: Hexadecimal: �六进制: RPN Stack RPN栈 Rotate the stack or move the selected register up (%1) 循环栈或上移选定寄存器(%1) Rotate the stack or move the selected register down (%1) 循环栈或上移选定寄存器(%1) Swap the top two values or move the selected value to the top of the stack (%1) 交�顶部两个值或将所选值移到栈顶(%1) Copy the selected or top value to the top of the stack (%1) 将选定的或顶部值�制到栈顶(%1) Enter the top value from before the last numeric operation (%1) 输入上次数值�作�的顶部值(%1) Delete the top or selected value (%1) 删除顶部值或所选值(%1) Clear the RPN stack (%1) 清空RPN栈(%1) New Function… 新建函数… Favorites 收�夹 Recent User functions 用户功能 Open dialog 打开对�框 Show all functions 显示所有功能 User units 用户�� more 更多 Prefixes �缀 Show all units 显示所有�� User variables 用户�� Show all variables 显示所有�� Powerful and easy to use calculator 强大而易用的计算器 License: GNU General Public License version 2 or later Error Couldn't write definitions 无法写入定义 hexadecimal �六进制 octal 八进制 decimal �进制 duodecimal �二进制 binary 二进制 roman 罗马 bijective �射 sexagesimal 六�进制 latitude 纬度 longitude �度 time 时间 Time zone parsing failed. 时区分�失败。 bases 进制 calendars 日历 rectangular 矩形 cartesian 笛�尔 exponential 指数型 polar ��标 phasor 相� angle 角度 optimal 最优 base 基本 mixed 混� fraction 分数 factors 因� Show toolbar Open Settings Folder(s) Number Pad Always Show Number Pad EXACT EXACT APPROX APPROX RPN RPN CHN CHN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy �制 <i>Middle-click</i>: %1 <i>中键</i>: %1 scientific 科学 engineering 工程 simple 简� prefix �缀 base base units 基本 partial fraction 部分分� base number base 进制 decimals factorize 分解 expand 展开 Calculating… 计算中… Cancel �消 RPN Operation RPN�作 Factorizing… 分解中… Expanding partial fractions… 展开部分分�… Expanding… 展开中… Converting… �算中… RPN Register Moved RPN寄存器已移动 Processing… 处�中… Matrix 矩阵 Unknown variables (e.g. x, y, z) are by default assumed real. Temperature Calculation Mode 温度计算模� The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表达方�有歧义。 请选择温度计算模� (以��以在�好设置中更改)。 Absolute �对 Relative 相对 Hybrid 混� Please select desired variant of the sinc function. Unnormalized Normalized Interpretation of dots Interpretation of comma Please select interpretation of comma (",") (this can later be changed in preferences). Please select interpretation of dots (".") (this can later be changed in preferences). Both dot and comma as decimal separators Dot as thousands separator Comma as thousands separator Only dot as decimal separator Parsing Mode 解�模� The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). Implicit multiplication first ��优先 Conventional 常规 Adaptive 自适应 Percentage Interpretation Please select interpretation of percentage addition Add percentage of original value Add percentage multiplied by 1/100 Add Action (%1) 添加动作(%1) Edit Keyboard Shortcut New Keyboard Shortcut 新建键盘快�键 Action: 动作: Value: 值: Set key combination 设置组�键 Press the key combination you wish to use for the action. 按�用于�作的组�键。 Reserved key combination The key combination is already in use. Do you wish to replace the current action (%1)? 组�键已被�用。 是��替�当��作(%1)? Question Add… 加… Edit… 编辑… Remove 移除 Gnuplot was not found 未找到gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1 (%2) 需��独安装,并在�执行的�索路径中找到,�能进行绘图。 Example: Example of function usage 示例: Enter RPN Enter 开始 Calculate 计算 Apply to Stack 应用于栈 Insert �入 Failed to open workspace Couldn't save workspace Save file? Do you want to save the current workspace? Do not ask again ��询问 Keep open ��打开状� Value 值 Argument �数 %1: %1: Approximation && Fractions 近似估算与分数 Plot 作图 General 通用 Programming 编程 Algebra 代数 Custom 定制 None 无 Show Custom Column Separate Menu Buttons Reset Keypad Position Icons only Text only Text beside icons Text under icons <i>Right-click/long press</i>: %1 <i>�键/长按</i>: %1 Open menu Number Bases 数字进制 Conversion operator �算�算符 Rotate the stack or move the selected register up 循环栈或上移选定寄存器 Rotate the stack or move the selected register down 循环栈或下移选定寄存器 Swap the top two values or move the selected value to the top of the stack 交�顶部两个值或将所选值移到栈顶 Delete the top or selected value 删除顶部值或所选值 Enter the top value from before the last numeric operation 输入上次数值�作�的顶部值 Copy the selected or top value to the top of the stack 将选定的或顶部值�制到栈顶 Clear the RPN stack 清空RPN栈 Comma as separator for function arguments and matrix/vector elements Action 动作 Key combination 组�键 True 真 False � Info 信� optional optional argument �选 Failed to open %1. %2 无法打开 %1 。 %2 UnitEditDialog General 通用 Relation 关系 Name: �称: Category: 类别: Descriptive name: �述性�称: System: 系统: Imperial 英制 US Survey 美制 Hide unit ���� Description: �述: Class: 类: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此��所属的类。命�派生��是相对于一个�一的其他��而定义的,�以带有指数,而(未命�)派生��是由�一个或多个��的��表达�定义的。 Base unit 基本�� Named derived unit 命�派生�� Derived unit 派生�� Base unit(s): 基本��: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to 该��(对于命�派生��)或��表达�(对于未命�派生��)的定义所关�(基于)的�� Exponent: 指数: Relation: 关系: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 与基本��的关系。 对于线性关系,这应该�是一个数字。<br><br>对于�线性关系,用\x表示因�,用\y表示指数(例如,“\x + 273.15�表示摄�度和开尔文之间的关系)。 Inverse relation: 逆关系: Specify for non-linear relation, for conversion back to the base unit. 指定�线性关系,以便�算回基本��。 Mix with base unit 与基本��混� Priority: 优先级: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". Minimum base unit number: 最�基本��数: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". Use with prefixes by default 默认使用�缀 Base unit does not exist. 基本���存在。 Error A unit or variable with the same name already exists. Do you want to overwrite it? 已存在��的��或��。 是��覆盖它? Question A variable or unit with the same name already exists. Do you want to overwrite it? 已存在��的��或��。 是��覆盖它? Edit Unit 编辑�� New Unit 新建�� UnitsDialog Units �� Category 类别 Unit �� New… 新建… Edit… 编辑… Deactivate �用 Delete 删除 Convert �算 Insert �入 Favorite 收�夹 Show hidden units 显示���� Activate 激活 All All units 全部 Uncategorized 未分类 User units 用户�� Favorites 收�夹 Inactive �常用 UnknownEditDialog Name: �称: Custom assumptions 使用自定义�设 Type: 类型: Sign: 符�: Temporary 临时 Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在��的��或��。 是��覆盖它? Edit Unknown Variable 编辑未知�� New Unknown Variable 新建未知�� VariableEditDialog Name: �称: Temporary 临时 Value: 值: Required 必需的 Description �述 current result 当�结果 Category: 类别: Descriptive name: �述性�称: Hide variable ���� Description: �述: Question A unit or variable with the same name already exists. Do you want to overwrite it? 已存在��的��或��。 是��覆盖它? Edit Variable 编辑�� New Variable 新建�� VariablesDialog Variables �� Category 类别 Variable �� New 新建 Variable/Constant… ��/常数… Unknown Variable… 未知��… Matrix… 矩阵… Edit… 编辑… Export… 导出… Deactivate �用 Delete 删除 Insert �入 Favorite 收�夹 a matrix 矩阵 a vector �� positive 正数 non-positive �正数 negative 负数 non-negative �负数 non-zero �零 integer 整数 boolean 布尔值 rational 有�数 real 实数 complex �数 number 数 not matrix �矩阵 unknown 未知 Default assumptions 默认�设 Activate 激活 All All variables 全部 Uncategorized 未分类 User variables 用户�� Favorites 收�夹 Inactive �常用 qalculate-qt-5.11.0/translations/qalculate-qt_zh_TW.ts000066400000000000000000016120701520501070600227770ustar00rootroot00000000000000 Qalculate! Qalculate! Calculator 計算機 Powerful and easy to use calculator 強大而易用的計算機 calculation;arithmetic;scientific;financial; 計算;算術;科學;金�; Qalculate! (Qt UI) Qalculate! (Qt UI) Qalculate! is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation). Qalculate!是一款多功能的跨平臺桌�計算機。它簡單易用,但�具有通常複雜的數學軟件包所需的強大功能和多樣性,以�滿足日常所需的實用工具(如貨幣�算和百分比計算)。 Features include a large library of customizable functions, unit calculations and conversion, physical constants, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface. 功能包括大��定製函數庫�單�計算與�算�物�常數�符號計算(包括�分和方程)�高精度計算�誤差傳���間�算�繪圖和用戶�好的界�。 Argument Rules �數�則 _Cancel �消(_C) Do not save modifications ��存修改 _OK 確定(_O) Accept the modification of argument rules 接��數�則的修改 Enable rules and type test 啟用�則和類型測試 Custom condition 自定義�件 For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,若�數必須是一個有相�數�行和列的矩陣:rows(\x) = columns(\x) Allow matrix �許矩陣 Forbid zero �用零 Handle vector 處��� Calculate function for each separate element in vector. ���中�個單�元素計算函數。 Min 最� Include equals 包�等於 Max 最大 Keyboard Shortcuts �盤快�� _Close 關閉(_C) Label 標籤 Left-click 左� Right-click �� Middle-click 中� Reset �置 Button Action 按鈕動作 Value 值 Argument name �數� Calendar Conversion 日曆�算 Export CSV File 導出CSV文件 Current result 當��果 Matrix/vector variable 矩陣/��變� File 文件 Delimiter 分隔符 Comma 逗號 Tabulator 製表符 Semicolon 分號 Space 空格 Other 其他 Import CSV File 導入CSV文件 Do not import the file �導入文件 Import the file 導入文件 Name of the data file to import �導入的數據文件的�稱 Select a file �擇文件 Import as 導入為 Matrix 矩陣 If a matrix shall be generated from the contents of the file 若�從文件內容生�矩陣或�� Vectors �� If vectors shall be generated from the contents of the file 若�從文件內容生�矩陣或�� Name �稱 Name (or name prefix) used to reference generated variable(s) in expressions 用於引用表��中生�的變��(或�稱�綴) Descriptive name �述性�稱 Title displayed in menus and in variable manager �單和變�管�器中顯示的�稱 Category 類別 First row 第一行 The first row with data to import in the file 文件中�導入數據的第一行 Includes headings 包括標題 If the first row contains column headings 若第一行包�列標題 Delimiter used to separate columns in the file 文件中用於分隔列的分隔符 Custom delimiter 自定義分隔符 Edit Data Property 編輯數據屬性 Do not create/modify this data set �創建/修改此數據集 Accept the creation/modification of this data set 接�此數據集的創建/修改 Name used for reference 引用�稱 Properties 屬性 Title displayed in menus and in data set manager �單和數據集管�器中顯示的標題 Description �述 Description of this data property 此數據屬性的說明 Value Type 值類型 Text 文本 Number 數字 Expression 表�� Hide 隱� Use as key 用作� Approximate value 近似值 Case sensitive value �分大�寫的值 Value uses brackets 值使用括號 Unit expression 單�表�� Edit Data Set 編輯數據集 Title 標題 Data file 數據文件 Description of this data set 此數據集的說明 Copyright 版權 General 通用 Properties: 屬性: Definition of the properties of this data set 此數據集的屬性定義 _New 新建(_N) _Edit 編輯(_E) _Delete 刪除(_D) Name used to invoke the function in expressions 用於在表��中調用的函數� Object argument name �象�數�稱 Property argument name 屬性�數�稱 Default property 默�屬性 Function 函數 Edit Data Object 編輯數據�象 Do not create/modify this data object �創建/修改此數據�象 Accept the creation/modification of this data object 接�此數據�象的創建/修改 Data Sets new dataset 數據集 Data Set 數據集 Create a new data set 創建新數據集 Edit the selected data set 編輯所�數據集 Delete the selected data set 刪除所�數據集 Objects �象 Create a new data object 創建新的數據�象 Edit the selected data object 編輯所�數據�象 Remove the selected data object 刪除所�數據�象 Data Set Description 數據集�述 Object Attributes �象屬性 Decimals �數 Close this window 關閉此視窗 Min decimals 最��數 Max decimals 最大�數 Minimal number of displayed decimals 顯示�數的最�數目 Maximal number of decimals to display (and round to) 所顯示的最大�數(並�入) Floating Point Conversion 浮點�算 Decimal value �進制值 Binary value 二進制值 Octal value 八進制值 Hexadecimal representation �六進制表示 Conversion error �算誤差 Binary representation 二進制表示 Floating point value 浮點值 Format 格� 16-bit (half precision) 16�(�精度) 32-bit (single precision) 32�(單精度) 64-bit (double precision) 64�(雙精度) 80-bit (x86 extended format) 80� (x86擴展格�) 128-bit (quadruple precision) 128�(四�精度) Hexadecimal value �六進制值 Edit Function 編輯函數 _Help 幫助(_H) Do not create/modify this function �創建/修改此函數 Accept the creation/modification of this function 接�此函數的創建/修改 Name used to invoke this function in expressions 用於在表��中調用的函數� Title displayed in menus and in function manager �單和函數管�器中顯示的標題 Hide function 隱�函數 If this function shall be hidden in menus 若�在�單中隱�此函數 Description of this function 此函數的說明 Use \x for the first, \y for the second and \z for the third argument. For more information click the help button. 第一個�數使用\x,第二個�數使用\y,第三個�數使用\z。 更多訊�請點擊幫助按鈕。。 Condition �件 Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") 函數必須為真的�件。例如,若第二個�數必須大於第一個�數: “\y > \x� Sub-Functions �函數 Arguments: �數: Definition of this function's arguments 此函數的�數定義 Free 任� Integer 整數 Symbol 符號 Date 日期 Vector �� Positive number 正數 Non-zero number �零數 Non-negative number �負數 Positive integer 正整數 Non-zero integer �零整數 Non-negative integer �負整數 Boolean 布林值 Object �象 Unit 單� Variable 變� Angle 角度 Data object 數據�象 Data property 數據屬性 _Add 添加(_A) Add entered argument definition 添加輸入�數的定義 _Apply 應用(_A) Modify selected argument 修改所��數 Remove selected argument 刪除所��數 Rules �則 Edit conditions for selected argument 編輯所��數的�件 Close this dialog 關閉此�話框 Precalculate �計算 Calculate the subfunction only once, before the parent function 在父函數之��計算一次�函數 Add entered subfunction 增加輸入的�函數 Apply changes to the selected subfunction 將更改應用於所��函數 Remove the selected subfunction 刪除�定的�函數 Functions 函數 Create a new function 創建新函數 Edit the selected function 編輯所�函數 _Insert �入(_I) Insert (or execute) the selected function into the expression entry 在表��框中�入(或執行)所�函數 Delete the selected function 刪除所�函數 (De)activate the selected function (�消)激活所�函數 Deacti_vate �用(_v) Apply the selected function to the current expression 將所�函數應用於當�表�� Categor_y 類別(_y) _Function 函數(_F) Descri_ption �述(_P) Degrees 度 Radians 弧度 Gradians 梯度 Default assumptions 默��設 Unknown 未知數 Not Matrix �矩陣 Complex 複數 Real 實數 Rational 有�數 Non-Zero �零數 Positive 正數 Non-Negative �負數 Negative 負數 Non-Positive �正數 _File 文件(_F) Unknown Variable 未知變� Function (simplified) 函數(簡化) Import CSV File… 導入CSV文件… Export CSV File… 導出CSV文件… _Store Result… 儲存�果(_S)… Save Result Image… �存�果圖�… Save local functions, variables and units �存局部函數,變�和單� Save Definitions �存定義 Import Definitions File… 導入定義文件… Fetch current exchange rates from the Internet 從網絡上��當�匯率 Update Exchange Rates 更新匯率 Plot Functions/Data 函數/數據繪圖 Convert Number Bases 數字進制�算 Floating Point Conversion (IEEE 754) 浮點�算(IEEE 754) Percentage Calculation Tool 百分比計算 Periodic Table 元素週期表 Minimal Window 最�視窗 _Quit 退出(_Q) Manage Variables 管�變� Manage Functions 管�函數 Manage Units 管�單� Manage Data Sets 管�數據集 Factorize 分解 Expand 展開 Apply partial fraction decomposition to the current result. 部分分�分解當��果。 Expand Partial Fractions 展開部分分� Set Unknowns… 設置未知數… Convert to Unit �算單� Set Prefix 設置�綴 Convert to Unit Expression… �算為單�表��… Convert to Base Units �算為基本單� Convert to Optimal Unit �算為最優單� Insert Date… �入日期… Insert Matrix… �入矩陣… Insert Vector… �入��… _Copy Result 複製�果(_C) Customize Keypad Buttons 自定義�盤按鈕 _Preferences �好設定(_P) _Mode 模�(_M) Number Base 數字進制 Select Result and Expression Base… �擇�果和表��進制… Binary 二進制 Octal 八進制 Decimal �進制 Duodecimal �二進制 Hexadecimal �六進制 Other… 其他… Sexagesimal 六�進制 Time Format 時間格� Roman Numerals 羅馬數字 Numerical Display 數值顯示 Normal 常� Engineering 工程 Scientific 科學 Purely Scientific 純科學 Simple 簡單 Off: 1/7 ≈ 0.14285714 On: 1/7 = 0.142857 142857... 關: 1/7 ≈ 0.14285714 開: 1/7 = 0.142857 142857... Indicate Repeating Decimals 指示循環�數 Show Ending Zeroes 顯示�尾的零 Off: 2.5 ≈ 3, 1.5 ≈ 2 On: 2.5 ≈ 2, 1.5 ≈ 2 關: 2.5 ≈ 3, 1.5 ≈ 2 開: 2.5 ≈ 2, 1.5 ≈ 2 Round Halfway Numbers to Even 中數約至�數 Off: -x + y On: y - x 關: -x + y 開: y - x Sort Minus Last 減號排至末尾 Complex Rectangular Form 復矩形形� Complex Exponential Form 復指數形� Complex Polar Form 復極座標形� Complex Angle/Phasor Notation 復角/相�記號 Rational Number Form 有�數形� 1/3 ≈ 0.33333 1/3 ≈ 0.33333 Decimal Fractions �數 3/9 = 1/3 6/4 = 1.5 3/9 = 1/3 6/4 = 1.5 Exact Decimal Fractions 精確�數 6/4 = 3/2 6/4 = 3/2 Simple Fractions 簡單分數 6/4 = 1+1/2 6/4 = 1+1/2 Mixed Fractions 混�分數 Interval Display �間顯示 Off: 1/2*pi ≈ 1.5707963 On: 1/2*pi = 0.5 pi 關: 1/2*pi ≈ 1.5707963 開: 1/2*pi = 0.5 pi Adaptive 自�應 Calculates an interval of possible values and keeps track of precision changes. 計算�能值的�間,並跟蹤精度變化。 Significant Digits 有效數字 Interval �間 Plus/Minus 加/減 Midpoint 中點 Unit Display 單�顯示 Do not use any prefixes in result �果�使用任何�綴 Show prefixes for primarily SI and CGS units. 顯示主�的SI和CGS單��綴。 Use prefixes for selected units 為所�單�使用�綴 Use prefixes also for currencies �貨幣也使用�綴 Use prefixs for all units �所有單�使用�綴 Enables automatic use of hekto, deka, deci and centi when prefixes is enabled 啟用�綴時,自動使用百���分和� Enable All SI Prefixes 啟用所有SI�綴 Enables automatic setting of prefix for denominator in addition to the numerator 除分�外,還�自動設置分�的�綴 Enable Denominator Prefixes 啟用分��綴 Off: J / K On: J * K^-1 關: J / K 開: J * K^-1 Negative Exponents 負指數 Off: (2 m)/s On: 2 (m/s) 關: (2 m)/s 開: 2 (m/s) Place Units Separately 單�放置單� No Additional Conversion 無�外�算 Convert to Optimal SI Unit �算為最優SI單� If enabled: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min 若啟用: 15 in = 1 ft + 3 in 3.2 h = 3 h + 12 min Convert to Mixed Units �算為混�單� Abbreviate Names 縮寫�稱 Enabled Objects 啟用�象 Variables 變� Units 單� Unknowns 未知數 Units in Physical Constants 物�常數單� If not enabled, treats all variables as unknown 若未啟用,則將所有變�視為未知 Calculate Variables 計算變� Disables/enables complex numbers in result �用/啟用�果中的複數 Allow Complex Result �許複數�果 Disables/enables infinite numbers in result �用/啟用�果中的無窮數 Allow Infinite Result �許無��果 Approximation 近似估算 Always Exact 總是精確 Try Exact 嘗試精確 Approximate 近似值 Interval Arithmetic �間�算 Interval Calculation �間計算 Variance Formula 方差公� Change angle unit used in trigonometric functions 改變三角函數中的角度單� Angle Unit 角度單� None 無 Assumptions ���設 Algebraic Mode 代數模� Assume that unknown denominators are non-zero �設未知分��零 Non-Zero Denominators �零分� Warn when unknown denominators are assumed non-zero �設未知分�為�零時發出警告 Warn About Denominators Assumed Non-Zero 警告分��定�零 Parsing Mode 解�模� Adaptive Parsing 自�應解� Parse Implicit Multiplication First 隱�乘法優先解� Conventional Parsing 常�解� Chain Syntax ��語法 RPN Syntax 逆波蘭�語法 Off: xy = x*y On: xy != x*y 關: xy = x*y 開: xy != x*y Limit Implicit Multiplication �制隱�乘法 Parse decimal numbers as approximate with precision equal to the number of digits. Off: 1.1 * 1.1 = 1.21 On: 1.1 * 1.1 ≈ 1.2 將�進制數解�為近似數,其精度等於�數。 關: 1.1 * 1.1 = 1.21 開: 1.1 * 1.1 ≈ 1.2 Read Precision 讀�精度 _Precision 精度(_P) _Decimals �數(_D) Calculate As You Type 輸入時計算 Chain Mode ��模� Activate the RPN stack. 激活RPN佇列。 RPN Mode 逆波蘭模� Meta Modes 元模� Save Mode… �存模�… Delete Mode… 刪除模�… Save Default _Mode �存默�模�(_M) Fu_nctions 函數(_n) _Variables 變�(_V) _Units 單�(_U) _Contents 內容(_C) Report a Bug 報告錯誤 Check for Updates 檢查更新 _About 關於(_A) Toggle minimal window 切�最�視窗 Calculation result 計算�果 _Keypad �盤(_K) Toggles persistent keypad (makes it possible to show keypad and history simultaneously) 切�常��盤(��時顯示�盤和歷�) _History 歷�(_H) C_onversion �算(_o) RPN Stack RPN佇列 Insert the selected value �入所�值 Insert the selected text �入所�文本 Copy the selected text 複製所�文本 Add the selected value(s) 加上所�值 Subtract the selected value(s) 減去所�值 Multiply the selected value(s) 乘以所�值 Divide the the selected value(s) 除以所�值 Raise to the power of the selected value 冪乘所�值 Calculate the square root of the selected value 計算所�值的平方根 History 歷� Subtract the top value from the second value 從第二值減去頂部值 Multiply the top two values 將頂部兩個值相乘 Divide the second value by the top value 將第二個值除以頂部值 Raise the second value to the power of the top value 將第二個值冪乘頂部值 Negate the top value (Ctrl+-) ��頂部值(Ctrl+-) Invert the top value �倒頂部值 Calculate the square root of the top value 計算頂部值的平方根 Calculate the sum of all values 計算所有值的和 Rotate the stack or move selected register up 循環佇列或上移�定暫存器 Rotate the stack or move selected register down 循環佇列或下移�定暫存器 Swap the two top values or move the selected value to the top of the stack 交�頂部兩個值或將所�值移到佇列頂 Copy the selected or top value to the top of the stack 將�定的或頂部值複製到佇列頂 Enter the top value from before the last numeric operation 輸入上次數值�作�的頂部值 Delete the top or selected value 刪除頂部值或所�值 Edit the selected value 編輯所�值 Clear the RPN stack 清空RPN佇列 Unit(s) and prefix to convert result to �算�果的單�和�綴 Convert �算 Continuous conversion 連續�算 Automatically convert result to the current unit expression as long as the conversion box is visible. ���算框�見,就自動將�果�算為當�單�表��。 Add prefix 添加�綴 If unit expression does not contain any prefixes, use optimal prefix. This can be overridden by prepending the unit expression with "?" or "0". 若單�表���包�任何�綴,則使用最優�綴。 這�以通�在單�表���加上 ? 或 0 來覆蓋。 Conversion �算 Show/hide programming keypad 顯示/隱�編程�盤 Exact 精確 Fraction 分數 Numerical display 數值顯示 Pure 純淨 Number base 數字進制 Time format 時間格� Roman 羅馬 sin sin cos cos tan tan ln ln Equals 等於 sqrt sqrt sum sum Unknown variable 未知變� mod mod mean mean Store result as a variable 將�果儲存為變� STO Standard calculator button. Do not use more than three characters. STO Convert number bases �算數字進制 Imaginary unit i (√-1) 虛數單� i (√-1) Manage units 管�單� Conversion operator �算�算符 Kilogram �克 Two's complement input 二的補碼輸入 Two's complement output 二的補碼輸出 Bitwise Exclusive OR 按�異或 Bitwise Left Shift 按�左移 Bitwise Right Shift 按��移 Floating point conversion 浮點�算 Show/hide left keypad 顯示/隱�左��盤 Show/hide right keypad 顯示/隱����盤 DEL Standard calculator button. Do not use more than three characters. DEL AC Standard calculator button. Do not use more than three characters. AC Previous result �一�果 ANS Standard calculator button. Do not use more than three characters. ANS EXP EXP Add to Expression 添加到表�� Persistent Keypad 常��盤 Edit 編輯 Delete 刪除 Update 更新 Insert Value �入值 Insert Text �入文本 Insert Parsed Text �入已解�文本 Copy 複製 Copy Full Text 複製全文 Search… �索… Add Bookmark… 添加書籤… Bookmarks 書籤 Protect �護 Move To Top 移動到頂部 Remove 移除 Clear All 全部清除 _Copy 複製(_C) _Store… 儲存(_S)… Save Image… �存圖�… _Factorize 因�分解(_F) _Expand 展開(_E) _Normal 常�(_N) Sc_ientific 科學(_i) Purel_y Scientific 純科學(_y) Simp_le 簡單(_l) _Binary 二進制(_B) _Octal 八進制(_O) _Decimal �進制(_D) _Hexadecimal �六進制(_H) Decimal Fraction �進分數 Exact Decimal Fraction 精確�進分數 Simple Fraction 簡單分數 Mixed Fraction 混�分數 _Abbreviate Names 縮寫�稱(_A) C_onvert… �算…(_o) Convert to Base _Units �算為基本單�(_U) Convert _to Optimal Unit �算為最優單�(_t) Use Optimal Prefix 使用最優�綴 Convert to �算為 Convert to UTC �算為UTC Convert to Calendars �算為日曆 Use prefixes for all units �所有單�使用�綴 Enable All SI Prefi_xes 啟用所有SI�綴(_x) View/Edit Matrix 查看/編輯矩陣 View/Edit Vector 查看/編輯矢� Copy Text 複製文本 To Top 到頂部 Swap 交� Up �上 Down �下 Negate �� Invert �倒 Square 平方 Square Root 平方根 Clear Stack 清空佇列 Select Number Base… �擇數字進制… Store result 儲存�果 Add result Add current result to variable value 加上�果 Subtract result Subtruct current result from variable value 減去�果 Insert the matrix/vector into the expression 將矩陣/���入表�� Rows 行 Number of rows in this matrix (rows displayed for vectors) 此矩陣的行數(��顯示的行) Columns 列 Number of columns in this matrix (columns displayed for vectors) 此矩陣的列數(��顯示的列) If this is a matrix or vector 若這是矩陣或�� Elements 元素 Current element: 當�元素: Edit Matrix 編輯矩陣 Do not create/modify this matrix/vector �創建/修改此矩陣/�� Create/modify the matrix/vector 創建/修改矩陣/�� Accept the creation/modification of this matrix/vector 接�此矩陣/��的創建/修改 Name used to reference this variable in expressions 用於在表��中引用的變�� Names �稱 Add new name 添加新�稱 Apply changes to the selected name 將更改應用於所��稱 Remove the selected name 刪除所��稱 Abbreviation 縮寫 Unicode Unicode Plural 複數 Suffix 後綴 Reference �考 Avoid input ��輸入 Case sensitive �分大�寫 Completion only 僅補全 Number Bases 數字進制 Roman numerals 羅馬數字 BIN BIN OCT OCT DEC DEC DUO DUO HEX HEX ROM ROM Subtract 減 Multiply 乘 Divide 除 Bitwise AND 按�與 Bitwise OR 按�或 Bitwise NOT 按�� Clear 清除 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 輸入兩個值,其中最多一個是百分比,其他值會幫你計算。 Percentage 百分比 Calculate 計算 Value 1 甲值 2 compared to 1 乙相比於甲 Change from 1 to 2 甲轉變為乙 Value 2 乙值 1 compared to 2 甲相比於乙 Change from 2 to 1 乙轉變為甲 Plot 作圖 _Save �存(_S) Save as png, svg, postscript, eps, latex or fig �存為png,svg,postscript,eps,latex或fig Vector/matrix ��/矩陣 Paired matrix ��矩陣 if you want to split matrix in rows instead of columns 若�按行而�是按列拆分矩陣 X variable X變� The variable name used in expression 表��中使用的變�� Style 風格 Line 線 Points 點 Line with points 點+線 Boxes/bars 框/� Histogram 直方圖 Steps 步驟 Candlesticks K線圖 Dots 點 Smoothing 平滑 Monotonic 單調 Natural cubic splines 自然三次樣� Bezier �塞爾 Bezier (monotonic) �塞爾(單調) Y-axis Y軸 Primary 主座標軸 Secondary 次座標軸 _Remove 移除(_R) Data 數據 Minimum x value 最�x值 Maximum x value 最大x值 Sampling rate 採樣率 Step size 步長 Function Range 函數範� Display grid 顯示網格 Display full border 顯示完整邊框 Minimum y value 最�y值 Maximum y value 最大y值 Logarithmic x scale �數x刻度 Logarithmic y scale �數y刻度 X-axis label X軸標籤 Y-axis label Y軸標籤 Line width 線寬 Color display 彩色顯示 Color �色 Monochrome 單色 Legend placement 圖例�置 Top-left 左上 Top-right �上 Bottom-left 左下 Bottom-right �下 Below 下� Outside 外� Appearance 外觀 Precision 精確度 _Recalculate �新計算(_R) Recalculate expression �新計算表�� The number of significant digits to display/calculate (simple arithmetics are always calculated exact) �顯示/計算的有效�數(簡單�算總是精確計算) Preferences �好設定 Save mode on exit 退出時�存模� If the mode of the calculator shall be restored 若��復計算機模� Save definitions on exit 退出時�存定義 If changes to functions, units and variables shall be saved automatically 若�函數�單�和變�在發生變化時自動�存 Clear history on exit 退出時清除歷�記錄 Allow multiple instances �許多個實例 Allow multiple instances of the Qalculate! main window to be open at the same time. Note that only the mode, history and definitions of the last closed instance will be saved. �許�時打開 Qalculate! 主視窗的多個實例。 請注�,�有最後關閉的實例模��歷�和定義會被�存。 Notify when a new version is available 當有新版本時通知我 Use keyboard keys for RPN 用�盤��作RPN Use keyboard operator keys for RPN operations (+-*/^). 使用�盤�作�進行RPN�作(+-*/^)。 Use caret for bitwise XOR �入符號(^)作為按�異或 Input XOR (⊻) using caret (^) on keyboard (otherwise use Ctrl+^). The exponentiation operator (^) can always be input using Ctrl+*. 使用�盤上的�入符(^)輸入XOR (⊻)(�則使用Ctrl+^)。指數�算符(^)總是�以用Ctrl+*輸入。 Add calculate-as-you-type result to history �歷�記錄中添加“輸入時計算�的�果。 Delay: 延時: Time limit for plot: 作圖時間�制: Behavior 行為 Enable Unicode symbols 啟用Unicode符號 Disable this if you have problems with some fancy characters 若您覺得�些花哨的字符有�題,請�用此功能 Ignore system language (requires restart) 忽略系統語言(需��啟) Use system tray icon 使用系統托盤圖標 Hides the application in the system tray when the main window is closed 當主視窗關閉時,將應用程�隱�在系統托盤中 Hide on startup 啟動時隱� Remember window position 記�視窗�置 Application name 應用程��稱 Result �果 Application name + result 應用程��稱+�果 Mode 模� Application name + mode 應用程��稱+模� Window title 視窗標題 Default 默�值 Number of expression lines 表��行數 3 3 Display expression status 顯示錶��狀態 If as-you-type expression status shall be displayed below the expression entry 若�在表��框下方顯示錶���入狀態 Persistent keypad 常��盤 Look & Feel 外觀 Binary two's complement representation 二進制二的補碼錶示 If two's complement representation shall be used for negative binary numbers. 若��負二進制數應用二的補碼錶示法。 Hexadecimal two's complement representation �六進制二進制補碼錶示 If two's complement representation shall be used for negative hexadecimal numbers. 若��負�六進制數應用二的補碼錶示法。 Use lower case letters in non-decimal numbers ��進制數使用�寫 If lower case letters should be used in numbers with non-decimal base 若�在��進制數字中使用�寫字� Alternative base prefixes ��進制�綴 If hexadecimal numbers shall be displayed with "0x0" and binary numbers with "0b00" as prefixes 若��六進制數以“0x0�為�綴,二進制數以“0b00�為�綴 Spell out logical operators 拼出�輯�算符 If logical and/or shall be displayed as "&&"/"||" or "and"/"or" 若��輯與/或應顯示為 &&/|| 或 and/or If "e" shall be used instead of "E" in numbers 若�在數字中以e代替E Use E-notation instead of 10<sup><i>n</i></sup> 使用E符號代替10<sup><i>n</i></sup> Use lower case "e" (as in 1e10) 使用�寫e(如1e10) Use 'j' as imaginary unit 用 j 作虛數單� Use 'j' (instead of 'i') as default symbol for the imaginary unit, and place it in front the imaginary part. 將j(而�i)作為虛部默�符號並放在虛部��。 Use comma as decimal separator 將逗號作為�數分隔符 Allow dots, '.', to be used as thousands separator instead of as an alternative decimal sign �許使用點“.�作為��分隔符而��數點符號。 Ignore comma in numbers 忽略數字中的逗號 Allow commas, ',', to be used as thousands separator instead of as an function argument separator �許將逗號“,�作為��分隔符而�函數�數分隔符 Ignore dots in numbers 忽略數字中的點 Digit grouping 數字分節 off 關 standard 標準 local 本地 Multiplication sign 乘號 Division sign 除號 Copy digit separator 複製數字分隔符 Deactivate to remove digit separator when copying result 複製�果時�用以去除數字分隔符 Numbers & Operators 數字和�算符 Use binary prefixes for information units 訊�單�使用二進制�綴 Use binary, instead of decimal, prefixes by default for information units (e.g. bytes). �於訊�單�(例如字節),默�情�下使用二進制而��進制�綴。 Conversion to local currency �算為本地貨幣 Automatically convert to the local currency when optimal unit conversion is activated. 激活最優單��算時,自動�算為本地貨幣。 Update exchange rates on start 啟動時更新匯率 If current exchange rates shall be downloaded from the internet at program start 若�在程�啟動時從網上下載最新匯率 Exchange rates updates 匯率更新 Temperature calculation mode: 溫度計算模�: Absolute 絕� Relative 相� Hybrid 混� Units & Currencies 單�和貨幣 Show expression completion suggestions 顯示錶��補全建議 Search titles and countries �索標題和國家/地� Minimum characters 最少字符 Popup delay (ms) 彈出延�(ms) Completion 補全 Status warning color 警告狀態�色 Status error color 錯誤狀態�色 Custom status font 自定義狀態字體 If you want to use a font other than the default in the status display below the expression entry 若�在表��框下方的狀態顯示中使用默�字體以外的字體 Custom expression font 自定義表��字體 If you want to use a font other than the default in the expression entry 若�在表��框中使用默�字體以外的字體 Custom result font 自定義�果字體 If you want to use a font other than the default in the result display 若�在�果顯示中使用默�字體以外的字體 Custom keypad font 自定義�盤字體 If you want to use a font other than the default in the keypad 若�在�盤中使用默�字體以外的字體 Custom application font 自定義應用程�字體 If you want to use a font other than the default for the whole application 若�整個應用程�使用默�字體以外的字體 Text color 文字�色 Fonts & Colors 字體與�色 Other: 其他: Bijective base-26 Bijective base-26 <b>Result Base</b> <b>�果進制</b> <b>Expression Base</b> <b>表��進制</b> New Keyboard Shortcut 新建�盤快�� Edit Variable 編輯變� Advanced 高級 Accept the creation/modification of this variable 接�此變�的創建/修改 x, y, z x, y, z Use x, y and z for 1st, 2nd and 3rd function argument, respectively. 分別使用x,y和z作為第一個,第二個和第三個函數�數。 \x, \y, \z \x, \y, \z Use \x, \y and \z for 1st, 2nd and 3rd function argument, respectively. This avoids potential conflicts with variables, functions and units. 分別使用\x,\y和\z作為第一,二和三個函數�數。這能��和變�,函數和單�的潛在��。 Edit Unit 編輯單� Do not create/modify this unit �創建/修改此單� Accept the creation/modification of this unit 接�此單�的創建/修改 Singular form of this unit's name 該單��稱的單數形� Title displayed in menus and in unit manager �單和單�管�器中顯示的標題 System 系統 Imperial 英制 US Survey 美製 Hide unit 隱�單� If this unit shall be hidden in menus 若�該單�在�單中隱� Class 類 The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此單�所屬的類。命�派生單�是相�於一個單一的其他單�而定義的,�以帶有指數,而(未命�)派生單�是由�一個或多個單�的單�表��定義的。 Base unit 基本單� Named derived unit 命�派生單� Derived unit 派生單� Base unit(s) 基本單� Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit as defined in relation to 該單�(�於命�派生單�)或單�表��(�於未命�派生單�)的定義所關�(基於)的單� Exponent 指數 Exponent of the base unit 基本單�的指數 Relation 關係 Relation to the base unit. For linear relations this should just be a number. For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 與基本單�的關係。 �於線性關係,這應該�是一個數字。 �於�線性關係,用\x表示因�,用\y表示指數(例如,“\x + 273.15�表示��度和開爾文之間的關係)。 Relation is exact 精確關係 If the relation is precise 若關係是精確的 Inverse relation 逆關係 Specify for non-linear relation, for conversion back to the base unit. 指定�線性關係,以便�算回基本單�。 Mix with base unit 與基本單�混� - Decides which units the base unit is mixed with if multple options exist. - The original unit will not be mixed with units with lower priority. - A lower value means higher priority. - 若存在多個�項,決定基本單�與哪些單�混�。 - 原單��會與優先級較低的單�混�。 - 數值越低表示優先級越高。 Priority 優先級 Minimum base unit number 最�基本單�數 Use with prefixes by default 默�使用�綴 Create a new unit 創建新單� Edit the selected unit 編輯所�單� Insert the selected unit into the expression entry 將所�單��入表��框 C_onvert �算(_o) Convert the result to the selected unit 將�果�算到所�單� Delete the selected unit 刪除所�單� (De)activate the selected unit (�消)激活所�單� _Unit 單�(_U) Convert between units 在單�間�算 = = Conver_sion �算(_s) Converted value �算後的值 Value to convert from �算�的值 Type anywhere 在任何地方輸入 Edit Unknown Variable 編輯未知變� Do not create/modify this unknown variable �創建/修改此未知變� Accept the creation/modification of this unknown variable 接�此未知變�的創建/修改 Name used to reference this unknown variable in expressions 用於在表��中引用此未知變�的�稱 Use custom assumptions 使用自定義�設 Type 類型 Real Number 實數 Rational Number 有�數 Sign 符號 The category this unknown variable belongs to 此未知變�所屬的類別 Value of this variable (expression) 此變�的值(表��) value is exact 精確值 If the value is precise 若該值是精確的 The category this variable belongs to 此變�所屬的類別 Create a new variable 創建新變� Edit the selected variable 編輯所�變� Insert the selected variable into the expression entry 將所�變��入表��項 Delete the selected variable 刪除所�變� (De)activate the selected variable (�消)激活所�變� E_xport 導出(_x) _Variable 變�(_V) Execute expressions and commands from a file 執行文件中的表��和命令 Start a new instance of the application 啟動一個新的程�實例 Display the application version 顯示應用程�版本 Specify the window title 指定視窗標題 TITLE TITLE Expression to calculate �計算的表�� [EXPRESSION] [EXPRESSION] Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上��入一個數學表��,例如“5+2/3�, 然後按Enter�。</span> ans ans Last Answer 上一答案 answer 答案 Answer 2 答案二 Answer 3 答案三 Answer 4 答案四 Answer 5 答案五 Memory 存值 Failed to load global definitions! 加載全局定義失敗� c-format All if no category has been selected (previously selected has been renamed/deleted), select "All" 全部 By default, only one instance (one main window) of %s is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default bahvior and allow multiple simultaneous instances? 默�情�下,��許打開%s的一個實例(一個主視窗)。 若�時打開多個實例,�有最後一個關閉視窗的定義(變��函數等)�模���好和歷�記錄會被�存。 儘管這樣,你是�想改變默�的行為,�許�時打開多個實例? c-format Right-click/long press: %s ��/長按: %s c-format Right-click: %s ��: %s c-format Middle-click: %s 中�: %s c-format Cycle through previous expression 在��的表��中循環 Move cursor left or right �左或��移動光標 Move cursor to beginning or end 將光標移動到開頭或末尾 Uncertainty/interval �確定度/�間 Relative error 相�誤差 Argument separator �數分隔符 Blank space 空白處 New line 新建行 Smart parentheses 智能括號 Vector brackets ��括號 Left parenthesis 左括號 Left vector bracket 左��括號 Right parenthesis �括號 Right vector bracket ���括號 Decimal point �數點 Raise (Ctrl+*) 冪(Ctrl+*) Add 加 M+ (memory plus) M+(存值加上) MC (memory clear) MC(存值清除) Backspace 退格� M− (memory minus) M−(存值減去) Previous result (static) �一個�果(�態) Calculate expression 計算表�� MR (memory recall) MR(存值讀�) MS (memory store) MS(存值存入) Set unknowns 設置未知數 more Show further items in a submenu 更多 Logical AND �輯與 Logical OR �輯或 Logical NOT �輯� Toggle Result Base 切��果進制 Open menu with stored variables 打開儲存變�的�單 Index 索引 ENTER RPN Enter (calculate and add to stack) ENTER Calculate expression and add to stack 計算表��並添加到佇列 Flag 標誌 Matrices 矩陣 Gregorian 格里高利曆(公曆/陽曆) Revised Julian (Milanković) 修訂儒略曆(Milanković) Julian 儒略曆 Islamic (Hijri) 伊斯蘭曆(回曆/Hijri) Hebrew 希伯來曆(猶太曆) Chinese 中國曆(農曆/陰曆) Persian (Solar Hijri) 波斯歷(Solar Hijri) Coptic 科普特歷(Coptic) Ethiopian 埃塞俄比亞歷(Ethiopian) Indian (National) �度歷(國立) Action 動作 Key combination 組�� Raise 冪 History Answer Value 歷�答案 History Index(es) 歷�索引 History index %s does not exist. 歷�索引 %s �存在。 c-format expression expression History Parsed Expression 已解�表�� Set Window Title 設置視窗標題 Failed to open %s. %s 無法打開 %s 。 %s c-format Could not display help for Qalculate!. 無法顯示 Qalculate! 的幫助。 Could not display help for Qalculate!. %s 無法顯示 Qalculate! 的幫助。 %s c-format approx. 約 Stop process �止進程 Clear expression 清除表�� EXACT EXACT APPROX APPROX RPN RPN CHN Chain mode CHN ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Do you wish to update the exchange rates now? 您想�在更新匯率嗎? It has been %s day since the exchange rates last were updated. �上次更新匯率已�了%s天。 c-format It has been %s days since the exchange rates last were updated. Do not ask again ��詢� It took too long to generate the plot data. 生�繪圖數據的時間太長。 It took too long to generate the plot data. Please decrease the sampling rate or increase the time limit in preferences. 生�繪圖數據的時間太長。 請�低採樣率或增加�好設定中的時間�制。 When errors, warnings and other information are generated during calculation, the icon in the upper right corner of the expression entry changes to reflect this. If you hold the pointer over or click the icon, the message will be shown. 當計算�程中產生錯誤�警告和其他訊�時,表��框�上角的圖標會發生變化以�映。此時�以長按鼠標或點擊圖標來顯示訊�。 Path of executable not found. 未找到�執行文件的路徑。 curl not found. 未找到 curl。 Failed to run update script. %s �行更新腳本失敗。 %s c-format Failed to check for updates. 無法檢查更新。 No updates found. 無更新。 A new version of %s is available at %s. Do you wish to update to version %s. %s 的新版本�在 %s �得。 是��更新到版本 %s 。 c-format A new version of %s is available. You can get version %s at %s. %s 有�用的新版本 %s。 您�以在 %s ��。 c-format Too many arguments for %s(). %s()的�數太多。 c-format argument �數 Temperature Calculation Mode 溫度計算模� The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表�方�有歧義。 請�擇溫度計算模� (以後�以在�好設置中更改)。 Uncategorized 未分類 hexadecimal �六進制 octal 八進制 decimal �進制 duodecimal �二進制 binary 二進制 roman 羅馬 bijective 雙射 sexagesimal 六�進制 latitude 緯度 longitude 經度 time 時間 bases 進制 calendars 日曆 rectangular 矩形 cartesian 笛�爾 exponential 指數型 polar 極座標 angle 角度 phasor 相� optimal 最優 base 基本 mixed 混� fraction 分數 factors 因� partial fraction 部分分� factorize 分解 expand 展開 hexadecimal number �六進制數 octal number 八進制數 decimal number �進制數 duodecimal number �二進制數 binary number 二進制數 roman numerals 羅馬數字 bijective base-26 雙射基-26 sexagesimal number 六進制數 32-bit floating point 32�浮點 64-bit floating point 64�浮點 16-bit floating point 16�浮點 80-bit (x86) floating point 80�(x86)浮點 128-bit floating point 128�浮點 time format 時間格� number bases 數字進制 optimal unit 最優單� base units 基本單� mixed units 混�單� expanded partial fractions 已展開部分分� complex rectangular form 復矩形形� complex exponential form 復指數形� complex polar form 復極座標形� complex cis form 復純虛數指數(cis)形� complex angle notation 復角記號 complex phasor notation 復相�記號 UTC time zone UTC時� number base %s 數字進制 %s c-format Inactive �常用 Retrieves data from the %s data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 從 %s 數據集中檢索與所給�象和屬性相關的數據。若將“info��入為屬性,則會彈出一個包�該�象的所有屬性的�話框視窗。 c-format Example: 示例: Arguments �數 optional optional argument �� default: argument default, in description 默�值: Requirement �求 key indicating that the property is a data set key � Acti_vate 激活(_v) a previous result 一個先�的�果 matrix 矩陣 vector �� positive 正數 non-positive �正數 negative 負數 non-negative �負數 non-zero �零 boolean 布林值 integer 整數 rational 有�數 real 實數 complex 複數 number 數 (not matrix) (�矩陣) unknown 未知 default assumptions 默��設 Variable does not exist anymore. 變���存在。 Data Retrieval Function 數據檢索函數 Insert function �入函數 Insert function (dialog) �入函數(�話框) Insert variable �入變� Insert unit �入單� Insert text �入文本 Insert date �入日期 Insert vector �入�� Insert matrix �入矩陣 Insert smart parentheses �入智能括號 Convert to unit �算為單� Convert to unit (entry) �算為單�(輸入框) Convert to optimal unit �算為最優單� Convert to base units �算為基本單� Convert to optimal prefix �算為最優�綴 Convert to number base �算為數字進制 Factorize result 分解�果 Expand result 展開�果 Expand partial fractions 展開部分分� RPN: down RPN: �下 RPN: up RPN: �上 RPN: swap RPN: 交� RPN: copy RPN: 複製 RPN: lastx RPN: lastx RPN: delete register RPN: 刪除暫存器 RPN: clear stack RPN: 清空佇列 Load meta mode 加載元模� Set expression base 設置表��進制 Set result base 設置�果進制 Toggle exact mode 切�精確模� Set angle unit to degrees 將角度單�設為度 Set angle unit to radians 將角度單�設為弧度 Set angle unit to gradians 將角度單�設為梯度 Toggle simple fractions 切�簡單分數 Toggle mixed fractions 切�混�分數 Toggle scientific notation 切�科學記數 Toggle simple notation 切�簡單記數 Toggle RPN mode 切�RPN模� Toggle calculate as you type 切��入時計算 Toggle programming keypad 切�編程�盤 Show keypad 顯示�盤 Show history 顯示歷�記錄 Search history �索歷�記錄 Show conversion 顯示�算 Show RPN stack 顯示RPN佇列 Manage variables 管�變� Manage functions 管�函數 Manage data sets 管�數據集 New variable 新建變� New function 新建函數 Open plot functions/data 打開函數/數據作圖 Open convert number bases 打開進制�算 Open floating point conversion 打開浮點�算 Open calender conversion 打開日曆�算 Open percentage calculation tool 打開百分比計算 Open periodic table 打開元素週期表 Update exchange rates 更新匯率 Copy result 複製�果 Save result image �存�果圖� Help 幫助 Quit 退出 Toggle chain mode 切���模� Prefixes �綴 No Prefix 無�綴 Optimal Prefix 最優�綴 Prefix �綴 Complex angle/phasor notation 復角/相�記號 Number bases 數字進制 Base units 基本單� Binary number 二進制數 Calendars 日曆 Complex cis form 復純虛數指數形� Decimal number �進制數 Duodecimal number �二進制數 Complex exponential form 復指數形� Factors 因� 16-bit floating point binary format 16�浮點二進制格� 32-bit floating point binary format 32�浮點二進制格� 64-bit floating point binary format 64�浮點二進制格� 80-bit (x86) floating point binary format 80�(x86)浮點二進制格� 128-bit floating point binary format 128�浮點二進制格� Hexadecimal number �六進制數 Latitude 緯度 Longitude 經度 Mixed units 混�單� Octal number 八進制數 Optimal units 最優單� Expanded partial fractions 展開部分分� Complex polar form 復極座標形� Complex rectangular form 復矩形形� Sexagesimal number 六�進制數 and 且 or 或 undefined 未定義 result is too long see history �果太長 查看歷�記錄 calculation was aborted 計算已中止 RPN Register Moved RPN暫存器已移動 RPN Operation RPN�作 Processing… 處�中… result processing was aborted �果處�已中止 Factorizing… 分解中… Expanding partial fractions… 展開部分分�… Expanding… 展開中… Calculating… 計算中… Converting… �算中… Fetching exchange rates. ��匯率。 Time zone parsing failed. 時�分�失敗。 Keep open ��打開狀態 Enter RPN Enter (calculate and add to stack) 開始 C_alculate 計算(_a) Apply to Stack 應用於佇列 Argument �數 True 真 False � Info 訊� Edit Unit (global) 編輯單�(全局) New Unit 新建單� Empty name field. �稱字段為空。 A variable or unit with the same name already exists. Do you want to overwrite it? unit with the same name exists -- overwrite or open the dialog again 已存在��的變�或單�。 是��覆蓋它? Base unit does not exist. 基本單��存在。 Edit Function (global) 編輯函數(全局) New Function 新建函數 Yes 是 No � Empty expression field. 表��字段為空。 A function with the same name already exists. Do you want to overwrite the function? function with the same name exists -- overwrite or open the dialog againdataset with the same name exists -- overwrite or open the dialog again 已存在��函數。 是��覆蓋函數? Unit does not exist 單��存在 Edit Unknown Variable (global) 編輯未知變�(全局) New Unknown Variable 新建未知變� An unit or variable with the same name already exists. Do you want to overwrite it? unknown with the same name exists -- overwrite or open dialog againvariable with the same name exists -- overwrite or open dialog again 已存在��的單�或變�。 是��覆蓋它? Edit Variable (global) 編輯變�(全局) New Variable 新建變� Empty value field. 值字段為空。 Edit Vector 編輯�� Edit Vector (global) 編輯��(全局) New Vector 新建�� Edit Matrix (global) 編輯矩陣(全局) New Matrix 新建矩陣 Vector Result ���果 Matrix Result 矩陣�果 New Data Object 新建數據�象 text 文本 approximate 近似 Edit Data Set (global) 編輯數據集(全局) New Data Set 新建數據集 info 訊� Property 屬性 No file name entered. 未輸入文件�。 No delimiter selected. 未�擇分隔符。 Could not import from file %s 無法從文件導入 %s c-format No variable name entered. 未輸入變��。 No known variable with entered name found. 未找到所輸入�稱的已知變�。 Could not export to file %s 無法導出到文件 %s c-format My Variables 我的變� Couldn't write definitions 無法寫入定義 Preset �置 Abort 中止 Undo 撤消 Redo �� Completion Mode 補全模� Limited strict completion 有�嚴格補全 Strict completion 嚴格補全 Limited full completion 有�全�補全 Full completion 全�補全 No completion 無補全 Delayed completion 延�補全 Customize completion… 自定義補全… Save Mode �存模� Preset mode cannot be overwritten. 無法覆蓋�設模�。 Delete Mode 刪除模� Couldn't write preferences to %s 無法將�好設定寫入 %s c-format never 從� ask 詢� %i day %i天 c-format %i days Copied Result was copied 已複製 log10 function not found. 未找到函數log10。 Search �索 _Search �索(_S) Remove Bookmark 刪除書籤 Add Bookmark 添加書籤 A bookmark with the selected name already exists. Do you want to overwrite it? 已存在��的書籤。 是��覆蓋它? No items found 未找到�目 Select date �擇日期 Rectangular form 矩形形� Exponential form 指數形� Polar form 極座標形� Angle/phasor notation 角/相�記號 Optimal unit 最優單� Optimal prefix 最優�綴 All functions 所有函數 All variables 所有變� Select definitions file �擇定義文件 _Import 導入(_I) Could not copy %s to %s. 無法將%s複製到%s。 c-format Could not read %s. 無法讀� %s 。 c-format Could not copy file to %s. 無法將文件複製到 %s 。 c-format Unsupported base. �支�該進制。 The selected Chinese year does not exist. 所�的農曆年份�存在。 Conversion to Gregorian calendar failed. �算為公曆失敗。 Calendar conversion failed for: %s. 日曆�算失敗: %s。 c-format Gnuplot was not found. 未找到gnuplot。 %s (%s) needs to be installed separately, and found in the executable search path, for plotting to work. %s (%s) 需�單�安�,並在�執行的�索路徑中找到,�能進行繪圖。 c-format Select file to save PNG image to 將PNG圖��存為 Allowed File Types �許的文件類型 All Files 所有文件 Cannot delete unit as it is needed by other units. do not delete units that are used by other units 無法刪除單�,因為它被其他單��賴。 none 無 result is too long �果�長 translator-credits tuberry <orzun@foxmail.com> Mode not found. 未找到模�。 Elements (in horizontal order) 元素(按水平順�) Select file to import �擇�導入的文件 _Open 打開(_O) Select file to export to �擇導出到文件 A conflicting object with the same name exists. If you proceed and save changes, the conflicting object will be overwritten or deactivated. Do you want to proceed? 存在��的���象。 若繼續並�存更改,���象將被覆蓋或�用。 你想繼續嗎? Set key combination 設置組�� Press the key combination you wish to use for the action (press Escape to cancel). Make the line reasonably long, but not to short (at least around 40 characters) 按�用於�作的組�� (按Escape�消)。 No keys 未按� Empty value. 值為空。 Function not found. 未找到函數。 Variable not found. 未找到變�。 Unit not found. 未找到單�。 The key combination is already in use. Do you wish to replace the current action? 組��已被佔用。 是��替�當��作? Select file to export �擇�導出的文件 Empty expression. 表��為空。 Empty x variable. x變�為空。 Element Data 元素數據 Classification 分類 Alkali Metal 鹼金屬 Alkaline-Earth Metal 鹼土金屬 Lanthanide 鑭系元素 Actinide 錒系 Transition Metal �渡金屬 Metal 金屬 Metalloid 類金屬 Polyatomic Non-Metal 多原��金屬 Diatomic Non-Metal 雙原��金屬 Noble Gas 惰性氣體 Unknown chemical properties 未知化學性質 No unknowns in result. �果中沒有未知數。 Set Unknowns 設置未知數 Copy result to clipboard 將�果複製到剪貼簿 x x If a matrix or vectors shall be generated from the contents of the file 若�從文件內容生�矩陣或�� Use dark theme 使用深色主題 Add the two top values Keypad 將頂部兩個值相加 u Manage units button u to Button for convert to operator to Add Keypad 加 ArgumentEditDialog Name: �稱: Type: 類型: Free 任� Number 數字 Integer 整數 Symbol 符號 Text 文字 Date 日期 Vector �� Matrix 矩陣 Boolean 布林 Angle 角度 Object 物件 Function 函數 Unit 單� Variable 變數 File 檔案 Enable rules and type test 啟用�則和類型測試 Custom condition: 自訂�件: For example if argument is a matrix that must have equal number of rows and columns: rows(\x) = columns(\x) 例如,如果引數是必須具有相等列數和行數的矩陣: rows(\x) = columns(\x) Allow matrix �許矩陣 Forbid zero �用零 Handle vector 處置�� Calculate function for each separate element in vector. ���中�個單�元素計算函數。 Min 最�值 Include equals 包�等於 Max 最大值 CSVDialog Import CSV File 匯入CSV檔 Export CSV File 匯出CSV檔 Current result 目��果 Matrix/vector variable: 矩陣/��變數: File: 檔案: Import as 匯入為 matrix 矩陣 vectors �� Name: �稱: First row: 第一列: Includes headings 包�標題 Delimiter: 定界符: Comma 逗號 Tabulator Tab Semicolon 分號 Space 空格 Other 其他 Question �題 A unit or variable with the same name already exists. Do you want to overwrite it? 具有相��稱的單�或變數已存在。 你想覆寫它嗎? Error 錯誤 Could not import from file %1 無法從檔案匯入 %1 No matrix or vector variable with the entered name was found. 找�到具有輸入�稱的矩陣或��變數。 Could not export to file %1 無法匯出到檔案 %1 CalendarConversionDialog Calendar Conversion 曆法轉� Gregorian 格里曆 Hebrew 希伯來曆 Islamic (Hijri) 伊斯蘭曆(Hijri) Persian (Solar Hijri) 伊朗曆(Solar Hijri) Indian (National) �度曆(國定) Chinese 農曆 Julian 儒略曆 Revised Julian (Milanković) 儒略改�曆(Milanković) Coptic 科普特曆 Ethiopian 衣索比亞曆 Error 錯誤 The selected Chinese year does not exist. �擇的農曆年�存在。 Conversion to Gregorian calendar failed. 轉�到格里曆失敗。 Calendar conversion failed for: %1. 曆法轉�失敗: %1。 DataObjectEditDialog %1: %1: Default �設 Approximate 近似 Exact 精確 Edit Data Object 編輯資料物件 New Data Object 新資料物件 DataPropertyEditDialog Name: �稱: Title: 標題: Descriptive name: �述性�稱: Description: �述: Value type: 值類型: Expression 表�� Number 數字 Text 文字 Unit expression: 單�表��: Use as key 作為� Case sensitive value �分大�寫的值 Approximate value 近似值 Value uses brackets 值使用括號 Hide 隱� Edit Data Property 編輯資料屬性 DataSetEditDialog General 一般 Properties 屬性 Function 函數 Title: 標題: Descriptive name: �述性�稱: Data file: 資料檔案: Description: �述: Copyright: 版權: Title 標題 Name �稱 Type 類型 Add 加入 Edit 編輯 Remove 移除 Name: �稱: Object argument name: 物件引數�稱: Property argument name: 屬性引數�稱: Default property: �設屬性: text 文字 approximate 近似 number 數字 expression 表�� key � Question �題 A function with the same name already exists. Do you want to overwrite the function? 具有相��稱的函數已存在。 你想覆寫函數嗎? Data Sets 資料集 Object 物件 Property 屬性 Edit Data Set 編輯資料集 New Data Set 新資料集 DataSetsDialog Data Sets 資料集 Data sets: 資料集: New… 新增… Edit… 編輯… Delete 刪除 Objects: 物件: Data set description: 資料集�述: Object attributes: 物件屬性: Properties 屬性 key � Data Retrieval Function 資料檢索函數 argument 引數 ExpressionEdit matrix 矩陣 vector �� positive 正數 non-positive �正數 negative 負數 non-negative �負數 non-zero �零數 boolean 布林 integer 整數 rational 有�數 real 實數 complex 複數 number 數字 (not matrix) (�矩陣) unknown 未知數 default assumptions �設�設 Prefix: �綴: Complex Angle/Phasor Notation 複數角度/相�記法 Base units 基本單� Number Base 底數 Binary-Coded Decimal 二進碼�進數 Bijective Base-26 雙射二�六進制 Binary Number 二進制數字 Calendars 曆法 Complex cis Form 複數cis形� Decimal Number �進制數字 Duodecimal Number �二進制數字 Complex Exponential Form 複數指數形� Factors 因� 16-bit Floating Point Binary Format 16�元浮點二進制格� 32-bit Floating Point Binary Format 32�元浮點二進制格� 64-bit Floating Point Binary Format 64�元浮點二進制格� 80-bit (x86) Floating Point Binary Format 80�元(x86)浮點二進制格� 128-bit Floating Point Binary Format 128�元浮點二進制格� Fraction 分數 Decimal Fraction �數 Hexadecimal Number �六進制數字 Latitude 緯度 Longitude 經度 Mixed Units 混�單� Octal Number 八進制數字 Optimal Unit 最佳單� Optimal Prefix 最佳�綴 Expanded Partial Fractions 展開部分分� Complex Polar Form 複數極�標形� Complex Rectangular Form 複數直角座標形� Roman Numerals 羅馬數字 Sexagesimal Number 六�進制數字 Time Format 時間格� Unicode Unicode UTC Time Zone UTC時� Scientific Notation 科學記法 Simple Notation 簡單記法 Custom 自訂 Undo 復原 Redo �� Cut 剪下 Copy 複製 Paste 貼上 Delete 刪除 Calculate Selection 計算�擇 Insert Date… �入日期… Insert Matrix… �入矩陣… Select All 全� Clear 清除 Clear History 清除歷�記錄 Completion 補全 No completion 沒有補全 Limited strict completion 有�嚴格補全 Strict completion 嚴格補全 Limited full completion 有�完全補全 Full completion 完全補全 Delayed completion 延�補全 Expression Status 表��狀態 Off Off In history list 在歷�記錄列表中 In expression field 在表��欄�中 In status bar 在狀態列中 With delay 有延� With adaptive delay 自�應延� Without delay 無延� Automatically calculate selection 自動計算�擇 Use input method 使用輸入法 Matrix 矩陣 Too many arguments for %1(). %1()的引數太多。 argument 引數 %1: %1: comment 註解 MC (memory clear) MC(記憶清除) MS (memory store) MS(記憶儲存) M+ (memory plus) M+(記憶加上) M− (memory minus) M−(記憶減去) factorize 分解為因� expand 展開 hexadecimal �六進制 hexadecimal number �六進制數字 octal 八進制 octal number 八進制數字 decimal �進制 decimal number �進制數字 duodecimal �二進制 duodecimal number �二進制數字 binary 二進制 binary number 二進制數字 roman 羅馬 roman numerals 羅馬數字 bijective 雙射 bijective base-26 雙射二�六進制 binary-coded decimal 二進碼�進數 sexagesimal 六�進制 sexagesimal number 六�進制數字 latitude 緯度 longitude 經度 32-bit floating point 32�元浮點數 64-bit floating point 64�元浮點數 16-bit floating point 16�元浮點數 80-bit (x86) floating point 80�元(x86)浮點數 128-bit floating point 128�元浮點數 time 時間 time format 時間格� scientific 科學 scientific notation 科學記法 engineering 工程 engineering notation 工程記法 simple 簡單 simple notation 簡單記法 bases 底數 number bases 底數 calendars 曆法 optimal 最佳 optimal unit 最佳單� prefix �綴 optimal prefix 最佳�綴 base 基本 base units 基本單� mixed 混� mixed units 混�單� decimals �數 decimal fraction �數 fraction 分數 factors 因� Engineering Notation 工程記法 base base units 基本 partial fraction 部分分� expanded partial fractions 已展開部分分� rectangular 直角 cartesian 笛�兒 complex rectangular form 複數直角座標形� exponential 指數 complex exponential form 複數指數形� polar 極座標 complex polar form 複數極�標形� complex cis form 複數cis形� angle 角度 complex angle notation 複數角度記法 phasor 相� complex phasor notation 複數相�記法 UTC time zone UTC時� base number base 底數 number base %1 底數%1 Data object 資料物件 FPConversionDialog Floating Point Conversion (IEEE 754) 浮點轉�(IEEE 754) Format 格� 16-bit (half precision) 16�元(�精度) 32-bit (single precision) 32�元(單精度) 64-bit (double precision) 64�元(雙精度) 80-bit (x86 extended format) 80�元(x86擴充格�) 128-bit (quadruple precision) 128�元(四精度) Microchip 24-bit Microchip 32-bit Value 值 Decimal value �進制值 Binary representation 二進制表示法 Hexadecimal representation �六進制表示法 Floating point value 浮點值 Conversion error 轉�誤差 FunctionEditDialog Required 必� Details 細節 Description �述 Name: �稱: Expression: 表��: x, y, z x, y, z \x, \y, \z, \a, \b, … \x, \y, \z, \a, \b, … x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") x�y 和 z(例如“(x+y)/2�)或 \x�\y�\z�\a�\b�…(例如“(\x+\y)/2�) Use x, y, and z (e.g. "(x+y)/2"), or \x, \y, \z, \a, \b, … (e.g. "(\x+\y)/2") 使用x�y和z(例如"(x+y)/2"),或 \x�\y�\z�\a�\b�…(例如"(\x+\y)/2") Category: 類別: Descriptive name: �述性�稱: Hide function 隱�函數 Example: 範例: Description: �述: Condition: �件: Condition that must be true for the function (e.g. if the second argument must be greater than the first: "\y > \x") �函數來說必須為真的�件(例如,如果第二個引數必須大於第一個引數: "\y > \x") Sub-functions: �函數: Expression 表�� Precalculate �先計算 Reference �考 Add 加入 Edit 編輯 Remove 移除 Arguments: 引數: Name �稱 Type 類型 Warning 警告 Conversion (using "to") is not supported in functions. 在函數中�支�轉�(使用"to")。 Question �題 A function with the same name already exists. Do you want to overwrite the function? 具有相��稱的函數已存在。 你想覆寫函數嗎? Edit Function 編輯函數 New Function 新函數 FunctionsDialog Functions 函數 Category 類別 Function 函數 New… 新增… Edit… 編輯… Deactivate �用 Delete 刪除 Calculate… 計算… Apply 套用 Insert �入 Favorite 最愛 argument 引數 Retrieves data from the %1 data set for a given object and property. If "info" is typed as property, a dialog window will pop up with all properties of the object. 為給定的物件和屬性從%1資料集中檢索資料。如果將"info"�入為屬性,則將彈出一個具有物件所有屬性的�話視窗。 Example: 範例: Arguments 引數 optional optional argument �擇性 default: argument default �設: Requirement: Required condition for function 需求: Properties 屬性 %1: %1: key indicating that the property is a data set key � Activate 啟用 All All functions 全部 Uncategorized 未分類 User functions 使用者函數 Favorites 最愛 Inactive �活動 HistoryView Insert Value �入值 Insert Text �入文字 Copy 複製 Copy Formatted Text 複製格�化文本 Copy unformatted ASCII 複製未格�化的ASCII Select All 全� Search… �尋… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. <span font="10">在上��入一個數學表��,例如“5+2/3�, 然後按Enter�。</span> Search by Date… 按日期�尋… Type a mathematical expression above, e.g. "5 + 2 / 3", and press the enter key. 在上��入數學表��,例如"5 + 2 / 3",然後按Enter�。 Type a mathematical expression below, e.g. "5 + 2 / 3", and press the enter key. 在下��入數學表��,例如"5 + 2 / 3",然後按Enter�。 Exchange rate source(s): 匯率來�: updated %1 已更新%1 Comment 註解 Protect �護 Add Comment… 加入註解… Move to Top 移到頂部 Remove 移除 Clear 清除 Edit Comment… 編輯註解… Text: 文字: Search �尋 KeypadButton <i>Right-click/long press</i>: %1 <i>��/長按</i>: %1 <i>Right-click</i>: %1 <i>��</i>: %1 <i>Long press</i>: %1 <i>長按</i>: %1 Open menu 開啟�單 <i>Middle-click</i>: %1 <i>中�</i>: %1 KeypadWidget Memory store 記憶儲存 Memory clear 記憶清除 Memory recall 記憶喚回 Memory add 記憶加上 Memory subtract 記憶減去 STO Standard calculator button. Do not use more than three characters. STO Store 儲存 New function 新函數 sin sin cos cos tan tan Exponentiation 指數 Percent or remainder 百分比或餘數 Uncertainty/interval 誤差/�間 Relative error 相�誤差 Interval �間 Move cursor left �左移動游標 Move cursor to start 將游標移動到開頭 Move cursor right ��移動游標 Move cursor to end 將游標移動到�尾 Logical AND �輯AND Logical OR �輯OR Bitwise Exclusive OR 按�元互斥或 Logical NOT �輯NOT Bitwise Left Shift 按�元左移 Bitwise Right Shift 按�元�移 cmp cmp rot rot a→1 a→1 Expand partial fractions 展開部分分� DEL Standard calculator button. Do not use more than three characters. DEL C Standard calculator button. Do not use more than three characters. C Enable units in physical constants 啟用在物�常數中的單� All constants 所有常數 Percentage Calculation Tool 百分比計算工具 more 更多 All units 所有單� All variables 所有變數 Action 動作 Interval Display �間顯示 Adaptive 自�應 Significant digits 有效數字 Plus/minus 正/負 Relative 相� Concise 簡潔 Interval Calculation �間計算 Variance formula 變異數公� Interval arithmetic �間算術 Allow concise uncertainty input �許簡潔誤差輸入 Complex number form 複數形� Rectangular 直角 Exponential 指數 Polar 極座標 Angle/phasor 角度/相� Type Assumptions type 類型 Sign Assumptions sign 符號 Default assumptions �設�設 Number 數字 Real 實數 Rational 有�數 Integer 整數 Boolean 布林 Unknown Unknown assumptions sign 未知數 Non-zero �零數 Positive 正數 Non-negative �負數 Negative 負數 Non-positive �正數 Factorize 分解為因� Expand 展開 Add column 加入欄 Add row 加入列 Remove column 移除欄 Remove row 移除列 Left parenthesis 左括號 Left vector bracket 左��括號 Right parenthesis �括號 Right vector bracket ���括號 Smart parentheses 智慧括號 Vector brackets ��括號 Argument separator 引數分隔符 Blank space 空白 New line �行 Decimal point �數點 Previous result (static) 先��果(�態) Multiplication 乘法 Button Action 按鈕動作 Label: 標籤: Action: 動作: None 無 Value: 值: Bitwise AND 按�元AND Bitwise Shift 按�元移� Delete 刪除 Backspace 退格� Addition 加法 Plus 正 Subtraction 減法 Minus 負 Division 除法 Bitwise OR 按�元OR Bitwise NOT 按�元NOT Clear expression 清除表�� Calculate expression 計算表�� NamesEditDialog Name �稱 Abbreviation 縮寫 Plural 複數 Reference �考 Avoid input ��輸入 Unicode Unicode Suffix 後綴 Case sensitive �分大�寫 Completion only 僅補全 Add 加入 Edit 編輯 Remove 移除 Warning 警告 Illegal name �法�稱 A function with the same name already exists. 具有相��稱的函數已存在。 A unit or variable with the same name already exists. 具有相��稱的單�或變數已存在。 PercentageCalculationDialog Percentage 百分比 Value 1 值1 Value 2 值2 Change from 1 to 2 從1變到2 Change from 2 to 1 從2變到1 2 compared to 1 2相比於1 1 compared to 2 1相比於2 Enter two values, of which at most one is a percentage, and the others will be calculated for you. 輸入兩個值,其中最多一個是百分比,其他值會為你計算。 Clear 清除 PeriodicTableDialog Periodic Table 元素週期表 Element Data 元素資料 Alkali Metal 鹼金屬 Alkaline-Earth Metal 鹼土金屬 Lanthanide 鑭系元素 Actinide 錒系元素 Transition Metal �渡金屬 Metal 金屬 Metalloid 類金屬 Polyatomic Non-Metal 多原��金屬 Diatomic Non-Metal 雙原��金屬 Noble Gas 惰性氣體 Unknown chemical properties 未知化學性質 Unknown 未知數 %1: %1: PlotDialog Plot 繪圖 Data 資料 Title: 標題: Expression: 表��: Function 函數 Vector/matrix ��/矩陣 Paired matrix ��矩陣 Rows 列 X variable: X變數: Style: 風格: Line 線 Points 點 Line with points 具有點的線 Boxes/bars 箱形/長� Histogram 直方圖 Steps 階梯 Candlesticks 蠟燭 Dots �圓點 Polar 極座標 Smoothing: 平滑: None 無 Monotonic 單調 Natural cubic splines 自然三次樣� Bezier �茲 Bezier (monotonic) �茲(單調) Y-axis: Y軸: Primary 主� Secondary 次� Add 加入 Apply 套用 Remove 移除 Title 標題 Expression 表�� Function Range 函數範� Minimum x value: 最�x值: Maximum x value: 最大x值: Sampling rate: 採樣率: Step size: 步長: Show real and imaginary parts 顯示實部和虛部 Appearance 外觀 Display grid 顯示網格 Display full border 顯示完整邊框 Minimum y value: 最�y值: Maximum y value: 最大y值: Logarithmic x scale: x軸�數尺度: Logarithmic y scale: y軸�數尺度: X-axis label: X軸標籤: Y-axis label: Y軸標籤: Line width: 線寬: Legend placement: 圖例�置: Top-left 左上 Top-right �上 Bottom-left 左下 Bottom-right �下 Below 下� Outside 外� Calculating… 計算中… Cancel �消 Processing… 處�中… PreferencesDialog Look && Feel 外觀和感覺 Numbers && Operators 數字和�算� Units && Currencies 單�和貨幣 Parsing && Calculation 剖�和計算 Ignore system language (requires restart) 忽略系統語言(需��新啟動) Allow multiple instances �許多個實例 Clear history on exit 退出時清除歷�記錄 Keep above other windows ��在其他視窗上� Window title: 視窗標題: Application name 應用程��稱 Result �果 Application name + result 應用程��稱+�果 Style: 風格: Default (requires restart) Default style �設(需��新啟動) Dark mode 深色模� Colorize result �果上色 Custom result font 自定義�果字體 Custom expression font 自定義表��字體 Custom keypad font 自定義�盤字體 Custom application font 自定義應用程�字體 Preferences �好設定 Workspace 工作� Application name + workspace 應用程��稱+工作� Custom result font: 自定義�果字體: Custom expression font: 自訂表��字型: Custom keypad font: 自訂�盤字型: Custom application font: 自訂應用程�字型: Display expression status 顯示錶��狀態 Delay: 延時: ms milliseconds ms Expression after calculation: 計算後的表��: Keep expression ��表�� Clear expression 清除表�� Replace with result 用�果�代 Replace with result if shorter 如果較短則用�果�代 Use keyboard keys for RPN �盤按�用於RPN Close application with Escape key 用Esc�關閉應用程� Parsing mode: 剖�模�: Adaptive 自�應 Conventional 常� Implicit multiplication first 隱�乘法優先 Chain 連鎖 RPN RPN Read precision 讀�精確度 Limit implicit multiplication �制隱�乘法 Interval calculation: �間計算: Variance formula 變異數公� Interval arithmetic �間算術 Factorize result 分解�果 Binary two's complement representation 二進制二的補碼錶示 Hexadecimal two's complement representation �六進制二進制補碼錶示 Use lower case letters in non-decimal numbers 在��進制數字中使用�寫字� Spell out logical operators 拼寫�輯�算� Use E-notation instead of 10^n 使用E記法而�是10^n Use 'j' as imaginary unit 使用'j'作為虛數單� Use comma as decimal separator 使用逗號作為�數分隔符 Ignore comma in numbers 忽略數字中的逗號 Ignore dots in numbers 忽略數字中的點 Round halfway numbers to even 四�六入五�雙 Indicate repeating decimals 指示循環�數 Language: 語言: Max history lines saved: 最大已儲存歷�記錄: Use caret for bitwise XOR �入記號用於按�元XOR Preserve history height �留歷�記錄高度 Do not change the height of history list when keypad or number bases are show or hidden. 當�盤或底數顯示或隱�時,��變更歷�記錄列表的高度。 Place expression field below history (experimental) 將表��欄�放在歷�記錄下方(實驗) Show status bar 顯示狀態列 Tooltips: 工具�示: Show all 顯示全部 Hide in keypad �盤中隱� Hide all 隱�全部 Disable cursor blinking �用游標閃� Format result 格�化�果 Custom history font: 自訂歷�記錄字型: Expression status: 表��狀態: Notify when a new version is available 當有新版本時通知我 Place expression field below history 將表��欄�放在歷�記錄下� Off Off In history list 在歷�記錄列表中 In expression field 在表��欄�中 In status bar 在狀態列中 Status tooltip delay: 狀態工具�示延�: Adaptive delay 自�應延� Automatically calculate selection 自動計算�擇 Expression in history: 歷�記錄中的表��: Parsed 剖� Parsed (compact) 剖�(緊湊) Entered 輸入 Entered + parsed 輸入+剖� Entered + parsed (compact) 輸入+剖�(緊湊) Automatically copy result 自動複製�果 Simplified percentage calculation 簡化百分比計算 Allow concise uncertainty input �許簡潔誤差輸入 Interpret unrecognized symbols as variables 將無法辨識的符號解釋為變數 Two's complement output: 二的補數輸出: Two's complement input: 二的補數輸入: Binary 二進制 Hexadecimal �六進制 Binary bits: 二進制�元: Automatic 自動 Use special duodecimal symbols 使用特殊的�二進制符號 Use Unicode division slash in output 在輸出中使用Unicode除法斜線 Copy unformatted ASCII by default �設複製未格�化的ASCII Place percent button in number pad 將百分比按鈕放在數字�盤中 Indicate repeating decimals: 指示循環�數: Ellipsis �略號 Overline 頂線 Digit grouping: 數字分組: None 無 Standard 標準 Local 本地 Custom 自訂 Interval display: �間顯示: Significant digits 有效數字 Interval �間 Plus/minus 正/負 Concise 簡潔 Midpoint 中點 Lower 下端點 Upper 上端點 Rounding: �入: Round halfway numbers away from zero 四�五入 Complex number form: 複數形�: Rectangular 直角 Exponential 指數 Polar 極座標 Angle/phasor 角度/相� Enable units 啟用單� Abbreviate names 縮寫�稱 Use binary prefixes for information units �資訊單�使用二進制�綴 Automatic unit conversion: 自動單�轉�: No conversion 沒有轉� Base units 基本單� Optimal units 最佳單� Optimal SI units 最佳SI單� Convert to mixed units 轉�到混�單� Automatic unit prefixes: 自動單��綴: Copy unformatted ASCII without units 複製無單�的未格�化ASCII Default currency: �設貨幣: Custom status bar font: 自訂狀態列字型: Fonts 字型 Units 單� Calculation 計算 Restart required 需��新啟動 Please restart the program for the language change to take effect. 請�新啟動程�使語言變更生效。 Default �設 Calculate as you type delay: �時計算延�: Multiplication sign: 乘號: multiplication sign Unicode character name 乘號 dot operator Unicode character name 點�算� middle dot Unicode character name 中點 asterisk Unicode character name 星號 Automatically group digits in input 輸入數字自動分組 Round halfway numbers to odd 四�六入五�奇 Round halfway numbers toward zero 五�六入 Round halfway numbers to random 四�六入五隨機 Round halfway numbers up 四�六入五上� Round halfway numbers down 四�六入五下� Round toward zero 無�件�去 Round away from zero 無�件進� Round up 上� Round down 下� No prefixes 沒有�綴 Prefixes for some units �綴用於�些單� Prefixes also for currencies �綴也用於貨幣 Prefixes for all units �綴用於所有單� Enable all SI-prefixes 啟用所有SI�綴 Enable denominator prefixes 啟用分��綴 Enable units in physical constants 啟用在物�常數中的單� Temperature calculation: 溫度計算: Absolute 絕� Relative 相� Hybrid 混� Exchange rates updates: 匯率更新: %n day(s) %n天 days 天 QApplication Execute expressions and commands from a file 從檔案執行表��和命令 FILE 檔案 Start a new instance of the application 啟動一個新的應用程�實例 Specify the window title 指定視窗標題 TITLE 標題 Update exchange rates 更新匯率 Display the application version 顯示應用程�版本 Open workspace 開啟工作� Expression to calculate �計算的表�� [EXPRESSION] [表��] By default, only one instance (one main window) of %1 is allowed. If multiple instances are opened simultaneously, only the definitions (variables, functions, etc.), mode, preferences, and history of the last closed window will be saved. Do you, despite this, want to change the default behavior and allow multiple simultaneous instances? �設情�下,�有一個%1的實例(主視窗)被�許。 如果�時開啟多個實例,�有最後關閉的視窗的定義(變數,函數等等)�模���好設定和歷�記錄會被儲存。 儘管如此,你還是想變更�設行為並�許多個�時存在的實例? Allow multiple instances? �許多個實例? %1 is already running. %1已在�行。 Failed to load global definitions! 無法載入全域定義! answer 答案 History Answer Value 歷�記錄答案值 History Index(es) 歷�記錄索引 History index %s does not exist. 歷�記錄索引%s�存在。 Last Answer 上一個答案 Answer 2 答案2 Answer 3 答案3 Answer 4 答案4 Answer 5 答案5 Memory 記憶 Error 錯誤 Couldn't write preferences to %1 無法寫入�好設定到 %1 Function not found. 找�到函數。 Variable not found. 找�到變數。 Unit not found. 找�到單�。 Unsupported base. �支�的底數。 Unsupported value. �支�的值。 QalculateQtSettings Update exchange rates? 更新匯率? It has been %n day(s) since the exchange rates last were updated. Do you wish to update the exchange rates now? 自上次更新匯率以來已�了%n天。 你想�在更新匯率嗎? Fetching exchange rates. ��匯率。 Contains the result of the most recent calculation. Multiple results of an equation is represented as a vector. Access separate solutions using ans(n) (e.g. ans(1) for the first solution). 包�最近計算的�果。方程�的多個�果表示為��。使用ans(n)存�個別的解答(例如ans(1)代表第一個解答)。 Fetching exchange rates… ��匯率… Error 錯誤 Warning 警告 Information 資訊 Path of executable not found. 找�到�執行的路徑。 curl not found. 找�到curl。 Failed to run update script. %1 無法執行更新腳本。 %1 Failed to check for updates. 無法檢查更新。 No updates found. 找�到更新。 A new version of %1 is available at %2. Do you wish to update to version %3? 有%1的新版本�以在%2得到。 你想更新到版本%3嗎? A new version of %1 is available. You can get version %3 at %2. 有%1的新版本�用。 版本%3�以在%2得到。 Download 下載 %1: %2 %1: %2 Insert function �入函數 Insert function (dialog) �入函數(�話框) Insert variable �入變數 Approximate result 近似�果 Negate �相 Invert 顛倒 Insert unit �入單� Insert text �入文字 Insert operator �入�算� Insert date �入日期 Insert matrix �入矩陣 Insert smart parentheses �入智慧括號 Convert to unit 轉�到單� Convert 轉� Convert to optimal unit 轉�到最佳單� Convert to base units 轉�到基本單� Convert to optimal prefix 轉�到最佳�綴 Convert to number base 轉�到底數 Factorize result 分解�果 Expand result 展開�果 Expand partial fractions 展開部分分� RPN: down RPN: �下 RPN: up RPN: �上 RPN: swap RPN: 交� RPN: copy RPN: 複製 RPN: lastx RPN: lastx RPN: delete register RPN: 刪除暫存器 RPN: clear stack RPN: 清除堆疊 Set expression base 設定表��底數 Set result base 設定�果底數 Set angle unit to degrees 設定角度單�為度 Set angle unit to radians 設定角度單�為弧度 Set angle unit to gradians 設定角度單�為百分度 Active normal display mode 啟用正常顯示模� Activate normal display mode 啟用正常顯示模� Activate scientific display mode 啟用科學顯示模� Activate engineering display mode 啟用工程顯示模� Activate simple display mode 啟用簡單顯示模� Toggle precision 切�精確度 Toggle max decimals 切�最大�數�數 Toggle min decimals 切�最��數�數 Toggle max/min decimals 切�最大/最��數�數 Toggle RPN mode 切�RPN模� Show general keypad 顯示一般�盤 Toggle programming keypad 切�程�設計�盤 Toggle algebra keypad 切�代數�盤 Toggle custom keypad 切�自訂�盤 Show/hide keypad 顯示/隱��盤 Search history �尋歷�記錄 Clear history 清除歷�記錄 Show variables 顯示變數 Show functions 顯示函數 Show units 顯示單� Show data sets 顯示資料集 Store result 儲存�果 MC (memory clear) MC(記憶清除) MR (memory recall) MR(記憶喚回) MS (memory store) MS(記憶儲存) M+ (memory plus) M+(記憶加上) M− (memory minus) M−(記憶減去) New variable 新變數 New function 新函數 Open plot functions/data 開啟函數/資料繪圖 Open convert number bases 開啟轉�底數 Open floating point conversion 開啟浮點轉� Open calender conversion 開啟曆法轉� Open percentage calculation tool 開啟百分比計算工具 Open periodic table 開啟元素週期表 Update exchange rates 更新匯率 Copy result 複製�果 Insert result �入�果 Open mode menu 開啟模��單 Open menu 開啟�單 Help 幫助 Quit 退出 Toggle chain mode 切�連鎖模� Toggle keep above 切���在上� Show completion (activate first item) 顯示補全(啟用第一項) Clear expression 清除表�� Delete 刪除 Backspace 退格� Home Home End End Right �� Left �左 Up �上 Down �下 Undo 復原 Redo �� Calculate expression 計算表�� Expression history next 下一個表��歷�記錄 Expression history previous 上一個表��歷�記錄 Open functions menu 開啟函數�單 Open units menu 開啟單��單 Open variables menu 開啟變數�單 Toggle fraction format in current result 切�目��果中的分數格� Default �設 Formatted result 格�化的�果 Unformatted ASCII result 未格�化的ASCII�果 Unformatted ASCII result without units 無單�未格�化的ASCII�果 Formatted expression 格�化的表�� Unformatted ASCII expression 未格�化的ASCII表�� Formatted expression + result 格�化的表��+�果 Unformatted ASCII expression + result 未格�化的ASCII表��+�果 QalculateTranslator OK Only used when Qt translation is missing 確定 Cancel Only used when Qt translation is missing �消 Close Only used when Qt translation is missing 關閉 &Yes Only used when Qt translation is missing 是(&Y) &No Only used when Qt translation is missing �(&N) &Open Only used when Qt translation is missing 開啟(&O) &Save Only used when Qt translation is missing 儲存(&S) &Select All Only used when Qt translation is missing 全�(&S) Look in: Only used when Qt translation is missing File &name: Only used when Qt translation is missing 檔�(&n): Files of type: Only used when Qt translation is missing 檔案類型: QalculateWindow Menu �單 New 新增 Function… 函數… Variable/Constant… 變數/常數… Unknown Variable… 未知變數… Matrix… 矩陣… Workspaces 工作� Open… 開啟… Open default 開啟�設 Save 儲存 Save As… 儲存為… Import CSV File… 匯入CSV檔… Export CSV File… 匯出CSV檔… Functions 函數 Variables and Constants 變數和常數 Units 單� Plot Functions/Data 函數/資料繪圖 Floating Point Conversion (IEEE 754) 浮點轉�(IEEE 754) Calendar Conversion 曆法轉� Update Exchange Rates 更新匯率 Normal Mode 正常模� RPN Mode RPN模� Chain Mode 連鎖模� Keyboard Shortcuts �盤快�� Preferences �好設定 Help 幫助 Report a Bug 報告錯誤 Check for Updates 檢查更新 About %1 關於%1 Quit 退出 Mode 模� Mode (%1) 模�(%1) General Display Mode 一般顯示模� Normal 正常 Scientific 科學 Engineering 工程 Simple 簡單 Angle Unit 角度單� Radians 弧度 Degrees 度 Gradians 百分度 Approximation 近似 Automatic Automatic approximation 自動 Dual Dual approximation 雙� Exact Exact approximation 精確 Approximate 近似 Assumptions �設 Type Assumptions type 類型 Number 數字 Real 實數 Rational 有�數 Integer 整數 Boolean 布林 Sign Assumptions sign 符號 Unknown Unknown assumptions sign 未知數 Non-zero �零數 Positive 正數 Non-negative �負數 Negative 負數 Non-positive �正數 Result Base �果底數 Binary 二進制 Octal 八進制 Decimal �進制 Hexadecimal �六進制 Other 其他 Duodecimal �二進制 Sexagesimal 六�進制 Time format 時間格� Roman numerals 羅馬數字 Unicode Unicode Bijective base-26 雙射二�六進制 Binary-encoded decimal (BCD) 二進碼�進數(BCD) Custom: Number base 自訂: Expression Base 表��底數 Other: Number base 其他: Precision: 精確度: Min decimals: 最��數: Max decimals: 最大�數: off Max decimals off Convert 轉� Convert (%1) �算(%1) Store 儲存 Store (%1) 儲存(%1) Functions (%1) 函數(%1) Keypad �盤 Keypad (%1) �盤(%1) Number bases 底數 Unit… 單�… Data Sets 資料集 Percentage Calculation Tool 百分比計算工具 Periodic Table 元素週期表 Units (%1) 單� (%1) Plot Functions/Data (%1) 函數/數據繪圖 (%1) Number Bases (%1) 數字進制(%1) Binary: 二進制: Octal: 八進制: Decimal: �進制: Hexadecimal: �六進制: RPN Stack RPN堆疊 Rotate the stack or move the selected register up (%1) 循環佇列或上移�定暫存器(%1) Rotate the stack or move the selected register down (%1) 循環佇列或上移�定暫存器(%1) Swap the top two values or move the selected value to the top of the stack (%1) 交�頂部兩個值或將所�值移到佇列頂(%1) Copy the selected or top value to the top of the stack (%1) 將�定的或頂部值複製到佇列頂(%1) Enter the top value from before the last numeric operation (%1) 輸入上次數值�作�的頂部值(%1) Delete the top or selected value (%1) 刪除頂部值或所�值(%1) Clear the RPN stack (%1) 清空RPN佇列(%1) New Function… 新函數… Favorites 最愛 Recent 最近 User functions 使用者函數 Open dialog 開啟�話框 Show all functions 顯示所有函數 User units 使用者單� more 更多 Prefixes �綴 Show all units 顯示所有單� User variables 使用者變數 Show all variables 顯示所有變數 Powerful and easy to use calculator 強大且易用的計算機 License: GNU General Public License version 2 or later 授權�款: GNU通用公眾授權�款版本2或更高版本 Error 錯誤 Couldn't write definitions 無法寫入定義 hexadecimal �六進制 octal 八進制 decimal �進制 duodecimal �二進制 binary 二進制 roman 羅馬 bijective 雙射 sexagesimal 六�進制 latitude 緯度 longitude 經度 time 時間 Time zone parsing failed. 時�剖�失敗。 bases 底數 calendars 曆法 rectangular 直角 cartesian 笛�兒 exponential 指數 polar 極座標 phasor 相� angle 角度 optimal 最佳 base 基本 mixed 混� fraction 分數 factors 因� Show toolbar 顯示工具列 Open Settings Folder(s) 開啟設定資料夾 Number Pad 數字�盤 Always Show Number Pad 總是顯示數字�盤 EXACT EXACT APPROX APPROX RPN RPN CHN CHN BIN BIN OCT OCT DUO DUO HEX HEX ROMAN ROMAN DEG DEG RAD RAD GRA GRA PREC PREC FUNC FUNC UNIT UNIT VAR VAR INF INF CPLX CPLX Copy 複製 <i>Middle-click</i>: %1 <i>中�</i>: %1 scientific 科學 engineering 工程 simple 簡單 prefix �綴 base base units 基本 partial fraction 部分分� base number base 底數 decimals �數 factorize 分解為因� expand 展開 Calculating… 計算中… Cancel �消 RPN Operation RPN�算 Factorizing… 分解為因�中… Expanding partial fractions… 展開部分分�… Expanding… 展開中… Converting… 轉�中… RPN Register Moved RPN暫存器已移動 Processing… 處�中… Matrix 矩陣 Unknown variables (e.g. x, y, z) are by default assumed real. 未知變數(例如x�y�z)�設�設為實數。 Temperature Calculation Mode 溫度計算模� The expression is ambiguous. Please select temperature calculation mode (the mode can later be changed in preferences). 表��有歧義。 請�擇溫度計算模� (�以�後在�好設定中變更模�)。 Absolute 絕� Relative 相� Hybrid 混� Please select desired variant of the sinc function. 請�擇期望的sinc函數變體。 Unnormalized 未正�化 Normalized 正�化 Interpretation of dots 點的判讀 Interpretation of comma 逗號的判讀 Please select interpretation of comma (",") (this can later be changed in preferences). 請�擇逗號(",")的判讀 (�以�後在�好設定中變更)。 Please select interpretation of dots (".") (this can later be changed in preferences). 請�擇點(".")的判讀 (�以�後在�好設定中變更)。 Both dot and comma as decimal separators 點和逗號都作為�數分隔符 Dot as thousands separator 點作為��分隔符 Comma as thousands separator 逗號作為��分隔符 Only dot as decimal separator �有點作為�數分隔符 Parsing Mode 剖�模� The expression is ambiguous. Please select interpretation of expressions with implicit multiplication (this can later be changed in preferences). 表��有歧義。 請�擇具有隱�乘法的表��判讀 (�以�後在�好設定中變更)。 Implicit multiplication first 隱�乘法優先 Conventional 常� Adaptive 自�應 Percentage Interpretation 百分比判讀 Please select interpretation of percentage addition 請�擇百分比加法的判讀 Add percentage of original value 加上原始值的百分比 Add percentage multiplied by 1/100 加上百分比乘以1/100 Add Action (%1) 加入動作(%1) Edit Keyboard Shortcut 編輯�盤快�� New Keyboard Shortcut 新�盤快�� Action: 動作: Value: 值: Set key combination 設定組�� Press the key combination you wish to use for the action. 按你希望用於動作的組��。 Reserved key combination �留組�� The key combination is already in use. Do you wish to replace the current action (%1)? 組��已經在使用。 你想�代目�的動作(%1)嗎? Question �題 Add… 加入… Edit… 編輯… Remove 移除 Gnuplot was not found 找�到Gnuplot %1 (%2) needs to be installed separately, and found in the executable search path, for plotting to work. %1(%2)需�單�安�,並在�執行的�尋路徑中找到,使繪圖能�作。 Example: Example of function usage 範例: Enter RPN Enter Enter Calculate 計算 Apply to Stack 套用到堆疊 Insert �入 Failed to open workspace 無法開啟工作� Couldn't save workspace 無法儲存工作� Save file? 儲存檔案? Do you want to save the current workspace? 你想儲存目�的工作�嗎? Do not ask again ��詢� Keep open ��開啟 Value 值 Argument 引數 %1: %1: Approximation and Fractions 近似和分數 Binary-coded decimal (BCD) 二進碼�進數(BCD) Plot 繪圖 General 一般 Programming 程�設計 Algebra 代數 Custom 自訂 None 無 Show Custom Column 顯示自訂欄 Separate Menu Buttons 分離�單按鈕 Reset Keypad Position �設�盤�置 Icons only 僅圖示 Text only 僅文字 Text beside icons 文字在圖示�邊 Text under icons 文字在圖示下� <i>Right-click/long press</i>: %1 <i>��/長按</i>: %1 Open menu 開啟�單 Number Bases 底數 Conversion operator 轉��算� Rotate the stack or move the selected register up �上旋轉堆疊或移動�擇的暫存器 Rotate the stack or move the selected register down �下旋轉堆疊或移動�擇的暫存器 Swap the top two values or move the selected value to the top of the stack 交�兩個頂部值或將�擇的值移到堆疊頂部 Delete the top or selected value 刪除頂部值或�擇的值 Enter the top value from before the last numeric operation 輸入上次數字�算之�的頂部值 Copy the selected or top value to the top of the stack 將�擇的或頂部值複製到堆疊的頂部 Clear the RPN stack 清除RPN堆疊 Comma as separator for function arguments and matrix/vector elements 逗號作為函數引數 和矩陣/��元素的分隔符 Action 動作 Key combination 組�� True True False False Info Info optional optional argument �擇性 Failed to open %1. %2 無法開啟%1。 %2 UnitEditDialog General 一般 Relation 關係 Name: �稱: Category: 類別: Descriptive name: �述性�稱: System: 系統: Imperial 英制 US Survey 美制 Hide unit 隱�單� Description: �述: Class: 類別: The class that this unit belongs to. Named derived units are defined in relation to a single other unit, with an optional exponent, while (unnamed) derived units are defined by a unit expression with one or multiple units. 此單�所屬的類別。已命�導出單�是用與單一其他單�之間的關係定義,具有�擇性的指數,而(未命�)導出單�是用一個或多個單�的單�表��定義。 Base unit 基本單� Named derived unit 已命�導出單� Derived unit 導出單� Base unit(s): 基本單�: Unit (for named derived unit) or unit expression (for unnamed derived unit) that this unit is defined in relation to 此單�是用與單�(用於已命�導出單�)或單�表��(用於未命�導出單�)之間的關係定義 Exponent: 指數: Relation: 關係: Relation to the base unit. For linear relations this should just be a number.<br><br>For non-linear relations use \x for the factor and \y for the exponent (e.g. "\x + 273.15" for the relation between degrees Celsius and Kelvin). 與基本單�的關係。 �於線性關係,這應該�是一個數字。<br><br>�於�線性關係,\x代表係數,\y代表指數(例如"\x + 273.15"用於��溫度和克耳文之間的關係)。 Inverse relation: ��關係: Specify for non-linear relation, for conversion back to the base unit. 指定�線性關係,以轉�回基本單�。 Mix with base unit 混�基本單� Priority: 優先權: Example: priority of the unit "hand" is set to 2, while priority of ft (foot) and in (inch) is set to 1, which results in "17 in = 1 ft + 5 in", instead of "17 in = 1 ft + 1 hand + 1 in". 範例: 單�"hand"的優先權設定為2,而ft(foot)和in(inch)的優先權設定為1,導致"17 in = 1 ft + 5 in",而�是"17 in = 1 ft + 1 hand + 1 in"。 Minimum base unit number: 最�基本單�數�: Example: minimum base unit number of yd (yard) is set to 12, which results in "3 × 3 ft = 9 ft" (instead of "3 yd") and "4 × 3 ft = 4 yd". 範例: yd(yard)的最�基本單�數�設定為12,導致"3 × 3 ft = 9 ft"(而�是"3 yd")和"4 × 3 ft = 4 yd"。 Use with prefixes by default �設使用�綴 Base unit does not exist. 基本單��存在。 Error 錯誤 A unit or variable with the same name already exists. Do you want to overwrite it? 具有相��稱的單�或變數已存在。 你想覆寫它嗎? Question �題 A variable or unit with the same name already exists. Do you want to overwrite it? 已存在��的變�或單�。 是��覆蓋它? Edit Unit 編輯單� New Unit 新單� UnitsDialog Units 單� Category 類別 Unit 單� New… 新增… Edit… 編輯… Deactivate �用 Delete 刪除 Convert 轉� Insert �入 Favorite 最愛 Show hidden units 顯示隱�單� Activate 啟用 All All units 全部 Uncategorized 未分類 User units 使用者單� Favorites 最愛 Inactive �活動 UnknownEditDialog Name: �稱: Custom assumptions 自訂�設 Type: 類型: Sign: 符號: Temporary 臨時 Question �題 A unit or variable with the same name already exists. Do you want to overwrite it? 具有相��稱的單�或變數已存在。 你想覆寫它嗎? Edit Unknown Variable 編輯未知變數 New Unknown Variable 新未知變數 VariableEditDialog Name: �稱: Temporary 臨時 Value: 值: Required 必� Description �述 current result 目��果 Category: 類別: Descriptive name: �述性�稱: Hide variable 隱�變數 Description: �述: Question �題 A unit or variable with the same name already exists. Do you want to overwrite it? 具有相��稱的單�或變數已存在。 你想覆寫它嗎? Edit Variable 編輯變數 New Variable 新變數 VariablesDialog Variables 變數 Category 類別 Variable 變數 New 新增 Variable/Constant… 變數/常數… Unknown Variable… 未知變數… Matrix… 矩陣… Edit… 編輯… Export… 匯出… Deactivate �用 Delete 刪除 Insert �入 Favorite 最愛 a matrix 一個矩陣 a vector 一個�� positive 正數 non-positive �正數 negative 負數 non-negative �負數 non-zero �零數 integer 整數 boolean 布林 rational 有�數 real 實數 complex 複數 number 數字 not matrix �矩陣 unknown 未知數 Default assumptions �設�設 Activate 啟用 All All variables 全部 Uncategorized 未分類 User variables 使用者變數 Favorites 最愛 Inactive �活動 qalculate-qt-5.11.0/winicon.rc000066400000000000000000000001451520501070600161630ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "data/qalculate.ico" 1 24 "data/qalculate.manifest"