[
  {
    "path": ".gitattributes",
    "content": "# Tell github that waf build script is python.\nwscript linguist-language=python\nwscript-build linguist-language=python\n \n# Prevent issues with Windows MSYS.\n*.sh eol=lf\n\n# Don't count the translation files in the language stats\npo/* linguist-vendored\n"
  },
  {
    "path": ".gitignore",
    "content": "# build directories.\nbuild/\nbuild-win32/\n\n# Waf files/folders\n.waf-*\n.lock-*\n\n# Binary.\nRicin\n\n# AStyle orig files.\n*.orig\n\n# Ghostwriter (Markdown editor) backup files\n*.backup\n\n# gdb logs.\n.gdb_history\n\n# this is a vala project.\n*.c\n\n# Glade stupid temp files.\n*.ui~\n*.ui#\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: vala\nsudo: required\ndist: trusty\ncompiler:\n - gcc\n - clang\ncache: ccache\nenv:\n  - DISPLAY=:99.0\n\nnotifications:\n email: false\n irc:\n  channels:\n   - \"chat.freenode.net#ricin-dev\"\n  on_success: change\n  on_failure: always\n\ninstall:\n# Utils\n - sudo apt-add-repository ppa:vala-team/ppa -y\n - sudo apt-add-repository ppa:mc3man/trusty-media -y\n - sudo apt-get update -q\n - sudo apt-get install -y checkinstall build-essential intltool texinfo libgtk-3-dev libglib2.0-dev libgdk-pixbuf2.0-dev libsoup2.4-dev libjson-glib-dev libnotify-bin python3 python valac-0.30 libnotify-dev libopus-dev ffmpeg lcov\n - sudo add-apt-repository ppa:rebuntu16/glade-3.19+-trusty -y # Ricin requires Gtk+3 > 3.18\n - sudo apt-get update -q\n - sudo apt-get install -y gtk+3.0 libgtk-3-0 libgtk-3-dev\n\nbefore_script:\n# Gcovr\n - wget https://github.com/eraserix/gcovr/archive/3.1.tar.gz\n - tar -xvf 3.1.tar.gz\n - cd gcovr-3.1\n - sudo python setup.py install\n - cd ..\n# filter_audio\n - git clone https://github.com/irungentoo/filter_audio\n - cd filter_audio\n - make -j$(nproc)\n - sudo make install\n - cd ..\n# libsodium\n - git clone git://github.com/jedisct1/libsodium.git\n - cd libsodium\n - git checkout tags/1.0.3\n - ./autogen.sh\n - ./configure && make -j$(nproc)\n - sudo checkinstall --install --pkgname libsodium --pkgversion 1.0.0 --nodoc -y\n - sudo ldconfig\n - cd ..\n# Toxcore\n - git clone https://github.com/irungentoo/toxcore.git\n - cd toxcore\n - autoreconf -if\n - ./configure\n - make -j$(nproc)\n - sudo make install\n - echo '/usr/local/lib/' | sudo tee -a /etc/ld.so.conf.d/locallib.conf\n - sudo ldconfig\n - cd ..\n\nscript:\n - mkdir dist\n - ./waf distclean # Cleanup.\n - ./waf configure --prefix=/home/travis/build/RicinApp/Ricin/dist # Configure, TODO; Add tests/coverage.\n - ./waf build # Build.\n - sudo ./waf install # And finally install.\n - bash -ex appimage.sh\n"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "content": "## Summary\n* **Operating System + version:**  \n* **Ricin's version:**  \n* **Ricin's commit hash:**  \n* **GTK+ version:**  \n* **ToxCore version:**  \n* **Hardware:**  \n* **Reproducible:**  \n\n<!-- Always / Almost Always / Sometimes / Rarely / Couldn't Reproduce -->\n\n## Steps to reproduce:\n<!-- Please provide detailed steps in order for us to reproduce the issue -->\n\n1.  \n2.  \n3.  \n\n## Observed Behavior:\n<!-- Explain what is wrong, basically describe your issue here -->\n\n## Expected Behavior:\n<!-- Explain what should happen instead of the issue -->\n\n## Additional infos:\n<!-- Links, images, videos, etc goes here.. -->\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    A secure, simple, lightweight but powerfull instant messaging client written in Vala and using ToxCore & GTK+3\n    Copyright (C) 2015 SkyzohKey, Benwaffle, gmscs, Ogromny and the other contributors.\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    Ricin  Copyright (C) 2015  SkyzohKey, Benwaffle, gmscs, Ogromny and the other contributors.\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: autogen build debug install style nodesfile pot changelog reset-settings\n\nautogen:\n\t./waf distclean\n\t./waf configure --prefix=/usr/\n\nbuild:\n\t./waf build\n\ndebug: build\n\tG_MESSAGES_DEBUG=all GOBJECT_DEBUG=instance-count gdb -ex run ./build/Ricin\n\ninstall: build\n\t./waf install\n\nstyle:\n\tastyle \\\n\t\t--style=attach \\\n\t\t--indent=spaces=2 \\\n\t\t--indent-namespaces \\\n\t\t--indent-switches \\\n\t\t--add-brackets \\\n\t\tsrc/*.vala\n\nlint:\n\twget https://framagit.org/valse/vala-style/raw/master/style.rb\n\truby style.rb\n\trm style.rb*\n\nnodesfile:\n\twget -O res/nodes.json https://build.tox.chat/job/nodefile_build_linux_x86_64_release/lastSuccessfulBuild/artifact/Nodefile.json\n\npot:\n\txgettext --language=C --language=Glade \\\n\t--keyword=_ --escape --sort-output \\\n\t-o po/ricin.pot \\\n\tsrc/*.vala \\\n\tres/ui/*.ui\n\nchangelog:\n\tclog -T markdown -F -r https://github.com/RicinApp/Ricin -o docs/CHANGELOG.md\n\nreset-settings:\n\t@echo -e \"\\e[93m\\e[1mλ Deleting settings from ~/.config/tox/ricin.json\\e[21m\\e[39m\"\n\t@rm -f ~/.config/tox/ricin.json\n\t@echo -e \"\\e[93m\\e[1mλ Copying settings from ./res/ricin.sample.json to ~/.config/tox/ricin.json\\e[21m\\e[39m\"\n\t@cp -f ./res/ricin.sample.json ~/.config/tox/ricin.json\n\t@echo -e \"\\e[93m\\e[1mλ Succesfuly reset'd settings!\\e[21m\\e[39m\"\n"
  },
  {
    "path": "README.md",
    "content": "# Project discontinued - Please look at [Konv.im](https://github.com/SkyzohKey/Konv) for Ricin v2!\n\n## **Ricin** - A dead-simple but powerful Tox client\n### [Download] - [Install] - [Compile] - [Contribute] - [Translate] - [Donate] - [Discover Vala]\n\n[![Ricin license](https://img.shields.io/badge/license-GPLv3-blue.svg?style=flat)](https://raw.githubusercontent.com/RicinApp/Ricin/master/LICENSE)\n[![Ricin release](https://img.shields.io/github/release/RicinApp/Ricin.svg?style=flat)](https://github.com/RicinApp/Ricin/releases/latest)\n[![Ricin open issues](https://img.shields.io/github/issues/RicinApp/Ricin.svg?style=flat)](https://github.com/RicinApp/Ricin/issues)\n[![Codecov master](https://img.shields.io/codecov/c/github/RicinApp/Ricin/master.svg?style=flat)](https://codecov.io/github/RicinApp/Ricin)\n[![TravisCI](https://img.shields.io/travis/RicinApp/Ricin/master.svg?style=flat)](https://travis-ci.org/RicinApp/Ricin)\n\n# Introduction\n**Ricin** aims to be a _secure_, _lightweight_, _hackable_ and _fully-customizable_ chat client using the awesome and open-source **ToxCore** library. We know that there are several Tox clients but this project was initially made because the other clients are still missing many features that users have been waiting for over many months. Ricin is a simple but powerful cross-platform client written in Vala and using Gtk+ 3.0.\n\n_Screenshot might be outdated but it should give you a general idea of what Ricin is_\n![Early version](http://i.imgur.com/f7np85T.png)\n\n# Download\n## Linux\nYou can download Ricin as an [AppImage](http://appimage.org/). An AppImage is a single file that contains Ricin + the required libraries.  \nThe main goal of this is having Ricin working on every Linux distribution without the hassle of installing any dependency.  \n\nDownloading and running Ricin is simple as doing the following:\n```shell\n# Assuming that the current version is 0.2.1\nwget https://cdn.ricin.im/linux/ricin-0.2.1.app\nchmod a+x ricin-0.2.1.app\n./ricin-0.2.1.app\n```\n\n## Windows\nRicin for Windows can be downloaded at the following URL.  \n*Please note that this is the first release of Ricin for Windows and that it may\ncontains bugs, please report any of them (even the insignifiant ones) via the\nissue tracker.*\n\n* [Ricin for Windows (64 bits)](https://cdn.ricin.im/windows/ricin-0.1.1-win32_x86-64.zip)\n\n# Install\nInstallation instructions are available inside our [INSTALL.md] file. :)\n\n# Compile\nPlease refer to the [INSTALL.md] to install the dependencies on your Linux distribution.\n\n```bash\ngit clone https://github.com/RicinApp/Ricin.git && cd Ricin\nalias waf=$PWD/waf\nwaf configure\nwaf build\n```\n\n# Donate\nThere are plenty of way you can donate to Ricin. All the money received will be used to work at full-time on Ricin. You can even tell us what you want to be worked on by backing an issue!\n- [Paying us a Bounty]\n- **Bitcoin:** btc.ricin.im (OpenAlias) or [3L7B6XAQM27uxfRK8wUQ4fsfja832EKweM](https://blockchain.info/address/3L7B6XAQM27uxfRK8wUQ4fsfja832EKweM)\n- **Litecoin:** ltc.ricin.im (OpenAlias) or [LUDFUqvZkjXCvaroNiap5vXHzMGeTB8F8x](https://bchain.info/LTC/addr/LUDFUqvZkjXCvaroNiap5vXHzMGeTB8F8x)\n- **Other ways:** Ways that are not secure (paypal, etc) are not allowed, sorry. :/\n\n# Translate\nRicin uses Transifex in order to maintain Localization and enable users to help us translating it in their native language.  \nHere's a graphic about the translations' state:\n\n![Translations state for Ricin](https://www.transifex.com/projects/p/ricin/resource/ricinpot/chart/image_png)\n\n## How to translate\nIn order to make a translation, please create an account on Transifex, then [go to this page] and select the language you want to translate it. Transifex will redirect you to a page where you'll be able to translate Ricin's strings.\n\n**Please respect the following rules while translating:**\n- Always use the same markup as the original string.\n- Don't remove trailing spaces if any, they are needed for Ricin to display text correctly.\n- Please try to translate using similar words, don't use funny words.\n- Write the sentences in an imperative way.\n- Translations will be reviewed string by string and parts of it could be rejected it the above rules are not respected.\n\n# Discover Vala\nBefore clicking on any link below, you must know what Vala is and why it is so powerful and easy to use: [What is Vala?]\n\n- [Official Vala website](https://live.gnome.org/Vala)\n- [Official Vala documentation](http://www.valadoc.org)\n- [Download Vala compiler and tools](https://wiki.gnome.org/Projects/Vala/Tools)\n- [The Vala Tutorial](https://wiki.gnome.org/Projects/Vala/Tutorial): (English) (Spanish) (Russian) (Hebrew)\n- [Vala for C# Programmers](https://wiki.gnome.org/Projects/Vala/ValaForCSharpProgrammers)\n- [Vala for Java Programmers](https://wiki.gnome.org/Projects/Vala/ValaForJavaProgrammers): (English) (Russian)\n- [Vala memory management explained](https://wiki.gnome.org/Projects/Vala/ReferenceHandling)\n- [Writing VAPI files](https://wiki.gnome.org/Projects/Vala/LegacyBindings): A document that explains how to write VAPI binding files for a C library.\n\n[Ricin]: https://ricin.im\n[Download]: #download\n[Install]: #install\n[Compile]: #compile\n[Contribute]: docs/CONTRIBUTING.md\n[Translate]: #translate\n[Donate]: #donate\n[Discover Vala]: #discover-vala\n\n[INSTALL.md]: docs/INSTALL.md\n[Paying us a Bounty]: https://www.bountysource.com/teams/RicinApp\n[go to this page]: https://www.transifex.com/ricinapp/ricin/\n[What is Vala?]: https://wiki.gnome.org/Projects/Vala/About\n"
  },
  {
    "path": "appimage.sh",
    "content": "#!/bin/bash\n\n########################################################################\n# Package the binaries built on Travis-CI as an AppImage\n# By Simon Peter 2016\n# For more information, see http://appimage.org/\n########################################################################\n\nexport ARCH=$(arch)\n\nAPP=Ricin\nLOWERAPP=${APP,,}\n\nGIT_REV=$(git rev-parse --short HEAD)\necho $GIT_REV\n\nsudo chown -R $USER /home/travis/build/\n\ncd /home/travis/build/RicinApp/\n\nwget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh\n. ./functions.sh\n\nmv Ricin $APP.AppDir\ncd $APP.AppDir\nmv dist/ usr/\n\nfind .\n\n########################################################################\n# Copy desktop and icon file to AppDir for AppRun to pick them up\n########################################################################\n\nget_apprun\n\nfind . -name *desktop -exec cp {} $LOWERAPP.desktop \\;\nsed -i -e 's|Ricin|ricin|g' $LOWERAPP.desktop\nsed -i -e 's|.svg||g' $LOWERAPP.desktop\n\nwget https://cdn.ricin.im/images/ricin-icon-plain.svg -O $LOWERAPP.svg\n\n########################################################################\n# Copy in the dependencies that cannot be assumed to be available\n# on all target systems\n########################################################################\n\n# Workaround for:\n# undefined symbol: g_type_check_instance_is_fundamentally_a\n# Function g_type_check_instance_is_fundamentally_a was introduced in glib2-2.41.1\n# Bundle libglib-2.0.so.0 - TODO: find a better solution, e.g., downgrade libglib-2.0 at compile time\nmkdir -p ./usr/lib/\ncp $(ldconfig -p | grep libglib-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\n# The following come with glib2 and probably need to be treated together:\ncp $(ldconfig -p | grep libgio-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgmodule-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgobject-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgthread-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libpcre.so.3 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\n\nexport LD_LIBRARY_PATH=/home/travis/build/RicinApp/Ricin.AppImage/usr/lib/:LD_LIBRARY_PATH\ncopy_deps\n\n# Move the libraries to usr/bin\nmove_lib\nmv usr/lib/x86_64-linux-gnu/* usr/local/lib/* usr/lib/\nrm -r usr/lib/x86_64-linux-gnu/ usr/local/lib/\n\n########################################################################\n# Delete stuff that should not go into the AppImage\n########################################################################\n\n# Delete dangerous libraries; see\n# https://github.com/probonopd/AppImages/blob/master/excludelist\ndelete_blacklisted\n\n# In this case we need to override the blacklisting, hence doing it again\ncp $(ldconfig -p | grep libglib-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\n# The following come with glib2 and probably need to be treated together:\ncp $(ldconfig -p | grep libgio-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgmodule-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgobject-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\ncp $(ldconfig -p | grep libgthread-2.0.so.0 | head -n 1 | cut -d \">\" -f 2 | xargs) ./usr/lib/\n\n# We don't bundle the developer stuff\nrm -rf usr/include || true\nrm -rf usr/lib/cmake || true\nrm -rf usr/lib/pkgconfig || true\nfind . -name '*.la' | xargs -i rm {}\nstrip usr/bin/* usr/lib/* || true\n\nrm -rf build docs filter_audio gcovr-* libsodium po res src tools toxcore vapis *.tar.gz codecov.yml ISSUE_TEMPLATE.md Makefile waf wscript \n\n########################################################################\n# desktopintegration asks the user on first run to install a menu item\n########################################################################\n\n( cd usr/bin ; mv Ricin ricin )\nget_desktopintegration $LOWERAPP\n\n########################################################################\n# Determine the version of the app; also include needed glibc version\n########################################################################\n\nGLIBC_NEEDED=$(glibc_needed)\nVERSION=git$GIT_REV-glibc$GLIBC_NEEDED\n\n########################################################################\n# Patch away absolute paths; it would be nice if they were relative\n########################################################################\n\npatch_usr\n\n########################################################################\n# AppDir complete\n# Now packaging it as an AppImage\n########################################################################\n\ncd .. # Go out of AppImage\n\nmkdir -p ../out/\ngenerate_appimage\n\n########################################################################\n# Upload the AppDir\n########################################################################\n\ntransfer ../out/*\n"
  },
  {
    "path": "codecov.yml",
    "content": "codecov:\n  branch: master\n  bot: RicinBot\n\ncoverage:\n  precision: 2\n  round: down\n  range: \"70...100\"\n\ncomment:\n  layout: \"header, diff, changes, sunburst, uncovered\"\n  behavior: default\n"
  },
  {
    "path": "docs/CHANGELOG.md",
    "content": "# Change Log\n\n## [v0.2.3](https://github.com/RicinApp/Ricin/tree/v0.2.3) (2016-07-06)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.2.2...v0.2.3)\n\n**Implemented enhancements:**\n\n- feat\\(emojione\\): add support for EmojiOne font if installed on the system [\\#139](https://github.com/RicinApp/Ricin/pull/139) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.2.2](https://github.com/RicinApp/Ricin/tree/v0.2.2) (2016-07-06)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.2.1...v0.2.2)\n\n**Implemented enhancements:**\n\n- feat\\(chatview-ux\\): multiple UX improvements [\\#138](https://github.com/RicinApp/Ricin/pull/138) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- symbol lookup error: ./lib/libgtk-3.so.0: undefined symbol: g\\_list\\_model\\_get\\_type [\\#135](https://github.com/RicinApp/Ricin/issues/135)\n\n## [v0.2.1](https://github.com/RicinApp/Ricin/tree/v0.2.1) (2016-07-02)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.2.0...v0.2.1)\n\n## [v0.2.0](https://github.com/RicinApp/Ricin/tree/v0.2.0) (2016-07-02)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.1.1...v0.2.0)\n\n**Implemented enhancements:**\n\n- Add profiles encryption/decryption [\\#63](https://github.com/RicinApp/Ricin/issues/63)\n- refactor\\(chatview\\): Add ability to select and copy/quote multiple messages [\\#137](https://github.com/RicinApp/Ricin/pull/137) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Add friend button doesn't work, and button disappears. [\\#131](https://github.com/RicinApp/Ricin/issues/131)\n- AppImage doesn't work on elementary OS 0.3.2 \\(based on Ubuntu 14.04\\) [\\#127](https://github.com/RicinApp/Ricin/issues/127)\n\n**Closed issues:**\n\n- Compiling needs 'intltool' as a dependency [\\#134](https://github.com/RicinApp/Ricin/issues/134)\n- Wrapper should handle avatar caching [\\#28](https://github.com/RicinApp/Ricin/issues/28)\n\n**Merged pull requests:**\n\n- chore\\(appimage\\): also bundle libglib-2.0.so.0 and friends [\\#128](https://github.com/RicinApp/Ricin/pull/128) ([probonopd](https://github.com/probonopd))\n- chore\\(appimage\\): auto-build appimage with travis builds [\\#126](https://github.com/RicinApp/Ricin/pull/126) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.1.1](https://github.com/RicinApp/Ricin/tree/v0.1.1) (2016-05-22)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.1.0...v0.1.1)\n\n**Fixed bugs:**\n\n- Ricin dies with \"Operation not supported\" message [\\#123](https://github.com/RicinApp/Ricin/issues/123)\n\n## [v0.1.0](https://github.com/RicinApp/Ricin/tree/v0.1.0) (2016-05-21)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.9...v0.1.0)\n\n**Implemented enhancements:**\n\n- 2 Factor Auth ? [\\#51](https://github.com/RicinApp/Ricin/issues/51)\n- feat\\(encrypted profiles\\): profile encryption, finally! [\\#121](https://github.com/RicinApp/Ricin/pull/121) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Issue with file containing spaces in name. [\\#52](https://github.com/RicinApp/Ricin/issues/52)\n\n**Closed issues:**\n\n- PGP plugins to encrypt messages before sending them in ToxCore DHT. [\\#13](https://github.com/RicinApp/Ricin/issues/13)\n\n## [v0.0.9](https://github.com/RicinApp/Ricin/tree/v0.0.9) (2016-05-06)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.8...v0.0.9)\n\n**Implemented enhancements:**\n\n- chore\\(build system\\): switch from meson to waf \\(WIP\\) [\\#118](https://github.com/RicinApp/Ricin/pull/118) ([SkyzohKey](https://github.com/SkyzohKey))\n- feat\\(add friend\\): allow user to add a friend via public key [\\#117](https://github.com/RicinApp/Ricin/pull/117) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- crashing on file transfer [\\#91](https://github.com/RicinApp/Ricin/issues/91)\n- URL parsing [\\#80](https://github.com/RicinApp/Ricin/issues/80)\n- Autoscroll not working [\\#79](https://github.com/RicinApp/Ricin/issues/79)\n\n## [v0.0.8](https://github.com/RicinApp/Ricin/tree/v0.0.8) (2016-04-30)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.7...v0.0.8)\n\n**Implemented enhancements:**\n\n- feat\\(ToxIdenticons\\): users without avatars now have identicon [\\#115](https://github.com/RicinApp/Ricin/pull/115) ([SkyzohKey](https://github.com/SkyzohKey))\n- feat\\(compact mode\\): add a way to display more friends in the window [\\#113](https://github.com/RicinApp/Ricin/pull/113) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Can't load the profile - unable to bind to a port [\\#68](https://github.com/RicinApp/Ricin/issues/68)\n- Avatars are buggy. [\\#61](https://github.com/RicinApp/Ricin/issues/61)\n\n**Merged pull requests:**\n\n-  fix\\(avatars\\): avatars changes are now reflected live. Fix \\#61 [\\#114](https://github.com/RicinApp/Ricin/pull/114) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.0.7](https://github.com/RicinApp/Ricin/tree/v0.0.7) (2016-04-27)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.6.1...v0.0.7)\n\n**Implemented enhancements:**\n\n- docs\\(README.md\\): correct transifex link [\\#111](https://github.com/RicinApp/Ricin/pull/111) ([dolohow](https://github.com/dolohow))\n- feature\\(save-path\\): allow user to choose where to save files [\\#109](https://github.com/RicinApp/Ricin/pull/109) ([SkyzohKey](https://github.com/SkyzohKey))\n- chore\\(travis\\): verify conformance to commit message format [\\#108](https://github.com/RicinApp/Ricin/pull/108) ([SkyzohKey](https://github.com/SkyzohKey))\n- feature\\(odd/even\\): remove label\\_name if latest sender is the same [\\#107](https://github.com/RicinApp/Ricin/pull/107) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.0.6.1](https://github.com/RicinApp/Ricin/tree/v0.0.6.1) (2016-04-12)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.6...v0.0.6.1)\n\n**Fixed bugs:**\n\n- Quit properly [\\#20](https://github.com/RicinApp/Ricin/issues/20)\n\n**Merged pull requests:**\n\n- fix\\(tox\\_kill\\): kill Tox properly. Close \\#20 [\\#103](https://github.com/RicinApp/Ricin/pull/103) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.0.6](https://github.com/RicinApp/Ricin/tree/v0.0.6) (2016-04-11)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.5...v0.0.6)\n\n**Implemented enhancements:**\n\n- feature\\(settings\\): new settings system using .json files [\\#101](https://github.com/RicinApp/Ricin/pull/101) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Libconfig is doing shit with strings sometimes. [\\#100](https://github.com/RicinApp/Ricin/issues/100)\n\n## [v0.0.5](https://github.com/RicinApp/Ricin/tree/v0.0.5) (2016-04-11)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.4.1...v0.0.5)\n\n**Implemented enhancements:**\n\n- feature\\(proxy\\): add udp, ipv6 and proxy support [\\#99](https://github.com/RicinApp/Ricin/pull/99) ([SkyzohKey](https://github.com/SkyzohKey))\n\n## [v0.0.4.1](https://github.com/RicinApp/Ricin/tree/v0.0.4.1) (2016-04-09)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/0.0.4...v0.0.4.1)\n\n**Implemented enhancements:**\n\n- Setup a buildbot at https://build.ricin.im [\\#66](https://github.com/RicinApp/Ricin/issues/66)\n- Ricin could remind user to delete users not seen from X time [\\#38](https://github.com/RicinApp/Ricin/issues/38)\n- Use GNotification [\\#22](https://github.com/RicinApp/Ricin/issues/22)\n- chore\\(travis\\): code coverage / codecov.io [\\#90](https://github.com/RicinApp/Ricin/pull/90) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Fails to build [\\#96](https://github.com/RicinApp/Ricin/issues/96)\n- Messages appear as \"label\" [\\#95](https://github.com/RicinApp/Ricin/issues/95)\n\n## [0.0.4](https://github.com/RicinApp/Ricin/tree/0.0.4) (2016-04-06)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.2-alpha...0.0.4)\n\n**Implemented enhancements:**\n\n- Legacy icon tray needs improvements. [\\#58](https://github.com/RicinApp/Ricin/issues/58)\n- Markdown support. [\\#30](https://github.com/RicinApp/Ricin/issues/30)\n- Ricin doesn't send `is\\_typing` notifications. [\\#25](https://github.com/RicinApp/Ricin/issues/25)\n- use read receipt cb [\\#16](https://github.com/RicinApp/Ricin/issues/16)\n- docs\\(readme\\): add TravisCI badge [\\#88](https://github.com/RicinApp/Ricin/pull/88) ([SkyzohKey](https://github.com/SkyzohKey))\n- docs\\(readme\\): add precisions about install [\\#87](https://github.com/RicinApp/Ricin/pull/87) ([SkyzohKey](https://github.com/SkyzohKey))\n- docs\\(readme\\): update README.md [\\#86](https://github.com/RicinApp/Ricin/pull/86) ([SkyzohKey](https://github.com/SkyzohKey))\n- docs\\(issues\\): update ISSUE\\_TEMPLATE.md format [\\#85](https://github.com/RicinApp/Ricin/pull/85) ([SkyzohKey](https://github.com/SkyzohKey))\n- docs\\(contributing\\): add CONTRIBUTING.md [\\#84](https://github.com/RicinApp/Ricin/pull/84) ([SkyzohKey](https://github.com/SkyzohKey))\n- fix\\(travis\\): change GTK+3.18 PPA, fix \\#44 [\\#83](https://github.com/RicinApp/Ricin/pull/83) ([LastAvenger](https://github.com/LastAvenger))\n- feature\\(settings\\): add settings management [\\#54](https://github.com/RicinApp/Ricin/pull/54) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Textbox losing focus [\\#93](https://github.com/RicinApp/Ricin/issues/93)\n- fail to build git version [\\#82](https://github.com/RicinApp/Ricin/issues/82)\n- Adwaita has no help-info-symbolic icon [\\#71](https://github.com/RicinApp/Ricin/issues/71)\n- Avatars are not saved if the avatar/ dir doesn't exists. [\\#60](https://github.com/RicinApp/Ricin/issues/60)\n- Default window size is too small  [\\#59](https://github.com/RicinApp/Ricin/issues/59)\n- Releases are missing submodules. [\\#56](https://github.com/RicinApp/Ricin/issues/56)\n- if there is no  ~/.config/tox directory, ricin can not start up [\\#55](https://github.com/RicinApp/Ricin/issues/55)\n- Travis always fail. [\\#44](https://github.com/RicinApp/Ricin/issues/44)\n- Ricin doesn't send `is\\\\_typing` notifications. [\\#25](https://github.com/RicinApp/Ricin/issues/25)\n\n**Closed issues:**\n\n- Wrap lines at words [\\#78](https://github.com/RicinApp/Ricin/issues/78)\n\n**Merged pull requests:**\n\n- feature\\(theme\\): bubbles [\\#77](https://github.com/RicinApp/Ricin/pull/77) ([SkyzohKey](https://github.com/SkyzohKey))\n- fix\\(profile\\): correct some chars in the names / status [\\#72](https://github.com/RicinApp/Ricin/pull/72) ([gmscs](https://github.com/gmscs))\n- refactor\\(chatview\\): markdown [\\#67](https://github.com/RicinApp/Ricin/pull/67) ([SkyzohKey](https://github.com/SkyzohKey))\n- docs\\(libsodium\\): add missing dependency to libsodium for build [\\#65](https://github.com/RicinApp/Ricin/pull/65) ([Gwend4l](https://github.com/Gwend4l))\n- fix\\(settings\\): correct indices for language ComboBox [\\#62](https://github.com/RicinApp/Ricin/pull/62) ([bheart](https://github.com/bheart))\n\n## [v0.0.2-alpha](https://github.com/RicinApp/Ricin/tree/v0.0.2-alpha) (2016-02-29)\n[Full Changelog](https://github.com/RicinApp/Ricin/compare/v0.0.3-beta...v0.0.2-alpha)\n\n**Implemented enhancements:**\n\n- Add tooltips to buttons [\\#41](https://github.com/RicinApp/Ricin/issues/41)\n- Make it work on GTK 3.14 [\\#19](https://github.com/RicinApp/Ricin/issues/19)\n\n**Fixed bugs:**\n\n- Giant ProfileChooser. [\\#53](https://github.com/RicinApp/Ricin/issues/53)\n\n## [v0.0.3-beta](https://github.com/RicinApp/Ricin/tree/v0.0.3-beta) (2016-02-19)\n**Implemented enhancements:**\n\n- Move GtkMenu to xml [\\#23](https://github.com/RicinApp/Ricin/issues/23)\n- Set callbacks in glade [\\#18](https://github.com/RicinApp/Ricin/issues/18)\n- Allow viewing profile information of a contact. [\\#12](https://github.com/RicinApp/Ricin/issues/12)\n- Offline contacts are not shown. [\\#11](https://github.com/RicinApp/Ricin/issues/11)\n- feature\\(ui\\): theme engine + sidepane + bugfixes, and more [\\#43](https://github.com/RicinApp/Ricin/pull/43) ([SkyzohKey](https://github.com/SkyzohKey))\n\n**Fixed bugs:**\n\n- Issue when deleting friend. [\\#50](https://github.com/RicinApp/Ricin/issues/50)\n- GTK+3.16 issues [\\#47](https://github.com/RicinApp/Ricin/issues/47)\n- \\[bug\\] Unexpected markup. [\\#39](https://github.com/RicinApp/Ricin/issues/39)\n- Status is not synced with .tox status at launching [\\#36](https://github.com/RicinApp/Ricin/issues/36)\n- Greentexting links [\\#26](https://github.com/RicinApp/Ricin/issues/26)\n- Offline contacts are not shown. [\\#11](https://github.com/RicinApp/Ricin/issues/11)\n- System\\_messages are sent to bad contacts. [\\#10](https://github.com/RicinApp/Ricin/issues/10)\n- Friends are not marked as offline when they go offline. [\\#9](https://github.com/RicinApp/Ricin/issues/9)\n- Graphical bug with line\\_wrap on long texts. [\\#8](https://github.com/RicinApp/Ricin/issues/8)\n- Resizing to the minimum produces the GtkPaned to split. [\\#7](https://github.com/RicinApp/Ricin/issues/7)\n- Name not sent to new friends. [\\#6](https://github.com/RicinApp/Ricin/issues/6)\n- \\[friend\\_list\\] Adding a friend from Ricin makes it buggy [\\#5](https://github.com/RicinApp/Ricin/issues/5)\n- Can't edit entry\\_username & entry\\_mood manually. [\\#4](https://github.com/RicinApp/Ricin/issues/4)\n- Woops, i did some bullshit. --force'd without did voluntary. History is empty :x [\\#3](https://github.com/RicinApp/Ricin/issues/3)\n\n**Closed issues:**\n\n- Set up text in LICENSE [\\#46](https://github.com/RicinApp/Ricin/issues/46)\n- TO-DO before merging wip/clean [\\#42](https://github.com/RicinApp/Ricin/issues/42)\n- Where are you ? [\\#33](https://github.com/RicinApp/Ricin/issues/33)\n- Is Ricin abandoned? [\\#32](https://github.com/RicinApp/Ricin/issues/32)\n- File transfers to offline contacts [\\#24](https://github.com/RicinApp/Ricin/issues/24)\n- Friend message entry scale with text. Adding a GtkScrolledWindow make the app segfault... [\\#15](https://github.com/RicinApp/Ricin/issues/15)\n- Losed all the issue when recreating the new repo. :x [\\#2](https://github.com/RicinApp/Ricin/issues/2)\n- give me write access [\\#1](https://github.com/RicinApp/Ricin/issues/1)\n\n**Merged pull requests:**\n\n- chore\\(ninja\\): update ninja version and compiling instructions [\\#34](https://github.com/RicinApp/Ricin/pull/34) ([gmscs](https://github.com/gmscs))\n\n\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*\n"
  },
  {
    "path": "docs/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at skyzohkey@protonmail.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n\n## Report abuse\n\nYou can of course report abuses via the following methods.\n\n- SkyzohKey <skyzohkey@protonmail.com>\n- IRC: irc.freenode.net at the #ricin channel\n"
  },
  {
    "path": "docs/CONTRIBUTING.md",
    "content": "# Filing an issue\n\n### Must read\n* If you aren't sure, you can ask on the [**IRC channel**](https://webchat.freenode.net/?channels=ricin-dev) first.\n* Do a quick **search**. Others might have already reported the issue.\n* Write in **English**!\n* Provide **version** information: (You can find version numbers in menu `Settings → About`)\n\n```\nRicin version:\nCommit hash:\nToxcore version:\nGTK+3 version:\nOperating System + version:\n```\n\n* Provide **steps** to reproduce the problem, it will be easier to pinpoint the fault.\n* **Screenshots**! A screenshot is worth a thousand words. Just upload it. [(How?)](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests)\n\n### Good to know\n* **Patience**. The dev team is small and resource limited. Devs have to find time, analyze the problem and fix the issue, it all takes time. :clock3:\n* If you can code, why not become a **contributor** by fixing the issue and opening a pull request? :wink:\n* Harsh words or threats won't help your situation. What's worse, your complaint will (very likely) be **ignored**. :fearful:\n\n# Opening a pull request\n### Must read\n* Use **[commit message format](#commit-message-format)**.\n* Keep the title **short** and provide a **clear** description about what your pull request does.\n* Provide **screenshots** for UI related changes.\n* Keep your git commit history **clean** and **precise**. Commits like `xxx fixup` should not appear.\n* If your commit fixes a reported issue (for example #44), add the following message to the commit `Fixes #44.`. [Here is an example](https://github.com/RicinApp/Ricin/pull/83).\n\n### Good to know\n* **Search** the pull request history! Others might have already implemented your idea and it could be waiting to be merged (or have been rejected already). Save your precious time by doing a search first.\n* When resolving merge conflicts, do `git rebase <target_branch_name>`, don't do `git pull`. Then you can start fixing the conflicts. [Here is a good explanation](https://www.atlassian.com/git/tutorials/merging-vs-rebasing).\n\n\n## <a id=\"commit\"></a> Git Commit Guidelines\nWe have very precise rules over how our git commit messages can be formatted.\nThis leads to **more readable messages** that are easy to follow when looking\nthrough the **project history**.  But also, we use the git commit messages to\n**generate the Ricin change log** using [clog-cli]\n(https://github.com/clog-tool/clog-cli).\n\n\n### Commit Message Format\nEach commit message consists of a **header**, a **body** and a **footer**.  The header has a special\nformat that includes a **type**, a **scope** and a **subject**:\n\n```\n<type>(<scope>): <subject>\n<BLANK LINE>\n<body>\n<BLANK LINE>\n<footer>\n```\n\nThe **header** is mandatory and the **scope** of the header is optional.\n\nAny line of the commit message cannot be longer 100 characters! This allows the message to be easier\nto read on GitHub as well as in various git tools.\n\nNote that in the future `gitcop` will be used to check if commits in pull\nrequest conform to commit message format, but since it can't be configured to\nhave an optional `(<scope>)`, it will claim that messages without it are wrong,\nwhile they're perfectly fine. To avoid useless `gitcop` messages in your pull-requests,\nsimply add `()` after type. (ie. `feature(): Useless commit`)\n\n### Revert\nIf the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.\n\n### Type\nMust be one of the following:\n\n* **feature**: A new feature\n* **fix**: A bug fix\n* **docs**: Documentation only changes\n* **style**: Changes that do not affect the meaning of the code (white-space, formatting, etc)\n* **refactor**: A code change that neither fixes a bug nor adds a feature\n* **perf**: A code change that improves performance\n* **test**: Adding missing tests\n* **chore**: Changes to the build process or auxiliary tools and libraries such as documentation\n  generation\n\n### Scope\nThe scope could be anything specifying place of the commit change. For example `chatview`,\n`friendlist`, `wrapper`, `settings`, `toxdns`, `profile`, `ui`, etc...\n\n### Subject\nThe subject contains succinct description of the change:\n\n* use the imperative, present tense: \"change\" not \"changed\" nor \"changes\"\n* don't capitalize first letter\n* no dot (.) at the end\n\n### Body\nJust as in the **subject**, use the imperative, present tense: \"change\" not \"changed\" nor \"changes\".\nThe body should include the motivation for the change and contrast this with previous behavior.\n\n### Footer\nThe footer should contain any information about **Breaking Changes** and is also the place to\nreference GitHub issues that this commit **Closes**.\n\n**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.\n"
  },
  {
    "path": "docs/Config-API.md",
    "content": "# Ricin Config API\nThis document aims to cover every supported property in the `ricin.json` user-preferences file.  \nHere are described every property you may use in the file, not defined here proprerties are likely\nto not work/works badly.\n\nFor more informations about the config API, just take a look at the [Settings.vala](../src/Settings.vala#L10-34) file.\n\n## (String) last-profile\n* **Usage**: The last profile used name.\n* **Default**: `null`\n* **Sample**: `\"last-profile\": \"{name}\",` - Here `{name}` is the file name like `~/.config/tox/{name}.tox`.\n\n## (Boolean) network-udp\n* **Usage**: A property to define if ToxCore should use UDP.\n* **Default**: `true`\n* **Sample**: `\"network-udp\": true,`\n  \n## (Boolean) network-ipv6\n* **Usage**: A property to define if ToxCore should use IPv6.\n* **Default**: `true`\n* **Sample**: `\"network-ipv6\": true,`\n  \n## (Boolean) enable-proxy\n* **Usage**: A property to define if ToxCore should use a **SOCKS5** proxy.\n* **Default**: `false`\n* **Sample**: `\"enable-proxy\": true,`\n  \n## (String) proxy-host\n* **Usage**: If `enable-proxy` is enabled, this is the proxy address that ToxCore will connect via.\n* **Default**: `127.0.0.1`\n* **Sample**: `\"proxy-host\": \"127.0.0.1\",`\n\n## (Integer) proxy-port\n* **Usage**: If `enable-proxy` is enabled, this is the proxy port that ToxCore will connect via.\n* **Default**: `9050` (Tor)\n* **Sample**: `\"proxy-port\": 9050,`\n\n## (Boolean) enable-custom-themes\n* **Usage**: If enabled, allows Ricin to use custom themes.\n* **Default**: `true`\n* **Sample**: `\"enable-custom-themes\": true,`\n\n## (String) selected-theme\n* **Usage**: If `enable-custom-themes` is enabled, this is the theme that Ricin will use to render the window.\n* **Default**: `dark`\n* **Sample**: `\"selected-theme\": \"white\",`\n\n## (String) selected-language\n* **Usage**: This is the language that Ricin will use to render the window.\n* **Default**: `en_US`\n* **Sample**: `\"selected-language\": \"fr_FR\",`\n\n## (Boolean) show-status-change\n* **Usage**: If enabled Ricin will display friends status changes in their ChatView.\n* **Default**: `true`\n* **Sample**: `\"show-status-change\": true,`\n\n## (Boolean) show-unread-messages\n* **Usage**: If enabled and scrollbar isn't at it's maximum bottom, Ricin will show a little notice to inform the user that new messages are available in this chat.\n* **Default**: `true`\n* **Sample**: `\"show-unread-messages\": true,`\n\n## (Boolean) show-typing-status\n* **Usage**: If enabled Ricin will display friends typing status changes in their ChatView.\n* **Default**: `true`\n* **Sample**: `\"show-typing-status\": true,`\n\n## (Boolean) send-typing-status\n* **Usage**: If enabled Ricin will send `self_is_typing` notifications to the friend with who the user talks.\n* **Default**: `true`\n* **Sample**: `\"send-typing-status\": false,`\n\n## (String) default-save-path\n* **Usage**: The path for Ricin to store downloaded files to. May be overriden in the future with per-friend download folder.\n* **Default**: OS `Downloads` folder.\n* **Sample**: `\"default-save-path\": \"/home/user/Downloads/Tox/\",`\n  \n## (Boolean) compact-mode\n* **Usage**: If enabled Ricin will display the friends list in a more compact way, allowing to see more contacts.\n* **Default**: `false`\n* **Sample**: `\"compact-mode\": true,`\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "docs/INSTALL.md",
    "content": "# Ricin installation guide\n\n## Table of Contents\n* [Dependencies installation](#dependencies)\n  * [Debian/Ubuntu](#debianubuntu)\n  * [ArchLinux](#archlinux)\n  * [Fedora](#fedora)\n* [Installing](#installing-ricin)\n  * [Linux](#linux)\n    * [ArchLinux](#archlinux-1)\n    * [MilisLinux](#milis-linux-milis-isletim-sistemi)\n    * [Other linux distributions](#others-linux)\n  * [Windows](#windows)\n\n## Dependencies\n| Package name           | Notes      | Version   |\n|:-----------------------|:----------:|----------:|\n| python2 **or** python3 |  building  |           |\n| valac                  |  building  | >=0.28.1  |\n| intltool               |  building  | >=0.35.5  |\n| gtk+3                  |            | >=3.16    |\n| [libtoxcore]           |            | >=0.0.0   |\n| glib2                  |            | >=2.38    |\n| json-glib              |            | >=1.0     |\n| libsoup                |            | >=2.4     |\n| libnotify              |            | >=0.7.6   |\n\n### Debian/Ubuntu\nOn Ubuntu you need to compile ToxCore, Libsodium, and filter_audio by hand.\nSomeone already wrote on how to achieve this, simply follow the guide\nto [Install ToxCore].\n\nAfter ToxCore is installed, run the following line to fetch & install\nthe dependencies needed by Ricin to compile/run.\n\n```bash\n# Required to build Ricin:\n$ apt-get install python3 valac\n\n# Required by Ricin at runtime:\n$ apt-get install gtk+3 libglib2.0-0 libglib2.0-dev \\\n  libjson-glib-1.0-0 libjson-glib-dev libnotify-dev \\\n  libsoup-gnome2.4-dev\n```\n\n>**Note**: You may have to `sudo` both lines in order to have\nthem running properly.\n\n### ArchLinux\nTo install all the Ricin's dependencies, simply write the\nfollowing in a shell.\n\n```bash\n$ pacman -S python3 vala gtk3 toxcore \\\n  glib2 json-glib libsoup libnotify\n```\n\n### Fedora\nOn Fedora you need to compile ToxCore, Libsodium, and filter_audio by hand.\nSomeone already wrote on how to achieve this, simply follow the guide\nto [Install ToxCore].\n\n```bash\n$ dnf install python3 valac glib2 gtk3 gtk3-devel \\\n  json-glib libsoup libnotify\n```\n\n## Installing Ricin\n### Linux\n#### ArchLinux\nThanks to [LastAvenger], ArchLinux users can install Ricin via AUR: [ricin-git] / [ricin](https://aur.archlinux.org/packages/ricin).  \nYou simply have to write the following line in a shell:\n\n```bash\n# Fetch the source from git, build and install.\n$ yaourt -S ricin-git\n\n# Use the latest release (stable), build and install.\n$ yatourt -S ricin\n```\n\n#### Milis Linux (Milis Isletim Sistemi)\nThanks to [milisarge], [Milis Linux] users can install Ricin via MPS.  \nYou simply have to write the following line in a shell:\n\n```bash\n$ mps -kur ricin\n```\n\n#### Others Linux\nFor other systems that doesn't yet have a package you have a to compile and\ninstall Ricin from sources. Compiling Ricin is super simple as we use\n**The Waf Build System** that runs pretty much everywhere.  \n\n**Before** running the following commands, please ensure that you have installed\nall the Ricin's dependencies.\n\nRun the following commands in a shell:\n```bash\ngit clone https://github.com/RicinApp/Ricin.git && cd Ricin\n./waf configure --prefix=/usr/local\n./waf build\nsudo ./waf install\n```\n\n### Windows\nRicin for Windows can be downloaded at the following URL.  \n*Please note that this is the first release of Ricin for Windows and that it may\ncontains bugs, please report any of them (even the insignifiant ones) via the\nissue tracker.*\n\n* [Ricin for Windows (64 bits)](https://cdn.ricin.im/windows/ricin-0.1.1-win32_x86-64.zip)\n\n### OSX\nRicin isn't available yet on OSX, anyway this is also planed!\n\n[libtoxcore]: https://github.com/irungentoo/toxcore/blob/master/INSTALL.md\n[meson]: http://mesonbuild.com/\n[ninja]: http://martine.github.io/ninja/\n[LastAvenger]: https://github.com/LastAvenger\n[ricin-git]: https://aur.archlinux.org/packages/ricin-git\n[milisarge]: https://github.com/milisarge\n[Milis Linux]: http://milis.gungre.ch\n[Install ToxCore]: https://github.com/irungentoo/toxcore/blob/master/INSTALL.md#build-manually\n"
  },
  {
    "path": "docs/user_manual_en.md",
    "content": "# Ricin user guide\n\n## Table of contents\n- [Introduction]\n  1. [Basic Tox concepts]\n  2. [Definition table]\n  3. [Keyboard shortcuts]\n- [Create a profile]\n- [Customize your profile]\n  1. [Name]\n  2. [Status message]\n  3. [Avatar]\n  4. [Status] - online, away, busy\n- [Add a friend]\n  1. [using a ToxID]\n  2. [using a Public Key]\n- [Manage your friend list]\n  1. [Accept/Reject a friend request]\n  2. [Delete a friend]\n  3. [Block a friend]\n  4. [Copy friend's Public Key]\n  5. [Add notes about a friend]\n- [Talk with a friend]\n  1. [Basic messages]\n  2. [Quotes]\n  3. [Markdown] - text formatting\n- [Send a file]\n  1. [Inline images]\n  2. [Others files]\n- [Customize Ricin: Settings]\n  - [General tab]\n    1. [Get your ToxID]\n    2. [Change your nospam]\n    3. [Choose a default save path]\n  - [Network tab]\n    1. [Configure the connection method: UDP or TCP]\n    2. [Configure a SOCKS5 proxy]\n  - [Interface tab]\n    1. [Themes system]\n    2. [Choose a language]\n    3. [Configure the Ricin interface]\n\n## Introduction\n**Ricin** aims to be a popular instant messaging client for the Tox network. We built it in order to offer the most intuitive and performing talk app. The point of Ricin is to provide the highest quality when chatting with your friends, contacts, employees, and other people that matters in your life.\n\nThis guide aims to explain all the features of Ricin in details meaning you cannot be lost in the Ricin interface. In case of doubt, just read the manual.\n\n### Basic Tox concepts\nIn this subsections, let's describe and define the main points of Tox, what is it? How does it works? What makes it better than Skype? All of these questions are answered bellow.\n\nTox aims to bring privacy in a world where every moves you do are recorded in big databases by some stupid companies (NSA, to only cite this one).\n\nTo achieve this Tox is P2P based (as a distributed network), which means that any one that joins the network permits it to live. It also means that Tox cannot been shutdown, by nobody.\n\n**Warning**: Tox is **NOT** anonymizing your connection, if you want to be anonymous while using Ricin, simply [Configure a SOCKS5 proxy] to your local Tor proxy.\n\nTox won't distributed/leak your IP you didn't decided it. Only people you accepted as friend (and as such, that you trust) can receive your IP. Their is no other way to obtain your computer address.\n\nHere introduce the ToxID concept. A ToxID is a suit of 76 random chars that permits to \"identify\" you as a Tox user.  \nThis ToxID is composed of a **Public Key** (64 chars), a **nospam** (6 chars) and a **checksum** (4 chars). Nospam is a value intended to protect you from people spamming with friend requests. Once you [Change your nospam] a part of your ToxID changes, invalidating the old one. The Checksum is a simple value that permits to verify the integrity of a ToxID.\n\n### Definition table\n<span id=\"dt-profile-name\"></span>\n- Profile name: Not an username, this is only your `.tox` file name.\n\n**TODO:** Add definitions here as I write the manual.\n\n### Keyboard shortcuts\n**Note**: The _Global_ context means that you can use the shortcut in the whole app.\n\n| Shortcut       | Context            | Comments                               |\n|:--------------:|:-------------------|:--------------------------------------:|\n| `Ctrl+UP`      | Global             | Quickly switch to the previous contact.|\n| `Ctrl+DOWN`    | Global             | Quickly switch to the next contact.    |\n| `Ctrl+Shift+Q` | Messages selection | Quote a selection of messages.         |\n| `Ctrl+C`       | Messages selection | Copy a selection of messages.          |\n| `Shift+Enter`  | Chat entry         | Add a newline character.\n\n## Create a profile\nThe first time you launch Ricin, if you never used Tox before, you'll have to create a profile. A profile is a single `.tox` file that contains your name, your status message, your friends list, etc. This file **must not** be modified by hand, only Ricin (or another Tox client) should write in it. Editing this file by hand *may* expose you to profile corruption.\n\nIn order to create a profile, simply start Ricin and select the \"Create a profile\" tab in the top right. Enter your [profile name] then click \"Create\". Ricin will create the profile and open the main window.\n\n![Creating a profile within Ricin](https://i.imgur.com/cmguEeK.png)\n\n## Customize your profile\nRicin is built as you can customize pretty much everything, let's talk about your profile! The top left area is where you can personalize how you appears on your friends screen.\n\n![The profile area in Ricin](https://i.imgur.com/XFwycIh.png)\n\n### Name\nYour name is what your friends see first when they search for you. It can be a nickname or a real name, nothing too long as on little screens your name may appears ellipsised if too long. Choose something that represents you. Something that permits your contacts to know who you are.\n\nTheir is no limitations or artificial caps on names, you can leave it blank, add emojis, Chinese, Hebrew, and even Unicode but *please*, don't.\n\n### Status message\nThe status message is something you can use to share whatever you want ; your mood, your favorite song, a link you want to share, a meeting date, etc. That's a **public** data that all of your friends are able to read whenever they want.\n\nSame as names, their is no limitations or artificial caps on status messages. Feel creatives!\n\n### Avatar\nAn avatar is a picture that represents you, it permits your friends to identify you in a eye regard. That's a sort of virtual representation of you. You can use any avatar you want.\n\nUnlike name and status messages, avatars are submitted to some limitations. Nothing too restricting.\n\n- Avatars **should** be lower than 64 Ko, size isn't checked but a weightier avatar is faster to download.\n- Avatars preferred dimensions are `100x100px`. Any bigger image may be scaled down and lose it's visibility.\n- Avatars file type **allowed** are: `.png`, `.jpg`, `.jpeg`, `.svg`  \n  (Note that SVG are only supported by Ricin, not by the other Tox clients).\n\nTo change your avatar, simply click it. It's a square located at the **top left** of the main window.\n\n### Status\nYour status indicate whenever you are online, busy, away or offline.  \n**Note**: In busy mode, notifications are disabled in order to not disturb you.\n\nStatus is cycled in the following order: Online, Away, Busy.  \nChanging your status is simple as clicking on it.\n\n## Add a friend\nAs an instant messaging application, you probably want to add friends to your friends list. That's better in order to talk. Adding peoples in Tox can be done using 2 methods. Let's describe and compare them.\n\n![Button to open the add friend dialog](https://i.imgur.com/AMsaTcf.png)  \n*You can add a friend by clicking the button at the **bottom left** of the main window.*\n\n![Adding a friend on Ricin](https://i.imgur.com/eYvjIEN.png)\n\n### Using a ToxID\nThat's probably the most convenient way to add a friend. Your friend sends you it's ToxID and you just have to paste it in the \"Add friend dialog\" (see above) then choose a message that will join the friend request. Once you send the request, your friend will receive it and have the choice to **accept** or **reject** it. If it reject the friend request, you'll never see it online. Else, it will simply appears in your friends list.\n\n### Using a Public Key\nThe other way to add a friend is by only knowing it's Public Key. The difference with [using a ToxID] is that this method **doesn't** send a friend request. This can be useful in case you don't want Tox to know that you added this friend.\n\n**Note**: This way requires both you and your friend to add your Public Keys/ToxID mutually.\n**Note2**: This way will simply write the friend in your `.tox` profile and lookup for your friend's IP.\n\n[TABLE OF CONTENTS]: ####\n\n[Introduction]: #introduction\n[Basic Tox concepts]: #basic-tox-concepts\n[Definition table]: #definition-table\n[Keyboard Shortcuts]: #keyboard-shortcuts\n[Create a profile]: #create-a-profile\n\n[Customize your profile]: #customize-your-profile\n[Name]: #name\n[Status message]: #status-message\n[Avatar]: #avatar\n[Status]: #status\n\n[Add a friend]: #add-a-friend\n[using a ToxID]: #using-a-toxid\n[using a Public Key]: #using-a-public-key\n\n[Manage your friend list]\n[Accept/Reject a friend request]\n[Delete a friend]\n[Block a friend]\n[Copy friend's Public Key]\n[Add notes about a friend]\n\n[Talk with a friend]\n[Basic messages]\n[Quotes]\n[Markdown]\n\n[Send a file]\n[Inline images]\n[Others files]\n\n[Customize Ricin: Settings]\n[General tab]\n[Get your ToxID]\n[Change your nospam]\n[Choose a default save path]\n\n[Network tab]\n[Configure the connection method: UDP or TCP]\n[Configure a SOCKS5 proxy]\n\n[Interface tab]\n[Themes system]\n[Choose a language]\n[Configure the Ricin interface]\n\n[TEXT NOTES]: #\n\n[profile name]: #dt-profile-name\n"
  },
  {
    "path": "po/LINGUAS",
    "content": "# Please keep this file ordered alphabeticaly.\nda\nde\nen_US\neo\nfr_FR\npl\npt_PT\nru_RU\nuk\nzh_CN\n"
  },
  {
    "path": "po/da.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# Nicolai Ireneo-Larsen <wonderingdane@protonmail.com>, 2016\n# Will Tange <will@brt.sexy>, 2016\n# Will Tange <will@brt.sexy>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-11-03 14:06+0100\\n\"\n\"PO-Revision-Date: 2016-11-08 15:43+0000\\n\"\n\"Last-Translator: SkyzohKey <SkyzohKey@users.noreply.github.com>\\n\"\n\"Language-Team: Danish (http://www.transifex.com/ricinapp/ricin/language/da/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: da\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: src/ChatView.vala:422 src/Notification.vala:29\nmsgid \" is now \"\nmsgstr \" er nu \"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \" er nu kendt som \"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**fed**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*fed*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//kursiv//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/kursiv/\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"10\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"3 ubrugte profiler fundet:\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:569\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Tilgængelige Markdown tag</b>\"\n\n#: res/ui/settings-view.ui:897\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Vis venners status opdateringer?</b>\"\n\n#: res/ui/settings-view.ui:655\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Brugerdefinerede temaer?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Venner</b>\"\n\n#: res/ui/settings-view.ui:440\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:777\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Sprog:</b>\"\n\n#: src/Wrapper.vala:800\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Sidst online:</b>\"\n\n#: res/ui/chat-view.ui:1187\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Sidst set:</b>\"\n\n#: res/ui/settings-view.ui:1146\nmsgid \"<b>Make the icon in taskbar to blink on new messages?</b>\"\nmsgstr \"Skal ikon blinke ved ny besked?\"\n\n#: res/ui/settings-view.ui:504\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1401\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> sætter sig for at være en <i>sikker, let, hackervenlig samt tilpasselig</i> chatklient, der benytter sig af det open-source <b>ToxCore</b> bibliotek.\"\n\n#: res/ui/settings-view.ui:1239\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Send taste notifikationer?</b>\"\n\n#: res/ui/settings-view.ui:402\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Ukendte peers</b>\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Version:</b>\"\n\n#: res/ui/settings-view.ui:76\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Dit ToxID:</b>\"\n\n#: res/ui/chat-view.ui:998\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Ven skriver</i>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">citat\"\n\n#: res/ui/settings-view.ui:1579\nmsgid \"About\"\nmsgstr \"Om\"\n\n#: res/ui/main-window.ui:386\nmsgid \"Accept\"\nmsgstr \"Accepter\"\n\n#: res/ui/file-list-row.ui:218 res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Accepter/Forsæt filoverførsel\"\n\n#: src/MainWindow.vala:715 src/MainWindow.vala:726 src/MainWindow.vala:751\n#: src/MainWindow.vala:765 res/ui/main-window.ui:486 res/ui/main-window.ui:564\nmsgid \"Add a friend\"\nmsgstr \"Tilføj en ven\"\n\n#: res/ui/main-window.ui:646\nmsgid \"Add friend\"\nmsgstr \"Tilføj ven\"\n\n#: res/ui/settings-view.ui:192\nmsgid \"Add password\"\nmsgstr \"Tilføj kodeord\"\n\n#: src/MainWindow.vala:190\nmsgid \"All friends\"\nmsgstr \"Alle venner\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Alt syntaks\"\n\n#: src/MainWindow.vala:614 src/Util.vala:211\nmsgid \"Away\"\nmsgstr \"Væk\"\n\n#: src/ChatView.vala:733 res/ui/chat-view.ui:1241\nmsgid \"Block\"\nmsgstr \"Bloker\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Block friend\"\nmsgstr \"Bloker ven\"\n\n#: src/Util.vala:205\nmsgid \"Blocked\"\nmsgstr \"Blokeret\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Fed\"\n\n#: src/MainWindow.vala:604 src/Util.vala:214\nmsgid \"Busy\"\nmsgstr \"Optaget\"\n\n#: res/ui/settings-view.ui:1179\nmsgid \"\"\n\"By enabling this option you'll receive desktop notifications <b>everytime a \"\n\"contact goes Online or Offline</b>. Away and Busy status won't trigger these\"\n\" notifications.\"\nmsgstr \"Ved at aktivere denne indstilling, vil du modtage en besked på skrivebordet <b>hver gang en kontakt kommer online eller går offline<b/>. Status som væk og optaget vil ikke give nogen besked.\"\n\n#: res/ui/settings-view.ui:1139\nmsgid \"\"\n\"By enabling this option, <b>everytime you get a new message and the Ricin \"\n\"window is not focused</b>, the Ricin's icon in your taskbar will blink, \"\n\"indicating unread message(s). Giving focus to Ricin will cancel this \"\n\"notification.\"\nmsgstr \"Ved at aktivere denne indstilling, vil ikonet blinke for at indikere ulæste beskeder, hvis Ricin er minimeret.\"\n\n#: res/ui/chat-view.ui:821\nmsgid \"Call friend\"\nmsgstr \"Ring til ven\"\n\n#: src/MainWindow.vala:121\nmsgid \"Can't load the profile\"\nmsgstr \"Kan ikke hente profil\"\n\n#: res/ui/main-window.ui:667\nmsgid \"Cancel\"\nmsgstr \"Annuller\"\n\n#: res/ui/file-list-row.ui:188 res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Annuller/sæt filoverførsel på pause\"\n\n#: res/ui/settings-view.ui:105\nmsgid \"Change Nospam\"\nmsgstr \"Skift Nospam\"\n\n#: res/ui/settings-view.ui:209\nmsgid \"Change password\"\nmsgstr \"Skift kodeord\"\n\n#: res/ui/main-window.ui:91\nmsgid \"Change your avatar\"\nmsgstr \"Skift profilbillede\"\n\n#: res/ui/main-window.ui:137\nmsgid \"Change your status\"\nmsgstr \"Skift statusmeddelelse\"\n\n#: res/ui/settings-view.ui:369\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"Ændring af Netværksindstillingerne vil midlertidigt afbryde din forbindelse til Tox netværket\"\n\n#: src/SettingsView.vala:463\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"Ved at fjerne dit kodeord vil din profil, logfiler og indstillinger ikke længere være krypteret.\"\n\n#: src/ChatView.vala:797\nmsgid \"Choose a file\"\nmsgstr \"Vælg en fil\"\n\n#: src/SettingsView.vala:409\nmsgid \"Choose a folder where to save files\"\nmsgstr \"Vælg en mappe hvor filer skal gemmes\"\n\n#: src/ProfileChooser.vala:145\nmsgid \"Choose a name for the profile\"\nmsgstr \"Vælg et navn til profilen\"\n\n#: res/ui/settings-view.ui:303\nmsgid \"Choose directory\"\nmsgstr \"Vælg mappe\"\n\n#: res/ui/chat-view.ui:1494\nmsgid \"Choose smileys\"\nmsgstr \"Vælg smileys\"\n\n#: src/ChatView.vala:519\nmsgid \"Clear conversation\"\nmsgstr \"Ryd samtale\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"Klart tema\"\n\n#: res/ui/chat-view.ui:1392\nmsgid \"Close the popup\"\nmsgstr \"Luk pop op-vinduet\"\n\n#: res/ui/settings-view.ui:1054\nmsgid \"Compact friend list?\"\nmsgstr \"Kompakt venneliste?\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"Bekræft nyt kodeord\"\n\n#: res/ui/settings-view.ui:1469\nmsgid \"Contributors\"\nmsgstr \"Bidragsydere\"\n\n#: res/ui/settings-view.ui:87\nmsgid \"Copy\"\nmsgstr \"Kopier\"\n\n#: res/ui/chat-view.ui:1281\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Kopier vens ToxID\"\n\n#: src/ChatView.vala:505\nmsgid \"Copy quote in clipboard\"\nmsgstr \"Kopier citat\"\n\n#: src/ChatView.vala:499\nmsgid \"Copy selection in clipboard\"\nmsgstr \"Kopier fremhævet\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"Opret profil\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"Opret profil\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"Nuværende kodeord\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"Nuværende kodeord kan ikke være blank.\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"Mørkt tema\"\n\n#: res/ui/main-window.ui:367\nmsgid \"Decline\"\nmsgstr \"Afvis\"\n\n#: res/ui/settings-view.ui:275\nmsgid \"Default save path:\"\nmsgstr \"Standard download mappe\"\n\n#: res/ui/chat-view.ui:1261\nmsgid \"Delete\"\nmsgstr \"Slet\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Slet venner (3)\"\n\n#: src/ChatView.vala:515\nmsgid \"Delete selected messages\"\nmsgstr \"Slet valgte beskeder\"\n\n#: res/ui/settings-view.ui:995\nmsgid \"Display typing notifications?\"\nmsgstr \"Vis taste notifikationer?\"\n\n#: res/ui/settings-view.ui:942\nmsgid \"Display unread messages notice?\"\nmsgstr \"Vis meddelelse om ulæste beskeder?\"\n\n#: src/SettingsView.vala:435 src/SettingsView.vala:463\n#: src/SettingsView.vala:488\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"Vil du gerne fortsætte alligevel?\"\n\n#: src/SettingsView.vala:462\nmsgid \"Edit your password\"\nmsgstr \"Ændre dit kodeord\"\n\n#: res/ui/settings-view.ui:1232\nmsgid \"\"\n\"Enabling this will cause Ricin to tell <b>the person you talk to</b> when \"\n\"you are typing.\"\nmsgstr \"Aktivering af denne indstilling vil få Ricin til at <b>fortælle personen du snakker med</b> at du er ved at skrive en besked.\"\n\n#: src/SettingsView.vala:434\nmsgid \"Encrypt your profile\"\nmsgstr \"Krypter din profil\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"Angiv et navn til profilen\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"Skriv dit kodeord...\"\n\n#: res/ui/chat-view.ui:883\nmsgid \"Friend's profile\"\nmsgstr \"Vens profil\"\n\n#: res/ui/settings-view.ui:339\nmsgid \"General\"\nmsgstr \"Generelt\"\n\n#: res/ui/settings-view.ui:1431\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Gruppechat navn\"\n\n#: src/MainWindow.vala:569\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Hej! %s her, lad os være venner.\"\n\n#: src/InlineImageMessageListRow.vala:112\nmsgid \"Image saved!\"\nmsgstr \"Billede gemt!\"\n\n#: src/SettingsView.vala:435\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"For at kryptere din profil skal du angive et kodeord. Du skal bruge kodeordet hver gang du starter Ricin.\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"Indlejret kode\"\n\n#: res/ui/settings-view.ui:1107\nmsgid \"Interface\"\nmsgstr \"Grænseflade\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Kursiv\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Forlad\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Licens (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"Indlæs profil\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"Log på\"\n\n#: src/SettingsView.vala:100\nmsgid \"Markdown\"\nmsgstr \"Markdown\"\n\n#: res/ui/settings-view.ui:836\nmsgid \"Message parsing mode:\"\nmsgstr \"Opsplitnings-tilstand af besked\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Deaktiver mikrofon\"\n\n#: res/ui/settings-view.ui:611\nmsgid \"Network\"\nmsgstr \"Netværk\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"Nyt kodeord\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"Det nye kodeod skal være et andet end det gamle kodeord.\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:373\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"Nej\"\n\n#: res/ui/settings-view.ui:1291\nmsgid \"Notifications\"\nmsgstr \"Meddelelser\"\n\n#: src/Util.vala:218\nmsgid \"Offline\"\nmsgstr \"Offline\"\n\n#: src/MainWindow.vala:594 src/Util.vala:208\nmsgid \"Online\"\nmsgstr \"Online\"\n\n#: src/MainWindow.vala:189\nmsgid \"Online friends\"\nmsgstr \"Online venner\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"Kodeordets styrke\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"Kodeordet kan ikke være blank.\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"Bekræftelse af kodeordet kan ikke være blank.\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"Bekræftelsen af kodeordet passer ikke.\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"Kodeordet skal mindst være 8 tegn.\"\n\n#: src/SettingsView.vala:101\nmsgid \"Plaintext\"\nmsgstr \"Ren tekst\"\n\n#: src/ProfileChooser.vala:101\nmsgid \"Please enter a password\"\nmsgstr \"Skriv venligst et kodeord\"\n\n#: src/ProfileChooser.vala:124\nmsgid \"Please enter a profile name.\"\nmsgstr \"Angiv et profilnavn.\"\n\n#: src/ProfileChooser.vala:131\nmsgid \"Profile name already taken.\"\nmsgstr \"Profilnavn allerede taget.\"\n\n#: src/MainWindow.vala:624\nmsgid \"Quit\"\nmsgstr \"Luk\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Citat\"\n\n#: src/ChatView.vala:509\nmsgid \"Quote selection\"\nmsgstr \"Citer fremhævet\"\n\n#: res/ui/settings-view.ui:731\nmsgid \"Reload custom theme\"\nmsgstr \"Genindlæs brugertema\"\n\n#: res/ui/settings-view.ui:226\nmsgid \"Remove password\"\nmsgstr \"Fjern kodeord\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"Fjern kodeord?\"\n\n#: src/SettingsView.vala:488\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"Ved at fjerne dit kodeord vil din profil, logfiler og indstillinger ikke længere være krypteret.\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"Ved at fjerne dit kodeord vil din profil, logfiler og indstillinger ikke længere være krypteret. <b>Vil du gerne fortsætte alligevel?</b>\"\n\n#: res/ui/settings-view.ui:1450\nmsgid \"Report an issue\"\nmsgstr \"Anmeld et problem\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart later\"\nmsgstr \"Genstart senere\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart now\"\nmsgstr \"Genstart nu\"\n\n#: src/MainWindow.vala:695\nmsgid \"Restart required\"\nmsgstr \"Genstart påkrævet\"\n\n#: src/MainWindow.vala:774\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin understøtter ikke ToxDNS endnu.\"\n\n#: src/MainWindow.vala:697\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Ricin skal genstarte for at kunne anvende indstillinger. Vil du genstarte nu?\"\n\n#: res/ui/settings-view.ui:1539\nmsgid \"Ricin official website\"\nmsgstr \"Ricin's officielle webside\"\n\n#: res/ui/chat-view.ui:1632\nmsgid \"Scroll to bottom\"\nmsgstr \"Scroll til bunden\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Vælg et vindue for at chatte\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Vælg en profil\"\n\n#: src/MainWindow.vala:851\nmsgid \"Select your avatar\"\nmsgstr \"Vælg dit profilbillede\"\n\n#: res/ui/chat-view.ui:1521\nmsgid \"Send file\"\nmsgstr \"Send fil\"\n\n#: res/ui/chat-view.ui:1546\nmsgid \"Send message\"\nmsgstr \"Send besked\"\n\n#: src/MainWindow.vala:135 src/MainWindow.vala:714 res/ui/main-window.ui:506\nmsgid \"Settings\"\nmsgstr \"Indstillinger\"\n\n#: res/ui/settings-view.ui:1186\nmsgid \"Show notifications when friends status changes?\"\nmsgstr \"Hvis en meddelelse når en ven skifter status?\"\n\n#: res/ui/chat-view.ui:787\nmsgid \"Status message...\"\nmsgstr \"Statusmeddelelse...\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Overstreget\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Syntaks\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Tag Navn\"\n\n#: src/ProfileChooser.vala:113\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Den valgte profil eksisterer ikke.\"\n\n#: res/ui/settings-view.ui:694\nmsgid \"Theme:\"\nmsgstr \"Tema:\"\n\n#: res/ui/chat-view.ui:1614\nmsgid \"There are unread messages in this chat\"\nmsgstr \"Der er ulæste beskeder i denne chat\"\n\n#: src/MessageListRow.vala:150 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS er ikke understøttet endnu.\"\n\n#: src/MainWindow.vala:776\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID må ikke være tomt.\"\n\n#: src/MainWindow.vala:778\nmsgid \"ToxID is invalid.\"\nmsgstr \"ToxID er ugyldigt.\"\n\n#: res/ui/main-window.ui:589\nmsgid \"ToxID to add...\"\nmsgstr \"ToxID at tilføje...\"\n\n#: res/ui/main-window.ui:193\nmsgid \"Type to search...\"\nmsgstr \"Skriv for at søge...\"\n\n#: src/ChatView.vala:731\nmsgid \"Unblock\"\nmsgstr \"Fjern blokering\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Unblock friend\"\nmsgstr \"Fjern blokering af ven\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Understreg\"\n\n#: src/SettingsView.vala:487\nmsgid \"Unencrypt your profile\"\nmsgstr \"Dekrypter din profil\"\n\n#: res/ui/chat-view.ui:764\nmsgid \"Username\"\nmsgstr \"Brugernavn\"\n\n#: res/ui/chat-view.ui:849\nmsgid \"Video call friend\"\nmsgstr \"Start videoopkald med ven\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"Hvidt tema\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:372\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"Ja\"\n\n#: res/ui/main-window.ui:267\nmsgid \"You got a new friend request\"\nmsgstr \"Du har modtaget en venneanmodning\"\n\n#: src/ChatView.vala:798 src/MainWindow.vala:854 src/SettingsView.vala:412\nmsgid \"_Cancel\"\nmsgstr \"_Annuller\"\n\n#: src/ChatView.vala:799 src/MainWindow.vala:855 src/SettingsView.vala:413\nmsgid \"_Open\"\nmsgstr \"_Åben\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__understreg__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_understreg_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`indlejret kode`\"\n\n#: src/SettingsView.vala:83\nmsgid \"default\"\nmsgstr \"standard\"\n\n#: src/ChatView.vala:372\nmsgid \"is typing\"\nmsgstr \"skriver\"\n\n#: res/ui/settings-view.ui:1607\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (stable)\"\n\n#: src/SettingsView.vala:84\nmsgid \"stable\"\nmsgstr \"stabil\"\n\n#: res/ui/settings-view.ui:1610\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~overstreget~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~overstreget~~\"\n"
  },
  {
    "path": "po/de.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# LeFlawk <dudelianer@gmail.com>, 2016\n# Sarah Kraßnigg <buckling.spring@tutanota.com>, 2016\n# SkyzohKey <SkyzohKey@users.noreply.github.com>, 2016\n# LeFlawk <dudelianer@gmail.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-07-02 21:20+0200\\n\"\n\"PO-Revision-Date: 2016-07-02 20:06+0000\\n\"\n\"Last-Translator: SkyzohKey <SkyzohKey@users.noreply.github.com>\\n\"\n\"Language-Team: German (http://www.transifex.com/ricinapp/ricin/language/de/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: de\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: src/ChatView.vala:387\nmsgid \" is now \"\nmsgstr \"ist jetzt\"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \"heißt jetzt\"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**fett**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*fett*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//kursiv//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/kursiv/\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"10\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"3 ungenutzte Profile gefunden:\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:801\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Verfügbare Markdown-Tags</b>\"\n\n#: res/ui/settings-view.ui:1065\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Statusänderungen von Freunden anzeigen?</b>\"\n\n#: res/ui/settings-view.ui:887\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Benutzerdefinierte Designs aktivieren?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Freunde</b>\"\n\n#: res/ui/settings-view.ui:672\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:1008\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Sprache</b>\"\n\n#: src/Wrapper.vala:784\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Zuletzt online:</b>\"\n\n#: res/ui/chat-view.ui:1125\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Zuletzt gesehen:</b>\"\n\n#: res/ui/settings-view.ui:736\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1470\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> will ein <i>sicherer, schlanker, vollständig anpassbarer und einfach zu hackender</i> Chat-Client für die großartige Open-Source-Bibliothek <b>ToxCore</b> sein. \"\n\n#: res/ui/settings-view.ui:1250\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Tippbenachrichtigungen senden?</b>\"\n\n#: res/ui/settings-view.ui:634\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Unbekannte Gegenstellen</b>\"\n\n#: res/ui/settings-view.ui:1429\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Version:</b>\"\n\n#: res/ui/settings-view.ui:281\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>Dein Tox-Profil:</b>\"\n\n#: res/ui/settings-view.ui:75\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Deine ToxID:</b>\"\n\n#: res/ui/chat-view.ui:1673\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Tippt gerade</i>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">Zitat\"\n\n#: res/ui/settings-view.ui:1648\nmsgid \"About\"\nmsgstr \"Über Ricin\"\n\n#: res/ui/main-window.ui:377\nmsgid \"Accept\"\nmsgstr \"Annehmen\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Annehmen/Wiederaufnehmen\"\n\n#: src/MainWindow.vala:609 src/MainWindow.vala:620 src/MainWindow.vala:645\n#: src/MainWindow.vala:659 res/ui/main-window.ui:475 res/ui/main-window.ui:542\nmsgid \"Add a friend\"\nmsgstr \"Einen Freund hinzufügen\"\n\n#: res/ui/main-window.ui:617\nmsgid \"Add friend\"\nmsgstr \"Freund hinzufügen\"\n\n#: res/ui/settings-view.ui:191\nmsgid \"Add password\"\nmsgstr \"Passwort hinzufügen\"\n\n#: src/MainWindow.vala:179\nmsgid \"All friends\"\nmsgstr \"Alle Freunde\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Alternativer Syntax\"\n\n#: src/MainWindow.vala:508 src/Util.vala:166\nmsgid \"Away\"\nmsgstr \"Abwesend\"\n\n#: res/ui/settings-view.ui:347\nmsgid \"Biography\"\nmsgstr \"Biografie\"\n\n#: src/ChatView.vala:561 res/ui/chat-view.ui:1227\nmsgid \"Block\"\nmsgstr \"Blockieren\"\n\n#: src/FriendListRow.vala:90\nmsgid \"Block friend\"\nmsgstr \"Freund blockieren\"\n\n#: src/Util.vala:160\nmsgid \"Blocked\"\nmsgstr \"Blockiert\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Fett\"\n\n#: src/MainWindow.vala:498 src/Util.vala:169\nmsgid \"Busy\"\nmsgstr \"Beschäftigt\"\n\n#: res/ui/chat-view.ui:854\nmsgid \"Call friend\"\nmsgstr \"Freund anrufen\"\n\n#: src/MainWindow.vala:110\nmsgid \"Can't load the profile\"\nmsgstr \"Profil kann nicht geladen werden\"\n\n#: res/ui/main-window.ui:638\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Abbrechen/Pausieren\"\n\n#: res/ui/settings-view.ui:104\nmsgid \"Change Nospam\"\nmsgstr \"Nospam ändern\"\n\n#: res/ui/settings-view.ui:208\nmsgid \"Change password\"\nmsgstr \"Passwort ändern\"\n\n#: res/ui/main-window.ui:87\nmsgid \"Change your avatar\"\nmsgstr \"Avatar ändern\"\n\n#: res/ui/main-window.ui:134\nmsgid \"Change your status\"\nmsgstr \"Status ändern\"\n\n#: res/ui/settings-view.ui:601\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"Änderungen an den Netzwerkeinstellungen werden deine Verbindung zum Tox-Netzwerk temporär trennen.\"\n\n#: src/SettingsView.vala:447\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"Bei änderung des Passwortes wird ihr Profil entschlüsselt und mit dem neuen Passwort verschlüsselt.\"\n\n#: src/ChatView.vala:628\nmsgid \"Choose a file\"\nmsgstr \"Datei wählen\"\n\n#: src/SettingsView.vala:393\nmsgid \"Choose a folder where to save files\"\nmsgstr \"Wählen sie den Ordner, wo Dateien gespeichert werden\"\n\n#: src/ProfileChooser.vala:142\nmsgid \"Choose a name for the profile\"\nmsgstr \"Wähle einen Namen für das Profil\"\n\n#: res/ui/settings-view.ui:535\nmsgid \"Choose directory\"\nmsgstr \"Ordner auswählen\"\n\n#: res/ui/chat-view.ui:1474\nmsgid \"Choose smileys\"\nmsgstr \"Smilies wählen\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"Helleres Design\"\n\n#: res/ui/chat-view.ui:1373\nmsgid \"Close the popup\"\nmsgstr \"Popup schließen\"\n\n#: res/ui/settings-view.ui:1307\nmsgid \"Compact friend list?\"\nmsgstr \"Kompakte Freundesliste?\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"Neues Passwort bestätigen\"\n\n#: res/ui/settings-view.ui:1538\nmsgid \"Contributors\"\nmsgstr \"Mitwirkende\"\n\n#: res/ui/settings-view.ui:86 res/ui/settings-view.ui:303\nmsgid \"Copy\"\nmsgstr \"Kopieren\"\n\n#: res/ui/chat-view.ui:1267\nmsgid \"Copy friend's ToxID\"\nmsgstr \"ToxID des Freundes kopieren\"\n\n#: src/ChatView.vala:433\nmsgid \"Copy quote in clipboard\"\nmsgstr \"Zitat in die Zwischenablage kopieren\"\n\n#: src/ChatView.vala:432\nmsgid \"Copy selection in clipboard\"\nmsgstr \"Ausgewähltes in die Zwischenablage kopieren\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"Profil erstellen\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"Dieses Profil erstellen\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"Aktuelles Passwort\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"Das jetzige Passwort kann nicht leer sein\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"Dunkles Design\"\n\n#: res/ui/main-window.ui:357\nmsgid \"Decline\"\nmsgstr \"Ablehnen\"\n\n#: res/ui/settings-view.ui:507\nmsgid \"Default save path:\"\nmsgstr \"Standard Speicher-Pfad\"\n\n#: res/ui/chat-view.ui:1247\nmsgid \"Delete\"\nmsgstr \"Löschen\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Freunde löschen (3)\"\n\n#: res/ui/settings-view.ui:1185\nmsgid \"Display typing notifications?\"\nmsgstr \"Schreibbenachrichtigungen senden?\"\n\n#: res/ui/settings-view.ui:1121\nmsgid \"Display unread messages notice?\"\nmsgstr \"Ungelesene Nachrichten-Meldung zeigen?\"\n\n#: src/SettingsView.vala:419 src/SettingsView.vala:447\n#: src/SettingsView.vala:472\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"Wollen sie trotzdem fortfahren?\"\n\n#: src/SettingsView.vala:446\nmsgid \"Edit your password\"\nmsgstr \"Passwort ändern\"\n\n#: src/SettingsView.vala:418\nmsgid \"Encrypt your profile\"\nmsgstr \"Profil verschlüsseln\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"Name des Profils eingeben\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"Passwort eingeben...\"\n\n#: res/ui/chat-view.ui:763\nmsgid \"Friend's profile\"\nmsgstr \"Profil des Freundes\"\n\n#: res/ui/settings-view.ui:571\nmsgid \"General\"\nmsgstr \"Allgemeines\"\n\n#: res/ui/settings-view.ui:1500\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Name des Gruppenchats\"\n\n#: src/MainWindow.vala:463\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Hallo! Hier ist %s, lass uns Freunde werden.\"\n\n#: src/InlineImageMessageListRow.vala:103\nmsgid \"Image saved!\"\nmsgstr \"Bild gespeichert!\"\n\n#: src/SettingsView.vala:419\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"Um Ihr profil zu verschlüsseln, müssen sie ein Passwort angeben. Dieses Passwort muss bei jedem Login eingegeben werden.\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"Inline-Code\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"Interface\"\nmsgstr \"Interface\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Kursiv\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Verlassen\"\n\n#: res/ui/settings-view.ui:1588\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Lizenz (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"Ein Profil laden\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"Anmelden\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Stummschalten\"\n\n#: res/ui/settings-view.ui:843\nmsgid \"Network\"\nmsgstr \"Netzwerk\"\n\n#: res/ui/settings-view.ui:425\nmsgid \"New Tox alias\"\nmsgstr \"Neues Tox-Profil\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"Neues Passwort\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"Neues Passwort muss sich vom alten Unterscheiden\"\n\n#: src/MainWindow.vala:435 src/SettingsView.vala:343\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"Nein\"\n\n#: res/ui/chat-view.ui:1162\nmsgid \"Notes about the user:\"\nmsgstr \"Hinweise zu diesem Nutzer:\"\n\n#: src/Util.vala:173\nmsgid \"Offline\"\nmsgstr \"Offline\"\n\n#: src/MainWindow.vala:488 src/Util.vala:163\nmsgid \"Online\"\nmsgstr \"Online\"\n\n#: src/MainWindow.vala:178\nmsgid \"Online friends\"\nmsgstr \"Angemeldete Freunde\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"Stärke des Passworts\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"Passwort kann nicht leer sein.\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"Passwort bestätigung kann nicht leer sein.\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"Passwort stimmt nicht überein.\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"Das Passwort muss mindestens 8 Zeichen lang sein.\"\n\n#: src/ProfileChooser.vala:98\nmsgid \"Please enter a password\"\nmsgstr \"Bitte geben sie ein Passwort ein\"\n\n#: src/ProfileChooser.vala:121\nmsgid \"Please enter a profile name.\"\nmsgstr \"Bitte gib einen Namen für das Profil ein.\"\n\n#: src/ProfileChooser.vala:128\nmsgid \"Profile name already taken.\"\nmsgstr \"Dieser Profilname ist bereits vergeben.\"\n\n#: src/MainWindow.vala:518\nmsgid \"Quit\"\nmsgstr \"Beenden\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Zitat\"\n\n#: src/ChatView.vala:434\nmsgid \"Quote selection\"\nmsgstr \"Zitat Auswahl\"\n\n#: res/ui/settings-view.ui:962\nmsgid \"Reload custom theme\"\nmsgstr \"Eigenes Design neu laden\"\n\n#: res/ui/settings-view.ui:225\nmsgid \"Remove password\"\nmsgstr \"Passwort entfernen\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"Passwort entfernen?\"\n\n#: src/SettingsView.vala:472\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"Wenn sie das Passwort entfernen, wird ihr Profil, Chat Logs und Einstellungen entschlüsselt.\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"Wenn sie das Passwort entfernen, wird ihr Profil, Chat Logs und Einstellungen entschlüsselt. <b>Wollen sie trotzdem fortfahren?</b>\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"Report an issue\"\nmsgstr \"Problem melden\"\n\n#: res/ui/settings-view.ui:458\nmsgid \"Request deletion\"\nmsgstr \"Löschung anfordern\"\n\n#: src/MainWindow.vala:592\nmsgid \"Restart later\"\nmsgstr \"Später Neustarten\"\n\n#: src/MainWindow.vala:592\nmsgid \"Restart now\"\nmsgstr \"Jetzt Neustarten\"\n\n#: src/MainWindow.vala:589\nmsgid \"Restart required\"\nmsgstr \"Neustart benötigt\"\n\n#: src/MainWindow.vala:668\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin unterstützt ToxDNS derzeit nicht.\"\n\n#: src/MainWindow.vala:591\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Ricin muss neugestartet werden, um die Einstellungen Anzuwenden. Wollen sie jetzt Neustarten?\"\n\n#: res/ui/settings-view.ui:1608\nmsgid \"Ricin official website\"\nmsgstr \"Offizielle Website von Ricin\"\n\n#: res/ui/chat-view.ui:1615\nmsgid \"Scroll to bottom\"\nmsgstr \"Nach unten Scrollen\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Wähle einen Chat, um mit dem Chatten zu beginnen.\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Profil wählen\"\n\n#: src/MainWindow.vala:745\nmsgid \"Select your avatar\"\nmsgstr \"Wähle deinen Avatar\"\n\n#: res/ui/chat-view.ui:1502\nmsgid \"Send file\"\nmsgstr \"Datei senden\"\n\n#: res/ui/chat-view.ui:1528\nmsgid \"Send message\"\nmsgstr \"Nachricht senden\"\n\n#: src/MainWindow.vala:124 src/MainWindow.vala:608 res/ui/main-window.ui:495\nmsgid \"Settings\"\nmsgstr \"Einstellungen\"\n\n#: res/ui/chat-view.ui:820\nmsgid \"Status message...\"\nmsgstr \"Statusnachricht...\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Durchgestrichen\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Syntax\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Tag-Name\"\n\n#: src/ProfileChooser.vala:110\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Das gewählte Profil existiert nicht.\"\n\n#: res/ui/settings-view.ui:926\nmsgid \"Theme:\"\nmsgstr \"Thema:\"\n\n#: res/ui/chat-view.ui:1597\nmsgid \"There are unread messages in this chat\"\nmsgstr \"In diesem Chat sind ungelesene Nachrichten.\"\n\n#: src/MessageListRow.vala:102 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS wird derzeit nicht unterstützt.\"\n\n#: src/MainWindow.vala:670\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID muss angegeben werden.\"\n\n#: src/MainWindow.vala:672\nmsgid \"ToxID is invalid.\"\nmsgstr \"Ungültige ToxID.\"\n\n#: res/ui/main-window.ui:563\nmsgid \"ToxID to add...\"\nmsgstr \"Hinzuzufügende ToxID...\"\n\n#: res/ui/settings-view.ui:358\nmsgid \"ToxMe server\"\nmsgstr \"ToxMe-Server\"\n\n#: res/ui/main-window.ui:191\nmsgid \"Type to search...\"\nmsgstr \"Zum Suchen tippen...\"\n\n#: src/ChatView.vala:559\nmsgid \"Unblock\"\nmsgstr \"Entsperren\"\n\n#: src/FriendListRow.vala:90\nmsgid \"Unblock friend\"\nmsgstr \"Freund entsperren\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Unterstreichen\"\n\n#: src/SettingsView.vala:471\nmsgid \"Unencrypt your profile\"\nmsgstr \"Profil entschlüsseln\"\n\n#: res/ui/settings-view.ui:441\nmsgid \"Update record\"\nmsgstr \"Angaben aktualisieren\"\n\n#: res/ui/chat-view.ui:797 res/ui/settings-view.ui:336\nmsgid \"Username\"\nmsgstr \"Benutzername\"\n\n#: res/ui/chat-view.ui:882\nmsgid \"Video call friend\"\nmsgstr \"Videoanruf beginnen\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"Weißes Design\"\n\n#: src/MainWindow.vala:435 src/SettingsView.vala:342\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"Ja\"\n\n#: res/ui/main-window.ui:261\nmsgid \"You got a new friend request\"\nmsgstr \"Du hast eine neue Freundschaftsanfrage\"\n\n#: src/ChatView.vala:629 src/MainWindow.vala:748 src/SettingsView.vala:396\nmsgid \"_Cancel\"\nmsgstr \"_Abbrechen\"\n\n#: src/ChatView.vala:630 src/MainWindow.vala:749 src/SettingsView.vala:397\nmsgid \"_Open\"\nmsgstr \"_Öffnen\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__underline__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_underline_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`inline code`\"\n\n#: src/SettingsView.vala:80\nmsgid \"default\"\nmsgstr \"Standard\"\n\n#: src/ChatView.vala:337\nmsgid \"is typing\"\nmsgstr \"tippt gerade\"\n\n#: res/ui/settings-view.ui:1676\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (stable)\"\n\n#: src/SettingsView.vala:81\nmsgid \"stable\"\nmsgstr \"stable\"\n\n#: res/ui/settings-view.ui:1679\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~striked~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~striked~~\"\n"
  },
  {
    "path": "po/en_US.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: 2016-03-08 11:04+0100\\n\"\n\"PO-Revision-Date: 2016-03-08 11:04+0100\\n\"\n\"Last-Translator: SkyzohKey <skyzohkey@tuta.io>\\n\"\n\"Language-Team: \\n\"\n\"Language: en_US\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Poedit 1.8.6\\n\"\n\"X-Poedit-Basepath: ..\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"X-Poedit-SearchPath-0: src\\n\"\n\"X-Poedit-SearchPath-1: res/ui\\n\"\n\n#: res/ui/chat-view.ui:95\nmsgid \"Friend's profile\"\nmsgstr \"Friend's profile\"\n\n#: res/ui/chat-view.ui:129 res/ui/settings-view.ui:251\nmsgid \"Username\"\nmsgstr \"Username\"\n\n#: res/ui/chat-view.ui:152\nmsgid \"Status message...\"\nmsgstr \"Status message...\"\n\n#: res/ui/chat-view.ui:186\nmsgid \"Call friend\"\nmsgstr \"Call friend\"\n\n#: res/ui/chat-view.ui:214\nmsgid \"Video call friend\"\nmsgstr \"Video call friend\"\n\n#: res/ui/chat-view.ui:456\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Last seen:</b>\"\n\n#: res/ui/chat-view.ui:493\nmsgid \"Notes about the user:\"\nmsgstr \"Notes about the user:\"\n\n#: res/ui/chat-view.ui:558 src/ChatView.vala:325\nmsgid \"Block\"\nmsgstr \"Block\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"Delete\"\nmsgstr \"Delete\"\n\n#: res/ui/chat-view.ui:598\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Copy friend's ToxID\"\n\n#: res/ui/chat-view.ui:700\nmsgid \"Choose smileys\"\nmsgstr \"Choose smileys\"\n\n#: res/ui/chat-view.ui:727\nmsgid \"Send file\"\nmsgstr \"Send file\"\n\n#: res/ui/chat-view.ui:753\nmsgid \"Send message\"\nmsgstr \"Send message\"\n\n#: res/ui/chat-view.ui:843\nmsgid \"Close the popup\"\nmsgstr \"Close the popup\"\n\n#: res/ui/chat-view.ui:911\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Friend is typing</i>\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"\"\n\"3 contacts inutiles trouvés:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Delete friends (3)\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Groupchat name\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Friends</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Unknown peers</b>\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Leave\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Mute\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Cancel/pause file\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Accept/Resume file\"\n\n#: res/ui/main-window.ui:86\nmsgid \"Change your avatar\"\nmsgstr \"Change your avatar\"\n\n#: res/ui/main-window.ui:133\nmsgid \"Change your status\"\nmsgstr \"Change your status\"\n\n#: res/ui/main-window.ui:188\nmsgid \"Type to search...\"\nmsgstr \"Type to search...\"\n\n#: res/ui/main-window.ui:256\nmsgid \"You got a new friend request\"\nmsgstr \"You got a new friend request\"\n\n#: res/ui/main-window.ui:352\nmsgid \"Decline\"\nmsgstr \"Decline\"\n\n#: res/ui/main-window.ui:372\nmsgid \"Accept\"\nmsgstr \"Accept\"\n\n#: res/ui/main-window.ui:470 res/ui/main-window.ui:537 src/MainWindow.vala:491\n#: src/MainWindow.vala:516\nmsgid \"Add a friend\"\nmsgstr \"Add a friend\"\n\n#: res/ui/main-window.ui:490 src/MainWindow.vala:480\nmsgid \"Settings\"\nmsgstr \"Settings\"\n\n#: res/ui/main-window.ui:558\nmsgid \"ToxID to add...\"\nmsgstr \"ToxID to add...\"\n\n#: res/ui/main-window.ui:612\nmsgid \"Add friend\"\nmsgstr \"Add friend\"\n\n#: res/ui/main-window.ui:633\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\n#: res/ui/profile-chooser-window.ui:23 src/ProfileChooser.vala:20\nmsgid \"Select a profile\"\nmsgstr \"Select a profile\"\n\n#: res/ui/profile-chooser-window.ui:50\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: res/ui/profile-chooser-window.ui:72\nmsgid \"Load a profile\"\nmsgstr \"Load a profile\"\n\n#: res/ui/profile-chooser-window.ui:88\nmsgid \"Enter a name for the profile\"\nmsgstr \"Enter a name for the profile\"\n\n#: res/ui/profile-chooser-window.ui:116\nmsgid \"Create this profile\"\nmsgstr \"Create this profile\"\n\n#: res/ui/profile-chooser-window.ui:141\nmsgid \"Create a profile\"\nmsgstr \"Create a profile\"\n\n#: res/ui/settings-view.ui:77\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Your ToxID:</b>\"\n\n#: res/ui/settings-view.ui:88 res/ui/settings-view.ui:218\nmsgid \"Copy\"\nmsgstr \"Copy\"\n\n#: res/ui/settings-view.ui:106\nmsgid \"Change Nospam\"\nmsgstr \"Change Nospam\"\n\n#: res/ui/settings-view.ui:196\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>Your Tox alias:</b>\"\n\n#: res/ui/settings-view.ui:262\nmsgid \"Biography\"\nmsgstr \"Biography\"\n\n#: res/ui/settings-view.ui:273\nmsgid \"ToxMe server\"\nmsgstr \"ToxMe server\"\n\n#: res/ui/settings-view.ui:340\nmsgid \"New Tox alias\"\nmsgstr \"New Tox alias\"\n\n#: res/ui/settings-view.ui:356\nmsgid \"Update record\"\nmsgstr \"Update record\"\n\n#: res/ui/settings-view.ui:373\nmsgid \"Request deletion\"\nmsgstr \"Request deletion\"\n\n#: res/ui/settings-view.ui:415\nmsgid \"General\"\nmsgstr \"General\"\n\n#: res/ui/settings-view.ui:447\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"\"\n\"En modifiant les paramètres Réseau vous allez temporairement être deconnecté \"\n\"du réseau Tox\"\n\n#: res/ui/settings-view.ui:480\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/settings-view.ui:518\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:582\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:687\nmsgid \"Network\"\nmsgstr \"Network\"\n\n#: res/ui/settings-view.ui:726\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Enable custom themes?</b>\"\n\n#: res/ui/settings-view.ui:783\nmsgid \"Reload custom theme\"\nmsgstr \"Reload custom theme\"\n\n#: res/ui/settings-view.ui:835\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Display friend's status changes?</b>\"\n\n#: res/ui/settings-view.ui:891\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Send typing notifications?</b>\"\n\n#: res/ui/settings-view.ui:955\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Language:</b>\"\n\n#: res/ui/settings-view.ui:1007\nmsgid \"Interface\"\nmsgstr \"Interface\"\n\n#: res/ui/settings-view.ui:1061\nmsgid \"Ricin\"\nmsgstr \"Ricin\"\n\n#: res/ui/settings-view.ui:1093\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Version:</b>\"\n\n#: res/ui/settings-view.ui:1134\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source <b>ToxCore</\"\n\"b> library.\"\nmsgstr \"\"\n\"<b>Ricin</b> se veut être un logiciel de discussions instantanées \"\n\"<i>sécurisé, léger et customisable à souhait</i> en utilisant la super \"\n\"bibliothèque open-source <b>ToxCore</b>\"\n\n#: res/ui/settings-view.ui:1164\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/settings-view.ui:1183\nmsgid \"Report an issue\"\nmsgstr \"Report an issue\"\n\n#: res/ui/settings-view.ui:1202\nmsgid \"Contributors\"\nmsgstr \"Contributors\"\n\n#: res/ui/settings-view.ui:1252\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"License (GNU General Public License 3)\"\n\n#: res/ui/settings-view.ui:1272\nmsgid \"Ricin official website\"\nmsgstr \"Ricin official website\"\n\n#: res/ui/settings-view.ui:1312\nmsgid \"About\"\nmsgstr \"About\"\n\n#: res/ui/settings-view.ui:1340\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (stable)\"\n\n#: res/ui/settings-view.ui:1343\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Select a chat to start messaging.\"\n\n#: src/ChatView.vala:243\nmsgid \"is typing\"\nmsgstr \"is typing\"\n\n#: src/ChatView.vala:289\nmsgid \" is now \"\nmsgstr \" is now \"\n\n#: src/ChatView.vala:323\nmsgid \"Unblock\"\nmsgstr \"Unblock\"\n\n#: src/ChatView.vala:401\nmsgid \"Choose a file\"\nmsgstr \"Choose a file\"\n\n#: src/ChatView.vala:402 src/MainWindow.vala:605\nmsgid \"_Cancel\"\nmsgstr \"_Cancel\"\n\n#: src/ChatView.vala:403 src/MainWindow.vala:606\nmsgid \"_Open\"\nmsgstr \"_Open\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Unblock friend\"\nmsgstr \"Unblock friend\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Block friend\"\nmsgstr \"Block friend\"\n\n#: src/InlineImageMessageListRow.vala:97\nmsgid \"Image saved!\"\nmsgstr \"Image saved!\"\n\n#: src/MainWindow.vala:97\nmsgid \"Yes\"\nmsgstr \"Yes\"\n\n#: src/MainWindow.vala:97\nmsgid \"No\"\nmsgstr \"No\"\n\n#: src/MainWindow.vala:147\nmsgid \"Can't load the profile\"\nmsgstr \"Can't load the profile\"\n\n#: src/MainWindow.vala:204\nmsgid \"Online friends\"\nmsgstr \"Online friends\"\n\n#: src/MainWindow.vala:205\nmsgid \"All friends\"\nmsgstr \"All friends\"\n\n#: src/MainWindow.vala:384\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Hello! It's %s, let's be friends.\"\n\n#: src/MainWindow.vala:409 src/Util.vala:157\nmsgid \"Online\"\nmsgstr \"Online\"\n\n#: src/MainWindow.vala:419 src/Util.vala:163\nmsgid \"Busy\"\nmsgstr \"Busy\"\n\n#: src/MainWindow.vala:429 src/Util.vala:160\nmsgid \"Away\"\nmsgstr \"Away\"\n\n#: src/MainWindow.vala:439\nmsgid \"Quit\"\nmsgstr \"Quit\"\n\n#: src/MainWindow.vala:525\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin doesn't supports ToxDNS yet.\"\n\n#: src/MainWindow.vala:527\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID can't be empty.\"\n\n#: src/MainWindow.vala:529\nmsgid \"ToxID is invalid.\"\nmsgstr \"ToxID is invalid.\"\n\n#: src/MainWindow.vala:602\nmsgid \"Select your avatar\"\nmsgstr \"Select your avatar\"\n\n#: src/MessageListRow.vala:54 src/PlainLabel.vala:20 src/QuoteLabel.vala:20\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS is not supported yet.\"\n\n#: src/ProfileChooser.vala:61\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"The selected profile doesn't exists.\"\n\n#: src/ProfileChooser.vala:70\nmsgid \"Please enter a profile name.\"\nmsgstr \"Please enter a profile name.\"\n\n#: src/ProfileChooser.vala:77\nmsgid \"Profile name already taken.\"\nmsgstr \"Profile name already taken.\"\n\n#: src/ProfileChooser.vala:89\nmsgid \"Choose a name for the profile\"\nmsgstr \"Choose a name for the profile\"\n\n#: src/SettingsView.vala:73\nmsgid \"default\"\nmsgstr \"default\"\n\n#: src/SettingsView.vala:74\nmsgid \"stable\"\nmsgstr \"stable\"\n\n#: src/SettingsView.vala:83\nmsgid \"Dark theme\"\nmsgstr \"Dark theme\"\n\n#: src/SettingsView.vala:84\nmsgid \"White theme\"\nmsgstr \"White theme\"\n\n#: src/SettingsView.vala:85\nmsgid \"Clearer theme\"\nmsgstr \"Clearer theme\"\n\n#: src/Util.vala:154\nmsgid \"Blocked\"\nmsgstr \"Blocked\"\n\n#: src/Util.vala:167\nmsgid \"Offline\"\nmsgstr \"Offline\"\n\n#: src/Wrapper.vala:218\nmsgid \" is now known as \"\nmsgstr \" is now known as \"\n\n#: src/Wrapper.vala:580\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Last online:</b>\"\n\n#~ msgid \"SkyzohKey\"\n#~ msgstr \"SkyzohKey\"\n\n#~ msgid \"14:30\"\n#~ msgstr \"14:30\"\n\n#~ msgid \"name\"\n#~ msgstr \"name\"\n\n#~ msgid \"status\"\n#~ msgstr \"status\"\n\n#~ msgid \"Topic text ipsum dolores sit amet\"\n#~ msgstr \"Topic text ipsum dolores sit amet\"\n\n#~ msgid \"label\"\n#~ msgstr \"label\"\n\n#~ msgid \"file_name.ext\"\n#~ msgstr \"file_name.ext\"\n\n#~ msgid \"(0 Kb)\"\n#~ msgstr \"(0 Kb)\"\n\n#~ msgid \"00:00.00\"\n#~ msgstr \"00:00.00\"\n\n#~ msgid \"notify\"\n#~ msgstr \"notify\"\n\n#~ msgid \"text\"\n#~ msgstr \"text\"\n\n#~ msgid \"quote\"\n#~ msgstr \"quote\"\n\n#~ msgid \"127.0.0.1\"\n#~ msgstr \"127.0.0.1\"\n\n#~ msgid \":\"\n#~ msgstr \":\"\n\n#~ msgid \"9050\"\n#~ msgstr \"9050\"\n\n#~ msgid \"<i>0.0.3-alpha</i>\"\n#~ msgstr \"<i>0.0.3-alpha</i>\"\n\n#~ msgid \"$(Ricin.APP_NAME) - Select a profile\"\n#~ msgstr \"$(Ricin.APP_NAME) - Choisissez un profil\"\n"
  },
  {
    "path": "po/eo.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Kamparano <kamparano.viro@gmail.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-03-08 18:19+0100\\n\"\n\"PO-Revision-Date: 2016-03-10 02:05+0100\\n\"\n\"Last-Translator: SkyzohKey <skyzohkey@tuta.io>\\n\"\n\"Language-Team: Esperanto (http://www.transifex.com/ricinapp/ricin/language/eo/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: eo\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.8.6\\n\"\n\n#: src/ChatView.vala:289\nmsgid \" is now \"\nmsgstr \" estas nun \"\n\n#: src/Wrapper.vala:218\nmsgid \" is now known as \"\nmsgstr \" estas nun konita kiel \"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"\"\n\"3 neuzitajn profilojn trovita:\\n\"\n\"<b>Neĝ', Ulo, Aztek'</b>\"\n\n#: res/ui/settings-view.ui:835\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Ĉu vidigi amikoajn statusajn ŝanĝojn?\"\n\n#: res/ui/settings-view.ui:726\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Ĉu ebligi proprajn hautojn?\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Amikoj</b>\"\n\n#: res/ui/settings-view.ui:518\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:955\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Lingvo:</b>\"\n\n#: src/Wrapper.vala:580\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Lasta retkonektita:</b>\"\n\n#: res/ui/chat-view.ui:456\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Lasta vidita:</b>\"\n\n#: res/ui/settings-view.ui:582\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Prokurilo (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1134\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-customizable</i> chat client using the awesome and open-source <b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> celas esti <i>sekura, malpeza, hakebla kaj tute-tajlorebla</i> babila kliento uzanta la mojosan kaj libera-kodan <b>ToxCore</b>-bibliotekon.\"\n\n#: res/ui/settings-view.ui:891\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Ĉu sendi tajpadajn anoncadojn?</b>\"\n\n#: res/ui/settings-view.ui:480\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Nekonitaj kolegoj\"\n\n#: res/ui/settings-view.ui:1093\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Versio:</b>\"\n\n#: res/ui/settings-view.ui:196\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>Vian Tox-alinomo:</b>\"\n\n#: res/ui/settings-view.ui:77\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Vian ToxID:</b>\"\n\n#: res/ui/chat-view.ui:911\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Amiko tajpas</i>\"\n\n#: res/ui/settings-view.ui:1312\nmsgid \"About\"\nmsgstr \"Pri\"\n\n#: res/ui/main-window.ui:372\nmsgid \"Accept\"\nmsgstr \"Akcepti\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Akcepti/rekomenci dosieron\"\n\n#: src/MainWindow.vala:491 src/MainWindow.vala:516 res/ui/main-window.ui:470 res/ui/main-window.ui:537\nmsgid \"Add a friend\"\nmsgstr \"Aldoni amikon\"\n\n#: res/ui/main-window.ui:612\nmsgid \"Add friend\"\nmsgstr \"Aldoni amikon\"\n\n#: src/MainWindow.vala:205\nmsgid \"All friends\"\nmsgstr \"Ĉiom da amikoj\"\n\n#: src/MainWindow.vala:429 src/Util.vala:160\nmsgid \"Away\"\nmsgstr \"Fora\"\n\n#: res/ui/settings-view.ui:262\nmsgid \"Biography\"\nmsgstr \"Biografio\"\n\n#: src/ChatView.vala:325 res/ui/chat-view.ui:558\nmsgid \"Block\"\nmsgstr \"Bloki\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Block friend\"\nmsgstr \"Bloki amikon\"\n\n#: src/Util.vala:154\nmsgid \"Blocked\"\nmsgstr \"Blokita\"\n\n#: src/MainWindow.vala:419 src/Util.vala:163\nmsgid \"Busy\"\nmsgstr \"Okupita\"\n\n#: res/ui/chat-view.ui:186\nmsgid \"Call friend\"\nmsgstr \"Telefoni amikon\"\n\n#: src/MainWindow.vala:147\nmsgid \"Can't load the profile\"\nmsgstr \"Ne povas ŝorĝi la profilon\"\n\n#: res/ui/main-window.ui:633\nmsgid \"Cancel\"\nmsgstr \"Malmendi\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Malmendi/pausi dosieron\"\n\n#: res/ui/settings-view.ui:106\nmsgid \"Change Nospam\"\nmsgstr \"Ŝanĝi Nespamon\"\n\n#: res/ui/main-window.ui:86\nmsgid \"Change your avatar\"\nmsgstr \"Ŝangi vian profilbildon\"\n\n#: res/ui/main-window.ui:133\nmsgid \"Change your status\"\nmsgstr \"Ŝanĝu vian statuson\"\n\n#: res/ui/settings-view.ui:447\nmsgid \"Changing Network settings will temporarily disconnect you from the Tox network\"\nmsgstr \"Ŝanĝado retajn agordojn portempe malkonektos vin el la Tox-reto.\"\n\n#: src/ChatView.vala:401\nmsgid \"Choose a file\"\nmsgstr \"Elekti dosieron\"\n\n#: src/ProfileChooser.vala:89\nmsgid \"Choose a name for the profile\"\nmsgstr \"Elekti nomon por la profilo\"\n\n#: res/ui/chat-view.ui:700\nmsgid \"Choose smileys\"\nmsgstr \"Elekti ridetaĵojn\"\n\n#: src/SettingsView.vala:85\nmsgid \"Clearer theme\"\nmsgstr \"Pli klara hauto\"\n\n#: res/ui/chat-view.ui:843\nmsgid \"Close the popup\"\nmsgstr \"Fermi la ŝprucfenestron\"\n\n#: res/ui/settings-view.ui:1202\nmsgid \"Contributors\"\nmsgstr \"Kontribuistoj\"\n\n#: res/ui/settings-view.ui:88 res/ui/settings-view.ui:218\nmsgid \"Copy\"\nmsgstr \"Kopii\"\n\n#: res/ui/chat-view.ui:598\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Kopii amikoan ToxID-on\"\n\n#: res/ui/profile-chooser-window.ui:141\nmsgid \"Create a profile\"\nmsgstr \"Krei profilon\"\n\n#: res/ui/profile-chooser-window.ui:116\nmsgid \"Create this profile\"\nmsgstr \"Krei ĉi tiun profilon\"\n\n#: src/SettingsView.vala:83\nmsgid \"Dark theme\"\nmsgstr \"Malhela hauto\"\n\n#: res/ui/main-window.ui:352\nmsgid \"Decline\"\nmsgstr \"Malakcepti\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"Delete\"\nmsgstr \"Forigi\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Forigi amikojn (3)\"\n\n#: res/ui/profile-chooser-window.ui:88\nmsgid \"Enter a name for the profile\"\nmsgstr \"Enskribi nomon por la profilo\"\n\n#: res/ui/chat-view.ui:95\nmsgid \"Friend's profile\"\nmsgstr \"Amikoa profilo\"\n\n#: res/ui/settings-view.ui:415\nmsgid \"General\"\nmsgstr \"Ĝenerala\"\n\n#: res/ui/settings-view.ui:1164\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Grupbabileja nomo\"\n\n#: src/MainWindow.vala:384\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Saluton! Jen %s, ni amikiĝu.\"\n\n#: src/InlineImageMessageListRow.vala:97\nmsgid \"Image saved!\"\nmsgstr \"Bildo konservitas!\"\n\n#: res/ui/settings-view.ui:1007\nmsgid \"Interface\"\nmsgstr \"Interfaco\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Foriri\"\n\n#: res/ui/settings-view.ui:1252\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Permisilo (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:72\nmsgid \"Load a profile\"\nmsgstr \"Ŝorĝi profilon\"\n\n#: res/ui/profile-chooser-window.ui:50\nmsgid \"Login\"\nmsgstr \"Ensaluti\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Silentigi\"\n\n#: res/ui/settings-view.ui:687\nmsgid \"Network\"\nmsgstr \"Reto\"\n\n#: res/ui/settings-view.ui:340\nmsgid \"New Tox alias\"\nmsgstr \"Nova Tox-alinomo\"\n\n#: src/MainWindow.vala:97\nmsgid \"No\"\nmsgstr \"Ne\"\n\n#: res/ui/chat-view.ui:493\nmsgid \"Notes about the user:\"\nmsgstr \"Rimarkoj pri la uzanto:\"\n\n#: src/Util.vala:167\nmsgid \"Offline\"\nmsgstr \"Neretkonektita\"\n\n#: src/MainWindow.vala:409 src/Util.vala:157\nmsgid \"Online\"\nmsgstr \"Retkonektita\"\n\n#: src/MainWindow.vala:204\nmsgid \"Online friends\"\nmsgstr \"Retkonektitaj amikoj\"\n\n#: src/ProfileChooser.vala:70\nmsgid \"Please enter a profile name.\"\nmsgstr \"Bonvole enskribi profilan nomon.\"\n\n#: src/ProfileChooser.vala:77\nmsgid \"Profile name already taken.\"\nmsgstr \"Profila nomo jam uzitas.\"\n\n#: src/MainWindow.vala:439\nmsgid \"Quit\"\nmsgstr \"Forlasi\"\n\n#: res/ui/settings-view.ui:783\nmsgid \"Reload custom theme\"\nmsgstr \"Reŝarĝo propran hauton.\"\n\n#: res/ui/settings-view.ui:1183\nmsgid \"Report an issue\"\nmsgstr \"Raporti problemon\"\n\n#: res/ui/settings-view.ui:373\nmsgid \"Request deletion\"\nmsgstr \"Peti forigadon\"\n\n#: res/ui/settings-view.ui:1061\nmsgid \"Ricin\"\nmsgstr \"Ricin\"\n\n#: src/MainWindow.vala:525\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin ne subtenas ToxDNS-on jam.\"\n\n#: res/ui/settings-view.ui:1272\nmsgid \"Ricin official website\"\nmsgstr \"Ricin oficiala retejo\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Elekti babilon por komenci mesaĝi.\"\n\n#: src/ProfileChooser.vala:20 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Elekti profilon\"\n\n#: src/MainWindow.vala:602\nmsgid \"Select your avatar\"\nmsgstr \"Elekti vian profilbildon\"\n\n#: res/ui/chat-view.ui:727\nmsgid \"Send file\"\nmsgstr \"Sendi dosieron\"\n\n#: res/ui/chat-view.ui:753\nmsgid \"Send message\"\nmsgstr \"Sendi mesaĝon\"\n\n#: src/MainWindow.vala:159 src/MainWindow.vala:480 res/ui/main-window.ui:490\nmsgid \"Settings\"\nmsgstr \"Agordoj\"\n\n#: res/ui/chat-view.ui:152\nmsgid \"Status message...\"\nmsgstr \"Statusa mesaĝo...\"\n\n#: src/ProfileChooser.vala:61\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"La elektita profilo ne ekzistas.\"\n\n#: src/MessageListRow.vala:54 src/PlainLabel.vala:20 src/QuoteLabel.vala:20\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS ne estas subtenita jam.\"\n\n#: src/MainWindow.vala:527\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID ne povas malpleni.\"\n\n#: src/MainWindow.vala:529\nmsgid \"ToxID is invalid.\"\nmsgstr \"ToxID malkorektas.\"\n\n#: res/ui/main-window.ui:558\nmsgid \"ToxID to add...\"\nmsgstr \"ToxID por aldoni...\"\n\n#: res/ui/settings-view.ui:273\nmsgid \"ToxMe server\"\nmsgstr \"ToxMe-servilo\"\n\n#: res/ui/main-window.ui:188\nmsgid \"Type to search...\"\nmsgstr \"Tajpi por serĉi...\"\n\n#: src/ChatView.vala:323\nmsgid \"Unblock\"\nmsgstr \"Malbloki\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Unblock friend\"\nmsgstr \"Malbloki amikon\"\n\n#: res/ui/settings-view.ui:356\nmsgid \"Update record\"\nmsgstr \"Ĝisdatigi registron\"\n\n#: res/ui/chat-view.ui:129 res/ui/settings-view.ui:251\nmsgid \"Username\"\nmsgstr \"Uzantonomo\"\n\n#: res/ui/chat-view.ui:214\nmsgid \"Video call friend\"\nmsgstr \"Videotelefoni amikon\"\n\n#: src/SettingsView.vala:84\nmsgid \"White theme\"\nmsgstr \"Blanka hauto\"\n\n#: src/MainWindow.vala:97\nmsgid \"Yes\"\nmsgstr \"Jes\"\n\n#: res/ui/main-window.ui:256\nmsgid \"You got a new friend request\"\nmsgstr \"Vi havas novan amiko-peton\"\n\n#: src/ChatView.vala:402 src/MainWindow.vala:605\nmsgid \"_Cancel\"\nmsgstr \"_Malmendi\"\n\n#: src/ChatView.vala:403 src/MainWindow.vala:606\nmsgid \"_Open\"\nmsgstr \"_Malfermi\"\n\n#: src/SettingsView.vala:73\nmsgid \"default\"\nmsgstr \"originala\"\n\n#: src/ChatView.vala:243\nmsgid \"is typing\"\nmsgstr \"tajpantas\"\n\n#: res/ui/settings-view.ui:1340\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (stabila)\"\n\n#: src/SettingsView.vala:74\nmsgid \"stable\"\nmsgstr \"stabila\"\n\n#: res/ui/settings-view.ui:1343\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n"
  },
  {
    "path": "po/fr_FR.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# SkyzohKey <SkyzohKey@users.noreply.github.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-11-03 14:06+0100\\n\"\n\"PO-Revision-Date: 2016-11-03 13:19+0000\\n\"\n\"Last-Translator: SkyzohKey <SkyzohKey@users.noreply.github.com>\\n\"\n\"Language-Team: French (http://www.transifex.com/ricinapp/ricin/language/fr/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: fr\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#: src/ChatView.vala:422 src/Notification.vala:29\nmsgid \" is now \"\nmsgstr \" est maintenant \"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \" s'appelle désormais \"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**gras**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*gras*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//italique//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/italic/\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"10\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"3 contacts inutiles trouvés:\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:569\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Balises Markdown disponibles</b>\"\n\n#: res/ui/settings-view.ui:897\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Afficher les changements de statut ?</b>\"\n\n#: res/ui/settings-view.ui:655\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Activer les thèmes personnalisés ?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Contacts</b>\"\n\n#: res/ui/settings-view.ui:440\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:777\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Langue:</b>\"\n\n#: src/Wrapper.vala:800\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Dernière connexion:</b>\"\n\n#: res/ui/chat-view.ui:1187\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Dernière action:</b>\"\n\n#: res/ui/settings-view.ui:1146\nmsgid \"<b>Make the icon in taskbar to blink on new messages?</b>\"\nmsgstr \"<b>Faire clignoter l’icône dans la barre des taches à la réception de nouveaux messages?</b>\"\n\n#: res/ui/settings-view.ui:504\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1401\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> se veut être un logiciel de discussions instantanées <i>sécurisé, léger et customisable à souhait</i> en utilisant la super bibliothèque open-source <b>ToxCore</b>\"\n\n#: res/ui/settings-view.ui:1239\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Envoyer des notifications d'écriture ?</b>\"\n\n#: res/ui/settings-view.ui:402\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Pairs inconnus</b>\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Version:</b>\"\n\n#: res/ui/settings-view.ui:76\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Votre ToxID:</b>\"\n\n#: res/ui/chat-view.ui:998\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>contact est entrain d'écrire</i>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">citation\"\n\n#: res/ui/settings-view.ui:1579\nmsgid \"About\"\nmsgstr \"À propos\"\n\n#: res/ui/main-window.ui:386\nmsgid \"Accept\"\nmsgstr \"Accepter\"\n\n#: res/ui/file-list-row.ui:218 res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Accepter/Reprendre\"\n\n#: src/MainWindow.vala:715 src/MainWindow.vala:726 src/MainWindow.vala:751\n#: src/MainWindow.vala:765 res/ui/main-window.ui:486 res/ui/main-window.ui:564\nmsgid \"Add a friend\"\nmsgstr \"Ajouter un contact\"\n\n#: res/ui/main-window.ui:646\nmsgid \"Add friend\"\nmsgstr \"Ajouter le contact\"\n\n#: res/ui/settings-view.ui:192\nmsgid \"Add password\"\nmsgstr \"Ajouter un mot de passe\"\n\n#: src/MainWindow.vala:190\nmsgid \"All friends\"\nmsgstr \"Tout les contacts\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Syntaxe alt.\"\n\n#: src/MainWindow.vala:614 src/Util.vala:211\nmsgid \"Away\"\nmsgstr \"Absent\"\n\n#: src/ChatView.vala:733 res/ui/chat-view.ui:1241\nmsgid \"Block\"\nmsgstr \"Bloquer\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Block friend\"\nmsgstr \"Bloquer le contact\"\n\n#: src/Util.vala:205\nmsgid \"Blocked\"\nmsgstr \"Bloqué\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Gras\"\n\n#: src/MainWindow.vala:604 src/Util.vala:214\nmsgid \"Busy\"\nmsgstr \"Occupé\"\n\n#: res/ui/settings-view.ui:1179\nmsgid \"\"\n\"By enabling this option you'll receive desktop notifications <b>everytime a \"\n\"contact goes Online or Offline</b>. Away and Busy status won't trigger these\"\n\" notifications.\"\nmsgstr \"En activant cette option vous recevrez une notifications <b>à chaque fois qu'un contact se connecte ou se déconnecte</b>. Cela ne s'applique pas aux changement de statut Absent et Occupé.\"\n\n#: res/ui/settings-view.ui:1139\nmsgid \"\"\n\"By enabling this option, <b>everytime you get a new message and the Ricin \"\n\"window is not focused</b>, the Ricin's icon in your taskbar will blink, \"\n\"indicating unread message(s). Giving focus to Ricin will cancel this \"\n\"notification.\"\nmsgstr \"En activant cette option, <b>à chaque fois que vous recevez un nouveau message et que la fenêtre de Ricin n'est pas active</b>, l'icône de Ricin dans la barre des taches va clignoter, vous indiquant un/des message(s) non lus. Cliquer sur l'icône aura pour effet d'annuler le clignotement.\"\n\n#: res/ui/chat-view.ui:821\nmsgid \"Call friend\"\nmsgstr \"Appel audio\"\n\n#: src/MainWindow.vala:121\nmsgid \"Can't load the profile\"\nmsgstr \"Impossible de charger le proil\"\n\n#: res/ui/main-window.ui:667\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\n#: res/ui/file-list-row.ui:188 res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Annuler/Pause\"\n\n#: res/ui/settings-view.ui:105\nmsgid \"Change Nospam\"\nmsgstr \"Changer le NoSpam\"\n\n#: res/ui/settings-view.ui:209\nmsgid \"Change password\"\nmsgstr \"Modifier le mot de passe\"\n\n#: res/ui/main-window.ui:91\nmsgid \"Change your avatar\"\nmsgstr \"Changer votre avatar\"\n\n#: res/ui/main-window.ui:137\nmsgid \"Change your status\"\nmsgstr \"Changer votre statut\"\n\n#: res/ui/settings-view.ui:369\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"En modifiant les paramètres Réseau vous allez temporairement être deconnecté du réseau Tox\"\n\n#: src/SettingsView.vala:463\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"Lors de la modification de votre mot de passe Ricin devra déchiffrer votre profil et le chiffrer de nouveau avec votre nouveau mot de passe.\"\n\n#: src/ChatView.vala:797\nmsgid \"Choose a file\"\nmsgstr \"Choisissez un fichier\"\n\n#: src/SettingsView.vala:409\nmsgid \"Choose a folder where to save files\"\nmsgstr \"Choisissez un dossier où sauvegarder les fichiers\"\n\n#: src/ProfileChooser.vala:145\nmsgid \"Choose a name for the profile\"\nmsgstr \"Choissisez un nom pour le profil\"\n\n#: res/ui/settings-view.ui:303\nmsgid \"Choose directory\"\nmsgstr \"Choisir un dossier\"\n\n#: res/ui/chat-view.ui:1494\nmsgid \"Choose smileys\"\nmsgstr \"Choisir des smileys\"\n\n#: src/ChatView.vala:519\nmsgid \"Clear conversation\"\nmsgstr \"Effacer la conversation\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"Thème clair\"\n\n#: res/ui/chat-view.ui:1392\nmsgid \"Close the popup\"\nmsgstr \"Fermer la fenêtre\"\n\n#: res/ui/settings-view.ui:1054\nmsgid \"Compact friend list?\"\nmsgstr \"Liste de contacts compacte ?\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"Confirmer le nouveau mot de passe\"\n\n#: res/ui/settings-view.ui:1469\nmsgid \"Contributors\"\nmsgstr \"Contributeurs\"\n\n#: res/ui/settings-view.ui:87\nmsgid \"Copy\"\nmsgstr \"Copier\"\n\n#: res/ui/chat-view.ui:1281\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Copier le ToxID\"\n\n#: src/ChatView.vala:505\nmsgid \"Copy quote in clipboard\"\nmsgstr \"Copier la citation dans le presse-papier\"\n\n#: src/ChatView.vala:499\nmsgid \"Copy selection in clipboard\"\nmsgstr \"Copier la séléction dans le presse-papier\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"Créer un profil\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"Créer ce profil\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"Mot de passe actuel\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"Le mot de passe actuel ne peut être vide.\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"Thème sombre\"\n\n#: res/ui/main-window.ui:367\nmsgid \"Decline\"\nmsgstr \"Rejeter\"\n\n#: res/ui/settings-view.ui:275\nmsgid \"Default save path:\"\nmsgstr \"Dossier de téléchargement :\"\n\n#: res/ui/chat-view.ui:1261\nmsgid \"Delete\"\nmsgstr \"Supprimer\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Supprimer les contacts (3)\"\n\n#: src/ChatView.vala:515\nmsgid \"Delete selected messages\"\nmsgstr \"Supprimer les messages sélectionnés\"\n\n#: res/ui/settings-view.ui:995\nmsgid \"Display typing notifications?\"\nmsgstr \"Afficher les notifications d'écriture ?\"\n\n#: res/ui/settings-view.ui:942\nmsgid \"Display unread messages notice?\"\nmsgstr \"Être averti des messages non lus ?\"\n\n#: src/SettingsView.vala:435 src/SettingsView.vala:463\n#: src/SettingsView.vala:488\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"Êtes-vous sûr de vouloir procéder ?\"\n\n#: src/SettingsView.vala:462\nmsgid \"Edit your password\"\nmsgstr \"Modifier le mot de passe\"\n\n#: res/ui/settings-view.ui:1232\nmsgid \"\"\n\"Enabling this will cause Ricin to tell <b>the person you talk to</b> when \"\n\"you are typing.\"\nmsgstr \"En activant cette option Ricin enverra une notification <b>à la personne à qui vous écrivez</b> pour l'informer que vous êtes entrain d'écrire. \"\n\n#: src/SettingsView.vala:434\nmsgid \"Encrypt your profile\"\nmsgstr \"Chiffrer le profil\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"Entrez un nom pour le profil\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"Entrez votre mot de passe...\"\n\n#: res/ui/chat-view.ui:883\nmsgid \"Friend's profile\"\nmsgstr \"Profil du contact\"\n\n#: res/ui/settings-view.ui:339\nmsgid \"General\"\nmsgstr \"Général\"\n\n#: res/ui/settings-view.ui:1431\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Nom du groupe\"\n\n#: src/MainWindow.vala:569\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Bonjour! C'est %s, soyons amis.\"\n\n#: src/InlineImageMessageListRow.vala:112\nmsgid \"Image saved!\"\nmsgstr \"Image enregistrée !\"\n\n#: src/SettingsView.vala:435\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"Afin de chiffrer votre profile, merci de spécifier un mot de passe. Ce mot de passe vous sera demandé à chaque lancement de Ricin.\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"code\"\n\n#: res/ui/settings-view.ui:1107\nmsgid \"Interface\"\nmsgstr \"Interface\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Italique\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Quitter\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"License (GNU License Publique Générale 3)\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"Charger un profil\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"Connexion\"\n\n#: src/SettingsView.vala:100\nmsgid \"Markdown\"\nmsgstr \"Markdown\"\n\n#: res/ui/settings-view.ui:836\nmsgid \"Message parsing mode:\"\nmsgstr \"Affichage des messages:\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Silence\"\n\n#: res/ui/settings-view.ui:611\nmsgid \"Network\"\nmsgstr \"Réseau\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"Nouveau mot de passe\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"Le nouveau mot de passe doit être différent de l'ancien.\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:373\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"Non\"\n\n#: res/ui/settings-view.ui:1291\nmsgid \"Notifications\"\nmsgstr \"Notifications\"\n\n#: src/Util.vala:218\nmsgid \"Offline\"\nmsgstr \"Hors ligne\"\n\n#: src/MainWindow.vala:594 src/Util.vala:208\nmsgid \"Online\"\nmsgstr \"En ligne\"\n\n#: src/MainWindow.vala:189\nmsgid \"Online friends\"\nmsgstr \"Contacts en ligne\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"Force du mot de passe\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"Le mot de passe ne peut être vide.\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"La confirmation du mot de passe ne peut être vide.\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"Le mot de passe ne correspond pas à la confirmation.\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"Le mot de passe doit comporter un minimum de 8 caractères.\"\n\n#: src/SettingsView.vala:101\nmsgid \"Plaintext\"\nmsgstr \"Texte brût\"\n\n#: src/ProfileChooser.vala:101\nmsgid \"Please enter a password\"\nmsgstr \"Merci d'enter un mot de passe\"\n\n#: src/ProfileChooser.vala:124\nmsgid \"Please enter a profile name.\"\nmsgstr \"Merci de choisir un nom pour le profil.\"\n\n#: src/ProfileChooser.vala:131\nmsgid \"Profile name already taken.\"\nmsgstr \"Un profil avec ce nom existe déjà.\"\n\n#: src/MainWindow.vala:624\nmsgid \"Quit\"\nmsgstr \"Quitter\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Citation\"\n\n#: src/ChatView.vala:509\nmsgid \"Quote selection\"\nmsgstr \"Citer la séléction\"\n\n#: res/ui/settings-view.ui:731\nmsgid \"Reload custom theme\"\nmsgstr \"Recharger le thème\"\n\n#: res/ui/settings-view.ui:226\nmsgid \"Remove password\"\nmsgstr \"Supprimer le mot de passe\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"Voulez-vous supprimer votre mot de passe ?\"\n\n#: src/SettingsView.vala:488\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"Supprimer votre mot de passe aura pour effets de déchiffrer votre profil, votre historique de messages ainsi que vos préférences.\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"Supprimer votre mot de passe aura pour effets de déchiffrer votre profil, votre historique de messages ainsi que vos préférences. <b>Êtes-vous sûr de vouloir effectuer cette action ?</b>\"\n\n#: res/ui/settings-view.ui:1450\nmsgid \"Report an issue\"\nmsgstr \"Signaler un bug\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart later\"\nmsgstr \"Redémarrer plus tard\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart now\"\nmsgstr \"Redémarrer maintenant\"\n\n#: src/MainWindow.vala:695\nmsgid \"Restart required\"\nmsgstr \"Redémarrage requis\"\n\n#: src/MainWindow.vala:774\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin ne supporte pas encore ToxMe.\"\n\n#: src/MainWindow.vala:697\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Ricin doit redémarrer afin d'appliquer les paramètres. Voulez-vous redémarrer Ricin ?\"\n\n#: res/ui/settings-view.ui:1539\nmsgid \"Ricin official website\"\nmsgstr \"Site officiel de Ricin\"\n\n#: res/ui/chat-view.ui:1632\nmsgid \"Scroll to bottom\"\nmsgstr \"Descendre\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Selectionnez un contact pour commencer à discuter\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Selectionner un profil\"\n\n#: src/MainWindow.vala:851\nmsgid \"Select your avatar\"\nmsgstr \"Choisissez un avatar\"\n\n#: res/ui/chat-view.ui:1521\nmsgid \"Send file\"\nmsgstr \"Envoyer un fichier\"\n\n#: res/ui/chat-view.ui:1546\nmsgid \"Send message\"\nmsgstr \"Envoyer un message\"\n\n#: src/MainWindow.vala:135 src/MainWindow.vala:714 res/ui/main-window.ui:506\nmsgid \"Settings\"\nmsgstr \"Paramètres\"\n\n#: res/ui/settings-view.ui:1186\nmsgid \"Show notifications when friends status changes?\"\nmsgstr \"Afficher les changements de statut des contacts ?\"\n\n#: res/ui/chat-view.ui:787\nmsgid \"Status message...\"\nmsgstr \"Message d'humeur\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Barré\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Syntaxe\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Balise\"\n\n#: src/ProfileChooser.vala:113\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Le profil selectionné n'existe pas.\"\n\n#: res/ui/settings-view.ui:694\nmsgid \"Theme:\"\nmsgstr \"Thème:\"\n\n#: res/ui/chat-view.ui:1614\nmsgid \"There are unread messages in this chat\"\nmsgstr \"Il y'a des messages non lus dans cette discussion\"\n\n#: src/MessageListRow.vala:150 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxMe n'est pas encore supporté.\"\n\n#: src/MainWindow.vala:776\nmsgid \"ToxID can't be empty.\"\nmsgstr \"Le ToxID ne peut pas être vide.\"\n\n#: src/MainWindow.vala:778\nmsgid \"ToxID is invalid.\"\nmsgstr \"Le ToxID est invalide.\"\n\n#: res/ui/main-window.ui:589\nmsgid \"ToxID to add...\"\nmsgstr \"Contact à ajouter\"\n\n#: res/ui/main-window.ui:193\nmsgid \"Type to search...\"\nmsgstr \"Rechercher...\"\n\n#: src/ChatView.vala:731\nmsgid \"Unblock\"\nmsgstr \"Débloquer\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Unblock friend\"\nmsgstr \"Débloquer le contact\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Souligné\"\n\n#: src/SettingsView.vala:487\nmsgid \"Unencrypt your profile\"\nmsgstr \"Déchiffrer votre profil\"\n\n#: res/ui/chat-view.ui:764\nmsgid \"Username\"\nmsgstr \"Pseudo\"\n\n#: res/ui/chat-view.ui:849\nmsgid \"Video call friend\"\nmsgstr \"Appel vidéo\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"Thème blanc\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:372\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"Oui\"\n\n#: res/ui/main-window.ui:267\nmsgid \"You got a new friend request\"\nmsgstr \"Vous avez une demande d'ami\"\n\n#: src/ChatView.vala:798 src/MainWindow.vala:854 src/SettingsView.vala:412\nmsgid \"_Cancel\"\nmsgstr \"_Annuler\"\n\n#: src/ChatView.vala:799 src/MainWindow.vala:855 src/SettingsView.vala:413\nmsgid \"_Open\"\nmsgstr \"_Ouvrir\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__souligné__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_souligné_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`code`\"\n\n#: src/SettingsView.vala:83\nmsgid \"default\"\nmsgstr \"défaut\"\n\n#: src/ChatView.vala:372\nmsgid \"is typing\"\nmsgstr \"est entrain d'écrire\"\n\n#: res/ui/settings-view.ui:1607\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.im (stable)\"\n\n#: src/SettingsView.vala:84\nmsgid \"stable\"\nmsgstr \"stable\"\n\n#: res/ui/settings-view.ui:1610\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~barré~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~barré~~\"\n"
  },
  {
    "path": "po/pl.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# Kamil Sulewski <sulewskikamil@gmail.com>, 2016\n# Łukasz Zarnowiecki <dolohow@outlook.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-07-02 21:20+0200\\n\"\n\"PO-Revision-Date: 2016-07-02 20:17+0000\\n\"\n\"Last-Translator: Kamil Sulewski <sulewskikamil@gmail.com>\\n\"\n\"Language-Team: Polish (http://www.transifex.com/ricinapp/ricin/language/pl/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: pl\\n\"\n\"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#: src/ChatView.vala:387\nmsgid \" is now \"\nmsgstr \"jest dostępny\"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \"jest teraz dostępny jako\"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**pogrubienie**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*pogrubienie*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//kursywa//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/kursywa/\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"10\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"3 znaleziono nieużywane profile:\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:801\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Dostępne formatowanie dla tekstu</b>\"\n\n#: res/ui/settings-view.ui:1065\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Pokazuj zmiany statusów znajomych?</b>\"\n\n#: res/ui/settings-view.ui:887\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Zezwalać na niestandardowe motywy?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Znajomi</b>\"\n\n#: res/ui/settings-view.ui:672\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:1008\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Język:</b>\"\n\n#: src/Wrapper.vala:784\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Ostatnio dostępny:</b>\"\n\n#: res/ui/chat-view.ui:1125\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Ostatnio widziany:</b>\"\n\n#: res/ui/settings-view.ui:736\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1470\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> stara się być <i>bezpiecznym, lekkim, otwartym na mody  i w pełni konfigurowalnym</i> klientem chat-u używającym wspaniałej biblioteki open-source <b>ToxCore</b>.\"\n\n#: res/ui/settings-view.ui:1250\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Wyślij powiadomienia o pisaniu?</b>\"\n\n#: res/ui/settings-view.ui:634\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Nieznani użytkownicy</b>\"\n\n#: res/ui/settings-view.ui:1429\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Wersja:</b>\"\n\n#: res/ui/settings-view.ui:281\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>Twój pseudonim Tox:</b>\"\n\n#: res/ui/settings-view.ui:75\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Twój identyfikator Tox:</b>\"\n\n#: res/ui/chat-view.ui:1673\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Znajomy pisze</i>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">cytat\"\n\n#: res/ui/settings-view.ui:1648\nmsgid \"About\"\nmsgstr \"O\"\n\n#: res/ui/main-window.ui:377\nmsgid \"Accept\"\nmsgstr \"Zatwierdź\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Zatwierdź/Wznów plik\"\n\n#: src/MainWindow.vala:609 src/MainWindow.vala:620 src/MainWindow.vala:645\n#: src/MainWindow.vala:659 res/ui/main-window.ui:475 res/ui/main-window.ui:542\nmsgid \"Add a friend\"\nmsgstr \"Dodaj znajomego\"\n\n#: res/ui/main-window.ui:617\nmsgid \"Add friend\"\nmsgstr \"Dodaj znajomego\"\n\n#: res/ui/settings-view.ui:191\nmsgid \"Add password\"\nmsgstr \"Dodaj hasło\"\n\n#: src/MainWindow.vala:179\nmsgid \"All friends\"\nmsgstr \"Wszyscy znajomi\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Inaczej\"\n\n#: src/MainWindow.vala:508 src/Util.vala:166\nmsgid \"Away\"\nmsgstr \"Nieobecny\"\n\n#: res/ui/settings-view.ui:347\nmsgid \"Biography\"\nmsgstr \"Biografia\"\n\n#: src/ChatView.vala:561 res/ui/chat-view.ui:1227\nmsgid \"Block\"\nmsgstr \"Zablokuj\"\n\n#: src/FriendListRow.vala:90\nmsgid \"Block friend\"\nmsgstr \"Zablokuj znajomego\"\n\n#: src/Util.vala:160\nmsgid \"Blocked\"\nmsgstr \"Zablokowany\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Pogrubienie\"\n\n#: src/MainWindow.vala:498 src/Util.vala:169\nmsgid \"Busy\"\nmsgstr \"Zajęty\"\n\n#: res/ui/chat-view.ui:854\nmsgid \"Call friend\"\nmsgstr \"Rozmowa głosowa ze znajomym\"\n\n#: src/MainWindow.vala:110\nmsgid \"Can't load the profile\"\nmsgstr \"Nie można załadować profilu\"\n\n#: res/ui/main-window.ui:638\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Anuluj/wstrzymaj plik\"\n\n#: res/ui/settings-view.ui:104\nmsgid \"Change Nospam\"\nmsgstr \"Blokować spam zaproszeniami\"\n\n#: res/ui/settings-view.ui:208\nmsgid \"Change password\"\nmsgstr \"Zmień hasło\"\n\n#: res/ui/main-window.ui:87\nmsgid \"Change your avatar\"\nmsgstr \"Zmień avatar\"\n\n#: res/ui/main-window.ui:134\nmsgid \"Change your status\"\nmsgstr \"Zmień status\"\n\n#: res/ui/settings-view.ui:601\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"Zmiana ustawień sieciowych tymczasowo rozłączy cię z siecią Tox\"\n\n#: src/SettingsView.vala:447\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"Zmiana hasła zmusi program do odszyfrowania konta i późniejszego ponownego zaszyfrowania z nowym hasłem.\"\n\n#: src/ChatView.vala:628\nmsgid \"Choose a file\"\nmsgstr \"Wybierz plik\"\n\n#: src/SettingsView.vala:393\nmsgid \"Choose a folder where to save files\"\nmsgstr \"Wybierz docelowy folder na pliki\"\n\n#: src/ProfileChooser.vala:142\nmsgid \"Choose a name for the profile\"\nmsgstr \"Wybierz nazwę profilu\"\n\n#: res/ui/settings-view.ui:535\nmsgid \"Choose directory\"\nmsgstr \"Wybierz folder\"\n\n#: res/ui/chat-view.ui:1474\nmsgid \"Choose smileys\"\nmsgstr \"Wybierz emotikon\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"Jaśniejszy motyw\"\n\n#: res/ui/chat-view.ui:1373\nmsgid \"Close the popup\"\nmsgstr \"Zamknij to menu\"\n\n#: res/ui/settings-view.ui:1307\nmsgid \"Compact friend list?\"\nmsgstr \"Zwarta lista znajomych?\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"Potwierdź nowe hasło\"\n\n#: res/ui/settings-view.ui:1538\nmsgid \"Contributors\"\nmsgstr \"Współtwórcy\"\n\n#: res/ui/settings-view.ui:86 res/ui/settings-view.ui:303\nmsgid \"Copy\"\nmsgstr \"Kopiuj\"\n\n#: res/ui/chat-view.ui:1267\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Kopiuj identyfikator Tox znajomego\"\n\n#: src/ChatView.vala:433\nmsgid \"Copy quote in clipboard\"\nmsgstr \"Skopiuj cytat do schowka\"\n\n#: src/ChatView.vala:432\nmsgid \"Copy selection in clipboard\"\nmsgstr \"Skopiuj zaznaczenie do schowka\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"Stwórz profil\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"Utwórz profil\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"Bieżące hasło\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"Bieżące hasło nie może być puste\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"Ciemny motyw\"\n\n#: res/ui/main-window.ui:357\nmsgid \"Decline\"\nmsgstr \"Odrzuć\"\n\n#: res/ui/settings-view.ui:507\nmsgid \"Default save path:\"\nmsgstr \"Domyślna ścieżka zapisu:\"\n\n#: res/ui/chat-view.ui:1247\nmsgid \"Delete\"\nmsgstr \"Usuń\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Usuń znajomych (3)\"\n\n#: res/ui/settings-view.ui:1185\nmsgid \"Display typing notifications?\"\nmsgstr \"Wyświetlać powiadomienia o pisaniu?\"\n\n#: res/ui/settings-view.ui:1121\nmsgid \"Display unread messages notice?\"\nmsgstr \"Wyświetlać ogłoszenia o nieprzeczytanych wiadomościach?\"\n\n#: src/SettingsView.vala:419 src/SettingsView.vala:447\n#: src/SettingsView.vala:472\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"Czy mimo to chcesz kontynuować?\"\n\n#: src/SettingsView.vala:446\nmsgid \"Edit your password\"\nmsgstr \"Edytuj hasło\"\n\n#: src/SettingsView.vala:418\nmsgid \"Encrypt your profile\"\nmsgstr \"Zaszyfruj swój profil\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"Podaj nazwę dla profilu\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"Podaj hasło...\"\n\n#: res/ui/chat-view.ui:763\nmsgid \"Friend's profile\"\nmsgstr \"Profil znajomych\"\n\n#: res/ui/settings-view.ui:571\nmsgid \"General\"\nmsgstr \"Ogólny\"\n\n#: res/ui/settings-view.ui:1500\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Nazwa chatu grupowego\"\n\n#: src/MainWindow.vala:463\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Witaj! Tu %s, bądź moim znajomym\"\n\n#: src/InlineImageMessageListRow.vala:103\nmsgid \"Image saved!\"\nmsgstr \"Obraz zapisany!\"\n\n#: src/SettingsView.vala:419\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"W celu zaszyfrowania swojego profilu musisz podać hasło. Podczas każdego logowania będziesz o nie pytany.\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"Zagnieżdżony kod\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"Interface\"\nmsgstr \"Interfejs\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Kursywa\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Opuść\"\n\n#: res/ui/settings-view.ui:1588\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Licencja (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"Załaduj profil\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Wycisz\"\n\n#: res/ui/settings-view.ui:843\nmsgid \"Network\"\nmsgstr \"Sieć\"\n\n#: res/ui/settings-view.ui:425\nmsgid \"New Tox alias\"\nmsgstr \"Nowy pseudonim Tox\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"Nowe hasło\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"Nowe hasło musi się różnić od poprzedniego.\"\n\n#: src/MainWindow.vala:435 src/SettingsView.vala:343\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"Nie\"\n\n#: res/ui/chat-view.ui:1162\nmsgid \"Notes about the user:\"\nmsgstr \"Uwagi na temat użytkownika:\"\n\n#: src/Util.vala:173\nmsgid \"Offline\"\nmsgstr \"Nieaktywny\"\n\n#: src/MainWindow.vala:488 src/Util.vala:163\nmsgid \"Online\"\nmsgstr \"Aktywny\"\n\n#: src/MainWindow.vala:178\nmsgid \"Online friends\"\nmsgstr \"Aktywni znajomi\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"Siła hasła\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"Hasło nie może być puste.\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"Potwierdzenie hasła nie może być puste.\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"Hasło nie przeszło sprawdzenia.\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"Hasło musi posiadać co najmniej 8 znaków.\"\n\n#: src/ProfileChooser.vala:98\nmsgid \"Please enter a password\"\nmsgstr \"Wprowadź hasło\"\n\n#: src/ProfileChooser.vala:121\nmsgid \"Please enter a profile name.\"\nmsgstr \"Proszę o napisanie nazwy profilu.\"\n\n#: src/ProfileChooser.vala:128\nmsgid \"Profile name already taken.\"\nmsgstr \"Nazwa profilu jest zajęta.\"\n\n#: src/MainWindow.vala:518\nmsgid \"Quit\"\nmsgstr \"Zamknij\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Cytat\"\n\n#: src/ChatView.vala:434\nmsgid \"Quote selection\"\nmsgstr \"Zaznaczenie cytatu\"\n\n#: res/ui/settings-view.ui:962\nmsgid \"Reload custom theme\"\nmsgstr \"Przeładuj niestandardowy motyw\"\n\n#: res/ui/settings-view.ui:225\nmsgid \"Remove password\"\nmsgstr \"Usuń hasło\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"Usunąć hasło?\"\n\n#: src/SettingsView.vala:472\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"Usunięcie hasła odszyfruje twoje konto, logi i ustawienia.\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"Usunięcie hasła odszyfruje twoje konto, logi i ustawienia. <b>Czy mimo to chcesz kontynuować?</b>\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"Report an issue\"\nmsgstr \"Zgłoś problem\"\n\n#: res/ui/settings-view.ui:458\nmsgid \"Request deletion\"\nmsgstr \"Usunięcie zapytania\"\n\n#: src/MainWindow.vala:592\nmsgid \"Restart later\"\nmsgstr \"Uruchom ponownie później\"\n\n#: src/MainWindow.vala:592\nmsgid \"Restart now\"\nmsgstr \"Uruchom ponownie teraz\"\n\n#: src/MainWindow.vala:589\nmsgid \"Restart required\"\nmsgstr \"Wymagane ponowne uruchomienie\"\n\n#: src/MainWindow.vala:668\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin nie wspiera jeszcze ToxDNS.\"\n\n#: src/MainWindow.vala:591\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Ricin musi zostać ponownie uruchomiony, aby móc zaakceptować zmiany. Chcesz uruchomić ponownie program?\"\n\n#: res/ui/settings-view.ui:1608\nmsgid \"Ricin official website\"\nmsgstr \"Oficjalna strona internetowa Ricin\"\n\n#: res/ui/chat-view.ui:1615\nmsgid \"Scroll to bottom\"\nmsgstr \"Przewiń na dół\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Wybierz chat by rozpocząć rozmowę\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Wybierz profil\"\n\n#: src/MainWindow.vala:745\nmsgid \"Select your avatar\"\nmsgstr \"Wybierz avatar\"\n\n#: res/ui/chat-view.ui:1502\nmsgid \"Send file\"\nmsgstr \"Wyślij plik\"\n\n#: res/ui/chat-view.ui:1528\nmsgid \"Send message\"\nmsgstr \"Wyślij wiadomość\"\n\n#: src/MainWindow.vala:124 src/MainWindow.vala:608 res/ui/main-window.ui:495\nmsgid \"Settings\"\nmsgstr \"Ustawienia\"\n\n#: res/ui/chat-view.ui:820\nmsgid \"Status message...\"\nmsgstr \"Wiadomość własna...\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Przekreślenie\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Pisownia\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Nazwa Etykiety\"\n\n#: src/ProfileChooser.vala:110\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Wybrany profil nie istnieje.\"\n\n#: res/ui/settings-view.ui:926\nmsgid \"Theme:\"\nmsgstr \"Motyw:\"\n\n#: res/ui/chat-view.ui:1597\nmsgid \"There are unread messages in this chat\"\nmsgstr \"Chat zawiera nieodczytane wiadomości\"\n\n#: src/MessageListRow.vala:102 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS nie jest jeszcze wspierany.\"\n\n#: src/MainWindow.vala:670\nmsgid \"ToxID can't be empty.\"\nmsgstr \"Identyfikator Tox nie może być pusty.\"\n\n#: src/MainWindow.vala:672\nmsgid \"ToxID is invalid.\"\nmsgstr \"Identyfikator Tox jest nieprawidłowy.\"\n\n#: res/ui/main-window.ui:563\nmsgid \"ToxID to add...\"\nmsgstr \"Identyfikator Tox...\"\n\n#: res/ui/settings-view.ui:358\nmsgid \"ToxMe server\"\nmsgstr \"Serwer ToxMe\"\n\n#: res/ui/main-window.ui:191\nmsgid \"Type to search...\"\nmsgstr \"Szukaj frazy...\"\n\n#: src/ChatView.vala:559\nmsgid \"Unblock\"\nmsgstr \"Odblokuj\"\n\n#: src/FriendListRow.vala:90\nmsgid \"Unblock friend\"\nmsgstr \"Odblokuj znajomego\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Podkreślenie\"\n\n#: src/SettingsView.vala:471\nmsgid \"Unencrypt your profile\"\nmsgstr \"Odszyfruj konto\"\n\n#: res/ui/settings-view.ui:441\nmsgid \"Update record\"\nmsgstr \"Aktualizuj zapis\"\n\n#: res/ui/chat-view.ui:797 res/ui/settings-view.ui:336\nmsgid \"Username\"\nmsgstr \"Nazwa użytkownika\"\n\n#: res/ui/chat-view.ui:882\nmsgid \"Video call friend\"\nmsgstr \"Wideorozmowa ze znajomym\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"Biały motyw\"\n\n#: src/MainWindow.vala:435 src/SettingsView.vala:342\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"Tak\"\n\n#: res/ui/main-window.ui:261\nmsgid \"You got a new friend request\"\nmsgstr \"Otrzymałeś nowe zaproszenie od znajomego\"\n\n#: src/ChatView.vala:629 src/MainWindow.vala:748 src/SettingsView.vala:396\nmsgid \"_Cancel\"\nmsgstr \"_Anuluj\"\n\n#: src/ChatView.vala:630 src/MainWindow.vala:749 src/SettingsView.vala:397\nmsgid \"_Open\"\nmsgstr \"_Otwórz\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__podkreślenie__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_podkreślenie_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`zagnieżdżony kod`\"\n\n#: src/SettingsView.vala:80\nmsgid \"default\"\nmsgstr \"domyślne\"\n\n#: src/ChatView.vala:337\nmsgid \"is typing\"\nmsgstr \"piszę\"\n\n#: res/ui/settings-view.ui:1676\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (stabilny)\"\n\n#: src/SettingsView.vala:81\nmsgid \"stable\"\nmsgstr \"stabilny\"\n\n#: res/ui/settings-view.ui:1679\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~przekreślenie~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~przekreślenie~~\"\n"
  },
  {
    "path": "po/pt_PT.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# gmscs <gserpa@openmailbox.org>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-03-08 18:19+0100\\n\"\n\"PO-Revision-Date: 2016-03-09 18:06+0100\\n\"\n\"Last-Translator: SkyzohKey <skyzohkey@tuta.io>\\n\"\n\"Language-Team: Portuguese (http://www.transifex.com/ricinapp/ricin/language/pt/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: pt_PT\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Generator: Poedit 1.8.6\\n\"\n\n#: src/ChatView.vala:289\nmsgid \" is now \"\nmsgstr \"está agora\"\n\n#: src/Wrapper.vala:218\nmsgid \" is now known as \"\nmsgstr \"agora é conhecido como\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"\"\n\"3 perfis inutilizados encontrados:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:835\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Mostrar alterações do estado do amigo?</b>\"\n\n#: res/ui/settings-view.ui:726\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Ativar temas personalizados</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Amigos</b>\"\n\n#: res/ui/settings-view.ui:518\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:955\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Idioma:</b>\"\n\n#: src/Wrapper.vala:580\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Última vez online:</b>\"\n\n#: res/ui/chat-view.ui:456\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Última vez visto:</b>\"\n\n#: res/ui/settings-view.ui:582\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1134\nmsgid \"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-customizable</i> chat client using the awesome and open-source <b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> tem como objetivo ser um cliente de chat<i> seguro, leve, 'hackable' e totalmente personalizável </i> usando a incrível, open-source bibliotéca <b>ToxCore</b>.\"\n\n#: res/ui/settings-view.ui:891\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Enviar notificações de escrita?</b>\"\n\n#: res/ui/settings-view.ui:480\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Pares desconhecidos</b>\"\n\n#: res/ui/settings-view.ui:1093\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Versão:</b>\"\n\n#: res/ui/settings-view.ui:196\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>O seu pseudónimo de Tox:</b>\"\n\n#: res/ui/settings-view.ui:77\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>O seu ToxID:</b>\"\n\n#: res/ui/chat-view.ui:911\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Amigo a escrever</i>\"\n\n#: res/ui/settings-view.ui:1312\nmsgid \"About\"\nmsgstr \"Sobre\"\n\n#: res/ui/main-window.ui:372\nmsgid \"Accept\"\nmsgstr \"Aceitar\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Aceitar/Resumir ficheiro\"\n\n#: src/MainWindow.vala:491 src/MainWindow.vala:516 res/ui/main-window.ui:470\n#: res/ui/main-window.ui:537\nmsgid \"Add a friend\"\nmsgstr \"Adicionar um amigo\"\n\n#: res/ui/main-window.ui:612\nmsgid \"Add friend\"\nmsgstr \"Adicionar amigo\"\n\n#: src/MainWindow.vala:205\nmsgid \"All friends\"\nmsgstr \"Todos os amigos\"\n\n#: src/MainWindow.vala:429 src/Util.vala:160\nmsgid \"Away\"\nmsgstr \"Ausente\"\n\n#: res/ui/settings-view.ui:262\nmsgid \"Biography\"\nmsgstr \"Biografia\"\n\n#: src/ChatView.vala:325 res/ui/chat-view.ui:558\nmsgid \"Block\"\nmsgstr \"Bloquear\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Block friend\"\nmsgstr \"Bloquear amigo\"\n\n#: src/Util.vala:154\nmsgid \"Blocked\"\nmsgstr \"Bloqueado\"\n\n#: src/MainWindow.vala:419 src/Util.vala:163\nmsgid \"Busy\"\nmsgstr \"Ocupado\"\n\n#: res/ui/chat-view.ui:186\nmsgid \"Call friend\"\nmsgstr \"Fazer chamada com amigo\"\n\n#: src/MainWindow.vala:147\nmsgid \"Can't load the profile\"\nmsgstr \"Não foi possível carregar o perfil\"\n\n#: res/ui/main-window.ui:633\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Cancelar/pausar ficheiro\"\n\n#: res/ui/settings-view.ui:106\nmsgid \"Change Nospam\"\nmsgstr \"Alterar Nospam\"\n\n#: res/ui/main-window.ui:86\nmsgid \"Change your avatar\"\nmsgstr \"Alterar o seu avatar\"\n\n#: res/ui/main-window.ui:133\nmsgid \"Change your status\"\nmsgstr \"Alterar o seu estado\"\n\n#: res/ui/settings-view.ui:447\nmsgid \"Changing Network settings will temporarily disconnect you from the Tox network\"\nmsgstr \"Alterar as configurações de rede irá desligá-lo temporáriamente da rede Tox\"\n\n#: src/ChatView.vala:401\nmsgid \"Choose a file\"\nmsgstr \"Escolha um ficheiro\"\n\n#: src/ProfileChooser.vala:89\nmsgid \"Choose a name for the profile\"\nmsgstr \"Escolha um nome para o perfil\"\n\n#: res/ui/chat-view.ui:700\nmsgid \"Choose smileys\"\nmsgstr \"Mudar smileys\"\n\n#: src/SettingsView.vala:85\nmsgid \"Clearer theme\"\nmsgstr \"Tema claro\"\n\n#: res/ui/chat-view.ui:843\nmsgid \"Close the popup\"\nmsgstr \"Fechar o popup\"\n\n#: res/ui/settings-view.ui:1202\nmsgid \"Contributors\"\nmsgstr \"Colaboradores\"\n\n#: res/ui/settings-view.ui:88 res/ui/settings-view.ui:218\nmsgid \"Copy\"\nmsgstr \"Copiar\"\n\n#: res/ui/chat-view.ui:598\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Copiar ToxID do amigo\"\n\n#: res/ui/profile-chooser-window.ui:141\nmsgid \"Create a profile\"\nmsgstr \"Criar um perfil\"\n\n#: res/ui/profile-chooser-window.ui:116\nmsgid \"Create this profile\"\nmsgstr \"Criar este perfil\"\n\n#: src/SettingsView.vala:83\nmsgid \"Dark theme\"\nmsgstr \"Tema escuro\"\n\n#: res/ui/main-window.ui:352\nmsgid \"Decline\"\nmsgstr \"Rejeitar\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"Delete\"\nmsgstr \"Apagar\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Apagar amigos (3)\"\n\n#: res/ui/profile-chooser-window.ui:88\nmsgid \"Enter a name for the profile\"\nmsgstr \"Insira um nome para o perfil\"\n\n#: res/ui/chat-view.ui:95\nmsgid \"Friend's profile\"\nmsgstr \"Perfil do amigo\"\n\n#: res/ui/settings-view.ui:415\nmsgid \"General\"\nmsgstr \"Geral\"\n\n#: res/ui/settings-view.ui:1164\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Nome do groupchat\"\n\n#: src/MainWindow.vala:384\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Olá! Sou o/a %s, vamos ser amigos.\"\n\n#: src/InlineImageMessageListRow.vala:97\nmsgid \"Image saved!\"\nmsgstr \"Imagem gravada!\"\n\n#: res/ui/settings-view.ui:1007\nmsgid \"Interface\"\nmsgstr \"Interface\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Sair\"\n\n#: res/ui/settings-view.ui:1252\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Licença (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:72\nmsgid \"Load a profile\"\nmsgstr \"Carregar um perfil\"\n\n#: res/ui/profile-chooser-window.ui:50\nmsgid \"Login\"\nmsgstr \"Login\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Silenciar\"\n\n#: res/ui/settings-view.ui:687\nmsgid \"Network\"\nmsgstr \"Rede\"\n\n#: res/ui/settings-view.ui:340\nmsgid \"New Tox alias\"\nmsgstr \"Novo pseudónimo de Tox\"\n\n#: src/MainWindow.vala:97\nmsgid \"No\"\nmsgstr \"Não\"\n\n#: res/ui/chat-view.ui:493\nmsgid \"Notes about the user:\"\nmsgstr \"Apontamentos sobre o utilizador:\"\n\n#: src/Util.vala:167\nmsgid \"Offline\"\nmsgstr \"Offline\"\n\n#: src/MainWindow.vala:409 src/Util.vala:157\nmsgid \"Online\"\nmsgstr \"Online\"\n\n#: src/MainWindow.vala:204\nmsgid \"Online friends\"\nmsgstr \"Amigos online\"\n\n#: src/ProfileChooser.vala:70\nmsgid \"Please enter a profile name.\"\nmsgstr \"Por favor insira um nome de perfil.\"\n\n#: src/ProfileChooser.vala:77\nmsgid \"Profile name already taken.\"\nmsgstr \"Nome de perfil já está a ser usado.\"\n\n#: src/MainWindow.vala:439\nmsgid \"Quit\"\nmsgstr \"Sair\"\n\n#: res/ui/settings-view.ui:783\nmsgid \"Reload custom theme\"\nmsgstr \"Recarregar tema personalizado\"\n\n#: res/ui/settings-view.ui:1183\nmsgid \"Report an issue\"\nmsgstr \"Reportar um problema\"\n\n#: res/ui/settings-view.ui:373\nmsgid \"Request deletion\"\nmsgstr \"Pedir apagamento\"\n\n#: res/ui/settings-view.ui:1061\nmsgid \"Ricin\"\nmsgstr \"Ricin\"\n\n#: src/MainWindow.vala:525\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin não tem suporte de ToxDNS ainda.\"\n\n#: res/ui/settings-view.ui:1272\nmsgid \"Ricin official website\"\nmsgstr \"Website oficial do Ricin\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Selecione um chat para começar a enviar mensagens.\"\n\n#: src/ProfileChooser.vala:20 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Escolha um perfil\"\n\n#: src/MainWindow.vala:602\nmsgid \"Select your avatar\"\nmsgstr \"Escolha o seu avatar\"\n\n#: res/ui/chat-view.ui:727\nmsgid \"Send file\"\nmsgstr \"Enviar ficheiro\"\n\n#: res/ui/chat-view.ui:753\nmsgid \"Send message\"\nmsgstr \"Enviar mensagem\"\n\n#: src/MainWindow.vala:159 src/MainWindow.vala:480 res/ui/main-window.ui:490\nmsgid \"Settings\"\nmsgstr \"Configurações\"\n\n#: res/ui/chat-view.ui:152\nmsgid \"Status message...\"\nmsgstr \"Mensagem de estado...\"\n\n#: src/ProfileChooser.vala:61\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"O perfil selecionado não existe.\"\n\n#: src/MessageListRow.vala:54 src/PlainLabel.vala:20 src/QuoteLabel.vala:20\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS ainda não é suportado.\"\n\n#: src/MainWindow.vala:527\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID não pode estar vazio.\"\n\n#: src/MainWindow.vala:529\nmsgid \"ToxID is invalid.\"\nmsgstr \"ToxID inválido.\"\n\n#: res/ui/main-window.ui:558\nmsgid \"ToxID to add...\"\nmsgstr \"ToxID para adicionar...\"\n\n#: res/ui/settings-view.ui:273\nmsgid \"ToxMe server\"\nmsgstr \"Servidor ToxMe\"\n\n#: res/ui/main-window.ui:188\nmsgid \"Type to search...\"\nmsgstr \"Escreva para pesquisar...\"\n\n#: src/ChatView.vala:323\nmsgid \"Unblock\"\nmsgstr \"Desbloquear\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Unblock friend\"\nmsgstr \"Desbloquear amigo\"\n\n#: res/ui/settings-view.ui:356\nmsgid \"Update record\"\nmsgstr \"Actualizar registro\"\n\n#: res/ui/chat-view.ui:129 res/ui/settings-view.ui:251\nmsgid \"Username\"\nmsgstr \"Nome de utilizador\"\n\n#: res/ui/chat-view.ui:214\nmsgid \"Video call friend\"\nmsgstr \"Fazer chamada de video com amigo\"\n\n#: src/SettingsView.vala:84\nmsgid \"White theme\"\nmsgstr \"Tema branco\"\n\n#: src/MainWindow.vala:97\nmsgid \"Yes\"\nmsgstr \"Sim\"\n\n#: res/ui/main-window.ui:256\nmsgid \"You got a new friend request\"\nmsgstr \"Tem um novo pedido de amizade\"\n\n#: src/ChatView.vala:402 src/MainWindow.vala:605\nmsgid \"_Cancel\"\nmsgstr \"_Cancelar\"\n\n#: src/ChatView.vala:403 src/MainWindow.vala:606\nmsgid \"_Open\"\nmsgstr \"_Abrir\"\n\n#: src/SettingsView.vala:73\nmsgid \"default\"\nmsgstr \"padrão\"\n\n#: src/ChatView.vala:243\nmsgid \"is typing\"\nmsgstr \"está a escrever\"\n\n#: res/ui/settings-view.ui:1340\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (estável)\"\n\n#: src/SettingsView.vala:74\nmsgid \"stable\"\nmsgstr \"estável\"\n\n#: res/ui/settings-view.ui:1343\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n"
  },
  {
    "path": "po/ricin.pot",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-11-03 14:06+0100\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=CHARSET\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: src/ChatView.vala:422 src/Notification.vala:29\nmsgid \" is now \"\nmsgstr \"\"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:569\nmsgid \"9050\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:897\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:655\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:440\nmsgid \"<b>IPv6</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:777\nmsgid \"<b>Language:</b>\"\nmsgstr \"\"\n\n#: src/Wrapper.vala:800\nmsgid \"<b>Last online:</b>\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1187\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1146\nmsgid \"<b>Make the icon in taskbar to blink on new messages?</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:504\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1401\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source <b>ToxCore</\"\n\"b> library.\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1239\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:402\nmsgid \"<b>UDP</b>\"\nmsgstr \"\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"<b>Version:</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:76\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:998\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1579\nmsgid \"About\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:386\nmsgid \"Accept\"\nmsgstr \"\"\n\n#: res/ui/file-list-row.ui:218 res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:715 src/MainWindow.vala:726 src/MainWindow.vala:751\n#: src/MainWindow.vala:765 res/ui/main-window.ui:486 res/ui/main-window.ui:564\nmsgid \"Add a friend\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:646\nmsgid \"Add friend\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:192\nmsgid \"Add password\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:190\nmsgid \"All friends\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:614 src/Util.vala:211\nmsgid \"Away\"\nmsgstr \"\"\n\n#: src/ChatView.vala:733 res/ui/chat-view.ui:1241\nmsgid \"Block\"\nmsgstr \"\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Block friend\"\nmsgstr \"\"\n\n#: src/Util.vala:205\nmsgid \"Blocked\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:604 src/Util.vala:214\nmsgid \"Busy\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1179\nmsgid \"\"\n\"By enabling this option you'll receive desktop notifications <b>everytime a \"\n\"contact goes Online or Offline</b>. Away and Busy status won't trigger these \"\n\"notifications.\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1139\nmsgid \"\"\n\"By enabling this option, <b>everytime you get a new message and the Ricin \"\n\"window is not focused</b>, the Ricin's icon in your taskbar will blink, \"\n\"indicating unread message(s). Giving focus to Ricin will cancel this \"\n\"notification.\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:821\nmsgid \"Call friend\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:121\nmsgid \"Can't load the profile\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:667\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: res/ui/file-list-row.ui:188 res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:105\nmsgid \"Change Nospam\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:209\nmsgid \"Change password\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:91\nmsgid \"Change your avatar\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:137\nmsgid \"Change your status\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:369\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:463\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"\"\n\n#: src/ChatView.vala:797\nmsgid \"Choose a file\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:409\nmsgid \"Choose a folder where to save files\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:145\nmsgid \"Choose a name for the profile\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:303\nmsgid \"Choose directory\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1494\nmsgid \"Choose smileys\"\nmsgstr \"\"\n\n#: src/ChatView.vala:519\nmsgid \"Clear conversation\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1392\nmsgid \"Close the popup\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1054\nmsgid \"Compact friend list?\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1469\nmsgid \"Contributors\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:87\nmsgid \"Copy\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1281\nmsgid \"Copy friend's ToxID\"\nmsgstr \"\"\n\n#: src/ChatView.vala:505\nmsgid \"Copy quote in clipboard\"\nmsgstr \"\"\n\n#: src/ChatView.vala:499\nmsgid \"Copy selection in clipboard\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:367\nmsgid \"Decline\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:275\nmsgid \"Default save path:\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1261\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"\"\n\n#: src/ChatView.vala:515\nmsgid \"Delete selected messages\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:995\nmsgid \"Display typing notifications?\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:942\nmsgid \"Display unread messages notice?\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:435 src/SettingsView.vala:463\n#: src/SettingsView.vala:488\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:462\nmsgid \"Edit your password\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1232\nmsgid \"\"\n\"Enabling this will cause Ricin to tell <b>the person you talk to</b> when \"\n\"you are typing.\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:434\nmsgid \"Encrypt your profile\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:883\nmsgid \"Friend's profile\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:339\nmsgid \"General\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1431\nmsgid \"GitHub\"\nmsgstr \"\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:569\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"\"\n\n#: src/InlineImageMessageListRow.vala:112\nmsgid \"Image saved!\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:435\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1107\nmsgid \"Interface\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:100\nmsgid \"Markdown\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:836\nmsgid \"Message parsing mode:\"\nmsgstr \"\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:611\nmsgid \"Network\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:373\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1291\nmsgid \"Notifications\"\nmsgstr \"\"\n\n#: src/Util.vala:218\nmsgid \"Offline\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:594 src/Util.vala:208\nmsgid \"Online\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:189\nmsgid \"Online friends\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:101\nmsgid \"Plaintext\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:101\nmsgid \"Please enter a password\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:124\nmsgid \"Please enter a profile name.\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:131\nmsgid \"Profile name already taken.\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:624\nmsgid \"Quit\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"\"\n\n#: src/ChatView.vala:509\nmsgid \"Quote selection\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:731\nmsgid \"Reload custom theme\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:226\nmsgid \"Remove password\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:488\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1450\nmsgid \"Report an issue\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart later\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart now\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:695\nmsgid \"Restart required\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:774\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:697\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1539\nmsgid \"Ricin official website\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1632\nmsgid \"Scroll to bottom\"\nmsgstr \"\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:851\nmsgid \"Select your avatar\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1521\nmsgid \"Send file\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1546\nmsgid \"Send message\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:135 src/MainWindow.vala:714 res/ui/main-window.ui:506\nmsgid \"Settings\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1186\nmsgid \"Show notifications when friends status changes?\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:787\nmsgid \"Status message...\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"\"\n\n#: src/ProfileChooser.vala:113\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:694\nmsgid \"Theme:\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:1614\nmsgid \"There are unread messages in this chat\"\nmsgstr \"\"\n\n#: src/MessageListRow.vala:150 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:776\nmsgid \"ToxID can't be empty.\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:778\nmsgid \"ToxID is invalid.\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:589\nmsgid \"ToxID to add...\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:193\nmsgid \"Type to search...\"\nmsgstr \"\"\n\n#: src/ChatView.vala:731\nmsgid \"Unblock\"\nmsgstr \"\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Unblock friend\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:487\nmsgid \"Unencrypt your profile\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:764\nmsgid \"Username\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:849\nmsgid \"Video call friend\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:372\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"\"\n\n#: res/ui/main-window.ui:267\nmsgid \"You got a new friend request\"\nmsgstr \"\"\n\n#: src/ChatView.vala:798 src/MainWindow.vala:854 src/SettingsView.vala:412\nmsgid \"_Cancel\"\nmsgstr \"\"\n\n#: src/ChatView.vala:799 src/MainWindow.vala:855 src/SettingsView.vala:413\nmsgid \"_Open\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:83\nmsgid \"default\"\nmsgstr \"\"\n\n#: src/ChatView.vala:372\nmsgid \"is typing\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1607\nmsgid \"ricin.io (stable)\"\nmsgstr \"\"\n\n#: src/SettingsView.vala:84\nmsgid \"stable\"\nmsgstr \"\"\n\n#: res/ui/settings-view.ui:1610\nmsgid \"toxme.io\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/ru_RU.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# Eternal Sorrow <eternal.sorrow@yandex.ru>, 2016\n# Eternal Sorrow <sergamena@inbox.ru>, 2016\n# Chernobrov Michael, 2016\n# Roman Boldyrev <talipomin@protonmail.com>, 2016\n# Roman Stobenski, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-11-03 14:06+0100\\n\"\n\"PO-Revision-Date: 2016-11-03 13:09+0000\\n\"\n\"Last-Translator: SkyzohKey <SkyzohKey@users.noreply.github.com>\\n\"\n\"Language-Team: Russian (Russia) (http://www.transifex.com/ricinapp/ricin/language/ru_RU/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ru_RU\\n\"\n\"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\\n\"\n\n#: src/ChatView.vala:422 src/Notification.vala:29\nmsgid \" is now \"\nmsgstr \"теперь\"\n\n#: src/Wrapper.vala:260\nmsgid \" is now known as \"\nmsgstr \"также известен как\"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**жирный**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*жирный*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//курсив//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/курсив/\"\n\n#: res/ui/friend-list-row.ui:101\nmsgid \"10\"\nmsgstr \"10\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"Найдено 3 неиспользуемых профиля(-ей):\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:569\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Доступные теги Markdown</b>\"\n\n#: res/ui/settings-view.ui:897\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Отобразить изменения в статусе друзей?</b>\"\n\n#: res/ui/settings-view.ui:655\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Включить пользовательские темы?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Друзья</b>\"\n\n#: res/ui/settings-view.ui:440\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:777\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Язык:</b>\"\n\n#: src/Wrapper.vala:800\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Был онлайн:</b>\"\n\n#: res/ui/chat-view.ui:1187\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Последний раз замечен:</b>\"\n\n#: res/ui/settings-view.ui:1146\nmsgid \"<b>Make the icon in taskbar to blink on new messages?</b>\"\nmsgstr \"<b>Включить мерцание иконки приложения при получении нового сообщения?</b>\"\n\n#: res/ui/settings-view.ui:504\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Прокси (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1401\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"Цель проекта <b>Ricin</b> - создание <i>безопасного, легковесного, модифицируемого и полностью настраиваемого</i> клиента чата, использующего отличную библиотеку <b>ToxCore</b> с открытым исходным кодом.\"\n\n#: res/ui/settings-view.ui:1239\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Отправлять уведомления о наборе текста?</b>\"\n\n#: res/ui/settings-view.ui:402\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Неизвестные пиры</b>\"\n\n#: res/ui/settings-view.ui:1360\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Версия:</b>\"\n\n#: res/ui/settings-view.ui:76\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Ваш ToxID:</b>\"\n\n#: res/ui/chat-view.ui:998\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<b>Друг печатает</b>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">цитата\"\n\n#: res/ui/settings-view.ui:1579\nmsgid \"About\"\nmsgstr \"О программе\"\n\n#: res/ui/main-window.ui:386\nmsgid \"Accept\"\nmsgstr \"Принять\"\n\n#: res/ui/file-list-row.ui:218 res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Принять/возобновить файл\"\n\n#: src/MainWindow.vala:715 src/MainWindow.vala:726 src/MainWindow.vala:751\n#: src/MainWindow.vala:765 res/ui/main-window.ui:486 res/ui/main-window.ui:564\nmsgid \"Add a friend\"\nmsgstr \"Добавить друга\"\n\n#: res/ui/main-window.ui:646\nmsgid \"Add friend\"\nmsgstr \"Добавить в друзья\"\n\n#: res/ui/settings-view.ui:192\nmsgid \"Add password\"\nmsgstr \"Добавить пароль\"\n\n#: src/MainWindow.vala:190\nmsgid \"All friends\"\nmsgstr \"Все друзья\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Альтернативный синтаксис\"\n\n#: src/MainWindow.vala:614 src/Util.vala:211\nmsgid \"Away\"\nmsgstr \"Отошёл\"\n\n#: src/ChatView.vala:733 res/ui/chat-view.ui:1241\nmsgid \"Block\"\nmsgstr \"Заблокировать\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Block friend\"\nmsgstr \"Заблокировать друга\"\n\n#: src/Util.vala:205\nmsgid \"Blocked\"\nmsgstr \"Заблокированные\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Жирный\"\n\n#: src/MainWindow.vala:604 src/Util.vala:214\nmsgid \"Busy\"\nmsgstr \"Занят\"\n\n#: res/ui/settings-view.ui:1179\nmsgid \"\"\n\"By enabling this option you'll receive desktop notifications <b>everytime a \"\n\"contact goes Online or Offline</b>. Away and Busy status won't trigger these\"\n\" notifications.\"\nmsgstr \"Включив эту функцию, Вы будете получать уведомления <b>каждый раз, \"\n\"когда контакт входит или выходит из сети</b>. Статусы \\\"Отошел\\\" и \\\"Занят\\\"\"\n\" не будут вызывать эти уведомления.\"\n\n#: res/ui/settings-view.ui:1139\nmsgid \"\"\n\"By enabling this option, <b>everytime you get a new message and the Ricin \"\n\"window is not focused</b>, the Ricin's icon in your taskbar will blink, \"\n\"indicating unread message(s). Giving focus to Ricin will cancel this \"\n\"notification.\"\nmsgstr \"Включив эту функцию, <b>каждый раз при получении нового сообщения и при окне \"\n\"Ricin, не имеющего фокус ввода</b>, иконка приложения будет мерцать, указывая на наличие \"\n\"непрочитанных сообщений. Получение окном приложения фокуса отключит данное уведомление.\"\n\n#: res/ui/chat-view.ui:821\nmsgid \"Call friend\"\nmsgstr \"Звонок другу\"\n\n#: src/MainWindow.vala:121\nmsgid \"Can't load the profile\"\nmsgstr \"Невозможно загрузить профиль\"\n\n#: res/ui/main-window.ui:667\nmsgid \"Cancel\"\nmsgstr \"Отмена\"\n\n#: res/ui/file-list-row.ui:188 res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Отменить/приостановить файл\"\n\n#: res/ui/settings-view.ui:105\nmsgid \"Change Nospam\"\nmsgstr \"Сменить nospam\"\n\n#: res/ui/settings-view.ui:209\nmsgid \"Change password\"\nmsgstr \"Изменить пароль\"\n\n#: res/ui/main-window.ui:91\nmsgid \"Change your avatar\"\nmsgstr \"Изменить аватар\"\n\n#: res/ui/main-window.ui:137\nmsgid \"Change your status\"\nmsgstr \"Изменить статус\"\n\n#: res/ui/settings-view.ui:369\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"Изменение настроек сети временно отключит вас от сети Tox\"\n\n#: src/SettingsView.vala:463\nmsgid \"\"\n\"Changing your password will cause Ricin to decrypt your profile then re-\"\n\"encrypt it with the new password.\"\nmsgstr \"При изменении пароля Ваш профиль будет расшифрован и зашифрован вновь с новым паролем.\"\n\n#: src/ChatView.vala:797\nmsgid \"Choose a file\"\nmsgstr \"Выберите файл\"\n\n#: src/SettingsView.vala:409\nmsgid \"Choose a folder where to save files\"\nmsgstr \"Выберите папку для сохранения файлов\"\n\n#: src/ProfileChooser.vala:145\nmsgid \"Choose a name for the profile\"\nmsgstr \"Выберите имя профиля\"\n\n#: res/ui/settings-view.ui:303\nmsgid \"Choose directory\"\nmsgstr \"Выберите папку\"\n\n#: res/ui/chat-view.ui:1494\nmsgid \"Choose smileys\"\nmsgstr \"Выбрать смайлы\"\n\n#: src/ChatView.vala:519\nmsgid \"Clear conversation\"\nmsgstr \"Очистить беседу\"\n\n#: src/SettingsView.vala:98\nmsgid \"Clearer theme\"\nmsgstr \"Чистая тема\"\n\n#: res/ui/chat-view.ui:1392\nmsgid \"Close the popup\"\nmsgstr \"Закрыть уведомление\"\n\n#: res/ui/settings-view.ui:1054\nmsgid \"Compact friend list?\"\nmsgstr \"Сжать список контактов?\"\n\n#: res/ui/password-dialog.ui:176\nmsgid \"Confirm new password\"\nmsgstr \"Подтвердите новый пароль\"\n\n#: res/ui/settings-view.ui:1469\nmsgid \"Contributors\"\nmsgstr \"Участники\"\n\n#: res/ui/settings-view.ui:87\nmsgid \"Copy\"\nmsgstr \"Копировать\"\n\n#: res/ui/chat-view.ui:1281\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Копировать ToxID друга\"\n\n#: src/ChatView.vala:505\nmsgid \"Copy quote in clipboard\"\nmsgstr \"Скопировать цитату в буфер обмена\"\n\n#: src/ChatView.vala:499\nmsgid \"Copy selection in clipboard\"\nmsgstr \"Скопировать выбранное в буфер обмена\"\n\n#: res/ui/profile-chooser-window.ui:179\nmsgid \"Create a profile\"\nmsgstr \"Создать профиль\"\n\n#: res/ui/profile-chooser-window.ui:154\nmsgid \"Create this profile\"\nmsgstr \"Создать этот профиль\"\n\n#: res/ui/password-dialog.ui:101\nmsgid \"Current password\"\nmsgstr \"Текущий пароль\"\n\n#: src/PasswordDialog.vala:123\nmsgid \"Current password cannot be blank.\"\nmsgstr \"Текущий пароль не может быть пустым.\"\n\n#: src/SettingsView.vala:96\nmsgid \"Dark theme\"\nmsgstr \"Тёмная тема\"\n\n#: res/ui/main-window.ui:367\nmsgid \"Decline\"\nmsgstr \"Отказаться\"\n\n#: res/ui/settings-view.ui:275\nmsgid \"Default save path:\"\nmsgstr \"Путь сохранения по умолчанию:\"\n\n#: res/ui/chat-view.ui:1261\nmsgid \"Delete\"\nmsgstr \"Удалить\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Удалить из друзей (3)\"\n\n#: src/ChatView.vala:515\nmsgid \"Delete selected messages\"\nmsgstr \"Удалить выбранные сообщения\"\n\n#: res/ui/settings-view.ui:995\nmsgid \"Display typing notifications?\"\nmsgstr \"Уведомлять, когда собеседник печатает?\"\n\n#: res/ui/settings-view.ui:942\nmsgid \"Display unread messages notice?\"\nmsgstr \"Уведомлять о непрочитанных сообщениях?\"\n\n#: src/SettingsView.vala:435 src/SettingsView.vala:463\n#: src/SettingsView.vala:488\nmsgid \"Do you want to proceed anyway?\"\nmsgstr \"Всё равно выполнить?\"\n\n#: src/SettingsView.vala:462\nmsgid \"Edit your password\"\nmsgstr \"Изменить пароль\"\n\n#: res/ui/settings-view.ui:1232\nmsgid \"\"\n\"Enabling this will cause Ricin to tell <b>the person you talk to</b> when \"\n\"you are typing.\"\nmsgstr \"Если эта функция включена, то Ricin будет сообщать Вашему <b>собеседнику</b>, \"\n\"когда Вы печатаете.\"\n\n#: src/SettingsView.vala:434\nmsgid \"Encrypt your profile\"\nmsgstr \"Зашифровать профиль\"\n\n#: res/ui/profile-chooser-window.ui:107\nmsgid \"Enter a name for the profile\"\nmsgstr \"Введите имя профиля\"\n\n#: res/ui/profile-chooser-window.ui:58 res/ui/profile-chooser-window.ui:143\nmsgid \"Enter your password...\"\nmsgstr \"Введите пароль...\"\n\n#: res/ui/chat-view.ui:883\nmsgid \"Friend's profile\"\nmsgstr \"Профиль друга\"\n\n#: res/ui/settings-view.ui:339\nmsgid \"General\"\nmsgstr \"Основные\"\n\n#: res/ui/settings-view.ui:1431\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Название группового чата\"\n\n#: src/MainWindow.vala:569\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Привет! Это %s, давай будем друзьями!\"\n\n#: src/InlineImageMessageListRow.vala:112\nmsgid \"Image saved!\"\nmsgstr \"Изображение сохранено!\"\n\n#: src/SettingsView.vala:435\nmsgid \"\"\n\"In order to encrypt your profile you need to specify a password. This \"\n\"password will be asked each time you login.\"\nmsgstr \"Чтобы зашифровать профиль, необходимо указать пароль. Вы будете вводить этот пароль каждый раз, когда входите.\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"Код\"\n\n#: res/ui/settings-view.ui:1107\nmsgid \"Interface\"\nmsgstr \"Интерфейс\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Курсив\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Покинуть\"\n\n#: res/ui/settings-view.ui:1519\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Лицензия (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:91\nmsgid \"Load a profile\"\nmsgstr \"Загрузить профиль\"\n\n#: res/ui/profile-chooser-window.ui:69\nmsgid \"Login\"\nmsgstr \"Логин\"\n\n#: src/SettingsView.vala:100\nmsgid \"Markdown\"\nmsgstr \"Markdown\"\n\n#: res/ui/settings-view.ui:836\nmsgid \"Message parsing mode:\"\nmsgstr \"Режим парсинга сообщений:\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Заглушить\"\n\n#: res/ui/settings-view.ui:611\nmsgid \"Network\"\nmsgstr \"Сеть\"\n\n#: res/ui/password-dialog.ui:138\nmsgid \"New password\"\nmsgstr \"Новый пароль\"\n\n#: src/PasswordDialog.vala:108\nmsgid \"New password must be different from the older one.\"\nmsgstr \"Новый пароль должен отличаться от старого.\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:373\n#: res/ui/password-dialog.ui:32\nmsgid \"No\"\nmsgstr \"Нет\"\n\n#: res/ui/settings-view.ui:1291\nmsgid \"Notifications\"\nmsgstr \"Уведомления\"\n\n#: src/Util.vala:218\nmsgid \"Offline\"\nmsgstr \"Оффлайн\"\n\n#: src/MainWindow.vala:594 src/Util.vala:208\nmsgid \"Online\"\nmsgstr \"Онлайн\"\n\n#: src/MainWindow.vala:189\nmsgid \"Online friends\"\nmsgstr \"Друзья онлайн\"\n\n#: res/ui/password-dialog.ui:213\nmsgid \"Password Strength\"\nmsgstr \"Надёжность пароля\"\n\n#: src/PasswordDialog.vala:101 src/PasswordDialog.vala:117\n#: src/PasswordDialog.vala:130\nmsgid \"Password cannot be blank.\"\nmsgstr \"Пароль не может быть пустым\"\n\n#: src/PasswordDialog.vala:104 src/PasswordDialog.vala:120\nmsgid \"Password confirmation cannot be blank.\"\nmsgstr \"Подтверждение пароля не может быть пустым.\"\n\n#: src/PasswordDialog.vala:95 src/PasswordDialog.vala:111\nmsgid \"Password doesn't match confirmation.\"\nmsgstr \"Пароль не совпадает с подтверждением.\"\n\n#: src/PasswordDialog.vala:98 src/PasswordDialog.vala:114\n#: src/PasswordDialog.vala:127\nmsgid \"Password must be at least 8 characters.\"\nmsgstr \"Пароль должен быть как минимум 8 символов.\"\n\n#: src/SettingsView.vala:101\nmsgid \"Plaintext\"\nmsgstr \"Обычный текст\"\n\n#: src/ProfileChooser.vala:101\nmsgid \"Please enter a password\"\nmsgstr \"Введите пароль\"\n\n#: src/ProfileChooser.vala:124\nmsgid \"Please enter a profile name.\"\nmsgstr \"Пожалуйста, введите имя профиля.\"\n\n#: src/ProfileChooser.vala:131\nmsgid \"Profile name already taken.\"\nmsgstr \"Имя профиля уже занято.\"\n\n#: src/MainWindow.vala:624\nmsgid \"Quit\"\nmsgstr \"Выход\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Цитата\"\n\n#: src/ChatView.vala:509\nmsgid \"Quote selection\"\nmsgstr \"Цитировать выделенное\"\n\n#: res/ui/settings-view.ui:731\nmsgid \"Reload custom theme\"\nmsgstr \"Перезагрузить пользовательскую тему\"\n\n#: res/ui/settings-view.ui:226\nmsgid \"Remove password\"\nmsgstr \"Удалить пароль\"\n\n#: res/ui/password-dialog.ui:62\nmsgid \"Remove password?\"\nmsgstr \"Удалить пароль?\"\n\n#: src/SettingsView.vala:488\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings.\"\nmsgstr \"Если вы удалите пароль, Ваш профиль, логи сообщений и настройки будут расшифрованы.\"\n\n#: res/ui/password-dialog.ui:79\nmsgid \"\"\n\"Removing your password will unencrypt your profile, chat logs and settings. \"\n\"<b>Do you want to proceed anyway?</b>\"\nmsgstr \"Если вы удалите пароль, Ваш профиль, логи сообщений и настройки будут расшифрованы. <b>Всё равно продолжить?</b>\"\n\n#: res/ui/settings-view.ui:1450\nmsgid \"Report an issue\"\nmsgstr \"Сообщить о проблеме\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart later\"\nmsgstr \"Перезапустить позже\"\n\n#: src/MainWindow.vala:698\nmsgid \"Restart now\"\nmsgstr \"Перезапустить сейчас\"\n\n#: src/MainWindow.vala:695\nmsgid \"Restart required\"\nmsgstr \"Необходим перезапуск\"\n\n#: src/MainWindow.vala:774\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin ещё не поддерживает ToxDNS.\"\n\n#: src/MainWindow.vala:697\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Для применения настроек необходим перезапуск. Перезапустить сейчас?\"\n\n#: res/ui/settings-view.ui:1539\nmsgid \"Ricin official website\"\nmsgstr \"Официальный сайт Ricin\"\n\n#: res/ui/chat-view.ui:1632\nmsgid \"Scroll to bottom\"\nmsgstr \"Прокрутить вниз\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Выберите чат для начала общения.\"\n\n#: src/ProfileChooser.vala:25 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Выберите профиль\"\n\n#: src/MainWindow.vala:851\nmsgid \"Select your avatar\"\nmsgstr \"Выберите аватар\"\n\n#: res/ui/chat-view.ui:1521\nmsgid \"Send file\"\nmsgstr \"Отправить файл\"\n\n#: res/ui/chat-view.ui:1546\nmsgid \"Send message\"\nmsgstr \"Отправить сообщение\"\n\n#: src/MainWindow.vala:135 src/MainWindow.vala:714 res/ui/main-window.ui:506\nmsgid \"Settings\"\nmsgstr \"Настройки\"\n\n#: res/ui/settings-view.ui:1186\nmsgid \"Show notifications when friends status changes?\"\nmsgstr \"Показывать уведомления, когда статус друга меняется?\"\n\n#: res/ui/chat-view.ui:787\nmsgid \"Status message...\"\nmsgstr \"Статус...\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Зачёркнутый\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Синтаксис\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Имя тега\"\n\n#: src/ProfileChooser.vala:113\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Выбранный профиль не существует.\"\n\n#: res/ui/settings-view.ui:694\nmsgid \"Theme:\"\nmsgstr \"Тема оформления:\"\n\n#: res/ui/chat-view.ui:1614\nmsgid \"There are unread messages in this chat\"\nmsgstr \"В этом чате есть непрочитанные сообщения\"\n\n#: src/MessageListRow.vala:150 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS ещё не поддерживается.\"\n\n#: src/MainWindow.vala:776\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID не может быть пустым.\"\n\n#: src/MainWindow.vala:778\nmsgid \"ToxID is invalid.\"\nmsgstr \"Неверный ToxID\"\n\n#: res/ui/main-window.ui:589\nmsgid \"ToxID to add...\"\nmsgstr \"Добавляемый ToxID\"\n\n#: res/ui/main-window.ui:193\nmsgid \"Type to search...\"\nmsgstr \"Введите для поиска...\"\n\n#: src/ChatView.vala:731\nmsgid \"Unblock\"\nmsgstr \"Разблокировать\"\n\n#: src/FriendListRow.vala:94\nmsgid \"Unblock friend\"\nmsgstr \"Разблокировать друга\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Подчёркнутый\"\n\n#: src/SettingsView.vala:487\nmsgid \"Unencrypt your profile\"\nmsgstr \"Расшифровать профиль\"\n\n#: res/ui/chat-view.ui:764\nmsgid \"Username\"\nmsgstr \"Имя пользователя\"\n\n#: res/ui/chat-view.ui:849\nmsgid \"Video call friend\"\nmsgstr \"Видеозвонок другу\"\n\n#: src/SettingsView.vala:97\nmsgid \"White theme\"\nmsgstr \"Светлая тема\"\n\n#: src/MainWindow.vala:541 src/SettingsView.vala:372\n#: res/ui/password-dialog.ui:19\nmsgid \"Yes\"\nmsgstr \"Да\"\n\n#: res/ui/main-window.ui:267\nmsgid \"You got a new friend request\"\nmsgstr \"У Вас новый запрос в друзья\"\n\n#: src/ChatView.vala:798 src/MainWindow.vala:854 src/SettingsView.vala:412\nmsgid \"_Cancel\"\nmsgstr \"О_тмена\"\n\n#: src/ChatView.vala:799 src/MainWindow.vala:855 src/SettingsView.vala:413\nmsgid \"_Open\"\nmsgstr \"_Открыть\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__подчёркнутый__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_подчёркнутый_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`код`\"\n\n#: src/SettingsView.vala:83\nmsgid \"default\"\nmsgstr \"по умолчанию\"\n\n#: src/ChatView.vala:372\nmsgid \"is typing\"\nmsgstr \"печатает\"\n\n#: res/ui/settings-view.ui:1607\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (стабильный)\"\n\n#: src/SettingsView.vala:84\nmsgid \"stable\"\nmsgstr \"стабильный\"\n\n#: res/ui/settings-view.ui:1610\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~зачёркнутый~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~зачёркнутый~~\"\n"
  },
  {
    "path": "po/uk.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# \n# Translators:\n# Roman Stobenski, 2016\n# Roman Stobenski, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-04-14 17:44+0200\\n\"\n\"PO-Revision-Date: 2016-04-14 06:25+0000\\n\"\n\"Last-Translator: Roman Stobenski\\n\"\n\"Language-Team: Ukrainian (http://www.transifex.com/ricinapp/ricin/language/uk/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: uk\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\n#: src/ChatView.vala:367\nmsgid \" is now \"\nmsgstr \"тепер\"\n\n#: src/Wrapper.vala:222\nmsgid \" is now known as \"\nmsgstr \"тепер відомий як\"\n\n#: res/ui/chat-view.ui:517\nmsgid \"**bold**\"\nmsgstr \"**жирний**\"\n\n#: res/ui/chat-view.ui:506\nmsgid \"*bold*\"\nmsgstr \"*жирний*\"\n\n#: res/ui/chat-view.ui:553\nmsgid \"//italic//\"\nmsgstr \"//курсив//\"\n\n#: res/ui/chat-view.ui:542\nmsgid \"/italic/\"\nmsgstr \"/курсив/\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"Знайдено 3 невикористовуваних профілю:\\n<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:642\nmsgid \"9050\"\nmsgstr \"9050\"\n\n#: res/ui/chat-view.ui:293\nmsgid \"<b>Available Markdown tags</b>\"\nmsgstr \"<b>Доступні Markdown теги</b>\"\n\n#: res/ui/settings-view.ui:906\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>Відобразити зміни в статусі друзів?</b>\"\n\n#: res/ui/settings-view.ui:728\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>Включити кастомні теми?</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>Друзі</b>\"\n\n#: res/ui/settings-view.ui:513\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:849\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>Мова:</b>\"\n\n#: src/Wrapper.vala:597\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>Востаннє онлайн:</b>\"\n\n#: res/ui/chat-view.ui:1123\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>Востаннє бачили:</b>\"\n\n#: res/ui/settings-view.ui:577\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Проксі (SOCKS 5)</b>\"\n\n#: src/Ricin.vala:4 res/ui/settings-view.ui:1277\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-\"\n\"customizable</i> chat client using the awesome and open-source \"\n\"<b>ToxCore</b> library.\"\nmsgstr \"<b>Ricin</b> прагне бути <i>безпечним, легким та максимально налаштовуваним</i> чат клієнтом, що застосовує дивовижну та відкриту бібліотеку <b>ToxCore</b>.\"\n\n#: res/ui/settings-view.ui:1091\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>Відправляти сповіщення про набір?</b>\"\n\n#: res/ui/settings-view.ui:475\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>Невідомі піри</b>\"\n\n#: res/ui/settings-view.ui:1236\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>Версія:</b>\"\n\n#: res/ui/settings-view.ui:191\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>Ваш Tox псевдонім:</b>\"\n\n#: res/ui/settings-view.ui:72\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>Ваш ToxID:</b>\"\n\n#: res/ui/chat-view.ui:1671\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>Друг пише</i>\"\n\n#: res/ui/chat-view.ui:455\nmsgid \">quote\"\nmsgstr \">цитата\"\n\n#: res/ui/settings-view.ui:1455\nmsgid \"About\"\nmsgstr \"Про програму\"\n\n#: res/ui/main-window.ui:376\nmsgid \"Accept\"\nmsgstr \"Прийняти\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"Прийняти/відновити файл\"\n\n#: src/MainWindow.vala:564 src/MainWindow.vala:589 res/ui/main-window.ui:474\n#: res/ui/main-window.ui:541\nmsgid \"Add a friend\"\nmsgstr \"Додати друга\"\n\n#: res/ui/main-window.ui:616\nmsgid \"Add friend\"\nmsgstr \"Додати до друзів\"\n\n#: src/MainWindow.vala:169\nmsgid \"All friends\"\nmsgstr \"Усі друзі\"\n\n#: res/ui/chat-view.ui:352\nmsgid \"Alt syntax\"\nmsgstr \"Альтернативний синтаксис\"\n\n#: src/MainWindow.vala:455 src/Util.vala:156\nmsgid \"Away\"\nmsgstr \"Відсутній\"\n\n#: res/ui/settings-view.ui:257\nmsgid \"Biography\"\nmsgstr \"Біографія\"\n\n#: src/ChatView.vala:402 res/ui/chat-view.ui:1225\nmsgid \"Block\"\nmsgstr \"Заблокувати\"\n\n#: src/FriendListRow.vala:64\nmsgid \"Block friend\"\nmsgstr \"Заблокувати друга\"\n\n#: src/Util.vala:150\nmsgid \"Blocked\"\nmsgstr \"Заблоковано\"\n\n#: res/ui/chat-view.ui:492\nmsgid \"Bold\"\nmsgstr \"Жирний\"\n\n#: src/MainWindow.vala:445 src/Util.vala:159\nmsgid \"Busy\"\nmsgstr \"Зайнятий\"\n\n#: res/ui/chat-view.ui:854\nmsgid \"Call friend\"\nmsgstr \"Подзвонити другу\"\n\n#: src/MainWindow.vala:103\nmsgid \"Can't load the profile\"\nmsgstr \"Неможливо завантажити профіль\"\n\n#: res/ui/main-window.ui:637\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"Скасувати/призупинити файл\"\n\n#: res/ui/settings-view.ui:101\nmsgid \"Change Nospam\"\nmsgstr \"Змінити Nospam\"\n\n#: res/ui/main-window.ui:86\nmsgid \"Change your avatar\"\nmsgstr \"Змінити аватар\"\n\n#: res/ui/main-window.ui:133\nmsgid \"Change your status\"\nmsgstr \"Змінити статус\"\n\n#: res/ui/settings-view.ui:442\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox \"\n\"network\"\nmsgstr \"Зміна мережевих налаштувань тимчасово відключить вас від мережі Tox\"\n\n#: src/ChatView.vala:462\nmsgid \"Choose a file\"\nmsgstr \"Виберіть файл\"\n\n#: src/ProfileChooser.vala:106\nmsgid \"Choose a name for the profile\"\nmsgstr \"Виберіть назву для профілю\"\n\n#: res/ui/chat-view.ui:1472\nmsgid \"Choose smileys\"\nmsgstr \"Виберіть смайли\"\n\n#: src/SettingsView.vala:95\nmsgid \"Clearer theme\"\nmsgstr \"Легка тема\"\n\n#: res/ui/chat-view.ui:1371\nmsgid \"Close the popup\"\nmsgstr \"Закрити спливаюче вікно\"\n\n#: res/ui/settings-view.ui:1345\nmsgid \"Contributors\"\nmsgstr \"Автори\"\n\n#: res/ui/settings-view.ui:83 res/ui/settings-view.ui:213\nmsgid \"Copy\"\nmsgstr \"Копіювати\"\n\n#: res/ui/chat-view.ui:1265\nmsgid \"Copy friend's ToxID\"\nmsgstr \"Копіювати ToxID друга\"\n\n#: res/ui/profile-chooser-window.ui:141\nmsgid \"Create a profile\"\nmsgstr \"Створити профіль\"\n\n#: res/ui/profile-chooser-window.ui:116\nmsgid \"Create this profile\"\nmsgstr \"Створити цей профіль\"\n\n#: src/SettingsView.vala:93\nmsgid \"Dark theme\"\nmsgstr \"Темна тема\"\n\n#: res/ui/main-window.ui:356\nmsgid \"Decline\"\nmsgstr \"Відмовитись\"\n\n#: res/ui/chat-view.ui:1245\nmsgid \"Delete\"\nmsgstr \"Видалити\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"Видалити з друзів (3)\"\n\n#: res/ui/settings-view.ui:1026\nmsgid \"Display typing notifications?\"\nmsgstr \"Показувати сповіщення про набір?\"\n\n#: res/ui/settings-view.ui:962\nmsgid \"Display unread messages notice?\"\nmsgstr \"Показувати сповіщення про непрочитані повідомлення?\"\n\n#: res/ui/profile-chooser-window.ui:88\nmsgid \"Enter a name for the profile\"\nmsgstr \"Введіть назву для профілю\"\n\n#: res/ui/chat-view.ui:763\nmsgid \"Friend's profile\"\nmsgstr \"Профіль друга\"\n\n#: res/ui/settings-view.ui:410\nmsgid \"General\"\nmsgstr \"Головне\"\n\n#: res/ui/settings-view.ui:1307\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"Назва групового чату\"\n\n#: src/MainWindow.vala:410\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"Вітаю! Це %s, давайте будемо друзями.\"\n\n#: src/InlineImageMessageListRow.vala:97\nmsgid \"Image saved!\"\nmsgstr \"Зображення збережене!\"\n\n#: res/ui/chat-view.ui:600\nmsgid \"Inline code\"\nmsgstr \"Однорядковий код\"\n\n#: res/ui/settings-view.ui:1150\nmsgid \"Interface\"\nmsgstr \"Інтерфейс\"\n\n#: res/ui/chat-view.ui:528\nmsgid \"Italic\"\nmsgstr \"Курсив\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"Вийти\"\n\n#: res/ui/settings-view.ui:1395\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"Ліцензія (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:72\nmsgid \"Load a profile\"\nmsgstr \"Завантажити профіль\"\n\n#: res/ui/profile-chooser-window.ui:50\nmsgid \"Login\"\nmsgstr \"Увійти\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"Заглушити\"\n\n#: res/ui/settings-view.ui:684\nmsgid \"Network\"\nmsgstr \"Мережа\"\n\n#: res/ui/settings-view.ui:335\nmsgid \"New Tox alias\"\nmsgstr \"Новий Tox псевдонім\"\n\n#: src/MainWindow.vala:383\nmsgid \"No\"\nmsgstr \"Ні\"\n\n#: res/ui/chat-view.ui:1160\nmsgid \"Notes about the user:\"\nmsgstr \"Нотатки про користувача:\"\n\n#: src/Util.vala:163\nmsgid \"Offline\"\nmsgstr \"Оффлайн\"\n\n#: src/MainWindow.vala:435 src/Util.vala:153\nmsgid \"Online\"\nmsgstr \"Онлайн\"\n\n#: src/MainWindow.vala:168\nmsgid \"Online friends\"\nmsgstr \"Друзі онлайн\"\n\n#: src/ProfileChooser.vala:87\nmsgid \"Please enter a profile name.\"\nmsgstr \"Будь ласка, введіть назву профілю.\"\n\n#: src/ProfileChooser.vala:94\nmsgid \"Profile name already taken.\"\nmsgstr \"Така назва профілю вже зайнята. \"\n\n#: src/MainWindow.vala:465\nmsgid \"Quit\"\nmsgstr \"Вихід\"\n\n#: res/ui/chat-view.ui:433\nmsgid \"Quote\"\nmsgstr \"Цитата\"\n\n#: res/ui/settings-view.ui:803\nmsgid \"Reload custom theme\"\nmsgstr \"Перезавантажити кастомну тему\"\n\n#: res/ui/settings-view.ui:1326\nmsgid \"Report an issue\"\nmsgstr \"Повідомити про помилку\"\n\n#: res/ui/settings-view.ui:368\nmsgid \"Request deletion\"\nmsgstr \"Запросити видалення\"\n\n#: src/MainWindow.vala:538\nmsgid \"Restart later\"\nmsgstr \"Перезапустити пізніше\"\n\n#: src/MainWindow.vala:538\nmsgid \"Restart now\"\nmsgstr \"Перезапустити зараз\"\n\n#: src/MainWindow.vala:535\nmsgid \"Restart required\"\nmsgstr \"Потрібен перезапуск\"\n\n#: res/ui/settings-view.ui:1204\nmsgid \"Ricin\"\nmsgstr \"Ricin\"\n\n#: src/MainWindow.vala:598\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin наразі не підтримує ToxDNS.\"\n\n#: src/MainWindow.vala:537\nmsgid \"\"\n\"Ricin needs to restart in order to apply settings. Do you want to restart?\"\nmsgstr \"Ricin потребує перезапуску для застосування налаштувань. Ви хочете перезапустити зараз?\"\n\n#: res/ui/settings-view.ui:1415\nmsgid \"Ricin official website\"\nmsgstr \"Офіційний сайт Ricin\"\n\n#: res/ui/chat-view.ui:1613\nmsgid \"Scroll to bottom\"\nmsgstr \"Скролити донизу \"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"Виберіть чат для початку спілкування.\"\n\n#: src/ProfileChooser.vala:23 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"Виберіть профіль\"\n\n#: src/MainWindow.vala:675\nmsgid \"Select your avatar\"\nmsgstr \"Виберіть ваш аватар\"\n\n#: res/ui/chat-view.ui:1500\nmsgid \"Send file\"\nmsgstr \"Відправити файл\"\n\n#: res/ui/chat-view.ui:1526\nmsgid \"Send message\"\nmsgstr \"Відправити повідомлення\"\n\n#: src/MainWindow.vala:117 src/MainWindow.vala:553 res/ui/main-window.ui:494\nmsgid \"Settings\"\nmsgstr \"Налаштування\"\n\n#: res/ui/chat-view.ui:820\nmsgid \"Status message...\"\nmsgstr \"Статус...\"\n\n#: res/ui/chat-view.ui:636\nmsgid \"Striked\"\nmsgstr \"Закреслений\"\n\n#: res/ui/chat-view.ui:338\nmsgid \"Syntax\"\nmsgstr \"Синтаксис\"\n\n#: res/ui/chat-view.ui:324\nmsgid \"Tag Name\"\nmsgstr \"Назва тегу\"\n\n#: src/ProfileChooser.vala:78\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"Обраний профіль не існує.\"\n\n#: res/ui/settings-view.ui:767\nmsgid \"Theme:\"\nmsgstr \"Тема:\"\n\n#: res/ui/chat-view.ui:1595\nmsgid \"There are unread messages in this chat\"\nmsgstr \"В цьому чаті є непрочитані повідомлення\"\n\n#: src/MessageListRow.vala:91 src/PlainLabel.vala:22 src/QuoteLabel.vala:22\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"ToxDNS наразі не підтримується.\"\n\n#: src/MainWindow.vala:600\nmsgid \"ToxID can't be empty.\"\nmsgstr \"ToxID не може бути пустим.\"\n\n#: src/MainWindow.vala:602\nmsgid \"ToxID is invalid.\"\nmsgstr \"ToxID невірний.\"\n\n#: res/ui/main-window.ui:562\nmsgid \"ToxID to add...\"\nmsgstr \"Додати ToxID...\"\n\n#: res/ui/settings-view.ui:268\nmsgid \"ToxMe server\"\nmsgstr \"ToxMe сервер\"\n\n#: res/ui/main-window.ui:190\nmsgid \"Type to search...\"\nmsgstr \"Введіть для пошуку...\"\n\n#: src/ChatView.vala:400\nmsgid \"Unblock\"\nmsgstr \"Розблокувати\"\n\n#: src/FriendListRow.vala:64\nmsgid \"Unblock friend\"\nmsgstr \"Розблокувати друга\"\n\n#: res/ui/chat-view.ui:564\nmsgid \"Underline\"\nmsgstr \"Підкреслений\"\n\n#: res/ui/settings-view.ui:351\nmsgid \"Update record\"\nmsgstr \"Оновити запис\"\n\n#: res/ui/chat-view.ui:797 res/ui/settings-view.ui:246\nmsgid \"Username\"\nmsgstr \"Ім'я користувача\"\n\n#: res/ui/chat-view.ui:882\nmsgid \"Video call friend\"\nmsgstr \"Відеодзвінок другу\"\n\n#: src/SettingsView.vala:94\nmsgid \"White theme\"\nmsgstr \"Світла тема\"\n\n#: src/MainWindow.vala:383\nmsgid \"Yes\"\nmsgstr \"Так\"\n\n#: res/ui/main-window.ui:260\nmsgid \"You got a new friend request\"\nmsgstr \"Ви отримали новий запит\"\n\n#: src/ChatView.vala:463 src/MainWindow.vala:678\nmsgid \"_Cancel\"\nmsgstr \"_Скасувати\"\n\n#: src/ChatView.vala:464 src/MainWindow.vala:679\nmsgid \"_Open\"\nmsgstr \"_Відкрити\"\n\n#: res/ui/chat-view.ui:589\nmsgid \"__underline__\"\nmsgstr \"__підкреслений__\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"_underline_\"\nmsgstr \"_підкреслений_\"\n\n#: res/ui/chat-view.ui:615\nmsgid \"`inline code`\"\nmsgstr \"`однорядковий код`\"\n\n#: src/SettingsView.vala:76\nmsgid \"default\"\nmsgstr \"за замовчуванням\"\n\n#: src/ChatView.vala:317\nmsgid \"is typing\"\nmsgstr \"пише\"\n\n#: res/ui/settings-view.ui:1488\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (стабільний)\"\n\n#: src/SettingsView.vala:77\nmsgid \"stable\"\nmsgstr \"стабільний\"\n\n#: res/ui/settings-view.ui:1491\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n\n#: res/ui/chat-view.ui:650\nmsgid \"~striked~\"\nmsgstr \"~закреслений~\"\n\n#: res/ui/chat-view.ui:661\nmsgid \"~~striked~~\"\nmsgstr \"~~закреслений~~\"\n"
  },
  {
    "path": "po/zh_CN.po",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n# Translators:\n# Easy Tang <lineteen@msn.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Ricin\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-03-08 18:19+0100\\n\"\n\"PO-Revision-Date: 2016-03-12 23:40+0100\\n\"\n\"Last-Translator: SkyzohKey <skyzohkey@tuta.io>\\n\"\n\"Language-Team: Chinese (China) (http://www.transifex.com/ricinapp/ricin/language/\"\n\"zh_CN/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: zh_CN\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Poedit 1.8.6\\n\"\n\n#: src/ChatView.vala:289\nmsgid \" is now \"\nmsgstr \"现在\"\n\n#: src/Wrapper.vala:218\nmsgid \" is now known as \"\nmsgstr \"现在被称为\"\n\n#: res/ui/friend-list-notification_unusable.ui:42\nmsgid \"\"\n\"3 unused profiles found:\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\nmsgstr \"\"\n\"发现3个未使用的本机账户：\\n\"\n\"<b>Snow, Guy, Aztek</b>\"\n\n#: res/ui/settings-view.ui:835\nmsgid \"<b>Display friend's status changes?</b>\"\nmsgstr \"<b>显示好友的状态变更？</b>\"\n\n#: res/ui/settings-view.ui:726\nmsgid \"<b>Enable custom themes?</b>\"\nmsgstr \"<b>启用自定义主题？</b>\"\n\n#: res/ui/group-chat-view.ui:219\nmsgid \"<b>Friends</b>\"\nmsgstr \"<b>好友</b>\"\n\n#: res/ui/settings-view.ui:518\nmsgid \"<b>IPv6</b>\"\nmsgstr \"<b>IPv6</b>\"\n\n#: res/ui/settings-view.ui:955\nmsgid \"<b>Language:</b>\"\nmsgstr \"<b>语言：</b>\"\n\n#: src/Wrapper.vala:580\nmsgid \"<b>Last online:</b>\"\nmsgstr \"<b>最近在线：</b>\"\n\n#: res/ui/chat-view.ui:456\nmsgid \"<b>Last seen:</b>\"\nmsgstr \"<b>最近出现：</b>\"\n\n#: res/ui/settings-view.ui:582\nmsgid \"<b>Proxy (SOCKS 5)</b>\"\nmsgstr \"<b>Proxy (SOCKS 5)</b>\"\n\n#: res/ui/settings-view.ui:1134\nmsgid \"\"\n\"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-customizable</\"\n\"i> chat client using the awesome and open-source <b>ToxCore</b> library.\"\nmsgstr \"\"\n\"<b>Ricin </b>根植于优秀的开源通讯协议<b>ToxCore</b> ，致力于打造一个<i>安全、轻便、\"\n\"透明且可自由定制的</i>聊天客户端。\"\n\n#: res/ui/settings-view.ui:891\nmsgid \"<b>Send typing notifications?</b>\"\nmsgstr \"<b>发送打字通知？</b>\"\n\n#: res/ui/settings-view.ui:480\nmsgid \"<b>UDP</b>\"\nmsgstr \"<b>UDP</b>\"\n\n#: res/ui/group-chat-view.ui:247\nmsgid \"<b>Unknown peers</b>\"\nmsgstr \"<b>未知客户端</b>\"\n\n#: res/ui/settings-view.ui:1093\nmsgid \"<b>Version:</b>\"\nmsgstr \"<b>版本：</b>\"\n\n#: res/ui/settings-view.ui:196\nmsgid \"<b>Your Tox alias:</b>\"\nmsgstr \"<b>你的Tox昵称：</b>\"\n\n#: res/ui/settings-view.ui:77\nmsgid \"<b>Your ToxID:</b>\"\nmsgstr \"<b>你的Tox账号：</b>\"\n\n#: res/ui/chat-view.ui:911\nmsgid \"<i>Friend is typing</i>\"\nmsgstr \"<i>对方正在打字</i>\"\n\n#: res/ui/settings-view.ui:1312\nmsgid \"About\"\nmsgstr \"关于\"\n\n#: res/ui/main-window.ui:372\nmsgid \"Accept\"\nmsgstr \"接收\"\n\n#: res/ui/inline-file-message-list-row.ui:205\nmsgid \"Accept/Resume file\"\nmsgstr \"接收/继续 文件\"\n\n#: src/MainWindow.vala:491 src/MainWindow.vala:516 res/ui/main-window.ui:470\n#: res/ui/main-window.ui:537\nmsgid \"Add a friend\"\nmsgstr \"添加好友\"\n\n#: res/ui/main-window.ui:612\nmsgid \"Add friend\"\nmsgstr \"添加\"\n\n#: src/MainWindow.vala:205\nmsgid \"All friends\"\nmsgstr \"全部好友\"\n\n#: src/MainWindow.vala:429 src/Util.vala:160\nmsgid \"Away\"\nmsgstr \"离开\"\n\n#: res/ui/settings-view.ui:262\nmsgid \"Biography\"\nmsgstr \"签名\"\n\n#: src/ChatView.vala:325 res/ui/chat-view.ui:558\nmsgid \"Block\"\nmsgstr \"屏蔽\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Block friend\"\nmsgstr \"屏蔽好友\"\n\n#: src/Util.vala:154\nmsgid \"Blocked\"\nmsgstr \"黑名单\"\n\n#: src/MainWindow.vala:419 src/Util.vala:163\nmsgid \"Busy\"\nmsgstr \"忙碌\"\n\n#: res/ui/chat-view.ui:186\nmsgid \"Call friend\"\nmsgstr \"呼叫好友\"\n\n#: src/MainWindow.vala:147\nmsgid \"Can't load the profile\"\nmsgstr \"无法加载该账户配置文件\"\n\n#: res/ui/main-window.ui:633\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: res/ui/inline-file-message-list-row.ui:175\nmsgid \"Cancel/pause file\"\nmsgstr \"取消/暂停 文件\"\n\n#: res/ui/settings-view.ui:106\nmsgid \"Change Nospam\"\nmsgstr \"更新防骚扰码\"\n\n#: res/ui/main-window.ui:86\nmsgid \"Change your avatar\"\nmsgstr \"更换头像\"\n\n#: res/ui/main-window.ui:133\nmsgid \"Change your status\"\nmsgstr \"更改状态\"\n\n#: res/ui/settings-view.ui:447\nmsgid \"\"\n\"Changing Network settings will temporarily disconnect you from the Tox network\"\nmsgstr \"更改网络设置将会暂时断开你的Tox连线\"\n\n#: src/ChatView.vala:401\nmsgid \"Choose a file\"\nmsgstr \"选择一个文件\"\n\n#: src/ProfileChooser.vala:89\nmsgid \"Choose a name for the profile\"\nmsgstr \"命名该账户\"\n\n#: res/ui/chat-view.ui:700\nmsgid \"Choose smileys\"\nmsgstr \"选择表情\"\n\n#: src/SettingsView.vala:85\nmsgid \"Clearer theme\"\nmsgstr \"清新风格\"\n\n#: res/ui/chat-view.ui:843\nmsgid \"Close the popup\"\nmsgstr \"关闭弹窗\"\n\n#: res/ui/settings-view.ui:1202\nmsgid \"Contributors\"\nmsgstr \"贡献者\"\n\n#: res/ui/settings-view.ui:88 res/ui/settings-view.ui:218\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n#: res/ui/chat-view.ui:598\nmsgid \"Copy friend's ToxID\"\nmsgstr \"复制好友的Tox账号\"\n\n#: res/ui/profile-chooser-window.ui:141\nmsgid \"Create a profile\"\nmsgstr \"新建账户\"\n\n#: res/ui/profile-chooser-window.ui:116\nmsgid \"Create this profile\"\nmsgstr \"创建该账户\"\n\n#: src/SettingsView.vala:83\nmsgid \"Dark theme\"\nmsgstr \"黑色风格\"\n\n#: res/ui/main-window.ui:352\nmsgid \"Decline\"\nmsgstr \"拒绝\"\n\n#: res/ui/chat-view.ui:578\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: res/ui/friend-list-notification_unusable.ui:59\nmsgid \"Delete friends (3)\"\nmsgstr \"删除好友 (3)\"\n\n#: res/ui/profile-chooser-window.ui:88\nmsgid \"Enter a name for the profile\"\nmsgstr \"填写一个账户名\"\n\n#: res/ui/chat-view.ui:95\nmsgid \"Friend's profile\"\nmsgstr \"好友详细资料\"\n\n#: res/ui/settings-view.ui:415\nmsgid \"General\"\nmsgstr \"常规\"\n\n#: res/ui/settings-view.ui:1164\nmsgid \"GitHub\"\nmsgstr \"GitHub\"\n\n#: res/ui/group-chat-view.ui:60\nmsgid \"Groupchat name\"\nmsgstr \"群组名称\"\n\n#: src/MainWindow.vala:384\n#, c-format\nmsgid \"Hello! It's %s, let's be friends.\"\nmsgstr \"你好！我是 %s，请加我为好友。\"\n\n#: src/InlineImageMessageListRow.vala:97\nmsgid \"Image saved!\"\nmsgstr \"图片已保存！\"\n\n#: res/ui/settings-view.ui:1007\nmsgid \"Interface\"\nmsgstr \"界面\"\n\n#: res/ui/group-chat-view.ui:289\nmsgid \"Leave\"\nmsgstr \"离开\"\n\n#: res/ui/settings-view.ui:1252\nmsgid \"License (GNU General Public License 3)\"\nmsgstr \"许可协议 (GNU General Public License 3)\"\n\n#: res/ui/profile-chooser-window.ui:72\nmsgid \"Load a profile\"\nmsgstr \"加载一个账户\"\n\n#: res/ui/profile-chooser-window.ui:50\nmsgid \"Login\"\nmsgstr \"登录\"\n\n#: res/ui/group-chat-view.ui:310\nmsgid \"Mute\"\nmsgstr \"静音\"\n\n#: res/ui/settings-view.ui:687\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: res/ui/settings-view.ui:340\nmsgid \"New Tox alias\"\nmsgstr \"新的Tox昵称\"\n\n#: src/MainWindow.vala:97\nmsgid \"No\"\nmsgstr \"否\"\n\n#: res/ui/chat-view.ui:493\nmsgid \"Notes about the user:\"\nmsgstr \"好友备注：\"\n\n#: src/Util.vala:167\nmsgid \"Offline\"\nmsgstr \"离线\"\n\n#: src/MainWindow.vala:409 src/Util.vala:157\nmsgid \"Online\"\nmsgstr \"在线\"\n\n#: src/MainWindow.vala:204\nmsgid \"Online friends\"\nmsgstr \"在线好友\"\n\n#: src/ProfileChooser.vala:70\nmsgid \"Please enter a profile name.\"\nmsgstr \"新建账户名称。\"\n\n#: src/ProfileChooser.vala:77\nmsgid \"Profile name already taken.\"\nmsgstr \"账户名已被占用。\"\n\n#: src/MainWindow.vala:439\nmsgid \"Quit\"\nmsgstr \"退出\"\n\n#: res/ui/settings-view.ui:783\nmsgid \"Reload custom theme\"\nmsgstr \"刷新自定义主题\"\n\n#: res/ui/settings-view.ui:1183\nmsgid \"Report an issue\"\nmsgstr \"报告使用问题\"\n\n#: res/ui/settings-view.ui:373\nmsgid \"Request deletion\"\nmsgstr \"申请删除\"\n\n#: res/ui/settings-view.ui:1061\nmsgid \"Ricin\"\nmsgstr \"Ricin\"\n\n#: src/MainWindow.vala:525\nmsgid \"Ricin doesn't supports ToxDNS yet.\"\nmsgstr \"Ricin 尚不支持 ToxDNS。\"\n\n#: res/ui/settings-view.ui:1272\nmsgid \"Ricin official website\"\nmsgstr \"Ricin 官方网站\"\n\n#: res/ui/welcome-view.ui:87\nmsgid \"Select a chat to start messaging.\"\nmsgstr \"选择一个会话开始交谈。\"\n\n#: src/ProfileChooser.vala:20 res/ui/profile-chooser-window.ui:23\nmsgid \"Select a profile\"\nmsgstr \"选择一个账户\"\n\n#: src/MainWindow.vala:602\nmsgid \"Select your avatar\"\nmsgstr \"选择头像\"\n\n#: res/ui/chat-view.ui:727\nmsgid \"Send file\"\nmsgstr \"发送文件\"\n\n#: res/ui/chat-view.ui:753\nmsgid \"Send message\"\nmsgstr \"发送消息\"\n\n#: src/MainWindow.vala:159 src/MainWindow.vala:480 res/ui/main-window.ui:490\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: res/ui/chat-view.ui:152\nmsgid \"Status message...\"\nmsgstr \"状态信息…\"\n\n#: src/ProfileChooser.vala:61\nmsgid \"The selected profile doesn't exists.\"\nmsgstr \"所选账户不存在。\"\n\n#: src/MessageListRow.vala:54 src/PlainLabel.vala:20 src/QuoteLabel.vala:20\nmsgid \"ToxDNS is not supported yet.\"\nmsgstr \"尚不支持ToxDNS。\"\n\n#: src/MainWindow.vala:527\nmsgid \"ToxID can't be empty.\"\nmsgstr \"Tox账号必须填写。\"\n\n#: src/MainWindow.vala:529\nmsgid \"ToxID is invalid.\"\nmsgstr \"无效的Tox账号。\"\n\n#: res/ui/main-window.ui:558\nmsgid \"ToxID to add...\"\nmsgstr \"添加Tox账号…\"\n\n#: res/ui/settings-view.ui:273\nmsgid \"ToxMe server\"\nmsgstr \"ToxMe 服务器\"\n\n#: res/ui/main-window.ui:188\nmsgid \"Type to search...\"\nmsgstr \"键入搜索…\"\n\n#: src/ChatView.vala:323\nmsgid \"Unblock\"\nmsgstr \"解除屏蔽\"\n\n#: src/FriendListRow.vala:61\nmsgid \"Unblock friend\"\nmsgstr \"解除屏蔽\"\n\n#: res/ui/settings-view.ui:356\nmsgid \"Update record\"\nmsgstr \"更新记录\"\n\n#: res/ui/chat-view.ui:129 res/ui/settings-view.ui:251\nmsgid \"Username\"\nmsgstr \"用户名\"\n\n#: res/ui/chat-view.ui:214\nmsgid \"Video call friend\"\nmsgstr \"与好友视频通话\"\n\n#: src/SettingsView.vala:84\nmsgid \"White theme\"\nmsgstr \"白色风格\"\n\n#: src/MainWindow.vala:97\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: res/ui/main-window.ui:256\nmsgid \"You got a new friend request\"\nmsgstr \"你有一个新的好友请求\"\n\n#: src/ChatView.vala:402 src/MainWindow.vala:605\nmsgid \"_Cancel\"\nmsgstr \"_取消\"\n\n#: src/ChatView.vala:403 src/MainWindow.vala:606\nmsgid \"_Open\"\nmsgstr \"_打开\"\n\n#: src/SettingsView.vala:73\nmsgid \"default\"\nmsgstr \"默认\"\n\n#: src/ChatView.vala:243\nmsgid \"is typing\"\nmsgstr \"正在打字\"\n\n#: res/ui/settings-view.ui:1340\nmsgid \"ricin.io (stable)\"\nmsgstr \"ricin.io (稳定版)\"\n\n#: src/SettingsView.vala:74\nmsgid \"stable\"\nmsgstr \"稳定版\"\n\n#: res/ui/settings-view.ui:1343\nmsgid \"toxme.io\"\nmsgstr \"toxme.io\"\n"
  },
  {
    "path": "poulp.json",
    "content": "{\n  \"name\": \"ricin\",\n  \"version\": \"0.3.0\",\n  \"description\": \"A dead-simple but powerful Tox client\",\n  \"license\": \"GPLv3\",\n  \"author\": \"SkyzohKey <skyzohkey@protonmail.com>\",\n  \"repository\": \"https://github.com/RicinApp/Ricin.git\",\n\n  \"output\": \"build/Ricin\",\n  \"vapiDir\": \"vapis/\",\n  \"files\": [ \"src/*.vala\" ],\n  \"libs\": [\n    \"glib-2.0\",\n    \"gio-2.0\",\n    \"gobject-2.0\",\n    \"gmodule-2.0\",\n    \"gtk+-3.0\",\n    \"libsoup-2.4\",\n    \"json-glib-1.0\",\n    \"libnotify\",\n    \"libtoxcore\",\n    \"libtoxencryptsave\"\n  ],\n  \"compilerParams\": [\n    \"--target-glib=2.38\",\n    \"--gresources=res/ricin.gresource.xml\",\n    \"-X\", \"-DGETTEXT_PACKAGE=ricin\"\n  ],\n\n  \"scripts\": {\n    \"install\": [\n      \"install -m 777 $PROJECT_OUTPUT /usr/bin/\",\n      \"install -m 777 res/images/icons/ricin.svg /usr/share/icons/hicolor/scalable/apps/\",\n      \"install -m 777 res/ricin.appdata.xml /usr/share/appdata/\"\n    ]\n  }\n}\n"
  },
  {
    "path": "res/nodes.json",
    "content": "{\"servers\": [{\"ipv6\": null, \"port\": 33445, \"region\": \"CA\", \"pubkey\": \"5918AC3C06955962A75AD7DF4F80A5D7C34F7DB9E1498D2E0495DE35B3FE8A57\", \"ipv4\": \"104.167.101.29\", \"owner\": \"noisykeyboard\"}, {\"ipv6\": \"2001:19f0:5000:8121:5054:ff:fe1c:9ded\", \"port\": 33445, \"region\": \"NL\", \"pubkey\": \"8E7D0B859922EF569298B4D261A8CCB5FEA14FB91ED412A7603A585A25698832\", \"ipv4\": \"108.61.165.198\", \"owner\": \"ray65536\"}, {\"ipv6\": \"2a02:7aa0:1619::bdbd:17b8\", \"port\": 33445, \"region\": \"SE\", \"pubkey\": \"5823FB947FF24CF83DDFAC3F3BAA18F96EA2018B16CC08429CB97FA502F40C23\", \"ipv4\": \"95.215.46.114\", \"owner\": \"Rotkaermota\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"US\", \"pubkey\": \"31910C0497D347FF160D6F3A6C0E317BAFA71E8E03BC4CBB2A185C9D4FB8B31E\", \"ipv4\": \"tox1.privacydragon.me\", \"owner\": \"PrivacyDragon\"}, {\"ipv6\": \"2a01:4f8:201:8493::2\", \"port\": 2306, \"region\": \"DE\", \"pubkey\": \"7AED21F94D82B05774F697B209628CD5A9AD17E0C073D9329076A4C28ED28147\", \"ipv4\": \"148.251.23.146\", \"owner\": \"pucetox\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"LV\", \"pubkey\": \"CF6CECA0A14A31717CC8501DA51BE27742B70746956E6676FF423A529F91ED5D\", \"ipv4\": \"80.232.246.79\", \"owner\": \"fUNKIAM\"}, {\"ipv6\": \"2001:41d0:a:1a3b::18\", \"port\": 33445, \"region\": \"FR\", \"pubkey\": \"AEC204B9A4501412D5F0BB67D9C81B5DB3EE6ADA64122D32A3E9B093D544327D\", \"ipv4\": \"51.254.84.212\", \"owner\": \"a68366\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"AF97B76392A6474AF2FD269220FDCF4127D86A42EF3A242DF53A40A268A2CD7C\", \"ipv4\": \"82.211.31.116\", \"owner\": \"Net.Verified\"}, {\"ipv6\": null, \"port\": 1337, \"region\": \"FR\", \"pubkey\": \"3651DAB570D7F60381F87B19D6935EE7F5FE01308DCE71C4B69993150C6A903C\", \"ipv4\": \"srv1.ricin.im\", \"owner\": \"Ricin.im\"}, {\"ipv6\": \"loki.uplinklabs.net\", \"port\": 33445, \"region\": \"US\", \"pubkey\": \"1A56EA3EDF5DF4C0AEABBF3C2E4E603890F87E983CAC8A0D532A335F2C6E3E1F\", \"ipv4\": \"loki.uplinklabs.net\", \"owner\": \"AbacusAvenger\"}, {\"ipv6\": \"2a04:ee00:0:9:20c:29ff:fe27:ad96\", \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"73EEBCB4CBBE56BF0E0F01881DDD88C6B250BAE92CF487BE3FBE02FD830CE200\", \"ipv4\": \"185.61.253.189\", \"owner\": \"MAXL-SPB\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"24156472041E5F220D1FA11D9DF32F7AD697D59845701CDD7BE7D1785EB9DB39\", \"ipv4\": \"185.58.206.164\", \"owner\": \"ru_maniac\"}, {\"ipv6\": \"2a00:7a60:0:746b::3\", \"port\": 33445, \"region\": \"UA\", \"pubkey\": \"DA4E4ED4B697F2E9B000EEFE3A34B554ACD3F45F5C96EAEA2516DD7FF9AF7B43\", \"ipv4\": \"185.25.116.107\", \"owner\": \"MAH69K\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"CA\", \"pubkey\": \"EDEE8F2E839A57820DE3DA4156D88350E53D4161447068A3457EE8F59F362414\", \"ipv4\": \"104.233.104.126\", \"owner\": \"wildermesser\"}, {\"ipv6\": \"2a01:d0:ffff:a8a::2\", \"port\": 33445, \"region\": \"UA\", \"pubkey\": \"FB4CE0DDEFEED45F26917053E5D24BDDA0FA0A3D83A672A9DA2375928B37023D\", \"ipv4\": \"195.93.190.6\", \"owner\": \"strngr\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"US\", \"pubkey\": \"A179B09749AC826FF01F37A9613F6B57118AE014D4196A0E1105A98F93A54702\", \"ipv4\": \"205.185.116.116\", \"owner\": \"Busindre\"}, {\"ipv6\": \"2001:6f8:1c3c:babe::14:1\", \"port\": 33445, \"region\": \"DE\", \"pubkey\": \"461FA3776EF0FA655F1A05477DF1B3B614F7D6B124F7DB1DD4FE3C08B03B640F\", \"ipv4\": \"130.133.110.14\", \"owner\": \"Manolis\"}, {\"ipv6\": \"2604:180:1:4fb::10:20:d1ac\", \"port\": 33445, \"region\": \"US\", \"pubkey\": \"A09162D68618E742FFBCA1C2C70385E6679604B2D80EA6E84AD0996A1AC8A074\", \"ipv4\": \"23.226.230.47\", \"owner\": \"stal\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"BR\", \"pubkey\": \"188E072676404ED833A4E947DC1D223DF8EFEBE5F5258573A236573688FB9761\", \"ipv4\": \"home.vikingmakt.com.br\", \"owner\": \"umgeher\"}, {\"ipv6\": \"2001:470:de00:2:20c:29ff:fe68:354f\", \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"15A0F9684E2423F9F46CFA5A50B562AE42525580D840CC50E518192BF333EE38\", \"ipv4\": \"188.244.38.183\", \"owner\": \"gem\"}, {\"ipv6\": \"2a03:b0c0:3:d0::ac:5001\", \"port\": 443, \"region\": \"DE\", \"pubkey\": \"CD133B521159541FB1D326DE9850F5E56A6C724B5B8E5EB5CD8D950408E95707\", \"ipv4\": \"46.101.197.175\", \"owner\": \"clearmartin\"}, {\"ipv6\": \"2a02:16e0:0:12::4\", \"port\": 33445, \"region\": \"GB\", \"pubkey\": \"FAAB17014F42F7F20949F61E55F66A73C230876812A9737F5F6D2DCE4D9E4207\", \"ipv4\": \"mrflibble.c4.ee\", \"owner\": \"mrflibble\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"CA\", \"pubkey\": \"6A4D0607A296838434A6A7DDF99F50EF9D60A2C510BBF31FE538A25CB6B4652F\", \"ipv4\": \"192.99.168.140\", \"owner\": \"WIeschie\"}, {\"ipv6\": \"2a03:b0c0:1:a1::15c:6001\", \"port\": 33445, \"region\": \"GB\", \"pubkey\": \"752DB3835A9FFACD44BF42B29D46292EAAE92237192938ABC5177493E1C5631B\", \"ipv4\": \"188.166.173.85\", \"owner\": \"LittleVulpix\"}, {\"ipv6\": \"2a01:4f8:191:64d6::1\", \"port\": 33445, \"region\": \"DE\", \"pubkey\": \"04119E835DF3E78BACF0F84235B300546AF8B936F035185E2A8E9E0A67C8924F\", \"ipv4\": \"144.76.60.215\", \"owner\": \"sonOfRa\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"GB\", \"pubkey\": \"0EEBE6304F4B3F6549F39A87FBB45751929F4833BA6AC5F35B6DFA79D01B4523\", \"ipv4\": \"139.162.217.110\", \"owner\": \"Kr9r0x\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"DE\", \"pubkey\": \"1C5293AEF2114717547B39DA8EA6F1E331E5E358B35F9B6B5F19317911C5F976\", \"ipv4\": \"78.47.114.252\", \"owner\": \"Deliran\"}, {\"ipv6\": \"tox.ntp.moscow\", \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"80EF8660D9C5ACE1577BAB031375A0F08284CBFD9F810A857955DCC87377FC4D\", \"ipv4\": \"tox.ntp.moscow\", \"owner\": \"abbat\"}, {\"ipv6\": \"2607:ff48:aa81:800::35eb:1\", \"port\": 33445, \"region\": \"US\", \"pubkey\": \"0FB96EEBFB1650DDB52E70CF773DDFCABE25A95CC3BB50FC251082E4B63EF82A\", \"ipv4\": \"104.223.122.15\", \"owner\": \"ru_maniac\"}, {\"ipv6\": \"2a03:b0c0:2:d0::16:1\", \"port\": 33445, \"region\": \"NL\", \"pubkey\": \"788236D34978D1D5BD822F0A5BEBD2C53C64CC31CD3149350EE27D4D9A2F9B6B\", \"ipv4\": \"178.62.250.138\", \"owner\": \"Impyy\"}, {\"ipv6\": \"2400:6180:0:d0::17a:a001\", \"port\": 33445, \"region\": \"SG\", \"pubkey\": \"B05C8869DBB4EDDD308F43C1A974A20A725A36EACCA123862FDE9945BF9D3E09\", \"ipv4\": \"128.199.199.197\", \"owner\": \"wiiaam\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"DE\", \"pubkey\": \"F5A1A38EFB6BD3C2C8AF8B10D85F0F89E931704D349F1D0720C3C4059AF2440A\", \"ipv4\": \"46.38.239.179\", \"owner\": \"Martin Schr\\u00f6der\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"FR\", \"pubkey\": \"2D320F971EF2CA18004416C2AAE7BA52BF7949DB34EA8E2E21AF67BD367BE211\", \"ipv4\": \"5.135.59.163\", \"owner\": \"Skey\"}, {\"ipv6\": \"2001:41d0:1:757c::1\", \"port\": 33445, \"region\": \"FR\", \"pubkey\": \"4E3F7D37295664BBD0741B6DBCB6431D6CD77FC4105338C2FC31567BF5C8224A\", \"ipv4\": \"91.121.66.124\", \"owner\": \"h4nt3r\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"ES\", \"pubkey\": \"C3F6C06A624FAE086DA94604A7838DB495769807EC055FADA36EBF2D4484FB33\", \"ipv4\": \"87.98.168.93\", \"owner\": \"_kinka_\"}, {\"ipv6\": \"sorunome.de\", \"port\": 33445, \"region\": \"DE\", \"pubkey\": \"02807CF4F8BB8FB390CC3794BDF1E8449E9A8392C5D3F2200019DA9F1E812E46\", \"ipv4\": \"sorunome.de\", \"owner\": \"Sorunome\"}, {\"ipv6\": \"2a02:7aa0:1619::c6fe:d0cb\", \"port\": 33445, \"region\": \"SE\", \"pubkey\": \"672DBE27B4ADB9D5FB105A6BB648B2F8FDB89B3323486A7A21968316E012023C\", \"ipv4\": \"95.215.44.78\", \"owner\": \"HooinKyoma\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"9CA69BB74DE7C056D1CC6B16AB8A0A38725C0349D187D8996766958584D39340\", \"ipv4\": \"95.31.20.151\", \"owner\": \"Igor Novgorodov\"}, {\"ipv6\": \"2a00:d880:3:2::8bdc:f19\", \"port\": 33445, \"region\": \"NL\", \"pubkey\": \"9E7BD4793FFECA7F32238FA2361040C09025ED3333744483CA6F3039BFF0211E\", \"ipv4\": \"81.4.110.149\", \"owner\": \"tibietigni\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"AU\", \"pubkey\": \"5C4C7A60183D668E5BD8B3780D1288203E2F1BAE4EEF03278019E21F86174C1D\", \"ipv4\": \"103.230.156.174\", \"owner\": \"AssPirate\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"RU\", \"pubkey\": \"5625A62618CB4FCA70E147A71B29695F38CC65FF0CBD68AD46254585BE564802\", \"ipv4\": \"92.54.84.70\", \"owner\": \"t3mp\"}, {\"ipv6\": \"2605:6400:1:fed5:22:45af:ec10:f329\", \"port\": 33445, \"region\": \"US\", \"pubkey\": \"1D5A5F2F5D6233058BF0259B09622FB40B482E4FA0931EB8FD3AB8E7BF7DAF6F\", \"ipv4\": \"198.98.51.198\", \"owner\": \"Busindre\"}, {\"ipv6\": null, \"port\": 1813, \"region\": \"RU\", \"pubkey\": \"53737F6D47FA6BD2808F378E339AF45BF86F39B64E79D6D491C53A1D522E7039\", \"ipv4\": \"d4rk4.ru\", \"owner\": \"D4rk4\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"NL\", \"pubkey\": \"5521952892FBD5C185DF7180DB4DEF69D7844DEEE79B1F75A634ED9DF656756E\", \"ipv4\": \"zawertun.net\", \"owner\": \"ZaWertun\"}, {\"ipv6\": \"2a02:c200:1:10:3:1:605:1337\", \"port\": 5190, \"region\": \"DE\", \"pubkey\": \"2B2137E094F743AC8BD44652C55F41DFACC502F125E99E4FE24D40537489E32F\", \"ipv4\": \"5.189.176.217\", \"owner\": \"tastytea\"}, {\"ipv6\": \"2001:470:70d6::1\", \"port\": 33445, \"region\": \"AM\", \"pubkey\": \"2B9CD794424FD579044EC2FC5252B23DF8B4AAF239C25074F70B1090C3F8C83A\", \"ipv4\": \"109.75.40.105\", \"owner\": \"nek\"}, {\"ipv6\": \"2a06:8ec0:1:bb::3862\", \"port\": 33445, \"region\": \"GB\", \"pubkey\": \"728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854\", \"ipv4\": \"185.120.34.64\", \"owner\": \"Kostik\"}, {\"ipv6\": \"2001:1470:fbfe::109\", \"port\": 33445, \"region\": \"SI\", \"pubkey\": \"3CEE1F054081E7A011234883BC4FC39F661A55B73637A5AC293DDF1251D9432B\", \"ipv4\": \"194.249.212.109\", \"owner\": \"fluke571\"}, {\"ipv6\": null, \"port\": 33445, \"region\": \"US\", \"pubkey\": \"F404ABAA1C99A9D37D61AB54898F56793E1DEF8BD46B1038B9D822E8460FAB67\", \"ipv4\": \"biribiri.org\", \"owner\": \"nurupo\"}, {\"ipv6\": \"toxnode.nek0.net\", \"port\": 33445, \"region\": \"UA\", \"pubkey\": \"20965721D32CE50C3E837DD75B33908B33037E6225110BFF209277AEAF3F9639\", \"ipv4\": \"toxnode.nek0.net\", \"owner\": \"Phsm\"}, {\"ipv6\": \"2001:bc8:3698:101::1\", \"port\": 33445, \"region\": \"FR\", \"pubkey\": \"E398A69646B8CEACA9F0B84F553726C1C49270558C57DF5F3C368F05A7D71354\", \"ipv4\": \"195.154.119.113\", \"owner\": \"Munrek\"}]}"
  },
  {
    "path": "res/ricin.appdata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Copyright 2016 SkyzohKey <skyzohkey@framasphere.org> -->\n<component type=\"desktop\">\n <id>ricin.desktop</id>\n <metadata_license>CC-BY-SA-3.0</metadata_license>\n <project_license>GPL-3.0</project_license>\n <name>Ricin</name>\n <summary>Dead simple, privacy oriented, instant messaging app!</summary>\n <description>\n  <p>\n   Ricin aims to be a modern way to securely communicate with people that matter to you.\n  </p>\n  <p>\n    Whether it's corporations or governments, digital surveillance today is widespread.\n  </p>\n  <p>\n    Ricin Messenger is easy-to-use software that connects you with your friends and your\n    family without anyone else listening in. While other big-name services require you\n    to pay for features, Ricin Messenger is completely free and comes without advertising\n     — forever. \n  </p>\n  <p>Features:</p>\n  <ul>\n    <li>Instant Messaging: Chat instantly across the globe with Ricin's secure messages.</li>\n    <li>Voice: Keep in touch with friends and family using Ricin's completely free and encrypted voice calls.</li>\n    <li>Video: Catch up face to face, over Ricin's secure video calls.</li>\n    <li>Screen sharing: Stream your desktop with your friends with Ricin's secure screen sharing.</li>\n    <li>File transfers: Trade files, with no artificial limits or caps and enhanced security.</li>\n    <li>Group chats: Chat, call, and share video and files with the whole gang in Ricin's group chats.</li>\n  </ul>\n  <p>\n    Ricin is developed with users privacy in mind, we wants you to be safe while chatting!\n  </p>\n  <ul>\n    <li>ENCRYPTED: Everything you do with Ricin Messenger is encrypted using open-source libraries. The only people who can see your conversations are the people you're talking with.</li>\n    <li>DISTRIBUTED: Ricin has no central servers that can be raided, shut down, or forced to turn over data — the network is made up of its users. Say goodbye to server outages!</li>\n    <li>FREE: Ricin is free software. That's free as in freedom, as well as in price. This means Ricin is yours — to use, modify, and share — because Ricin is developed by and for the users.</li>\n  </ul>\n </description>\n <screenshots>\n  <screenshot type=\"default\">\n   <image>https://cdn.ricin.im/images/ricin_01.png</image>\n   <caption>A redacted screen of an ongoing conversation on Ricin.</caption>\n  </screenshot>\n  <screenshot>\n   <image>https://cdn.ricin.im/images/ricin_02.png</image>\n   <caption>A redacted screen of an ongoing conversation on Ricin, using the clear theme.</caption>\n  </screenshot>\n  <screenshot>\n    <image>https://framasphere.org/camo/a4916d8a8b87174a1f4e073490a4d684348d88df/687474703a2f2f692e696d6775722e636f6d2f617046756b32442e706e67</image>\n    <caption>A screenshot of Ricin with The Tox Theme.</caption>\n </screenshots>\n <url type=\"homepage\">https://ricin.im</url>\n <update_contact>skyzohkey@protonmail.com</update_contact>\n <project_group>RicinApp</project_group>\n</component>\n"
  },
  {
    "path": "res/ricin.desktop.in",
    "content": "[Desktop Entry]\nName=Ricin\nComment=A dead-simple but powerful Tox client.\nCategories=Network;InstantMessaging;P2P;\nEncoding=UTF-8\nExec=Ricin\nIcon=ricin.svg\nType=Application\nTerminal=false\nX-UserData=$CONFIG/ricin;\nMimeType=x-scheme-handler/tox;\n"
  },
  {
    "path": "res/ricin.gresource.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gresources>\n    <gresource prefix=\"/chat/tox/ricin\">\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/main-window.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/profile-chooser-window.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/friend-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/file-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/info-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/status-message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/system-message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/inline-image-message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/inline-file-message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/quote-message-list-row.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/quote-label.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/password-dialog.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/plain-label.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/chat-view.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/settings-view.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/welcome-view.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/group-chat-view.ui</file>\n        <file preprocess=\"xml-stripblanks\" compressed=\"true\">ui/group-list-row.ui</file>\n        <!-- Gtk+ 3.1x Themes -->\n        <file compressed=\"true\">themes/gtk-3.1x/styles.css</file>\n        <file compressed=\"true\">themes/gtk-3.1x/app.css</file>\n        <file compressed=\"true\">themes/gtk-3.1x/tox.css</file>\n        <file compressed=\"true\">themes/gtk-3.1x/dark.css</file>\n        <file compressed=\"true\">themes/gtk-3.1x/reset.css</file>\n        <file compressed=\"true\">themes/gtk-3.1x/white.css</file>\n        <!-- Gtk+ 3.2x Themes -->\n        <file compressed=\"true\">themes/gtk-3.2x/styles.css</file>\n        <file compressed=\"true\">themes/gtk-3.2x/app.css</file>\n        <file compressed=\"true\">themes/gtk-3.2x/tox.css</file>\n        <file compressed=\"true\">themes/gtk-3.2x/dark.css</file>\n        <file compressed=\"true\">themes/gtk-3.2x/reset.css</file>\n        <file compressed=\"true\">themes/gtk-3.2x/white.css</file>\n\n        <file compressed=\"true\">nodes.json</file>\n        <file compressed=\"true\">ricin.sample.json</file>\n\n        <file>images/noavatar.gif</file>\n\n        <file>images/icons/ricin.svg</file>\n        <file>images/icons/ricin_logo.png</file>\n\n        <file>images/status/busy.png</file>\n        <file>images/status/busy_notification.png</file>\n        <file>images/status/idle.png</file>\n        <file>images/status/idle_notification.png</file>\n        <file>images/status/online.png</file>\n        <file>images/status/online_notification.png</file>\n        <file>images/status/offline.png</file>\n        <file>images/status/offline_notification.png</file>\n        <file>images/status/invisible.png</file>\n    </gresource>\n</gresources>\n"
  },
  {
    "path": "res/ricin.sample.json",
    "content": "{\n  \"has-toxme\": false,\n  \"toxme-id\": \"\",\n  \"toxme-server\": \"\",\n  \"toxme-biography\": \"\",\n  \"toxme-password\": \"\",\n  \"last-profile\": \"\",\n  \"network-udp\": true,\n  \"network-ipv6\": true,\n  \"enable-proxy\": false,\n  \"proxy-host\": \"127.0.0.1\",\n  \"proxy-port\": 9050,\n  \"enable-custom-themes\": true,\n  \"selected-theme\": \"dark\",\n  \"selected-language\": \"en_US\",\n  \"show-status-changes\": true,\n  \"show-all-friends\": false,\n  \"show-unread-messages-notice\": false,\n  \"show-typing-status\": true,\n  \"send-typing-status\": true,\n  \"contactlist-width\": 265,\n  \"enable-tray\": true,\n  \"enable-notify\": true,\n  \"enable-notify-sounds\": true,\n  \"default-save-path\": \"\",\n  \"compact-mode\": false\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/app.css",
    "content": "/**\n* NOTE: This file isn't a file theme, it's a base theme.\n*       To make a theme please create a new file and copy the default file then\n*       do want u want. :)\n**/\n\n/** GTK reset **/\n@import url(\"reset.css\");\n\nGtkEntry,\nGtkEntry:focus,\nGtkComboBox,\nGtkComboBoxText,\nGtkButton,\nGtkToggleButton,\nGtkImage,\nGtkSwitch\n{\n\tborder: none;\n\tborder-width: 0;\n\tborder-image: none;\n\tborder-style: none;\n\tborder-radius: 0;\n\n\tbox-shadow: none;\n\ttext-shadow: none;\n}\n\nGtkSwitch {\n  font-weight: bolder;\n  font-size: small;\n  color: #fff;\n  text-shadow: 0 1px rgba(0, 0, 0, 0.5);\n\tborder-radius: 2px;\n}\n\nGtkSwitch.trough {\n  background: #E74C3C;\n}\n\nGtkSwitch.trough:active {\n  background: #2ECC71;\n}\n\nGtkSwitch.trough:backdrop {\n  background: #E74C3C;\n}\n\nGtkSwitch.trough:active:backdrop {\n  background: #2ECC71;\n}\n\nGtkSwitch.trough:insensitive {\n  background-image: none;\n  background: @ui_darker;\n}\n\nGtkSwitch.trough:insensitive:backdrop {\n  background: @ui_darker;\n}\n\nGtkSwitch.slider:insensitive {\n  background-image: none;\n  box-shadow: none;\n  background: @ui_dark;\n}\n\nGtkSwitch.slider {\n  background: #C0392B;\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0px;\n  border-bottom-left-radius: 2px;\n  border-bottom-right-radius: 0px;\n}\n\nGtkSwitch.slider:active {\n  background-color: #27AE60;\n  border-top-left-radius: 0px;\n  border-top-right-radius: 2px;\n  border-bottom-left-radius: 0px;\n  border-bottom-right-radius: 2px;\n}\n\nGtkScrollbar {\n  background: transparent;\n  border: none;\n}\n\nGtkScrollbar.slider {\n  background: @ui_darker;\n}\n\nGtkTreeMenu,\nGtkMenu {\n  background: @ui_darker;\n  border: none;\n  border-width: 0;\n  border-image: none;\n  border-image-width: 0;\n  border-style: none;\n  border-radius: 0;\n\n  box-shadow: none;\n  text-shadow: none;\n  padding: 0;\n}\n\nGtkMenu GtkMenuItem {\n  color: @ui_text;\n}\n\nGtkMenu GtkMenuItem:hover {\n  background: @ui_main;\n  color: @ui_text;\n  border: none;\n  border-image: none;\n}\n\nGtkNotebook .tab GtkLabel {\n  color: @ui_text;\n}\n\nGtkPopover {\n\tbackground: @ui_darker;\n\tborder-radius: 0;\n\tbox-shadow: none;\n\tborder: none;\n}\nGtkPopover GtkButton {\n\tcolor: @ui_text;\n}\nGtkPopover GtkButton:hover {\n\tbackground: @ui_main;\n\tcolor: @ui_text;\n}\nGtkPopover GtkSeparator.user-infos {\n\tcolor: @ui_darker;\n}\n\n/** CSS overrides. **/\n.quote-bar {\n  color: #2ECC71;\n  padding: 0 1px;\n}\n\nRicinProfileChooser {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\nRicinProfileChooser .notebook {\n  background-color: @ui_darker;\n}\n\nRicinProfileChooser .notebook GtkBox.vertical {\n  background-color: @ui_main;\n}\n\nRicinProfileChooser .notebook .button {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nRicinProfileChooser .notebook .button:hover {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  background-image: none;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\nRicinProfileChooser .notebook .entry {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nRicinProfileChooser .notebook .entry:hover {\n  background-color: @ui_main;\n}\n\n.ricin-navigation {\n  background-color: @ui_dark;\n}\n\nGtkStack,\nGtkNotebook,\nRicinSettingsView {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n\n  color: @ui_text;\n}\n\nRicinSettingsView {\n  background-color: @ui_darker;\n}\n\n.settings {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nGtkBox,\nGtkRevealer\nGtkPaned,\nGtkViewport,\nGtkListBox,\nRicinFriendListRow,\nRicinMainWindow,\nGtkScrolledWindow {\n  background-image: initial;\n\tbackground-color: transparent;\n\tbackground: none;\n  border-image: none;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n}\n\n.box-search {\n  background-color: @ui_darker;\n}\n.box-search GtkSearchEntry {\n\tbackground-color: transparent;\n\tbackground-image: none;\n\tborder: none;\n\tborder-image: none;\n\tborder-radius: 0;\n\tcolor: @ui_text;\n}\n\n.box-search GtkToggleButton {\n\tbackground-color: transparent;\n\tbackground-image: none;\n\tborder: none;\n\tborder-image: none;\n\tborder-radius: 0;\n\tcolor: @ui_text;\n}\n\n.secondary-background {\n  background-color: @ui_main;\n}\n\n.secondary-background GtkEntry,\n.secondary-background GtkButton {\n  border-image: none;\n  background-image: none;\n  background-color: @ui_dark;\n}\n\n.secondary-background GtkEntry:hover,\n.secondary-background GtkEntry:active,\n.secondary-background GtkButton:hover {\n  border-image: none;\n  border-radius: 0;\n  background-image: none;\n  background-color: @ui_darker;\n}\n\n.secondary-background .notebook {\n  background-color: @ui_darker;\n}\n\n.secondary-background .notebook GtkBox,\n.secondary-background .notebook GtkGrid {\n    padding: 0 50px;\n}\n\n.secondary-background .notebook GtkButton {\n    background-color: @ui_darker;\n    background-image: none;\n    border: none;\n    border-image: none;\n    padding: 40px 0;\n    color: @ui_text;\n    /*margin: 5px 10px;*/\n}\n\n.secondary-background .notebook .button GtkLabel {\n    background-color: transparent;\n    background: transparent;\n    background-image: none;\n}\n\n.secondary-background .notebook .button {\n    border: none;\n    border-width: 0;\n    border-image: none;\n}\n\n.secondary-background .notebook .button:hover,\n.secondary-background .notebook .button:prelight {\n    transition: 150ms ease-in-out;\n    background-image: none;\n    background: @main_ddark_hover;\n    background-color: @main_ddark_hover;\n}\n\n.secondary-background .notebook .entry {\n    background: @main_dark;\n    color: @main_blue;\n}\n\n.secondary-background .notebook GtkLabel {\n    color: @text_color;\n    background-color: @gtk_box;\n}\n\n.secondary-background .notebook {\n    border-radius: 0;\n\n    background-color: @ui_main;\n\n    -GtkNotebook-tab-overlap: 3;\n    -GtkNotebook-tab-curvature: 2;\n}\n\n.notebook-buttons,\n.notebook-buttons GtkButton {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\n.notebook-buttons GtkButton:hover {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.friend-infos {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n.user-infos {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\n.ricin-navigation .user-infos GtkEntry {\n  background-color: @ui_darker;\n}\n.ricin-navigation .user-infos GtkEntry:hover,\n.ricin-navigation .user-infos GtkEntry:active {\n  background-color: @ui_main;\n}\n\n.button-dark {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n.button-dark:hover {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  background-image: none;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.button-text-fix {\n  color: @ui_text;\n}\n.button-inverted:hover {\n  background-color: @ui_main;\n}\n\n.entry-inverted {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n.entry-inverted:hover {\n  background-color: @ui_main;\n}\n\n.friendlist {\n  background-color: @ui_dark;\n  color: @ui_text;\n  border-image: none;\n  border: none;\n}\n\n.friendlist-notify {\n  background-color: #1565c4;\n}\n\n.friendlist-notify GtkButton,\n.friendlist-notify .close-button {\n  border-radius: 360px;\n  background-color: white;\n  color: #1565c4;\n}\n.friendlist-notify GtkButton,\n.friendlist-notify .close-button:hover {\n  border-radius: 360px;\n  background-color: rgb(205, 209, 204);\n  color: rgb(135, 135, 135);\n}\n\n.message-list {\n  outline-width: 0;\n}\n\n.message-list GtkLabel {\n  color: @ui_text;\n}\n.message-list GtkLabel:link {\n\tcolor: @ui_system_color;\n}\n\n.entry-principal {\n\tbackground-image: none;\n\tborder-image: none;\n\n\tbackground-color: @ui_darker;\n\tborder: none;\n\tborder-radius: 0;\n\n  color: @ui_text;\n}\n\n.entry-chat {\n\tborder: none;\n\tborder-radius: 0;\n \tbackground-image: none;\n\tborder-image: none;\n \tbox-shadow: none;\n \toutline-width: 0;\n\tbackground-color: @ui_darker;\n \tcolor: @ui_text;\n}\n\n.friendlist-row {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.friendlist-row:active,\n.friendlist-row:selected {\n  background-color: @ui_main;\n  color: @ui_text;\n}\n\n.ricin-content {\n  background-color: @ui_main;\n}\n\n.ricin-content .message-list {\n  background-color: transparent;\n}\n\n.ricin-content .message-list .message {\n  background-color: transparent;\n}\n\n.image-desc {\n  background-color: @ui_darker;\n  color: white;\n  padding: 5px 5px 5px 5px;\n}\n\n.btn-save-image {\n  background-image: none;\n  border: none;\n  border-radius: 0;\n\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\n.btn-save-image:hover, .btn-save-image:insensitive {\n  background-image: none;\n  border: none;\n  border-radius: 0;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.progress-bg {\n  background-color: #2ecc71;\n}\n.progress-bg GtkLabel {\n  color: black;\n}\n.progress-fg {\n  background-color: #27ae60;\n}\n\n/**\n* CANCELED FILE\n**/\n\n.canceled-file {\n  background-color: #c0392b;\n  color: white;\n}\n\n.canceled-file .label_file_name {\n  color: white;\n}\n\n.canceled-file .btn-save-image,\n.canceled-file .btn-save-image :insensitive {\n  background-color: #e74c3c;\n}\n\n/**\n* SAVED FILE\n**/\n\n.saved-file {\n  background-color: #27ae60;\n  color: white;\n}\n\n.saved-file .label_file_name {\n  color: white;\n}\n\n.saved-file .btn-save-image,\n.saved-file .btn-save-image:insensitive {\n  background-color: #2ecc71;\n  color: white;\n}\n\n/** Faux offline message **/\n.chatview-notify-bar {\n  background-color: #3498DB;\n}\n.chatview-notify-bar GtkButton:hover {\n  background-color: #2980B9;\n}\n\n/** Friend request widget **/\n.friend-request {\n  background-color: #2c9f42;\n  color: @ui_text;\n}\n.friend-request GtkButton { background-color: #2c9f42; }\n.friend-request GtkButton:hover {\n  background-color: #237f35;\n  color: @ui_text;\n}\n\n/** Unread messages widget. **/\n.unread-messages GtkBox {\n  background-color: @ui_greener;\n  color: @ui_text;\n}\n.unread-messages GtkButton {\n  background-color: @ui_green;\n  color: @ui_text;\n}\n\n/** SELECTION COLOR **/\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n:selected:not(.friendlist-row),\n.entry:selected {\n  color: #ffffff;\n  background-color: @selected_text_color;\n  outline: none;\n}\n.message-list .activatable {\n  outline: none;\n}\n.message-list .info-message {\n\tcolor: @ui_system_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/dark.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #303030;\n@define-color main_blue #2283d7;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #171717;\n@define-color ui_dark   #222222;\n@define-color ui_main   #333333;\n@define-color ui_text   #FFFFFF;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n\n@define-color plain_color @ui_text;\n@define-color quote_color @ui_green;\n\n@import url(\"app.css\");\n\nRicinQuoteMessageListRow GtkListBox RicinPlainLabel {\n  border-left: 5px solid @plain_color;\n  padding: 0 10px 0 5px;\n}\nRicinQuoteMessageListRow GtkListBox RicinQuoteLabel {\n  border-left: 5px solid @quote_color;\n  padding: 0 7px 0 5px;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/reset.css",
    "content": "/* @import this colorsheet to get the default values for every property.\n * This is useful when writing special CSS tests that should not be\n * inluenced by themes - not even the default ones.\n * Keep in mind that the output will be very ugly and not look like\n * anything GTK.\n * Also, when adding new style properties, please add them here.\n */\n/*\n* {\n  color: inherit;\n  font-size: inherit;\n  background-color: initial;\n  font-family: inherit;\n  font-style: inherit;\n  font-variant: inherit;\n  font-weight: inherit;\n  text-shadow: inherit;\n  icon-shadow: inherit;\n  box-shadow: initial;\n  margin-top: initial;\n  margin-left: initial;\n  margin-bottom: initial;\n  margin-right: initial;\n  padding-top: initial;\n  padding-left: initial;\n  padding-bottom: initial;\n  padding-right: initial;\n  border-top-style: initial;\n  border-top-width: initial;\n  border-left-style: initial;\n  border-left-width: initial;\n  border-bottom-style: initial;\n  border-bottom-width: initial;\n  border-right-style: initial;\n  border-right-width: initial;\n  border-top-left-radius: initial;\n  border-top-right-radius: initial;\n  border-bottom-right-radius: initial;\n  border-bottom-left-radius: initial;\n  outline-style: initial;\n  outline-width: initial;\n  outline-offset: initial;\n  background-clip: initial;\n  background-origin: initial;\n  background-size: initial;\n  background-position: initial;\n  border-top-color: initial;\n  border-right-color: initial;\n  border-bottom-color: initial;\n  border-left-color: initial;\n  outline-color:  initial;\n  background-repeat: initial;\n  background-image: initial;\n  border-image-source: initial;\n  border-image-repeat: initial;\n  border-image-slice: initial;\n  border-image-width: initial;\n  transition-property: initial;\n  transition-duration: initial;\n  transition-timing-function: initial;\n  transition-delay: initial;\n  engine: initial;\n  gtk-key-bindings: initial;\n\n  -GtkWidget-focus-line-width: 0;\n  -GtkWidget-focus-padding: 0;\n  -GtkNotebook-initial-gap: 0;\n  -GtkPaned-handle-size: 0;\n}\n*/\n\n* {\n  -GtkPaned-handle-size: 0;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/styles.css",
    "content": "@define-color blue_primary #2a92c6;\n@define-color green_primary #2ECC71;\n@define-color white_primary #FFFFFF;\n@define-color orange_primary #e67e22;\n\n@define-color badge_color @blue_primary;\n@define-color badge_color_important @orange_primary;\n@define-color links_color @blue_primary;\n@define-color quote_border @green_primary;\n@define-color plain_border @white_primary;\n@define-color selected_color @blue_primary;\n@define-color info_message_color @blue_primary;\n@define-color status_info_color @blue_primary;\n\n.badge {\n  background-color: @badge_color;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n.badge-important {\n  background: @badge_color_important;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n\n*:link {\n  color: @link_color;\n}\n\n.box-search GtkSearchEntry,\n.box-search GtkToggleButton {\n  border-radius: 0;\n}\n\n.quotes-listbox {\n  background: none;\n  background-image: none;\n}\n.quote-container {\n  border-left: 4px solid @quote_border;\n}\n.plain-container {\n  border-left: 4px solid @plain_border;\n}\n\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n:selected:not(.friendlist-row),\n.entry:selected {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n.message-list .activatable {\n  outline: none;\n}\n\n.info-message {\n  color: @info_message_color;\n}\n.status-info-message {\n  color: @status_info_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/tox.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #949494;\n@define-color main_blue #2283d7;\n@define-color blue_primary #2a92c6;\n@define-color green_primary #2ECC71;\n@define-color white_primary #FFFFFF;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #171717;\n@define-color ui_dark   #222222;\n@define-color ui_main   #333333;\n@define-color ui_text   #FFFFFF;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n@define-color selected_color @blue_primary;\n\n/** Non standard Ricin colors names, only used for this theme. */\n@define-color quote_background #444444;\n@define-color quote_text @ui_text;\n@define-color quote_plain_color @main_grey;\n@define-color swatch_principal @ui_green;\n@define-color swatch_gray #E0E0E0;\n@define-color swatch_gray_disabled #acacac;\n@define-color swatch_gray_border #ABB;\n@define-color swatch_orange #e67e22;\n\n@import url(\"app.css\");\n\n.badge {\n  background-color: @swatch_principal;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n.badge-important {\n  background: @swatch_orange;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n\n#chatview-header,\n#settings-header {\n  background-color: @white_primary;\n  color: @ui_main;\n  border-bottom: 1px solid @swatch_gray;\n}\n#chatview-header .button,\n#settings-header .button {\n  background-color: @white_primary;\n  color: @swatch_principal;\n  border-bottom: 1px solid @swatch_gray;\n}\n#chatview-header,\n#chatview-header .button {\n  border-bottom: 1px solid @swatch_gray_border;\n}\n\n#chatview-invite-peers {\n  background-color: @white_primary;\n  color: @ui_main;\n  border-bottom: 1px solid @swatch_gray;\n}\n\n#chatview-invite-peers GtkEntry,\n#chatview-invite-peers GtkButton {\n  background: @swatch_gray;\n  border: 1px solid @swatch_gray_border;\n  color: black;\n}\n\n#chatview-invite-peers GtkEntry:focus {\n  background: @white_primary;\n  border: 1px solid @swatch_principal;\n}\n#chatview-invite-peers GtkEntry:selected {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n\n#chatview-invite-peers GtkButton:hover {\n  background: @swatch_principal;\n  border: 1px solid @swatch_principal;\n  color: @white_primary;\n}\n\n#chatview-content,\n#chatview-content RicinMessageListRow,\n#settings-content GtkScrolledWindow  {\n  background-color: @white_primary;\n  color: black;\n}\n#chatview-content .label:selected,\n#chatview-input .entry:selected,\n#settings-content .entry:selected {\n  background-color: @swatch_principal;\n  color: white;\n}\n\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n.message-list .activatable:selected #timestamp,\n.message-list .activatable:selected #username {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n\n.message-list .activatable *,\n.message-list .activatable,\n.message-list * #timestamp,\n.message-list * #username {\n  color: black;\n}\n.quote-container {\n  border-left: 5px solid @swatch_principal;\n}\n.plain-container {\n  border-left: 5px solid @ui_main;\n}\n.message {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n#chatview-input .entry {\n  color: @ui_main;\n  padding: 8px 8px;\n}\n#chatview-input * {\n  background-color: @swatch_gray;\n  color: @ui_main;\n}\n#chatview-input .button * {\n  background: none;\n}\n#chatview-input .button,\n#chatview-input .entry {\n  border-right: 1px solid @swatch_gray_border;\n  border-top: 1px solid @swatch_gray_border;\n}\n#chatview-input .button:last-child {\n  border-right: none;\n}\n#chatview-input .button GtkImage {\n  background: none;\n}\n#chatview-input .button:hover {\n  border-top: 1px solid @ui_darker;\n  background-color: @ui_darker;\n  color: @white_primary;\n}\n#chatview-input .button:hover GtkImage {\n  color: @white_primary;\n}\n#chatview-input .entry:selected {\n  background-color: @selected_color;\n  color: @white_primary;\n}\n\n#chatview-profile {\n  background-color: #F0F0F0;\n  border-left: 1px solid @swatch_gray_border;\n  color: black;\n}\n\n#chatview-profile .button,\n#settings-content .button,\n#settings-content .entry {\n  background-color: @swatch_gray;\n  border: 1px solid @swatch_gray_border;\n  color: @ui_darker;\n}\n\n#chatview-profile .button:hover,\n#chatview-header .button:hover,\n#settings-header .button:hover,\n#settings-content .button:hover {\n  background-color: @swatch_principal;\n  color: @white_primary;\n}\n\nRicinSettingsView,\nRicinSettingsView .secondary-background {\n  background: @white_primary;\n}\n#settings-header .button {\n  border-right: 1px solid @swatch_gray;\n}\n#settings-header .button:last-child {\n  border-right: none;\n}\n\n.friendlist-row:selected {\n  background-color: @white_primary;\n  color: @ui_main;\n}\n\n.box-search {\n  background-color: @ui_main;\n  border-bottom: 1px solid @ui_darker;  \n}\n.box-search .entry {\n  border-right: 1px solid @ui_dark;\n}\n\n#friendlist-footer .button {\n  border-top: 1px solid #101010;\n  border-right: 1px solid #101010;\n}\n\n#add-friend-box {\n  border-top: 1px solid #101010;\n}\n#add-friend-box .button,\n#add-friend-box .entry,\n#add-friend-box GtkTextView {\n  border: 1px solid #101010;\n  background-color: @ui_dark;\n}\n#add-friend-box .entry:focus {\n  border: 1px solid @swatch_principal;\n}\n#add-friend-box .button:hover {\n  background-color: @swatch_principal;\n}\n#add-friend-box *:selected {\n  background-color: @selected_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.1x/white.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #303030;\n@define-color main_blue #2283d7;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #E0E0E0;\n@define-color ui_dark   #F0F0F0;\n@define-color ui_main   #FFFFFF;\n@define-color ui_text   #000000;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n\n@define-color plain_color @ui_text;\n@define-color quote_color @ui_green;\n\n@import url(\"app.css\");\n\nRicinSettingsView GtkComboBoxText,\nRicinSettingsView GtkEntry,\nRicinSettingsView GtkButton {\n  color: @ui_text;\n}\n\nRicinQuoteMessageListRow GtkListBox RicinPlainLabel {\n  border-left: 5px solid @plain_color;\n  padding: 0 10px 0 5px;\n}\nRicinQuoteMessageListRow GtkListBox RicinQuoteLabel {\n  border-left: 5px solid @quote_color;\n  padding: 0 7px 0 5px;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/app.css",
    "content": "/**\n* NOTE: This file isn't a file theme, it's a base theme.\n*       To make a theme please create a new file and copy the default file then\n*       do want u want. :)\n**/\n\n/** GTK reset **/\n@import url(\"reset.css\");\n\nentry,\nentry:focus,\ncombobox,\ncombobox,\nbutton,\nbutton.toggle,\nimage,\nswitch\n{\n\tborder: none;\n\tborder-width: 0;\n\tborder-image: none;\n\tborder-style: none;\n\tborder-radius: 0;\n\n\tbox-shadow: none;\n\ttext-shadow: none;\n}\n\nswitch {\n  font-weight: bolder;\n  font-size: small;\n  color: #fff;\n  text-shadow: 0 1px rgba(0, 0, 0, 0.5);\n\tborder-radius: 2px;\n}\n\nswitch.trough {\n  background: #E74C3C;\n}\n\nswitch.trough:active {\n  background: #2ECC71;\n}\n\nswitch.trough:backdrop {\n  background: #E74C3C;\n}\n\nswitch.trough:active:backdrop {\n  background: #2ECC71;\n}\n\nswitch.trough:disabled {\n  background-image: none;\n  background: @ui_darker;\n}\n\nswitch.trough:disabled:backdrop {\n  background: @ui_darker;\n}\n\nswitch.slider:disabled {\n  background-image: none;\n  box-shadow: none;\n  background: @ui_dark;\n}\n\nswitch.slider {\n  background: #C0392B;\n  border-top-left-radius: 2px;\n  border-top-right-radius: 0px;\n  border-bottom-left-radius: 2px;\n  border-bottom-right-radius: 0px;\n}\n\nswitch.slider:active {\n  background-color: #27AE60;\n  border-top-left-radius: 0px;\n  border-top-right-radius: 2px;\n  border-bottom-left-radius: 0px;\n  border-bottom-right-radius: 2px;\n}\n\nscrollbar {\n  background: transparent;\n  border: none;\n}\n\nscrollbar.slider {\n  background: @ui_darker;\n}\n\nGtkTreeMenu,\nmenu {\n  background: @ui_darker;\n  border: none;\n  border-width: 0;\n  border-image: none;\n  border-image-width: 0;\n  border-style: none;\n  border-radius: 0;\n\n  box-shadow: none;\n  text-shadow: none;\n  padding: 0;\n}\n\nmenu menuItem {\n  color: @ui_text;\n}\n\nmenu menuItem:hover {\n  background: @ui_main;\n  color: @ui_text;\n  border: none;\n  border-image: none;\n}\n\nnotebook .tab label {\n  color: @ui_text;\n}\n\npopover {\n\tbackground: @ui_darker;\n\tborder-radius: 0;\n\tbox-shadow: none;\n\tborder: none;\n}\npopover button {\n\tcolor: @ui_text;\n}\npopover button:hover {\n\tbackground: @ui_main;\n\tcolor: @ui_text;\n}\npopover separator.user-infos {\n\tcolor: @ui_darker;\n}\n\n/** CSS overrides. **/\n.quote-bar {\n  color: #2ECC71;\n  padding: 0 1px;\n}\n\nRicinProfileChooser {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\nRicinProfileChooser notebook {\n  background-color: @ui_darker;\n}\n\nRicinProfileChooser notebook box.vertical {\n  background-color: @ui_main;\n}\n\nRicinProfileChooser notebook button {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nRicinProfileChooser notebook button:hover {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  background-image: none;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\nRicinProfileChooser notebook entry {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nRicinProfileChooser notebook entry:hover {\n  background-color: @ui_main;\n}\n\n.ricin-navigation {\n  background-color: @ui_dark;\n}\n\nstack,\nnotebook,\nRicinSettingsView {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n\n  color: @ui_text;\n}\n\nRicinSettingsView {\n  background-color: @ui_darker;\n}\n\n.settings {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nbox,\nrevealer\npaned,\nviewport,\nlistbox,\nRicinFriendListRow,\nRicinMainWindow,\nscrolledwindow {\n  background-image: initial;\n\tbackground-color: transparent;\n\tbackground: none;\n  border-image: none;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n}\n\n.box-search {\n  background-color: @ui_darker;\n}\n.box-search entry.search {\n\tbackground-color: transparent;\n\tbackground-image: none;\n\tborder: none;\n\tborder-image: none;\n\tborder-radius: 0;\n\tcolor: @ui_text;\n}\n\n.box-search button.toggle {\n\tbackground-color: transparent;\n\tbackground-image: none;\n\tborder: none;\n\tborder-image: none;\n\tborder-radius: 0;\n\tcolor: @ui_text;\n}\n\n.secondary-background {\n  background-color: @ui_main;\n}\n\n.secondary-background entry,\n.secondary-background button {\n  border-image: none;\n  background-image: none;\n  background-color: @ui_dark;\n}\n\n.secondary-background entry:hover,\n.secondary-background entry:active,\n.secondary-background button:hover {\n  border-image: none;\n  border-radius: 0;\n  background-image: none;\n  background-color: @ui_darker;\n}\n\n.secondary-background notebook {\n  background-color: @ui_darker;\n}\n\n.secondary-background notebook box,\n.secondary-background notebook grid {\n    padding: 0 50px;\n}\n\n.secondary-background notebook button {\n    background-color: @ui_darker;\n    background-image: none;\n    border: none;\n    border-image: none;\n    padding: 40px 0;\n    color: @ui_text;\n    /*margin: 5px 10px;*/\n}\n\n.secondary-background notebook button label {\n    background-color: transparent;\n    background: transparent;\n    background-image: none;\n}\n\n.secondary-background notebook button {\n    border: none;\n    border-width: 0;\n    border-image: none;\n}\n\n.secondary-background notebook button:hover {\n    transition: 150ms ease-in-out;\n    background-image: none;\n    background: @main_ddark_hover;\n    background-color: @main_ddark_hover;\n}\n\n.secondary-background notebook entry {\n    background: @main_dark;\n    color: @main_blue;\n}\n\n.secondary-background notebook label {\n    color: @text_color;\n    background-color: @gtk_box;\n}\n\n.secondary-background notebook {\n    border-radius: 0;\n\n    background-color: @ui_main;\n\n    -notebook-tab-overlap: 3;\n    -notebook-tab-curvature: 2;\n}\n\nnotebook-buttons,\nnotebook-buttons button {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\nnotebook-buttons button:hover {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.friend-infos {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n.user-infos {\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\n.ricin-navigation .user-infos entry {\n  background-color: @ui_darker;\n}\n.ricin-navigation .user-infos entry:hover,\n.ricin-navigation .user-infos entry:active {\n  background-color: @ui_main;\n}\n\nbutton-dark {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\nbutton-dark:hover {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  background-image: none;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\nbutton-text-fix {\n  color: @ui_text;\n}\nbutton-inverted:hover {\n  background-color: @ui_main;\n}\n\nentry-inverted {\n  border-image: none;\n  border-radius: 0;\n  border-image-width: 0;\n  border-bottom-width: 0;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-top-width: 0;\n  box-shadow: none;\n  outline-width: 0;\n  text-shadow: none;\n\n  background-image: none;\n  background-color: @ui_darker;\n  color: @ui_text;\n}\nentry-inverted:hover {\n  background-color: @ui_main;\n}\n\n.friendlist {\n  background-color: @ui_dark;\n  color: @ui_text;\n  border-image: none;\n  border: none;\n}\n\n.friendlist-notify {\n  background-color: #1565c4;\n}\n\n.friendlist-notify button,\n.friendlist-notify .close-button {\n  border-radius: 360px;\n  background-color: white;\n  color: #1565c4;\n}\n.friendlist-notify button,\n.friendlist-notify .close-button:hover {\n  border-radius: 360px;\n  background-color: rgb(205, 209, 204);\n  color: rgb(135, 135, 135);\n}\n\n.message-list {\n  outline-width: 0;\n}\n\n.message-list label {\n  color: @ui_text;\n}\n.message-list label:link {\n\tcolor: @ui_system_color;\n}\n\nentry-principal {\n\tbackground-image: none;\n\tborder-image: none;\n\n\tbackground-color: @ui_darker;\n\tborder: none;\n\tborder-radius: 0;\n\n  color: @ui_text;\n}\n\nentry-chat {\n\tborder: none;\n\tborder-radius: 0;\n \tbackground-image: none;\n\tborder-image: none;\n \tbox-shadow: none;\n \toutline-width: 0;\n\tbackground-color: @ui_darker;\n \tcolor: @ui_text;\n}\n\n.friendlist-row {\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.friendlist-row:active,\n.friendlist-row:selected {\n  background-color: @ui_main;\n  color: @ui_text;\n}\n\n.ricin-content {\n  background-color: @ui_main;\n}\n\n.ricin-content .message-list {\n  background-color: transparent;\n}\n\n.ricin-content .message-list .message {\n  background-color: transparent;\n}\n\n.image-desc {\n  background-color: @ui_darker;\n  color: white;\n  padding: 5px 5px 5px 5px;\n}\n\n.btn-save-image {\n  background-image: none;\n  border: none;\n  border-radius: 0;\n\n  background-color: @ui_darker;\n  color: @ui_text;\n}\n\n.btn-save-image:hover, .btn-save-image:disabled {\n  background-image: none;\n  border: none;\n  border-radius: 0;\n\n  background-color: @ui_dark;\n  color: @ui_text;\n}\n\n.progress-bg {\n  background-color: #2ecc71;\n}\n.progress-bg label {\n  color: black;\n}\n.progress-fg {\n  background-color: #27ae60;\n}\n\n/**\n* CANCELED FILE\n**/\n\n.canceled-file {\n  background-color: #c0392b;\n  color: white;\n}\n\n.canceled-file label_file_name {\n  color: white;\n}\n\n.canceled-file .btn-save-image,\n.canceled-file .btn-save-image :disabled {\n  background-color: #e74c3c;\n}\n\n/**\n* SAVED FILE\n**/\n\n.saved-file {\n  background-color: #27ae60;\n  color: white;\n}\n\n.saved-file label_file_name {\n  color: white;\n}\n\n.saved-file .btn-save-image,\n.saved-file .btn-save-image:disabled {\n  background-color: #2ecc71;\n  color: white;\n}\n\n/** Faux offline message **/\n.chatview-notify-bar {\n  background-color: #3498DB;\n}\n.chatview-notify-bar button:hover {\n  background-color: #2980B9;\n}\n\n/** Friend request widget **/\n.friend-request {\n  background-color: #2c9f42;\n  color: @ui_text;\n}\n.friend-request button { background-color: #2c9f42; }\n.friend-request button:hover {\n  background-color: #237f35;\n  color: @ui_text;\n}\n\n/** Unread messages widget. **/\n.unread-messages box {\n  background-color: @ui_greener;\n  color: @ui_text;\n}\n.unread-messages button {\n  background-color: @ui_green;\n  color: @ui_text;\n}\n\n/** SELECTION COLOR **/\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n:selected:not(.friendlist-row),\nentry:selected {\n  color: #ffffff;\n  background-color: @selected_text_color;\n  outline: none;\n}\n.message-list .activatable {\n  outline: none;\n}\n.message-list .info-message {\n\tcolor: @ui_system_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/dark.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #303030;\n@define-color main_blue #2283d7;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #171717;\n@define-color ui_dark   #222222;\n@define-color ui_main   #333333;\n@define-color ui_text   #FFFFFF;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n\n@define-color plain_color @ui_text;\n@define-color quote_color @ui_green;\n\n@import url(\"app.css\");\n\nRicinQuoteMessageListRow listbox RicinPlainLabel {\n  border-left: 5px solid @plain_color;\n  padding: 0 10px 0 5px;\n}\nRicinQuoteMessageListRow listbox RicinQuoteLabel {\n  border-left: 5px solid @quote_color;\n  padding: 0 7px 0 5px;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/reset.css",
    "content": "/* @import this colorsheet to get the default values for every property.\n * This is useful when writing special CSS tests that should not be\n * inluenced by themes - not even the default ones.\n * Keep in mind that the output will be very ugly and not look like\n * anything GTK.\n * Also, when adding new style properties, please add them here.\n */\n/*\n* {\n  color: inherit;\n  font-size: inherit;\n  background-color: initial;\n  font-family: inherit;\n  font-style: inherit;\n  font-variant: inherit;\n  font-weight: inherit;\n  text-shadow: inherit;\n  icon-shadow: inherit;\n  box-shadow: initial;\n  margin-top: initial;\n  margin-left: initial;\n  margin-bottom: initial;\n  margin-right: initial;\n  padding-top: initial;\n  padding-left: initial;\n  padding-bottom: initial;\n  padding-right: initial;\n  border-top-style: initial;\n  border-top-width: initial;\n  border-left-style: initial;\n  border-left-width: initial;\n  border-bottom-style: initial;\n  border-bottom-width: initial;\n  border-right-style: initial;\n  border-right-width: initial;\n  border-top-left-radius: initial;\n  border-top-right-radius: initial;\n  border-bottom-right-radius: initial;\n  border-bottom-left-radius: initial;\n  outline-style: initial;\n  outline-width: initial;\n  outline-offset: initial;\n  background-clip: initial;\n  background-origin: initial;\n  background-size: initial;\n  background-position: initial;\n  border-top-color: initial;\n  border-right-color: initial;\n  border-bottom-color: initial;\n  border-left-color: initial;\n  outline-color:  initial;\n  background-repeat: initial;\n  background-image: initial;\n  border-image-source: initial;\n  border-image-repeat: initial;\n  border-image-slice: initial;\n  border-image-width: initial;\n  transition-property: initial;\n  transition-duration: initial;\n  transition-timing-function: initial;\n  transition-delay: initial;\n  engine: initial;\n  gtk-key-bindings: initial;\n\n  -GtkWidget-focus-line-width: 0;\n  -GtkWidget-focus-padding: 0;\n  -GtkNotebook-initial-gap: 0;\n  -GtkPaned-handle-size: 0;\n}\n*/\n\n* {\n  -GtkPaned-handle-size: 0;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/styles.css",
    "content": "@define-color blue_primary #2a92c6;\n@define-color green_primary #2ECC71;\n@define-color white_primary #FFFFFF;\n@define-color orange_primary #e67e22;\n\n@define-color badge_color @blue_primary;\n@define-color badge_color_important @orange_primary;\n@define-color links_color @blue_primary;\n@define-color quote_border @green_primary;\n@define-color plain_border @white_primary;\n@define-color selected_color @blue_primary;\n@define-color info_message_color @blue_primary;\n@define-color status_info_color @blue_primary;\n\n.badge {\n  background-color: @badge_color;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n.badge-important {\n  background: @badge_color_important;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n\n*:link {\n  color: @link_color;\n}\n\n.box-search entry.search,\n.box-search button.toggle {\n  border-radius: 0;\n}\n\n.quotes-listbox {\n  background: none;\n  background-image: none;\n}\n.quote-container {\n  border-left: 4px solid @quote_border;\n}\n.plain-container {\n  border-left: 4px solid @plain_border;\n}\n\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n:selected:not(.friendlist-row),\n.entry:selected {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n.message-list .activatable {\n  outline: none;\n}\n\n.info-message {\n  color: @info_message_color;\n}\n.status-info-message {\n  color: @status_info_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/tox.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #949494;\n@define-color main_blue #2283d7;\n@define-color blue_primary #2a92c6;\n@define-color green_primary #2ECC71;\n@define-color white_primary #FFFFFF;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #171717;\n@define-color ui_dark   #222222;\n@define-color ui_main   #333333;\n@define-color ui_text   #FFFFFF;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n@define-color selected_color @blue_primary;\n\n/** Non standard Ricin colors names, only used for this theme. */\n@define-color quote_background #444444;\n@define-color quote_text @ui_text;\n@define-color quote_plain_color @main_grey;\n@define-color swatch_principal @ui_green;\n@define-color swatch_gray #E0E0E0;\n@define-color swatch_gray_disabled #acacac;\n@define-color swatch_gray_border #ABB;\n@define-color swatch_orange #e67e22;\n\n@import url(\"app.css\");\n\n.badge {\n  background-color: @swatch_principal;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n.badge-important {\n  background: @swatch_orange;\n  color: @white_primary;\n  border-radius: 0px;\n  padding: 3px 5px;\n  font-size: 7px;\n}\n\n#chatview-header,\n#settings-header {\n  background-color: @white_primary;\n  color: @ui_main;\n  border-bottom: 1px solid @swatch_gray;\n}\n#chatview-header button,\n#settings-header button {\n  background-color: @white_primary;\n  color: @swatch_principal;\n  border-bottom: 1px solid @swatch_gray;\n}\n#chatview-header,\n#chatview-header button {\n  border-bottom: 1px solid @swatch_gray_border;\n}\n\n#chatview-invite-peers {\n  background-color: @white_primary;\n  color: @ui_main;\n  border-bottom: 1px solid @swatch_gray;\n}\n\n#chatview-invite-peers entry,\n#chatview-invite-peers button {\n  background: @swatch_gray;\n  border: 1px solid @swatch_gray_border;\n  color: black;\n}\n\n#chatview-invite-peers entry:focus {\n  background: @white_primary;\n  border: 1px solid @swatch_principal;\n}\n#chatview-invite-peers entry:selected {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n\n#chatview-invite-peers button:hover {\n  background: @swatch_principal;\n  border: 1px solid @swatch_principal;\n  color: @white_primary;\n}\n\n#chatview-content,\n#chatview-content RicinMessageListRow,\n#settings-content scrolledwindow  {\n  background-color: @white_primary;\n  color: black;\n}\n#chatview-content label:selected,\n#chatview-input entry:selected,\n#settings-content entry:selected {\n  background-color: @swatch_principal;\n  color: white;\n}\n\n.message-list .activatable:selected *,\n.message-list .activatable:selected,\n.message-list .activatable:selected #timestamp,\n.message-list .activatable:selected #username {\n  color: @white_primary;\n  background-color: @selected_color;\n  outline: none;\n}\n\n.message-list .activatable *,\n.message-list .activatable,\n.message-list * #timestamp,\n.message-list * #username {\n  color: black;\n}\n.quote-container {\n  border-left: 5px solid @swatch_principal;\n}\n.plain-container {\n  border-left: 5px solid @ui_main;\n}\n.message {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n#chatview-input entry {\n  color: @ui_main;\n  padding: 8px 8px;\n}\n#chatview-input * {\n  background-color: @swatch_gray;\n  color: @ui_main;\n}\n#chatview-input button * {\n  background: none;\n}\n#chatview-input button,\n#chatview-input entry {\n  border-right: 1px solid @swatch_gray_border;\n  border-top: 1px solid @swatch_gray_border;\n}\n#chatview-input button:last-child {\n  border-right: none;\n}\n#chatview-input button image {\n  background: none;\n}\n#chatview-input button:hover {\n  border-top: 1px solid @ui_darker;\n  background-color: @ui_darker;\n  color: @white_primary;\n}\n#chatview-input button:hover image {\n  color: @white_primary;\n}\n#chatview-input entry:selected {\n  background-color: @selected_color;\n  color: @white_primary;\n}\n\n#chatview-profile {\n  background-color: #F0F0F0;\n  border-left: 1px solid @swatch_gray_border;\n  color: black;\n}\n\n#chatview-profile button,\n#settings-content button,\n#settings-content entry {\n  background-color: @swatch_gray;\n  border: 1px solid @swatch_gray_border;\n  color: @ui_darker;\n}\n\n#chatview-profile button:hover,\n#chatview-header button:hover,\n#settings-header button:hover,\n#settings-content button:hover {\n  background-color: @swatch_principal;\n  color: @white_primary;\n}\n\nRicinSettingsView,\nRicinSettingsView .secondary-background {\n  background: @white_primary;\n}\n#settings-header button {\n  border-right: 1px solid @swatch_gray;\n}\n#settings-header button:last-child {\n  border-right: none;\n}\n\n.friendlist-row:selected {\n  background-color: @white_primary;\n  color: @ui_main;\n}\n\n.box-search {\n  background-color: @ui_main;\n  border-bottom: 1px solid @ui_darker;  \n}\n.box-search entry {\n  border-right: 1px solid @ui_dark;\n}\n\n#friendlist-footer button {\n  border-top: 1px solid #101010;\n  border-right: 1px solid #101010;\n}\n\n#add-friend-box {\n  border-top: 1px solid #101010;\n}\n#add-friend-box button,\n#add-friend-box entry,\n#add-friend-box textview {\n  border: 1px solid #101010;\n  background-color: @ui_dark;\n}\n#add-friend-box entry:focus {\n  border: 1px solid @swatch_principal;\n}\n#add-friend-box button:hover {\n  background-color: @swatch_principal;\n}\n#add-friend-box *:selected {\n  background-color: @selected_color;\n}\n"
  },
  {
    "path": "res/themes/gtk-3.2x/white.css",
    "content": "@define-color main_dark @ui_dark;\n@define-color main_ddark #292929;\n@define-color main_ddark_hover #343434;\n@define-color main_grey #303030;\n@define-color main_blue #2283d7;\n\n@define-color text_color #e2e2e2;\n@define-color text_color_hover #aca8a8;\n@define-color text_copy #7a7a7a;\n\n@define-color gtk_box #343434;\n\n@define-color ui_green   #2ecc71;\n@define-color ui_greener #27ae60;\n\n@define-color ui_darker #E0E0E0;\n@define-color ui_dark   #F0F0F0;\n@define-color ui_main   #FFFFFF;\n@define-color ui_text   #000000;\n@define-color selected_text_color #5688F9;\n@define-color ui_system_color #2a92c6;\n\n@define-color plain_color @ui_text;\n@define-color quote_color @ui_green;\n\n@import url(\"app.css\");\n\nRicinSettingsView combobox,\nRicinSettingsView entry,\nRicinSettingsView button {\n  color: @ui_text;\n}\n\nRicinQuoteMessageListRow listbox RicinPlainLabel {\n  border-left: 5px solid @plain_color;\n  padding: 0 10px 0 5px;\n}\nRicinQuoteMessageListRow listbox RicinQuoteLabel {\n  border-left: 5px solid @quote_color;\n  padding: 0 7px 0 5px;\n}\n"
  },
  {
    "path": "res/ui/chat-view.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <object class=\"GtkBox\" id=\"box_popover_emoticons\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">150</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box20\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"orientation\">vertical</property>\n        <child>\n          <object class=\"GtkGrid\" id=\"grid2\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"row_homogeneous\">True</property>\n            <property name=\"column_homogeneous\">True</property>\n            <child>\n              <object class=\"GtkButton\" id=\"button1\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image11\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-smile-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button3\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image13\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-surprise-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button4\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image14\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-tired-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button7\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image17\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-uncertain-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button8\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image18\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-devilish-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button9\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image19\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-yawn-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button6\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image16\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-wink-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image12\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-smile-big-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"relief\">none</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image15\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"pixel_size\">26</property>\n                    <property name=\"icon_name\">face-angel-symbolic</property>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">1</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkSeparator\" id=\"separator3\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkBox\" id=\"box21\">\n            <property name=\"height_request\">30</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"homogeneous\">True</property>\n            <child>\n              <object class=\"GtkImage\" id=\"image20\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"icon_name\">radio-symbolic</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkImage\" id=\"image22\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"icon_name\">radio-checked-symbolic</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkImage\" id=\"image21\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"icon_name\">radio-symbolic</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <style>\n              <class name=\"user-infos\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">2</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <style>\n      <class name=\"friend-infos\"/>\n    </style>\n  </object>\n  <object class=\"GtkBox\" id=\"box_popover_markdown_help\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <property name=\"spacing\">5</property>\n    <child>\n      <object class=\"GtkLabel\" id=\"label1\">\n        <property name=\"height_request\">30</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"label\" translatable=\"yes\">&lt;b&gt;Available Markdown tags&lt;/b&gt;</property>\n        <property name=\"use_markup\">True</property>\n        <style>\n          <class name=\"user-infos\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box24\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"margin_left\">5</property>\n        <property name=\"margin_right\">5</property>\n        <property name=\"margin_bottom\">5</property>\n        <property name=\"orientation\">vertical</property>\n        <property name=\"spacing\">3</property>\n        <child>\n          <object class=\"GtkGrid\" id=\"grid3\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"column_spacing\">5</property>\n            <property name=\"column_homogeneous\">True</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label3\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Tag Name</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label4\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Syntax</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Alt syntax</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box25\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">center</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box26\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"resize_mode\">immediate</property>\n                    <property name=\"baseline_position\">top</property>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator5\">\n                        <property name=\"width_request\">1</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <style>\n                          <class name=\"quote-bar\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator6\">\n                        <property name=\"width_request\">1</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <style>\n                          <class name=\"quote-bar\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator7\">\n                        <property name=\"width_request\">1</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <style>\n                          <class name=\"quote-bar\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">2</property>\n                      </packing>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label20\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"label\" translatable=\"yes\">Quote</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"bold\"/>\n                      <attribute name=\"foreground\" value=\"#2e2ecccc7171\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">6</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label21\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">&gt;quote</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">6</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label7\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">6</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkSeparator\" id=\"separator4\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <style>\n                  <class name=\"user-infos\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">1</property>\n                <property name=\"width\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label23\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Bold</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label22\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">*bold*</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label8\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">**bold**</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label9\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Italic</property>\n                <attributes>\n                  <attribute name=\"style\" value=\"italic\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label10\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">/italic/</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label11\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">//italic//</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label12\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Underline</property>\n                <attributes>\n                  <attribute name=\"underline\" value=\"True\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">4</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label13\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">_underline_</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">4</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label14\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">__underline__</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">4</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label18\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Inline code</property>\n                <attributes>\n                  <attribute name=\"font-desc\" value=\"Monospace 10\"/>\n                  <attribute name=\"absolute-size\" value=\"10000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">7</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label19\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">`inline code`</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">7</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label6\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">7</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label15\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Striked</property>\n                <attributes>\n                  <attribute name=\"strikethrough\" value=\"True\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"left_attach\">0</property>\n                <property name=\"top_attach\">5</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label16\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">~striked~</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">1</property>\n                <property name=\"top_attach\">5</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label17\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">~~striked~~</property>\n              </object>\n              <packing>\n                <property name=\"left_attach\">2</property>\n                <property name=\"top_attach\">5</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">2</property>\n      </packing>\n    </child>\n    <style>\n      <class name=\"friend-infos\"/>\n    </style>\n  </object>\n  <object class=\"GtkImage\" id=\"image4\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">edit-delete-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image8\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">edit-copy-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image_block_user\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">dialog-error-symbolic.symbolic</property>\n  </object>\n  <template class=\"RicinChatView\" parent=\"GtkBox\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box3\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box4\">\n            <property name=\"name\">chatview-header</property>\n            <property name=\"height_request\">62</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box10\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"user_avatar\">\n                    <property name=\"width_request\">46</property>\n                    <property name=\"height_request\">46</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"pixel_size\">46</property>\n                    <property name=\"resource\">/chat/tox/ricin/images/noavatar.gif</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">center</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"username\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"label\" translatable=\"yes\">Username</property>\n                    <property name=\"justify\">center</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"max_width_chars\">200</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"bold\"/>\n                      <attribute name=\"scale\" value=\"1\"/>\n                      <attribute name=\"absolute-size\" value=\"16000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"status_message\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"label\" translatable=\"yes\">Status message...</property>\n                    <property name=\"use_markup\">True</property>\n                    <property name=\"justify\">center</property>\n                    <property name=\"wrap\">True</property>\n                    <property name=\"selectable\">True</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"max_width_chars\">256</property>\n                    <property name=\"lines\">2</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box6\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkButton\" id=\"button_audio_call\">\n                    <property name=\"width_request\">58</property>\n                    <property name=\"height_request\">58</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"receives_default\">True</property>\n                    <property name=\"tooltip_text\" translatable=\"yes\">Call friend</property>\n                    <property name=\"relief\">none</property>\n                    <property name=\"always_show_image\">True</property>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image5\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"pixel_size\">32</property>\n                        <property name=\"icon_name\">call-start-symbolic</property>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"button-dark\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkButton\" id=\"button_video_call\">\n                    <property name=\"width_request\">58</property>\n                    <property name=\"height_request\">58</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"receives_default\">True</property>\n                    <property name=\"tooltip_text\" translatable=\"yes\">Video call friend</property>\n                    <property name=\"relief\">none</property>\n                    <property name=\"always_show_image\">True</property>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image6\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"pixel_size\">32</property>\n                        <property name=\"icon_name\">video-x-generic-symbolic</property>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"button-dark\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkButton\" id=\"button_toggle_friend_menu\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"receives_default\">True</property>\n                    <property name=\"tooltip_text\" translatable=\"yes\">Friend's profile</property>\n                    <property name=\"relief\">none</property>\n                    <signal name=\"clicked\" handler=\"toggle_friend_menu\" swapped=\"no\"/>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image7\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"pixel_size\">24</property>\n                        <property name=\"icon_name\">view-more-symbolic</property>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"button-dark\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">2</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <style>\n          <class name=\"user-infos\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box1\">\n        <property name=\"name\">chatview-content</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"orientation\">vertical</property>\n        <child>\n          <object class=\"GtkOverlay\" id=\"overlay1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box8\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkScrolledWindow\" id=\"scroll_messages\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"hscrollbar_policy\">never</property>\n                    <signal name=\"size-allocate\" handler=\"scroll_to_bottom\" swapped=\"no\"/>\n                    <child>\n                      <object class=\"GtkViewport\" id=\"viewport2\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"shadow_type\">none</property>\n                        <child>\n                          <object class=\"GtkListBox\" id=\"messages_list\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"selection_mode\">multiple</property>\n                            <property name=\"activate_on_single_click\">False</property>\n                            <style>\n                              <class name=\"message-list\"/>\n                              <class name=\"list\"/>\n                            </style>\n                          </object>\n                        </child>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkRevealer\" id=\"friend_typing\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"transition_type\">crossfade</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box19\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_left\">10</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkImage\" id=\"image1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"valign\">baseline</property>\n                            <property name=\"pixel_size\">24</property>\n                            <property name=\"icon_name\">content-loading-symbolic</property>\n                            <property name=\"icon_size\">5</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_friend_is_typing\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"label\" translatable=\"yes\">&lt;i&gt;Friend is typing&lt;/i&gt;</property>\n                            <property name=\"use_markup\">True</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"list\"/>\n                        </style>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"list\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"index\">-1</property>\n              </packing>\n            </child>\n            <child type=\"overlay\">\n              <object class=\"GtkRevealer\" id=\"revealer_friend_menu\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">end</property>\n                <property name=\"transition_type\">slide-left</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_friend_profil\">\n                    <property name=\"name\">chatview-profile</property>\n                    <property name=\"width_request\">210</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">5</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box9\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_left\">5</property>\n                        <property name=\"margin_right\">5</property>\n                        <property name=\"margin_top\">5</property>\n                        <property name=\"orientation\">vertical</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_friend_profil_infos\">\n                            <property name=\"width_request\">200</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_friend_profil_name\">\n                                <property name=\"width_request\">160</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"label\">SkyzohKey</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"single_line_mode\">True</property>\n                                <property name=\"max_width_chars\">40</property>\n                                <attributes>\n                                  <attribute name=\"weight\" value=\"bold\"/>\n                                  <attribute name=\"size\" value=\"18000\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkImage\" id=\"friend_profil_avatar\">\n                                <property name=\"width_request\">200</property>\n                                <property name=\"height_request\">128</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"pixel_size\">128</property>\n                                <property name=\"resource\">/chat/tox/ricin/images/noavatar.gif</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box11\">\n                            <property name=\"width_request\">190</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box12\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <property name=\"spacing\">10</property>\n                                <child>\n                                  <object class=\"GtkScrolledWindow\" id=\"scrolledwindow1\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"hscrollbar_policy\">never</property>\n                                    <child>\n                                      <object class=\"GtkViewport\" id=\"viewport1\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"vscroll_policy\">natural</property>\n                                        <property name=\"shadow_type\">none</property>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label_friend_profile_status_message\">\n                                            <property name=\"name\">10</property>\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"valign\">start</property>\n                                            <property name=\"label\">label</property>\n                                            <property name=\"use_markup\">True</property>\n                                            <property name=\"justify\">center</property>\n                                            <property name=\"wrap\">True</property>\n                                            <property name=\"selectable\">True</property>\n                                            <property name=\"width_chars\">0</property>\n                                            <property name=\"max_width_chars\">10</property>\n                                            <property name=\"lines\">5</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                    </child>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkBox\" id=\"box13\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"orientation\">vertical</property>\n                                    <child>\n                                      <object class=\"GtkBox\" id=\"box14\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"halign\">center</property>\n                                        <child>\n                                          <object class=\"GtkImage\" id=\"image_friend_status\">\n                                            <property name=\"width_request\">20</property>\n                                            <property name=\"height_request\">20</property>\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"resource\">/chat/tox/ricin/images/status/offline.png</property>\n                                          </object>\n                                          <packing>\n                                            <property name=\"expand\">False</property>\n                                            <property name=\"fill\">True</property>\n                                            <property name=\"position\">0</property>\n                                          </packing>\n                                        </child>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label2\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\" translatable=\"yes\">&lt;b&gt;Last seen:&lt;/b&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                          <packing>\n                                            <property name=\"expand\">False</property>\n                                            <property name=\"fill\">True</property>\n                                            <property name=\"position\">1</property>\n                                          </packing>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">0</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkLabel\" id=\"label_friend_last_seen\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"label\">14:30</property>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">2</property>\n                                      </packing>\n                                    </child>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkGrid\" id=\"grid1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_top\">5</property>\n                            <property name=\"margin_bottom\">5</property>\n                            <property name=\"row_spacing\">5</property>\n                            <property name=\"column_spacing\">5</property>\n                            <property name=\"row_homogeneous\">True</property>\n                            <property name=\"column_homogeneous\">True</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_friend_block\">\n                                <property name=\"label\" translatable=\"yes\">Block</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image_block_user</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"block_friend\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"left_attach\">0</property>\n                                <property name=\"top_attach\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_friend_delete\">\n                                <property name=\"label\" translatable=\"yes\">Delete</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image4</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"delete_friend\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"left_attach\">1</property>\n                                <property name=\"top_attach\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_friend_copy_toxid\">\n                                <property name=\"label\" translatable=\"yes\">Copy friend's ToxID</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image8</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"copy_friend_toxid\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"left_attach\">0</property>\n                                <property name=\"top_attach\">0</property>\n                                <property name=\"width\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">3</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <style>\n                      <class name=\"friend-infos\"/>\n                      <class name=\"background\"/>\n                    </style>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"pass_through\">True</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">1</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box2\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"orientation\">vertical</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box15\">\n            <property name=\"name\">chatview-input</property>\n            <property name=\"height_request\">32</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkButton\" id=\"button_show_markdown_help\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image24\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"icon_name\">dialog-information-symbolic</property>\n                  </object>\n                </child>\n                <style>\n                  <class name=\"button-dark\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box16\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkEntry\" id=\"entry\">\n                    <property name=\"height_request\">32</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"sensitive\">False</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"events\">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property>\n                    <property name=\"max_width_chars\">5</property>\n                    <signal name=\"activate\" handler=\"send_message\" swapped=\"no\"/>\n                    <style>\n                      <class name=\"entry-chat\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">2</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button_show_emoticons\">\n                <property name=\"visible\">True</property>\n                <property name=\"sensitive\">False</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"tooltip_text\" translatable=\"yes\">Choose smileys</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image9\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"valign\">baseline</property>\n                    <property name=\"pixel_size\">16</property>\n                    <property name=\"icon_name\">face-smile-symbolic</property>\n                    <property name=\"icon_size\">5</property>\n                  </object>\n                </child>\n                <style>\n                  <class name=\"button-dark\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"send_file\">\n                <property name=\"visible\">True</property>\n                <property name=\"sensitive\">False</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"tooltip_text\" translatable=\"yes\">Send file</property>\n                <signal name=\"clicked\" handler=\"choose_file_to_send\" swapped=\"no\"/>\n                <child>\n                  <object class=\"GtkImage\" id=\"image3\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"icon_name\">mail-attachment-symbolic</property>\n                  </object>\n                </child>\n                <style>\n                  <class name=\"button-dark\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">4</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"send\">\n                <property name=\"visible\">True</property>\n                <property name=\"sensitive\">False</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"tooltip_text\" translatable=\"yes\">Send message</property>\n                <property name=\"resize_mode\">queue</property>\n                <property name=\"image_position\">right</property>\n                <property name=\"always_show_image\">True</property>\n                <signal name=\"clicked\" handler=\"send_message\" swapped=\"no\"/>\n                <child>\n                  <object class=\"GtkImage\" id=\"image2\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"icon_name\">mail-send-symbolic</property>\n                  </object>\n                </child>\n                <style>\n                  <class name=\"button-dark\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">5</property>\n              </packing>\n            </child>\n            <style>\n              <class name=\"user-infos\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"pack_type\">end</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"pack_type\">end</property>\n        <property name=\"position\">2</property>\n      </packing>\n    </child>\n  </template>\n  <object class=\"GtkMenu\" id=\"menu1\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n  </object>\n  <object class=\"GtkTextBuffer\" id=\"textbuffer_friend_notes\"/>\n</interface>\n"
  },
  {
    "path": "res/ui/file-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinFileListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">queue</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"spacing\">5</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image_author\">\n                    <property name=\"width_request\">20</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"stock\">gtk-missing-image</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_name\">\n                    <property name=\"name\">username</property>\n                    <property name=\"width_request\">80</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"label\">label</property>\n                    <property name=\"selectable\">True</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"width_chars\">12</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"max_width_chars\">12</property>\n                    <property name=\"track_visited_links\">False</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"bold\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box_widget\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">start</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box2\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkAspectFrame\" id=\"aspectframe_preview\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"label_xalign\">0</property>\n                        <property name=\"shadow_type\">none</property>\n                        <child>\n                          <object class=\"GtkImage\" id=\"image_preview\">\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"stock\">gtk-missing-image</property>\n                          </object>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">False</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box3\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_background\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkImage\" id=\"image_file_type\">\n                                <property name=\"name\">50</property>\n                                <property name=\"width_request\">30</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"icon_name\">text-x-generic-symbolic</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_file_name\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"margin_top\">2</property>\n                                <property name=\"margin_bottom\">2</property>\n                                <property name=\"label\">file_name.ext</property>\n                                <property name=\"ellipsize\">end</property>\n                                <property name=\"max_width_chars\">30</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box6\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <child>\n                                  <object class=\"GtkProgressBar\" id=\"progress_file_percent\">\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"valign\">center</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_file_size\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"label\">(0 Kb)</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">3</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box4\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_reject\">\n                                <property name=\"width_request\">20</property>\n                                <property name=\"height_request\">20</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"tooltip_text\" translatable=\"yes\">Cancel/pause file</property>\n                                <property name=\"halign\">center</property>\n                                <property name=\"valign\">center</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"reject_file\" swapped=\"no\"/>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_reject_inline\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"pixel_size\">16</property>\n                                    <property name=\"icon_name\">window-close-symbolic</property>\n                                  </object>\n                                </child>\n                                <style>\n                                  <class name=\"btn-save-image\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_save\">\n                                <property name=\"width_request\">20</property>\n                                <property name=\"height_request\">20</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"tooltip_text\" translatable=\"yes\">Accept/Resume file</property>\n                                <property name=\"halign\">center</property>\n                                <property name=\"valign\">center</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"save_file\" swapped=\"no\"/>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_save_inline\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"pixel_size\">16</property>\n                                    <property name=\"icon_name\">object-select-symbolic</property>\n                                  </object>\n                                </child>\n                                <style>\n                                  <class name=\"btn-save-image\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"image-desc\"/>\n                          <class name=\"background\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_timestamp\">\n                <property name=\"name\">timestamp</property>\n                <property name=\"width_request\">70</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">end</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\">00:00.00</property>\n                <property name=\"justify\">right</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"single_line_mode\">True</property>\n                <attributes>\n                  <attribute name=\"size\" value=\"9000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/friend-list-notification_unusable.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <object class=\"GtkBox\" id=\"box_notify_unusable_hidden\">\n    <property name=\"can_focus\">False</property>\n    <property name=\"spacing\">5</property>\n    <child>\n      <object class=\"GtkImage\" id=\"image5\">\n        <property name=\"width_request\">40</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"halign\">start</property>\n        <property name=\"margin_left\">5</property>\n        <property name=\"margin_right\">5</property>\n        <property name=\"margin_top\">5</property>\n        <property name=\"margin_bottom\">5</property>\n        <property name=\"pixel_size\">40</property>\n        <property name=\"icon_name\">document-open-recent</property>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box11\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"valign\">start</property>\n        <property name=\"resize_mode\">immediate</property>\n        <property name=\"orientation\">vertical</property>\n        <child>\n          <object class=\"GtkLabel\" id=\"label1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"margin_left\">5</property>\n            <property name=\"margin_right\">5</property>\n            <property name=\"margin_top\">5</property>\n            <property name=\"margin_bottom\">5</property>\n            <property name=\"label\" translatable=\"yes\">3 unused profiles found:\n&lt;b&gt;Snow, Guy, Aztek&lt;/b&gt;</property>\n            <property name=\"use_markup\">True</property>\n            <property name=\"wrap\">True</property>\n            <property name=\"ellipsize\">end</property>\n            <property name=\"width_chars\">0</property>\n            <property name=\"track_visited_links\">False</property>\n            <property name=\"lines\">3</property>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkButton\" id=\"button1\">\n            <property name=\"label\" translatable=\"yes\">Delete friends (3)</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"receives_default\">True</property>\n            <property name=\"margin_left\">5</property>\n            <property name=\"margin_right\">5</property>\n            <property name=\"margin_bottom\">5</property>\n            <property name=\"relief\">none</property>\n            <style>\n              <class name=\"button-close\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">1</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"halign\">start</property>\n        <property name=\"margin_left\">5</property>\n        <property name=\"margin_right\">10</property>\n        <child>\n          <object class=\"GtkImage\" id=\"image6\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"halign\">start</property>\n            <property name=\"valign\">center</property>\n            <property name=\"icon_name\">window-close-symbolic</property>\n            <style>\n              <class name=\"close-button\"/>\n            </style>\n          </object>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">2</property>\n      </packing>\n    </child>\n    <style>\n      <class name=\"friendlist-notify\"/>\n    </style>\n  </object>\n</interface>\n"
  },
  {
    "path": "res/ui/friend-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinFriendListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">100</property>\n    <property name=\"height_request\">60</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkImage\" id=\"avatar\">\n                <property name=\"width_request\">48</property>\n                <property name=\"height_request\">48</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <property name=\"pixel_size\">48</property>\n                <property name=\"resource\">/chat/tox/ricin/images/noavatar.gif</property>\n                <property name=\"icon_size\">6</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box_infos\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"username\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"margin_top\">7</property>\n                    <property name=\"label\">name</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"bold\"/>\n                      <attribute name=\"size\" value=\"12000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"status\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">end</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"margin_bottom\">7</property>\n                    <property name=\"label\">status</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <attributes>\n                      <attribute name=\"style\" value=\"normal\"/>\n                      <attribute name=\"size\" value=\"10000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_unread_count\">\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">center</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"label\" translatable=\"yes\">10</property>\n                <style>\n                  <class name=\"badge\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkImage\" id=\"userstatus\">\n                <property name=\"width_request\">16</property>\n                <property name=\"height_request\">16</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">3</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <property name=\"pixel_size\">24</property>\n                <property name=\"resource\">/chat/tox/ricin/images/status/offline.png</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"friendlist-row\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/group-chat-view.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinGroupChatView\" parent=\"GtkBox\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box3\">\n        <property name=\"name\">chatview-header</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box4\">\n            <property name=\"height_request\">62</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box10\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"avatar\">\n                    <property name=\"width_request\">46</property>\n                    <property name=\"height_request\">46</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"pixel_size\">46</property>\n                    <property name=\"icon_name\">avatar-default</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box_group_infos\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">center</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"name\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"label\">Groupchat name</property>\n                    <property name=\"justify\">center</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"width_chars\">15</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"max_width_chars\">15</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"bold\"/>\n                      <attribute name=\"scale\" value=\"1\"/>\n                      <attribute name=\"absolute-size\" value=\"16000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"topic\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"margin_right\">5</property>\n                    <property name=\"label\">Topic text ipsum dolores sit amet</property>\n                    <property name=\"use_markup\">True</property>\n                    <property name=\"justify\">center</property>\n                    <property name=\"wrap\">True</property>\n                    <property name=\"selectable\">True</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"max_width_chars\">256</property>\n                    <property name=\"lines\">2</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkButton\" id=\"button_add_peer\">\n                    <property name=\"width_request\">58</property>\n                    <property name=\"height_request\">58</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"receives_default\">True</property>\n                    <property name=\"tooltip_text\" translatable=\"yes\">Invite friends to this groupchat</property>\n                    <property name=\"relief\">none</property>\n                    <signal name=\"clicked\" handler=\"toggle_invite_peers\" swapped=\"no\"/>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image_icon_invite_peers\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"pixel_size\">32</property>\n                        <property name=\"icon_name\">list-add-symbolic</property>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"button-dark\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkButton\" id=\"button_toggle_group_menu\">\n                    <property name=\"height_request\">58</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"receives_default\">True</property>\n                    <property name=\"tooltip_text\" translatable=\"yes\">Groupchat informations</property>\n                    <property name=\"relief\">none</property>\n                    <signal name=\"clicked\" handler=\"toggle_group_menu\" swapped=\"no\"/>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image7\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"pixel_size\">24</property>\n                        <property name=\"icon_name\">view-more-symbolic</property>\n                      </object>\n                    </child>\n                    <style>\n                      <class name=\"button-dark\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <style>\n          <class name=\"user-infos\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkOverlay\" id=\"overlay1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box7\">\n            <property name=\"name\">chatview-content</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkOverlay\" id=\"overlay2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkScrolledWindow\" id=\"scroll_messages\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"hscrollbar_policy\">never</property>\n                    <child>\n                      <object class=\"GtkViewport\" id=\"viewport2\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"shadow_type\">none</property>\n                        <child>\n                          <object class=\"GtkListBox\" id=\"messages_list\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"selection_mode\">multiple</property>\n                            <property name=\"activate_on_single_click\">False</property>\n                            <signal name=\"size-allocate\" handler=\"scroll_to_bottom\" swapped=\"no\"/>\n                            <style>\n                              <class name=\"message-list\"/>\n                              <class name=\"list\"/>\n                            </style>\n                          </object>\n                        </child>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"pass_through\">True</property>\n                    <property name=\"index\">-1</property>\n                  </packing>\n                </child>\n                <child type=\"overlay\">\n                  <object class=\"GtkRevealer\" id=\"revealer_group_menu\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">end</property>\n                    <property name=\"transition_type\">slide-left</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_friend_profil\">\n                        <property name=\"name\">chatview-profile</property>\n                        <property name=\"width_request\">210</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_left\">5</property>\n                            <property name=\"margin_right\">5</property>\n                            <property name=\"orientation\">vertical</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_group_name\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"margin_top\">5</property>\n                                <property name=\"margin_bottom\">5</property>\n                                <property name=\"label\">Groupchat name</property>\n                                <property name=\"ellipsize\">end</property>\n                                <property name=\"width_chars\">15</property>\n                                <property name=\"single_line_mode\">True</property>\n                                <property name=\"max_width_chars\">15</property>\n                                <attributes>\n                                  <attribute name=\"size\" value=\"18000\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_group_topic\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"margin_bottom\">5</property>\n                                <property name=\"label\">Topic text ipsum dolores sit amet</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                                <property name=\"selectable\">True</property>\n                                <property name=\"max_width_chars\">23</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkScrolledWindow\" id=\"scrolledwindow1\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"hscrollbar_policy\">never</property>\n                                <property name=\"shadow_type\">in</property>\n                                <child>\n                                  <object class=\"GtkViewport\" id=\"viewport1\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <child>\n                                      <object class=\"GtkBox\" id=\"box9\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"orientation\">vertical</property>\n                                        <child>\n                                          <object class=\"GtkBox\" id=\"box12\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"orientation\">vertical</property>\n                                            <child>\n                                              <object class=\"GtkExpander\" id=\"expander1\">\n                                                <property name=\"visible\">True</property>\n                                                <property name=\"can_focus\">True</property>\n                                                <property name=\"margin_top\">5</property>\n                                                <property name=\"margin_bottom\">5</property>\n                                                <property name=\"expanded\">True</property>\n                                                <property name=\"label_fill\">True</property>\n                                                <child>\n                                                  <object class=\"GtkListBox\" id=\"listbox_friends\">\n                                                    <property name=\"visible\">True</property>\n                                                    <property name=\"can_focus\">False</property>\n                                                    <signal name=\"row-activated\" handler=\"peer_row_clicked\" swapped=\"no\"/>\n                                                  </object>\n                                                </child>\n                                                <child type=\"label\">\n                                                  <object class=\"GtkLabel\" id=\"label_friends\">\n                                                    <property name=\"height_request\">20</property>\n                                                    <property name=\"visible\">True</property>\n                                                    <property name=\"can_focus\">False</property>\n                                                    <property name=\"label\" translatable=\"yes\">&lt;b&gt;Friends&lt;/b&gt;</property>\n                                                    <property name=\"use_markup\">True</property>\n                                                  </object>\n                                                </child>\n                                              </object>\n                                              <packing>\n                                                <property name=\"expand\">False</property>\n                                                <property name=\"fill\">True</property>\n                                                <property name=\"position\">0</property>\n                                              </packing>\n                                            </child>\n                                          </object>\n                                          <packing>\n                                            <property name=\"expand\">False</property>\n                                            <property name=\"fill\">True</property>\n                                            <property name=\"position\">2</property>\n                                          </packing>\n                                        </child>\n                                        <child>\n                                          <object class=\"GtkBox\" id=\"box11\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"orientation\">vertical</property>\n                                            <child>\n                                              <object class=\"GtkExpander\" id=\"expander2\">\n                                                <property name=\"visible\">True</property>\n                                                <property name=\"can_focus\">True</property>\n                                                <property name=\"margin_top\">5</property>\n                                                <property name=\"margin_bottom\">5</property>\n                                                <property name=\"expanded\">True</property>\n                                                <property name=\"label_fill\">True</property>\n                                                <child>\n                                                  <object class=\"GtkListBox\" id=\"listbox_unknown_peers\">\n                                                    <property name=\"visible\">True</property>\n                                                    <property name=\"can_focus\">False</property>\n                                                    <signal name=\"row-activated\" handler=\"peer_row_clicked\" swapped=\"no\"/>\n                                                  </object>\n                                                </child>\n                                                <child type=\"label\">\n                                                  <object class=\"GtkLabel\" id=\"label_unknown_peers\">\n                                                    <property name=\"height_request\">20</property>\n                                                    <property name=\"visible\">True</property>\n                                                    <property name=\"can_focus\">False</property>\n                                                    <property name=\"label\" translatable=\"yes\">&lt;b&gt;Unknown peers&lt;/b&gt;</property>\n                                                    <property name=\"use_markup\">True</property>\n                                                  </object>\n                                                </child>\n                                              </object>\n                                              <packing>\n                                                <property name=\"expand\">False</property>\n                                                <property name=\"fill\">True</property>\n                                                <property name=\"position\">0</property>\n                                              </packing>\n                                            </child>\n                                          </object>\n                                          <packing>\n                                            <property name=\"expand\">True</property>\n                                            <property name=\"fill\">True</property>\n                                            <property name=\"position\">3</property>\n                                          </packing>\n                                        </child>\n                                      </object>\n                                    </child>\n                                  </object>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box8\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"margin_top\">5</property>\n                                <property name=\"margin_bottom\">5</property>\n                                <property name=\"spacing\">5</property>\n                                <property name=\"homogeneous\">True</property>\n                                <child>\n                                  <object class=\"GtkButton\" id=\"button_group_leave\">\n                                    <property name=\"label\" translatable=\"yes\">Leave</property>\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"receives_default\">True</property>\n                                    <property name=\"image\">image4</property>\n                                    <property name=\"always_show_image\">True</property>\n                                    <signal name=\"clicked\" handler=\"leave_group\" swapped=\"no\"/>\n                                    <style>\n                                      <class name=\"button-dark\"/>\n                                      <class name=\"button-inverted\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkButton\" id=\"button_group_mute\">\n                                    <property name=\"label\" translatable=\"yes\">Mute</property>\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"receives_default\">True</property>\n                                    <property name=\"image\">image_block_user</property>\n                                    <property name=\"always_show_image\">True</property>\n                                    <signal name=\"clicked\" handler=\"mute_group\" swapped=\"no\"/>\n                                    <style>\n                                      <class name=\"button-dark\"/>\n                                      <class name=\"button-inverted\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">3</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"friend-infos\"/>\n                        </style>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"pass_through\">True</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"pass_through\">True</property>\n            <property name=\"index\">-1</property>\n          </packing>\n        </child>\n        <child type=\"overlay\">\n          <object class=\"GtkBox\" id=\"box6\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"orientation\">vertical</property>\n            <child>\n              <object class=\"GtkRevealer\" id=\"revealer_invite_peers\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box13\">\n                    <property name=\"name\">chatview-invite-peers</property>\n                    <property name=\"height_request\">100</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box14\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_left\">10</property>\n                        <property name=\"margin_right\">10</property>\n                        <property name=\"margin_top\">5</property>\n                        <property name=\"margin_bottom\">10</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"label\" translatable=\"yes\">&lt;span size=\"large\"&gt;&lt;b&gt;Invite friends to this groupchat:&lt;/b&gt;&lt;/span&gt;\n&lt;i&gt;Type the name of the friends to add in the input below.&lt;/i&gt;</property>\n                            <property name=\"use_markup\">True</property>\n                            <property name=\"justify\">center</property>\n                            <property name=\"lines\">2</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkEntry\" id=\"entry_invite_peers\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box15\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">end</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_invite_peers\">\n                                <property name=\"label\" translatable=\"yes\">Add friends</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image3</property>\n                                <property name=\"always_show_image\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"pass_through\">True</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">1</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box2\">\n        <property name=\"name\">chatview-input</property>\n        <property name=\"height_request\">32</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkEntry\" id=\"entry\">\n            <property name=\"height_request\">32</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"max_width_chars\">5</property>\n            <signal name=\"activate\" handler=\"send_message\" swapped=\"no\"/>\n            <style>\n              <class name=\"entry-chat\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkButton\" id=\"button_send\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"receives_default\">True</property>\n            <property name=\"resize_mode\">queue</property>\n            <property name=\"relief\">none</property>\n            <property name=\"image_position\">right</property>\n            <property name=\"always_show_image\">True</property>\n            <signal name=\"clicked\" handler=\"send_message\" swapped=\"no\"/>\n            <child>\n              <object class=\"GtkImage\" id=\"image2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"icon_name\">mail-send-symbolic</property>\n              </object>\n            </child>\n            <style>\n              <class name=\"button-dark\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <style>\n          <class name=\"user-infos\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"pack_type\">end</property>\n        <property name=\"position\">2</property>\n      </packing>\n    </child>\n  </template>\n  <object class=\"GtkImage\" id=\"image3\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"icon_name\">object-select-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image4\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">window-close-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image_block_user\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">notifications-disabled-symbolic</property>\n  </object>\n</interface>\n"
  },
  {
    "path": "res/ui/group-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <object class=\"GtkImage\" id=\"image_mute\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"icon_name\">notifications-symbolic</property>\n  </object>\n  <template class=\"RicinGroupListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">200</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkImage\" id=\"image_avatar\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"pixel_size\">24</property>\n                <property name=\"icon_name\">network-workgroup</property>\n                <property name=\"icon_size\">6</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_name\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"label\">name</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"single_line_mode\">True</property>\n                <property name=\"track_visited_links\">False</property>\n                <property name=\"xalign\">0</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button_mute\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"tooltip_text\" translatable=\"yes\">Mute the peer</property>\n                <property name=\"image\">image_mute</property>\n                <signal name=\"clicked\" handler=\"mute_peer\" swapped=\"no\"/>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/info-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinInfoListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"spacing\">10</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image_icon_info\">\n                    <property name=\"width_request\">80</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">end</property>\n                    <property name=\"margin_left\">10</property>\n                    <property name=\"xalign\">0.89999997615814209</property>\n                    <property name=\"icon_name\">mail-mark-important-symbolic</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">False</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_message\">\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"label\">Information message.</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"xalign\">0</property>\n                <attributes>\n                  <attribute name=\"style\" value=\"italic\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/inline-file-message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinInlineFileMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">queue</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_name\">\n                <property name=\"width_request\">80</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"label\" translatable=\"no\">label</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"width_chars\">12</property>\n                <property name=\"single_line_mode\">True</property>\n                <property name=\"max_width_chars\">12</property>\n                <property name=\"track_visited_links\">False</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">False</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box_widget\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box2\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box3\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkOverlay\" id=\"overlay1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box_foreground\">\n                                <property name=\"width_request\">0</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_foreground\">\n                                    <property name=\"width_request\">-1</property>\n                                    <property name=\"height_request\">25</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <attributes>\n                                      <attribute name=\"background\" value=\"#7373d2d21616\"/>\n                                    </attributes>\n                                    <style>\n                                      <class name=\"progress-fg\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"index\">-1</property>\n                              </packing>\n                            </child>\n                            <child type=\"overlay\">\n                              <object class=\"GtkBox\" id=\"box_background\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"margin_right\">5</property>\n                                <property name=\"spacing\">5</property>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_file_type\">\n                                    <property name=\"name\">50</property>\n                                    <property name=\"width_request\">30</property>\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"icon_name\">text-x-generic-symbolic</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_file_name\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"margin_top\">2</property>\n                                    <property name=\"margin_bottom\">2</property>\n                                    <property name=\"label\" translatable=\"no\">file_name.ext</property>\n                                    <property name=\"ellipsize\">end</property>\n                                    <property name=\"max_width_chars\">30</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label2\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">2</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_file_size\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"label\" translatable=\"no\">(0 Kb)</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">3</property>\n                                  </packing>\n                                </child>\n                              </object>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box4\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_reject\">\n                                <property name=\"width_request\">20</property>\n                                <property name=\"height_request\">20</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"tooltip_text\" translatable=\"yes\">Cancel/pause file</property>\n                                <property name=\"halign\">center</property>\n                                <property name=\"valign\">center</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"reject_file\" swapped=\"no\"/>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_reject_inline\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"pixel_size\">16</property>\n                                    <property name=\"icon_name\">window-close-symbolic</property>\n                                  </object>\n                                </child>\n                                <style>\n                                  <class name=\"btn-save-image\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_save\">\n                                <property name=\"width_request\">20</property>\n                                <property name=\"height_request\">20</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"tooltip_text\" translatable=\"yes\">Accept/Resume file</property>\n                                <property name=\"halign\">center</property>\n                                <property name=\"valign\">center</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"save_file\" swapped=\"no\"/>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_save_inline\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"pixel_size\">16</property>\n                                    <property name=\"icon_name\">object-select-symbolic</property>\n                                  </object>\n                                </child>\n                                <style>\n                                  <class name=\"btn-save-image\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkProgressBar\" id=\"progress_file_percent\">\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_left\">5</property>\n                        <property name=\"margin_right\">5</property>\n                        <property name=\"margin_top\">5</property>\n                        <property name=\"margin_bottom\">5</property>\n                        <property name=\"fraction\">0.58999999999999997</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <style>\n                  <class name=\"image-desc\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_timestamp\">\n                <property name=\"width_request\">70</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">end</property>\n                <property name=\"label\" translatable=\"no\">00:00.00</property>\n                <property name=\"justify\">right</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"single_line_mode\">True</property>\n                <attributes>\n                  <attribute name=\"size\" value=\"9000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/inline-image-message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinInlineImageMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">queue</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_name\">\n                <property name=\"width_request\">80</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\" translatable=\"no\">label</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"width_chars\">12</property>\n                <property name=\"single_line_mode\">True</property>\n                <property name=\"max_width_chars\">12</property>\n                <property name=\"track_visited_links\">False</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">False</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkEventBox\" id=\"eventbox2\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"above_child\">True</property>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image_inline\">\n                        <property name=\"name\">50</property>\n                        <property name=\"width_request\">400</property>\n                        <property name=\"height_request\">50</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"valign\">start</property>\n                        <property name=\"margin_top\">5</property>\n                        <property name=\"stock\">gtk-missing-image</property>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"box3\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"spacing\">5</property>\n                    <child>\n                      <object class=\"GtkImage\" id=\"image_file_type\">\n                        <property name=\"name\">50</property>\n                        <property name=\"width_request\">30</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"halign\">start</property>\n                        <property name=\"icon_name\">image-x-generic-symbolic</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkLabel\" id=\"label_image_name\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"halign\">start</property>\n                        <property name=\"margin_top\">2</property>\n                        <property name=\"margin_bottom\">2</property>\n                        <property name=\"label\" translatable=\"no\">file_name.ext</property>\n                        <property name=\"ellipsize\">end</property>\n                        <property name=\"single_line_mode\">True</property>\n                        <property name=\"max_width_chars\">30</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkLabel\" id=\"label_image_size\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_left\">5</property>\n                        <property name=\"margin_right\">5</property>\n                        <property name=\"margin_top\">2</property>\n                        <property name=\"margin_bottom\">2</property>\n                        <property name=\"label\" translatable=\"no\">(0 Kb)</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">3</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkButton\" id=\"button_save_inline\">\n                        <property name=\"height_request\">20</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">True</property>\n                        <property name=\"receives_default\">True</property>\n                        <property name=\"halign\">center</property>\n                        <property name=\"valign\">center</property>\n                        <property name=\"always_show_image\">True</property>\n                        <signal name=\"clicked\" handler=\"save_image\" swapped=\"no\"/>\n                        <child>\n                          <object class=\"GtkImage\" id=\"image1\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"icon_name\">browser-download-symbolic</property>\n                          </object>\n                        </child>\n                        <style>\n                          <class name=\"btn-save-image\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">4</property>\n                      </packing>\n                    </child>\n                    <style>\n                      <class name=\"image-desc\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_timestamp\">\n                <property name=\"width_request\">70</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">end</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\" translatable=\"no\">00:00.00</property>\n                <property name=\"justify\">right</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"single_line_mode\">True</property>\n                <attributes>\n                  <attribute name=\"size\" value=\"9000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n  <object class=\"GtkImage\" id=\"image_save_inline\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"margin_right\">5</property>\n    <property name=\"pixel_size\">16</property>\n    <property name=\"icon_name\">document-save-symbolic</property>\n  </object>\n</interface>\n"
  },
  {
    "path": "res/ui/main-window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <object class=\"GtkAdjustment\" id=\"adjustment1\">\n    <property name=\"upper\">100</property>\n    <property name=\"step_increment\">1</property>\n    <property name=\"page_increment\">10</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image1\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">window-close-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image2\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">object-select-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image3\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">list-add-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image4\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">system-run-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image6\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">address-book-new-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image7\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">object-select-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image8\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"xpad\">5</property>\n    <property name=\"icon_name\">window-close-symbolic</property>\n  </object>\n  <object class=\"GtkImage\" id=\"image_user_status\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"resource\">/chat/tox/ricin/images/status/offline.png</property>\n  </object>\n  <template class=\"RicinMainWindow\" parent=\"GtkApplicationWindow\">\n    <property name=\"width_request\">922</property>\n    <property name=\"height_request\">500</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"events\">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>\n    <property name=\"window_position\">center</property>\n    <property name=\"default_width\">900</property>\n    <property name=\"default_height\">500</property>\n    <child>\n      <object class=\"GtkPaned\" id=\"paned1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">True</property>\n        <property name=\"position\">265</property>\n        <property name=\"position_set\">True</property>\n        <child>\n          <object class=\"GtkOverlay\" id=\"overlay1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box_left_side\">\n                <property name=\"width_request\">120</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"orientation\">vertical</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_user_profile\">\n                    <property name=\"height_request\">62</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box6\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkButton\" id=\"avatar_button\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"receives_default\">True</property>\n                            <property name=\"tooltip_text\" translatable=\"yes\">Change your avatar</property>\n                            <signal name=\"clicked\" handler=\"choose_avatar\" swapped=\"no\"/>\n                            <child>\n                              <object class=\"GtkImage\" id=\"avatar_image\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"pixel_size\">46</property>\n                                <property name=\"icon_name\">avatar-default</property>\n                              </object>\n                            </child>\n                            <style>\n                              <class name=\"button-dark\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_profile\">\n                            <property name=\"height_request\">62</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <child>\n                              <placeholder/>\n                            </child>\n                            <style>\n                              <class name=\"linked\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkButton\" id=\"button_user_status\">\n                            <property name=\"width_request\">25</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"sensitive\">False</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"receives_default\">True</property>\n                            <property name=\"tooltip_text\" translatable=\"yes\">Change your status</property>\n                            <property name=\"image\">image_user_status</property>\n                            <property name=\"focus_on_click\">False</property>\n                            <property name=\"always_show_image\">True</property>\n                            <signal name=\"clicked\" handler=\"cycle_user_status\" swapped=\"no\"/>\n                            <style>\n                              <class name=\"button-dark\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"pack_type\">end</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"user-infos\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <style>\n                      <class name=\"linked\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_search\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box12\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <child>\n                          <object class=\"GtkSearchEntry\" id=\"searchentry_friend\">\n                            <property name=\"height_request\">30</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"xalign\">0.10000000149011612</property>\n                            <property name=\"shadow_type\">out</property>\n                            <property name=\"caps_lock_warning\">False</property>\n                            <property name=\"primary_icon_name\">edit-find-symbolic</property>\n                            <property name=\"primary_icon_activatable\">False</property>\n                            <property name=\"primary_icon_sensitive\">False</property>\n                            <property name=\"placeholder_text\" translatable=\"yes\">Type to search...</property>\n                            <signal name=\"search-changed\" handler=\"friend_list_update_search\" swapped=\"no\"/>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkComboBoxText\" id=\"combobox_friend_filter\">\n                            <property name=\"width_request\">125</property>\n                            <property name=\"height_request\">31</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">end</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"box-search\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkRevealer\" id=\"revealer_friend_request\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_notify_friend_request\">\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"valign\">start</property>\n                        <property name=\"margin_top\">5</property>\n                        <property name=\"margin_bottom\">5</property>\n                        <property name=\"orientation\">vertical</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_friend_request_new\">\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_left\">10</property>\n                            <property name=\"margin_right\">10</property>\n                            <property name=\"margin_top\">5</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkImage\" id=\"image5\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"icon_name\">contact-new-symbolic</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"label\" translatable=\"yes\">You got a new friend request</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_friend_request_expand\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"relief\">none</property>\n                                <child>\n                                  <object class=\"GtkImage\" id=\"image_friend_request_expand\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"icon_name\">go-down-symbolic</property>\n                                  </object>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkRevealer\" id=\"revealer_friend_request_details\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box2\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <property name=\"spacing\">5</property>\n                                <child>\n                                  <object class=\"GtkBox\" id=\"box4\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"margin_left\">10</property>\n                                    <property name=\"margin_right\">10</property>\n                                    <property name=\"orientation\">vertical</property>\n                                    <child>\n                                      <object class=\"GtkLabel\" id=\"label_friend_request_pubkey\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"label\">label</property>\n                                        <property name=\"selectable\">True</property>\n                                        <property name=\"ellipsize\">end</property>\n                                        <property name=\"single_line_mode\">True</property>\n                                        <property name=\"max_width_chars\">25</property>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">0</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkLabel\" id=\"label_friend_request_message\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">False</property>\n                                        <property name=\"label\">label</property>\n                                        <property name=\"justify\">center</property>\n                                        <property name=\"wrap\">True</property>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">1</property>\n                                      </packing>\n                                    </child>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkBox\" id=\"box3\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"margin_left\">10</property>\n                                    <property name=\"margin_right\">10</property>\n                                    <property name=\"margin_bottom\">5</property>\n                                    <property name=\"spacing\">5</property>\n                                    <property name=\"homogeneous\">True</property>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_friend_request_cancel\">\n                                        <property name=\"label\" translatable=\"yes\">Decline</property>\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <property name=\"image\">image8</property>\n                                        <property name=\"always_show_image\">True</property>\n                                        <style>\n                                          <class name=\"button-dark\"/>\n                                        </style>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"pack_type\">end</property>\n                                        <property name=\"position\">0</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_friend_request_accept\">\n                                        <property name=\"label\" translatable=\"yes\">Accept</property>\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <property name=\"image\">image7</property>\n                                        <property name=\"always_show_image\">True</property>\n                                        <style>\n                                          <class name=\"button-dark\"/>\n                                        </style>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"pack_type\">end</property>\n                                        <property name=\"position\">1</property>\n                                      </packing>\n                                    </child>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">2</property>\n                                  </packing>\n                                </child>\n                              </object>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"friend-request\"/>\n                          <class name=\"background\"/>\n                          <class name=\"popover\"/>\n                        </style>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">2</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_friendlist\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <child>\n                      <object class=\"GtkScrolledWindow\" id=\"scrolledwindow3\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">True</property>\n                        <property name=\"hscrollbar_policy\">never</property>\n                        <child>\n                          <object class=\"GtkViewport\" id=\"viewport3\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"shadow_type\">etched-in</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box1\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <child>\n                                  <object class=\"GtkListBox\" id=\"grouplist\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <signal name=\"row-activated\" handler=\"show_friend_chatview\" swapped=\"no\"/>\n                                    <style>\n                                      <class name=\"friendlist\"/>\n                                      <class name=\"background\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkListBox\" id=\"friendlist\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <signal name=\"row-activated\" handler=\"show_friend_chatview\" swapped=\"no\"/>\n                                    <style>\n                                      <class name=\"friendlist\"/>\n                                      <class name=\"background\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                            </child>\n                          </object>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">True</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">3</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_bottom_buttons\">\n                    <property name=\"name\">friendlist-footer</property>\n                    <property name=\"height_request\">32</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"homogeneous\">True</property>\n                    <child>\n                      <object class=\"GtkButton\" id=\"button_add_friend_show\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">True</property>\n                        <property name=\"receives_default\">True</property>\n                        <property name=\"tooltip_text\" translatable=\"yes\">Add a friend</property>\n                        <property name=\"image\">image3</property>\n                        <property name=\"relief\">none</property>\n                        <property name=\"always_show_image\">True</property>\n                        <signal name=\"clicked\" handler=\"show_add_friend_popover\" swapped=\"no\"/>\n                        <style>\n                          <class name=\"button-dark\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkButton\" id=\"button_create_group\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">True</property>\n                        <property name=\"receives_default\">True</property>\n                        <property name=\"tooltip_text\" translatable=\"yes\">Create a new group chat</property>\n                        <property name=\"image\">image6</property>\n                        <property name=\"relief\">none</property>\n                        <property name=\"always_show_image\">True</property>\n                        <signal name=\"clicked\" handler=\"create_groupchat\" swapped=\"no\"/>\n                        <style>\n                          <class name=\"button-dark\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkButton\" id=\"button_settings\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">True</property>\n                        <property name=\"receives_default\">True</property>\n                        <property name=\"tooltip_text\" translatable=\"yes\">Settings</property>\n                        <property name=\"image\">image4</property>\n                        <property name=\"relief\">none</property>\n                        <property name=\"always_show_image\">True</property>\n                        <signal name=\"clicked\" handler=\"show_settings\" swapped=\"no\"/>\n                        <style>\n                          <class name=\"button-dark\"/>\n                        </style>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">2</property>\n                      </packing>\n                    </child>\n                    <style>\n                      <class name=\"user-infos\"/>\n                    </style>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">4</property>\n                  </packing>\n                </child>\n                <style>\n                  <class name=\"ricin-navigation\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"pass_through\">True</property>\n                <property name=\"index\">-1</property>\n              </packing>\n            </child>\n            <child type=\"overlay\">\n              <object class=\"GtkBox\" id=\"box_add_friend\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">end</property>\n                <child>\n                  <object class=\"GtkRevealer\" id=\"add_friend\">\n                    <property name=\"height_request\">0</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"resize_mode\">immediate</property>\n                    <property name=\"transition_type\">slide-up</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box8\">\n                        <property name=\"name\">add-friend-box</property>\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_add_error\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_top\">5</property>\n                            <property name=\"margin_bottom\">5</property>\n                            <property name=\"label\" translatable=\"yes\">Add a friend</property>\n                            <property name=\"ellipsize\">start</property>\n                            <attributes>\n                              <attribute name=\"size\" value=\"9000\"/>\n                            </attributes>\n                            <style>\n                              <class name=\"user-infos\"/>\n                              <class name=\"background-secondary\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkEntry\" id=\"entry_friend_id\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"margin_left\">10</property>\n                            <property name=\"margin_right\">10</property>\n                            <property name=\"max_width_chars\">76</property>\n                            <property name=\"shadow_type\">out</property>\n                            <property name=\"caps_lock_warning\">False</property>\n                            <property name=\"placeholder_text\" translatable=\"yes\">ToxID to add...</property>\n                            <style>\n                              <class name=\"entry-principal\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkScrolledWindow\" id=\"scrolledwindow2\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"margin_left\">10</property>\n                            <property name=\"margin_right\">10</property>\n                            <property name=\"shadow_type\">in</property>\n                            <property name=\"min_content_height\">100</property>\n                            <child>\n                              <object class=\"GtkViewport\" id=\"viewport2\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <child>\n                                  <object class=\"GtkTextView\" id=\"entry_friend_message\">\n                                    <property name=\"height_request\">100</property>\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"vadjustment\">adjustment1</property>\n                                    <property name=\"vscroll_policy\">natural</property>\n                                    <property name=\"left_margin\">5</property>\n                                    <property name=\"right_margin\">5</property>\n                                    <style>\n                                      <class name=\"entry-principal\"/>\n                                    </style>\n                                  </object>\n                                </child>\n                              </object>\n                            </child>\n                            <style>\n                              <class name=\"entry\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box9\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_left\">10</property>\n                            <property name=\"margin_right\">10</property>\n                            <property name=\"margin_bottom\">10</property>\n                            <property name=\"spacing\">5</property>\n                            <property name=\"baseline_position\">bottom</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_add_friend\">\n                                <property name=\"label\" translatable=\"yes\">Add friend</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image2</property>\n                                <property name=\"xalign\">0.50000035762786865</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"ui_add_friend\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"pack_type\">end</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_cancel_add\">\n                                <property name=\"label\" translatable=\"yes\">Cancel</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"image\">image1</property>\n                                <property name=\"always_show_image\">True</property>\n                                <signal name=\"clicked\" handler=\"hide_add_friend_popover\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"pack_type\">end</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">3</property>\n                          </packing>\n                        </child>\n                        <style>\n                          <class name=\"user-infos\"/>\n                        </style>\n                      </object>\n                    </child>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <style>\n                  <class name=\"background\"/>\n                  <class name=\"popover\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"pass_through\">True</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"resize\">True</property>\n            <property name=\"shrink\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkBox\" id=\"box_right_side\">\n            <property name=\"width_request\">630</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"orientation\">vertical</property>\n            <child>\n              <object class=\"GtkRevealer\" id=\"revealer_system_notify\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_system_notify\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"margin_top\">5</property>\n                    <property name=\"margin_bottom\">5</property>\n                    <property name=\"label\">notify</property>\n                    <property name=\"ellipsize\">start</property>\n                    <attributes>\n                      <attribute name=\"weight\" value=\"normal\"/>\n                      <attribute name=\"underline\" value=\"True\"/>\n                      <attribute name=\"size\" value=\"10000\"/>\n                    </attributes>\n                  </object>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkStack\" id=\"chat_stack\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <placeholder/>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"pack_type\">end</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <style>\n              <class name=\"ricin-content\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"resize\">True</property>\n            <property name=\"shrink\">True</property>\n          </packing>\n        </child>\n      </object>\n    </child>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"spacing\">10</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image_author\">\n                    <property name=\"width_request\">20</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"stock\">gtk-missing-image</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_name\">\n                    <property name=\"name\">username</property>\n                    <property name=\"width_request\">80</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"label\">label</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"width_chars\">12</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"max_width_chars\">12</property>\n                    <property name=\"track_visited_links\">False</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_message\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">start</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"label\">label</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"xalign\">0</property>\n                <property name=\"yalign\">0</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkStack\" id=\"stack\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">start</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_timestamp\">\n                    <property name=\"name\">timestamp</property>\n                    <property name=\"width_request\">70</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">end</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"label\">00:00.00</property>\n                    <property name=\"justify\">right</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"track_visited_links\">False</property>\n                    <attributes>\n                      <attribute name=\"size\" value=\"9000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"name\">timestamp</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkSpinner\" id=\"spinner_read\">\n                    <property name=\"name\">spinner</property>\n                    <property name=\"width_request\">70</property>\n                    <property name=\"height_request\">16</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">center</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"margin_top\">2</property>\n                    <property name=\"margin_bottom\">2</property>\n                    <property name=\"active\">True</property>\n                  </object>\n                  <packing>\n                    <property name=\"name\">spinner</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/password-dialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinPasswordDialog\" parent=\"GtkDialog\">\n    <property name=\"can_focus\">False</property>\n    <property name=\"type_hint\">dialog</property>\n    <child internal-child=\"vbox\">\n      <object class=\"GtkBox\" id=\"dialog-vbox1\">\n        <property name=\"can_focus\">False</property>\n        <property name=\"orientation\">vertical</property>\n        <property name=\"spacing\">2</property>\n        <child internal-child=\"action_area\">\n          <object class=\"GtkButtonBox\" id=\"dialog-action_area1\">\n            <property name=\"can_focus\">False</property>\n            <property name=\"layout_style\">end</property>\n            <child>\n              <object class=\"GtkButton\" id=\"button_accept\">\n                <property name=\"label\" translatable=\"yes\">Yes</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button_reject\">\n                <property name=\"label\" translatable=\"yes\">No</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">False</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"margin_left\">10</property>\n            <property name=\"margin_right\">10</property>\n            <property name=\"orientation\">vertical</property>\n            <property name=\"spacing\">5</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_title\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Remove password?</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                  <attribute name=\"size\" value=\"12000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_description\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"label\" translatable=\"yes\">Removing your password will unencrypt your profile, chat logs and settings. &lt;b&gt;Do you want to proceed anyway?&lt;/b&gt;</property>\n                <property name=\"use_markup\">True</property>\n                <property name=\"justify\">center</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"xalign\">0</property>\n                <property name=\"yalign\">0</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"spacing\">5</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_current_password\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"label\" translatable=\"yes\">Current password</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkEntry\" id=\"entry_current_password\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"visibility\">False</property>\n                    <property name=\"invisible_char\">●</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box4\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"spacing\">5</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_password\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"label\" translatable=\"yes\">New password</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkEntry\" id=\"entry_password\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"visibility\">False</property>\n                    <property name=\"invisible_char\">●</property>\n                    <signal name=\"changed\" handler=\"compute_strength\" swapped=\"no\"/>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box3\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"spacing\">5</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_password_confirm\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"label\" translatable=\"yes\">Confirm new password</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkEntry\" id=\"entry_password_confirm\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">True</property>\n                    <property name=\"visibility\">False</property>\n                    <property name=\"invisible_char\">●</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">4</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"box5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"spacing\">5</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_password_strength\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"label\" translatable=\"yes\">Password Strength</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLevelBar\" id=\"levelbar_password_strength\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"value\">0.25</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">True</property>\n                    <property name=\"fill\">True</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">5</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n      </object>\n    </child>\n  </template>\n  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">\n    <property name=\"mode\">both</property>\n    <property name=\"ignore_hidden\">True</property>\n    <widgets>\n      <widget name=\"label_current_password\"/>\n      <widget name=\"label_password\"/>\n      <widget name=\"label_password_confirm\"/>\n      <widget name=\"label_password_strength\"/>\n    </widgets>\n  </object>\n</interface>\n"
  },
  {
    "path": "res/ui/plain-label.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinPlainLabel\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_text\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">start</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"label\">label</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"wrap_mode\">word-char</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"xalign\">0</property>\n                <property name=\"yalign\">0</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n      <class name=\"plain-container\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/profile-chooser-window.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinProfileChooser\" parent=\"GtkApplicationWindow\">\n    <property name=\"can_focus\">False</property>\n    <property name=\"window_position\">center-always</property>\n    <child>\n      <object class=\"GtkNotebook\" id=\"notebook_switcher\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">True</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"orientation\">vertical</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_select_profile\">\n                <property name=\"width_request\">100</property>\n                <property name=\"height_request\">30</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Select a profile</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkComboBoxText\" id=\"combobox_profiles\">\n                <property name=\"width_request\">100</property>\n                <property name=\"height_request\">35</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkEntry\" id=\"entry_login_password\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <property name=\"visibility\">False</property>\n                <property name=\"invisible_char\">●</property>\n                <property name=\"placeholder_text\" translatable=\"yes\">Enter your password…</property>\n                <property name=\"input_purpose\">password</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button_login\">\n                <property name=\"label\" translatable=\"yes\">Log in</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">10</property>\n                <signal name=\"clicked\" handler=\"login\" swapped=\"no\"/>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Load a profile</property>\n          </object>\n          <packing>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkBox\" id=\"box2\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"orientation\">vertical</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_create_profile\">\n                <property name=\"height_request\">30</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"label\" translatable=\"yes\">Enter a name for the profile</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkEntry\" id=\"entry_register_name\">\n                <property name=\"height_request\">35</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <property name=\"input_purpose\">name</property>\n                <signal name=\"changed\" handler=\"reset_warning_label\" swapped=\"no\"/>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkEntry\" id=\"entry_register_password\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">5</property>\n                <property name=\"visibility\">False</property>\n                <property name=\"invisible_char\">●</property>\n                <property name=\"placeholder_text\" translatable=\"yes\">Enter your password…</property>\n                <property name=\"input_purpose\">password</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkButton\" id=\"button_register\">\n                <property name=\"label\" translatable=\"yes\">Create this profile</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">True</property>\n                <property name=\"receives_default\">True</property>\n                <property name=\"margin_left\">10</property>\n                <property name=\"margin_right\">10</property>\n                <property name=\"margin_top\">5</property>\n                <property name=\"margin_bottom\">10</property>\n                <signal name=\"clicked\" handler=\"register\" swapped=\"no\"/>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n          </object>\n          <packing>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label2\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Create a profile</property>\n          </object>\n          <packing>\n            <property name=\"position\">1</property>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <placeholder/>\n        </child>\n      </object>\n    </child>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/quote-label.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinQuoteLabel\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"halign\">start</property>\n            <property name=\"valign\">start</property>\n            <property name=\"margin_left\">5</property>\n            <property name=\"baseline_position\">top</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_quote\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\">quote</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"wrap_mode\">word-char</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"xalign\">0</property>\n                <property name=\"yalign\">0</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                  <attribute name=\"foreground\" value=\"#2e2ecccc7171\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n      <class name=\"quote-container\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/quote-message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinQuoteMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"spacing\">10</property>\n            <child>\n              <object class=\"GtkBox\" id=\"box2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkImage\" id=\"image_author\">\n                    <property name=\"width_request\">20</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"margin_left\">5</property>\n                    <property name=\"stock\">gtk-missing-image</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">0</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_name\">\n                    <property name=\"name\">username</property>\n                    <property name=\"width_request\">80</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">start</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"label\">label</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"width_chars\">12</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"max_width_chars\">12</property>\n                    <property name=\"track_visited_links\">False</property>\n                  </object>\n                  <packing>\n                    <property name=\"expand\">False</property>\n                    <property name=\"fill\">False</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkListBox\" id=\"listbox_quotes\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_left\">5</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"selection_mode\">none</property>\n                <property name=\"activate_on_single_click\">False</property>\n                <style>\n                  <class name=\"quotes-listbox\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkStack\" id=\"stack\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"valign\">start</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"label_timestamp\">\n                    <property name=\"name\">timestamp</property>\n                    <property name=\"width_request\">70</property>\n                    <property name=\"height_request\">20</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">end</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"label\">00:00.00</property>\n                    <property name=\"justify\">right</property>\n                    <property name=\"ellipsize\">end</property>\n                    <property name=\"single_line_mode\">True</property>\n                    <property name=\"track_visited_links\">False</property>\n                    <attributes>\n                      <attribute name=\"size\" value=\"9000\"/>\n                    </attributes>\n                  </object>\n                  <packing>\n                    <property name=\"name\">timestamp</property>\n                  </packing>\n                </child>\n                <child>\n                  <object class=\"GtkSpinner\" id=\"spinner_read\">\n                    <property name=\"name\">spinner</property>\n                    <property name=\"width_request\">70</property>\n                    <property name=\"height_request\">16</property>\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"halign\">center</property>\n                    <property name=\"valign\">start</property>\n                    <property name=\"margin_top\">2</property>\n                    <property name=\"margin_bottom\">2</property>\n                    <property name=\"active\">True</property>\n                  </object>\n                  <packing>\n                    <property name=\"name\">spinner</property>\n                    <property name=\"position\">1</property>\n                  </packing>\n                </child>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/settings-view.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <!-- interface-local-resource-path ../images/icons -->\n  <object class=\"GtkImage\" id=\"image1\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"icon_name\">view-refresh-symbolic</property>\n  </object>\n  <template class=\"RicinSettingsView\" parent=\"GtkBox\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box_tab_buttons\">\n        <property name=\"name\">settings-header</property>\n        <property name=\"height_request\">62</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"homogeneous\">True</property>\n        <child>\n          <placeholder/>\n        </child>\n        <style>\n          <class name=\"notebook-buttons\"/>\n          <class name=\"background\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkNotebook\" id=\"notebook_settings\">\n        <property name=\"name\">settings-content</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">True</property>\n        <property name=\"margin_left\">10</property>\n        <property name=\"margin_right\">10</property>\n        <property name=\"show_tabs\">False</property>\n        <property name=\"show_border\">False</property>\n        <child>\n          <object class=\"GtkScrolledWindow\" id=\"tab_general\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"margin_top\">10</property>\n            <property name=\"margin_bottom\">10</property>\n            <property name=\"hscrollbar_policy\">never</property>\n            <child>\n              <object class=\"GtkViewport\" id=\"viewport1\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_general_settings\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">10</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_tox_id\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"header_tox_id\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">5</property>\n                            <property name=\"homogeneous\">True</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_header_tox_id\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Your ToxID:&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_toxid_copy\">\n                                <property name=\"label\" translatable=\"yes\">Copy</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"valign\">start</property>\n                                <signal name=\"clicked\" handler=\"copy_toxid\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_toxid_change_nospam\">\n                                <property name=\"label\" translatable=\"yes\">Change NoSpam</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <signal name=\"clicked\" handler=\"change_nospam\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator4\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"margin_top\">10</property>\n                            <property name=\"margin_bottom\">10</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_tox_id\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"selectable\">True</property>\n                            <property name=\"ellipsize\">end</property>\n                            <attributes>\n                              <attribute name=\"size\" value=\"9000\"/>\n                            </attributes>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator1\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"margin_top\">2</property>\n                        <property name=\"margin_bottom\">2</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box24\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box25\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_password_add\">\n                                <property name=\"label\" translatable=\"yes\">Add password</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <signal name=\"clicked\" handler=\"add_password\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_password_change\">\n                                <property name=\"label\" translatable=\"yes\">Change password</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <signal name=\"clicked\" handler=\"change_password\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkButton\" id=\"button_password_remove\">\n                                <property name=\"label\" translatable=\"yes\">Remove password</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <signal name=\"clicked\" handler=\"remove_password\" swapped=\"no\"/>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator15\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">2</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box22\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_default_save_path\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"label\" translatable=\"yes\">Default save path:</property>\n                            <attributes>\n                              <attribute name=\"weight\" value=\"bold\"/>\n                            </attributes>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkEntry\" id=\"entry_default_save_path\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"editable\">False</property>\n                            <style>\n                              <class name=\"entry-inverted\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkButton\" id=\"button_set_default_save_path\">\n                            <property name=\"label\" translatable=\"yes\">Choose directory</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"receives_default\">True</property>\n                            <signal name=\"clicked\" handler=\"select_save_path\" swapped=\"no\"/>\n                            <style>\n                              <class name=\"button-dark\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">5</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <style>\n              <class name=\"secondary-background\"/>\n            </style>\n          </object>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label_tab_general\">\n            <property name=\"height_request\">42</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">General</property>\n          </object>\n          <packing>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkScrolledWindow\" id=\"tab_network\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"margin_top\">10</property>\n            <property name=\"margin_bottom\">10</property>\n            <property name=\"hscrollbar_policy\">never</property>\n            <child>\n              <object class=\"GtkViewport\" id=\"viewport2\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_network_settings\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">10</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_ipv6_udp\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_network_info\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"label\" translatable=\"yes\">Changing network settings will temporarily disconnect you from the Tox network</property>\n                            <attributes>\n                              <attribute name=\"foreground\" value=\"#efef29292929\"/>\n                              <attribute name=\"size\" value=\"9000\"/>\n                            </attributes>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator3\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_switchs\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_udp\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;UDP&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_udp_enabled\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSeparator\" id=\"separator9\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_ipv6\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;IPv6&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">3</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_ipv6_enabled\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">4</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator2\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_proxy\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box14\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_proxy\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Proxy (SOCKS 5)&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_proxy_enabled\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"valign\">start</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box_proxy_settings\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"spacing\">5</property>\n                            <child>\n                              <object class=\"GtkEntry\" id=\"entry_proxy_ip\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"max_length\">16</property>\n                                <property name=\"placeholder_text\">127.0.0.1</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label4\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"label\">:</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSpinButton\" id=\"spinbutton_proxy_port\">\n                                <property name=\"width_request\">140</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"placeholder_text\" translatable=\"yes\">9050</property>\n                                <property name=\"input_purpose\">digits</property>\n                                <property name=\"numeric\">True</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"value\">9050</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">2</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <style>\n              <class name=\"secondary-background\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label_tab_network\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Network</property>\n          </object>\n          <packing>\n            <property name=\"position\">1</property>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkScrolledWindow\" id=\"tab_interface\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"margin_top\">10</property>\n            <property name=\"margin_bottom\">10</property>\n            <property name=\"hscrollbar_policy\">never</property>\n            <child>\n              <object class=\"GtkViewport\" id=\"viewport3\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"shadow_type\">none</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_interface\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">10</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box9\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box5\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box7\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"spacing\">10</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_custom_themes\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"label\" translatable=\"yes\">&lt;b&gt;Enable custom themes?&lt;/b&gt;</property>\n                                    <property name=\"use_markup\">True</property>\n                                    <property name=\"justify\">fill</property>\n                                    <property name=\"wrap\">True</property>\n                                    <property name=\"wrap_mode\">word-char</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkSwitch\" id=\"switch_custom_themes\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"valign\">start</property>\n                                    <property name=\"active\">True</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box8\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"spacing\">10</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label5\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"label\" translatable=\"yes\">Theme:</property>\n                                    <property name=\"justify\">fill</property>\n                                    <property name=\"wrap\">True</property>\n                                    <property name=\"wrap_mode\">word-char</property>\n                                    <attributes>\n                                      <attribute name=\"weight\" value=\"bold\"/>\n                                    </attributes>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkComboBoxText\" id=\"combobox_selected_theme\">\n                                    <property name=\"width_request\">230</property>\n                                    <property name=\"height_request\">30</property>\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"opacity\">0.9882352941176471</property>\n                                    <property name=\"valign\">start</property>\n                                    <property name=\"active\">0</property>\n                                    <property name=\"button_sensitivity\">on</property>\n                                    <style>\n                                      <class name=\"button-dark\"/>\n                                      <class name=\"button-inverted\"/>\n                                      <class name=\"entry-inverted\"/>\n                                    </style>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkButton\" id=\"button_reload_theme\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"receives_default\">True</property>\n                                    <property name=\"tooltip_text\" translatable=\"yes\">Reload custom theme</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"valign\">start</property>\n                                    <property name=\"image\">image1</property>\n                                    <property name=\"always_show_image\">True</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">2</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box17\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_language\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Language:&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkComboBoxText\" id=\"combobox_languages\">\n                                <property name=\"width_request\">270</property>\n                                <property name=\"height_request\">30</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"opacity\">0.9882352941176471</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">0</property>\n                                <property name=\"button_sensitivity\">on</property>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                  <class name=\"entry-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">True</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator10\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">3</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box6\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_message_parsing_mode\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">Message parsing mode:</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                                <attributes>\n                                  <attribute name=\"weight\" value=\"bold\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkComboBoxText\" id=\"combobox_message_parsing_mode\">\n                                <property name=\"width_request\">270</property>\n                                <property name=\"height_request\">30</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"opacity\">0.9882352941176471</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">0</property>\n                                <property name=\"button_sensitivity\">on</property>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                  <class name=\"entry-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">4</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator13\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">5</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box18\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_emojis_conf\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">Emojis font and size:</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                                <attributes>\n                                  <attribute name=\"weight\" value=\"bold\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box27\">\n                                <property name=\"width_request\">270</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"orientation\">vertical</property>\n                                <property name=\"spacing\">5</property>\n                                <child>\n                                  <object class=\"GtkEntry\" id=\"entry_emoji_font\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"text\" translatable=\"yes\">EmojiOne</property>\n                                    <signal name=\"changed\" handler=\"update_emoji_font\" swapped=\"no\"/>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkBox\" id=\"box28\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"spacing\">5</property>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_emoji_size_small\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <signal name=\"clicked\" handler=\"change_emoji_size_small\" swapped=\"no\"/>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label1\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\">&lt;span face=\"EmojiOne\" size=\"small\" foreground=\"#e74c3c\" weight=\"heavy\"&gt;💙&lt;/span&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">0</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_emoji_size_medium\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <signal name=\"clicked\" handler=\"change_emoji_size_medium\" swapped=\"no\"/>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label2\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\">&lt;span face=\"EmojiOne\" size=\"medium\" foreground=\"#e74c3c\" weight=\"heavy\"&gt;💙&lt;/span&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">1</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_emoji_size_large\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <signal name=\"clicked\" handler=\"change_emoji_size_large\" swapped=\"no\"/>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label3\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\">&lt;span face=\"EmojiOne\" size=\"large\" foreground=\"#e74c3c\" weight=\"heavy\"&gt;💙&lt;/span&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">2</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_emoji_size_x_large\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <signal name=\"clicked\" handler=\"change_emoji_size_x_large\" swapped=\"no\"/>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label6\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\">&lt;span face=\"EmojiOne\" size=\"x-large\" foreground=\"#e74c3c\" weight=\"heavy\"&gt;💙&lt;/span&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">3</property>\n                                      </packing>\n                                    </child>\n                                    <child>\n                                      <object class=\"GtkButton\" id=\"button_emoji_size_xx_large\">\n                                        <property name=\"visible\">True</property>\n                                        <property name=\"can_focus\">True</property>\n                                        <property name=\"receives_default\">True</property>\n                                        <signal name=\"clicked\" handler=\"change_emoji_size_xx_large\" swapped=\"no\"/>\n                                        <child>\n                                          <object class=\"GtkLabel\" id=\"label7\">\n                                            <property name=\"visible\">True</property>\n                                            <property name=\"can_focus\">False</property>\n                                            <property name=\"label\">&lt;span face=\"EmojiOne\" size=\"xx-large\" foreground=\"#e74c3c\" weight=\"heavy\"&gt;💙&lt;/span&gt;</property>\n                                            <property name=\"use_markup\">True</property>\n                                          </object>\n                                        </child>\n                                      </object>\n                                      <packing>\n                                        <property name=\"expand\">False</property>\n                                        <property name=\"fill\">True</property>\n                                        <property name=\"position\">4</property>\n                                      </packing>\n                                    </child>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">6</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator7\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">8</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box10\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_custom_themes1\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Display friend's status changes?&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_status_changes\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">8</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box15\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box19\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"spacing\">10</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_unread_messages\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"label\" translatable=\"yes\">Display unread messages notice?</property>\n                                    <property name=\"justify\">fill</property>\n                                    <property name=\"wrap\">True</property>\n                                    <property name=\"wrap_mode\">word-char</property>\n                                    <attributes>\n                                      <attribute name=\"weight\" value=\"bold\"/>\n                                    </attributes>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkSwitch\" id=\"switch_unread_messages\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"valign\">start</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">10</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box20\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"orientation\">vertical</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box21\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"spacing\">10</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_display_typing_notifications\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"halign\">start</property>\n                                    <property name=\"label\" translatable=\"yes\">Display typing notifications?</property>\n                                    <property name=\"justify\">fill</property>\n                                    <property name=\"wrap\">True</property>\n                                    <property name=\"wrap_mode\">word-char</property>\n                                    <attributes>\n                                      <attribute name=\"weight\" value=\"bold\"/>\n                                    </attributes>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">True</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkSwitch\" id=\"switch_display_typing_notifications\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">True</property>\n                                    <property name=\"halign\">end</property>\n                                    <property name=\"valign\">start</property>\n                                    <property name=\"active\">True</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">False</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">10</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator8\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">11</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box23\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_compact_friendlist\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">Compact friend list?</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                                <attributes>\n                                  <attribute name=\"weight\" value=\"bold\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_compact_friendlist\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">12</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">4</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <style>\n              <class name=\"secondary-background\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"position\">2</property>\n          </packing>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label_tab_interface\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Interface</property>\n          </object>\n          <packing>\n            <property name=\"position\">2</property>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkScrolledWindow\" id=\"tab_notify\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"margin_top\">10</property>\n            <property name=\"margin_bottom\">10</property>\n            <property name=\"hscrollbar_policy\">never</property>\n            <child>\n              <object class=\"GtkViewport\" id=\"viewport5\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"shadow_type\">none</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box_interface1\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">10</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box4\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">10</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box26\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"tooltip_markup\" translatable=\"yes\">By enabling this option, &lt;b&gt;everytime you get a new message and the Ricin window is not focused&lt;/b&gt;, the Ricin's icon in your taskbar will blink, indicating unread message(s). Giving focus to Ricin will cancel this notification.</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_taskbar_notify\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Make the icon in taskbar to blink on new messages?&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_taskbar_notify\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box36\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"tooltip_markup\" translatable=\"yes\">By enabling this option you'll receive desktop notifications &lt;b&gt;everytime a contact goes Online or Offline&lt;/b&gt;. Away and Busy status won't trigger these notifications.</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_show_status_change_notifications\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">Show notifications when friends status changes?</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                                <attributes>\n                                  <attribute name=\"weight\" value=\"bold\"/>\n                                </attributes>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_show_status_change_notifications\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator17\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">3</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box16\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"tooltip_markup\" translatable=\"yes\">Enabling this will cause Ricin to tell &lt;b&gt;the person you talk to&lt;/b&gt; when you are typing.</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkLabel\" id=\"label_typing_notifications\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">start</property>\n                                <property name=\"label\" translatable=\"yes\">&lt;b&gt;Send typing notifications?&lt;/b&gt;</property>\n                                <property name=\"use_markup\">True</property>\n                                <property name=\"justify\">fill</property>\n                                <property name=\"wrap\">True</property>\n                                <property name=\"wrap_mode\">word-char</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkSwitch\" id=\"switch_typing_notifications\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"halign\">end</property>\n                                <property name=\"valign\">start</property>\n                                <property name=\"active\">True</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">4</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">4</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <style>\n              <class name=\"secondary-background\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"position\">3</property>\n          </packing>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label_tab_notify\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Notifications</property>\n          </object>\n          <packing>\n            <property name=\"position\">3</property>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkScrolledWindow\" id=\"tab_about\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"margin_top\">10</property>\n            <property name=\"margin_bottom\">10</property>\n            <property name=\"hscrollbar_policy\">never</property>\n            <child>\n              <object class=\"GtkViewport\" id=\"viewport4\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <child>\n                  <object class=\"GtkBox\" id=\"box2\">\n                    <property name=\"visible\">True</property>\n                    <property name=\"can_focus\">False</property>\n                    <property name=\"orientation\">vertical</property>\n                    <property name=\"spacing\">5</property>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box_about_page\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"valign\">start</property>\n                        <property name=\"orientation\">vertical</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box13\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"spacing\">10</property>\n                            <child>\n                              <object class=\"GtkImage\" id=\"image2\">\n                                <property name=\"width_request\">250</property>\n                                <property name=\"height_request\">78</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"resource\">/chat/tox/ricin/images/icons/ricin_logo.png</property>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">False</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">False</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box11\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <child>\n                              <object class=\"GtkBox\" id=\"box12\">\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">False</property>\n                                <property name=\"halign\">center</property>\n                                <property name=\"spacing\">5</property>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_v\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"label\" translatable=\"yes\">&lt;b&gt;Version:&lt;/b&gt;</property>\n                                    <property name=\"use_markup\">True</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">0</property>\n                                  </packing>\n                                </child>\n                                <child>\n                                  <object class=\"GtkLabel\" id=\"label_app_version\">\n                                    <property name=\"visible\">True</property>\n                                    <property name=\"can_focus\">False</property>\n                                    <property name=\"label\">&lt;i&gt;0.0.3-alpha&lt;/i&gt;</property>\n                                    <property name=\"use_markup\">True</property>\n                                    <property name=\"selectable\">True</property>\n                                  </object>\n                                  <packing>\n                                    <property name=\"expand\">True</property>\n                                    <property name=\"fill\">False</property>\n                                    <property name=\"position\">1</property>\n                                  </packing>\n                                </child>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">True</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkLabel\" id=\"label_app_description\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"label\" translatable=\"yes\">&lt;b&gt;Ricin&lt;/b&gt; aims to be a &lt;i&gt;secure, lightweight, hackable and fully-customizable&lt;/i&gt; chat client using the awesome and open-source &lt;b&gt;ToxCore&lt;/b&gt; library.</property>\n                            <property name=\"use_markup\">True</property>\n                            <property name=\"justify\">center</property>\n                            <property name=\"wrap\">True</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">2</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkSeparator\" id=\"separator6\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">3</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkBox\" id=\"box3\">\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">False</property>\n                            <property name=\"spacing\">5</property>\n                            <property name=\"homogeneous\">True</property>\n                            <child>\n                              <object class=\"GtkLinkButton\" id=\"linkbutton_github\">\n                                <property name=\"label\" translatable=\"yes\">GitHub</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"relief\">none</property>\n                                <property name=\"uri\">https://github.com/RicinApp/Ricin</property>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">0</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLinkButton\" id=\"linkbutton_issue\">\n                                <property name=\"label\" translatable=\"yes\">Report an issue</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"relief\">none</property>\n                                <property name=\"uri\">https://github.com/RicinApp/Ricin/issues</property>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">1</property>\n                              </packing>\n                            </child>\n                            <child>\n                              <object class=\"GtkLinkButton\" id=\"linkbutton_contributors\">\n                                <property name=\"label\" translatable=\"yes\">Contributors</property>\n                                <property name=\"visible\">True</property>\n                                <property name=\"can_focus\">True</property>\n                                <property name=\"receives_default\">True</property>\n                                <property name=\"relief\">none</property>\n                                <property name=\"uri\">https://github.com/RicinApp/Ricin/graphs/contributors</property>\n                                <style>\n                                  <class name=\"button-dark\"/>\n                                  <class name=\"button-inverted\"/>\n                                </style>\n                              </object>\n                              <packing>\n                                <property name=\"expand\">False</property>\n                                <property name=\"fill\">True</property>\n                                <property name=\"position\">2</property>\n                              </packing>\n                            </child>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">4</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">0</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkSeparator\" id=\"separator5\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">1</property>\n                      </packing>\n                    </child>\n                    <child>\n                      <object class=\"GtkBox\" id=\"box1\">\n                        <property name=\"visible\">True</property>\n                        <property name=\"can_focus\">False</property>\n                        <property name=\"halign\">center</property>\n                        <property name=\"spacing\">5</property>\n                        <child>\n                          <object class=\"GtkLinkButton\" id=\"linkbutton_license\">\n                            <property name=\"label\" translatable=\"yes\">License (GNU General Public License 3+)</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"receives_default\">True</property>\n                            <property name=\"halign\">center</property>\n                            <property name=\"relief\">none</property>\n                            <property name=\"uri\">https://github.com/RicinApp/Ricin/blob/master/LICENSE</property>\n                            <style>\n                              <class name=\"button-dark\"/>\n                              <class name=\"button-inverted\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">0</property>\n                          </packing>\n                        </child>\n                        <child>\n                          <object class=\"GtkLinkButton\" id=\"linkbutton_ricin_website\">\n                            <property name=\"label\" translatable=\"yes\">Ricin official website</property>\n                            <property name=\"visible\">True</property>\n                            <property name=\"can_focus\">True</property>\n                            <property name=\"receives_default\">True</property>\n                            <property name=\"relief\">none</property>\n                            <property name=\"uri\">https://ricin.im</property>\n                            <style>\n                              <class name=\"button-dark\"/>\n                              <class name=\"button-inverted\"/>\n                            </style>\n                          </object>\n                          <packing>\n                            <property name=\"expand\">False</property>\n                            <property name=\"fill\">True</property>\n                            <property name=\"position\">1</property>\n                          </packing>\n                        </child>\n                      </object>\n                      <packing>\n                        <property name=\"expand\">False</property>\n                        <property name=\"fill\">True</property>\n                        <property name=\"position\">2</property>\n                      </packing>\n                    </child>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <style>\n              <class name=\"secondary-background\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"position\">4</property>\n          </packing>\n        </child>\n        <child type=\"tab\">\n          <object class=\"GtkLabel\" id=\"label_tab_about\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">About</property>\n          </object>\n          <packing>\n            <property name=\"position\">4</property>\n            <property name=\"tab_fill\">False</property>\n          </packing>\n        </child>\n        <style>\n          <class name=\"settings\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">1</property>\n      </packing>\n    </child>\n  </template>\n  <object class=\"GtkListStore\" id=\"liststore1\">\n    <columns>\n      <!-- column-name server -->\n      <column type=\"gchararray\"/>\n    </columns>\n    <data>\n      <row>\n        <col id=\"0\" translatable=\"yes\">ricin.io (stable)</col>\n      </row>\n      <row>\n        <col id=\"0\" translatable=\"yes\">toxme.io</col>\n      </row>\n    </data>\n  </object>\n</interface>\n"
  },
  {
    "path": "res/ui/status-message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinStatusMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"height_request\">20</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <property name=\"activatable\">False</property>\n    <property name=\"selectable\">False</property>\n    <child>\n      <object class=\"GtkEventBox\" id=\"eventbox1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <child>\n          <object class=\"GtkBox\" id=\"box1\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_name\">\n                <property name=\"name\">username</property>\n                <property name=\"width_request\">80</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\">label</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"width_chars\">12</property>\n                <property name=\"single_line_mode\">True</property>\n                <property name=\"max_width_chars\">12</property>\n                <property name=\"track_visited_links\">False</property>\n                <attributes>\n                  <attribute name=\"weight\" value=\"bold\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">False</property>\n                <property name=\"position\">0</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkImage\" id=\"image_status\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"margin_right\">5</property>\n                <property name=\"resource\">/chat/tox/ricin/images/status/offline.png</property>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">1</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_message\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">start</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\">label</property>\n                <property name=\"justify\">fill</property>\n                <property name=\"wrap\">True</property>\n                <property name=\"wrap_mode\">char</property>\n                <property name=\"selectable\">True</property>\n                <style>\n                  <class name=\"status-info-message\"/>\n                </style>\n              </object>\n              <packing>\n                <property name=\"expand\">True</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">2</property>\n              </packing>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"label_timestamp\">\n                <property name=\"name\">timestamp</property>\n                <property name=\"width_request\">70</property>\n                <property name=\"height_request\">20</property>\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"halign\">end</property>\n                <property name=\"valign\">start</property>\n                <property name=\"label\">00:00.00</property>\n                <property name=\"justify\">right</property>\n                <property name=\"selectable\">True</property>\n                <property name=\"ellipsize\">end</property>\n                <property name=\"single_line_mode\">True</property>\n                <attributes>\n                  <attribute name=\"size\" value=\"9000\"/>\n                </attributes>\n              </object>\n              <packing>\n                <property name=\"expand\">False</property>\n                <property name=\"fill\">True</property>\n                <property name=\"position\">3</property>\n              </packing>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/system-message-list-row.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinSystemMessageListRow\" parent=\"GtkListBoxRow\">\n    <property name=\"width_request\">250</property>\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">True</property>\n    <property name=\"resize_mode\">immediate</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"margin_left\">5</property>\n        <property name=\"margin_right\">5</property>\n        <property name=\"spacing\">5</property>\n        <child>\n          <object class=\"GtkSeparator\" id=\"separator1\">\n            <property name=\"height_request\">10</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"valign\">center</property>\n            <property name=\"vexpand\">True</property>\n            <style>\n              <class name=\"info-message\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkLabel\" id=\"label_message\">\n            <property name=\"name\">info_message</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"halign\">center</property>\n            <property name=\"margin_left\">5</property>\n            <property name=\"margin_right\">5</property>\n            <property name=\"label\">label</property>\n            <property name=\"justify\">center</property>\n            <property name=\"wrap\">True</property>\n            <property name=\"wrap_mode\">word-char</property>\n            <property name=\"selectable\">True</property>\n            <property name=\"xalign\">0</property>\n            <property name=\"yalign\">0</property>\n            <attributes>\n              <attribute name=\"weight\" value=\"semibold\"/>\n            </attributes>\n            <style>\n              <class name=\"info-message\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkSeparator\" id=\"separator2\">\n            <property name=\"height_request\">10</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"valign\">center</property>\n            <property name=\"vexpand\">True</property>\n            <style>\n              <class name=\"info-message\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">2</property>\n          </packing>\n        </child>\n      </object>\n    </child>\n    <style>\n      <class name=\"message\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "res/ui/welcome-view.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with glade 3.19.0 -->\n<interface>\n  <requires lib=\"gtk+\" version=\"3.16\"/>\n  <template class=\"RicinWelcomeView\" parent=\"GtkBox\">\n    <property name=\"visible\">True</property>\n    <property name=\"can_focus\">False</property>\n    <property name=\"orientation\">vertical</property>\n    <child>\n      <object class=\"GtkBox\" id=\"box_tab_buttons\">\n        <property name=\"height_request\">62</property>\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"spacing\">10</property>\n        <child>\n          <object class=\"GtkLabel\" id=\"label_home_notice\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n          </object>\n          <packing>\n            <property name=\"expand\">True</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkButton\" id=\"button_home_settings\">\n            <property name=\"width_request\">62</property>\n            <property name=\"height_request\">62</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">True</property>\n            <property name=\"receives_default\">True</property>\n            <property name=\"relief\">none</property>\n            <signal name=\"clicked\" handler=\"show_settings\" swapped=\"no\"/>\n            <child>\n              <object class=\"GtkImage\" id=\"image_button_home_settings\">\n                <property name=\"visible\">True</property>\n                <property name=\"can_focus\">False</property>\n                <property name=\"pixel_size\">24</property>\n                <property name=\"icon_name\">system-run-symbolic</property>\n              </object>\n            </child>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n        <style>\n          <class name=\"notebook-buttons\"/>\n        </style>\n      </object>\n      <packing>\n        <property name=\"expand\">False</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">0</property>\n      </packing>\n    </child>\n    <child>\n      <object class=\"GtkBox\" id=\"box1\">\n        <property name=\"visible\">True</property>\n        <property name=\"can_focus\">False</property>\n        <property name=\"valign\">center</property>\n        <property name=\"orientation\">vertical</property>\n        <property name=\"spacing\">10</property>\n        <child>\n          <object class=\"GtkImage\" id=\"image_app_icon\">\n            <property name=\"width_request\">48</property>\n            <property name=\"height_request\">48</property>\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"halign\">center</property>\n            <property name=\"valign\">center</property>\n            <property name=\"resource\">/chat/tox/ricin/images/icons/Ricin-48x48.png</property>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">0</property>\n          </packing>\n        </child>\n        <child>\n          <object class=\"GtkLabel\" id=\"label_start\">\n            <property name=\"visible\">True</property>\n            <property name=\"can_focus\">False</property>\n            <property name=\"label\" translatable=\"yes\">Select a chat to start messaging.</property>\n            <style>\n              <class name=\"settings\"/>\n            </style>\n          </object>\n          <packing>\n            <property name=\"expand\">False</property>\n            <property name=\"fill\">True</property>\n            <property name=\"position\">1</property>\n          </packing>\n        </child>\n      </object>\n      <packing>\n        <property name=\"expand\">True</property>\n        <property name=\"fill\">True</property>\n        <property name=\"position\">1</property>\n      </packing>\n    </child>\n    <style>\n      <class name=\"secondary-background\"/>\n    </style>\n  </template>\n</interface>\n"
  },
  {
    "path": "src/ChatView.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/chat-view.ui\")]\nclass Ricin.ChatView : Gtk.Box {\n  [GtkChild] Gtk.Image user_avatar;\n  [GtkChild] Gtk.Label username;\n  [GtkChild] Gtk.Label status_message;\n  [GtkChild] Gtk.ScrolledWindow scroll_messages;\n  [GtkChild] Gtk.ListBox messages_list;\n  [GtkChild] public Gtk.Entry entry;\n  [GtkChild] Gtk.Button send;\n  [GtkChild] Gtk.Button send_file;\n  [GtkChild] Gtk.Button button_audio_call;\n  [GtkChild] Gtk.Button button_video_call;\n\n  /* Markdown help popover */\n  [GtkChild] Gtk.Box box_popover_markdown_help;\n  [GtkChild] Gtk.Button button_show_markdown_help;\n  Gtk.Popover popover_markdown_help;\n\n  /* Emoticons popover */\n  [GtkChild] Gtk.Box box_popover_emoticons;\n  [GtkChild] Gtk.Button button_show_emoticons;\n  Gtk.Popover popover_emoticons;\n\n  /* Friend's typing */\n  [GtkChild] Gtk.Revealer friend_typing;\n  [GtkChild] Gtk.Label label_friend_is_typing;\n\n  /* Friend menu toggle */\n  [GtkChild] Gtk.Button button_toggle_friend_menu;\n  [GtkChild] Gtk.Revealer revealer_friend_menu;\n\n  /* Friend menu sidebar */\n  [GtkChild] Gtk.Image friend_profil_avatar;\n  [GtkChild] Gtk.Image image_friend_status;\n  [GtkChild] Gtk.Label label_friend_profil_name;\n  [GtkChild] Gtk.Label label_friend_profile_status_message;\n  [GtkChild] Gtk.Label label_friend_last_seen;\n  [GtkChild] Gtk.Button button_friend_copy_toxid;\n  [GtkChild] Gtk.Button button_friend_block;\n  [GtkChild] Gtk.Button button_friend_delete;\n\n  [Signal (action = true)] private signal void copy_messages_selection ();\n  [Signal (action = true)] private signal void quote_messages_selection ();\n  [Signal (action = true)] private signal void entry_insert_newline ();\n\n  public Tox.Friend fr;\n  private weak Tox.Tox handle;\n  private weak Gtk.Stack stack;\n  private string view_name;\n  private HistoryManager history;\n  private Settings settings;\n\n  private Tox.UserStatus last_status;\n  private string last_message_sender { get; set; default = \"ricin\"; }\n  private string last_message = null;\n  private bool is_bottom = true;\n  private ViewType view_type;\n\n  private enum ViewType {\n    FULL,\n    COMPACT\n  }\n\n  public ChatView (Tox.Tox handle, Tox.Friend fr, Gtk.Stack stack, string view_name) {\n    this.handle = handle;\n    this.fr = fr;\n    this.stack = stack;\n    this.view_name = view_name;\n    this.history = new HistoryManager (this.fr.pubkey);\n    this.settings = Settings.instance;\n\n    this.init_widgets ();\n    this.init_signals ();\n    this.init_messages_menu ();\n    this.init_messages_shortcuts ();\n    this.init_popovers ();\n  }\n\n  private void init_widgets () {\n    this.label_friend_profil_name.set_markup (Util.render_emojis (this.fr.get_uname ()));\n    this.label_friend_profile_status_message.set_markup (Util.render_litemd (this.fr.get_ustatus_message ()));\n    this.username.set_markup (Util.render_emojis (this.fr.get_uname ()));\n    this.status_message.set_markup (Util.render_litemd (this.fr.get_ustatus_message ()));\n\n    this.user_avatar.pixbuf = Util.pubkey_to_image(this.fr.pubkey, 48, 48);;\n    this.friend_profil_avatar.pixbuf = Util.pubkey_to_image(this.fr.pubkey, 128, 128);\n    this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n  }\n  \n  private void init_signals () {\n    this.entry.paste_clipboard.connect (this.paste_clipboard);\n\n    this.entry.key_press_event.connect ((event) => {\n      if (event.keyval == Gdk.Key.Up && this.entry.get_text () == \"\" && this.last_message != null) {\n        this.entry.set_text (this.last_message);\n        this.entry.set_position (-1);\n        return true;\n      } else if (event.keyval == Gdk.Key.Down && this.entry.get_text () == this.last_message) {\n        this.entry.set_text (\"\");\n      }\n      return false;\n    });\n\n    this.entry.changed.connect (() => {\n      if (this.settings.send_typing_status == false) return;\n\n      var is_typing = (this.entry.text.strip () != \"\");\n      this.fr.send_typing (is_typing);\n    });\n\n    this.entry.backspace.connect (() => {\n      if (this.settings.send_typing_status == false) return;\n\n      var is_typing = (this.entry.text.strip () != \"\");\n      this.fr.send_typing (is_typing);\n    });\n\n    this.fr.bind_property (\"connected\", this.entry, \"sensitive\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"connected\", this.send, \"sensitive\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"connected\", this.send_file, \"sensitive\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"connected\", this.button_show_emoticons, \"sensitive\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"connected\", this.button_show_markdown_help, \"sensitive\", BindingFlags.DEFAULT);\n    //this.fr.bind_property (\"name\", this.username, \"label\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"status-message\", this.status_message, \"label\", BindingFlags.DEFAULT);\n    //this.fr.bind_property (\"name\", this.label_friend_profil_name, \"label\", BindingFlags.DEFAULT);\n    this.fr.bind_property (\"status-message\", this.label_friend_profile_status_message, \"label\", BindingFlags.DEFAULT);\n\n    this.fr.avatar.connect ((pixbuf) => {\n      this.user_avatar.pixbuf = Util.pubkey_to_image (this.fr.pubkey, 48, 48);\n      this.friend_profil_avatar.pixbuf = Util.pubkey_to_image (this.fr.pubkey, 128, 128);\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n    });\n\n    this.fr.notify[\"typing\"].connect ((obj, prop) => {\n      if (this.settings.show_typing_status == false) return;\n\n      string friend_name = Util.escape_html (this.fr.name);\n      this.label_friend_is_typing.set_markup (@\"<i>$friend_name \" + _(\"is typing\") + \"</i>\");\n      this.friend_typing.reveal_child = this.fr.typing;\n    });\n\n    this.fr.notify[\"name\"].connect ((obj, prop) => {\n      this.label_friend_profil_name.set_markup (Util.render_emojis (this.fr.get_uname ()));\n      this.username.set_markup (Util.render_emojis (this.fr.get_uname ()));\n    });\n\n    this.fr.notify[\"status-message\"].connect ((obj, prop) => {\n      string markup = Util.add_markup (this.fr.status_message);\n      this.status_message.set_markup (markup);\n      this.label_friend_profile_status_message.set_markup (markup);\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n    });\n\n    this.fr.notify[\"status\"].connect ((obj, prop) => {\n      var icon = Util.status_to_icon (this.fr.status, 0);\n      this.image_friend_status.set_from_resource (@\"/chat/tox/ricin/images/status/$icon.png\");\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n\n      if (this.fr.last_status != this.fr.status && this.settings.show_status_changes) {\n        this.last_message_sender = \"friend\";\n        this.messages_list.add (new StatusMessageListRow (\n          fr.name + _(\" is now \") + Util.status_to_string (this.fr.status), this.fr.status)\n        );\n      }\n      this.fr.last_status = this.fr.status;\n    });\n    \n    this.fr.file_transfer.connect ((name, size, id) => {\n      string downloads = Environment.get_user_special_dir (UserDirectory.DOWNLOAD) + \"/\";\n      string filename = name;\n      int i = 0;\n\n      while (FileUtils.test (downloads + filename, FileTest.EXISTS)) {\n        filename = @\"$(++i)-$name\";\n      }\n\n      this.history.write (this.fr.pubkey, @\"[$(time ())] ** $(this.fr.name) sent you a file: $filename\");\n      string path = @\"/tmp/$filename\";\n\n      this.last_message_sender = \"friend\";\n      FileListRow file_row = new FileListRow (this.handle, this.fr, id, this.fr.name, path, size, time ());\n      file_row.accept_file.connect ((response, file_id) => {\n        this.fr.reply_file_transfer (response, file_id);\n      });\n      this.messages_list.add (file_row);\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n    \n    this.fr.action.connect ((message) => {\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n\n      this.history.write (this.fr.pubkey, @\"[$(time ())] ** $(this.fr.name) $message\");\n      string message_escaped = @\"<b>$(Util.escape_html(fr.name))</b> $(Util.escape_html(message))\";\n      this.last_message_sender = \"friend\";\n      this.messages_list.add (new SystemMessageListRow (message_escaped));\n\n      var visible_child = this.stack.get_visible_child_name ();\n      if (visible_child != this.view_name && this.handle.status != Tox.UserStatus.BUSY) {\n        Gdk.Pixbuf pixbuf = Util.pubkey_to_image (this.fr.pubkey, 46, 46);\n        Notification.notify (this.fr.name, message, 5000, pixbuf);\n      }\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n    \n    this.fr.message.connect ((message) => {\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n      bool is_child = (this.last_message_sender == \"friend\");\n\n      if (message.index_of (\">\", 0) == 0) {\n        string markup = Util.add_markup (message);\n        this.last_message_sender = \"friend\";\n        this.messages_list.add (new QuoteMessageListRow (this.handle, this.fr, markup, time (), -1, is_child));\n      } else {\n        this.history.write (this.fr.pubkey, @\"[$(time ())] [$(this.fr.name)] $message\");\n        this.last_message_sender = \"friend\";\n        this.messages_list.add (new MessageListRow (this.handle, this.fr, Util.add_markup (message), time (), -1, is_child));\n      }\n\n      var visible_child = this.stack.get_visible_child_name ();\n      if (visible_child != this.view_name && this.handle.status != Tox.UserStatus.BUSY) {\n        Gdk.Pixbuf pixbuf = Util.pubkey_to_image (this.fr.pubkey, 46, 46);\n        Notification.notify (this.fr.name, message, 5000, pixbuf);\n      }\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n\n    this.fr.friend_info.connect ((message) => {\n      this.last_message_sender = \"friend\";\n      this.messages_list.add (new SystemMessageListRow (message));\n      this.label_friend_last_seen.set_markup (this.fr.last_online (\"%H:%M %d/%m/%Y\"));\n    });\n\n    this.handle.global_info.connect ((message) => {\n      this.last_message_sender = \"friend\";\n      this.messages_list.add (new SystemMessageListRow (message));\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n  }\n\n  public void init_messages_menu () {\n    Gtk.Menu menu = new Gtk.Menu ();\n\n    Gtk.ImageMenuItem menu_copy_selection = new Gtk.ImageMenuItem.with_label (_(\"Copy selection in clipboard\"));\n    Gtk.AccelLabel label_copy_selection = ((Gtk.AccelLabel) menu_copy_selection.get_child ());\n    label_copy_selection.set_accel (Gdk.keyval_from_name(\"C\"), Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK);\n    menu_copy_selection.always_show_image = true;\n    menu_copy_selection.set_image (new Gtk.Image.from_icon_name (\"edit-copy-symbolic\", Gtk.IconSize.MENU));\n\n    Gtk.ImageMenuItem menu_copy_quote = new Gtk.ImageMenuItem.with_label (_(\"Copy quote in clipboard\"));\n    menu_copy_quote.always_show_image = true;\n    menu_copy_quote.set_image (new Gtk.Image.from_icon_name (\"edit-copy-symbolic\", Gtk.IconSize.MENU));\n\n    Gtk.ImageMenuItem menu_quote_selection = new Gtk.ImageMenuItem.with_label (_(\"Quote selection\"));\n    Gtk.AccelLabel label_quote_selection = ((Gtk.AccelLabel) menu_quote_selection.get_child ());\n    label_quote_selection.set_accel (Gdk.keyval_from_name(\"Q\"), Gdk.ModifierType.SHIFT_MASK);\n    menu_quote_selection.always_show_image = true;\n    menu_quote_selection.set_image (new Gtk.Image.from_icon_name (\"insert-text-symbolic\", Gtk.IconSize.MENU));\n\n    Gtk.ImageMenuItem menu_remove_selection = new Gtk.ImageMenuItem.with_label (_(\"Delete selected messages\"));\n    menu_remove_selection.always_show_image = true;\n    menu_remove_selection.set_image (new Gtk.Image.from_icon_name (\"edit-clear-symbolic\", Gtk.IconSize.MENU));\n\n    Gtk.ImageMenuItem menu_clear_chat = new Gtk.ImageMenuItem.with_label (_(\"Clear conversation\"));\n    menu_clear_chat.always_show_image = true;\n    menu_clear_chat.set_image (new Gtk.Image.from_icon_name (\"edit-clear-all-symbolic\", Gtk.IconSize.MENU));\n\n    menu_copy_selection.activate.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string selection = this.get_selected_messages (false, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (selection, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    menu_copy_quote.activate.connect (() => {\n      if (this.messages_selected () == false) return;\n\n      string quote = this.get_selected_messages (true, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (quote, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    menu_quote_selection.activate.connect (() => {\n      if (this.messages_selected () == false) return;\n\n      string quote = this.get_selected_messages (true, false);\n      this.entry.set_text (quote);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    menu_remove_selection.activate.connect (() => {\n      if (this.messages_selected () == false) return;\n\n      List<weak Gtk.Widget> childs = this.messages_list.get_selected_rows ();\n      foreach (Gtk.Widget m in childs) {\n        this.messages_list.remove (m);\n      }\n    });\n\n    menu_clear_chat.activate.connect(this.clear);\n\n    menu.append (menu_copy_selection);\n    menu.append (menu_copy_quote);\n    menu.append (menu_quote_selection);\n    menu.append (new Gtk.SeparatorMenuItem ());\n    menu.append (menu_remove_selection);\n    menu.append (menu_clear_chat);\n    menu.show_all ();\n\n    this.messages_list.button_press_event.connect ((e) => {\n      // Only allow messages operations if some messages are selected.\n      if (this.messages_list.get_selected_rows ().length () < 1) {\n        menu_copy_quote.sensitive = false;\n        menu_copy_selection.sensitive = false;\n        menu_quote_selection.sensitive = false;\n        menu_remove_selection.sensitive = false;\n      } else {\n        menu_copy_quote.sensitive = true;\n        menu_copy_selection.sensitive = true;\n        menu_quote_selection.sensitive = true;\n        menu_remove_selection.sensitive = true;\n      }\n\n      // Only allow chatview to be cleared if it contains messages.\n      if (this.messages_list.get_children ().length () < 1) {\n        menu_clear_chat.sensitive = false;\n      } else {\n        menu_clear_chat.sensitive = true;\n      }\n\n      // If the event was a right click.\n      if (e.button != 3) {\n        return false;\n      }\n\n      menu.popup (null, null, null, 3, Gtk.get_current_event_time ());\n      return true;\n    });\n  }\n\n  private void init_messages_shortcuts () {\n    /**\n    * Shortcut for Ctrl+Shift+C: Copy selected messages if selection > 0\n    **/\n    this.add_accelerator (\n      \"copy-messages-selection\", MainWindow.accel_group, Gdk.keyval_from_name(\"C\"),\n      Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.copy_messages_selection.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string selection = this.get_selected_messages (false, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (selection, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    /**\n    * Shortcut for Ctrl+Shift+Q: Quote selected messages if selection > 0\n    **/\n    this.add_accelerator (\n      \"quote-messages-selection\", MainWindow.accel_group, Gdk.keyval_from_name(\"Q\"),\n      Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.quote_messages_selection.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string quote = this.get_selected_messages (true, false);\n      this.entry.set_text (quote);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    /**\n    * Shortcut for Shift+Enter in this.entry: Add a newline (\\n).\n    **/\n    this.add_accelerator (\n      \"entry-insert-newline\", MainWindow.accel_group, Gdk.Key.Return,\n      Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.entry_insert_newline.connect (() => {\n      debug (\"entry_insert_newline: Called.\");\n\n      int cursor_position = this.entry.get_position ();\n      string text = this.entry.get_text ();\n      string newline = \"\\n\";\n\n      this.entry.insert_at_cursor (newline);\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (cursor_position + newline.length);\n\n    });\n  }\n  \n  private void init_popovers () {\n    this.popover_markdown_help = new Gtk.Popover (this.button_show_markdown_help);\n    this.popover_markdown_help.set_size_request (250, 150);\n    this.popover_markdown_help.set_position (Gtk.PositionType.BOTTOM | Gtk.PositionType.RIGHT);\n    this.popover_markdown_help.set_modal (false);\n    this.popover_markdown_help.set_transitions_enabled (true);\n    this.popover_markdown_help.add (this.box_popover_markdown_help);\n    this.popover_markdown_help.closed.connect (() => {\n      this.entry.grab_focus_without_selecting ();\n    });\n\n    this.button_show_markdown_help.clicked.connect (() => {\n      if (this.popover_markdown_help.visible == false) {\n        this.popover_markdown_help.show_all ();\n      } else {\n        this.popover_markdown_help.hide ();\n      }\n\n      // Avoid the user to loose focus with chat entry.\n      this.entry.grab_focus_without_selecting ();\n    });\n\n    this.popover_emoticons = new Gtk.Popover (this.button_show_emoticons);\n    this.popover_emoticons.set_size_request (250, 150);\n    this.popover_emoticons.set_position (Gtk.PositionType.TOP | Gtk.PositionType.LEFT);\n    this.popover_emoticons.set_modal (false);\n    this.popover_emoticons.set_transitions_enabled (true);\n    this.popover_emoticons.add (this.box_popover_emoticons);\n    this.popover_emoticons.closed.connect (() => {\n      this.entry.grab_focus_without_selecting ();\n    });\n\n    this.button_show_emoticons.clicked.connect (() => {\n      if (this.popover_emoticons.visible == false) {\n        this.popover_emoticons.show_all ();\n      } else {\n        this.popover_emoticons.hide ();\n      }\n\n      // Avoid the user to loose focus with chat entry.\n      this.entry.grab_focus_without_selecting ();\n    });\n  }\n\n  private string time () {\n    return new DateTime.now_local ().format (\"%H:%M:%S %p\");\n  }\n\n  private bool messages_selected () {\n    return (this.messages_list.get_selected_rows ().length () > 0);\n  }\n\n  private string get_selected_messages (bool as_quote, bool include_names) {\n    StringBuilder sb = new StringBuilder ();\n    foreach (Gtk.ListBoxRow item in this.messages_list.get_selected_rows ()) {\n      string name = \"\";\n      string txt = \"\";\n\n      if (item is MessageListRow) {\n        name = \"[\" + ((MessageListRow) item).author + \"]\";\n        txt  = ((MessageListRow) item).label_message.get_text ();\n      } else if (item is SystemMessageListRow) {\n        name = \"* \";\n        txt  = ((SystemMessageListRow) item).label_message.get_text ();\n      } else if (item is QuoteMessageListRow) {\n        name = \"[\" + ((QuoteMessageListRow) item).author + \"]\";\n        txt  = ((QuoteMessageListRow) item).get_quote ();\n      }\n\n      if (as_quote) {\n        sb.append_c ('>');\n      }\n      if (include_names) {\n        sb.append (@\"$name \");\n      }\n\n      sb.append (txt);\n      sb.append_c ('\\n');\n    }\n\n    sb.truncate (sb.len - 1);\n    return (string) sb.data;\n  }\n\n  private void clear () {\n    List<weak Gtk.Widget> childs = this.messages_list.get_children ();\n    foreach (Gtk.Widget m in childs) {\n      this.messages_list.remove (m);\n    }\n  }\n\n  public void paste_clipboard () {\n    Gtk.Clipboard clipboard = Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD);\n    Gdk.Pixbuf image = clipboard.wait_for_image ();\n\n    Rand rnd = new Rand.with_seed ((uint32)new DateTime.now_local ().hash ());\n    uint32 rnd_id = rnd.next_int ();\n    string image_name = @\"ricin-$rnd_id.png\";\n\n    if (image != null) { // Cool, the content is an image, let's send it to our friend!\n      uint32 file_id = this.fr.send_image (image, image_name);\n\n      // Finally, add the inline image to the ChatView\n      var image_widget = new FileListRow (\n        this.handle, this.fr, file_id, this.handle.username,\n        \"\", image.get_byte_length (), time (), false, image, image_name\n      );\n      messages_list.add (image_widget);\n    }\n  }\n\n  [GtkCallback]\n  public void toggle_friend_menu () {\n    this.revealer_friend_menu.set_reveal_child (!this.revealer_friend_menu.child_revealed);\n    this.entry.grab_focus_without_selecting ();\n  }\n\n  [GtkCallback]\n  private void delete_friend () {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    main_window.remove_friend (this.fr);\n  }\n\n  [GtkCallback]\n  public void block_friend () {\n    this.fr.blocked = !this.fr.blocked;\n    if (this.fr.blocked) {\n      this.button_friend_block.label = _(\"Unblock\");\n    } else {\n      this.button_friend_block.label = _(\"Block\");\n    }\n  }\n\n  [GtkCallback]\n  private void copy_friend_toxid () {\n    Gtk.Clipboard\n    .get (Gdk.SELECTION_CLIPBOARD)\n    .set_text (this.fr.pubkey, -1);\n  }\n\n  [GtkCallback]\n  private void send_message () {\n    var current_time = time ();\n    var user = this.handle.username;\n    string markup;\n\n    var message = this.entry.get_text ();\n    if (message.strip () == \"\") {\n      return;\n    } else if (message.strip () == \"/clear\") {\n      this.clear ();\n\n      this.entry.text = \"\";\n      return;\n    }\n    this.last_message = message;\n\n    var is_child = (this.last_message_sender == \"ricin\");\n    if (message.has_prefix (\"/me \")) {\n      var action = message.substring (4);\n      debug (@\"action=$action\");\n      var escaped = Util.escape_html (action);\n      debug (@\"escaped=$escaped\\nuser=$user\");\n      markup = @\"<b>$user</b> $escaped\";\n\n      this.history.write (this.fr.pubkey, @\"[$current_time] ** $(this.handle.username) $action\");\n      messages_list.add (new SystemMessageListRow (markup));\n      fr.send_action (action);\n    } else if (message.index_of (\">\", 0) == 0) {\n      markup = Util.add_markup (message);\n      uint32 message_id = fr.send_message (message);\n      messages_list.add (new QuoteMessageListRow (this.handle, null, markup, time (), message_id, is_child));\n    } else {\n      markup = Util.add_markup (message);\n\n      this.history.write (this.fr.pubkey, @\"[$current_time] [$(this.handle.username)] $message\");\n      uint32 message_id = fr.send_message (message);\n      messages_list.add (new MessageListRow (this.handle, null, markup, time (), message_id, is_child));\n    }\n\n    // clear the entry\n    this.entry.text = \"\";\n    this.last_message_sender = \"ricin\";\n  }\n\n  [GtkCallback]\n  private void choose_file_to_send () {\n    var chooser = new Gtk.FileChooserDialog (_(\"Choose a file\"), null, Gtk.FileChooserAction.OPEN,\n        _(\"_Cancel\"), Gtk.ResponseType.CANCEL,\n        _(\"_Open\"), Gtk.ResponseType.ACCEPT);\n    if (chooser.run () == Gtk.ResponseType.ACCEPT) {\n      var current_time = time ();\n      var filename = chooser.get_filename ();\n\n      File file = File.new_for_path (filename);\n      FileInfo info = file.query_info (\"standard::*\", 0);\n      var file_id = fr.send_file (filename);\n      var file_content_type = ContentType.guess (filename, null, null);\n      var size = info.get_size ();\n\n      var fname = file.get_basename ();\n      this.history.write (this.fr.pubkey, @\"[$current_time] ** You sent a file to $(this.fr.name): $fname\");\n\n      var file_row = new FileListRow (\n        this.handle, fr, file_id, this.handle.username,\n        file.get_path (), size, time (), true\n      );\n      messages_list.add (file_row);\n    }\n    chooser.close ();\n  }\n\n  // Last scroll pos.\n  private double _bottom_scroll = 0.0;\n\n  [GtkCallback]\n  private void scroll_to_bottom () {\n    /**\n    * Check if the scrollbar is at the very max scroll, else don't do autoscroll.\n    * This prevent users searching in the history but getting bottom'd by the autoscroll.\n    **/\n    Gtk.Adjustment adj = this.scroll_messages.get_vadjustment ();\n    if (this._bottom_scroll == adj.value || this._bottom_scroll == 0.0) {\n      adj.set_value (adj.get_upper () - adj.get_page_size ());\n      this.is_bottom = true;\n    } else {\n      this.is_bottom = false;\n    }\n\n    this._bottom_scroll = adj.value;\n  }\n}\n"
  },
  {
    "path": "src/EditableLabel.vala",
    "content": "public class Ricin.EditableLabel : Gtk.EventBox {\n  private Gtk.Box box_entry;\n  private Gtk.Box box_label;\n\n  public Gtk.Button button_cancel { get; set; }\n  public Gtk.Button button_ok { get; set; }\n  public Gtk.Entry entry { get; set; }\n  public Gtk.Label label { get; set; }\n  public string text { get; set; }\n  public bool is_bold { get; set; default = false; }\n\n  public signal void label_changed (string label_text);\n  public signal void show_entry ();\n  public signal void show_label ();\n\n  public EditableLabel (string label = \"\") {\n    this.label = new Gtk.Label (label);\n    this.text = label;\n\n    init_widgets ();\n    init_signals ();\n  }\n\n  public EditableLabel.with_label (Gtk.Label label) {\n    this.label = label;\n\n    init_widgets ();\n    init_signals ();\n  }\n\n  public EditableLabel.with_bold (string label = \"\") {\n    this.label = new Gtk.Label (label);\n    this.text = Util.escape_html (label);\n    this.is_bold = true;\n    this.label.set_markup (\"<b>\" + this.text + \"</b>\");\n\n    init_widgets ();\n    init_signals ();\n  }\n\n  private void on_show_label () {\n    box_label.visible = true;\n    if (this.is_bold) {\n      this.label.set_markup (\"<b>\" + this.text + \"</b>\");\n    } else {\n      this.label.set_text (this.text);\n    }\n\n    box_entry.visible = false;\n  }\n\n  private void on_show_entry () {\n    box_label.visible = false;\n    box_entry.no_show_all = false;\n    this.entry.set_text (this.text);\n    box_entry.show_all ();\n    box_entry.visible = true;\n    box_entry.no_show_all = true;\n  }\n\n  private void init_widgets () {\n    this.entry = new Gtk.Entry ();\n    this.button_ok = new Gtk.Button ();\n    this.button_cancel = new Gtk.Button ();\n\n    this.label.justify = Gtk.Justification.LEFT;\n    this.label.height_request = 30;\n    this.label.ellipsize = Pango.EllipsizeMode.END;\n    this.label.set_tooltip_markup (this.text);\n\n    this.entry.get_style_context ().add_class (\"entry-principal\");\n    this.button_ok.get_style_context ().add_class (\"button-dark\");\n    this.button_ok.relief = Gtk.ReliefStyle.NORMAL;\n    this.button_cancel.get_style_context ().add_class (\"button-dark\");\n    this.button_cancel.relief = Gtk.ReliefStyle.NORMAL;\n\n    this.entry.has_frame = true;\n    this.entry.width_chars = 10;\n\n    this.button_ok.add (new Gtk.Image.from_icon_name (\"object-select-symbolic\", Gtk.IconSize.BUTTON));\n    this.button_cancel.add (new Gtk.Image.from_icon_name (\"window-close-symbolic\", Gtk.IconSize.BUTTON));\n\n    Gtk.Box box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);\n    box_label = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);\n    box_entry = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);\n    box_entry.spacing = 1;\n\n    box_label.pack_start (label);\n    box_entry.pack_start (entry);\n    box_entry.pack_start (button_ok, false);\n    box_entry.pack_start (button_cancel, false);\n    box.pack_start (box_label);\n    box.pack_start (box_entry);\n\n    box_entry.no_show_all = true;\n    box_entry.visible = false;\n    this.add (box);\n  }\n\n  private void on_cancel () {\n    show_label ();\n  }\n\n  private void on_ok () {\n    show_label ();\n    this.text = entry.text;\n    label_changed (entry.text);\n  }\n\n  private bool check_focus () {\n    unowned Gtk.Widget w = get_toplevel ();\n    if (w.is_toplevel () == false || (w is Gtk.Window) == false) {\n      //could not get window for some reason, abort\n      //Logger.log(LogLevel.ERROR, \"Could not get reference to toplevel window\");\n      return false;\n    }\n    unowned Gtk.Widget focus_widget = ((Gtk.Window) w).get_focus ();\n    if (focus_widget == null) {\n      return false;\n    }\n    if (focus_widget != entry && focus_widget != button_ok && focus_widget != button_cancel) {\n      // other widget focused\n      on_cancel ();\n    }\n    return false;\n  }\n\n  private bool on_focus_out (Gdk.EventFocus focus) {\n    Idle.add (check_focus);\n    return false;\n  }\n\n  private void init_signals () {\n    show_entry.connect (on_show_entry);\n    show_label.connect (on_show_label);\n    button_press_event.connect ((event) => {\n      if (!box_entry.visible && event.button == Gdk.BUTTON_PRIMARY) {\n        entry.text = label.label;\n        show_entry ();\n        entry.grab_focus ();\n        return true;\n      }\n      return false;\n    });\n    button_cancel.clicked.connect (on_cancel);\n    button_ok.clicked.connect (on_ok);\n    entry.activate.connect (on_ok);\n    entry.key_release_event.connect ((event) => {\n      if (event.keyval == Gdk.Key.Escape) {\n        on_cancel ();\n        return true;\n      }\n      return false;\n    });\n    entry.focus_out_event.connect (on_focus_out);\n    button_ok.focus_out_event.connect (on_focus_out);\n    button_cancel.focus_out_event.connect (on_focus_out);\n\n    this.bind_property (\"text\", label, \"label\", BindingFlags.DEFAULT);\n    this.notify[\"text\"].connect (() => {\n      this.label.set_tooltip_markup (this.text);\n    });\n  }\n}\n"
  },
  {
    "path": "src/FileListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/file-list-row.ui\")]\nclass Ricin.FileListRow : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Image image_author;\n  [GtkChild] public Gtk.Label label_name;\n  [GtkChild] Gtk.Label label_timestamp;\n\n  [GtkChild] Gtk.Box box_widget;\n  [GtkChild] Gtk.ProgressBar progress_file_percent;\n  [GtkChild] public Gtk.Button button_save;\n  [GtkChild] Gtk.Image image_save_inline;\n  [GtkChild] public Gtk.Button button_reject;\n  [GtkChild] Gtk.Image image_reject_inline;\n\n  [GtkChild] Gtk.Box box_background;\n  [GtkChild] Gtk.Image image_file_type;\n  [GtkChild] Gtk.Label label_file_name;\n  [GtkChild] Gtk.Label label_file_size;\n\n  [GtkChild] Gtk.AspectFrame aspectframe_preview;\n  [GtkChild] Gtk.Image image_preview;\n\n  private File file;\n  private uint32 file_id;\n  private string file_name;\n  private uint64 file_size;\n  private uint64 raw_size;\n  private uint position;\n\n  // Managing the download\n  private bool downloaded = false;\n  private bool paused = false;\n\n  private weak Tox.Tox handle;\n  private weak Tox.Friend sender;\n  private Settings settings;\n\n  public signal void accept_file (bool response, uint32 file_id);\n\n  public FileListRow (Tox.Tox handle, Tox.Friend sender, uint32 file_id, string username, string file_path, uint64 file_size, string timestamp, bool is_local_image = false, Gdk.Pixbuf? pixbuf = null, string? pixbuf_name = null) {\n    this.handle = handle;\n    this.sender = sender;\n    this.settings = Settings.instance;\n\n    this.file = File.new_for_path (file_path);\n    this.file_id = file_id;\n    this.raw_size = file_size;\n\n    var size_req = new Gtk.Requisition ();\n    this.get_preferred_size (out size_req, null);\n\n    if (is_local_image) { // File is a local image.\n      FileInfo info = this.file.query_info (\"standard::*\", 0);\n      this.file_name = info.get_display_name ();\n      this.file_size = info.get_size ();\n\n      //var pix = new Gdk.Pixbuf.from_file_at_scale (this.file.get_path (), 400, 400, true);\n      var pix = new Gdk.Pixbuf.from_file (this.file.get_path ());\n      if (pix.width > size_req.width) {\n        var pix_scaled = pix.scale_simple (size_req.width, 200, Gdk.InterpType.BILINEAR);\n        this.image_preview.set_from_pixbuf (pix_scaled);\n      } else {\n        this.image_preview.set_from_pixbuf (pix);\n      }\n\n      this.image_preview.visible = true;\n    } else if (pixbuf != null) { // File is an image.\n      this.file_name = pixbuf_name;\n      this.file_size = pixbuf.get_byte_length ();\n\n      if (pixbuf.width > size_req.width) {\n        var pix_scaled = pixbuf.scale_simple (size_req.width, 200, Gdk.InterpType.BILINEAR);\n        this.image_preview.set_from_pixbuf (pix_scaled);\n      } else {\n        this.image_preview.set_from_pixbuf (pixbuf);\n      }\n      this.image_preview.visible = true;\n    } else { // Normal file.\n      this.file_name = this.file.get_basename ();\n      this.file_size = file_size;\n    }\n\n    this.label_name.set_markup (@\"<b>$username</b>\");\n    this.label_timestamp.set_text (timestamp);\n    this.label_file_name.set_text (this.file_name);\n    this.label_file_name.set_tooltip_text (this.file_name);\n    this.label_file_size.set_text (Util.size_to_string (this.file_size));\n    this.progress_file_percent.set_fraction (0.0);\n\n    // If message is our (ugly&hacky way).\n    if (this.handle.username == username) {\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n    }\n\n    if (this.settings.compact_mode) {\n      this.label_name.visible = false;\n      this.image_author.visible = true;\n    } else {\n      this.label_name.visible = true;\n      this.image_author.visible = false;\n    }\n    this.settings.notify[\"compact-mode\"].connect (() => {\n      if (this.settings.compact_mode) {\n        this.label_name.visible = false;\n        this.image_author.visible = true;\n      } else {\n        this.label_name.visible = true;\n        this.image_author.visible = false;\n      }\n    });\n\n    if (this.sender == null) {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.handle.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.handle.notify[\"avatar\"].connect (() => {\n        this.image_author.pixbuf = this.handle.avatar.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n\n      this.image_author.set_tooltip_text (this.handle.username);\n      this.handle.notify[\"username\"].connect (() => {\n        this.image_author.set_tooltip_text (this.handle.username);\n      });\n    } else {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.sender.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.image_author.set_tooltip_text (this.sender.name);\n      this.sender.avatar.connect (px => {\n        this.image_author.pixbuf = px.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n    }\n\n    this.sender.file_done.connect ((name, bytes, id) => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      debug (@\"File $(this.file_id) done!\");\n\n      // Set the progressbar to 100% and hide it.\n      this.progress_file_percent.set_fraction (1.0);\n      this.progress_file_percent.visible = false;\n\n      string downloads = this.settings.default_save_path;\n      File file_destination = File.new_for_path (@\"$downloads/$(this.file_name)\");\n      if (FileUtils.test (file_destination.get_path (), FileTest.EXISTS)) {\n        Rand rnd = new Rand.with_seed ((uint32)new DateTime.now_local ().hash ());\n        uint32 rnd_id = rnd.next_int ();\n        string filename = @\"$rnd_id-$(this.file_name)\";\n        file_destination = File.new_for_path (downloads.concat (\"/\", filename));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.file = file_destination;\n      } else {\n        file_destination = File.new_for_path (downloads.concat (\"/\", this.file_name));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.file = file_destination;\n      }\n\n      this.set_redraw_on_allocate (true);\n      Gdk.Pixbuf p = new Gdk.Pixbuf.from_file (this.file.get_path ());\n      if (p.width > size_req.width) {\n        var pix_scaled = p.scale_simple (size_req.width, 200, Gdk.InterpType.BILINEAR);\n        this.image_preview.set_from_pixbuf (pix_scaled);\n      } else {\n        this.image_preview.set_from_pixbuf (p);\n      }\n\n      this.image_preview.visible = true;\n      this.changed ();\n      this.set_size_request (-1, -1);\n\n      this.downloaded = true;\n      this.button_save.get_style_context ().add_class (\"saved-file\");\n      this.button_save.set_size_request (65, 20);\n      this.button_reject.visible = false;\n      this.image_save_inline.icon_name = \"folder-open-symbolic\";\n      this.button_save.sensitive = true;\n    });\n\n    this.sender.file_received.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.downloaded = true;\n      this.progress_file_percent.visible = false;\n      this.button_save.get_style_context ().add_class (\"saved-file\");\n      this.button_save.set_size_request (65, 20);\n      this.button_reject.visible = false;\n      this.button_save.sensitive = true;\n      //this.label_foreground.width_request = -1;\n      this.image_save_inline.icon_name = \"object-select-symbolic\";\n      this.button_save.set_tooltip_text (\"File saved. Click to open\");\n    });\n\n    this.sender.file_progress.connect ((id, position) => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      uint64 size_total = this.raw_size;\n      uint64 size_received = position;\n      double percent = size_received / (double)size_total;\n      this.progress_file_percent.set_fraction (percent);\n\n      if (this.progress_file_percent.visible == false) {\n        this.progress_file_percent.visible = true;\n      }\n    });\n\n    this.sender.file_paused.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.image_save_inline.icon_name = \"media-playback-start-symbolic\";\n    });\n\n    this.sender.file_resumed.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.image_save_inline.icon_name = \"media-playback-pause-symbolic\";\n    });\n\n    this.sender.file_canceled.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.file_id = -1; // File doesn't exists now, avoid issues.\n      this.button_save.get_style_context().add_class (\"canceled-file\");\n      this.button_reject.set_size_request (65, 20);\n      this.button_reject.sensitive = false;\n      //this.label_foreground.width_request = -1;\n      this.button_save.visible = false;\n      this.progress_file_percent.visible = false;\n      this.button_reject.set_tooltip_text (\"Canceled\");\n    });\n\n    /*this.sender.file_progress.connect ((id, position) => {\n      if (id != this.file_id)\n        return;\n\n      debug (@\"File Progress: id: $id - position: $position\");\n    });*/\n  }\n\n  [GtkCallback]\n  private void save_file () {\n    /**\n    * TODO: Handle multiple state of the button using a less hacky way.\n    **/\n    if (this.downloaded == false) {\n      debug (\"Requested to save file\");\n      this.accept_file (true, this.file_id);\n      this.progress_file_percent.visible = true;\n      /*this.box_widget.get_style_context().add_class (\"progress-bg\");\n      this.label_foreground.get_style_context().add_class (\"progress-fg\");\n      this.progress_transfers.visible = true;*/\n    } else {\n      /**\n      * TODO: Open the file in folder.\n      **/\n      try {\n        AppInfo.launch_default_for_uri (this.file.get_uri (), null);\n      } catch (Error e) {\n        debug (@\"Cannot open $(this.file_name): $(e.message)\");\n      }\n      return;\n    }\n\n    if (this.paused == false) {\n      this.paused = !this.paused;\n      this.image_save_inline.icon_name = \"media-playback-pause-symbolic\";\n      //this.label_foreground.width_request = this.label_foreground.width_request + 10;\n    } else {\n      this.paused = !this.paused;\n      this.image_save_inline.icon_name = \"media-playback-start-symbolic\";\n    }\n\n    /**\n    * TODO: Change box_widget background to progress.\n    * NOTE: Use a Gtk.Overlay and change it's background color + update width\n    *       of the overlay related to the file progress.\n    **/\n    /*this.box_widget.get_style_context().add_class (\"saved-file\");\n    this.button_save.set_size_request (65, 20);\n    this.button_save.sensitive = false;\n    this.button_reject.visible = false;*/\n  }\n\n  [GtkCallback]\n  private void reject_file () {\n    this.accept_file (false, this.file_id);\n    this.file_id = -1; // File doesn't exists now, avoid issues.\n\n    /**\n    * TODO: Change box_widget background to red.\n    * NOTE: Use the .canceled-file css class defined in default.css\n    **/\n    this.button_save.get_style_context().add_class (\"canceled-file\");\n\n    //this.button_reject.label = \"Canceled\";\n    /*this.progress_transfers.visible = false;*/\n    this.button_reject.set_size_request (65, 20);\n    this.button_reject.sensitive = false;\n    this.button_save.visible = false;\n    this.progress_file_percent.visible = false;\n  }\n\n  private void open_file () {\n\n  }\n}\n"
  },
  {
    "path": "src/FriendListRow.vala",
    "content": "using Tox;\n\n[GtkTemplate (ui=\"/chat/tox/ricin/ui/friend-list-row.ui\")]\nclass Ricin.FriendListRow : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Image avatar;\n  [GtkChild] public Gtk.Box box_infos;\n  [GtkChild] public Gtk.Label username;\n  [GtkChild] Gtk.Label status;\n  [GtkChild] Gtk.Label label_unread_count;\n  [GtkChild] Gtk.Image userstatus;\n\n  public Tox.Friend fr;\n  public weak Tox.Group group;\n\n  private string current_status_icon = \"\";\n  private Gtk.Menu menu_friend;\n  private Gtk.ImageMenuItem block_friend;\n\n  private Settings settings;\n  private ViewType view_type;\n  private string iconName = \"offline\";\n  private Gdk.Pixbuf pixbuf;\n  private bool is_important_set = false;\n\n  public string view_name;\n  public int unreadCount = 0;\n\n  private enum ViewType {\n    FULL,\n    COMPACT\n  }\n\n  public FriendListRow (Tox.Friend fr) {\n    this.fr = fr;\n    this.settings = Settings.instance;\n    this.view_name = \"chat-%s\".printf (fr.pubkey);\n\n    debug (@\"Friend name: $(this.fr.name)\");\n    if (this.fr.name == null) {\n      if (this.fr.get_uname () == null) {\n        this.username.set_text (this.fr.pubkey);\n      } else {\n        this.username.set_markup (Util.render_emojis (Util.escape_html (this.fr.get_uname ())));\n      }\n      this.status.set_markup (Util.escape_html (this.fr.get_ustatus_message ()));\n      this.status.set_tooltip_markup (Util.escape_html (this.fr.get_ustatus_message ()));\n    } else {\n      this.username.set_markup (Util.render_emojis (Util.escape_html (this.fr.name)));\n      this.status.set_text (Util.escape_html (this.fr.status_message));\n      this.status.set_tooltip_markup (Util.escape_html (this.fr.status_message));\n    }\n\n    this.init_context_menu ();\n\n    /**\n    * Load the avatar from the avatar cache located in:\n    * ~/.config/tox/avatars/\n    */\n    var avatar_path = Tox.profile_dir () + \"avatars/\" + this.fr.pubkey + \".png\";\n    if (FileUtils.test (avatar_path, FileTest.EXISTS)) {\n      var pixbuf = new Gdk.Pixbuf.from_file_at_scale (avatar_path, 48, 48, false);\n      this.avatar.pixbuf = pixbuf;\n    } else {\n      Cairo.Surface surface = Util.identicon_for_pubkey (fr.pubkey);\n      this.avatar.pixbuf = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n    }\n    this.pixbuf = this.avatar.pixbuf;\n\n    if (this.settings.compact_mode) {\n      this.switch_view_type (ViewType.COMPACT);\n    }\n    this.settings.notify[\"compact-mode\"].connect (() => {\n      if (this.settings.compact_mode) {\n        this.switch_view_type (ViewType.COMPACT);\n      } else {\n        this.switch_view_type (ViewType.FULL);\n      }\n    });\n\n    fr.avatar.connect (p => avatar.pixbuf = p);\n\n    fr.notify[\"name\"].connect ((obj, prop) => {\n      this.username.set_markup (Util.render_emojis (Util.escape_html (this.fr.name)));\n    });\n\n    fr.notify[\"status-message\"].connect ((obj, prop) => {\n      this.status.set_text (this.fr.status_message);\n      this.status.set_tooltip_markup (this.fr.status_message);\n    });\n\n    fr.notify[\"status\"].connect ((obj, prop) => {\n      if (this.settings.enable_notify_status && this.fr.status != this.fr.last_status) {\n        Notification.notify_status (fr);\n      }\n\n      string icon = Util.status_to_icon (this.fr.status, 0);\n      this.userstatus.set_from_resource (@\"/chat/tox/ricin/images/status/$icon.png\");\n      this.changed (); // we sort by user status\n    });\n\n    fr.notify[\"blocked\"].connect ((obj, prop) => {\n      this.block_friend.set_label ((this.fr.blocked) ? _(\"Unblock friend\") : _(\"Block friend\"));\n    });\n\n    fr.avatar.connect ((pixbuf_avatar) => {\n      this.pixbuf = pixbuf_avatar;\n      this.switch_view_type (this.view_type);\n    });\n\n    fr.message.connect (() => {\n      this.notify_new_messages ();\n    });\n    fr.action.connect (() => {\n      this.notify_new_messages ();\n    });\n    fr.file_transfer.connect (() => {\n      this.notify_new_messages ();\n    });\n\n    this.activate.connect (() => {\n      var main_window = ((MainWindow) this.get_toplevel ());\n      main_window.global_unread_counter -= this.unreadCount;\n\n      this.unreadCount = 0;\n      this.update_icon ();\n      this.changed ();\n\n      main_window.friendlist.invalidate_filter ();\n      main_window.grouplist.invalidate_filter ();\n    });\n  }\n\n  public FriendListRow.groupchat (Tox.Group group) {\n    this.settings = Settings.instance;\n    this.view_name = \"group-%d\".printf (group.id);\n    this.group = group;\n\n    this.username.set_markup (Util.render_emojis (this.group.name));\n    this.username.set_tooltip_text (this.group.name);\n    this.status.set_text (_(\"%d peers\").printf (this.group.peers_count));\n    //this.status.set_text (\"Peers: 0\");\n    this.userstatus.visible = false;\n    Cairo.Surface surface = Util.identicon_for_pubkey (this.group.name);\n    this.avatar.pixbuf = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n    this.pixbuf = this.avatar.pixbuf;\n\n    if (this.settings.compact_mode) {\n      this.switch_view_type (ViewType.COMPACT);\n    }\n    this.settings.notify[\"compact-mode\"].connect (() => {\n      if (this.settings.compact_mode) {\n        this.switch_view_type (ViewType.COMPACT);\n      } else {\n        this.switch_view_type (ViewType.FULL);\n      }\n    });\n\n    this.group.peer_count_changed.connect ((peer) => {\n      this.status.set_text (_(\"%d peers\").printf (this.group.peers_count - 1));\n    });\n\n    this.group.title_changed.connect ((peer_num, title) => {\n      this.username.set_markup (Util.render_emojis (this.group.name));\n      this.username.set_tooltip_text (this.group.name);\n      //this.status.set_text (_(\"Peers: %d\", this.group.peers.length ()));\n      if (this.view_type == ViewType.COMPACT) {\n        Cairo.Surface s = Util.identicon_for_pubkey (this.group.name, 24);\n        this.avatar.pixbuf = Gdk.pixbuf_get_from_surface (s, 0, 0, 24, 24);\n      } else {\n        Cairo.Surface s = Util.identicon_for_pubkey (this.group.name, 48);\n        this.avatar.pixbuf = Gdk.pixbuf_get_from_surface (s, 0, 0, 48, 48);\n      }\n      this.pixbuf = this.avatar.pixbuf;\n    });\n\n    this.group.message.connect ((peer, msg) => {\n      if (this.is_important_set == false) {\n        this.is_important_set = (msg.down ().index_of (this.group.tox.username.down ()) != -1);\n      }\n      this.notify_new_messages ();\n    });\n    this.group.action.connect ((peer, msg) => {\n      if (this.is_important_set == false) {\n        this.is_important_set = (msg.down ().index_of (this.group.tox.username.down ()) != -1);\n      }\n      this.notify_new_messages ();\n    });\n\n    this.activate.connect (() => {\n      var main_window = ((MainWindow) this.get_toplevel ());\n      main_window.global_unread_counter -= this.unreadCount;\n\n      this.unreadCount = 0;\n      this.is_important_set = false;\n      this.update_icon ();\n      this.changed ();\n\n      main_window.friendlist.invalidate_filter ();\n      main_window.grouplist.invalidate_filter ();\n    });\n  }\n\n  public void update_icon () {\n    if (this.is_important_set == true) {\n      this.label_unread_count.get_style_context ().remove_class (\"badge\");\n      this.label_unread_count.get_style_context ().add_class (\"badge-important\");\n    } else {\n      this.label_unread_count.get_style_context ().remove_class (\"badge-important\");\n      this.label_unread_count.get_style_context ().add_class (\"badge\");\n    }\n    \n    if (this.unreadCount == 0) {\n      this.label_unread_count.visible = false;\n      this.is_important_set = false;\n    } else {\n      string count_str = this.unreadCount > 90 ? \"<b>90+</b>\" : @\"$(this.unreadCount)\";\n      this.label_unread_count.set_markup (count_str);\n      this.label_unread_count.set_size_request (-1, -1);\n      this.label_unread_count.visible = true;\n    }\n  }\n\n  private void notify_new_messages () {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    if (main_window.focused_view == this.view_name) {\n      return;\n    }\n    \n    if (this.group.muted) {\n      return;\n    }\n\n    this.unreadCount++;\n    main_window.global_unread_counter += this.unreadCount;\n    this.update_icon ();\n  }\n\n  private void switch_view_type (ViewType type) {\n    if (type == ViewType.FULL) {\n      this.set_size_request (100, 60);\n\n      this.avatar.pixbuf = this.pixbuf;\n      this.avatar.set_pixel_size (48);\n      this.avatar.set_size_request (48, 48);\n\n      this.box_infos.set_orientation (Gtk.Orientation.VERTICAL);\n      this.box_infos.set_valign (Gtk.Align.FILL);\n      this.box_infos.set_halign (Gtk.Align.FILL);\n\n      this.username.set_vexpand (true);\n      this.username.set_hexpand (true);\n      this.username.set_margin_top (7);\n      this.username.set_valign (Gtk.Align.FILL);\n\n      this.status.set_margin_bottom (7);\n      this.status.set_valign (Gtk.Align.END);\n      this.status.set_halign (Gtk.Align.START);\n    } else if (type == ViewType.COMPACT) {\n      this.set_size_request (100, 30);\n\n      this.avatar.pixbuf = this.avatar.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.avatar.set_pixel_size (24);\n      this.avatar.set_size_request (24, 24);\n\n      this.box_infos.set_orientation (Gtk.Orientation.HORIZONTAL);\n      this.box_infos.set_valign (Gtk.Align.CENTER);\n      this.box_infos.set_halign (Gtk.Align.START);\n\n      this.username.set_vexpand (false);\n      this.username.set_hexpand (false);\n      this.username.set_margin_top (0);\n      this.username.set_valign (Gtk.Align.CENTER);\n\n      this.status.set_margin_bottom (0);\n      this.status.set_valign (Gtk.Align.CENTER);\n\n      if (this.view_name.index_of (\"group\") != -1) {\n        this.username.set_vexpand (true);\n        this.status.set_halign (Gtk.Align.END);\n        this.box_infos.set_halign (Gtk.Align.FILL);\n      }\n    }\n\n    this.view_type = type;\n  }\n\n  private void init_context_menu () {\n    debug (\"Initializing context menu for friend.\");\n\n    this.button_press_event.connect (event => {\n      if (event.button == Gdk.BUTTON_SECONDARY) {\n        this.menu_friend.popup (null, null, null, event.button, event.time);\n        return Gdk.EVENT_STOP;\n      }\n      return Gdk.EVENT_PROPAGATE;\n    });\n\n    this.menu_friend = new Gtk.Menu ();\n\n    // Open friend profile.\n    var open_friend_profile = new Gtk.ImageMenuItem.with_label (_(\"Friend's profile\"));\n    var open_friend_profile_icon = new Gtk.Image.from_icon_name (\"dialog-information-symbolic\", Gtk.IconSize.MENU);\n    open_friend_profile.always_show_image = true;\n    open_friend_profile.set_image (open_friend_profile_icon);\n    open_friend_profile.activate.connect (() => {\n      var main_window = this.get_toplevel () as MainWindow;\n      main_window.open_profile (this.fr);\n    });\n\n    // Copy friend ToxID.\n    var copy_friend_toxid = new Gtk.ImageMenuItem.with_label (_(\"Copy friend's ToxID\"));\n    var copy_friend_toxid_icon = new Gtk.Image.from_icon_name (\"edit-copy-symbolic\", Gtk.IconSize.MENU);\n    copy_friend_toxid.always_show_image = true;\n    copy_friend_toxid.set_image (copy_friend_toxid_icon);\n    copy_friend_toxid.activate.connect (() => {\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (this.fr.pubkey, -1);\n    });\n\n    // Delete friend action.\n    var delete_friend = new Gtk.ImageMenuItem.with_label (_(\"Delete\"));\n    var delete_friend_icon = new Gtk.Image.from_icon_name (\"edit-delete-symbolic\", Gtk.IconSize.MENU);\n    delete_friend.always_show_image = true;\n    delete_friend.set_image (delete_friend_icon);\n    delete_friend.activate.connect (() => {\n      var main_window = this.get_toplevel () as MainWindow;\n      main_window.remove_friend (this.fr);\n    });\n\n    // Block friend action.\n    var block_friend_label = (this.fr.blocked) ? _(\"Unblock\") : _(\"Block\");\n    var block_friend_icon = new Gtk.Image.from_icon_name (\"dialog-error-symbolic.symbolic\", Gtk.IconSize.MENU);\n    this.block_friend = new Gtk.ImageMenuItem.with_label (block_friend_label);\n    this.block_friend.always_show_image = true;\n    this.block_friend.set_image (block_friend_icon);\n    this.block_friend.activate.connect (() => {\n      var main_window = this.get_toplevel () as MainWindow;\n      var view = main_window.chat_stack.get_child_by_name (\"chat-%s\".printf (this.fr.pubkey));\n      ((ChatView) view).block_friend ();\n    });\n\n    this.menu_friend.append (open_friend_profile);\n    this.menu_friend.append (copy_friend_toxid);\n    this.menu_friend.append (new Gtk.SeparatorMenuItem ());\n    this.menu_friend.append (block_friend);\n    this.menu_friend.append (delete_friend);\n    this.menu_friend.attach_to_widget (this, null);\n    this.menu_friend.show_all ();\n\n    /*this.popup_menu.connect ((widget, event) => {\n      debug (\"Displaying context menu...\");\n      this.menu_friend.popup (null, null, null, event.button, event.time);\n      return true;\n    });*/\n  }\n}\n"
  },
  {
    "path": "src/GroupChatView.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/group-chat-view.ui\")]\nclass Ricin.GroupChatView : Gtk.Box {\n  // Group header.\n  [GtkChild] Gtk.Box box_group_infos;\n  [GtkChild] Gtk.Image avatar;\n  [GtkChild] public Gtk.Label name;\n  [GtkChild] Gtk.Label topic;\n\n  // Group menu.\n  [GtkChild] Gtk.Button button_toggle_group_menu;\n  [GtkChild] Gtk.Revealer revealer_group_menu;\n  [GtkChild] Gtk.Label label_group_name;\n  [GtkChild] Gtk.Label label_group_topic;\n\n  [GtkChild] Gtk.Label label_friends;\n  [GtkChild] Gtk.ListBox listbox_friends;\n  [GtkChild] Gtk.Label label_unknown_peers;\n  [GtkChild] Gtk.ListBox listbox_unknown_peers;\n\n  [GtkChild] Gtk.Button button_group_leave;\n  [GtkChild] Gtk.Button button_group_mute;\n\n  // Invite peers in groupchat.\n  [GtkChild] Gtk.Image image_icon_invite_peers;\n  [GtkChild] Gtk.Revealer revealer_invite_peers;\n  [GtkChild] Gtk.Entry entry_invite_peers;\n  [GtkChild] Gtk.Button button_invite_peers;\n\n  // Group content.\n  [GtkChild] Gtk.ScrolledWindow scroll_messages;\n  [GtkChild] Gtk.ListBox messages_list;\n\n  // Group input.\n  [GtkChild] public Gtk.Entry entry;\n  [GtkChild] Gtk.Button button_send;\n\n  [Signal (action = true)] private signal void copy_messages_selection ();\n  [Signal (action = true)] private signal void quote_messages_selection ();\n  [Signal (action = true)] private signal void entry_insert_newline ();\n\n  public Tox.Group group;\n  private weak Tox.Tox handle;\n  private weak Gtk.Stack stack;\n  private Settings settings;\n  private string view_name;\n  private string last_message = null;\n  private bool is_bottom = true;\n\n  // Autocomplete popup.\n  private Gtk.ListStore peers = new Gtk.ListStore (1, typeof (string));\n  private Gtk.EntryCompletion completion = new Gtk.EntryCompletion ();\n\n  // Constructor.\n  public GroupChatView (Tox.Tox handle, Tox.Group group, Gtk.Stack stack, string view_name) {\n    this.group = group;\n    this.handle = handle;\n    this.stack = stack;\n    this.view_name = view_name;\n    this.settings = Settings.instance;\n\n    this.init_widgets ();\n    this.init_signals ();\n    this.init_messages_menu ();\n    this.init_messages_shortcuts ();\n    this.init_completion ();\n  }\n\n  private void init_widgets () {\n    // Initialize groupchat name.\n    if (this.group.name != null) {\n      this.name.set_markup (Util.render_emojis (this.group.name));\n      this.topic.set_markup (Util.add_markup (this.group.name));\n      this.label_group_name.set_markup (Util.render_emojis (this.group.name));\n      this.label_group_topic.set_markup (Util.add_markup (this.group.name));\n\n      // Perform ToxIdenticon against the group name.\n      Cairo.Surface surface = Util.identicon_for_pubkey (this.group.name);\n      var pixbuf_scaled = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n      this.avatar.pixbuf = pixbuf_scaled;\n    }\n\n    this.listbox_friends.set_sort_func ((row1, row2) => {\n      string peer_name1 = ((GroupListRow) row1).peer.name;\n      string peer_name2 = ((GroupListRow) row2).peer.name;\n      return Util.sort_az_nocase (peer_name1, peer_name2);\n    });\n\n    this.listbox_unknown_peers.set_sort_func ((row1, row2) => {\n      string peer_name1 = ((GroupListRow) row1).peer.name;\n      string peer_name2 = ((GroupListRow) row2).peer.name;\n      return Util.sort_az_nocase (peer_name1, peer_name2);\n    });\n  }\n\n  private void init_signals () {\n    // Handle entry history.\n    this.entry.key_press_event.connect ((event) => {\n      if (event.keyval == Gdk.Key.Up && this.entry.get_text () == \"\" && this.last_message != null) {\n        this.entry.set_text (this.last_message);\n        this.entry.set_position (-1);\n        return true;\n      } else if (event.keyval == Gdk.Key.Up && this.entry.get_text ().has_prefix (\"/topic \")) {\n        this.entry.set_text (\"/topic %s\".printf (this.group.name));\n        this.entry.set_position (-1);\n        return true;\n      } else if (event.keyval == Gdk.Key.Down && this.entry.get_text () == this.last_message) {\n        this.entry.set_text (\"\");\n      }\n      return false;\n    });\n\n    // Keep group name in sync.\n    this.group.title_changed.connect ((peer, title) => {\n      this.name.set_markup (Util.render_emojis (this.group.name));\n      this.topic.set_markup (Util.add_markup (this.group.name));\n      this.label_group_name.set_markup (Util.render_emojis (this.group.name));\n      this.label_group_topic.set_markup (Util.add_markup (this.group.name));\n\n      Cairo.Surface surface = Util.identicon_for_pubkey (this.group.name, 48);\n      var pixbuf_scaled = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n      this.avatar.pixbuf = pixbuf_scaled;\n\n      string message = \"\";\n      if (this.group.peers[peer].name == null) {\n        message = _(\"The topic was set to « %s ».\").printf (title);\n      } else {\n        message = _(\"%s set the topic to « %s ».\").printf (this.group.peers[peer].name, title);\n      }\n\n      InfoListRow row = new InfoListRow (message);\n      this.messages_list.add (row);\n    });\n\n    this.group.message.connect ((peer, message) => {\n      debug (\"New message from group %d: [Peer %d] %s\", this.group.num, peer.num, message);\n      string current_time = time ();\n      if (message.index_of (\">\", 0) == 0) {\n        string markup = Util.add_markup (message);\n        var msg = new QuoteMessageListRow (this.handle, null, markup, current_time, -1, false);\n        msg.author = peer.name;\n        msg.label_name.set_text (peer.name);\n        msg.image_author.set_tooltip_text (peer.name);\n        msg.image_author.pixbuf = Util.pubkey_to_image (peer.pubkey, 24, 24);\n        msg.stack.set_visible_child_name (\"timestamp\");\n        this.messages_list.add (msg);\n      } else {\n        string markup = Util.add_markup (message);\n        var msg = new MessageListRow (this.handle, null, markup, current_time, -1, false);\n        msg.author = peer.name;\n        msg.label_name.set_text (peer.name);\n        msg.image_author.set_tooltip_text (peer.name);\n        msg.image_author.pixbuf = Util.pubkey_to_image (peer.pubkey, 24, 24);\n        msg.stack.set_visible_child_name (\"timestamp\");\n        this.messages_list.add (msg);\n      }\n\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n\n    this.group.action.connect ((peer, message) => {\n      string current_time = time ();\n      string message_escaped = @\"<b>$(peer.name)</b> $(Util.escape_html(message))\";\n      this.messages_list.add (new SystemMessageListRow (message_escaped));\n\n      ((MainWindow) this.get_toplevel ()).set_desktop_hint (true);\n    });\n\n    this.group.peer_count_changed.connect (() => {\n      this.label_unknown_peers.set_markup (\"%s (%d)\".printf (\n        _(\"<b>Unknown peers</b>\"), (int)this.listbox_unknown_peers.get_children ().length ())\n      );\n      this.label_friends.set_markup (\"%s (%d)\".printf (\n        _(\"<b>Friends</b>\"), (int)this.listbox_friends.get_children ().length ())\n      );\n\n      this.refresh_peers_list ();\n    });\n\n    this.group.peer_added.connect (peer => {\n      if (peer.pubkey == this.handle.pubkey) {\n        return;\n      }\n\n      DateTime now = new DateTime.now_local ();\n      DateTime init_time = this.group.joined_time.add_seconds (10);\n      if (init_time.compare (now) == -1) { // Avoid spam when joining a group.\n        if (peer.name != \"Tox User\") {\n          InfoListRow info_row = new InfoListRow (_(\"%s joined the group.\").printf (peer.name));\n          this.messages_list.add (info_row);\n        }\n      }\n    });\n\n    this.group.peer_removed.connect ((peer_num, peer_pubkey, peer_name) => {\n      if (peer_pubkey == this.handle.pubkey) {\n        return;\n      }\n\n      InfoListRow info_row = new InfoListRow (_(\"%s left the group.\").printf (peer_name));\n      this.messages_list.add (info_row);\n    });\n  }\n\n  public void init_messages_menu () {\n    var menu = new Gtk.Menu ();\n\n    var menu_copy_selection = new Gtk.ImageMenuItem.with_label (_(\"Copy selection in clipboard\"));\n    var label_copy_selection = ((Gtk.AccelLabel) menu_copy_selection.get_child ());\n    label_copy_selection.set_accel (Gdk.keyval_from_name(\"C\"), Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK);\n    menu_copy_selection.always_show_image = true;\n    menu_copy_selection.set_image (new Gtk.Image.from_icon_name (\"edit-copy-symbolic\", Gtk.IconSize.MENU));\n\n    var menu_copy_quote = new Gtk.ImageMenuItem.with_label (_(\"Copy quote in clipboard\"));\n    menu_copy_quote.always_show_image = true;\n    menu_copy_quote.set_image (new Gtk.Image.from_icon_name (\"edit-copy-symbolic\", Gtk.IconSize.MENU));\n\n    var menu_quote_selection = new Gtk.ImageMenuItem.with_label (_(\"Quote selection\"));\n    var label_quote_selection = ((Gtk.AccelLabel) menu_quote_selection.get_child ());\n    label_quote_selection.set_accel (Gdk.keyval_from_name(\"Q\"), Gdk.ModifierType.SHIFT_MASK);\n    menu_quote_selection.always_show_image = true;\n    menu_quote_selection.set_image (new Gtk.Image.from_icon_name (\"insert-text-symbolic\", Gtk.IconSize.MENU));\n\n    var menu_remove_selection = new Gtk.ImageMenuItem.with_label (_(\"Delete selected messages\"));\n    menu_remove_selection.always_show_image = true;\n    menu_remove_selection.set_image (new Gtk.Image.from_icon_name (\"edit-clear-symbolic\", Gtk.IconSize.MENU));\n\n    var menu_clear_chat = new Gtk.ImageMenuItem.with_label (_(\"Clear conversation\"));\n    menu_clear_chat.always_show_image = true;\n    menu_clear_chat.set_image (new Gtk.Image.from_icon_name (\"edit-clear-all-symbolic\", Gtk.IconSize.MENU));\n\n    menu_copy_selection.activate.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string selection = this.get_selected_messages (false, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (selection, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n    menu_copy_quote.activate.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string quote = this.get_selected_messages (true, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (quote, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n    menu_quote_selection.activate.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string quote = this.get_selected_messages (true, false);\n      this.entry.set_text (quote);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n    menu_remove_selection.activate.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      List<weak Gtk.Widget> childs = this.messages_list.get_selected_rows ();\n      foreach (Gtk.Widget m in childs) {\n        this.messages_list.remove (m);\n      }\n    });\n    menu_clear_chat.activate.connect(this.clear);\n\n    menu.append (menu_copy_selection);\n    menu.append (menu_copy_quote);\n    menu.append (menu_quote_selection);\n    menu.append (new Gtk.SeparatorMenuItem ());\n    menu.append (menu_remove_selection);\n    menu.append (menu_clear_chat);\n    menu.show_all ();\n\n    this.messages_list.button_press_event.connect ((e) => {\n      // Only allow messages operations if some messages are selected.\n      if (this.messages_list.get_selected_rows ().length () < 1) {\n        menu_copy_quote.sensitive = false;\n        menu_copy_selection.sensitive = false;\n        menu_quote_selection.sensitive = false;\n        menu_remove_selection.sensitive = false;\n      } else {\n        menu_copy_quote.sensitive = true;\n        menu_copy_selection.sensitive = true;\n        menu_quote_selection.sensitive = true;\n        menu_remove_selection.sensitive = true;\n      }\n\n      // Only allow chatview to be cleared if it contains messages.\n      if (this.messages_list.get_children ().length () < 1) {\n        menu_clear_chat.sensitive = false;\n      } else {\n        menu_clear_chat.sensitive = true;\n      }\n\n      // If the event was a right click.\n      if (e.button != 3) {\n        return false;\n      }\n\n      menu.popup (null, null, null, 3, Gtk.get_current_event_time ());\n      return true;\n    });\n  }\n\n  private void init_messages_shortcuts () {\n    /**\n    * Shortcut for Ctrl+Shift+C: Copy selected messages if selection > 0\n    **/\n    this.add_accelerator (\n      \"copy-messages-selection\", MainWindow.accel_group, Gdk.keyval_from_name(\"C\"),\n      Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.copy_messages_selection.connect (() => {\n      if (this.messages_selected () == false) {\n        return;\n      }\n\n      string selection = this.get_selected_messages (false, true);\n      Gtk.Clipboard.get (Gdk.SELECTION_CLIPBOARD).set_text (selection, -1);\n      this.messages_list.unselect_all ();\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (-1);\n    });\n\n    /**\n    * Shortcut for Shift+Q: Quote selected messages if selection > 0\n    **/\n    this.add_accelerator (\n      \"quote-messages-selection\", MainWindow.accel_group, Gdk.keyval_from_name(\"Q\"),\n      Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.quote_messages_selection.connect (() => {\n      if (this.messages_selected () == true) {\n        string quote = this.get_selected_messages (true, false);\n        this.entry.set_text (quote);\n        this.messages_list.unselect_all ();\n        this.entry.grab_focus_without_selecting ();\n        this.entry.set_position (-1);\n      }\n    });\n\n    /**\n    * Shortcut for Shift+Enter in this.entry: Add a newline (\\n).\n    **/\n    this.add_accelerator (\n      \"entry-insert-newline\", MainWindow.accel_group, Gdk.Key.Return,\n      Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.entry_insert_newline.connect (() => {\n      debug (\"entry_insert_newline: Called.\");\n\n      int cursor_position = this.entry.get_position ();\n      string text = this.entry.get_text ();\n      string newline = \"\\n\";\n\n      this.entry.insert_at_cursor (newline);\n      this.entry.grab_focus_without_selecting ();\n      this.entry.set_position (cursor_position + newline.length);\n\n    });\n  }\n\n  private void init_completion () {\n    this.entry.set_completion (this.completion);\n\n    this.completion.set_model (this.peers);\n    this.completion.set_text_column (0);\n\n    this.completion.inline_selection = true;\n    this.completion.inline_completion = true;\n    this.completion.popup_completion = true;\n    this.completion.popup_set_width = false;\n  }\n\n  private void refresh_peers_list () {\n    Tox.Peer[] peers = this.handle.get_peers_for_group (this.group.num);\n\n    // Clear both peers listbox.\n    this.listbox_friends.forall ((element) => {\n      this.listbox_friends.remove (element);\n    });\n\n    this.listbox_unknown_peers.forall ((element) => {\n      this.listbox_unknown_peers.remove (element);\n    });\n\n    // Clear the listStore.\n    this.peers.clear ();\n\n    // Add peers in the correct listbox + liststore for completion.\n    Gtk.TreeIter iter;\n    for (int i = 0; i < peers.length; i++) {\n      Tox.Peer peer = peers[i];\n\n      if (peer.pubkey == this.handle.pubkey) {\n        continue;\n      }\n\n      GroupListRow row = new GroupListRow (peer);\n      row.init_mute_button ();\n\n      if (this.handle.has_friend (peer.pubkey)) {\n        peer.notify[\"name\"].connect (() => {\n          this.listbox_friends.invalidate_sort ();\n        });\n        this.listbox_friends.insert (row, peer.num);\n      } else {\n        peer.notify[\"name\"].connect (() => {\n          this.listbox_unknown_peers.invalidate_sort ();\n        });\n        this.listbox_unknown_peers.insert (row, peer.num);\n      }\n\n      this.peers.append (out iter);\n      this.peers.set (iter, 0, peer.name);\n    }\n\n    this.listbox_friends.invalidate_sort ();\n    this.listbox_unknown_peers.invalidate_sort ();\n  }\n\n  private string time () {\n    return new DateTime.now_local ().format (\"%H:%M:%S %p\");\n  }\n\n  /**\n  * Clear the current groupchat content.\n  **/\n  private void clear () {\n    List<weak Gtk.Widget> childs = this.messages_list.get_children ();\n    foreach (Gtk.Widget m in childs) {\n      this.messages_list.remove (m);\n    }\n  }\n\n  private bool messages_selected () {\n    return (this.messages_list.get_selected_rows ().length () > 0);\n  }\n\n  private string get_selected_messages (bool as_quote, bool include_names) {\n    StringBuilder sb = new StringBuilder ();\n    foreach (Gtk.ListBoxRow item in this.messages_list.get_selected_rows ()) {\n      string name = \"\";\n      string txt = \"\";\n\n      if (item is MessageListRow) {\n        name = \"[\" + ((MessageListRow) item).author + \"]\";\n        txt  = ((MessageListRow) item).label_message.get_text ();\n      } else if (item is SystemMessageListRow) {\n        name = \"* \";\n        txt  = ((SystemMessageListRow) item).label_message.get_text ();\n      } else if (item is QuoteMessageListRow) {\n        name = \"[\" + ((QuoteMessageListRow) item).author + \"]\";\n        txt  = ((QuoteMessageListRow) item).get_quote ();\n      } else if (item is InfoListRow) {\n        name = \"* \";\n        txt = ((InfoListRow) item).message;\n      }\n\n      if (as_quote) {\n        sb.append_c ('>');\n      }\n      if (include_names) {\n        sb.append (@\"$name \");\n      }\n\n      sb.append (txt);\n      sb.append_c ('\\n');\n    }\n\n    sb.truncate (sb.len - 1);\n    return (string) sb.data;\n  }\n\n  // Callback: Send message.\n  [GtkCallback]\n  private void send_message () {\n    string user = this.handle.username;\n    string message = this.entry.get_text ();\n    string current_time = time ();\n\n    string markup;\n\n    if (message.strip () == \"\") {\n      return;\n    } else if (message.strip () == \"/clear\") {\n      this.clear ();\n      this.entry.text = \"\";\n      return;\n    }\n\n    this.last_message = message;\n\n    if (message.has_prefix (\"/me \")) { // Actions.\n      string action = message.substring (4);\n      string escaped = Util.escape_html (action);\n      markup = @\"<b>$user</b> $escaped\";\n\n      this.messages_list.add (new SystemMessageListRow (markup));\n      this.group.send_action (action);\n    } else if (message.has_prefix (\"/topic \")) { // Group title.\n      string topic = message.substring (7);\n      this.group.set_title (topic);\n    } else if (message.index_of (\">\", 0) == 0) { // Quotes.\n      markup = Util.add_markup (message);\n      uint32 message_id = (uint32)this.group.send_message (message);\n      var msg = new QuoteMessageListRow (this.handle, null, markup, current_time, message_id, false);\n      msg.stack.set_visible_child_name (\"timestamp\");\n      this.messages_list.add (msg);\n    } else { // Message.\n      markup = Util.add_markup (message);\n      uint32 message_id = (uint32)this.group.send_message (message);\n      var msg = new MessageListRow (this.handle, null, markup, time (), message_id, false);\n      msg.stack.set_visible_child_name (\"timestamp\");\n      this.messages_list.add (msg);\n    }\n\n    // clear the entry\n    this.entry.text = \"\";\n  }\n\n  // Callback: Invite preer in groupchat.\n  [GtkCallback]\n  private void toggle_invite_peers () {\n    this.revealer_invite_peers.notify[\"child-revealed\"].connect (() => {\n      if (this.revealer_invite_peers.child_revealed) {\n        this.image_icon_invite_peers.set_from_icon_name (\"window-close-symbolic\", Gtk.IconSize.DND);\n        this.entry_invite_peers.grab_focus_without_selecting ();\n      } else {\n        this.image_icon_invite_peers.set_from_icon_name (\"list-add-symbolic\", Gtk.IconSize.DND);\n        this.entry.grab_focus_without_selecting ();\n      }\n    });\n\n    this.revealer_invite_peers.set_reveal_child (!this.revealer_invite_peers.child_revealed);\n  }\n\n  // Callback: Toggle group menu.\n  [GtkCallback]\n  private void toggle_group_menu () {\n    this.revealer_group_menu.set_reveal_child (!this.revealer_group_menu.child_revealed);\n    this.entry.grab_focus_without_selecting ();\n  }\n\n  // Callback: Leave the group.\n  [GtkCallback]\n  private void leave_group () {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    if (main_window != null) {\n      main_window.remove_group (this.group);\n    }\n  }\n\n  // Callback: Mute the group (no notifications).\n  [GtkCallback]\n  private void mute_group () {\n    this.group.muted = !this.group.muted;\n    if (this.group.muted) {\n      this.button_group_mute.label = _(\"Unmute\");\n    } else {\n      this.button_group_mute.label = _(\"Mute\");\n    }\n  }\n\n  [GtkCallback]\n  private void peer_row_clicked (Gtk.ListBoxRow listbox_row) {\n    GroupListRow row = (GroupListRow) listbox_row;\n    string peer_name = row.peer.name;\n    int cursor_position = this.entry.get_position ();\n\n    string buffer = \"\";\n    if (cursor_position == 0) { // Start of the line, insert `$(peer_name): `.\n      buffer = @\"$(peer_name): \";\n    } else { // Anywhere else, insert `$(peer_name)`.\n      buffer = peer_name;\n    }\n\n    this.entry.insert_at_cursor (buffer);\n    this.entry.grab_focus_without_selecting ();\n    this.entry.set_position (cursor_position + buffer.length);\n  }\n\n  // Last scroll pos.\n  private double _bottom_scroll = 0.0;\n\n  [GtkCallback]\n  private void scroll_to_bottom () {\n    /**\n    * Check if the scrollbar is at the very max scroll, else don't do autoscroll.\n    * This prevent users searching in the history but getting bottom'd by the autoscroll.\n    **/\n    Gtk.Adjustment adj = this.scroll_messages.get_vadjustment ();\n    if (this._bottom_scroll == adj.value || this._bottom_scroll == 0.0) {\n      adj.set_value (adj.get_upper () - adj.get_page_size ());\n      this.is_bottom = true;\n    } else {\n      this.is_bottom = false;\n    }\n\n    this._bottom_scroll = adj.value;\n  }\n}\n"
  },
  {
    "path": "src/GroupListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/group-list-row.ui\")]\npublic class Ricin.GroupListRow : Gtk.ListBoxRow {\n  [GtkChild] Gtk.Image image_avatar;\n  [GtkChild] Gtk.Label label_name;\n  [GtkChild] Gtk.Button button_mute;\n  [GtkChild] Gtk.Image image_mute;\n  \n  public weak Tox.Peer peer;\n  public string pubkey;\n  \n  public GroupListRow (Tox.Peer peer) {\n    this.peer = peer;\n    this.pubkey = peer.pubkey;\n\n    this.init_widgets ();\n    this.init_signals ();\n  }\n\n  private void init_widgets () {\n    this.image_avatar.pixbuf = Util.pubkey_to_image (this.peer.pubkey, 24, 24);\n    \n    this.label_name.set_text (this.peer.name);\n    this.label_name.set_tooltip_text (this.peer.pubkey);\n  }\n\n  private void init_signals () {\n    this.peer.name_changed.connect (() => {\n      this.init_widgets ();\n    });\n  }\n  \n  public void init_mute_button () {\n    if (this.peer.muted) {\n      this.button_mute.set_tooltip_text (_(\"Unmute peer\"));\n      this.image_mute.icon_name = \"notifications-disabled-symbolic\";\n    } else {\n      this.button_mute.set_tooltip_text (_(\"Mute peer\"));\n      this.image_mute.icon_name = \"notifications-symbolic\";\n    }\n  }\n\n  [GtkCallback]\n  private void mute_peer () {\n    this.peer.muted = !this.peer.muted;\n    this.init_mute_button ();\n  }\n}\n"
  },
  {
    "path": "src/HistoryManager.vala",
    "content": "class HistoryManager {\n  private static ThemeManager? _instance;\n  public static ThemeManager instance {\n    get {\n      if (_instance == null) {\n        _instance = new ThemeManager ();\n      }\n      return _instance;\n    }\n    private set {\n      _instance = value;\n    }\n  }\n\n  private string logs_path = \"%s/logs\".printf (Tox.profile_dir ());\n\n  public HistoryManager (string pubkey) {\n    this.start (pubkey);\n  }\n\n  private void start (string pubkey) {\n    debug (\"Started history manager...\");\n    debug (@\"Logs path: $logs_path\");\n  }\n\n  private void load_history (Tox.Friend friend) {\n    try {\n      // Create a file that can only be accessed by the current user:\n      File file = File.new_for_path (\"my-test.bin\");\n      FileIOStream ios = file.create_readwrite (FileCreateFlags.PRIVATE);\n\n      //\n      // Set the file pointer to the beginning of the stream:\n      //\n      assert (ios.can_seek ());\n      ios.seek (0, SeekType.SET);\n\n      //\n      // Read n bytes:\n      //\n      FileInputStream @is = ((FileInputStream) ios.input_stream);\n\n      // Output: ``M``\n      uint8 buffer[1];\n      size_t size = @is.read (buffer);\n      stdout.write (buffer, size);\n\n      // Output: ``y 1. line``\n      DataInputStream dis = new DataInputStream (@is);\n      string str = dis.read_line ();\n      stdout.printf (\"%s\\n\", str);\n\n      // Output: ``My 2. line``\n      str = dis.read_line ();\n      stdout.printf (\"%s\\n\", str);\n\n      // Output: ``My 3. line``\n      str = dis.read_line ();\n      stdout.printf (\"%s\\n\", str);\n\n      // Output: ``10``\n      int16 i = dis.read_int16 ();\n      stdout.printf (\"%d\\n\", i);\n    } catch (Error e) {\n      stdout.printf (\"Error: %s\\n\", e.message);\n    }\n  }\n\n  public void write (string friend_pubkey, string text) {\n    /*try {\n      // Create a file that can only be accessed by the current user:\n      var history_path = @\"$logs_path/$friend_pubkey.log\";\n\n      File logs_file;\n      FileIOStream ios;\n\n      if (FileUtils.test (history_path, FileTest.EXISTS) == false) {\n        debug (\"No log file for this friend, creating it...\");\n        logs_file = File.new_for_path (history_path);\n        ios = logs_file.create_readwrite (FileCreateFlags.PRIVATE);\n      } else {\n        debug (\"Log file for this friend found, opening it...\");\n        logs_file = File.new_for_path (@\"$logs_path/$friend_pubkey.log\");\n        ios = logs_file.open_readwrite ();\n      }\n\n      size_t bytes_written;\n      FileOutputStream os = ios.output_stream as FileOutputStream;\n      DataOutputStream dos = new DataOutputStream (os);\n      dos.put_string (@\"$text\");\n      dos.put_string (\"\\n\");\n      //dos.put_int16 (10);\n    } catch (Error e) {\n      stdout.printf (\"Error: %s\\n\", e.message);\n    }*/\n  }\n}\n"
  },
  {
    "path": "src/IMessage.vala",
    "content": "/**\n* An interface.\n*/\npublic interface IMessage {\n\n}"
  },
  {
    "path": "src/IMessageListRow.vala",
    "content": ""
  },
  {
    "path": "src/InfoListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/info-list-row.ui\")]\nclass Ricin.InfoListRow : Gtk.ListBoxRow {\n  [GtkChild] Gtk.Image image_icon_info;\n  [GtkChild] Gtk.Label label_message;\n\n  public string message { get; set; default = \"\"; }\n\n  public InfoListRow (string message) {\n    this.message = message;\n  \n    this.init_widgets ();\n    this.init_signals ();\n  }\n  \n  private void init_widgets () {\n    if (Settings.instance.compact_mode) {\n      this.image_icon_info.set_size_request (-1, 20);\n    } else {\n      this.image_icon_info.set_size_request (80, 20);\n    }\n    \n    this.label_message.set_markup (Util.render_emojis (this.message));\n  }\n  \n  private void init_signals () {\n    Settings.instance.notify[\"compact-mode\"].connect (() => {\n      if (Settings.instance.compact_mode) {\n        this.image_icon_info.set_size_request (-1, 20);\n      } else {\n        this.image_icon_info.set_size_request (80, 20);\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "src/InlineFileMessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/inline-file-message-list-row.ui\")]\nclass Ricin.InlineFileMessageListRow : Gtk.ListBoxRow {\n  [GtkChild] Gtk.Label label_name;\n  [GtkChild] Gtk.Image image_file_type;\n  [GtkChild] Gtk.Label label_timestamp;\n  [GtkChild] Gtk.Box box_widget;\n  [GtkChild] Gtk.Label label_file_name;\n  [GtkChild] Gtk.Label label_file_size;\n  [GtkChild] public Gtk.Button button_save;\n  [GtkChild] public Gtk.Button button_reject;\n  [GtkChild] Gtk.Image image_save_inline;\n  [GtkChild] Gtk.Image image_reject_inline;\n  [GtkChild] Gtk.Box box_background;\n  [GtkChild] Gtk.Label label_foreground;\n  [GtkChild] Gtk.ProgressBar progress_file_percent;\n\n  private File file;\n  private uint32 file_id;\n  private string file_name;\n  private uint64 file_size;\n  private uint position;\n\n  // Managing the download\n  private bool downloaded = false;\n  private bool paused = false;\n\n  private weak Tox.Tox handle;\n  private weak Tox.Friend sender;\n  private Settings settings;\n\n  public signal void accept_file (bool response, uint32 file_id);\n\n  public InlineFileMessageListRow (Tox.Tox handle, Tox.Friend sender, uint32 file_id, string username, string file_path, uint64 file_size, string timestamp) {\n    this.handle = handle;\n    this.sender = sender;\n    this.settings = Settings.instance;\n\n    this.file = File.new_for_path (file_path);\n    this.file_id = file_id;\n    this.file_name = this.file.get_basename ();\n    this.file_size = file_size;\n\n    this.label_name.set_markup (@\"<b>$username</b>\");\n    this.label_timestamp.set_text (timestamp);\n    this.label_file_name.set_text (this.file_name);\n    this.label_file_size.set_text (Util.size_to_string (this.file_size));\n    this.progress_file_percent.set_fraction (0.0);\n\n    // If message is our (ugly&hacky way).\n    if (this.handle.username == username) {\n      debug (\"Keeping names in sync !\");\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n    }\n\n    this.sender.file_done.connect ((name, bytes, id) => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      debug (@\"File $(this.file_id) done!\");\n\n      // Set the progressbar to 100% and hide it.\n      this.progress_file_percent.set_fraction (1.0);\n      this.progress_file_percent.visible = false;\n\n      string downloads = this.settings.default_save_path;\n      File file_destination = File.new_for_path (@\"$downloads/$(this.file_name)\");\n      if (FileUtils.test (file_destination.get_path (), FileTest.EXISTS)) {\n        Rand rnd = new Rand.with_seed ((uint32)new DateTime.now_local ().hash ());\n        uint32 rnd_id = rnd.next_int ();\n        string filename = @\"$rnd_id-$(this.file_name)\";\n        file_destination = File.new_for_path (downloads.concat (\"/\", filename));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.file = file_destination;\n      } else {\n        file_destination = File.new_for_path (downloads.concat (\"/\", this.file_name));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.file = file_destination;\n      }\n\n      this.downloaded = true;\n      this.box_widget.get_style_context().add_class (\"saved-file\");\n      this.button_save.set_size_request (65, 20);\n      this.button_reject.visible = false;\n      this.image_save_inline.icon_name = \"folder-open-symbolic\";\n      this.button_save.sensitive = true;\n    });\n\n    this.sender.file_received.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.downloaded = true;\n\n      this.box_widget.get_style_context().add_class (\"saved-file\");\n      this.button_save.set_size_request (65, 20);\n      this.button_reject.visible = false;\n      this.button_save.sensitive = true;\n      //this.label_foreground.width_request = -1;\n      this.image_save_inline.icon_name = \"object-select-symbolic\";\n      this.button_save.set_tooltip_text (\"File saved. Click to open\");\n    });\n\n    /*this.sender.file_progress.connect ((id, position) => {\n      if (id != this.file_id)\n        return;\n\n      var percent = (int)position / this.file_size;\n      debug (@\"File $id - Size: $(this.file_size) - Position: $position\");\n      debug (@\"Progress percent: $percent\");\n      //debug (@\"Received %s% of file %s\", percent, id);\n      this.progressbar_buffer.set_fraction ((int) percent);\n\n      this.progressbar_buffer.notify[\"fraction\"].connect((o, p) => {\n        this.label_foreground.width_request = (int) this.progressbar_buffer.fraction * 100;\n      });\n    });*/\n\n    this.sender.file_paused.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.image_save_inline.icon_name = \"media-playback-start-symbolic\";\n    });\n\n    this.sender.file_resumed.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.image_save_inline.icon_name = \"media-playback-pause-symbolic\";\n    });\n\n    this.sender.file_canceled.connect (id => {\n      if (id != this.file_id) {\n        return;\n      }\n\n      this.file_id = -1; // File doesn't exists now, avoid issues.\n      this.box_widget.get_style_context().add_class (\"canceled-file\");\n      this.button_reject.set_size_request (65, 20);\n      this.button_reject.sensitive = false;\n      //this.label_foreground.width_request = -1;\n      this.button_save.visible = false;\n      this.progress_file_percent.visible = false;\n      this.button_reject.set_tooltip_text (\"Canceled\");\n    });\n\n    /*this.sender.file_progress.connect ((id, position) => {\n      if (id != this.file_id)\n        return;\n\n      debug (@\"File Progress: id: $id - position: $position\");\n    });*/\n  }\n\n  [GtkCallback]\n  private void save_file () {\n    /**\n    * TODO: Handle multiple state of the button using a less hacky way.\n    **/\n    if (this.downloaded == false) {\n      debug (\"Requested to save file\");\n      this.accept_file (true, this.file_id);\n      /*this.box_widget.get_style_context().add_class (\"progress-bg\");\n      this.label_foreground.get_style_context().add_class (\"progress-fg\");\n      this.progress_transfers.visible = true;*/\n    } else {\n      /**\n      * TODO: Open the file in folder.\n      **/\n      try {\n        AppInfo.launch_default_for_uri (this.file.get_uri (), null);\n      } catch (Error e) {\n        debug (@\"Cannot open $(this.file_name): $(e.message)\");\n      }\n      return;\n    }\n\n    if (this.paused == false) {\n      this.paused = !this.paused;\n      this.image_save_inline.icon_name = \"media-playback-pause-symbolic\";\n      //this.label_foreground.width_request = this.label_foreground.width_request + 10;\n    } else {\n      this.paused = !this.paused;\n      this.image_save_inline.icon_name = \"media-playback-start-symbolic\";\n    }\n\n    /**\n    * TODO: Change box_widget background to progress.\n    * NOTE: Use a Gtk.Overlay and change it's background color + update width\n    *       of the overlay related to the file progress.\n    **/\n    /*this.box_widget.get_style_context().add_class (\"saved-file\");\n    this.button_save.set_size_request (65, 20);\n    this.button_save.sensitive = false;\n    this.button_reject.visible = false;*/\n  }\n\n  [GtkCallback]\n  private void reject_file () {\n    this.accept_file (false, this.file_id);\n    this.file_id = -1; // File doesn't exists now, avoid issues.\n\n    /**\n    * TODO: Change box_widget background to red.\n    * NOTE: Use the .canceled-file css class defined in default.css\n    **/\n    this.box_widget.get_style_context().add_class (\"canceled-file\");\n\n    //this.button_reject.label = \"Canceled\";\n    /*this.progress_transfers.visible = false;*/\n    this.button_reject.set_size_request (65, 20);\n    this.button_reject.sensitive = false;\n    this.button_save.visible = false;\n  }\n\n  private void open_file () {\n\n  }\n}\n"
  },
  {
    "path": "src/InlineImageMessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/inline-image-message-list-row.ui\")]\nclass Ricin.InlineImageMessageListRow : Gtk.ListBoxRow {\n  [GtkChild] Gtk.Label label_name;\n  [GtkChild] Gtk.Image image_inline;\n  [GtkChild] Gtk.Label label_timestamp;\n  [GtkChild] Gtk.Label label_image_name;\n  [GtkChild] Gtk.Label label_image_size;\n  [GtkChild] public Gtk.Button button_save_inline;\n  [GtkChild] Gtk.Image image_save_inline;\n\n  private File image;\n  private string image_name;\n  private uint32 image_id;\n\n  private uint position;\n  private weak Tox.Tox handle;\n  private weak Tox.Friend sender;\n  private Settings settings;\n\n  public signal void accept_image (bool response, uint32 file_id);\n\n  public InlineImageMessageListRow (Tox.Tox handle, Tox.Friend sender, uint32 file_id, string name, string image_path, string timestamp, bool? is_local, Gdk.Pixbuf? image_pixbuf = null, string? pixbuf_name = null) {\n    this.handle = handle;\n    this.settings = Settings.instance;\n\n    this.image = File.new_for_path (image_path);\n    this.image_id = file_id;\n\n    // Ask for image downloading.\n    this.accept_image (true, this.image_id);\n\n    this.label_name.set_markup (@\"<b>$name</b>\");\n    this.label_timestamp.set_text (timestamp);\n\n    // If message is our (ugly&hacky way).\n    if (this.handle.username == name) {\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n    }\n\n    if (image_pixbuf == null) {\n      if (is_local) {\n        var pixbuf = new Gdk.Pixbuf.from_file_at_scale (this.image.get_path (), 400, 150, true);\n        this.image_inline.set_from_pixbuf (pixbuf);\n        FileInfo info = this.image.query_info (\"standard::*\", 0);\n        this.image_name = info.get_display_name ();\n        var image_size = info.get_size () / 1000;\n        this.label_image_name.set_text (@\"$(this.image_name)\");\n        this.label_image_size.set_text (Util.size_to_string (image_size));\n      }\n    } else {\n      var pixbuf = image_pixbuf.scale_simple (this.width_request, 200, Gdk.InterpType.BILINEAR);\n      this.image_inline.set_from_pixbuf (pixbuf);\n      this.label_image_name.set_text (pixbuf_name);\n      this.label_image_size.set_text (Util.size_to_string (image_pixbuf.get_byte_length () / 1000));\n\n      return;\n    }\n\n    this.sender.file_done.connect ((name, bytes, id) => {\n      if (id != this.image_id) {\n        return;\n      }\n\n      debug (@\"Image $(this.image_id) done!\");\n\n      string downloads = this.settings.default_save_path;\n      string filename = this.image_name;\n      File file_destination = File.new_for_path (this.image.get_path ());\n      if (FileUtils.test (file_destination.get_path (), FileTest.EXISTS)) {\n        Rand rnd = new Rand.with_seed ((uint32)new DateTime.now_local ().hash ());\n        uint32 rnd_id = rnd.next_int ();\n        filename = @\"$rnd_id-$(this.image_name)\";\n        file_destination = File.new_for_path (downloads.concat (\"/\", filename));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.image = file_destination;\n      } else {\n        file_destination = File.new_for_path (downloads.concat (\"/\", this.image_name));\n        FileUtils.set_data (file_destination.get_path (), bytes.get_data ());\n        this.image = file_destination;\n      }\n\n      if (FileUtils.test (file_destination.get_path (), FileTest.EXISTS)) {\n        this.image = file_destination;\n        var pixbuf = new Gdk.Pixbuf.from_file_at_scale (this.image.get_path (), 400, 250, true);\n        this.image_inline.set_from_pixbuf (pixbuf);\n        FileInfo info = this.image.query_info (\"standard::*\", 0);\n        this.image_name = info.get_display_name ();\n        var image_size = info.get_size () / 1000;\n        this.label_image_name.set_text (filename);\n        this.label_image_size.set_text (Util.size_to_string (image_size));\n      }\n    });\n  }\n\n  [GtkCallback]\n  private void save_image () {\n    string downloads = this.settings.default_save_path;\n    File image_destination = File.new_for_path (@\"$downloads/$(this.image_name)\");\n\n    int i = 0;\n    string filename = this.image_name;\n    while (FileUtils.test (image_destination.get_path (), FileTest.EXISTS)) {\n      filename = @\"$(++i)-$(this.image_name)\";\n    }\n\n    image_destination = File.new_for_path (@\"$downloads/$filename\");\n    this.image.copy (image_destination, FileCopyFlags.NONE);\n\n    if (FileUtils.test (image_destination.get_path (), FileTest.EXISTS)) {\n      this.image.delete ();\n\n      this.button_save_inline.label = _(\"Image saved!\");\n      this.image_save_inline.icon_name = \"object-select-symbolic\";\n      this.button_save_inline.sensitive = false;\n    }\n  }\n\n  private void popover_image () {\n\n  }\n}\n"
  },
  {
    "path": "src/MainWindow.vala",
    "content": "using Gtk;\n\n[GtkTemplate (ui=\"/chat/tox/ricin/ui/main-window.ui\")]\npublic class Ricin.MainWindow : Gtk.ApplicationWindow {\n  // User profile.\n  [GtkChild] Gtk.Box box_profile;\n  [GtkChild] Gtk.Image avatar_image;\n  private EditableLabel entry_name;\n  private EditableLabel entry_status;\n  [GtkChild] Gtk.Button button_user_status;\n  [GtkChild] Gtk.Image image_user_status;\n\n  // Search + filter.\n  [GtkChild] Gtk.SearchEntry searchentry_friend;\n  [GtkChild] Gtk.ComboBoxText combobox_friend_filter;\n\n  // Friend requests.\n  [GtkChild] Gtk.Revealer revealer_friend_request;\n  [GtkChild] Gtk.Box box_notify_friend_request;\n  [GtkChild] Gtk.Box box_friend_request_new;\n  [GtkChild] Gtk.Button button_friend_request_expand;\n  [GtkChild] Gtk.Image image_friend_request_expand;\n\n  [GtkChild] Gtk.Revealer revealer_friend_request_details;\n  [GtkChild] Gtk.Label label_friend_request_pubkey;\n  [GtkChild] Gtk.Label label_friend_request_message;\n  [GtkChild] Gtk.Button button_friend_request_accept;\n  [GtkChild] Gtk.Button button_friend_request_cancel;\n\n  // Friendlist + Grouplist + chatview.\n  [GtkChild] public Gtk.ListBox friendlist;\n  [GtkChild] public Gtk.ListBox grouplist;\n  [GtkChild] public Gtk.Stack chat_stack;\n\n  // Add friend revealer.\n  [GtkChild] public Gtk.Button button_add_friend_show;\n  [GtkChild] public Gtk.Revealer add_friend;\n  [GtkChild] public Gtk.Entry entry_friend_id;\n  [GtkChild] Gtk.TextView entry_friend_message;\n  [GtkChild] Gtk.Label label_add_error;\n\n  // System notify.\n  [GtkChild] public Gtk.Revealer revealer_system_notify;\n  [GtkChild] public Gtk.Label label_system_notify;\n\n  // Bottom buttons.\n  [GtkChild] Gtk.Box box_bottom_buttons;\n  [GtkChild] Gtk.Button button_settings;\n\n  private SettingsView settings_view;\n  private GLib.ListStore friends = new GLib.ListStore (typeof (Tox.Friend));\n  private GLib.ListStore groups = new GLib.ListStore (typeof (Tox.Group));\n\n  public Tox.Tox tox;\n  public string focused_view;\n  public int global_unread_counter = 0;\n  public static Gtk.AccelGroup accel_group;\n\n  private Gtk.ListBoxRow selected_row;\n  private Gtk.Menu menu_statusicon_main;\n  private Gtk.StatusIcon statusicon_main;\n  private Settings settings;\n  private string window_title;\n  private string profile;\n\n  public signal void notify_message (string message, int timeout = 5000);\n  private signal void set_hint (bool hint);\n\n  [Signal (action = true)] private signal void change_chat_up ();\n  [Signal (action = true)] private signal void change_chat_down ();\n\n  public MainWindow (Gtk.Application app, string profile, string? password = null, bool is_new = false) {\n    Object (application: app);\n    this.settings = Settings.instance;\n    this.profile = profile;\n\n    Gdk.Pixbuf app_icon = new Gdk.Pixbuf.from_resource (Ricin.ICON_PATH);\n    string profile_base = File.new_for_path (profile).get_basename ();\n    string profile_name = profile_base.replace (\".tox\", \"\");\n\n    var app_name = Ricin.APP_NAME;\n    this.window_title = @\"$app_name - $profile_name\";\n\n    this.set_title (window_title);\n    // This should fix the #59 issue\n    this.set_size_request (960, 500);\n    this.set_icon (app_icon);\n\n    this.init_keyboard_shortcuts ();\n    this.notify[\"global-unread-counter\"].connect ((obj, prop) => {\n      if (this.global_unread_counter == 0) {\n        this.set_urgency_hint (false);\n      } else {\n        this.set_urgency_hint (true);\n      }\n    });\n\n    var opts = Tox.Options.create ();\n    opts.ipv6_enabled = this.settings.network_ipv6;\n    opts.udp_enabled = this.settings.network_udp;\n    opts.start_port = 33445;\n    opts.end_port = 33745;\n\n    if (this.settings.enable_proxy) {\n      debug (\"Ricin is being proxied.\");\n      opts.proxy_type = ToxCore.ProxyType.SOCKS5;\n      opts.proxy_host = this.settings.proxy_host;\n      opts.proxy_port = (uint16) this.settings.proxy_port;\n      debug (\"Proxy type: SOCKS5\");\n      debug (@\"Proxy host: $(opts.proxy_host)\");\n      debug (@\"Proxy port: $(opts.proxy_port)\");\n    }\n\n    try {\n      this.tox = new Tox.Tox (opts, profile, password, is_new);\n    } catch (Error error) {\n      warning (\"Tox init failed: %s\", error.message);\n      this.destroy ();\n      var error_dialog = new Gtk.MessageDialog (this,\n          Gtk.DialogFlags.MODAL,\n          Gtk.MessageType.WARNING,\n          Gtk.ButtonsType.OK,\n          \"%s\", _(\"Can't load the profile\")\n                                               );\n      error_dialog.secondary_use_markup = true;\n      error_dialog.format_secondary_markup (@\"<span color=\\\"#e74c3c\\\">$(error.message)</span>\");\n      error_dialog.response.connect (resp => error_dialog.destroy ()); // if we don't use a signal the profile chooser closes\n      error_dialog.show ();\n      return;\n    }\n\n    // Display the settings view.\n    this.settings_view = new SettingsView (this.tox);\n    this.chat_stack.add_named (this.settings_view, \"settings\");\n    this.chat_stack.set_visible_child (this.settings_view);\n    this.focused_view = \"settings\";\n    this.set_title (this.window_title + \" - \" + _(@\"Settings\"));\n\n    this.settings_view.reload_options.connect (this.reload_tox);\n\n    // Display the welcome screen while their is no friends online.\n    /*var welcome = new WelcomeView (this.tox);\n    this.chat_stack.add_named (welcome, \"welcome\");\n    this.chat_stack.set_visible_child (welcome);\n    this.focused_view = \"welcome\";*/\n\n    var path = avatar_path ();\n    if (FileUtils.test (path, FileTest.EXISTS)) {\n      tox.send_avatar (path);\n      var pixbuf = new Gdk.Pixbuf.from_file_at_scale (path, 48, 48, false);\n      this.avatar_image.pixbuf = pixbuf;\n    } else {\n      Cairo.Surface surface = Util.identicon_for_pubkey (this.tox.pubkey);\n      this.avatar_image.pixbuf = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n    }\n\n    this.init_tray_icon ();\n    // TODO\n    if (is_new) {\n      tox.username = profile_name;\n    } else if (tox.username == \"\") {\n      tox.username = \"Ricin user\";\n    }\n\n    if (tox.status_message == \"\") {\n      tox.status_message = \"Ricin rocks! https://ricin.im\";\n    }\n\n    this.entry_name = new EditableLabel.with_bold (tox.username);\n    this.entry_status = new EditableLabel (tox.status_message);\n\n    //this.box_profile = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);\n    this.box_profile.pack_start (this.entry_name, true, true, 0);\n    this.box_profile.pack_start (this.entry_status, true, true, 0);\n\n    this.entry_status.label.bind_property (\"label\", tox, \"status_message\", BindingFlags.BIDIRECTIONAL | BindingFlags.SYNC_CREATE);\n    this.entry_name.label_changed.connect ((text) => {\n      debug (@\"New username: $text\");\n      this.tox.username = Util.escape_html (text);\n    });\n    this.entry_status.label_changed.connect ((text) => {\n      debug (@\"New status message: $text\");\n      this.tox.status_message = Util.escape_html (text);\n    });\n\n    this.image_user_status.set_from_resource (\"/chat/tox/ricin/images/status/offline.png\");\n\n    // Filter + search.\n    this.combobox_friend_filter.append_text (_(\"Online friends\"));\n    this.combobox_friend_filter.append_text (_(\"All friends\"));\n    this.combobox_friend_filter.active = 0;\n\n    this.combobox_friend_filter.changed.connect (this.friend_list_update_search);\n\n    this.friendlist.set_sort_func (sort_friendlist_online);\n    this.friendlist.bind_model (this.friends, fr => new FriendListRow ((Tox.Friend) fr));\n    this.grouplist.bind_model (this.groups, group => new FriendListRow.groupchat ((Tox.Group) group));\n\n    /**\n    * Set how the contact list is filtered.\n    * Returns true if the row should be shown, false if not.\n    * TODO: DEBUG THAT SOMEDAYS.\n    **/\n    /*this.friendlist.set_filter_func ((row) => {\n      string? search = this.searchentry_friend.text;\n      FriendListRow row_friend = ((FriendListRow) row);\n      string friend_pubkey = row_friend.fr.pubkey.down();\n      string friend_name = row_friend.fr.name.down();\n      string friend_mood = row_friend.fr.status_message.down();\n      Tox.UserStatus friend_status = row_friend.fr.status;\n      int friend_unread_messages = row_friend.unreadCount;\n      bool isSearch = (search != null || search.length != 0);\n      bool showOnlineOnly = (this.combobox_friend_filter.active == 0);\n\n      //if (showOnlineOnly && friend_status == Tox.UserStatus.OFFLINE) return false; // If show only online && contact is offline.\n      if (isSearch) { // If the user inputed text in the search input.\n        if (friend_pubkey.index_of (search.down()) != -1) return true; // If we match the friend pubkey.\n        if (friend_name.index_of (search.down()) != -1) return true; // If the search exists in friend name.\n        if (friend_mood.index_of (search.down()) != -1) return true; // If the search exists in friend status message.\n        return false;\n      }\n      return false;\n    });*/\n\n    this.friendlist.set_filter_func (row => {\n      string? search = this.searchentry_friend.text.down ();\n\n      var friend = ((FriendListRow) row);\n      string name = friend.fr.name.down ();\n      string status_message = friend.fr.status_message.down ();\n      string pubkey = friend.fr.pubkey.down ();\n      Tox.UserStatus status = friend.fr.status;\n      bool is_blocked = friend.fr.blocked;\n      bool is_presumed_dead = friend.fr.is_presumed_dead ();\n\n      var mode = this.combobox_friend_filter.active;\n\n      if (search == null || search.length == 0) {\n        if (friend.unreadCount > 0) {\n          return true;\n        }\n        if (mode == 0 && status == Tox.UserStatus.OFFLINE) {\n          return false;\n        }\n        return true;\n      } else if (search.length > 0) {\n        switch (search) {\n          case \"f:blocked\":\n            if (is_blocked) {\n              return true;\n            }\n            return false;\n          case \"f:old\":\n            if (is_presumed_dead) {\n              return true;\n            }\n            return false;\n        }\n      } else if (mode == 0) {\n        if (status == Tox.UserStatus.OFFLINE) {\n          return false;\n        }\n      }\n\n      if (name.index_of (search) != -1) {\n        return true;\n      }\n      if (status_message.index_of (search) != -1) {\n        return true;\n      }\n      if (pubkey == search) {\n        return true;\n      }\n      return false;\n    });\n\n    tox.notify[\"connected\"].connect ((src, prop) => {\n      string icon = \"\";\n\n      // Sync the status with the one stored on the .tox file.\n      switch (this.tox.status) {\n        case Tox.UserStatus.ONLINE:\n          // Set status to online.\n          this.tox.status = Tox.UserStatus.ONLINE;\n          icon = \"online\";\n          break;\n        case Tox.UserStatus.AWAY:\n          // Set status to away.\n          this.tox.status = Tox.UserStatus.AWAY;\n          icon = \"idle\";\n          break;\n        case Tox.UserStatus.BUSY:\n          // Set status to busy.\n          this.tox.status = Tox.UserStatus.BUSY;\n          icon = \"busy\";\n          break;\n        default:\n          // Set status to offline.\n          icon = \"offline\";\n          break;\n      }\n\n      icon = this.tox.connected ? icon : \"offline\";\n      this.image_user_status.set_from_resource (@\"/chat/tox/ricin/images/status/$icon.png\");\n      this.button_user_status.sensitive = this.tox.connected;\n    });\n    /*\n    * TODO: DEBUG THAT FUCKING SHIT.\n    */\n    this.tox.group_request.connect ((friend_number, type, data) => {\n      debug (@\"Friend $(friend_number) invited you in a group, accepting...\");\n      Tox.Group? group = this.tox.accept_group_request (friend_number, data);\n\n      if (group != null) {\n        try {\n          string view_name = \"group-%d\".printf (group.id);\n          this.chat_stack.add_named (new GroupChatView (this.tox, group, this.chat_stack, view_name), view_name);\n          this.groups.append (group);\n        } catch (Error e) {\n          debug (@\"Error while joining group $(group.num), error: $(e.message)\");\n        }\n        return true;\n      }\n\n      return false;\n    });\n\n    this.tox.friend_request.connect ((id, message) => {\n      debug (@\"Received friend request from $id: $message\");\n\n      this.revealer_friend_request.set_reveal_child (true);\n      this.revealer_friend_request_details.set_reveal_child (false);\n\n      this.label_friend_request_pubkey.set_text (id);\n      this.label_friend_request_message.set_text (message);\n      this.image_friend_request_expand.icon_name = \"go-down-symbolic\";\n\n      this.button_friend_request_expand.clicked.connect (() => {\n        bool is_expanded = this.revealer_friend_request_details.child_revealed;\n        this.revealer_friend_request_details.set_reveal_child (!is_expanded);\n        this.image_friend_request_expand.icon_name = (is_expanded) ? \"go-top-symbolic\" : \"go-down-symbolic\";\n      });\n\n      this.button_friend_request_accept.clicked.connect (() => {\n        debug (@\"Accepted friend request from $id\");\n        var friend = tox.accept_friend_request (id);\n        if (friend != null) {\n          friend.name = id; // To avoid blank items.\n          this.tox.save_data (); // Needed to avoid breaking profiles if app crash.\n\n          friend.position = friends.get_n_items ();\n          debug (\"Friend position: %u\", friend.position);\n          friends.append (friend);\n          var view_name = \"chat-%s\".printf (friend.pubkey);\n          chat_stack.add_named (new ChatView (this.tox, friend, this.chat_stack, view_name), view_name);\n        }\n\n        this.revealer_friend_request.set_reveal_child (false);\n        this.revealer_friend_request_details.set_reveal_child (false);\n        this.label_friend_request_pubkey.set_text (\"\");\n        this.label_friend_request_message.set_text (\"\");\n      });\n\n      this.button_friend_request_cancel.clicked.connect (() => {\n        debug (@\"Rejected friend request from $id\");\n        this.revealer_friend_request.set_reveal_child (false);\n        this.revealer_friend_request_details.set_reveal_child (false);\n        this.label_friend_request_pubkey.set_text (\"\");\n        this.label_friend_request_message.set_text (\"\");\n      });\n    });\n\n    this.tox.friend_online.connect ((friend) => {\n      if (friend != null) {\n        friend.position = friends.get_n_items ();\n        debug (\"Friend position: %u\", friend.position);\n        friends.append (friend);\n        var view_name = \"chat-%s\".printf (friend.pubkey);\n        chat_stack.add_named (new ChatView (this.tox, friend, this.chat_stack, view_name), view_name);\n\n        // Send our avatar.\n        friend.send_avatar ();\n      }\n    });\n\n    this.notify_message.connect ((message, timeout) =>  {\n      this.label_system_notify.use_markup = true;\n      this.label_system_notify.set_markup (message);\n      this.revealer_system_notify.set_reveal_child (true);\n      Timeout.add (timeout, () => {\n        this.revealer_system_notify.set_reveal_child (false);\n        //return Source.REMOVE;\n        return false;\n      });\n    });\n\n    this.notify[\"has-toplevel-focus\"].connect (() => {\n      if (this.has_toplevel_focus) {\n        this.minimized = false;\n      }\n      this.set_urgency_hint (false);\n    });\n    this.window_state_event.connect ((e) => {\n      if (e.new_window_state == Gdk.WindowState.ICONIFIED) {\n        this.minimized = true;\n      }\n\n      return false;\n    });\n\n    this.tox.run_loop ();\n    this.show_all ();\n    this.append_friends.begin ();\n  }\n\n  private bool minimized = false;\n  public void set_desktop_hint (bool hint) {\n    if (this.settings.enable_taskbar_notify == false) {\n      return;\n    }\n\n    if (this.minimized || this.has_toplevel_focus == false) {\n      this.set_urgency_hint (hint);\n    }\n  }\n\n  private void init_keyboard_shortcuts () {\n    this.accel_group = new Gtk.AccelGroup ();\n    this.add_accel_group (this.accel_group);\n\n    /**\n    * Shortcut for Ctrl+Up: Change the chat view to the previous one.\n    **/\n    this.add_accelerator (\n      \"change-chat-up\", accel_group, Gdk.keyval_from_name(\"Up\"),\n      Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.change_chat_down.connect (() => {\n      int index = this.selected_row.get_index ();\n      uint max = this.friendlist.get_children ().length ();\n\n      if (index == max) {\n        return;\n      }\n\n      var next_row = this.friendlist.get_row_at_index (index + 1);\n      this.selected_row = next_row;\n      this.selected_row.activate ();\n      this.friendlist.select_row (next_row);\n    });\n\n    /**\n    * Shortcut for Ctrl+Down: Change the chat view to the next one.\n    **/\n    this.add_accelerator (\n      \"change-chat-down\", accel_group, Gdk.keyval_from_name(\"Down\"),\n      Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE\n    );\n\n    this.change_chat_up.connect (() => {\n      int index = this.selected_row.get_index ();\n\n      if (index == 0) {\n        return;\n      }\n\n      var prev_row = this.friendlist.get_row_at_index (index - 1);\n      this.selected_row = prev_row;\n      this.selected_row.activate ();\n      this.friendlist.select_row (prev_row);\n    });\n  }\n\n  private async void append_friends () {\n    // Add friends from the .tox file.\n    uint32[] contacts = this.tox.self_get_friend_list ();\n    for (int i = 0; i < contacts.length; i++) {\n      uint32 friend_num = contacts[i];\n      debug (@\"Friend from .tox: num → $friend_num\");\n\n      var friend = this.tox.add_friend_by_num (friend_num);\n      friend.connected = false;\n      friend.position = friends.get_n_items ();\n      debug (\"Friend position: %u\", friend.position);\n      debug (\"Friend name: %s\", friend.get_uname ());\n      debug (\"Friend status_message: %s\", friend.get_ustatus_message ());\n      this.friends.append (friend);\n\n      var view_name = \"chat-%s\".printf (friend.pubkey);\n      this.chat_stack.add_named (new ChatView (this.tox, friend, this.chat_stack, view_name), view_name);\n    }\n  }\n\n  private string avatar_path () {\n    return Tox.profile_dir () + \"avatars/\" + this.tox.pubkey + \".png\";\n  }\n\n  /**\n  * This is the sort method used for sorting contacts based on:\n  * Contact have unreadCount > 0: top.\n  * Contact is online (top) → Contact is offline (end)\n  * Contact status: Online → Away → Busy → Blocked → Offlines with name → Offlines without name.\n  */\n  public static int sort_friendlist_online (Gtk.Widget row1, Gtk.Widget row2) {\n    var friend1 = ((FriendListRow) row1);\n    var friend2 = ((FriendListRow) row2);\n\n    if (friend1.unreadCount > friend2.unreadCount) {\n      return -1;\n    }\n\n    if (friend1.fr.status != Tox.UserStatus.OFFLINE && friend2.fr.status == Tox.UserStatus.OFFLINE) {\n      return -1;\n    } else if (friend1.fr.status == Tox.UserStatus.OFFLINE && friend2.fr.status != Tox.UserStatus.OFFLINE) {\n      return 1;\n    } else if (friend1.fr.status != Tox.UserStatus.OFFLINE && friend2.fr.status != Tox.UserStatus.OFFLINE) {\n      if (friend1.fr.blocked && !friend2.fr.blocked) {\n        return 1;\n      }\n      return friend1.fr.status - friend2.fr.status;\n    }\n    return friend1.fr.status - friend2.fr.status;\n  }\n  \n  public void open_profile (Tox.Friend fr) {\n    var view = this.chat_stack.get_child_by_name (\"chat-%s\".printf (fr.pubkey));\n    ((ChatView) view).toggle_friend_menu ();\n    this.chat_stack.set_visible_child (view);\n  }\n  \n  public void copy_toxid (Tox.Friend fr) {\n    var view = this.chat_stack.get_child_by_name (\"chat-%s\".printf (fr.pubkey));\n    ((ChatView) view).toggle_friend_menu ();\n    this.chat_stack.set_visible_child (view);\n  }\n\n  public void remove_friend (Tox.Friend fr) {\n    var friend = fr;\n    var name = friend.get_uname ();\n    var dialog = new Gtk.MessageDialog (\n      this,\n      Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE,\n      \"Are you sure you want to delete \\\"%s\\\"?\", name\n    );\n    dialog.secondary_text = @\"This will remove \\\"$name\\\" and the chat history with it forever.\";\n    dialog.add_buttons (_(\"Yes\"), Gtk.ResponseType.ACCEPT, _(\"No\"), Gtk.ResponseType.REJECT);\n    dialog.response.connect (response => {\n      if (response == Gtk.ResponseType.ACCEPT) {\n        bool result = friend.delete ();\n        if (result) {\n          var next_row = this.friendlist.get_row_at_index (this.selected_row.get_index () - 1);\n          this.friendlist.remove (this.selected_row);\n          this.selected_row = next_row;\n          this.selected_row.activate ();\n          this.friendlist.select_row (next_row);\n\n          var next_view = ((FriendListRow) next_row).view_name;\n          var view = this.chat_stack.get_child_by_name (next_view);\n          this.chat_stack.set_visible_child (view);\n\n          this.friendlist.invalidate_filter (); // Update the friendlist.\n          this.friendlist.invalidate_sort (); // Update the friendlist.\n          this.tox.save_data ();\n        }\n      }\n\n      dialog.destroy ();\n    });\n\n    dialog.show ();\n  }\n\n  public void remove_group (Tox.Group group) {\n    /**\n    * Leave a group properly:\n    * 1. Remove the GroupChatView ;\n    * 2. Remove the FriendListRow associated to the group ;\n    * 3. Ask Tox instance to remove the groupchat ;\n    * 4. Switch to the next view.\n    **/\n    // Get the widgets.\n    FriendListRow row = (FriendListRow) this.selected_row;\n    GroupChatView view = (GroupChatView) this.chat_stack.get_child_by_name (row.view_name);\n    int row_index = row.get_index ();\n\n    // Now remove them.\n    this.chat_stack.remove (view);\n    this.grouplist.remove (row);\n\n    // Then guess the next row to select.\n    int groups_rows = (int) this.grouplist.get_children ().length ();\n    int friends_rows = (int) this.friendlist.get_children ().length ();\n    ListBoxRow next_row = null;\n\n    if (groups_rows > 0) // We have groups, next is a group.\n    {\n      next_row = (ListBoxRow) this.grouplist.get_row_at_index (0);\n      this.grouplist.select_row (next_row);\n    }\n    else if (groups_rows == 0 && friends_rows > 0) // We have no groups but friends, next is a friend.\n    {\n      next_row = (ListBoxRow) this.friendlist.get_row_at_index (0);\n      this.friendlist.select_row (next_row);\n    }\n    else // We have no groups nor friends, next is settings.\n    {\n      this.grouplist.select_row (null);\n      this.friendlist.select_row (null);\n    }\n    \n    // Now display the correct group, friend or setting view.\n    if (next_row != null) {\n      Widget next_view = this.chat_stack.get_child_by_name (((FriendListRow) next_row).view_name);\n      this.chat_stack.set_visible_child (next_view);\n    } else {\n      this.display_settings ();\n    }\n    \n    // Finally, ask toxcore to leave the group.\n    bool result = this.tox.leave_group (group.num);\n    if (result) {\n      debug (\"Left the group number %d\", group.num);\n    }\n\n    this.grouplist.invalidate_filter (); // Update the grouplist.\n    this.grouplist.invalidate_sort (); // Update the grouplist.\n  }\n\n  public void show_add_friend_popover_with_text (string toxid = \"\", string message = \"\") {\n    string friend_message = \"\";\n    if (message.strip () == \"\") {\n      string username = this.tox.username;\n      friend_message = _(\"Hello! It's %s, let's be friends.\").printf (username);\n    }\n\n    this.entry_friend_id.set_text (toxid);\n    this.entry_friend_message.buffer.text = friend_message;\n    this.add_friend.set_reveal_child (true);\n  }\n\n  private void init_tray_icon () {\n    try {\n      Gdk.Pixbuf tray_icon = new Gdk.Pixbuf.from_resource (\"/chat/tox/ricin/images/icons/ricin.svg\");\n      this.statusicon_main = new Gtk.StatusIcon.from_pixbuf (tray_icon);\n      this.statusicon_main.set_tooltip_text (\"Ricin\");\n      this.statusicon_main.visible = true;\n    } catch (Error e) {\n      warning (\"Pixbuf error: %s\", e.message);\n    }\n\n\n    this.menu_statusicon_main = new Gtk.Menu ();\n\n    // ONLINE\n    var menuOnline = new Gtk.ImageMenuItem.with_label (_(\"Online\"));\n    var menuOnlineImage = new Gtk.Image.from_resource (\"/chat/tox/ricin/images/status/online.png\");\n    menuOnline.always_show_image = true;\n    menuOnline.set_image (menuOnlineImage);\n    menuOnline.activate.connect (() => {\n      this.tox.status = Tox.UserStatus.ONLINE;\n      this.image_user_status.set_from_resource (\"/chat/tox/ricin/images/status/online.png\");\n    });\n\n    // BUSY\n    var menuBusy = new Gtk.ImageMenuItem.with_label (_(\"Busy\"));\n    var menuBusyImage = new Gtk.Image.from_resource (\"/chat/tox/ricin/images/status/busy.png\");\n    menuBusy.always_show_image = true;\n    menuBusy.set_image (menuBusyImage);\n    menuBusy.activate.connect (() => {\n      this.tox.status = Tox.UserStatus.BUSY;\n      this.image_user_status.set_from_resource (\"/chat/tox/ricin/images/status/busy.png\");\n    });\n\n    // AWAY\n    var menuAway = new Gtk.ImageMenuItem.with_label (_(\"Away\"));\n    var menuAwayImage = new Gtk.Image.from_resource (\"/chat/tox/ricin/images/status/idle.png\");\n    menuAway.always_show_image = true;\n    menuAway.set_image (menuAwayImage);\n    menuAway.activate.connect (() => {\n      this.tox.status = Tox.UserStatus.AWAY;\n      this.image_user_status.set_from_resource (\"/chat/tox/ricin/images/status/idle.png\");\n    });\n\n    // QUIT\n    var menuQuit = new Gtk.ImageMenuItem.with_label (_(\"Quit\"));\n    var menuQuitImage = new Gtk.Image.from_icon_name (\"window-close\", Gtk.IconSize.MENU);\n    menuQuit.always_show_image = true;\n    menuQuit.set_image (menuQuitImage);\n    menuQuit.activate.connect (this.close);\n\n    this.menu_statusicon_main.append (menuOnline);\n    this.menu_statusicon_main.append (menuAway);\n    this.menu_statusicon_main.append (menuBusy);\n    this.menu_statusicon_main.append (menuQuit);\n\n    this.statusicon_main.popup_menu.connect ((button, time) => {\n      this.menu_statusicon_main.popup (null, null, null, button, time);\n      print (@\"Button code: $(button)\\n\");\n    });\n\n    this.statusicon_main.activate.connect (() => {\n      if (this.visible) {\n        this.hide ();\n      } else {\n        this.show ();\n      }\n    });\n\n    this.menu_statusicon_main.show_all ();\n  }\n\n  public void display_settings () {\n    if (this.friendlist.get_selected_rows ().length () == 0 && this.grouplist.get_selected_rows ().length () == 0) {\n      return;\n    }\n\n    if (((FriendListRow) this.selected_row).view_name.index_of (\"group\") != -1) {\n      this.grouplist.unselect_row (this.selected_row);\n    } else {\n      this.friendlist.unselect_row (this.selected_row);\n    }\n    var settings_view = this.chat_stack.get_child_by_name (\"settings\");\n\n    if (settings_view != null) {\n      this.chat_stack.set_visible_child (settings_view);\n      this.focused_view = \"settings\";\n    } else {\n      var view = new SettingsView (tox);\n      this.chat_stack.add_named (view, \"settings\");\n      this.chat_stack.set_visible_child (view);\n      this.focused_view = \"settings\";\n    }\n\n    this.selected_row = null;\n  }\n\n  private void reload_tox () {\n    /**\n    * TODO + FIXME\n    **/\n    /*\n    var opts = Tox.Options.create ();\n    opts.ipv6_enabled = this.settings.get_bool (\"ricin.network.ipv6\");\n    opts.udp_enabled = this.settings.get_bool (\"ricin.network.udp\");\n\n    if (this.settings.get_bool (\"ricin.network.proxy.enabled\")) {\n      opts.proxy_type = ToxCore.ProxyType.SOCKS5;\n      opts.proxy_host = this.settings.get_string (\"ricin.network.proxy.ip_address\");\n      opts.proxy_port = (uint16) this.settings.get_int (\"ricin.network.proxy.port\");\n    }\n\n    try {\n      this.tox = new Tox.Tox (opts, this.profile);\n    } catch (Error e) {\n      error (@\"Cannot reload profile.\");\n    }\n    */\n\n    /**\n    * Until I find a fix for the code above, lets just warn the user that\n    * a restart is needed to have new network settings working.\n    **/\n    var dialog = new Gtk.MessageDialog (\n      this,\n      Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE,\n      \"%s\", _(\"Restart required\")\n    );\n    dialog.secondary_text = _(\"Ricin needs to restart in order to apply settings. Do you want to restart?\");\n    dialog.add_buttons (_(\"Restart now\"), Gtk.ResponseType.ACCEPT, _(\"Restart later\"), Gtk.ResponseType.REJECT);\n    dialog.response.connect (response => {\n      if (response == Gtk.ResponseType.ACCEPT) {\n        this.close ();\n        //Gtk.main_quit ();\n      }\n      dialog.destroy ();\n    });\n\n    dialog.show ();\n  }\n\n  [GtkCallback]\n  private void show_settings () {\n    this.display_settings ();\n\n    this.set_title (this.window_title + \" - \" + _(\"Settings\"));\n    this.label_add_error.set_text (_(\"Add a friend\"));\n  }\n\n  [GtkCallback]\n  public void show_add_friend_popover () {\n    this.show_add_friend_popover_with_text ();\n  }\n\n  [GtkCallback]\n  private void hide_add_friend_popover () {\n    this.add_friend.set_reveal_child (false);\n    this.label_add_error.set_text (_(\"Add a friend\"));\n  }\n\n  [GtkCallback]\n  private void ui_add_friend () {\n    debug (\"add_friend\");\n    var tox_id = this.entry_friend_id.get_text ();\n    var message = this.entry_friend_message.buffer.text;\n    var error_message = \"\";\n    this.label_add_error.use_markup = true;\n    this.label_add_error.use_markup = true;\n    this.label_add_error.halign = Gtk.Align.CENTER;\n    this.label_add_error.wrap_mode = Pango.WrapMode.CHAR;\n    this.label_add_error.selectable = true;\n    this.label_add_error.set_line_wrap (true);\n\n    if (tox_id.length == ToxCore.ADDRESS_SIZE * 2) { // bytes -> chars\n      try {\n        var friend = tox.add_friend (tox_id, message);\n        this.tox.save_data (); // Needed to avoid breaking profiles if app crash.\n        this.entry_friend_id.set_text (\"\"); // Clear the entry after adding a friend.\n        this.add_friend.set_reveal_child (false);\n        this.label_add_error.set_text (_(\"Add a friend\"));\n        return;\n      } catch (Tox.ErrFriendAdd e) {\n        debug (@\"Cannot add friend from ToxID: $(e.message)\");\n        error_message = e.message;\n      }\n    } else if (tox_id.length == ToxCore.PUBLIC_KEY_SIZE * 2) { // bytes -> chars\n      try {\n        var friend = tox.accept_friend_request (tox_id);\n        this.tox.save_data (); // Needed to avoid breaking profiles if app crash.\n        this.entry_friend_id.set_text (\"\"); // Clear the entry after adding a friend.\n        this.add_friend.set_reveal_child (false);\n        this.label_add_error.set_text (_(\"Add a friend\"));\n        return;\n      } catch (Tox.ErrFriendAdd e) {\n        debug (@\"Cannot add friend from PublicKey: $(e.message)\");\n        error_message = e.message;\n      }\n    } else if (tox_id.index_of (\"@\") != -1) {\n      error_message = _(\"Ricin doesn't supports ToxDNS yet.\");\n    } else if (tox_id.strip () == \"\") {\n      error_message = _(\"ToxID can't be empty.\");\n    } else {\n      error_message = _(\"ToxID is invalid.\");\n    }\n\n    if (error_message.strip () != \"\") {\n      this.label_add_error.set_markup (@\"<span color=\\\"#e74c3c\\\">$error_message</span>\");\n      return;\n    }\n\n    this.add_friend.set_reveal_child (false);\n  }\n\n  [GtkCallback]\n  private void show_friend_chatview (Gtk.ListBoxRow row) {\n    if (this.selected_row == row) {\n      return;\n    }\n\n    var item = ((FriendListRow) row);\n    item.unreadCount = 0;\n    item.update_icon ();\n    var view_name = item.view_name;\n    var chat_view = this.chat_stack.get_child_by_name (view_name);\n    debug (\"ChatView name: %s\", view_name);\n\n    if (chat_view != null) {\n      if (view_name.index_of (\"group\") != -1) {\n        var group = ((FriendListRow) row).group;\n\n        if (this.selected_row != null) {\n          this.friendlist.unselect_row (this.selected_row);\n        }\n\n        this.set_title (@\"$(this.window_title) - $(group.name)\");\n        ((GroupChatView) chat_view).entry.grab_focus ();\n      } else {\n        var friend = ((FriendListRow) row).fr;\n\n        if (this.selected_row != null) {\n          this.grouplist.unselect_row (this.selected_row);\n        }\n\n        this.set_title (@\"$(this.window_title) - $(friend.get_uname ())\");\n        ((ChatView) chat_view).entry.grab_focus ();\n      }\n\n      this.chat_stack.set_visible_child (chat_view);\n      this.focused_view = view_name;\n      this.selected_row = row;\n    }\n  }\n\n  [GtkCallback]\n  private void cycle_user_status () {\n    var status = this.tox.status;\n    var icon = \"\";\n\n    switch (status) {\n      case Tox.UserStatus.ONLINE:\n        // Set status to away.\n        this.tox.status = Tox.UserStatus.AWAY;\n        icon = \"idle\";\n        break;\n      case Tox.UserStatus.AWAY:\n        // Set status to busy.\n        this.tox.status = Tox.UserStatus.BUSY;\n        icon = \"busy\";\n        break;\n      case Tox.UserStatus.BUSY:\n        // Set status to online.\n        this.tox.status = Tox.UserStatus.ONLINE;\n        icon = \"online\";\n        break;\n      default:\n        icon = \"offline\";\n        break;\n    }\n\n    this.image_user_status.set_from_resource (@\"/chat/tox/ricin/images/status/$icon.png\");\n  }\n\n  [GtkCallback]\n  private void choose_avatar () {\n    var chooser = new Gtk.FileChooserDialog (_(\"Select your avatar\"),\n        this,\n        Gtk.FileChooserAction.OPEN,\n        _(\"_Cancel\"), Gtk.ResponseType.CANCEL,\n        _(\"_Open\"), Gtk.ResponseType.ACCEPT);\n    var filter = new Gtk.FileFilter ();\n    filter.add_custom (Gtk.FileFilterFlags.MIME_TYPE, info => {\n      var mime = info.mime_type;\n      return mime.has_prefix (\"image/\") && mime != \"image/gif\";\n    });\n    chooser.filter = filter;\n    if (chooser.run () == Gtk.ResponseType.ACCEPT) {\n      File avatar = chooser.get_file ();\n      this.tox.send_avatar (avatar.get_path ());\n      this.avatar_image.pixbuf = new Gdk.Pixbuf.from_file_at_scale (avatar.get_path (), 46, 46, true);\n\n      // Copy avatar to ~/.config/tox/avatars/\n      try {\n        avatar.copy (File.new_for_path (this.avatar_path ()), FileCopyFlags.OVERWRITE);\n      } catch (Error err) {\n        warning (\"Cannot save the avatar in cache: %s\", err.message);\n      }\n    }\n\n    chooser.close ();\n  }\n\n  [GtkCallback]\n  private void friend_list_update_search () {\n    this.friendlist.invalidate_filter ();\n  }\n\n  [GtkCallback]\n  private void create_groupchat () {\n    Tox.Group group = this.tox.create_group (_(\"Groupchat\"));\n    if (group != null) {\n      string view_name = \"group-%d\".printf (group.id);\n      this.chat_stack.add_named (new GroupChatView (this.tox, group, this.chat_stack, view_name), view_name);\n      this.groups.append (group);\n    }\n  }\n\n  ~MainWindow () {\n    this.tox.save_data ();\n    this.settings.save_settings ();\n    this.tox.disconnect ();\n  }\n}\n"
  },
  {
    "path": "src/MessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/message-list-row.ui\")]\nclass Ricin.MessageListRow : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Image image_author;\n  [GtkChild] public Gtk.Label label_name;\n  [GtkChild] public Gtk.Label label_message;\n\n  [GtkChild] public Gtk.Stack stack;\n  [GtkChild] Gtk.Spinner spinner_read;\n  [GtkChild] Gtk.Label label_timestamp;\n\n  public string author { get; set; default = \"\"; }\n\n  private uint position;\n  private uint32 message_id;\n  public bool is_child = false;\n\n  private weak Tox.Tox handle;\n  private weak Tox.Friend sender;\n  private Settings settings;\n\n  public MessageListRow (Tox.Tox handle, Tox.Friend? sender, string message, string timestamp, uint32 message_id, bool is_child) {\n    this.handle = handle;\n    this.message_id = message_id;\n    this.sender = sender;\n    this.is_child = is_child;\n    this.settings = Settings.instance;\n\n    this.stack.set_visible_child_name (\"spinner\");\n\n    string name;\n\n    if (this.settings.compact_mode) {\n      this.label_name.visible = false;\n      this.image_author.visible = true;\n    } else {\n      this.label_name.visible = true;\n      this.image_author.visible = false;\n    }\n    this.settings.notify[\"compact-mode\"].connect (() => {\n      if (this.settings.compact_mode) {\n        this.label_name.visible = false;\n        this.image_author.visible = true;\n        this.image_author.set_size_request (-1, -1);\n      } else {\n        this.label_name.visible = true;\n        this.image_author.visible = false;\n        this.label_name.set_size_request (-1, -1);\n      }\n    });\n\n    if (this.sender == null) {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.handle.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.handle.notify[\"avatar\"].connect (() => {\n        this.image_author.pixbuf = this.handle.avatar.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n\n      this.image_author.set_tooltip_text (this.handle.username);\n      this.handle.notify[\"username\"].connect (() => {\n        this.image_author.set_tooltip_text (this.handle.username);\n      });\n\n      name = Util.escape_html (this.handle.username);\n      this.label_name.set_markup (\"<b>\" + name + \"</b>\");\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n\n      this.handle.message_read.connect ((friend_num, message_id) => {\n        if (message_id != this.message_id) {\n          return;\n        }\n\n        this.stack.set_visible_child_name (\"timestamp\");\n      });\n    } else {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.sender.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.image_author.set_tooltip_text (this.sender.name);\n      this.sender.avatar.connect (p => {\n        this.image_author.pixbuf = p.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n\n      name = Util.escape_html (this.sender.get_uname ());\n      this.label_name.set_text (name);\n      this.stack.set_visible_child_name (\"timestamp\");\n    }\n\n    this.author = name;\n\n    debug (@\"Message sent by $name\");\n    if (this.is_child) {\n      // Don't display name for childs.\n      this.label_name.set_text (\"\");\n    }\n\n    string msg = message;\n    if (message.down ().index_of (this.handle.username.down ()) != -1) {\n      msg = \"<span background=\\\"#1abc9c\\\" foreground=\\\"#ffffff\\\">%s</span>\".printf (message);\n    }\n\n    //this.label_name.set_markup (@\"<b>$name</b>\");\n    try {\n      this.label_message.set_markup (msg);\n    } catch (Error e) {\n      debug (e.message);\n      this.label_message.set_text (msg);\n    }\n    this.label_message.set_line_wrap_mode (Pango.WrapMode.WORD_CHAR);\n    this.label_timestamp.set_text (timestamp);\n\n    this.label_message.activate_link.connect (this.handle_links);\n\n    /**\n    * Keep the name in sync.\n    */\n\n    // If message is our (ugly&hacky way).\n    /*if (this.handle.username == name) {\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n      this.handle.message_read.connect ((friend_num, message_id) => {\n        if (message_id != this.message_id) {\n          return;\n        }\n\n        this.spinner_read.visible = false;\n      });\n    } else {\n      this.spinner_read.visible = false;\n    }*/\n  }\n\n  private bool handle_links (string uri) {\n    if (!uri.has_prefix (\"tox:\")) {\n      return false; // Default behavior.\n    }\n\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var toxid = uri.split (\"tox:\")[1];\n    if (toxid.length == ToxCore.ADDRESS_SIZE * 2) {\n      main_window.show_add_friend_popover_with_text (toxid);\n    } else {\n      var info_message = _(\"ToxDNS is not supported yet.\");\n      main_window.notify_message (@\"<span color=\\\"#e74c3c\\\">$info_message</span>\");\n    }\n\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/Notification.vala",
    "content": "class Ricin.Notification : Object {\n  public static new void notify (string sender, string message, int timeout = 5000, Gdk.Pixbuf? icon = null) {\n    try {\n      Notify.Notification notif;\n      if (icon == null) {\n        notif = new Notify.Notification (sender, message, \"dialog-information\");\n      } else {\n        notif = new Notify.Notification (sender, message, null);\n        notif.set_icon_from_pixbuf (icon);\n      }\n\n      notif.set_category (\"im.received\");\n      notif.set_hint (\"sound-name\", new Variant.string (\"message-new-instant\"));\n      notif.set_timeout (timeout);\n      notif.show ();\n    } catch (Error error) {\n      warning (\"Notification error: %s\", error.message);\n    }\n  }\n\n  public static void notify_status (Tox.Friend friend) {\n    if (friend.status == Tox.UserStatus.ONLINE || friend.status == Tox.UserStatus.OFFLINE) {\n      string status_str = Util.status_to_string (friend.status);\n      var icon = Util.pubkey_to_image (friend.pubkey, 48, 48);\n      Notification.notify (friend.name + _(\" is now \") + status_str, friend.status_message, 3000, icon);\n    }\n  }\n}\n"
  },
  {
    "path": "src/PasswordDialog.vala",
    "content": "public errordomain Ricin.ErrPassword {\n  Null,\n  Weak,\n  NotConfirmed,\n  NotDifferent\n}\n\npublic enum Ricin.PasswordDialogType {\n  ADD_PASSWORD,\n  EDIT_PASSWORD,\n  REMOVE_PASSWORD\n}\n\n[GtkTemplate (ui=\"/chat/tox/ricin/ui/password-dialog.ui\")]\npublic class Ricin.PasswordDialog : Gtk.Dialog {\n  [GtkChild] Gtk.Label label_title;\n  [GtkChild] Gtk.Label label_description;\n  [GtkChild] Gtk.Label label_current_password;\n  [GtkChild] Gtk.Entry entry_current_password;\n  [GtkChild] Gtk.Label label_password;\n  [GtkChild] Gtk.Entry entry_password;\n  [GtkChild] Gtk.Label label_password_confirm;\n  [GtkChild] Gtk.Entry entry_password_confirm;\n  [GtkChild] Gtk.Label label_password_strength;\n  [GtkChild] Gtk.LevelBar levelbar_password_strength;\n  [GtkChild] Gtk.Button button_accept;\n  [GtkChild] Gtk.Button button_reject;\n\n  public new PasswordDialogType dtype { get; protected set; }\n  public signal void resp (int response_id, string? password, string? old_password = null);\n\n  public PasswordDialog (Gtk.Window? transient, string title, string description, PasswordDialogType type) {\n    this.dtype = type;\n    this.label_title.set_text (title);\n    this.label_description.set_markup (description);\n\n    this.set_transient_for (transient);\n    this.set_size_request (450, 250);\n\n    this.switch_mode ();\n    this.init_signals ();\n  }\n\n  private void switch_mode () {\n    if (this.dtype == PasswordDialogType.ADD_PASSWORD) {\n      this.label_current_password.visible = false;\n      this.entry_current_password.visible = false;\n    } else if (this.dtype == PasswordDialogType.EDIT_PASSWORD) {\n      // Do nothing yet.\n    } else if (this.dtype == PasswordDialogType.REMOVE_PASSWORD) {\n      this.label_password.visible = false;\n      this.entry_password.visible = false;\n      this.label_password_confirm.visible = false;\n      this.entry_password_confirm.visible = false;\n      this.label_password_strength.visible = false;\n      this.levelbar_password_strength.visible = false;\n    }\n\n    //this.button_accept.sensitive = false;\n  }\n\n  private void init_signals () {\n    this.button_accept.clicked.connect (() => {\n      try {\n        this.validate ();\n      } catch (ErrPassword e) {\n        this.label_description.set_markup (\"<span color=\\\"#e74c3c\\\">\" + e.message + \"</span>\");\n        return;\n      }\n\n      if (this.dtype == PasswordDialogType.ADD_PASSWORD) {\n        this.resp (Gtk.ResponseType.ACCEPT, this.entry_password.get_text ());\n      } else if (this.dtype == PasswordDialogType.EDIT_PASSWORD) {\n        this.resp (\n          Gtk.ResponseType.ACCEPT,\n          this.entry_current_password.get_text (),\n          this.entry_password.get_text ()\n        );\n      } else if (this.dtype == PasswordDialogType.REMOVE_PASSWORD) {\n        this.resp (Gtk.ResponseType.ACCEPT, this.entry_current_password.get_text ());\n      }\n    });\n    this.button_reject.clicked.connect (() => {\n      this.resp (Gtk.ResponseType.CANCEL, null);\n    });\n  }\n\n  private bool validate () throws ErrPassword {\n    var current_pass = this.entry_current_password.get_text ();\n    var pass = this.entry_password.get_text ();\n    var pass_confirm = this.entry_password_confirm.get_text ();\n\n    if (this.dtype == PasswordDialogType.ADD_PASSWORD) {\n      if (pass != pass_confirm) {\n        throw new ErrPassword.NotConfirmed (_(\"Password doesn't match confirmation.\"));\n      }\n      if (pass.length < 8) {\n        throw new ErrPassword.Weak (_(\"Password must be at least 8 characters.\"));\n      }\n      if (pass.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Password cannot be blank.\"));\n      }\n      if (pass_confirm.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Password confirmation cannot be blank.\"));\n      }\n    } else if (this.dtype == PasswordDialogType.EDIT_PASSWORD) {\n      if (current_pass == pass) {\n        throw new ErrPassword.NotDifferent (_(\"New password must be different from the older one.\"));\n      }\n      if (pass != pass_confirm) {\n        throw new ErrPassword.NotConfirmed (_(\"Password doesn't match confirmation.\"));\n      }\n      if (pass.length < 8) {\n        throw new ErrPassword.Weak (_(\"Password must be at least 8 characters.\"));\n      }\n      if (pass.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Password cannot be blank.\"));\n      }\n      if (pass_confirm.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Password confirmation cannot be blank.\"));\n      }\n      if (current_pass.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Current password cannot be blank.\"));\n      }\n    } else if (this.dtype == PasswordDialogType.REMOVE_PASSWORD) {\n      if (current_pass.length < 8) {\n        throw new ErrPassword.Weak (_(\"Password must be at least 8 characters.\"));\n      }\n      if (current_pass.strip () == \"\") {\n        throw new ErrPassword.Null (_(\"Password cannot be blank.\"));\n      }\n    }\n\n    return true;\n  }\n\n  [GtkCallback]\n  private void compute_strength () {\n    ;\n  }\n}\n"
  },
  {
    "path": "src/PlainLabel.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/plain-label.ui\")]\nclass Ricin.PlainLabel : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Label label_text;\n\n  public PlainLabel (string label) {\n    this.label_text.set_markup (label);\n    this.label_text.set_line_wrap_mode (Pango.WrapMode.WORD_CHAR);\n    this.label_text.set_justify (Gtk.Justification.FILL);\n    this.label_text.activate_link.connect (this.handle_links);\n  }\n\n  private bool handle_links (string uri) {\n    if (!uri.has_prefix (\"tox:\")) {\n      return false; // Default behavior.\n    }\n\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var toxid = uri.split (\"tox:\")[1];\n    if (toxid.length == ToxCore.ADDRESS_SIZE * 2) {\n      main_window.show_add_friend_popover_with_text (toxid);\n    } else {\n      var info_message = _(\"ToxDNS is not supported yet.\");\n      main_window.notify_message (@\"<span color=\\\"#e74c3c\\\">$info_message</span>\");\n    }\n\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/ProfileChooser.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/profile-chooser-window.ui\")]\nclass Ricin.ProfileChooser : Gtk.ApplicationWindow {\n  [GtkChild] Gtk.Notebook notebook_switcher;\n\n  // Login (load profile).\n  [GtkChild] Gtk.Label label_select_profile;\n  [GtkChild] Gtk.ComboBoxText combobox_profiles;\n  [GtkChild] Gtk.Entry entry_login_password;\n  [GtkChild] Gtk.Button button_login;\n\n  // Register (create then load profile).\n  [GtkChild] Gtk.Label label_create_profile;\n  [GtkChild] Gtk.Entry entry_register_name;\n  [GtkChild] Gtk.Entry entry_register_password;\n  [GtkChild] Gtk.Button button_register;\n\n  private Settings settings;\n\n  public ProfileChooser (Gtk.Application app) {\n    Object (application: app);\n    this.settings = Settings.instance;\n\n    Gdk.Pixbuf app_icon = new Gdk.Pixbuf.from_resource (Ricin.ICON_PATH);\n    this.window_position = Gtk.WindowPosition.CENTER;\n    this.set_title (Ricin.APP_NAME + \" - \" + _(\"Select a profile\"));\n    this.set_icon (app_icon);\n    this.set_default_size (261, 150);\n    this.set_resizable (false);\n\n    this.populate_profiles ();\n\n    this.entry_login_password.activate.connect (this.login);\n\n    this.show_all ();\n  }\n\n  private void populate_profiles () {\n    int latest_index = 0;\n    string last_profile_used = this.settings.last_profile;\n\n    var dir = File.new_for_path (Tox.profile_dir ());\n    string[] profiles = {};\n    if (!dir.query_exists ()) {\n      dir.make_directory ();\n    } else {\n      var enumerator = dir.enumerate_children (FileAttribute.STANDARD_NAME, 0);\n      FileInfo info;\n      int i = 0;\n      while ((info = enumerator.next_file ()) != null) {\n        var pname = info.get_name ();\n        if (pname.has_suffix (\".tox\")) {\n          profiles += pname;\n          if (pname.replace (\".tox\", \"\") == last_profile_used) {\n            latest_index = i;\n          }\n          i++;\n        }\n      }\n    }\n\n    foreach (string profile in profiles) {\n      this.combobox_profiles.append_text (profile);\n    }\n\n    this.combobox_profiles.notify[\"active\"].connect (() => {\n      var pname = this.combobox_profiles.get_active_text ();\n      var profile = Tox.profile_dir () + pname;\n      uint8[]? savedata = null;\n      FileUtils.get_data (profile, out savedata);\n\n      if (ToxEncrypt.is_data_encrypted (savedata) == false) {\n        this.entry_login_password.sensitive = false;\n      } else {\n        this.entry_login_password.sensitive = true;\n        this.entry_login_password.grab_focus_without_selecting ();\n      }\n    });\n\n    this.combobox_profiles.active = latest_index;\n\n    if (profiles.length == 0) {\n      // Set the tabpage as create page.\n      this.notebook_switcher.page = 1;\n    }\n  }\n\n  [GtkCallback]\n  private void login () {\n    var pname = this.combobox_profiles.get_active_text ();\n    var profile = Tox.profile_dir () + pname;\n    var pass = this.entry_login_password.get_text ();\n    var password = (pass.strip () != \"\") ? pass : null;\n\n    if (FileUtils.test (profile, FileTest.EXISTS)) {\n      this.button_login.sensitive = false;\n\n      uint8[]? savedata = null;\n      FileUtils.get_data (profile, out savedata);\n\n      if (ToxEncrypt.is_data_encrypted (savedata) && pass.strip () == \"\") {\n        this.label_select_profile.set_markup (\"<span color=\\\"#e74c3c\\\">\" + _(\"Please enter a password\") + \"</span>\");\n        this.button_login.sensitive = true;\n        return;\n      }\n\n      this.settings.last_profile = pname.replace (\".tox\", \"\");\n      new MainWindow (this.application, profile, password);\n      this.close (); // if a dialog is open, the window will not be closed\n      this.button_login.sensitive = true;\n    } else {\n      // file deleted?\n      this.button_login.sensitive = true;\n      this.label_select_profile.set_markup (\"<span color=\\\"#e74c3c\\\">\" + _(\"The selected profile doesn't exists.\") + \"</span>\");\n    }\n  }\n\n  [GtkCallback]\n  private void register () {\n    string entry = this.entry_register_name.get_text ();\n    string pass = this.entry_register_password.get_text ();\n    var password = (pass.strip () != \"\") ? pass : null;\n\n    if (entry.strip () == \"\") {\n      this.label_create_profile.set_markup (\"<span color=\\\"#e74c3c\\\">\" + _(\"Please enter a profile name.\") + \"</span>\");\n      return;\n    }\n\n    if (password != null && password.length < 8) {\n      this.label_create_profile.set_markup (\"<span color=\\\"#e74c3c\\\">\" + _(\"Password must be at least 8 characters.\") + \"</span>\");\n      return;\n    }\n\n    string profile = Tox.profile_dir () + entry.replace (\" \", \"-\") + \".tox\";\n    if (FileUtils.test (profile, FileTest.EXISTS)) {\n      this.label_create_profile.set_markup (\"<span color=\\\"#e74c3c\\\">\" + _(\"Profile name already taken.\") + \"</span>\");\n    } else {\n      this.entry_register_name.sensitive = false; // To prevent issue.\n      this.button_register.sensitive = false; // To prevent issue.\n\n      if (password == null) {\n        new MainWindow (this.application, profile, null, true);\n      } else {\n        new MainWindow (this.application, profile, pass, true);\n      }\n\n      this.button_register.sensitive = true;\n      this.populate_profiles ();\n      this.close ();\n    }\n  }\n\n  [GtkCallback]\n  private void reset_warning_label () {\n    var label = this.label_create_profile.get_text ();\n    var label_default = _(\"Choose a name for the profile\");\n    if (label != label_default) {\n      this.label_create_profile.set_text (label_default);\n    }\n  }\n}\n"
  },
  {
    "path": "src/QuoteLabel.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/quote-label.ui\")]\nclass Ricin.QuoteLabel : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Label label_quote;\n\n  public QuoteLabel (string label) {\n    this.label_quote.set_markup (label);\n    this.label_quote.set_line_wrap_mode (Pango.WrapMode.WORD_CHAR);\n    this.label_quote.set_justify (Gtk.Justification.FILL);\n    this.label_quote.activate_link.connect (this.handle_links);\n  }\n\n  private bool handle_links (string uri) {\n    if (!uri.has_prefix (\"tox:\")) {\n      return false; // Default behavior.\n    }\n\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var toxid = uri.split (\"tox:\")[1];\n    if (toxid.length == ToxCore.ADDRESS_SIZE * 2) {\n      main_window.show_add_friend_popover_with_text (toxid);\n    } else {\n      var info_message = _(\"ToxDNS is not supported yet.\");\n      main_window.notify_message (@\"<span color=\\\"#e74c3c\\\">$info_message</span>\");\n    }\n\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/QuoteMessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/quote-message-list-row.ui\")]\nclass Ricin.QuoteMessageListRow : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Image image_author;\n  [GtkChild] public Gtk.Label label_name;\n  [GtkChild] Gtk.ListBox listbox_quotes;\n\n  [GtkChild] public Gtk.Stack stack;\n  [GtkChild] Gtk.Spinner spinner_read;\n  [GtkChild] Gtk.Label label_timestamp;\n\n  public string author { get; set; default = \"\"; }\n\n  private uint position;\n  private uint32 message_id;\n  public bool is_child = false;\n\n  private weak Tox.Tox handle;\n  private weak Tox.Friend sender;\n  private Settings settings;\n\n  public QuoteMessageListRow (Tox.Tox handle, Tox.Friend? sender, string message, string timestamp, uint32 message_id, bool is_child) {\n    this.handle = handle;\n    this.message_id = message_id;\n    this.sender = sender;\n    this.is_child = is_child;\n    this.settings = Settings.instance;\n\n    this.stack.set_visible_child_name (\"spinner\");\n    this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.sender.pubkey, 24, 24));\n    this.sender.avatar.connect (p => {\n      this.image_author.pixbuf = p;\n    });\n\n    string name;\n\n    if (this.settings.compact_mode) {\n      this.label_name.visible = false;\n      this.image_author.visible = true;\n    } else {\n      this.label_name.visible = true;\n      this.image_author.visible = false;\n    }\n    this.settings.notify[\"compact-mode\"].connect (() => {\n      if (this.settings.compact_mode) {\n        this.label_name.visible = false;\n        this.image_author.visible = true;\n      } else {\n        this.label_name.visible = true;\n        this.image_author.visible = false;\n      }\n    });\n\n    if (this.sender == null) {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.handle.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.handle.notify[\"avatar\"].connect (() => {\n        this.image_author.pixbuf = this.handle.avatar.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n\n      this.image_author.set_tooltip_text (this.handle.username);\n      this.handle.notify[\"username\"].connect (() => {\n        this.image_author.set_tooltip_text (this.handle.username);\n      });\n\n      name = Util.escape_html (this.handle.username);\n      this.label_name.set_markup (\"<b>\" + name + \"</b>\");\n      this.handle.bind_property (\"username\", label_name, \"label\", BindingFlags.DEFAULT);\n\n      this.handle.message_read.connect ((friend_num, message_id) => {\n        if (message_id != this.message_id) {\n          return;\n        }\n\n        this.stack.set_visible_child_name (\"timestamp\");\n      });\n    } else {\n      this.image_author.set_from_pixbuf (Util.pubkey_to_image (this.sender.pubkey, 24, 24));\n      this.image_author.pixbuf = this.image_author.pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);\n      this.image_author.set_pixel_size (24);\n      this.image_author.set_size_request (24, 24);\n\n      this.image_author.set_tooltip_text (this.sender.name);\n      this.sender.avatar.connect (p => {\n        this.image_author.pixbuf = p.scale_simple (24, 24, Gdk.InterpType.BILINEAR);;\n      });\n\n      name = Util.escape_html (this.sender.get_uname ());\n      this.label_name.set_text (name);\n\n      this.stack.set_visible_child_name (\"timestamp\");\n    }\n\n    this.author = name;\n\n    if (this.is_child) {\n      // Don't display name for childs.\n      this.label_name.set_text (\"\");\n    }\n\n    this.label_timestamp.set_text (timestamp);\n\n    string[] lines = message.split (\"\\n\");\n    foreach (string line in lines) {\n      if (line.index_of (\"&gt;\", 0) == 0) {\n        this.listbox_quotes.add (new QuoteLabel (line.splice (0, 4)));\n      } else {\n        this.listbox_quotes.add (new PlainLabel (line));\n      }\n    }\n  }\n\n  public string get_quote () {\n    StringBuilder sb = new StringBuilder ();\n    foreach (Gtk.Widget item in this.listbox_quotes.get_children ()) {\n      var txt = \"\";\n\n      if (item is QuoteLabel) {\n        txt = ((QuoteLabel) item).label_quote.get_text ();\n      } else if (item is PlainLabel) {\n        txt = ((PlainLabel) item).label_text.get_text ();\n      }\n\n      string[] lines = txt.split (\"\\n\");\n      foreach (string line in lines) {\n        txt = \">\" + line;\n      }\n\n      sb.append (txt);\n      sb.append_c ('\\n');\n    }\n\n    sb.truncate (sb.len - 1);\n    return (string) sb.data;\n  }\n\n  private bool handle_links (string uri) {\n    if (!uri.has_prefix (\"tox:\")) {\n      return false; // Default behavior.\n    }\n\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var toxid = uri.split (\"tox:\")[1];\n    if (toxid.length == ToxCore.ADDRESS_SIZE * 2) {\n      main_window.show_add_friend_popover_with_text (toxid);\n    } else {\n      var info_message = \"ToxDNS is not supported yet.\";\n      main_window.notify_message (@\"<span color=\\\"#e74c3c\\\">$info_message</span>\");\n    }\n\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/Ricin.vala",
    "content": "public class Ricin.Ricin : Gtk.Application {\n  const string GETTEXT_PACKAGE = \"ricin\";\n  public static const string APP_NAME = \"Ricin\";\n  public static const string APP_SUMMARY = \"<b>Ricin</b> aims to be a <i>secure, lightweight, hackable and fully-customizable</i> chat client using the awesome and open-source <b>ToxCore</b> library.\";\n  public static const string APP_VERSION = \"0.3.0\";\n  public static const string RES_BASE_PATH = \"/chat/tox/ricin/\";\n  public static const string ICON_PATH = RES_BASE_PATH + \"images/icons/ricin.svg\";\n\n  private string default_theme = \"tox\"; // Will be overrided by settings.\n  private string current_theme;\n  private Settings settings;\n\n  public Ricin () {\n    Object (\n      application_id: \"chat.tox.ricin\",\n      flags: ApplicationFlags.FLAGS_NONE\n    ); // TODO: handle open\n\n    this.settings = Settings.instance;\n\n    // Stuff for localization.\n    string selected_language = this.settings.selected_language;\n    try {\n      Environment.set_variable (\"LANG\", selected_language, true);\n      Intl.setlocale (LocaleCategory.MESSAGES, selected_language);\n      Intl.textdomain (GETTEXT_PACKAGE);\n      Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, \"utf-8\");\n    } catch (Error e) {\n      // Fallback to native language.\n      Intl.textdomain (GETTEXT_PACKAGE);\n      Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, \"utf-8\");\n      error (@\"Error initializing gettext: $(e.message)\");\n    }\n  }\n\n  public override void activate () {\n    string profile_dir = Tox.profile_dir ();\n    string avatars_dir = \"%s/avatars\".printf (profile_dir);\n    string settings_file = \"%s/ricin.json\".printf (profile_dir);\n\n    try {\n      // If `$HOME/.config/tox` doesn't exists, lets create it.\n      if (FileUtils.test (profile_dir, FileTest.EXISTS) == false) {\n        DirUtils.create_with_parents (profile_dir, 0755);\n      }\n\n      // If `$HOME/.config/tox/avatars` doesn't exists, lets create it.\n      if (FileUtils.test (avatars_dir, FileTest.EXISTS) == false) {\n        DirUtils.create_with_parents (avatars_dir, 0755);\n      }\n    } catch (Error e) {\n      error (@\"Error: $(e.message)\");\n    }\n\n    /*if (FileUtils.test (settings_file, FileTest.EXISTS) == false) {\n      File config_file = File.new_for_path (settings_file);\n      File config_sample = File.new_for_uri (@\"$resource_base_path/ricin.sample.json\");\n      config_sample.copy (config_file, FileCopyFlags.OVERWRITE);\n    }*/\n\n    bool use_gtk32 = (Gtk.MAJOR_VERSION >= 3 && Gtk.MINOR_VERSION >= 20);\n    string themes_folder = (use_gtk32) ? \"gtk-3.2x\" : \"gtk-3.1x\";\n    if (this.settings.enable_custom_themes) {\n      string selected_theme = this.settings.selected_theme;\n      string theme_path = Ricin.RES_BASE_PATH + @\"themes/$(themes_folder)/\";\n      string theme_file = theme_path + selected_theme + \".css\";\n\n      // If theme doesn't exists apply the default one.\n      if (FileUtils.test (theme_file, FileTest.EXISTS) == true) {\n        this.current_theme = theme_file;\n      } else {\n        this.current_theme = theme_path + this.default_theme + \".css\";\n      }\n      debug (@\"Selected theme: $(this.default_theme)\");\n\n      // Load the default css.\n      var provider = new Gtk.CssProvider ();\n      provider.load_from_resource (Ricin.RES_BASE_PATH + @\"themes/$(themes_folder)/styles.css\"); // Load default css.\n      provider.load_from_resource (this.current_theme);\n      Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default (),\n          provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);\n    } else {\n      var provider = new Gtk.CssProvider ();\n      provider.load_from_resource (Ricin.RES_BASE_PATH + @\"themes/$(themes_folder)/styles.css\"); // Load default css.\n      Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default (),\n          provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);\n    }\n\n    if (this.settings.default_save_path == \"\") {\n      string path = Environment.get_user_special_dir (UserDirectory.DOWNLOAD) + \"/\";\n      this.settings.default_save_path = path;\n    }\n\n    // Launch the notification system.\n    Notify.init (\"Ricin\");\n\n    // Show the login window.\n    new ProfileChooser (this);\n  }\n\n  // OptionContext: Permits to handle commands the proper way.\n  private static bool version = false;\n  private const GLib.OptionEntry[] OPTIONS = {\n    { \"version\", 'v', 0, OptionArg.NONE, ref version, \"Display the Ricin version\", null },\n    { null } // List terminator.\n  };\n\n  public static int main (string[] args) {\n    try {\n      var opt_context = new OptionContext (\"- Ricin instant messaging Tox client\");\n      opt_context.set_help_enabled (true);\n      opt_context.add_main_entries (OPTIONS, null);\n      opt_context.parse (ref args);\n    } catch (OptionError e) {\n      stdout.printf (\"error: %s\\n\", e.message);\n      stdout.printf (\"Run '%s --help' to see a full list of available command line options.\\n\", args[0]);\n      return 0;\n    }\n\n    /**\n    * Display Ricin + libs versions.\n    **/\n    if (version) {\n      print (@\"$APP_NAME version $APP_VERSION\\n\");\n\n      string[] libtoxcore = {\n        \"%u\".printf (ToxCore.Version.MAJOR),\n        \"%u\".printf (ToxCore.Version.MINOR),\n        \"%u\".printf (ToxCore.Version.PATCH)\n      };\n      print (\"libtoxcore version \".concat (string.joinv (\".\", libtoxcore), \"\\n\"));\n\n      /**\n      * TODO: uncomment this when libtoxav got used.\n      * string[] libtoxav = {\n      *   \"%u\".printf (ToxAV.Version.MAJOR),\n      *   \"%u\".printf (ToxAV.Version.MINOR),\n      *   \"%u\".printf (ToxAV.Version.PATCH)\n      * };\n      * print (\"libtoxav version \".concat (string.joinv (\".\", toxcore), \"\\n\"));\n      **/\n\n      string[] glib = {\n        \"%u\".printf (GLib.Version.MAJOR),\n        \"%u\".printf (GLib.Version.MINOR),\n        \"%u\".printf (GLib.Version.MICRO)\n      };\n      print (\"GLib version \".concat (string.joinv (\".\", glib), \"\\n\"));\n      string[] gtk = {\n        \"%u\".printf (Gtk.MAJOR_VERSION),\n        \"%u\".printf (Gtk.MINOR_VERSION),\n        \"%u\".printf (Gtk.MICRO_VERSION)\n      };\n      print (\"GTK+3 version \".concat (string.joinv (\".\", gtk), \"\\n\"));\n      string[] libnotify = {\n        \"%u\".printf (Notify.VERSION_MAJOR),\n        \"%u\".printf (Notify.VERSION_MINOR),\n        \"%u\".printf (Notify.VERSION_MICRO)\n      };\n      print (\"libnotify version \".concat (string.joinv (\".\", libnotify), \"\\n\"));\n      string[] jsonglib = {\n        \"%u\".printf (Json.MAJOR_VERSION),\n        \"%u\".printf (Json.MINOR_VERSION),\n        \"%u\".printf (Json.MICRO_VERSION)\n      };\n      print (\"json-glib version \".concat (string.joinv (\".\", jsonglib), \"\\n\"));\n\n      return 0;\n    }\n\n    return new Ricin ().run (args);\n  }\n}\n"
  },
  {
    "path": "src/Settings.vala",
    "content": "class Settings : GLib.Object {\n  /**\n  * Private members, used only by this class.\n  **/\n  private string profile;\n\n  /**\n  * Public const members, used to read & write JSON file.\n  **/\n  public const string LAST_PROFILE_KEY         = \"last-profile\";\n  public const string NETWORK_UDP_KEY          = \"network-udp\";\n  public const string NETWORK_IPV6_KEY         = \"network-ipv6\";\n  public const string ENABLE_PROXY_KEY         = \"enable-proxy\";\n  public const string PROXY_HOST_KEY           = \"proxy-host\";\n  public const string PROXY_PORT_KEY           = \"proxy-port\";\n  public const string ENABLE_CUSTOM_THEMES_KEY = \"enable-custom-themes\";\n  public const string SELECTED_THEME_KEY       = \"selected-theme\";\n  public const string SELECTED_LANGUAGE_KEY    = \"selected-language\";\n  public const string SHOW_STATUS_CHANGES_KEY  = \"show-status-changes\";\n  public const string SHOW_ALL_FRIENDS_KEY     = \"show-all-friends\";\n  public const string SHOW_UNREAD_MESSAGES_KEY = \"show-unread-messages-notice\";\n  public const string SHOW_TYPING_STATUS_KEY   = \"show-typing-status\";\n  public const string SEND_TYPING_STATUS_KEY   = \"send-typing-status\";\n  public const string CONTACTLIST_WIDTH_KEY    = \"contactlist-width\";\n  public const string ENABLE_TRAY_KEY          = \"enable-tray\";\n  public const string ENABLE_NOTIFY_KEY        = \"enable-notify\";\n  public const string ENABLE_NOTIFY_STATUS_KEY = \"enable-notify-status\";\n  public const string ENABLE_NOTIFY_SOUNDS_KEY = \"enable-notify-sounds\";\n  public const string ENABLE_TASKBAR_NOTIFY_KEY = \"enable-taskbar-notify\";\n  public const string DEFAULT_SAVE_PATH_KEY    = \"default-save-path\";\n  public const string COMPACT_MODE_KEY         = \"compact-mode\";\n  public const string MESSAGE_PARSING_MODE_KEY = \"message-parsing-mode\";\n  public const string EMOJIS_FONT_KEY          = \"emojis-font\";\n  public const string EMOJIS_SIZE_KEY          = \"emojis-size\";\n\n  /**\n  * Public members, can be get/set.\n  **/\n  public string last_profile       { get; set; }\n  public bool network_udp          { get; set; }\n  public bool network_ipv6         { get; set; }\n  public bool enable_proxy         { get; set; }\n  public string proxy_host         { get; set; }\n  public int proxy_port            { get; set; }\n  public bool enable_custom_themes { get; set; }\n  public string selected_theme     { get; set; }\n  public string selected_language  { get; set; }\n  public bool show_status_changes  { get; set; }\n  public bool show_all_friends     { get; set; }\n  public bool show_unread_messages { get; set; }\n  public bool show_typing_status   { get; set; }\n  public bool send_typing_status   { get; set; }\n  public int contactlist_width     { get; set; }\n  public bool enable_tray          { get; set; }\n  public bool enable_notify        { get; set; }\n  public bool enable_notify_status { get; set; }\n  public bool enable_notify_sounds { get; set; }\n  public bool enable_taskbar_notify { get; set; }\n  public string default_save_path  { get; set; }\n  public bool compact_mode         { get; set; }\n  public int message_parsing_mode  { get; set; default = 0; }\n  public string emojis_font        { get; set; default = \"EmojiOne\"; }\n  public string emojis_size        { get; set; default = \"large\"; }\n\n\n  private static Settings? _instance;\n  public static Settings instance {\n    get {\n      if (_instance == null) {\n        string settings_file = \"%s/ricin.json\".printf (Tox.profile_dir ());\n        _instance = new Settings (settings_file);\n      }\n      return _instance;\n    }\n    private set {\n      _instance = value;\n    }\n  }\n\n  public Settings (string profile) {\n    debug (@\"Started SettingsManager...\");\n    this.profile = profile;\n\n    // Check if the config file exists, else create it.\n    if (FileUtils.test (this.profile, FileTest.EXISTS) == false) {\n      File config_file = File.new_for_path (this.profile);\n      File config_sample = File.new_for_uri (@\"resource:///chat/tox/ricin/ricin.sample.json\");\n\n      // Create the file and make it readable only for the current user.\n      config_file.create (FileCreateFlags.PRIVATE);\n      config_sample.copy (config_file, FileCopyFlags.OVERWRITE);\n    }\n\n    this.load_settings ();\n    this.notify.connect ((opt, props) => {\n      this.save_settings ();\n    });\n  }\n\n  public void load_settings () {\n    Json.Node node;\n    try {\n      Json.Parser parser = new Json.Parser ();\n      parser.load_from_file (this.profile);\n      node = parser.get_root ();\n\n      Settings? settings = ((Settings) Json.gobject_deserialize (typeof (Settings), node));\n      if (settings != null) {\n        this.last_profile         = settings.last_profile;\n        this.network_udp          = settings.network_udp;\n        this.network_ipv6         = settings.network_ipv6;\n        this.enable_proxy         = settings.enable_proxy;\n        this.proxy_host           = settings.proxy_host;\n        this.proxy_port           = settings.proxy_port;\n        this.enable_custom_themes = settings.enable_custom_themes;\n        this.selected_theme       = settings.selected_theme;\n        this.selected_language    = settings.selected_language;\n        this.show_status_changes  = settings.show_status_changes;\n        this.show_all_friends     = settings.show_all_friends;\n        this.show_unread_messages = settings.show_unread_messages;\n        this.show_typing_status   = settings.show_typing_status;\n        this.send_typing_status   = settings.send_typing_status;\n        this.contactlist_width    = settings.contactlist_width;\n        this.enable_tray          = settings.enable_tray;\n        this.enable_notify        = settings.enable_notify;\n        this.enable_notify_status = settings.enable_notify_status;\n        this.enable_notify_sounds = settings.enable_notify_sounds;\n        this.enable_taskbar_notify = settings.enable_taskbar_notify;\n        this.default_save_path    = settings.default_save_path;\n        this.compact_mode         = settings.compact_mode;\n        this.message_parsing_mode = settings.message_parsing_mode;\n        this.emojis_font          = settings.emojis_font;\n        this.emojis_size          = settings.emojis_size;\n      }\n    } catch (Error e) {\n      debug (@\"Error loading settings: $(e.message)\");\n    }\n  }\n\n  public bool save_settings () {\n    Json.Node root = Json.gobject_serialize (this);\n    Json.Generator generator = new Json.Generator ();\n    generator.set_root (root);\n    generator.pretty = true;\n\n    File settings_file = File.new_for_path (this.profile);\n\n    try {\n      DataOutputStream dos = new DataOutputStream (\n        settings_file.replace (null, false, FileCreateFlags.PRIVATE | FileCreateFlags.REPLACE_DESTINATION )\n      );\n      generator.to_stream (dos);\n\n      return true;\n    } catch (Error e) {\n      debug (@\"Error saving settings: $(e.message)\");\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "src/SettingsView.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/settings-view.ui\")]\nclass Ricin.SettingsView : Gtk.Box {\n  // Notebook buttons\n  [GtkChild] Gtk.Box box_tab_buttons;\n  [GtkChild] Gtk.Notebook notebook_settings;\n\n  // General settings tab.\n  [GtkChild] Gtk.Label label_tox_id;\n  [GtkChild] Gtk.Label label_default_save_path;\n  [GtkChild] Gtk.Entry entry_default_save_path;\n  [GtkChild] Gtk.Button button_set_default_save_path;\n  [GtkChild] Gtk.Button button_password_add;\n  [GtkChild] Gtk.Button button_password_change;\n  [GtkChild] Gtk.Button button_password_remove;\n\n  // Interface settings tab;\n  [GtkChild] Gtk.Switch switch_custom_themes;\n  [GtkChild] Gtk.ComboBoxText combobox_selected_theme;\n  [GtkChild] Gtk.Button button_reload_theme;\n  [GtkChild] Gtk.ComboBoxText combobox_languages;\n  [GtkChild] Gtk.ComboBoxText combobox_message_parsing_mode;\n\n  [GtkChild] Gtk.Switch switch_status_changes;\n  [GtkChild] Gtk.Switch switch_unread_messages;\n  [GtkChild] Gtk.Switch switch_display_typing_notifications;\n  [GtkChild] Gtk.Switch switch_typing_notifications;\n  [GtkChild] Gtk.Switch switch_compact_friendlist;\n  \n  // Emojis settings.\n  [GtkChild] Gtk.Entry entry_emoji_font;\n  [GtkChild] Gtk.Button button_emoji_size_small;\n  [GtkChild] Gtk.Button button_emoji_size_medium;\n  [GtkChild] Gtk.Button button_emoji_size_large;\n  [GtkChild] Gtk.Button button_emoji_size_x_large;\n  [GtkChild] Gtk.Button button_emoji_size_xx_large;\n\n  // Notifications settings tab.\n  [GtkChild] Gtk.Switch switch_taskbar_notify;\n  [GtkChild] Gtk.Switch switch_show_status_change_notifications;\n\n  // Network settings tab.\n  [GtkChild] Gtk.Switch switch_udp_enabled;\n  [GtkChild] Gtk.Switch switch_ipv6_enabled;\n  [GtkChild] Gtk.Switch switch_proxy_enabled;\n  [GtkChild] Gtk.Entry entry_proxy_ip;\n  [GtkChild] Gtk.SpinButton spinbutton_proxy_port;\n\n  // About tab.\n  [GtkChild] Gtk.Label label_app_description;\n  [GtkChild] Gtk.Label label_app_version;\n\n  private weak Tox.Tox handle;\n  private Settings settings;\n\n  public signal void reload_options ();\n\n  public SettingsView (Tox.Tox handle) {\n    this.handle = handle;\n    this.settings = Settings.instance;\n\n    /**\n    * Pack buttons in the RicinSettingsView box.\n    * This is a quick fix for the issue with tabpages.\n    **/\n    Gtk.Box box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);\n    box.set_homogeneous (true);\n\n    var pages_number = this.notebook_settings.get_n_pages ();\n    for (var i = 0; i < pages_number; i++) {\n      var page_num = i;\n      var page = this.notebook_settings.get_nth_page (i);\n      var label = this.notebook_settings.get_tab_label_text (page);\n\n      var btn = new Gtk.Button.with_mnemonic (label);\n      btn.set_relief (Gtk.ReliefStyle.NONE);\n      btn.clicked.connect (() => {\n        this.notebook_settings.set_current_page (page_num);\n      });\n\n      box.pack_start (btn, true, true, 0);\n    }\n\n    this.box_tab_buttons.add (box);\n\n    // About tab →\n    this.label_app_description.set_markup (_(Ricin.APP_SUMMARY));\n    this.label_app_version.set_text (Ricin.APP_VERSION);\n\n    this.label_tox_id.set_text (handle.id);\n\n    var default_str = _(\"default\");\n    var stable_str = _(\"stable\");\n    this.combobox_languages.append_text (@\"English ($default_str)\");\n    this.combobox_languages.append_text (\"Français\");\n    this.combobox_languages.append_text (\"Portuguese\");\n    this.combobox_languages.append_text (\"Danish\");\n    this.combobox_languages.append_text (\"Esperanto\");\n    this.combobox_languages.append_text (\"Chinese\");\n    this.combobox_languages.append_text (\"German\");\n    this.combobox_languages.append_text (\"Ukrainian\");\n    this.combobox_languages.append_text (\"Russian\");\n    this.combobox_languages.append_text (\"Polish\");\n\n    this.combobox_selected_theme.append_text (_(\"The Tox theme\") + @\" ($default_str)\");\n    this.combobox_selected_theme.append_text (_(\"Dark theme\"));\n    this.combobox_selected_theme.append_text (_(\"White theme\"));\n\n    this.combobox_message_parsing_mode.append_text (_(\"Markdown\"));\n    this.combobox_message_parsing_mode.append_text (_(\"Plaintext\"));\n\n    this.combobox_languages.active = 0;\n    this.combobox_message_parsing_mode.active = this.settings.message_parsing_mode;\n\n    this.handle.notify[\"encrypted\"].connect (this.reset_profile_buttons);\n    this.reset_profile_buttons ();\n\n    string selected_language = this.settings.selected_language;\n    if (selected_language == \"en_US\") {\n      this.combobox_languages.active = 0;\n    } else if (selected_language == \"fr_FR\") {\n      this.combobox_languages.active = 1;\n    } else if (selected_language == \"pt_PT\") {\n      this.combobox_languages.active = 2;\n    } else if (selected_language == \"da\") {\n      this.combobox_languages.active = 3;\n    } else if (selected_language == \"eo\") {\n      this.combobox_languages.active = 4;\n    } else if (selected_language == \"zh_CN\") {\n      this.combobox_languages.active = 5;\n    } else if (selected_language == \"de\") {\n      this.combobox_languages.active = 6;\n    } else if (selected_language == \"uk\") {\n      this.combobox_languages.active = 7;\n    } else if (selected_language == \"ru_RU\") {\n      this.combobox_languages.active = 8;\n    } else if (selected_language == \"pl\") {\n      this.combobox_languages.active = 9;\n    }\n\n    this.combobox_languages.changed.connect (() => {\n      var slang = this.combobox_languages.active;\n\n      if (slang == 0) { // English.\n        info (\"Changed locale to English.\");\n        Environment.set_variable (\"LANG\", \"en_US\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"en_US\");\n        this.settings.selected_language = \"en_US\";\n      } else if (slang == 1) { // French\n        info (\"Changed locale to French.\");\n        Environment.set_variable (\"LANG\", \"fr_FR\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"fr_FR\");\n        this.settings.selected_language = \"fr_FR\";\n      } else if (slang == 2) { // Portuguese\n        info (\"Changed locale to Portuguese.\");\n        Environment.set_variable (\"LANG\", \"pt_PT\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"pt_PT\");\n        this.settings.selected_language = \"pt_PT\";\n      } else if (slang == 3) { // Danish\n        info (\"Changed locale to Danish.\");\n        Environment.set_variable (\"LANG\", \"da\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"da\");\n        this.settings.selected_language = \"da\";\n      } else if (slang == 4) { // Esperanto\n        info (\"Changed locale to Esperanto.\");\n        Environment.set_variable (\"LANG\", \"eo\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"eo\");\n        this.settings.selected_language = \"eo\";\n      } else if (slang == 5) { // Chinese\n        info (\"Changed locale to Chinese.\");\n        Environment.set_variable (\"LANG\", \"zh_CN\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"zh_CN\");\n        this.settings.selected_language = \"zh_CN\";\n      } else if (slang == 6) { // German\n        info (\"Changed locale to German.\");\n        Environment.set_variable (\"LANG\", \"de\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"de\");\n        this.settings.selected_language = \"de\";\n      } else if (slang == 7) { // Ukrainian\n        info (\"Changed locale to Ukrainian.\");\n        Environment.set_variable (\"LANG\", \"uk\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"uk\");\n        this.settings.selected_language = \"uk\";\n      } else if (slang == 8) { // Russian\n        info (\"Changed locale to Russian.\");\n        Environment.set_variable (\"LANG\", \"ru_RU\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"ru_RU\");\n        this.settings.selected_language = \"ru_RU\";\n      } else if (slang == 9) { // Polish\n        info (\"Changed locale to Polish.\");\n        Environment.set_variable (\"LANG\", \"pl\", true);\n        Intl.setlocale (LocaleCategory.MESSAGES, \"pl\");\n        this.settings.selected_language = \"pl\";\n      }\n\n      this.reload_options ();\n    });\n\n    string selected_theme = this.settings.selected_theme;\n    if (selected_theme == \"tox\") {\n      this.combobox_selected_theme.active = 0;\n    } else if (selected_theme == \"dark\") {\n      this.combobox_selected_theme.active = 1;\n    } else if (selected_theme == \"white\") {\n      this.combobox_selected_theme.active = 2;\n    }\n\n    this.combobox_message_parsing_mode.changed.connect (() => {\n      this.settings.message_parsing_mode = this.combobox_message_parsing_mode.active;\n    });\n\n    bool enable_custom_themes = this.settings.enable_custom_themes;\n    this.switch_custom_themes.active = enable_custom_themes;\n    this.combobox_selected_theme.sensitive = enable_custom_themes;\n    this.button_reload_theme.sensitive = enable_custom_themes;\n    this.switch_status_changes.active = this.settings.show_status_changes;\n\n    this.switch_custom_themes.notify[\"active\"].connect (() => {\n      if (this.switch_custom_themes.active) {\n        this.combobox_selected_theme.sensitive = true;\n        this.button_reload_theme.sensitive = true;\n        int active = this.combobox_selected_theme.active;\n\n        switch (active) {\n          case 0:\n            ThemeManager.instance.set_theme (\"tox\");\n            this.settings.selected_theme = \"tox\";\n            break;\n          case 1:\n            ThemeManager.instance.set_theme (\"dark\");\n            this.settings.selected_theme = \"dark\";\n            break;\n          case 2:\n            ThemeManager.instance.set_theme (\"white\");\n            this.settings.selected_theme = \"white\";\n            break;\n        }\n\n        this.settings.enable_custom_themes = true;\n      } else {\n        this.combobox_selected_theme.sensitive = false;\n        this.button_reload_theme.sensitive = false;\n        ThemeManager.instance.set_system_theme ();\n        this.settings.enable_custom_themes = false;\n      }\n    });\n\n    this.combobox_selected_theme.changed.connect (() => {\n      int active = this.combobox_selected_theme.active;\n      string title = this.combobox_selected_theme.get_active_text ();\n\n      switch (active) {\n        case 0:\n          ThemeManager.instance.set_theme (\"tox\");\n          this.settings.selected_theme = \"tox\";\n          break;\n        case 1:\n          ThemeManager.instance.set_theme (\"dark\");\n          this.settings.selected_theme = \"dark\";\n          break;\n        case 2:\n          ThemeManager.instance.set_theme (\"white\");\n          this.settings.selected_theme = \"white\";\n          break;\n      }\n    });\n\n    this.button_reload_theme.clicked.connect (() => {\n      ThemeManager.instance.reload_theme ();\n    });\n\n    this.entry_default_save_path.set_text (this.settings.default_save_path);\n\n    this.switch_status_changes.notify[\"active\"].connect (() => {\n      this.settings.show_status_changes = this.switch_status_changes.active;\n    });\n\n    // Show typing notifications.\n    this.switch_display_typing_notifications.active = this.settings.show_typing_status;\n    this.switch_display_typing_notifications.notify[\"active\"].connect (() => {\n      this.settings.show_typing_status = this.switch_display_typing_notifications.active;\n    });\n\n    // Send typing notifications.\n    this.switch_typing_notifications.active = this.settings.send_typing_status;\n    this.switch_typing_notifications.notify[\"active\"].connect (() => {\n      this.settings.send_typing_status = this.switch_typing_notifications.active;\n    });\n\n    // Show unread messages notice.\n    this.switch_unread_messages.active = this.settings.show_unread_messages;\n    this.switch_unread_messages.notify[\"active\"].connect (() => {\n      this.settings.show_unread_messages = this.switch_unread_messages.active;\n    });\n\n    // Switch compact mode.\n    this.switch_compact_friendlist.active = this.settings.compact_mode;\n    this.switch_compact_friendlist.notify[\"active\"].connect (() => {\n      this.settings.compact_mode = this.switch_compact_friendlist.active;\n    });\n\n    // Switch taskbar notifications (urgency hint).\n    this.switch_taskbar_notify.active = this.settings.enable_taskbar_notify;\n    this.switch_taskbar_notify.notify[\"active\"].connect (() => {\n      this.settings.enable_taskbar_notify = this.switch_taskbar_notify.active;\n\n      if (this.switch_taskbar_notify.active == false) {\n        ((MainWindow) this.get_toplevel ()).set_desktop_hint (false); // Disable taskbar notify.\n      }\n    });\n\n    // Switch status changes (online/offline only) notifications.\n    this.switch_show_status_change_notifications.active = this.settings.enable_notify_status;\n    this.switch_show_status_change_notifications.notify[\"active\"].connect (() => {\n      this.settings.enable_notify_status = this.switch_show_status_change_notifications.active;\n    });\n\n    var udp = this.settings.network_udp;\n    var ipv6 = this.settings.network_ipv6;\n    var proxy = this.settings.enable_proxy;\n    var proxy_host = this.settings.proxy_host;\n    var proxy_port = (double) this.settings.proxy_port;\n    this.switch_udp_enabled.set_active (udp);\n    this.switch_ipv6_enabled.set_active (ipv6);\n    this.switch_proxy_enabled.set_active (proxy);\n    this.entry_proxy_ip.set_text (proxy_host);\n    this.spinbutton_proxy_port.set_range (0, 65535); // Min, max values.\n    this.spinbutton_proxy_port.value = proxy_port;\n\n    this.switch_udp_enabled.notify[\"active\"].connect (this.udp_state_changed);\n    this.switch_ipv6_enabled.notify[\"active\"].connect (this.ipv6_state_changed);\n    this.switch_proxy_enabled.notify[\"active\"].connect (this.proxy_state_changed);\n    \n    this.entry_emoji_font.set_text (this.settings.emojis_font);\n  }\n\n  private void udp_state_changed () {\n    this.settings.network_udp = this.switch_udp_enabled.active;\n    this.reload_options ();\n  }\n\n  private void ipv6_state_changed () {\n    this.settings.network_ipv6 = this.switch_ipv6_enabled.active;\n    this.reload_options ();\n  }\n\n  private void proxy_state_changed () {\n    bool proxy_enabled = this.switch_proxy_enabled.active;\n    string ip = this.entry_proxy_ip.get_text ();\n    int port  = (int) this.spinbutton_proxy_port.value;\n\n    this.settings.enable_proxy = proxy_enabled;\n    this.settings.proxy_host = ip;\n    this.settings.proxy_port = port;\n    this.reload_options ();\n  }\n\n  private void reset_profile_buttons () {\n    if (this.handle.encrypted) {\n      this.button_password_add.sensitive    = false;\n      this.button_password_change.sensitive = true;\n      this.button_password_remove.sensitive = true;\n    } else {\n      this.button_password_add.sensitive    = true;\n      this.button_password_change.sensitive = false;\n      this.button_password_remove.sensitive = false;\n    }\n  }\n\n  private bool show_dialog (string title, string message) {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var dialog = new Gtk.MessageDialog (\n      main_window,\n      Gtk.DialogFlags.MODAL,\n      Gtk.MessageType.WARNING,\n      Gtk.ButtonsType.NONE,\n      \"%s\", title\n    );\n\n    dialog.secondary_use_markup = true;\n    dialog.format_secondary_markup (message);\n    dialog.add_buttons (\n      _(\"Yes\"), Gtk.ResponseType.ACCEPT,\n      _(\"No\"), Gtk.ResponseType.REJECT\n    );\n\n    uint response_id = dialog.run ();\n    dialog.destroy ();\n\n    if (response_id == Gtk.ResponseType.ACCEPT) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n  * ToxID section.\n  **/\n  [GtkCallback]\n  private void copy_toxid () {\n    Gtk.Clipboard\n    .get (Gdk.SELECTION_CLIPBOARD)\n    .set_text (this.label_tox_id.label, -1);\n  }\n\n  [GtkCallback]\n  private void change_nospam () {\n    this.handle.nospam = Random.next_int ();\n    this.label_tox_id.label = this.handle.id; // Update the ToxID\n  }\n\n  /**\n  * Select default save path section.\n  **/\n  [GtkCallback]\n  private void  select_save_path () {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    var chooser = new Gtk.FileChooserDialog (\n      _(\"Choose a folder where to save files\"),\n      main_window,\n      Gtk.FileChooserAction.SELECT_FOLDER,\n      _(\"_Cancel\"), Gtk.ResponseType.CANCEL,\n      _(\"_Open\"), Gtk.ResponseType.ACCEPT\n    );\n    chooser.set_current_folder (this.settings.default_save_path);\n\n    if (chooser.run () == Gtk.ResponseType.ACCEPT) {\n      var path = chooser.get_current_folder ();\n      this.settings.default_save_path = path;\n      this.entry_default_save_path.set_text (path);\n      debug (@\"Default save path set to $path\");\n    }\n    chooser.close ();\n  }\n\n  /**\n  * Add a password to the currently opened profile.\n  **/\n  [GtkCallback]\n  private void add_password () {\n    debug (\"Add Password triggered.\");\n    PasswordDialog dialog = new PasswordDialog (\n      ((MainWindow) this.get_toplevel ()),\n      _(\"Encrypt your profile\"),\n      _(\"In order to encrypt your profile you need to specify a password. This password will be asked each time you login.\") + \"\\n<b>\" + _(\"Do you want to proceed anyway?\") + \"</b>\",\n      PasswordDialogType.ADD_PASSWORD\n    );\n\n    dialog.resp.connect ((response_id, password) => {\n      if (response_id == Gtk.ResponseType.ACCEPT) {\n        if (this.handle.add_password (password)) {\n          Timeout.add (2000, () => { // Time to write to disk.\n            this.reset_profile_buttons ();\n            return Source.REMOVE;\n          });\n        }\n      }\n      dialog.destroy ();\n    });\n\n    dialog.show ();\n  }\n\n  /**\n  * Change the password of the currently opened profile.\n  **/\n  [GtkCallback]\n  private void change_password () {\n    debug (\"Change Password triggered.\");\n    PasswordDialog dialog = new PasswordDialog (\n      ((MainWindow) this.get_toplevel ()),\n      _(\"Edit your password\"),\n      _(\"Changing your password will cause Ricin to decrypt your profile then re-encrypt it with the new password.\") + \"\\n<b>\" + _(\"Do you want to proceed anyway?\") + \"</b>\",\n      PasswordDialogType.EDIT_PASSWORD\n    );\n\n    dialog.resp.connect ((response_id, password, old_password) => {\n      if (response_id == Gtk.ResponseType.ACCEPT) {\n        if (this.handle.change_password (password, old_password)) {\n          this.reset_profile_buttons ();\n        }\n      }\n      dialog.destroy ();\n    });\n\n    dialog.show ();\n  }\n\n  /**\n  * Remove the password from the currently opened profile.\n  **/\n  [GtkCallback]\n  private void remove_password () {\n    debug (\"Remove Password triggered.\");\n    PasswordDialog dialog = new PasswordDialog (\n      ((MainWindow) this.get_toplevel ()),\n      _(\"Unencrypt your profile\"),\n      _(\"Removing your password will unencrypt your profile, chat logs and settings.\") + \"\\n<b>\" + _(\"Do you want to proceed anyway?\") + \"</b>\",\n      PasswordDialogType.REMOVE_PASSWORD\n    );\n\n    dialog.resp.connect ((response_id, password) => {\n      if (response_id == Gtk.ResponseType.ACCEPT) {\n        print (@\"Password: $password.\\n\");\n        if (this.handle.remove_password (password)) {\n          this.reset_profile_buttons ();\n        }\n      }\n      dialog.destroy ();\n    });\n\n    dialog.show ();\n  }\n  \n  [GtkCallback]\n  private void change_emoji_size_small () {\n    this.settings.emojis_size = \"small\";\n  }\n  \n  [GtkCallback]\n  private void change_emoji_size_medium () {\n    this.settings.emojis_size = \"medium\";\n  }\n  \n  [GtkCallback]\n  private void change_emoji_size_large () {\n    this.settings.emojis_size = \"large\";\n  }\n  \n  [GtkCallback]\n  private void change_emoji_size_x_large () {\n    this.settings.emojis_size = \"x-large\";\n  }\n  \n  [GtkCallback]\n  private void change_emoji_size_xx_large () {\n    this.settings.emojis_size = \"xx-large\";\n  }\n  \n  [GtkCallback]\n  private void update_emoji_font () {\n    string font = this.entry_emoji_font.get_text ();\n    string tpl = @\"<span face=\\\"$(font)\\\" size=\\\"%s\\\" foreground=\\\"#e74c3c\\\" weight=\\\"heavy\\\">💙</span>\";\n    \n    // Update emojis size buttons.\n    ((Gtk.Label) this.button_emoji_size_small.get_child ()).set_markup (tpl.printf (\"small\"));\n    ((Gtk.Label) this.button_emoji_size_medium.get_child ()).set_markup (tpl.printf (\"medium\"));\n    ((Gtk.Label) this.button_emoji_size_large.get_child ()).set_markup (tpl.printf (\"large\"));\n    ((Gtk.Label) this.button_emoji_size_x_large.get_child ()).set_markup (tpl.printf (\"x-large\"));\n    ((Gtk.Label) this.button_emoji_size_xx_large.get_child ()).set_markup (tpl.printf (\"xx-large\"));\n    \n    this.settings.emojis_font = font;\n  }\n}\n"
  },
  {
    "path": "src/StatusMessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/status-message-list-row.ui\")]\nclass Ricin.StatusMessageListRow : Gtk.ListBoxRow {\n  [GtkChild] Gtk.Label label_name;\n  [GtkChild] Gtk.Image image_status;\n  [GtkChild] Gtk.Label label_message;\n  [GtkChild] Gtk.Label label_timestamp;\n  private uint position;\n\n  public StatusMessageListRow (string message, Tox.UserStatus status) {\n    string icon = Util.status_to_icon (status, 0);\n\n    if (Settings.instance.compact_mode) {\n      this.label_name.visible = false;\n      this.image_status.margin_left = 12; // Half compact image mode.\n      this.label_message.margin_left = 16; // To correctly align the text with messages.\n    } else {\n      this.label_name.visible = true;\n    }\n\n    this.label_name.set_text (\"\");\n    this.image_status.set_from_resource (@\"/chat/tox/ricin/images/status/$icon.png\");\n    this.label_message.set_markup (message);\n    this.label_timestamp.set_text (time ());\n  }\n\n  private string time () {\n    return new DateTime.now_local ().format (\"%H:%M:%S %p\");\n  }\n}\n"
  },
  {
    "path": "src/SystemMessageListRow.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/system-message-list-row.ui\")]\nclass Ricin.SystemMessageListRow : Gtk.ListBoxRow {\n  [GtkChild] public Gtk.Label label_message;\n  private uint position;\n\n  public SystemMessageListRow (string message) {\n    this.label_message.set_markup (Util.render_emojis (message));\n  }\n}\n"
  },
  {
    "path": "src/ThemeManager.vala",
    "content": "class ThemeManager : GLib.Object {\n  private static ThemeManager? _instance;\n  public static ThemeManager instance {\n    get {\n      if (_instance == null) {\n        _instance = new ThemeManager ();\n      }\n      return _instance;\n    }\n    private set {\n      _instance = value;\n    }\n  }\n\n  private Gtk.CssProvider current_provider;\n  public string custom_themes_base_path = \"/chat/tox/ricin\";\n  public string system_theme;\n  public string current_theme_name = \"dark\";\n  private bool use_gtk32 = false;\n  private string themes_folder = \"gtk-3.1x\";\n\n  public ThemeManager () {\n    this.use_gtk32 = (Gtk.MINOR_VERSION >= 20);\n    this.themes_folder = (use_gtk32) ? \"gtk-3.2x\" : \"gtk-3.1x\";\n  }\n\n  private void add_provider (Gtk.CssProvider provider) {\n    this.current_provider = provider;\n    Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default (),\n        this.current_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);\n  }\n\n  private void remove_provider () {\n    Gtk.StyleContext.remove_provider_for_screen (Gdk.Screen.get_default (),\n        this.current_provider);\n    Gtk.StyleContext.reset_widgets (Gdk.Screen.get_default ());\n  }\n\n  public void get_themes_list () {\n\n  }\n\n  public void set_theme (string name) {\n    this.current_theme_name = \"%s\".printf (name);\n\n    debug (@\"Theme name: $(this.current_theme_name)\");\n\n    var provider = new Gtk.CssProvider ();\n    provider.load_from_resource (@\"$(this.custom_themes_base_path)/themes/$(this.themes_folder)/$(this.current_theme_name).css\");\n    this.add_provider (provider);\n  }\n\n  public void set_system_theme () {\n    this.remove_provider ();\n    Gtk.Settings settings = Gtk.Settings.get_default ();\n    this.system_theme = \"%s\".printf (settings.gtk_theme_name);\n    this.current_theme_name = this.system_theme;\n    var provider = Gtk.CssProvider.get_named (this.system_theme, null);\n    this.add_provider (provider);\n    this.set_theme (\"styles\"); // We need those styles base.\n  }\n\n  public void reload_theme () {\n    if (this.current_theme_name != this.system_theme) {\n      debug (@\"Theme set: $(this.current_theme_name)\");\n      this.set_theme (this.current_theme_name);\n    } else {\n      debug (@\"Theme set: system\");\n      this.set_system_theme ();\n    }\n  }\n}\n"
  },
  {
    "path": "src/ToxIdenticons.vala",
    "content": "/**\n* COPYRIGHT (c) 2016 SkyzohKey & Benwaffle\n*\n* MIT License\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n**/\n/**\n* The original algorithm used in this file is from identicon.js by stewartlord.\n* @page https://github.com/stewartlord/identicon.js\n* Copyright (c) 2013, Stewart Lord\n* All rights reserved.\n**/\n\nusing Cairo;\n\nnamespace ToxIdenticon {\n  struct RGB {\n    double red;\n    double green;\n    double blue;\n  }\n\n  class Utils : Object {\n    public static RGB hsl2rgb (double h, double s, double b) {\n      h *= 6;\n      double hsl[] = {\n        b += s *= b < 0.5 ? b : 1 - b,\n        b - h % 1 * s * 2,\n        b -= s *= 2,\n        b,\n        b + h % 1 * s,\n        b + s\n      };\n\n      return RGB () {\n        red = hsl[ (int)h % 6 ],\n        green = hsl[ ((int)h|16) % 6 ],\n        blue = hsl[ ((int)h|8) % 6 ]\n      };\n    }\n\n    public static int parse_base16 (string? s) {\n      if (s == null) {\n        return 0;\n      }\n      int res;\n      s.scanf (\"%x\", out res);\n      return res;\n    }\n  }\n\n  class ToxIdenticon : Object {\n    private ImageSurface surface;\n    private Context context;\n    private bool has_custom_context = false;\n\n    public string hash { get; set; }\n    public string salt { get; set; default = \"\"; }\n    public double margin { get; set; default = 0.08; }\n    public int size { get; set; default = 48; }\n    public bool stroke { get; set; default = true; }\n    public bool transparent { get; set; default = true; }\n\n    public ToxIdenticon () {\n      this.surface = new ImageSurface (Format.ARGB32, this.size, this.size);\n      this.context = new Context (this.surface);\n    }\n\n    /**\n    * TODO\n    * FIXME: Makes the final identicon blank.\n    **/\n    public ToxIdenticon.with_context (Context context) {\n      this.context = context;\n      this.surface = (ImageSurface) this.context.get_target ();\n      this.has_custom_context = true;\n    }\n\n    private void init_surface () {\n      if (this.has_custom_context == false) {\n        this.surface = new ImageSurface (Format.ARGB32, this.size, this.size);\n        this.context = new Context (this.surface);\n      }\n    }\n\n    private void draw_rect (double x, double y, double width, double height, RGB color, bool isEven) {\n      if (this.transparent && !isEven) {\n        return;\n      }\n\n      this.context.set_source_rgba (color.red, color.green, color.blue, 1);\n      this.context.rectangle (x, y, width, height);\n      this.context.fill ();\n\n      if (this.stroke && isEven) {\n        this.context.set_source_rgba (140, 140, 140, 0.5);\n        this.context.rectangle (x, y, width, height);\n        this.context.stroke ();\n      }\n    }\n\n    private void render () {\n      var hash = Checksum.compute_for_string (ChecksumType.SHA512, this.hash + this.salt);\n      var size = this.size;\n      var baseMargin = Math.floor (size * this.margin);\n      var cell = Math.floor ((size - (baseMargin * 2)) / 5);\n      var margin = Math.floor ((size - cell * 5) / 2);\n\n      // Background color\n      var background = RGB () {\n        red = 240.0/255,\n        green = 240.0/255,\n        blue = 240.0/255\n      };\n\n      if (!this.transparent) {\n        this.draw_rect (0, 0, this.size, this.size, background, false);\n      }\n\n      // Foreground color\n      var foreground = Utils.hsl2rgb ((double) Utils.parse_base16 (hash.substring (-7)) / 0xfffffff, 0.5, 0.7);\n\n      // The first 15 characters of the hash control the pixels (even/odd)\n      // they are drawn down the middle first, then mirrored outwards\n      for (var i = 0; i < 15; i++) {\n        var color = (Utils.parse_base16 (\"%c\".printf (hash[i])) % 2) != 0 ? background : foreground;\n        var isEven = (color == foreground);\n        if (i < 5) {\n          this.draw_rect (2 * cell + margin, i * cell + margin, cell, cell, color, isEven);\n        } else if (i < 10) {\n          this.draw_rect (1 * cell + margin, (i - 5) * cell + margin, cell, cell, color, isEven);\n          this.draw_rect (3 * cell + margin, (i - 5) * cell + margin, cell, cell, color, isEven);\n        } else if (i < 15) {\n          this.draw_rect (0 * cell + margin, (i - 10) * cell + margin, cell, cell, color, isEven);\n          this.draw_rect (4 * cell + margin, (i - 10) * cell + margin, cell, cell, color, isEven);\n        }\n      }\n    }\n\n    public Surface generate (int size, string hash, string salt = \"\") {\n      this.size = size;\n      this.hash = hash;\n      this.salt = salt;\n\n      this.init_surface ();\n      this.render ();\n      this.context.save ();\n\n      return this.surface;\n    }\n  }\n}\n"
  },
  {
    "path": "src/Util.vala",
    "content": "namespace Util {\n  // TAGS to replace with EMOJIS, indexes MUST match.\n  public static const string[] TAGS = {\n    \":tox:\", \":lock:\", \":ghost:\", \":alien:\", \":skull:\",\n    \"<<3\", \":wolf:\", \":punch:\", \":fuck:\", \":muscle:\",\n    \":poop:\", \":imp:\", \":smiling_imp:\", \":money:\", \":nerd:\",\n    \":kiss:\", \":sunglasses:\", \":yum:\", \":blush:\", \":thinking:\",\n    \":rage:\", \":cowboy:\", \":clown:\", \":metal:\", \":vulcan:\",\n    \":+1:\", \":-1:\", \":@\", \">:(\", \":$\",\n    \"<3\", \":3\", \":\\\\\", \":'(\", \":-'(\",\n    \":o\", \":O\", \":(\", \":-(\", \":[\",\n    \":-[\", \"xd\", \"xD\", \"Xd\", \"XD\",\n    \"0:)\", \"o:)\", \"O:)\", \":)\", \":-)\",\n    \":]\", \":-]\", \":d\", \":D\", \":-D\",\n    \":|\", \":-|\", \":p\", \":P\", \":-p\",\n    \":-P\", \"8)\", \"8-)\", \"B:)\", \"B:-)\"\n  };\n\n  // EMOJIS that replaces TAGS, indexes MUST match.\n  public static const string[] EMOJIS = {\n    \"🔒\", \"🔒\", \"👻\", \"👽\", \"💀\",\n    \"♥\", \"🐺\", \"👊\", \"🖕\", \"💪\",\n    \"💩\", \"👿\", \"😈\", \"🤑\", \"🤓\",\n    \"😘\", \"😎\", \"😋\", \"😊\", \"🤔\",\n    \"😡\", \"🤠\", \"🤡\", \"🤘\", \"🖖\",\n    \"👍\", \"👎\", \"😠\", \"😠\", \"😊\",\n    \"💙\", \"🐱\", \"😕\", \"😢\", \"😢\",\n    \"😵\", \"😵\", \"😦\", \"😦\", \"😦\",\n    \"😦\", \"😆\", \"😆\", \"😆\", \"😆\",\n    \"😇\", \"😇\", \"😇\", \"😄\", \"😄\",\n    \"😄\", \"😄\", \"😆\", \"😆\", \"😆\",\n    \"😐\", \"😐\", \"😛\", \"😛\", \"😛\",\n    \"😛\", \"😎\", \"😎\", \"😎\", \"😎\"\n  };\n\n  public static uint8[] hex2bin (string s) {\n    uint8[] buf = new uint8[s.length / 2];\n    for (int i = 0; i < buf.length; ++i) {\n      int b = 0;\n      s.substring (2*i, 2).scanf (\"%02x\", ref b);\n      buf[i] = (uint8)b;\n    }\n    return buf;\n  }\n\n  public static string bin2hex (uint8[] bin) requires (bin.length != 0) {\n    StringBuilder b = new StringBuilder ();\n    for (int i = 0; i < bin.length; ++i) {\n      b.append (\"%02X\".printf (bin[i]));\n    }\n    return b.str;\n  }\n\n  public inline static string arr2str (uint8[] array) {\n    uint8[] str = new uint8[array.length + 1];\n    Memory.copy (str, array, sizeof (uint8) * array.length);\n    str[array.length] = '\\0';\n    string result = (string) str;\n    assert (result.validate ());\n    return result;\n  }\n\n  public static int sort_az (string first, string second) {\n    int l = int.min (first.length, second.length);\n    for (int i = 0; i < l; i++) {\n      if (first[i] > second[i]) return 1;\n      if (second[i] > first[i]) return -1;\n    }\n    \n    if (first.length > l) return 1;\n    return -1;\n  }\n  \n  public static int sort_az_nocase (string first, string second) {\n    return Util.sort_az (first.down (), second.down ());\n  }\n\n  public static Gdk.Pixbuf pubkey_to_image (string pubkey, int width = 48, int height = 48) {\n    var _avatar_path = Tox.profile_dir () + \"avatars/\" + pubkey + \".png\";\n    Gdk.Pixbuf pixbuf = null;\n\n    if (FileUtils.test (_avatar_path, FileTest.EXISTS)) {\n      pixbuf = new Gdk.Pixbuf.from_file_at_scale (_avatar_path, width, height, false);\n    } else {\n      Cairo.Surface surface = Util.identicon_for_pubkey (pubkey, width);\n      pixbuf = Gdk.pixbuf_get_from_surface (surface, 0, 0, width, height);\n    }\n\n    return pixbuf;\n  }\n\n  public static string emojify (string emoji, string color = \"#fcd226\") {\n    return @\"<span face=\\\"$(Util.get_emojis_font ())\\\" size=\\\"$(Util.get_emojis_size ())\\\" weight=\\\"heavy\\\">$emoji</span>\";\n  }\n\n  public static string escape_html (string text) {\n    return Markup.escape_text (text);\n  }\n\n  private static string get_emoji_color (int index) {\n    HashTable<int, string> colors = new HashTable<int, string> (direct_hash, direct_equal);\n    colors.insert (5, \"#e74c3c\");\n    colors.insert (40, \"#171717\");\n    colors.insert (41, \"#171717\");\n    colors.insert (42, \"#3498db\");\n    colors.insert (43, \"#27ae60\");\n\n    if (colors.contains (index)) {\n      return colors.get (index);\n    }\n\n    return \"#fcd226\";\n  }\n  \n  private static string get_emojis_font () {\n    return Settings.instance.emojis_font;\n  }\n  \n  private static string get_emojis_size () {\n    return Settings.instance.emojis_size;\n  }\n\n  public static string render_emojis (string text) {\n    string buffer = text;\n    string color;\n\n    for (int i = 0; i < Util.EMOJIS.length; i++) {\n      buffer = buffer.replace (Util.EMOJIS[i], Util.emojify (Util.EMOJIS[i], get_emoji_color (i)));\n      buffer = buffer.replace (Util.escape_html (Util.TAGS[i]), Util.emojify (Util.EMOJIS[i], get_emoji_color (i)));\n    }\n\n    return buffer;\n  }\n\n  public static string render_litemd (string text) {\n    string escaped_text = escape_html (text);\n    string emojified = render_emojis (escaped_text);\n\n    // Markdown.\n    // Returns plaintext as fallback in case of parsing error.\n    string message = escaped_text;\n\n    try {\n      Regex code_block = new Regex (\"^`((?s).*)`$\", RegexCompileFlags.MULTILINE);\n      MatchInfo match_info;\n\n      if (code_block.match (escaped_text, 0, out match_info)) {\n        // If message is a code block, doesn't render markdown.\n        debug (\"Code block regex compiled, returning monospaced text.\");\n\n        // 0 is the full text of the match, 1 is the first paren set.\n        string matched_text = match_info.fetch (1);\n        return @\"<span face=\\\"monospace\\\" size=\\\"smaller\\\">$matched_text</span>\";\n      } else {\n        var uri = /(\\w+:\\S+)/.replace (emojified, -1, 0, \"<a href=\\\"\\\\1\\\">\\\\1</a>\");\n\n        var bold = /\\B\\*\\*([^\\*\\*] {2,}?)\\*\\*\\B/.replace (uri, -1, 0, \"<b>\\\\1</b>\");\n        bold = /\\B\\*([^\\*] {2,}?)\\*\\B/.replace (bold, -1, 0, \"<b>\\\\1</b>\");\n        var italic = /^\\/\\/([^\\/\\/] {2,}?)\\/\\/$/.replace (bold, -1, 0, \"<i>\\\\1</i>\");\n        italic = /^\\/([^\\/] {2,}?)\\/$/.replace (italic, -1, 0, \"<i>\\\\1</i>\");\n        var underlined = /\\b__([^__] {2,}?)__\\b/.replace (italic, -1, 0, \"<u>\\\\1</u>\");\n        underlined = /\\b_([^_] {2,}?)_\\b/.replace (underlined, -1, 0, \"<u>\\\\1</u>\");\n        var striked = /\\B~~([^~~] {2,}?)~~\\B/.replace (underlined, -1, 0, \"<s>\\\\1</s>\");\n        striked = /\\B~([^~] {2,}?)~\\B/.replace (striked, -1, 0, \"<s>\\\\1</s>\");\n        var inline_code = /\\B`([^`]*)`\\B/.replace (striked, -1, 0, \"<span face=\\\"monospace\\\" size=\\\"smaller\\\">\\\\1</span>\");\n\n        return inline_code;\n      }\n    } catch (Error e) {\n      debug (@\"Cannot parse message, fallback to plain message.\\nError: $(e.message)\");\n      return escaped_text;\n    }\n  }\n\n  public static string add_markup (string text) {\n    string markup = text; // Plaintext.\n    if (Settings.instance.message_parsing_mode == 0) { // Markdown.\n      markup = Util.render_litemd (text);\n    }\n    return markup;\n  }\n\n  public static string size_to_string (uint64 base_size) {\n    double size = base_size;\n    string suffix = \"bytes\";\n\n    if (size >= 1073741824) {\n      size = size / (double)1073741824;\n      suffix = \"Gb\";\n    } else if (size >= 1048576) {\n      size = size / (double)1048576;\n      suffix = \"Mb\";\n    } else if (size >= 1024) {\n      size = size / (double)1024;\n      suffix = \"Kb\";\n    } else if (size > 1) {\n      size = size;\n      suffix = \"bytes\";\n    } else if (size == 1) {\n      size = size;\n      suffix = \"bytes\";\n    } else {\n      size = 0;\n      suffix = \"bytes\";\n    }\n\n    return \"%.*f %s\".printf (2, size, suffix);\n  }\n\n  public static string status_to_icon (Tox.UserStatus status, int messagesCount = 0) {\n    string icon = \"\";\n\n    switch (status) {\n      case Tox.UserStatus.BLOCKED:\n        icon = (messagesCount > 0) ? \"invisible\" : \"invisible\";\n        break;\n      case Tox.UserStatus.ONLINE:\n        icon = (messagesCount > 0) ? \"online_notification\" : \"online\";\n        break;\n      case Tox.UserStatus.AWAY:\n        icon = (messagesCount > 0) ? \"idle_notification\" : \"idle\";\n        break;\n      case Tox.UserStatus.BUSY:\n        icon = (messagesCount > 0) ? \"busy_notification\" : \"busy\";\n        break;\n      case Tox.UserStatus.OFFLINE:\n      default:\n        icon = (messagesCount > 0) ? \"offline_notification\" : \"offline\";\n        break;\n    }\n\n    return icon;\n  }\n\n  public static string status_to_string (Tox.UserStatus status) {\n    string str = \"\";\n\n    switch (status) {\n      case Tox.UserStatus.BLOCKED:\n        str = _(\"Blocked\");\n        break;\n      case Tox.UserStatus.ONLINE:\n        str = _(\"Online\");\n        break;\n      case Tox.UserStatus.AWAY:\n        str = _(\"Away\");\n        break;\n      case Tox.UserStatus.BUSY:\n        str = _(\"Busy\");\n        break;\n      case Tox.UserStatus.OFFLINE:\n      default:\n        str = _(\"Offline\");\n        break;\n    }\n\n    return str;\n  }\n\n  public static Cairo.Surface identicon_for_pubkey (string pubkey, int size = 48, string salt = \"\") {\n    ToxIdenticon.ToxIdenticon identicon = new ToxIdenticon.ToxIdenticon ();\n    identicon.stroke = false;\n    return identicon.generate (size, pubkey, salt);\n  }\n}\n"
  },
  {
    "path": "src/WelcomeView.vala",
    "content": "[GtkTemplate (ui=\"/chat/tox/ricin/ui/welcome-view.ui\")]\nclass Ricin.WelcomeView : Gtk.Box {\n  // Notebook buttons\n  [GtkChild] Gtk.Box box_tab_buttons;\n  [GtkChild] Gtk.Label label_home_notice;\n  [GtkChild] Gtk.Button button_home_settings;\n\n  private weak Tox.Tox handle;\n\n  public WelcomeView (Tox.Tox handle) {\n    this.handle = handle;\n  }\n\n  [GtkCallback]\n  private void show_settings () {\n    var main_window = ((MainWindow) this.get_toplevel ());\n    main_window.display_settings ();\n  }\n}\n"
  },
  {
    "path": "src/Wrapper.vala",
    "content": "using ToxCore; // only in this file\nusing ToxEncrypt; // only in this file\n\n// so we don't conflict with libtoxcore\n[CCode (cprefix=\"ToxWrapper\", lower_case_cprefix=\"tox_wrapper_\")]\nnamespace Tox {\n  public enum UserStatus {\n    ONLINE,\n    AWAY,\n    BUSY,\n    BLOCKED,\n    OFFLINE\n  }\n\n  public string profile_dir () {\n    return Environment.get_user_config_dir () + \"/tox/\";\n  }\n\n  public ToxCore.UserStatus wrapper_to_core_status (UserStatus st) {\n    if (st == UserStatus.AWAY) {\n      return ToxCore.UserStatus.AWAY;\n    }\n    if (st == UserStatus.BUSY) {\n      return ToxCore.UserStatus.BUSY;\n    }\n    return ToxCore.UserStatus.NONE;\n  }\n\n  public UserStatus core_to_wrapper_status (ToxCore.UserStatus st) {\n    if (st == ToxCore.UserStatus.AWAY) {\n      return UserStatus.AWAY;\n    }\n    if (st == ToxCore.UserStatus.BUSY) {\n      return UserStatus.BUSY;\n    }\n    return UserStatus.ONLINE;\n  }\n\n  public errordomain ErrNew {\n    Null,\n    Malloc,\n    PortAlloc,\n    BadProxy,\n    LoadFailed\n  }\n\n  public errordomain ErrDecrypt {\n    Null,\n    InvalidLength,\n    BadFormat,\n    KeyDerivationFailed,\n    Failed\n  }\n\n  public errordomain ErrFriendAdd {\n    Null,\n    TooLong,\n    NoMessage,\n    OwnKey,\n    AlreadySent,\n    BadChecksum,\n    BadNospam,\n    Malloc\n  }\n\n  public errordomain ErrFriendDelete {\n    NotFound\n  }\n\n  public class Tox : Object {\n    internal ToxCore.Tox handle;\n    private HashTable<uint32, Friend> friends = new HashTable<uint32, Friend> (direct_hash, direct_equal);\n    public HashTable<int, Group> groups = new HashTable<int, Group> (direct_hash, direct_equal);\n\n    private bool ipv6_enabled   = true;\n    private string? profile     = null;\n    private string? password    = null;\n    internal Gdk.Pixbuf? avatar = null;\n\n    // Used to kill tox.\n    private bool must_stop = false;\n\n    public bool encrypted { get; set; default = false; }\n\n    public string username {\n      owned get {\n        uint8[] chars = new uint8[this.handle.self_get_name_size ()];\n        this.handle.self_get_name (chars);\n        return Util.arr2str (chars);\n      }\n      set {\n        this.handle.self_set_name (value.data, null);\n      }\n    }\n\n    public string status_message {\n      owned get {\n        uint8[] chars = new uint8[this.handle.self_get_status_message_size ()];\n        this.handle.self_get_status_message (chars);\n        return Util.arr2str (chars);\n      }\n      set {\n        this.handle.self_set_status_message (value.data, null);\n      }\n    }\n\n    public UserStatus status {\n      get {\n        if (connected) {\n          return core_to_wrapper_status (handle.status);\n        } else {\n          return UserStatus.OFFLINE;\n        }\n      }\n      set {\n        this.handle.status = wrapper_to_core_status (value);\n      }\n    }\n\n    public uint32 nospam {\n      get {\n        return this.handle.nospam;\n      }\n      set {\n        this.handle.nospam = value;\n      }\n    }\n\n    public void send_avatar (string path) {\n      this.avatar = new Gdk.Pixbuf.from_file (path);\n      debug (@\"avatar = $path\");\n\n      foreach (var friend in friends.get_values ()) {\n        friend.send_avatar ();\n      }\n    }\n\n    public uint32[] self_get_friend_list () {\n      size_t size = this.handle.self_get_friend_list_size ();\n      uint32[] list = new uint32[size];\n      this.handle.self_get_friend_list (list);\n\n      return list;\n    }\n\n    public bool connected { get; set; default = false; }\n\n    public string id {\n      owned get {\n        //uint8 address[ToxCore.ADDRESS_SIZE]; // vala bug #756376\n        uint8[] address = new uint8[ToxCore.ADDRESS_SIZE];\n        this.handle.self_get_address (address);\n        return Util.bin2hex (address);\n      }\n    }\n\n    public string pubkey {\n      owned get {\n        uint8[] pkey = new uint8[ToxCore.PUBLIC_KEY_SIZE];\n        this.handle.self_get_public_key (pkey);\n        return Util.bin2hex (pkey);\n      }\n    }\n\n    public signal void friend_request (string id, string message);\n    public signal void friend_online (Friend friend);\n    public signal bool group_request (int32 friend_number, uint8 type, uint8[] data);\n\n    public signal void global_info (string message);\n    public signal void message_read (uint32 friend_number, uint32 message_id);\n\n    public Tox (ToxCore.Options? opts = null, string? profile = null, string? password = null, bool is_new = false) throws ErrNew, ErrDecrypt {\n      debug (\"ToxCore Version %u.%u.%u\", ToxCore.Version.MAJOR, ToxCore.Version.MINOR, ToxCore.Version.PATCH);\n\n      if (profile != null) { // Profile specified.\n        this.profile = profile;\n        this.password = password;\n\n        // If profile doesn't exists, let's create it.\n        if (FileUtils.test (profile, FileTest.EXISTS) == false) {\n          File.new_for_path (profile).create (FileCreateFlags.NONE, null);\n        }\n\n        uint8[] tmp_save = null;\n        FileUtils.get_data (this.profile, out tmp_save);\n\n        // Profile is encrypted. Let's decrypt and load it.\n        if (is_data_encrypted (tmp_save) && is_new == false) {\n          opts.savedata_type = ToxCore.SaveDataType.TOX_SAVE;\n          opts.savedata_data = this.decrypt_profile (this.password);\n          this.encrypted = true;\n        } else if (is_new) {\n          opts.savedata_type = ToxCore.SaveDataType.NONE;\n          this.encrypted = false;\n        } else {\n          uint8[] savedata = null;\n          FileUtils.get_data (profile, out opts.savedata_data);\n          opts.savedata_type = ToxCore.SaveDataType.TOX_SAVE;\n          this.encrypted = false;\n        }\n      }\n\n      this.ipv6_enabled = opts.ipv6_enabled;\n      ERR_NEW error;\n      this.handle = new ToxCore.Tox (opts, out error);\n      unowned ToxCore.Tox handle = this.handle;\n\n      if (is_new && this.password != null && this.password != \"\") {\n        this.add_password (password);\n      }\n\n      switch (error) {\n        case ERR_NEW.NULL:\n          throw new ErrNew.Null (\"One of the arguments to the function was NULL when it was not expected.\");\n        case ERR_NEW.MALLOC:\n          throw new ErrNew.Malloc (\"The function was unable to allocate enough memory to store the internal structures for the Tox object.\");\n        case ERR_NEW.PORT_ALLOC:\n          throw new ErrNew.PortAlloc (\"The function was unable to bind to a port.\");\n        case ERR_NEW.PROXY_BAD_TYPE:\n          throw new ErrNew.BadProxy (\"proxy_type was invalid.\");\n        case ERR_NEW.PROXY_BAD_HOST:\n          throw new ErrNew.BadProxy (\"proxy_type was valid but the proxy_host passed had an invalid format or was NULL.\");\n        case ERR_NEW.PROXY_BAD_PORT:\n          throw new ErrNew.BadProxy (\"proxy_type was valid, but the proxy_port was invalid.\");\n        case ERR_NEW.PROXY_NOT_FOUND:\n          throw new ErrNew.BadProxy (\"The proxy address passed could not be resolved.\");\n        case ERR_NEW.LOAD_ENCRYPTED:\n          throw new ErrNew.LoadFailed (\"The byte array to be loaded contained an encrypted save.\");\n        case ERR_NEW.LOAD_BAD_FORMAT:\n          throw new ErrNew.LoadFailed (\"The data format was invalid. This can happen when loading data that was saved by an older version of Tox, or when the data has been corrupted. When loading from badly formatted data, some data may have been loaded, and the rest is discarded. Passing an invalid length parameter also causes this error.\");\n      }\n\n      this.handle.callback_self_connection_status ((self, status) => {\n        switch (status) {\n          case ConnectionStatus.NONE:\n            debug (\"Connection: none\");\n            break;\n          case ConnectionStatus.TCP:\n            debug (\"Connection: TCP\");\n            break;\n          case ConnectionStatus.UDP:\n            debug (\"Connection: UDP\");\n            break;\n        }\n        this.connected = (status != ConnectionStatus.NONE);\n      });\n\n      this.handle.callback_friend_connection_status ((self, num, status) => {\n        if (this.friends[num] == null) { // new friend\n          this.friends[num] = new Friend (this, num);\n          this.friend_online (this.friends[num]); // TODO\n        }\n\n        this.friends[num].connected = (status != ConnectionStatus.NONE);\n        this.friends[num].send_avatar (); // Send our avatar, in case friend doesn't have it.\n      });\n\n      this.handle.callback_friend_name ((self, num, name) => {\n        var old_name = this.friends[num].name ?? (this.friends[num].pubkey.slice (0, 16) + \"...\");\n        var new_name = Util.arr2str (name);\n        if (old_name != new_name) {\n          this.friends[num].friend_info (old_name + _(\" is now known as \") + new_name);\n          this.friends[num].name = new_name;\n        }\n      });\n\n      this.handle.callback_friend_status ((self, num, status) => {\n        this.friends[num].set_user_status (status);\n      });\n\n      this.handle.callback_friend_status_message ((self, num, message) => {\n        if (this.friends[num].blocked) {\n          return;\n        }\n\n        this.friends[num].status_message = Util.arr2str (message);\n      });\n\n      this.handle.callback_friend_message ((self, num, type, message) => {\n        if (this.friends[num].blocked) {\n          return;\n        }\n\n        if (type == MessageType.NORMAL) {\n          this.friends[num].message (Util.arr2str (message));\n        } else {\n          this.friends[num].action (Util.arr2str (message));\n        }\n      });\n\n      this.handle.callback_friend_read_receipt ((self, friend_num, message_id) => {\n        this.message_read (friend_num, message_id);\n      });\n\n      this.handle.callback_friend_typing ((self, num, is_typing) => {\n        if (this.friends[num].blocked) {\n          return;\n        }\n\n        this.friends[num].typing = is_typing;\n      });\n\n      this.handle.callback_friend_request ((self, pubkey, message) => {\n        pubkey.length = ToxCore.PUBLIC_KEY_SIZE;\n        string id = Util.bin2hex (pubkey);\n        string msg = Util.arr2str (message);\n        debug (@\"Friend request from $id: $msg\");\n        this.friend_request (id, msg);\n      });\n\n      // send\n      this.handle.callback_file_chunk_request ((self, friend, file, position, length) => {\n        if (this.friends[friend].blocked) {\n          return;\n        }\n\n        if (length == 0) { // file transfer finished\n          debug (@\"friend $friend, file $file: done\");\n          this.friends[friend].files_send.remove (file);\n          this.friends[friend].file_received (file);\n          return;\n        }\n        debug (@\"friend $friend, file $file: chunk request, pos=$position, len=$length\");\n        this.friends[friend].file_progress (file, position);\n\n        Bytes full_data = this.friends[friend].files_send[file];\n        Bytes slice = full_data.slice ((int) position, (int) (position + length));\n\n        ERR_FILE_SEND_CHUNK err;\n        this.handle.file_send_chunk (friend, file, position, slice.get_data (), out err);\n\n        if (err != ERR_FILE_SEND_CHUNK.OK)\n          debug (\"file_send_chunk: %d\", err);\n      });\n\n      // recv\n      this.handle.callback_file_recv_control ((self, friend, file, control) => {\n        if (this.friends[friend].blocked) {\n          return;\n        }\n\n        if (control == FileControl.CANCEL) {\n          debug (@\"friend $friend, file $file: cancelled\");\n          this.friends[friend].file_canceled (file);\n          this.friends[friend].files_recv.remove (file);\n        } else if (control == FileControl.PAUSE) {\n          debug (@\"friend $friend, file $file: paused\");\n          this.friends[friend].file_paused (file);\n        } else if (control == FileControl.RESUME) {\n          debug (@\"friend $friend, file $file: resumed\");\n          this.friends[friend].file_resumed (file);\n        } else {\n          assert_not_reached ();\n        }\n      });\n\n      // recv\n      this.handle.callback_file_recv ((self, friend, file, kind, size, filename) => {\n        if (this.friends[friend].blocked) {\n          this.handle.file_control (friend, file, FileControl.CANCEL, null);\n          return;\n        }\n\n        if (kind == FileKind.AVATAR) {\n          debug (@\"friend $friend, file $file: receive avatar\");\n          this.friends[friend].files_recv[file] = new FileDownload.avatar ();\n          this.handle.file_control (friend, file, FileControl.RESUME, null);\n        } else {\n          debug (@\"friend $friend, file $file: file_recv\");\n          this.friends[friend].files_recv[file] = new FileDownload (Util.arr2str (filename));\n          this.friends[friend].file_transfer (Util.arr2str (filename), size, file);\n        }\n      });\n\n      // recv\n      this.handle.callback_file_recv_chunk ((self, friend, file, position, data) => {\n        if (this.friends[friend].blocked) {\n          this.handle.file_control (friend, file, FileControl.CANCEL, null);\n          return;\n        }\n\n        var fr = this.friends[friend];\n        assert (fr.files_recv.contains (file));\n        if (data.length == 0) {\n          debug (@\"friend $friend, file $file: done\");\n          FileDownload dl = fr.files_recv[file];\n          Bytes bytes = ByteArray.free_to_bytes (dl.data);\n          if (dl.kind == FileKind.AVATAR) {\n            try {\n              var stream = new MemoryInputStream.from_bytes (bytes);\n              var pixbuf = new Gdk.Pixbuf.from_stream_at_scale (stream, 48, 48, true);\n              fr.avatar (pixbuf);\n            } catch (Error e) {\n              warning (\"Error processing avatar for %s: %s\", fr.name, e.message);\n            }\n          } else {\n            fr.file_done (dl.name, bytes, file);\n          }\n          fr.files_recv.remove (file);\n          return;\n        }\n\n        debug (@\"friend $friend, file $file: chunk request, pos=$position\");\n        this.friends[friend].file_progress (file, data.length);\n\n        assert (fr.files_recv[file].data.len == position);\n        fr.files_recv[file].data.append (data);\n      });\n\n      // Groupchats:\n      this.handle.callback_group_invite ((self, friend_number, type, data) => {\n        if (this.friends[friend_number].blocked) {\n          return;\n        }\n\n        //Friend friend = this.friends[(uint32)friend_number];\n        this.group_request (friend_number, type, data);\n      });\n\n      this.handle.callback_group_message ((self, group_num, peer_num, message) => {\n        if (this.handle.group_peernumber_is_ours (group_num, peer_num) == 1) {\n          return;\n        }\n        \n        if (this.groups[group_num].peers[peer_num].muted) {\n          return;\n        }\n\n        Peer peer = this.groups[group_num].peers[peer_num];\n        this.groups[group_num].message (peer, Util.arr2str (message));\n      });\n\n      this.handle.callback_group_action ((self, group_num, peer_num, action) => {\n        if (this.handle.group_peernumber_is_ours (group_num, peer_num) == 1) {\n          return;\n        }\n        \n        if (this.groups[group_num].peers[peer_num].muted) {\n          return;\n        }\n\n        Peer peer = this.groups[group_num].peers[peer_num];\n        this.groups[group_num].action (peer, Util.arr2str (action));\n      });\n\n      this.handle.callback_group_title ((self, group_num, peer_num, title) => {\n        string topic = Util.arr2str (title);\n        debug (@\"Peer $(peer_num) changed title to: $(topic)\");\n        this.groups[group_num].name = topic;\n        \n        if (peer_num != -1) {\n          this.groups[group_num].title_changed (peer_num, topic);\n        } else {\n          this.groups[group_num].title_changed (0, topic);\n        }\n      });\n\n      this.handle.callback_group_namelist_change ((self, group_num, peer_num, change_type) => {\n        switch (change_type) {\n          case ChatChange.PEER_ADD:\n            this.groups[group_num].add_peer (peer_num);\n            break;\n          case ChatChange.PEER_DEL:\n            this.groups[group_num].remove_peer (peer_num);\n            break;\n          case ChatChange.PEER_NAME:\n            this.groups[group_num].change_peer_name (peer_num);\n            break;\n        }\n      });\n\n      // Let's bootstrap the Tox network now.\n      this.bootstrap.begin ();\n    }\n\n    public void disconnect () {\n      for (int i = 0; i < this.groups.length; i++) {\n        Group g = this.groups[i];\n        this.leave_group (g.num);\n      }\n    \n      this.must_stop = true;\n      this.handle.kill ();\n    }\n\n    public void run_loop () {\n      this.schedule_loop_iteration ();\n    }\n\n    private void schedule_loop_iteration () {\n      Timeout.add (this.handle.iteration_interval (), () => {\n        if (this.must_stop) {\n          return true;\n        }\n\n        this.handle.iterate ();\n        this.schedule_loop_iteration ();\n        //return Source.REMOVE;\n        return false;\n      });\n    }\n\n    private class Server : Object {\n      public string owner { get; set; }\n      public string region { get; set; }\n      public string ipv4 { get; set; }\n      public string ipv6 { get; set; }\n      public uint64 port { get; set; }\n      public string pubkey { get; set; }\n    }\n\n    private async void bootstrap () {\n      var json = new Json.Parser ();\n      var bytes = resources_lookup_data (\"/chat/tox/ricin/nodes.json\", ResourceLookupFlags.NONE);\n      if (json.load_from_data ((string) bytes.get_data (), bytes.length)) {\n        Server[] servers = {};\n        var array = json.get_root ().get_object ().get_array_member (\"servers\");\n        array.foreach_element ((arr, index, node) => {\n          servers += ((Server) Json.gobject_deserialize (typeof (Server), node));\n        });\n        while (!this.connected) {\n          for (int i = 0; i < 4; ++i) { // bootstrap to 4 random nodes\n            Server srv = servers[Random.int_range (0, servers.length)];\n\n            bool success = false;\n            bool try_ipv6 = this.ipv6_enabled && srv.ipv6 != null;\n            if (!success && try_ipv6) {\n              debug (\"UDP bootstrap %s:%llu by %s\", srv.ipv6, srv.port, srv.owner);\n              success = this.handle.bootstrap (srv.ipv6, (uint16) srv.port, Util.hex2bin (srv.pubkey), null);\n            }\n            if (!success) {\n              debug (\"UDP bootstrap %s:%llu by %s\", srv.ipv4, srv.port, srv.owner);\n              success = this.handle.bootstrap (srv.ipv4, (uint16) srv.port, Util.hex2bin (srv.pubkey), null);\n            }\n            if (!success && try_ipv6) {\n              debug (\"TCP bootstrap %s:%llu by %s\", srv.ipv6, srv.port, srv.owner);\n              success = this.handle.add_tcp_relay (srv.ipv6, (uint16) srv.port, Util.hex2bin (srv.pubkey), null);\n            }\n            if (!success) {\n              debug (\"TCP bootstrap %s:%llu by %s\", srv.ipv4, srv.port, srv.owner);\n              success = this.handle.add_tcp_relay (srv.ipv4, (uint16) srv.port, Util.hex2bin (srv.pubkey), null);\n            }\n          }\n\n          // wait 5 seconds without blocking main loop\n          Timeout.add (5000, () => {\n            bootstrap.callback ();\n            //return Source.REMOVE;\n            return false;\n          });\n          yield;\n        }\n        debug (\"Done bootstrapping\");\n      }\n    }\n\n    public bool has_friend (string pubkey) {\n      for (int i = 0; i < this.friends.length; i++) {\n        if (this.friends[i].pubkey == pubkey) {\n          return true;\n        }\n      }\n      \n      return false;\n    }\n\n    public Friend? add_friend (string id, string message) throws ErrFriendAdd {\n      if (id.length != ToxCore.ADDRESS_SIZE && id.index_of_char ('@') != -1) {\n        error (\"Invalid Tox ID\");\n      }\n\n      ERR_FRIEND_ADD err;\n      uint32 friend_num = this.handle.friend_add (Util.hex2bin (id), message.data, out err);\n\n      switch (err) {\n        case ERR_FRIEND_ADD.OK:\n          return new Friend (this, friend_num);\n        case ERR_FRIEND_ADD.NULL:\n          throw new ErrFriendAdd.Null (\"One of the arguments to the function was NULL when it was not expected.\");\n        case ERR_FRIEND_ADD.TOO_LONG:\n          throw new ErrFriendAdd.TooLong (\"The friend request message is too long.\");\n        case ERR_FRIEND_ADD.NO_MESSAGE:\n          throw new ErrFriendAdd.NoMessage (\"The friend request message was empty.\");\n        case ERR_FRIEND_ADD.OWN_KEY:\n          throw new ErrFriendAdd.OwnKey (\"You cannot add yourself.\");\n        case ERR_FRIEND_ADD.ALREADY_SENT:\n          throw new ErrFriendAdd.AlreadySent (\"You already added this friend.\");\n        case ERR_FRIEND_ADD.BAD_CHECKSUM:\n          throw new ErrFriendAdd.BadChecksum (\"ToxID is invalid.\");\n        case ERR_FRIEND_ADD.SET_NEW_NOSPAM:\n          throw new ErrFriendAdd.BadNospam (\"This ToxID have a new nospam.\");\n        case ERR_FRIEND_ADD.MALLOC:\n          throw new ErrFriendAdd.Malloc (\"A memory allocation failed when trying to increase the friend list size.\");\n        default:\n          return null;\n      }\n    }\n\n    public Friend? accept_friend_request (string id) throws ErrFriendAdd {\n      if (id.length != ToxCore.PUBLIC_KEY_SIZE && id.index_of_char ('@') != -1) {\n        error (\"Invalid Public Key\");\n      }\n\n      debug (@\"Accepting friend request from $id\");\n      ERR_FRIEND_ADD err;\n      uint32 friend_num = this.handle.friend_add_norequest (Util.hex2bin (id), out err);\n\n      switch (err) {\n        case ERR_FRIEND_ADD.OK:\n          debug (@\"$id friend number: $friend_num\");\n          return this.add_friend_by_num (friend_num);\n        case ERR_FRIEND_ADD.NULL:\n          throw new ErrFriendAdd.Null (\"One of the arguments to the function was NULL when it was not expected.\");\n        case ERR_FRIEND_ADD.TOO_LONG:\n          throw new ErrFriendAdd.TooLong (\"The friend request message is too long.\");\n        case ERR_FRIEND_ADD.NO_MESSAGE:\n          throw new ErrFriendAdd.NoMessage (\"The friend request message was empty.\");\n        case ERR_FRIEND_ADD.OWN_KEY:\n          throw new ErrFriendAdd.OwnKey (\"You cannot add yourself.\");\n        case ERR_FRIEND_ADD.ALREADY_SENT:\n          throw new ErrFriendAdd.AlreadySent (\"You already added this friend.\");\n        case ERR_FRIEND_ADD.BAD_CHECKSUM:\n          throw new ErrFriendAdd.BadChecksum (\"ToxID is invalid.\");\n        case ERR_FRIEND_ADD.SET_NEW_NOSPAM:\n          throw new ErrFriendAdd.BadNospam (\"This ToxID have a new nospam.\");\n        case ERR_FRIEND_ADD.MALLOC:\n          throw new ErrFriendAdd.Malloc (\"A memory allocation failed when trying to increase the friend list size.\");\n      }\n\n      return null;\n    }\n\n    public Friend? add_friend_by_num (uint32 num) {\n      debug (@\"Adding friend: $num\");\n      var friend = new Friend (this, num);\n      this.friends[num] = friend;\n      return friend;\n    }\n\n    public Group? accept_group_request (int32 friend_num, uint8[] data) {\n      int group_num = this.handle.join_groupchat (friend_num, data);\n      debug (\"Accepted to join group number %d\", group_num);\n\n      if (group_num != -1) {\n        var group = new Group (this, group_num);\n        this.groups[group_num] = group;\n        return group;\n      }\n\n      return null;\n    }\n\n    public Group? create_group (string name) {\n      int group_num = this.handle.add_groupchat ();\n\n      if (group_num != -1) {\n        var group = new Group (this, group_num);\n        this.groups[group_num] = group;\n        this.groups[group_num].name = \"%s #%d\".printf (name, group_num);\n        return group;\n      }\n\n      return null;\n    }\n    \n    public bool leave_group (int group_num) {\n      bool deleted = (this.handle.del_groupchat (group_num) != -1);\n      if (deleted) {\n        this.groups.remove (group_num);\n        if (this.groups[group_num] == null) {\n          return true;\n        }\n      }\n      return false;\n    }\n    \n    public string[]? get_peers_name_for_group (int group_num) {\n      if (this.groups[group_num] == null) {\n        return null;\n      }\n      \n      string [] buffer = {};\n\n      for (int i = 0; i < this.groups[group_num].peers.length; i++) {\n        buffer += this.groups[group_num].peers[i].name;\n      }\n\n      return buffer;\n    }\n    \n    public Peer[]? get_peers_for_group (int group_num) {\n      if (this.groups[group_num] == null) {\n        return null;\n      }\n      \n      Peer[] peers = {};\n      for (int i = 0; i < this.groups[group_num].peers.length; i++) {\n        if (this.groups[group_num].peers[i] == null) {\n          continue;\n        }\n      \n        peers += this.groups[group_num].peers[i];\n      }\n      \n      return peers;\n    }\n\n    public void save_data (string? pass = null) throws ErrDecrypt {\n      if (this.profile != null) {\n        debug (\"Saving data to \" + this.profile);\n\n        uint8[] savedata = null;\n        uint8[] data = new uint8[this.handle.get_savedata_size ()];\n        this.handle.get_savedata (data);\n\n        if (this.password != null) {\n          savedata = this.encrypt_profile (this.password, data);\n        } else {\n          savedata = data;\n        }\n\n        FileUtils.set_data (this.profile, savedata);\n      }\n    }\n\n    public uint8[] encrypt_profile (string password, uint8[]? data = null) throws ErrDecrypt {\n      ERR_ENCRYPTION err;\n      uint8[] pass = password.data;\n      uint8[] savedata = null;\n\n      if (data == null) {\n        savedata = new uint8[this.handle.get_savedata_size ()];\n        this.handle.get_savedata (savedata);\n      } else {\n        savedata = data;\n      }\n\n      if (is_data_encrypted (savedata)) {\n        throw new ErrDecrypt.Failed (\"Profile is already encrypted, cannot encrypt non-decrypted data.\");\n      }\n\n      uint32 savesize = savedata.length + ToxEncrypt.PASS_ENCRYPTION_EXTRA_LENGTH;\n      uint8[] encrypted_data = new uint8[savesize];\n      pass_encrypt (savedata, pass, encrypted_data, out err);\n      this.password = password;\n\n      if (err != ERR_ENCRYPTION.OK) {\n        switch (err) {\n          case ERR_ENCRYPTION.NULL:\n            throw new ErrDecrypt.Null (\"Some input data, or maybe the output pointer, was null.\");\n          case ERR_ENCRYPTION.KEY_DERIVATION_FAILED:\n            throw new ErrDecrypt.KeyDerivationFailed (\"The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The functions accepting keys do not produce this error.\");\n          case ERR_ENCRYPTION.FAILED:\n            throw new ErrDecrypt.Failed (\"The encryption itself failed.\");\n        }\n      }\n\n      //this.encrypted = true;\n      return encrypted_data;\n    }\n\n    public uint8[] decrypt_profile (string password) throws ErrDecrypt {\n      ERR_DECRYPTION err;\n      uint8[]? savedata = null;\n      uint8[] pass = password.data;\n      FileUtils.get_data (this.profile, out savedata);\n\n      if (is_data_encrypted (savedata) == false) {\n        throw new ErrDecrypt.Failed (\"Profile isn't encrypted, cannot decrypt plain text.\");\n      }\n\n      int savesize = savedata.length - ToxEncrypt.PASS_ENCRYPTION_EXTRA_LENGTH;\n      uint8[] decrypted_data = new uint8[savesize];\n\n      pass_decrypt (savedata, pass, decrypted_data, out err);\n      //this.password = null;\n\n      if (err != ERR_DECRYPTION.OK) {\n        switch (err) {\n          case ERR_DECRYPTION.NULL:\n            throw new ErrDecrypt.Null (\"Some input data, or maybe the output pointer, was null.\");\n          case ERR_DECRYPTION.INVALID_LENGTH:\n            throw new ErrDecrypt.InvalidLength (\"The input data was shorter than TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes.\");\n          case ERR_DECRYPTION.BAD_FORMAT:\n            throw new ErrDecrypt.BadFormat (\"The input data is missing the magic number (i.e. wasn't created by this module, or is corrupted).\");\n          case ERR_DECRYPTION.KEY_DERIVATION_FAILED:\n            throw new ErrDecrypt.KeyDerivationFailed (\"The crypto lib was unable to derive a key from the given passphrase, which is usually a lack of memory issue. The functions accepting keys do not produce this error.\");\n          case ERR_DECRYPTION.FAILED:\n            throw new ErrDecrypt.Failed (\"The encrypted byte array could not be decrypted. Either the data was corrupt or the password/key was incorrect.\");\n        }\n      }\n\n      //this.encrypted = false;\n      return decrypted_data;\n    }\n\n    public bool add_password (string password) {\n      try {\n        uint8[] data = this.encrypt_profile (password, null);\n        FileUtils.set_data (this.profile, data);\n        this.encrypted = true;\n\n        return data != null;\n      } catch (Error e) {\n        return false;\n      }\n    }\n\n    public bool change_password (string old_password, string new_password) {\n      try {\n        uint8[] data = this.decrypt_profile (old_password);\n        uint8[] data2 = this.encrypt_profile (new_password, data);\n        this.password = new_password;\n        FileUtils.set_data (this.profile, data2);\n\n        return data2 != null;\n      } catch (Error e) {\n        return false;\n      }\n    }\n\n    public bool remove_password (string old_password) {\n      try {\n        uint8[] data = this.decrypt_profile (old_password);\n        this.password = null;\n        this.encrypted = false;\n        FileUtils.set_data (this.profile, data);\n\n        return data != null;\n      } catch (Error e) {\n        return false;\n      }\n    }\n  }\n\n  public class Options : Object {\n    public static ToxCore.Options copy (ToxCore.Options o) {\n      var opts = create ();\n      opts.ipv6_enabled = o.ipv6_enabled;\n      opts.udp_enabled = o.udp_enabled;\n      opts.proxy_type = o.proxy_type;\n      opts.proxy_host = o.proxy_host;\n      opts.proxy_port = o.proxy_port;\n      opts.start_port = o.end_port;\n      opts.tcp_port = o.tcp_port;\n      opts.savedata_type = o.savedata_type;\n      opts.savedata_data = o.savedata_data;\n      return opts;\n    }\n\n    public static ToxCore.Options create () {\n      // TODO: convert to exceptions\n      return new ToxCore.Options (null);\n    }\n  }\n\n  public class Peer : Object {\n    private weak Tox tox;\n    public int group_num;\n    public int num;\n\n    public string name {\n      owned get {\n        uint8[] name = new uint8[ToxCore.MAX_NAME_LENGTH];\n        int size = this.tox.handle.group_peername (group_num, this.num, name);\n        if (size >= 0) {\n          name[size] = 0; // Zero terminating.\n          return (string) name;\n        }\n        return \"Peer #%d\".printf (this.num);\n      }\n    }\n\n    public string pubkey {\n      owned get {\n        uint8[] pubkey = new uint8[ToxCore.PUBLIC_KEY_SIZE];\n        int size = this.tox.handle.group_peer_pubkey (group_num, this.num, pubkey);\n        if (size >= 0) {\n          return Util.bin2hex (pubkey);\n        }\n        return \"%d\".printf (this.num);\n      }\n    }\n\n    public bool muted { get; set; default = false; }\n\n    public signal void name_changed ();\n    public signal void peer_removed ();\n\n    public Peer (Tox tox, int group_num, int num) {\n      this.tox = tox;\n      this.group_num = group_num;\n      this.num = num;\n      this.muted = false;\n\n      /*this.name = this.parent_group.get_peer_name (this.num);\n      this.pubkey = this.parent_group.get_peer_pubkey (this.num);*/\n    }\n  }\n\n  public class Group : Object {\n    public weak Tox tox;\n    public HashTable<int, Peer> peers = new HashTable<int, Peer> (direct_hash, direct_equal);\n    public int num;\n    public int id;\n\n    public string name { get; set; default = _(\"Untitled group\"); }\n\n    public bool muted { get; set; default = false; }\n\n    public int peers_count {\n      get {\n        return this.tox.handle.group_number_peers (this.num);\n      }\n    }\n\n    public DateTime joined_time { get; set; default = new DateTime.now_local (); }\n\n    public signal void message (Peer peer, string message);\n    public signal void action (Peer peer, string action);\n    public signal void title_changed (int peer_num, string title);\n    public signal void removed ();\n    public signal void peer_count_changed ();\n    public signal void peer_added (Peer peer);\n    public signal void peer_removed (int peer_num, string peer_pubkey, string peer_name);\n    public signal void peer_name_changed (Peer peer);\n\n    public Group (Tox tox, int num) {\n      this.tox = tox;\n      this.num = num;\n\n      Rand rnd = new Rand.with_seed ((uint32)new DateTime.now_local ().hash ());\n      uint32 rnd_id = rnd.next_int ();\n      this.id = (int)rnd_id;\n      \n      this.joined_time = new DateTime.now_local ();\n    }\n\n    public void add_peer (int peer_num) {\n      Peer peer = new Peer (this.tox, this.num, peer_num);\n      this.peers[peer_num] = peer;\n      \n      if (this.peers[peer_num] != null) {\n        this.peer_added (this.peers[peer_num]);\n        this.peer_count_changed ();\n      }\n    }\n\n    public void remove_peer (int peer_num) {\n      string pubkey = this.peers[peer_num].pubkey;\n      string peer_name = this.peers[peer_num].name;\n\n      this.peers.remove (peer_num);\n      this.peer_removed (peer_num, pubkey, peer_name);\n      this.peer_count_changed ();\n    }\n    \n    public void change_peer_name (int peer_num) {\n      this.peer_name_changed (this.peers[peer_num]);\n      this.peers[peer_num].name_changed ();\n    }\n\n    public int send_message (string message) {\n      return this.tox.handle.group_message_send (this.num, message.data);\n    }\n\n    public int send_action (string action) {\n      return this.tox.handle.group_action_send (this.num, action.data);\n    }\n\n    public void set_title (string title) {\n      this.tox.handle.group_set_title (this.num, title.data);\n      this.name = title;\n      this.title_changed (-1, title);\n    }\n  }\n\n  public class Friend : Object {\n    private weak Tox tox;\n    public uint32 num; // libtoxcore identifier\n    public uint position;\n    // Bytes is immutable\n    internal HashTable<uint32, Bytes> files_send = new HashTable<uint32, Bytes> (direct_hash, direct_equal);\n    // ByteArray is mutable\n    internal HashTable<uint32, FileDownload> files_recv = new HashTable<uint32, FileDownload> (direct_hash, direct_equal);\n\n    /* We could implement this like just a get { } that goes to libtoxcore, and\n     * use GLib.Object.notify_property () in the callbacks, but the name is not\n     * set until we leave the callback so we'll just keep our own copy.\n     */\n    public Gdk.Pixbuf? avatar_pixbuf { get; set; default = null; }\n    public string name { get; set; }\n    public string status_message { get; set; }\n\n    public string pubkey {\n      owned get {\n        uint8[] chars = new uint8[ToxCore.PUBLIC_KEY_SIZE];\n        tox.handle.friend_get_public_key (num, chars, null);\n        return Util.bin2hex (chars);\n      }\n    }\n\n    public UserStatus status { get; private set; }\n    public UserStatus? last_status { get; set; }\n    public bool connected { get; set; }\n    public bool typing { get; set; }\n    public bool blocked { get; set; default = false; }\n\n    public signal void message (string message);\n    public signal void action (string message);\n    public signal void avatar (Gdk.Pixbuf pixbuf);\n    public signal void friend_info (string message);\n    public signal void file_transfer (string filename, uint64 file_size, uint32 id);\n    public signal void file_paused (uint32 id);\n    public signal void file_progress (uint32 id, uint64 position);\n    public signal void file_resumed (uint32 id);\n    public signal void file_done (string filename, Bytes data, uint32 id);\n    public signal void file_canceled (uint32 id);\n    public signal void file_received (uint32 id);\n\n    public Friend (Tox tox, uint32 num) {\n      this.tox = tox;\n      this.num = num;\n      this.last_status = UserStatus.OFFLINE;\n\n      string profile_dir = Path.build_path (Path.DIR_SEPARATOR_S, Environment.get_user_config_dir (), \"tox\");\n      string avatars_dir = Path.build_path (Path.DIR_SEPARATOR_S, profile_dir, \"avatars\");\n      string avatar_path = Path.build_path (Path.DIR_SEPARATOR_S, avatars_dir, this.pubkey + \".png\");\n\n      if (FileUtils.test (avatar_path, FileTest.EXISTS)) {\n        var pixbuf = new Gdk.Pixbuf.from_file_at_scale (avatar_path, 48, 48, false);\n        this.avatar_pixbuf = pixbuf;\n      } else {\n        Cairo.Surface surface = Util.identicon_for_pubkey (this.pubkey);\n        this.avatar_pixbuf = Gdk.pixbuf_get_from_surface (surface, 0, 0, 48, 48);\n      }\n\n      this.notify[\"connected\"].connect ((o, p) => update_user_status ());\n      this.notify[\"blocked\"].connect ((o, p) => update_user_status ());\n\n      this.avatar.connect ((pixbuf) => {\n        uint8[] pixels;\n        pixbuf.save_to_buffer (out pixels, \"png\");\n        FileUtils.set_data (avatar_path, pixels);\n\n        this.avatar_pixbuf = pixbuf;\n      });\n    }\n\n    public string get_uname () {\n      uint8[] text = new uint8[ToxCore.MAX_NAME_LENGTH];\n      this.tox.handle.friend_get_name (this.num, text, null);\n\n      return (string) text;\n    }\n\n    public string get_ustatus_message () {\n      uint8[] text = new uint8[ToxCore.MAX_STATUS_MESSAGE_LENGTH];\n      this.tox.handle.friend_get_status_message (this.num, text, null);\n\n      return (string) text;\n    }\n\n    public string last_online (string? format) {\n      uint64 last = this.tox.handle.friend_get_last_online (this.num, null);\n      //debug (@\" for $num: $last\");\n\n      DateTime time = new DateTime.from_unix_local ((int64)last);\n      return time.format ((format != null) ? format : _(\"<b>Last online:</b>\") + \" %H:%M %d/%m/%Y\");\n    }\n\n    public bool is_presumed_dead () {\n      uint64 last = this.tox.handle.friend_get_last_online (this.num, null);\n      DateTime time = new DateTime.from_unix_local ((int64)last);\n      DateTime dead_time = time.add_months (6); // Profile presumed dead when not active for 6+ months.\n      DateTime now = new DateTime.now_local ();\n\n      if (dead_time.compare (now) == -1) {\n        return true;\n      }\n      return false;\n    }\n\n    public void set_user_status (ToxCore.UserStatus status) {\n      if (blocked) {\n        this.status = UserStatus.BLOCKED;\n      } else if (!connected) {\n        this.status = UserStatus.OFFLINE;\n      } else {\n        this.status = core_to_wrapper_status (status);\n      }\n    }\n\n    public void update_user_status () {\n      this.set_user_status (tox.handle.friend_get_status (num, null));\n    }\n\n    public void reply_file_transfer (bool accept, uint32 id) {\n      tox.handle.file_control (this.num, id, accept ? FileControl.RESUME : FileControl.CANCEL, null);\n    }\n\n    public uint32 send_message (string message) {\n      ERR_FRIEND_SEND_MESSAGE err;\n      return tox.handle.friend_send_message (this.num, MessageType.NORMAL, message.data, out err);\n    }\n\n    public uint32 send_action (string action_message) {\n      ERR_FRIEND_SEND_MESSAGE err;\n      return tox.handle.friend_send_message (this.num, MessageType.ACTION, action_message.data, out err);\n    }\n\n    public void send_avatar () {\n      if (tox.avatar != null) {\n        uint8[] pixels;\n        tox.avatar.save_to_buffer (out pixels, \"png\");\n\n        uint8[] avatar_id = new uint8[ToxCore.HASH_LENGTH];\n        ToxCore.Tox.hash (avatar_id, pixels);\n\n        ERR_FILE_SEND err;\n        uint32 transfer = this.tox.handle.file_send (this.num, FileKind.AVATAR, pixels.length, avatar_id, null, out err);\n        if (err != ERR_FILE_SEND.OK) {\n          debug (\"tox_file_send: %d\", err);\n        }\n\n        this.files_send[transfer] = new Bytes (pixels);\n      }\n    }\n\n    public uint32 send_file (string path) {\n      var file = File.new_for_path (path);\n      var info = file.query_info (\"standard::size\", FileQueryInfoFlags.NONE);\n      var id = this.tox.handle.file_send (this.num, FileKind.DATA, info.get_size (), null, file.get_basename ().data, null);\n      uint8[] data;\n      FileUtils.get_data (path, out data);\n      this.files_send[id] = new Bytes.take (data);\n\n      return id;\n    }\n\n    public uint32 send_image (Gdk.Pixbuf pixbuf, string name) {\n      uint8[] data;\n      pixbuf.save_to_buffer (out data, \"png\");\n      var id = this.tox.handle.file_send (this.num, FileKind.DATA, data.length, null, name.data, null);\n      this.files_send[id] = new Bytes.take (data);\n\n      return id;\n    }\n\n    public void send_typing (bool is_typing) {\n      this.tox.handle.self_set_typing (this.num, is_typing, null);\n    }\n\n    public bool delete () throws ErrFriendDelete {\n      ERR_FRIEND_DELETE err;\n      var retval = this.tox.handle.friend_delete (this.num, out err);\n\n      switch (err) {\n        case ERR_FRIEND_DELETE.FRIEND_NOT_FOUND:\n          throw new ErrFriendDelete.NotFound (\"There was no friend with the given friend number. No friends were deleted.\");\n      }\n\n      return retval;\n    }\n    \n    public bool invite_to_group (int group_num) {\n      if (this.tox.handle.invite_friend ((int32)this.num, group_num) != -1) {\n        return true;\n      }\n      return false;\n    }\n  }\n\n  private class FileDownload : Object {\n    public FileKind kind;\n    public string? name = null;\n    //public bool paused = false;\n    public ByteArray data = new ByteArray ();\n\n    public FileDownload (string name) {\n      this.name = name;\n      this.kind = FileKind.DATA;\n    }\n\n    public FileDownload.avatar () {\n      this.kind = FileKind.AVATAR;\n    }\n  }\n}\n"
  },
  {
    "path": "tools/.gitignore",
    "content": "1.0\n2.4\n3.0\n*.rpm\n"
  },
  {
    "path": "tools/build_linux_package.sh",
    "content": "#!/bin/sh\n# Linux .tar.gz build maker\n\ncurdir=`pwd`\ntmpdir=\"/tmp/ricin\"\n\ncd \"$curdir\"\n./waf configure --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib\n./waf build --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib\n\nmkdir -p \"$tmpdir\"\n./waf install --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib\n\ncd /tmp/\necho \"#!/bin/sh\necho -e \\\"Copying files to their correct destinations...\\\"\necho -e \\\"The system may ask you for sudo password in order to install Ricin.\\\"\nsudo cp -r -f share/ /usr/share/\nsudo cp -f bin/Ricin /usr/bin/Ricin\necho -e \\\"Ricin static binary was installed!\\\"\nexit 0\" >> ricin/install.sh\nchmod +x ricin/install.sh\n\ntar czf ricin.tar.gz ricin\nmv ricin.tar.gz \"$curdir\"\nrm -rf ricin\n\nexit 0\n"
  },
  {
    "path": "tools/build_osx_package.sh",
    "content": "#!/bin/sh\n# OSX .dmg build maker\n\ncurdir=`pwd`\ntmpdir=\"/tmp/ricin.app\"\nbindir=\"Contents/MacOS\"\n\ncd \"$curdir\"\n./waf configure --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib --bindir=\"$bindir\"\n./waf build --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib --bindir=\"$bindir\"\n\nmkdir -p \"$tmpdir\"\n./waf install --exec-prefix=\"$tmpdir\" --prefix=\"$tmpdir\" --libdir=lib --bindir=\"$bindir\"\n\ncd \"$tmpdir\"\nmkdir -p mnttmp\ngunzip < \"$curdir/tools/template.dmg.gz\" > working.dmg\nhdiutil attache working.dmg -noautoopen -quiet -mountpoint mnttmp\n\n# NOTE: output of hdiutil changes every now and then.\n# Verify that this is still working.\nDEV=`hdiutil info|tail -1|awk '{print $1}'`\nrm -rf mnttmp/ricin.app\nmv /tmp/ricin.app mnttmp\nhdiutil detach ${DEV}\nrm -rf mnttmp\nrm -f ricin.dmg\nhdiutil convert working.dmg -quiet -format UDZO -imagekey zlib-level=9 -o ricin.dmg\nrm -f working.dmg\n"
  },
  {
    "path": "tools/make-packages.sh",
    "content": "#!/bin/bash\n\n###\n# Ricin packages maker\n# Use fpm to generate rpm/arch/deb/tar.gz packages.\n# @author SkyzohKey\n# @license MIT\n###\n\nfpm --verbose \\\n  --replaces Ricin \\\n  --depends vala \\\n  --license \"GPLv3\" \\\n  --url \"https://ricin.im\" \\\n  --description \"Dead simple, privacy oriented, instant messaging app! \" \\\n  -a $(uname -m) \\\n  -C ../build \\\n  -s dir -t rpm -f \\\n  -p Ricin-VERSION-$RICIN_ITER.ARCH.rpm \\\n  -n Ricin \\\n  -v $RICIN_VERSION \\\n  --iteration $RICIN_ITER \\\n  ./Ricin=/usr/bin/Ricin \\\n  ./res/ricin.desktop=/usr/share/applications/ricin.desktop \\\n  ../res/images/icons/ricin.svg=/usr/share/pixmaps/ricin.svg \\\n  ../res/ricin.appdata.xml=/usr/share/appdata/ricin.appdata.xml\n"
  },
  {
    "path": "tools/osx.sh",
    "content": "#!/bin/sh\n\necho \"Installing Ricin's dependencies from Homebrew\"\nbrew install vala ninja gtk+3 glib json-glib libsoup libnotify brew-pip\n\necho \"Installing The Meson Build System from brew-pip\"\nbrew pip meson\n\necho \"Auto generating needed files for compilation\"\ncd ..\nmake autogen\n\necho \"Starting build_osx_package.sh\"\nchmod +x ./tools/build_osx_package.sh\n./tools/build_osx_package.sh\n"
  },
  {
    "path": "tools/verify_commit_message.sh",
    "content": "#!/bin/bash\n#\n#    Copyright © 2016 Zetok Zalbavar <zetok@openmailbox.org>\n#\n#    This program is free software: you can redistribute it and/or modify\n#    it under the terms of the GNU General Public License as published by\n#    the Free Software Foundation, either version 3 of the License, or\n#    (at your option) any later version.\n#\n#    This program is distributed in the hope that it will be useful,\n#    but WITHOUT ANY WARRANTY; without even the implied warranty of\n#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#    GNU General Public License for more details.\n#\n#    You should have received a copy of the GNU General Public License\n#    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# Script for verifying conformance to commit message format of commits in commit\n# range supplied.\n#\n# Scrpt fails (non-zero exit status) if commit messages don't conform.\n\n# usage:\n#   ./$script $commit_range\n#\n# $commit_range – in format `abdce..12345`\n\nARG=\"$1\"\n\necho \"\" # ← formatting\n\n# Conform, /OR ELSE/.\nif git log --format=format:'%s' \"$ARG\" | \\\n    grep -v -E '^((feat|feature|fix|docs|style|refactor|perf|revert|test|chore|ui|i18n)(\\(.+\\))?:.{1,68})|(Merge pull request #[[:digit:]]{4,10})$'\nthen\n    echo \"\"\n    echo \"Above ↑ commits don't conform to commit message format:\"\n    echo \"https://github.com/RicinApp/Ricin/blob/master/docs/CONTRIBUTING.md#commit-message-format\"\n    echo \"\"\n    echo \"Please fix the commit name in order to have your commit accepted.\"\n    echo \"\"\n    echo \"If you're not sure how to rewrite history, here's a helpful tutorial:\"\n    echo \"https://www.atlassian.com/git/tutorials/rewriting-history/git-commit--amend/\"\n    echo \"\"\n    echo \"If you're still not sure what to do, feel free to pop on IRC, or ask in PR comments for help :)\"\n    echo \"We're available at #ricin-dev on irc.freenode.net or via Gitter: RicinApp/Ricin\"\n    # fail the build\n    exit 1\nfi\n"
  },
  {
    "path": "vapis/libtoxav.deps",
    "content": "libtoxcore\n"
  },
  {
    "path": "vapis/libtoxav.vapi",
    "content": "[CCode (cheader_filename=\"toxav/toxav.h\", cprefix=\"ToxAV\", lower_case_cprefix=\"toxav_\")]\nnamespace ToxAV {\n    namespace Version {\n        /**\n         * The major version number. Incremented when the API or ABI changes in an\n         * incompatible way.\n         */\n        public const uint32 MAJOR;\n\n        /**\n         * The minor version number. Incremented when functionality is added without\n         * breaking the API or ABI. Set to 0 when the major version number is\n         * incremented.\n         */\n        public const uint32 MINOR;\n\n        /**\n         * The patch or revision number. Incremented when bugfixes are applied without\n         * changing any functionality or API or ABI.\n         */\n        public const uint32 PATCH;\n\n        /**\n         * A macro to check at preprocessing time whether the client code is compatible\n         * with the installed version of ToxAV\n         */\n        [CCode (cname=\"TOXAV_VERSION_IS_API_COMPATIBLE\")]\n        public static bool is_api_compatible (uint32 major, uint32 minor, uint32 patch);\n\n        /**\n         * A convenience macro to call toxav_version_is_compatible with the currently\n         * compiling API version.\n         */\n        [CCode (cname=\"TOXAV_VERSION_IS_ABI_COMPATIBLE\")]\n        public static bool is_abi_compatible ();\n\n        /**\n         * A macro to make compilation fail if the client code is not compatible with\n         * the installed version of\n         */\n        [CCode (cname=\"TOXAV_VERSION_REQUIRE\")]\n        public static char require_version (uint32 major, uint32 minor, uint32 patch);\n\n        /**\n         * Return the major version number of the library. Can be used to display the\n         * Tox library version or to check whether the client is compatible with the\n         * dynamically linked version of ToxAV\n         */\n        [CCode (cname=\"toxav_version_major\")]\n        public static uint32 lib_major ();\n\n        /**\n         * Return the minor version number of the library.\n         */\n        [CCode (cname=\"toxav_version_minor\")]\n        public static uint32 lib_minor ();\n\n        /**\n         * Return the patch number of the library.\n         */\n        [CCode (cname=\"toxav_version_patch\")]\n        public static uint32 lib_patch ();\n\n        /**\n         * Return whether the compiled library version is compatible with the passed\n         * version numbers.\n         */\n        [CCode (cname=\"toxav_version_is_compatible\")]\n        public static bool is_compatible (uint32 major, uint32 minor, uint32 patch);\n    }\n\n    /*******************************************************************************\n     *\n     * :: Global enumerations\n     *\n     ******************************************************************************/\n\n    [CCode (cname=\"TOXAV_FRIEND_CALL_STATE\", cprefix=\"TOXAV_FRIEND_CALL_STATE_\", has_type_id=false)]\n    public enum FriendCallState {\n        /**\n        * Set by the AV core if an error occurred on the remote end or if friend\n        * timed out. This is the final state after which no more state\n        * transitions can occur for the call. This call state will never be triggered\n        * in combination with other call states.\n        */\n        ERROR,\n        /**\n         * The call has finished. This is the final state after which no more state\n         * transitions can occur for the call. This call state will never be\n         * triggered in combination with other call states.\n         */\n        FINISHED,\n        /**\n         * The flag that marks that friend is sending audio.\n         */\n        SENDING_A,\n        /**\n         * The flag that marks that friend is sending video.\n         */\n        SENDING_V,\n        /**\n         * The flag that marks that friend is receiving audio.\n         */\n        ACCEPTING_A,\n        /**\n         * The flag that marks that friend is receiving video.\n         */\n        ACCEPTING_V\n    }\n\n    [CCode (cname=\"TOXAV_CALL_CONTROL\", cprefix=\"TOXAV_CALL_CONTROL_\", has_type_id=false)]\n    public enum CallControl {\n        /**\n         * Resume a previously paused call. Only valid if the pause was caused by this\n         * client, if not, this control is ignored. Not valid before the call is accepted.\n         */\n        RESUME,\n        /**\n         * Put a call on hold. Not valid before the call is accepted.\n         */\n        PAUSE,\n        /**\n         * Reject a call if it was not answered, yet. Cancel a call after it was\n         * answered.\n         */\n        CANCEL,\n        /**\n         * Request that the friend stops sending audio. Regardless of the friend's\n         * compliance, this will cause the audio_receive_frame event to stop being\n         * triggered on receiving an audio frame from the friend.\n         */\n        MUTE_AUDIO,\n        /**\n         * Calling this control will notify client to start sending audio again.\n         */\n        UNMUTE_AUDIO,\n        /**\n         * Request that the friend stops sending video. Regardless of the friend's\n         * compliance, this will cause the video_receive_frame event to stop being\n         * triggered on receiving a video frame from the friend.\n         */\n        HIDE_VIDEO,\n        /**\n         * Calling this control will notify client to start sending video again.\n         */\n        SHOW_VIDEO\n    }\n\n\n\n    /*******************************************************************************\n     *\n     * :: Errors enums\n     *\n     ******************************************************************************/\n\n    [CCode (cname=\"TOXAV_ERR_NEW\", cprefix=\"TOXAV_ERR_NEW_\")]\n    public enum ERR_NEW {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n        /**\n         * Memory allocation failure while trying to allocate structures required for\n         * the A/V session.\n         */\n        MALLOC,\n        /**\n         * Attempted to create a second session for the same Tox instance.\n         */\n        MULTIPLE\n    }\n\n    [CCode (cname=\"TOXAV_ERR_CALL\", cprefix=\"TOXAV_ERR_CALL_\")]\n    public enum ERR_CALL {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n        /**\n         * A resource allocation error occurred while trying to create the structures\n         * required for the call.\n         */\n        MALLOC,\n        /**\n         * Synchronization error occurred.\n         */\n        SYNC,\n        /**\n         * The friend number did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n        /**\n         * The friend was valid, but not currently connected.\n         */\n        FRIEND_NOT_CONNECTED,\n        /**\n         * Attempted to call a friend while already in an audio or video call with\n         * them.\n         */\n        FRIEND_ALREADY_IN_CALL,\n        /**\n         * Audio or video bit rate is invalid.\n         */\n        INVALID_BIT_RATE\n    }\n\n    [CCode (cname=\"TOXAV_ERR_CALL_CONTROL\", cprefix=\"TOXAV_ERR_CALL_CONTROL_\")]\n    public enum ERR_CALL_CONTROL {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n        /**\n         * Synchronization error occurred.\n         */\n        SYNC,\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n        /**\n         * This client is currently not in a call with the friend. Before the call is\n         * answered, only CANCEL is a valid control.\n         */\n        FRIEND_NOT_IN_CALL,\n        /**\n         * Happens if user tried to pause an already paused call or if trying to\n         * resume a call that is not paused.\n         */\n        INVALID_TRANSITION\n    }\n\n    [CCode (cname=\"TOXAV_ERR_ANSWER\", cprefix=\"TOXAV_ERR_ANSWER_\")]\n    public enum ERR_ANSWER {\n        /**\n         * The function returned successfully.\n         */\n        TOXAV_ERR_ANSWER_OK,\n        /**\n         * Synchronization error occurred.\n         */\n        TOXAV_ERR_ANSWER_SYNC,\n        /**\n         * Failed to initialize codecs for call session. Note that codec initiation\n         * will fail if there is no receive callback registered for either audio or\n         * video.\n         */\n        TOXAV_ERR_ANSWER_CODEC_INITIALIZATION,\n        /**\n         * The friend number did not designate a valid friend.\n         */\n        TOXAV_ERR_ANSWER_FRIEND_NOT_FOUND,\n        /**\n         * The friend was valid, but they are not currently trying to initiate a call.\n         * This is also returned if this client is already in a call with the friend.\n         */\n        TOXAV_ERR_ANSWER_FRIEND_NOT_CALLING,\n        /**\n         * Audio or video bit rate is invalid.\n         */\n        TOXAV_ERR_ANSWER_INVALID_BIT_RATE\n    }\n\n    [CCode (cname=\"TOXAV_ERR_SEND_FRAME\", cprefix=\"TOXAV_ERR_SEND_FRAME_\")]\n    public enum ERR_SEND_FRAME {\n        /**\n         * The function returned successfully.\n         */\n        TOXAV_ERR_SEND_FRAME_OK,\n        /**\n         * In case of video, one of Y, U, or V was NULL. In case of audio, the samples\n         * data pointer was NULL.\n         */\n        TOXAV_ERR_SEND_FRAME_NULL,\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        TOXAV_ERR_SEND_FRAME_FRIEND_NOT_FOUND,\n        /**\n         * This client is currently not in a call with the friend.\n         */\n        TOXAV_ERR_SEND_FRAME_FRIEND_NOT_IN_CALL,\n        /**\n         * One of the frame parameters was invalid. E.g. the resolution may be too\n         * small or too large, or the audio sampling rate may be unsupported.\n         */\n        TOXAV_ERR_SEND_FRAME_INVALID,\n        /**\n         * Either friend turned off audio or video receiving or we turned off sending\n         * for the said payload.\n         */\n        TOXAV_ERR_SEND_FRAME_PAYLOAD_TYPE_DISABLED,\n        /**\n         * Failed to push frame through rtp interface.\n         */\n        TOXAV_ERR_SEND_FRAME_RTP_FAILED\n    }\n\n    [CCode (cname=\"TOXAV_ERR_BIT_RATE_SET\", cprefix=\"TOXAV_ERR_BIT_RATE_SET_\")]\n    public enum ERR_BIT_RATE_SET {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n        /**\n         * Synchronization error occurred.\n         */\n        SYNC,\n        /**\n         * The audio bit rate passed was not one of the supported values.\n         */\n        INVALID_AUDIO_BIT_RATE,\n        /**\n         * The video bit rate passed was not one of the supported values.\n         */\n        INVALID_VIDEO_BIT_RATE,\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n        /**\n         * This client is currently not in a call with the friend.\n         */\n        FRIEND_NOT_IN_CALL\n    }\n\n    [CCode (cname=\"ToxAV\", free_function=\"toxav_kill\", cprefix=\"toxav_\", has_type_id=false)]\n    [Compact]\n    public class ToxAV {\n        /**\n         * Start new A/V session. There can only be only one session per Tox instance.\n         */\n        public ToxAV (ToxCore.Tox tox, out ERR_NEW? error = null);\n\n        /**\n         * Returns the Tox instance the A/V object was created for.\n         */\n        public ToxCore.Tox get_tox (ToxAV tox_av);\n\n        /**\n         * Returns the interval in milliseconds when the next toxav_iterate call should\n         * be. If no call is active at the moment, this function returns 200.\n         */\n        public uint32 iteration_interval ();\n\n        /**\n         * Main loop for the session. This function needs to be called in intervals of\n         * toxav_iteration_interval() milliseconds. It is best called in the separate\n         * thread from tox_iterate.\n         */\n        public void iterate ();\n\n        /**\n         * Call a friend. This will start ringing the friend.\n         *\n         * It is the client's responsibility to stop ringing after a certain timeout,\n         * if such behaviour is desired. If the client does not stop ringing, the\n         * library will not stop until the friend is disconnected. Audio and video\n         * receiving are both enabled by default.\n         *\n         * @param friend_number The friend number of the friend that should be called.\n         * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable\n         * audio sending.\n         * @param video_bit_rate Video bit rate in Kb/sec. Set this to 0 to disable\n         * video sending.\n         */\n        public bool call (uint32 friend_number, uint32 audio_bit_rate, uint32 video_bit_rate, out ERR_CALL error);\n\n        /**\n         * The function type for the call callback.\n         *\n         * @param friend_number The friend number from which the call is incoming.\n         * @param audio_enabled True if friend is sending audio.\n         * @param video_enabled True if friend is sending video.\n         */\n        [CCode (cname=\"toxav_call_cb\", has_type_id=false)]\n        public delegate void CallFunc (ToxAV self, uint32 friend_number, bool audio_enabled, bool video_enabled);\n\n        /**\n         * Set the callback for the `call` event. Pass NULL to unset.\n         *\n         */\n        public void callback_call (CallFunc callback);\n\n        /**\n         * Accept an incoming call.\n         *\n         * If answering fails for any reason, the call will still be pending and it is\n         * possible to try and answer it later. Audio and video receiving are both\n         * enabled by default.\n         *\n         * @param friend_number The friend number of the friend that is calling.\n         * @param audio_bit_rate Audio bit rate in Kb/sec. Set this to 0 to disable\n         * audio sending.\n         * @param video_bit_rate Video bit rate in Kb/sec. Set this to 0 to disable\n         * video sending.\n         */\n        public bool answer (uint32 friend_number, uint32 audio_bit_rate, uint32 video_bit_rate, out ERR_ANSWER error);\n\n        /**\n         * The function type for the call_state callback.\n         *\n         * @param friend_number The friend number for which the call state changed.\n         * @param state The bitmask of the new call state which is guaranteed to be\n         * different than the previous state. The state is set to 0 when the call is\n         * paused. The bitmask represents all the activities currently performed by the\n         * friend.\n         */\n        [CCode (cname=\"toxav_call_cb\", has_type_id=false)]\n        public delegate void CallStateFunc (ToxAV self, uint32 friend_number, uint32 state);\n\n        /**\n         * Set the callback for the `call_state` event. Pass NULL to unset.\n         *\n         */\n        public void callback_call_state (CallStateFunc callback);\n\n        /**\n         * Sends a call control command to a friend.\n         *\n         * @param friend_number The friend number of the friend this client is in a call\n         * with.\n         * @param control The control command to send.\n         *\n         * @return true on success.\n         */\n        public bool call_control (uint32 friend_number, CallControl control, out ERR_CALL_CONTROL error);\n\n        /**\n         * Set the audio bit rate to be used in subsequent audio/video frames.\n         *\n         * @param friend_number The friend number of the friend for which to set the\n         * audio bit rate.\n         * @param audio_bit_rate The new audio bit rate in Kb/sec. Set to 0 to disable\n         * audio sending. Set to -1 to leave unchanged.\n         * @param video_bit_rate The new video bit rate in Kb/sec. Set to 0 to disable\n         * video sending. Set to -1 to leave unchanged.\n         *\n         */\n        public bool bit_rate_set (uint32 friend_number, uint32 audio_bit_rate, uint32 video_bit_rate, out ERR_BIT_RATE_SET error);\n\n        /**\n         * The function type for the bit_rate_status callback. The event is triggered\n         * when the network becomes too saturated for current bit rates at which\n         * point core suggests new bit rates.\n         *\n         * @param friend_number The friend number of the friend for which to set the\n         * audio bit rate.\n         * @param audio_bit_rate Suggested maximum audio bit rate in Kb/sec.\n         * @param video_bit_rate Suggested maximum video bit rate in Kb/sec.\n         */\n        [CCode (cname=\"toxav_bit_rate_set_status_cb\", has_type_id = false)]\n        public delegate void BitRateStatusFunc (uint32 friend_number, uint32 audio_bit_rate, uint32 video_bit_rate);\n\n        /**\n         * Set the callback for the `bit_rate_status` event. Pass NULL to unset.\n         *\n         */\n        public void callback_bit_rate_status (BitRateStatusFunc callback);\n\n        /**\n         * Send an audio frame to a friend.\n         *\n         * The expected format of the PCM data is: [s1c1][s1c2][...][s2c1][s2c2][...]...\n         * Meaning: sample 1 for channel 1, sample 1 for channel 2, ...\n         * For mono audio, this has no meaning, every sample is subsequent. For stereo,\n         * this means the expected format is LRLRLR... with samples for left and right\n         * alternating.\n         *\n         * @param friend_number The friend number of the friend to which to send an\n         * audio frame.\n         * @param pcm An array of audio samples. The size of this array must be\n         * sample_count * channels.\n         * @param sample_count Number of samples in this frame. Valid numbers here are\n         * ((sample rate) * (audio length) / 1000), where audio length can be\n         * 2.5, 5, 10, 20, 40 or 60 millseconds.\n         * @param channels Number of audio channels. Supported values are 1 and 2.\n         * @param sampling_rate Audio sampling rate used in this frame. Valid sampling\n         * rates are 8000, 12000, 16000, 24000, or 48000.\n         */\n        public bool audio_send_frame (uint32 friend_number, [CCode (array_length=false)] int16[] pcm, size_t sample_count, uint8 channels, uint32 sampling_rate, out ERR_SEND_FRAME error);\n\n        /**\n         * Send a video frame to a friend.\n         *\n         * Y - plane should be of size: height * width\n         * U - plane should be of size: (height/2) * (width/2)\n         * V - plane should be of size: (height/2) * (width/2)\n         *\n         * @param friend_number The friend number of the friend to which to send a video\n         * frame.\n         * @param width Width of the frame in pixels.\n         * @param height Height of the frame in pixels.\n         * @param y Y (Luminance) plane data.\n         * @param u U (Chroma) plane data.\n         * @param v V (Chroma) plane data.\n         */\n        public bool video_send_frame (uint32 friend_number, uint16 width, uint16 height, out uint8 y, out uint8 u, out uint8 v, out ERR_SEND_FRAME error);\n\n        /**\n         * The function type for the audio_receive_frame callback. The callback can be\n         * called multiple times per single iteration depending on the amount of queued\n         * frames in the buffer. The received format is the same as in send function.\n         *\n         * @param friend_number The friend number of the friend who sent an audio frame.\n         * @param pcm An array of audio samples (sample_count * channels elements).\n         * @param sample_count The number of audio samples per channel in the PCM array.\n         * @param channels Number of audio channels.\n         * @param sampling_rate Sampling rate used in this frame.\n         *\n         */\n        public delegate void AudioReceiveFrameFunc (ToxAV self, uint32 friend_number, [CCode (array_length=false)] int16[] pcm, size_t sample_count, uint8 channels, uint32 sampling_rate);\n\n        /**\n         * Set the callback for the `audio_receive_frame` event. Pass NULL to unset.\n         *\n         */\n        public void callback_audio_receive_frame (AudioReceiveFrameFunc callback);\n\n        /**\n         * The function type for the video_receive_frame callback.\n         *\n         * @param friend_number The friend number of the friend who sent a video frame.\n         * @param width Width of the frame in pixels.\n         * @param height Height of the frame in pixels.\n         * @param y\n         * @param u\n         * @param v Plane data.\n         *          The size of plane data is derived from width and height where\n         *          Y = MAX(width, abs(ystride)) * height,\n         *          U = MAX(width/2, abs(ustride)) * (height/2) and\n         *          V = MAX(width/2, abs(vstride)) * (height/2).\n         * @param ystride\n         * @param ustride\n         * @param vstride Strides data. Strides represent padding for each plane\n         *                that may or may not be present. You must handle strides in\n         *                your image processing code. Strides are negative if the\n         *                image is bottom-up hence why you MUST abs() it when\n         *                calculating plane buffer size.\n         */\n        public delegate void VideoReceiveFrameFunc (ToxAV self, uint32 friend_number, uint16 width, uint16 height, out uint8 y, out uint8 u, out uint8 v, out int32 ystride, out int32 ustride, out int32 vstride);\n\n        /**\n         * Set the callback for the `video_receive_frame` event. Pass NULL to unset.\n         *\n         */\n        public void callback_video_receive_frame (VideoReceiveFrameFunc callback);\n    }\n}\n"
  },
  {
    "path": "vapis/libtoxcore.vapi",
    "content": "[CCode (cheader_filename=\"tox/tox.h\", cprefix=\"Tox\", lower_case_cprefix=\"tox_\")]\nnamespace ToxCore {\n    namespace Version {\n        /**\n         * The major version number. Incremented when the API or ABI changes in an\n         * incompatible way.\n         */\n        public const uint32 MAJOR;\n\n        /**\n         * The minor version number. Incremented when functionality is added without\n         * breaking the API or ABI. Set to 0 when the major version number is\n         * incremented.\n         */\n        public const uint32 MINOR;\n\n        /**\n         * The patch or revision number. Incremented when bugfixes are applied without\n         * changing any functionality or API or ABI.\n         */\n        public const uint32 PATCH;\n\n        /**\n         * A macro to check at preprocessing time whether the client code is compatible\n         * with the installed version of Tox.\n         */\n        [CCode (cname=\"TOX_VERSION_IS_API_COMPATIBLE\")]\n        public static bool is_api_compatible (uint32 major, uint32 minor, uint32 patch);\n\n        /**\n        * A macro to make compilation fail if the client code is not compatible with\n        * the installed version of Tox.\n        */\n        [CCode (cname=\"TOX_VERSION_REQUIRE\")]\n        public static char require_version (uint32 major, uint32 minor, uint32 patch);\n\n        /**\n        * Return the major version number of the library. Can be used to display the\n        * Tox library version or to check whether the client is compatible with the\n        * dynamically linked version of Tox.\n        */\n        [CCode (cname=\"tox_version_major\")]\n        public static uint32 lib_major ();\n\n        /**\n         * Return the minor version number of the library.\n         */\n        [CCode (cname=\"tox_version_minor\")]\n        public static uint32 lib_minor ();\n\n        /**\n         * Return the patch number of the library.\n         */\n        [CCode (cname=\"tox_version_patch\")]\n        public static uint32 lib_patch ();\n\n        /**\n         * Return whether the compiled library version is compatible with the passed\n         * version numbers.\n         */\n        [CCode (cname=\"tox_version_is_compatible\")]\n        public static bool is_compatible (uint32 major, uint32 minor, uint32 patch);\n\n        /**\n         * A convenience macro to call tox_version_is_compatible with the currently\n         * compiling API version.\n         */\n        [CCode (cname=\"TOX_VERSION_IS_ABI_COMPATIBLE\")]\n        public static bool is_abi_compatible ();\n    }\n\n    /**\n     * The size of a Tox Public Key in bytes.\n     */\n    [CCode (cname=\"TOX_PUBLIC_KEY_SIZE\")]\n    public const int PUBLIC_KEY_SIZE;\n\n    /**\n     * The size of a Tox Secret Key in bytes.\n     */\n    [CCode (cname=\"TOX_SECRET_KEY_SIZE\")]\n    public const int SECRET_KEY_SIZE;\n\n    /**\n     * The size of a Tox address in bytes. Tox addresses are in the format\n     * [Public Key (TOX_PUBLIC_KEY_SIZE bytes)][nospam (4 bytes)][checksum (2 bytes)].\n     *\n     * The checksum is computed over the Public Key and the nospam value. The first\n     * byte is an XOR of all the even bytes (0, 2, 4, ...), the second byte is an\n     * XOR of all the odd bytes (1, 3, 5, ...) of the Public Key and nospam.\n     */\n    [CCode (cname=\"TOX_ADDRESS_SIZE\")]\n    public const int ADDRESS_SIZE;\n\n    /**\n     * Maximum length of a nickname in bytes.\n     */\n    [CCode (cname=\"TOX_MAX_NAME_LENGTH\")]\n    public const int MAX_NAME_LENGTH;\n\n    /**\n     * Maximum length of a status message in bytes.\n     */\n    [CCode (cname=\"TOX_MAX_STATUS_MESSAGE_LENGTH\")]\n    public const int MAX_STATUS_MESSAGE_LENGTH;\n\n    /**\n     * Maximum length of a friend request message in bytes.\n     */\n    [CCode (cname=\"TOX_MAX_FRIEND_REQUEST_LENGTH\")]\n    public const int MAX_FRIEND_REQUEST_LENGTH;\n\n    /**\n     * Maximum length of a single message after which it should be split.\n     */\n    [CCode (cname=\"TOX_MAX_MESSAGE_LENGTH\")]\n    public const int MAX_MESSAGE_LENGTH;\n\n    /**\n     * Maximum size of custom packets. TODO: should be LENGTH?\n     */\n    [CCode (cname=\"TOX_MAX_CUSTOM_PACKET_SIZE\")]\n    public const int MAX_CUSTOM_PACKET_SIZE;\n\n    /**\n     * The number of bytes in a hash generated by tox_hash.\n     */\n    [CCode (cname=\"TOX_HASH_LENGTH\")]\n    public const int HASH_LENGTH;\n\n    /**\n     * The number of bytes in a file id.\n     */\n    [CCode (cname=\"TOX_FILE_ID_LENGTH\")]\n    public const int FILE_ID_LENGTH;\n\n    /**\n     * Maximum file name length for file transfers.\n     */\n    [CCode (cname=\"TOX_MAX_FILENAME_LENGTH\")]\n    public const int MAX_FILENAME_LENGTH;\n\n    /**\n     * Represents the possible statuses a client can have.\n     */\n    [CCode (cname=\"TOX_USER_STATUS\", cprefix=\"TOX_USER_STATUS_\", has_type_id=false)]\n    public enum UserStatus {\n        /**\n        * User is online and available.\n        */\n        NONE,\n\n        /**\n        * User is away. Clients can set this e.g. after a user defined\n        * inactivity time.\n        */\n        AWAY,\n\n        /**\n        * User is busy. Signals to other clients that this client does not\n        * currently wish to communicate.\n        */\n        BUSY\n    }\n\n    /**\n     * Represents message types for tox_friend_send_message and group chat\n     * messages.\n     */\n    [CCode (cname=\"TOX_MESSAGE_TYPE\", cprefix=\"TOX_MESSAGE_TYPE_\", has_type_id=false)]\n    public enum MessageType {\n        /**\n        * Normal text message. Similar to PRIVMSG on IRC.\n        */\n        NORMAL,\n\n        /**\n        * A message describing an user action. This is similar to /me (CTCP ACTION)\n        * on IRC.\n        */\n        ACTION\n    }\n\n    /**\n     * Protocols that can be used to connect to the network or friends.\n     */\n    [CCode (cname=\"TOX_CONNECTION\", cprefix=\"TOX_CONNECTION_\", has_type_id=false)]\n    public enum ConnectionStatus {\n        /**\n         * There is no connection. This instance, or the friend the state change is\n         * about, is now offline.\n         */\n        NONE,\n\n        /**\n         * A TCP connection has been established. For the own instance, this means it\n         * is connected through a TCP relay, only. For a friend, this means that the\n         * connection to that particular friend goes through a TCP relay.\n         */\n        TCP,\n\n        /**\n         * A UDP connection has been established. For the own instance, this means it\n         * is able to send UDP packets to DHT nodes, but may still be connected to\n         * a TCP relay. For a friend, this means that the connection to that\n         * particular friend was built using direct UDP packets.\n         */\n        UDP\n    }\n\n    [CCode (cname=\"enum TOX_FILE_KIND\", cprefix=\"TOX_FILE_KIND_\", has_type_id=false)]\n    public enum FileKind {\n        /**\n         * Arbitrary file data. Clients can choose to handle it based on the file name\n         * or magic or any other way they choose.\n         */\n        DATA,\n\n        /**\n         * Avatar file_id. This consists of tox_hash(image).\n         * Avatar data. This consists of the image data.\n         *\n         * Avatars can be sent at any time the client wishes. Generally, a client will\n         * send the avatar to a friend when that friend comes online, and to all\n         * friends when the avatar changed. A client can save some traffic by\n         * remembering which friend received the updated avatar already and only send\n         * it if the friend has an out of date avatar.\n         *\n         * Clients who receive avatar send requests can reject it (by sending\n         * TOX_FILE_CONTROL_CANCEL before any other controls), or accept it (by\n         * sending TOX_FILE_CONTROL_RESUME). The file_id of length TOX_HASH_LENGTH bytes\n         * (same length as TOX_FILE_ID_LENGTH) will contain the hash. A client can compare\n         * this hash with a saved hash and send TOX_FILE_CONTROL_CANCEL to terminate the avatar\n         * transfer if it matches.\n         *\n         * When file_size is set to 0 in the transfer request it means that the client\n         * has no avatar.\n         */\n        AVATAR\n    }\n\n    [CCode (cname=\"TOX_FILE_CONTROL\", cprefix=\"TOX_FILE_CONTROL_\", has_type_id=false)]\n    public enum FileControl {\n        /**\n        * Sent by the receiving side to accept a file send request. Also sent after a\n        * TOX_FILE_CONTROL_PAUSE command to continue sending or receiving.\n        */\n        RESUME,\n\n        /**\n        * Sent by clients to pause the file transfer. The initial state of a file\n        * transfer is always paused on the receiving side and running on the sending\n        * side. If both the sending and receiving side pause the transfer, then both\n        * need to send TOX_FILE_CONTROL_RESUME for the transfer to resume.\n        */\n        PAUSE,\n\n        /**\n        * Sent by the receiving side to reject a file send request before any other\n        * commands are sent. Also sent by either side to terminate a file transfer.\n        */\n        CANCEL,\n    }\n\n    /**\n    * Type of proxy used to connect to TCP relays.\n    */\n    [CCode (cname=\"TOX_PROXY_TYPE\", cprefix=\"TOX_PROXY_TYPE_\", has_type_id=false)]\n    public enum ProxyType {\n        /**\n        * Don't use a proxy.\n        */\n        NONE,\n\n        /**\n        * HTTP proxy using CONNECT.\n        */\n        HTTP,\n\n        /**\n        * SOCKS proxy for simple socket pipes.\n        */\n        SOCKS5\n    }\n\n    /**\n     * Type of savedata to create the Tox instance from.\n     */\n    [CCode (cname=\"TOX_SAVEDATA_TYPE\", cprefix=\"TOX_SAVEDATA_TYPE_\", has_type_id=false)]\n    public enum SaveDataType {\n        /**\n        * No savedata.\n        */\n        NONE,\n\n        /**\n        * Savedata is one that was obtained from tox_get_savedata\n        */\n        TOX_SAVE,\n\n        /**\n        * Savedata is a secret key of length TOX_SECRET_KEY_SIZE\n        */\n        SECRET_KEY\n    }\n    \n    [CCode (cname=\"TOX_CHAT_CHANGE\", cprefix=\"TOX_CHAT_CHANGE_\", has_type_id=false)]\n    public enum ChatChange {\n        PEER_ADD,\n        PEER_DEL,\n        PEER_NAME\n    }\n\n    [CCode (cname=\"TOX_ERR_NEW\", cprefix = \"TOX_ERR_NEW_\")]\n    public enum ERR_NEW {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The function was unable to allocate enough memory to store the internal\n         * structures for the Tox object.\n         */\n        MALLOC,\n\n        /**\n         * The function was unable to bind to a port. This may mean that all ports\n         * have already been bound, e.g. by other Tox instances, or it may mean\n         * a permission error. You may be able to gather more information from errno.\n         */\n        PORT_ALLOC,\n\n        /**\n         * proxy_type was invalid.\n         */\n        PROXY_BAD_TYPE,\n\n        /**\n         * proxy_type was valid but the proxy_host passed had an invalid format\n         * or was NULL.\n         */\n        PROXY_BAD_HOST,\n\n        /**\n         * proxy_type was valid, but the proxy_port was invalid.\n         */\n        PROXY_BAD_PORT,\n\n        /**\n         * The proxy address passed could not be resolved.\n         */\n        PROXY_NOT_FOUND,\n\n        /**\n         * The byte array to be loaded contained an encrypted save.\n         */\n        LOAD_ENCRYPTED,\n\n        /**\n         * The data format was invalid. This can happen when loading data that was\n         * saved by an older version of Tox, or when the data has been corrupted.\n         * When loading from badly formatted data, some data may have been loaded,\n         * and the rest is discarded. Passing an invalid length parameter also\n         * causes this error.\n         */\n        LOAD_BAD_FORMAT,\n    }\n\n    [CCode (cname=\"TOX_ERR_OPTIONS_NEW\", cprefix=\"TOX_ERR_OPTIONS_NEW_\")]\n    public enum ERR_OPTIONS_NEW {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n        /**\n         * The function failed to allocate enough memory for the options struct.\n         */\n        MALLOC,\n    }\n\n    [CCode (cname=\"TOX_ERR_BOOTSTRAP\", cprefix=\"TOX_ERR_BOOTSTRAP_\")]\n    public enum ERR_BOOTSTRAP {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The address could not be resolved to an IP address, or the IP address\n         * passed was invalid.\n         */\n        BAD_HOST,\n\n        /**\n         * The port passed was invalid. The valid port range is (1, 65535).\n         */\n        BAD_PORT\n    }\n\n    /**\n     * Common error codes for all functions that set a piece of user-visible\n     * client information.\n     */\n    [CCode (cname=\"TOX_ERR_SET_INFO\", cprefix=\"TOX_ERR_SET_INFO_\")]\n    public enum ERR_SET_INFO {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * Information length exceeded maximum permissible size.\n         */\n        TOO_LONG\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_ADD\", cprefix=\"TOX_ERR_FRIEND_ADD_\")]\n    public enum ERR_FRIEND_ADD {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The length of the friend request message exceeded\n         * TOX_MAX_FRIEND_REQUEST_LENGTH.\n         */\n        TOO_LONG,\n\n        /**\n         * The friend request message was empty. This, and the TOO_LONG code will\n         * never be returned from tox_friend_add_norequest.\n         */\n        NO_MESSAGE,\n\n        /**\n         * The friend address belongs to the sending client.\n         */\n        OWN_KEY,\n\n        /**\n         * A friend request has already been sent, or the address belongs to a friend\n         * that is already on the friend list.\n         */\n        ALREADY_SENT,\n\n        /**\n         * The friend address checksum failed.\n         */\n        BAD_CHECKSUM,\n\n        /**\n         * The friend was already there, but the nospam value was different.\n         */\n        SET_NEW_NOSPAM,\n\n        /**\n         * A memory allocation failed when trying to increase the friend list size.\n         */\n        MALLOC\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_DELETE\", cprefix=\"TOX_ERR_FRIEND_DELETE_\")]\n    public enum ERR_FRIEND_DELETE {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * There was no friend with the given friend number. No friends were deleted.\n         */\n        FRIEND_NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_BY_PUBLIC_KEY\", cprefix=\"TOX_ERR_FRIEND_BY_PUBLIC_KEY_\")]\n    public enum ERR_FRIEND_BY_PUBLIC_KEY {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * No friend with the given Public Key exists on the friend list.\n         */\n        NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_GET_PUBLIC_KEY\", cprefix=\"TOX_ERR_FRIEND_GET_PUBLIC_KEY_\")]\n    public enum ERR_FRIEND_GET_PUBLIC_KEY {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * No friend with the given number exists on the friend list.\n         */\n        FRIEND_NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_GET_LAST_ONLINE\", cprefix=\"TOX_ERR_FRIEND_GET_LAST_ONLINE_\")]\n    public enum ERR_FRIEND_GET_LAST_ONLINE {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * No friend with the given number exists on the friend list.\n         */\n        FRIEND_NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_QUERY\", cprefix=\"TOX_ERR_FRIEND_QUERY_\")]\n    public enum ERR_FRIEND_QUERY {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The pointer parameter for storing the query result (name, message) was\n         * NULL. Unlike the `_self_` variants of these functions, which have no effect\n         * when a parameter is NULL, these functions return an error in that case.\n         */\n        NULL,\n\n        /**\n         * The friend_number did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n    }\n\n    [CCode (cname=\"TOX_ERR_SET_TYPING\", cprefix=\"TOX_ERR_SET_TYPING_\")]\n    public enum ERR_SET_TYPING {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The friend number did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_SEND_MESSAGE\", cprefix=\"TOX_ERR_FRIEND_SEND_MESSAGE_\")]\n    public enum ERR_FRIEND_SEND_MESSAGE {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The friend number did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * An allocation error occurred while increasing the send queue size.\n         */\n        SENDQ,\n\n        /**\n         * Message length exceeded TOX_MAX_MESSAGE_LENGTH.\n         */\n        TOO_LONG,\n\n        /**\n         * Attempted to send a zero-length message.\n         */\n        EMPTY\n    }\n\n    [CCode (cname=\"TOX_ERR_FILE_CONTROL\", cprefix=\"TOX_ERR_FILE_CONTROL_\")]\n    public enum ERR_FILE_CONTROL {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * No file transfer with the given file number was found for the given friend.\n         */\n        NOT_FOUND,\n\n        /**\n         * A RESUME control was sent, but the file transfer is running normally.\n         */\n        NOT_PAUSED,\n\n        /**\n         * A RESUME control was sent, but the file transfer was paused by the other\n         * party. Only the party that paused the transfer can resume it.\n         */\n        DENIED,\n\n        /**\n         * A PAUSE control was sent, but the file transfer was already paused.\n         */\n        ALREADY_PAUSED,\n\n        /**\n         * Packet queue is full.\n         */\n        SENDQ\n    }\n\n    [CCode (cname=\"TOX_ERR_FILE_SEEK\", cprefix=\"TOX_ERR_FILE_SEEK_\")]\n    public enum ERR_FILE_SEEK {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * No file transfer with the given file number was found for the given friend.\n         */\n        NOT_FOUND,\n\n        /**\n         * File was not in a state where it could be seeked.\n         */\n        DENIED,\n\n        /**\n         * Seek position was invalid\n         */\n        INVALID_POSITION,\n\n        /**\n         * Packet queue is full.\n         */\n        SENDQ\n    }\n\n    [CCode (cname=\"TOX_ERR_FILE_GET\", cprefix=\"TOX_ERR_FILE_GET_\")]\n    public enum ERR_FILE_GET {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * No file transfer with the given file number was found for the given friend.\n         */\n        NOT_FOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FILE_SEND\", cprefix=\"TOX_ERR_FILE_SEND_\")]\n    public enum ERR_FILE_SEND {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * Filename length exceeded TOX_MAX_FILENAME_LENGTH bytes.\n         */\n        NAME_TOO_LONG,\n\n        /**\n         * Too many ongoing transfers. The maximum number of concurrent file transfers\n         * is 256 per friend per direction (sending and receiving).\n         */\n        TOO_MANY\n    }\n\n    [CCode (cname=\"TOX_ERR_FILE_SEND_CHUNK\", cprefix=\"TOX_ERR_FILE_SEND_CHUNK_\")]\n    public enum ERR_FILE_SEND_CHUNK {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The length parameter was non-zero, but data was NULL.\n         */\n        NULL,\n\n        /**\n         * The friend_number passed did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * No file transfer with the given file number was found for the given friend.\n         */\n        NOT_FOUND,\n\n\n        /**\n         * File transfer was found but isn't in a transferring state: (paused, done,\n         * broken, etc...) (happens only when not called from the request chunk callback).\n         */\n        NOT_TRANSFERRING,\n\n        /**\n         * Attempted to send more or less data than requested. The requested data size is\n         * adjusted according to maximum transmission unit and the expected end of\n         * the file. Trying to send less or more than requested will return this error.\n         */\n        INVALID_LENGTH,\n\n        /**\n         * Packet queue is full.\n         */\n        SENDQ,\n\n        /**\n         * Position parameter was wrong.\n         */\n        WRONG_POSITION\n    }\n\n    [CCode (cname=\"TOX_ERR_GET_PORT\", cprefix=\"TOX_ERR_GET_PORT_\")]\n    public enum ERR_GET_PORT {\n        /**\n        * The function returned successfully.\n        */\n        OK,\n\n        /**\n         * The instance was not bound to any port.\n         */\n        NOT_BOUND\n    }\n\n    [CCode (cname=\"TOX_ERR_FRIEND_CUSTOM_PACKET\", cprefix=\"TOX_ERR_FRIEND_CUSTOM_PACKET_\")]\n    public enum ERR_FRIEND_CUSTOM_PACKET {\n        /**\n         * The function returned successfully.\n         */\n        OK,\n\n        /**\n         * One of the arguments to the function was NULL when it was not expected.\n         */\n        NULL,\n\n        /**\n         * The friend number did not designate a valid friend.\n         */\n        FRIEND_NOT_FOUND,\n\n        /**\n         * This client is currently not connected to the friend.\n         */\n        FRIEND_NOT_CONNECTED,\n\n        /**\n         * The first byte of data was not in the specified range for the packet type.\n         * This range is 200-254 for lossy, and 160-191 for lossless packets.\n         */\n        INVALID,\n\n        /**\n         * Attempted to send an empty packet.\n         */\n        EMPTY,\n\n        /**\n         * Packet data length exceeded TOX_MAX_CUSTOM_PACKET_SIZE.\n         */\n        TOO_LONG,\n\n        /**\n         * Packet queue is full.\n         */\n        SENDQ\n    }\n\n    /**\n    * This struct contains all the startup options for Tox. You can either allocate\n    * this object yourself, and pass it to tox_options_default, or call\n    * tox_options_new to get a new default options object.\n    */\n    [CCode (cname=\"struct Tox_Options\", destroy_function=\"\", has_type_id=false)]\n    [Compact]\n    public class Options {\n        /**\n        * The type of socket to create.\n        *\n        * If this is set to false, an IPv4 socket is created, which subsequently\n        * only allows IPv4 communication.\n        * If it is set to true, an IPv6 socket is created, allowing both IPv4 and\n        * IPv6 communication.\n        */\n        public bool ipv6_enabled;\n\n        /**\n        * Enable the use of UDP communication when available.\n        *\n        * Setting this to false will force Tox to use TCP only. Communications will\n        * need to be relayed through a TCP relay node, potentially slowing them down.\n        * Disabling UDP support is necessary when using anonymous proxies or Tor.\n        */\n        public bool udp_enabled;\n\n        /**\n        * Pass communications through a proxy.\n        */\n        public ProxyType proxy_type;\n\n        /**\n        * The IP address or DNS name of the proxy to be used.\n        *\n        * If used, this must be non-NULL and be a valid DNS name. The name must not\n        * exceed 255 characters, and be in a NUL-terminated C string format\n        * (255 chars + 1 NUL byte).\n        *\n        * This member is ignored (it can be NULL) if proxy_type is TOX_PROXY_TYPE_NONE.\n        */\n        public string? proxy_host;\n\n        /**\n        * The port to use to connect to the proxy server.\n        *\n        * Ports must be in the range (1, 65535). The value is ignored if\n        * proxy_type is TOX_PROXY_TYPE_NONE.\n        */\n        public uint16 proxy_port;\n\n        /**\n        * The start port of the inclusive port range to attempt to use.\n        *\n        * If both start_port and end_port are 0, the default port range will be\n        * used: [33445, 33545].\n        *\n        * If either start_port or end_port is 0 while the other is non-zero, the\n        * non-zero port will be the only port in the range.\n        *\n        * Having start_port > end_port will yield the same behavior as if start_port\n        * and end_port were swapped.\n        */\n        public uint16 start_port;\n\n        /**\n        * The end port of the inclusive port range to attempt to use.\n        */\n        public uint16 end_port;\n\n        /**\n        * The port to use for the TCP server (relay). If 0, the TCP server is\n        * disabled.\n        *\n        * Enabling it is not required for Tox to function properly.\n        *\n        * When enabled, your Tox instance can act as a TCP relay for other Tox\n        * instance. This leads to increased traffic, thus when writing a client\n        * it is recommended to enable TCP server only if the user has an option\n        * to disable it.\n        */\n        public uint16 tcp_port;\n\n        /**\n        * The type of savedata to load from.\n        */\n        public SaveDataType savedata_type;\n\n        /**\n        * The savedata.\n        */\n        [CCode (array_length_cname=\"savedata_length\", array_length_type=\"size_t\")]\n        public uint8[] savedata_data;\n\n        /**\n         * Allocates a new Tox_Options object and initialises it with the default\n         * options. This function can be used to preserve long term ABI compatibility by\n         * giving the responsibility of allocation and deallocation to the Tox library.\n         *\n         * Objects returned from this function must be freed using the tox_options_free\n         * function.\n         *\n         * @return A new Tox_Options object with default options or NULL on failure.\n         */\n        public Options (out ERR_OPTIONS_NEW err);\n\n        /**\n         * Initialises a Tox_Options object with the default options.\n         *\n         * The result of this function is independent of the original options. All\n         * values will be overwritten, no values will be read (so it is permissible\n         * to pass an uninitialised object).\n         *\n         * If options is NULL, this function has no effect.\n         *\n         * @param options An options object to be filled with default options.\n         */\n        public void default ();\n    }\n\n    /**\n     * The Tox instance type. All the state associated with a connection is held\n     * within the instance. Multiple instances can exist and operate concurrently.\n     * The maximum number of Tox instances that can exist on a single network\n     * device is limited. Note that this is not just a per-process limit, since the\n     * limiting factor is the number of usable ports on a device.\n     */\n    [CCode (cname=\"Tox\", free_function=\"tox_kill\", cprefix=\"tox_\", has_type_id=false)]\n    [Compact]\n    public class Tox {\n        /**\n         * Creates and initialises a new Tox instance with the options passed.\n         *\n         * This function will bring the instance into a valid state. Running the event\n         * loop with a new instance will operate correctly.\n         *\n         * If loading failed or succeeded only partially, the new or partially loaded\n         * instance is returned and an error code is set.\n         *\n         * @param options An options object as described above. If this parameter is\n         *   NULL, the default options are used.\n         *\n         * @see iterate\n         *\n         * @return A new Tox instance pointer on success or NULL on failure.\n         */\n        public Tox (Options? options = null, out ERR_NEW? error = null);\n\n        /**\n         * Releases all resources associated with the Tox instance and disconnects from\n         * the network.\n         *\n         * After calling this function, the Tox pointer becomes invalid. No other\n         * functions can be called, and the pointer value can no longer be read.\n         */\n        public void kill ();\n\n        /**\n         * @param friend_number The friend number of the friend whose name changed.\n         * @param name A byte array containing the same data as\n         *   tox_friend_get_name would write to its `name` parameter.\n         * @param length A value equal to the return value of\n         *   tox_friend_get_name_size.\n         */\n        [CCode (cname=\"tox_friend_name_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendNameFunc (Tox self, uint32 friend_number, uint8[] name);\n\n        /**\n         * Set the callback for the `friend_name` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend changes their name.\n         */\n        public void callback_friend_name (FriendNameFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend whose status message\n         *   changed.\n         * @param message A byte array containing the same data as\n         *   tox_friend_get_status_message would write to its `status_message` parameter.\n         * @param length A value equal to the return value of\n         *   tox_friend_get_status_message_size.\n         */\n        [CCode (cname=\"tox_friend_status_message_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendStatusMessageFunc (Tox self, uint32 friend_number, uint8[] message);\n\n        /**\n         * Set the callback for the `friend_status_message` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend changes their status message.\n         */\n        public void callback_friend_status_message (FriendStatusMessageFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend whose user status\n         *   changed.\n         * @param status The new user status.\n         */\n        [CCode (cname=\"tox_friend_status_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendStatusFunc (Tox self, uint32 friend_number, UserStatus status);\n\n        /**\n         * Set the callback for the `friend_status` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend changes their user status.\n         */\n        public void callback_friend_status (FriendStatusFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend whose connection status\n         *   changed.\n         * @param connection_status The result of calling\n         *   tox_friend_get_connection_status on the passed friend_number.\n         */\n        [CCode (cname=\"tox_friend_connection_status_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendConnectionStatusFunc (Tox self, uint32 friend_number, ConnectionStatus connection_status);\n\n        /**\n         * Set the callback for the `friend_connection_status` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend goes offline after having been online,\n         * or when a friend goes online.\n         *\n         * This callback is not called when adding friends. It is assumed that when\n         * adding friends, their connection status is initially offline.\n         */\n        public void callback_friend_connection_status (FriendConnectionStatusFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend who started or stopped\n         *   typing.\n         * @param is_typing The result of calling tox_friend_get_typing on the passed\n         *   friend_number.\n         */\n        [CCode (cname = \"tox_friend_typing_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendTypingFunc (Tox self, uint32 friend_number, bool is_typing);\n\n        /**\n         * Set the callback for the `friend_typing` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend starts or stops typing.\n         */\n        public void callback_friend_typing (FriendTypingFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend who received the message.\n         * @param message_id The message ID as returned from tox_friend_send_message\n         *   corresponding to the message sent.\n         */\n        [CCode (cname = \"tox_friend_read_receipt_cb\", has_target=true, has_type_id=false)]\n        public delegate void ReadReceiptFunc(Tox self, uint32 friend_number, uint32 message_id);\n\n        /**\n         * Set the callback for the `friend_read_receipt` event. Pass NULL to unset.\n         *\n         * This event is triggered when the friend receives the message sent with\n         * tox_friend_send_message with the corresponding message ID.\n         */\n        public void callback_friend_read_receipt (ReadReceiptFunc callback);\n\n        /**\n         * @param public_key The Public Key of the user who sent the friend request.\n         * @param message The message they sent along with the request.\n         * @param length The size of the message byte array.\n         */\n        [CCode (cname=\"tox_friend_request_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendRequestFunc (Tox self, [CCode (array_length=false)] uint8[] public_key, [CCode (array_length_type=\"size_t\")] uint8[] message);\n\n        /**\n         * Set the callback for the `friend_request` event. Pass NULL to unset.\n         *\n         * This event is triggered when a friend request is received.\n         */\n        public void callback_friend_request (FriendRequestFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend who sent the message.\n         * @param message The message data they sent.\n         * @param length The size of the message byte array.\n         */\n        [CCode (cname=\"tox_friend_message_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendMessageFunc (Tox self, uint32 friend_number, MessageType type, [CCode (array_length_type=\"size_t\")] uint8[] message);\n\n        /**\n         * Set the callback for the `friend_message` event. Pass NULL to unset.\n         *\n         * This event is triggered when a message from a friend is received.\n         */\n        public void callback_friend_message (FriendMessageFunc callback);\n\n        /**\n         * When receiving TOX_FILE_CONTROL_CANCEL, the client should release the\n         * resources associated with the file number and consider the transfer failed.\n         *\n         * @param friend_number The friend number of the friend who is sending the file.\n         * @param file_number The friend-specific file number the data received is\n         *   associated with.\n         * @param control The file control command received.\n         */\n        [CCode (cname = \"tox_file_recv_control_cb\", has_target=true, has_type_id=false)]\n        public delegate void FileControlReceiveFunc (Tox self, uint32 friend_number, uint32 file_number, FileControl control);\n\n        /**\n         * Set the callback for the `file_recv_control` event. Pass NULL to unset.\n         *\n         * This event is triggered when a file control command is received from a\n         * friend.\n         */\n        public void callback_file_recv_control (FileControlReceiveFunc callback);\n\n        /**\n         * If the length parameter is 0, the file transfer is finished, and the client's\n         * resources associated with the file number should be released. After a call\n         * with zero length, the file number can be reused for future file transfers.\n         *\n         * If the requested position is not equal to the client's idea of the current\n         * file or stream position, it will need to seek. In case of read-once streams,\n         * the client should keep the last read chunk so that a seek back can be\n         * supported. A seek-back only ever needs to read from the last requested chunk.\n         * This happens when a chunk was requested, but the send failed. A seek-back\n         * request can occur an arbitrary number of times for any given chunk.\n         *\n         * In response to receiving this callback, the client should call the function\n         * `tox_file_send_chunk` with the requested chunk. If the number of bytes sent\n         * through that function is zero, the file transfer is assumed complete. A\n         * client must send the full length of data requested with this callback.\n         *\n         * @param friend_number The friend number of the receiving friend for this file.\n         * @param file_number The file transfer identifier returned by tox_file_send.\n         * @param position The file or stream position from which to continue reading.\n         * @param length The number of bytes requested for the current chunk.\n         */\n        [CCode (cname = \"tox_file_chunk_request_cb\", has_target=true, has_type_id=false)]\n        public delegate void FileChunkRequestFunc (Tox self, uint32 friend_number, uint32 file_number, uint64 position, size_t length);\n\n        /**\n         * Set the callback for the `file_chunk_request` event. Pass NULL to unset.\n         *\n         * This event is triggered when Core is ready to send more file data.\n         */\n        public void callback_file_chunk_request (FileChunkRequestFunc callback);\n\n        /**\n         * The client should acquire resources to be associated with the file transfer.\n         * Incoming file transfers start in the PAUSED state. After this callback\n         * returns, a transfer can be rejected by sending a TOX_FILE_CONTROL_CANCEL\n         * control command before any other control commands. It can be accepted by\n         * sending TOX_FILE_CONTROL_RESUME.\n         *\n         * @param friend_number The friend number of the friend who is sending the file\n         *   transfer request.\n         * @param file_number The friend-specific file number the data received is\n         *   associated with.\n         * @param kind The meaning of the file to be sent.\n         * @param file_size Size in bytes of the file the client wants to send,\n         *   UINT64_MAX if unknown or streaming.\n         * @param filename Name of the file. Does not need to be the actual name. This\n         *   name will be sent along with the file send request.\n         * @param filename_length Size in bytes of the filename.\n         */\n        [CCode (cname = \"tox_file_recv_cb\", has_target=true, has_type_id=false)]\n        public delegate void FileRecvFunc (Tox self, uint32 friend_number, uint32 file_number, FileKind kind, uint64 file_size, [CCode (array_length_type=\"size_t\")] uint8[] filename);\n\n        /**\n         * Set the callback for the `file_recv` event. Pass NULL to unset.\n         *\n         * This event is triggered when a file transfer request is received.\n         */\n        public void callback_file_recv (FileRecvFunc callback);\n\n        /**\n         * When length is 0, the transfer is finished and the client should release the\n         * resources it acquired for the transfer. After a call with length = 0, the\n         * file number can be reused for new file transfers.\n         *\n         * If position is equal to file_size (received in the file_receive callback)\n         * when the transfer finishes, the file was received completely. Otherwise, if\n         * file_size was UINT64_MAX, streaming ended successfully when length is 0.\n         *\n         * @param friend_number The friend number of the friend who is sending the file.\n         * @param file_number The friend-specific file number the data received is\n         *   associated with.\n         * @param position The file position of the first byte in data.\n         * @param data A byte array containing the received chunk.\n         * @param length The length of the received chunk.\n         */\n        [CCode (cname = \"tox_file_recv_chunk_cb\", has_target=true, has_type_id=false)]\n        public delegate void FileRecvChunkFunc (Tox self, uint32 friend_number, uint32 file_number, uint64 position, uint8[] data);\n\n        /**\n         * Set the callback for the `file_recv_chunk` event. Pass NULL to unset.\n         *\n         * This event is first triggered when a file transfer request is received, and\n         * subsequently when a chunk of file data for an accepted request was received.\n         */\n        public void callback_file_recv_chunk (FileRecvChunkFunc callback);\n\n        /**\n         * @param connection_status Whether we are connected to the DHT.\n         */\n        [CCode (cname=\"tox_self_connection_status_cb\", has_target=true, has_type_id=false)]\n        public delegate void ConnectionStatusFunc (Tox self, ConnectionStatus connection_status);\n\n        /**\n         * Set the callback for the `self_connection_status` event. Pass NULL to unset.\n         *\n         * This event is triggered whenever there is a change in the DHT connection\n         * state. When disconnected, a client may choose to call tox_bootstrap again, to\n         * reconnect to the DHT. Note that this state may frequently change for short\n         * amounts of time. Clients should therefore not immediately bootstrap on\n         * receiving a disconnect.\n         *\n         * TODO: how long should a client wait before bootstrapping again?\n         */\n        public void callback_self_connection_status (ConnectionStatusFunc callback);\n\n        /**\n         * Return whether we are connected to the DHT. The return value is equal to the\n         * last value received through the `self_connection_status` callback.\n         */\n        public ConnectionStatus self_get_connection_status ();\n\n        /**\n         * Writes the Tox friend address of the client to a byte array. The address is\n         * not in human-readable format. If a client wants to display the address,\n         * formatting is required.\n         *\n         * @param address A memory region of at least TOX_ADDRESS_SIZE bytes. If this\n         *   parameter is NULL, this function has no effect.\n         * @see ADDRESS_SIZE\n         */\n        public void self_get_address ([CCode (array_length=false)] uint8[] address);\n\n        /**\n         * Copy the Tox Public Key (long term) from the Tox object.\n         *\n         * @param public_key A memory region of at least TOX_PUBLIC_KEY_SIZE bytes. If\n         *   this parameter is NULL, this function has no effect.\n         */\n        public void self_get_public_key ([CCode (array_length=false)] uint8[] public_key);\n\n        /**\n         * Copy the Tox Secret Key from the Tox object.\n         *\n         * @param secret_key A memory region of at least TOX_SECRET_KEY_SIZE bytes. If\n         *   this parameter is NULL, this function has no effect.\n         */\n        public void self_get_secret_key ([CCode (array_length=false)] uint8[] secret_key);\n\n        /**\n         * Set the nickname for the Tox client.\n         *\n         * Nickname length cannot exceed TOX_MAX_NAME_LENGTH. If length is 0, the name\n         * parameter is ignored (it can be NULL), and the nickname is set back to empty.\n         *\n         * @param name A byte array containing the new nickname.\n         * @param length The size of the name byte array.\n         *\n         * @return true on success.\n         */\n        public bool self_set_name (uint8[] name, out ERR_SET_INFO error);\n\n        /**\n         * Return the length of the current nickname as passed to tox_self_set_name.\n         *\n         * If no nickname was set before calling this function, the name is empty,\n         * and this function returns 0.\n         *\n         * see threading for concurrency implications.\n         */\n        public size_t self_get_name_size ();\n\n        /**\n         * Write the nickname set by tox_self_set_name to a byte array.\n         *\n         * If no nickname was set before calling this function, the name is empty,\n         * and this function has no effect.\n         *\n         * Call tox_self_get_name_size to find out how much memory to allocate for\n         * the result.\n         *\n         * @param name A valid memory location large enough to hold the nickname.\n         *   If this parameter is NULL, the function has no effect.\n         */\n        public void self_get_name ([CCode (array_length = false)] uint8[] name);\n\n        /**\n         * Set the client's typing status for a friend.\n         *\n         * The client is responsible for turning it on or off.\n         *\n         * @param friend_number The friend to which the client is typing a message.\n         * @param typing The typing status. True means the client is typing.\n         *\n         * @return true on success.\n         */\n        public bool self_set_typing (uint32 friend_number, bool typing, out ERR_FRIEND_DELETE error);\n\n        /**\n         * Return the number of friends on the friend list.\n         *\n         * This function can be used to determine how much memory to allocate for\n         * tox_self_get_friend_list.\n         */\n        public size_t self_get_friend_list_size ();\n\n        /**\n         * Copy a list of valid friend numbers into an array.\n         *\n         * Call tox_self_get_friend_list_size to determine the number of elements to allocate.\n         *\n         * @param list A memory region with enough space to hold the friend list. If\n         *   this parameter is NULL, this function has no effect.\n         */\n        public void self_get_friend_list ([CCode (array_length = false)] uint32[] list);\n\n        public UserStatus status {\n            [CCode (cname=\"tox_self_get_status\")] get;\n            [CCode (cname=\"tox_self_set_status\")] set;\n        }\n\n        /**\n         * Set the client's status message.\n         *\n         * Status message length cannot exceed TOX_MAX_STATUS_MESSAGE_LENGTH. If\n         * length is 0, the status parameter is ignored (it can be NULL), and the\n         * user status is set back to empty.\n         */\n        public bool self_set_status_message (uint8[] status_message, out ERR_SET_INFO error);\n\n        /**\n         * Return the length of the current status message as passed to tox_self_set_status_message.\n         *\n         * If no status message was set before calling this function, the status\n         * is empty, and this function returns 0.\n         *\n         * see threading for concurrency implications.\n         */\n        public size_t self_get_status_message_size ();\n\n        /**\n         * Write the status message set by tox_self_set_status_message to a byte array.\n         *\n         * If no status message was set before calling this function, the status is\n         * empty, and this function has no effect.\n         *\n         * Call tox_self_get_status_message_size to find out how much memory to allocate for\n         * the result.\n         *\n         * @param status A valid memory location large enough to hold the status message.\n         *   If this parameter is NULL, the function has no effect.\n         */\n        public void self_get_status_message ([CCode (array_length=false)] uint8[] status);\n\n        public uint32 nospam {\n            [CCode (cname=\"tox_self_get_nospam\")] get;\n            [CCode (cname=\"tox_self_set_nospam\")] set;\n        }\n\n        /**\n         * Writes the temporary DHT public key of this instance to a byte array.\n         *\n         * This can be used in combination with an externally accessible IP address and\n         * the bound port (from tox_self_get_udp_port) to run a temporary bootstrap node.\n         *\n         * Be aware that every time a new instance is created, the DHT public key\n         * changes, meaning this cannot be used to run a permanent bootstrap node.\n         *\n         * @param dht_id A memory region of at least TOX_PUBLIC_KEY_SIZE bytes. If this\n         *   parameter is NULL, this function has no effect.\n         */\n        public void self_get_dht_id ([CCode (array_length=false)] uint8[] dht_id);\n\n        /**\n         * Return the UDP port this Tox instance is bound to.\n         */\n        public uint16 self_get_udp_port (out ERR_GET_PORT error);\n\n        /**\n         * Return the TCP port this Tox instance is bound to. This is only relevant if\n         * the instance is acting as a TCP relay.\n         */\n        public uint16 self_get_tcp_port (out ERR_GET_PORT error);\n\n        /**\n         * Add a friend to the friend list and send a friend request.\n         *\n         * A friend request message must be at least 1 byte long and at most\n         * TOX_MAX_FRIEND_REQUEST_LENGTH.\n         *\n         * Friend numbers are unique identifiers used in all functions that operate on\n         * friends. Once added, a friend number is stable for the lifetime of the Tox\n         * object. After saving the state and reloading it, the friend numbers may not\n         * be the same as before. Deleting a friend creates a gap in the friend number\n         * set, which is filled by the next adding of a friend. Any pattern in friend\n         * numbers should not be relied on.\n         *\n         * If more than INT32_MAX friends are added, this function causes undefined\n         * behaviour.\n         *\n         * @param address The address of the friend (returned by tox_self_get_address of\n         *   the friend you wish to add) it must be TOX_ADDRESS_SIZE bytes.\n         * @param message The message that will be sent along with the friend request.\n         * @param length The length of the data byte array.\n         *\n         * @return the friend number on success, UINT32_MAX on failure.\n         */\n        public uint32 friend_add ([CCode (array_length=false)] uint8[] address, uint8[] message, out ERR_FRIEND_ADD error);\n\n        /**\n         * Add a friend without sending a friend request.\n         *\n         * This function is used to add a friend in response to a friend request. If the\n         * client receives a friend request, it can be reasonably sure that the other\n         * client added this client as a friend, eliminating the need for a friend\n         * request.\n         *\n         * This function is also useful in a situation where both instances are\n         * controlled by the same entity, so that this entity can perform the mutual\n         * friend adding. In this case, there is no need for a friend request, either.\n         *\n         * @param public_key A byte array of length TOX_PUBLIC_KEY_SIZE containing the\n         *   Public Key (not the Address) of the friend to add.\n         *\n         * @return the friend number on success, UINT32_MAX on failure.\n         * see {@link friend_add} for a more detailed description of friend numbers.\n         */\n        public uint32 friend_add_norequest ([CCode (array_length=false)] uint8[] public_key, out ERR_FRIEND_ADD error);\n\n        /**\n         * Remove a friend from the friend list.\n         *\n         * This does not notify the friend of their deletion. After calling this\n         * function, this client will appear offline to the friend and no communication\n         * can occur between the two.\n         *\n         * @param friend_number Friend number for the friend to be deleted.\n         *\n         * @return true on success.\n         */\n        public bool friend_delete (uint32 friend_number, out ERR_FRIEND_DELETE error);\n\n        /**\n         * Return the friend number associated with that Public Key.\n         *\n         * @return the friend number on success, UINT32_MAX on failure.\n         * @param public_key A byte array containing the Public Key.\n         */\n        public uint32 friend_by_public_key ([CCode (array_length=false)] uint8[] public_key, out ERR_FRIEND_BY_PUBLIC_KEY error);\n\n        /**\n         * Checks if a friend with the given friend number exists and returns true if\n         * it does.\n         */\n        public bool friend_exists (uint32 friend_number);\n\n        /**\n         * Copies the Public Key associated with a given friend number to a byte array.\n         *\n         * @param friend_number The friend number you want the Public Key of.\n         * @param public_key A memory region of at least TOX_PUBLIC_KEY_SIZE bytes. If\n         *   this parameter is NULL, this function has no effect.\n         *\n         * @return true on success.\n         */\n        public bool friend_get_public_key (uint32 friend_number, [CCode (array_length=false)] uint8[] public_key, out ERR_FRIEND_GET_PUBLIC_KEY error);\n\n        /**\n         * Return a unix-time timestamp of the last time the friend associated with a given\n         * friend number was seen online. This function will return UINT64_MAX on error.\n         *\n         * @param friend_number The friend number you want to query.\n         */\n        public uint64 friend_get_last_online (uint32 friend_number, out ERR_FRIEND_GET_LAST_ONLINE error);\n\n        /**\n         * Return the length of the friend's name. If the friend number is invalid, the\n         * return value is unspecified.\n         *\n         * The return value is equal to the `length` argument received by the last\n         * `friend_name` callback.\n         */\n        public size_t friend_get_name_size (uint32 friend_number, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Write the name of the friend designated by the given friend number to a byte\n         * array.\n         *\n         * Call tox_friend_get_name_size to determine the allocation size for the `name`\n         * parameter.\n         *\n         * The data written to `name` is equal to the data received by the last\n         * `friend_name` callback.\n         *\n         * @param name A valid memory region large enough to store the friend's name.\n         *\n         * @return true on success.\n         */\n        public bool friend_get_name (uint32 friend_number, [CCode (array_length=false)] uint8[] name, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Return the length of the friend's status message. If the friend number is\n         * invalid, the return value is SIZE_MAX.\n         */\n        public size_t friend_get_status_message_size (uint32 friend_number, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Write the status message of the friend designated by the given friend number to a byte\n         * array.\n         *\n         * Call tox_friend_get_status_message_size to determine the allocation size for the `status_name`\n         * parameter.\n         *\n         * The data written to `status_message` is equal to the data received by the last\n         * `friend_status_message` callback.\n         *\n         * @param status_message A valid memory region large enough to store the friend's status message.\n         */\n        public bool friend_get_status_message (uint32 friend_number, [CCode (array_length=false)] uint8[] status_message, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Return the friend's user status (away/busy/...). If the friend number is\n         * invalid, the return value is unspecified.\n         *\n         * The status returned is equal to the last status received through the\n         * `friend_status` callback.\n         */\n        public UserStatus friend_get_status (uint32 friend_number, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Check whether a friend is currently connected to this client.\n         *\n         * The result of this function is equal to the last value received by the\n         * `friend_connection_status` callback.\n         *\n         * @param friend_number The friend number for which to query the connection\n         *   status.\n         *\n         * @return the friend's connection status as it was received through the\n         *   `friend_connection_status` event.\n         */\n        public ConnectionStatus friend_get_connection_status (uint32 friend_number, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Check whether a friend is currently typing a message.\n         *\n         * @param friend_number The friend number for which to query the typing status.\n         *\n         * @return true if the friend is typing.\n         * @return false if the friend is not typing, or the friend number was\n         *   invalid. Inspect the error code to determine which case it is.\n         */\n        public bool friend_get_typing (uint32 friend_number, out ERR_FRIEND_QUERY error);\n\n        /**\n         * Send a text chat message to an online friend.\n         *\n         * This function creates a chat message packet and pushes it into the send\n         * queue.\n         *\n         * The message length may not exceed TOX_MAX_MESSAGE_LENGTH. Larger messages\n         * must be split by the client and sent as separate messages. Other clients can\n         * then reassemble the fragments. Messages may not be empty.\n         *\n         * The return value of this function is the message ID. If a read receipt is\n         * received, the triggered `friend_read_receipt` event will be passed this message ID.\n         *\n         * Message IDs are unique per friend. The first message ID is 0. Message IDs are\n         * incremented by 1 each time a message is sent. If UINT32_MAX messages were\n         * sent, the next message ID is 0.\n         *\n         * @param type Message type (normal, action, ...).\n         * @param friend_number The friend number of the friend to send the message to.\n         * @param message A non-NULL pointer to the first element of a byte array\n         *   containing the message text.\n         * @param length Length of the message to be sent.\n         */\n        public uint32 friend_send_message (uint32 friend_number, MessageType type, uint8[] message, out ERR_FRIEND_SEND_MESSAGE error);\n\n        /**\n         * Generates a cryptographic hash of the given data.\n         *\n         * This function may be used by clients for any purpose, but is provided\n         * primarily for validating cached avatars. This use is highly recommended to\n         * avoid unnecessary avatar updates.\n         *\n         * If hash is NULL or data is NULL while length is not 0 the function returns false,\n         * otherwise it returns true.\n         *\n         * This function is a wrapper to internal message-digest functions.\n         *\n         * @param hash A valid memory location the hash data. It must be at least\n         *   TOX_HASH_LENGTH bytes in size.\n         * @param data Data to be hashed or NULL.\n         * @param length Size of the data array or 0.\n         *\n         * @return true if hash was not NULL.\n         */\n        public static bool hash ([CCode (array_length=false)] uint8[] hash, uint8[] data);\n\n        /**\n         * Sends a file control command to a friend for a given file transfer.\n         *\n         * @param friend_number The friend number of the friend the file is being\n         *   transferred to or received from.\n         * @param file_number The friend-specific identifier for the file transfer.\n         * @param control The control command to send.\n         *\n         * @return true on success.\n         */\n        public bool file_control (uint32 friend_number, uint32 file_number, FileControl control, out ERR_FILE_CONTROL error);\n\n        /**\n         * Sends a file seek control command to a friend for a given file transfer.\n         *\n         * This function can only be called to resume a file transfer right before\n         * TOX_FILE_CONTROL_RESUME is sent.\n         *\n         * @param friend_number The friend number of the friend the file is being\n         *   received from.\n         * @param file_number The friend-specific identifier for the file transfer.\n         * @param position The position that the file should be seeked to.\n         */\n        public bool file_seek (uint32 friend_number, uint32 file_number, int64 position, out ERR_FILE_SEEK error);\n\n        /**\n         * Copy the file id associated to the file transfer to a byte array.\n         *\n         * @param friend_number The friend number of the friend the file is being\n         *   transferred to or received from.\n         * @param file_number The friend-specific identifier for the file transfer.\n         * @param file_id A memory region of at least TOX_FILE_ID_LENGTH bytes. If\n         *   this parameter is NULL, this function has no effect.\n         *\n         * @return true on success.\n         */\n        public bool file_get_file_id (uint32 friend_number, uint32 file_number, [CCode (array_length=false)] uint8[] file_id, out ERR_FILE_GET error);\n\n        /**\n         * Send a file transmission request.\n         *\n         * Maximum filename length is TOX_MAX_FILENAME_LENGTH bytes. The filename\n         * should generally just be a file name, not a path with directory names.\n         *\n         * If a non-UINT64_MAX file size is provided, it can be used by both sides to\n         * determine the sending progress. File size can be set to UINT64_MAX for streaming\n         * data of unknown size.\n         *\n         * File transmission occurs in chunks, which are requested through the\n         * `file_chunk_request` event.\n         *\n         * When a friend goes offline, all file transfers associated with the friend are\n         * purged from core.\n         *\n         * If the file contents change during a transfer, the behaviour is unspecified\n         * in general. What will actually happen depends on the mode in which the file\n         * was modified and how the client determines the file size.\n         *\n         *  A. If the file size was increased\n         *    a. and sending mode was streaming (file_size = UINT64_MAX), the behaviour\n         *       will be as expected.\n         *    a. and sending mode was file (file_size != UINT64_MAX), the\n         *       file_chunk_request callback will receive length = 0 when Core thinks\n         *       the file transfer has finished. If the client remembers the file size as\n         *       it was when sending the request, it will terminate the transfer normally.\n         *       If the client re-reads the size, it will think the friend cancelled the\n         *       transfer.\n         *  A. If the file size was decreased\n         *    a. and sending mode was streaming, the behaviour is as expected.\n         *    a. and sending mode was file, the callback will return 0 at the new\n         *       (earlier) end-of-file, signalling to the friend that the transfer was\n         *       cancelled.\n         *  A. If the file contents were modified\n         *    a. at a position before the current read, the two files (local and remote)\n         *       will differ after the transfer terminates.\n         *    a. at a position after the current read, the file transfer will succeed as\n         *       expected.\n         *    a. In either case, both sides will regard the transfer as complete and\n         *       successful.\n         *\n         * @param friend_number The friend number of the friend the file send request\n         *   should be sent to.\n         * @param kind The meaning of the file to be sent.\n         * @param file_size Size in bytes of the file the client wants to send, UINT64_MAX if\n         *   unknown or streaming.\n         * @param file_id A file identifier of length TOX_FILE_ID_LENGTH that can be used to\n         *   uniquely identify file transfers across core restarts. If NULL, a random one will\n         *   be generated by core. It can then be obtained by using tox_file_get_file_id().\n         * @param filename Name of the file. Does not need to be the actual name. This\n         *   name will be sent along with the file send request.\n         * @param filename_length Size in bytes of the filename.\n         *\n         * @return A file number used as an identifier in subsequent callbacks. This\n         *   number is per friend. File numbers are reused after a transfer terminates.\n         *   On failure, this function returns UINT32_MAX. Any pattern in file numbers\n         *   should not be relied on.\n         */\n        public uint32 file_send (uint32 friend_number, FileKind kind, uint64 file_size, [CCode (array_length=false)] uint8[]? file_id, uint8[]? filename, out ERR_FILE_SEND error);\n\n        /**\n         * Send a chunk of file data to a friend.\n         *\n         * This function is called in response to the `file_chunk_request` callback. The\n         * length parameter should be equal to the one received though the callback.\n         * If it is zero, the transfer is assumed complete. For files with known size,\n         * Core will know that the transfer is complete after the last byte has been\n         * received, so it is not necessary (though not harmful) to send a zero-length\n         * chunk to terminate. For streams, core will know that the transfer is finished\n         * if a chunk with length less than the length requested in the callback is sent.\n         *\n         * @param friend_number The friend number of the receiving friend for this file.\n         * @param file_number The file transfer identifier returned by tox_file_send.\n         * @param position The file or stream position from which to continue reading.\n         * @return true on success.\n         */\n        public bool file_send_chunk (uint32 friend_number, uint32 file_number, uint64 position, uint8[] data, out ERR_FILE_SEND_CHUNK error);\n\n        /**\n         * Calculates the number of bytes required to store the tox instance with\n         * tox_get_savedata. This function cannot fail. The result is always greater than 0.\n         *\n         * see threading for concurrency implications.\n         */\n        public uint32 get_savedata_size();\n\n        /**\n         * Store all information associated with the tox instance to a byte array.\n         *\n         * @param data A memory region large enough to store the tox instance data.\n         *   Call tox_get_savedata_size to find the number of bytes required. If this parameter\n         *   is NULL, this function has no effect.\n         */\n        public void get_savedata([CCode(array_length=false)] uint8[] data);\n\n        /**\n         * Sends a \"get nodes\" request to the given bootstrap node with IP, port, and\n         * public key to setup connections.\n         *\n         * This function will attempt to connect to the node using UDP. You must use\n         * this function even if Tox_Options.udp_enabled was set to false.\n         *\n         * @param address The hostname or IP address (IPv4 or IPv6) of the node.\n         * @param port The port on the host on which the bootstrap Tox instance is\n         *   listening.\n         * @param public_key The long term public key of the bootstrap node\n         *   (TOX_PUBLIC_KEY_SIZE bytes).\n         * @return true on success.\n         */\n        public bool bootstrap (string address, uint16 port, [CCode (array_length=false)] uint8[] public_key, out ERR_BOOTSTRAP error);\n\n        /**\n         * Adds additional host:port pair as TCP relay.\n         *\n         * This function can be used to initiate TCP connections to different ports on\n         * the same bootstrap node, or to add TCP relays without using them as\n         * bootstrap nodes.\n         *\n         * @param address The hostname or IP address (IPv4 or IPv6) of the TCP relay.\n         * @param port The port on the host on which the TCP relay is listening.\n         * @param public_key The long term public key of the TCP relay\n         *   (TOX_PUBLIC_KEY_SIZE bytes).\n         * @return true on success.\n         */\n        public bool add_tcp_relay (string address, uint16 port, [CCode (array_length=false)] uint8[] public_key, out ERR_BOOTSTRAP error);\n\n        /**\n         * Return the time in milliseconds before tox_iterate() should be called again\n         * for optimal performance.\n         */\n        public uint32 iteration_interval ();\n\n        /**\n         * The main loop that needs to be run in intervals of tox_iteration_interval()\n         * milliseconds.\n         */\n        public void iterate ();\n\n        /**\n         * Send a custom lossy packet to a friend.\n         *\n         * The first byte of data must be in the range 200-254. Maximum length of a\n         * custom packet is TOX_MAX_CUSTOM_PACKET_SIZE.\n         *\n         * Lossy packets behave like UDP packets, meaning they might never reach the\n         * other side or might arrive more than once (if someone is messing with the\n         * connection) or might arrive in the wrong order.\n         *\n         * Unless latency is an issue, it is recommended that you use lossless custom\n         * packets instead.\n         *\n         * @param friend_number The friend number of the friend this lossy packet\n         *   should be sent to.\n         * @param data A byte array containing the packet data.\n         * @param length The length of the packet data byte array.\n         *\n         * @return true on success.\n         */\n        public bool friend_send_lossy_packet (uint32 friend_number, uint8[] data, out ERR_FRIEND_CUSTOM_PACKET? error);\n\n        /**\n         * Send a custom lossless packet to a friend.\n         *\n         * The first byte of data must be in the range 160-191. Maximum length of a\n         * custom packet is TOX_MAX_CUSTOM_PACKET_SIZE.\n         *\n         * Lossless packet behaviour is comparable to TCP (reliability, arrive in order)\n         * but with packets instead of a stream.\n         *\n         * @param friend_number The friend number of the friend this lossless packet\n         *   should be sent to.\n         * @param data A byte array containing the packet data.\n         * @param length The length of the packet data byte array.\n         *\n         * @return true on success.\n         */\n        public bool friend_send_lossless_packet (uint32 friend_number, uint8[] data, out ERR_FRIEND_CUSTOM_PACKET? error);\n\n        /**\n         * @param friend_number The friend number of the friend who sent a lossy packet.\n         * @param data A byte array containing the received packet data.\n         * @param length The length of the packet data byte array.\n         */\n        [CCode (cname = \"tox_file_recv_control_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendLossyPacketFunc (Tox self, uint32 friend_number, uint8[] data);\n\n        /**\n         * Set the callback for the `friend_lossy_packet` event. Pass NULL to unset.\n         */\n        public void callback_friend_lossy_packet (FriendLossyPacketFunc callback);\n\n        /**\n         * @param friend_number The friend number of the friend who sent the packet.\n         * @param data A byte array containing the received packet data.\n         * @param length The length of the packet data byte array.\n         */\n        [CCode (cname = \"tox_file_recv_control_cb\", has_target=true, has_type_id=false)]\n        public delegate void FriendLosslessPacketFunc (Tox self, uint32 friend_number, uint8[] data);\n\n        /**\n         * Set the callback for the `friend_lossless_packet` event. Pass NULL to unset.\n         */\n        public void callback_friend_lossless_packet (FriendLosslessPacketFunc callback);\n\n        /************************************\n        **  Groupchats\n        ************************************/\n\n         /**\n          * The callback for group invites\n          *\n          * data of length is what needs to be passed to join_groupchat().\n          *\n          * for what type means see ToxGroupChatType_\n          */\n        public delegate void GroupInviteFunc (Tox self, int32 friend_number, uint8 type, uint8[] data);\n\n        /**\n         * Set the callback for group invites.\n         */\n        public void callback_group_invite (GroupInviteFunc callback);\n\n        public delegate void GroupMessageFunc (Tox self, int group_number, int peer_number, [CCode (array_length_type=\"uint16_t\")] uint8[] message);\n\n        /**\n         * Set the callback for group messages.\n         */\n        public void callback_group_message (GroupMessageFunc callback);\n\n        /**\n         * The callback for group actions\n         */\n        public delegate void GroupActionFunc (Tox self, int group_number, int peer_number, [CCode (array_length_type=\"uint16_t\")] uint8[] action);\n\n        /**\n         * Set the callback for group actions.\n         */\n        public void callback_group_action (GroupActionFunc callback);\n\n        /**\n         * The callback for title changes\n         *\n         * if peernumber == -1, then author is unknown (e.g. initial joining the group)\n         */\n        public delegate void GroupTitleFunc (Tox self, int group_number, int peer_number, uint8[] title);\n\n        /**\n         * Set callback function for title changes.\n         */\n        public void callback_group_title (GroupTitleFunc callback);\n\n        /**\n         * The callback for peer name list changes\n         */\n        public delegate void GroupNamelistChangeFunc (Tox self, int group_number, int peer_number, ToxCore.ChatChange change_type);\n\n        /**\n         * Set callback function for peer name list changes.\n         *\n         * It gets called every time the name list changes(new peer/name, deleted peer)\n         */\n        public void callback_group_namelist_change (GroupNamelistChangeFunc callback);\n\n        /**\n         * Creates a new groupchat and puts it in the chats array.\n         *\n         * @return group number on success, -1 on failure.\n         */\n        public int add_groupchat ();\n\n        /**\n         * Delete a groupchat from the chats array.\n         *\n         * @return 0 on success, -1 on failure.\n         */\n        public int del_groupchat (int group_number);\n\n        /**\n         * Copy the name of peernumber who is in groupnumber to name.\n         * name must be at least TOX_MAX_NAME_LENGTH long.\n         *\n         * @return length of name on success, -1 on failure\n         */\n        public int group_peername (int group_number, int peer_number, [CCode (array_length=false)] uint8[] name);\n\n        /**\n         * Copy the public key of peernumber who is in groupnumber to public_key.\n         * public_key must be TOX_PUBLIC_KEY_SIZE long.\n         *\n         * @return 0 on success, -1 on failure\n         */\n        public int group_peer_pubkey (int group_number, int peer_number, [CCode (array_length=false)] uint8[] public_key);\n\n        /**\n         * invite friendnumber to groupnumber\n         * @return 0 on success, -1 on failure\n         */\n        public int invite_friend (int32 friend_number, int group_number);\n\n        /**\n         * Join a group (you need to have been invited first.) using data of length obtained\n         * in the group invite callback.\n         *\n         * @return group number on success, -1 on failure.\n         */\n        public int join_groupchat (int32 friend_number, uint8[] data);\n\n        /**\n         * send a group message\n         * @return 0 on success, -1 on failure\n         */\n        public int group_message_send (int group_number, uint8[] message);\n\n        /**\n         * send a group action\n         * @return 0 on success, -1 on failure\n         */\n        public int group_action_send (int group_number, uint8[] action);\n\n        /**\n         * set the group's title, limited to MAX_NAME_LENGTH\n         * @return 0 on success, -1 on failure\n         */\n        public int group_set_title (int group_number, uint8[] title);\n\n        /**\n         * Get group title from groupnumber and put it in title.\n         * title needs to be a valid memory location with a max_length size of at least MAX_NAME_LENGTH (128) bytes.\n         *\n         * @return length of copied title on success, -1 on failure.\n         */\n        public int group_get_title (int group_number, [CCode (array_length_type = \"uint32_t\")] ref uint8[] title);\n\n        /**\n         * Check if the current peernumber corresponds to ours.\n         *\n         * @return 1 if the peernumber corresponds to ours, 0 on failure.\n         */\n        public int group_peernumber_is_ours (int group_number, int peer_number);\n\n        /**\n         * @return the number of peers in the group chat on success, -1 on failure\n         */\n        public int group_number_peers (int group_number);\n\n        /**\n         * List all the peers in the group chat.\n         *\n         * Copies the names of the peers to the name[length][TOX_MAX_NAME_LENGTH] array.\n         *\n         * Copies the lengths of the names to lengths[length]\n         *\n         * returns the number of peers on success.\n         *\n         * @return -1 on failure.\n         */\n        /**\n         *  TODO: Fix this. (tox_old.h:152)\n         *  public int group_get_names (int group_number, uint8[])\n         */\n\n        /**\n         * Return the number of chats in the instance m.\n         * You should use this to determine how much memory to allocate\n         * for copy_chatlist.\n         */\n        public uint32 count_chatlist ();\n\n        /**\n         * Copy a list of valid chat IDs into the array out_list.\n         * If out_list is NULL, returns 0.\n         * Otherwise, returns the number of elements copied.\n         * If the array was too small, the contents\n         * of out_list will be truncated to list_size.\n         */\n        public uint32 get_chatlist (out int32[] out_list);\n\n        /**\n         * return the type of groupchat (TOX_GROUPCHAT_TYPE_) that groupnumber is.\n         *\n         * @return -1 on failure, type on success.\n         */\n        public int group_get_type (int group_number);\n    }\n}\n"
  },
  {
    "path": "vapis/libtoxencryptsave.deps",
    "content": "libtoxcore\n"
  },
  {
    "path": "vapis/libtoxencryptsave.vapi",
    "content": "[CCode (cheader_filename=\"tox/toxencryptsave.h\", cprefix=\"Tox\", lower_case_cprefix=\"tox_\")]\nnamespace ToxEncrypt {\n  public const uint32 PASS_SALT_LENGTH;\n  public const uint32 PASS_KEY_LENGTH;\n  public const int PASS_ENCRYPTION_EXTRA_LENGTH;\n\n  /**\n   * This key structure's internals should not be used by any client program, even\n   * if they are straightforward here.\n   */\n   [CCode (cname=\"struct TOX_PASS_KEY\", destroy_function=\"\", has_type_id=false)]\n   [Compact]\n   public class PassKey {\n     [CCode (array_length=false, array_length_cexpr=\"TOX_PASS_SALT_LENGTH\")]\n     public uint8[] salt;\n     [CCode (array_length=false, array_length_cexpr=\"TOX_PASS_KEY_LENGTH\")]\n     public uint8[] key;\n\n     public PassKey ();\n   }\n\n\n  /*******************************************************************************\n   *\n   * :: Errors enums\n   *\n   ******************************************************************************/\n  [CCode (cname=\"TOX_ERR_KEY_DERIVATION\", cprefix=\"TOX_ERR_KEY_DERIVATION_\")]\n  public enum ERR_KEY_DERIVATION {\n    OK,\n    /**\n     * Some input data, or maybe the output pointer, was null.\n     */\n    NULL,\n    /**\n     * The crypto lib was unable to derive a key from the given passphrase,\n     * which is usually a lack of memory issue. The functions accepting keys\n     * do not produce this error.\n     */\n    FAILED\n  }\n\n  [CCode (cname=\"TOX_ERR_ENCRYPTION\", cprefix=\"TOX_ERR_ENCRYPTION_\")]\n  public enum ERR_ENCRYPTION {\n    OK,\n    /**\n     * Some input data, or maybe the output pointer, was null.\n     */\n    NULL,\n    /**\n     * The crypto lib was unable to derive a key from the given passphrase,\n     * which is usually a lack of memory issue. The functions accepting keys\n     * do not produce this error.\n     */\n    KEY_DERIVATION_FAILED,\n    /**\n     * The encryption itself failed.\n     */\n    FAILED\n  }\n\n  [CCode (cname=\"TOX_ERR_DECRYPTION\", cprefix=\"TOX_ERR_DECRYPTION_\")]\n  public enum ERR_DECRYPTION {\n    OK,\n    /**\n     * Some input data, or maybe the output pointer, was null.\n     */\n    NULL,\n    /**\n     * The input data was shorter than TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes\n     */\n    INVALID_LENGTH,\n    /**\n     * The input data is missing the magic number (i.e. wasn't created by this\n     * module, or is corrupted)\n     */\n    BAD_FORMAT,\n    /**\n     * The crypto lib was unable to derive a key from the given passphrase,\n     * which is usually a lack of memory issue. The functions accepting keys\n     * do not produce this error.\n     */\n    KEY_DERIVATION_FAILED,\n    /**\n     * The encrypted byte array could not be decrypted. Either the data was\n     * corrupt or the password/key was incorrect.\n     */\n    FAILED\n  }\n\n  /**\n   * Encrypts the given data with the given passphrase. The output array must be\n   * at least data_len + TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes long. This delegates\n   * to tox_derive_key_from_pass and tox_pass_key_encrypt.\n   *\n   * returns true on success\n   */\n  public static bool pass_encrypt (\n    [CCode (array_length_type=\"size_t\")] uint8[] data,\n    [CCode (array_length_type=\"size_t\")] uint8[] passphrase,\n    [CCode (array_length=false)] uint8[] encrypted_data,\n    out ERR_ENCRYPTION error\n  );\n\n  /**\n   * Decrypts the given data with the given passphrase. The output array must be\n   * at least data_len - TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes long. This delegates\n   * to tox_pass_key_decrypt.\n   *\n   * the output data has size data_length - TOX_PASS_ENCRYPTION_EXTRA_LENGTH\n   *\n   * returns true on success\n   */\n  public static bool pass_decrypt (\n    [CCode (array_length_type=\"size_t\")] uint8[] data,\n    [CCode (array_length_type=\"size_t\")] uint8[] passphrase,\n    [CCode (array_length=false)] uint8[] decrypted_data,\n    out ERR_DECRYPTION error\n  );\n\n  /**\n   * Generates a secret symmetric key from the given passphrase. out_key must be at least\n   * TOX_PASS_KEY_LENGTH bytes long.\n   * Be sure to not compromise the key! Only keep it in memory, do not write to disk.\n   * The password is zeroed after key derivation.\n   * The key should only be used with the other functions in this module, as it\n   * includes a salt.\n   * Note that this function is not deterministic; to derive the same key from a\n   * password, you also must know the random salt that was used. See below.\n   *\n   * returns true on success\n   */\n  public static bool derive_key_from_pass (\n    [CCode (array_length_type=\"size_t\")] uint8[] passphrase,\n    out PassKey out_key, out ERR_KEY_DERIVATION error\n  );\n\n  /**\n   * Same as derive_key_from_pass, except use the given salt for deterministic key derivation.\n   * The salt must be TOX_PASS_SALT_LENGTH bytes in length.\n   */\n  public static bool derive_key_with_salt (\n    [CCode (array_length_type=\"size_t\")] uint8[] passphrase,\n    [CCode (array_length=false)] uint8[] salt,\n    out PassKey out_key, out ERR_KEY_DERIVATION error\n  );\n\n  /**\n   * This retrieves the salt used to encrypt the given data, which can then be passed to\n   * derive_key_with_salt to produce the same key as was previously used. Any encrpyted\n   * data with this module can be used as input.\n   *\n   * returns true if magic number matches\n   * success does not say anything about the validity of the data, only that data of\n   * the appropriate size was copied\n   */\n  public static bool get_salt (\n    [CCode (array_length=false)] uint8[] data,\n    [CCode (array_length=false)] out uint8[] salt\n  );\n\n  /**\n   * Encrypt arbitrary with a key produced by tox_derive_key_*. The output\n   * array must be at least data_len + TOX_PASS_ENCRYPTION_EXTRA_LENGTH bytes long.\n   * key must be TOX_PASS_KEY_LENGTH bytes.\n   * If you already have a symmetric key from somewhere besides this module, simply\n   * call encrypt_data_symmetric in toxcore/crypto_core directly.\n   *\n   * returns true on success\n   */\n  public static bool pass_key_encrypt (\n    [CCode (array_length_type=\"size_t\")] uint8[] data,\n    PassKey key,\n    [CCode (array_length=false)] out uint8 @out,\n    out ERR_DECRYPTION error\n  );\n\n\n  /**\n   * This is the inverse of tox_pass_key_encrypt, also using only keys produced by\n   * tox_derive_key_from_pass.\n   *\n   * the output data has size data_length - TOX_PASS_ENCRYPTION_EXTRA_LENGTH\n   *\n   * returns true on success\n   */\n  public static bool pass_key_decrypt ([CCode (array_length_type=\"size_t\")] uint8[] data, PassKey key, [CCode (array_length=false)] out uint8[] @out, out ERR_DECRYPTION error);\n\n  /**\n   * Determines whether or not the given data is encrypted (by checking the magic number)\n   */\n  public static bool is_data_encrypted ([CCode (array_length=false)] uint8[] data);\n}\n"
  },
  {
    "path": "waf",
    "content": "#!/usr/bin/env python\n# encoding: ISO8859-1\n# Thomas Nagy, 2005-2016\n\n\"\"\"\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n3. The name of the author may not be used to endorse or promote products\n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,\nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\nSTRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\nIN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\"\"\"\n\nimport os, sys, inspect\n\nVERSION=\"1.8.20\"\nREVISION=\"c859ca7dc3693011756f4edf45c36626\"\nGIT=\"8e4f6ea5f13d692848c1225cab94bce59d0d9a19\"\nINSTALL=''\nC1='#3'\nC2='#-'\nC3='#,'\ncwd = os.getcwd()\njoin = os.path.join\n\n\nWAF='waf'\ndef b(x):\n\treturn x\nif sys.hexversion>0x300000f:\n\tWAF='waf3'\n\tdef b(x):\n\t\treturn x.encode()\n\ndef err(m):\n\tprint(('\\033[91mError: %s\\033[0m' % m))\n\tsys.exit(1)\n\ndef unpack_wafdir(dir, src):\n\tf = open(src,'rb')\n\tc = 'corrupt archive (%d)'\n\twhile 1:\n\t\tline = f.readline()\n\t\tif not line: err('run waf-light from a folder containing waflib')\n\t\tif line == b('#==>\\n'):\n\t\t\ttxt = f.readline()\n\t\t\tif not txt: err(c % 1)\n\t\t\tif f.readline() != b('#<==\\n'): err(c % 2)\n\t\t\tbreak\n\tif not txt: err(c % 3)\n\ttxt = txt[1:-1].replace(b(C1), b('\\n')).replace(b(C2), b('\\r')).replace(b(C3), b('\\x00'))\n\n\timport shutil, tarfile\n\ttry: shutil.rmtree(dir)\n\texcept OSError: pass\n\ttry:\n\t\tfor x in ('Tools', 'extras'):\n\t\t\tos.makedirs(join(dir, 'waflib', x))\n\texcept OSError:\n\t\terr(\"Cannot unpack waf lib into %s\\nMove waf in a writable directory\" % dir)\n\n\tos.chdir(dir)\n\ttmp = 't.bz2'\n\tt = open(tmp,'wb')\n\ttry: t.write(txt)\n\tfinally: t.close()\n\n\ttry:\n\t\tt = tarfile.open(tmp)\n\texcept:\n\t\ttry:\n\t\t\tos.system('bunzip2 t.bz2')\n\t\t\tt = tarfile.open('t')\n\t\t\ttmp = 't'\n\t\texcept:\n\t\t\tos.chdir(cwd)\n\t\t\ttry: shutil.rmtree(dir)\n\t\t\texcept OSError: pass\n\t\t\terr(\"Waf cannot be unpacked, check that bzip2 support is present\")\n\n\ttry:\n\t\tfor x in t: t.extract(x)\n\tfinally:\n\t\tt.close()\n\n\tfor x in ('Tools', 'extras'):\n\t\tos.chmod(join('waflib',x), 493)\n\n\tif sys.hexversion<0x300000f:\n\t\tsys.path = [join(dir, 'waflib')] + sys.path\n\t\timport fixpy2\n\t\tfixpy2.fixdir(dir)\n\n\tos.remove(tmp)\n\tos.chdir(cwd)\n\n\ttry: dir = unicode(dir, 'mbcs')\n\texcept: pass\n\ttry:\n\t\tfrom ctypes import windll\n\t\twindll.kernel32.SetFileAttributesW(dir, 2)\n\texcept:\n\t\tpass\n\ndef test(dir):\n\ttry:\n\t\tos.stat(join(dir, 'waflib'))\n\t\treturn os.path.abspath(dir)\n\texcept OSError:\n\t\tpass\n\ndef find_lib():\n\tsrc = os.path.abspath(inspect.getfile(inspect.getmodule(err)))\n\tbase, name = os.path.split(src)\n\n\t#devs use $WAFDIR\n\tw=test(os.environ.get('WAFDIR', ''))\n\tif w: return w\n\n\t#waf-light\n\tif name.endswith('waf-light'):\n\t\tw = test(base)\n\t\tif w: return w\n\t\terr('waf-light requires waflib -> export WAFDIR=/folder')\n\n\tdirname = '%s-%s-%s' % (WAF, VERSION, REVISION)\n\tfor i in (INSTALL,'/usr','/usr/local','/opt'):\n\t\tw = test(i + '/lib/' + dirname)\n\t\tif w: return w\n\n\t#waf-local\n\tdir = join(base, (sys.platform != 'win32' and '.' or '') + dirname)\n\tw = test(dir)\n\tif w: return w\n\n\t#unpack\n\tunpack_wafdir(dir, src)\n\treturn dir\n\nwafdir = find_lib()\nsys.path.insert(0, wafdir)\n\nif __name__ == '__main__':\n\n\tfrom waflib import Scripting\n\tScripting.waf_entry_point(cwd, VERSION, wafdir)\n\n#==>\n#BZh91AY&SYE~j\u0003Qn#,Y#,\f§\b\u0005%H4#,`b\u0006\u001c{ސ#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,\u001c:)\u001eۧ5_Z]\u001a\u001bh\u000f.nݺjJt\u001c}Ԗ\b\u0004SL,U)åH\u001d\u0014ov\u001eǻ\u0003ǻu;ާt]zo{\tѭݧw\u0007ӝ:\u001f\\Omv=pO#,#,#,t#,#,ϳ@0:-l\u0001\u001f _`\u001c#,}c˘\u0005U5 n\u000eqtiΕӴh;\u0001{\u0007h#3t=\u001d9݆0$J\u0012#3\u0017c@\u0005E4\u001aI\u0018PZ$\u0005${{c07{@{v*Yk-6[N\u000fνv}gm=ozޏo/w5OvxwyeZwn\u0015wkn]jSv#,4/{v\u00165@#3\u001eNly]&A\u000fW|稀\u0012\tov#3^dU(\u0015(#,+X+Z!^x#,=ww>}\u000e#,}k[Y;x\u0013\u0005;{z=k{vU<F\u0007wN3Zi}dY}{\u00145)N\u000f=Wnyוҧ'\u000bom۽\u0017^_{{{n\f۝\u001ey}]Z\u00052iFO\u0011\u001d\u0016Ѷ3r)Q,ͫxwq>秫}viě=瞏\u001e}zz^\u001d#,ou}`/k[\u0005#,%#3\u0015P\u0015:wh\u001aRw;Y\u0014\u001b8GO\u001fo\u001c;վ3uEY\u0012ngaGW{wm\u000f#,#,#,#,ov3_w֦z}ﮞGEGqGn커m\u0007v\u0007={v׻lb7:\"=]5gͳ{\u001b\u0019x\f=뽵6>/\u001a\u0006o{W_v#-S#-wv_/O8yŔ\u001a\u001et+{z^x3\tx_C\u001f}l=}c#,0z]\u0018#3}o#-\u0006׳\u000f_nެmK}ej{;{\u001dnh\u001a\u0001]\u0014\u001eƎw{Ϋ>O\u0005(ܮyѾw#,\u001718P697ޯx\u000e\u000e=uT\u0014J`1mqkþz}{N[pvҥ)E\f\\m'ih={\u0015ۼo{׽|l>Wv狀;0f:}p뵄Rs}$\u0011ewwn5랻O7\u0017};%4#, \u0002d#,&\u0013& \u0004d2\fSdM\u0011CGѦ<PJh\u0010\u0004\u0004\u0004\u0002d\bT?S=MLM\u000fS\u001ab4hh#,#,#,#,#,HH!\u0002\u0006!!=TSOA#-Cjd~#,#,#,#,\u0006#,#,\u0012z\u0014P$5#-y\u001a)?Bj=&L\u001e#-\u0006M4\u0003@#,#,#,#,#,#,!\u0002\u0002#,\u0010#,\u0011D2\tdjx\tO\u0013Il\u0003@#,2#,#,\u0001& @ \u00024\u0004\u001a#3Sz#)<\u001eꞧzꆀ\u0003 #,#,\u0001_[m_s\u0013\u001fEsks\u001a.S)v d#3A\u0019 y|'xzu1xxy0F\u001cV\u0007Q7jən\tu[\u0003\u001f\u0012h_\t\u0001I\u0001#,'\u0013d9U\u001cQ9\u0014*b#3Ҍ\u0011.xt]3dMGd=a&̚z|9y8x]$[+\u0004#3\u0005\u001c`)\u0010`,F\u001cMVhhƵ*T*TU#3L*\u0001x*\u0012\u0018eB( #,\u000f\bt^[VҵTk\u0016ڭUT$#3\u0011 K\u0019M1\u00012!\u0019lʈ,dI)FSm%B*d\u0002hښ\"PLll2Ve\u0004m\u001aIcBi(*4I\u0016ShJRҙ\u0016\u0001\u0001,l\u0004Kbhj\f\u00145(AI(HZ5\u001aVҫRmDə2hت\f+X0͙mIc4`DHԵ4ɩLj6\u001aVY\b4#-2J4\u0014Ii RHfɢ`4iT!\u0004\u0006b\u0018\u00046\u0019&D$mI\u0002E,@B+&HBF\u0012YX\u0006a[IQh6ԩ\u0015\fY&\u001a(H\u0018\u0011ID\"LbAe6IH\fY\u001aR3%J(dX!PȢXQ\u0016I\t\"\u0014؋I`ld\u0014(D\u0015\u0012R\u0014͈$RX \u0012&R1d\b\u0019\u0012[2A\u0005\u0011!\u0012BT\u0012\u0012!$J),Yf`ٴFFBH\u0019I#-\"R1\u0016R\fed544\u0006%\u001b\u001a2\u00131$-#,K$#3,!fPcQH))C\u0010Qf\"5&JM i\u0016TaAE\u0006\u0013\u0012dDIJ#3c\u001a\u0001\u001af(#,\u0010ʙ\"R\u0010T!JBIi(H4$Md[\tfC\u0003&hdeISQ\u0018e\fҘ(Tɢ*hYIY\u00191%\"$\u0016%4@ƈ\fRdI3#-dѓ!P0!\u001a\u0012eh,% Iɔd\"\u0019LeKIJ\u0015\u001bE2dJHj1li&k\"\u001b\u0018I\f#*4#,\u00125L(2L3E\f\"%\bb@\u001a%%\u0019Fi#-ڕUc\u00044\u000bIA\u0016)&46iK4iLS4K\u0016F6\u0016(Щf#-6ZcHYZJBT%5Z+\u0016LҢ&(Z#3T1\u001464\f)HJ5AP6dSY2\u001b\u0019L-\u000b\u0013%1iS\u0019$i1a\u001b,\u001bYR*J6Q%\u0019M&FM2%IJ*Ra[1CL\u0014Ii(Q,k\u0015S6a-6\u000b\u001a$jM\u001blm\u001b\u001b%\u001a4CTR\u001aFU\u001b\fԆ!5#3#[5&S\u0012QH&\u0018CRMlFѲIcR\u00165m4\u00116Vdba6ȓ2PmSj)i)MK*Kim%i1k*e,iflţFkf3$\u001a\u0019jM!43QH\u001b\u0001!\u0019\u0006!BP0)m\u001bRDS)6XdɠS\f(Rʈؤ\u0016T\u0006)(Sf,HJEE̐)Y,\u00066̳4\u0019#3M\u0013$d,Ĳ\u0011\u0014FĚJ2fH(3%LSE&Ѧ\u00136#-\u0010E\u00153j\u0005,&Q\u0001HcSM06\u001b\u001b\u0014hFl\u0012)0V\u0014PY2JJdl\u0019-S5($-(-I#aM&m&QflA!0IFFdI4%I2l1\u0010&͋AYK4&%E\u0016hfM\u001akI2R\u0005\"Fl\b\u0018\tfDƋJhQ\u0003Yd)M$$m\u001a\tQj4Q\"Ɠ#-$\u0013(,E\u0006TS$,X5JI5!@Tk&addii66\u00106$ѡ2ʹ\u0011\u0004i-F\u0018X\u001a)6(\u001aғ4!QLdT%F4EU\fLL\u0011M)BJJh$bTRjHFTal6I66)!jMf\f\b\u0016,ZA))уi0\u0015\u0012fU(%LFэd\bl2J(\u0014c)lFYI(#,bL\u0019&((Mj-V1Y-f\u0015\u0014(\u0019#(-,\"J\u0013FL\u001a0elAFض)dZ `2j-\u0019#33lj6EEdZFl#-,J\u00162TԔM$llV\t,i-J-Ik\u0014JfQ,)\u0015\u0014hZmc*\u001aM\u0011%Lѱ0-\u0006&LfKd\u0014*-%VlZ6F#3Y6\"5+-QP\u001b\u00126c\u0005KblbEE\u0004lI$I%\u000bRI\u0014B\u0003\u0017_OK6\u0016=ɋ{Oڒ\u0014r.\u0019\u0005%2.T\u0011\"bbOAf\u001c?k\u0005MA\\j\u0005n2?Q,C\u0014\tz\u0014oSъ4ܖ#3W\u00124Eu#,Gd\u001d\\a,۴?ydWne㌺K;\u000bF#v%\u0012\"Ns,>?KV#3g!EAح\u001c\u00021txQ>H#t\u0019YW\u0011Vڶ\u001e\u0014y)Q\u001aTUvadi2ӆ\u0006\u001eY[#n\u0004\u000b\u0015|\u0017^Wh\u0004}w^I*$=]ؼOu|2ni,X%\u0005]rk{\u000f?\\\f Za\u000e6\u0015 kUI,b-\u0016E\u001b\u001dգ0#3\u0010z\u001420\u0002:\u0015r@S\u001aV[\u0012!?Cj<\u0013F\u000b\b\u0012i4jf\u001d\u000b|M\u000e.`\f&\u001f,\t@\u0005݂\u00181\u0018nZ\f*h[\\ɤ)5dQE \u0002r\u0012\u0016\u0016\u0013T\u001d+<\u0014FnBS)\"ڔ\u0012ĥ\u0006&lr<$\"\u0013R\u0015$s(:\u0012\u0012PxW^6J[\u0007b2(=\u0005ԣGU[|6]N:W.I:.[\u0016˼\u0001`z%fB0\u0017hi\u0014\u00153EkU:=e)6J(u1\b\u0011*A\u0001\u0001G\u0018\u0014)\\w$4ölk#,j\u0004?d5\"홸kV|us$NҌ6j8ڹS5N\u0002\u00158<8Z9Pِ\u001d\u0017-0}h\u001dzvƁ\u0005G\f\u0002F}\u000eD\u0006\bx8f(ZΚچ{M$@d<RC$f\u0012-,)`Kӭ~X\u000fd#3\u0016l\u0006X-2L|\u0013ai\u001bwK!MMQ_3L\\܉xrB/G]rdpO\u0018ŐKQFxex.[\u001a?\u0013ޫxL\u0015]/cWuqb1E\u0011ZO{Wv42)ѡVtF\u0013\t\u0017\u0014'\u0016WMXޯ'E)}.T\u0015~'6\u000bqܚ돥%a|}\u001ey\u000f4X,xUWPyݦ\u000f}h\u001fb##,4=zՏsP#\u0011]+k6C#,ky\\۩u#Esc':IZoT\u0017Z!pYiZ'%X*1\u0019L\b'u\u0012i)>I#3-DM{\u0015d\t[&\u0016i\u0010Y&J`-<#-P,*h\u001cA*\u001exZ\u001a2e.E\u0019Jє7\u0005\u00158WЬPf\u0001G\u0006,\u0004m\u000fh:\u001fl>cמ}=%nX.`\u0004,k\tB\f#*7q\u0015[xT<\u00195B^N4\\`F*#31\f\u0019?i=!\"6\u001cQ\u001eخ,\t,>\u001bWs'T5\u001cp\u001f,4鄃RpH:G}~y|\u0004ǟT`PJsPEoΥEv#W*}LY\u0013\u001bޢ5! 4K\u000e&dh<;_J8Ჴ!!\"g\u00119\u0017sN~l#-b+\u0013&wͷec\u0015i3橢)Of\u0003#-hL(>(N\f!K\u0013BvGuH6bGtF,\u001f\u0013+ZA\u0019Bct\u0001:\u001dm.;\u001c\u001c:\u0007!#-$-ρ*\u0004v\u001f)`\u0010.e%\u001f}[hM\u001aT-(Ij\u001e9B\br4d{bwNgHDK\\obK;MCj|%jB#,ϪvGX\u001a\u0017Z+\u001abA7ӔƵ\b7JIX\u0007M\u001b!|wchz<\u001c#Rw\u001a>\u0013JM\u0010!invZ3\u0010?\u001f-4Xዸ*U5\\.xUIAa\u00072\u0007V\u0007o*ҟ7bT::)Q\b?(\u001atC\u0007Zƈ#-\u001a҃#3߼M#,߶z\u0005c񟚵B~%\u0005:0p\u001ew\u0019-{1\u0011@´~Kv.\u0019/ \u000bVc))#-*n؉mURoɿ\t\u001a2}wNEϞCdPD\u0006Ni=W\u001aӚb[ ʩIŐ\u00058B̺\"_cZSY$NYb\u000eR+Q\u0012e w%|U\u001fx#ct`SuB\u0012>ԫU\u001b%]p.݀\u0015\u0013x;[\f\u001b2L{Ҹ+D#3Y.;;Qg\u0001\u001be}߄4s\u001f O\u0005#n\u00021G%H\u0001\u0014t(bz<F9û1T\\z\u0007\u0007ЁgM+#H\u001c`浘~<\u001b達\u000e,#3bD_ЖpŧS{آ]\b P\u0018e8tc\u000f^,iY0\u001f:G%4#3]w\u0018BPf[9C\u000e\u000f\u001d\u0010!\bY\u0006\u001b4Q:=S(RUPMy4Z\u001b\u000f4D;/W=\\8?}~xk[#3UV]`0\u0019ls\u0013\u0002(,z<\u000eɃQt륓>\u001ci}:'r:\u001dGE)\u0015\u0014\u0013z8kC#3Dss)Dݩ\u000fgt#KÓ.\u0015Pw8DK{y[ɂQDt;\u0010[\u001b\u0004^sXLu\u001aYQ\u0018xVR9H`Mux:]V)u76_|wҌY\u0016P?\u001fܹf1\u0004?\u0018Y˙? tt>\u0017={Y+EC9y^0qw\u0019\u0010ÃXF\u001dA?\u000e^wv\\MT#3\u0002I-<7NMޓ|z9&WBnBՉМ(1\u0015BP0A\u0006(T#-UwokzcHb\u001d\f\u0013\u0002@HKm\"1\u0019\u000e\u0014\u0015x\u0017HȦT\u0006.ye\u0014*.\u0001 HABԏ!+\u000fӵ\u001f:m~i\u0013JZyT\u000b\u001bF\u001eVqH7~;:0'L\u001a}\u001eO;U ^Ϙvzm̜}\u001e2\u0011^a\"Xs\u0016+\u0017W\u0017s꺕Vyʩt:e\u00118^KT'\f16x0]\u0005\u0001hDv^\\lͱl\bE\u001dNK\u001c+2*\u0004MӏF*J\fQ\u0011}\u0019ٍjh\u0014'tq8x\fĿxr\tA=?\u00163z<F\tn<L#-\u0003!@VU\u0014\u000f>=wm:xp#3aS,bT\u0013om#,wUfKʌZ|2r\u00111u\fb6׳\u0003ս\u0013!J\u0012ck\u0006\u0006)jVO\u001d#3f\u0019;B&|<t$h9#FEiωHM\u0011nKQp\u001b'!f.#3wȴq\u001aZI#-b\u000ef1\u000e\u0014>Cl<\u0019Y\blkK^Y\u0003#-\tK*h\u0016\u0015Z\u0019!Sֱ\u0016EQ5v) ToV}\fQ\"/\u0007\u0003\u0012tkQ\u0007W3<\u000f\u001d\u0015\u0002漏%\u0013)\u001cN !\u000fv|#\u0005\u0016T\u000e_{uո?f\"0Gg.(sp~&\u001dߗMYr\u0011d\u0013\t\u0018\u0010W3F\u0002+#ͬ\u000f\u000e\u001elkyG,*x5\u0016C`'i\u0006~G>w\u001f9w5yLf8$\u001fuEf\tbq\u0003\u0017sN&+9{0c,53QdУZҤǍ\u0007a,_eUJN\u0019\u001e\u001d\u001e\u0014.j\u001e<,;\u00034\u0011|D\u0013hGq\u0006u\u0012_0\u001e?I\u0002\u001c#-1\u0019\u0019\u000er妐c&nh3\u0002a#3\u0004XDHn6\u0018LbŸxQУuf*hC]5\u0019מ0:B\bͪkP/\u0015d/GE&8ķ2\u0007}\u0016jw^\u0011\f<jߕS\"Z+\\fdC`6_LaώR\u001c9K\"_J3pTx\u000fX|}`w\u00060Pb>82[{K*J\u0016B*e#3\u001fNZ\u0013\u0010Z(ZST\u000bTi\u000b :5\u0019\u0013 DQ\u001f,uzoۢDI=ꗸ.JʕxܝE.8\u0007\u001c\"\u0019\u0002Ɯ\u001e~=~ob\u001d\u0010!\u0004'I%8\u0012Sn\u00057;w2\u0014n~?rl\u001bt\"_oq|y<.8__\u0015+Eg[\u001cҺ\fq-#-9#-\fy#3RN5\u0013\u0003pLA3\u001dS~),&{s\u0015$y[Q\u0007BcH҇1ôВ\u000fV\u0011F2#-m)##NL\u0007\u0016G\u0019\u001bAgӃa#-ū\\HB\u000b\u0017޴WZ(\u0016cwmm#-\u000f䢰tOjye\u0003\u0007GN9,B\u001eB\u000fjFCŠhNLHwpR]\u001d9Y\u000e\u0015r^i2Yq9V#3!ˇ/]\u0004\u0005\b\u000612fYU\\tǇ\u000baXnvbi~NKEY\u0017\\sNiK\f#+Лt(>\u000b#'4R7[/s405+h^4\u0015\u001f#-w)9<оvǮ|%>X\u001dQ5#\"NT\\2髏(TY\u0015rf#\u001dR\u0007P%\u001cK|\u001fb\u0017xK\u0016w\u0006\u000e\f&\b\bf\u0003SHtveƗmO#i?D_B\u000bNFO{oߧ\u000f=\u0010֑_ދM%1[}#i#,#-\u001cw?uM=}Q7tRk%5o-B!\b}~4blvfO^D\u001a?ޤ#3D'\u00132~[ѵ*ɬr\u000f꒏+\u0010 \u0014Dˊ{6v-c\u0003i4)F$)Y\u001b\u0006\u0012M\u0019<kڽ\u0015hW\"1|\u0015\b#,TMEMqovs6]/\u000eq\\<$AC}%\u0016LSM\u0004$V9l{zk:L'\u0004.<uMӪKV&g/iĹҪ5oK'~W2uH@OP\u001ePݯ0擳q\u0014ɼ\b\u0016: VuDQf\u0010ʻB9uA*gs(\u0015Nt=\u0019p7'ߌ\u0010)\"\"0>\u0014oQY$\f!dDQ\u0017gl>%RM\u000e\u001c˾}F\u001a[Dm#-Ъ;\u0011FY#3٨@wy\b@%E'%U=x\u0011\\sUaP_Iv&W51\t\u0004\u001fU#3\bo\u001d]4Zv\u001e\"3<_Jvi`[v#3\u0010˞G\u001cơ\u001e}\f?'Ū9%#3\u0019ff\u001a֌S\u000fR\u0002iy\u0019$Z!+͋ߢ#3%!D>0~|\u0015:ő-M'#cD\u001f+vdK\u00159\u0015oAVϥN:ZF()\u000bҲƔa#-3Q٭C\t~C\u000b\u001907TUBEe\b[\u0002((G\u0002\\IIުKD+QߚYß\\\u001b><t}\u001bx#Zַ|0p㒌Dd!,I\u0010K\u0003A2CcD2n\u000e\u001d\u001fIbw\u0011z8gU#-oy|\u0001\"\t0916iA`:lTߏ͕BQ>]:=\u0004\u001b)5겢\u001dKӫ,::\u0018f\u001b''߷3Mj\u000erL\u0015ɝ5\u001c\u0014\u000b\u001a^yЪ\u00162M#,\u00010|]T[VݖNmv\u0006i\u0015ldX\u0006,~\u0010\u0018]q!\u0007L\u0011(O?o#,\u0018j]*5Bh\bbO\tjO*ˆJ\u001d1dj^9CKf'=]%A!So\u001e<,\u0014|3M\u0004#\\~*e*oDj\u001c\u0001DHKГ3MuԐn=Y#3(;\u000bU\u000bc5\b1U\u001182\u0016\t\t4vH_~:[\\#,\u001f2#,&##`UoQݗb\u0002}|\u0001ְ\\\u001a\u000bpiǾ,\u001d\u0002f+#Um{G\u000b!T!}+n8xV`zkeU<SK?f0j6kѳn۬#vh#-w$ \u000b5\u0002#3\u0010˺b@qg\u000e\\\u001b@M=\u000e#-fQ\u0014\u0011\u0010`\u001aa\\~#3ZN6\u0018\u0003~,\u0019l*rU̠⛚\u000e*\u0011?0N\\7]gSc\u0003p&C\u0005#-xٌV%/7\u001a\u0003x\u001e;5Vc\u001b\"c85$Ƥ;L>iDMvhe\u0001\u000fd\t*Y_M#\u001bHUK35\u001b\u0017lR1k/\u000321#-iNޱ^d\u00125{$.R~ϲ?\u001e\u0018\u000ezJH\u001di,9F)Dg\u0015v2ܛqyOkH@n0Pp1Dlp<OԹJ\u001f\u000b0y\b\u0019\u001eg`Z$1ϜU1E,,f}s#\u001fٟ\u001c6/Ayw\u0019U\u0013Gԣa>;\u001aDƣ\u0003`,d\u0016o\u0012:n<'ńa\u0006찲\u00047pVC\u000frAMOb<\u0015\u001exjp\\=FӻY\u001cPpN!SԸXn3?lr\u0011az9jjVZk\u001aM\u001doe@NygE\u001f\u0005l3W+i;\\H\u0016eEP\u0013~~F\u0014PHMXZ8\u0005IѮ=SF\u0003\u0002\u00139g!8ywW4`w7\u0014ǲc_ΤX\u0007v]A\f\u0019z$jN\u001bC8<\u0011#-\u0003m\u0010\u0015#\b:\u001f^tiy\u001e<Vз%ǚ~WY#\u0003`Q6e*\u0019.l%#-+퀃rPsx{ݕVXP\u0010RKW;Z+\u000b\u0016sqGǶ1\t\u001cT\u0012-~!Q餢!3\u0003ڸD\u0006\u0002.O\u000e&}#2\u001a4||!\u0010z_\u000e{(!Mabf\u0010+ٯA\u0019zSiih\u0017 ʙP\u0012`r0>ט\u001c\\\u001d+7Y%e\u0017\u001a^en0֩q}#-k3p2!\u0001Oa5\u0019m\u000e)\u000b\u001ab4(Ό-qm D)&X@cN@Y٢އ\u0012jLqƞgϽhwܿ,\u0012& @yg9\u0011d\u0004Y\u0005>[5v5ƐKmjk]H:jHH\u000bN\f<HOn\u001ek*4-\u0003~Y>-\u000eR|\u0002n [#3\fh\u00160LĤ\u001cO=;TfC]lILҞ}+DwG='YNt8w%\u0016:\u001b\"W\u0019fzce5uҍ#3,{hH*s\u001b\u0006%2\u0017);y5\bin!{Q/\u0011\u0006|\u000bx\u0019c/-25e\u0010^:Sy=Pm}\u0019\u000b4}\u0014ͻ\\\u0013\\^Y\u001e;x\u001e:\u0018\u001dg[w]/9{x.o<iWƖڜ\u0013\u0019\u0017;-\u0010\u001cj0\\3ʚ\u001fP6(6ȖEVmr\u001c,SeQII8q\u001c\\\u001b9\u0018\"/P#7\u0010±(z\u00105/\u001d_KO\u0018JNtcvy\t\u001cE/ptu1+\u0002-\f\bKu!.;\u001e\u001f\u0015轌#-o;L~J*i1烼\u0015rE\u000eɁU8j\u0015@#3ʪI\u0016M}vpQ\u000fYK>\u0006y?\u0015{\u001a\u0004\u001c}2%\\zx\u0010mo\bM[\u0012\t\u0010(\u001e#3\u001ar8\f=E)VlmG\fTUuwyi^w#1$XZdȠZ;[\u0004΍kq}ߧ#LRS\bV\u0014(k\u0011C\u00060bhum\u0013R*26\u0017\u0012Aa zV\t%YbTyg8a^,2*l<_\u0015\u001c#-N\u0019\u001eE'$TV\u0007cK?U;\u0007\u0005|>DR}X`l~\u000e[8 e\u001d曳nvŗiT \u0014Lȑ\u0016#-KB@\u000e$3\u0013\u0002\t7^o\u0016UÇ$lXR'&֌atɝsM\u0011\\b'vQIŕFz\u0015\u0013\u0010[;Wu5o}8`3$f;8e#-ZF\u0003v%\t\\\u0011Z6Jƌ\u001c\u0018+5&&S?#I\u000enAքMP\u0014SC9͔ZąE]q7\u0001CL\u0015onZWt6D\u000e@V*ۂ\u0013\u001d\u0010R\"R 0{sEyt\u00171ߑ#3uI(`\"X\f\f\"\u001d\u0001*d-I\u0018\u0003hhBo\u0018YJ\u0018+ \"\u001a$@(J\u0004$F\u0012)&khquQ\"CF{I\u0018rk\u00025\u001dZ+*l]7ժҗr\u0012*ϩWUފ%_\\B*ڂ/\u0002w03ikxzzuUǫknpl:<#-G;J#-N\u0014#3n#3m\u0007E\u0019L==\u0018fi\u0016>F,&\\\u000b\u001b>J7\u001c(#3\u0012H0Q車W2\u001eՓu\u001cRv*h#\f`/֎I$/Lߪoy+*#-C-NjI̧e߀h\u001e9K\u001fk[\u000e<)\u0015}~#-he-\u0013b\u001ag\u0012\u0018F33\u0006\u0010s\u001b> \u000bLѶ1t[ᱯ\\3\u0006סω$H]-,wa\b\u001c\u0002\u000b)ړRq\u0010\u00178JCoDIW\u0005X7\u0019ؖ3\u000bc\u001eH1\u0007\u001fۦ\u001e\u0006cCsC\u0010t\u0014VD<HK\u000b*\u000fV\u0018#!ky\u0007_,ֽ\u0007C<s\u0010#3\u000fJ\u0018\u0012CŁ/-\u0007,\u00116vF3swY\u0004x>uMW#yp!\u0003)H\u000b\u0018\f\u00193-F4ib*QnJհ\u001ei\u001b2\u000e\u0003C:;\u0013_>WZf|!#\u0018\u00120@ȕ+Mi/\u001b\u0015놢\u0012|6Q8\u00034D\u0011r¢H4I#-\fI.aϿ=ڝb#,%9/,t\u001d jG- fUxjr3:1ȸ\u001a.Qy`hiA>\u0013bъqx!\u0018\u0019Ij#9\u000e.r,wc|ĭFrF\u001d2ER-kV)]&=Ƃl@P.\u001b6!\u000eA0I;g\u000b\u000ex\u0004ԢQUm=S|2'U\u0014\u00142ZK.Z\u001f(Q\u0011EP`eϭ\u001eL\u001a+kFHǫꏜC\u0010\u0004WiK\u0010˹^o\u0016\u0018SP|5GeL\u0013\u00062H\u0019L\u0013ݲ\u0015\u0012\u0011\u0001,`DϘ~\u001e[ɚ\u001b#3!J/MKM[\u001cuኔQ\",D\u001fW\u000b;n\u0018\u001aXYR \u0016vĿ\u0011].\u00196\u0017\u001cٽ[0!Z6ܹ2$F(\"7U@\u0017N4]\f\u001aXX}\u001f\u0019a*9Ď}놟\u0019>U\u001b<R\u0015ȟ>\u0006\u0018T6\u001fA\u0010p\be{ʹ|v~gPw\u0016@B\u0002a=ݭ,.Iي@}r\u0016vK\bc\u001en5V#>\\az\u0006H؆\"KQn[kI\u00165ۛ[9׾I\u0017\u00111>\u0018`#-\u0018Rnr\u001f~f֡\u000e \u0010nRRuvM\u00038:=aO\u001e*#,\u001d=F=7G4Cn'G!/F\u000eTo1:薢5\u001d7cZ\u0016\u001b\tX7QIGGN\u0007`Tv&'۝\u00187+\u0005ItɨӨy:~O>8s{\f\u0013<\u001cjv]u\u001c\u0006e|F2}]IԾ\u001d\u000eDŪkZ$G\u0007\u0010@{u\u001fx\u001c}fzˋMvrCOOsz\u001f\u0015;DU{\u001c+xIw\b]1#-R\u000eI99\fvO\f=TaїW^̭|~\u0007my5]/-\u0011~92Sfohq_׻4[>c?^eGY:ר\u001f\u0011gw!]$\u001a\u0011(.5M$ǲ=,qbX¼sUPk'6qNRh\u0003HR\u0012r\u001b\bmeYݏҾMmrp+\u001d0!B5\u0013V]\\ϊ%D\u0018ƚPp'\u001bH\u0016JH\bV'4;I \u0014?$j%c~M\\K,\u0018H\u001dq|O\u001csws\u001eܑb-[D̐ \u0012Tk\u0011\u0013e,\\ɉ\fRĩ?3ZTm'㝷[\u0014VW.ta3A$\u0019Z,~a[?~\u0015L6m\u0012h\\0RB?Z\u00175~o\u001a\"1\u0013WwUp!|\u0003\u0015\u00140\u0011;!_CV#3.\u0014KF?zTI\u0011\u0012{xr0\u001d\u0017&!(\":A\"EF\\0Q!!P\"\u0012+ ,<_#,L_\u001dh\u0019\u0016o\u0002\b{Pm׳WSW#m%Ȁ`\tIA!\u0014|.}PW/\u001c/+hnpq-D\u0006$ȏ&y\u0015%C\t\u000er\br_gRK\u0019?Uک\u0019e#-X{3dld\u0018\u0004 i*l}p'ē:L\u0013\u000f/I\u001eedS\u0007\u0017\u001c\u0018B#-<`Vߢ-W-{b\u0010w4,8\u0014/>h\\:%T\f/cY\u0016~֒@K6)\u0015\b6N\u0018\u000b\u00110u*GwKi3\u0018$Q\"JO'JV\u001f\u001e\u0015kU\u0005\u00135\u0003UdPH{%$\u0016\u0006\u0010G\u0007-\u000e\u001e\u000e>&=\u000f|/WGo\u0011|~>Hjz\u000b4yⅼ+G/~tW/$\u0017t/(Sk~@(/\u001c,l#ζ2\u0010A\u0010mr^w>7ۭr&\u0018*9f\u001c߫\u000b\f\u0004MdϾ\u001c~E/U\u001e\u001d䧲\u001b0jC;\u000f٦16\b_uXfÒZ}{x#UV)\u00024\u001a\u001eCF7k[\u001dF\u0007*\u0001 `\u0007\u0002xH\u001fp;#LZl?m:c\u0018鏷Rw.->X.l#-}-<ի e7\u001dx<#-&\u001a\u0010Rfx)Az\u001dT&|%.\u0012fh\u001cx\u0006\"\u000eWֻʍ55\u000eYd\u0010-\u0013ygqh)߯~@\u0014Yjy\u0006v\u0010\u0013\u00176ur\u001fXq=!VlLvo!\u001fwßn$l#\u001bRv\bHR)=N\fҿGt73Bˢ41Q\fJ\u001aȏ4$FL\u0003b\u0018?4#3\u000b:ld\u0001>S\"u#!ӋEF~B=\u0002\u0019z3[fGs'>Ι ̜`h\u0014阍3M\u0010\u0018 H#mOډs\u001a\u0006 $sd\u0015+x6\b<\u0002%סۘNPsLRbUM7|\u0007j\"sT\u001djꛠ\u0002ꈈ0;7Lwxq+\u000f_YMbQJ}vA3d\u0016\u0014E;T\bEE#,#-\u0015A陦D52b\u0003dI_ٳw~i+1c2\u000f\u000e::.]{.ޯfpsi#-xT{3\u000b3Gƚ/\u0014P?f\u001bti\u001fmʼrQuBU\u0004a~TrIx'S?Cޡ[yk[fA-x%F8N<_!Sߺϫ~4}+ӻ\"rmw>g=4}=~>z<#-fl\u000e>}'>gnm7VGd#3m9\u0017գǻ\u001a3ˮ6JE<S:\\W顋z5sXs\u000eNǆk-UgwW-\u001b^_<:;dJa\f\u001a<uȞUNVh\"Y\u0005umh=\u0005>N.S]:UU:k\u001c;9e\u001f\u0014츷5w1\u000f\u00155[\u001de<sˠfzX|`c\u0019\u0015*T\u001e\u001c!9\"<(}6qnu?7cuH\\lZtnQ?w}}\u001c+K!\u0019n٢\u00139\u0003+p\u001ezVpǭ2\u0015\fo%PJqvPܩ\u001e1\u0012Su|log\u001b>\u001eoA~_\u001a\u0011朗ѽSIR$#3\\\u0016C~\u0011Z\u0013\\W<&8ݶtِOU|jxAPe ʝV\u001b2}[召6mr<.ɭ\u001f}~yk|فO%Y)\u0015q_yǞ\u0017Wo_51/U[XiN\u0016YpX[ŀ^YrO]\u001f\u0018/n{k\u001fvtWm\u001e0ɸms}\u0018j˝ppG|Kװ3\u0007mٶaȗ|~lmٺ\u000fywXo?c|MB-\u001d^U\u001dT|߸&5yQ\u001d1N4\u0005\u0014PcTwpx/}MgCXHE9\u0016I?\u0002:>IP$M1\u0004Z3#-j`r\u0004ca\u001e$~hir\u001ao/\u001bz?fm ~\u000egXu\u0019\u0015W3kճN֔>\\\u001b1l\u000f㣠try\u001fy<?gemY{\u000e#-~,պ-㩴5M\u00177*O\u000fnXyN\u0014BbFj\f\u000fY~k\u001b\u0006~/!\u001f\u0004&4m=?vC\u001a~IkhA7)H}\u001d-|8\u001e\u001fu^\u0004\u001c#^{\u001fG4~-*໫\u001dlG~̮$.Cêv{_6՘\u0015\\zV'ɤA>JaP\u0014\u0018\u0013C\u001cf\u001bgd\u001a\u0010.e}+N3T\f2)_\u00074+xf.(Aj[\u0013ҷ{.jvS+/ʩIiӪqʜAnnmq~Y%9B\u000eu*7\b[a\u0005;?<'04Y$r\u0016\u001b%3[o尯>H+\f>.NޚS#-ҦNCO)\u0013{e:h\u0013ݰ\u0013]uso894N\u00104\u0019[Wvu#-۱V͕QC\"?GhϨò\"u\u0013퍬#\u0014;jj:1\\y\u001as\u0003GkNUegd$IK0C=\u00047˅ɣ]IW->R&eNnf-\u0016M\b5\u0018/;w\"[Ѩ\u00052ơcme\u001bwp\u000fߖq,odLlò\u0013~J\u0012| r\u000ba\u0018M8y)?6\u0005\frg4\t]1W<#3\taՌ\u0017O7^~\u001f#3R8IW\bK\u0007\u0002\u0007~sߗm\u0011Źˌx\u001a#-p<l{?-Ig\u001f\\|.oHF~x4\"\u0016}F8#-GӍzhc4G26tHrJ\\s\u001fQ``6\u001c0#ȃU^^:z詅.%w˻/|$yZ¸Z̹%`Ϟ*;\u0010GA֏u\u0018ta\u0011\b\u0014V$\u001a\u0002CcE(8#3*\"jDF\f6Ξ[k[\t`Ҏ\fLX\u000eVaHhYSI\bU\u000bX$cn\u0011nK5#3T\u0016M\u0018\u00148h\u000e\f$mE>\u0018\u0016\u0016MX\u001eɽfCr3\u0011\u0004\u001f?5aƤbiteFarx<Fv,=\u0004DQ\u0018Y\u0012)\u0002\u0014dOn[ rKμ\u0005\u0018pX8H\u000ed@SUce8̙J\u0004\u0018\u0016\u0011\f\u0018\bi\u0012&<6%\u0007g !ݿ\u000e̓\u0011([\u0017YR{>vOo>R#-\u000fՅQ^hJѢ%uVrIYLjKdx*~o.h\u0015o\u001dTb&[h1i\\1=}m.|\u001f\\R|y\"\\\u000655&HVGصx}?ӫ_3^BO8\bG\u0004w#,,\u001c\u001dZ'ӓZo\u001b?(]\u001f&R#\u0017q\f\b\u001e>\u00163]\u0014~Z\\\u0013Dgy>\u0016r#K|G䯧5=\u0015wY1ꬢTz\u001a\u001f'\u00030#c< j1\u0003\u0011f+?g61\u0010´z\u0019aҷ\u0018%hlR$P`40f\fDk/.\u001do\u001enn˵W)Sd\u00195۾5o|LHi<Җ\fL\u0007#qFA(\u000b\u0006E\u001d\bDaR4+3*YkJwb4!9^ԛ56l#0m\u0005\u001aM#,\u001a,\u001dLL\u000e6t(N(ô4\u0019#!8@(\u001a4AE<k\u0015u^{wIuY\u0019\t\u0005Y\u0005/\u0019V6i)4Ȫh R\u0006h3 Qc]Q\u0011i\u0012r\u0011e- B}h\\AJ0T`#3#,F,{1$֚\u001b (,iw0\u0013hD*x\u001e\f~*+vi2\u0002]Qji]@(\u0005&Z(\u0012@~B3Dr8W!kRTMYj\b\tB\u0015Er\u0018\f\u000f7?\u0011#3SUx\u0016}0z=smGTǯŞGY3niwysIFٗ}Q4VW-#UrU\te\u001cu47e?N6E}q:8m\"oיQhoVSs`LmKzgNAa=\u001es\"P\u000eW\u0002k\u0017H͓&^WtSiyj_m}UezsCTP;\u0016m2}7nR}_)AV[_lguݒpA\u001e\u001aQ^ 1ҹd7!Tf>'ϸ.Z\u0010.D\u0004Gv8]P9F\\e\u000fn\u0018>\u0013I(A\u0018w\u001c\u0002\u0012i_\u0003\u0018\u0016y*ŗ\\?,9`\u001b6/Dx=o׮9\u0014ls\u000fv\u0019SRi,w$8\u001c.\u0004E*41\u000bV#,\u0018Q$עx-U/\u0018v32̴摜#-vML;wM|N+o?)|#-r;Xw:\u0014[@\\\u0001bh>\u00172{;\u000fmM,yK'Pu \u001e\u000e;}imƝ&V\u001d\u0018beE[%t.]B\u001d$$.5}rh\u00103kYd٫){\u0014n;㌒K#q\f\u0019Z\u001a#-˭B[\u001ecZ2j[\u0018+o՝sShE_,r\u00109HQ;srgM\u0004\u0007L&%u6#c$#Ԉ#-D\u0004k.٤laYpvD1nB__ѫi??\u001d=_Dy\u0016\u0001A\u0010QH\u0018\"35aP\t֙\u0012\u0004S\fb\f\u0003#CJÆE5к\u0019\f\u0005e\b1DJ1+Fp##\u0015\u001af\u000f\u0007\u0010%w)AT`+Q`\u0015}C\"6\"a =^\u000bz#-W[-\u0005\u001d\u001bb&xf±y\u0019\f\u001avG\u0018*\u0018Ysd#3dL\f̖4\u0001OZ\u0019QT=;O\u0010[\u0011D\u0014\u001a]Q2P\u0003X0Ya\u001a)P5m\u001a<82\u001aF\u001a\\Q+\u000b\u0007#-nwh\u001a\u0019uV\u0002\u001973(h]\u00180h\u001cwV]C-dJVBAE1\u0002>2\u000f\u000bV.\t@62=7\b6L(:rY\"'N\u0011a@E]Uk#=}#·\u0012FT\u001bSheC#h\u001a>v?\u001d%4\u001e\t\"S?\u001eK\u0018\u0011=gg2q[kyӖvA\u0016i%Fv\u001a\u0018%.\u0007tIP\u000fWX-\u0015?D\b4Hu=:_=(\\a{8h$L\u000b\u0013Dpi\u00122$HF߾V#3vg|\u0018Z4!cKkiЁ\u00146\fl\u0003(5\u000b\u0012\u000fD-Tih\u000b\u001e#,X\biT079ڪ\u0006Y\\I\u0018N'Ʃ\"\u0006\u001cSZ$\u0014w&sǿ9??U(s9Y\u001eknkwg\u001e2Ek\u0014Ga/9&EJ\u0005Qx6\\l֕\b`8@\u0007\u001a#\u0018W:$cژH\u00105H1܃e\u0019;\u0010\"4(ƴ\"\u0011_`:+\u0016ӈҭײ\u0006Zl9D/5v\"Xf\u0011\u00190,\b0Z\u000exc\u001a\u0019߶ukT4XV\u000fc-#*V>\u0003btpCq#-m\u001f|9A\u0002d;\u0014BQ\ft\u000e1cN\u0005ZT&LŦ[\u0018\u000eX\f9\u0016y'r8҃H\u0019\u0005\u0014\"&쑍\u0011!(ֳRו$S*H#-3b\u0018Ⱥ\u0012PQLY)W\u0016j\u001b\u0019YG$Z\u0015\u00110ɩ4NX#\u0004I(9\u0012N\u0003lGq\u0010Vd\u0016cL\u001cprvaGQ#3&\u0015y'\u0016a9\u0017\t~p\u0012_\u001b\u001b\u0019\u001bF\u001b,ՙ!g;0\u0013vg\u0005<XV\u0006\u00124r\u0018\u001e) (\\\u001cmeă\u001bcFSxcnFTye\u00184QBU`B\u000e2@m\t(l\u00180vfX\u0006inUw~w\u0019+\u000f[$\u0006YfJn#-E\t`R#3#3ER\u0004˶ic}\u0011&#3#-(\u001e#-Bl\u001bFc[\\bD\bl7\u0011\u001b\u0006h41Lf\u0010LHˆg\u0017DJ-À%\u001aαgm3\f#͇&i^[2\bmGi3F\u0010iAp9c`\u0012`BL\u001dvP{V#-|m\u0001v:\u0012k]j]#-!+ʶK)vxڪ&ʆd4!v\b\\6-ܲ߁\u0018/\u0006\bw\bmhJ--umkr l5\u001b#3\u0011'\fZu+mog#\u0012+F\u0012c\u0011vqi1oW/!X96\u0002\u00031q]&l7\u0007L-R$j[\u0018 ƻ\\\u0014ٜ\u0016\u001bLO`Snݔ\u001d\u001c\u000e-LU2j\u0003-J\u000e\u000e&##,\u0002w75q1:v\u0016X\\#-\u001d<LE#\u00015xs,H׍\u001cYvx\u0017V8yف|_\u001bnh*\\GbJ\u0017\u0016_Nh><\u0013\u0019ؑȬNyIcܖ˩?\u0007..\u001a:v~\u0005.aw\u0011+UnwQo16⪌>\u0005g0QoS\u0007|\u001bTf]$;LO\u000e+KuN4\u0011:\fg\u0016쾒DyS3B\u0001!\u001e:M\u0014Y[:.ӎ9`(M8\"\u001eOW}f\u0013\u0015qDy\u000eA9곃/5\u00110b\u001e`ëC;hB\u0015\u000eڬ\u001a3Lii\u001a&rv\u001aOqg=oX[rå@cC\u0019Y\u001f\u0012dGxi͌I#e+!թ6-20\u0004|\u001eh\u001d\u001f.A\u0005;r(\u0017lcȣQ6\u0013N\u0003cg(LNT@T\u0015PZ\u0002iys|]N>\u001aJjzUxexhd&\u001dx\u000bhLY-VBc\b!\u001f2$?:/lvD\u0013ΥYP-I\u0017G2N\u000f\u001e\u001a9+\u001a<pG/<*)\u0007F\u001e6{V!ư(GUX\"#\"\u0017TG9gK-&_DaVH$kjߌ'X!w\u001fY\u000f<mQ1b7z|-9]Ge\u001cޟIh3y%\u0007 Z4i|]\u0015c gf0$\u001e[:a\\_̼ꄰ(\u0015mfk\u0010SO]\u0007ź\b\u0001a ѩ\u0019s\u0002y\u001c#,a63\u0018``[(:yp*\u0006\u00197no\u0011u։$#6\b!}:\u001d(4F*cV\u0005[\b\u000e8ᬀ=%6975#,Ln\u0003QUB::Vx4\u0017\u0016t/V-!\u00133\u001cl\u000e\u001dwk_R.3*ȿ\\ˬ\u0013.#3D.m<\u0011nI\u0012-a!c9\u000f\u0010c!A\u000bhD\u00132\u00145 ǍߟN\u001fnV05[\" #3;cѱP\u0012m\u0016\u0004Rilbyٽ39V$lɹ!B\t10JGof/[d#-%*o\u001788z DnAO'`z[W|0S\u0012\u00029\u0013m80EC)#-T\u0018\u0010HJMz6\u0017^;\\y\u001dx\u000eJf\u001dV$\u0011\u0007<.pߓ/10F\u001b:QE'uI<v+uxiТز[^O(5doM\u001eI#ێ=R\u00052~\u001aΑjCZ\u0011$VfS%z\u000bgeϢ(z`G\u0015=2ROmAf XFXv\u0012\u001d\u0003\u001adǗMƍ[HQI{7\u0015J\u001fx\u001c4S\u0012r03Y12֚?<ԧ'W0.Y\u000f\u0001gm|?L.%yQ\u0015t\u000eeܧW\u00180\b7\u001eo\u001cY<\u0019&;\u001f!\u001fk\u001fqC2nC\u000e;:8\u001fM\u0002n\u0018}\u001anY4F\f&\u001c]\u0011*k+\u0010\f{7#/=aϭ\u0003SháӇݴփwߎ>8oN\u001d\u00166\u0011D\u0004\u0015ڶ/texeƋoUT;I#@iBO\u00149\u0003o\u0013q\u0012\u000b#-H#3\u001eHIHX^\\Ym;\u0015\"\u0003r\u0015p\\\"]~ˡХST!޺vАzޟO6v1#\u0004]\u0019miI`r'r/i\b\\DRB#-\u0011\u0018?Tu-)2CYeyR[|q\u0018tL\u000e9(!WJgOHqn.?__Yo$u2\u001a(M:{3Y\u0017=8p\u0012=*^Q5\u001f~+ak\u0002D߶G\u0013iR\"'r[wa\u00043/}Ҕ_c6\u001aޚ}\\-v\u0013C\u001c'taڢA{\u001abM?1^{\u0018фmv)6wU]!ˬRs.Apµn%#q뻙o]5ԇ\u001e!\u001d\u001aqꦜ_̡^\u001f?\u001do{\u001eU\u000eC<gR6}a*b\u001bŚqo{ ^ٞN\\RG\u001c?\u0016Pv\u000fX?e7Wp\u001c\u0016LGSr&6rN\u0015\u000b@η\u001f+K\u001af?\u0018\u000b\fǹ$.j;1?O[I9\u0004H] \"\u0015*7VI~o\"\u001a\u000e؝Qn\u001br,e\u001bw{OLe\u001a]\u00129yW+mm;vr A0#-V\t\u0015\u000e 6\u0010>\tK4ygX壐q̳\u0014h=5mzX\u0013JW\u000fmqǕ.HmV3\u0017NNc3\u001bz濺%X+-|\u0007mR\u001b_9<o\\ԅ8w6OIsNst\u0014gEɆ#\u0017DҦxp~x\u000f|?f\u0016pZ(Ҿ\"n`\u001dm)KUښ:\u0017FoN_'\u0017N=ZmuWe\u001akr\u0018B\u000e\tm;p*\b\u0007\u001b\u0019:?%z_\u0017#/\u00147;\u0004)|9rh}\u0018;W%ƽk\u000e7Q8s\u0007\u0011N'\u001e{#,߮Fě}mlh|㍛m)6/i\u001c\\tyE²[\u001f\u000fP\u0011*$n\u001d:hm<H51$1Ȑ'z80\u001av7^dH\u0019\u0017|vW,$}:~\u0003z7Т7\u001d\t\u001b>\u0005\u0010G]a\u0018êfYKl\u001e1`X#-L#-`Z\u000f\u00111ǃ%fD#3gΣ(2\u001a\t\u0019Λ\b:m@L\u0014c-m-ϧ\u000e>ƛZϻ\b'#4b<''Kg`iPl\u0002\u0004f#mꠟdux}TvsfQR&6\t4#--\u0013Ol4Z\u0011:J!56F\u001a=?tۻJ;H\u001e\bt(_;v;5\u000f1tyOm27$l]l\"/uN'Y_Pm@\u0010n]a[Y`\u0005\u0016(N;8ۊ$N|F\u0019^Ac\u0010狪\bB%\u001cۉ²ڭkvQQ/E1_\u0015T|xyk`h\u001f9w\u0014\u00156kЮ72I\u0015ίi+#[R9+\t\u001ab-.LΤ)5(r+\u001bNjhxYM\u0012\u0015ϺM=^Y^;MM]qOIss_ٟ^__\u0011m],u\u001dI$\u0019'/x/\u001aj;reQ$o\u001dg\u001e\u001fu{e+򆲦ʲp{زI]Z8*((ˉh#3\u00179\u001cyHt(C\u0003f\u000fe/P̜sMzAI!.\u0014\"f\u000fk?^5?\u000boM\u001fO=\u001e:L\u0002$\u0004G~zm`яB#-rmyxϣϜB$S6\u0002ÜǶ\u000b\u001a#-Y\"[#J6\u0013\f\u0018BܫC=\"RO\tp\u0011}uUmu\u0017<NDkv${nُH\u001bʌ\tFјKd\u001eYc\u0012$R'vHM\u0011],-\u001e\u001a9ӧg]Q_=$V_>VdK7\u0003v&\u001fdi1\"]}[Θu_\u0018dPcpV\u001bE*<j9ɹx-3\u001bW_Kb\u0016QA\\sŧ^\u001exUp}=\u000ey錨[BO\u0015\u001aI\u0012vjg\t8]l?\u0005Zm4Ltnە\u000780sS\u0019f[\u00070WrӮ\u0017\u0015;\u001e\"޸R+g~S#3ZڛZohzchuO|\u0012/\u0017ըF\u001d\u001eʰiߜoYq\u001b\u000fȗgu\u001f\u0012\u001b<EIG 6;\\uk\u001eS\u0018gk\u0019X]>qp:yKQ6_޳4@S\u0019yǯL2\u001b@h7å{|oR\u0018F>-y\u00111y_|L_eڧyTCeX<C;}c\u001bD߇u\u0015\u0019m=}5\u00072z{K<n{fsLewn#-\u0018UV2\u001dyo;m\bxCA\u000bbj\bߖ&Ů\u0002ک\u001cګwa\u0016<H9$\u001e6sW<j,s/~Zɴg;@\u0006+-\u0007k?plvs\u0013\"u>\u001a4\u001bd)tyq9U,_8zGgEX9ꏞ5<Չqr\t\u0002}/\u001d:>w۵4/\tJ̌3Ql'H*l\u0016\u0005#0۷>/#֪\u0018s9\u001b<\u0011\fPmV%|z)\\\t\t\u0006񕵃\u0006\u0019\t0\u001c g*\u001ekz?Dz|\u0005\u0012;_O&6Rc\u0013\u000b&ЕPYk7\u0015cz:;x⇢cgq\u001e_H;\u001fƉ\u0013=Jlx]9{}ߴ*Lβ\u0019Һz>c\u0004'\u001e\u0019hyw/\u0001>$M_X\u0012c'CDf\u001a\u0010ٜz1\u000f+v~kcA>\u001f\u0005|\u0016\u000fsC4\u001b\u0013mG\u0016/\u001e9>\u0018/\u000f\u001btrR0SQi)*c\u0016N\u0002V)t[\u001d/y*ú/yG\u0017\t{Ƥդ%#nrZ~Z\u0012Y#-v>FzT\u0016\u001a]|ܑ@sXp\u001bt4\u001cb_<\u001fkOm4j\"c)r~)F\u0017e\u0013uo<!>\u0015\u0018q/x̧#3gb\fY^D;g\u001c\u0016'[ͳ~'M19z2kZ%\u0019.\u0017\u001e\u001aδ\u001bn<=#<\u0013W\u0007c\u0007]Wg,ŐMϪ\u000b\u001fGFzx̬7!*vdrmE#3צU\"=*zEԿk\u000eV<ʊ鉎;;GvۙLO\u001e\b=3qsDp\u000b8䊍\u000bg|W\u001b#$V\u00114G\u0006/o|^t]2\u000e7\b\u001bK7#3m٪L6kUlսdE^\u0006S\u0002cmM\u0018\"O(;\\l^}\u0014#3WY~ZxYZ\"\b̸]f`\u0014!㷖\u001f]1\u0014\u001fv۽kdܭr\u001eSຓU:uU3T٫l\u0001#-W@GC\u0016*T\"4_.wg\u001f\t8^iF̳wI\u001d(\"&\u0002@ATۊot\u0006_/3߇\f,#^?Tc<t#\u001foѯ\u000bz=>*i\u0005oR-;Kv6B5a|Z\u001fVy4N:=#3@q#\\.EȳACIH\u001e\f7&\u001f\u001f}\u001afg+'[/e4([ӌ!\u0006jέc.\u000f\"!\u0002wf6QH0GU莙\u0015\"h!+xT#3B\u001f2&ad΃\u001c\tR޲\f\u0016h\u000eR#3\u0005DMhDc7,O=P1\u000e]0|eɇUlw\u0012\u0019fqA,85:FpDIyv%\u000e|V7\u001f*޸WIRxwR$-|\u001e[fV4\\5պ\u0014\u000b\"ި\u0010[ug\u0010Ye\fh\u001eo\u001dt\u0012ڵ0#-2\u0012/cn,[]\u0014SqĴ z{8K=a8(9wDPW,z;߆\u0010\"ܱ5\u001f'\u001exl&~%\u0019N\u001e'Yni1u7d#3\u0002]淕%e@3|?\u001d\u0013z_auuX5e\\\u000bF?nlKNGCqּdKSPL\u0011uLO\b>\u0019\u0007PaZ6[\bX^f\u001e)MD\u0019\b\u0019ook\u0003Z\ts۝|*\u001bkz]\u000exGb;;.;EǴwΡ;a'/\u0011[ʩ\u000bܷBvUȔ1\u001b.S1kD!ӲSL1\u001b쪻u^hc[-\"8\f8-\u001b(6bT59=uo{>\\B1\u0006#-jY=ɠgYK,\t1AVn\u0013ԫk,xӻ*8/ަH3\u0010*a(#\t7i\u001e+L\u0013=6W+\u001fnyɴ\ty$\u000f\u0010=)p\fpMGHse\u001b.y\u0019\u000ejJejǴꤽT5`CN\u0014\u0019g#,@\u0012\t!d䣰}/*(lwy:A=.$đ\u00180\u000fe|VifXX$\u0011\u0018۱*X-}R\u001dё}rߌ\u0017&G\u000eќy\u001f\u000f8c\u001a{e}\u0018G5\\jƣ=p\u001f\u0005\fHK\u001cX\u0017\u001bO\u0012\u0012\u0019<T\t\b\u001dyl?\u001f\u0013\u0012j&/1\u001a\u0015h~z9\u0002'^z\u001d2ߧ\u0016jZg/Li \b\u001a4\u0012+Fu\u001dEc}+(O]M\u001a]<-DE\u0012s8\u0002Bazs\\MZ~[zNkreO%w:ej)_\\Xk'+LZ;\\J<m5\u0017:*\u0013jۚ:)\u000e\u001c1#,3᪨\u0013\u001bHĹ鿰I:pt:7\u001ft\u0017~T:x8QN\u0013C罞\u0011\\ፈ\u001f;\u0013Ƣ\u0011ݠ%H\u001d=wdo\fO%[c\\\u00164Jht`ňf[\fǕb*O\u001cz\tMj.4e6\fӀv\u001cv7ZRVy2׫qd1\u0006Q(3Wo陟'\u001e{149!\u001c?㛜\u000fi3x\u000ePƙ1MJg\u0018b!\u001959~\\b\u0007V#3d I\u001f[Ts\u0010pT\u0007Wl8>l\u0011\u001apLP8[>|pݯ^V۹43\u0004\u0002A Ѐ#,\u0016r1E\u001d&\u001d_um8{?[X[]t&icZ:1R\fuᢡ\u0001ⅼ\u001fLBVўW_`F#,Yu랻7\u0002dݴrJ;٩r\u001b?\u0017|f0\u0010x\u0016bCN\f{=/3_:%ouo9g#DDcLp,NY14Ҷ\u00021w9\u0010*)pΔ?ϡNF\u0007ҙb\u0011w4\u0004v\u0011ܣQB\u0013̥Sг\tm4iԥwN\u0016I(\u001e)4\u001aLD?<\u0001Ɔx1|z#ͷ/Vm\u001d\tkzpB~\u0015\u0007uL\u0010Y\fffA\u0004^D9ߔt2J\t\u0002\u000e\t<[imqn\u0011\u0013&Pބ~Y}\u0002ДZGp7wy\u001fѶmkpnr>\u001d[Zq\u001f\u0004\u0006\u000f^\u001f\u0017\u001e0[65I(\u0004\u001cL2`n\u000eŨL.%U\u00122\b2#3\u0014Rz\u000f;\u0003ȉh\bP}N\u0013,\u000f̐&W#-6!L)o:}\u000e=ơ:$\u0010AEc\" \u0019\"\t!˸Ńi\fG\u001dͯ.[jhvh>V;TyDj\u00154W%n\u001ea\u0011^\f7nb\"\u0015W\u001c&U\f r\u0003W{|\u0001&z$%2f|Sx4!>_ƥ#-\\KMh\u0018(\u0010\u0016\u001fPzLr\u0012qzf{!PL1ʔ8Ò\u001a\u000ehp6}\u001cgy\u0015rsr`@_\u0006`\u001bw\u0011γ?\"V[rz\u000bk]#-\u001ct\u0014נ/Irk\u001f\f\\9\tDIE\u0017EY6\u0001cFc]9)pVg,'d=TU NB oMR\u0005pM\\ל\ty8 wxC\"r\u0015gxBO\t\u001dx6\fѪشOӾZh8vB<\u0007,\u0001#3+!2ū]\u000f\t:=Q\u0010Ђ\u0003\b\u0019t\u001b#:\u0018\u0002\u0016߂\u001d\u0005(z \u00115S\u0013d>&2CCt:~WŔ\u0007q\u0015\u0013 vR\u0019\u001cY\u0016-0U2Ⱦ$\u00136T\u0016̤ȓu\f\\7\u0014\u0013!(\u000e \u0003J#,~ŀ!@h{\"\u001e\u0011\f\u001bFμwMsRHc&\u0007\u00110b.(\u0016g\u001a\fJDs7ʷ?J3}S*B\u0018\br{o\u001d=tͶa#-\u0006J*#4WF:c\u001cTf#3$i݃ԎaY-Uu\u001b%\u0018`w_@S\u0004<y'>ULIaU|ɞ\u0013Í\u0010@zt\u0003\u001d]\u001f#3\f{\u001f\u001c\u000fI\u0006Z#,gbb\u0015$-;pm\t\"m\u000b<$ݚ\u0014\u001fJg\u000b\u001d<S\u0011aӄCx9OyBRgU\u0012ݔ\u0002;>#B!^L\u0019E\u001a{ojسӡ2,\u001cȯc\b@ρ#3n^|::\u001e];of\u001e3\u000f.\u0015#33̅j\u001b\u0014BRv%\u001aCKkG\b\\g\u001a\u001b\u0011`!1'-$pbVȁP[NȭE}OUpna\fM3Ki17l{*PiҨpt$\u000fɺV܈f=@|}P'+\u001ar\u0001:g?\u001eʑU\u001e\u001c:\u0011-yK\u001aA+w?#-Ua=S\bp`K\u00121DP\u0015y\u000ed'>[z2}xqy\u001bgrťF٦i01\u001c\u0011~]#\u0019cj'\b\u0019aHh1K9QQ;<t`4\u001dr\u0011Pщ\u001b1\u000b\b\u0018.Ɠ\u0010Cy|s˒\u000e2br\u0013ԡӮ\u0006Z\u001bڭ\u000f@ LH<t$N<Ny]\"\u0019g3k<m]Cx)nu*:v\u001d2a6P,M2\u0010,\u0016|\u000f\\/{EJ\t5J-ɧ5Ou\u001bj3M\u0002=\"Y#3\u001f5\t#D\u001c!݌K\u0005\t\u001eu'9|\u000b/)dW\u001c7ì,\u0018|F4Ȗ2\u0004>l$].t@ȟ6\bk!-\u001cr8wώ-<h^\fj\u001f0[\u001c)H\u001b `aKty@ߕ0(WtŁn͛\u001bK\u0016޼!pBt\u001b3)龗EQH6y7P=\u001b\u0012sru9\u0007g_s\u0004ԃ\u001fF\u0012 KGf1}扵:=\u0005S\u0002vv<1\u001c)1_hn|;\u0006jp'cs#-/C;$0n\u00128\u001a\u0014\u0014[f9Stɾ:,\fk\u0003,\u001aZoC0i8`1?\u0001\fp&l@m;g<\u0015n0£u\u001b\u0001u̹\u0017\u001dw%\u0010c\f猟J6;{k\u000b#.~\u0019\u001c~#3k}Fc\u0004wC\u0003\u0011a2\u0006\u0010\tP-)ԑ'{֖CnJ(M;#3\u001a\u001fЌvr^)?+\u0004۲۟G2Gr\u001f\u000fX_.Y\u001dbsfR \u0019@Y\u0002>\u0019|\u0018\bQDfd\u001f76=ZE黶\\\u0011L\u0002Ɇ1d\u001b\\o\u0001!m#w\u0018#,]}C\u0017\thd2R\u0004G0\u001eڰߪj \u0004bj+;d\tn;h+.($Fd&8\u0003O\u0003J娃\u0019&\u001d7&gà56\u001e8tU~l&r\u001a UV]1\u0019!./\u0003yL@U[^(Ն[^xPjc:dH.t\u0012F\b(Z\u001e\u0001蒕px\u001dU԰s\u0012OqXO\u0007<`Y!;@9S9Qtt!N\u0010X\u001e\u000bi\u001c51\\-}cM68k\u001d&=qy{+7cV79FW\u0011/U]Ɏp\u001b[LP\u0007L.{jَWO\u0005kR\u001aq\u00055q7F\u0003[.NhL\u0018,8)/\\\u0005x\u0005*ׅ3M;2*Mlw3ta>VoU]\u0003\u0013\u000f\u0012\u001b dG#-~fe3EVz[\u000e!uSt8\u001b\u000fTե\u0016-%)t)ߙVh\u0007Pdَ2\u0005\u00060p6\u0010SF8敻\u00015ҷq\u00064\u00021h|CĒ\u0007O?_\u0016>J_8qg]5\u001f)gw'-t\u0006&\u0018\u001f\\֝n\u0010ViR{\u0018ԩ,\u000bQ\u0001J\u000fjwgt鴣\u0015~mv\u001bSB\u0013} \b)^g_\u0012cʒ@T?Ag\u0019s.\u001cBI\u001b7F1\t2HI$\\\u000ep-\u0014#\u000f .\u001fH@O~aT޿?G(b\u001d\u0015UƢ@QipbM0@W\u001662?I\f$ך+NM\u0016<`N<K}`©\u0006\u001d\u001c,9磘b}U\"^żA#3N\f\u001f?U~xj`76#$6#-\u0007FTчcQK/jEDT4D\u0010(j\u001a$kk2Py\u001bUZcu\u001bP#* <-8\u0018};Aݲ\u0011\u0014\u0012QbtC\"$V`Q?|@d\u0003Ʋ\u0002#3]TPQ~D_eM7zݝ@\u001b'6\u001dY4}4\u001b\t'MD^.WǩҒhu/2-a\u000bvC$L>5zLpgӄ\u0010ɂ\u000b\u0016,\u0019\u0006Ŏфd#3\u001cg\u001fPdt\t\u0014n\u0005'z!a\u0003<\u000fk\u0014Lr\u000bqCedP\u0010kk)Xn\u0001}@\u0011f\u0002\u00106\u001b\tg i锥4&#3A\u0002Y\u001d/H#rE#\u001a\u0016[\u0016#,\u0001\u001dD*\u0017/Jx\u0012%ѳxB,\u0015a#B\u0006\u0017!M\u001f!#- !m\u0012\u0014-yGWyyqŗ˕ٵ&\\rfd0\u0007E#O#-/\u0017eUQ\bB\u000e-_В#3\u0014HaM\u0003#}\bOI\u0004&\u0001\u000f\u001fmyz\t\tOH\to;Rlpff#-T)\u0013\u001aBLPEK\u001cf#hWYU\u001cYAƶz\" x<3C:\u001bLgs3\u0004luexuLK*\u0018ŋ)\u0002Ub\u000b\u0016IܖpM5`,M4dUS;gYgM\u0002c܂\b78\u001d<McH<j\u001b!]D\u0002Z㉏m4؂ݙT\u0018JbޅCvN:5YBti0!G&\u0018\u0012;5Z\u0007W=[9`_,>-\u001fY\u000f\u001e\u000fwџ\u000biah1BuW_g鵝g\u00020A\u0002\u0019h*@lY\u001aѪYlm\fDE\"Ae\u0015Pޚ́:!ׁ\u001edwY\u001c#3K@5ŕ޳\u000f\b2\u0001\b7 g#,*\u000b#,m$\u00023$Q@~d\u0019~Q\u0006\u0014νQ\by]\u00061\"0\"@pgk8\u001bJ\u0015\u001eL\u0010bMn>V%ANl\t-']ȜP|\u000bm5@\u0019.k@\u000e%r+s\u0001Fvu6\u001b\u0002Z#;6({ت1\" \t.p#[r8\u0003#,b$\u0013\u000f+\u001d}\t\u0013#3*}{MȰ+\u001d\u0019\f4**Q\u000ed)>C590;Xw@A\u0003f\u0016Y+QTUbդI\u0018&7a?[f\"$\u0004C\u0004\b7]6)1jRنT\"ID]\u000ebXn^\u0010u2\u0013%\u000ba\u0014\f\u0018ă ˛.P\u001e\u001e#3\u000eM%\u0015R\u00122f#OI!\u0005O_dϋ>{IPy4yT3*\u001cwϫ p`\"ER$\u0002G\"a\u0005d\u00035#-Fݬ@\u0013B+j\u001cL@!lo-m\u0004P7\"k\"\u0011b\u001bť<\\\u0019[`A\u001a\u0004\u0003QdQ\u0014\u001aatG=\f8G\u000bB:3q1#\u0016H~\u001c_V_Tυ\\+QR+\"T#,)TȂH\u000b^\u0016\u001b\u0003Ĳy\u001dpfk6X\u0001fv\u0010!'@>5\\\tdڧD\u000b\u0018x3#-e\\\u0011fT\u001co\u000e_sܘ\u001eT(Q7Bl\u0005\u000f\b\u001d\u001dxN\u0015\u001fokdkƒ\u000fA*\u0005A\u0003hd#3=o=O@U#-\u001ac\u0018 \tF\u0018;0G\u0013q*\u0005,\u0006\u0002\u000f \u0012&M*p<z'_q#lS\f \u000e^3 \f{+;:oJ4\u0001Ptΐ.&3\u0001|eUƹ\u001c}\u001fK*h\u001798(!@SuRWR=&L\u0012[\tt\u000b<F\f\u001aI62\u0015L\u0016mY\u000eE\"S\u0017\u0013b罡,J\u000e\u0016\u0010X\u0013GH^\u0015#3\"\u0007\fA\u0019\u0016\u0004\u0019\u0017\u001a\u0013w;!\u0019\u001c\u001aADC7n#-̳I\u0002\u0018\t[l\u0018\u0002$EJwx\u0013#3~h$!!&A\tyxK\"td⯟վ\u001dQZd>1{C\u0014~W2yѸ\u0006#3%#P\u0018FO\u001dn#s=/\u0003{\u001f|ۨϧ9-d=fQu:ᓐ2\u001c#3\u0019\u0005P{pv5\u001b\u0003׉#,I\u0003=\u000b3w\\pNwlcM-U#3ߊ\u0014WSXCi\u001btw$W\u0012\u001aG~\u000byJM-ǩlo{Ft(\f~H)\u001f͠\u001b5G\u000f!U'tERtU\u001d\u0011dߜB\bDH$\u000bn(H\u001b\u001e\u0010E#3 i*\u001amM\u001aK[\u0007#3Tw.d\u000bG\b\u001f\u001c`Usg\u0018S<]@W\f۴D\u00166B\u001cGt\u0017!\u0005\u0019F\u000bI\u0004,6k\u001e׳\u0018=qU\bg|q~J}\b\u0017k櫲\\~۵-fiw3\u001e#\u000ei8\u001cp\u0003R`e_@\u0019O͙Z\u0007Mc2Y\u0016~vtָHJr\u0019;N}*1N9ㆯٟ-lǚ!<D=ɳ@ψ\u0014jȤD\bT\u0012۝\u001eHǙ\u000eC}G)2DS]E\"Ņ\u0006bce\"J\u001eN\u0001.N&.5E+<b;\u0010\b3ޗd7^*\u0010j06CC\u00038iT\u0013T:>\u000eo\u0004J\"s@uB\u000eNE5XV#-Ӯ,GD\u0014o \u0019\u000e\u001d4,#ٶ\u001e\u001ap&1#-\u0004\u001e߁J\u0016{؋KK9\u0019ln@k9m\u001cYSJǓPp\u0016ΉXc\u0016įWam#-@)3\u0004Vz\u0015i\u0014&'tCG3\u001a@<Mma@Ӧv:6GYs,tj\u000f\u0006\u0013H&NK\f\"\u0011\u0019Ƶ{md#-CI\bM݇2\u0018?7uco\u0016Ȧ-'uRYJS4{־[_k/_[\\B\u001b\u0013CƦ\u000e2U\u0007:\u0018X\u0007ۍğ!\u0017l\u001d\u000f'vUv^+Ceo:\u000fp֒Q\u0011\u0012\u0010ܺ \u0003o\u0019Xl\u0005\u000f\u001eK\"\u0007Gy]iQ \u0017\u0004*ZQ\u0006,x\u0006G%k,=|t4\u001f\u0001)=\u0011dR\u001a\u0006.uʡ\u001c`A6#,ĳtŝk:\tB(TS\u0004_N(lAԍjE#,o\u0005\u0006#3\u0013qxYC͕~,ji\u0014E\u0017wvR*_3\u0004HkL|c\u001d{\u0014\u001bc\u0019̘իt{p$֍\u00188Bz\u0007IC(BƩ(1X<\u001cL[I\u000f#,\u001c>Ȑiyn#,Nfܪ\u001f\u000eC#,do1A_ô/\u001a\u0004Q!\fgj?ppg/N\u001fL[VX\u001fvg/$߭\u0006\u0016b\u0017\u001d\u001fX\u001fzz;Bo9,\u0017J\b\u001134|g/>\u0017!_$`fk@f\u0006f\u001fUU3(xRk\u001b\u000bxgmF&QO1m-K<\u0016ǳ|\u0013c\u0005GEQ*{O\fR\txW2usVCcb0?mF'\u001ftBN#'O6\f\u001c?k\u001cAG2\u0018p˻۩,)\u001f*/&nѢ1\u000bFF\u0010bcB2(S\u0014SjP_\u001ecPޑ0_s\b\t@tϒ\"2>\u000eX\u0005M!F-\u00126ZUn8AXJzc#-f~m.>p\bTֱ͆m6R\u001f\u0017?KCw7h0vv/\u0017[9l}/'^7ךHؠ\u001ah>y}{o\u0003a\u001ei1\u00103B\u0001\u0015>)˄\f\u001a{\u0017\u001cI\u0007=fdʇ(}mcGv4#-P\u0005;(_Y\u0003޸;lg\u0019t\u000f\u0018]\t\u0006X&L݉\b92,\u0015PF1#,jI\u000f\u0015\tr'<7WR\u001d$x6N6\"\u0019Znb]sқ1j)W\u0017I!\f\u0016C\u0013)Һ?h;8n.\u0005}\u0015\u0012GoY0pk\\Fӥ@fӜ#-LLLT>#)\u001d}\\>,|xwvd \u0013\u001fN΍bS!ʱ#W+\u0012\u000f,}Z\u000bZw~d+C5\".dw\u001d8\u0003n\u0017E\u001b\u0017e:(<cY8_cdXܗ\u0002\u0011\u0002\u0019#3>^>#-y\u0006'd6\bG\u001d}0<uj}\u001c^\u001d\b9.%#-8k.v\u000e\u00057v\u0001lZcIZ\u001c\u0018'MΝw\u001f?|c7F\u0014~\u001clu<*c*1+ȷBH3A\u000f#\u0018j7\u001a*&B%0z?4a>JǱ\u001e_4ccVz,CӴ@y|ԋ\u0010m_\u001eVm\u0010rn\u00114窨e5\u000eWgaDͳcgG\\H\u0007\u00027\u001f{Ww]G\u0012<:vs%#-\t1\f\u001c\u0017>\u0003,K2ibV\u0006L\u0019?/d8M\u0007\u0007\u001bf\t\u0013\u0018\u0010'b#\u0007\u0007\u0014#3G&}\\\u000byݯC\u001b]#-bdȓ\u0016̸-:\u001a1FP7ŲsS<eIN6\u0011VfI6h2n)FILܸ]O%XOJ-qW!#C2)23\u001e5\u0004B\b7{Mme\u0017.`fgS;b\u0007-j3~ c\u0016@YKABF\u0003 &\fӒIއ=}?~Ӄ5ǯh쁃5u#,^AE>!#ޣ8g\u0016K_\u0018z3\u0011קnӻmOtéC\b#-5\u000bգ-}|a\u001b\u001cMEq\u0004bi~k6\u000f!\u000ej\u0016`_򱂳/S{V5=pjyqկϲٙ\u0010\u0003%^tⱧ~\u0016h\u0016`\u0018ЛD~{7\u0016\u0004iOi}V\u001d\u000fUQ%M,k\u0010\\Y6@4s~}h|Teg\u001eMM)gLj@\u001fFؽBJ3Ƭ珦f5բ~n<\u001fܸ\tZ6\";O=(0VG\u0018hzipUusVWMy\fL|]&pT|h-ک\u001fǱy/#-:\u000eH7q'tә#-25\u001bלa7\"8#'ԝ*Ϫ\f/L\"ĦI6A૭;x\u0015m\u0010\\\u0010\u0018L]\u001f\u000f\u0001bHHB,iz#\u0006\u001f፿-BRT\u001d*\u0004W[#3dEA-\u0016\u001cxŬ%)lV\u0016_\u0004\u001eEr4GaЇ\u001fq[g\\gFP!\u000e<tI~/'UJ\u001d\u001996,!F\u0012XD#J\u0012Pyf0T{<h!\u001c\u001e*\u0013gtL?\u0017\u001eb#3ÅD\u0014\u000e\u001d\u001b~9k˞%SB\u001e\t(+\u0004\to%#-\u000f$lG8A\u0004\u0017[2n\u001a_\u0005ȗ\u0007t8\u001f\u0018$~H:\u001d{Dvo\u001c}}\u001d6pf\u00044a6-^\\{um\u0015s>D&}*\u001cFT)LlG7Q^^]#-Vq/\u001eTx,W\u0006;\u0012ttqaUg\u000f#\u0017\u0014y>:a\u0016A>WINQg^ljuF\u0014u\u000fS#\u000fºeA9&:X\f\u0018\u000e׬J\u001d[;\tuw\u001aiǖ\f%5@\u000e:\u0013,Ch\u000f*tyQCm-se֓\"ͯ#\t*6yI\u0004K\u0005^ie{#I\u0019\f\u00058~uPKzyI2D\u0010΍j\u001ctAylU!]\u001d[W\u000e\u0012\u0011\u001a#elU=u#m\"ߥ)v#-jjv1O\f3.)O\u0018<俞gYljGOaeE˿tr]\u000e3Oe!!ڶ+<QTv8җ\u000e\u001e\u001b .^#3:I<`{ٰw\u0014)\u0016z\u0011\\Q#-\u001e7\u0006ښw{vHU\";OceMjT?[~<29\u001e\u0012!>qkpDc);\u001awg\u00180Nrޣ\u000f\u001d|^GM\u0019G'#-j4[&DBg\\j\b[f)4\t+vF\u001ebg$\u0014~/כ\u0010$sqJPUyKs;\u0005h\u0005KCEJ:\"5;\u001e0U<\u00138CĎ#qͫikXя0xn\u0013\u001b\u0010ǙOT\u0019uԿ\u001a$\u0017f[w'\u0012\\<KO\u001avvqTѣ\u000feg=s&eCnxmϑێp\u001a!>Ĕ\u001bLЗ74{v>jH\t1ψ_8#3|\\-Q\u0003kGm#\u0007A}UHp)]m9r\t\u0018H[vAP\"4̈M+dy\u000fę\u0014V*ʟ`k\f<Z\u0010p2ڻb\u0012g=jY\u001d\u0002D^i/\u001b\u0018\u0014'\"\u000fa#-[x#0Y&u\u001e\u0013^\u000ft@.r]4h¡WX\u001ex\u001d*cX0T\u001c/ñP~yS}\u0004\u0006Q\u000eqD\u0006DvyZ~h:`\u0015ci\u0007iirw\u0015v\u0017}2\u001d.\u001c@j`\u000b\"#3\u000fgp\\LьqgZ\u0007·FI'˂\u001a!F\t=`9-\u0011&7\t\u0001_J\u0004+B:1m#G{\u001dLXg\u0006!s\u0012\u0006\u00114'C&#-S<\u0019#-\u0005V;0ǫ\u001a悔#3&:98h]\u000bc8ik-\\\u0005\u0015㷗\f,.wgmK;1j`}\u0006\u001d+T?\u0007ڟ1$ќvpGߔ#\u000fn>R#3+\u0011\u0018bai W\f)8&/\u0019xrR\u001cz}&L_4Q\u00150\\\u0001\u0002p\u0010\u0003b!\u0001N\u0004m(׷jm羋ʷr'\u0014j\"Ub\u0002b2Tg9҃\u00191'qKW:#3\u0015K4\bO\"29D||wﶫM谈-\b˨D2[\u001d\u001eNiKy26^@>Jiϫ\u001e#-kxdwnC̸C7C\u00020\u0012_Da\tr\u001dl1\u00186.m>_L\u0005\u0003O#,'\u000e\u0013\u00074d;\\?gI2ʱY?Bb\b\u00111{\"~\u0004\b/\u0018?\\\u001aQxr\bc\tvLY\u0014!OI\u0011\u0004c\u001e0)<9|\b\"L\u0003Z@ՕnG(`\u0012\u0006\u0001Y/\u0002ONy\\[\u0004\u0005<\u0007s1\b4ۤl拚;9N#3L\u0003n4\u0005\f['MkbIL߹\\\u0006\\Q?#Hqe\u0001#\u0012#4\u0006\u0017WUA?]Gt\u000bZ\u0011p\u000f\u0018\t:\b\u0006ǒ\u0010ՠfj\t}1\u0013H\u001fskS\u0013s@vɰQ\u001f'Vsd_9\u001dil\u0002N6ܲ[+'N\u0015:Tz(3eca\u001fQ\tc3p\u001c\u001aI\u0010&Ӥ$:\u0019\b\u000fw\u001ah7\b@\u001f\u0013}^噬'[\u0018)J4*TP3OFu\u0002~|\u0011]q(x\u001bX>\bHS?\u0006\u0018 a\tzO#9Χ\u0017\u0002g\u0005\u0016#3\u0018ɠr=/9\u0010.\u0011iS Y\u001b\t~|\u0019\u001a5~E\u001e:vs쏲:sxA\u001b23]5\u001d\u001c:S9$Hme]\u0019ZqQE\u0003\u0005PP5P\u0005\b\u0018(1$\u00043>v#u.\u001a;,wYLQ\u001cwUK(RNFz7+\u0018\u000e\u001796 9\u0010#3KA\u0001\u001fEu1\u000f\u0011nq\u000bgx2\u001eT\u0002i\u000e#-SS0-G\u0013E`ݤ\f,Wג\tT\u001dxG\u0011OX(@m\u0017fbeOk-\u0011tWVB&w=gcG\u001btۄ#-@\u0003L98\u0011j\"U⾢g*)k]TٯSEu\u0012\u0019GQZ;,B]#\u0006l9aK:'\t\u001baDe\u0005\u000e\u000en]jo;θ\f nǮ\u0012t\u000eظ5']\u0005<Ջ\u0004\u0015C)o]ç\\\u0012#-W63\\c\"%'kt9읇\u001c:7\u0010 I=yv!d<\\T;)k\u0012ƚͧ8^]0R8\t<W>mL\u0002714\u0010l\u0016zܐ\u0015W79<\u001d9A\t?\u0007:\u0015&a,14&y}Ǫ\bGRA\u0002OI ExU~DOVL!\u0004\u001circ\t\u0017pb\u0013$#\u0004!\u0019\u0006p\u0017O\f\tN鰏BښcU\u0011:bxh*Grf&#-f2J&fEVQfE*\u0018)J9iXʥ\u0013t74r8:d\bg\b *\u0012؀&e)HѢO.]2iA=B1/8SCIVQ^D\u0011\u001b\u000fz[] ;\u000f\bL\u000f\u0005jxWwuo\u0006.\u0012*SC\u001a9 T\u0012;*Np wFNzxC7K[_V`W?s=΂\u0004%21f»&[4iTR/\u0010\u00153I\u00128h(C'cS0S\u001a\u0018|\u00183V溴C8gN1F\u0010!w#k)w{sT>Ne~h[\u0012l󲖚wd\u0015MG\bAF7I}9QX\u0011rM.=<LgQ}9vsOȏ7ߢuנ\u0011[H\u001c,\u001d%GZ\u0014E\u001972\u0016{eav\t\u000f\"!\u0018b\u0001\u0010I\u001a+\u0017R%\u0003ߋm_m+\u001c\u0017;߳-\u000bCy\u001fmEj]_\u0005NS\u001cC#3X\tW!?\u0006X\u0015qN\u0010R\u0007Rj>.qbB\u001a`[a^\u0004\u0002y\u0013m7Ot͇4z~\u001eTU\u00177ZuÚs.Mt\u0007BL&&\u001b^2N$\u000669wJMm\fNQ\u0003}\u001bG_l6.S\u0006Y;TBI!T}\u0006.\u001b܊,\u0019ޣ\f/i\u000bt\u0018y=\u00037COc#-\bm\u0012TL%8\u0010i43`\u001e)2LקMz-)!m2` `aS^z_mJmcQ\u0019Xƶdz<ȽR\u0002i##3;7PR*&uV\u001e?V55q&９,C\u000f忌\u0014I\u0014ڕݥyl\u0019/\t{c\\ޮ׍t(5 \u000eȶEm\u0018b8#Fj()!&I$ɖ\u0002|\u001e\u0019xNs;1d޼DtW\u001d<r\u001cm`\u000bn/BG|Ml]/==߲_\"A\u000f\u001e\u000777M\u0011V\u0002\u0012uS0Cq\u00026ê(Q\u0015f#-/wmX|qit%w]\u0012a\u000b^[\u0006IUVCQm盧eĮ2d;E\u0019Ξǝn1\u001b:iIr t\u0003N{$U,>8UR5S`\u0019\u001a5pYg\"c0c5\u001f-\u0004\u001d=\t\u0002'V#-\u0002\u0018v'\u0003\u001d#-^[n\u000bFz^`#3~-g\u0017\u000b=?$[ג#oO\u0003{xL>ܴwxaKtF:Dwl뎪7\u000eo.|^\u00020H҇ҙ1R)F\u0019\u000bqq#,,>@0O!v\u0007#3Q47Df*f\u001dcS\u0016[3\u0002qL\u0005Gv5~cŴ d;'ү\u0015GLj\u0012\u0004\u001a}7bt>{ln_)A\u001b9d/?v\b<ۤҶJ(%9\u000e\u0014l\u000bK#?!;9P]\u0017vY\u0007;tc]G\\vB9v\u0007\u001eِ5\u0014#3>[JI-/9\u001av\u001dA\u000e\u0016E29>Y^<t\u001a\f\u001c@9 rhu%W\u0010睰PW\b9%lv\u0012Q\u000e#32YaN\u000e\u0002+x\\\u0016E\u0010U\u001aq<\u001d\u001e(o<o!\u0007\floNg{8}o#-M:Ad\u0018>5[Q>M\u000bG2o\u000b;}\f\u0006O.oFa#\u0005\u0010ǟن0U\u0016\fF\u0003\u0007jujEc9tblLad\u0014AHHɵk\u0003j#~b`d0\u0014mr*\u001aΫ-W<:;n&2udn\u0011\u0012\fY2h,\u001b\u0004_=-*o+\u001fr{=\u000b6vnd$\u0015nE˛F8ۑusr\u0019>\u0016M\u001e5-sg\u001fLX(rܘ/W \u0007\u0004¶&{9xֆf#,Vf\u0011۪n3qG\u001a\u000e\u000e;~NkOwMZyr+eMϾ~&fRU\u0003MrŰ)kԳP[\u001b\u001bQʶixa;3nlK><\u001d\u00061A&W?#3#3ˌȅ2\u0004\u0013\b͢./\u0017\u0017g\u0004򵇬!!\u001atiz+2-#3ǡC+\u0015Y#-W\u0017WJϿl\u0007p؛X\fբp\")[Z·^؊G*F@\u0012V=8#x| V9vb\u0014z\u0019=Xky#,#-sd;\u0019<$dX:\"b#3 'kCJ}N[/q_i|n\\\u0010I~\u001eoo$c\u0011nÚ#,JsVv򹼫CqM9/fyg_g\u000f\u001f˱*?/\u0018V?{׌\u000fZ\f\u0007Xӑ `VV\u0016Af\\e\u0016 8}\u0012\tG\u0016\u0018eT*Bt\t\u0018>y\u000f?\u000fW\u0002\u001f 7\u0004\u0001#,D (\u0014A%g#,LGZ*V\\K\u0002\bxjn \u0007\f$w\t#FĢ5\u000eJE\u001fZ\fK?9gsE&\u0001;\u0015\"g\u0003&\u0003p4<݈\u000e\u0002\t\u001bEO.G`<t7y MǛ\u0005X.j#-TB0~jQ7\u0015\u0002ل-uEz\u000ft-Sqԃ;Að:\u0019?Z\u000f\u0014t5\u0007t4\u001fDR\u0001\u0002\u001f\"v)Yi\u001d\u0018ܽϝ\u0005Mml\u0016k\b7\u0006Є:{s`<WpL\u0014\u0015O\u0014Zhfl|Uyi,\u0018D\u0003»!u']\b\u000eZZMV\u001a^RxƨPl\u0010]1`\u0005ܤM$@\u001d\u0005\u000b2GP)t~e\u000fA\u00065\u000e΃o.X\u000fu\u0003\u001ddާ\u0011\tZ,O4.}0\u0007j 1KQ=Ems]{\u0012\u0013D \u0017\u0014\t1\u0013\b\f&`<6幪F%!b.J\u0003\u0015h|\"\u000fj\u0006NV\u000eS\u0012\u001bq*HBfm0\u00115u>Gb# <~\u0015*N0Ⱦ'\u0004\u0019\u0003\u000ey\u0007y#,hq]\u001e\u001a\u0001Iײmލ7\u0003?\u001e`-\u0012$uـpbe\u0002A#3H\u0013{<\u0002\u000eCJPaR\u0003zfȱu\u0007U\u0018\u0002MO-A[ 'O\u000b0Z\u000eA\u0012#3#,\u0003}Ͼ/\u0010ٗ\u0011ޮO\"B6\u001cã\u0001曓|\u0005\f!K\u001a\u0004c!a\u0007`~p\u0010\u000f\u001fy %gՅH#?w5:$}Zm\u000b/xB`u\u0007x!Sou\u0011\u000f]wXt,¶,\u000e2twnwe;\u001ch6 NʡIEi( \u0004\u001bn~F5v\u001d\u00183>??m\u0001_2@\u0007\u00158\u0010ۮ|\u0010\u001ei&ɑ\t>3v\u001aqv\f$y:|F1\u0004 DG\u000bP\u0003Ql\u0010N3\u001bY\u0010nHM#w\u0004&q\t\u0003vA[E }kwrt7(\u0014\u0006U!?KJS/\u001eT(BJ`94\u001b8\bv)!\u0019\u001e\u001feW:r,\u0004cI(@zչZ(<O>s_)d\u0019FZgIQVvI\u000b\u000e|+z\u0019J#-~M$˭\u0019@?u\u0016de\u00176x;###5ِr\u001c#37\u0006px<0],\u000eE\u0011\u0017\u000ee뷩{}\u001f\u001fTS30#Z|ՃilٽtA1'\fYPE\u001f\\OC(\u0006\u0007rF\u0010oߍ:bؼlM]\u00108~\u00138/j,;Hb*p]K#,\u0016\u000eؕ\u0010@Z\"l|wBjA,\u00042\u0011rtD⒴X%\u0011F\bb)#-;5N~T\\ZK\u0010\u000fF(\u0018\u0011x,\u0007Ӑ\u0001cQ\u0005&K\u0010GR\u000fR??Cw\u001f/\u0012!\u0012!)\u001e7\u0013rT\u0018\u0019\u001c;\u0011#,nR^\u0012A\u0019(`#,uyh@4iY.\u001bCu\u001cz\u0016\t*7PJ[ZBhl0FDfIR\u000b\b0\u0002ƅ\u0005\u001aH35E:\u001e\u0002\u00016|GH`H$#vUTB\u0010#-\u001dܣܰ0~/h5{#,242=ŞеҜ˩!#-B\u00052\u001f\u001d\u0013u\u0007H\u0016\u001fݲP%\u001a\u0017?tTQ1ʗ\u0014i%#-XGߗW\u0011uWY;.\u0015cO\u0001\u001a\u001cZ2\u001cRC5Qa#3\u0007_$y\u001f)E17Ckq7&\u0015Lލf6@{y,|36Lt\u001a\u001f\u0019Y醻\u001e\u0002Ӆ!(ڨ\u001e*̨ik\u000bB\u00161\u0001d\b\u0010\u0016T\u0019\u0011$U?TWJ\u0007,\"t\"\u0019K]`\u000eLN/4\u000e것e\u000fs|OћѰ#,?\u0013\u001b-\u0013Hr9$H-j^A(o\u0019yU\u0002;=\tSPx#-\u0013Z7\u0019\u0012dN\"6أ+5\u001fuyb\u0012\u0013Z\u000b\u0019]\fHc8$\u0015]5LAޙWD\u0017\u0017z<:\u001a0\fQF\u001cm[(\u0012\u0018Hۂ`#-\t\u0005\u0018ьm\u0010X\u0006F\u001c\u001aÎ{S\u0007FB){̫C#,}\u0019@\u0007K\u0007 s@\\_-\u0001#3\u0010߻I\\n566\u0015ן?7z\u0003ı'݁ℏ#&&X8k8\u0002\u001f+\u000fNCZ8}(p<!Cne|\u001c?+\u0002ń+\u001c=X,\b/\"rlC\u0007.@|\u001enS\u000e\u0019!|\u0003\u0001l;-[@%(\u001f\u0014\u0014|\u0019t\u0007&ߠB [Ӡ}9\u001f\u001d'S\u0011 \u001dd\u0004\t&t\u0005X\u001f\u0015\bE\u0002\u0014\u0006K\u0005Hq<ޠk\u001c#,u\u0006V\u0013^\u0001}wV#,Q.0\u0003\u0010\u0017\u0016r\u000f/7`\u001cȂF\u0004Fe\u001e\u0011\u0006\u0015=c\u0011\u0003ˉ\u001cO}xb$\f!;e;PB}b#-{YcU \u0001DQR\u000fIC}\u0006O⇪\u000f?C\u001f\\\u00117'J\u001d\u0019->9$\u000en\"Db`gHB\u0007x?\u0002d\u0003n~0EA\u0001j\u0006\u0017\u000f{\u0007Kw~g\u0011\u000eC\u001e#3ǸS4F8G\u001c\u001f\u0011\u0004\u001b\u000f+\u0004R \\'9\u001a0-94Vǐ\u001d>3ÙM#:t\u0010SD);@DHBB\u0010\u001dkgO:\u0010POqB&=<S~:\u001c\u001e]#,f\u0016{'Ta\u0015\u00017>j\u001f\u0013}T/~\u0019wOAHF1m}\u001f\\ռOhxwv2\u0019\u000e^4O\u0015\u0014\t5\u0016z\f,\u0003\u0011SUW\u0001I\u000f\u001b\u001f2\u0007oP-rtl#,Y\"')'*ya\u0016=_J9\u0013yvt[mog(ddo\u0018]/F>B\"\u0015{8rTu}A\u0013dD\u0019]iU}1'J\u0011\u0007Pu=Hv\u0002\\\u0016lX:Pg\u001aᗬBni\u0007\u0019I!@Mst\u001dҢX#3\fL!#3]G$de\u000bblHY{bFWpJgSZ\")@V{}\u0019\f\u00043=J#\u0019\u0004UDĆ\fN2\\x$d9a\u0018Qz̺{Mz8 8\bA_\u0003~uI\u0004\u0003\u0002]\u0001\u0012`PpF-\bx\t\b\u0018,\u000f1\u0013\u0011ڥڪ`\"\u000fUn@\u001cV\u0017nxj9\u001bx\u0019yP\u001e:6)AS#,7v\u001e?t:\u001cFE/w!ȷgjh\u0016#,\u0013L`~I\"%ݱ?auaQ\u0018,#-\f3\u0019iL\u0003\u0013%\u0015!\"[iH\ffBX*ԥ\u0013X6N\u000fSL)\u0002Oғ[w#,襪wUX\u0006*#3?\u0013wM_\"\u000etS\u0005\u000eC\u001ft\u0011C~w7:CV,\u001a`\u00140\b{'S\u00176(ovY\u0004A\btjjX\u000fmGmѻ?ʼ!_!1ͣwv~'PR$$e\u0010v\t\t\u001aA\u0016%!\u0007\u001c$( \u000eJ/\u001a\u00188`\u0002)%$\u0018G\u0007APCHIi\u000fZ7\u0005֊\u0005l2j\u000f\\J.\u0007\u001fИ& \u000b#,@e\u0007U\u0001Ȧl[,\u0012MB#3\u001a#3H\u0001\u0006 @\u00188\"\u00134A3<~@(rD \u0001#-ZI߀\u0014Ov~<\b\u001fFiP\"\u0010H\",8*ҔAw0wޅS\u001fJwq5S2\u001fV;U\u0018\u0011\b\u0007\u000eI>s\u001fl<.T\u0010L1EP~{Zj0U\u001d*\u0014\u0002\u000b\u0011\u0018i2}=毧޶wj;q\u0002FĂFʦg\\\u001a\u0016]hg\u000eo3ty$gW\u000e30h@\u0016=A&\u001eJ\u0002gf\u001c>@%|(\u000b\u0006bO a\b\u001ac\u001aZ~h\u00106eTH\u0012$0\u0001@h0f,2\u0007#3B\u001dZ!r _J9ak5<<@vׇ@n:@ϗ\u001e>y# \u001a-.C;Ɖ\u00043lܝ\u0013'E,\\3pf=]=v\u00117F\u0004,rb`{gkjTt2#-,~\u001b\u0003yr\u001aJ\u000e\u000f=0#Ctr#3%\u000b=y$pU)X oX*W{{\u000f\u0018IqKR&FStD(\u0006\u0004=C\u001b\u0017\u001f{K~6\u000bb-3\bH8F O\u0010$$\u0010\u0007'I5}߃Ͷq\u0002\u0010\u0006=`-IŜBခF1fG(E\u0006$? P?\u0010D/]\u001cMIA)d8ϯ2\u0004!+rL\f@a\u0011=`vi}\u0007ay0BNG*8+w\u001e#t\"w\\\t\u0005\u000e\u0013n\u0004Z<`כŹ~H\\ҞfB\u0018oL\b1d\u00061dXШ#%-L\u0015;v1\u00167\u001c\u0014~fXyEB \u001e̿LRiH\b#3=~LSd\u0013\u0010T-\u0018\u0004\u0014eP`\u0018\u00181\u0012\u0014Sr\u0010uL~e\u0015vP}Y.QXpF\u0006%I(b\u0006\fL\u0006\u0013)5/En3,\u0019\u0019\u0007\u000b\"~cr;~\u001f#б֌\u00073VJX\"b8 8\u001b:a\u0012\u0005Ǩ\u0014<\u0005C|~ lXgin#,\u0002#,63\u001bCp`T6\u0010K\u0001S\u0002\t\u0004n]FD\u0001&趡h#-!snA\u0015\u0013\u0005\u0002\u0016T\u0011;vcG/]v\u001c\u000e%u\u0006^\u000eҺDQV\u00183\u0013\b @,\f7Ë\u000eo,^]\u000f\b@1K\f I2\u0006m\u0007F/2Eh0\u001c(OOι,\u0013傫7b\u0017\u0005%|~{i$h'dĉz8\u0014cT4\u001a4`\"(ܹ\t\u0016s\f~L͈5'u\u0011\u001fהlY>wmQ&~9ήgt&z\u001a]ƙm7\u0006ST<\u00076\u0016\u000f\u0003ec=\".s_g\u0001.E\u0006+Ū9\u0007\u001fN3I.E\tK\u0014\u001dvsw#3\u001e$\u001b!$_L-~@OgI$=@x)[X\u0018p\u001e\u0001p]?kەhEG5CJ\u001f\u0014v\u0003Cz\u000e-Ƒ#9\u0011\u0006\u001b0B\u001d.>'ƅ٘#-#-\u001a3$ʉ\u00042-Ql\u0015b`8=]/vk2/\u0012\u0011\u000f=I#3|_k\u0014wNio\u000eHÉޟ)\u0005e\u0018(_C\u0007dYHQKp6d\u0017v\fM\u0010?R~?a;^/\f\u001fE:6~\u0004uR\u001b\u0010tT6\u0004\u0007Z$sz׽7\u0014s󃷑\u001a$栓\bL\"Rr\u001etݒ<h:&I\u00056*?杝aq7\u0001B7![aف\u00021\u0004m\u0016\u001cھyh7sz0H\u0007\u001d6F1WL+\u000e\u001d\u0014kf\u0017>a=\u001epqF{)\u000f\tiGad,\u0004\u000e\u0005JO~>\u0006#3u\u0004~z\u001b\u0018\u0002Dϔ\u0011\bD#,\u0013u>\u0001\u0005@#-нOQޙ\u0014:\u0001e\u0001h\u0014\u001a޳:Ѡp~ר=#FX:e:S552'\u000fkC\u000bo`\u0017\u00050\u0004\u0013c\u001c.pn#-\u0014\u0010\u000fhsr\u0011p@\u0016\u000b!Q+__߹|{kgǋ\u0006\u00181(#3\"ϸYcft\u0013(\u0019#,<\u00147]):[\u000e0\u0004\u0019hF\\3Zr\\\u0010y}0?c0\u001fT\u0013TFk\u0019=\u0014$Elmaԓ\u0003#,X\u0005A\u0005&tiR5PL1,U\u0018?l<oPvC\u000fA*,Ҟ=hD#-\u0017ԣ\u00030.,\u0010\u001d\bv\u0010c\f#,|f]^ASp=~;I!]^\u001d&\u0004:7VB\u0017}\u000et*\u0011DbvQb\u0019\u0016څ\u000bLFveʫ?{[d+$F.\u0018F\u0005Y[?j\u0014_F[\u0012ì\"{Rci6#-<eRF9#\u00161\u001a<Ah\u0002(|\"74\u000ee3^*{\u000bwD\u0017[\u0013!\u0013|Oq\u0012\t\u0015WȢ\u0001kZ#-PܥYw*ɔR\\a\f?&\t#,Ƀ^)b\u0005Μx#,L\u001d}:F\u0013#\u000fEO0r23tFf\u0001\"\u000e81]}G\bEY\u0003rg\u000f|\"M<lVE\b20aE%iE\u001aXSe\u0006%\u000ewYo\u0011|#\u000e#cp\u0007\u0018\"vwt\u0013\u0015\t5\u0001=M*<B;mP\u0015\u0001RRȷ :|\u0004\u0010H2/.#-xf+ܖ?nǫ}םa?&{\u0014Gx#37aSv#:4-sS78$FYa(\"e`ɔP\u000f`d@Y\f\u0005\u0014\u00195#\u0018iw\u0003\u001aIzH1F*FU\u0010\u001a@V\u0004f\u0005\u0010V1\u0014VѰ\u0006[m𷷝kxRV0\u0006&\u0005bQD#,?\u0013j\u0019Cc7!#3\t-\u0004,\u001a\u0005\u0006\fAd\u00143_\u001fPbŖAI?U\"$#\u0002\u0017#-48+@ ގ\u0018./!\u000e(D\u001bߔP\b;Urne\u0003BGG0(`Ppp]#,!V*c\u0004>!}\u0016\u0019\u0004ϵ;VcD\u001aB r\u0018o\u0014\u000exCxxP\tęչ\t`DL7ZLnK_\u0015r;\u0006S)\f|O31\b\u0011(\u000bH&wk6\u0013\u0015d.+oHIP:Iw\u0002\u0013| ?p Ed@>c=cUiLQP\t\"s\u001eL~7\u001fԔh\u0011Z߬\u0013h\u0011HLP.0,)\u0019\u001d,G̙4iz/PP\u0014\f@M \u0016H(r@R\u001f\u001e#\u0018$IdR#3M_$D(Pw7HdC\u001aɼ@\u001cB;8nA[r\u001e\u00153g׶\u0002lj\u0014o;*ǔ\u0005!GV\u000e!?7قF[r\u0019Ȅ\u0018tt_bVH#3HH\u0016N\u000fƚJN\u0016Q\b\u0002\u001az1i\u0019\u001e<\u00068\u0007\u0011ѩ_zc7Q=o߶)Sm\u0007X \u0012#3@E\"('R\u001bk\u0013Ć#-C\u0001-09O,9K\u0006C^\u0005Ih8S\u0007J,a:`r\u00134ND\u001f\u0019{)#3\u0016UgUw2CtGNQ%Nˊ~H\u0003v\u0018c\u000b\u0004\u0012_wrɑ;-d1\u0011+aTGе@Y\u0002'θ0Ju44\u0017`\u0007\u0014[l\u000eE\u0018\u001e'sL\u0015#,Ҹ*'B\tI,\u000eA$#3L3#-ף,a#3p\bh3NQ\u001c\u0013\u000e]#-w\u001dD2Cګ5\u0016s&gAݞ;pתL\\Ќ*a|\u00048Lݓ7\u001c>9\u001b=:,D@F\u0007\u0013Z* m\u000f#_e|z\u0017{∿݈Fy4Tж\u0001,HY[\t8 Wa\t}Ivc>/'3\"7\u0019A0T#-}\t.<e<48wr飼E\u000f䵝uYf\u0015:u\u0013hl$ڈ'5Vu\u001c\u001f(\u001f\u000f-tn\u001c\u001b1dǏ7o#Z#[|fG\u0019\b\u001e#-\fVU`d\\uٮFEʊ\u0004S\u0015&#3#\u001f\u001e?{\tSkV,ۯ6vpN\u000f˰@\u0013%\u0013!\u0007:yly)-,M=Q*&6RPmh\bry,l^Dxvg\u00100;`CCl\u0017.1ʃ~9wgX;gbmy:>\u001d<#-\u0013\"#LM#-\u0003%ELѠԤD\u0005\u0003Bi=\u00139:}pClIL\u001cv,H\u0003El\u0018{8\b}3Uh8fUQZl¡ɂ|O{ϡ?_\u0019'K\u0004Gq!\u001aܦ\bk6YiRl0)]\u0015EV\u0016a\u0012whtHwՙף؅3'5[\u0005.VȽ;sJh}k?i7`X:K\u001c|9>=\u0011F0=d7qByXx&<H\u001a=y8\u0006M\u001aweAߥar\u001d\u0006\u0004;\b<ɂ2\t!\\c `\u0013ߙ9\u0016\u0014\u0004 %\u001d^-`;?՝o7Gd\u000eMs%yOfrdC\"Î\u0018\u001d?j\f'#ʽ6TӶa\u001eW\u0006G'_\u000f\u0017:,#-q\u001d,tսnd\u00191\u001c\u0018H*\bWkJ\u000b?\u001aŘNm\u001ad\u0014ޯ\u0016y4\u0019y#-t?g\u001d7HoDַ7IxSY.)y\u0017\fe\u0005{PElDA(#,\u0014\u0011#-\u00041]5d\u0012\u0017ԸP9E4!?E\u0001P\u0001t\u000e<U4Ma.eB\u0017[\u0015Sh0\u0010;\u0011#-<9!\u0015mK\u0016\u000fWZOoT@Z{`K\u0010\u000f\u00122v\u0019 rjGgݶ?\u001e[yoHĘ7k8\u001e\u001f.G5rΝ\u001a\u0013n\fE˔k3p0\u000fj%6[\u00183\u0004V{ă;#A`\\S\u0015\u0007LK\u001cqfb'2#3\u001eT_\u001d\u001b\u00109_Я&\u0010X;\u0003ޖ\tr\u001bXX10\t'F0H\u00033f<Q\u0015$\u0004\u0007\\`=\u0004:\u001aud&\u0002\u0010܄\u0019tnV\u0017p\u0018\u001etԟ僗\f\u0015ꪪhxI\u0012\u000fFA\u0002k\flkX1{\u0016aP[(\u001bA$6\u000b;(\u001c\u001eD)\t(B0\u0018!\u001aVǐw8;\u0010hvĒx=\u0010'ɣ\f&#-\u0001\f\u0016Ijx*\u000e=R\u001e{\u0017\u0003`=^\u000e\u0006\u0015Y\u001e\u0007\"Pz/_*H\u001a<*\u0003Ԝyf\u0016\f%Uxr\u000by+\u001d#-O?\fvb¨\u0012BdE\"\u0014\u0015KlYs<#-l\u0006\u0005EQUQ#n2P8\u001eè'].N0;y4+\f\\\u000e16o}\u0010\"D.[R\u0001Poy8\u000f8>'z\u0017=\\u\bg\u001d4i;@ =BxUZ>ln\t+vs5{bd!MyP2ǌ(^\u0001#I1\u0018\u001b\f5\u001a\u0014UH\u0018\u0003\f\u0018hk\u0018h5#,Kz4\u0018\u001a\u001d%\u0014w\u0007\u0007ޘ9\u0018z˞\u0005˛ W\u0001Ԟe\u0016KFfdf\u0015T\bQ\u000b0ժ1o\u001dǈesG%6_zCڻ!uv>^cVIkS\u001an-d#,S\u0010#`#Gt̼5$X6?m+CV@De40;vU[N3#-/wW4rI\u001f|LRXFM\u000b\u00025R\u0012QAQ,$\u001f'}r\u001d\"]vy\u0010pdM\u0001'\"$wչ\":&b׉8/\u0002|0a\u0010~l'\\Cy \u001eбNhjp7#-«!X!ho1ES!|q[jėÔ=>S!A^MiX\u0019gI*#-\u00043FFC\"\u0012D#-\"\u001a`6\u001c\u0006\u0012Җq#P!E\u0019\u0013%#,#BAA\u0003>\u0010ԉb\f{->d||/=LJ`6\u0005&!l\tm.Ër\u0002\u0004xa#-\u001aJ\u0003yܰD\"iEw\u000e>!~?zXUZ\bf)\tą˾];\b#-\u000ecҗ;\u000eK\u001aW[6x<\u0019Ux\u00114_\u0018q5mfsQ\u0005\u0012bK|!\u0001B\u0001ݲD2\u001d\u0001C:e3>[ldi;wmf\u001csl,|z\u000eVy,\u0017}d\u0003C\u001f\\kYjq߱9#ssⶳo;\u001a΍Tض\\\u0014\"l2ds\u0013>A4\u001a4\u000f9ur70\u001e20zK\u001f PF\b?\u0005\u0011˶ZSV\u0001Y\u000180ډ\u0002,;w׻_Wn\\9D<KT\u001b\u001b=9ɫR\u0003z6R`jܕˆtzÞ\fč6B~\u0015D\u0018L:\\\fg\u00139:,A\"\u0007\u0013p\u0016#-h\u0013$s\u001b\u0013\u0004<ò\u0011#,h:^\u000e\u001ak\u0005X[$5\u000b9]8\u00025\u000e\u0015nK죑\u0013d{#-6\u000f3ǤMQ\u0004 y\u001e~,5-w.fE#ߦ\t&OPс\u0007H\u001b8ǧ\t\u0010py\u0016\u00045\u0017s\u00109L6mt^\u0018\u001dU#-,HsH%Eh֮܅gc\u0011_|61\u000eR\u0006\u0017E\u00198,p\u0001\"u\u0006À\u000eL\u001de@4\u000b\u0007SKc\u0002lQ\u0013g{t\u0006T\u0012=\u0010c\u0018\u001d#-%\bb\u001d\"\u0019\u001bP=>K\u00069&Rvm8)<Mנ#-mƘOSXD\b1\u0016#3\u0014\u000fFnG8Z4۔K'z\bsbBw&#,2 dN\u0014\bV\u0011\u000b\u000fR:q%\u0005\"HnA'=΃Qt1\u0004΅\u000fB\\\\ #-\"I\u0014AS\u0012\u0013k1G#\u000e{׻\u001bX\u000e\u00024\u0013׊QlUeǙ2ffX3\"\f̒wur7/ͪΐR\u0007\u0016\u0019˜T%B\"a\u0005\u0002\u001d\u000b0cxU2I/C\u001dޡL1X\u00119\u0007;P==\u000bxkι\u0019)ӭk\u0011\u0011\u0011n\u001dD\foä0.ڪ祴uӍճv!4ΰI\b3m\u0003`MZeP\u001dDB\u001a9[,,>9j77<\f1\u0001S3)(#3<\u001d\u0019\u0014\u0014R\u001a0\u001dAtvL߃r}Ցddl\u0014ymF#R{b\u0010@. Td5)lNQmea\u0004\u0016\u000f=iU,i\u0007qL\u001amŸh\u000bHg\b@o2-P\u000e**,gR\u0002q 3z\b\u0007=)\u000b\u0006\u0002֍\u0010h\u001aH`o\u0002D\u00190*f\u0018\u00120.Ka\bsJǠkl:zN\u001cyS\u00156NA`h\"lgCǲ\u000e$$\u001fRAqa8J&D3fɯmd$3\u0012\u0004ޕMM/\u0016H<M$\u0016\u0002k\u001co-r\u0019b~\u000b8{\u0010\u001bJ(@b?F7#,&s\u0004x\u00186w\u0006R\u0010Ĳ\u0013o>p\u0007~Pp5F-\fN\u001c\u0010X$H\u0004;EMcLQ}rV5\u001dѻr`D\u0002CqԠ\u0017fh@a `\u0002o\u0013fq(~)\bV\u001eP\u0018v\u0017\u0002C\"f6#-,fSƱ\u0015GB#2`G\u0010$j1u\u0018#,F.\u001d꼜`_th{S\u0014B9}^{\u0019kdp7\u0003H\u0014h{1W#-B\u0004sXA\u0004Է\u0012=FEqm\u0018\u0013\u001820ѡ\u000546{ڭ\b5v\u0006kq-rMV\u00042`(ˋϚlwXmMR-h4~!{dk2\u0010F\u001d{\u001c˺q\tZ)U\fuh\u0019\u0018 \u0019&d\b\u0016y\u001c9\u0007\u0013\u0015\u0006b<ӳ=UȦd3tȌP{#,\u001df73),hD\u0012HNG)7\u0006{\u0015\u001743ة(,}\u0001\f9aecm]ꮪ\u0015]y\u000e\\\u0005\u000b)\u001eϿ\u001a`ed.J\u0012\\X)5sZ\u001bNcs{XYμ*׸\u0006\u0012\t\u0002\u001b\u0013>}p|7XS3{*&hR7\u0002V\u0010#X($F쏑2t#,cpY\u001cXN%{=E\u0019MYfL$-QM#-S\fp\"2LpO뀕\u0005qh]Ko3m\u0016.\u0019t#\";)\b\u0017卨Kfu\u001fь\u000e#-q_m\u0016?|B\u00151dUȿ\u0001bĸ\u0018~#-x ABP<<#k]W2\u001bp3\f(HM\t\u0010?\b#>\u0012\u0001#3\u0012_z\u001e֨S\u0002#3\u000b\u0015!`\u0018\u001dܧ\u0004\u0010=FA\bBboy4\u0003\u0005WUYeȥ1\b\u0010\u001f@Yg=JHn}#-\u0007)#,\u001dH4\u001fY\b\u0010!\u0010`a\u0015\u0001ؒLJ-oߥ\u0019@\u001bwsپ\u0002)p\u0005VV\u0018N?|^chAˀ ǧ%,\u0004'r\u0001*5\u0007IE\u001e6\u0001/\u001f%؊5\u0011\u0006Gu\u0002f\u000f\u0016E:WW奬bp:Hx-!\u0005!?Wp\"\fCbXZ#-#,\"\u0010\bB(H9\t˔\u001fT\u00021R\t)\u0011#,hu\u0019#,x P&\u0004\u0011\u001eカ\u0001(\u0018\u0004#3f\\?C5äyk1\u0011Q@RjTQDH_l\\\u0003Bp`]2\u0018\u000f6U\u001boy\u001eiY\u0019Q\u0019\u001bACcw\u0019\t;7\u001d\fU&?BJ\u001a|@\u0004\u0003\b\u001f#S\u001b$)L\u001dtZ\u0019*\u00166#,#-%\u001b\u0011(\u001aهm@Krpv\u001fΈ\u0002\u0006\u001c#,|\u0010\b\t\u0011|u\t\u0001\u0004FDd#,B\fB\t\u0011}F\u0007y\u000e\"\u0001\u0004#,A\u0018DF\u0011\u0004\u0002\u0011\u0005\u0011F\u0011\u0005`\u0004\u0015c\u0017\u0014vo6TK\\\u0014{mB\u0003#3\\x'Z50(0\u0010\u0006#,P\u00032Â\u001aHB\u001eo'nod^e${۷U^˗&&IywrƸx9撲\\;yNr\u001d|ɬS܅%R͕f3$l(\u0015&&z\u0005b)&H\\M?R\u0016^\u0012?\u0011TV+\u001e{-\u001ft&C\\:\u0019Ìz!çSM(c-\u0013\u000fn\u0017]2 p}\u000e;sj3ikx$\fr$R\u0017\u001f\th\u000bET\t\u0010\u001d\"!\u0002@\u0018#\u0012E\u001a|:#-(\u000e|ǧٻKv*#3W#3\u0013v\\\u0013eÙIЫa 8\u0019H9\u0006(rk\u0017\u000e\u0011Y\t\u001cR%\u00124B<]\f\u0014\u0019lD\f\u0019\u0010˲\u0012\u001byǛu.\u000e?aw\u000bkϭP8}\u0005''pi\u0015x\u0016CK\u001e9\u001e\u000bU^BKx_i/vt@T{q>)\u0007s2r\txDcU\u0016\bA{U&es}\u0007B/!|#\bQP\u0014}'3e\u001d\b&җ\u0003#,,\"#3-\u0001#-\u0001_l\u001f13FDC\u0015(\u001f\t!װDզ\u001dE,YO<0.B\u0005\"\u0018sOiuX\u001f}ߥZ\u0018u\u001b9ذ <<e·\u001fqu,D\u0015L\u0018\u0013x\"\u0011\u0010{\u0014-hljE5QR-iV!Jjda\u0018\u0004 #3AD}\u0007$NvI\u000e[|\u0004dE\u0018B*\f2*'ORm\u0010p\u0011 \u0014\u001d~,c\u0013}pSb#,k\u0018uV\u001e\u0019J\u0006a*ęzV\u0007,\u0010\u0010\u0002YPt#,L+\u0007&,\\L͸c+6}V(\u0013jM\u0001\t{M2#38`)D\f\u00110h!\u0015_2F\"f\u0005%_gٽl*#x%(\u0005\u0017wΈ֡\u0012c*\u0014dV2\u0018\f8d@\u0003,3?G\u001e\u0004\u000btD*\u001d;\u0012\u0001\u000e\u0001p\u001eD}{Әs\f \fXU_5EILnU%riLزh\u0002V\u0014-\u001a$dOU.vr0fNl#,\b2@\t\u0001\u00070WUu\u0017u>~O\u000fn9G\ti\u000fqpXx0;Y\u000fe\u0004I\u000fܜE'\bCGjGWn}_/f\u000e(cf\u0001\u0003\" K;m`JL*6\u0001\u001a \u0003zU\b0~Q\"\u0014S\u0002!DWT:p;\u0019A#-]\u001a\u0015* ?삀m\u0005D,\u000f\u0010\b,!ybT3Wd2z\u001b\u0015\f߄\u0018ͧ[>\u0003M%p\u0019d\u0015!\u0002\u0002D\f6>~R78\f}\u0007v6!Ohh\u001cp\u0001J\u001a\u0018m\u0018\u000318瀖+6;\u0004@]<\u00136\u0012?\u0019x<m\u0013#-v\u0003rbd0L`D\u001e\u001aƽ\u0005A#o'G|8\u0003\u0010^/أvaurS^vMO\u001f\u0004\u0004Sdn\b\"CM\t\u001fJodso\t.\\VSa\u0001a`nxrSxȗK\u00037L#\"\u0019\u0004w\u0004\u001d\u0005\u0003\u000b\u0004#3,LL0-Oŷ=59 -4\b\u0015H#-\u0018.q\u001eB?|f\u0001\u0018H.6W\u0019\\L(\u001a\b\u0011\u0006\u0018V۬XERDREX@H\u0004Q}%EC>AGzv\u0017J\u0001\"`ktf#,<=\u001fL<X'qYa\u001c21X\u0004\u001e=\u0005\"2)#3\b)!\u0006@z?8#,S1C(#,Ms@\u001d0Pe6\bΥ6 \u001f#3QHFŇʥ\u001c\u0002~&O\bu2\u000f\u001e\u0016@\u0002\u0001K 2V\bU\u001a^h1F\u001f0A|~xLlUC\u000bWpW\u0018!\u0012v_\u001f#3I7A[\u001c\u0010~ѡ{&R|_fK妎#-%qG\u0006Q>]\t꼷>\u0004\u0018}G\u00114h8oY~m\u0013ҍ\u001307k\u0003֛sn;\u001d\u000b/g6!D\ba&]xN_lC\b<\u0016#3\u0014LM\u001dzzMf2!7\u001dAΠ4jlK3{%V\u0005Y\u001cs+\u001d5!M\u001b{]+\f\u000ez395;Dz_|bƚۚyۻ\f(VnJ\u0017>\u0017;Z1!ˋ&k\u0001#-+vUqoK]\u00186\u0014#͍6s!\u0011:\bvԱ,\u00047\u001b\u000b\u001a\u0016P5jo#\u000byMZ[[\u0013_V\u0001iWk(/kշH\u0004\u001a\u0019\fs\u0013\u00071gaHf|#-`g\u0018roDnu#,40\\\u0019B\u0006 )6L\u0018\u001c5bD\u001cg|\u001e>\u001b\u0010\u000bk#-Ѻ\f\u000f;dMAK\u0012r\u0007#T\u0004.۸'Xw9g>(rʽw7tD\\H\u001b\u00159\u0004.]#3i\u00039xG\u0003`H3#3$cs\u000e;9\u0001a̜&(e}\u0010bjJPV\u0017zb,\u0004\u0019|\fb^$/ޯ#,ǞsRM#3F\u0006bFD\u001a,1ӭÐr#,|i8A\u0010]͓8e\u0002\u0002\b\u0019#3\u001c\u001chuB\u001fSAU5#wkбhm97QWBť0J˗=eVf\u0017\u0016@\u001bl_N#3\u0010\u0019\u0010˞^\u0006Q\u0015\u001d$\u0015\u0001\u0013T\u0003Ɣ\u001e2GLE-#\u0016\u0011\u0011\u0011,Sdݓhݶmw~Uw]kƦPŀE80d0/\u0003\u001bp#-\\;\u0018Y@I`D$\u0006\u0004\u000eI`\u0004X\u0010$\u0001\t\u001e\u001e\u000ey\u0007~=z{o.\u001b\u000e`\\|7u9<,fg\u0019B\u0004\u0004\bK0\u000bI~Ut٦m_\u001f@h\u001fD>#-(\u0010M7\u0005\u0007HD<!<(=7aur\u0007T\u0005#,&ƌ\u0010XS!4f4@{ݖ\u001c֊F8(ж#TP\u001d%w*Ca߇>W\u000153\u0018q\\!H\u0012Q\u0014\u0002\u001eiy'A:\u0010<\u001d@[z|jn]h;\u0011\u0001D)\u0005F#dHTM%l\u0001\u0015\u0018\u0016\u0012 \u0006\u0016}\\(a\u00033Ng:ۉmJ\u000bAF RR\u0010#3\u0018ABxb\u001fDP#,g-\u0012a\u0004*\u0013\u0010Ҍn|`.]yW࿈\u000fgn\u001eOw#3ҽl)<Hr6`#-Yr;D\u0016,1\u0019\u0003}yc\u0002\u0007Z\u001esؿ\u001f\"Zgx ݉`\u0016E\u0010\u00125ZppCB\u0006*&.Pw\u001a:w^#WߩMS<!xϊ|A[\u001bQch߈\u0015a_9\u0017M'\u001chc\\n$V3E\u0019\u000eP=g=\u0012䍙\u001b\\9g{ٷ!akMJI#-\u001b\u0014lпS(AUHe*\u0005|\u000e\u000e=P\u0019[\u001cJ\u0012)\u0014jԧ<N\u001aM\u0011@:;8.\u000e&1tٞ\b\u0010u@3~a=;i\u00108\u0006LʃLr\fS\u0004I\u0007(sY3\u0011\u001a#,o\u001a\u0016#-\u0004&\u001b(x\u0006h\bl.\u0006-\u000b\u0010~A\u0006\u0013![d\u0010\u000fXX+\u0004r\u0007Y\u0007vj\f-\u0014\"\f\u0018\u001dz5\u000bW\u001d\u0003f\u0007@@ȜJ3܆D1W3$ڪT\u0001#3A6+1U6S\u0005h8\u0016eFĈ\f\u0011R\f1a\u000b4f\u001eZͨl\u00163PA\u001150t\u0018PM[\u000eS\u0016\u00036%|ljo)\u001aMD2*I\u0012!!F\u0018\u0004d\u0011'\u001fV/y֟;y0ʤ5\u0015JNA86\u0005\u0004Q|\"2y\u0010_[[]\u001fYW[\u0018#-`\u000b)ޜ4s=,g<ddԻP8&h@\u000fgQ\b8oȒ\u0004J\u001cRİo8\u001bf\u001b\u0001#\bJ#hI6>80XA^^}b|Ia.\u000fiGE#\u0004Ԫ\u0015Fnq<#-h8\u0016I\b\u0014PKx\u001fސI!\u0015#-T\u0011:l2!\bӨ6M.%ϸɄζҿ\u0003q2A\u0011x.\u0012.\tbbF#n\u000fQ燏\u0010E\u0006\u00051\b,\"xVLCB{#3\u001a<0AU͋#,6a\bG\u0005\u0018#3\u0012!A\f7\u0003c$`*\u0017i\u0006#GC#2W`U\u0005\u0001\u0002/k[͡8}\u0011,Tk;\u0013u\\h(\u0007H?Kt%\bi\u001b\u000fAl'8I. \u0004G#3M\bB\u0006\u0017{P $*h2̜%\u0003d0'.58\u001b[#-qKl\f$\f\u0010;\u000eb#,\u0019\u001aF%a,\u0011\u0010{y\u000f#-ϖ\t f\u00060/؋% yޚh#-4\u001dj-I-dr\u0003cԌS.\u00066\u001eb15\f\u0019QbQBCus\u001a\u001a\u001d\u000ekmyzR\tn3P#*\b\u00120#Uj*=<^*6H \u0011 ŁcuuI\\\u0018kU\u0011Z\u0005E^\u0018\u0006p5#kR]tF\u001e7\u0004\u001b\u0006z!\u0016Nn\u0015b}`\u001euv0eA\u0002\u0005FE)bӛ_k\u0016@fAu}\u0006~w5:[\u001d\u0019\u0012\u0012Ӽ\tü\u0001,7\u001cTߠ̛,\u0006i\u0003\u0010[\u00046ӵݚ('55edM{]C'#P\u000eL\u0015(\tƨP5\u0019&C|\u0019\u0001;D+\u0018Z\u000b!02hv\u001a\u0004\u0016\f\u00181-\u0014i\u001b@(\u0018qDɖ\u0006LSY.e\u0010\u001dFdDҊP`d#-P{PB,\u001aFoUzx})ܞ[~4AŜ-\\\u00198ӑtb3\u0006ӛ5Lm%j\u000bRkx&o2i\u0018jd\u0003؟ȃ-]B\u000e8r\u0017(Z`%%0\u0005pR;zó\u0006)`!N\u0007\u00049\u0018o[v\u0001\u00041\u0002\u0018\u0001_4T-\u0011ݙXM\bD\u0012K벆%#3j\u0010Nq{.\f:\"X\u001cC\u001fmt3\u0003ψc\u0007H\u0010P&ҍ&49\u0016*(hC\b;6hE\u0007L\u0012ۆd+\u000e6ߜ6̥9\u0006\u001c*{.x7۶\u000fv4\b\u0006ɠOIK0T(>Pt0j\u0015G\u001e#,8Oac-&.ʢ\u0002'G\u001f0\u00034\t#,E3\u0006#\u0006}\u0004GӼn,nh\t\u000b\u0017#3.@\f%Z#,g\u000bZNf\u001aXA\u000beƐ]\u000bURX\"X@[7l\u0018!4D\u0004A\u0018@h=ɾaVj@X\u0004V\u0011R\u0010\\G\u0006\u0001\u0017#,\u001b6 \b\u0017&Zd\\~f\u000f^Z\u0005Q#2f82z  \":jy\u0017\u0006M;=\u0011jٳ$K\u0003xS\u000epG=RDb~W\u0003Ӹ{Q/4,̸\u0019ctA<\u0010 DI!\f\u001eKۧo\u001a#-fŭ3έ)`m[bb-UFڵ\u0016SkWk\u0012)\"#-\u0010HPϦxz<#30\u000fY\u0019\u0011_Ŭ&\u001e%J\u0012}v\u0003K#,\u000ev&vzQ9\"\bwɦ\u0014a\tL\u00143%\u0016-\u0007uṱ\u0019\"\bd#3MR$kv鉓ZM\u001a%hTfH#34\u0003jbRhEQ\u0005\u0014\"RXd\u0016\u0013dcJ\u0011FbRl&&diHiA \"1A\u0016i@~/q\u0001̧\u0015\t\u0010Ȼ6#-0=&4O7oF?\u0006$\u000e{#-,f\u000b?ii#-t>!\u0018]\u0006R\u0003|_b#-\u0018ޒ\u0019\f#,V\u001bv8\u00070\"\u0013\u001e\u001a\u000ef\u0012a,%\u0010s\bn0#,0U'M\u0005kBJG\u0006)ץJ\tǧ#-L/\u001aڒn\u0017U媬#3AT0рqf\u0016\b\u0018#-#,w\u001c#-r{\tc1ji)&JVe\u0002*\"fvo\u000f,e%0!Fi֯92-3[Oh\u0012\u001bI*dB\u0011ls\u000b}\u001bԵ\u0015z\"19!H\tνǳ>SJCˣϮ!v]%/USa]E\u0018#-\f~ۗ\u0004v\\{\u001b\u001c(\u0011,`7d}M\u0003Cf\u0013\u0006HHAd$\u0016,\u00103O.\u0016}l5}y%\u000ej6\u0006{\u0011\u0011pv\u0018o\u0012im~@Y`o3n\u0013$Y&D\u0012\u001d2xWIX\u001c\bq\u0007^uM8vgJcZA]&kM8\u0014.F\u0006$\u0013ףiL9<o\u001cᡷ 5\u0016\u000b&\u0011\u0002e\u0002Lu~\u0017k\u001cgΥ\u000718=9ᨂ/1eC8\u001b=\u000eM(\u001eyχ\u001eY\u001c!#uj\u0011V$]\u001b0V\tAza$-ȧdc3(\u0014Gi|1\fP@\u0018l4\u001b/)1>\u001d#30\u0019YZv;\u000bwR&HC̝[O]z!c\bK'\u001eկ\u0014x\b!\u00174Ӥ#\u0012zyh\u001aMo</)i?C|7xQ\f\u0010\u0013@]VT;Du^zofZ\u0015'ީQժ%&Pr\u0018>GB4μ/rh́\tyc03\u0017#,.z\f,Ҷj!Mk\\nn]\u0001TF\u000fO$$B\f\u0002\t\t\u0011qT\u0001W'|:8q0\u001e|\u0015'U=2QA#-\u0011Ѭ\u0019#3[[vG\u000bPHd5$r;˽^\\ٶ̓)#-S޵t8Y\u0012\u001a:fc\u0015f.2^By5\b1-\u001d,.K\u0017W\u001eZ1fR@KH'fhztJ&R_1/Bi\b;(*lJچ\u001630@id|\u00112\\_#3.-\fbbqO&\bX$zN\u00068\u0013R㩧YY<9Ŋk\u0005*3.Ls\u0015/\u00026i3Y;KK\fA\f;\fk\u0010l:\u001f:*Mx7\u0010ۣ& ̗\u000f(1\u000b43<oL:\u000fM\u0003Y.V#e9#VPØwB\tj^Vd+j5\t\u0006&ɦɃo52u/\u0003uynA۪fIgQg\u0001Y[ۣ\u0013Rd,urh L\u001b6.\u001d\u00177,\u0014A\u000fhb\"R\u0019~`MKLn:Q\u0015LY\u0013B<97\u001d;\u001bP\u001e\u0005N$}S^]{3u\\@I&èt9D7\u0002ny&@\u0004B\u0012I\u000f\u0015u7h2mscjÂ\u0011\u0010,N\u000e˱\u001bD\u0012#c[atqu^;\u0001ۍ\u001ft\u001duWFu\u001a'\\R\u001b]j\u0006)XqM<cak\u0011C\u001dMU\u0001(-@\"\u001eV\u000e؈b0\u001e9\"4\u0003@IW\b&D1#-A-j\u001c\"_\u001f|\u0010|\u0006CHPuMQ2M]{taGL\u001a\u0014\u00065rҞ\u00190պ:'\u0016t&/N؆\u0004\bL6^h\fbt-xGyeХCCL\u001dI\u000b33nίN<fqYt]\ty0\u0012)\u001bY[\u001b<\u001c`%prS\u000e\u0011;pk4䱴\\nYͶ\\\u000b\u0007Bf6A\u000bZ\u0012K޺\u0007a#8C.Z\u0012Vv6kPB2N`-\u000e>cEw9\\B FcdL\"\u0013kO<+& ڝ e4PlipXliҗZ9rE#-9;0\u0019#3>#3\u0007S\\S j#!b$GM68L7\"Dm}А4zр\u0011we\u001dYH\u0018&rD\b^$\u0019?\u0002-zQ\u000f\u0003\u001csj)l9(#\u001e\u001f.'$7?x8ff\u00053Qx\u001bNYլ\u001aWMa9t#3S\u0013kF0M16Nƴ\f\u00155#-<MH&ֻE{)cً&ǭ2\u001ei5k\u000e;F7-Ɏz;\u0014~\u00197\u001f!{Ҳ(>}nT()&XFRE۔=\u000b\u00067'hGy.\\\"񫿎oZ`k)m\u0016RgJ\u0018e\u001c\u0002E90\"l2[-+\u001bI\u0006F#-9,1iBQ90}F7\u001berWMk\u001dͲS\u0015pd5L#3#-\u001b-kѬlNqF0Q\u000fަnC#BdD\u00194\u0007D͹Ґ`^g1GAl\\9$k\u0005\u0012!Z|\u000b㣙\u001f*(Lٗ2j-C(0~\u0015ƶ3`E9h\u001a몗1P\t2F#-+\u001a+F!\u0017S;\u001cX%3\f8][TƎ3l(\\O\u001aU\u0012EEƉ1\u00018v\u0007r\u001e'i\u001bW\\v\u0005bw C$7\u000bt*I\u0016D#-uZ\u00199PdIBU:^|t5#-#-[˼]:#\u000f.-#\u0005\u0013\u0012\u000f9=\u001a\fkCE\u0011e\u0018\u0011\u001d\bq\u001c[v\u000en7\"|i\u0010ATi,I'\u0001Y\u0003͇~#3ISL\u000bbĻ5+Q\u0011*C\u001cM\f'R\u0006\u001elo[\u000e#-#3\u0005\f\u0003\u0015IWS'#32~B\u000b-%&J\u00063Yf\f\f*L&)䔀2\tV4\u0005F\u000b@]\u001cREA\u0016iY\u00136T$l/5,f̙@ݙ\u001c,ՑL\u0018=tq\u0018#32\u0004r\u0003gS+A\"ueҔ\u001eeْ&7AE&TI8\u0017`둜z#m\u001c\u0018lpc\u001b٤t&MK\u0010y7\u000eLI0u\u001e\u001f+h5\u000bYƂ\u001bwR\u001b\u0011\\>F2r4;utѽPP}RJ\u0007A\u000ef#D҄\u000f\u0006k\u001cY\tնxx\u001bb \b\u0006\u0016\u0014ƣ\u0013(#-\u000eјl2g1FNy\tZ0)\u0005$\u0001%0D\u0004r\u001b>+\u0012]\u0007D\u0019X\u001cj\u001f(L \u000e\u0014\u0018:\b#,9\u0007H#P[\u000b\u000b\th\u0007\u0005I\u0012\u0019X\u001dS9`+ĉ̉0oSBXۅ\u0006\"ǭ鎎Y\u001eb2Du\u0012 D6b=\u001eƁtwH{D!`fJi.\u0003(C8(\u0011^\u0010d,\f\u0010j1Fbizv7!#-Q,])TP(5Q$f$Y]rt\f\u0014;\u0014C3E\u0013q\u001c UQ>\u0006ȁ$h\u00183#,fsƌrRD%Ɔ]L3\u0001j\u0006YV/uw\u000b\u0018\u0011]\u0011]8\u000b\u0010(\u001at]1-\u0015$p\u000e\u0003q1Lh\u0019!N%\tn8\u0001c\u0003u#-W#-ݘl\u000eL&wUd#3791wE8\u0018l\u0016\u001daJ%ޜ\u0015C#dubg#3\u0002#,$\"\u0011\u000f`\b\u000f\u0002H\u00054\u0017-\u00017lP8RF\u0002_^~ d'H@\u0005$a#\t$\t\u0015!\u0012C}\u0006C\u0004\u0014@0\u000e&;ĥH\u0010pACt*PU(\u001a`1Ŵ%\u0001\u0002!*Aݖ\";F~YLʁA6\u0017H\u0014FEhٓv\u001cB.)\u0013v\u0016¥\u001cӋɜZVpG\u0003\u0006gC\u000e\u0017$\f\u000f4VёRF\u0005ox\u000e㓸2f|U\u00102\bT7{UCn#,9\u0017@\"\u0007c\u000e˂\u0006#3B1\u0007#P#,\\iPIPc\u0001{a\b\"\u0010D#, S`^>h%#-\u0003D0u\u0012㯩0&\u0007e\u0017\"HAhU\u0018={\t\u0003Er\u0006@'z\u001f(7\u0013z>y~\u0015\u0004U\u0012$\u0005n\u00104i+n*-_+08M\u001f|\u0010\u0012\u0007;\u000fl\u0010\u000b\u000f\u001d.S\tC\u001cO׀\u0011y\u0011c3t\u000f˕/\u0002-D\u000e7\"+~t%\u0016?V$Իf\b#,mh\f\u001esgx\u0018#-\u00017&)\u001ampX\"\u0003\u0018$)[L1(.YB{7\u0005f\u0003^\u0019\u0003`0.\"DhǢ2\u0005N`Z\u001b]-#\u0015'hΆ#%R==?XΌHȳ\"Q#-bf\u000b|\u000b\u0015-[\u0012Is-OAjX-Tm)ѵDIQKLDA$\"\u0018\u001a\u0001H^#N\u001eL\u0004>A-֧_\u0006KȺ;\u001dTww{gjBi.B\u001b1$BȈ \u001b\f0*eTA i+\u0016\u000f.8>h\t\u0004\u0011N>wkv];ݥ\u0007=Ɋ\u0005\u000fB)\u0005 \u001a*KD\u001f\u0007v\u001dw\b)=QhLo)Tc%\u000f\u001eD~v\u0016Шb)#,\\\u0015\u0014%\u000b1\f\u001aVnǚ \u000b Ph}Ad0M11(d%U00\u0018\u0007\bc:^0r\u001dg]ds\u0004y\u0013\u00165\u001e\u000bnq8\u001bM\u0011\u000313-34ZחF6tl2K\f+#3J\u0005XhXTPBB\u0001T^\u000b%,[pb)\u0010i}\f!]Lc\u0013r\u0010m!\b/g\u0001ћv\u0018g\".k(i1\u001bI\u0018#,\u0015\u001a\u0004I>!'w|hܢ\b H\u0016V(cbt\u000b>Q!\u0006u\u0011me\u0010%\u001b+D$\u001d?c#,\u000fc.VYgg#-U\u0005&U\u00050fPƈt\u000e]Ȋæg\bӦ\u000e\t͖e{aZ\u0013&دPdmcuq\t602\\\u0018p^7np/\u000b8\u001ak\u0016g\u001e3XXMBm7k\\l\u0004J2\u000bX`niJ\u0014gRFg'+tLRf\u0005HG&vFÝCPulaӆ\u000ffl\u0019\u000f\u0017ۈ;3T)DʙXv\fY\u0001A),g].\u001bA\faSQ\u001dQ\u001bEӳ9R\u0004\u0011[\u0016\u0014\u0014T\u001d\u0018(a1#3i\\#3pa]\u0018f\u001a\t\f\u0001a\u000eKp$$aL*d@!L\u0017B\u0016\u0007 3\u000b#-\bAP$$I\u000b(`\f\u001a\u0006\u001c\u0019/k裐l\u0005\\\u001f\u0010)\"/!B'AYwzV(\u001fulg\u0003E2b^?C7\u0006\u001fP~ss,'(\u00014#-x\u0007|\u0010g8\u0002Ehq\u0003iM*b`\u000b5\u000fr=\u0016H0L$2F(FH#3\u0002 \t\b\u0002\u0007\u0018\u0011Y\u0006\u0010\u00134>LNw\u001bZ;hs#3}e8>=eM\u000f\u001e9}\\mpՋ\u0015EakwF\u001b\u0015V\u0017\"&YN\u0018#IdjMyws\u0010o\u001c|zV.1NCTc\u001a\u00066\u001d\u001c\u000b\u001c\u0018#YNu685JD\u0011&3\u0014iyo49M:BRSKH6$4과\u000e\u00136\u001aav\u0019\u0012g\u0018S\u0011\u0017Xѩ\u0018w\u001fZaWL+9.-\f\u0007.n\u0010\u0014dLܻ\u000f\fi>4lxWLWSB\u0001ҵĕ+\u00105\u0011\u0018%xn%Sc\u000bĢ:\u0014}MJrYgLq>0y2!G\u00128瑤;!EcY+@\\Nhcr'7#,f$ Y\u0003\u0007uֈvYT-vY\u0012#-O\\\u0001IC\u000e\fĵys|ث^y\u0017&]hDRPҌHd\u0004Y.(P\b\u0011\u0011C\u0010\u001a9Ȕ_\u001a|n\bQ1 K1\t=.q:uΙw;'\u0019:2&ۭ]\u0015wv\u0016L=y\u000b\\iD\u0010$YѦJD\u001c)E6+Qm\u001b\u0019Miț+\u001bcjjQLRP\u0012\fH$HE`\u0011\u0015Y\u0012\u001e6w_\u001f)`4jH)\b\u0004DH#\b/\u001b=H-\u0016\u0007u&#-d<,\u001b\u0005 %Dt6\u0014\u0012\bwA`O\u0003X\u001cn\u001d\u0012N,I>'X\u001a\u001ec\"\f;OaK\u000e,=\u001a{\u0007\u0003*\u0016*&C\b)\f&X5q\u000f#-\u0019c`kFf$HA#-L\u001cw\u0004gzt$x\u0003>=LCs\u0001q9~?\u0014L^\u0005#3Ҍ1!u#,V\u0018d\u001a\u00133EB؅\u0005DXR#-BDt8Q*춼#3S8\u000bGӎ-3t [n۸Q\u001cj!\u0006AgN0\u0014\u0006bK\u0010s\\mje2+\u0003\u0012\u0005@Rőrtv~\u001eU)\u001b<l\u001aԺg$u#-ۧ;!v\u0002cO#3@ EӍ\u000e\u000f&S\u0012ؽ/\u0001N芗 .\u0005卒]k\u0006{\u0003PTp`d\u0017\\\u0015\u00037\".IpH:fsSmGZ\u0016<_\"2m&^#,\u0012\u0001\u0010R*R\u0004\u0014|}B\u0015|\u000fi\u000bN\u0010>\u0015\u0014q\u0004D+F3?\u001c6$ac\u0015kĽ]Hcj1\u0011)TA&FU\u001bI1s4biԌM2f43!El0z\tZL5$ȩ-\u0014kTԱ{Qwt-jv(RZĪYV+c\u001bM&*jɊi&\u00155mBU6վU-\u0016\u0016y^\u001aY2ie\u00196f٭kf1\u0015iS^utM6\u0015]&]em)1+hKZIK\u0014A\u001c:噭{qB1ῌV\u0015*}_6z(߃7f),\b\u000ft[ģQ\u00050\u001aOR\u0012sr޷Ikykk|h7if[)5Rvj\bV\u0004\u0011\u0015h\u0018<aL\u0012$<[__vJJƶpd#,P$\u0014#,\u0006 n\u000eD҂>\u0002\u001cĈ\u000eA*#3\u0001!kKfھ-7F\u0012I-e6զٴٖJhIlXdhIR%\u0014\u0012\u001bMD3e36S\u001aQ%%\u0016Ƥ&\u0006e24\u0013IMH\u00136$-6FY6&\u0005*+6\u0012kJ#-\u0012LRe&b2ML)f65DdHڒeSZԳIƔɩJe[%Zwkli,JJfJ6SmVUQUjhSloUrIF\u0004\u0004\u0006I ,\u001al{ä}b:6\u0018[7777X\u000fm`cB'~烁V\u0013b\u0002'{vг*K\u000f`n{}r:E`~\u0016{\u00012\u0002؞o\u0018O<8Gtz!\u001d\u001cF+c][:\u0016\u0001k(&c]\u001dc'V\fc\u001eD2B\"Gp\u0002-m\u0004?*\u0004\u001c҆Q2\u0017(&JEa\u0002ł)Ti\u0019C\u0014usI-/\u0006\u0002oo\u001f\u0017e~\t@M\u0005*\u001egq\buX\tyt5\u001fVj܊F#,\u0012>ܓ)!\u0006c7a~D&\u0004]@C\u0018%\u0015[^\u001fud-ćIa`squ\"y+\u0010/T\u0012\"ǡ\u001fP<|.\u0013\u001dI`Q}U\u000fYdQDu\fu$#3#:a\u000f'k,1B2\u000eN@J,og*/b\u000e#\u001aYTp\u001ah,}/=Fw;\u0019jOIʀ\u000b+Ċ\u0018@\b\u0012+#-fWvE\u0004 yw#,#,#3U\u0016\u0018\u0003.\u0005QJT%I1(\u001e#3W\"\u001a' ]M!3\u000b/>\u0007:28FNb\u0019\u0011\u0007}N;w\u001f\b\u0016\u0012D\u0018\u0002ɱ\u001e!c\u0015N1£vZ3C\u001dD{P=\u00072x.J$MLkr\b0vYxn\u000e\u0002Yp{`I\u0010n?>\u0013#,\u0003\u0011\u0006F-?oV\"Ey]ъ\u00140VI2\"\u0010\u00021\u0019(.Y\u0018\b\"bVKِ#3\u001e#-\t|uI\u001aa#)iLΌ\u0018\u0016hA3\u001aݎB#-vKIp`g\u000b)!\u0019՝҃J@KIi\u0005p\u00195\u0016\u0015M\u0014~\u00180]\t#-Xa[\u0005U[oҀ#\u0006\u001a/#-|pY\u0001 i)\u00119n=y#,\u000eA|¨4\"\fJԙSU\u0013\u0016*\\,x\\H\u000en^J]>Ո\u0013 Waڤ7\u001c\u001e%B/G|/#, \u0012\"mtC[մ\fCfxI\u0002\u001f\u0010~Fe\f#-\u0002'9e$\u001a`GO57\u001blGM\u001f4#G\u0002urs\u0019y\u0015p9yg]<\u001a\u001e?wBP\u001d\u0019\u0010@P^\ti8,\u0019>s\u0016\u0016@Y[U+:>۽10y\u0011S糝cQP6\u0016M\u0001+!]\"Lh\u0003\u0010e3\u001cV\u001fe\u0019\u0011\u0019-t<ȆL&5\t\u0005$\u0013rixe\u00183\u0015'\u0007F$Bl~<eYַ\u0016;O|\u001bCMR\u001e\b\u001bzT;\"؁\u000bef\u0019Qjfvimlc3)\u0002ŀ\\*\u0015C!\f(<EsQ\u0010\u0014Ci\u0017qq\u0019:։ Q\u0014`\\#3\tBCa\u000f|\u0019\"7+}b\bON2hnT*p9f\u00038ɖĬ{\u000ed@\u0019\u0018@`jhQTIqjs3#-\u0016q\u0012$\bKlsfA݌\tAɛ+\u001e\u001c=\u0006#3z\u000e%#,%a:(\u0006I\u001eX/1Q\u0013A}Y/[#-Zu@UDh\b'\u0015cgiRHa\u001a{>ܽ\u0003(?O+xǉ\u000e\u0014e\u0017S,\f7̹wDgQ{\u00046#-\u0015fC#,` \u000eW\t$M9Bc-I\u0010;O\u000e~5ٜ\u0015\u000b>\u00047s:5\u0016\u0005\u0010P))#3+\u001a;$W\u0010\u000e4Rp\u000594cT &Ž9\u001f Xw/#yH+,\u0004\u0002v\"\u0001@Ӊe$Y R;m.txw}.6r#{+\"z;&\u0016\u000eqH7=%k4#3E\u00135H*\u001a1h\u0013\\\u0006\u001a%0TҩМ\u0019c2zŮϖwIK\b۫γ\u0012b7\u001ex-rR\u001bxor\u0012D\fA\u0006툔nQHcM3 eIZ&\u00197%AS\u0010ŏ'=#,vz^\u001d\u0012Z\u001e@/]z\u000f}Æ^\u0013_>zɌ8\u0004~\u001b\tqozem\u001cE\u0012<#,%&\"\u0003NtS\u0017$˵*HܾAfv${E7)ɧ~R\u0010\u0007\b\u0002\u0019dF+\u001e\u0010\f\u0010\u0014R]S\u0005c#\u0006Ng#>n,\u0006)\u0005\u0002\u0014\u0018æ,y\u0002\u000fS̀\u0003\u0011V=\u0017w]%ܤ\u001c\u0002Z\u000b\u0018\u00104\u0012e\u0005nAd\u0005\u0005&4ǨT냐\"c\u0018\u0011cPPF*\u0006\u0003I~;O\u0006-\"!\u0004\u000fae7gv󙏟ߙU\u0018g\t3RMp˻E:uf\u0015m\u0017^\u00020\u0001#\u001f\u001b]\t\bX֊hT\u000b[\u000e\f\u0002,9Ԛ\bk\u0013\u0001$\u0001K^6i-XٶY3馱ZWr+\u0011E6ѭ{J5ނ\u0016\fT#3b\u0001?V0\u0002$ D01,3Pa;46f\u0016:X%XE\bX\u0018D\u0006Zq16H'ކ.oU\u0017\f-\u0006AӖj`Myc\u001a\b\u0013e\"\u00147\u000baK\u00103\u000flh\u001a\u0010X(\u001b\u0007\u0003%\u0015#-\u0014\u0003\u0001\u0003\u0014&}T DHi;mc쪐c#\u0018#ŧ;-Ffi\u0011<;fuђ\u001f}SJHHE\u0001!FIZV\u000f\u0011PE2FF\u0019jԗ\u0015`\u001a)z/T\u0004\u0002 h\u0019P~'&E@\u0007QRA\"u\u0016,Z?-ܕ\u0007L,}\u0017q\u001d0E0#3|\u000bF@QU#3?%j%nqﷄYͤl\u001a\u00120U\u0002A\u0001:\u0005T>ߺH#,f\"\u001a=TkZu\u000ef</O\u0013񋉪k\u0015\u000fnoI|8l[m7\u001f5\u0019ȇ(\u0014DB\u0017|EB!w\u000fB:\u0007gb\f\u001a5Б\u0002z{\u0017\u001b\f[\u0016!(&Ct\u0007>`\fP@@F3\u0019\u000e3#3jlA#,,y+Xz\f-{B\u001e*\u0003\b,y\u0010\u0010\u000b]fmڨJ-nV\u0014\u0016\u0019\u001b\u0016b^\tQ\u0010\t\u0005\u0006$ؖ#,8k}\u00112\b* *\u0018\u0017)J\f\u0004A\u0004#3\u001cHrGLt°ƃ\u0003\u001eѸ\u0018r\u0012a\u0013zSܔjNg\bN\u0015{\u0005\u001f\u0005T\u0014 p!uWW޳౼k\u0005?\u0013\u001f)\u0019B\u0007~Ot=쵍9k\u001e:k\u00144\u001aX%oy\u001ev|'`93o&\u0016Jwk\u0004&\u0003ok\u0002d$;T\u000ê\u0010R\u0011.\u0019\u001a3םW-U!P1좿)\ti6H\u0006~i-hsqm{5_*0[5z$\\ks] #-\u0014\u001b\u0018\u0003i@\u0017F\u0015!R\u0014WFn0G&-a% BII!Ljˢ,\u0014#-R,\"nD`3M#-\u000e8c\u00141!䴗:knGƱ\u0016zj/\u001a\u001bX\\ h\u00021Zh#lH2,@sA(\u0002\u0016֤\bn;$#-\u0001\u0017!66č\u0005lQ2.\\`TV\u0018æTި#-\"(Zk<m:ώF+Fjh*MmW)'oF-{ur-3ZwV\u0010\u0019\u00170,$`H\u0007\u0006\"ʎz~\u0004bZf\u0007nق\u001bN\"\u0003\fX\u0010\u0016#3H(\u000b\t\u0016˭\u0014\u001f\u001aw\\v%\u0007Q\u0019\u0005\u0003,Ia>O=Iq#-\u0017d#3+]S2\u00062U\u0001#iH6K\u00141(i#-ŉ~ O\u001eW\u0003z!\u0003!SP\t\u000e;?\\ -#\bk\u0002֤lO}sZӮ5i\u0012m\u0016kyEy6`m\u0018k\u0011\\K\b$H\u0004L\f\u0015#,Z*&D\u000b\u0014Ubw\u001fD\u0011&pARK\u000fW8kXv(\u000b\u0002\u000f)\u0006%_\u0006][#3\u001csOVAAÅ0N\t\b*T5\u0014\u0016\u0015j\u000bE2R\u0002 \u00166\u0015\u0014L&pU[sd\u0007xC\u001f2~He\u0002E OM\u0010X(Ν\u001bL\u0013i!\u000b\b͹6+}旮Y5b͐cQT\u0005T\u0005\u0003\t\f\u0018(\u0018#3\u0010finh\u0013#3IM\u0012\u0004\u0016$w\u0018M5\u0012CU@4B\u000e AX;#Pw\u0006#-\u000eq\u0016A\u0005A@#-?c*\t \u0006`\u0010\u0003\u0010\\,\u0007\u0004\u001cA&R\u0013,YbN*l\"/}b8ܪU#,\u0002\u0002e\u0007T~\u0002=\u001a!\u000b\u000b!F5az79-H\u0016Cܾ \tf\u0003q3<)h/Ny}͈UI5{|vF\u001fBP$!\t\u0011T׍\u0005T߻>=p\u0006\u0003\u0016\u0011@E}\u00118\u0002%;\u0015Bkh\u0012&\u001co\u0003\u0010\u0001-~i]tIFɩ1RfeFiYOeu&P%(IQ\u000bP\u001czs$0\u0011C͖=P(V\u0006}~i5}|!-Gķc~ҌfLK\u001fF\u0006m\u0011ԪLIPAE40ѧݟU2u\u0017[\u0010\u0016\u0007/VClm\u0014zmW\"\b(\u000bR(&R\u0016 B.!e+6U\u000b#-IFM[\u000b1\u001cx\u0013w#30;\t\u0012I&\u0002Çێ^G[\u000br%^C}KŐ,h@# \":0\"\u001b7\u001d58l\u001ao\u0017Mmn9\\6hkȥ.7MY\u0012\u0011P~I\u0012:OF͚N\u000f;\u0016ZfU?\u0006b\u0001Pe4a\f&A\u0011\f\u001b\u0015){#,?-#-;?oyL\u0013i#-3\tϓt\u001c?,\u001d@.&uɦ~١&nfP\u001b\u0018dK49힇;\u0019ԟd6d\u0007螵\u0010>E[\u0019(}\u0007»#,AX{ń\u0016,\u0004XEH(ZI\tHm-Ihfk&\f$v֙JcQE4LLU1,U+\u001ame4Z&kciAV-iFTTVP H\u0018j~@ژDki9nƉ\b\bAQrAA\u001aѫkZj5kZn*0[*U\u0018w\u0003\u0002hD*T#3Abe\u0002z30\u000f\u0004G\u0017('\u001e+A\u0019\u0019\u00172P5\bX4\u0010<KX2#,=Fܣ~#r\u0011#,'\u001d\u0003A^PY\u0005\u0003PW\u0010;Mx\tNkg\u0004\u0017Z:ֹjUu{\u0014Kږ#,\u001c\u0003\u0013/g;H3K9\u0012#-dP^ʡ(2\u0004{z\"\u0001U!L3%B\u001c\u0006\u0014lK0y\u001fw\u0014s+@D\u0016p>Y_'p\u0010\u001a\u0018`;\u0012#y*\u0013D\u001b\u0015@:\f$\u001e\u0004#,|\fې\u0010u\u0002ܓǔ5\t\t\u0012#-\"\b\u001fD\u0003a(RE#33D\u0012,eP441S&QE\u0016\u0002x<;l\u0014{Pxk?M[M\u001a\f7珫]\u0014\u001d(\t6\u0013Or\u000e\u0011'sa7j=yk:1X#3$\"\u0017kÎx>g6t\u0002\u000f\u0003{μ\u001boi$\u0007|G\u0014anTK#-P\fAqDkD=\u00181\\\u0016=]fVYB2\u0006\u0006@S)`1X<Dϫ{\u001b\u0006\u001c\u0007K:+#,ٽ߈\u00134Y\f\u0014Gti,\u0012 A!֩\u0012\u0019\u0005FDEL\u0010M64ϥ#-Z[X\",aBIJA|Xea4woW{eE.\u0002KF\u000b\t}^R*=\u0002$/\u001f%QF4$PZE1\u0004\u001a\u001d\u00151\u001e$5!\u0001\u0014.!\u0010;I m\u001cTV'2~4\u001cFd!kd|A$\u001bN-lGR\"jHhRůt\u0004\u0014)]cB\b^pvae*ǧx}ZcfSr%\u0015:\u0006y\u001a \u001e\u000b+*ח[2]Mu~;Jm\u0010\"\u0010JbJN#3\u0001|Ǭc\u0013;\bf\u0011=X&G1\u0001(\u0019v)xQ\"\u0004\u0013\u0005TBjTIɟ}\\#,(ߨXcQ [N#3ϖ3Az343<\u0013\u0001&L$\u0016@\u0001\u0011F5IQ\\m}-t(wAx\t\u0006I\u0002D\u0006\u0007&\u0001EI<n\u0017)(\u0006Sb2DTV\u0004<\u001a\u0011\u0007\u0014\u0017Ba\b\u0011n_\u000b\u0003ʃ\"$G\f\u001b\u001511m5JAIvN\"bG\u000bp\f!)$#3\b()D\u000eb6e\u001b9<P\u0015\u001f^\u000f{ŪJ\u0016ϴ\u0019(1#-sAJCY\f\u0001(\\c N\u0019[jbI\u0004\t\u0012>i4\u0017m}҅Sձr5s?,l\u0002!%\"ۯ!\u0016є;\u0004I\u0016B{1q@$Xd~WK\u001d%t; \b\\FR\u001d\u0013hh=u\t͆%\u0003\u001c\u001a05'C,-ZsP\u0004aNk%_Mf6b\u0016#-QtE2R<kP.uY\f]&g\u0019o\u0012zy|\u00022Ar\u0004\u0014#3#-#3zBRA$b\u0016&(A*ҥhQXF\u00048\u00186U\u001e\u0002Zd\u0014\u0011[\u0011\u0007TWw\u001f\\@:\u000e&\u0005'\"?S#u`M\"\\C3cq=ۯh`\t_) H\u0004 *n9C\u000e84Ɖܲ\bKKU\u0013W\u0010Ӛm!f\u0013c\u001d\u0003d_O:\u001fIf\u0002H\u001bcC\u001b\u001aH\u000b\u0001RM+\u0012uTQ˼愠ʐQU\u0014c(D\u0001P'IQAl\u0019\u000f;d\u000b`\u001dG\t#@!8#,#31#-4A\u001f\u000f\u00065ZA\u001aQ4>gB~%ۻz+\u0018&c#30\u0003BI^[\u0012V\u001cc`4\u0006=1IHqbSb\u0019#c\u0018ivi&tz֩fYM-]3\u001ay\twóo\"&Cn\u0005\u0013#\t#fN\u0006\u0004X\u001ck\u0010͵h\u0011H7̓X\"U\u0010\u001a\u0003\u0017d@54\u001bVW\b3O\u001c9\tq\u0010!5a\u0001\u001cnΤy|:X\u00170V4H6C9i\u0016ԥ'!X$\u001f9)j?\\0e1+s\u001dGb#,J@:%Z;m]ZRjZ6eL֨)Ze~vȕmvlkh+d \u0013N1\u0010ꅏ5-\u001776\u0007=#3k5d*\u001e\u0014sys2f\u0019;\u001cS\u000fEA\u0002M\u0001\u0010\f! U\tP\u000e\u001b)|\\}\u0017]ʧ!8֤_~`m\"<Xb\u000eXΔD@\u0005`\u0018UV\u001ecΣ\u00020\u00190Ae4#3rØpɷP\u0004ry\bQz\u00138\u000b\u001d#3R7\t$AnL8 j5t\u000bק!aNi#c \u0013Hq4\u001ca<\u0007~\u0014.5JM2#-B/}\fԸ\u0011L$\fEpsgZi6=d6;Qr\u001a}'X\u001eGc#-\f L2;}\u001c\\~D!\u001b\t-Bzhr\u0013N7#,Ԃz\u000f P~\u0005\u001akF\u0006gwpE\u0011l>\u0006j\u0002ls\u0014m:\"SWTX)a\u0018`\u0003\f#-ӭ\u001b\u001a\u0006Eq29\u0016O#3jjg_\u0007ThVo\u0016<%eۜ\u0007\u001b\u000f-B_d3VuJyaF\u0001)}l\u0006\u001cϾ9nv\fo9x\u0005#MZ{[\u000e\u0003$#3NUK \u001b_#3\u000b-\u0012ݱXm)h s\u0013Iۭxh\u0002#,\b[ܻL\u000f\u001f`i\u001f\u00147к\u0019\u0005NVTb`2;eJ\u0003\u0012\u0007\u0006m\u0013Q*D\u0015Ao\u0001(Ŋ\u0011\"\u0018 \u0004(\u0004bK5>ws91rtxYVU(ZZŭ\\UG$=\u000fD>|ˤ5oys]\u000f(ZiY\u001aDDyO#3L:dáA:\u0004i\u000bcU\u0017z|;/\u0006#,rAr\u0014F\u0001\u001a\u000b<$#,\tU\u001d@8<d\u0015#3)g)$ToV(\u001biHB14PPYlS5Jf-UlhݔrM+2\u0001\u0018(@Y\u0014\u0016@Ds!Hx@\u001f{COl0\u001c2ŔHQdMq#,Ƞmy>id}EjC~2s1\fM\u0013\u0005PNr\u0013hݺ5\u0001M\u001a(Kiim#,#\u0005D.1V\u001d5\u0018ep=֬bE,,\u0010f\u0019h;?S(7<ۉ7(ߢ~\u0005'8#+%}١y\u001e]\u0004XWn\u001f[Old\tClWbMU^5;u;\\+\t_gy(1\u0005C\u0015+eiͥ\u0018#-i[84#lۚ;Q#3BK]\to\u000fh\\1b-ngߋL_[ZlH\u001e\u000fR])D<\\DĖ/\u0004cDD\u0002\b&\u0017\u00023\u0012Wv~̗c!+\u001boA\u0007 \u0006eQ5@5\u0016\u0004S\u0004Wz\u001c9mrC;\u000bscKpr;\u0005wͤ;(?Zx'4\u0003\"T5\u0015\u0001 :\t\u001e$\u0012\u0016t mD!L#3ΰElg\u0014`?a&hfE}*D/0\u00051\u0007}hVxPoW0!u\u000eg`y\u0004ܽ\u000e\u0003\"0\u000f\b3z\\U\f*^KR=p,Q>aGUI&az>@_\u0019>ss\u001e$X@b\"H726GّaB;)@8| tܔ2H\u001c5Mr\u000b\u001e\u0019q\u0019y4o`2,#b\u000e#-0k<\u001bJ1x\u0018P\u000eia\u0005D\u0014iB==\\\u000e\fguouYj)<\b\u0017\u00149\u000fo\f\b@#3T0\u000f\u0001.\u0005խ#,\u0018yګ}^*[mmڦmi-kxZ\u0001#3(]Z\u001fm\\u\u0002\u0004;\u0011H@?BL^-\f\u0018F\u0007qվ]}'\u0002#38;OXX\u001dJd#-D.'s#,\u001cېuG\u001eY\u0007*~@\fkhh#3\u0005-DT@\u0012#-\tXVh3Q#\u00123\u001dءwƃ~ܪ\u0012P\u0002QM\u001bR:U8(\u0011(^!A/ E#3!G%\u0001F`<D?dvIO\u0012\u001b!D:\u000fg#-\u0004\u00111}sE\u001eYQ[K\u00070\u00161Tl\u0019\u0012\u001csw\u0005KB~\tmJ-eq\u001a\f\u0016\u0010=G/c3da[ \u0014$+\u0004ZZ\u000ft=]/@8CJJ\tPzHZ#-@5P 4*\u0011#@\u0004\u0014\u0005h(Vb\u00116~Nl\tD6\u000eն23ဲD#-4ajP\u000e3}>NYOO1#-4\b'\u0002H#dhF@U#\u00116HE!Vd#V\u001fч${_o;\u000f=Zct,~_vhrV\u001c\u0006Fޡ,F_.)Z\u0003\u0004\u001f\u0005N\f.@Mإ5\u001azm\u001fGc3z;m;Jʍ94\u001c\u0015h%vvH\u001bG7}{a\u0012˺)\u0014_1\u0003DKY#`V\u0011FI p,\u0016\u0002䵾\u001f7|݌:sxj.K-ԻlJۺdi&j.ު{*X\u000bFS.\u0018\u0018!5\u0015#3\"#-\u0018\f\u0001q\u0010Ĥ\u00102\"%%Pjac cZ\u00194#-D\u0012\br(&B)\"\bh`)0Т\t1]?**C\fl\u0018(*\u0016\u0011`\u0012\"\u0015\u0019\u000e\"ʹ/:;wYS4]'oi\u0018R*rN4\u00140,+\u0019\u0016\u0010@\u001bslmJ͔bZMlJ%j#3MSb$U)i^\u0007]֌i4\"lQc#3l\"\"Ҩey||vhdٛM2FTˈ\u0013aYʩRc\u0014`j&\u00067YH\\WW\fy\\\u0006\u001aT]\u001bdTTB\u001a\u0018h?4Duqv&n+\u0006t\u0003#-}\\#A\u0006⛂\u000eXC!\u0016LmqƟE̓\u0005#,Eb\u0018!JFLU\bD#3\u0011,qX͝Z\u00166o%XJ81Ai\u0005\u0018L$Ek72D@74d,\u0004fJTB\u0011\u0005aƨ#3d\u0015\u0015\u001b\u0013@xی\u000biu`Pi-+B\u001b\u0012\u0007+\u001ai#,Lhc3\u001d1o6#\u0018\u000b\u0010#`Lec\u00199\u00020r1j&J#-dqgʕ\f=?6\u0014#E=\"=h\"lCҙ\u000fH\u001d5Ս<3(\u001e!~:ZK\u0019=}f1g#3ػ.*3!z,71\u0007L\u0011\u001e&\"ᖰ:oO*\u0012o@iH#uDq/v\u001b4j/hl\u001e1T;\u000fp2-}k%6-CBRLjwTH\u0015!B.\u0018LFUiAƔk,ɊC\u0018M\"\u0004ͤ\"ZiBo[&72P\u0013\u000e+!\u0016\u0015e2\u0002z\u000eZ#-ٽg\u0011!!*+z\u001d\u0010(%TJ\u0015Fii\u0018MD\u0016\u000e\u0001UnoR=~0xmf\b\\)DTI-(B B\u001a#-T\u00116\u0004\u001a\u0004ҤT\u0018\f0\u0012`1D#-*B1!0co\u0010EV\t\u0014˯\u001dqAg\u0005K;QSu\u001e5Շ\u0011XHhI\u001a6)\u0011M1d׭mw-v*Y#-҆MY-=xR^M^yٻ.xS>3Cŧ1M|lr\u001c\u001dcB{u\u000eJ;uKX0MfW\u0014\teX7k4N֒{jɣc([\u0010!=DeܝFEu\u001ef01G\u0001\u0010\\\u0011bGK/YȒ`a\u0006C1#,$\u000efq[l\\ەG\"0I=EA\u0007=r\u0004֡\u001a%I\u0010Y\u001c\u0003\u0011+z71\u0019Vpu蛞8\"\u0015\u0003]]qV<#+\u0014Ҝc\u0005QRK\tל]<\u001e7C95%m\u001a\u0014750t\\x\u000bh\b\u000f\u001b#-}@\u0001\u001e\\|\u0014o٫VEcl%RUEhU\u001906\u0016,\u0004\u0003`H\u001a\u0015[ p:K@TL-4x򷎖MmUpm:MWRZەwnFfkEusK6hF̅-\u0015;me|MUגVj\f\u0005\u0010A@\u0006\u0001ZI\u0004+\u000fdpȊ}|=2\u001f!\u0014^\u0010:Аh\u0013me˂j֔VX%+=2Aa\u000bp)\be]W|ŅO:Kf\u0014I\u0012HX@\u0017\u0002\u001f\u00172aM\\ݭڢ+xʤv\u0012ج\u0002Jl[\u001a\u0018eE\u001bU3hQLѬI23T1m3Id,,B@\u0014Ht\u0015 A;>,ɹ\u0010K$\b\u0004\t$!3#-\u0006nE/F\u001a\u001c^.thǃ\fQ`M/쭔w\u001c@\u0014\u000f\u0001\u0011Z6h4V׊/nJ);mv%6حdJSjҪH$ \u0012\u0012 \u0014Zh0z~`Ld\u000b\u0014iRO:Rd9r#-\u0018\u0010\u00063P6\u00107B\u0005DVFA$P\u0012\u0006tqm@}v\u000bl(8\u0015uU8D`\u0010z)C\u000bCe#}A\u000ezw/\u001fV\u001e0Cb0QF@?\u0001K5\u0018y&mf,F\u000eE[TlcUc\bJ\u0014\u0006Y 2\u0012$hˊn\u0013c,z\u0011d3\u0017C\u0018v:%p1`v\"#ݾCG\u0015\u001bip^\u0010WB\\&R\u0014;:>\u0004Q8\u0016dun:n}n3g2uPJu#Uܝo9&Ŗ\u000b%\u0002O\u0003C\"Y-%xiL\u0014\u001f'}A\u0010G'O:\u00032wÁX+vSzN\u0005=\u0017㸈\u0004\u001a\u0004M\bmKTQ\b\u00076P\u000b=\u000f8*Ȍ\"(ȁ\"\u0010'b\u0012$D&sZU\u001bdχQlՍHm\u0001\u001a\u0004\u00100\u0007>҆\u001eϿ\f\u0019\u0004>D\f0@-~\u0016K̨e|5\u0015\u001bi\u0004\u0018\u0003\u001a\u0010\u000fTM[YJ^KVk]MhPih7\u0003;k\u00194~[\u0010AHd\u0018\u0015\"\u0017\u0001jI\" \u0013)15i-؟\u000bjDEeyܫ{HM!14AkL.+OzTmPA\u001a\u0003L\u0004S5jRqJ!k\b`9#,\"\b\f(\u0011bB+\u0016\u0003Kj\u0002,.!jl\u001f-%3,\u001a\u0017@xO8}QMD\u0001Dc\u000fq,\b\u0019.y\u0007#3:&ltA\u000eô\u0005\u0015\tIΣ-\u0012)Vdf\u000e\u001bp\b9F1ؖ~>\u001cs\u0003\u0002#,CB\u0004и\"\u0006\u001d]\u0010q\"\u0010@]y}9:z\u0018=NGo7d\u0005h<\u0011<̷\u001aCB;\u000e?(3*TTX\u001dʟ4\u001f(/\u000bdeg'N:p8ۃ!yܖ(΀\u0003\u0011TǍ\u001fPU\u0013A\u000bv&ɷ䘎YJ蒗,( #!\u000e;\u0018U\bi\u001d\"j-}u#?\u001a}4\u0015zH,\u0011)ji-\u0014\u0005\u000eI r.\"1 PZ\u001dֲ\u0010rly`)\u001fE]`Q?-ս\u001aB\u001e8T:\u001d\u00197L\u001e$_e\u0010lѻz``|HӜg\t*zT#,/Q=:f\u001dId:\u0015M\u0012\u0015\u0010H#3D \u001d X\u0014l?s*%@\u000f\u00033?٠`h⫺%\u0015!#,+P$UQ(F?X\\I_1\u0004loy^yp7]̴JraiMI2V2^-lZ4\u0019,h6KxMt֓Gt7vÝ\u000b+6\u0014sSJӖ̱N1cm6iRdڍ&λ%u6gu]IlZ,sU\u0015ͫ;j\fE.*.\u001b&`qGd2\u000bw2\u0003g:?sCO\u0012T`ê/!\u0004\u0002D\u0002D\u0002\u001fz\u0004\u001e\u0017cENPl\u0001\u001b>P$F\u000b\u0014N}^k\u001bװ\u001b˻!\u0019\u0015\u00034n\u001893\u000b#,w{֛\u0017 \u0003\"1H\u0004f٫ۚڷޭ\\\u000eW\u0017\\\u001f\u0001#,\u00144~v\u0015\u0013\u0010TdՍUKC-\u001aj\"z\u0018bԪ\u0010\u001d*\u0014H\u0004\"\u0010*Sj*(km䇖%#,+7Tj0;m_Cnj)VD)\t$P^mkm-^|Wǚ3֢QYm \u0012\u0012\"#-\u0014)\u0016m\u0012L\u0010i\u0006\u00022\u0002\"eA\\q\u0006aB|\u0006O\\ۗH\u0014$Q1\u001bB!#,\u000fjz\u0001\u0003N\u001e\u0002\u0001\"\u0001\u0011H\u0006,\u0010\b\u0010ȪD\u00180Hq\u0002\u0003-#3\"#,\u000e\u001a\b\u0015F#,HRjLͱ[j%&\u0001MB<\u000f5a\"\u0004\b\u0010\t`RUSZ\u0002#,ˆ8*\f\u001cZsh@INpSk)\u000f#,BB0ۦ63\u0016]\u001b\u000fo\u0006\u000fP&bl\b6\f#ff~Wߍ\b]\u0017\u0003A\u001cڜX\b Х\u0004\u0013W$%\u00056Y''\u0017\u0018\u0007D!q'm'kP {#,b\u000fQ/\u001a\u000eGr=-`B\u0002֢?qK\u0003Pi&5+F\u0010F\tH\u0011\"\u0011D\u000b\bl.ՕP\u0005ѸZQ\u0002\"G\u0016#3a-B\"04#,m\u0014ٺ\tQ\u0014\u001bQ$HE\u0016\u0005ݠ\u0001:#35Q⫖/\u001ad\u0004-\t#,!\u0019Djcy£\u0014|U\u001a\u001dʬ\u001c\u0007#3\u000b\u0012\u0018M`\u0017\u001a\u0012m\u001biwc#,$\tdɖY2eʱb6)Xѱ{\u00181\u0012EB\u0011@$DFPQP$b] a2:\u001b82\u0013I~\u0017\b1\u000f^\u001d#-@)=\u001bOG\u0017\u0012^\u0014kdj#DYA\u00020\u0018P\u001c\u0015d\u0001#-`*\u0006!{\u0019xO58(=ڨ2F0\u0006'@{8\u0014D\u0001(B\u000b{'\u0005\u000bd hȰa\u001a%Ī\"A\u0002\u001b(\bČQi\t+v{!#3\u000fa3AgO\u0005\u00116zY#,nX\u0007!lChകKIϤki&u[bH%P2\u0001PB<]\u0006;u{^Ajf7dT$&\u0003L0ĠVGT\u001f\u0003m\u0007#,+hjP\u0016Lڙ?7vv@y\"\u0004O1/#-懁AB\u001fA>F\u001exTW|UA\u0010w\u001d<U\u0004\"鈠\u0012\u0014\u0004\t\"+\u0002(#,$@$\bx\u0004K\u0013d`f\u000fu6\u000e8B\u000b ^(8yO\b~x#\u0005DX*\t!\u0002|E>D\u0001a86:\"\t\u0015\u0001\b|H[[^)/`\u0004\u0019#3(ԟ\u0016dC5AF\\\u0017o\u0016\u0018w\b,F[7@m8*\u0002-a0t:\u0005o#ˊ$*ۋ_8jM\b\u0007CE\u001b\u000e2`N5\u0016l\u0014{`:\u0015IC\\VQpn\u0016\u0015U\u0006\u0013<8\u0011->t_4??\u0014Ux\u001c{,Lt>6=\u001eIv/\u0003\u0014#3L\u001f\u000e=?.VM@D:^Uh/=o|UT`$sP\t{\"iȄ\bc*}\u0013\u0012\b\u001dkbж#)59 AdkS\u0016\u0005\u001a\fbm\u00158T&i`\u00168֎`t\u0016LC\u000f$;e#\u001cuLI9T\u001dX\u000b\u00130J\u001e=9g5=.}Ke\"{`o4\u0007R\fw'W!lvb#;l[c}p!km\u001aw^Gs\u001a\u0007*evcWs-\t:\u000f~SK@\u0012ݲF\u0007M<\u001cM\u0014wx{z<TƵ1ö6qX1R\u001a \u001cC\u0014#3(D%08\u0002c\u0019xt\u001e{OQJ9a\u000fPT\u0007|33\u0007w\fͿ^7\u0012ĳ\b\\\u0007z+\u0007%\u001e%gk\u000e>cd\u00078\u0007^\u0013\u000e\u0004@Ԫ:=\u000f5a!:\u0019S\u0002\"X$G \b\u0013_qc>\u0016\u001e5иC\fiL$DX\u0016ݖY\u0005\b\t$l7Csۨxnb#3\u0006ёzv˯q%C\u001fZ\u0007C9Ԑ$\u001an\u0007#-\u0007\u00186?Gr4ko&k\u000e\\\t#$5v=(\u001a*\u0017)?\u0018rO1\u001dP[\\m6B\"<\u001f^[t䕑\u000f\u001f\u0019Ɖ2-ZgT\u001d#o2O\u0015RwD\u001f2\f>6sٍ\u000b ሮi\u0003!#,\u0005#,j,YsZ\u0018R@\u0013KmZg7y1@c\u001e)n-\u001c)\u0010;r\u0007F\u0019V\\1#,Ts\u001e+F$jf78Xx\trڥ?p|َ\u000fFZV(!r\f{\u001fDJe1l#\u000eK\u0013l#-d`+BmpR).\u0018?A`ؗ\u0018\u001aGP<^\"-1 #h#$'O$>zB}`Uw\bH0\u0010\u001a\u001dU#-ʟ\u001f523?*}\u000f02\u001b T7udc\u00075=ݏlt+!7̙{\f#-Cѐ;W6g!~\u001fk#-\"bCm\u0015j1mTW#3\u0007&YL^%\u0002\u00193Z\u001c\t\u0002ֆf\b'W~\u0010`bM\u001dH#,cJ9n3336w:_Fw̲-\u001e\u0006Ŝ718q1\u0005Pana\u001d՟=@dUBE\u0014!\u0013\u0002\u0018B0\u0003b\u001awoufP\u001c]6FT\tؒbc2ɐ\u0011M4DţeN,Kނ\u0005YLR酠Zij\f\f\u0014iP\u0003@aMG\u001e1a\u0018'g!$\u00073<\u000e7\u000bmZ(U\u001a_f=Vd*f~\u0004H\u0016.a;C Y\u0019~hbk\u0002#,\u000e9fT{P\u000b \bA~\u001ePh#M\"ޓ;K(\b<h#,L&#\fRJ\b\u000fF\u000e\u0003\u001dzSx0:w#3:ez*\u0019U\"6p##,\u000fWX\u0004r~?5\u001fM#-&=r@/Sg\u001fz\u000bo,4\u0007k\u000fh(I\"vt4[(\u001fq)d}#3%Ab\u000b\u0011IZXC/}#,\b\u0004\fPkiD8\bl8S$c\u0017ˣt3ﵢ&)5΁0V\u0011#,2%\u0015RWV\u001eTk\u0018T\u0010\u0006E\"\u0002\b(@d|y9ε c\u000eƀgׯ\u00141\u0010P}\u0012\b\u0015JE \u0014\u0014\u000fv>ǔH\u0011i6fdea\u0006J\u0012SbPeaeM%i!eJT\u0014~\u001b5HH:t&c6:\u001c霵\u001aa%\u0012%kU\u001biJ5\u001agI!\u001bLj#8f\u0010kÈ-\u0012\u001cG{dK6Uwϡ}g\u00023m\u001cw|\u001fY)'\u0019\u0013\u001a\u001e\u0007qx\u000eO\u0004\u000f&\u0014P\u00199\u0003e<i6{+4+#-UBBY#-]øy9E\u0019\u001c,Ma\u0001cYc`k\u00180\\KEǿ@za\u0003\u0013e6o\u0015`\u001cnFt\u0015c\u0006wq&Dd$\u0010(b\u000eZ$7\u000eY3ƻVN\fE\u0012H)?\u0011\u00110[j+\"e<E5ڼ\u00106$e&wh\u00110A\u001dIsuvݒwM!\u0002\"ql\fk f\\\u000bm\u0015\u0012\u0004-\u0002\u0005)% NX*H\u000f\u00140h!Q\u000f\u0001t<M\b~|*ֱS6j2mTBU#-\u0011\u0015Z\u000bJ\u001cBL\u001e\u0001\u0011#-\b+\u0017LDIiVzbXAS\u001fo\u0003\t\b\u0018\u0002 L<K\u0017pޥ\u0002Tѐ+\u000b(\u000e\u00116\f(?\u0010`<E\u0001ffE+&(T\u0006@T\u0015^-˷qK˧t۹e-J\u0007rY)2\fv\u0012 P2\f\u0017H2DD7Di1!5\u0014C&1A\u0019&\u001dp_\u0014DB2L\u0015V,yd\u001b\b\u0014f!b8H\u0002Ő&\u0004\u0018\u001bK\u0018\f7&a#-HiѸPb\u001a\u0014!%\bpPw&͎jbv);\u0006Pd.\u0016iji}Pcitd\f\u0002)2ڷu)(\u000bJi\u0007lJ#-\u0005j9,\t\u0011QC\u001a@zo\u000fmMadu5\u000et4\u0018h# 5\u0019\u0019LT\u0007\u001cC#-膵\u0016FJ\u000f7pa\u0005t6x֬7\u0014uۚ*k@#-Bõ\u0006\u000fE\u0018)\u001ejh#,m+\u0019}'\u0006,Z'\u001a\u0003C B\u0011l2$\u0016A)\f\f\u0010wߢ `C\u0011d2\u000elP6h;Hk\bVr\"\u001a|bUh[3Lԙ@\"ɄHS#\u0010\"Wlx,髳^-ABG^D)z*d\u0006'+ 寝lj5DM+T\u0005\u001f{FBt\u001cF14saQ\u000f\fhTg86\f4#-\u001aHh}\u0005FhiMS\u001bbFXkt\b==4X)͠.Zk\u0007#3\u0015ӑ\u0011\u0005&aK#-b7\u0011U!=%\u0010>q8{}h\u001d\u000e\u0014eU$9H}I{:hF\f[\u0004s\u0015\u0012(\bؘ\u0003;0fȈi-\u0018*@\u0006\u00064!BQ\tbJ\b\"4lLPa\u001aDd)Dեx\u001cz T\u001f#36#3IxrH\u0019XUFP\u000be\u0014R\u0018BV#, AM\u001a4-M͉H#3l\u001f{{,\"f#,.&\u001dP_P7$\u000f7#-\b\u0007H\u0017;Qv>3E@_q\u0017\u001a=4QJ(1 s\u0003ܩ#,F\u0010\u0005Y\u0004\u00181\u0016\u0011\u0007\u0014.X64/c@OiD)ht\u0007^s\u001e3L7yP!r)JOʟ!KG\u001a\u0012у\f\b1b\u0002l\u0010\u0015xbq#3]]5mSAB\u001d-Qh1D8Yd\tz<Q\u0016ԣrmNV^^r\u0001۵I.\u001b$A\u0018l\u0003xQM\b6sZ\u000btK\u0016IboȎ/[KK\u0003\u0010gy\u00047m\u0005\u000eY\u0017'\u0012\f}Q#-Am`,G\"$7\u0013\"p{gj\u0004' F\u000eYس0ax(a\u0018\u001b9V\u0013\u0017\u001a#G~uٽ\u000f\u000b\u000f~ c\u0002]pҥ||xy\u0001_ggGcU]XNGo\u0010&mV\u0013-a\u001cb.zGR\bAo\"\u001b\u0002l#-d\fז|\u000f\"\fc\b#-&\u0013)#\u0004dJ'h\u0006z\u0007{O'\b}+.aq?#,Ⱥv;]*nC\u0015#3'\u0006\u000f\u0002{3\u000e%\t',\u000f\tT;\u000bm#\u0014\"ro\u0016\u0007G\u0003хUu,\u0016$\f\u0006\u0019a5>\u0017\u001e+\u001dYrҪH81CM\u0018A@-0ـ(\u0004!C75&dnt\u0001Kbj0HRI9[\u0003QUzUS:Peo('j|\u0018k'Y2\tl\u000e`\u000bI#,\u0018m#-r^9E\u001by(M\u000ektxo\u001bkƮ#3@#F\u0013ʅ\u000b\u000118j^;\\WAc:#-DK0-j#-\b\u000f\"|@\u0006|֚{Cd4e@\u0016I\u0010#,GȊ #,\u0015z@ˁȊic\u0007~ikO'_CS\u0014\u0003#\b~ \u0018M@O\u0014cX\u0013cUG|9K[K]ȭ\u0015U$#3`\u0004.\u0015BT%\u0015p@\u0004d\u0004$\u0015M%Z`o\u0011,X(R`\u001bNf \u0014D\"\u0019\"B#3#,#,\u0003uR\u0015CҪ\u001b~>~Ntb}\u0004C@Ģ\u001aa˩\u0003\u0001;\u0010d̿\u0013Рy7%aC\u000b\u001d&OWQ TGpf\u0003u>a\u0002\u000fڭ6Lm\u0014me(idƌM#-i&RRLMUQmUҩJjkQa\u0016A\u0005#\u0002|\u0007\u001e\u0006-\u0015\u0001\u0006Ɍ\u0014lD44ƠXFF!\u0016X< \u0001U,#-f*EZ\b\u0011\u0011\u00167H\u0015X\u0003`[\u0019\u0011dhr\fd\u000e*\u0015EFт4i#3#3\u000fSX嶖ۦTUA\u0016L!\u0002\u0010\u0012@Q\u0014,B}?^vc Ba(\u0018HU\u0012r\u000eUv˩mn@\u0016)\u001bZ\u001drZo(@<2C~&jΟUisEU)^}Q#, T<Kͼ4#-y\u001bU\u0001L)\frY0h\u0013\u0002`(Vr\fZ2\u0002\t&Mn\u001a\u0019sҐĐ>MTrhʀyI\u000ep\u001d\u0015ADƒ;מ]tWK33|]|[nU\u001a6UUJ@\f)vCcD.HP=+g\u0005k^\t3k\u0016@QEkd\u0018.Xw`\t𿍅\u001a<sw:\u000e\u0013/6\\ڠO\u00112R_%\u0012mQq\"\u0019+!\u001fvNRH;]*\u000fN9Ɯ;q[\u0012Z>I;coK\u0002c\u001aa\u0014gBKVӽ\u001dȽЅ\u0013\t\u0017j\\!Щ<\"D8|IFPsg0I3NTuzA!ՑB\u001eٯNT\u001aaͷFOW]\u0015Cx\u001dKP\u000e,\\5s范5m\u0015l\u001d1-'[5RҖ\u001b;.#,\u000e:pSɛs\u001dh'[%=\u000ba9\u001ar\u0013Μ@y^]S9|\u001bSq;\u0012̅5kauq\u001bUxK\\#-@!NK坭]#-\u0007YD6PfvpL1X!\u0002#3Cs<*L#,\u001f=QR\"\u000eP5%\\\u0018虆Y\u0011B}mNiWa\t':X\\(\u0016DnePh\u0010vL}\u0004\u001d6)AVS{аj\u0017n\u001fV?kn\u0007ٍ2ExFc\u000fC\\C\u001dv׵8Qί\"T#39ƺ5|HF\u0011(\u0014\u0019TO0K\u001d\t::k@v0pl2q~|\u001dŎ%͵.|3g\u0004H9LF۸Jص-Ne\u0007\u0005d\u0018B\u0010պG+zx\u0010ǘ!ĮB\u000e;\u001cUQ\u001b\u00028(\u001bB\u001d\u0015:\u001ac62)#-XRL\u0018F4V\u0017\b\f\u0006jSfa'ZdmH\u0016nNg#,m3<lxckwx;\u0011#?zɞRln?a䗙%b\u0014Lm\u001b\u0014\\Tx\"P<DGZ\u0019\f]yjQo{#3Tl5Ke\u0013>\u0007k7\u001crqЛ51;w\u0011\u000eGWѿoJD.\u001d܁ߥ\u0011\b:K~EX\u0019eɡ;l`M;\u000f}]f`֬6׊7\u0015(\tS<ZV\u0012D}OZUws\u000f\flt:ھ1'ĻVb#AR\b2\u0005\u000e\u0004\u0015ST>Rt-\u0007p\u0002\u0004#,\u001a!鹩Fm9\u0019dڥ\u0005o\u0017%^G<g\u0001F\u0003\u001b9O,خ\u0006#-\u0018ނ@p\u001fv\u001e\u0003<ڨ!\u001b0CJ:&\u0004,DdJ^\u001br^#,qMCSM,!o(g\u001e8PYT%܍ܐ%T]x\"p3Vv\u000eX\u0010WqR\u0007\u0019h<㺗#3F\f\u0005V\u0004ks:5\u001al^\u0006Z\u0010w\"#QSAep@3H}\u001euy]\u0016\u0012`1\"\u0016at\u0003 taJ7v\u0005qpBL\u001an )\u001b\u0006qeZ۽gChf8\u0006ac\u0003Oc\u0018%-Ā$\u001a 4FIHrȺN#- \u0014\u0005/e\u00059\u000e\u0002 #,\u0010\u0004d\u0006\u0001\u001a\fueZy\u001e\u001aE Q,i\u0012ʄG^f3$Yv:f\bm\u001a'\u0010\u0001Ҝ}|M sH\f#3 nÙ;sRbQ*\u000fTP\u0002\u0011\u0017x{zRz~2s;(\bJJ\u001a# d#3v\u000f\u001d dx\"6mqa}ӛO\u0013\u0012'K|GDeA\u000f1\u0003Ldηdw۾\u0011\bnQ\u000eǍT5XԶo<\u0012xڶ~O}\tcrtr>*^\u0014|Pyil\u000f0;~+\u001cq緛E29\u0017\u0015S[Nގ\u0019\u0015\u00108IkmK\u0019#301D \u000e:){n\u000f{sAM<:/5\u0017\u0004׏\u00015NnThnչ84\u0015hAR,f\u0007Juq#-\u0019#ϝ4t{=.͹I{yzg:\u0017߷Mr:3֜l6\\d6ز\u0011\u000b^PA\u001bc\u001b+sE6zG}t\u0012cz#7RLL\u00117m\u000e\u001eh8xtz\u001bm;|\u0018F\u0019B3p\u0018r\u0016-O2\u001d<e\u001dI\u0011,A,\u0004M-XM\tC֓YATCI'Ie#-Jy*QJK\u0011A28N#3pÌ\u000fA^\u0006\u001fB=n[SsG\f̗\u001e\u000b|Lu\u00014\u0006P\u0004eNj\u0014\u0007^#3\u0005y\u001er\u001e\u000bDt\\\u0016p-8Z\u0018gki#-#3:\u001dn\u000eoC2#\u0019\u0011A1[*CC^#3<ۂc0阳J#-I]R5*@mI\u00107\u0001R*q@v%\u0018I8kA:NCt\u0006H\u00071g#j0?0tW]wjw\f6n\u0019\u0005hY˙7wxx\b\u001fT\u0019S|\u001f\u0004Nr\u001eh\u001bLo25!\u001e*\u0017}\u0012DdQemܝ\u001aɳ\u0017R\u001e>ql\u001d\bf{с$(?X\u001d@i֛\u0004>\t7\u000f#<=\u001c\u001c6V#3\u0019\u0016\u0002%&\u001f\u0010&i.P\u001e\fb0%XLiTS\u001crH\u0004p\"S U,b\u0001mc\\\u0013nmGi⊼oV1V쉩U\u0015EЏwWΫ\u0011C\u0010P\u0018#3TE\u0015E\u0019#3\u0018\u000f6`1MY\u001dK#-Ccv/i\u000eGZ\u0010\"1\u000f\u001dE!U܎ykKmZ\u0006DT\u0014\u0002%\u0006)Ϫ)\u0018Un\fu\u001cHҔ;DxL(Ń\u0010i\b;\u00112?lkɔ\u0013AWD\u0017~faU\u0003\f\u0006{Z(Buh% H#\"W\u0001ʠ\u0005Ӎ=H4k*n\"0 dCʄv=HW\f\u001aM\u0011Ri\u0005\u000b1EYTR#\u0019ĈHT:YQ}3l$i\u0018`Q}&J[kQbɺ\u0002P\u001cb:\u0014M\u0006Xb3%%1woT]92r0\u0016#0BX\u0018Fn<7帑6n@Ѡ6dX\u001b\\\u001a$܉m6R-\u0006ڤM^\u0018Ef{F^b\u00158E;\u0005#:\u0019BcD`ƅϟϕ7MҺe|l\u0003\u0018jixFT\u001a\u0006.Q\u000f\u000e\u0003fqA3+1%٭!2T6\b\u0003z}Ek\u0014;jVFڻm4\u00018M\u0018F1=(I\u001a#0kg@ZfڍR\u0015-LQTP\f0 ic#36Qe{rh\u000b\u0011#\u0006c\u0003Pu1VS\u0007Vt\f\"V\u000ea-\u000e6@d\b\u0018\u000e\u0001\fZ&\u0016_pXm#ڰita?G\u0011$lsJӂ\u0011\t\u001dÅ\u0018nl.,\u001a\u0019\u001b\u001a$n8\u001a1j\u0016+\u0005\u000e\u0006+\b\u0016$m\u0013$c(ja=5sVR28v\"Mt=.26\f,mJ8G*\u001b\\#3\u001cgQ#3}*ff:>&X\u0018\"כUqN\u0014.\f\f 9ܲ㖝\u000f\u00189ޖ\u0016̥08:\b_DF\u0017\u0001aZ JF$go)]#\u0016#-\u0011gtU\u000b\u001b\tz\u0014[\f\"O`}Z\u0006g\b8\u000f7s13#,e\u001fy;leJs;\u000f,Taq\t\bzL}[\u000fŪ\u0015P`\u0014\u0004`r\u00186}\u0003t6+\u0010#,B6i\u000fB>bB\tP#3H&Q(8#3\u0019G4\u0007b\t\u0002eSgy[i\fT2۳\u001c\f$UUFJ2\u0013*{Wi\u00069ٖFj\u0013u\u0001;蝓#,\t\u000eh\u0012'\u0016\u0019``Cy{?F\u001cW\t\u0001\u0006W׾+dȷ4`T\"e\u001b?\u001f,D\u001b[F6j+U0ۏV+L*.\u0004\u0018\"y\u0006g\u0011l{νfP<\u0001`\u0018k\"`2\f\u0004\u001c&墚$~b\u0001Nbjny\u0001_2xS?FR\u0005\u0007C@\u0003$L66Jjj\u00156E\u00106bU\\p9{'x)n+\u0018\u0015V\u0012!\u001b)+m\u001aҍDbM\u0015!e&\u001bjel&-lUlҒcffLYlR)Fd\u0018Z&Fƛ%)JVR,0\bɡBF\u0010PddE\u001f_+0<{\u001eA׼r\u0017\u0012ܨ=\u0013\u001c\u000fpWQ7\\Ow#,\u0017yߤل\"\u001eO}z$>3Z!\u0005AI6.F1\u0017\u001226GwAwpnz]\u001cD436ܿc i~\u0007A\b(\u0011\u000eg\u0012o^`B\u0003=2e\u001cD6ǻ uC\u001dI0D[\f}ZWϹc{!c/X\u000e+]_smEDk\u001akE\u001fkk#3M\u0012#3KPfhZRkZR>\u0016\u0004eπ`N\u0012\bgEFi?\u0007ypԀ\u0006DA4އ?,4VDLu\u0015\u0019Aі\u001c\u001b6\u000e8MZ}41,`i#\u001a#,x9&\u0010\u000ba4<)E\u0005V{jh\fк[\u0014\u001a%{Iaf2#0Hn0EK\u001b{JT4\"\u0014q\u0002ddWD)\u0014\u0003x֟\u0014\u000fd8\u0007L&5\u0010\u000b\u0004@\u000fdoj6m\u0014\u00127Hŕ\u0003\u001e٠\\F]H\u001bpqU\u0019\u000eXP8K\u0010!\u001bqCsq\u0003\u0018#RFͪ#,bb\u001a\b#3 \\yI$8T\u0004'J\u0018\u001ah\u0019\u0004iJ(R@\u0010Prw=7;}HoBso՝Lv\u001d1\u0016|w!\t/b`@\u0006\u0014\u001286\u000f\u000f:\u0014%U\u001a8l Մ.`\u0006\u0019K6\u0006 \u001f=:p+SNp\u000b&a\u000f\u001fGeWq.\u0014[\u0019.|CRTW@~SQ*\u000e\u0002\u0002):#\u0011\t\u0018\u0018a\f,C`\u0011I#\u00048>G3!]+\u001bi=MU\u0017#-khaѱ\u0001(\u0017b#ۣv26\u0001_g5\u000e^;_bt'EF}\u0007ƀ$RT\u0012#\u0015$_#bö\\9\u0013\u001dhz8.ܩ2R(a\b☍%Bx0:\u0005\u0007\u0010#3LA;F[K\"\u0012[@U\f`tQkwmJ֌R)Iy#нJ-\u001a>;``Ģ\u0007eM\u001d 1^l\f~3h\u0015U\u0006\u0004d*h\fb·&?/\t{\u001f{=\u001c\u0007͈V5\u001e\u0015P\u0016\u0015C\u0003\u0014#-RTڷ݆|޸\u001akϕLg7:K\t\u001d3aW*\u0013Y.\u0015\u0007!Ċz|P͚\u0012)\u0018U\u00156?]VmU\"yyG\u0017pl\u000b8R%T:+\u001c}\u0019PKm.TQ\u0018\u0014DPȐ#,L̉\u0001\u0014k-b\\\u0010?\u001b#-\u0010V9=MXS2\u0018\"\f`nŋ\u0012(@DYpp\u001c$(YE&\u0016ѝ\u0018\"g`\u0014\u00192j;#,\fzѱ\u0006\u0019fk@2%̡\u001c\u0014Y\u0011:)ٜb\tU.!\\7CͰN\u0018\u001a$,EC\u0004\u0003rN0\b\u0005ą\u0011c\fU\u0010\\\u0011\\\u001bӫGT4fJ-A\\j=4бVE7#3A\u001b3::\u000bޤ#\u0005Y\u0012-ms=rkܲX\u0010\"\u0010\u0006ζ5\u000f\u0016I \u000ep\u001aW데\u0007ۥ/#!\u0002#3\tV*K!\u001da\u001cB8P\\`\u0003\u001clqj\u001d\u001f\u000b]#-ӡ`\u0010u˶&9fV=6:rS1,z\u0004v%\u0014\u001c60\\3!\fkL0q8ev\u0018Nq8\u0019D3qf%H\u0004+LH\u0011h6\u0003\"SH\u0006&!\u001c#,)\u0001iiH\u0002\u0015ҧR㤣jCé\u001cv\u001aSTo+1rw3Q\u001e^O#-\"\bX3Fxzc|\u0018\u0006`CF8\u0006\f\u0018:\u0019p|q;%XK\u0016ֆ#,t\u001c:!H`ZDQ,3#\\\u0011XcX\u0004\u001bAh7mj\u0018%*AONu|mq<d\bk75dOOn\u001cYD#-3BzwfEd9\u001fl\u000e\u0019\u001cW&ơ\u0010\"9aT\u001brX2\u001b붍(:\t\u0002Ԭ@\u001aUv\"%rIe6\u0017QK'gX\u0004Ѱ\u0002ǻ!F3\bL\u001d\u0016w88\u0012)\u0002\u001fXcU;\"#-L*in1n\u0012[ӛ&x&߱\u0019`}0w2淒Kg{H)ݳ%@\u0001\u0007ڙju\u000b>r+RfCv\u001b\u001dcmVN\u00010ltBhY\u0011Lh\u001aF0`8ksC,$\u0001#3\u001c]'F\b\u000b\u00189WF:\u0012sS0\u0006p8#-\u0015PF\u001dg\t$\u00108U\u0002!\"ofA&y\u0018KTe\u001d c,P&4W9\u0018HD\bHٖ)Ƨ_jŹ\fpW\u000blZ\u001b\u0011tW9\u0004GV\u0014vr5-\u001bLңG(\fb\u001a\u0018\u001aiQ0X\u000f\u0003wjQn\u00127qㆎd30\u00026Lc\"#-B\\\u0018\u0010]u\u00187F\u000f4Ŷr(r\u000ebi^Bp_Yِ\u0003Q#\u0015Ep\u001c!G㒡\t1>n51\u001e\u001cLa=:#\u000e؋Z\u001cu\u0002s\u000fѣM*p9kIXOb[WL3f#-G\u000e\u0011MG+%ԝǔ`V+t`t\u0018\u0011@m83\u0014%T~ii~#1r-&#-D\u0001hv%\u000b)s%vq\u001d*gdC-\u0004;AA}9IƎ/$0i6\u0006#3`$\u0016\u0018e sgS5Z`[KZl\u00146n0&@1WYv\",;\u0003CɏZҾehc\u0001XaUwNr\b<6s16g3 ošU#-\\\u001d\u000e\\n۩C_#.\u001d%\u001b2\u0015\u0012\u000f&;dK\u001d\u0011\u0011\tS'0\u0007/\u001d\t`n;3H\u0019M\u0014j\"\u00142\u001eb\u0011yQ\b*7uSM2qu>L4pNaZ]#-#-\u000bɕܠ酘e̷#D\u0001\"\t\u0003C!:l%I@\b\u001a3731V$UF15\u0018#-S\u0003$T 6bh!/eRʺ\u0011Qj\u0010\fZ\f\u0016\u001a!\u0012FQ2hkr\u00186n&d2\u0018\u0005!P&#\u001c\u0006D7\u0004u%QH%QSSt93\u001dI#,`.;\u0001f&E hTWDw\u0006f\u0018X8H\u0014؈\u0019\u0010X\u0010QM|#-\u0010jS\u0004BWqL\u0005%\u0016LԐv J=_b(*1h\u0012o\u000e:|%x\"C5QXD\u0002\u0003Q@\ffoF\u001f=30q5\u0019_iD5M+bj':֫3,;J/\u001cFYFo6U\u0014=y*G\u0014۽È\u0012\u001b\tsՍ\u0019qU\u0004&Y\u001b\tn=Q@Z\\wjwp \u001f w1Mp@a'\u0001aՐ_#3)M\u0013NҲ\"};52j6m\u0016S\u001deJ\"oĹ03V\u001c\u0004i\u0015ZlK\fbx,UDJ\u001e|M\u001dMq\u001cҺ\u001e\u0005Jx\\R$\u001bB}*#-+ٲO\u0005.~#։ޓfȊ6^e\u0017\"v\u000f/}H\u0005}e\u001fR'I\u001c$L辻܇#,#-)2r>Zd\u001dA\u0010\u000fGHjB\u0015K^UiK.J<C!<o1щ\u0011Y\u00164K\u0012g;.o,I4kVU \u0018\f#\u0016H!!\bK$)\u0006G\u0010%\u0010\fb\bA*\b\u0014VÆ%\u001a\u0007I\u0001#,'{tl\u001aC7qD˔,[5\f2\u000e\u0010\t ȉ\u0001\u0018\u001e~\u001fwOm\u001fD\u0017#,<\u0011\u000b\u001d\u0011>5\u0011+#-?gr\u0018\u0013\u0012\"c\u0019j(.As\f>zű5Dm}q3,%\u0007\"'QȐSa'Pms<#3:vөj\"\u000e$E}f!\u000fPBG~3p@=\u0019YX:iY\u0013u\u0012xYz̥2|RBqnf|\bSu{\u0017Y=wBuP\"\bny\u0001\u001a$J%\"/ftMN4\tI/<t*bk~t&Pj\u0019=Fw\f2\u00062=(\u001f\u00076kZmm#3YJI_MU֓W-\u001ai+\u0015-hPH\u0010Vю#-\u0003\u0006TI\u0005,F!\u0005ɊH+\u0001o\u0005{#T',Cu\u0002vь\u0016@UC~ǆvjǢ\u001du4\u0015\u00180b#,PQ\u0010n\u0019}\u001dHh*}3\u001cf\tу\u0001@P$\u0011D,d0\u0018E\u000b\u000e\u0006n::xf(\f_\u00102BWI\b\u00190d\u0019\u000148\u000eR!\u00152RH\u0015\u001eyEҫsFwmjj̽]\u0015Br\u0013)5*;k\u0007#,BІ\u0016`:VVA;psqɅ5!in)\u0015\u0007\u001dŃ\u0014a0!;\u0014]\u001agʦ%ccf\u0002\u000e}CɬƫBA\u0004-\u0006\u0016XKQ,,C\u00048\u0011J@\u0001\u0011Ҁ\u0010ba$(Ld/+#3fglHl\u0010}|ށbMA\u001eov%ZJ\u0010,i!ʅ_G\u0017U\u0016O\u0007=[f!\u001d\bGhٝ[)0XPt\u001c.\u0015U%R\u0010P\">78iً\u001dHOj#3\u0011\u000fyaI\f4\t.T#,3DG~c>0I~->\u000fI?\u001e\bF)d\u0004 y{zj[hٖ52iL\u0011%C(ec5\f\"\u001a鮔\bRƄ(VR\u00122\u0014N\u0007_d\u0006\u00048~<N&ȣgpr\u0001{#,/v\b\u0001H8xl7A$B@C@Q\u001b&GL\u0013ßXul\u001eP\u0001@\u0007\u0014\u000eb'7^I\u000eˏ<kof39YtUr\u0010\u0012W}|MB~%0a#rE;4Ӓ(\"i1XY\u001d:E\u0006d<%KH:E+G~CXJ5V#3k`c6\u000e\u0010C-0B\u0019K#\u0010r~\u0019ZYkt\u00184\u0003L;vw.\u001bM\u0014\u0002\u000b\"@\u0003e\u001c\u0007SRGw\u0013}$OR\u0004$\b }\u0018D\u0017\u0006TN\u0019S\u0017Z2\u0018a]Z\u000e06pM\u000bN#eCؤJen`\u001bt\u0011@\u0005B\u0001v6Y] R)eZԠA\u0011b&i!\u000bE1౏X>[\bJUT\"2\u000frr\u0007\u0011P$ E`AA\u0003\u0001^\u000fl{:0>GS)UӠ\u0016bl$\u0019\u001b\u0003\u00182@|@Rj#3~G_0^\u0012 \"E#-Lb\u0013|*75\u001b\u0019\u001f`Oo\u0010\u0017r\u001aK1zXX\u001dM92<\u0002)_7Bw_Ƚ$r745D\u000bm?\u0007zs`\u0018#3RDXs-?k+*#-դO&\u0002w@B\u0018\u0007%w\u0010/,\u0016\"\u0018ιXRE!(t\u0019pUml?\u0011).X^.m5]-ʡ\u0011/uۨ\u0003\t&KQD\fQ\u001a底66+\u0006\u0003#3 ~Ċn\b\fo>G\byAA\u001cC\u001ep,3\u001ebJXz\u0001{@{;d\u0016@`$\u0018\u0001$\u000fA\f\u001dHA \u0010\u0012Xe-I~_ڍu_)\u0014TC\u0014Q4e,ҵ#3yRB0/\u0013\"TD\tK]#-L\u0004\b\u0016HsHNu\u0015@?S\u0016\u001aMsf&MDͨVZdm 'yJԵ\u0016\u0004\u0004{h#,D\"\u0016\"\u0016PMT\u001aw\u000bQ&bK\u0002\u0018\u00069:~[bs'K\u0004\u000f\u001a\u0006=p$X#-n2 yd=\u0013#-{\u00160%$!\u0016\u0015EvKH\u0014ipbAK/փtaq\u001c`2\tG\u001be8=j\u0005\u0005\u000faaLN\u0001L\u0010\u0018A}@ hJB#3\u0010Tj\u0011JlڛiӾwn.lw\u0012`U\u0001\u0011WP%#3l\u001e0J(H(HZe˿u#-#p\bazZH*\u0007x1d*\u0014~\u0002ݜB>!~B\u0013h7\f%섭6@\u0013-L?v<|Z\u001atlrvK\u001bc?\u0017\u0014\u001em_TK#-LTdk\u0014bJ#3Pc+~F׈\u0016m%@SSel_? X\u000b\u0018@\u0005\u001a<SDӟYT(v#-=\u000f#ߺZ\u0007\u000bVVjcVj\u0016(k\u0014&lƵ\bHO\u0013kۙ͝JR@ӗ\u001f}\u0003\u0004o\u0005]\u0018~FYzH@#,,(\u001c\u001a@\u0019d\u0011}|+CaX\u0004e\u0002-#\"T0aq\u0001*@o\u001b E2C[䔫\\D\u0003`HX\u0013a\u001a@\u0004c\u0001ؒ\u0015j4ZQ6~|M\u0015ެ\u0004\u0019ݢ\tkΪFMkPju&8d-Q41# \f\bWB7R\u001f\u0014X#\u0001B1#-\t\tvKǐڷiY*tMrܺk]i,[S3*Tڔ5vd\b\f\u0005\u0005a.B+\u0016\u0016\b\u000f/zޯ/.nsJA\u001bKjRl]6[)\u0005\u0010B\tjf\u0013\fpY.\u0010 #3\u0006#3K0(,&*Z\u0015<r\u0011\u0010*\u000eFě-b\u0005S\u00126,X7/v\tƦ\u0014Rь)z\u001a=\u000buN\u0004\u0006BB^yV|վ؅U\u00147b\u0012bH\u0010h kcb}\b2TN_%\",d\t\u000bZesm#wpo M1hXr\u0011_\u0016\u0007\"*\u0003Q\u0018mS#-T`~6ov*\u001bኄX5\"\u001c0#-`O}l8Ky`}\u001a\u001e\u0006tƼ̗QqB\u0007\u0010C\u0018#-jv\t\u0002h,#-f\u0002\u0005\b6<\u0013C,>y\b\u00146K\"b\u001cK\u0019#%aC\u0019\u0004'f\b\"\u0016r{\u000f5l\\\u0003JX˹I@L\u0018\fQCP &R44\"s\f\u001echBV\u001adq\u000bL{\u0017Fe˺?s\u000buĵ[ӺNe\u001f:j\u000e\b4\u00075\u0016: \"kԃPni:V\u001dP8KcY&d9hTJK@]\u0002PP#3K #\b\u0011CD#,\u0011#,fGs\bsw`9DQ,@.Eh#-\u0013YóY1\u0005AXuZ5zz\u0014R\u001fu$E'\u001bB#3P?:\u0010\u001d W\u0005\u000b\u0014'\u0004\u000e̘ίhB1.PU\\a\fxK,Cٍu.\u0011\u0014\u000e1/\b\bi\u0010{ۿww\u001fw[?y?\u000f\u001f?\u001f\u001f\f?7>?}<N#-~r!g?a\"&Ǽ!)n*U(H\u0016b\u000f@CH\u0017\u0010\u0013yhyKwt$\t33=\u0005Np\u0002\u0006âU\t;htB#,Z`6v/?ł?y\\\u000fy\u000bsFgP*\u0012\u001e߁B=\u0012\br\u0005pJ'y:\u0001Ӑ%0\u0002g :րxMy~GK?wxx\u00174{&\u0015#3?ρcAb]#-#,\u000f\u0011I\u0002:pӚp\u000eϦr\u0011-i\u0011B\u0015kV.7#3 |ƷplVB\u001c\u000f>\\Lax8f1RWbG\u000e\u0018cQ#3E.+\\hV\f&ŦS\fCJ\u000f{N\u0010\u001a&&\u001bti7A\u0001\\#-DM*\u0011\\2\u001bzh\u0013i\u0010|(3\u001aڸ\biC\\6~6%\u001bģO..rT`#-Bl;\u0019 0^SN\u000b=eLJ\u0013~fx9ۤ\u000e\u00105(\u0004_K\u0007V\u0011t՛yf\u0018\t\u000b\u0015Pb{U{h\u001a#-\u0013ސYrqx2xcX0\u0007eDa$%\u000f~\u001aCm΅1W+kۆ#^\u001b\u0005ݗDR\u000fׇgL\u0012Fqbf\u0011\t銐P.\u001dwS~@]\u0007#hH&\u0012ᒆq\u001d\u0015\u0004|\u0005\u0014\u001e'X~6\u00041$\u0014\u0019\u00020P\u0010˴e!C5X#,0$K{\b>bXG`녂|o\u0016܆]\u0016wX\u00100ѵ\"936-ZQ\u00115ss[YD.%BATZʶJkLC`.vWu\u0003\u00150@\u00137\u0006q\u000f`*@E\u0004KbJ\u0003.\u0001\u0001JPtC\u001d~Hޑ$}u0~Ǜ\u001fZVYvpLо0\u0007!~9\u0001R*#C}R\u0012ф-6c\f4)FsTJul~RW\u001b8\u0006\u0010\u000eAy9Hsa\u0002e\u0015]*Se`nL2\\as.\u000b#\u0019:*l4O#-'&^\u000f}'\u001b/e,Ȅ@\u0010ʈjI2P\u0005aYQJ^kZ|u**Rhm\u0011_\u0001(м\u001df\u0006Ӭ\u001d\"5\u0014a+O(~Zm3/\txg5)\u000b22H#-\u0001\u0016\"Q`\u0012TS.7Ϡ<*,XJ0?+QtC\u0006E\t\t|ˡ\u0014-3\u001d<\bG7O\u001ee\u0018C`+~F§How֢0*\u0015\u001a$\b@E+\u0003%\u0007\u0004\u0002l|^Uk󢍢Kh\t\u001bzzj8y#,\u0004jA̹8';},\f6kO<D\u0003S\u00063RyEB\u0018;#-OdQ$d\u001bᩁ\u0005VkRa\u001fPHNޑA0JO\u001f\u0003ۇ*Iwmwj}\u0011ϯ[Yן:\u0016;9\u0013ŗehy|\u0003A(\u001ee\u0002OpKC=~ncg&}nޤE4!7\u0003\u0014\u001e\u0014\u0001D{2M6\u000fQ\u0007h\u0013AEǍɳ\u001fiM1#3+B<mP7oՓGשKv񉒩\u0010}8AS\u000e\u0007\u0004>\u000fbt\u0006q1\u001c\u0017n\u0017Yk\u0012<#DZͣ\u0010\u0005珳\u0019\u0015H\u0012\u0010<\u001fr:g\f.\u0010\u000f\u0004LeX&C\u001d_F0\u001dk;cg>BdO\f\u0003\u0017rE8PE~j\n#<==\n#-----BEGIN PGP SIGNATURE-----\\nVersion: GnuPG v2\\n\\niQIcBAABCgAGBQJW3BWfAAoJEGelZe39+Q5kRU0P/iqc7D5tlzWrwTr9j9oQCMBa\\n7HnJ+rYewgLX/zK07XgsIDa0OyNy7emdG+YRe2EYQHyn+V4QJl7VZLW8cbG0EJiY\\n0Nfjhy6Dk28H9TA3vLkOwFkoQK/jYKFMARZhUOpdQYJ93xmHOkEF/o2Uoa3QtY6O\\noouGuE+iU5RT0r675Sb7X4m8/Lcv1HO2EKhPG4dNWPUytupGVEA/eyDldIOViDN5\\nYUc6Oa6yWOP9g88TjeeT4KcbpxneHAC8AOBRmMjR4/o2ioBX4mMHehJOuEXxJwoD\\n4WE/jTQgf0icAmfm1okg/kJGXE+/QNgvWSfWxgL6/RLHwEA+DNrBI9u8rD3o2VLI\\nHdcyvjWHJfEIWDowZY4XjbhJRvN1dthfcxfXMuBdBuEn275d+JoJZXhHCgvKMqTO\\nkirZrlPcGESPNTiESvScOD3zrONpdKcWGbUaY2bI7nn+m/JwsEuueA8Me2l27R8M\\nmUBycqxI5iHMLXEzQO2LztRVsx9tF23ReaLAj0mj9G32qjYwKiu49tPFrGywLlnq\\nJpRZQGUH4AX51GEYed/9uzoTb0L8PbGuQhRYhtaSY+WT+nxq4gnrhm4v+rvcXGXi\\nA440RRlTP2AqZXXNMUP03DV26/5O2zVzssPhtN9W5aNb07LJH3vj1cjiRp/m++Sa\\nxGMK2mRBBCWRJ5m/YyrH\\n=pYvc\\n-----END PGP SIGNATURE-----\\n\n"
  },
  {
    "path": "wscript",
    "content": "#! /usr/bin/env python\n# encoding: utf-8\n# SkyzohKey, 2016\n\nfrom waflib import Utils\n\n# the following two variables are used by the target \"waf dist\"\nVERSION = '0.1.0'\nAPPNAME = 'ricin'\n\n# these variables are mandatory ('/' are converted automatically)\ntop = '.'\nout = 'build'\n\ndef options(opt):\n\topt.load('compiler_c vala')\n\topt.add_option('--enable-docs', action='store_true', default=False, help='Generate user documentation')\n\topt.add_option('--enable-text-view', action='store_true', default=False, help='Enable use of GtkTextView to display messages')\n\t#opt.recurse('tests')\n\ndef configure(conf):\n\tconf.load('compiler_c vala gnu_dirs intltool glib2')\n\tconf.check_vala(min_version=(0, 28, 0))\n\n\tconf.check_cfg(package='glib-2.0', uselib_store='GLIB', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='gio-2.0', uselib_store='GIO', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='gobject-2.0', uselib_store='GOBJECT', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='gmodule-2.0', uselib_store='GMODULE', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='gtk+-3.0', uselib_store='GTK3', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='libsoup-2.4', uselib_store='SOUP', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='json-glib-1.0', uselib_store='JSONGLIB', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='libnotify', uselib_store='NOTIFY', mandatory=1, args='--cflags --libs')\n\tconf.check_cfg(package='libtoxcore', uselib_store='TOXCORE', mandatory=1, args='--cflags --libs')\n\tconf.check(lib='toxencryptsave', uselib_store='TOXES', mandatory=1, args='--cflags --libs')\n\n\t# C compiler flags.\n\tconf.env.append_unique('CFLAGS', [\n\t\t'-fsanitize=address',\n\t\t'-Wall',\n\t\t'-Wno-deprecated-declarations',\n\t\t'-Wno-unused-variable',\n\t\t'-Wno-unused-but-set-variable',\n\t\t'-Wno-unused-function',\n\t\t'-Wno-incompatible-pointer-types',\n\t\t'-Wno-int-conversion',\n\t\t'-Wno-discarded-qualifiers',\n\t\t'-Wno-unused-label',\n\t\t'-Wno-format',\n\t\t'-Wno-strict-overflow',\n\t\t'-DGETTEXT_PACKAGE=\"ricin\"',\n\t\t'-O3' # Optimizatiooooons!\n\t])\n\t# Linker flags.\n\tconf.env.append_unique('LDFLAGS', [\n\t\t'-fsanitize=address'\n\t])\n\t# Vala compiler flags.\n\tconf.env.append_unique('VALAFLAGS', [\n\t\t'--enable-experimental',\n\t\t'--enable-deprecated',\n\t\t'--debug'\n\t\t#'--fatal-warnings'\n\t])\n\n\t#conf.recurse('res tests')\n\n\tif conf.options.enable_docs:\n\t\tconf.env.ENABLE_DOCS = True\n\t\tconf.recurse('docs')\n\n\t# TODO: Add a way to enable this.\n\tif conf.options.enable_text_view:\n\t\tconf.env.ENABLE_TEXT_VIEW = True\n\ndef build(bld):\n\tbld.load('compiler_c vala')\n\t#bld.recurse('src')\n\t#bld.recurse('tests')\n\n\tif bld.env.ENABLE_DOCS:\n\t\tbld.recurse('docs')\n\n\t# TODO: Add a way to enable this.\n\tif bld.env.ENABLE_TEXT_VIEW:\n\t\tpass\n\n\n\t# Lang files\n\tlangs = bld(\n\t\tfeatures     = 'intltool_po',\n\t\tappname      = APPNAME,\n\t\tpodir        = 'po',\n\t\tinstall_path = \"${LOCALEDIR}\"\n\t)\n\n\t# Icon\n\ticon = bld.install_as('${DATADIR}/icons/hicolor/scalable/apps/ricin.svg', 'res/images/icons/ricin.svg')\n\n\t# Appdata\n\tappdata = bld.install_as('${DATADIR}/appdata/ricin.appdata.xml', 'res/ricin.appdata.xml')\n\n\t# Desktop file\n\tdesktop = bld(\n\t\tfeatures     = \"intltool_in\",\n\t\tpodir        = \"po\",\n\t\tstyle        = \"desktop\",\n\t\tsource       = 'res/ricin.desktop.in',\n\t\ttarget       = 'ricin.desktop',\n\t\tinstall_path = \"${DATADIR}/applications\",\n\t)\n\n\t# Resources file\n\tresource = bld(\n\t\tfeatures = 'c glib2',\n\t\tuse      = 'GLIB GIO GOBJECT',\n\t\tsource   = 'res/ricin.gresource.xml',\n\t\ttarget   = 'ricinres'\n\t)\n\n\t# Ricin\n\tricin = bld.program(\n\t\tappname          = APPNAME,\n\t\tfeatures         = 'c cprogram glib2',\n\t\tuse              = 'ricinres',\n\t\tpackages         = 'glib-2.0 gio-2.0 gobject-2.0 gmodule-2.0 gtk+-3.0 libsoup-2.4 json-glib-1.0 libnotify libtoxcore libtoxencryptsave',\n\t\tuselib           = 'GLIB GIO GOBJECT GMODULE GTK3 SOUP JSONGLIB NOTIFY TOXCORE TOXES',\n\t\tvala_target_glib = '2.38',\n\t\tsource           = bld.path.ant_glob('src/*.vala'),\n\t\tvapi_dirs        = 'vapis',\n\t\tvala_resources   = 'res/ricin.gresource.xml',\n\t\tvalaflags        = '--generate-source',\n\t\ttarget           = 'Ricin',\n\t\tinstall_binding  = False,\n\t\theader_path      = None,\n\t\tinstall_path     = \"${BINDIR}\"\n\t)\n\n\t# Now that everything is installed, lets update icons cache and desktop db\n\tif bld.cmd == 'install':\n\t\ttry:\n\t\t\tbld.exec_command([\"update-mime-database\", Utils.subst_vars(\"${DATADIR}/mime\", bld.env)])\n\t\t\tbld.exec_command([\"update-desktop-database\", Utils.subst_vars(\"${DATADIR}/applications\", bld.env)])\n\t\texcept:\n\t\t\tpass\n"
  }
]