From 38bbdf4a9077cab07b54ae525cba4ce6edce797a Mon Sep 17 00:00:00 2001 From: Argent77 <4519923+Argent77@users.noreply.github.com> Date: Sun, 1 Sep 2024 23:17:10 +0200 Subject: [PATCH] Include a proper logging framework and improve DebugTimer class Logging framework: tinylog 2 --- .classpath | 2 + build.xml | 6 +- lib/tinylog/license.txt | 177 ++++++++++++++++++ lib/tinylog/readme.txt | 24 +++ lib/tinylog/tinylog-api-2.7.0-sources.jar | Bin 0 -> 59614 bytes lib/tinylog/tinylog-api-2.7.0.jar | Bin 0 -> 64752 bytes lib/tinylog/tinylog-impl-2.7.0-sources.jar | Bin 0 -> 117504 bytes lib/tinylog/tinylog-impl-2.7.0.jar | Bin 0 -> 135284 bytes src/org/infinity/NearInfinity.java | 31 +-- src/org/infinity/check/BCSIDSChecker.java | 5 +- src/org/infinity/check/CreInvChecker.java | 5 +- src/org/infinity/check/DialogChecker.java | 5 +- .../infinity/check/ResourceUseChecker.java | 9 +- src/org/infinity/check/ScriptChecker.java | 5 +- src/org/infinity/check/StringUseChecker.java | 11 +- .../check/StringValidationChecker.java | 9 +- .../infinity/check/StrrefIndexChecker.java | 13 +- src/org/infinity/check/StructChecker.java | 7 +- src/org/infinity/datatype/AreResourceRef.java | 4 +- src/org/infinity/datatype/Bestiary.java | 11 +- src/org/infinity/datatype/ColorValue.java | 3 +- src/org/infinity/datatype/Datatype.java | 3 +- src/org/infinity/datatype/DecNumber.java | 3 +- src/org/infinity/datatype/EffectType.java | 7 +- src/org/infinity/datatype/FloatNumber.java | 3 +- src/org/infinity/datatype/HexNumber.java | 4 +- src/org/infinity/datatype/ItemTypeBitmap.java | 3 +- src/org/infinity/datatype/MultiNumber.java | 3 +- src/org/infinity/datatype/ResourceRef.java | 3 +- src/org/infinity/datatype/StringRef.java | 3 +- .../infinity/datatype/Summon2daBitmap.java | 5 +- src/org/infinity/datatype/UnknownDecimal.java | 3 +- .../infinity/datatype/UnsignHexNumber.java | 4 +- src/org/infinity/gui/BIFFEditor.java | 9 +- src/org/infinity/gui/BcsDropFrame.java | 15 +- src/org/infinity/gui/ChildFrame.java | 5 +- src/org/infinity/gui/ChooseBIFFrame.java | 3 +- src/org/infinity/gui/DebugConsole.java | 3 +- src/org/infinity/gui/FontChooser.java | 5 +- src/org/infinity/gui/InfinityAmp.java | 3 +- src/org/infinity/gui/InfinityTextArea.java | 3 +- src/org/infinity/gui/LinkButton.java | 3 +- src/org/infinity/gui/OpenFileFrame.java | 3 +- src/org/infinity/gui/PreferencesDialog.java | 23 +-- src/org/infinity/gui/ResourceTree.java | 23 +-- src/org/infinity/gui/SortableTable.java | 5 +- src/org/infinity/gui/StringEditor.java | 5 +- src/org/infinity/gui/StructViewer.java | 13 +- src/org/infinity/gui/UrlBrowser.java | 5 +- src/org/infinity/gui/ViewerUtil.java | 5 +- .../gui/converter/BamFilterFactory.java | 4 +- .../gui/converter/BamFilterOutputDefault.java | 5 +- .../gui/converter/BamFilterOutputImage.java | 3 +- .../converter/BamFilterOutputSplitted.java | 5 +- .../gui/converter/BamOptionsDialog.java | 3 +- .../infinity/gui/converter/ConvertToBam.java | 21 ++- .../infinity/gui/converter/ConvertToBmp.java | 7 +- .../infinity/gui/converter/ConvertToMos.java | 11 +- .../infinity/gui/converter/ConvertToPvrz.java | 9 +- .../infinity/gui/converter/ConvertToTis.java | 11 +- .../gui/hexview/ResourceDataProvider.java | 5 +- .../infinity/gui/hexview/StructHexViewer.java | 7 +- .../gui/hexview/StructuredDataProvider.java | 7 +- src/org/infinity/gui/menu/FileMenu.java | 3 +- src/org/infinity/gui/menu/GameMenu.java | 3 +- src/org/infinity/gui/menu/HelpMenu.java | 12 +- .../infinity/gui/menu/OptionsMenuItem.java | 3 +- src/org/infinity/gui/menu/ToolsMenu.java | 2 +- src/org/infinity/icon/Icons.java | 6 +- src/org/infinity/resource/AbstractStruct.java | 8 +- src/org/infinity/resource/Profile.java | 14 +- .../infinity/resource/ResourceFactory.java | 34 ++-- .../infinity/resource/StructureFactory.java | 3 +- .../infinity/resource/are/AreResource.java | 3 +- .../resource/are/viewer/AreaViewer.java | 15 +- .../resource/are/viewer/LayerActor.java | 7 +- .../resource/are/viewer/LayerAutomap.java | 3 +- .../resource/are/viewer/LayerDoor.java | 3 +- .../resource/are/viewer/LayerManager.java | 5 +- .../are/viewer/LayerObjectAmbient.java | 3 +- .../are/viewer/LayerObjectAnimation.java | 5 +- .../are/viewer/LayerObjectAreActor.java | 5 +- .../are/viewer/LayerObjectAutomap.java | 3 +- .../are/viewer/LayerObjectAutomapPST.java | 3 +- .../are/viewer/LayerObjectContainer.java | 3 +- .../resource/are/viewer/LayerObjectDoor.java | 3 +- .../are/viewer/LayerObjectDoorCells.java | 3 +- .../are/viewer/LayerObjectDoorPoly.java | 3 +- .../are/viewer/LayerObjectEntrance.java | 3 +- .../are/viewer/LayerObjectGlobalActor.java | 3 +- .../are/viewer/LayerObjectIniActor.java | 5 +- .../are/viewer/LayerObjectProTrap.java | 3 +- .../are/viewer/LayerObjectRegion.java | 3 +- .../are/viewer/LayerObjectSpawnPoint.java | 3 +- .../are/viewer/LayerObjectTransition.java | 3 +- .../are/viewer/LayerObjectWallPoly.java | 3 +- .../resource/are/viewer/LayerTransition.java | 3 +- .../resource/are/viewer/Settings.java | 3 +- .../resource/are/viewer/TilesetRenderer.java | 9 +- .../infinity/resource/bcs/BafResource.java | 7 +- .../infinity/resource/bcs/BcsResource.java | 7 +- .../infinity/resource/cre/CreResource.java | 9 +- .../resource/cre/ViewerAnimation.java | 7 +- .../resource/cre/browser/CreUtils.java | 15 +- .../resource/cre/browser/CreatureBrowser.java | 5 +- .../cre/browser/CreatureControlModel.java | 3 +- .../cre/browser/CreatureControlPanel.java | 5 +- .../cre/browser/CreatureSelectionModel.java | 3 +- .../resource/cre/browser/MediaPanel.java | 7 +- .../resource/cre/browser/bg/Backgrounds.java | 3 +- .../cre/decoder/PlaceholderDecoder.java | 3 +- .../resource/cre/decoder/SpriteDecoder.java | 9 +- .../cre/decoder/tables/InfinityTables.java | 7 +- .../cre/decoder/tables/SpriteTables.java | 7 +- .../cre/decoder/util/CreatureInfo.java | 3 +- .../resource/cre/decoder/util/EffectInfo.java | 5 +- .../resource/cre/decoder/util/ItemInfo.java | 3 +- .../cre/decoder/util/SpriteUtils.java | 9 +- .../infinity/resource/dlg/AbstractCode.java | 3 +- .../infinity/resource/dlg/DlgResource.java | 3 +- .../infinity/resource/dlg/DlgTreeModel.java | 3 +- src/org/infinity/resource/dlg/TreeWorker.java | 8 +- src/org/infinity/resource/dlg/Viewer.java | 10 +- .../infinity/resource/effects/BaseOpcode.java | 11 +- .../infinity/resource/gam/GamResource.java | 3 +- .../resource/graphics/BamDecoder.java | 3 +- .../resource/graphics/BamResource.java | 19 +- .../resource/graphics/BamV1Decoder.java | 8 +- .../resource/graphics/BamV2Decoder.java | 7 +- .../resource/graphics/ColorConvert.java | 11 +- .../resource/graphics/MosDecoder.java | 3 +- .../resource/graphics/MosResource.java | 17 +- .../resource/graphics/MosV1Decoder.java | 5 +- .../resource/graphics/MosV2Decoder.java | 11 +- .../resource/graphics/PltResource.java | 7 +- .../resource/graphics/PseudoBamDecoder.java | 9 +- .../resource/graphics/PvrDecoder.java | 11 +- .../resource/graphics/PvrzResource.java | 9 +- .../resource/graphics/TisConvert.java | 29 +-- .../resource/graphics/TisDecoder.java | 5 +- .../resource/graphics/TisResource.java | 25 +-- .../resource/graphics/TisV1Decoder.java | 3 +- .../resource/graphics/TisV2Decoder.java | 7 +- src/org/infinity/resource/key/BIFFEntry.java | 4 +- .../resource/key/BIFFResourceEntry.java | 5 +- .../resource/key/FileResourceEntry.java | 3 +- src/org/infinity/resource/key/Keyfile.java | 7 +- .../infinity/resource/key/ResourceEntry.java | 5 +- .../resource/key/ResourceTreeModel.java | 3 +- src/org/infinity/resource/mus/Viewer.java | 5 +- .../infinity/resource/other/TtfResource.java | 9 +- .../resource/other/UnknownResource.java | 5 +- .../infinity/resource/pro/ProResource.java | 5 +- src/org/infinity/resource/sav/IOHandler.java | 5 +- .../infinity/resource/sav/SavResource.java | 13 +- .../resource/sav/SavResourceEntry.java | 5 +- .../infinity/resource/sound/AudioFactory.java | 9 +- .../infinity/resource/sound/OggBuffer.java | 3 +- .../resource/sound/SoundResource.java | 5 +- .../resource/text/modes/BCSFoldParser.java | 3 +- .../resource/text/modes/BCSTokenMaker.java | 3 +- .../resource/text/modes/GLSLTokenMaker.java | 3 +- .../resource/text/modes/INITokenMaker.java | 3 +- .../resource/text/modes/MenuTokenMaker.java | 3 +- .../resource/text/modes/TLKTokenMaker.java | 3 +- .../text/modes/WeiDULogTokenMaker.java | 3 +- src/org/infinity/resource/to/TohResource.java | 5 +- src/org/infinity/resource/to/TotResource.java | 5 +- src/org/infinity/resource/vef/VefType.java | 3 +- .../infinity/resource/video/MveDecoder.java | 7 +- .../infinity/resource/video/MvePlayer.java | 4 +- .../infinity/resource/video/MveResource.java | 11 +- .../resource/video/MveVideoDecoder.java | 3 +- .../infinity/resource/video/WbmResource.java | 5 +- src/org/infinity/resource/wmp/ViewerMap.java | 5 +- src/org/infinity/search/AbstractSearcher.java | 3 +- .../search/DialogItemRefSearcher.java | 6 +- src/org/infinity/search/DialogSearcher.java | 8 +- .../infinity/search/ReferenceSearcher.java | 10 +- src/org/infinity/search/SearchFrame.java | 3 +- src/org/infinity/search/SearchResource.java | 13 +- .../search/SongReferenceSearcher.java | 3 +- .../search/StringReferenceSearcher.java | 6 +- .../infinity/search/TextResourceSearcher.java | 5 +- .../search/advanced/AdvancedSearch.java | 11 +- .../search/advanced/AdvancedSearchWorker.java | 3 +- .../infinity/search/advanced/FilterInput.java | 3 +- .../infinity/search/advanced/XmlConfig.java | 13 +- src/org/infinity/tinylog.License.txt | 177 ++++++++++++++++++ src/org/infinity/updater/UpdateInfo.java | 9 +- src/org/infinity/updater/Updater.java | 3 +- src/org/infinity/updater/Utils.java | 3 +- src/org/infinity/util/CharsetDetector.java | 3 +- src/org/infinity/util/CreMapCache.java | 17 +- src/org/infinity/util/DebugTimer.java | 57 ++++-- src/org/infinity/util/IdsMap.java | 2 +- src/org/infinity/util/IdsMapCache.java | 5 +- src/org/infinity/util/IniMap.java | 3 +- src/org/infinity/util/IniMapCache.java | 3 +- src/org/infinity/util/IniMapEntry.java | 7 +- src/org/infinity/util/LauncherUtils.java | 4 +- src/org/infinity/util/MassExporter.java | 17 +- src/org/infinity/util/StringTable.java | 21 ++- src/org/infinity/util/StructClipboard.java | 7 +- src/org/infinity/util/Table2da.java | 3 +- src/org/infinity/util/io/DlcManager.java | 3 +- src/org/infinity/util/io/FileManager.java | 4 +- src/org/infinity/util/io/StreamUtils.java | 5 +- src/org/infinity/util/io/zip/ZipCoder.java | 4 +- src/tinylog.properties | 5 + 210 files changed, 1171 insertions(+), 581 deletions(-) create mode 100644 lib/tinylog/license.txt create mode 100644 lib/tinylog/readme.txt create mode 100644 lib/tinylog/tinylog-api-2.7.0-sources.jar create mode 100644 lib/tinylog/tinylog-api-2.7.0.jar create mode 100644 lib/tinylog/tinylog-impl-2.7.0-sources.jar create mode 100644 lib/tinylog/tinylog-impl-2.7.0.jar create mode 100644 src/org/infinity/tinylog.License.txt create mode 100644 src/tinylog.properties diff --git a/.classpath b/.classpath index fb1a79e75..da46644a7 100644 --- a/.classpath +++ b/.classpath @@ -19,5 +19,7 @@ + + diff --git a/build.xml b/build.xml index 932571124..112d6095f 100644 --- a/build.xml +++ b/build.xml @@ -5,6 +5,8 @@ + + @@ -31,7 +33,7 @@ deprecation="false" debug="false" debuglevel="lines,vars,source" - classpath="${classpath}:${jorbis.file}:${rsyntaxtextarea.file}:${jhexview.file}:${montemedia.file}:${apng_writer.file}:${json.file}:${commonmark.file}:${flatlaf.file}:${flatlafthemes.file}"> + classpath="${classpath}:${tinylog-api.file}:${tinylog-impl.file}:${jorbis.file}:${rsyntaxtextarea.file}:${jhexview.file}:${montemedia.file}:${apng_writer.file}:${json.file}:${commonmark.file}:${flatlaf.file}:${flatlafthemes.file}"> @@ -50,6 +52,8 @@ basedir="${build.path}" includes="**/*" level="9"> + + diff --git a/lib/tinylog/license.txt b/lib/tinylog/license.txt new file mode 100644 index 000000000..f433b1a53 --- /dev/null +++ b/lib/tinylog/license.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/lib/tinylog/readme.txt b/lib/tinylog/readme.txt new file mode 100644 index 000000000..cadda4f7a --- /dev/null +++ b/lib/tinylog/readme.txt @@ -0,0 +1,24 @@ +Copyright 2018 Martin Winandy + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +------------------- + Using tinylog +------------------- + +To use tinylog as a logging framework, add tinylog-api.jar and an +implementation such as tinylog-impl.jar to the classpath. + +tinylog-impl.jar is the default implementation for tinylog. There are also +implementations for application and web servers to use their logging +frameworks. Since tinylog 2, multiple implementations can even be used in +parallel. diff --git a/lib/tinylog/tinylog-api-2.7.0-sources.jar b/lib/tinylog/tinylog-api-2.7.0-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..8ba31eea16b1da7d431454fca4ed443e4ea80dca GIT binary patch literal 59614 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 literal 0 HcmV?d00001 diff --git a/lib/tinylog/tinylog-api-2.7.0.jar b/lib/tinylog/tinylog-api-2.7.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..94c2bdc366c698d1fa2a7d7ed9736af8913c26e9 GIT binary patch literal 64752 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 z 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�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%0Ao1dz~P*d3CI*CS)(JQ4#gy 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%0D$(5T9dT7)F2#D&d(LukMDJe{-~9$M0ldZ2?A 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

xy31o9F%zrcl@v9$|yez-k&IIu0A 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 a_9U36t12wV6cl*yUp1`A4D(?7sPKQ6XgYrY literal 0 HcmV?d00001 diff --git a/lib/tinylog/tinylog-impl-2.7.0.jar b/lib/tinylog/tinylog-impl-2.7.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..3daf6899c4945ca697970cd503ddcfa710b826de GIT binary patch literal 135284 zcmbrm1#l!wk}cXTW-O`2>J~FIGcz+YGcz+YtA#CQW@f3y%*@R2b??m1&d!^;YiqyE z(kjy`Bf>NMxO>EL&yo=b1_6A5fPnat^pjiV%RhY}zkqy^6jb1)6qOR9ejoYr1^A1M zI5@-~cL4qUHktp}81Q+=KN?H&N{I>y$}3Pw3PmbNT5r=Jv9;*y2}wKf{O?niEymuV9a)MX{L>$WBN*#~}e0}nQL4U4-4?#4ej!z+EYtTgz z&Eft5T`w}8I{?W8VAg{M;nvU9!<+vVz(~?dStgPhhM)lURTVwnh_^NKfOUryURg)H zZtsf2TpD*U{@^L#xvY0=0svAQKg5@(jm3Gx=&^P%0=oZlhu2LeOp|0_9LSXG6JwzdF&Atz`8vgzM5k(t&hY1Le$FeJE-IGGIKDIPWNX+4(v62;~-w% zK(0uhVvy;=51Q2+^zLF?*93Fj8BFFIc`GI2FV`CV-(yQkefM(JzPOS-&5L|(3`|Ls zvg?SE$)S*jy(BpCNbmF*b(Xkdl#-uAX90;RiW_B^v|h3MN@0L6js4bn>XfOSHt5uI zctJqFM|GpnG@)+_a+FSUJ>a7>H3!+ZGcA$$%KC1ATcgNrCWux)A6B;`$BbG3W`%83 zTiEZ|p;^1(XoP7B;t2}5Y6X(VyvbI1S&fKsh?d;LC!%}VO{hwN)@2ha4$06^_Ehc~ z7MUgUcj)+4~Xf7*k=Ct#F!K4mruz3CwwCPGsNr-?VL>Y4ehD_3Z(r1f^epP+k>^8F_nX< zm8*rdF_pfxm6M^JgQ1;0m5`~0A^(3}j#7&)kPnZQjtxsMh)+zCi&K(`Qj*QvSB_BF zjE;#q20_|>{nJ`v&x(2oKZhaxJpTJp{#6jl|5XqhYYS6-Q$u?ynLkck|9O1!p~+#1 z2?@%1d(pA6Uoc;;$eORK$%@Cs$HpZFiu#zjD+z!*NxKO{1qlm4T@nqH3i$TE{xQu+ zn_oV7KSwV4OWFSSNwTrCb}}_Ew4;)+Ha0f3GM4%K^*;+KK0z%u2kmR)aXm9be=`jn zc0EcbFBjhQ=Olg8m4yCdl1Tni5a!Qc|KU>pq3?gzmV=3%wX?3Cg&~!~f1Q15?NfXI zEeZHEy5Q4Zs3_|%H!8s=(23B3{$D?6el(6{#LePWc$AH_%gaND$fIk>C5YxvPqq2= z?OHh0|0(5&D)XPyRrQxrQv9z{I@_842`J@1zyDh_=>>A?5sE)y^ogj6Nl{pE`%g_4 z+l=;+pC!g6L6`)U*e{V8lC z#H+9TrzkLA{~34x>f-;034H?H-qhOauTAJ*d-xxI{vSQC{-qiIYaf58{vV3{r#>vL z4IC{DDNU`6tf}-ZbnWc}!-r!;wZbH691pP~W~t#brrsOTg5uk20q zG1si-9iV};UlHFixF3OEWur_-qS^({Cfd^NuXlIPSYK`y9&o=XRZG)K)5yd)D(&0&q_LGNk^rQBhhgpVUhcN@JNu5aV zA*Ly_>iB<+Xi@ak@+5J}MgsZ02gzQf%-!OOq&p6k;87sorWW4|^81$`s1QI1ISh0T zJqn^{*`U}fnrr>8$#oGX)3XiiIubdm{o%Wkl;}$WRUr=7Shy1wS9IF+`=SA_NQ?nC zLanAluLy+RY0^vI?TLT@t+DwM9y6TYuWT;DJE6>hR^D*TXvg0bdF-u!c%nIkZPlR6 zsv!kp0!e&EX_qI+cF$YphY?wYFeHO%a38C5NCS?LSXKy<@_PqG@*T6i3nKEElNac_ zEd3!Kr#p9JLd12M){bUmW+U$64#%UuAFLr}P#f6F&K9XHPzbj8z3 zFQyE5d_bNiMTJAgRDW#=7DOc$nGb4<=gnDJbz6vtBv(k;F5q5N_WAy#IW5gkjbE^_ zF_l-ZT=}c;c`91699U?^s0dzpthrRE5*?d?&EU4>H>OZ#IJ=w;Z3JS(@o`1ROJS5; zQy^``4%7MJSiriZE)u$gu9|&&Q#iVTEqrat3+x}>kF>6tP4qL!ME_-w0r|w{r;GVN z;Th)dZT=oa{!eYc{Y%^b4nY5>Zpi*~H~%A!{mrfnquQl>juxyVO~l>mDwaXZq7(v}otG1s1G?r%5GLY3jGhG`n5EnWL*iVMCg@QO z3^7sf<0f#JsLQn%VLxbE*2EOuEhUllN9?WCiRUsaSUAsUYK_V>l+R1l1)J(B09xsd zBT0PkDUpxygc45uIN8c#Zaw`{EzDSUmS=O@jXVP1VWu)^HcKGB7=;uYN9ay^M!4b7 zKn7>Pr3iaOKXG(6;o{!176M@;$y0RN@Te^Q9Bo2iYUmA>^Kq3>`0 zNl9H9Ss86Dm_Q=LUnhpIY8fEI|3$w%S!s5D@%wKChVK{_=D{=p-8Au1M4ROg_wAFG z3uYT0R?4uN1*H{p9e0%uckoRuVh^cXNFaAV>^tl`-q!A&sh&S`$~p1@F>g63?|O92PTpj|ZabTR^mr``zE^CB^^8Bt=$qr<3{w`ZL@z6G6>$T~0yF7mr_MOSOdPEQr@Cg! z{28RBnpz;e5-+)=S;LP5^KjT_Y~OoW>Z9t}Og}9rm{9|nPI_Yn5I6cHO$nAD*G2;r zWYAHKSxezY^3d>y2)hvqnk>rSwN`fHJ5fqaoF$11c#o$g!`2e}^DLT~nRAvw?Wq6= zKv~HVL>=mpaoKS~DcsX^J*aPSvg{nK7$h0;x1wp~V?>w*vR=#j2$}- zAyk)4Gm&mpP{JB6t%dmc7Q1K>aTG|HUua!9K57?YIXg#`F=ZHp%fD27e)aIF=DhTm z#WmvhyOVJx2tiK0LVzhMY?2h0sPx5kb?8R^F#Z{ZLb>v+;|t2-rhtmcNr7M8xn1Sg zN_M{0!LtHao>T&UB5Ga4AH+pA^+aI@3dhl@KHV)$#x+1p#?^03#+BUW`Bk_-xh7zJ z9LeZ5ZsL}5g#@EeDJ(9%UJc~lx(8|=D7;*u;ZU7f6gNF<0eV$!YrH^Xj-efUsiB#L z)>vJ9-3&T<;pr$$v4rgzWjqym5%Xl_h=kc}uf}Qu0%oA0v{AjxF)N67@H)w5+lg-P ztLgo6^4#aRefsqM`dXdxbk9F0%F#vk?DSbt(eum~WT-pa;Ok)HOfB4S$LD( zqw}|q=)2~Z2?WQeBgxeU9v!kB&M050nIIT%i@!cGc@h~Mf-jcT{%**=4D zDdb-*S*iZoAOD-^7OD8Ajv6#ij|?0JOQ7-T zFGAanF3B2=(fD3{Fe~(zU>cv<_m{y0tu7$_N25q|OZkP4fQ0+FjU|3f4l7FaHoth0G?$4wtCNkVN zo!PiE*S<p6*Ae5~`zCc?4Ab>dt9^&j zU-RHtUEKn66h6hekk49Z&7!NaY=sS0W}6f%$YCzdCxbciVszXuenU7*%VZ{ZovCuo z91SY48m4cH0Qsv#=O)7WEA+^%(wu`_Ur)h%sK}=(3&=QC)fEDiY5BqF2mEDQ5L3|n zILWGAT8};b$5Ba;o^F1aHXpl?sUKkQxlFXT@O8;(UQ+v9t3NLYSp9Q=0Aym_dIa$x zFSMCvlq!9(-$nD{=F4MD*GB!2SwA$5usacUn359vPfQ-N9;dl^nxS)nUs`z%8 zzVL^4VK-eL2l`yi(|r<{|4qdF>sFNUKYJG`T}wj)0bN5&YpYLo!BE#gNLSy%+RpWF zOTR=pP3svN0H;;0;Zcnh`OBAvsPdQZZ$4it`P+QRekA%WDnPEU&K`5f3EO4nzLCf1 z#Pe)}U*;h!h%!dX;>hfhZ`gZIG&`M7YHxUbaq$BubXmNm2`&jQM+$2)?rnf&XPVVG zZCSLhp4=qiLV`)0Am!fC9h;-!pi?W^`q6tT|0~~hpbFzvv*ID-l>;5YwHiP1urRM< zYOoF0*iN)>2WMe=A9;$F*lz5yDgIE`B%duhUKfqMg*rzJ_%+b-~VmV~ikaV6`}dOkdYxdXHxqy-Jo%+M1s(A7gp=F~`# z*EdmsUmE9&xUm#ht7+CO;Py=)ghmC#`8kMPOh<8iUAa-+v@f<0VUxk#zN?|Qn_{#9 zm4hZgs^)8^+l41!B95S&HLEP?Jd2N2TMJDZj6%Dhh2tDG{gP zh8U;LU66E`YxTI!nR)PT0nt+)0M#-zl}jr#nWyBc;D>A0EarLOVzLaKHrVHqw~{F? z3=iP9t~BvO!8p?wL~i_nARz5Wl8w*3f(r0oA?Ob(??3Dpq^xcJU3iL>w4UKX2-I=dnYu(M*0CIC4%(~{G3-3#XKO% zkD%dXWW4WsQ2(%hzrg6@*+!)YN`1XJv15o+iI$;{F6P-&C0CkFyDOzAO;c8HK(c&g zs4SrE%A7M|B<{+=vJ)$DZc1AOZZ{@l{cFg%9;Op?#F-OCN+4g5!D+?pRuydf)_D(^ z^o5VP*%>jK&9;-e5>2e$&3uS>71rgj6&rhas;D~yBQz#g~``u&(Gcgzkp+QBi6#ymKv8L1Du6o_l*y z^gg#&Qm^G+GW4c*cEO8y1PD$FWF3uTg*C9=II!moku1A&cYDd`rBT2@_5z zp9m^`Pr=K3iC5UvB-5$BKtD?vxyLd!+?6jY*vcyFVRh)J{Y9h5L&LV z9im5P$cUQUnK@HM2MbM@5Gh3X0t}ni-Y29#!9Dt_`~mBw0>woyKY8&dp9bu}C-?JH z`D}lw{6ARU|Db#uU43(1<9}we*zc?txWK@`@WGsf!1i8$I=sb=wT)!FI=t<^w$;r3 zjGO(b_x8y@p7z};tc|tRc{qUy34!^R_0lN|Lg@3|DVUOGyMNa zKYVuZNuC>-8avwQI()K>GP-u36z<=AXQVQ;I+ilJS8)4S70g#A3kkYgeg@dx{eAFx>I9qEr{Gn{k(a*xn!F#`COrxEc4W2@m!(Wh4V+~WS*kO z{+#>^CoUu3FWUo6Cy7J(uM2A@nB ziyon35O0&Ah<*bMKMOUEJ=y+f734Ps4pctEbxNFQ=wbJOdw0b)>VOcMD=*p)pD_3! z8GrljtAHT*&@0jEgI)|Syn$%5#}qW~iY;V}ETqb8K(ut?7J!QqC;Rv15&~E7r1>Ks zX-7y=|8+8-fTwIfq3`=BMh8-l@)aYBw(=D$X!o1asvSJp<=h2^{N{y}L>d&?b9obM zN)|eErmX&IA;D^P3e72PZ*?CB@onpjl34e|djPVzQ~6_CW(cD+0ak4@J7RW?p6Q@X zxxj14R=z}$W_MxA5l#*APSBe5L|TKN$XkV9yPQNn6q!?zyp^7i*kN8+nsKCR9_yK! z(~VCoU_Wl4j}_ktj&-deRtz#muAgbUdLMD2dYje^^t7yUJSz*xXw`9__1-|Zof(I@ z_Fh6Q0>D-tueOR>XWv8?CSyrzV8+!vpwyaN{?;E8P6%$=P;b+?(6N0J8o7s0Wx9h6$`8q&%A3bD zXQ5#{Mc0|F`W9xU!Pu%tBJBBRMbcP&fpnU@(6ZAY47(&mZmhs^Dh+Ox0F>2T@hH(2 z&!DG?;*}-#&N zEWjvtxA<5l5m9v1$>Xo6?5zl(0@=aID>`kblSfdm;bJESK@^@r@}}G!#oQ9#2k8*>?a;5$ahga+m9gJ0}V9Fdvlh-m<-kK3;zb>|RR%2N^cfS`Vl%znvR_M2K zd&R?)-D=>FX)>u>O)V5H#e}1>q~BW;=QyB-42*h_E3*dm7ftoUj%!NsZ|(v*ByD&k zX4EY0v%kw;QyT%rm9{_Jmg{0M7!HchqDOOEyxwGM`oh?KY+lA(RblYB4cre6%_R#4 z<&i3zHr+T)r<$0Rb2G3F92}%dbn?v=dQ2_C)ZRMd3G2XF2@e%H zvU^Yw^zII)kOM1f3&(5sJn&Ig7VjL4WN~n*9czgUF+?ly8c18rhCBO5R2ST%Y;Yrg zo!qYgraF6yelM&c^y2umS%_qc-bRoQI-u|j@@XlV^ObRI@GCg8FzgS%=p-Nd1q2Q+ z6f>_*llF1OtdgNDh6&H$Hs9E$ zL?hmcdA_xfn)5)fhw}GTZs}qPQ9I)9ZlH?Qn0r3edyRlUDuZr#S1b1CgynwZoNOqt z;2n8}7{KTghzHsEMv0MnzhmGL=!mgj zgJW8ES&VH~h_kGrd5MG7C)?D~zRtrmK)WpiG5VgA^J0=xV&=@lY@MWo%1 zhR<9yJcQNk5~rcD%gvw6>YX&`6$SoH;=&MYEcQZ{u3Ywo7i*7;`$2ju#h~+Rbo`{$ z@CiLj6f*0CAdwLvvAx6vKM$Q}m_%iq7UfIHPq}xl9_>KYChJ5l@f!24ahD9DkBgpE z4L0tK(qPLi&D}a`H(*6sy4r|C!Qyw&M^ELZV|8VMqLkg}-Ee{sGqixrK%vM5(7F-0 zbv(35ch;6jb2cQCC&6ILf^YQxL+C^NS!QRdfy(Pq~)A`dL}pOtu1RU{e|zNRxx z5rzG}gmt@gq#p3KBrQpz?ii>A;o}a|8Nk(%_FaYn(;n$NBOD)d?LI^tM7(oy)PC%` zNX0%Yd{vn>)O9*(jQJut7M$H*6NSWeM9(Mb9Qz=jx_bzYAd}v4|5za}xs)vSgMax_ z4F6ZF3*3LVy7){T3tBn+*KTTDLEL^t0q|b25jUs2oL^jEjT1UOFJl5s01MA-I>RPv z95-C0m=T^AL1Adn%mAa_V6jwV7z9dVlA_xk2ih69F}0OJ&Kk8Ro{r9BF~Rw;dXqV5 z?D>Auf8qV5$-jt5YFi$d_!2#xC>`7)X_2DVb!Zg$M6W)K@hkp)OU<{| zHBVpia++fXJ!+QAUMc)z@Ynf8EP^p;h3z$w7Iq-ya?Xd;mCLo9nMDO!xAKPG?@5#T zzVb)*-1n~oC8Hwxy(b`6tI_#gYrhu)@#~qkhoISRc47r9e&4TYS&yHM{Qg=4_*zT8 zvt~m)UhKK`MCT~E0lll%*-DB3wHi+*Vl9eiDS0xV+Q!M?0u|g9Q?2#D3BqdVz_JCJ7CNhh>nA@WlSP+JEc0?9}`_rb?p?R1sxHcR*k*i}4nRR;^BLbJsqeR-;X5`)HHi7Mc4e>(lkV zAg#H1Ym;<$#<>(V*P-r`{O&G2-RX>tyqeSod0r-E2B((w3RHL~WnbKsnfa|I9!&0_ z;8aTg*NvG|(bi#I@jPrBZ~Zz*pCKD%7?+Kgzl{+xAR`?zY@!^5aFB|Sgx!gix4)Vk zvSh-5k$1e>91>=b2`MGYlBk&7iPQIvevWjTvgW}Avm_KLNk=D@$z4R9<7cR{N#Wq^ z6Qt4apXJK5!HlbeY-uiGjgWVWZ19D&z$DR62qXGJP$T+MVI%rXVk7!oBcIn~pVuWL z`buUa`dTo1wDg77Dd}t(5!rRU07ntk?1DwfRXp*GTwdaXgiLMOM^VDdX%v)K4a!(l zQe$z5Rizw`rWEj2wM+Isd0iNd5&s8YN|B>*a#lB`0N5 z8n|~J=;RhKY}36y+-o`NYi>hr?8R#)>MP$9K5@y6* zFUxQ_-Zs?OWhxm}HG_p9A?~JGwPcEw{5m1+F5*kxd;&cN4DJ^!u3+2!Dp~}{D#`tY zkFks;R{M$f=bJllAJ>$xLoR?mx;Ur`au=*V1UZXovLJtegndwj85kk)-3rvA7Azjxo>HklV1>I~HU;zkT5EmsnzGN$8$cynRLHAZDcw1y8AB{U#+U z{5}1h{^2&lC?G-iY5`CViZWqeTl)$5IuMRf-`k zJFZX~p189Yl$f5e?8*vcu9`zaBYG~lnfGIlQVvF{%{h&R9`+})---RUyH=Xp_tR2b zs=pV*da1;7>@aC{vJ~w}q}NIb-8XeSiR1^!DwO>Ov&zO&9jU&5KsLr+ zJ}L>_V{O^xzYPpbdTEmPVL7%P+i4nvjE=`C;*fHWaEWk>pzVF*V0H74_+q7linN_S z5b_Fw8N-!#MC_3*BHAQ6Ppzk!z%8u(Zu<_D7QnnnI@po(L~Jl&&6emL{$QIS_|zzv z5#>XnoZ=tt<%5)t&f@p6nXw0TZhO*1ZHL1n=vQVU5H=p!L2~c?d+x@V*}HAa?hNK(HG4Q@Jo0 z!7*^}*uxx>V28rwno(YCho))$K(NfA!9#eF-&6*v8ZO~LJ-Wm_@?Du+Z`AX#_NTS~ z2&|-UjvH8?);9i^wF=b#&e|0IR>}6c`F1dLarm#&ECSlU8(su0R1Xh=;D-qVEmUD+ zHA3HjU?l>8LV%YVA^ryuMQfF+zt(sUunUPTzZ&$%K|A;4Hy_3zE)QH_K9_0c z`0IukiIfcJyBN0U`WlZ$;k*+({aT86wjUA9WQi?g3LVDobE(lWRZ~RY8a$DIF;RHY z8z6amszh!p!#ewbD95s`fh79ajaIQEe*D38EqGUo{F?0VRImU}^G1E(3B#s~2D zvto^;ER3x5^C=%ckN-?xNcLDb5`@Usro1}7i zO=~1x04FeXc$1o#dYzKFWhtm+%bajB0&GLIFIge^1+;`t+8G6UQsFE4%g+IDZy)Xv z7x0EeR0WBa;qy1HhgJ4kZZEGFxJ^(fQ-Z2AAvtdxJ<0TF35%3P0}<3ffNtoIEb3YG z2)n6m7<4QtdUjtZZM@UHNA-t_4W@i}$F%_qc*EZ7Qy;OC4PO${6;MXQm$9-YK%u zsa!D6CBqK^Trr790S%7Lpva`i(i9fD-F&FfMAtCx3-$pp<{xQ(ximLG=t*AD8gL%j zsDwbG4{ZH;`!MSCJ-WeO0|dAF-wPMMv(j_X6jU=bFyy#zB-fmvLfcQlE>gNRt85bm0eEf~T3;E}2>e^#7 zA8Jh-z5T&N^TDdS@k6Dz*9UNyr3Y>|XjyR+rmvp{8tpFr&^A9xscgVyY*@77YWVkv z7d=gc^X!l%e~9_ZUzeKSMq#U8CHfD@!pN8uEoeUaGM4&=fly_ERGG4rX7-`*4 z(x0UZ$iBEHV{On?viDC?e5MV!4l-pah4B@z3myWLK?S0dV-Rha%{?@?Q-;v@8DwCu zG4(CegJlBy6A*5s;aK$^8I_VUI9tutGQZNI zu}<$gcH=jw(>^R%kHBG^s7ZUvex6LmYJZieOAbe_ab07}AI{enb5h_S*x$ogup|>7 zHd`|6FbeTkel2bM&cmS5&kkeGuf*}bu|_?GW9kBJZJyHoEk9Sdg@(%r?ZQ|(bLL8Y zAsu}BflLe|=~AVasbe+B@v+=qJ~imZm(Ci7Y(jeX4QiYiU}D zZQ|ATf&T7#8y)JDZyVMDfU1~M&kD^dI$*2;AmpRd#Ik)AZx5&$ltOrf?bgnJadeBq zH zQNsN-kkK>DHYgjx%Qy5uX6EfxKW;-4!#X|Kl9FIuz13+e7gU>(4bVL z!Cq!PrpzZSB@9t9K}hgE^7{%csX?52LVhik#t$E-83fhn0`<)hiepaL(l7heefvIv6iFCyIEi?II(+x|EIGNX69qc4JNZaL7yltod?J*G?`U)50eEQNH_T$%9 zC&%TsCbJvIBkcN3Pw)eZ|AyNo`>U4Y$4Yq76*%>IFYeq9Fl zUqB~F*+u}aJfcuT-KlZNMMddEuKdLXvCRxXcpJH7r z6GGS>uloLYUWG$pP0tZS@9b>LdYG6AZE{73@4Z36G50(0r)zX_k4PB zZfG)5ID=}L?l;W})>Rx>qLv+yYI_p|qq&0}kbTg-5y*ymOA)r`TF zv6-|&Suc7&eJw9qJ@Xm?gbp-Q>Mj=o%~yx#`Ev+lBYh#33ChtL9g!%~$+YLTv)IK3 z9fINDr5bX?+9tXYGioe}URN^nbsJq*p;3y~#rSESGU&5oxIunP4(+iNP232FQW#lz zrntO}gG-w;sS2EooOFJ&uV(IY!U|RfLrTd;NYq$fU`7zecmT9SeFM$1VL4t8f;*~B z)ja4a#DJ_cAx}eR0zIR+B$p~iLw~p|o`5_vgI#b~YG`5#9YTrKo!p9Z5j@XFBe}6w zm(X+}aQXQ;)dEV4Vr4LFZ{M3@4vXxF`jI0fQL1=qiPkHig}Mnm}duSOSh=y6uC_kE@OOz`TMtC^N2jfNAhkI^g@ z@3iEr{EM23@Dmmh&1>1t&$dKJSaC#^ZzUXlBwmN;q!Vfwy`=+EmMVLv6=bFu0rI>@ zu0Ny~viQFg)UC*OK^8_sX`_x*Te2%QBUoQZ?Wg~wK)A_|j<%tRz@~jUs5jE1Ord2< zM_8Y=0#G6nsf6kX6G#7wxVt(pPTPqj5v}@;eC9x6CdvzP^YN{yk4`elyoN8HO;X9s zMX~pRu~{tt_QO0Ng74%b9POH6uw|z_H&NFyJH;dGn-Iqc&VL;&^96RiCf-6~r-a|on!*;^SQ&9V= zSDDy4+nBnsnIbs=r^Jo_jD5@>R#J}{l|g2! zkw`Q$>Lon^Hv-4x*dD2&D4y)#gD!<{HE)RiV&48dTc$TA))R<+p7wfeu3c+KnBC1( zm~Lx`zy1aVHgNKD4co|}>1VZxh-DUG9*j|f1`icjH_lObR5;$HpV-fuQ$7-E+l0B& zvE4HDMyqkQ3ez%k)p{er`Bq1xGZFrx)ff$>dFI)xIhl>VBpbB zoC*ep9P_$HDZ_^Raf6o@vBpocIrJ7{s!yPmuoX#)C&x)8Eo674;k%~Esls4ZfYAkp z`dLd0T}SZ%QqiKLo7AJx5v$|xYFswq3fZ6-;F<)AcxtH~;w4K#ybGeqjw)IT0r{Et z0!yH`xD{InltMRaT;edEtEH1RQozZ%*LNv?zsu3m{zTORW*sTPv!zfNLyF zrn;-6EzIHoU`2@P0(F7KD5nlkb_60&be1CiUNoxoS#Wh)EO;ydsoYZd<)9I-rlUyp zml*ri-}jm>7GDQxU6@f?u&DVq45)7zaRsfqR8tm$UwuYx?(%qSzHl+hEC%D5m#L`y zdUi!H37U_l&5yyE!ytD--vP4fU4!SZ7k{SViqYQ%NF56Ql7t1}IF*#RD|x0N-DGSN zrfClQfa_L7xkQyZ>LvWTHYKgY5n6PsUjhprTeKXs9&PGmq2ummmwek5G0in5ai3vU zGY0TYOSG=RWE~flxuVnfv_5v<_@D!jwx9zDGI*VmcBX}FbCxJvzs{aZbT}sxxw#IF zBhCjYYB-Fn9#vtQmoHFbrmd_i;p{A0o*?!>%|ce+Cx_Uz(yc2gFTXwB!0Wcg9#9uU z0x$xFZGO3-%(Fyq*6_s2I;>uS*hTjEY+Qncxy$MSmdpXM8zgqcL0gK&fYQW7aN7CR zn(51j9Xm`c^+-KJ)vtu?Q!l?W@72aDQ{%LaDji?e5;RM7t>cz1Tg|2H$V-=k$m2%NbtHEKLpd($rNV-6o z+n||WC1<#PrF21A*k-iotE__b?nAxWVI%FnqeEsEfwf8y^w2IiPj9PR4PjdHjal_Q zYlE#H^*T-PZxY4f7swJ&$l{gI>Y{Q5wS7W7^77-nCUVhnkD&S6?TJ5+jog)TdKWJYf=}GCF~~u1zgxua1tBj)%W8#XIZbcmn0}pQP*iHadC9 zIYCV<0sWN$QI+P2xDc$?PT@Fea@2;y@NZEfjUzvPTQU=|MDt ze{G6B+!=Q`?fflkL?@ciL2&{53*9Dzh1eAR<6 z?nX71&YE8(xL*^E=PC=Zf_g_DQ+}!$4QQj;U`SZS8>^D8+A!T^xqHs@IFZt#a|#Bv zr$klm$aw%K@0gDDH%g3C7bVS*CdO$Uv2&MScyLV6(yB{OeOSJ-FGQfV{wm1IdO7y7 zGLAK78}ytpxyiQ*7I|cR4J}A#ux+LjbKbl1jj#IMQCt`Ii{7Nt@e!M}lo?fPDOm8U zG2!@WaWxIiWETNg1pydUR-lw47?qL;WiBoP@ZM*+-%{HoZ?cO~cIM<@DVR;_I0w)z ztvv@kca$!fy(y@cK@?}y$t98%!G=?mvrPwdWqx~ptQr~jl!zx`7D0_vgg%(k`}U@W z`Z9jYjEEERODlw5v|-PJwT3f{II|)ScbFlmPcqVIuZon5c>+83K$zF;FXRpdMWiASYTFSWYBFX1zhw1C6gVkg!nr=0|!pOl3Xe6`+u~v5XZ9HN-^rX~U#?X}|Pk z#~)I=FsbnrXH+D8Q@+pbxI(K~S8xQBrlV278bvHhDnd!7F%Rz?zzj7mdanRFd(_fV z>lY*3=WXijsTFHtmjm%x(jr1WGgu@{d7OfdG}vIbPIr;Cq)Qt_gz4@ukrGCdo+>js zopyYnmJFE_*!CW?ifd$(H{ihei)E&1lQ`OV+pbkRqCC+!wX&qXgljiI-16OjA+ zNCPz^4b{%=Kj?Y%BbLEGKCU7R?b+*pkDipQe+oJQv4dH-@-Jq}*!Xlw4h9FKi>s3* zA*(4QinK0qdJjG2Vr?ftpzS1dSYags1@R|m5CE)R*mRiaEk*|=@8&YX8}iZ!KUHDd zoiE3dVvMAGaN;o<=)L^j6sV%4Ny7rO!vtk z`B2d#6dXTlugWyc)Q&uf;@E_S#VIU3B7(3AbI>#`7&A{-EcST!CN8Gzo+ucuuaqUk z134H^AE}I?0ka&eQfU=#BNSbLJjG09>KpQ-DT6hq3?Y3nPdtHL~mvvVTY59!>4vQSm>x4hpRQW?^46izYUUOpw+UsSc zS`V`Q8?1q!JiXEKd&4If>r*lnTiT4T0=?4Zi5hWay0h?KuL0DAOR8pl3s6y>Uk1?= zZN=lX-ss=mXDr^ZvS}*)`1qe}O34rYmK%mbLPR(Ce6?Jh{I9Y!f0eEJmp>BtN482q z-F}(}@SddZ1D30BT%eZMpCoR%+)?7GYZHV~0xYp1ufor8PAA^<817NAW9e}T{+Nd) zEvJBn9z49etI>Ir$yxh!b+h99WspVcN9Y-YTvPG@HX6ox(d8F*QNWB#h$gH%h8PTF z=LKANFpQx%+2F0_)kJ*MQes$oCV6jM)DF}^L7aZ$;G900+cwk!x9%c!xrQQ_ambuO zG`#_(@@4Js73d1K`#|BWHp12hXDf2%D&q+io=9G6h;GI4+F*VuBgeU@etbO)MSR{G zfJ5{pslRS}!(hYFQV%U=&w*GZ7}v#IktWxrCTTIz%>CJUdLd`Zl}O{Bh~pDIGfhJh zGdqNgX-&(ao1KU+(ZfqkQEnN(u%Ix8xv$ccte~&%%LfI+>4{4KaL`(F73~o+xV~O1 zLx+A_+z8seu$Qz{ao4PE2>$ZU$Y5{G%jnM;<<)cA({dH5NK|L;6wt9Wf&qDN-K*gZ z4)pnha0;${9R9X-vvw0&3zZKLQ(SiOm4E|03+hdjsZhCuEmKp-fO?w33=s27=LS!~ zctlw=2U9r*ZxyO<77=w2?QC>9O+w3%OTNUKzr27-J$QHN#)ji0WZ-0kqjvWdQRl0_ z2B`TA95zSwz=(gxFhU{2?dHON#z8*;-k$T=Ca)VskjSe+D=_3AVi^W|qPWgNTD1o< ze>ZIu>SMOWFC!nr*npwME5gtt^=n44YmcOS9ylzr`Suipc}8py`e*hOrzFmp{xe;} z^~tOL=d9shrEC5LkAI_6$5kL*6c!x0j8WTvk0GbW@Q46?rHe@7{m!EU2^oMO6iQG< z;P2a~OTgLJWg?UnI4+5dwA^BvUU-CBq;57->=+tJiqz9&r9eF7G*c(Jl5d+{XuDjv zltv`U43zuPd@(*VWYN+s=w@+qP}nHdk!>%ZhEScqRYrea^jA``mr@ty^^;zL)P|)|^$n_c`Vm zt^Ha$^IJ^}KSgnW(!z=9W0=jSHN#&xU!mguKa0?BMY5mt`J1OQ_Z~~pW9hz+&yNVq zZxV(VG3wIV{$=(PoBfAN?Pokrm-=jPb>W{gGOdp{_b&*Y z?*hFpv7a(=TWP;{l3RJ2-s|G&7oLwC6^!o}+{|L}3_^18-8?sDJoUVS*gQRaa_00r zUj~3LurWN&xbz6)L;0~$i~ydAqtU%B@phgbP}@2Y)t;5%(I(2YE@_rMTQU%*Y4Ljd z$gvt0I#rHX$=gVgn2l`?jQAY;vYUdeNsP1P8LO`1#v-nfiibL!+^QVN(RuK2*o|H6 z5AVR%+n_)qdlvqTTb4QOgR-GmW6Q)(r#~h8Wl|{sK)T_-WOywTQNUJ1@WYtxsG9y zJI9H_UK1QIQRsjc^W5N`G)QE18IOIg?s<;&W@|Zz(?(nR&CNrVavL8hCb%dm&ePKf z4fGJ7RUDbZV3{i;gCj9C1754Kl7|ykEEZDO#S`3FE5DFWVI3M(wzOFSNvYY<4G20IX5iQ<=vUqWRaqu}1_rw%)22W3 zQWLExAw~=wS*QYN*dT63X5L%=<}88`PTotTi4o#N*aVS$I(^Gi3N4vU7FIx|OP`L-{i59^P_}doh@WL0!njao;n$WV^~c)Dx_>@zvNd+IE;y6AEetQRrG+mz{pVVtD(A8=Ekb5qkDVTbt>^2b zPc3_^jH4xAOE2%@iS>X+4$@WitnRXP!jwcb^J<8u#YXvZN?L>$yDJ1`kyDol{FN8r z+_i;n7j9Vz7ri;Z+_*)6OWnRz?zYgFOWoej+#fwcC*0c=Dgtn)J&_l#%qA_F?We4w z6fWD7aNMD%C9?pJ;8B39Ujj~I%!!t?njHwF-J&N1$Hf-$)@8~Vz1@mO`>gHYFMPW- z%M?HDgI;cd;dhre%Qq~nZ~ZxXZeD3LcE8$*{PkjI_OrE*;7NF=#EIT@@W6?raD)I) z5|Ub4J0wZ`sZRpJ*#{*7dKcpSgNs;1P-!tNaBnWb(ktHJGE-QW`gEOV?z_}mEN-C2 z39xV+!!}Nc7_2&J5!#PEi>(SqC=1?-C5ZL;GmZiyetE;#a2NhxM0jo6)SL=LJF~a! zxkJ1)&LPFz@wW%EQ%$}`?#!s_V)|!~Gv~9=h?R__7HTzXT%(S;C_a#Vp<2p^j#+cN zla>cN7%};R72m%8{Olo%=9E~El-%0+KZiB^<~h^7w&GmfPS^6l6Mons(36oBInvR~ zgqYD}5{S%z^5{6RjUp53Ot#x{`iY1S%1M?Y8+2kZ!XYIDP-91-7NFPN!bf=Z$=kLV zH&;h-17;lc8QHm)F4BYQ6>D@NG!ubGrDT`` zMnVkB3(@`ARk$kfE3z^%Ifwp zVDqJ_f&BEDlt20G^;Uv>`qR?ZIz(UG_)C!#Q{62P#LE+doK~xhw7%Kbk@j! zWg#c6o!yto3`80@I}Wz$ea5aT>H|-WMFyhGwHX6769~PV~{>WL)E5BXzr?M?k!4O@nIc>&PV;`dA zu?*)>nvxA2#rq`5q@<`Qg6{180IF$<^fIwqag5um%x>*&&NgKdZ1!te)aiR7@5Y|#>NFP2=Scfn{E0AO;PH_j+tXgCp? zUNBjI5Sor{d3Bs#aG>P2;JDR`v9}1i#T~6l%)vxDTj7XA(5D!4b?PgS7r%Ynms6GC z-;`9^Fug8C^1`)Ge^esJyC&xNME+~?$JOaKDTm~dtJ+#jqB@^Y9@FI56puK6&m$9c zMQvYLsr4aFIoNNMmWE$ybTVLp#A}>%*u^7OT^>1UF-nEl7;#IBOw?8MPJCi8HSr_G zhx<%F*@dR^i$+jXos!jY!GDwE+qeP@4RvzUq<%DIk&j@qF26GDjFyRlfZxog(pa$Q^2Q*a{arcN_+6AoEt#?hRM1Rjt zN9{|dzm&aG+#imYZhO7&)T!>=*;Aqp3<7f6b&HdZKUb9Xf=`xOq|>I(r!MRj!Ir|Q z{Daif*WC47?oWFe^jvmdf6kz37g!sVf?l`)UkhuVNUxuOuLICya2nfS)TwmTj3t=V z7Q4?t@xi&g zn?*}UqTm^$};SJ8S`(fZD_pu7lAz{;2CZ#OVrPRmhIu}bN0wJ`}sdg)TDki0e6TDLqAzE^u_o8~|#qFJG{=sAQ@T1^HfDl4ruszqE4GZQ(Ksk9b+{ zM6<$MH>O(`-sz4vQDxxSklAxNRm23M*_MXTld2sMYL4Mw@3uw|Hz7_>YC2fOUT@)x zDy_y%<$@um(a=0cC*moKSd~{GF+I03^1@-XilP%W}%Sx zc~nb(5lzsf7E0J6mDMSKyR2{vWaX3~I&4BlZ^VX%6LiE={0$%^`eDQ=MIcK03Wj;e zaPUgh1){rEq_4*8FF;qIJpXMP=N(>-Pn2AV<{Mdmk7fjioLwDHv5i-0>y*_xCN9<= zgrjGBLp(fGFGg6Zr&P!ujO_>4V*@39MOB+TQp;|cs(yI3N$>pDL&W4 za~P_govQ5rTlu`Cba^6EdS&lNwsXa!kdmC7T`E0VY~;l&V!enj$|G$rWMZF5b@QM=771yr#mtOZ#}D za7@a*6BU}Ow1|MR32EEStC!7Y;VctE>qP%z2VcF?ZRI!>3iE;Ps#jJqn23Y2!tZ?^ zr7VJuiRH)wt(E0oYC4Qx7G>4A7V1s;jJug$B z3RK_SA{TsvL_HXe6b|qahqCG?6A$c2yT6`Sro7JMOrG3LXH^9rzl&|B`eNt81)Hxh z;R##dIi%2{X_9_Jw0yTN8^7wIMME^Wc2acCJRpHq_yuPr*60HZu6xYQj>n%)8R?5Y zHz!1rFQN1hHgj)O(z4UYT)VT{z9X$O=)}+U%bDv&e1fR|hxTQU71*0Co9;e$!h;>e z@X9J)M$t-ZG<(ca9=Jv#Oikp}k$$DCbm!_eoAmWS>VkKETPF+HUo^xoYPzC&qGo?Q z^uKVb@H-)x{h>+609Az@q4}>mypJhDy}iv)l+=a~5*Fke(~5BZuss_LZ^|q>&WQJD~*B;$DL+4FZEJ({p&uuoY}cth5rQh%cgrg#HD%18T>e z5?@MFp0pm*ob9Nel_>ROx*jnq?abZj;+5pl2A0@DoyekNmS3m693zBlg6zPU*)kKB z!7rpbipD;M6l%`+VC!P8mu2|tbHzCdj!%m`8xl9iAY|3(0hPfEkxE@c_QlN77|_b~ zY{=cxQddFuKI+AO!w3-j5>S|tc#f`8kb*L(RBxswZ07lm4 zUziY;7m%W5H2p?eic50bK%IPBwa{!#*nqTrB6~Wk#`vfiP*qu%Qs_{82s~&Vr92}H zOC4c+y+E&q6zWdcUp{C#{lv8<7EO)pTIlp7%_g@61>J#|N1`sZYKfDk2ORyshufXa zxQb{`$>d$-`|AUGZGgRpK-$JYR!aj~QveP0iQP|8OW)$T9(*x3sah^jK@@-(2J`~M ziad#GD(f1MAsyW=Q0hIn#}Rqek=JJ6v)#54N$tS3fFk5TXsl;^=ti)(cmj9A4{TIr zbL>St=*r47G3BZ>7-dfQ57XAr=L6`QlF(;08gdS8k0q~g?DC*kVVvY6wk5XqAj;OK zbhWA5%q+_S8YJh)Y+x4(w0ruLkXpuj-H2PB%1FS~eG4SxOcua;ZOvdX=pyg}Mp8bw zO-+bp=qFL-*WyJ_&>C+9%CGUeMBIjfo~An z|Gs(h|1`dTYhC{VxctU}{+FJbRMpVg`oDFq|6pYZBIdYWlEQ_R9P!w03agxhhR6{V z?gv7aNGk;|S42pR@s--e(&g$F^hbeLBp{}^`=J`$7zxr*MtR&`Z+n=V*}Lxe`|yJ` zz?*}kr>S+64qib=X;K-shVX>!KWrbn*+&~Z{e28Dupezq$Q@TuNkmrfj>PTK!Xyxz zn1@5A+QMKyd}!#W2<-=`)=1Dkgeeh0!I(oDv##J0b=FUxE^#JHguM2bcE2i+bs&uz zK4sj_XO?gZ6}JwhpObb6DPDy&u51VSi;G6ZHMJ7YQRJx>~OPU z{c+6pU*E4*`vYS7jSe7yI20O=8mqJ>NsTNMY+)Je)_8oloqYpCP)q}7CS*K;RieH< zu0;Srum-DorV}(h*q86;I5wdX1+n&P2PaT4i9iFCUZuS1^E~QZod(DIqe-> zI+hmxl7m=wh4e;3T}q-7%>i}Y5j)Hqfh zpcPQ-ChJ*83}e@2(uUUjW0IbewXByEfOTzqQ8H<}D3-7>)>5+m+ksR5x3d3F`X}(8 z36(cLbMrM_!NKHk^Es|>WPs0!Z$ALm|8)m&1GF9_0AaYB6DNwupF<^!Vbbd7cav(!kLE!b6U>RHZmC#g>8OojmaY2tXm72(q+0VXZRc_STZ7KlB2D&7&HW2 zzN=B)s;gsofL7d}brW{xIy?)jnbM>k_T@>cR5$J6N#D{73+sy@>27c3S;cH?3ItugV0t{Oxjgja$C2C zh^>d=>CD*K$m}wqBf~{wvN|n`)20*n^b(XzPhwPdnyju{KyEjso z=P#sSRY7ycje%O$RMQo<5{oMwBQ*yDf$uzgRm|U%@wA}E_-q}hj zvj6KGWIa^#=3UaW>Cjqcj+FV#aQ04=S`Po$r|M{=HiT{JyI43oH2e<;MB~6&TO@Ed z!}dTvgWTEmzXRKpr3I%!YqH-A9Q7W#s==}OV7%U0I%J}1>$&U3{7_8b(0uVfR_%dfv&@zp-;$hC`%@d3{vqrrDO;XxlGmn_@iC;v%HC@|fU^mz!u%06Es4`Y6Rh3xI*OV>^_LOb>l;aRn)maxQ3qBkQujGuDe=0pP07PAH~!q z20tN?R$5tHirHYQ<{p;5hIjaRES+MqZa%2VBQtrXEdhx|Ychm+(p_bAhiMpAPnyQ+ zLG+jB7d(q&r01FKR5$+4F3ZwQ?Je{vA`hZ^xljv4Q&(gv&f{4)j~^1M19GNo&RNqH z$=J=79Zjn z4QZOP4;1OXc!8`&LH9E5`Ci(nnTVC1?0xkM_9#EaY99N`JI7m|f)$|Gm2{6E!@ zqSV336%j8Kj^VKGddHc_K1m1Mrj9?5LK|UcK2~FQ?OF~@zm=19{mRV?4~t~xdf4|P{W zwd#rdAuGxgo;i|iafPO#F#E!al;1O6uw1sv$jDWaM+K2{p>jYN!_&DTz0`Giu=^Bg zOsC%-D~FHEjS`Ju%sSmC;haR<^KhB0RFb8jLE?T^ZbJSFfi2X}YpeM27f5sJS zpKgplh6O@>u;quRMo~*FVV;2JY}L-Ho?1cA)M_azbr7_Zm%^wrLCitk08wrcMJ+G&dmp#Ld}ZJ z+b2|t&!?GJwF)M2hFd-{LY_`;%-l}+Wa9l^s9Unrqf%<&REZWdgBV|F5%N*o{3j|z z?u+o`+{H@Hkz%lNT>e4b#3OgCnol~rk>cK5nS64%KB79zAfgYnA$&$YjUTax)|Wj) z_7f^l_9(VgQ59|7Tja*qqn-#Q_d}V@6MBj;jA`Sk>;+twrqEZNVb{fQcP=XWv@Vuz5>9N#@P-Yt?khaYcF zKh@-&yM=N*MK%IS`)|msKXBX!Z(6>2;0X4 z7_G_5B!+w*w>t>#+c-r2dOSH!T2#aziC#yo%_VDez}BLxuB0i$E{A_&qwSHB=pBPe zAVHV6`>C?*k<{2NiLO9Xr(LNOwL*O%-LWLOnl_m=^qRwaxsp~xisB0DX%<(go*UB7bU3H!v+u7FGIi{t(fy-b+UchqgjRr7bYxHy@TrW>% z8mGq>48<#R=A6<$j)z@zv3ZLub8+Nj$;SLBEcxczD$&%jb?o-*2}Br9Pw?G5^T985 z-q*)yPwFSfZ_yFCq^UnL`96bQr5snLFY0FYmHPmcKQDFh$1hPZZO}VBswp%Ab?cuZ z>vc*x**zfBO}?Rv8dUzV_cAu@D3|N?C^tB-CBFyS(&2Wn$-5fKz8z*=6%}e^i^#ysJahrN2~7}^ZNe%@3;OxIZzIUE*AfvI8gud+5dR~5qnoV7Zp=;TT?ri z|60?9s_m$tXrO-DNj7cF1OWrbW>{(05GfU_3l@DJ>lz8Ql)QAiLdj@KHL+?@ZW6Su zo~aPLE56S+%A04LapG;xif+!Xa}c}{Jo=yN?=rUT{H_T|vV?HD{_Q;XI?J`g<^DY9 z@8=D=OUS?0fF?o>!dY7gV{eH$8WF@o6l0~Dm%5+B>!}^ZM8&N99EW;vf7cU6*HN%X zOfTiA6-5JGH`(ldwBfDnEEia4AS|R#=&?-wQ@&nMx5rp#V8>n|3nV+Nw#d`0j?plU zc~mqntIUwc`fw~Zi7cP5bSJZI5`-u0N}2vha|FkeCq0WT=S;PqPs3$&TIUxnw*=_9 za~aDqW?bq_227lwbC2;$7n6O-y*N`kwzIT4lSH#an+bMYW~2FZ(SV>&@r-k#bc`X| zv}#zxLzE_)xycSH;IQI1>s&%Fd401$G zGiKZG2Oyc0`6wN_WFMP89T*DE3o)f!^VdGf-=jemy6on$NxvS!h7pHMt1}~(N>X#o z%*A80+6kb^(G;(be)S}_ldo0SR0^4nkpbsV_~_}mt6#kq=u%_O4hXO2xYBl0M!QrA z8XhaND`;{}85VY14ZyqFlt|9VH;2?1Ph!8lHXmMgBqJK+lGRng&|ZOUTAOwwso^xA zNNcIED;GHa9llC#<8CXI8$*3_Ib^IISaif=0eO2vLJVM?zMw3q7#gjKdsa&7Zi0t! z=03g)i~}oiecbN|!r`{t7r`UgGsgSz5+e6O@aeKOSib0{IA-2Khxk7CK1ikg12?y0 zb^~p_>sM)-YibP!h)o9d?AW>DpJo;t>upLNkr63pLzk%9NCa1hMeJ1v3Cx80h@fAN zP{ZL{-~74}jdAkrKYfu+x%tjL+oE~DpIWWU(@w}I^_pst8;)ZqvPW`oIQ8H(0kk%$ z3N^nSHk}&&dRAXbrpINuD>;|f`D`bh!p$k5Cr>$JaojtX!Hh+tJ6)PDw+$<-O&5{l zxxh_s+&EX&I6b9$LeW}ofAA*ptgO$aKdM8DzKTKKk6|4zxn1j>Oj?Q&-XZQ&*!e^# zS?QE!=7%u|$v0bv;H^)jw&T=$0D1EQ2&wn4zjI1flFt1wNeW zyaPt$xxDshnTv1BCsWbF8#Hm&0`|wb_UX2W`>nhtEx+$FwvKo)ZTBplH)3qcRf=Ov zQE)ft*HZz6w__aN_%2Z0ZFCOV#S&)-;B+|sBg`+>?jvC6CA3T5ajW!-JkpvXvHKP~ zyCECN4TVh*z)nn|sBrT`Qn?((K1b<^m~`SXBCXq(7wwvU zRc$)WA*S}-*>ljm6wNH3ZZ9Q_Gb$z?K%A{Y!`O2pO=EA+@wTSPm%E~IV&08XzD2RL zuK3g<9)b3UMo}yZ8G%N3&rGk-K?r|5Bt7CAab^l$$2ob1K?3Ca7x>%h-oZomp-$Om zq#rq?yL(WVRTa{UhKIL0BAP-0zu~VepGt2jj8iJ#Y}3&lLc%oULmRAGnV}vBpX&L3 z$J7>eFBz{_t$nFH3NU0Xmj^2{`DBS4((a8Z@#BJl@-81JW;*+eO8Lh z-bR0&UJIF81I)->b4<@LLLYezJ%(~ijHYZMdBYZefzC4@#oaBY^vqt7yO%oQhyy0b zu2T!=j+^M^sA|9k2*H) z4za<-yYP-S#1ZFNcvKx=N%|ZX-6y|UV%xL3cZ!u2I>*3wEz_mC?>*PvTt(BdIg2Pc z&cR^~d9_RD1FxXG%}7tM5?Q^2OWG zd*^05Mwfu8{*SyCAT_2xb|d!*7p~X!6dtdY6yQ=wq^3QWKmx-DqBR|x8&$P*mKcO0;w`9;AkaH`pss^vP~f4vi2CZ6mGp~ ztA)dnyy8lU6fK$z{mP!7Sz*a+tYp;F+t`406M>&BqA{JseL8MH zU9-!OFQ?TgA!IEnT45^`jTPVa=Z}kcGTz>-rfN;fDfHM=NOD<^IeRPX$}V3we0cI+ zUCU`T_KW#_edc?m1q0HVsInwNwyMY7rM3N4e7N^?oo+~F6}fkh8*kzz)YvpnQKIf@ zSTzS$Yu#>%b`tM$raW%ssONm`qq;ZumTL*yR`!C7g1AcLy3(Dtrx^Y7IaWUvZATA* zM_|ha%8@5uFSJY<68ZanQ1w{`A!1>!Z`oDLKn+X#dPOYvH%(FkOy8YVmmoS)VI;P* zhlwX|E3#z6c65j-t2i0s`ddFv7a%NM#>h%))M%lxDLXu2woZD5!jy1*(JKE(HljJB zytBREeQ-qMD5cBNOI13iw$CX5#x@*R9vrX!g0uc0XfRFS;7KDvoF{{-tO`qsk~+Um z2keI^kIAHI4E;MeRfoJX5d(f=IbHK^+ZnSfZ^`_}7mr0+ z>e22Z?y8ktnvB=}^r&nv^RQ?)GL_2VEgQag&J1RRb-!uM$5##=w3>VK3x%<=xskZ{eDCshl7;ib&1${@`OXb zXkZ|qVMh@29c>+Atg=&?TETFm#BHWU&z(~}|MD6|7dzfn%-fbEMUR{cEsbN?qRPX) zp_&2f0>P~*123{H*o=DJxC~SYL&uadd{NU5l5>IK{2m*JXFCb<{=CN^XV|yWrGW)| zI;GcwbbW&Wwmi7eA|pbS7ke6ATBbneEX;`}esEE%Y>Q3lh=rXkMdKBgH%3A6cW&>( z3)+e+&5)wAYF`~RtXf4BtcxK79XneYtXj=6HfKO^SC%#(BG(b9^t2%XB5YwMsQ&59cM z^_T=)t8^+(l`tyQgmPsSCI^eJMTJ%CrXriwx0e^af4Ff?(VC38PDw57XL%i3l8?wr z6#vfqghF{xs@%TuO@iLIJ0Wo751H~EnFK+g@I>= zuJ*H>y5IE1`>?Q_zW}u8(e4qLlmVe3GEX%HwwC*2Xn4Xp2L_f9@VY)9>xqS&4Z|fU z?4#a7C%h~Q zSsSFbpTH-lP%{0A#gX(0z(vU_^7>vyCGs)c$<6!sI(@%w1+Xk7HOeG?`NUX# z*T2u@OK@m}#n|{O-`8x3yxKVy_YEd3K)VA)fI<%!FQA68o+Y%$j9Z<@Z1E*=;D=u$ zt-$C8;I?KJubx%7zUrzC-SXBPtG((D-L9Vd_1@M}IBwqH4%{=nJjMPZ1mx_07^14) z*LNgLF-D0iex&UDVX7f2Mklh~11QL!WMn4~)%zj?s=}GVS!4rxAdrsbP$an8^DfvxIL7a6iTG=>9-Sw`ysuWo=R(vg|=vKer#kiau`CHdJ1 z#n*xFZp6YLhjV9XB;E+7FHE8*h~hWE`9bByFLu?6%Y=Jd{GVD;qrfYyOyVLNBjmopU`mC?FXi{LjaB$ z*gL<7-oa=CCvY8#^|(6xLpmG8=>%i2yC~1dVJ?b#{^ay}MVRUl2I>t2ZQC5_`sooR zh1@qt|3&&X@`Nl`OD2nmw7%iJIiSkt^(`mu4{DEpVxh(^>2$@}a14i2kbP`2&&=Td%ok_dfWt-D=GWfmMbF$|W_pq*2&e^f2p8kSU&fh%$6MY6w z?+)|r>OR0wZ(_oHNUO$TV%WJFuaX9Bvr57-74(uBBxfQ|+%s1lEn%L%3Rf&N_yepR zHm;u(r@V=&C4f7Cec6I9*bQdE2*~TXI>h3lMfpsgOeeX(jrXc(? ziYe86qYctCU9so@j~f za1D7X>+R%C?B=)9Sv{&aq)ax^Gb+DpRjI0hf{FX((@LkEEJC}{4LUh~97zlyYx1O` zIg(+HnruX|n&j&8jbkY=pToi>sNxQ8HFuO-p_=O1&tacF^1}FWb<==(BTBX%i`^4W z^;eI*sQawU`!vY=&TuPS;?^(c7-QD>L-vi`U2phDM+k%(5%{uBj)9f$u#*LY&!Lt% zS%Q35Xo`OV1#T(eD=i^a>j$|N<9^0JV$d92^Z?tF zBiAF1M-9Wd@<;RUK6r;IX5QJwB#ePS-EO&nf1c z-%;K3M%inwZqB@%o6@BuU6Y*PkD4J|3`qA3HDznpq_iF-u(49XoHs>v3nKh%JTzLu z9uQepDw-Tun&jN@wo2K+V3t?4tJc?@h^U3U8RHBA+$Ca+AB+%-y7Cf3$FrM$(+Y zb^y=5l2)WZo2!$Q-&0^{ihhN=|AL}W!knj`;-rh&ALWJBg0_I5P;H2JR|D5E-8UIs zgsMRU7qI>rIl>&UuUM*2fl{2|9K){4#T1xe=IClIiCCXt>d#q@xivgv`` z#SS^cgjzLyxrrQ(E3!e}1mRb=BLb{9=;K3Ric7Y-7mmx}H@xs->h(~L>*PQBbnlFN z5^)ElXXx_*t^ce3j%{#fZ~RX8BX8M%!2XsRB4|ysc~-lzIp47G9ESL09Fwn_#bKNJ7-Cu#b9F4`B$vlT|))WKoZ2u_J zOL=sMvvfw3%LY}5CL#!9*GQEPJqZmX!5^5~g+u^#FZD~aSw!kD=TdKe4Q&n1Xxhb8 zM(Qi8gGhE&ao~?s_^u++ZJMbXszifa^`2A|OOo!0T_@gOW_fe1iAIe7o+P=oB>?oj>L z2mQZnQiXnFAOC^lJ811~Yqn&!R7pxE(5)WgQ$zTA2_Q$<3K&C@ycLzYe&2(26`3%ZDBTw6phFQt)K+u^w0Ed&BZH-WZ z!2p?|NBUc{4km&DY!P%cJh9sGFdUA!Ioj`ZOaoNhT+eN8)zh=Gl^!gt%8ycmdxi~b zWvf-N%7JbU?%eLM+Se%~j^m?EuyHdAJ9QnQJxIN{>1-4y)mpm{@Yt)iVKJ%b*s^-$ z+m15q%5i#oylZvog^>PR4sT-kot)o*2o7tF^<9OfdF+k@@E#x}j79R)Yw|S?_u*Ql zXw8?h_k}9y%Ir8NFuz1Aq%Q#OTTxMgGU}(IZl$x?2-wo$Ow)H`NqY8uq9VBY0am7m zBt_VM3MOS7gS8SiXjP5kdH=1K;rG;>_Do$HWHh6L9cW?%1q_D2j1LmZXJ|GwRQRZ5 zpf<$E!JPFJX@M9s5WUgATP&13?nx$B<{e~7A|L>JCJtG8CIFpD2qy(S0KLG1Eu&e z=U6VR+!t=%-*`BJH0dtLU`TX(I7I5a!)$+g2R7}STpnVaOQf1$IC29sQor@PF0Ff3 z1>ZcGSuH$O&QhIX96qDGeQ+t78-O?rV;3?xbOh_1b9He`!caw%t{PW0c?a7z`N*;; zKzQNeK8b3Afo12X=1tvv>2gvL^NZHl!G(`ylY9E|5iLvIbq`u8Uoo^=l&-PmV)+c5 z?Jee#e@!|ui#VZ0im5HpFV6A4^~n^;$^d2ZD&*cG-pLCA3)!s;kd>ZRhA~OLb-jeO z@K>+QJru56YOeOjnMAU9tTicEbK>Ha6f262D-+SJE;CQ*=N7LDA2V)kW~N^ZtHdb< zpJ3K3DHue5QQK&s{O`i{*`;m>v$Ey<%%r^P?Pow-T1JIi=QD0|Y7Gz+yB*lshs z=WwEGns@1N{c37dQBxR5-ftu-oK zU;m7YH^mC*F8!wCwuAqtz9;;5egBU0fN+ek$;b($PE6mO~S5!5Tm(if?HpVMoaE;oJ$g^22Vb$NFw zT3Bnlpv69da8vu!5!V?CT%;Q5d?U#3q>G47h#AhHB@B2^>XCNHx z`=Adv%SNnA5$Jg^9gWC<=i60qvDI6^!rcct)sU+3Wva9B|5EI(HrYmlDUq%6T*)yy zjZ7O$(QcFjpR36`f)&!5c}U&gqvv2x(T(LL(wd{(EHkPYbj!ha*5@-iO>!kkXI=TI zEIUa88`)|H;)nu^me7sMu3lrsDQ*Oa{zXl2>HwEYPbG2Inyd1ro@4GPZWKEwnqsqa znj+2nb3sl&sccY;)+*aK1oU2Eo?=~Prj24QB zg|R8Eaet&Lgu{cz5bgr@H`>M%4i^wC-d7%J>~+}6`8Dud2CVWK<;3!&_?kmsC(aFvD_~?ExfZr0V!Npm>#b2bb0V~70&bIAYwl?Hpz|z^2)lMsE*0Ej z#_ILGsAwUoUER1R80l@6?r}^PGV(7m9jSWEEH>lM?ru_^@y#+wj@(}_WSTy=xOFe{ zTwD3I%knfcB2DQgA)j6Z*z@u9_aRrTTOu3=mPN45tV-izUI=0vrb#YQ-B~Xh9sIh% zYd>d0z$iC>;R%QSR!v+3CXCgR2@s8WJd-k_yAvvWfa3=W4xrfx?1|*k2}A1=iIE3QG3e3b~S2>*ioqG65dYHL4(Jz$4{7}Nzu zY9iV?Lflu{Lf>PzLdz(|$Qz^dy`ZDr3-S9S_oH0?$6s~tx`iFdME?ORt~ZQ-h#hoj zW$-Y*n+)hbHW~ZBYcg3wXBRnp6H7BoQq5Z7L|Na(r8hb2o6OBy-Y2~qTFPS6qX42k$$8G-Zq**2j)lG$kxpi=0zPS(vmZN=B~qfSQmjwD?w8r+~}b7P&vCV=dEH2?ko|KXoA@X zC7DFB2K9k0l0VvhJ+znfQRgH@?L;?l6lw4q5rn zg#6rxpi^4k7$dv_Uz_Fqr}Jl%;{&R=0t02eJ;><`_`?d+X5Rq!qK1PwlVrks7Q2F< zD(=^he^fX}3&(=r_jypyf7B^c{JRQQv@x`_Q~lH@ups{(bUJ|pX9 z`V=5sbXy?~bjU}8`p$~?G@5nyuO?ERubLTO~Qi5S5Yl1O!SNn(BJ8zx1fz~S4v zKZI8rzhIzRu%jyk~*=39*lG7a(gV=+_jTIRhsc2iyt4gVUSo$xeL|53Y%=in^q3_@T*;-}Q5TfFj9^|) z3(p3}q0zGNaF5{zN82yVa}4_Lct}yn%2b&asIDz`|7Lz)madE!#^XDSs`^giKWGYP zQd)$#GhzoxdD@|6Khl|UF7s*~wGp$A}h{hIab7fgQ z2)40Q#famCCL@J!~Hfo^`iIFR$> z(qiyqt4@_ZooV+?jvdIF@j-mE|F&jLrtQGoBYrt>7;p1H{G(nxBsdiT-@5j?@2U8| zYpDKxy*Sw$n>ss7nf#A>0oZ-}BKWeiBQJC)<*4Qt!vrV5tWK?gq0|VK!~!IjA-36P z_w5`ncWsL96?g-NOZNj2c8d|4-6RRw&WEn2XY-uR+|2wx-#&i~(7VZDcGwxAXp>iU zBuc=up>Q}(4YUOUz|UdN3NKk`+v8tDzNd$7cd_tUw>NAj#A5n6lHqx*NZ7RBJO*rO z+vCW?T>-@){f(z^@{e%uaNd+RUO2PmL|mrjO`+3G>9?ESf!1&xybXq-0i@!EW2cqs;X{6x+LpW+bfjyF*E&aZm1KKshxrjJQy#cDA1Ta3MaqPBkAPZM!H4piNEURBV$`jIjBnR&HL z`Q2pctGXC%!e%5OQx;u=80$*66ry}wKRyGe|DWOuGOhy_jPKcm^&e*w{=b_||59SM zGrd*cc@JQ_Eaz;WL7_qMh&UKFwe_h6iK=eaxT`Dwhq8BIvaC_oguBbOZQHhO+cvvw z+qP}nwr#tr%T-hFnQtQQ-0z+fF@Ipk+AAV+W#%Iz!V9t$)rQ;O*MebTU=SQb>_eWD zA3HRvzYv`O8v&ibvix`CrOJ zBn3F{J`{R%7rCBA!kkZ-SjTa*RwI?Q2Kk+ubG$#d!|w}Z-AoiooCsLZInh&M={$Q{ zR_f(vxbvPln$)b><2d+Ab2BZX|A~6}Kb$%K^&0}tHby@?kFBM#&HvtcqLi&25tWg=ZR*G3o&1^~g8(G? z+{Yw|=M91iRW>vl(-rWVLOs_>R$6PfpfjKaM{Hqw0%^U2(2>gxM`k{td0tSlM&NTg z#CPbxrA(f)yF8{HvmY`WSZTjLogsUHY)I*S{i6+Vrwuhm;(*@n;-b@tc!o*6LiJR- z(iE3Fqh%9L1@Xmm+>NOp_b7N4?%JY-{oHo95^Mx_2eaZ&R_^_-Y}j|&W?cTpO|vgWc=cjFS>KLD!!K}KWa4Y(TdinO zn!O37o@<%ef)(|vNrSK+eHLF$Sd3LrxBB(eS+Glw8N?JbZb^g%Wx=s+cfi7~i>2)N zYY#mbd*cSxjt3m|mTzj-pXaG?bisUd%&> zM}%wT*L_aT6sE8ut}E^5@j2}23oj@6Lu2dSw_P%ShId+2tX=LfZlWS(`r#+4iLVS} zs`WDi2Cxy>)w_y1QDL@5V}i)+HTq?cVUFTa(ya@V08+k4jFkInzG&b*1=qwqy80!r zTsz1B1#?VA_ufXU9AOq=3j^hw6IbB4HFVq7ai2YA&0pjWNriCx`E5x-+BkMmrEy>X zsn+^Z+12_ZJKAZ;j4{+@xCJAJXsKM$5WR4~^d8)R=0=^Tw)6L-PL!t~>w*W;!osK) zn>SwP!^hJE`Q||m$9I=~icz5{<)mZS5^P`-Gf!DK5rr<^3nXqz*hka|aSrUu_b;P? z>?=vQ{5GsT@V46?>f!618z% zqn&aBX;v7noAPknR3Y;8@afd@z^akN_zLzo%pDoy~hJ&^}iWUwPBh5o&MCpmXc|g{mI!o>Kdb_F7+1~6_Br4 zQ9+(O4Q<18xi^@!P*V(-@yQQb3p7ROZz$Lu=jhEX)@sbtv)1gu1N(l?Q;gKoDIP}H zTaKIcd+wd1z1hrF+QEg_t;AD|SA-Mf<~CD*CmB}mAMrmNh&O79Qm@$;Si0PU?Hmj; z@as>J#teIG);+6KwvTMKSD)CyMmB;i!=1et_qkaspbV+6DG=6|lc8cxvH)!oQrzyH zdi%2!SWQ|r_P0rRE7NFb&t=FBJ+9*x{cc0z5v3uhIFg4Tv(LbG&8Df=f>j;ErmQd< z+ED%gj~r=4ggkc6_8qy%n?0M?ce%eQA;nl03y&DlajR@a+VlW|2zOoN)#DxH@5GnFr zsGFPsr~zZHfDo#51g^+ttIJe$gygb>=z#32+ClDC(i#a3$Ja7OJ4+>k3J`r{?P}-H zri!Meok^Z(SSk+(swQ(Q-^cWQ=oC2*<4}*d;{Lh3`lEF;@% z15g~|fk9HE7_U`kDgbwV}0t8k0}?LW#s^+SSUohfgS_Sv+{ zLM`q*%JZKP&MY~P(Z7o9XVbnyywRO0$a2iGP+=kpzIzDIhkxW85?X&!4l5es9$B8E z0C%lm2hp8!awLYRc;tL*W;2p2dke5bvmu%ZOWn2U$stl&^ENbUb(PVyinX~KS6x>k z`>p7wu%MU9Q_satSa=#|d-TnnY+|B{f!BNpppfR-ru2&8!i ztZF_6--4VkAZF8#nP$K6#Md5t#rf{wg)tCoLmObYj-~S#K;EZ)N!^99G2g?z0S_n= zQde*1(?;rs^@jF1`^~BNp!IvTiWduq8;1RAIMh?07kjP!4NaY!7stgI-zYM_O_~YH z6obdK9wU1giDUk_+kl5Ue8@h3j)wZpmtr@aeu#wnE_Y7<&ihXn+hO4kcK#WTAOB-+ z%8!Qq|H^0oVJH8qiwV0K8r%I7Oa5P4S(d80ou(@KS2Wd`#C=r4coG(|{XSEK@mhWS zeBq*lV(Eo{SrrwFJ!0-zlP4kN9LgC-(}Dmi>Uw=rQy^cSv3MSp`T8GoJZd^blhi%G zvtB^kUc>=R_Y0s&*Xyo$>XC@xxk>H~pYHGXl!u%G-jC<2ieEM(H=bYzg{W0x?)1Tp zuqAfuAyD-^(?^GNv>ri!GWq5C$3Ssq#$)pIHbb1*G-D9m3ULHeV{^oTPtNy73ZBpg z4IQo)?jO*BW8P;2Ne>?r9KIFnpBq6H6LDPX|(N zje%*&Uc&urAlwkT21wuD5xM}rz7*Hhsgvg%%2spbrA`#=e;*lf7@iKr_kviuZ;F{3 ze4fSk3E${(BrQbV<si=7S;@S;SQpkWOp7S2#S1grMbX~ z1d&r|5fbB53Qut6oSkr+)cP)Y+|ZA@LR?WlJvsvp&I_PhB03StGfSsQrdL3OsxH^M zsT zyEf&GYUefHaMK(XBmUKjCFf!)6~|q&7gYjPF2oQ8_jGvM{kKtUujm`MdSNhYk&05+b215VjaXQ;)Vzt2_4 z6P1?yB|H4)z!(`EOX&{6J2xK_SM^p9nYTX%I9)|Af1f}Hd9^F}Za^3ZhrA1vSN=}1 zvv~hUlpOveN|q{1SCCWaDBO1zzhc;yyCc~);8q*@NynovFhHp(PaW8xs1_@au0}zI zZ)7a!N}nT0@g92d;N;|->Z@Tl8@rdQXbpEwmE~q&6wwqR>Ci|OaBACDj}K91yzivj zQT~Z9SJ`cDg5gNx-6hE z2dXNUnV`s5X$5Ys*11q$`-6LV#?7?oN{2sNzdR+!VmKD15Dy%G&d{!(-q_lzjuS!K z9S-8GPAW)wjv(iLKz%Q-_)5}Iw(Id^)tA~>`K-F-`nSPgVZ2EremSbXz<;khV~6V4 zkNMs>O|!yHX`2~SmF(ETu^pjG54p<$>F9~II0@k`P#-1mKY|M@-g$mXvYr?soA48<#S`rBep7_ik1No-rNT=dWF4w z0QALL57K}=?2vdF8w;4){Bpp%_fq}TwZ5kQC;SB23)kp|#%XQ+uLF^B;zVgi&_g^q zfpXi_S!!9ozq}PPid3fKR%?bXIHS0POtbXWf*o=GN-aJ@*mN&9WRW3AHZbHz@hY|* z{G?bG!XKm!m+pKVDmAB{HE1G zyhsY;;RiPcNBR&}r*kK)W=*fF708ozwHVQ1<7$vr;mRDAgR~&?5K5^HGvI=BZ-=}r z2S37^2t`)moG?QC-`~|X111Uik`&cwa5ZRfBcgMrAmq_8d%yEL$cd%x(~I5qYNgiv zykW97nfUB=UYZ?sk5Rz8Zy=VjEpzw>_ztDnj%#)B;Ijrm{2o>Zr>OyM`e~=GQw0kE z0Z~uB=j_W2WM_fI<#zZZx!KWwqE-O~`>5Ykv5wMFJ2M#xXjrh!# z>dE!ZzCZd3c1u*^u@!3bjBDBE3{-t25Uc?mays`=9#Xk(Ilm|QUI1_aUPGE)fVCdO zImLP_j-uOTe41Nv#XKoizmh+HBofd}_n;E%iP`Bd(0OElUxB+)`rw)5!q(p=VaE`LbmF)nYG57`LMy0{JwW`J$Pr2| zz`Fm)5{9424@A}56^?v}QysKS?Ip&kQ_mdWbVFLXMf(aJxijVR>)HR=q-6JU+%Ud} z8BORQrB=j)_sJ5bC;{cckDWmtLemmg=qD-m=sXzQFGe4AE4k(GpAT%=hP!C$zaXO< zPDq}gN1uM@Y`c+2*RZYf_b~DCjM2mi}*A z$*rr33GmNyWd0vzzW>9W_g|yMKY*8vzV&}yl7f`PRewSoX;RP8X!OBV!=?8WjN($|L ztWDhA##auC#%SaYC&)WBrz|_uYD0x*t0C-DrFH^nFro~c>mJf&Z0&hgYQcSw(KcbV zdMdQ(>56q>wpCG@o#cN0#*Rf{{L*l8y~oEaE$Au(S6fRI-Fa!k#22gW>RL6YAVFpM zoY*2$QTmryP$1;GQTgQ?00^5K8WBPsnp;SoXQk%yqP1E%jFCAf(t#YzSH6Bl=mKK_0JLGjDa4g?T$ak00H~nS z$V^$!{=bsuz}5XJ2%|j^5E!lx`~pK5mh1S{2Pu!M&AsRl5pc%D2#ELUB1!Se(;$(D zW`EYdlUHm70O$A0+J);S7)B^2iJ9(6rf|blE?pU-4<(KSqttFOSLbk)uH+$jIS>$6 zpe-x51O3a9EcG6sdzsDh+hRZ4FCo!!wDNsIMfBn`OJ=2$ zwVVZDX%@s7gmB%#e2XxAACa?fZoO^zfHsfT5cd?QJ9nPYbDQ{~mhNA~C1d{WzOB)ueEMcyr@HsdM5Iq9MqgHLH7qe7n;w51gIs_;UBU|{5 zG*$0o7&x$|8T)T!G3T*m0v$s2gUygC;xX(?*B8di`Y6?>pT6(ul^}9 zIeiC5@~&z0`kHNHm! zAz@rd1CMPstEj|1UDwv$DpJl|Gcj5u&Ju(&@gZK ze&04qB|@A%OnJZNJlS-dd1j~GaeHq&`CXYT$id^A;`Bk>E$@%`LJ93twP(xZsW{N$ z)Oy=u@!A~Rvyey00lgzX;mX`unZ2_>4~Z&q=kD19RI>|;;azG-qjSH1v-BXU^P$GA zyL1QpBASKzk%0PL3G)@9@ukfFC7tChP5oWH$IJ8~BnthdnD;Fy{-}uk9kqhIH-mHu z-Spmu`dy&oou}h{HuP=r!i!C5-xr~4{?Zh!EU~D3{wWRJGiTowf0`fM;Uw8E{*!GO%?)8}#-J)%vp&60C@`YUutN#Sq+V)Rol^wIch zF*cK8(1c{YE2PJ_zitehnbCv6`Sv`pLJL!>SH)V0(y-jf+kKeX_2MRRI^DuaCyB? z2}ELS6wJ0^q@a^dDt%cd48rJ0Ip)t4oJCW!c`%G|M;9_=4*ZVz2T%U0zk|P4201Hsy@p>hG!46PEa1=i=!zTZG7% ziyFJ#^+lGn<-w@8GJJRxIAJ=NXL#S(uWNK>$}&Ej4y!IWK0L0f z9)9JV5?ASqN?Q|3YBJKC%W+ePcq6lVJaNTyDRvY_iZx(y7xqHlBz!qD&Nc(Hk#(m; zgw1XRT&AbCB~Q14mhk5q!Qs9dR=A-}U8{sa{w5lhM3BPW{iz>dtWkmfX>Wk7M!Z7S zCK;N?6ATto<TpkN)FLLsMT+XZiURc0Tl}lJG);loqFe+?h~>>FL884a zCEweS!5pS+_IZrDevMS~P=#L_e}!$22OfcEje@^uQ`ECwy4iC6Isrx>T$}D`UpfGu zw72G3N{t@iBd^cMX>@0V!ERLIosj&Sk0^;Cf2gOQG^;)V*)KzTzDT@9_K#5uY|Q?F z(JV?-N%g2+%w}<5$5sgK?g5W_RpWUQr`o0|6kFfCK&x~>-ItXo<;B)nLPz052<-k( zX5a?t^QaE)^d7tO5s&i*0tuZMsQI>6yBFSW;#j*tNjo86SSj-p7AF5`Ec$WYy1$BDtve_epvoJc zCkdz1>L{1PiZ^EmWI7+QHxGG505jlDr%Be6);iS8Zrfisw#xKBY?9~E8X;AuP|cSl zH0a{6O_b^2n(Lqd_#QG~T6ap#5He_qeW~@(>q@J9EG~wXys8+EXLBPoaopIUBl(xG zUlX;dU`&?&Gf>B=p0JkAo8$z)J3xTynSGHDy!QoUyi$WXMV^TWz%7Vj!O9`F5>^;2 zt2e36PLRv5Q|Wz(hOZINo+}2QZ(2Hhd0Dfm%G-D|&_^sj#4on{#OC+Od$xG?5@H`` zcGu3N)z;Le+&TBXJ9b_bE4?~nnPGJYa_aQ7@)R8;(kL1SMos!*SmDBe72@7a#*1N^ zd;I$RY!nWG)@!2EL}@)Hxj4?yy!PZ!9|dvJNc+#EryPLSK&%VXP%$7~Mqq~aMGd?= zPTsT7eX02qYGq-_AjK169*+CSv0oS-ZVP$V*IZ{ItcT#ytmfgyV@!$8X^cq-kA#H z$E4`I#u(@tU=~C{aUP2gw$$}cmXML09rmP$VMX2Q)s5x4M8-6l&jMGr!*o4M72Hg$n3k%Mh)}~9MZq8%6M!RM<$Ufn&xu0 zsK`~QjH)VVU$P3ds$dqV(hsHkl zOOnBvp#?E@ht>x-ki9X4hsZC{fvDE(xp)C*ZyN|+-~_eU0}%`HOaTtPkgdGhIaUQg zJ{c|cPNctdAmBFGvlxERe*x9H;`WQ{yn{U-kztV9#|0x|Fy+SEMb}5m3CHvb+Qe=d z&U%Q-ugh<0bPg+b4r}if19daHwbu1>``0sPL&&~k#v~WNIdVTQ}8<)Teo!VWbeD%gH>!glvt}+f!G9DfruJ zsRd7CZedpGaMi#btv3fGy3)OTV1temquk09cFtuIQNn0R<&$dxB$)^xTw-5kz~)~r zuXRLc$q`ZnHNHS*OTh!`1K%BfuAdm4SKMNbq-t7!9+}%bw6G|5Hiqp9GJ%mqWW?fs zM7@rTrfgwaMYMO0!GT8QdW}ppzEiwI4#hk~;$v z{n=TUuEpagJHK|6c!DG|Al)wQ7OB6Ff5ed4cR;~m^ehBt|4hyq+Bx6%j$;yfR*#*t zw`PzyrUK=7vVS#lr#=LmbAYcK{RKYHYjB~(GA+q1^J4ze2{sZP(aImbDQ(;TO|r?1 zYTvb4EUnH5Ls2m4cR@gLM3Ag7 zqmD_E=tYu|IO*{vAj6CSO=!jiZo8n)WE{y?@Og|mAc1T&g?@kmT3;G=WCT@_id1oh zr&V;jViI|Q#f86u*g|5s84I{6*1H}#7Y|rTsOL4@T1M|`Y&qP@96=4r)fY zn;cok4!SDPTZL|D2?Ix@r#ZZu4cLe{8%OVQ_$v$OauThBq-;)Ducb;PMWKMy@Nyb^ zRdCZ9{opTFZi+7_!*CXi-e0uqbL$s`a8Y~L;Z{=7rWB=jhTyb<^9h9@29X{>D#bp1 zwaDnmI$m6)W`59net6(`NqDAyAP~gHKw)o`?GRu$-VZC-Co4G2RV;ri*bcRX8$FDt zI&LfjN3l9)uHNHYIBjo#EuKj>k3{%KHp5eKk(m@Ua$WpGF2~&rsqGtjFJ0sF?qRn# zbR5I-oHz$A8pu2Hvf+{?XpEn?MbkE7`R;>c29=%?ZQIYD|{Xp2bHLi76>5NgKT9T@g1A<0t6BeGCs) zG`h0!73bm?m^w;-dBxsw$4f~wbeR^iRR@&MY~+}^k}LKQ9}kZPxQ^HPmZu{wF>V1K zt}6yV*y(-xD!F1VZlAPpGh>b#w^EWos2U{zS24`U?yZ+bB~-uh>;@AR>K)+Oh3F~C z65(5FN+J-)hoFz7saP&h8&*#f>s-*fgZGDI($4VCw-bV7$Q`1nYb*8dgs{g|atgyw z7Hh}#Yybbi@LMm9zY)u`B>Bin?_S&q#C1N{bKs2^z z=UNGGJza=O?Xu#+`GP#0BTD8Ky%DV&L@H)WZM3rmLC;1cV3V@fk94aakyOpr2(GFg zmCV{0v=!7HP(oHt2h^4nIEdLOB#{aVEKah<@3n_x0T}2{BKNwtiy^#_o?W31a_@SH zU+6)0yZNE)or&2 zFn)a`>bPM;rqwLD0aD&N{<%dx9ikQgw4Co5LbR<%_z3>(9@oY_-3ctRhTlUX{F01x zfNa0VY<~cKr>E8FfUJ|EK|aC!7wrbKV8_|P++g#YTw?6I6Z^N$Hp4iEL%j1D(so*r zqPB`~cyQ3+YbVC9#GI>ZAdhDN%h+5oi!@_d;|CwyNBepc%o-C97nP;a9e|D$k^`%- zH=|5|jVUd_98nqqJjfTuX&26@iJDbj=O7&q(?57CaAdkBQLpA}{ z&gUSlel!Y4V|vmwVzM}j#PRt~eYff=wo$j_s#ZoQkKSTU3My<12E_J>2?Pfo&BpSp z{NIUaH=GgAyb;D0Zz%5!F;Vx9pY7b6Julz?tla*>X#!|J@~FfAD37B0HxQYKvz3*g zmA<3ne>-MHDOvtl`5mA~uqH>jesMmD2|Q7&0*H<06;3 zRUB?7MSwo2{#s(T50!ttx_!}Mo~@0rz+sSP)paYVC+o|oSA>4;)^{{`7qVQKg!UOOs@W9 zRCm;}SvKE8h?$C$9QCKOw_+oPTywRR2jto2YIFMf$^(wrmTq}_MbXYybW&eA>}c)N zLVuJuO9YAcXeOk0yPmW;Y%kw<&_rsQe}l)itYC-ee{c+BE}PM5D33{-lC>&5kwA6S z*z^%|=fyDem-k%fDE>_;h}#(bSQqO5H@rAX zMcegGx92)!|5!KnKjcKuj#IYp6t)Rq`n7W2&*xW_NS?G z14BUDBSkP+zGVl1*tjHcg5q7W%-gqm{o&>YzGHDGac}@jtspLpgYnA~0NUO?^n}77$`ZAB0jDTkGW_g(DeF}_Z zq`{n$Y&3H;*+(2I+8lN_Y?x``pgTF|k=?ouUzfD>Iwqo3rC; zmx0%-QD0e1I$Y>zW;3??Ca_WwXT!JikyaJ!wb_?iJMcc$E&JlaBYzlq>_3dW_w{@f zsx>Hw%cRoc4zjIY2&)NxzfQ@!4Cm;Tl^tN1E2Amja+KjN#z4q}f2rk_bZa|*Z;4E4+Y1&N_+d7wx zY&?=JgnG}m#du3>lFK>&8_fx!Wt+9=0gI9v)QG)4$q?r`!MYM#aHoZAhn>}v2;`^kKHQ8 zwUq61v6$>DO)2IAsO8U&g<}<;qRHXLlnbXL=YB||;b)6^SU0@rE`eHAJAPc+i_cDT z*xT-_KK?H^yH|a)0sQGTwoKPD6zH5w1)hQrY++vNokOdz=FaN51b3)7bkD%%$voct z7`U;Ia52*zL^IwXw-Gj%kZ$y03?VGRQ=w$~kUJFB_jEEb!(U*g6y;#1=wIt>Cw;q$ z!rWu5O(}Yb%_X4_AFJUAkgm}or6LO!(9D?YP>xY2`D40=W8}k6NjvZz&8h>2-p)v; zdVk6H;e|vRFK5Jvnv|U)g%akPZ))ihr7gzDR8{piwT7x+mnTA#7waolKLH&CDZZ62 z({y#kjgiGnO+P%Gnpk=k2M11kY(sBvUt1t_+Q^KGw23AykUH42ML?(JM&!?vOK1$S zX7&k&>7yK5!=K%fAzG0e_l-111y9BCa0y(PWRuq*= z0d)-n8^8)Y`%<|pSJAI;{Qg3Hau^6?vfabF%$;c~m?t0poh0DndE5N(>=k;)h5MK{KiYS1Gc!X?YXuW_kB?LuzCBx1|VDJcX0b`6PcIa&Q0 zvxl`_#;;$+3LE0h*Gc&bwAF)`*B=2bJwI{hDOUDE`_IU*09*V6X8!tx@E=(<|2_QS z|6J*%%x#QioUILv9sUcgCQ4~TP~iZyT84)TEh5B*%UIJ=DVK1?zD^|*boVY1*ss$uAKTJzZyW1zyBbMS3`13p^2 z(*g=*(^bCRN@Tt;C3m|bL#6Wo^O0jM+FzXvw${4 zLAH%TtLxOj_ydS1v;Y=aK6%wu%zook8D`p*^PhaOlqLU@beC8CsYbI5l27v%e}>>b z6f~$#wH;w?R$wAPYKAbsBlKw`u7buUD1MA%m>)pN6dhNOWDG3(#f9) zGDmcDopH!Zts@GJiI*_`2mDP*;f=-^~FAo*>@j z86kp(cCL$3Z6I?0@*y4y@;r<54V*MxYy8!=rhYGd( z-`M(`Y`x+yz*x91FSK4i! zxb@n-$(vh0O*lNcn;TZVJw2SC8wM-A27P8(yEoscA)~i>@pj*-2xeq zVh6*PZ2#&;WmDNoRtW4?hQShT<6PP;x((}hI~FvcI8G!yWV|as3pPl}l<0AL@M&l5Y3&m;9l$wiq)K5l8|~CVQkV`OB$s!$VL4A;AXqPznSOP3k@L zgKpxoXvb_m!UuOYqYnfb(xJV`Ohm|V!^Jw_TZbs9#JOA@1#7QZI94hwU;f!Dzza%9 zW6^P6Rv|lQDU;w+xCGZlSw`LvDqu7f!!?!utsQ^N45)eHHY#sKCs|{eUp;7T$Cd9+ zY!=L1cUNEjx~C2jyI zo8T43`brSVma|&G1b@hP zdHlq}m*rU3%&k0P2k(?Bf~|@73z>YDX8e9|f`ti?mlv|bDWMZMkZ-3Z3?=x9V;ZLa zQ`&8I0u^;VhocN1+|c7^tT?Bu|51oNJ?{~?=}SpxhfHEZ2cvAej)j;C#I)GPvWVd> zd}?V?+C~^#AIKB}v^5Q3o^QM*%)rcljwJ>E8amvWck=5Sy>18oyABdaF->+t>DZN1rL>6L=UC%FEeTh^7W4+)Bw%)-1|q;TRtyqB?2!l&4WZrYw&LNgW+eizZv&tm^E;pk5~$d5af!x(clNV*1ZZNc@?^f)_fY(?dj;^$QQPcM zn=h2Q$RnBLS!leE4kHWGfiT*QcsrVCAmK=y>7Y*3!zDNRbCu`@AWz`Mp_Lq1M7DcY zAm;bKR8S1rEH6Vpt)U9^KdGSp-4-LQ?`Cf8Y^`Yi=f84OqLi*27DSM^Ehkhi$)KUZ ziSPl|6(~4q!ttf?VEp2Pm$4UMCj<9%kv-@E)EVyE5yvlXe_cs|C%6>D&bm?zsISpW zmkRobc|2ct{jB!a5)#ycvDTZb6)7RF1&Vsl6KN-iFN#{&VOG zO!Gy0p4GwxQ;NP7xS%Cj-f?d}6Jy+f($p+~%)9Z|KbvT|Qn8f#ulL{0?0Z00MhJj4 zIq$*-N9P{oKjo;12G&BWZ}=2ZWXacg5J}Jg#)jxD##FWEkuWuncYw53ZO+K=`WGrQ zu&F9@98tglwFL`ok@$Moj}5C&VtfqYI6RjU#B}niItOFeHH>m>2hJS7Bb2sh8sC}h zd_s*!3d)7#>!}5oaxAJnYEjkLXwrebBpN7Vch;>(qmvsg_d%YYN>N!4t#upH**P{O zF&6rnY&6*XV5z0{3WI=GQMw1IAy4k&f}}l(?fwLUp)}iV46dMb|E{?V`gSY;lIawF z_dcPo`DKjbJ}~C7`sZ_Gy_Vmvu|Rnogu$vzbWFvESsGnz$i})vgBpvmlOFj=8(?9& z!!I%wm%0rnS_$;EB=fxEHOTs$wGS7pN3xKN8u?h)SR!I_X_qkyJv%%9$rs+dI$=l^ zZfGb)3>j62;1g4uJX2=gsb9F8R}cn9A2PM*#FH1=F%=X+G6g=&IXFn6kzKC3eUicT zjY{_eyUYs>pa+K1C?R16QKA)qw8>IL)XvS<++F%B*#0o~PdYv};R? z-UNzcftF6W{tEqow9EXuud_x|f)w~fUE$l9u~lGxf~r&CMVV?(L%^U-S8r7V{ikRH z)zDFI$;pl7@`*^pSSQGSOjtna@W1-vXS+BS%XZ!!gU$KgWh1%Wf;Q9TwK5t1#?r3+ zLEi~U8kX;?QM`n%@8E~G{fbE9HZq1)Un4V!TU)0fu5`$(HL;LW;kNga^xP~Qp2z&> z``ts0Fev>~q$dCI`_1rgP7TsODq($7V}2W>|B0fWq_U%msSNjJ14gxG0~rW#-=JoR zi3cZaLET5Dr%~WH4`N=%n_>qpnX={7Fn52gyB|@rzTm&^=vjI4BI^EeO#*}fb}IOH zx{L8)iq+B7<>8sv=L1|1gOlSecK$Xl8cqTJao-U7fkUG%mn8z;)4%c0=A1oh4n;*| z^vrGBAES-BLc(xk3nW;TZsVJ>JxDjM_bTmRq2>4via()w(FL~re$7FbeFc8#C~NBU^AQ< zq+({8$vN|le5>ukY!P%QDVuuHGGcb^GaaA)#^G9zs1D`ZlLDm%bTi*#qj>?k`^{dK`bmpHYl1+mqMTYPxC16TgnsAv9VBAsZEdXT z@7&qQ3YMlnFGA#W(?bT90!1>Yq=tqn19hqOQ z{Yo5B&U1)y9Ahm$g)9N{j9)Ey019_d1E;~uHz65F-drt+XXcyNS@Yly zh#d-V4`q8_*y8V3;RXp-Xz7-5SEI<%sv=_}7cLJoC#i>ps0_oXl@#@bbu|P33jIdw zmlVE=Vnz}`hD_9jQRI(w@`KdL20aqGHKn9ZTzqiuW!5%P!v}$=mbK`V1#zcoK zT1afTC$9Y>EUWPfwBoQ&Sn|kWe)G*V4OlHe-qZ-DCsH$p7rU9K4Se=r4;EQ>=MW5( zu;HDnQO2hv@X4d(sVx2Y;l+PMQr5s3cXgN!93Xz~d1*z%RuqxSu{uclee=%-xZi8& zIisSpV%uft2f{mna`p40giw`OQkA65RP81gr!83%sJ{M%Vh|+03!2)|l3RlP2L7i3 zZ3UtW3_1a;)aU36Xc)0M#+%NDle}3>G0B8*8 z-{8RSiYbQ}Dk)p7KNs=0Ln&O&tTV+CjwVL0y{7fF#lLwmUZ+yuIXp?(9pHYxe7G(@ z0D$AP>$PjQ$8(L3&o^MNF&c$HE5;ymWSN+O))3ydBK$yLI9WC5T=a7hGr5=IJqxuh zZX-cZ8p@`eJ)(KECRPhO0~Gbz;(eDCM~1=aB-dik>_M>&@&Wq_eWgJ>KAnwPFlXOx z#3L;|*@6o{U85Kg18uX5~*sYcP6Fv$W!& z_CT_EU#5JcQ_DWw<|>c=f%J>}2K*gK;9;OvDPg6*9hwN?dkE>X9FsD=l!T;&!}>$J z;Ix1|71;R?O~Tw@m8jYzkStccej@l%?9T-;x(v4ONUy2|*x+pUE>e?9_$%fH=H7OD#eZ;W3y03NUIj%zDCF*kQs+Hgq(#1y@0Y_D?!3&_mh`IcM zJo<8qviJE!DcZ-WB}FkOQ|+aTncDXE2E(xyXRBqQ`05%1^nvWxW@>!VhVla;YV);` z9T+_QBN#k=B^Vrc$&EY--80Oa176S^Ds1-{5V`%LM?k^j^@3YX*wLUE;cCXG+)^n} zdDhb>Dmd}kW-zwnNZJUSC>oZ*; zW8RR)D=y>{)j2S7+lRw@EJ1**Wd=%zpoOrFH zeu>AsU=Ji^p)FLjCln;`skz5Vl{_b}Cwo!Vqn_lt`4DLXP9qK%YFZklZ%gYVZz>8>TrT3PVuOl3Uu$iVC5NfngK{GbJ?kgKobz0;;zR0-nE8x$z_eEYF& zQge@vtNmtQtVQ_y9Vo_xLSl;ScXUd5OQDfG5bnSWpSx+78?Gm?w)&w-5*Y+I1D9`B zBo~BX@eZ#~yRwsbQFBz@r1d>~+`>SnB3uEr;VX-9_@I*V)QW{CkqZR zkhUF69}cf2>i?Bd;PjzYq6`3d1vqekqSMvCTDYfq*wFf%sMzuu*!g0$izb$Iz zbU>L&I3dfNv(KgedrUS<&|JG$IA#Ua4HVvBF~;RfowO4~&;@U(+R>2(X&^aoCC26rQKV?^GgQ--I_#d? z0_rr2b!OHA?VM!Ou^7o)CnYcs+$x(%oW=r#Kv@OgCvj8V*DKZJ>%}dz_h2BsT8iRW z%MRR4NoXLGH&VKl?!)6yswvz7$s$u#(ADPeriCkWson|UF&fWn?vaRbD z?XK!Fx@_CFZQHhOBTHTAvTfV8tIM`+>(x2`#sA%R&v_9qBQr80Gh#>PiZ%BdbIdu$ zM1j^Wy0JoiIARm89RnhCv+d|wzmU#O1A=Rn8j%xt(N}_%{~XpblLRUcRhs!x`HDsf>BFr(KI=KtY{|Ga}idvQ70ucIUlmPhbDRGw7w}&dP1Y15 zX@-V|`ad(Er9dR+M|$F#<`R4s(-v2h<*jb%BuR9CsrfNckIK6GQFWcE$;+A(dHu3> zWUs!jKa#+d4JhH7T(lf!)=lxeuB9YZ>AZc{1IaSILQ$DP8&ZC!Fs1jOhaRjhtZ=sW zPVQyys5C;;M=B*>gA*&h`VIZ#z*2wCAs&_MzAtgsJ|R|qYi&LR+23jv zs{JoMpfd@`KoqYJL-uj{Dc(a33W{q{JeG#F-a)0t5A z5==&t`>GWv=>z$G(h?(NuDo)aX)*Q$^SSv@xKCkR!pRzz$MT=k;f>3P{y|)J_3>V*1hnhC&w{gV&k3A>Xj8OX zC$`_U?1K9`srvh@St*fBqR}|}B~IG)=OYjlsc>DksCy>3QDYX9k?7cp^ft-keKjic zp0(^3CBU<39BFQdfxDdCzsgc*H#!L9z+$66Hb}5hb4}j}GWiRxXVBU!wzr7IVILB{9_|FmR(8jA+7I z*xMrX!qBSK_+V?j5oWXhv)fR7?{t4%k8Y-_2IgUFPzmQxuV2Z)W#Vvh` zL%5?w8a{;|E;$89Ny8=hrrK)2X86Sj5O;2hVz~FB&`C}id@%xSP-tI_z+kFr4x063 zTp5kxflQWhco)9QH_5Fe{os7|7Av`PpSf@M>0#`$xR-r?S5OPm4%*b`g!1!tk_Es- zyMJD_94Er7h)odghD^&3WRt0+X)Xxw&!Zu(Z#R8U8g~kh*z?DySp3U~bWE<9S(>Aa zD~+`njY_GQWGOCdGlFQ?tz3{Vw*zuo!y}ML2X86Id4=!PSt>xP$xvd1&yWv-;e4<8 z$`Nm3#y=Ept6c;_r|bj9 z9n=KEmRDM>k_*@$BTVAQ4sgKPyegA1aNqt8U_0@2a`P{q!1rHyf`20O?`KK$AB`ilFFwYtIpI)a^Q8xWrMBr?#{ zTp%!Djl8-2O26h`vV%Zza~&994C0EsW;m>5wFsMtuHa#whOd3E5rD7Tq+Nq@!4lLp zfC;;fbfOc-xw_W0&)y;h*0rJyuymfX#q>YFVAokay269&w6wZ9fZ9N@^is8Qrwy`X zkZKaXl4^&x)~!F$@tlWw>#)8E3gDYODR^=G2*=dd;}n^9#F~b-l5O3mYCFHdyCdJr zz&A0sv3NyihaM}sIgh-xGG1l@GMePHtI((cRU!{4^;JmHVa@I*Y2aYp~I95*1) zz?smF(0e&PK+WWD35C7gL?Z?p5To08SAuEeHB+?xj3`0$AaN|*f`%Y1 zFfzA9VT`p@KDg3HE2u} zuDT7Kb6`oXVq>$=3YRlT4CB5kWmu7;<5#c=Si*M2_whQIeo`>JBIZLC4V{9xv>hs? z;#1Yr+&ASg*@42tQ&7XN`B4ZEvDM@8MDzSwz&o+pNUj`M0}YTI5Dx7!v+IO>6Pxqxe%sXP z*~-fuWd&_B6reFa2X9EEzpXtJg>_};+iArM&)AgET6LnbY(k|CDSIKSAKJs{B38@1 zGIdbGLrysLwhG$jE7!c?iY)uM8*G1DmayMzI*O;j!E4$yQ1|2*UJqxiXDY5Eo=zc8z8PC$B}H zX9!+$c(Zv+i(Fj<{Sc~gW5?IrFC4R4Xydv*pRZ8;%(h>edw+T`$z|RUl>hG)ZA1wij^SCgaPu0 zEw62stO>MMBV}HzG%XVL=zHi2o^}8!Xha*ihB1j3{)9=ya9c{iUOMiRMW#NRClYg~ zNb`VQ93wQlPj|$`3TP6ttDxNkhDW8EV?ouUwV{CZGYr5|hODgdCNL4a%!M1pI4S59 z3>i`r!gp6=*DRq-`6KsOvhz4-ULf1ZaspXe2I;VN7tE#!4YG%OKV*ek`=QLgEHxHr zg9ntwRm>k%!Ui`yCW|yTf3Jrm3A%21cl(*py=CzZq(%5xJdEYn_8SBi^q|Pue2E6C z0Dz}S2em)pvpIVZNhzaD59C#JlDy)af%Co() zZjp}fbuOKBWqmqrzTJe~N+Npm(YZtxm*y}Y)=>WkD|NcSU^g(-&uulfNJh{^YNQ$i zeKlJN6de6|zGVTBXqa+!wIM``A;0GtFLu3c(zkIsv6^QkK}i>7GMG1mZPju*t#>!u z>H4!nH{)IQ`ycxqX}Xv^YvKyezh}jP`<4wsf1Rj1CNveCvOC&2pfqWz7bYI~58dvH z9yqeQjJoRUZ0s_YNcG-71;9ZswnZ8@x#L{0fG~-g>y(ux?y`~rrwI1tT4Upjw*5Zg zpAZA?rF-rYI&-~Vx~48liz{35*C%S5d!MIouU3g(ISX3S-s}JlrftGNiqFZ)Oo@d) z)hb1?nJMG^(VK&6*s6G(fHNyC(S^RAb+;;-1)okl$F5OC9lE=1AD~e8a_<_8#k(tA2dU_&k4Oi>}uc5PQ>=%<1VPs0^xx}wCGlpyQN?~{@ zuc*@?6Q>9(&2>Zp(t1ExMCuFoOve-LBh}0CPieLH9GUlVSYs+=L&y)eL02G^~-MkZ&TT|0ZD8Qo73ceB_If?Q#$%Q7gwj& zjCuMHPweJscbK0{TyxdkaMTe5z?!CJk1d*eJVl1GHbX0QQbP{bjI`d{E9ihm;cdtk zA^ed!6hW&2N(aDXy4~}sg?ZX*+CpQWamf3dWQh)Z=^P1IYjJiSrph7QMw$WuO-E77|nGGpX{@mQv!Unp} zRFBSVRUb)t9U%taCSeR#-*}Q#Y1z3ruiZ-i_GTuwyY6~J0qd8Ot zW(-v2N~*8apP6g%s+SKXzo+JQzvs`q*=*W5HU?$GMSXLsr*6mOTbot~0^oX=-e*1` zw|^qit{~o%04=zHz%euLCs4)MhxB^SoEMquZhJ7O16R~JML3|iC#`cJ_v1LzgY2x?-1bP!VwGC!mnAunAH8YN+e-8o25tgzka4d# zd+Sv4ZoLuWQ~JRGrL$Ec?5~v5OcJ95iK(DhwF}}QUZkylvJuGjZ7&1FnkLd0J?uF7by1SX_R7b4y&mg-Fsl-NJ4P$_zUEDCi5 zfXFiDAI`F%)kQesk}v0!*;b|1mdCZJ1L>{1kbpX9vz)pJtu-Hp=IQgzYP-(pM4#w< ziXa|EJU-0mPt5P`$X-3SlCjG+{@KcsVW`wcj!fAmg|!lTUVjKI>|T7ma@P*Edp-ew z`KI}s5#<*bf%Bx!4vdk+v4i>evOOsDVg+Iuiq(y06gC#<2|papD~)cduF5f$wU$PI zP9V}dGq%>o@(=k)44thP*Hw?uR$m~+J_RZTMMEfOUik!dC{B588qXT7LQshvgY?p1 z?|+=I|dr#fx(*ghh)S3oKgBXH7gFK%`v-QyFO9tu{lm1x8*aJ8q_s zGQK+n>tMMgyZE1Ue0E&l=P;+f87mYcg&a9JRELVqB$guBia;S(bcOjh$Ri^qUhqQg zEw4w;nSic-2LB!+J+qM8ltWT2ZEdHb`#|>931QcX0&?exs}XWDGC-(LS662-G z6K0v1M+a3-Ti)Plyh^$=|F9)n&G&CsX!5Prn^lK(JU_=%RM-c{QwSQs_z5g zU!jYloDQM!bpoRN>k0Tz%9H;H-TxM||ErT!Qc$oyd+m2bZn6UuDl&1X1ocWoZF_<; zu9w7EIR>=2coEeT<^6ZspFV!L`!`Y;6!l16VkQUW-Vf|`rc-Ypx3{Q%#(PRc^cnry zM-(&3^7Ikx$hT^8`g%2(l4>enbYy10D|DFikYhinpp+~s+77yJ2xC6g&~BB5r!bDy zs&Ep)B2|}B8wjV}9tY&$fN0TZwx*99OVBQMi_dcLlE76r>49F zU`(rh_m!D+i!)L8FSeFq$tDtUA||uZah%h53Z=m>yt2W+ zBI`JJ4{VK1v1bi0SE#!K8;7p^7_BX2kZUU=il%#oKeDPSM9&{e+7h5~v zfpXqTjW1ZFUDDidtg|8Kyve-rqun6R&0Qa=bLdOtVx%~7GLpJIC~QXYH(N_Jlx^}; zvYlYQjKYoYv|SfU!fWhz5$BRe0935HAS)9{83xYI?*L{Pk_BY0g=&9N$V>}2fHVj? z%+zn?>Vj<$9fq&so;aGvN7#L9vt)=QP-YTl&nsrzL{|gGt3F!S5-d?r0<{q}U}Wr< zqe9+@oiaIRM!{HcIctIDL}Xe~M(Ux$`*vf)u(}hw0DduE${P~{wBm~%CgJb85z#$s z!1IH5x@Gr9BF9|V)hQi-r-M1AR%FFfYP5Gi{KGHPazYlhI+Vtvc-Z02V&IricKQTz zLdDF8$z{?D_*EbdR;!>(f{;#T3nJgFaGw8&pEmMNV4DM)JwV#KT3_;)R zM5z^_;4wJaCmcqP?xZhQObR74ja%dmE#opRZQ2~{IL5j*>eteq6?mUM2r?lWG1I!_ zFJTxTy!tgq3!8G8jHmC!0FxK@RNA0BMrXG`p80Iq-vo&G9KzCTL_3-}*?XcdHX*-U zKmHzKvzkuMH2QVCVgD=tL-S9^o4NJZ5S#zIK5J8RRt3%HCpAn^H3N%Wu?>aHEToWK zT3QL2OR+O@KVAFPU_JL-UPyl72+p(agJ`ujT~oyRh5G~R`EuPQQ4WgPbi`iz?f(15 z<)Y`!l&|jxh#orcFs13R_U6$O3hU4ncITo!RHH`%^V&jn?l!Do zB^4KZC7sdu4vS#p4lBE0Cka<4&iR6S_5K2}I*FxEU&5*l-W)r#NncWKpIqrP{}^O& z6X|>6yh~pUSmu7{dgC7Qu?xrP10-D5enmJfv29SVs!d*$nY#@d2-3sCH??Om92nlMh2P*0knsCJ7tHS6cC%Q} zO^80n9@JwHz}pQM!UC~r6{$=FifDq{NU)$4nQrp)z!2zwbr(&9r1$M04%_^DqAlyB z)WaZ~Vb>Pa73G9Ev%{-#y9*{J5TrT(Cg}3f?5YmytHu)@(LU`|#>m5^J+#VX(wU|R zQfX*Y7XtD}7DCln;@3>(_bNJ(p0<$;U+n!op^H zSXpLj%yvJKVR+HhzDlh>p}B{3)K6Vfwj*YRC3Z{ZRIo#~dqeiT&~}%YkI3ld0*QYrx3_F; z6NjyKJPvJ3ATk0Q(xc^vWy<^5JY>Cp3!Y6N^q(y-RC^-B?&w0V3p6gbASxJyg`PEO z_<8&AI|bWds5n;08I$u4im_~?zaCP!xk+C9lTw(klP@Vnw>GG zp~Ilbnba)atlH1-)PcKql5+|B$(`}tZFkQ!-kAcrzoy+Srm*033%wINy@jcqOlLh- z?u2t73%cmXA0!bYz|hE1eR4!DlOUH-!O)Z|M*Fu-OVs&N%xq>aVCU_UX4DF{64)}1 zgCI%5kFO+J!hekA|LDjJR{Ed* z?Bc0T=9X4|0*ec%PH~_LlGX(!@|fX5z@a^KUXE#6y}h-VEUd6cs=g4rzjU2NMv+Xv zw3bLd0lTY?tmf$fVR6fzQ{0c~hg^^BtdC7!qB2N57*)pP0SydBwyKbO^YQHt=$WNI z3x$mvi+#aJjd$&d`bv8=vWA$r`EugheMmeAV#QmTcOWv0fz^r%m7l{<90iqm@zC!x zFdgbBbRHM13Vd@vVpl7_jIX<6x$z4UZ5hfi>Qk6CUA^5Ke0^mBtm)j*nO59p>^id$ z+8sC?FwR5g@DIH5nB~4=COL%js5ktZFve{-PA=ZaJQf@}x(u)R8C9Fkoh}mI`yK@r zTkf?5YkWlom^MSMO1wrD74-V6qTx*ea*0t&WUAot&;^@`Io*ZaJndZFk62xb7R7(= zIXS%-4K>s$3AOymZP8wGpG56{D0l`+WqMJOse?4xKIS8Q^`6R{ZXg$N&M|L0wc$j> ze`Z-<`m4Th#cPL*A_$MX&Zq|J6nchO`VWXtQynQ}h5)6khfpui*FGpbC7+7?`Kfsm zTc$qoi^D@EFlAVOsGo8;)eZTU1Vulkcqcc^xZTD8HA%`VU<`*}IhUfdgt!gw#f>DteL_uBm}dT=oUqnN;JXOH9*4;W{Q!yKJBI z{#V7ec5beVv%*?DBq)u)`|CcRNIJ$Q{5od|>}~XFL(=W7bSYOKYj7(bp!@DN_vY6D0Te?(i zdfI?D5e0@#ft#NZmWOo%>#ubFFTIpeL}CJC=S;){j{+;$$BV;b}Iv9)Th;6<9PeX+oWQlaY~~G=~I|Y z?wseyc=H|UcI1q*Fh(VY!S_=oN1jrpusMces$%Om*>cEhu)=}MHN?4AI;AU35lgL8 z)O=fRVUsbkaw@dfWEu?*hM#s+QK+kpeTmBAp9GpUnA2Lge!qs*2_3%D1*68sNs+x7 ztSO-iUet9=e}u02;=#7hzh^jD&5o!-k`wtaAGn4Mo4dI_MNwZ4d@ox4$|djlMqyy_?!dxxBP_g3f`mt+h6RmS?ik8l?$0 zN##aU9U$~k^4u%6TBsvX%i*lgk!!R9Gx?`!>=C^l@^jK^32bsWc3;gP zMPG?GoL<{Nj=?5)2XK?vw}?6A(yYqlYIWh*YCKDmlDY58ni1}1FpqxMeyTj%>+oRR zlvn&q}u9z)UdC^Wsk4_nf{6x`Gn8%BZp_3HF3mz2DdtZP>I@ zV<{LxcsVyg>pT9EYs_WfMU-AZ48!@rTkYuaC-1K_*Db6CSF4vT_v^Ron!UGVY}~m` zt^=a#Zmc0$!uk2N_O>;xB!1U!)KTrtpY_7`9&IzRkY)`_Ll9{{t zgm%r! zdo8^5D>Jk(zW_T`ikb*M-K*d@=JtJJ0ue?F5#5Mp;25o>{8mVQRfj~VhsV}hP zWV--aikuGqTirMh`7M%%ZuX8v;89M(|46{^8$oh^Mlf$S4AC{DW&6Z0vi54v}(sg%n- z2ZUzfi7ng#q%$RzpR_8uA^GQTu+9f})EEO&V z_-1D;>+dj<`6Vt|{nfPy%6~xIB~V_*PyN2}$v;-i$sfBLA5oe5{2M<^g8F!Ye>F9k z{cBSb=|A9y|GLA78~wMN%U_bOS+y_8SK7lLI1u@sa1IMjLw-88lj8Uus9Y36vI;g- zT>;PX>EyY)IpSO1gP%`3WiQ>uKRa6&-iWn#&m0vXoz>mMCJQ`$Utb@H-ygev;(mYo z1xDhs?F4W!l}aCAM`VAS3ArWl=?6hXrMD)CCK!_9^%*Gl(B5etw-4T>5cC*?;$k0* zq54%phvuj+O$W`UgNLFit17Hyuj<{3?$BF$TGjl!X!2ZAkmn{9nw|95N#k7rGjI7S zjH(1Yh|9h_(V9ky3Pe_D_HaxER0~yRL%Y~qdNmL3u$lG1y=DL$EYe{5(1qiojrdg4 zp};1p@^SDewc^8xKcy!8K-z^q%dBuVhDh&4xLi7Mwi8i6YAD(ysz(~Cq1PtNiHo|3 zj$GHujh6#u>Dk@0H6vi!`b)@VaVA{q34}mcqL?4sW{y-8>9ek!XmkJNLYfmdK|f?4 zX_&doAvkKy=tV!Ih8)K^fCn2RJUj2A&nOgg*9#)!2tnF{0)--ZfZ-mf>= zRU8f&^^DsE%^1_CEDb-+yojr;%~Hrl0i_$ZpA~?B!fK*oYqr*hmke?p>BU~#S8J3L z8R+GPt69gUNoW9MlRZ+u0XC`M{CUx%&X=sA1JfY1HN2&?1rnYrHLWtwQ-lG(aX`)> z70gu~vN~@B+NjJFye_NU4wF;_yJ?C1QtwcvEw082a=??-FF8-t=QE+U(G5 zc8ErtjHj6^Kt;sT;tjW&wO(8=bc3X#`=^l?lBc=pfXGtFdp!fRVGtEk_c6;i--v!r zB3)O!nHP?(fsCg0pJr)P>)8EfX+x4k%yrXor*tT!B)mDcWcQEWUz)4KyTu-} zcZu;fTSSldux^>`KZ)L z3bdcFM$0i^zL+tZCv;tJW!$Tqtuo7J`JEIZ>Uz05e0IjTFMaj0qm0kz^EF~OO!)wO zpAa-C$!>CQBpbkvF-o!-d5F#?O90fB?Mq|rux4nM)qo{ANiQ^$;tXm%y^aLE&OQcj zIbQ*@jXVyMrZTy=mTO*>mRWGHolCN*h76!&U!+8zad5G2GK!Zb4?aW-X3eByT^y&D zx7&mu9g87@c$TnIrIxiiSevOO>{xf6t%TfR%bMKVNWGNKqo7_@bF$V%D%dZrSKFXq zFD&<{-<5(|vI-2!J%z~A4>`kvZ}9A0M#AZHYGvlay!wJH3^y}%=`#ZJwdB-gZ^zYw zXnnzmY-mp+F~UVQ;$q?Xwz0L3-;mHmbvbWms5(7O6205lP1tI&>aZTsb4^;T;=<3m zq7{}KBT+NS(u_FiC2EMVQnZza!jvr>0ej+RD}M+sUC@>&z!D_A+>6LYM_(X^fKw0G zOI4956H6mD3fr>e#yMp858a9laiFjwI1;PN4MC!vxCTq3NZm>aLrkGdK8r~KnZRS2 zw(SKRcvaET&|6`NJoI->&A9++$ZhR=ra*L14b36D$`ATa2GyoW{j0s$f)g?>p9Ze3 ze!91+lS=EEIb>w#KB7M;3f9RIhpE(KI5tJ?a;VsOG!@tlO$#=W!6Oj4G`Z+-OF1X0 zrEwmS`dr?3x6{7@0inu4yNV@0Uy-#pPxT;(2LE=mSSbs?}3W zW`d|4yGZ{0KtFTRL_EF;{FG75Kj>5c@^dMP@$=>^x}nCYWL4U<0rL*x%342fTrpDjT2egN7BFv2dOlb8?a5Bu;;^ zxX|Z-IB+6h9KXZj@YiiY-1Om*$8~OL^80Ap)zYwqQ8u5XW%V<2m;~LtcpazGzBk7D zU`(eDLqjQ>Eb;KCE)e$U1z{Y9x|pz;#g08lds1x;G#SgcudQpV%) z{&}8o*)7^dg(QX3pSazm*Z5jAk5YgbIfPo311*!R_w!56*YxMtF5XX|D_ERTv>{P@ zB75&2?#Pr+Y*ETyxjTyGCFz|x2H3$rSgK2QNO&Z(L#dIQMml%5hQM4z0XgpRqTX)O~xkcpdPJK@eJ4-T2u`D`m;fx&r?A9m`B33A~yyul?ie zE=G!`*Q1#iBY^sLuW3|d*XTi@B+wl6KYAdUGt^%$J-g=0Ebk{RkT!}8O+%Ze{&RTj z=qvOW*w6k8M85aejT_M3`HAO=iV0}|UbaQc^s-Ji7{%lTx-cjpjl8jb$P2S2LG_+a zz?6OVRwaPePPVVjO}57yMt6r2MAz~O^e2*68NaA7zp@~VLXRs?C5_#)6)@BudL~b- z^9~iA(@X)9qDP}LgH~aqU21$~;9i~>>-{hS#Zca%`MeIs9_rTM zCilQ-!7XGVx(JAL!%r^TGjI|1+^}WbgRIPhH1r3RCz)#Hx+(nH=}q`&;_j&%_HeSS zB=|n${u;jsEOTon8hx546e)aUhIImtUKc98)KD560vE`2g5$&`U&`#ZKRPoxn0;l* zr1+A<-M{^wH0VI%b?NWG0KOM+uwb)`txn|l(+S_|x?2{nMT%|Hw!OcH6`bujl7*nP zc$Q1UIC*uuuxF>)3Uan0xFH_n2?3!S1?EySL^t+&j*}0vv@oICb@6cl;`ZDvv>=A- ztnEU$mhok4sZ@cT5ZEtF;+Or+dSqSuyVQEM%IWmNg;jL%@a@2@sb4V(c==L3;R$aK z=~tdcK2==FmxxX$D(@7qK}zKKV<+9SD#NOgy1@xP4LDS;c4@(uy`Fggx~(+Yt1W;3 z0{PDi-M?qUintS zjQ)WicxlC`#ARmX?RN_b@R6=1e59-^C2AlDY})*sV_tt4Fj$*(#(KeGeX(X7Q7ph5 z3?YF?-{Ln2u%XuwOtTMg_HzW&uC%r5_}JWQYS^;!{aYpPplg1J`86kW^j~L% z{*%+Z^4D0X|1rFQ=szZ@21nIc0P({CKBvdDxsY#wzVz`cM)(yO-}&LGXvDjw_0`wY z;yRSC=Bd2C;Yw&xGietlKkIisf3jyjfPKR~GI1OKLz16q+>?2=mPT{0LRmCWOyEXo z(p*Dx0UG!56Q8y;GV6AjgM`bwDvQzal0f*mn7BEt z35|vb-=E1tKIqikvliOMH0^lq$nZBAk=D~Uo*<8$Dt#_S;T}8$T9*T_j{{!Q!`bND z=x>?17zW_C#7K6u{oYhR)S%@cs)^*P?-n5APls+Ie<_y4HS0&tj1=-+r_7AnKu9T9 z72)FA-MTE0_}8?~+~sbX$1W#L#ADG|j@1l)VQ+S>(qDD3)s#@xnl`y+$BmPC=HjkZerfx8hij?H@R z0dkY$X`Mse2WWHYE&3i&l1=Wd$mv=m6u)ViOjZhcWh4x2d^$bD_){Dl(sNi0SKj1H zs(aUk4F?D$y$44y7Gk$kcRFpA-jw5JlxR~yI=gQ{Y+j*X(ybj`M;W-HTWhs)71MMfFUyexWLr8&P8;nX*g z5~bt$Dk`HWfI`H;uq^APsG+*3j9a7cRYvgBb}a}~VHY1Fh~*|dthJ{1&bR6s79j-L$Y z$?du|%+`zbkiiRI)9>|YUk0hZHu+k{03uy{9n{3d)s z(3HjS-RY053UG(;4|!S@p{_HJ8e;N11&X_hJj_1#8Av2_0(40qA-d&Sh{UrcA-v^m zD*<=esBbiXmi;I=njqfdB+leUwQDc&MHcd<(DRZ>_$+ei;!?@5V^YZ~V;az@UkkdX zxuqN$37^0F_f`uCgtdEtbnutTh9rRQBbJH?^x!iW#)dHmHy-gGGUswn-=WOyqf&U@ zo_a>pg(QKjW*d1%vIT&^nefligG@*XlR_EB2-68T1SlHwoQWBmVymy8jyOoS_Dxm9~%m*)@{nh3{3LfIwC82a5OyRWUb^~$&3*7AjweEQ30v+C38~7~0T%d~-Ik)v#aD656xL>dhSa9- zTxQLmGh->T&EeYIOC)x!Vh4xx#;#6_CoO{eDP8NK^r;>38Q~qoOP)qIb}sP7sVbb7 z^9q^NWV=&KE9{l{=KJe$0o}*)I1IZCS7^vytt`!}GS`_9d8ftN;>Nu|s$C1$UPs4) zRai}BCC)}%XX-$p?;>@DA7b>D{PRkT7HlzEVz0>FO>#e0{Mc^GQWWXljS)@a7CCZ= z5*KyMD*VOl>U|~;cPi2!uj#Kai2i{9!HplYnE5LtkNen?**kUPPxDG!XG@-CMpIs1 z%>-@CW;=T|u^cjlkY}k>qXuMgv@qfbAJZ~=DD+YM<{!07%WD?bikn7O$k0N0%XA<{ z&304Q3Y*)7FTnGz4b#co8Rhc5sK1eQq3H!vfiGgJt21yM7NXo*dsD<(Du5=dYwYsA zDb~7GJi&h?E+4&mVQW3+`+-&Xz$?&5K2EO2p`1rAQ-V&iz6MJSv}kE+Ul`H(sQJ%F zA>a{zHtSMs*N%2}l*c`LSm(iapPY9mB3#7kRsc zxJrt9K*HP}wbH!4cvy>q6E&HGW(=JZ;F!9}`!rM4wLBi&ch&*}jQPZ_0Z%hw0-jEj8pjqM_(&TFGW|y&p1M>_aAEQtdbW5t z;3Nf>Lfo_j9`&Tll6X?SM2xR}BZ>zuBAmZ@WPdp%`finG=Xm>9z~ot=n2>%n`Y=8# zdr4>C1FL;(k4~fff)R6$&f=@B>P(lfp-;9~SegLf%Xu*!n{hBFxR$ylf;J3+?(lm% zs{!mq23I49in`axmFDbNSj^0TF%t~WS5iAWQ-uTs5r8o`s&xhynZ1CgO5Ak%Sg!-Z zZOxxpI`ekgFm&QyADO&xdH>j9R~A{v6_;&?JpB$&VtPa4oxWo587<^Gkh0~%St8*s z-7&?W>78P3570Gh##l6aBK8?LOP-ls-W7@$?`vgx!>F=&g3(dD)`aQmJH_yc<~4gF z)IlwNfEsdy1I5u5we%J_A1R12kQ+!uSq-%^yPioVl`n6YX1d6YbM) zFT*E#XEhx6tyoW6K3|e2iM16oIh02AdQF))MnFkU%qX(DHU!57`4P+TE*Z5h%nppv z?tn3wR=OTV!B8nZMxLc7N8rJL!hAn`LRuJ%cpsN5j=N{KPxaegzvAxRk*}q0jCT@a z*IGF>Xa_|`=#R<8=}rx`ex9>r&w1@PVoJ-)WCeEkC5`}?ZRs>8*wpNch!@7TSD;5E zjRe-3jaYg{YY<2gQSFE5^yN5Lr{&jzUJ~D&Rn`$W5_w0d*rl~jlCTu|%*iMJ?gzu9 zi51D7@Kx1GlL`#rJmgkz|w zsri!S?=?_FbARME@Gg7DO*oNRnX=diHF;T7wJu&DbQKV`q0mJs`zXR{=fuq?9?-!- z?}c*fTU#}V&+`qKjS|`bUm2x8z{%ZbzHQKPEWy$#+v9(7pKkC$3~Vg#h&gf z#0e{ZMIbQyogqnz3o&=ms$5mUVwmLNz;LnNsMdi%ZqKX50TvN#M*R*EcnE=A5N&Y4 znvA+5z+V}+;=r3sx^a3>8MY*PO-;Jz-{^Ldci44hNOm}3-qh{v4v`2Curj^+AubrX z!St@xaD(ULs-XKG$j)A20MY0KNV~u?J?6tb2ECG3_6AIG$XVSjgG0ckViH!E?9{Qd zaAjgO$cT~^`>p8;s#|QW$`aH}?6V5DHPd$WeBajF<8EZ>_4vHePUx^+X9UhcJ(K|+ z77{V$zA?>kck!wCJTzTikQ9IzM(9Iu2Wqwbl62p1E6KUDdi$*a+$>A;@~N0}`gmF~ zN_9W!Bl-B@!hes5o6*9E+K_*UP+#W*U@p*B=SsAz4gdou-{GF-wNlKxP>1C zf+dttP?tmKynis3qs8mxFa+!(iS3sI9H4&rHOh(eYDxV@C>#)%3RXl9B$o2y0M(_? z5?zeXkFS#inJKN3D(gh>4#n8e4MTf*?q%}Oz{uJ1>Ptu@RLf<9Bh8K>?y=SRc%rwi z--Ddfi3P}0QMM` zP-?S26_dP7IQjZkEh-0O2AEwgxq(hjAeT<6g{lB1Ic#*%Fr=Nr_cgvX39Cb0?LlQrXxx#R_YZ|iC3P&uS+m__v}@$YtWF20_7NZO4k;-6 zo+~Kw-aeZC=JX!W9~(QD%Y~Pbo{^kcnwFB3I5pWlJd78Upq5yi6_=b;d6^ZT zkgC-?**!jt7g{d!Ge79JKP6jNJsJBvH6y9=FMt0q|KRUHXy{95d|oPlxBS=)G(KB? z{W$Nh*FPu2U;phtr;FQKnH!oLJJJIGeUYzkzkN0M{{8spi~PTcsQ-Bpegj7*2Yo{) zA$=!fxxYSi|F5NpRC#tpGRE-XaCDkAufz`sr24^?oB{_LY8ns|_${wRN&rqkkCS^M zzoy9Z>{vhSvGQ=EvbL-^^uppgqRS12yk?G~tbWwD54Zjek;<}eYH=0}Re(LzeEB0s5G4Q=e#A9&iRWyW%2yF7m^xkTq>8#uoW!!NY ze*IB;>NqwV2Lqdj!QtfU>bE?Ef=ury&m#G2>#ppP%fK%>k1$9}t-zKX!rk`(6!my6 z9xfy~0|X?&CTY?tPXvt1hS9(IHBs!@}#VCQ?=Kp@9vA4#Mx~WmNdwTOPsXw(NC{n!|}&s|-|i>E|glubDPa zU{0G@@crueJ4eE)%1%{sQ#td2GhWk#7BZ}Q zp<-5MKRWO9RLNFeLVS}Ye!Wwa{8x%hQ9D*IsyS`TKOQ|3Zjk7$5$s zOzq*f2#wmn%%-a*{7s&{lqbBV$;6uu*e~wfHyy}hlMzhnNsf~zjS05MCG!*r70zh@ z-yL14HtUKa?JDIy%ig67H|>50{y|KPjebpp1sZtd^7bT|8(ty<+-~86dj}_Gtezl1 zlYN*m29~CcN_NRMwpQ$QCBSz#7Ld0^?UXJheX+vb;On6J>a8eywmnCmAS0d0^*hUA zSNv7`|6%PdgX7GWY*7m>W@ct)w3wNhnVFeN%#0SZWRb;^#mvl%7FaBcZ*|X{nRCue z_l^7Fm7;!CM1|^$wKLbw%#~|biKk0oF?Vfs=!paVqt^#zNf*}3^Et+fNx|L<$`yWt z9F#os)^vczbX0vsat`WtZ7hqt(;>X&~ zY5ql=OOyHYqZg1(EuV!0r0OJ+vI`6n6vMMZ}k`=9Pl z?OEUSL=SvSqpUgDx_C9aN0NA8GL#t!7)_Zf$NF}IJlLF74qro){Zgks)nA>6 zBv_sizkF`(?^(GM;d7bFH(M_pWI-k{%v<+fC3L-AvKpUYoNQWcaKJbXS2}YS_7+m- z*f6HHWc?AW91?HpO8cYUBQO?%*%l2x{A)+-NPcV+zAk4$?n|!Q3*BSK&xejgpzPBI zLMiQCkFPEJb9kGI%ar*VWM8vHsf%P}x zw!rlDBDM0|*@xB)17n;C?NMsO zwZ`}Lw3^A9I%2{zsF7}XYrm@s4`J+|S&~zZ>->9DOE)2GQE<@s>Za_$`BhR+cW^|lpj3XKVzRi~ zFTu(t4yS`Sk5Qm7TpPLid4v+83QU)M7G=dC`}ovSbO;9f^Aloq_VLA7G&puR1_mD= z(f$>qX1`Ml%k;Vi&doKKYMWFRW}Bl(t>uVVvt}#wYT(z%4ef&~LHepIHZ4(ED<=!J zjT>|hcymwGAG;2>YPQ@JY)CmPZm6@V#gW%}XitpeYm^ zp!w#u6esw^f;3tFz3%NRlRx{30KyhSSn8<9X<4k<$8{I4>*MD`U_J4W4@=9xF)zLw zW)MgPrDA2F1cCUYih!ZA5ruLtVYf!8Wv)Fejo%9RdFpvmaw!l;sswS@P~c~wiih@d zN)+w+^~$OG8iqWTXJi^6GOlgmjDXUjv`p?k#3N&t7Pm(EYE#oL3d#Sj^J9MjtCd+w=7m{5e04?HlRJZ+^5Xw z`kV}?v-k)oRRmI`_Ys1p%yL2*(#cwqmB^IAr=SsEXZD>w?$}D48u|Oh38IY5P{^-W z4+E#MSExhy(Tzyn8pj`1E$Yne@gRD2F8z&G#?+K~4k6Ax_gvx`a_9Ay11M8)Q*prv zE6+I86^V%z7I7;WUDRx5%RNr*nr7=~#lj1&1w^p5+YOQ$ajy#7VsBcDMyKpds!J-K{1}EUh+x3*+P%%iqcc) zuS^55qrXcplnd5^$==GshYQ<$1jSbw=J7ouo}2fb;d+&z|gk< z!{%>v44b>~LKuZO9^xBP?im4hwI&XiohJ4XGL`rsGg&BVzrFgCTnbZYOW**R6#}rE z`q#wje++2+7uvk+jqI#U{snJIGAav#NW&k=avUARP;`jf?R@ZvTF5YnR3(Ax70C2; zb<*<0F~nF&HBxELKcWnJU@@-)4||I~3#6SVz%d-5oSa^?bxFm|o(ybMEIw)9HBZp>s*k?*oY0LI;aKm3BJ5#M{_R&TwCC zYB+D|8e=t``yJ0zK**mga-i;pZzY{;IfpKD?HG}CN0y@hHpHD3>guUx}BN+9xKwP-B@^)nsaYUv?Lc8-c93vTQIW>OT?&Xfi_ zTS=sqPo_49d!hQ=yifE8+a`~>+=64c5sN}qsWDqs2XcIsQHtumco#urvA6eu=5UUb z2B$-xAZGu_N2=+`o6kr(@5@FB@i+JCGsT38zL{lx!&?!81X%|HyXs`whc^E9uvu1o zQP-1S&PqNw6uP1EhCpd5L>I}LSzR?kgnW8Dw|5pfQ_86i1$lnBF4@-wGM^xISjCZ| z6Et3s7umdEf(FR9Alw;8)UJa}EsSTyf*)je$Dtl6)GjZj^7*nKg3HV>==Zd2(6q&M zFscnEro&b_(4gAXu2i%W1#`GPL`LBwzd&B(q@ob?h6kID$#tiE80HMpXnrc$>>2ay z%HnET1)=Lo^|~gvrm^N7!`)&H#?LG&D8fqAB(kpQ;!fJm%IZ>@H88VN4T(T=XeUjT z#adQfK@0|<>yaT}ey6THTwpo%g~5{duvC}?sfND_{4|bMQM$AH=ZwHwvX@LK5ZQVE z-;gZ_R2f+QTO>`|wx4H08xm--N-kMd9~)|J=v|7tS0D?XX{7-jq7W_VO8~h4D%G-) zL`|WP?Apt0T_t1i{6qlbbS?_f4CTD*VjJ-8_htC$`gYypQ@m03jMH{cEfBsuI23Gb zhjrifgW|vdH!8>xzp+K?H@Pil;`$SZ>v)iY9yu}*x=#2BpPQ6%Lm3{Yy~qyubQbm^ zGnmg2`z+4~NHSh_SDw(G`_Q*0yig&p2fqGDzV(VX>f-<1Bj7T8+`GaZO^O`jGdI68 z%a!RZM5kv@WhoGs)N{y;ZEqGqhSBXZ;m3$|UB3K_HYR%#d+A0MP9~WtQl3%%cTUhf zc69|*(h6^vr`#Fb(L}89cEIRnJREMD{9IYmSR4fb;cNjb&zbkPQ0qAZa)FdjurlQ= z)w1)sdW*Sjx^{{0rD0(lJQ(dKOlHziH6HBgW(#s*rh2}7pvX3W5h+W%+$)dV6~_u#Yree zMOE!09oiKQDt!ydV}S97lpD5)d5a=x6kuI*+|mHpKCoQ_xJM@G)!0@UUX<7Asv3y_ zw#D7ru^a_WqGQ&;&vqEPgut3vE=xzkoKVkPu}d4^Z7XfqD^}#p^vfDg&GIZtPTeaU zBX91<@K}8BB+Q=s1gGKHY>#`J@K%U>^IlPh>WZc|UjAGeEQ1YFPYi?|(ci+37p^~aVTOI`*?&`e;q`S?;1#LC^wdue{N0y73Ko5lU-g@S zKkyLv{_C9bKRR*$cm#jAD*W?f2vd{s0NN_NA4r(;j)75z0yKciPf{?3rjmF?7%4FD zoX{k;1aN6H9iXd%vl%qXv;JKUgO+Q5p$&(bkb)D}Azu4gp+Ip!A-~;^#1u+T#u&q(P^e(_slre))9)*T5|$zjo1&yMlVVteO-e{babs(k z>dF;>sX$LeI}rzoG3zHg@rMy0SA8ag-N%LYCD~vnmKIJ4D=*GBp_c!|HOUxM`K?Ij zgcA&(`6nPohs9ndLKiQUNH1ZA*<1%+qj7_K^3K&>)|u2fPPo=;Tzs-hDk9x(+L^p5 zmyNEUpPV=gH!m3pw~_Ylga#+=%i*GQJ8M;{Y;AG0yB6y)+c46tBlFP~8x9Hr8qjXQ z5#DC7sVc194#!Ny0nI$d=b4;Y3p=rnRihJV^a4|At_I6mYofV`oXAwj82t&?M`)?B zS!I6X`mjOY1Ag5&F!V^ZD~o}t%m8k%&_cJy*GIYPWyLfD#e2M2Of~OIw=G+_>NF0h zn+z3fb!lxICpX=bdTvmn5oRbR>Rq)M?k!$8SFqvr#$LH&oXen=5r1?s_vHzEuHe4g zq}8j2IDx8lmtaFiRy}`N^=G3FjuBoOU2?e2P!kA<9Hc#V2zE`B23%@NS(R_rN0|w| z_thu}a;uqjlq~Q=W2$%L1b*a=ro6quU#-OeHTiK0=vfd+< zRKHO?%zR6BY;wwkYDAr~N%Xay+>$oCK&;zcWf*Vk9-7Fwh&-Z26d@RsXR*F5ZlZr& z(p6`A)*4~Fj*~Eq9G;%8-UBw92K}u)E(-lLJcih2NkrN(?EpIWUfJs3&eX;F64mAI z`;;Y{TLo*o0G*u6JWUlkYEBTEh#joGY_YWBtxUwkt5?#oOri$%#)W1HSm@o1xwtxF zI$UIL9Yn5p`&FC+zmUF8Z;lvcw2v**1q)5xW*=csAv$FJ647qT{YH2{%yC(NOdap^ z0J%(FUnyM`!S`?xr&7uV`ZoLFfQlpsiu84qlYMMfMFV;A1EAU+xdP_O zC*u2Mvl-?|gZ%>)MULz%$vyZ5;`Pts6(2y{lbUO3N7hNHjE6UH|FzZjzC{z|j}MR# zMpj>0q_<)*a-hmZm)tcW3Crrl`1FnL9!W+KnnNKvn$9RqtkrX!kxt|X-=R)UbW&HH zXhBzq2X;WHH{sp~lddR$>{cV>fE-(zVtDh>k%r8eoGdus=jgWTBv%!Yv;G$PSu^hU znpPs7PlV>3L>7c2uOHCXie&}?pdB*6bS4OS-Hk{#+Q=Wv8p@55Gh@I-RCLVtVT3iP z2_>?h87cfwbt{`4@Lu!q0TrA~KpI5&d-VnM*ZuiR+ZTelo)MonR|`&dMK;@fvRhk+ zeCT#v%UMC{Yoa+}(cdARkzFs=-WsUi_A-V#43``u%(0>;>|B{WXxEeXT zx;g$!@KhcL-u}?|_xU#3sl8@yEWKK#VC6xX8SANq3(+MdONpYQL^a}ATN!HYVlSdz zQE^w$>J3MO<3TT1tR&ZoI6N+MxgT?QEsl==G>q%V2d+?D&KLeV2$RKXX{9-s6@^P< zU&(|u7T?(;L%@m_^MD}Y#ERz#s62%5rR6_yxgNTFX_~JS9)9q!-5vFA(vp4X%rIJn z3A3TlXSx$vjuGB=;UmaikEBmx^Cmyr<>@apx>yfyK3xxz3Gaj5aI4@pf#u}i5h78W zBEmX~9C^Cxi(^qkw*x>>!bvh7DhPNplV7qbOtGr%;!k3)juP}g?blAKLd}h5OAlQF zz*8+H;ILCR;c39*x#5fL!Ydp-<7{(Ul@z4an4+`bvZCZ6^frtw;|;x!1{4WH`IbVM zX7|~mgcDDOA7j-vYV$uQ7d!=g#B7=EQzQ7kB*g`q?C#=cEab4HsgkghTG;7}>+7OWHl^^@&siTWeB62&Z4sA<&&oiGpCfl*NnQDL$!i8#)a;Z0-eC0AB_ zPTbjb{6f_+k?6V;5!ej7H&$_bR&iSbTxlb)qfTb$`kdLY$wP-|kCd_|CiAuC3dHX#nq2kuliCpw#a-66%r zA%m(18bsf620C5+K8mXs4p7`7&BY;wOx?VR$YbDid!I_gMl0+yxhss};AG+G;E;Mo zdWJsjHG=;66Pi)MhV6kw#Q$%}2nO)ef97MZmd*|yM#i>g|4;n~zQ6pIe>5O~C)C77 z71)X}6SFn513KZlh+EmZnmPaH%n?w>j4OuaPqAuh)M#e{D_O1i3~~^HMAO_HSkK&q zfg6lNrhIMEpp{gT4R7ILGWd>CdsoY;etMd6MXV@w>Ht(kHy4@F&!{`v+&o2Oc4n5lD?C+q=Ub#ccfqdDGV08%vE14=WhWAY7@MTSjtAgvYuA%%1AMnx zI@S7qrZDJBqvEWaZDZeixR%WR^Yl@!t5m1aV#M^ zuWn4cqh&y^8|e&okm!t_8qP#-{DBG`=4Z1KGaVrEONCmE(fYyJHB+e0EBrE(3U@zp z3Rv3vog+v7H9%xK@$zkR)9RN~<*?tiYMYg@z;UL=@3>*2A|eyHAxgL?l^V{88&bdU zzP#V@a3^XwKC+amOf(oCxExk(KF!m6PNHl3&WaJ)dVLOf=O0z=J!_b%t zoYk@_9xtmARJBRv^?Jiyb}3m%pmSha7y|mBYOgJ^*GEY!H%PS2$Nt=)15M>__j~Qs zy==oogdPkA3vN)WP?`1rg%y^g?mE1S?!10Z`^%@L`Uh{kJM)GN`Pk-R^BEd^i+5j` zLJ)-9W+jxMVwE%Resdf-tzOCF7}bCTC~B(cg&9uCZV@9=4COSC1&s| z$nQOpuwq5D1Tskbtn~M|tE3J0_Z5ARj|_AY=eP@S6o#mI)c;(@!k@ z1So}^Jy*1l$6(iz`OxHBqUF$Th}JA9Ts_=`QPUsqAtzHUd;ua<1c_O#OpINEo*@+a zM)?mUi_)TN!zF}WpTs^n!GMs-Q+V}f^x#n>4x%|n7@F~`c0Rcu&veVQlpi{m(g zGy)@ukT0JeafuR6*(H(Q`m(o9@{ZND79FZEQ!Q#+BWGQZgs+;U$jZhEb4osBTHLvP zKJoSHEsPkOlU!Xocs?DDA;*NRMOqd zU&J!g#7_Z4#oN(eB;R{P7#prJL@4v5Hm>93?`oB%k56Iy1TKG2BHY!MnYtMRKkMPvw&pgDwi zB~jHVEMX>wsG*d=!fdO|l<0YEmafHw);o<>*M4%3=w#P`D#=JJw@;8bqghyG$ROjzu9ux5n?N;?N>OR+di6Z-R9;HK^%L_4C5J@ zX3g?+vcxGi4D!WKc`8w!TUF0u*hwg-{NZE8Y>SCKa`5v!_5}tKxNF!vXUrJB+iQtI zSi+23CmFqV_#TcL!*mTeN3I)SYQB3vtOen}HTvtWG(;cx7q>+RWG(B?AyAj5@Nsxx@UUb)e z6xC5A{#H2fDvmy^+@LRq5xQY)O_q1jJ;d$ocg$(eBI0_j(jX#2g%sFKbCn0biOa)G z(V=@zi3;^Q9P!H3zk&2YhAe*nQ&jklN&T7yWF_@~%Szb(G8v0HJ2;9Mxw)AA1@_nf zn6T$Z6~^GejevrpqCz6WO!^c|C4|;5Rwe8UrA&S}PF8E=)QJ07cthRzX-;7qz`$(4D)*SyQr-PH0|!Y?2h17O$}5hK9k9+yZ|YoaR57J;?bM;3~m zJR4K2DFeYA(ZsZmLSY)pM7;|Lr3Uomm|ITqiKwtOPwh-+O{)SPa?H!UT9j35*!35v z=Mq_EbPbNvD30#)w^tW{`!jQ_Qs?8$ZOjqY5V z-LY4gC4{UDtqo-V2sdXq3<6`9=AoJbCiFa_PMxvuk zuiXTT=(|$uP6h`07*$3;KE!R`#$Zffdzm4~Bf2Sbl_9bW-0nUPjph)H$j^`3SYoed zKv?00X6Hf9$geAyj=0h?Lgm2u0_>EApLDNId22~ps3pjK$++9g%CMS2oSk8CUKG>7H|Q9gl8|$; zEV*6@0;GsW{<_D5rx_{rQsh?AcuBsjCIMCCU5SK_ZGF`sLQ!0UQo#X#IhzP)z|f{5pJ8JJbhODs}*@R?nOYb)|>ULWz5^JZ(K@#4t;@ovE> z3?B{a2)M27Ju92x(b`-LJWhjlWX^=I{5wuFrLdM=U>_3Vng2NdT4Q#wkzIr|t`%^_ zq>MZjOs2@qqw*rT*Z854<`Mi)9fuHA%XWcq;@Pvi;#Iefwc$LFb&aPci+}-6EgM zoHIm#*Zg){XZr*FXKqP_WggFj+tb)i^v`;`(P3;GN25h-j(48NJk09^adzqL*jF(j z(qXO|$Xs`%0w}D}2A4WSG%+S2n;dsTWM8hVvdvr>%;EM~UVdGzJS}UIuWA8HWe`aC7e}&;=8}Xvz`Nr z5E?%itc=l%RkV8b_m#A1jG9GJE6JGIfr#IqPDQo>7ce^MdJVkgZ`5xP&oh_?wm(Cz zR}FT5F^PAv3d&K76KA%${9$U<*70(GTsHlw*^x62YtBiQD7QzhnxZb0y{-CeWTc}y zE+>vp#C6!+PRR($!leUljnrY=IHPv0R_)9!D{Xs6E3 zJq{nL0MQJU!{Y#SANjgT-q`kY5D%w*>quzQn|8rQ#${I5ErakTwI6d5Y&->#ZEm;E zmeur~=gH;U9>FAy_}94CFd-3%VD%9Bbtolp(c5$Ib1*St**Tmtd`(es4Q8>#Sqmc^ z)+U*-)ga-p4B`?+E+I=*qcF5NY2sB2cr;VCaGBx)BLY}g%I{k$9>{CagDRoe*0^Oe zSaEftLZQ2`g@{eQMoKSGZ%~O>*Bu7iO(uIbmBz}4wWMKiO9>_H3Lk})d6e=|)?^i> z6tp?_N&{w#;W4!d`$*gb☶{tg$AAz+dR!_Xd%c;|5#+!<>V}IJ!v)GsAH~_(1 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 JJ@`nl{2#lPL~{TD literal 0 HcmV?d00001 diff --git a/src/org/infinity/NearInfinity.java b/src/org/infinity/NearInfinity.java index 5068dde3e..71ddbfdee 100644 --- a/src/org/infinity/NearInfinity.java +++ b/src/org/infinity/NearInfinity.java @@ -134,6 +134,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; public final class NearInfinity extends JFrame implements ActionListener, ViewableContainer { // the current Near Infinity version @@ -371,7 +372,7 @@ public static void main(String args[]) { final LookAndFeel o = lf.getDeclaredConstructor().newInstance(); UIManager.installLookAndFeel(o.getName(), o.getClass().getCanonicalName()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -445,7 +446,7 @@ protected Void doInBackground() throws Exception { try { checkFileAccess(tlkFile); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.this, String.format("Unable to open the game \"%s\".\n" + "The file \"%s\" is locked by another process.", @@ -468,7 +469,7 @@ protected Void doInBackground() throws Exception { worker.execute(); worker.get(); } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + Logger.error(e); System.exit(10); } @@ -484,7 +485,7 @@ public void windowClosing(WindowEvent event) { UIManager.setLookAndFeel(info.getClassName()); SwingUtilities.updateComponentTreeUI(this); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } cacheResourceIcons(true); @@ -623,7 +624,7 @@ public void popupWindowWillBecomeInvisible(PopupWindowEvent event) { } } } catch (Exception e) { - System.out.println("Failed to check for updates: " + e.getMessage()); + Logger.warn("Failed to check for updates: {}", e.getMessage()); } }).start(); } @@ -704,7 +705,7 @@ public void actionPerformed(ActionEvent event) { LookAndFeelInfo info = BrowserMenuBar.getInstance().getOptions().getLookAndFeel(); updateLookAndFeel(info, true); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else if (event.getActionCommand().equals("Collapse")) { try { @@ -840,7 +841,7 @@ public void openGame(Path keyFile) { try { checkFileAccess(tlkPath); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.this, String.format("The file \"%s\" of the game \"%s\"\nis locked by another process. " + "Reverting to the previous game.", tlkPath.getFileName(), @@ -1285,7 +1286,7 @@ private boolean migratePreferences(String sourceNode, Preferences curPrefs, bool } } catch (Exception e) { prefsOld = null; - e.printStackTrace(); + Logger.error(e); } if (isPrefsEmpty && prefsOld != null && !prefsOld.equals(curPrefs)) { try { @@ -1297,7 +1298,7 @@ private boolean migratePreferences(String sourceNode, Preferences curPrefs, bool curPrefs.clear(); } catch (BackingStoreException bse) { } - e.printStackTrace(); + Logger.error(e); if (showError) { JOptionPane.showMessageDialog(this, "Error migrating old Near Infinity settings. Using defaults.", "Error", JOptionPane.ERROR_MESSAGE); @@ -1350,7 +1351,7 @@ private void enableOSXQuitStrategy() { method.invoke(instance, closeAllWindows); } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1370,7 +1371,7 @@ private boolean launchGameBinary(Path binPath) { } retVal = true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; @@ -1578,7 +1579,7 @@ private void cacheResourceIcons(boolean threaded) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } }; @@ -1593,7 +1594,7 @@ protected Void doInBackground() throws Exception { try { operation.perform(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } setProgress(100); return null; @@ -1660,7 +1661,7 @@ public void write(byte buf[], int off, int len) { try { text.append(new String(buf, off, len)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1698,7 +1699,7 @@ public void drop(DropTargetDropEvent event) { event.acceptDrop(DnDConstants.ACTION_COPY); files = (List) event.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); event.dropComplete(false); } event.dropComplete(true); diff --git a/src/org/infinity/check/BCSIDSChecker.java b/src/org/infinity/check/BCSIDSChecker.java index dd931a119..89674ec13 100644 --- a/src/org/infinity/check/BCSIDSChecker.java +++ b/src/org/infinity/check/BCSIDSChecker.java @@ -41,6 +41,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.tinylog.Logger; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class BCSIDSChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -179,9 +180,7 @@ protected Runnable newWorker(ResourceEntry entry) { try { checkScript(new BcsResource(entry)); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } advanceProgress(); }; diff --git a/src/org/infinity/check/CreInvChecker.java b/src/org/infinity/check/CreInvChecker.java index 23a8aeecf..da7b25746 100644 --- a/src/org/infinity/check/CreInvChecker.java +++ b/src/org/infinity/check/CreInvChecker.java @@ -44,6 +44,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.tinylog.Logger; /** Performs checking {@link CreResource CRE} & {@code CHR} resources. */ public final class CreInvChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -181,9 +182,7 @@ protected Runnable newWorker(ResourceEntry entry) { try { checkCreature(new CreResource(entry)); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } advanceProgress(); }; diff --git a/src/org/infinity/check/DialogChecker.java b/src/org/infinity/check/DialogChecker.java index 3d0915621..e33637325 100644 --- a/src/org/infinity/check/DialogChecker.java +++ b/src/org/infinity/check/DialogChecker.java @@ -48,6 +48,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.tinylog.Logger; /** Performs checking {@link DlgResource DLG} resources. */ public final class DialogChecker extends AbstractSearcher @@ -242,9 +243,7 @@ protected Runnable newWorker(ResourceEntry entry) { } } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } advanceProgress(); }; diff --git a/src/org/infinity/check/ResourceUseChecker.java b/src/org/infinity/check/ResourceUseChecker.java index 10454331d..b2e8e2a33 100644 --- a/src/org/infinity/check/ResourceUseChecker.java +++ b/src/org/infinity/check/ResourceUseChecker.java @@ -58,6 +58,7 @@ import org.infinity.resource.text.PlainTextResource; import org.infinity.util.Misc; import org.infinity.util.StringTable; +import org.tinylog.Logger; public final class ResourceUseChecker extends AbstractChecker implements Runnable, ListSelectionListener, ActionListener { @@ -245,9 +246,7 @@ private void checkDialog(DlgResource dialog) { checkCode(compiler.getCode(), type); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } else if (checkTypes.contains("WAV") && (entry instanceof State || entry instanceof Transition)) { for (final StructEntry e : ((AbstractStruct) entry).getFlatFields()) { @@ -263,9 +262,7 @@ private void checkScript(BcsResource script) { try { checkCode(script.getCode(), ScriptType.BCS); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } diff --git a/src/org/infinity/check/ScriptChecker.java b/src/org/infinity/check/ScriptChecker.java index 096dc2b99..1fa10873e 100644 --- a/src/org/infinity/check/ScriptChecker.java +++ b/src/org/infinity/check/ScriptChecker.java @@ -43,6 +43,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.tinylog.Logger; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class ScriptChecker extends AbstractSearcher @@ -240,9 +241,7 @@ protected Runnable newWorker(ResourceEntry entry) { } } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } advanceProgress(); }; diff --git a/src/org/infinity/check/StringUseChecker.java b/src/org/infinity/check/StringUseChecker.java index 93623347c..dcbde2e78 100644 --- a/src/org/infinity/check/StringUseChecker.java +++ b/src/org/infinity/check/StringUseChecker.java @@ -61,6 +61,7 @@ import org.infinity.util.StringTable; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; +import org.tinylog.Logger; public final class StringUseChecker extends AbstractSearcher implements Runnable, ListSelectionListener, SearchClient, ActionListener { @@ -375,9 +376,7 @@ private void checkDialog(DlgResource dialog) { checkCode(compiler.getCode(), type); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } @@ -387,9 +386,7 @@ private void checkScript(BcsResource script) { try { checkCode(script.getCode(), ScriptType.BCS); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } @@ -550,7 +547,7 @@ private void checkBestiaryLua() { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/check/StringValidationChecker.java b/src/org/infinity/check/StringValidationChecker.java index c5dff6629..ecbb45e19 100644 --- a/src/org/infinity/check/StringValidationChecker.java +++ b/src/org/infinity/check/StringValidationChecker.java @@ -55,6 +55,7 @@ import org.infinity.util.Misc; import org.infinity.util.StringTable; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class StringValidationChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -257,17 +258,13 @@ protected Runnable newWorker(ResourceEntry entry) { try { validateInput(decoder, inBuf, outBuf, entry, idx, isFemale); } catch (IllegalStateException | CoderMalfunctionError e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } decoder.reset(); } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } advanceProgress(); diff --git a/src/org/infinity/check/StrrefIndexChecker.java b/src/org/infinity/check/StrrefIndexChecker.java index 18c9edc9c..fa63e74bf 100644 --- a/src/org/infinity/check/StrrefIndexChecker.java +++ b/src/org/infinity/check/StrrefIndexChecker.java @@ -52,6 +52,7 @@ import org.infinity.util.StringTable; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; +import org.tinylog.Logger; public class StrrefIndexChecker extends AbstractChecker implements ListSelectionListener { private final ChildFrame resultFrame = new ChildFrame("Illegal strrefs found", true); @@ -217,9 +218,7 @@ private void checkDialog(DlgResource dialog) { } } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } @@ -254,9 +253,7 @@ private void checkScript(BcsResource script) { } } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } @@ -302,9 +299,7 @@ private void checkText(PlainTextResource text) { } } } catch (NumberFormatException e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } diff --git a/src/org/infinity/check/StructChecker.java b/src/org/infinity/check/StructChecker.java index 320639028..5d2584dbe 100644 --- a/src/org/infinity/check/StructChecker.java +++ b/src/org/infinity/check/StructChecker.java @@ -57,6 +57,7 @@ import org.infinity.resource.wed.Tilemap; import org.infinity.util.Misc; import org.infinity.util.StringTable; +import org.tinylog.Logger; public final class StructChecker extends AbstractChecker implements ListSelectionListener { private static final String[] FILETYPES = { "ARE", "CHR", "CHU", "CRE", "DLG", "EFF", "GAM", "ITM", "PRO", "SPL", @@ -498,7 +499,7 @@ private void showInViewer(Corruption corruption, boolean newWindow) { try { ((AbstractStruct) res).getViewer().selectEntry(offset); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } else { @@ -512,7 +513,7 @@ private void showInViewer(Corruption corruption, boolean newWindow) { try { ((AbstractStruct) res).getViewer().selectEntry(offset); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } else { @@ -522,7 +523,7 @@ private void showInViewer(Corruption corruption, boolean newWindow) { try { ((AbstractStruct) viewable).getViewer().selectEntry(offset); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } }); diff --git a/src/org/infinity/datatype/AreResourceRef.java b/src/org/infinity/datatype/AreResourceRef.java index f2dd49478..0107b7758 100644 --- a/src/org/infinity/datatype/AreResourceRef.java +++ b/src/org/infinity/datatype/AreResourceRef.java @@ -47,8 +47,8 @@ public AreResourceRef(ByteBuffer buffer, int offset, String name, AreResource ar } // ResourceEntry entry = ResourceFactory.getInstance().getResourceEntry(getResourceName()); // if (!isLegalEntry(entry)) { -// System.out.println("Illegal: " + entry + " from " + entry.getActualFile()); -// System.out.println("In: " + are.getResourceEntry() + " from " + are.getResourceEntry().getActualFile()); +// Logger.info("Illegal: {} from {}", entry, entry.getActualFile()); +// Logger.info("In: {} from {}", are.getResourceEntry(), are.getResourceEntry().getActualFile()); // } } diff --git a/src/org/infinity/datatype/Bestiary.java b/src/org/infinity/datatype/Bestiary.java index 75fbc89aa..6862a1cbe 100644 --- a/src/org/infinity/datatype/Bestiary.java +++ b/src/org/infinity/datatype/Bestiary.java @@ -67,6 +67,7 @@ import org.infinity.util.IniMapSection; import org.infinity.util.Misc; import org.infinity.util.StringTable; +import org.tinylog.Logger; /** * Datatype for {@link GamResource#GAM_BESTIARY Bestiary} field of the {@link GamResource GAM} resource. @@ -809,18 +810,17 @@ private static List readCreatures() { private static List readCreatures(String filename, IniMap ini) { final IniMapSection init = ini.getSection("init"); if (init == null) { - System.err.println(filename + ": [init] section not found in the file. Creatures not loaded"); + Logger.warn("{}: [init] section not found in the file. Creatures not loaded", filename); return Collections.emptyList(); } final IniMapEntry entry = init.getEntry("beastcount"); if (entry == null) { - System.err.println(filename + ": \"beastcount\" key in [init] section not found. Creatures not loaded"); + Logger.warn("{}: \"beastcount\" key in [init] section not found. Creatures not loaded", filename); return Collections.emptyList(); } final Integer count = entry.getIntValue(); if (count == null) { - System.err.println(filename + ": \"beastcount\" key in [init] section: expected integer buf found " - + entry.getValue() + ". Creatures not loaded"); + Logger.warn("{}: \"beastcount\" key in [init] section: expected integer but found {}. Creatures not loaded.", filename, entry.getValue()); return Collections.emptyList(); } @@ -833,8 +833,7 @@ private static List readCreatures(String filename, IniMap ini) { continue; } if (i < 0 || i >= 256) { - System.err.println( - filename + ": invalid creature number " + i + ", expected number in range [0; 256]. Creature skipped"); + Logger.warn("{}: invalid creature number {}, expected number in range [0; 256]. Creature skipped.", filename, i); continue; } result.ensureCapacity(i); diff --git a/src/org/infinity/datatype/ColorValue.java b/src/org/infinity/datatype/ColorValue.java index 31fdcb377..9b959d96e 100644 --- a/src/org/infinity/datatype/ColorValue.java +++ b/src/org/infinity/datatype/ColorValue.java @@ -61,6 +61,7 @@ import org.infinity.util.Misc; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; +import org.tinylog.Logger; /** * Field that represents indexed color or color range. @@ -431,7 +432,7 @@ private void initEntries(int defaultWidth, int defaultHeight) { colors.add(range); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/datatype/Datatype.java b/src/org/infinity/datatype/Datatype.java index f37d35e03..20ca9d25a 100644 --- a/src/org/infinity/datatype/Datatype.java +++ b/src/org/infinity/datatype/Datatype.java @@ -19,6 +19,7 @@ import org.infinity.resource.StructEntry; import org.infinity.util.io.ByteBufferOutputStream; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Base class for all types of fields. Supplies base properties for fields: its name (not stored in the file), offset in @@ -152,7 +153,7 @@ public ByteBuffer getDataBuffer() { try (ByteBufferOutputStream bbos = new ByteBufferOutputStream(bb)) { write(bbos); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } bb.position(0); return bb; diff --git a/src/org/infinity/datatype/DecNumber.java b/src/org/infinity/datatype/DecNumber.java index 9bb9d38e9..6265c059f 100644 --- a/src/org/infinity/datatype/DecNumber.java +++ b/src/org/infinity/datatype/DecNumber.java @@ -12,6 +12,7 @@ import java.util.Objects; import org.infinity.resource.AbstractStruct; +import org.tinylog.Logger; /** * Field that represents numerical value which is usually edited in a decimal mode. @@ -52,7 +53,7 @@ public boolean update(Object value) { } return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return false; diff --git a/src/org/infinity/datatype/EffectType.java b/src/org/infinity/datatype/EffectType.java index 89f5e4795..58f3ec652 100644 --- a/src/org/infinity/datatype/EffectType.java +++ b/src/org/infinity/datatype/EffectType.java @@ -12,6 +12,7 @@ import org.infinity.resource.AbstractStruct; import org.infinity.resource.StructEntry; import org.infinity.resource.effects.BaseOpcode; +import org.tinylog.Logger; public final class EffectType extends Bitmap implements UpdateListener { // EffectType-specific field labels @@ -42,7 +43,7 @@ public boolean updateValue(AbstractStruct struct) { struct.addFields(this, list); return true; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return false; } @@ -56,7 +57,7 @@ public boolean valueUpdated(UpdateEvent event) { try { return BaseOpcode.updateOpcode(event.getStructure()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return false; } @@ -80,7 +81,7 @@ public int readAttributes(ByteBuffer buffer, int off, List list) { try { off = BaseOpcode.makeEffectStruct(getValue(), this, buffer, off, list, isV1); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } attrLength = off - attrLength; return off; diff --git a/src/org/infinity/datatype/FloatNumber.java b/src/org/infinity/datatype/FloatNumber.java index 0514391c4..ad9d674bb 100644 --- a/src/org/infinity/datatype/FloatNumber.java +++ b/src/org/infinity/datatype/FloatNumber.java @@ -12,6 +12,7 @@ import org.infinity.resource.AbstractStruct; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Field that represents numerical value which is usually edited in a floating point mode. @@ -51,7 +52,7 @@ public boolean update(Object value) { return true; } catch (NumberFormatException e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/datatype/HexNumber.java b/src/org/infinity/datatype/HexNumber.java index 4fa09c440..14097c588 100644 --- a/src/org/infinity/datatype/HexNumber.java +++ b/src/org/infinity/datatype/HexNumber.java @@ -6,6 +6,8 @@ import java.nio.ByteBuffer; +import org.tinylog.Logger; + public class HexNumber extends DecNumber { public HexNumber(ByteBuffer buffer, int offset, int length, String desc) { super(buffer, offset, length, desc); @@ -19,7 +21,7 @@ public boolean update(Object value) { setValue((int) DecNumber.parseNumber(value, getSize(), true, true)); return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/datatype/ItemTypeBitmap.java b/src/org/infinity/datatype/ItemTypeBitmap.java index d60efad59..0f46d12e1 100644 --- a/src/org/infinity/datatype/ItemTypeBitmap.java +++ b/src/org/infinity/datatype/ItemTypeBitmap.java @@ -16,6 +16,7 @@ import org.infinity.util.Misc; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; +import org.tinylog.Logger; /** * Specialized {@link HashBitmap} that uses a mix of hardcoded entries and custom entries from ITEMTYPE.2DA @@ -104,7 +105,7 @@ private static TreeMap buildCategories() { retVal.put((long) idx, catName); } catch (NumberFormatException e) { // skip entry with log message - System.err.printf("%s: Invalid index at row=%d (value=%s)\n", TABLE_NAME, row, idxValue); + Logger.warn("{}: Invalid index at row={} (value={})", TABLE_NAME, row, idxValue); } } } else if (Profile.getEngine() == Profile.Engine.PST) { diff --git a/src/org/infinity/datatype/MultiNumber.java b/src/org/infinity/datatype/MultiNumber.java index 7d6111de9..f1c211414 100644 --- a/src/org/infinity/datatype/MultiNumber.java +++ b/src/org/infinity/datatype/MultiNumber.java @@ -32,6 +32,7 @@ import org.infinity.gui.menu.BrowserMenuBar; import org.infinity.resource.AbstractStruct; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * A Number object consisting of multiple values of a given number of bits. @@ -393,7 +394,7 @@ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { data[VALUE][rowIndex] = Integer.valueOf(newVal); fireTableCellUpdated(rowIndex, columnIndex); } catch (NumberFormatException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/datatype/ResourceRef.java b/src/org/infinity/datatype/ResourceRef.java index a7d10e2d1..ea8924220 100644 --- a/src/org/infinity/datatype/ResourceRef.java +++ b/src/org/infinity/datatype/ResourceRef.java @@ -46,6 +46,7 @@ import org.infinity.resource.sound.SoundResource; import org.infinity.util.Misc; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Represents reference to another resource in game. This resource can be sound, item, dialog, creature, image. @@ -429,7 +430,7 @@ private void closeResource(Resource resource) { try { ((Closeable) resource).close(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/datatype/StringRef.java b/src/org/infinity/datatype/StringRef.java index 66a25136b..8aef8bab7 100644 --- a/src/org/infinity/datatype/StringRef.java +++ b/src/org/infinity/datatype/StringRef.java @@ -54,6 +54,7 @@ import org.infinity.util.Misc; import org.infinity.util.StringTable; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * A struct field that represents reference to string in a talk table file (dialog.tlk or dialogF.tlk). @@ -474,7 +475,7 @@ private String getStringRef(int strref, StringTable.Format fmt) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else { // load TOH/TOT directly diff --git a/src/org/infinity/datatype/Summon2daBitmap.java b/src/org/infinity/datatype/Summon2daBitmap.java index a8a35c576..29dc93118 100644 --- a/src/org/infinity/datatype/Summon2daBitmap.java +++ b/src/org/infinity/datatype/Summon2daBitmap.java @@ -11,6 +11,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; +import org.tinylog.Logger; /** Specialized HashBitmap type for parsing {@code SMTABLES.2DA} from IWDEE. */ public class Summon2daBitmap extends HashBitmap { @@ -38,10 +39,10 @@ private static synchronized TreeMap getSummonTable() { String resref = table.get(row, 1).toUpperCase(Locale.ENGLISH) + ".2DA"; SUMMON_MAP.put(id, resref); if (!ResourceFactory.resourceExists(resref)) { - System.err.println("Resource does not exist: " + resref); + Logger.warn("Resource does not exist: {}", resref); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/datatype/UnknownDecimal.java b/src/org/infinity/datatype/UnknownDecimal.java index 21fc2c810..fdbb67878 100644 --- a/src/org/infinity/datatype/UnknownDecimal.java +++ b/src/org/infinity/datatype/UnknownDecimal.java @@ -8,6 +8,7 @@ import java.nio.ByteBuffer; import org.infinity.resource.AbstractStruct; +import org.tinylog.Logger; /** * Field that represents binary data in decimal format in their editor. @@ -50,7 +51,7 @@ public boolean updateValue(AbstractStruct struct) { return true; } } catch (NumberFormatException e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/datatype/UnsignHexNumber.java b/src/org/infinity/datatype/UnsignHexNumber.java index e65494be2..0b99c36ca 100644 --- a/src/org/infinity/datatype/UnsignHexNumber.java +++ b/src/org/infinity/datatype/UnsignHexNumber.java @@ -6,6 +6,8 @@ import java.nio.ByteBuffer; +import org.tinylog.Logger; + public class UnsignHexNumber extends UnsignDecNumber { public UnsignHexNumber(ByteBuffer buffer, int offset, int length, String desc) { super(buffer, offset, length, desc); @@ -19,7 +21,7 @@ public boolean update(Object value) { setValue(UnsignDecNumber.parseNumber(value, getSize(), false, true)); return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/gui/BIFFEditor.java b/src/org/infinity/gui/BIFFEditor.java index 4907afd66..4eb909796 100644 --- a/src/org/infinity/gui/BIFFEditor.java +++ b/src/org/infinity/gui/BIFFEditor.java @@ -45,6 +45,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class BIFFEditor implements ActionListener, ListSelectionListener, Runnable { private static boolean firstRun = true; @@ -121,7 +122,7 @@ public void run() { progress.setProgress(2, false); JOptionPane.showMessageDialog(editframe, "Error while extracting files from " + bifentry, "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); blocker.setBlocked(false); return; } @@ -147,7 +148,7 @@ public void run() { } catch (Exception e) { progress.setProgress(3, false); JOptionPane.showMessageDialog(editframe, "Error while saving " + bifentry, "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); blocker.setBlocked(false); return; } @@ -159,7 +160,7 @@ public void run() { try { Files.delete(file); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -182,7 +183,7 @@ public void run() { } catch (IOException e) { progress.setProgress(6, false); JOptionPane.showMessageDialog(editframe, "Error while saving keyfile", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } ResourceFactory.getResourceTreeModel().sort(); blocker.setBlocked(false); diff --git a/src/org/infinity/gui/BcsDropFrame.java b/src/org/infinity/gui/BcsDropFrame.java index 93f1d2bd4..86556d2d0 100644 --- a/src/org/infinity/gui/BcsDropFrame.java +++ b/src/org/infinity/gui/BcsDropFrame.java @@ -63,6 +63,7 @@ import org.infinity.util.Misc; import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; public class BcsDropFrame extends ChildFrame implements ActionListener, ListSelectionListener { private final JButton bOpen = new JButton("Open selected", Icons.ICON_OPEN_16.getIcon()); @@ -242,7 +243,7 @@ private SortedSet compileFile(Path file) { line = br.readLine(); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return null; } Compiler compiler = new Compiler(source.toString()); @@ -269,7 +270,7 @@ private SortedSet compileFile(Path file) { try (BufferedWriter bw = Files.newBufferedWriter(output)) { bw.write(compiled); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return null; } } @@ -285,7 +286,7 @@ private boolean decompileFile(Path file) { line = br.readLine(); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return false; } String filename = file.getFileName().toString(); @@ -302,7 +303,7 @@ private boolean decompileFile(Path file) { bw.write(decompiler.getSource().replaceAll("\r?\n", Misc.LINE_SEPARATOR)); bw.newLine(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return false; } return true; @@ -322,7 +323,7 @@ private void filesDropped(Component component, List files) { files.add(p.toFile()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } else if (file.getFileName().toString().toUpperCase(Locale.ENGLISH).endsWith(".BAF")) { SortedSet errors = compileFile(file); @@ -352,7 +353,7 @@ private void filesDropped(Component component, List files) { files.add(p.toFile()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } else if (file.getFileName().toString().toUpperCase(Locale.ENGLISH).endsWith(".BCS") || file.getFileName().toString().toUpperCase(Locale.ENGLISH).endsWith(".BS")) { @@ -407,7 +408,7 @@ public void drop(DropTargetDropEvent event) { event.acceptDrop(DnDConstants.ACTION_COPY); files = (List) event.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); event.dropComplete(false); return; } diff --git a/src/org/infinity/gui/ChildFrame.java b/src/org/infinity/gui/ChildFrame.java index b2d2ddb85..a797fc3cb 100644 --- a/src/org/infinity/gui/ChildFrame.java +++ b/src/org/infinity/gui/ChildFrame.java @@ -34,6 +34,7 @@ import org.infinity.resource.Viewable; import org.infinity.resource.ViewableContainer; import org.infinity.resource.graphics.BamResource; +import org.tinylog.Logger; public class ChildFrame extends JFrame { private static final List WINDOWS = new ArrayList<>(); @@ -190,7 +191,7 @@ public void actionPerformed(ActionEvent e) { return; } } catch (Exception e2) { - e2.printStackTrace(); + Logger.error(e2); return; } WINDOWS.remove(ChildFrame.this); @@ -338,7 +339,7 @@ private static void closeWindow(ChildFrame frame, WindowEvent event) { } frame.dispose(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/gui/ChooseBIFFrame.java b/src/org/infinity/gui/ChooseBIFFrame.java index ecafd399f..c910fd675 100644 --- a/src/org/infinity/gui/ChooseBIFFrame.java +++ b/src/org/infinity/gui/ChooseBIFFrame.java @@ -29,6 +29,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.key.AbstractBIFFReader; import org.infinity.resource.key.BIFFEntry; +import org.tinylog.Logger; final class ChooseBIFFrame extends ChildFrame implements ActionListener { private final BIFFEditor editor; @@ -211,7 +212,7 @@ public void actionPerformed(ActionEvent event) { close(); editor.makeEditor(entry, file.getType()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/gui/DebugConsole.java b/src/org/infinity/gui/DebugConsole.java index fea613db0..f8aa330fc 100644 --- a/src/org/infinity/gui/DebugConsole.java +++ b/src/org/infinity/gui/DebugConsole.java @@ -28,6 +28,7 @@ import org.infinity.resource.Profile; import org.infinity.util.Misc; import org.infinity.util.io.FileEx; +import org.tinylog.Logger; public class DebugConsole extends ChildFrame implements ActionListener { private final JButton bClearConsole = new JButton("Clear", Icons.ICON_NEW_16.getIcon()); @@ -104,7 +105,7 @@ public void actionPerformed(ActionEvent event) { JOptionPane.INFORMATION_MESSAGE); } catch (IOException e) { JOptionPane.showMessageDialog(this, "Error while saving " + output, "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } else if (event.getSource() == cbExtraInfo) { diff --git a/src/org/infinity/gui/FontChooser.java b/src/org/infinity/gui/FontChooser.java index c644a13fd..f497d1d73 100644 --- a/src/org/infinity/gui/FontChooser.java +++ b/src/org/infinity/gui/FontChooser.java @@ -49,6 +49,7 @@ import javax.swing.text.Position; import org.infinity.util.Misc; +import org.tinylog.Logger; //import org.infinity.util.Misc; @@ -61,7 +62,7 @@ * int result = fontChooser.showDialog(parent); * if (result == FontChooser.OK_OPTION) { * Font font = fontChooser.getSelectedFont(); - * System.out.println("Selected Font : " + font); + * Logger.info("Selected Font : {}", font); * } * * @@ -495,7 +496,7 @@ private void update(DocumentEvent event) { Document doc = event.getDocument(); newValue = doc.getText(0, doc.getLength()); } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } if (newValue.length() > 0) { diff --git a/src/org/infinity/gui/InfinityAmp.java b/src/org/infinity/gui/InfinityAmp.java index 6a627f6ae..b9aaf9311 100644 --- a/src/org/infinity/gui/InfinityAmp.java +++ b/src/org/infinity/gui/InfinityAmp.java @@ -40,6 +40,7 @@ import org.infinity.util.Misc; import org.infinity.util.SimpleListModel; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class InfinityAmp extends ChildFrame implements ActionListener, ListSelectionListener, Runnable, Closeable { @@ -284,7 +285,7 @@ private void playMus(ResourceEntry musEntry) { } catch (Exception e) { JOptionPane.showMessageDialog(this, "Error accessing " + musEntry + '\n' + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/gui/InfinityTextArea.java b/src/org/infinity/gui/InfinityTextArea.java index 30df0a300..6a798c63d 100644 --- a/src/org/infinity/gui/InfinityTextArea.java +++ b/src/org/infinity/gui/InfinityTextArea.java @@ -44,6 +44,7 @@ import org.infinity.resource.text.modes.TLKTokenMaker; import org.infinity.resource.text.modes.WeiDULogTokenMaker; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * Extends {@link RSyntaxTextArea} by NearInfinity-specific features. @@ -402,7 +403,7 @@ public static void applyExtendedSettings(RSyntaxTextArea edit, Language language } catch (NullPointerException e) { // ignore } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/gui/LinkButton.java b/src/org/infinity/gui/LinkButton.java index b2b554e2c..a6028c34e 100644 --- a/src/org/infinity/gui/LinkButton.java +++ b/src/org/infinity/gui/LinkButton.java @@ -22,6 +22,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.key.ResourceEntry; import org.infinity.updater.Utils; +import org.tinylog.Logger; /** * A JLabel-based control which supports either internal game resources or external URLs. @@ -214,7 +215,7 @@ public void actionPerformed(ActionEvent e) { try { Utils.openWebPage(new URL(getUrl())); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); JOptionPane.showMessageDialog(((LinkButton) e.getSource()).getTopLevelAncestor(), "Error opening link in browser.", "Error", JOptionPane.ERROR_MESSAGE); } diff --git a/src/org/infinity/gui/OpenFileFrame.java b/src/org/infinity/gui/OpenFileFrame.java index d794d8dbf..3d34b91b2 100644 --- a/src/org/infinity/gui/OpenFileFrame.java +++ b/src/org/infinity/gui/OpenFileFrame.java @@ -48,6 +48,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; public final class OpenFileFrame extends ChildFrame implements ActionListener { private static final JFileChooser FC = new JFileChooser("."); @@ -275,7 +276,7 @@ public void drop(DropTargetDropEvent event) { event.acceptDrop(DnDConstants.ACTION_COPY); files = (List) event.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); event.dropComplete(false); return; } diff --git a/src/org/infinity/gui/PreferencesDialog.java b/src/org/infinity/gui/PreferencesDialog.java index a11c3ddc9..8c024b7c9 100644 --- a/src/org/infinity/gui/PreferencesDialog.java +++ b/src/org/infinity/gui/PreferencesDialog.java @@ -89,6 +89,7 @@ import org.infinity.icon.Icons; import org.infinity.resource.Profile; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * This modal dialog provides access to application-wide options and preferences @@ -1380,7 +1381,7 @@ private void globalFontSizeOnAccept(OptionGroupBox gb) { gb.getOption().setValue(-size); } } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1431,7 +1432,7 @@ private boolean globalFontSizeOnSelect(OptionGroupBox gb) { return true; } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } return true; @@ -1463,7 +1464,7 @@ private void lookAndFeelClassOnInit(OptionGroupBox gb) { label = ((LookAndFeel) o).getName(); } } catch (Exception e) { -// e.printStackTrace(); +// Logger.error(e); } if (label == null) { @@ -1484,7 +1485,7 @@ private void lookAndFeelClassOnInit(OptionGroupBox gb) { // need to track item index separately in case that a L&F class is not accessible curIdx++; } catch (Exception e) { -// e.printStackTrace(); +// Logger.error(e); } } @@ -1504,7 +1505,7 @@ private void lookAndFeelClassOnAccept(OptionGroupBox gb) { final DataItem item = (DataItem) gb.getItem(gb.getSelectedIndex()); gb.getOption().setValue(item.getData().getClassName()); } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1557,7 +1558,7 @@ private void textFontOnAccept(OptionGroupBox gb) { } gb.getOption().setValue(Integer.valueOf(index)); } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1583,7 +1584,7 @@ private boolean textFontOnSelect(OptionGroupBox gb) { } } } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } return true; @@ -1642,7 +1643,7 @@ private void tlkCharsetTypeOnAccept(OptionGroupBox gb) { gb.getOption().setValue(item.getData()); } } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1704,7 +1705,7 @@ private void gameLanguagesOnAccept(OptionGroupBox gb) { languageDefinitions = OptionsMenuItem.updateGameLanguages(languageDefinitions, Profile.getGame(), langCode); gb.getOption().setValue(languageDefinitions); } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1768,7 +1769,7 @@ private void uiScaleFactorOnAccept(OptionGroupBox gb) { final DataItem item = (DataItem) gb.getItem(gb.getSelectedIndex()); gb.getOption().setValue(item.getData()); } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -1819,7 +1820,7 @@ private boolean uiScaleFactorOnSelect(OptionGroupBox gb) { return true; } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/gui/ResourceTree.java b/src/org/infinity/gui/ResourceTree.java index 5049c8d32..882774d34 100644 --- a/src/org/infinity/gui/ResourceTree.java +++ b/src/org/infinity/gui/ResourceTree.java @@ -72,6 +72,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class ResourceTree extends JPanel implements TreeSelectionListener, ActionListener { private final JButton bnext = new JButton("Forward", Icons.ICON_FORWARD_16.getIcon()); @@ -302,7 +303,7 @@ public static void renameResource(FileResourceEntry entry) { } catch (IOException e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error renaming file \"" + filename + "\"!", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return; } // ResourceFactory.getResourceTreeModel().resourceEntryChanged(entry); @@ -323,7 +324,7 @@ public static void deleteResource(ResourceEntry entry) { try { Files.delete(bakFile); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } try { @@ -331,7 +332,7 @@ public static void deleteResource(ResourceEntry entry) { } catch (IOException e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error deleting file \"" + entry.getResourceName() + "\"!", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } else if (entry instanceof BIFFResourceEntry) { String options[] = { "Delete", "Cancel" }; @@ -346,7 +347,7 @@ public static void deleteResource(ResourceEntry entry) { try { Files.delete(bakFile); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } try { @@ -354,7 +355,7 @@ public static void deleteResource(ResourceEntry entry) { } catch (IOException e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error deleting file \"" + entry.getResourceName() + "\"!", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } @@ -385,7 +386,7 @@ public static void restoreResource(ResourceEntry entry) { try { Files.delete(tmpFile); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Backup has been restored successfully.", "Restore backup", JOptionPane.INFORMATION_MESSAGE); @@ -401,11 +402,11 @@ public static void restoreResource(ResourceEntry entry) { + String.format("Please manually rename the file \"%s\" into \"%s\", located in \n + \"%s\"", tmpName, curName, path), "Critical Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return; } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } JOptionPane.showMessageDialog(NearInfinity.getInstance(), @@ -420,7 +421,7 @@ public static void restoreResource(ResourceEntry entry) { } catch (IOException e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error removing file \"" + entry + "\" from override folder!", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } @@ -442,7 +443,7 @@ public static void createZipFile(Path path) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Zip file created.", "Information", JOptionPane.INFORMATION_MESSAGE); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); wb.setBlocked(false); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error while creating zip file.", "Error", JOptionPane.ERROR_MESSAGE); @@ -727,7 +728,7 @@ public void actionPerformed(ActionEvent event) { new ViewFrame(NearInfinity.getInstance(), res); } } catch (NullPointerException e) { - System.err.println("Does not exist in BIFF: " + node); + Logger.warn("Does not exist in BIFF: {}", node); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Does not exist in BIFF: " + node, "Error", JOptionPane.ERROR_MESSAGE); } diff --git a/src/org/infinity/gui/SortableTable.java b/src/org/infinity/gui/SortableTable.java index b1be0ec35..268626bbb 100644 --- a/src/org/infinity/gui/SortableTable.java +++ b/src/org/infinity/gui/SortableTable.java @@ -36,6 +36,7 @@ import org.infinity.resource.Profile; import org.infinity.util.ArrayUtil; import org.infinity.util.io.FileEx; +import org.tinylog.Logger; public final class SortableTable extends JTable implements MouseListener { private static final String WITH_DELIMITERS = "(?<=%1$s)(?!%1$s)|(? FILTER_INFO_LIST = new ArrayList<>(); @@ -99,7 +101,7 @@ public static BamFilterBase createInstance(ConvertToBam parent, Class convert() { } result.add("Conversion finished successfully."); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add(String.format("Error while exporting BAM files.\n(%s)", e.getMessage())); } @@ -4009,7 +4010,7 @@ private void updateFilteredBamDecoder(int bamVersion, boolean force) throws Exce } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw e; } } else if (filter instanceof BamFilterBaseTransform) { @@ -4028,16 +4029,16 @@ private void updateFilteredBamDecoder(int bamVersion, boolean force) throws Exce } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw e; } } else if (filter instanceof BamFilterBaseOutput) { // skipping output filter } else { if (filter != null) { - System.err.println(String.format("Skipping unrecognized filter: %s", filter)); + Logger.warn("Skipping unrecognized filter: {}", filter); } else { - System.err.println("Skipping null filter"); + Logger.warn("Skipping null filter"); } } } @@ -5657,7 +5658,7 @@ private boolean saveData(Path outFile, boolean silent) { } retVal = true; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); if (!silent) { JOptionPane.showMessageDialog(bam, "Error exporting BAM session.", "Error", JOptionPane.ERROR_MESSAGE); } diff --git a/src/org/infinity/gui/converter/ConvertToBmp.java b/src/org/infinity/gui/converter/ConvertToBmp.java index 20a24a3a1..c755768b0 100644 --- a/src/org/infinity/gui/converter/ConvertToBmp.java +++ b/src/org/infinity/gui/converter/ConvertToBmp.java @@ -58,6 +58,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class ConvertToBmp extends ChildFrame implements ActionListener, FocusListener, PropertyChangeListener { private static Path currentPath = Profile.getGameRoot(); @@ -221,7 +222,7 @@ public void propertyChange(PropertyChangeEvent event) { try { sl = workerConvert.get(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } workerConvert = null; @@ -522,7 +523,7 @@ private void inputAddFolder() { } catch (IOException e) { JOptionPane.showMessageDialog(this, "Unable to read files from the specified folder.", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return; } listInputFiles.setSelectedIndex(idx - 1); @@ -768,7 +769,7 @@ private boolean writeBMP(Image srcImage, Path file, boolean hasAlpha) { } return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return false; diff --git a/src/org/infinity/gui/converter/ConvertToMos.java b/src/org/infinity/gui/converter/ConvertToMos.java index 98c562bcf..03ceaefa1 100644 --- a/src/org/infinity/gui/converter/ConvertToMos.java +++ b/src/org/infinity/gui/converter/ConvertToMos.java @@ -63,6 +63,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class ConvertToMos extends ChildFrame implements ActionListener, PropertyChangeListener, ChangeListener, FocusListener { @@ -241,7 +242,7 @@ public static boolean convertV1(Component parent, BufferedImage img, String mosF try (OutputStream os = StreamUtils.getOutputStream(mosFile, true)) { os.write(dst); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add("Error writing TIS file to disk."); return false; @@ -386,7 +387,7 @@ public static boolean convertV2(Component parent, BufferedImage img, String mosF try (OutputStream os = StreamUtils.getOutputStream(mosFile, true)) { os.write(dst); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add("Error writing MOS file to disk."); return false; @@ -496,14 +497,14 @@ private static boolean createPvrzPages(Path path, BufferedImage img, DxtEncoder. try (OutputStream os = StreamUtils.getOutputStream(pvrzFile, true)) { os.write(pvrz); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add(String.format("Error writing PVRZ file \"%s\" to disk.", pvrzFile)); return false; } pvrz = null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add(String.format("Error while generating PVRZ files:\n%s", e.getMessage())); return false; @@ -614,7 +615,7 @@ public void propertyChange(PropertyChangeEvent event) { try { sl = workerConvert.get(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } workerConvert = null; diff --git a/src/org/infinity/gui/converter/ConvertToPvrz.java b/src/org/infinity/gui/converter/ConvertToPvrz.java index e8bb6210e..26c12a0dd 100644 --- a/src/org/infinity/gui/converter/ConvertToPvrz.java +++ b/src/org/infinity/gui/converter/ConvertToPvrz.java @@ -59,6 +59,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class ConvertToPvrz extends ChildFrame implements ActionListener, PropertyChangeListener { private static String currentDir = Profile.getGameRoot().toString(); @@ -276,7 +277,7 @@ public void propertyChange(PropertyChangeEvent event) { try { sl = workerConvert.get(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } workerConvert = null; @@ -613,7 +614,7 @@ private List convert() { } catch (IOException e) { bb = null; errors++; - e.printStackTrace(); + Logger.error(e); } if (bb != null) { byte[] buffer = bb.array(); @@ -622,7 +623,7 @@ private List convert() { os.write(output); } catch (Exception e) { errors++; - e.printStackTrace(); + Logger.error(e); } } } else if (isGraphics) { @@ -744,7 +745,7 @@ private List convert() { os.write(pvrz); } catch (Exception e) { errors++; - e.printStackTrace(); + Logger.error(e); } // cleaning up diff --git a/src/org/infinity/gui/converter/ConvertToTis.java b/src/org/infinity/gui/converter/ConvertToTis.java index 49f75dd93..5e87f990e 100644 --- a/src/org/infinity/gui/converter/ConvertToTis.java +++ b/src/org/infinity/gui/converter/ConvertToTis.java @@ -65,6 +65,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class ConvertToTis extends ChildFrame implements ActionListener, PropertyChangeListener, ChangeListener, FocusListener, KeyListener { @@ -229,7 +230,7 @@ public static boolean convertV1(Component parent, BufferedImage img, String tisF os.write(dst); } catch (Exception e) { // error handling - e.printStackTrace(); + Logger.error(e); result.add(null); result.add("Error writing TIS file to disk."); return false; @@ -384,7 +385,7 @@ public static boolean convertV2(Component parent, BufferedImage img, String tisF os.write(dst); } catch (Exception e) { // error handling - e.printStackTrace(); + Logger.error(e); result.add(null); result.add("Error writing TIS file to disk."); return false; @@ -538,14 +539,14 @@ public static boolean createPvrzPages(String tisFileName, BufferedImage srcImg, os.write(pvrz); } catch (Exception e) { // critical error - e.printStackTrace(); + Logger.error(e); result.add(null); result.add(String.format("Error writing PVRZ file \"%s\" to disk.", pvrzName)); return false; } pvrz = null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); result.add(null); result.add(String.format("Error while generating PVRZ files:\n%s", e.getMessage())); return false; @@ -700,7 +701,7 @@ public void propertyChange(PropertyChangeEvent event) { try { sl = workerConvert.get(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } workerConvert = null; diff --git a/src/org/infinity/gui/hexview/ResourceDataProvider.java b/src/org/infinity/gui/hexview/ResourceDataProvider.java index c460c21d9..7b896d1e7 100644 --- a/src/org/infinity/gui/hexview/ResourceDataProvider.java +++ b/src/org/infinity/gui/hexview/ResourceDataProvider.java @@ -9,6 +9,7 @@ import java.util.HashMap; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.IDataChangedListener; @@ -60,7 +61,7 @@ public byte[] getData(long offset, int length) { } return retVal; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return null; @@ -76,7 +77,7 @@ public int getDataLength() { size = (int) resSize; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return size; diff --git a/src/org/infinity/gui/hexview/StructHexViewer.java b/src/org/infinity/gui/hexview/StructHexViewer.java index 30b35911b..3d666887f 100644 --- a/src/org/infinity/gui/hexview/StructHexViewer.java +++ b/src/org/infinity/gui/hexview/StructHexViewer.java @@ -77,6 +77,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.HexViewEvent; @@ -487,7 +488,7 @@ private boolean saveResource(Path outFile) { } catch (IOException e) { JOptionPane.showMessageDialog(this, "Unable to create override folder.", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return false; } } @@ -513,7 +514,7 @@ private boolean saveResource(Path outFile) { Files.move(outPath, bakPath); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } else { @@ -538,7 +539,7 @@ private boolean saveResource(Path outFile) { } catch (IOException e) { JOptionPane.showMessageDialog(this, "Error while saving " + getStruct().getResourceEntry().toString(), "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return false; } return true; diff --git a/src/org/infinity/gui/hexview/StructuredDataProvider.java b/src/org/infinity/gui/hexview/StructuredDataProvider.java index 15ae9405b..d883ff4f1 100644 --- a/src/org/infinity/gui/hexview/StructuredDataProvider.java +++ b/src/org/infinity/gui/hexview/StructuredDataProvider.java @@ -15,6 +15,7 @@ import org.infinity.resource.AbstractStruct; import org.infinity.resource.StructEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.IDataChangedListener; @@ -97,7 +98,7 @@ public byte[] getData(long offset, int length) { try { entry.write(os); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } curOfs += entry.getSize(); } @@ -106,7 +107,7 @@ public byte[] getData(long offset, int length) { try { System.arraycopy(os.toByteArray(), (int) offset - startOffset, retVal, 0, length); } catch (ArrayIndexOutOfBoundsException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -193,7 +194,7 @@ public void setData(long offset, byte[] data) { hasChanged = true; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/gui/menu/FileMenu.java b/src/org/infinity/gui/menu/FileMenu.java index 5b7403984..1c530391c 100644 --- a/src/org/infinity/gui/menu/FileMenu.java +++ b/src/org/infinity/gui/menu/FileMenu.java @@ -26,6 +26,7 @@ import org.infinity.resource.key.BIFFResourceEntry; import org.infinity.resource.key.FileResourceEntry; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Handles File menu items for the {@link BrowserMenuBar}. @@ -182,7 +183,7 @@ public void actionPerformed(ActionEvent event) { new ViewFrame(NearInfinity.getInstance(), res); } } catch (NullPointerException e) { - System.err.println("Does not exist in BIFF: " + node); + Logger.warn("Does not exist in BIFF: {}", node); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Does not exist in BIFF: " + node, "Error", JOptionPane.ERROR_MESSAGE); } diff --git a/src/org/infinity/gui/menu/GameMenu.java b/src/org/infinity/gui/menu/GameMenu.java index e947437ae..48e24d549 100644 --- a/src/org/infinity/gui/menu/GameMenu.java +++ b/src/org/infinity/gui/menu/GameMenu.java @@ -34,6 +34,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Handles Game menu items for the {@link BrowserMenuBar}. @@ -316,7 +317,7 @@ public void actionPerformed(ActionEvent event) { try { isEqual = keyFile.equals(Profile.getChitinKey().toAbsolutePath()); } catch (IOError e) { - e.printStackTrace(); + Logger.error(e); } if (!isEqual) { int confirm = JOptionPane.YES_OPTION; diff --git a/src/org/infinity/gui/menu/HelpMenu.java b/src/org/infinity/gui/menu/HelpMenu.java index 548e37f9f..2fb32f6d9 100644 --- a/src/org/infinity/gui/menu/HelpMenu.java +++ b/src/org/infinity/gui/menu/HelpMenu.java @@ -45,6 +45,7 @@ import org.infinity.util.DataString; import org.infinity.util.Misc; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Handles Help menu items for the {@link BrowserMenuBar}. @@ -65,6 +66,7 @@ public class HelpMenu extends JMenu implements BrowserSubMenu, ActionListener { private final JMenuItem helpApngWriterLicense; private final JMenuItem helpCommonMarkLicense; private final JMenuItem helpFlatLafLicense; + private final JMenuItem helpTinyLogLicense; private final JMenuItem helpOracleLicense; private final JMenuItem helpUpdateSettings; private final JMenuItem helpUpdateCheck; @@ -118,6 +120,9 @@ public HelpMenu(BrowserMenuBar parent) { helpOracleLicense = BrowserMenuBar.makeMenuItem("Oracle License", KeyEvent.VK_O, Icons.ICON_EDIT_16.getIcon(), -1, this); miscLicenses.add(helpOracleLicense); + helpTinyLogLicense = BrowserMenuBar.makeMenuItem("tinylog License", KeyEvent.VK_T, Icons.ICON_EDIT_16.getIcon(), -1, this); + miscLicenses.add(helpTinyLogLicense); + addSeparator(); helpUpdateSettings = BrowserMenuBar.makeMenuItem("Update settings...", KeyEvent.VK_S, null, -1, this); @@ -187,6 +192,8 @@ public void actionPerformed(ActionEvent event) { displayLicense("org/infinity/commonmark.License.txt", "BSD License"); } else if (event.getSource() == helpOracleLicense) { displayLicense("org/infinity/Oracle.License.txt", "BSD License"); + } else if (event.getSource() == helpTinyLogLicense) { + displayLicense("org/infinity/tinylog.License.txt", "Apache License"); } else if (event.getSource() == helpUpdateSettings) { UpdaterSettings.showDialog(NearInfinity.getInstance()); } else if (event.getSource() == helpUpdateCheck) { @@ -204,7 +211,7 @@ public void actionPerformed(ActionEvent event) { info = null; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Check for updates: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); return; @@ -257,6 +264,7 @@ private void displayAbout() { add("JHexView by Sebastian Porst - GNU General Public License."); add("CommonMark-Java (\u00A9) Atlassian Pty. Ltd. - BSD License."); add("FlatLaf (\u00A9) FormDev Software GmbH - Apache License."); + add("tinylog 2 by Martin Winandy - Apache License."); add("APNG Writer by Weoulren - BSD License."); } }; @@ -434,7 +442,7 @@ private void displayLicense(String classPath, String title) { try { tphelp.setPage(ClassLoader.getSystemResource(classPath)); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } JOptionPane.showMessageDialog(NearInfinity.getInstance(), panel, title, JOptionPane.PLAIN_MESSAGE); diff --git a/src/org/infinity/gui/menu/OptionsMenuItem.java b/src/org/infinity/gui/menu/OptionsMenuItem.java index 3636c7079..b7b84ec8a 100644 --- a/src/org/infinity/gui/menu/OptionsMenuItem.java +++ b/src/org/infinity/gui/menu/OptionsMenuItem.java @@ -51,6 +51,7 @@ import org.infinity.util.Misc; import org.infinity.util.StringTable; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Handles Option menu items for the {@link BrowserMenuBar}. @@ -966,7 +967,7 @@ private void applyChanges(Collection options) { refresh = true; restart = true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else if (option.equals(AppOption.TEXT_FONT)) { int idx = option.getIntValue(); diff --git a/src/org/infinity/gui/menu/ToolsMenu.java b/src/org/infinity/gui/menu/ToolsMenu.java index 9765632c9..17dda2f39 100644 --- a/src/org/infinity/gui/menu/ToolsMenu.java +++ b/src/org/infinity/gui/menu/ToolsMenu.java @@ -282,7 +282,7 @@ public ToolsMenu(BrowserMenuBar parent) { // } catch (IOException e) { // JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error writing keyfile", "Error", // JOptionPane.ERROR_MESSAGE); -// e.printStackTrace(); +// Logger.error(e); // } // } // } diff --git a/src/org/infinity/icon/Icons.java b/src/org/infinity/icon/Icons.java index 29d952ead..760a6e845 100644 --- a/src/org/infinity/icon/Icons.java +++ b/src/org/infinity/icon/Icons.java @@ -11,6 +11,8 @@ import javax.imageio.ImageIO; import javax.swing.ImageIcon; +import org.tinylog.Logger; + /** * Provides {@code ImageIcon} instances of selected graphics files. */ @@ -137,7 +139,7 @@ public static ImageIcon getIcon(Class cls, String fileName) { retVal = new ImageIcon(image); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -167,7 +169,7 @@ public static Image getImage(Class cls, String fileName) { retVal = ImageIO.read(is); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; diff --git a/src/org/infinity/resource/AbstractStruct.java b/src/org/infinity/resource/AbstractStruct.java index 920119d94..c23c9cc11 100644 --- a/src/org/infinity/resource/AbstractStruct.java +++ b/src/org/infinity/resource/AbstractStruct.java @@ -44,6 +44,7 @@ import org.infinity.search.ReferenceSearcher; import org.infinity.util.io.ByteBufferOutputStream; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public abstract class AbstractStruct extends AbstractTableModel implements StructEntry, Viewable, Closeable, Referenceable, PropertyChangeListener { @@ -296,7 +297,7 @@ public ByteBuffer getDataBuffer() { try (ByteBufferOutputStream bbos = new ByteBufferOutputStream(bb)) { writeFlatFields(bbos); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } bb.position(0); return bb; @@ -1221,7 +1222,7 @@ private void fixHoles(ByteBuffer buffer) { Unknown hole = new Unknown(buffer, offset, delta, COMMON_UNUSED_BYTES); fields.add(hole); flatList.add(i, hole); - System.out.println("Hole: " + name + " off: " + Integer.toHexString(offset) + "h len: " + delta); + Logger.warn("Hole: {} off: {} h len: {}", name, Integer.toHexString(offset), delta); i++; } // Using max() as shared data regions may confuse the hole detection algorithm @@ -1229,8 +1230,7 @@ private void fixHoles(ByteBuffer buffer) { } if (endoffset < buffer.limit()) { // Does this break anything? fields.add(new Unknown(buffer, endoffset, buffer.limit() - endoffset, COMMON_UNUSED_BYTES)); - System.out.println( - "Hole: " + name + " off: " + Integer.toHexString(endoffset) + "h len: " + (buffer.limit() - endoffset)); + Logger.warn("Hole: {} off: {} h len: {}", name, Integer.toHexString(endoffset), (buffer.limit() - endoffset)); endoffset = buffer.limit(); } } diff --git a/src/org/infinity/resource/Profile.java b/src/org/infinity/resource/Profile.java index 5a427bfd0..d98c45800 100644 --- a/src/org/infinity/resource/Profile.java +++ b/src/org/infinity/resource/Profile.java @@ -50,12 +50,14 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.resource.key.ResourceTreeModel; import org.infinity.util.DataString; +import org.infinity.util.DebugTimer; import org.infinity.util.Platform; import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; import org.infinity.util.io.DlcManager; import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * Provides engine- and game-specific properties of the currently opened Infinity Engine game.
@@ -640,7 +642,7 @@ public static Game gameFromString(String gameName) { try { return Enum.valueOf(Game.class, gameName); } catch (IllegalArgumentException e) { - System.err.println("Unknown game type \"" + gameName + "\" specified. Falling back to \"Unknown\"."); + Logger.warn("Unknown game type \"{}\" specified. Falling back to \"Unknown\".", gameName); } } return Game.Unknown; @@ -678,10 +680,12 @@ public static boolean openGame(Path keyFile, String desc) { public static boolean openGame(Path keyFile, String desc, Game forcedGame) { try { closeGame(); + final DebugTimer timer = new DebugTimer(); instance = new Profile(keyFile, desc, forcedGame); + Logger.info(timer.getTimerFormatted("Initializing game resources")); return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } closeGame(); return false; @@ -1709,7 +1713,7 @@ private static String getLuaValue(Path file, String key, String defaultValue, bo } } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; @@ -2572,11 +2576,11 @@ private List initDlc(Path rootDir, Path homeDir) { list.add(dlcRoot); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } // DLCs of the same root are sorted alphabetically (in reverse order) if (!list.isEmpty()) { diff --git a/src/org/infinity/resource/ResourceFactory.java b/src/org/infinity/resource/ResourceFactory.java index ba86db2d3..6c9f31fc8 100644 --- a/src/org/infinity/resource/ResourceFactory.java +++ b/src/org/infinity/resource/ResourceFactory.java @@ -93,6 +93,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Handles game-specific resource access. @@ -259,8 +260,7 @@ public static Resource getResource(ResourceEntry entry, String forcedExtension) final String msg = String.format("Error reading %s @ %s - %s", entry, entry.getActualPath(), e); NearInfinity.getInstance().getStatusBar().setMessage(msg); } - System.err.println("Error reading " + entry); - e.printStackTrace(); + Logger.error(e, "Error reading {}", entry); } return res; } @@ -314,7 +314,7 @@ public static ResourceEntry getResourceIcon(ResourceEntry entry, String forcedEx // forward exception to caller throw e; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -418,7 +418,7 @@ public static Class detectResourceType(ResourceEntry entry) throw new Exception(entry.getResourceName() + ": Unable to determine resource type"); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return cls; @@ -429,7 +429,7 @@ public static void exportResource(ResourceEntry entry, Component parent) { try { getInstance().exportResourceInternal(entry, parent, null); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(parent, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } @@ -440,7 +440,7 @@ public static void exportResource(ResourceEntry entry, ByteBuffer buffer, String try { getInstance().exportResourceInternal(entry, buffer, filename, parent, null); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(parent, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } @@ -766,7 +766,7 @@ public static List getAvailableGameLanguages() { .isFile()))) { dstream.forEach(path -> list.add(path)); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -802,7 +802,7 @@ public static String autodetectGameLanguage(Path iniFile) { } } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error parsing " + iniFile.getFileName() + ". Using language defaults.", "Error", JOptionPane.ERROR_MESSAGE); @@ -838,7 +838,7 @@ static Path getHomeRoot(boolean allowMissing) { userPrefix = splitted[splitted.length - 1]; userPath = FileManager.resolve(userPrefix, EE_DIR); } catch (Throwable t) { - t.printStackTrace(); + Logger.error(t); return null; } } else if (osName.contains("mac") || osName.contains("darwin")) { @@ -908,7 +908,7 @@ static List getBIFFDirs() { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); dirList.clear(); } } @@ -999,7 +999,7 @@ private ResourceFactory(Path keyFile) { loadResourcesInternal(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "No Infinity Engine game found", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } @@ -1523,7 +1523,7 @@ private void saveCopyOfResourceInternal(ResourceEntry entry) { } catch (IOException e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Could not create " + outPath + ".", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return; } } @@ -1547,7 +1547,7 @@ private void saveCopyOfResourceInternal(ResourceEntry entry) { } catch (Exception e) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error while copying " + entry, "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } @@ -1586,7 +1586,7 @@ private boolean saveResourceInternal(Resource resource, Component parent, Path o } catch (IOException e) { JOptionPane.showMessageDialog(parent, "Unable to create override folder.", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return false; } } @@ -1603,7 +1603,7 @@ private boolean saveResourceInternal(Resource resource, Component parent, Path o } catch (IOException e) { JOptionPane.showMessageDialog(parent, "Unable to create folder: " + outPath.getParent(), "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return false; } } @@ -1626,7 +1626,7 @@ private boolean saveResourceInternal(Resource resource, Component parent, Path o Files.move(outPath, bakPath); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } else { @@ -1638,7 +1638,7 @@ private boolean saveResourceInternal(Resource resource, Component parent, Path o ((Writeable) resource).write(os); } catch (IOException e) { JOptionPane.showMessageDialog(parent, "Error while saving " + entry, "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return false; } diff --git a/src/org/infinity/resource/StructureFactory.java b/src/org/infinity/resource/StructureFactory.java index 104ecc815..c6fe5f876 100644 --- a/src/org/infinity/resource/StructureFactory.java +++ b/src/org/infinity/resource/StructureFactory.java @@ -25,6 +25,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; // Create different pre-initialized IE game resources from scratch and writes them to disk. public final class StructureFactory { @@ -142,7 +143,7 @@ public void newResource(ResType type, Window parent) { } catch (Exception e) { JOptionPane.showMessageDialog(parent, "Error while creating " + outFile.getFileName(), title, JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/AreResource.java b/src/org/infinity/resource/are/AreResource.java index 88144b85a..2296e3aeb 100644 --- a/src/org/infinity/resource/are/AreResource.java +++ b/src/org/infinity/resource/are/AreResource.java @@ -55,6 +55,7 @@ import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * The ARE resource describes the content of an area (rather than its visual representation). ARE files contain the list @@ -212,7 +213,7 @@ private static void initMapNames(boolean force) { LuaEntry entries = LuaParser.Parse(luaFiles, "cheatAreas\\w*", false); mapNames = createMapNamesFromLua(entries); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else if (ResourceFactory.resourceExists("MAPNAME.2DA")) { // PST map names diff --git a/src/org/infinity/resource/are/viewer/AreaViewer.java b/src/org/infinity/resource/are/viewer/AreaViewer.java index c868b2d9c..56c3d4683 100644 --- a/src/org/infinity/resource/are/viewer/AreaViewer.java +++ b/src/org/infinity/resource/are/viewer/AreaViewer.java @@ -117,6 +117,7 @@ import org.infinity.resource.wed.WedResource; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * The Area Viewer shows a selected map with its associated structures, such as actors, regions or animations. @@ -238,7 +239,7 @@ protected Void doInBackground() throws Exception { try { init(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -695,7 +696,7 @@ private void init() { try { initGuiSettings(); } catch (OutOfMemoryError e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(this, "Not enough memory to load area!", "Error", JOptionPane.ERROR_MESSAGE); throw e; } @@ -2229,7 +2230,7 @@ private void exportMap() { bRet = ImageIO.write(dstImage, "png", os); dstImage.flush(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { releaseProgressMonitor(); WindowBlocker.blockWindow(AreaViewer.this, false); @@ -2402,7 +2403,7 @@ public void actionPerformed(ActionEvent event) { try { setZoomFactor(Settings.ITEM_ZOOM_FACTOR[cbZoomLevel.getSelectedIndex()], previousZoomFactor); } catch (OutOfMemoryError e) { - e.printStackTrace(); + Logger.error(e); cbZoomLevel.hidePopup(); WindowBlocker.blockWindow(AreaViewer.this, false); String msg = "Not enough memory to set selected zoom level.\n" @@ -2554,7 +2555,7 @@ public void mouseWheelMoved(MouseWheelEvent event) { try { setZoomFactor(zoom, previousZoomFactor); } catch (OutOfMemoryError e) { - e.printStackTrace(); + Logger.error(e); cbZoomLevel.hidePopup(); WindowBlocker.blockWindow(AreaViewer.this, false); String msg = "Not enough memory to set selected zoom level.\n" @@ -2918,7 +2919,7 @@ public void reloadWed(int dayNight) { wedItem[dayNight].setVisible(false); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else { wed[dayNight] = wed[ViewerConstants.AREA_DAY]; @@ -2931,7 +2932,7 @@ public void reloadWed(int dayNight) { try { wed[dayNight] = new WedResource(ResourceFactory.getResourceEntry(wedNameNight)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/LayerActor.java b/src/org/infinity/resource/are/viewer/LayerActor.java index 7146e8a45..c7d93a862 100644 --- a/src/org/infinity/resource/are/viewer/LayerActor.java +++ b/src/org/infinity/resource/are/viewer/LayerActor.java @@ -33,6 +33,7 @@ import org.infinity.util.IniMapCache; import org.infinity.util.IniMapEntry; import org.infinity.util.IniMapSection; +import org.tinylog.Logger; /** * Manages actor layer objects. @@ -83,7 +84,7 @@ protected void loadLayer() { setListeners(obj); objectList.add(obj); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -121,7 +122,7 @@ protected void loadLayer() { setListeners(loa); objectList.add(loa); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -191,7 +192,7 @@ public Void doInBackground() { progress.setProgress(i + 1); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { progress.close(); if (blocker != null) { diff --git a/src/org/infinity/resource/are/viewer/LayerAutomap.java b/src/org/infinity/resource/are/viewer/LayerAutomap.java index 606883668..e23273812 100644 --- a/src/org/infinity/resource/are/viewer/LayerAutomap.java +++ b/src/org/infinity/resource/are/viewer/LayerAutomap.java @@ -17,6 +17,7 @@ import org.infinity.util.IniMap; import org.infinity.util.IniMapCache; import org.infinity.util.IniMapSection; +import org.tinylog.Logger; /** * Manages automap notes layer objects (both PST-specific and generic types). @@ -106,7 +107,7 @@ private void loadPredefinedAutoNotes(AreResource are) { objectList.add(obj); } } catch (IllegalArgumentException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/LayerDoor.java b/src/org/infinity/resource/are/viewer/LayerDoor.java index 76785fd05..9438c82f0 100644 --- a/src/org/infinity/resource/are/viewer/LayerDoor.java +++ b/src/org/infinity/resource/are/viewer/LayerDoor.java @@ -10,6 +10,7 @@ import org.infinity.gui.layeritem.AbstractLayerItem; import org.infinity.resource.are.AreResource; import org.infinity.resource.are.Door; +import org.tinylog.Logger; /** * Manages door layer objects. @@ -61,7 +62,7 @@ public void setLayerVisible(boolean visible) { break; default: item.setVisible(false); - System.out.println("Unknown layer id: " + item.getId()); + Logger.info("Unknown layer id: {}", item.getId()); } } }); diff --git a/src/org/infinity/resource/are/viewer/LayerManager.java b/src/org/infinity/resource/are/viewer/LayerManager.java index b2a0dbf86..61daa5141 100644 --- a/src/org/infinity/resource/are/viewer/LayerManager.java +++ b/src/org/infinity/resource/are/viewer/LayerManager.java @@ -10,6 +10,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.are.viewer.ViewerConstants.LayerType; import org.infinity.resource.wed.WedResource; +import org.tinylog.Logger; /** * Manages all layer objects of a single ARE map. @@ -601,7 +602,7 @@ private void init(AreResource are, WedResource wed, boolean forced) { loadLayer(layer, forced || wedChanged); break; default: - System.err.println(String.format("Unsupported layer type: %s", layer.toString())); + Logger.warn("Unsupported layer type: {}", layer); } } } @@ -753,7 +754,7 @@ private int loadLayer(LayerType layer, boolean forced) { break; } default: - System.err.println(String.format("Unsupported layer type: %s", layer.toString())); + Logger.warn("Unsupported layer type: {}", layer); } } return retVal; diff --git a/src/org/infinity/resource/are/viewer/LayerObjectAmbient.java b/src/org/infinity/resource/are/viewer/LayerObjectAmbient.java index 8bd53c5a2..9ee9593b1 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectAmbient.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectAmbient.java @@ -22,6 +22,7 @@ import org.infinity.resource.are.Ambient; import org.infinity.resource.are.AreResource; import org.infinity.resource.are.viewer.icon.ViewerIcons; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Ambient Sound and Ambient Sound Range @@ -71,7 +72,7 @@ public LayerObjectAmbient(AreResource parent, Ambient ambient) { msg = ambient.getAttribute(Ambient.ARE_AMBIENT_NAME).toString(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectAnimation.java b/src/org/infinity/resource/are/viewer/LayerObjectAnimation.java index b53ec5252..e03589112 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectAnimation.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectAnimation.java @@ -28,6 +28,7 @@ import org.infinity.resource.key.FileResourceEntry; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Background Animation @@ -169,7 +170,7 @@ public LayerObjectAnimation(AreResource parent, Animation anim) { animation.setStartFrame(skippedFrames); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons @@ -306,7 +307,7 @@ private static int[] getExternalPalette(ResourceRef bmpRef) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return new int[0]; diff --git a/src/org/infinity/resource/are/viewer/LayerObjectAreActor.java b/src/org/infinity/resource/are/viewer/LayerObjectAreActor.java index da664290b..f041fc785 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectAreActor.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectAreActor.java @@ -23,6 +23,7 @@ import org.infinity.resource.are.viewer.icon.ViewerIcons; import org.infinity.resource.cre.CreResource; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Actor @@ -79,7 +80,7 @@ public LayerObjectAreActor(AreResource parent, Actor actor) { ea = ((IsNumeric) cre.getAttribute(CreResource.CRE_ALLEGIANCE)).getValue(); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } this.cre = cre; @@ -142,7 +143,7 @@ public synchronized void loadAnimation() { item.setAnimation(sprite); item.setComposite(Settings.UseActorAccurateBlending ? sprite.getDecoder().getComposite() : null); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/LayerObjectAutomap.java b/src/org/infinity/resource/are/viewer/LayerObjectAutomap.java index e17606e29..39d3b5f17 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectAutomap.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectAutomap.java @@ -18,6 +18,7 @@ import org.infinity.resource.key.FileResourceEntry; import org.infinity.resource.to.TohResource; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Automap Note (except for PST) @@ -60,7 +61,7 @@ public LayerObjectAutomap(AreResource parent, AutomapNote note) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectAutomapPST.java b/src/org/infinity/resource/are/viewer/LayerObjectAutomapPST.java index a5531def8..533a1ff4e 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectAutomapPST.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectAutomapPST.java @@ -14,6 +14,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.are.AutomapNotePST; import org.infinity.resource.are.viewer.icon.ViewerIcons; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Automap Note (PST-specific, user-defined) @@ -42,7 +43,7 @@ public LayerObjectAutomapPST(AreResource parent, AutomapNotePST note) { location.y = (int) (y.getValue() * MAP_SCALE); msg = note.getAttribute(AutomapNotePST.ARE_AUTOMAP_TEXT).toString(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectContainer.java b/src/org/infinity/resource/are/viewer/LayerObjectContainer.java index 1bb11059c..8710bc055 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectContainer.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectContainer.java @@ -21,6 +21,7 @@ import org.infinity.resource.are.Container; import org.infinity.resource.are.viewer.icon.ViewerIcons; import org.infinity.resource.vertex.Vertex; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Container @@ -73,7 +74,7 @@ public LayerObjectContainer(AreResource parent, Container container) { launchPoint.x = ((IsNumeric) container.getAttribute(Container.ARE_CONTAINER_LAUNCH_POINT_X)).getValue(); launchPoint.y = ((IsNumeric) container.getAttribute(Container.ARE_CONTAINER_LAUNCH_POINT_Y)).getValue(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } final Polygon poly = createPolygon(shapeCoords, 1.0); final Rectangle bounds = normalizePolygon(poly); diff --git a/src/org/infinity/resource/are/viewer/LayerObjectDoor.java b/src/org/infinity/resource/are/viewer/LayerObjectDoor.java index aaee4035c..a5be11750 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectDoor.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectDoor.java @@ -27,6 +27,7 @@ import org.infinity.resource.are.viewer.icon.ViewerIcons; import org.infinity.resource.vertex.ClosedVertex; import org.infinity.resource.vertex.OpenVertex; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Door @@ -88,7 +89,7 @@ public LayerObjectDoor(AreResource parent, Door door) { launchPoint.x = ((IsNumeric) door.getAttribute(Door.ARE_DOOR_LAUNCH_POINT_X)).getValue(); launchPoint.y = ((IsNumeric) door.getAttribute(Door.ARE_DOOR_LAUNCH_POINT_Y)).getValue(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } for (final DoorInfo info: getDoors()) { diff --git a/src/org/infinity/resource/are/viewer/LayerObjectDoorCells.java b/src/org/infinity/resource/are/viewer/LayerObjectDoorCells.java index a94971112..48bd8c746 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectDoorCells.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectDoorCells.java @@ -23,6 +23,7 @@ import org.infinity.resource.are.Door; import org.infinity.resource.vertex.ClosedVertexImpeded; import org.infinity.resource.vertex.OpenVertexImpeded; +import org.tinylog.Logger; /** * Handles specific layer subtype: ARE/Door blocked cells @@ -63,7 +64,7 @@ public LayerObjectDoorCells(AreResource parent, Door door) { itemCoords = createCellPolygons(loadVertices(door, cOfs, 0, cNum, ClosedVertexImpeded.class)); doorClosed.setCoords(itemCoords); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } for (final DoorInfo info: getDoors()) { diff --git a/src/org/infinity/resource/are/viewer/LayerObjectDoorPoly.java b/src/org/infinity/resource/are/viewer/LayerObjectDoorPoly.java index b5430e23c..835f76900 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectDoorPoly.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectDoorPoly.java @@ -23,6 +23,7 @@ import org.infinity.resource.vertex.Vertex; import org.infinity.resource.wed.Door; import org.infinity.resource.wed.WedResource; +import org.tinylog.Logger; /** * Handles specific layer type: WED/Door Polygon. @@ -63,7 +64,7 @@ public LayerObjectDoorPoly(WedResource parent, Door doorPoly) { // processing closed door polygons fillData(ofsClosed, numClosed, numOpen, info); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); if (info == null) { info = new String[count]; } diff --git a/src/org/infinity/resource/are/viewer/LayerObjectEntrance.java b/src/org/infinity/resource/are/viewer/LayerObjectEntrance.java index 23cbee50a..f4b15f787 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectEntrance.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectEntrance.java @@ -15,6 +15,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.are.Entrance; import org.infinity.resource.are.viewer.icon.ViewerIcons; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Entrance @@ -46,7 +47,7 @@ public LayerObjectEntrance(AreResource parent, Entrance entrance) { final String name = entrance.getAttribute(Entrance.ARE_ENTRANCE_NAME).toString(); msg = String.format("%s (%s)", name, AbstractStruct.OPTION_ORIENTATION[o]); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectGlobalActor.java b/src/org/infinity/resource/are/viewer/LayerObjectGlobalActor.java index 5175c1d19..4dd924458 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectGlobalActor.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectGlobalActor.java @@ -23,6 +23,7 @@ import org.infinity.resource.gam.GamResource; import org.infinity.resource.gam.PartyNPC; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Handles specific layer type: global GAM/Actor @@ -119,7 +120,7 @@ public void loadAnimation() { item.setAnimation(sprite); item.setComposite(Settings.UseActorAccurateBlending ? sprite.getDecoder().getComposite() : null); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/LayerObjectIniActor.java b/src/org/infinity/resource/are/viewer/LayerObjectIniActor.java index 2b0a6d639..175ec0628 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectIniActor.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectIniActor.java @@ -21,6 +21,7 @@ import org.infinity.resource.text.PlainTextResource; import org.infinity.util.IniMapEntry; import org.infinity.util.IniMapSection; +import org.tinylog.Logger; /** * Handles specific layer type: INI/Actor @@ -71,7 +72,7 @@ public LayerObjectIniActor(PlainTextResource ini, IniMapSection creData, int cre try { cre = new CreResource(creEntry); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw new IllegalArgumentException(creData.getName() + ": Invalid CRE resource", e); } @@ -179,7 +180,7 @@ public synchronized void loadAnimation() { item.setAnimation(sprite); item.setComposite(Settings.UseActorAccurateBlending ? sprite.getDecoder().getComposite() : null); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/LayerObjectProTrap.java b/src/org/infinity/resource/are/viewer/LayerObjectProTrap.java index 721e7b88d..a1cfc3d21 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectProTrap.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectProTrap.java @@ -14,6 +14,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.are.ProTrap; import org.infinity.resource.are.viewer.icon.ViewerIcons; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Projectile Trap @@ -49,7 +50,7 @@ public LayerObjectProTrap(AreResource parent, ProTrap trap) { msg += " (friendly)"; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectRegion.java b/src/org/infinity/resource/are/viewer/LayerObjectRegion.java index 64ad68065..34a2d3b29 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectRegion.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectRegion.java @@ -24,6 +24,7 @@ import org.infinity.resource.are.ITEPoint; import org.infinity.resource.are.viewer.icon.ViewerIcons; import org.infinity.resource.vertex.Vertex; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Region @@ -112,7 +113,7 @@ ITEPoint.TYPE_ARRAY[type], getAttributes(), } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } final Polygon poly = createPolygon(shapeCoords, 1.0); final Rectangle bounds = normalizePolygon(poly); diff --git a/src/org/infinity/resource/are/viewer/LayerObjectSpawnPoint.java b/src/org/infinity/resource/are/viewer/LayerObjectSpawnPoint.java index da58e3381..01ff372a5 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectSpawnPoint.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectSpawnPoint.java @@ -15,6 +15,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.are.SpawnPoint; import org.infinity.resource.are.viewer.icon.ViewerIcons; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Spawn Point @@ -43,7 +44,7 @@ public LayerObjectSpawnPoint(AreResource parent, SpawnPoint sp) { scheduleFlags = ((Flag) sp.getAttribute(SpawnPoint.ARE_SPAWN_ACTIVE_AT)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } // Using cached icons diff --git a/src/org/infinity/resource/are/viewer/LayerObjectTransition.java b/src/org/infinity/resource/are/viewer/LayerObjectTransition.java index 6d63f86c0..aa22406bc 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectTransition.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectTransition.java @@ -13,6 +13,7 @@ import org.infinity.gui.layeritem.ShapedLayerItem; import org.infinity.resource.Viewable; import org.infinity.resource.are.AreResource; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Map transition @@ -46,7 +47,7 @@ public LayerObjectTransition(AreResource parent, AreResource destination, int ed msg = String.format("Transition to %s", ref); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } item = new ShapedLayerItem(destination, msg, null); diff --git a/src/org/infinity/resource/are/viewer/LayerObjectWallPoly.java b/src/org/infinity/resource/are/viewer/LayerObjectWallPoly.java index 148569a1d..bcb552a46 100644 --- a/src/org/infinity/resource/are/viewer/LayerObjectWallPoly.java +++ b/src/org/infinity/resource/are/viewer/LayerObjectWallPoly.java @@ -17,6 +17,7 @@ import org.infinity.resource.vertex.Vertex; import org.infinity.resource.wed.WallPolygon; import org.infinity.resource.wed.WedResource; +import org.tinylog.Logger; /** * Handles specific layer type: ARE/Wall Polygon @@ -45,7 +46,7 @@ public LayerObjectWallPoly(WedResource parent, WallPolygon wall) { int startIdx = flags.isFlagSet(2) ? 2 : 0; // skipping first two vertices for "hovering walls" shapeCoords = loadVertices(wall, vOfs, startIdx, vNum - startIdx, Vertex.class); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } final Polygon poly = createPolygon(shapeCoords, 1.0); final Rectangle bounds = normalizePolygon(poly); diff --git a/src/org/infinity/resource/are/viewer/LayerTransition.java b/src/org/infinity/resource/are/viewer/LayerTransition.java index a7c580d94..301967190 100644 --- a/src/org/infinity/resource/are/viewer/LayerTransition.java +++ b/src/org/infinity/resource/are/viewer/LayerTransition.java @@ -9,6 +9,7 @@ import org.infinity.datatype.ResourceRef; import org.infinity.resource.ResourceFactory; import org.infinity.resource.are.AreResource; +import org.tinylog.Logger; /** * Manages map transition layer objects. @@ -33,7 +34,7 @@ protected void loadLayer() { setListeners(obj); list.add(obj); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/are/viewer/Settings.java b/src/org/infinity/resource/are/viewer/Settings.java index 1a1686108..d88629132 100644 --- a/src/org/infinity/resource/are/viewer/Settings.java +++ b/src/org/infinity/resource/are/viewer/Settings.java @@ -12,6 +12,7 @@ import org.infinity.resource.are.viewer.ViewerConstants.LayerStackingType; import org.infinity.resource.are.viewer.ViewerConstants.LayerType; +import org.tinylog.Logger; /** * Manages global area viewer settings. @@ -307,7 +308,7 @@ public static void storeSettings(boolean force) { try { prefs.flush(); } catch (BackingStoreException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/are/viewer/TilesetRenderer.java b/src/org/infinity/resource/are/viewer/TilesetRenderer.java index 001a19e79..596ad1ded 100644 --- a/src/org/infinity/resource/are/viewer/TilesetRenderer.java +++ b/src/org/infinity/resource/are/viewer/TilesetRenderer.java @@ -31,6 +31,7 @@ import org.infinity.resource.wed.Overlay; import org.infinity.resource.wed.Tilemap; import org.infinity.resource.wed.WedResource; +import org.tinylog.Logger; /** * Specialized renderer for drawing tileset-based graphics data. @@ -761,11 +762,11 @@ private boolean hasOverlay(int ovlIdx) { // Draws a grid on the map with the specified parameters private void drawGrid(Graphics g, double gridWidth, double gridHeight, Color color) { if (g == null) { - System.err.println("TilesetRenderer.drawGrid: Graphics argument is null"); + Logger.warn("TilesetRenderer.drawGrid: Graphics argument is null"); return; } if (color == null) { - System.err.println("TilesetRenderer.drawGrid: Color argument is null"); + Logger.warn("TilesetRenderer.drawGrid: Color argument is null"); return; } final double gridWidthZoomed = gridWidth * zoomFactor; @@ -965,7 +966,7 @@ private synchronized void drawTile(Tile tile, boolean isDoorTile) { if (tileIdx < listTilesets.get(0).listTileData.size()) { srcSec = listTilesets.get(0).listTileData.get(tileIdx); } else { - System.err.println("Invalid tile index: " + tileIdx + " of " + listTilesets.get(0).listTileData.size()); + Logger.warn("Invalid tile index: {} of {}", tileIdx, listTilesets.get(0).listTileData.size()); } } @@ -1156,7 +1157,7 @@ private void init(WedResource wed, Overlay ovl) { decoder.close(); decoder = null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return; } } diff --git a/src/org/infinity/resource/bcs/BafResource.java b/src/org/infinity/resource/bcs/BafResource.java index a11c32527..400f2ccd3 100644 --- a/src/org/infinity/resource/bcs/BafResource.java +++ b/src/org/infinity/resource/bcs/BafResource.java @@ -57,6 +57,7 @@ import org.infinity.util.Misc; import org.infinity.util.StaticSimpleXorDecryptor; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class BafResource implements TextResource, Writeable, Closeable, ItemListener, ActionListener, DocumentListener { // for source panel @@ -416,7 +417,7 @@ private void compile() { bpmUses.setMenuItems(usesItems); bpmUses.setEnabled(usesItems.length > 0); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -429,7 +430,7 @@ private void decompile() { try { sourceText.setText(decompiler.getSource()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } sourceText.setCaretPosition(0); Set uses = decompiler.getResourcesUsed(); @@ -501,7 +502,7 @@ public String getDescription() { } catch (IOException e) { JOptionPane.showMessageDialog(panel, "Error saving " + chooser.getSelectedFile().toString(), "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/bcs/BcsResource.java b/src/org/infinity/resource/bcs/BcsResource.java index 2d39ef827..fd96f19f0 100644 --- a/src/org/infinity/resource/bcs/BcsResource.java +++ b/src/org/infinity/resource/bcs/BcsResource.java @@ -62,6 +62,7 @@ import org.infinity.util.Misc; import org.infinity.util.StaticSimpleXorDecryptor; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * This resource represent scripted actions. {@code .bcs} files are scripts attached to anything other than the player @@ -487,7 +488,7 @@ public String getDescription() { } catch (IOException e) { JOptionPane.showMessageDialog(panel, "Error exporting " + chooser.getSelectedFile().toString(), "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } else if (bpmExport.getSelectedItem() == iExportScript) { @@ -529,7 +530,7 @@ public String getText() { try { return decompiler.getSource(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return "// Error: " + e.getMessage(); } } @@ -739,7 +740,7 @@ private void decompile() { try { sourceText.setText(decompiler.getSource()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); sourceText.setText("/*\nError: " + e.getMessage() + "\n*/"); } sourceText.setCaretPosition(0); diff --git a/src/org/infinity/resource/cre/CreResource.java b/src/org/infinity/resource/cre/CreResource.java index 44d47239a..97c6530c7 100644 --- a/src/org/infinity/resource/cre/CreResource.java +++ b/src/org/infinity/resource/cre/CreResource.java @@ -79,6 +79,7 @@ import org.infinity.util.StringTable; import org.infinity.util.Table2da; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * This resource describes a "creature". Creatures have several stats (some visible through the game UI) which are @@ -617,7 +618,7 @@ public static void convertCHRtoCRE(ResourceEntry resourceEntry) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "File saved to " + path, "Conversion complete", JOptionPane.INFORMATION_MESSAGE); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Errors during conversion", "Error", JOptionPane.ERROR_MESSAGE); } @@ -627,7 +628,7 @@ public static void convertCHRtoCRE(ResourceEntry resourceEntry) { private static void convertToSemiStandard(CreResource crefile) { final List fields = crefile.getFields(); if (!fields.get(1).toString().equals("V1.0")) { - System.err.println("Conversion to semi-standard aborted: Unsupported CRE version"); + Logger.warn("Conversion to semi-standard aborted: Unsupported CRE version"); return; } @@ -2135,7 +2136,7 @@ private boolean convertEffects(int version, SectionOffset so, SectionCount sc) { addDatatype(newEff); retVal |= true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } else if (version == 1 && so.getSection().equals(Effect.class)) { @@ -2165,7 +2166,7 @@ private boolean convertEffects(int version, SectionOffset so, SectionCount sc) { addDatatype(newEff); retVal |= true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/cre/ViewerAnimation.java b/src/org/infinity/resource/cre/ViewerAnimation.java index b08e438f8..21cda12a6 100644 --- a/src/org/infinity/resource/cre/ViewerAnimation.java +++ b/src/org/infinity/resource/cre/ViewerAnimation.java @@ -47,6 +47,7 @@ import org.infinity.resource.cre.decoder.util.Sequence; import org.infinity.resource.cre.decoder.util.SpriteUtils; import org.infinity.resource.graphics.ColorConvert; +import org.tinylog.Logger; /** * A basic creature animation viewer. @@ -247,7 +248,7 @@ public void open() { WindowBlocker.blockWindow(true); initAnimation(); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); WindowBlocker.blockWindow(false); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Creature animation could not be loaded.\nError message: " + ex.getMessage(), "Error", @@ -286,7 +287,7 @@ public void actionPerformed(ActionEvent event) { setAnimationSequence(seq); updateControls(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); cbSequences.setSelectedItem(getAnimationSequence()); } finally { @@ -315,7 +316,7 @@ public void actionPerformed(ActionEvent event) { getDecoder().setBoundingBoxVisible(showOverlayBorders); resetAnimationSequence(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { WindowBlocker.blockWindow(false); } diff --git a/src/org/infinity/resource/cre/browser/CreUtils.java b/src/org/infinity/resource/cre/browser/CreUtils.java index 24cb50d41..1c9c11388 100644 --- a/src/org/infinity/resource/cre/browser/CreUtils.java +++ b/src/org/infinity/resource/cre/browser/CreUtils.java @@ -25,6 +25,7 @@ import org.infinity.resource.cre.decoder.util.ItemInfo; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * Collection of methods for creating and manipulating CRE resources. @@ -132,7 +133,7 @@ public static ItemInfo getEquipmentHelmet(CreResource cre) { retVal = ItemInfo.getValidated(itemEntry); retVal.overrideDroppableFlag(((Flag) item.getAttribute(Item.CRE_ITEM_FLAGS)).isFlagSet(3)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -172,7 +173,7 @@ public static ItemInfo getEquipmentArmor(CreResource cre) { retVal = ItemInfo.getValidated(itemEntry); retVal.overrideDroppableFlag(((Flag) item.getAttribute(Item.CRE_ITEM_FLAGS)).isFlagSet(3)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -220,7 +221,7 @@ public static ItemInfo getEquipmentShield(CreResource cre) { retVal = ItemInfo.getValidated(itemEntry); retVal.overrideDroppableFlag(((Flag) item.getAttribute(Item.CRE_ITEM_FLAGS)).isFlagSet(3)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -266,7 +267,7 @@ public static ItemInfo getEquipmentWeapon(CreResource cre) { retVal = ItemInfo.getValidated(itemEntry); retVal.overrideDroppableFlag(((Flag) item.getAttribute(Item.CRE_ITEM_FLAGS)).isFlagSet(3)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -383,7 +384,7 @@ private static void addEquippedItem(CreResource cre, ItemInfo item, String slotN cre.addDatatype(newItem); setFieldValue(cre.getAttribute(slotName), null, numItems); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -528,7 +529,7 @@ private static int setFieldValue(Readable field, ByteBuffer buf, int value) { try { retVal = field.read(buf, pos); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; @@ -556,7 +557,7 @@ private static int setFieldValue(Readable field, ByteBuffer buf, String value, i try { retVal = field.read(buf, pos); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; diff --git a/src/org/infinity/resource/cre/browser/CreatureBrowser.java b/src/org/infinity/resource/cre/browser/CreatureBrowser.java index b68ac1dbc..d836a7304 100644 --- a/src/org/infinity/resource/cre/browser/CreatureBrowser.java +++ b/src/org/infinity/resource/cre/browser/CreatureBrowser.java @@ -27,6 +27,7 @@ import org.infinity.resource.cre.CreResource; import org.infinity.resource.cre.decoder.SpriteDecoder; import org.infinity.resource.cre.decoder.util.SpriteUtils; +import org.tinylog.Logger; /** * The Creature Browser implements a highly customizable browser and viewer for creature animations. @@ -199,7 +200,7 @@ private Object taskSetCreResource() throws Exception { /** A generic catch-all operation that can be used to evaluate exceptions thrown in a background task. */ private void postTaskDefault(Object o, Exception e) { if (e != null) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(this, "Error: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } @@ -236,7 +237,7 @@ protected TaskInfo doInBackground() throws Exception { if (retVal.postAction != null) { retVal.exception = e; } else { - e.printStackTrace(); + Logger.error(e); } } finally { if (blocker != null) { diff --git a/src/org/infinity/resource/cre/browser/CreatureControlModel.java b/src/org/infinity/resource/cre/browser/CreatureControlModel.java index e2efa5fe1..2e971edf8 100644 --- a/src/org/infinity/resource/cre/browser/CreatureControlModel.java +++ b/src/org/infinity/resource/cre/browser/CreatureControlModel.java @@ -20,6 +20,7 @@ import org.infinity.resource.cre.decoder.util.ItemInfo; import org.infinity.resource.cre.decoder.util.ItemInfo.ItemPredicate; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * This model controls the relationships between creature controls and provides access to the various creature-specific @@ -480,7 +481,7 @@ public void reset() { try { creSelectionChanged(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/cre/browser/CreatureControlPanel.java b/src/org/infinity/resource/cre/browser/CreatureControlPanel.java index 08b452383..5f2eec4ed 100644 --- a/src/org/infinity/resource/cre/browser/CreatureControlPanel.java +++ b/src/org/infinity/resource/cre/browser/CreatureControlPanel.java @@ -44,6 +44,7 @@ import org.infinity.util.IdsMapCache; import org.infinity.util.IdsMapEntry; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * This panel provides controls for customizing various aspects of a CRE resource. @@ -145,7 +146,7 @@ public void applySettings() { try { getControlModel().resetDecoder(cre); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); getBrowser().showErrorMessage(e.getMessage(), "Loading creature"); } @@ -506,7 +507,7 @@ public void actionPerformed(ActionEvent e) { getControlModel().creSelectionChanged(); updateToolTip(cbCreSelection); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); getBrowser().showErrorMessage(ex.getMessage(), "Creature selection"); } } else if (e.getSource() == cbCreAnimation) { diff --git a/src/org/infinity/resource/cre/browser/CreatureSelectionModel.java b/src/org/infinity/resource/cre/browser/CreatureSelectionModel.java index 16ed74a93..83ab844b6 100644 --- a/src/org/infinity/resource/cre/browser/CreatureSelectionModel.java +++ b/src/org/infinity/resource/cre/browser/CreatureSelectionModel.java @@ -25,6 +25,7 @@ import org.infinity.util.ResourceStructure; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * {@code ComboBoxModel} for the creature selection combo box used in the Creature Animation Browser. @@ -261,7 +262,7 @@ private static ResourceEntry createCreature() { retVal = new BufferedResourceEntry(buf, "*.CRE"); } catch (StructureException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; diff --git a/src/org/infinity/resource/cre/browser/MediaPanel.java b/src/org/infinity/resource/cre/browser/MediaPanel.java index bad015b1d..c42dd0224 100644 --- a/src/org/infinity/resource/cre/browser/MediaPanel.java +++ b/src/org/infinity/resource/cre/browser/MediaPanel.java @@ -54,6 +54,7 @@ import org.infinity.resource.cre.decoder.util.Sequence; import org.infinity.resource.graphics.ColorConvert; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; import ork.sevenstates.apng.APNGSeqWriter; @@ -321,7 +322,7 @@ public void loadSequence(Sequence seq) throws IllegalArgumentException { throw new Exception(); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw new IllegalArgumentException("Could not load animation sequence"); } @@ -819,7 +820,7 @@ private void exportBamSequence() { JOptionPane.showMessageDialog(browser, message, "Export animation sequence", JOptionPane.INFORMATION_MESSAGE); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(browser, "Unable to export animation sequence.", "Error", JOptionPane.ERROR_MESSAGE); } } @@ -893,7 +894,7 @@ public void itemStateChanged(ItemEvent e) { WindowBlocker.blockWindow(getBrowser(), true); loadSequence(seq); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); getBrowser().showErrorMessage(ex.getMessage(), "Sequence selection"); } finally { WindowBlocker.blockWindow(getBrowser(), false); diff --git a/src/org/infinity/resource/cre/browser/bg/Backgrounds.java b/src/org/infinity/resource/cre/browser/bg/Backgrounds.java index 7f663fdcc..705d06587 100644 --- a/src/org/infinity/resource/cre/browser/bg/Backgrounds.java +++ b/src/org/infinity/resource/cre/browser/bg/Backgrounds.java @@ -15,6 +15,7 @@ import javax.swing.UIManager; import org.infinity.resource.Profile; +import org.tinylog.Logger; /** * Backgrounds for the creature animation browser. @@ -80,7 +81,7 @@ public static Image getImage(Class c, String fileName) { URL url = getValidURL(c, fileName); retVal = ImageIO.read(url); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; } diff --git a/src/org/infinity/resource/cre/decoder/PlaceholderDecoder.java b/src/org/infinity/resource/cre/decoder/PlaceholderDecoder.java index 89d53e599..37b0c56e4 100644 --- a/src/org/infinity/resource/cre/decoder/PlaceholderDecoder.java +++ b/src/org/infinity/resource/cre/decoder/PlaceholderDecoder.java @@ -24,6 +24,7 @@ import org.infinity.util.IniMapEntry; import org.infinity.util.IniMapSection; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * General-purpose creature animation decoder for handling non-existing or unknown animation types. @@ -50,7 +51,7 @@ private static ResourceEntry loadPlaceholderBam() { baos.flush(); retVal = new BufferedResourceEntry(StreamUtils.getByteBuffer(baos.toByteArray()), "placeholder.bam"); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; } diff --git a/src/org/infinity/resource/cre/decoder/SpriteDecoder.java b/src/org/infinity/resource/cre/decoder/SpriteDecoder.java index 0a93a0bc0..83801270d 100644 --- a/src/org/infinity/resource/cre/decoder/SpriteDecoder.java +++ b/src/org/infinity/resource/cre/decoder/SpriteDecoder.java @@ -60,6 +60,7 @@ import org.infinity.util.IniMapSection; import org.infinity.util.Misc; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Specialized BAM decoder for creature animation sprites. @@ -295,7 +296,7 @@ public T getAttribute(DecoderAttribute att) { try { retVal = (T) data; } catch (ClassCastException e) { - // e.printStackTrace(); + // Logger.error(e); } } return retVal; @@ -392,7 +393,7 @@ public boolean loadSequence(Sequence seq, Direction[] directions) throws Excepti } catch (NullPointerException e) { retVal = (seq != Sequence.NONE); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); retVal = (seq != Sequence.NONE); } } @@ -841,7 +842,7 @@ public void applyAnimationChanges() { try { reset(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1490,7 +1491,7 @@ protected int[] getColorData(int colorIndex, boolean allowRandom) { try { retVal = SpriteUtils.getColorGradient(colorIndex, allowRandom); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; } diff --git a/src/org/infinity/resource/cre/decoder/tables/InfinityTables.java b/src/org/infinity/resource/cre/decoder/tables/InfinityTables.java index 5adcfa3c4..94e68f8d6 100644 --- a/src/org/infinity/resource/cre/decoder/tables/InfinityTables.java +++ b/src/org/infinity/resource/cre/decoder/tables/InfinityTables.java @@ -21,6 +21,7 @@ import org.infinity.util.IdsMapEntry; import org.infinity.util.IniMap; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * A static class dedicated to processing Infinity Animation slots. @@ -57,7 +58,7 @@ public static List createIniMaps(int animationId) { IdsMap table = new IdsMap(entry); retVal.addAll(processTable(table, animationId)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -95,9 +96,9 @@ private static List processTable(IdsMap idsMap, int animationId) { } } catch (InvocationTargetException ite) { if (ite.getCause() != null) { - ite.getCause().printStackTrace(); + Logger.error(ite.getCause()); } else { - ite.printStackTrace(); + Logger.error(ite); } } catch (Exception e) { return retVal; diff --git a/src/org/infinity/resource/cre/decoder/tables/SpriteTables.java b/src/org/infinity/resource/cre/decoder/tables/SpriteTables.java index f0a7b896b..50063f7bb 100644 --- a/src/org/infinity/resource/cre/decoder/tables/SpriteTables.java +++ b/src/org/infinity/resource/cre/decoder/tables/SpriteTables.java @@ -22,6 +22,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.IniMap; import org.infinity.util.Table2da; +import org.tinylog.Logger; /** * A static class that provides information and methods for hardcoded creature animations. @@ -206,12 +207,12 @@ private static List processTable(Table2da table, int animationId) { } } catch (InvocationTargetException ite) { if (ite.getCause() != null) { - ite.getCause().printStackTrace(); + Logger.error(ite.getCause()); } else { - ite.printStackTrace(); + Logger.error(ite); } } catch (NoSuchMethodException | IllegalAccessException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/cre/decoder/util/CreatureInfo.java b/src/org/infinity/resource/cre/decoder/util/CreatureInfo.java index 373a99c09..789c4cee6 100644 --- a/src/org/infinity/resource/cre/decoder/util/CreatureInfo.java +++ b/src/org/infinity/resource/cre/decoder/util/CreatureInfo.java @@ -33,6 +33,7 @@ import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Provides useful information about a creature resource and their equipment. @@ -893,7 +894,7 @@ private void initEquipmentItem(ItemSlots slot, int itemIndex, List itemInfo.overrideDroppableFlag(isUndroppable); equipment.put(slot, itemInfo); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/cre/decoder/util/EffectInfo.java b/src/org/infinity/resource/cre/decoder/util/EffectInfo.java index 93a5507ab..a8081fa79 100644 --- a/src/org/infinity/resource/cre/decoder/util/EffectInfo.java +++ b/src/org/infinity/resource/cre/decoder/util/EffectInfo.java @@ -28,6 +28,7 @@ import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Manages effects opcodes for a specific target. @@ -462,7 +463,7 @@ private void resolveSPL(List list, Effect parent, ResourceEntry entry) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -476,7 +477,7 @@ private void resolveEFF(List list, Effect parent, ResourceEntry entry) { final List retList = resolveEffect(parent, Effect.fromEffectV2(entry.getResourceBuffer(), 8)); list.addAll(retList); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/cre/decoder/util/ItemInfo.java b/src/org/infinity/resource/cre/decoder/util/ItemInfo.java index 21639de04..f504728f0 100644 --- a/src/org/infinity/resource/cre/decoder/util/ItemInfo.java +++ b/src/org/infinity/resource/cre/decoder/util/ItemInfo.java @@ -24,6 +24,7 @@ import org.infinity.util.Misc; import org.infinity.util.StringTable; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Provides useful information about equippable items. @@ -480,7 +481,7 @@ public static int getItemCategory(ResourceEntry itmEntry) { Misc.requireCondition(is.skip(0x14) == 0x14, "Could not advance in data stream"); return StreamUtils.readShort(is); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return -1; diff --git a/src/org/infinity/resource/cre/decoder/util/SpriteUtils.java b/src/org/infinity/resource/cre/decoder/util/SpriteUtils.java index 6d41a2181..5a26d3dae 100644 --- a/src/org/infinity/resource/cre/decoder/util/SpriteUtils.java +++ b/src/org/infinity/resource/cre/decoder/util/SpriteUtils.java @@ -65,6 +65,7 @@ import org.infinity.util.Table2daCache; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * Collection of helpful methods for Sprite rendering. @@ -448,7 +449,7 @@ public static Couple loadBamDecoderCont retVal = Couple.with(decoder, control); BAM_CACHE.put(entry, retVal); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; @@ -616,7 +617,7 @@ public static int[] loadReplacementPalette(String resref, int index) { PALETTE_CACHE.put(entry, retVal); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -711,7 +712,7 @@ public static int[] getColorGradient(int index, boolean allowRandom) { COLOR_GRADIENTS.put(y, pixels); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else { // dummy entry to skip continuous gradient initialization attempts if gradient bitmap isn't available @@ -1279,7 +1280,7 @@ private static List guessIniMaps(int animationId) { break; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/dlg/AbstractCode.java b/src/org/infinity/resource/dlg/AbstractCode.java index a32620809..3dbf8d5fd 100644 --- a/src/org/infinity/resource/dlg/AbstractCode.java +++ b/src/org/infinity/resource/dlg/AbstractCode.java @@ -47,6 +47,7 @@ import org.infinity.resource.bcs.ScriptType; import org.infinity.util.Misc; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public abstract class AbstractCode extends Datatype implements Editable, IsTextual, AddRemovable, ActionListener, DocumentListener, ItemListener { @@ -325,7 +326,7 @@ public void addFlatList(List flatList) { ts.setOffset(off.getValue()); flatList.add(ts); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/dlg/DlgResource.java b/src/org/infinity/resource/dlg/DlgResource.java index 2c497e1cf..0d0fe5dc2 100644 --- a/src/org/infinity/resource/dlg/DlgResource.java +++ b/src/org/infinity/resource/dlg/DlgResource.java @@ -50,6 +50,7 @@ import org.infinity.updater.Utils; import org.infinity.util.StringTable; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * DLG resource contains the structure of conversation, in what is effectievly a state machine. Dialogs contains string @@ -222,7 +223,7 @@ public void actionPerformed(ActionEvent e) { throw new Exception(); } } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); JOptionPane.showMessageDialog(getViewer().getTopLevelAncestor(), "Could not export resource into WeiDU dialog format.", "Error", JOptionPane.ERROR_MESSAGE); return; diff --git a/src/org/infinity/resource/dlg/DlgTreeModel.java b/src/org/infinity/resource/dlg/DlgTreeModel.java index b2a1c2d78..fb95f28e6 100644 --- a/src/org/infinity/resource/dlg/DlgTreeModel.java +++ b/src/org/infinity/resource/dlg/DlgTreeModel.java @@ -35,6 +35,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.StructEntry; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** Creates and manages the dialog tree structure. */ final class DlgTreeModel implements TreeModel, TreeNode, TableModelListener, PropertyChangeListener { @@ -905,7 +906,7 @@ private DlgResource getDialogResource(ResourceRef dlgRef) { try { return new DlgResource(ResourceFactory.getResourceEntry(name)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; }); diff --git a/src/org/infinity/resource/dlg/TreeWorker.java b/src/org/infinity/resource/dlg/TreeWorker.java index da9495add..c6d6e0fed 100644 --- a/src/org/infinity/resource/dlg/TreeWorker.java +++ b/src/org/infinity/resource/dlg/TreeWorker.java @@ -13,6 +13,8 @@ import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; +import org.tinylog.Logger; + //-------------------------- INNER CLASSES -------------------------- /** Applies expand or collapse operations on a set of dialog tree nodes in a background task. */ @@ -49,7 +51,7 @@ protected Void doInBackground() throws Exception { collapseNode(path); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -88,7 +90,7 @@ private void expandNode(final TreePath path) { try { SwingUtilities.invokeAndWait(() -> dlgTree.expandPath(path)); } catch (InterruptedException | InvocationTargetException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -126,7 +128,7 @@ private void collapseNode(final TreePath path) { try { SwingUtilities.invokeAndWait(() -> dlgTree.collapsePath(path)); } catch (InterruptedException | InvocationTargetException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/dlg/Viewer.java b/src/org/infinity/resource/dlg/Viewer.java index 737da8dbd..a4a7efee0 100644 --- a/src/org/infinity/resource/dlg/Viewer.java +++ b/src/org/infinity/resource/dlg/Viewer.java @@ -53,6 +53,7 @@ import org.infinity.search.DialogSearcher; import org.infinity.util.Misc; import org.infinity.util.StringTable; +import org.tinylog.Logger; final class Viewer extends JPanel implements ActionListener, ItemListener, TableModelListener { private static final ButtonPanel.Control CTRL_NEXT_STATE = ButtonPanel.Control.CUSTOM_1; @@ -406,7 +407,7 @@ public void select(StructEntry entry) { showState(stateNrToShow); showTransition(transNrToShow); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -448,7 +449,7 @@ private void showState(int nr) { if (!isValid) { if (nr >= 0) { // Print warning about not correct resource - System.err.println(dlg.getName() + ": state " + nr + " is not exist"); + Logger.warn("{}: state {} does not exist", dlg.getName(), nr); } stateTextPanel.clearDisplay(); stateTriggerPanel.clearDisplay(); @@ -500,10 +501,9 @@ private void showTransition(int nr) { if (nr >= 0 && currentState != null) { // Print warning about not correct resource if (isValid) { - System.err.println( - dlg.getName() + ": transition " + nr + " is not transition from state " + currentState.getNumber()); + Logger.warn("{}: transition {} is not transition from state {}", dlg.getName(), nr, currentState.getNumber()); } else if (isBroken) { - System.err.println(dlg.getName() + ": transition " + nr + " is not exist"); + Logger.warn("{}: transition {} does not exist", dlg.getName(), nr); } } transTextPanel.clearDisplay(); diff --git a/src/org/infinity/resource/effects/BaseOpcode.java b/src/org/infinity/resource/effects/BaseOpcode.java index 28de51e10..c9bce48c1 100644 --- a/src/org/infinity/resource/effects/BaseOpcode.java +++ b/src/org/infinity/resource/effects/BaseOpcode.java @@ -36,6 +36,7 @@ import org.infinity.util.Table2daCache; import org.infinity.util.io.ByteBufferOutputStream; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Base class for opcode-handling classes. Derived classes should handle one opcode per class for all game variants. @@ -650,12 +651,12 @@ public static synchronized String[] getPortraitIconNames(String defaultName) { portraitIconNames[index] = StringTable.getStringRef(strref); } } catch (NumberFormatException nfe) { - nfe.printStackTrace(); + Logger.error(nfe); } } } } catch (NullPointerException npe) { - npe.printStackTrace(); + Logger.error(npe); } } @@ -888,7 +889,7 @@ public static ByteBuffer getEntryData(StructEntry entry) try (ByteBufferOutputStream bbos = new ByteBufferOutputStream(bb)) { entry.write(bbos); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return null; } return bb; @@ -913,7 +914,7 @@ public static ByteBuffer getEntryData(AbstractStruct struct, EffectEntry id) } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return null; @@ -1026,7 +1027,7 @@ private static synchronized TreeMap getOpcodeMap() { } } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | InstantiationException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/gam/GamResource.java b/src/org/infinity/resource/gam/GamResource.java index dbf54c734..6c5dc5037 100644 --- a/src/org/infinity/resource/gam/GamResource.java +++ b/src/org/infinity/resource/gam/GamResource.java @@ -45,6 +45,7 @@ import org.infinity.resource.text.QuestsPanel; import org.infinity.resource.text.QuestsResource; import org.infinity.util.Variables; +import org.tinylog.Logger; /** * This resource is used to hold game information in save games. The GAM file does not store {@link AreResource area}, @@ -192,7 +193,7 @@ public JComponent getViewerTab(int index) { try { return new QuestsPanel(new QuestsResource().readQuests(), globalVars); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); final StringWriter w = new StringWriter(); ex.printStackTrace(new PrintWriter(w)); return new JTextArea(w.toString()); diff --git a/src/org/infinity/resource/graphics/BamDecoder.java b/src/org/infinity/resource/graphics/BamDecoder.java index b7efbbd95..ea60b2ce4 100644 --- a/src/org/infinity/resource/graphics/BamDecoder.java +++ b/src/org/infinity/resource/graphics/BamDecoder.java @@ -17,6 +17,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Common base class for handling BAM resources. @@ -60,7 +61,7 @@ public static Type getType(ResourceEntry bamEntry) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; diff --git a/src/org/infinity/resource/graphics/BamResource.java b/src/org/infinity/resource/graphics/BamResource.java index 7c1be00d9..ced009edf 100644 --- a/src/org/infinity/resource/graphics/BamResource.java +++ b/src/org/infinity/resource/graphics/BamResource.java @@ -80,6 +80,7 @@ import org.infinity.util.IntegerHashMap; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.IDataChangedListener; @@ -155,7 +156,7 @@ public BamResource(ResourceEntry entry) { ((BamV1Decoder.BamV1Control) bamControl).setTransparencyEnabled(transparencyEnabled); } } catch (Throwable t) { - t.printStackTrace(); + Logger.error(t); decoder = null; } WindowBlocker.blockWindow(false); @@ -274,7 +275,7 @@ public void actionPerformed(ActionEvent event) { ByteBuffer buffer = Compressor.decompress(entry.getResourceBuffer()); ResourceFactory.exportResource(entry, buffer, entry.getResourceName(), panelMain.getTopLevelAncestor()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -293,7 +294,7 @@ public void actionPerformed(ActionEvent event) { ByteBuffer buffer = Compressor.compress(entry.getResourceBuffer(), "BAMC", "V1 "); ResourceFactory.exportResource(entry, buffer, entry.getResourceName(), panelMain.getTopLevelAncestor()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -357,7 +358,7 @@ public void propertyChange(PropertyChangeEvent event) { l = null; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (bamData != null) { if (bamData.length > 0) { @@ -398,7 +399,7 @@ public void stateChanged(ChangeEvent event) { hexViewer.setCurrentOffset(0L); panelRaw.add(hexViewer, BorderLayout.CENTER); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { WindowBlocker.blockWindow(false); } @@ -846,13 +847,13 @@ public static String exportFrames(BamDecoder decoder, Path filePath, String file counter++; } catch (IOException e) { failCounter++; - System.err.println("Error writing frame #" + i); + Logger.warn("Error writing frame #{}", i); } image.flush(); image = null; } else { failCounter++; - System.err.println("Skipping frame #" + i); + Logger.warn("Skipping frame #{}", i); } } } @@ -1236,7 +1237,7 @@ public List doInBackground() { list.add(buf); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return list; } @@ -1286,7 +1287,7 @@ public boolean containsPvrzReference(int index) { retVal = (curIndex == index); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; diff --git a/src/org/infinity/resource/graphics/BamV1Decoder.java b/src/org/infinity/resource/graphics/BamV1Decoder.java index 8a544d7ab..925cd71ae 100644 --- a/src/org/infinity/resource/graphics/BamV1Decoder.java +++ b/src/org/infinity/resource/graphics/BamV1Decoder.java @@ -19,6 +19,7 @@ import org.infinity.resource.Profile; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Handles BAM v1 resources (both BAMC and uncompressed BAM V1). @@ -223,7 +224,7 @@ private void init() { defaultControl.setMode(BamControl.Mode.SHARED); defaultControl.setSharedPerCycle(false); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } @@ -308,9 +309,8 @@ private void decodeFrame(BamControl control, int frameIdx, Image canvas) { dstOfs += dstWidth - srcWidth; } } catch (Exception e) { - System.err.printf("Error [%s]: input (offset=%d, size=%d), output (offset=%d, size=%d)\n", - e.getClass().getName(), srcOfs, bamBuffer.limit(), dstOfs, - bufferB != null ? bufferB.length : bufferI.length); + Logger.error("Error [{}]: input (offset={}, size={}), output (offset={}, size={})", + e.getClass().getName(), srcOfs, bamBuffer.limit(), dstOfs, bufferB != null ? bufferB.length : bufferI.length); } bufferB = null; bufferI = null; diff --git a/src/org/infinity/resource/graphics/BamV2Decoder.java b/src/org/infinity/resource/graphics/BamV2Decoder.java index 459e6d9fe..95ed96639 100644 --- a/src/org/infinity/resource/graphics/BamV2Decoder.java +++ b/src/org/infinity/resource/graphics/BamV2Decoder.java @@ -26,6 +26,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Handles BAM v2 resources. @@ -220,7 +221,7 @@ private void init() { defaultControl.setMode(BamControl.Mode.SHARED); defaultControl.setSharedPerCycle(false); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } @@ -247,7 +248,7 @@ private PvrDecoder getPVR(int page) { return PvrDecoder.loadPvr(entry); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -466,7 +467,7 @@ private void decodeImage(ByteBuffer buffer, int ofsBlocks, int start, int count) decoder = null; srcImage = null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/graphics/ColorConvert.java b/src/org/infinity/resource/graphics/ColorConvert.java index 14d3673a6..4afeddf60 100644 --- a/src/org/infinity/resource/graphics/ColorConvert.java +++ b/src/org/infinity/resource/graphics/ColorConvert.java @@ -41,6 +41,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Triple; +import org.tinylog.Logger; /** * Contains a set of color-related static methods (little endian order only). @@ -806,7 +807,7 @@ public static int[] loadPaletteBMP(ResourceEntry entry) throws Exception { throw new Exception("Invalid BMP resource: " + entry.getResourceName()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unable to read BMP resource: " + entry.getResourceName()); } } else { @@ -840,7 +841,7 @@ public static int[] loadPalettePNG(Path file, boolean preserveAlpha) throws Exce throw new Exception("Error loading palette from PNG file " + file.getFileName()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unable to read PNG file " + file.getFileName()); } } else { @@ -893,7 +894,7 @@ public static int[] loadPalettePAL(Path file) throws Exception { throw new Exception("Invalid Windows palette file " + file.getFileName()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unable to read Windows palette file " + file.getFileName()); } } else { @@ -935,7 +936,7 @@ public static int[] loadPaletteACT(Path file) throws Exception { throw new Exception("Invalid Adobe Photoshop palette file " + file.getFileName()); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unable to read Adobe Photoshop palette file " + file.getFileName()); } } else { @@ -987,7 +988,7 @@ public static int[] loadPaletteBAM(ResourceEntry entry, boolean preserveAlpha) t throw new Exception("Unsupport file type."); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unable to read BAM resource: " + entry.getResourceName()); } } else { diff --git a/src/org/infinity/resource/graphics/MosDecoder.java b/src/org/infinity/resource/graphics/MosDecoder.java index c3094e41f..00b1be05f 100644 --- a/src/org/infinity/resource/graphics/MosDecoder.java +++ b/src/org/infinity/resource/graphics/MosDecoder.java @@ -10,6 +10,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Common base class for handling MOS resources. @@ -53,7 +54,7 @@ public static Type getType(ResourceEntry mosEntry) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; diff --git a/src/org/infinity/resource/graphics/MosResource.java b/src/org/infinity/resource/graphics/MosResource.java index 017c6c2ea..507aa0045 100644 --- a/src/org/infinity/resource/graphics/MosResource.java +++ b/src/org/infinity/resource/graphics/MosResource.java @@ -61,6 +61,7 @@ import org.infinity.util.DynamicArray; import org.infinity.util.IntegerHashMap; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * This resource describes static graphics in a tile based bitmap format. Such files are used for mini-maps and GUI @@ -137,7 +138,7 @@ public void actionPerformed(ActionEvent event) { buffer = Compressor.decompress(buffer); ResourceFactory.exportResource(entry, buffer, entry.getResourceName(), panel.getTopLevelAncestor()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Error while exporting " + entry, "Error", JOptionPane.ERROR_MESSAGE); } @@ -156,7 +157,7 @@ public void actionPerformed(ActionEvent event) { buffer = Compressor.compress(buffer, "MOSC", "V1 "); ResourceFactory.exportResource(entry, buffer, entry.getResourceName(), panel.getTopLevelAncestor()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Error while exporting " + entry, "Error", JOptionPane.ERROR_MESSAGE); } @@ -181,7 +182,7 @@ public void actionPerformed(ActionEvent event) { JOptionPane.ERROR_MESSAGE); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } else if (event.getSource() == miPvrzShow) { if (lastBlockIndex >= 0) { @@ -223,7 +224,7 @@ public void propertyChange(PropertyChangeEvent event) { l = null; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (mosData != null) { if (mosData.length > 0) { @@ -439,7 +440,7 @@ private void showProperties() { sb.append(""); JOptionPane.showMessageDialog(panel, sb.toString(), "Properties of " + resName, JOptionPane.INFORMATION_MESSAGE); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { if (decoder != null) { decoder.close(); @@ -497,7 +498,7 @@ private BufferedImage loadImage() { decoder = MosDecoder.loadMos(entry); mosType = decoder.getType(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -654,7 +655,7 @@ public List doInBackground() { list.add(buf); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return list; } @@ -704,7 +705,7 @@ public boolean containsPvrzReference(int index) { retVal = (curIndex == index); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; diff --git a/src/org/infinity/resource/graphics/MosV1Decoder.java b/src/org/infinity/resource/graphics/MosV1Decoder.java index 4c1de7962..5687b3f12 100644 --- a/src/org/infinity/resource/graphics/MosV1Decoder.java +++ b/src/org/infinity/resource/graphics/MosV1Decoder.java @@ -16,6 +16,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.DynamicArray; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class MosV1Decoder extends MosDecoder { private static final int BLOCK_DIMENSION = 64; // default block dimension @@ -68,7 +69,7 @@ public static MosDecoder.MosInfo getInfo(ResourceEntry mosEntry) { retVal = new MosDecoder.MosInfo(compressed, width, height, columns, rows, blockSize); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -418,7 +419,7 @@ private void init() { workingPalette = new int[256]; workingCanvas = new BufferedImage(BLOCK_DIMENSION, BLOCK_DIMENSION, BufferedImage.TYPE_INT_ARGB); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } diff --git a/src/org/infinity/resource/graphics/MosV2Decoder.java b/src/org/infinity/resource/graphics/MosV2Decoder.java index b572a299e..aaff96737 100644 --- a/src/org/infinity/resource/graphics/MosV2Decoder.java +++ b/src/org/infinity/resource/graphics/MosV2Decoder.java @@ -22,6 +22,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.DynamicArray; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class MosV2Decoder extends MosDecoder { private static final int HEADER_SIZE = 16; // size of the MOS header @@ -59,7 +60,7 @@ public static MosDecoder.MosInfo getInfo(ResourceEntry mosEntry) { retVal = new MosDecoder.MosInfo(width, height, numBlocks); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -307,7 +308,7 @@ private void init() { dataBlocks.add(block); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } @@ -321,7 +322,7 @@ private PvrDecoder getPVR(int page) { return PvrDecoder.loadPvr(entry); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -372,7 +373,7 @@ private boolean renderBlock(MosBlock block, Image canvas, int left, int top) { } return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return false; @@ -415,7 +416,7 @@ private boolean renderBlock(MosBlock block, int[] buffer, int width, int height, return true; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return false; diff --git a/src/org/infinity/resource/graphics/PltResource.java b/src/org/infinity/resource/graphics/PltResource.java index b4ed02478..2cfd507f5 100644 --- a/src/org/infinity/resource/graphics/PltResource.java +++ b/src/org/infinity/resource/graphics/PltResource.java @@ -64,6 +64,7 @@ import org.infinity.util.Table2da; import org.infinity.util.Table2daCache; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.IDataChangedListener; @@ -286,7 +287,7 @@ public void actionPerformed(ActionEvent e) { throw new UnsupportedOperationException("PNG writing is not supported"); } } catch (Exception ioe) { - ioe.printStackTrace(); + Logger.error(ioe); JOptionPane.showMessageDialog(panelMain.getTopLevelAncestor(), "Error while exporting " + entry, "Error", JOptionPane.ERROR_MESSAGE); } @@ -341,7 +342,7 @@ public void stateChanged(ChangeEvent event) { hexViewer.setCurrentOffset(0L); panelRaw.add(hexViewer, BorderLayout.CENTER); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { WindowBlocker.blockWindow(false); } @@ -727,7 +728,7 @@ private void init() { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } if (items == null) { diff --git a/src/org/infinity/resource/graphics/PseudoBamDecoder.java b/src/org/infinity/resource/graphics/PseudoBamDecoder.java index 191824438..515e95a86 100644 --- a/src/org/infinity/resource/graphics/PseudoBamDecoder.java +++ b/src/org/infinity/resource/graphics/PseudoBamDecoder.java @@ -34,6 +34,7 @@ import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * A decoder that takes individual images as input and simulates a BAM structure. Furthermore, this class provides @@ -865,7 +866,7 @@ public boolean exportBamV1(Path fileName, ProgressMonitor progress, int curProgr try (OutputStream os = StreamUtils.getOutputStream(fileName, true)) { os.write(bamData); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw e; } bamData = null; @@ -1014,7 +1015,7 @@ public boolean exportBamV2(Path fileName, DxtEncoder.DxtType dxtType, int pvrzIn try (OutputStream os = StreamUtils.getOutputStream(fileName, true)) { os.write(bamData); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw e; } bamData = null; @@ -1347,12 +1348,12 @@ private boolean createPvrzPages(Path path, DxtEncoder.DxtType dxtType, List"); JOptionPane.showMessageDialog(panel, sb.toString(), "Properties of " + resName, JOptionPane.INFORMATION_MESSAGE); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { decoder = null; } @@ -242,7 +243,7 @@ private BufferedImage loadImage() { if (decoder != null) { decoder = null; } - e.printStackTrace(); + Logger.error(e); } } return image; diff --git a/src/org/infinity/resource/graphics/TisConvert.java b/src/org/infinity/resource/graphics/TisConvert.java index 4141ba2b3..d305cb8d9 100644 --- a/src/org/infinity/resource/graphics/TisConvert.java +++ b/src/org/infinity/resource/graphics/TisConvert.java @@ -58,6 +58,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * This utility class provides methods for converting tileset (TIS) resources. @@ -249,7 +250,7 @@ public static Status exportPNG(List tiles, int tileCols, Path pngFile, bo } } catch (IOException e) { retVal = Status.ERROR; - e.printStackTrace(); + Logger.error(e); } if (showProgress && progress.isCanceled()) { @@ -266,7 +267,7 @@ public static Status exportPNG(List tiles, int tileCols, Path pngFile, bo try { Files.delete(pngFile); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -375,7 +376,7 @@ public static ResourceEntry findWed(ResourceEntry tisEntry, boolean deepSearch) } catch (IOException e) { // do nothing } catch (Exception e) { - System.err.println(e.getClass().getName() + ": " + e.getMessage()); + Logger.warn("{}: {}", e.getClass().getName(), e.getMessage()); } } return false; @@ -639,7 +640,7 @@ public static Status convertToPaletteTis(Config config, boolean showProgress, Co tileImageOut.flush(); } catch (Exception e) { retVal = Status.ERROR; - e.printStackTrace(); + Logger.error(e); } finally { if (showProgress) { SwingUtilities.invokeLater(() -> progress.close()); @@ -649,7 +650,7 @@ public static Status convertToPaletteTis(Config config, boolean showProgress, Co try { Files.delete(config.getTisFile()); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -913,7 +914,7 @@ public static Status convertToPvrzTis(Config config, boolean showProgress, Compo retVal = Status.SUCCESS; } catch (Exception e) { retVal = Status.ERROR; - e.printStackTrace(); + Logger.error(e); } finally { if (showProgress) { SwingUtilities.invokeLater(() -> progress.close()); @@ -1220,7 +1221,7 @@ private static void createPvrz(Config config, Path pvrzFile, List tileM throw new IllegalArgumentException("Unsupported texture size (width=" + width + ", height=" + height + ")"); } if (tileMaps.isEmpty()) { - System.err.println("PVRZ creation: No tile maps available for " + pvrzFile.getFileName()); + Logger.warn("PVRZ creation: No tile maps available for {}", pvrzFile.getFileName()); } // generating texture image @@ -1263,7 +1264,7 @@ private static void createPvrz(Config config, Path pvrzFile, List tileM try { Files.delete(pvrzFile); } catch (IOException e2) { - e2.printStackTrace(); + Logger.error(e2); } throw e; } @@ -1299,7 +1300,7 @@ private static void renderTextureTiles(Config config, Graphics2D g, TileMap tile if (tmi != null) { config.getDecoder().getTile(tmi.getIndex(), tileImg); } else { - System.err.println("No tile available at " + p); + Logger.warn("No tile available at {}", p); continue; } @@ -1368,7 +1369,7 @@ private static void createPvrzTis(Config config, List ti Objects.requireNonNull(config); Objects.requireNonNull(tileList); if (tileList.isEmpty()) { - System.out.println(getErrorMessage(config, "Tile list is empty")); + Logger.info(getErrorMessage(config, "Tile list is empty")); } try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(config.getTisFile()))) { @@ -1394,7 +1395,7 @@ private static void createPvrzTis(Config config, List ti try { Files.delete(config.getTisFile()); } catch (IOException e2) { - e2.printStackTrace(); + Logger.error(e2); } throw e; } @@ -1928,7 +1929,7 @@ private WedInfo initWedInfo(ResourceEntry wedEntry) throws Exception { } } catch (Exception e) { wedInfo = null; - e.printStackTrace(); + Logger.error(e); } } @@ -1989,7 +1990,7 @@ private static OverlayConversion validateOverlayConversion(OverlayConversion con case BGEE_TO_BG2: case BG2EE_TO_BG1: case BG2EE_TO_BG2: - System.err.println("Unsupported overlay conversion mode: " + retVal); + Logger.warn("Unsupported overlay conversion mode: {}", retVal); retVal = OverlayConversion.NONE; break; default: @@ -2000,7 +2001,7 @@ private static OverlayConversion validateOverlayConversion(OverlayConversion con case BG1_TO_BG2EE: case BG2_TO_BGEE: case BG2_TO_BG2EE: - System.err.println("Unsupported overlay conversion mode: " + retVal); + Logger.warn("Unsupported overlay conversion mode: {}", retVal); retVal = OverlayConversion.NONE; break; default: diff --git a/src/org/infinity/resource/graphics/TisDecoder.java b/src/org/infinity/resource/graphics/TisDecoder.java index 7997938a8..6aa29e0fb 100644 --- a/src/org/infinity/resource/graphics/TisDecoder.java +++ b/src/org/infinity/resource/graphics/TisDecoder.java @@ -11,6 +11,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Common base class for handling TIS resources. @@ -55,7 +56,7 @@ public static Type getType(ResourceEntry tisEntry) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return retVal; @@ -84,7 +85,7 @@ public static TisInfo getInfo(ResourceEntry tisEntry) { retVal = new TisInfo(numTiles, tileSize, tileDim); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/resource/graphics/TisResource.java b/src/org/infinity/resource/graphics/TisResource.java index d311872f0..0e0a5140c 100644 --- a/src/org/infinity/resource/graphics/TisResource.java +++ b/src/org/infinity/resource/graphics/TisResource.java @@ -110,6 +110,7 @@ import org.infinity.util.DebugTimer; import org.infinity.util.io.FileEx; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; /** * This resource describes a tileset. There are currently two variants available: @@ -199,12 +200,12 @@ public void actionPerformed(ActionEvent event) { performBackgroundTask(() -> { DebugTimer.getInstance().timerReset(); Status status = TisConvert.convertToPaletteTis(config, true, panel.getTopLevelAncestor()); - DebugTimer.getInstance().timerShow("TIS conversion completed", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted("TIS conversion completed")); return status; }); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Tileset conversion: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } @@ -215,12 +216,12 @@ public void actionPerformed(ActionEvent event) { performBackgroundTask(() -> { DebugTimer.getInstance().timerReset(); Status status = TisConvert.convertToPvrzTis(config, true, panel.getTopLevelAncestor()); - DebugTimer.getInstance().timerShow("TIS conversion completed", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted("TIS conversion completed")); return status; }); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Tileset conversion: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } @@ -340,7 +341,7 @@ public void propertyChange(PropertyChangeEvent event) { retVal = Status.ERROR; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (retVal == Status.SUCCESS) { @@ -629,7 +630,7 @@ private void initTileset() { } WindowBlocker.blockWindow(false); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); WindowBlocker.blockWindow(false); if (tileImages == null) { tileImages = new ArrayList<>(); @@ -751,7 +752,7 @@ protected Status doInBackground() throws Exception { try { retVal = operation.get(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; } @@ -1126,7 +1127,7 @@ public static TisConvert.Config show(Component owner, TisResource tis) { dlg.setVisible(true); retVal = dlg.getConfig(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { if (dlg != null) { dlg.dispose(); @@ -1177,7 +1178,7 @@ private TisConvert.Config getConfig() { throw new Exception("Conversion not supported"); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -1488,7 +1489,7 @@ private void initPvrz() { try { tisPreview = new TisPreview(tis.decoder); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } final int previewWidth = sTilesPerRow.getValue(); @@ -1962,7 +1963,7 @@ private Path getTisPath() { try { return Paths.get(tfTisFile.getText().trim()); } catch (InvalidPathException e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -2161,7 +2162,7 @@ public void mouseMoved(MouseEvent e) { try { tisPreview.setTileSize(zoom); } catch (Exception ex) { - ex.printStackTrace(); + Logger.error(ex); // revert zoom change (if possible) for (int i = 0, size = cbPreviewImageZoom.getModel().getSize(); i < size; i++) { final int value = cbPreviewImageZoom.getModel().getElementAt(cbPreviewImageZoom.getSelectedIndex()).getData(); diff --git a/src/org/infinity/resource/graphics/TisV1Decoder.java b/src/org/infinity/resource/graphics/TisV1Decoder.java index 568b071b1..c35ee30d0 100644 --- a/src/org/infinity/resource/graphics/TisV1Decoder.java +++ b/src/org/infinity/resource/graphics/TisV1Decoder.java @@ -14,6 +14,7 @@ import java.util.Objects; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Handles legacy TIS resources (using palettized tiles). @@ -199,7 +200,7 @@ private void init() { workingPalette = new int[256]; workingCanvas = new BufferedImage(TILE_DIMENSION, TILE_DIMENSION, Transparency.BITMASK); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } diff --git a/src/org/infinity/resource/graphics/TisV2Decoder.java b/src/org/infinity/resource/graphics/TisV2Decoder.java index dcbb15440..38a7d86c7 100644 --- a/src/org/infinity/resource/graphics/TisV2Decoder.java +++ b/src/org/infinity/resource/graphics/TisV2Decoder.java @@ -15,6 +15,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Handles new PVRZ-based TIS resources. @@ -163,7 +164,7 @@ private void init() { workingCanvas = new BufferedImage(TILE_DIMENSION, TILE_DIMENSION, BufferedImage.TYPE_INT_ARGB); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); close(); } } @@ -178,7 +179,7 @@ private PvrDecoder getPVR(int page) { return PvrDecoder.loadPvr(entry); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -253,7 +254,7 @@ private boolean updateWorkingCanvas(int tileIdx) { } return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); decoder = null; } } diff --git a/src/org/infinity/resource/key/BIFFEntry.java b/src/org/infinity/resource/key/BIFFEntry.java index 55c54c7a7..977ba2f2a 100644 --- a/src/org/infinity/resource/key/BIFFEntry.java +++ b/src/org/infinity/resource/key/BIFFEntry.java @@ -19,6 +19,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Provides information about the location of resource data within BIFF archives. @@ -218,8 +219,7 @@ public void updateBIFF(Path keyFile, int index, ByteBuffer buffer, int offset, b try { this.fileSize = (int) Files.size(this.biffFile); } catch (IOException e) { - System.err.println(String.format("Could not determine file size: %s", this.biffFile)); - e.printStackTrace(); + Logger.error(e, "Could not determine file size: {}", this.biffFile); } } } diff --git a/src/org/infinity/resource/key/BIFFResourceEntry.java b/src/org/infinity/resource/key/BIFFResourceEntry.java index 5368c2fa7..fd26c9de0 100644 --- a/src/org/infinity/resource/key/BIFFResourceEntry.java +++ b/src/org/infinity/resource/key/BIFFResourceEntry.java @@ -23,6 +23,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class BIFFResourceEntry extends ResourceEntry implements Writeable { /** Full path to KEY file containing BIFF entry. */ @@ -154,7 +155,7 @@ public Path getActualPath(boolean ignoreOverride) { try { return ResourceFactory.getKeyfile().getBIFFFile(getBIFFEntry()).getFile(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -181,7 +182,7 @@ public long getResourceSize(boolean ignoreOverride) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return retVal; } diff --git a/src/org/infinity/resource/key/FileResourceEntry.java b/src/org/infinity/resource/key/FileResourceEntry.java index fec931674..2d032af3e 100644 --- a/src/org/infinity/resource/key/FileResourceEntry.java +++ b/src/org/infinity/resource/key/FileResourceEntry.java @@ -23,6 +23,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.util.io.ByteBufferInputStream; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class FileResourceEntry extends ResourceEntry { private final boolean override; @@ -56,7 +57,7 @@ public long getResourceSize(boolean ignoreOverride) { try { return Files.size(file); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return -1L; } diff --git a/src/org/infinity/resource/key/Keyfile.java b/src/org/infinity/resource/key/Keyfile.java index 31cbc8bb4..e20d07c4e 100644 --- a/src/org/infinity/resource/key/Keyfile.java +++ b/src/org/infinity/resource/key/Keyfile.java @@ -30,6 +30,7 @@ import org.infinity.util.Misc; import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class Keyfile { public static final ImageIcon ICON_STRUCT = Icons.ICON_ROW_INSERT_AFTER_16.getIcon(); @@ -348,7 +349,7 @@ public void addBIFFEntry(BIFFEntry entry) { // try { // Files.deleteIfExists(file); // } catch (IOException e) { - // e.printStackTrace(); + // Logger.error(e); // } // } // }); @@ -368,7 +369,7 @@ public void addBIFFEntry(BIFFEntry entry) { // // return true; // } catch (IOException e) { - // e.printStackTrace(); + // Logger.error(e); // } // // return false; @@ -455,7 +456,7 @@ private void cacheBIFFs() { try { AbstractBIFFReader.open(biffPath); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/key/ResourceEntry.java b/src/org/infinity/resource/key/ResourceEntry.java index 818313e37..6c868ecca 100644 --- a/src/org/infinity/resource/key/ResourceEntry.java +++ b/src/org/infinity/resource/key/ResourceEntry.java @@ -34,6 +34,7 @@ import org.infinity.search.SearchOptions; import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public abstract class ResourceEntry implements Comparable { // list of file extensions not shown in the resource tree @@ -88,7 +89,7 @@ static int[] getLocalFileInfo(Path file) { return new int[] { (int) ch.size() }; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return null; @@ -205,7 +206,7 @@ public String getSearchString() { JOptionPane.ERROR_MESSAGE); } searchString = "Error"; - e.printStackTrace(); + Logger.error(e); } } return searchString; diff --git a/src/org/infinity/resource/key/ResourceTreeModel.java b/src/org/infinity/resource/key/ResourceTreeModel.java index ef8052a73..d3c1ea079 100644 --- a/src/org/infinity/resource/key/ResourceTreeModel.java +++ b/src/org/infinity/resource/key/ResourceTreeModel.java @@ -25,6 +25,7 @@ import org.infinity.util.Misc; import org.infinity.util.io.FileEx; +import org.tinylog.Logger; public final class ResourceTreeModel implements TreeModel { private final List treeModelListeners = new ArrayList<>(); @@ -111,7 +112,7 @@ public void addDirectory(ResourceTreeFolder parentFolder, Path directory, boolea parentFolder.sortChildren(true); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return; } } diff --git a/src/org/infinity/resource/mus/Viewer.java b/src/org/infinity/resource/mus/Viewer.java index 5025189d5..78b57d823 100644 --- a/src/org/infinity/resource/mus/Viewer.java +++ b/src/org/infinity/resource/mus/Viewer.java @@ -32,6 +32,7 @@ import org.infinity.resource.sound.AudioPlayer; import org.infinity.util.Misc; import org.infinity.util.SimpleListModel; +import org.tinylog.Logger; public class Viewer extends JPanel implements Runnable, ActionListener { /** Provides quick access to the "play" and "pause" image icon. */ @@ -119,7 +120,7 @@ public void run() { } } catch (Exception e) { JOptionPane.showMessageDialog(this, "Error during playback", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } player.stopPlay(); setPlayButtonState(false); @@ -182,7 +183,7 @@ private boolean parseMusFile(MusResource mus) { try { entry.init(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(getTopLevelAncestor(), "Error loading " + entry.toString() + '\n' + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } diff --git a/src/org/infinity/resource/other/TtfResource.java b/src/org/infinity/resource/other/TtfResource.java index 933e5f50f..0cec953b2 100644 --- a/src/org/infinity/resource/other/TtfResource.java +++ b/src/org/infinity/resource/other/TtfResource.java @@ -39,6 +39,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.ViewableContainer; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; public class TtfResource implements Resource, DocumentListener, ActionListener { private static final ButtonPanel.Control PROPERTIES = ButtonPanel.Control.CUSTOM_1; @@ -64,7 +65,7 @@ public TtfResource(ResourceEntry entry) throws Exception { font = Font.createFont(Font.TRUETYPE_FONT, is); } catch (Exception e) { font = null; - e.printStackTrace(); + Logger.error(e); throw new Exception("Invalid TTF resource"); } @@ -183,7 +184,7 @@ private void updateText(String text) { try { doc.remove(0, doc.getLength()); } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } } @@ -198,7 +199,7 @@ private void updateText(String text) { doc.insertString(pos, label, as); pos += label.length(); } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } as = new SimpleAttributeSet(); @@ -210,7 +211,7 @@ private void updateText(String text) { doc.insertString(pos, "\n\n", as); pos += 2; } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } } tpDisplay.setCaretPosition(0); diff --git a/src/org/infinity/resource/other/UnknownResource.java b/src/org/infinity/resource/other/UnknownResource.java index cfd7a466a..1e7d79dac 100644 --- a/src/org/infinity/resource/other/UnknownResource.java +++ b/src/org/infinity/resource/other/UnknownResource.java @@ -46,6 +46,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; import tv.porst.jhexview.DataChangedEvent; import tv.porst.jhexview.IDataChangedListener; @@ -337,7 +338,7 @@ private void synchronizeData(int tabIndex) { hexViewer.setCurrentOffset(0L); panelRaw.add(hexViewer, BorderLayout.CENTER); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { WindowBlocker.blockWindow(false); } @@ -407,7 +408,7 @@ protected Void doInBackground() throws Exception { editor.discardAllEdits(); // don't undo loading operation success = true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (success) { setEditorActive(true); diff --git a/src/org/infinity/resource/pro/ProResource.java b/src/org/infinity/resource/pro/ProResource.java index 8d2fda849..bfb5e2a97 100644 --- a/src/org/infinity/resource/pro/ProResource.java +++ b/src/org/infinity/resource/pro/ProResource.java @@ -38,6 +38,7 @@ import org.infinity.resource.StructEntry; import org.infinity.resource.key.ResourceEntry; import org.infinity.search.SearchOptions; +import org.tinylog.Logger; /** * This resource describes projectiles, and the files are referenced spells and projectile weapons. Projectile files can @@ -158,7 +159,7 @@ public boolean valueUpdated(UpdateEvent event) { struct.addDatatype(new ProAreaType(), struct.getFields().size()); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return false; } } else if (proType.getValue() == 2L) { // single target @@ -171,7 +172,7 @@ public boolean valueUpdated(UpdateEvent event) { try { struct.addDatatype(new ProSingleType(), struct.getFields().size()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return false; } } diff --git a/src/org/infinity/resource/sav/IOHandler.java b/src/org/infinity/resource/sav/IOHandler.java index 82f37fece..2257a4b34 100644 --- a/src/org/infinity/resource/sav/IOHandler.java +++ b/src/org/infinity/resource/sav/IOHandler.java @@ -23,6 +23,7 @@ import org.infinity.util.FileDeletionHook; import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class IOHandler implements Writeable { private final ResourceEntry entry; @@ -73,13 +74,13 @@ public void close() { } } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } try { Files.delete(tempFolder); } catch (IOException e) { FileDeletionHook.getInstance().registerFile(tempFolder); - e.printStackTrace(); + Logger.error(e); } tempFolder = null; } diff --git a/src/org/infinity/resource/sav/SavResource.java b/src/org/infinity/resource/sav/SavResource.java index 8b0fefcf2..d94b1b952 100644 --- a/src/org/infinity/resource/sav/SavResource.java +++ b/src/org/infinity/resource/sav/SavResource.java @@ -51,6 +51,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.SimpleListModel; import org.infinity.util.io.FileEx; +import org.tinylog.Logger; /** * This resource acts as a standalone compressed archive. The file is zlib compressed, and allows incremental updates to @@ -125,7 +126,7 @@ public void actionPerformed(ActionEvent event) { Resource res = ResourceFactory.getResource(fileentry); new ViewFrame(panel.getTopLevelAncestor(), res); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Could not open selected resource.", "Error", JOptionPane.ERROR_MESSAGE); } @@ -220,7 +221,7 @@ public void mouseClicked(MouseEvent event) { Resource res = ResourceFactory.getResource(fileentry); new ViewFrame(panel.getTopLevelAncestor(), res); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), "Could not open selected resource.", "Error", JOptionPane.ERROR_MESSAGE); } @@ -336,7 +337,7 @@ private boolean compressData(boolean showError) { if (showError) { JOptionPane.showMessageDialog(panel, "Error compressing file", "Error", JOptionPane.ERROR_MESSAGE); } - e.printStackTrace(); + Logger.error(e); return false; } return true; @@ -363,7 +364,7 @@ private boolean decompressData(boolean showError) { if (showError) { JOptionPane.showMessageDialog(panel, "Error decompressing file", "Error", JOptionPane.ERROR_MESSAGE); } - e.printStackTrace(); + Logger.error(e); return false; } return true; @@ -412,7 +413,7 @@ private void addResource(ResourceEntry resourceEntry) { buttonPanel.getControlByType(CTRL_DELETE).setEnabled(filelist.getSelectedIndex() >= 0); buttonPanel.getControlByType(CTRL_EDIT).setEnabled(filelist.getSelectedIndex() >= 0); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel.getTopLevelAncestor(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } @@ -426,7 +427,7 @@ private void removeResource(int entryIndex) { try { Files.delete(file); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } entries.remove(resourceEntry); diff --git a/src/org/infinity/resource/sav/SavResourceEntry.java b/src/org/infinity/resource/sav/SavResourceEntry.java index 005a71363..aa755fd2c 100644 --- a/src/org/infinity/resource/sav/SavResourceEntry.java +++ b/src/org/infinity/resource/sav/SavResourceEntry.java @@ -20,6 +20,7 @@ import org.infinity.util.io.ByteBufferInputStream; import org.infinity.util.io.ByteBufferOutputStream; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Specialized ResourceEntry class for compressed entries in SAV resources. @@ -116,7 +117,7 @@ public int[] getResourceInfo(boolean ignoreoverride) throws Exception { return new int[] { data.getInt(8), data.getInt(12) }; } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -150,7 +151,7 @@ public long getResourceSize(boolean ignoreOverride) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return -1L; } diff --git a/src/org/infinity/resource/sound/AudioFactory.java b/src/org/infinity/resource/sound/AudioFactory.java index 99b924e51..0f27f18c3 100644 --- a/src/org/infinity/resource/sound/AudioFactory.java +++ b/src/org/infinity/resource/sound/AudioFactory.java @@ -8,6 +8,7 @@ import org.infinity.resource.sound.AudioBuffer.AudioOverride; import org.infinity.util.DynamicArray; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class AudioFactory { // supported audio formats @@ -37,7 +38,7 @@ public static AudioBuffer getAudioBuffer(ResourceEntry entry, AudioOverride over try { return getAudioBuffer(StreamUtils.toArray(entry.getResourceBuffer()), 0, override); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return null; } } @@ -78,7 +79,7 @@ public static AudioBuffer getAudioBuffer(byte[] buffer, int offset, AudioOverrid return null; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return null; } } @@ -105,7 +106,7 @@ public static byte[] convertAudio(ResourceEntry entry, AudioOverride override) { try { return convertAudio(StreamUtils.toArray(entry.getResourceBuffer()), 0, override); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return null; } } @@ -138,7 +139,7 @@ public static byte[] convertAudio(byte[] buffer, int offset, AudioOverride overr return ab.getAudioData(); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return null; } return null; diff --git a/src/org/infinity/resource/sound/OggBuffer.java b/src/org/infinity/resource/sound/OggBuffer.java index d21f78884..5ba26576f 100644 --- a/src/org/infinity/resource/sound/OggBuffer.java +++ b/src/org/infinity/resource/sound/OggBuffer.java @@ -8,6 +8,7 @@ import java.io.ByteArrayOutputStream; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; import com.jcraft.jogg.Packet; import com.jcraft.jogg.Page; @@ -243,7 +244,7 @@ private byte[] decodeOgg(byte[] inBuf, int offset) throws Exception { } if (result == -1) { // missing or corrupt data at this page position - System.err.println("Corrupt or missing data in bitstream; continuing..."); + Logger.warn("Corrupt or missing data in bitstream; continuing..."); } else { os.pagein(og); // can safely ignore errors at this point diff --git a/src/org/infinity/resource/sound/SoundResource.java b/src/org/infinity/resource/sound/SoundResource.java index 214a8ee14..51eefa26a 100644 --- a/src/org/infinity/resource/sound/SoundResource.java +++ b/src/org/infinity/resource/sound/SoundResource.java @@ -43,6 +43,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.WavReferenceSearcher; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Handles all kinds of supported single track audio files. @@ -179,7 +180,7 @@ public void run() { player.play(audioBuffer); } catch (Exception e) { JOptionPane.showMessageDialog(panel, "Error during playback", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } player.stopPlay(); timerTask.stop(); @@ -336,7 +337,7 @@ private boolean loadAudio() { return true; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(getContainer(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } return false; diff --git a/src/org/infinity/resource/text/modes/BCSFoldParser.java b/src/org/infinity/resource/text/modes/BCSFoldParser.java index cfc2a5ee5..618463f00 100644 --- a/src/org/infinity/resource/text/modes/BCSFoldParser.java +++ b/src/org/infinity/resource/text/modes/BCSFoldParser.java @@ -15,6 +15,7 @@ import org.fife.ui.rsyntaxtextarea.folding.Fold; import org.fife.ui.rsyntaxtextarea.folding.FoldParser; import org.fife.ui.rsyntaxtextarea.folding.FoldType; +import org.tinylog.Logger; /** * A fold parser for BCS scripts. It supports folding of multiline comments and IF/END blocks. @@ -84,7 +85,7 @@ public List getFolds(RSyntaxTextArea textArea) { } } } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } return folds; diff --git a/src/org/infinity/resource/text/modes/BCSTokenMaker.java b/src/org/infinity/resource/text/modes/BCSTokenMaker.java index 2a0cdea56..5ca48e9c8 100644 --- a/src/org/infinity/resource/text/modes/BCSTokenMaker.java +++ b/src/org/infinity/resource/text/modes/BCSTokenMaker.java @@ -20,6 +20,7 @@ import org.infinity.util.IdsMap; import org.infinity.util.IdsMapCache; import org.infinity.util.IdsMapEntry; +import org.tinylog.Logger; /** * A token maker that turns text into a linked list of {@code Token}s for syntax highlighting Infinity Engine BCS @@ -544,7 +545,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { throw new Exception( String.format("Invalid token %d found at position %d", currentTokenType, newStartOfs + i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } // end of default: } // end of switch (currentTokenType) diff --git a/src/org/infinity/resource/text/modes/GLSLTokenMaker.java b/src/org/infinity/resource/text/modes/GLSLTokenMaker.java index 539e0f58d..1e1712644 100644 --- a/src/org/infinity/resource/text/modes/GLSLTokenMaker.java +++ b/src/org/infinity/resource/text/modes/GLSLTokenMaker.java @@ -25,6 +25,7 @@ import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenImpl; import org.infinity.util.Misc; +import org.tinylog.Logger; /** @@ -3805,7 +3806,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { yybegin(state); return yylex(); } catch (IOException ioe) { - ioe.printStackTrace(); + Logger.error(ioe); return new TokenImpl(); } diff --git a/src/org/infinity/resource/text/modes/INITokenMaker.java b/src/org/infinity/resource/text/modes/INITokenMaker.java index a36ba9fe2..f04911dd2 100644 --- a/src/org/infinity/resource/text/modes/INITokenMaker.java +++ b/src/org/infinity/resource/text/modes/INITokenMaker.java @@ -10,6 +10,7 @@ import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenMap; import org.fife.ui.rsyntaxtextarea.TokenTypes; +import org.tinylog.Logger; /** * A token maker that turns text into a linked list of {@code Token}s for syntax highlighting Infinity Engine INI @@ -176,7 +177,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { try { throw new Exception("Invalid token " + currentTokenType + " found at position " + (newStartOfs + i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/text/modes/MenuTokenMaker.java b/src/org/infinity/resource/text/modes/MenuTokenMaker.java index 4db3227f9..8f43a1862 100644 --- a/src/org/infinity/resource/text/modes/MenuTokenMaker.java +++ b/src/org/infinity/resource/text/modes/MenuTokenMaker.java @@ -23,6 +23,7 @@ import org.fife.ui.rsyntaxtextarea.AbstractJFlexTokenMaker; import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenImpl; +import org.tinylog.Logger; /** @@ -4414,7 +4415,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { yybegin(state); return yylex(); } catch (IOException ioe) { - ioe.printStackTrace(); + Logger.error(ioe); return new TokenImpl(); } diff --git a/src/org/infinity/resource/text/modes/TLKTokenMaker.java b/src/org/infinity/resource/text/modes/TLKTokenMaker.java index dda9d9510..00ac2ad82 100644 --- a/src/org/infinity/resource/text/modes/TLKTokenMaker.java +++ b/src/org/infinity/resource/text/modes/TLKTokenMaker.java @@ -13,6 +13,7 @@ import org.fife.ui.rsyntaxtextarea.TokenMap; import org.fife.ui.rsyntaxtextarea.TokenTypes; import org.infinity.resource.Profile; +import org.tinylog.Logger; /** * A token maker that turns text into a linked list of {@link Token}s for syntax highlighting Infinity Engine text @@ -132,7 +133,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { try { throw new Exception("Invalid token " + currentTokenType + " found at position " + (newStartOfs + i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/text/modes/WeiDULogTokenMaker.java b/src/org/infinity/resource/text/modes/WeiDULogTokenMaker.java index df19e4613..2e5ed9260 100644 --- a/src/org/infinity/resource/text/modes/WeiDULogTokenMaker.java +++ b/src/org/infinity/resource/text/modes/WeiDULogTokenMaker.java @@ -10,6 +10,7 @@ import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenMap; import org.fife.ui.rsyntaxtextarea.TokenTypes; +import org.tinylog.Logger; /** * A token maker that turns text into a linked list of {@link Token}s for syntax highlighting WeiDU.log content. @@ -108,7 +109,7 @@ public Token getTokenList(Segment text, int initialTokenType, int startOffset) { try { throw new Exception("Invalid token " + currentTokenType + " found at position " + (newStartOfs + i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/to/TohResource.java b/src/org/infinity/resource/to/TohResource.java index 0956b3630..b20ba65ec 100644 --- a/src/org/infinity/resource/to/TohResource.java +++ b/src/org/infinity/resource/to/TohResource.java @@ -25,6 +25,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.resource.sav.SavResource; import org.infinity.util.StringTable; +import org.tinylog.Logger; /** * This resource serves a similar purpose (and has a similar structure to) {@link StringTable TLK} files. The resource @@ -138,13 +139,13 @@ public static String getOverrideString(ResourceEntry tohEntry, ResourceEntry tot try { toh = (tohEntry != null) ? new TohResource(tohEntry) : null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (!Profile.isEnhancedEdition()) { try { tot = (totEntry != null) ? new TotResource(totEntry, toh) : null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return getOverrideString(toh, tot, strref); diff --git a/src/org/infinity/resource/to/TotResource.java b/src/org/infinity/resource/to/TotResource.java index 5fb29d93c..bf28c2651 100644 --- a/src/org/infinity/resource/to/TotResource.java +++ b/src/org/infinity/resource/to/TotResource.java @@ -19,6 +19,7 @@ import org.infinity.resource.sav.SavResource; import org.infinity.util.StringTable; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * This resource serves a similar purpose (and has a similar structure to) {@link StringTable TLK} files. The files can @@ -128,7 +129,7 @@ public static boolean isStringEntryValid(StringEntry entry) { int ofsNext = ((IsNumeric) entry.getAttribute(StringEntry.TOT_STRING_OFFSET_NEXT_ENTRY)).getValue(); retVal = (ofsPrev == -1 && ofsNext == -1) || (ofsPrev != ofsNext); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -156,7 +157,7 @@ private TohResource loadAssociatedToh(ResourceEntry totResource) { try { toh = new TohResource(new FileResourceEntry(tohPath)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/resource/vef/VefType.java b/src/org/infinity/resource/vef/VefType.java index 7195f85ee..ec105211f 100644 --- a/src/org/infinity/resource/vef/VefType.java +++ b/src/org/infinity/resource/vef/VefType.java @@ -14,6 +14,7 @@ import org.infinity.datatype.TextString; import org.infinity.resource.AbstractStruct; import org.infinity.resource.StructEntry; +import org.tinylog.Logger; public final class VefType extends Bitmap { // VEF/VefType-specific field labels @@ -42,7 +43,7 @@ public boolean updateValue(AbstractStruct struct) { struct.addFields(this, list); return true; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return false; } diff --git a/src/org/infinity/resource/video/MveDecoder.java b/src/org/infinity/resource/video/MveDecoder.java index 7ee977186..56512251a 100644 --- a/src/org/infinity/resource/video/MveDecoder.java +++ b/src/org/infinity/resource/video/MveDecoder.java @@ -16,6 +16,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Decodes a MVE video resource. @@ -526,7 +527,7 @@ private boolean manageSegment(MveChunk chunk, MveSegment segment) { return true; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return false; @@ -777,7 +778,7 @@ private boolean initSegments() { segments.add(segment); curSize += segmentSize; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return false; } } @@ -799,7 +800,7 @@ private boolean peekNextChunk() { nextChunkSize = StreamUtils.readUnsignedShort(in); nextChunkType = StreamUtils.readUnsignedShort(in); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); return false; } } diff --git a/src/org/infinity/resource/video/MvePlayer.java b/src/org/infinity/resource/video/MvePlayer.java index a16b1d9ae..74ea6a337 100644 --- a/src/org/infinity/resource/video/MvePlayer.java +++ b/src/org/infinity/resource/video/MvePlayer.java @@ -8,6 +8,8 @@ import javax.sound.sampled.AudioSystem; import javax.sound.sampled.SourceDataLine; +import org.tinylog.Logger; + public class MvePlayer { private boolean playing; private boolean paused; @@ -243,7 +245,7 @@ private void initAudio(MveDecoder decoder) throws Exception { try { dataLine = AudioSystem.getSourceDataLine(audioFormat); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); throw new Exception("Unsupported audio format"); } dataLine.open(audioFormat, 16384); diff --git a/src/org/infinity/resource/video/MveResource.java b/src/org/infinity/resource/video/MveResource.java index e211dda17..06480f791 100644 --- a/src/org/infinity/resource/video/MveResource.java +++ b/src/org/infinity/resource/video/MveResource.java @@ -56,6 +56,7 @@ import org.monte.media.VideoFormatKeys; import org.monte.media.avi.AVIWriter; import org.monte.media.math.Rational; +import org.tinylog.Logger; /** * This resource describes the movies played during the game. Movies can only be played by the engine when they are @@ -97,7 +98,7 @@ public MveResource(ResourceEntry entry) throws Exception { } } catch (Exception e) { decoder = null; - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error opening " + entry, "Error", JOptionPane.ERROR_MESSAGE); } @@ -207,7 +208,7 @@ public void run() { try { decoder.open(entry); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel, "Error starting video playback", "Error", JOptionPane.ERROR_MESSAGE); return; } @@ -221,7 +222,7 @@ public void run() { player.play(renderer, decoder); } catch (Exception e) { player.stopPlay(); - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(panel, "Error during playback", "Error", JOptionPane.ERROR_MESSAGE); } decoder.close(); @@ -457,7 +458,7 @@ AudioFormatKeys.SampleRateKey, new Rational(sampleRate), AudioFormatKeys.SampleS try { Files.delete(outFile); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } JOptionPane.showMessageDialog(parent, "Conversion has been cancelled.", "Information", @@ -489,7 +490,7 @@ AudioFormatKeys.SampleRateKey, new Rational(sampleRate), AudioFormatKeys.SampleS } return true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } if (!silent) { JOptionPane.showMessageDialog(parent, "Error while exporting " + inEntry + " as AVI file.", "Error", diff --git a/src/org/infinity/resource/video/MveVideoDecoder.java b/src/org/infinity/resource/video/MveVideoDecoder.java index b7354398e..b1c57be07 100644 --- a/src/org/infinity/resource/video/MveVideoDecoder.java +++ b/src/org/infinity/resource/video/MveVideoDecoder.java @@ -14,6 +14,7 @@ import org.infinity.resource.video.MveDecoder.MveInfo; import org.infinity.resource.video.MveDecoder.MveSegment; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * Decodes a single 8x8 pixel block of video data. (Internally used by MveDecoder) @@ -1126,7 +1127,7 @@ private void copyBlock8x8(BufferedImage src, int srcX, int srcY, int dstX, int d int srcOfs = srcY * src.getWidth() + srcX; int dstOfs = dstY * curBuffer.getWidth() + dstX; if (srcOfs < 0) { - System.err.println("Debug: copyBlock8x8(src, " + srcX + ", " + srcY + ", " + dstX + ", " + dstY + ")"); + Logger.debug("copyBlock8x8(src, {}, {}, {}, {})", srcX, srcY, dstX, dstY); return; } diff --git a/src/org/infinity/resource/video/WbmResource.java b/src/org/infinity/resource/video/WbmResource.java index f7894378c..5f83f79f2 100644 --- a/src/org/infinity/resource/video/WbmResource.java +++ b/src/org/infinity/resource/video/WbmResource.java @@ -39,6 +39,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class WbmResource implements Resource, Closeable, Referenceable, ActionListener { private final ResourceEntry entry; @@ -76,7 +77,7 @@ public void actionPerformed(ActionEvent event) { JOptionPane.showMessageDialog(NearInfinity.getInstance(), "Error opening video or no application registered " + "to play back WBM (WebM) files.", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); } } } finally { @@ -182,7 +183,7 @@ private Path getVideoFile() { isTempFile = true; FileDeletionHook.getInstance().registerFile(retVal); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); retVal = null; } } diff --git a/src/org/infinity/resource/wmp/ViewerMap.java b/src/org/infinity/resource/wmp/ViewerMap.java index 3eb51cfbe..1d3f6b127 100644 --- a/src/org/infinity/resource/wmp/ViewerMap.java +++ b/src/org/infinity/resource/wmp/ViewerMap.java @@ -69,6 +69,7 @@ import org.infinity.util.Misc; import org.infinity.util.StringTable; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public class ViewerMap extends JPanel { /** Needed to determine map edges to travel from/to. */ @@ -192,7 +193,7 @@ private enum Direction { pInfo.add(lInfoPos); add(pInfo, BorderLayout.SOUTH); } catch (Throwable t) { - t.printStackTrace(); + Logger.error(t); } // applying preselected overlays @@ -673,7 +674,7 @@ private void exportMap() { dstImage.flush(); dstImage = null; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } finally { showDot((AreaEntry) listPanel.getList().getSelectedValue(), false); WindowBlocker.blockWindow(wnd, false); diff --git a/src/org/infinity/search/AbstractSearcher.java b/src/org/infinity/search/AbstractSearcher.java index c6afbe48f..0cbe46ac1 100644 --- a/src/org/infinity/search/AbstractSearcher.java +++ b/src/org/infinity/search/AbstractSearcher.java @@ -16,6 +16,7 @@ import org.infinity.util.DebugTimer; import org.infinity.util.Misc; import org.infinity.util.Threading; +import org.tinylog.Logger; /** * Utility class for performing searching of resources in several threads with ability to cancel search. @@ -145,7 +146,7 @@ protected boolean runSearch(String operation, List entries) { // ignored } - DebugTimer.getInstance().timerShow(operation + " completed", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted(operation + " completed")); if (isCancelled) { JOptionPane.showMessageDialog(parent, operation + " cancelled", "Info", JOptionPane.INFORMATION_MESSAGE); diff --git a/src/org/infinity/search/DialogItemRefSearcher.java b/src/org/infinity/search/DialogItemRefSearcher.java index 52ede113a..df1b8d349 100644 --- a/src/org/infinity/search/DialogItemRefSearcher.java +++ b/src/org/infinity/search/DialogItemRefSearcher.java @@ -18,6 +18,8 @@ import org.infinity.resource.dlg.State; import org.infinity.resource.dlg.StateTrigger; import org.infinity.resource.dlg.Transition; +import org.infinity.util.DebugTimer; +import org.tinylog.Logger; public class DialogItemRefSearcher implements Runnable { private final DlgResource dlg; @@ -38,7 +40,7 @@ public void run() { final List searchItems = dlg.getFields(); ProgressMonitor progress = new ProgressMonitor(parent, "Searching...", null, 0, searchItems.size()); progress.setMillisToDecideToPopup(100); - long startTime = System.currentTimeMillis(); + DebugTimer.getInstance().timerReset(); for (int i = 0; i < searchItems.size(); i++) { StructEntry entry = searchItems.get(i); if (entry instanceof State || entry instanceof Transition || entry instanceof AbstractCode) { @@ -50,7 +52,7 @@ public void run() { return; } } - System.out.println("Search completed: " + (System.currentTimeMillis() - startTime) + "ms."); + Logger.info(DebugTimer.getInstance().getTimerFormatted("Search completed")); hitFrame.setVisible(true); } diff --git a/src/org/infinity/search/DialogSearcher.java b/src/org/infinity/search/DialogSearcher.java index ba6596cea..878b584b8 100644 --- a/src/org/infinity/search/DialogSearcher.java +++ b/src/org/infinity/search/DialogSearcher.java @@ -41,6 +41,7 @@ import org.infinity.resource.dlg.AbstractCode; import org.infinity.resource.dlg.Action; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; public final class DialogSearcher extends AbstractSearcher implements Runnable, ActionListener { private final ChildFrame inputFrame; @@ -192,14 +193,11 @@ protected Runnable newWorker(ResourceEntry entry) { s = decompiler.getSource(); } else { synchronized (System.err) { - System.err.println("Error(s) compiling " + entry.toString() + " - " + searchEntry.getName()); + Logger.error("Error(s) compiling {} - {}", entry.toString(), searchEntry.getName()); } } } catch (Exception ex) { - synchronized (System.err) { - System.err.println("Exception (de)compiling " + entry.toString() + " - " + searchEntry.getName()); - ex.printStackTrace(); - } + Logger.error(ex, "Exception (de)compiling {} - {}", entry.toString(), searchEntry.getName()); } if (s == null) { s = ""; diff --git a/src/org/infinity/search/ReferenceSearcher.java b/src/org/infinity/search/ReferenceSearcher.java index 1ce3087b3..3992f01c5 100644 --- a/src/org/infinity/search/ReferenceSearcher.java +++ b/src/org/infinity/search/ReferenceSearcher.java @@ -34,6 +34,7 @@ import org.infinity.resource.other.EffResource; import org.infinity.resource.sav.SavResource; import org.infinity.resource.text.PlainTextResource; +import org.tinylog.Logger; public final class ReferenceSearcher extends AbstractReferenceSearcher { /** Optional alternate name to search for. */ @@ -57,7 +58,7 @@ public ReferenceSearcher(ResourceEntry targetEntry, String[] fileTypes, Componen } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -127,8 +128,7 @@ private void searchDialog(ResourceEntry entry, AbstractStruct dialog) { } } } catch (Exception e) { - System.out.println("Exception in " + dialog.getName() + " - " + sourceCode.getName()); - e.printStackTrace(); + Logger.error(e, "Exception in {} - {}", dialog.getName(), sourceCode.getName()); } } else if (o instanceof AbstractStruct) { searchDialog(entry, (AbstractStruct) o); @@ -193,7 +193,7 @@ private void searchScript(ResourceEntry entry, BcsResource bcsfile) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -312,7 +312,7 @@ private void searchText(ResourceEntry entry, PlainTextResource text) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/search/SearchFrame.java b/src/org/infinity/search/SearchFrame.java index a51f24003..7714646fb 100644 --- a/src/org/infinity/search/SearchFrame.java +++ b/src/org/infinity/search/SearchFrame.java @@ -50,6 +50,7 @@ import org.infinity.resource.bcs.BcsResource; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; +import org.tinylog.Logger; public final class SearchFrame extends ChildFrame implements ActionListener, ListSelectionListener, Runnable { // private static final SearchFrame SEARCH_FRAME = null; @@ -303,7 +304,7 @@ public void run() { String text = tfield.getText(); regex = Pattern.compile(text, isCase ? 0 : Pattern.CASE_INSENSITIVE); } catch (PatternSyntaxException e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(this, "Regular expression error:\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); return; diff --git a/src/org/infinity/search/SearchResource.java b/src/org/infinity/search/SearchResource.java index 0153fa850..8ad4d2cfb 100644 --- a/src/org/infinity/search/SearchResource.java +++ b/src/org/infinity/search/SearchResource.java @@ -100,6 +100,7 @@ import org.infinity.util.Threading; import org.infinity.util.io.StreamUtils; import org.infinity.util.tuples.Couple; +import org.tinylog.Logger; public class SearchResource extends ChildFrame implements ActionListener, PropertyChangeListener, Runnable { private static final String[] OPTION_PANELS = { "ARE", "CRE", "EFF", "ITM", "PRO", "SPL", "STO", "VVC" }; @@ -129,7 +130,7 @@ public Void doInBackground() { try { init(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -239,10 +240,10 @@ public void run() { try { threadPool.awaitTermination(60, TimeUnit.SECONDS); } catch (InterruptedException e) { - e.printStackTrace(); + Logger.error(e); } } catch (Exception e) { - // ignored + Logger.trace(e); } // preparing results for output @@ -262,7 +263,7 @@ public void run() { } } } finally { - DebugTimer.getInstance().timerShow("Extended Search", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted("Extended Search")); blocker.setBlocked(false); bSearch.setEnabled(true); clBottomBar.show(pBottomBar, "buttons"); @@ -5781,7 +5782,7 @@ public void popupMenuWillBecomeVisible(PopupMenuEvent e) { setSelectedItem(item); } } catch (BadLocationException ble) { - ble.printStackTrace(); + Logger.error(ble); } } @@ -5912,7 +5913,7 @@ private void setText(String text) { super.remove(0, getLength()); super.insertString(0, text, null); } catch (BadLocationException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/search/SongReferenceSearcher.java b/src/org/infinity/search/SongReferenceSearcher.java index 0d401cbab..b0a3ce94d 100644 --- a/src/org/infinity/search/SongReferenceSearcher.java +++ b/src/org/infinity/search/SongReferenceSearcher.java @@ -26,6 +26,7 @@ import org.infinity.util.IdsMap; import org.infinity.util.IdsMapCache; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Performs search of the specified song in the {@link AreResource areas}, {@link BcsResource scripts} and @@ -103,7 +104,7 @@ private void searchBcs(ResourceEntry entry, BcsResource bcs) { String text = decompiler.decompile(); searchText(entry, null, text); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/search/StringReferenceSearcher.java b/src/org/infinity/search/StringReferenceSearcher.java index 8e935af87..8a6a79fa2 100644 --- a/src/org/infinity/search/StringReferenceSearcher.java +++ b/src/org/infinity/search/StringReferenceSearcher.java @@ -25,6 +25,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.resource.sav.SavResource; import org.infinity.resource.text.PlainTextResource; +import org.tinylog.Logger; /** Performs search of the specified string reference in other resources. */ public final class StringReferenceSearcher extends AbstractReferenceSearcher { @@ -101,8 +102,7 @@ private void searchDialog(ResourceEntry entry, AbstractStruct dialog) { } } } catch (Exception e) { - System.out.println("Exception in " + dialog.getName() + " - " + sourceCode.getName()); - e.printStackTrace(); + Logger.error(e, "Exception in {} - {}", dialog.getName(), sourceCode.getName()); } } else if (o instanceof AbstractStruct) { searchDialog(entry, (AbstractStruct) o); @@ -141,7 +141,7 @@ private void searchScript(ResourceEntry entry, BcsResource bcsfile) { } } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/search/TextResourceSearcher.java b/src/org/infinity/search/TextResourceSearcher.java index 8dc6bf83a..d3a520a26 100644 --- a/src/org/infinity/search/TextResourceSearcher.java +++ b/src/org/infinity/search/TextResourceSearcher.java @@ -32,6 +32,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.TextResource; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; public final class TextResourceSearcher extends AbstractSearcher implements Runnable, ActionListener { private final ChildFrame inputFrame; @@ -177,9 +178,7 @@ protected Runnable newWorker(ResourceEntry entry) { } } } catch (IOException e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } advanceProgress(); diff --git a/src/org/infinity/search/advanced/AdvancedSearch.java b/src/org/infinity/search/advanced/AdvancedSearch.java index f1c28fcf4..eeec7bdc5 100644 --- a/src/org/infinity/search/advanced/AdvancedSearch.java +++ b/src/org/infinity/search/advanced/AdvancedSearch.java @@ -78,6 +78,7 @@ import org.infinity.util.Misc; import org.infinity.util.SimpleListModel; import org.infinity.util.Threading; +import org.tinylog.Logger; public class AdvancedSearch extends ChildFrame implements Runnable { /** Indicates how to evaluate filter matches against a resource. */ @@ -175,7 +176,7 @@ public Void doInBackground() { try { init(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return null; } @@ -570,7 +571,7 @@ public void run() { try { threadPool.awaitTermination(60, TimeUnit.SECONDS); } catch (InterruptedException e) { - e.printStackTrace(); + Logger.error(e); } } catch (Exception e) { // ignored @@ -596,7 +597,7 @@ public void run() { lResultsStatus.setText(String.format("(%d match%s in %d resource%s found)", found.size(), found.size() == 1 ? "" : "es", resourceCount, resourceCount == 1 ? "" : "s")); } finally { - DebugTimer.getInstance().timerShow("Advanced Search", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted("Advanced Search")); blocker.setBlocked(false); bSearch.setEnabled(true); clBottomBar.show(pBottomBar, STATUS_BUTTONS); @@ -676,7 +677,7 @@ private boolean importConfig(File xmlFile) { filterList.setSelectedIndex(0); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return false; } return true; @@ -688,7 +689,7 @@ private boolean exportConfig(File xmlFile) { return XmlConfig.Export(xmlFile, cbResourceTypes.getSelectedItem().toString(), getSelectedFilterMode(), getSearchOptions()); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); return false; } } diff --git a/src/org/infinity/search/advanced/AdvancedSearchWorker.java b/src/org/infinity/search/advanced/AdvancedSearchWorker.java index 9eda495d5..f9ecd1730 100644 --- a/src/org/infinity/search/advanced/AdvancedSearchWorker.java +++ b/src/org/infinity/search/advanced/AdvancedSearchWorker.java @@ -24,6 +24,7 @@ import org.infinity.resource.StructEntry; import org.infinity.resource.key.ResourceEntry; import org.infinity.search.ReferenceHitFrame; +import org.tinylog.Logger; /** * Worker class for performing a full match against a resource entry. @@ -203,7 +204,7 @@ private void collapseGroupFilters(Map, Set> groupCache iter.remove(); } } else { - System.err.println("Skipping unidentified group match"); + Logger.warn("Skipping unidentified group match"); iter.remove(); } } diff --git a/src/org/infinity/search/advanced/FilterInput.java b/src/org/infinity/search/advanced/FilterInput.java index f54b115fc..184e73a58 100644 --- a/src/org/infinity/search/advanced/FilterInput.java +++ b/src/org/infinity/search/advanced/FilterInput.java @@ -71,6 +71,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.resource.ui.ResourceListModel; import org.infinity.util.DataString; +import org.tinylog.Logger; /** * Input dialog for a advanced search filter definition. @@ -921,7 +922,7 @@ private void signalAwait(String name, int timeoutMs) { } signal.await(timeoutMs, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/search/advanced/XmlConfig.java b/src/org/infinity/search/advanced/XmlConfig.java index dc42e07a5..3b7166c41 100644 --- a/src/org/infinity/search/advanced/XmlConfig.java +++ b/src/org/infinity/search/advanced/XmlConfig.java @@ -27,6 +27,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.tinylog.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -151,7 +152,7 @@ public static boolean Export(OutputStream xmlOut, String resourceType, AdvancedS try { builder = domFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { - e.printStackTrace(); + Logger.error(e); return false; } Document document = builder.newDocument(); @@ -318,7 +319,7 @@ public static boolean Export(OutputStream xmlOut, String resourceType, AdvancedS StreamResult sr = new StreamResult(xmlOut); transformer.transform(domSource, sr); } catch (TransformerException e) { - e.printStackTrace(); + Logger.error(e); return false; } @@ -386,17 +387,17 @@ public static XmlConfig Import(InputStream xmlIn) throws IOException, ParserConf builder.setErrorHandler(new ErrorHandler() { @Override public void warning(SAXParseException exception) throws SAXException { - exception.printStackTrace(); + Logger.error(exception); } @Override public void fatalError(SAXParseException exception) throws SAXException { - exception.printStackTrace(); + Logger.error(exception); } @Override public void error(SAXParseException exception) throws SAXException { - exception.printStackTrace(); + Logger.error(exception); } }); @@ -1028,7 +1029,7 @@ private int parseNumber(String text) throws NumberFormatException { // sb.append(c); // isEntity = true; // } catch (NumberFormatException e) { - // e.printStackTrace(); + // Logger.error(e); // } // } // } diff --git a/src/org/infinity/tinylog.License.txt b/src/org/infinity/tinylog.License.txt new file mode 100644 index 000000000..f433b1a53 --- /dev/null +++ b/src/org/infinity/tinylog.License.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/src/org/infinity/updater/UpdateInfo.java b/src/org/infinity/updater/UpdateInfo.java index 2f2f0c433..1405a9eb2 100644 --- a/src/org/infinity/updater/UpdateInfo.java +++ b/src/org/infinity/updater/UpdateInfo.java @@ -28,6 +28,7 @@ import org.infinity.util.tuples.Couple; import org.json.JSONArray; import org.json.JSONObject; +import org.tinylog.Logger; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; @@ -570,7 +571,7 @@ private void parseJson(String jsonString) throws Exception { reactions = new Reactions(root.getJSONObject(key)); break; default: - System.out.printf("Release parser: Skipping unknown key \"%s\"\n", key); + Logger.info("Release parser: Skipping unknown key \"{}\"", key); } } @@ -722,7 +723,7 @@ private User(JSONObject jsonUser) throws Exception { siteAdmin = root.getBoolean(key); break; default: - System.out.printf("User parser: Skipping unknown key \"%s\"\n", key); + Logger.info("User parser: Skipping unknown key \"{}\"", key); } } @@ -870,7 +871,7 @@ private Asset(JSONObject jsonAsset) throws Exception { browserDownloadUrl = new URL(root.getString(key)); break; default: - System.out.printf("Asset parser: Skipping unknown key \"%s\"\n", key); + Logger.info("Asset parser: Skipping unknown key \"{}\"", key); } } @@ -972,7 +973,7 @@ private Reactions(JSONObject jsonReactions) throws Exception { eyes = root.getInt(key); break; default: - System.out.printf("Reactions parser: Skipping unknown key \"%s\"\n", key); + Logger.info("Reactions parser: Skipping unknown key \"{}\"", key); } } diff --git a/src/org/infinity/updater/Updater.java b/src/org/infinity/updater/Updater.java index 77a0521f9..1354a595a 100644 --- a/src/org/infinity/updater/Updater.java +++ b/src/org/infinity/updater/Updater.java @@ -30,6 +30,7 @@ import org.infinity.NearInfinity; import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; +import org.tinylog.Logger; /** * Provides functions for checking, downloading and updating new versions of Near Infinity. @@ -545,7 +546,7 @@ public void loadUpdateSettings() { try { autoCheckDate = Utils.getDateTimeFromString(dateTime); } catch (DateTimeParseException e) { - System.out.println("DateTimeParseException: " + e.getMessage()); + Logger.warn("DateTimeParseException: {}", e.getMessage()); autoCheckDate = OffsetDateTime.now(); } diff --git a/src/org/infinity/updater/Utils.java b/src/org/infinity/updater/Utils.java index 561b86ee0..9296c070f 100644 --- a/src/org/infinity/updater/Utils.java +++ b/src/org/infinity/updater/Utils.java @@ -46,6 +46,7 @@ import org.infinity.util.LauncherUtils; import org.infinity.util.io.FileEx; +import org.tinylog.Logger; /** * Generic collection of updater-related methods. @@ -187,7 +188,7 @@ public static String generateMD5Hash(InputStream is) { return sb.toString(); } catch (NoSuchAlgorithmException | IOException ioe) { - ioe.printStackTrace(); + Logger.error(ioe); } } return ""; diff --git a/src/org/infinity/util/CharsetDetector.java b/src/org/infinity/util/CharsetDetector.java index c7f1f53d4..7473879ff 100644 --- a/src/org/infinity/util/CharsetDetector.java +++ b/src/org/infinity/util/CharsetDetector.java @@ -16,6 +16,7 @@ import org.infinity.resource.Profile; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * This class provides methods to determine character sets and conversions for selected games and languages. @@ -190,7 +191,7 @@ public static String guessCharset(boolean detect) { } ch.close(); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/util/CreMapCache.java b/src/org/infinity/util/CreMapCache.java index 70deb28f3..04a024ada 100644 --- a/src/org/infinity/util/CreMapCache.java +++ b/src/org/infinity/util/CreMapCache.java @@ -19,6 +19,7 @@ import org.infinity.resource.are.AreResource; import org.infinity.resource.cre.CreResource; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; /** * Maintains a list of script names to CRE resource mappings. @@ -166,10 +167,10 @@ private static void initialize() { try { threadPool.awaitTermination(60, TimeUnit.SECONDS); } catch (InterruptedException e) { - e.printStackTrace(); + Logger.error(e); } } catch (Exception e) { - // ignored + Logger.trace(e); } if (statusBar != null && statusBar.getMessage().startsWith(message)) { @@ -196,9 +197,7 @@ public void run() { try { CreResource.addScriptName(SCRIPT_NAMES_CRE, entry); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } @@ -215,9 +214,7 @@ public void run() { try { AreResource.addScriptNames(SCRIPT_NAMES_ARE, entry.getResourceBuffer()); } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } @@ -250,9 +247,7 @@ public void run() { } } } catch (Exception e) { - synchronized (System.err) { - e.printStackTrace(); - } + Logger.error(e); } } } diff --git a/src/org/infinity/util/DebugTimer.java b/src/org/infinity/util/DebugTimer.java index 0b82f8eac..4011f8143 100644 --- a/src/org/infinity/util/DebugTimer.java +++ b/src/org/infinity/util/DebugTimer.java @@ -58,7 +58,11 @@ public String toString(long nanos) { /** Static class instance for global access to the timer. */ private static final DebugTimer INSTANCE = new DebugTimer(); - /** Provides access to the global instance of the {@code Debugging} class. */ + /** + * Provides access to the global instance of the {@code DebugTimer} class. + * + *

The global {@code DebugTimer} instance defines {@link TimeFormat#MILLISECONDS} as default.

+ */ public static synchronized DebugTimer getInstance() { return INSTANCE; } @@ -68,7 +72,7 @@ public static synchronized DebugTimer getInstance() { /** Creates a new {@code Debugging} object with the default time format {@link TimeFormat#MILLISECONDS}. */ public DebugTimer() { - this(null); + this(TimeFormat.MILLISECONDS); } /** @@ -88,29 +92,49 @@ public synchronized DebugTimer timerReset() { } /** - * Shows the elapsed time in the default time format and resets timer. + * Prints the elapsed time in the default time format. * - * @param message Display an optional message + * @return A formatted string of the elapsed time. */ - public DebugTimer timerShow(String message) { - return timerShow(message, getDefaultTimeFormat()); + public String getTimerFormatted() { + return getTimerFormatted(null, getDefaultTimeFormat()); } /** - * Shows the elapsed time in the specified time format. + * Prints the elapsed time in the specified time format. * - * @param message Display an optional message - * @param format The temporal resolution of the elapsed time + * @param format The temporal resolution of the elapsed time. + * @return A formatted string of the elapsed time. + */ + public String getTimerFormatted(TimeFormat format) { + return getTimerFormatted(null, format); + } + + /** + * Prints the elapsed time in the default time format with an optional message. + * + * @param message Optional message to show. Specify {@code null} or an empty string to omit this message. + * @return A formatted string with optional message and elapsed time. */ - public DebugTimer timerShow(String message, TimeFormat format) { + public String getTimerFormatted(String message) { + return getTimerFormatted(message, getDefaultTimeFormat()); + } + + /** + * Prints the elapsed time in the specified time format with an optional message. + * + * @param message Optional message to show. Specify {@code null} or an empty string to omit this message. + * @param format The temporal resolution of the elapsed time. + * @return A formatted string with optional message and elapsed time. + */ + public String getTimerFormatted(String message, TimeFormat format) { final long timeDiff = timerGetRaw(); format = getTimeFormat(format); if (message != null && !message.isEmpty()) { - System.out.println("[" + message + "] " + format.toString(timeDiff)); + return "[" + message + "] " + format.toString(timeDiff); } else { - System.out.println(format.toString(timeDiff)); + return format.toString(timeDiff); } - return this; } /** @@ -142,9 +166,16 @@ public TimeFormat getDefaultTimeFormat() { * Defines a new default {@link TimeFormat} for use with the non-parameterized methods for getting the * timer value. * + *

Note: The time format cannot be modified for the global {@code DebugTimer} instance + * and throws a {@link UnsupportedOperationException}.

+ * * @param newTimeFormat new default {@link TimeFormat}. + * @throws UnsupportedOperationException if this method is invoked by the global {@link DebugTimer} instance. */ public void setDefaultTimeFormat(TimeFormat newTimeFormat) { + if (this == INSTANCE) { + throw new UnsupportedOperationException("Default time format cannot be modified for the global instance"); + } this.defaultFormat = (newTimeFormat != null) ? newTimeFormat : TimeFormat.MILLISECONDS; } diff --git a/src/org/infinity/util/IdsMap.java b/src/org/infinity/util/IdsMap.java index 338144beb..0475def61 100644 --- a/src/org/infinity/util/IdsMap.java +++ b/src/org/infinity/util/IdsMap.java @@ -34,7 +34,7 @@ public IdsMap(ResourceEntry entry) throws Exception { parse2DA(); } // } catch (Exception e) { -// e.printStackTrace(); +// Logger.error(e); // } } diff --git a/src/org/infinity/util/IdsMapCache.java b/src/org/infinity/util/IdsMapCache.java index 2fb87a3d3..91f6a0dfd 100644 --- a/src/org/infinity/util/IdsMapCache.java +++ b/src/org/infinity/util/IdsMapCache.java @@ -16,6 +16,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.bcs.ScriptInfo; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; public class IdsMapCache { /** Maps upper-cased name of IDS resource to parsed resource. */ @@ -53,7 +54,7 @@ public static synchronized IdsMap get(String name) { if (name.equals("ATTSTYLE.IDS")) { entry = ResourceFactory.getResourceEntry("ATTSTYL.IDS"); } else { - System.err.println("Could not find " + name); + Logger.warn("Could not find {}", name); } } if (entry != null) { @@ -61,7 +62,7 @@ public static synchronized IdsMap get(String name) { retVal = new IdsMap(entry); CACHE.put(name, retVal); } catch (Exception e) { - System.err.println(e.getMessage()); + Logger.warn("{}: {}", e.getClass().getSimpleName(), e.getMessage()); } } } diff --git a/src/org/infinity/util/IniMap.java b/src/org/infinity/util/IniMap.java index dda362d4e..262cd46bf 100644 --- a/src/org/infinity/util/IniMap.java +++ b/src/org/infinity/util/IniMap.java @@ -14,6 +14,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Parses Infinity Engine INI files. @@ -215,7 +216,7 @@ private static String readResource(ResourceEntry entry) { final ByteBuffer bb = entry.getResourceBuffer(); return StreamUtils.readString(bb, bb.limit(), Misc.CHARSET_DEFAULT); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } return null; diff --git a/src/org/infinity/util/IniMapCache.java b/src/org/infinity/util/IniMapCache.java index 15d2329fd..28edbaf89 100644 --- a/src/org/infinity/util/IniMapCache.java +++ b/src/org/infinity/util/IniMapCache.java @@ -9,6 +9,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.key.ResourceEntry; +import org.tinylog.Logger; public class IniMapCache { private static final HashMap MAP = new HashMap<>(); @@ -35,7 +36,7 @@ public static IniMap get(String name, boolean ignoreComments) { if (entry != null) { retVal = get(entry, ignoreComments); } else { - System.err.println("Could not find " + name); + Logger.warn("Could not find {}", name); } } return retVal; diff --git a/src/org/infinity/util/IniMapEntry.java b/src/org/infinity/util/IniMapEntry.java index 01be7f56f..bb627a6b7 100644 --- a/src/org/infinity/util/IniMapEntry.java +++ b/src/org/infinity/util/IniMapEntry.java @@ -11,6 +11,7 @@ import java.util.regex.PatternSyntaxException; import org.infinity.datatype.StringRef; +import org.tinylog.Logger; public class IniMapEntry { /** Regular expression that can be used to split position values in {@link #splitValues(String, String)}. */ @@ -108,7 +109,7 @@ public static String[] splitValues(String value, String pattern) { results.add(value.substring(matcher.start(), matcher.end())); } } catch (PatternSyntaxException e) { - e.printStackTrace(); + Logger.error(e); } retVal = new String[results.size()]; for (int i = 0; i < results.size(); i++) { @@ -138,7 +139,7 @@ public static int[] splitObjectValue(String value) { try { retVal[i] = Integer.parseInt(results.get(i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -165,7 +166,7 @@ public static int[] splitPositionValue(String value) { try { retVal[i] = Integer.parseInt(results.get(i)); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/util/LauncherUtils.java b/src/org/infinity/util/LauncherUtils.java index 368c52eae..bf2da40f0 100644 --- a/src/org/infinity/util/LauncherUtils.java +++ b/src/org/infinity/util/LauncherUtils.java @@ -12,6 +12,8 @@ import java.net.URL; import java.nio.file.Path; +import org.tinylog.Logger; + /** * A helper class for launching default applications associated with the specified file or URL arguments. */ @@ -140,7 +142,7 @@ private static boolean xdgOpen(String arg) { p.waitFor(); retVal = true; } catch (IOException | InterruptedException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/util/MassExporter.java b/src/org/infinity/util/MassExporter.java index 90c1b5628..7e7547663 100644 --- a/src/org/infinity/util/MassExporter.java +++ b/src/org/infinity/util/MassExporter.java @@ -86,6 +86,7 @@ import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; public final class MassExporter extends ChildFrame implements ActionListener, ListSelectionListener, DocumentListener, Runnable { private static final String FMT_PROGRESS = "Processing resource %d/%d"; @@ -301,7 +302,7 @@ public void actionPerformed(ActionEvent event) { try { pattern = getPattern(); } catch (IllegalArgumentException e) { - e.printStackTrace(); + Logger.error(e); JOptionPane.showMessageDialog(this, e.getMessage(), "Pattern syntax error", JOptionPane.ERROR_MESSAGE); if (e instanceof PatternSyntaxException) { final int index = ((PatternSyntaxException)e).getIndex(); @@ -319,7 +320,7 @@ public void actionPerformed(ActionEvent event) { Files.createDirectories(outputPath); } catch (IOException e) { JOptionPane.showMessageDialog(this, "Unable to create target directory.", "Error", JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); + Logger.error(e); return; } setVisible(false); @@ -458,7 +459,7 @@ public void run() { } selectedFiles = null; } - DebugTimer.getInstance().timerShow("Mass export completed", DebugTimer.TimeFormat.MILLISECONDS); + Logger.info(DebugTimer.getInstance().getTimerFormatted("Mass export completed")); } // --------------------- End Interface Runnable --------------------- @@ -679,13 +680,13 @@ private void extractBamFrames(ResourceEntry entry, Path output) throws Exception Files.createDirectory(path); } catch (IOException e) { String msg = String.format("Error creating folder \"%s\". Skipping file \"%s\".", fileBase, fileName); - System.err.println(msg); + Logger.warn(msg); JOptionPane.showMessageDialog(NearInfinity.getInstance(), msg, "Error", JOptionPane.ERROR_MESSAGE); return; } } else if (!FileEx.create(path).isDirectory()) { String msg = String.format("Folder \"%s\" can not be created. Skipping file \"%s\".", fileBase, fileName); - System.err.println(msg); + Logger.warn(msg); JOptionPane.showMessageDialog(NearInfinity.getInstance(), msg, "Error", JOptionPane.ERROR_MESSAGE); return; } @@ -715,7 +716,7 @@ private void chrToCre(ResourceEntry entry, Path output) throws Exception { private void exportResource(ResourceEntry entry, Path output) throws Exception { if (entry != null && output != null) { - System.err.println("Converting " + entry.toString()); + Logger.info("Converting {}", entry.toString()); int[] info = entry.getResourceInfo(); int size = info[0]; if (info.length > 1) { @@ -812,8 +813,8 @@ private void export(ResourceEntry entry) { exportResource(entry, output); } } catch (Exception e) { - System.err.println("Error in resource: " + entry.toString()); - e.printStackTrace(); + Logger.error(e, "Error in resource: {}", entry); + } } diff --git a/src/org/infinity/util/StringTable.java b/src/org/infinity/util/StringTable.java index cf50767f3..c2b5aaaac 100644 --- a/src/org/infinity/util/StringTable.java +++ b/src/org/infinity/util/StringTable.java @@ -29,6 +29,7 @@ import org.infinity.updater.Utils; import org.infinity.util.io.FileEx; import org.infinity.util.io.StreamUtils; +import org.tinylog.Logger; /** * Provides operations for reading, writing and querying information about string tables. @@ -129,7 +130,7 @@ public static boolean setCharset(String cs) { retVal = true; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } @@ -712,7 +713,7 @@ public static boolean writeModified(Type type, ProgressCallback callback) { instance(type)._writeModified(callback); retVal = true; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -783,7 +784,7 @@ public static boolean exportText(Type type, Path outFile, ProgressCallback callb instance(type)._exportText(outFile, callback); retVal = true; } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } return retVal; @@ -931,7 +932,7 @@ public static boolean exportTra(Path outFile, ProgressCallback callback) { writer.println(); } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); retVal = false; } finally { if (callback != null) { @@ -1016,7 +1017,7 @@ private int _getTranslatedIndex(int index) { entriesVirtual.put(index, strref); index = strref; } catch (NumberFormatException e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1109,7 +1110,7 @@ private void _init() { entriesPending = numEntries; initialized = true; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1160,7 +1161,7 @@ private StringEntry _loadEntry(FileChannel ch, int index) text = CharsetDetector.getLookup().decodeString(text); } } catch (IllegalArgumentException e) { - System.err.println("Error: Illegal offset " + ofsString + " for string entry " + index); + Logger.error("Error: Illegal offset {} for string entry {}", ofsString, index); text = ""; } } else { @@ -1222,7 +1223,7 @@ private void _ensureFullyLoaded() { } entriesPending = 0; } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1242,7 +1243,7 @@ private void _ensureIndexIsLoaded(int index) { throw new Exception(); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } @@ -1646,7 +1647,7 @@ public void fillList(int index) { addField(e); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/util/StructClipboard.java b/src/org/infinity/util/StructClipboard.java index dd7b23487..f633c5103 100644 --- a/src/org/infinity/util/StructClipboard.java +++ b/src/org/infinity/util/StructClipboard.java @@ -21,6 +21,7 @@ import org.infinity.resource.cre.CreResource; import org.infinity.resource.itm.ItmResource; import org.infinity.resource.spl.SplResource; +import org.tinylog.Logger; public final class StructClipboard { public static final int CLIPBOARD_EMPTY = 0; @@ -178,7 +179,7 @@ public int paste(AbstractStruct targetStruct) { ++i; } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } return lastIndex; } @@ -200,7 +201,7 @@ public int pasteValue(AbstractStruct struct, int index) { struct.setField(index + i, newEntry); } } catch (CloneNotSupportedException e) { - e.printStackTrace(); + Logger.error(e); return 0; } return contents.size(); @@ -219,7 +220,7 @@ private void copy(AbstractStruct struct, int firstIndex, int lastIndex, boolean contents.add(entry.clone()); } } catch (CloneNotSupportedException e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/util/Table2da.java b/src/org/infinity/util/Table2da.java index fdc2a99f8..5c030d2b5 100644 --- a/src/org/infinity/util/Table2da.java +++ b/src/org/infinity/util/Table2da.java @@ -10,6 +10,7 @@ import org.infinity.resource.ResourceFactory; import org.infinity.resource.key.ResourceEntry; import org.infinity.resource.text.PlainTextResource; +import org.tinylog.Logger; /** * Stores content of a 2DA resource as table. @@ -187,7 +188,7 @@ private void init(ResourceEntry entry) { defaultValue = new Entry(this, "0", 1, 0); } } catch (Exception e) { - e.printStackTrace(); + Logger.error(e); } } diff --git a/src/org/infinity/util/io/DlcManager.java b/src/org/infinity/util/io/DlcManager.java index 407136aa8..cee51db46 100644 --- a/src/org/infinity/util/io/DlcManager.java +++ b/src/org/infinity/util/io/DlcManager.java @@ -16,6 +16,7 @@ import org.infinity.util.io.zip.DlcFileSystem; import org.infinity.util.io.zip.DlcFileSystemProvider; +import org.tinylog.Logger; /** * Manages available DLCs used by the current game. @@ -106,7 +107,7 @@ private Path _queryKey(Path path) { return key; } } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } } } diff --git a/src/org/infinity/util/io/FileManager.java b/src/org/infinity/util/io/FileManager.java index 90f55aef3..184ae60ec 100644 --- a/src/org/infinity/util/io/FileManager.java +++ b/src/org/infinity/util/io/FileManager.java @@ -18,6 +18,8 @@ import java.util.Locale; import java.util.Objects; +import org.tinylog.Logger; + /** * Central hub for accessing game-related I/O resources. @@ -336,7 +338,7 @@ private static Path queryPath(List rootPaths, String[] paths, boolean must break; } } catch (IllegalArgumentException e) { -// e.printStackTrace(); + Logger.trace(e); } } } diff --git a/src/org/infinity/util/io/StreamUtils.java b/src/org/infinity/util/io/StreamUtils.java index b771501cb..b4cead272 100644 --- a/src/org/infinity/util/io/StreamUtils.java +++ b/src/org/infinity/util/io/StreamUtils.java @@ -23,6 +23,7 @@ import java.util.zip.ZipOutputStream; import org.infinity.util.Misc; +import org.tinylog.Logger; /** * Collection of useful stream- and buffer-based operations. @@ -215,7 +216,7 @@ public static int copyBytes(ByteBuffer src, int srcOffset, ByteBuffer dst, int d bufTmp.limit(bufTmp.position() + maxLength); dst.put(bufTmp); } catch (Throwable t) { - t.printStackTrace(); + Logger.error(t); } finally { src.position(srcPos); dst.position(dstPos); @@ -783,7 +784,7 @@ public static void createZip(Path sourceDir, Path zipFile, boolean includeFolder Files.copy(path, zos); zos.closeEntry(); } catch (IOException e) { - e.printStackTrace(); + Logger.error(e); } }); } diff --git a/src/org/infinity/util/io/zip/ZipCoder.java b/src/org/infinity/util/io/zip/ZipCoder.java index 67d944d09..71e78573b 100644 --- a/src/org/infinity/util/io/zip/ZipCoder.java +++ b/src/org/infinity/util/io/zip/ZipCoder.java @@ -44,6 +44,8 @@ import java.nio.charset.CodingErrorAction; import java.util.Arrays; +import org.tinylog.Logger; + /** * Utility class for zipfile name and comment decoding and encoding. */ @@ -139,7 +141,7 @@ static ZipCoder get(String csn) { try { return new ZipCoder(Charset.forName(csn)); } catch (Throwable t) { - t.printStackTrace(); + Logger.error(t); } return new ZipCoder(Charset.defaultCharset()); } diff --git a/src/tinylog.properties b/src/tinylog.properties new file mode 100644 index 000000000..217bf6ccd --- /dev/null +++ b/src/tinylog.properties @@ -0,0 +1,5 @@ +writer = console +writer.level = debug +writer.format = {level}: {message} +writer.stream = err@WARN +writingthread = true