diff --git a/LICENSE b/LICENSE index 261eeb9e9f..94a9ed024d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,674 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 55bfdec3e5..bb10c50783 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# v2rayN \ No newline at end of file +# v2rayN + +### How to use +- Download exe from release download +- Also need to download v2ray core in the same folder +- Run v2rayN.exe + +### Requirements +- Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher +- Project V core [https://github.com/v2ray/v2ray-core/releases](https://github.com/v2ray/v2ray-core/releases) diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln new file mode 100644 index 0000000000..02f175e531 --- /dev/null +++ b/v2rayN/v2rayN.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.Build.0 = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.Build.0 = Release|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} + EndGlobalSection +EndGlobal diff --git a/v2rayN/v2rayN.v11.suo b/v2rayN/v2rayN.v11.suo new file mode 100644 index 0000000000..91d8fcf081 Binary files /dev/null and b/v2rayN/v2rayN.v11.suo differ diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs new file mode 100644 index 0000000000..0e407a4313 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -0,0 +1,140 @@ +namespace v2rayN.Forms +{ + partial class AddServer2Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // AddServer2Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AddServer2Form"; + this.Load += new System.EventHandler(this.AddServer2Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txtAddress; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs new file mode 100644 index 0000000000..a88afb44d6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -0,0 +1,75 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer2Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem; + + public AddServer2Form() + { + InitializeComponent(); + } + + private void AddServer2Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + BindingServer(); + } + else + { + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + vmessItem = config.vmess[EditIndex]; + txtRemarks.Text = vmessItem.remarks; + txtAddress.Text = vmessItem.address; + txtAddress.ReadOnly = true; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string remarks = txtRemarks.Text; + if (Utils.IsNullOrEmpty(remarks)) + { + UI.Show(UIRes.I18N("PleaseFillRemarks")); + return; + } + vmessItem.remarks = remarks; + + if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx new file mode 100644 index 0000000000..c98d40e0ec --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtAddress + + + Address + + + 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + txtRemarks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer2Form + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + panel2 + + + + 12, 27 + + + Fill + + + True + + + 313, 21 + + + groupBox1 + + + 6, 12 + + + True + + + Alias (remarks) + + + 127, 23 + + + 6 + + + 7 + + + groupBox1 + + + 113, 12 + + + 4 + + + Server + + + 23 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 611, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit custom configuration server + + + 432, 104 + + + 611, 10 + + + groupBox1 + + + * Fill in manually + + + 11 + + + 10 + + + panel1 + + + 75, 23 + + + 2 + + + btnClose + + + 303, 17 + + + 0, 211 + + + 75, 23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + Top + + + 0, 10 + + + 3 + + + 611, 201 + + + 2 + + + 4 + + + 3 + + + 127, 62 + + + groupBox1 + + + True + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 83, 12 + + + &Cancel + + + 12, 62 + + + &OK + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 446, 26 + + + groupBox1 + + + label6 + + + $this + + + 1 + + + 0, 0 + + + panel2 + + + label13 + + + 83, 12 + + + 22 + + + 1 + + + panel2 + + + 5 + + + 611, 271 + + + 0 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 396, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx new file mode 100644 index 0000000000..a01d4dfa83 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + *手填,方便识别管理 + + + 别名(remarks) + + + 地址(address) + + + 服务器 + + + 确定(&O) + + + 编辑自定义配置服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs new file mode 100644 index 0000000000..3515e6b98e --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -0,0 +1,231 @@ +namespace v2rayN.Forms +{ + partial class AddServer3Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer3Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label13 = new System.Windows.Forms.Label(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.cmbSecurity); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // cmbSecurity + // + this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity.FormattingEnabled = true; + this.cmbSecurity.Items.AddRange(new object[] { + resources.GetString("cmbSecurity.Items"), + resources.GetString("cmbSecurity.Items1"), + resources.GetString("cmbSecurity.Items2"), + resources.GetString("cmbSecurity.Items3"), + resources.GetString("cmbSecurity.Items4"), + resources.GetString("cmbSecurity.Items5"), + resources.GetString("cmbSecurity.Items6"), + resources.GetString("cmbSecurity.Items7")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); + this.cmbSecurity.Name = "cmbSecurity"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // menuItemImportClipboard + // + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; + resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); + // + // AddServer3Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = true; + this.Name = "AddServer3Form"; + this.Load += new System.EventHandler(this.AddServer3Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbSecurity; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs new file mode 100644 index 0000000000..c39f2cfe5e --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -0,0 +1,143 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer3Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServer3Form() + { + InitializeComponent(); + } + + private void AddServer3Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + cmbSecurity.Text = vmessItem.security; + txtRemarks.Text = vmessItem.remarks; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + cmbSecurity.Text = Global.DefaultSecurity; + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string security = cmbSecurity.Text; + string remarks = txtRemarks.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillPassword")); + return; + } + if (Utils.IsNullOrEmpty(security)) + { + UI.Show(UIRes.I18N("PleaseSelectEncryption")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.security = security; + vmessItem.remarks = remarks; + + if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入配置 + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void menuItemImportClipboard_Click(object sender, EventArgs e) + { + ImportConfig(); + } + + private void ImportConfig() + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + cmbSecurity.Text = vmessItem.security; + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + } + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx new file mode 100644 index 0000000000..f2f23bbab5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -0,0 +1,606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + True + + + 337, 158 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + aes-256-cfb + + + aes-128-cfb + + + chacha20 + + + chacha20-ietf + + + aes-256-gcm + + + aes-128-gcm + + + chacha20-poly1305 + + + chacha20-ietf-poly1305 + + + 127, 120 + + + 194, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 127, 154 + + + 194, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 12, 158 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 12, 124 + + + 65, 12 + + + 8 + + + Encryption + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 85 + + + * + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 89 + + + 53, 12 + + + 4 + + + Password + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 56 + + + 194, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 60 + + + 71, 12 + + + 2 + + + Server port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 31 + + + 89, 12 + + + 0 + + + Server address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + + Fill + + + 0, 35 + + + 547, 196 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 231 + + + 547, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 235, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 547, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 547, 291 + + + Edit or add a [Shadowsocks] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer3Form + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx new file mode 100644 index 0000000000..2a5968cafd --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + *手填,方便识别管理 + + + 别名(remarks) + + + 加密方式 + + + 密码 + + + 服务器端口 + + + 服务器地址 + + + 服务器 + + + 确定(&O) + + + 从剪贴板导入URL + + + 扫描屏幕上的二维码 + + + 导入配置文件 + + + 编辑或添加[Shadowsocks]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs new file mode 100644 index 0000000000..fb950a5c98 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs @@ -0,0 +1,188 @@ +namespace v2rayN.Forms +{ + partial class AddServer4Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer4Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + // + // menuItemImportClipboard + // + resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; + this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); + // + // AddServer4Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = true; + this.Name = "AddServer4Form"; + this.Load += new System.EventHandler(this.AddServer4Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs new file mode 100644 index 0000000000..edb8051666 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -0,0 +1,122 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer4Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServer4Form() + { + InitializeComponent(); + } + + private void AddServer4Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtRemarks.Text = vmessItem.remarks; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string remarks = txtRemarks.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.remarks = remarks; + + if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入配置 + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void menuItemImportClipboard_Click(object sender, EventArgs e) + { + ImportConfig(); + } + + private void ImportConfig() + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtRemarks.Text = vmessItem.remarks; + } + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx new file mode 100644 index 0000000000..d1e34f1a16 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtAddress + + + Server address + + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + groupBox1 + + + True + + + menuServer + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + txtRemarks + + + + 194, 21 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer4Form + + + 89, 12 + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + panel2 + + + 12, 158 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 194, 21 + + + groupBox1 + + + 6, 12 + + + 547, 25 + + + True + + + Alias (remarks) + + + 127, 154 + + + groupBox1 + + + 6 + + + 7 + + + groupBox1 + + + 113, 12 + + + MenuItem1 + + + Server + + + 162, 21 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 2 + + + 547, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit or add a [Socks] server + + + 359, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 547, 10 + + + * Fill in manually + + + 4 + + + 10 + + + 71, 12 + + + 0 + + + panel1 + + + 75, 23 + + + 12, 60 + + + 1 + + + $this + + + btnClose + + + label6 + + + 8 + + + 303, 17 + + + 127, 27 + + + 75, 23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + Top + + + 0, 35 + + + 2 + + + $this + + + panel2 + + + 547, 196 + + + 2 + + + 6 + + + 235, 22 + + + 4 + + + 3 + + + True + + + 5 + + + groupBox1 + + + txtPort + + + 127, 56 + + + 95, 12 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + Import URL from clipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &Cancel + + + 12, 31 + + + &OK + + + 11 + + + 0 + + + Server port + + + 337, 158 + + + groupBox1 + + + Import configuration file + + + 0, 0 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + 1 + + + 0, 25 + + + 1 + + + label13 + + + 3 + + + label2 + + + groupBox1 + + + panel2 + + + 0, 231 + + + 22 + + + 547, 291 + + + 0 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuItemImportClipboard + + + $this + + + 396, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 17, 17 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx new file mode 100644 index 0000000000..40b56c76aa --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 服务器 + + + *手填,方便识别管理 + + + + 83, 12 + + + 别名(remarks) + + + 65, 12 + + + 服务器端口 + + + 65, 12 + + + 服务器地址 + + + 确定(&O) + + + 92, 21 + + + 导入配置文件 + + + 171, 22 + + + 从剪贴板导入URL + + + 编辑或添加[Socks]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs new file mode 100644 index 0000000000..c398397bec --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -0,0 +1,516 @@ +namespace v2rayN.Forms +{ + partial class AddServerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnGUID = new System.Windows.Forms.Button(); + this.label13 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label24 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.label22 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.label20 = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtAlterId = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnGUID); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.groupBox2); + this.groupBox1.Controls.Add(this.label9); + this.groupBox1.Controls.Add(this.label8); + this.groupBox1.Controls.Add(this.cmbNetwork); + this.groupBox1.Controls.Add(this.label7); + this.groupBox1.Controls.Add(this.cmbSecurity); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtAlterId); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // btnGUID + // + resources.ApplyResources(this.btnGUID, "btnGUID"); + this.btnGUID.Name = "btnGUID"; + this.btnGUID.UseVisualStyleBackColor = true; + this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label24); + this.groupBox2.Controls.Add(this.label23); + this.groupBox2.Controls.Add(this.panTlsMore); + this.groupBox2.Controls.Add(this.label20); + this.groupBox2.Controls.Add(this.txtPath); + this.groupBox2.Controls.Add(this.label19); + this.groupBox2.Controls.Add(this.label18); + this.groupBox2.Controls.Add(this.label17); + this.groupBox2.Controls.Add(this.label16); + this.groupBox2.Controls.Add(this.label14); + this.groupBox2.Controls.Add(this.label15); + this.groupBox2.Controls.Add(this.cmbStreamSecurity); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.txtRequestHost); + this.groupBox2.Controls.Add(this.label11); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.label22); + this.panTlsMore.Controls.Add(this.label21); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // cmbAllowInsecure + // + this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAllowInsecure.FormattingEnabled = true; + this.cmbAllowInsecure.Items.AddRange(new object[] { + resources.GetString("cmbAllowInsecure.Items"), + resources.GetString("cmbAllowInsecure.Items1"), + resources.GetString("cmbAllowInsecure.Items2")}); + resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // txtPath + // + resources.ApplyResources(this.txtPath, "txtPath"); + this.txtPath.Name = "txtPath"; + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + this.cmbStreamSecurity.Items.AddRange(new object[] { + resources.GetString("cmbStreamSecurity.Items"), + resources.GetString("cmbStreamSecurity.Items1")}); + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // cmbHeaderType + // + this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbHeaderType.FormattingEnabled = true; + this.cmbHeaderType.Items.AddRange(new object[] { + resources.GetString("cmbHeaderType.Items"), + resources.GetString("cmbHeaderType.Items1"), + resources.GetString("cmbHeaderType.Items2"), + resources.GetString("cmbHeaderType.Items3"), + resources.GetString("cmbHeaderType.Items4"), + resources.GetString("cmbHeaderType.Items5"), + resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); + this.cmbHeaderType.Name = "cmbHeaderType"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + this.cmbNetwork.Items.AddRange(new object[] { + resources.GetString("cmbNetwork.Items"), + resources.GetString("cmbNetwork.Items1"), + resources.GetString("cmbNetwork.Items2"), + resources.GetString("cmbNetwork.Items3"), + resources.GetString("cmbNetwork.Items4")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // cmbSecurity + // + this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity.FormattingEnabled = true; + this.cmbSecurity.Items.AddRange(new object[] { + resources.GetString("cmbSecurity.Items"), + resources.GetString("cmbSecurity.Items1"), + resources.GetString("cmbSecurity.Items2"), + resources.GetString("cmbSecurity.Items3")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); + this.cmbSecurity.Name = "cmbSecurity"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtAlterId + // + resources.ApplyResources(this.txtAlterId, "txtAlterId"); + this.txtAlterId.Name = "txtAlterId"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItemImportClient, + this.MenuItemImportServer, + this.toolStripSeparator1, + this.MenuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // MenuItemImportClient + // + this.MenuItemImportClient.Name = "MenuItemImportClient"; + resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); + this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); + // + // MenuItemImportServer + // + this.MenuItemImportServer.Name = "MenuItemImportServer"; + resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); + this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // MenuItemImportClipboard + // + this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; + resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); + this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); + // + // AddServerForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AddServerForm"; + this.Load += new System.EventHandler(this.AddServerForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtAlterId; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbSecurity; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.ComboBox cmbHeaderType; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; + private System.Windows.Forms.Button btnGUID; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label label23; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs new file mode 100644 index 0000000000..816b70137e --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -0,0 +1,293 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServerForm : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServerForm() + { + InitializeComponent(); + } + + private void AddServerForm_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + cmbSecurity.Text = vmessItem.security; + cmbNetwork.Text = vmessItem.network; + txtRemarks.Text = vmessItem.remarks; + + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + txtAlterId.Text = "0"; + cmbSecurity.Text = Global.DefaultSecurity; + cmbNetwork.Text = Global.DefaultNetwork; + txtRemarks.Text = ""; + + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + } + + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + } + + /// + /// 设置伪装选项 + /// + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + cmbHeaderType.Items.Add(Global.None); + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add("srtp"); + cmbHeaderType.Items.Add("utp"); + cmbHeaderType.Items.Add("wechat-video"); + cmbHeaderType.Items.Add("dtls"); + cmbHeaderType.Items.Add("wireguard"); + } + else + { + } + cmbHeaderType.Text = Global.None; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string alterId = txtAlterId.Text; + string security = cmbSecurity.Text; + string network = cmbNetwork.Text; + string remarks = txtRemarks.Text; + + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillUUID")); + return; + } + if (Utils.IsNullOrEmpty(alterId) || !Utils.IsNumberic(alterId)) + { + UI.Show(UIRes.I18N("FillCorrectAlterId")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.alterId = Utils.ToInt(alterId); + vmessItem.security = security; + vmessItem.network = network; + vmessItem.remarks = remarks; + + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + + if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnGUID_Click(object sender, EventArgs e) + { + txtId.Text = Utils.GetGUID(); + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入客户端/服务端配置 + + /// + /// 导入客户端 + /// + /// + /// + private void MenuItemImportClient_Click(object sender, EventArgs e) + { + MenuItemImport(1); + } + + /// + /// 导入服务端 + /// + /// + /// + private void MenuItemImportServer_Click(object sender, EventArgs e) + { + MenuItemImport(2); + } + + private void MenuItemImport(int type) + { + ClearServer(); + + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Multiselect = false; + fileDialog.Filter = "Config|*.json|All|*.*"; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string msg; + VmessItem vmessItem; + if (type.Equals(1)) + { + vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); + } + else + { + vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); + } + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void MenuItemImportClipboard_Click(object sender, EventArgs e) + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + #endregion + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx new file mode 100644 index 0000000000..e519eab6eb --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -0,0 +1,1392 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + 411, 83 + + + 75, 23 + + + 23 + + + &Generate + + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 285, 203 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + + NoControl + + + 526, 165 + + + 65, 12 + + + 35 + + + 3)QUIC key + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 470, 99 + + + 89, 12 + + + 34 + + + 4)QUIC securty + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + 205, 11 + + + 113, 12 + + + 32 + + + Default value true + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + + + + true + + + false + + + 107, 7 + + + 91, 20 + + + 30 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + 284, 189 + + + 338, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + True + + + 469, 83 + + + 203, 12 + + + 29 + + + 3)h2 host Separated by commas (,) + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + 124, 125 + + + True + + + 396, 54 + + + 28 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 4 + + + True + + + 9, 125 + + + 29, 12 + + + 27 + + + Path + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 5 + + + True + + + 526, 147 + + + 59, 12 + + + 26 + + + 2)h2 path + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + True + + + 469, 68 + + + 59, 12 + + + 25 + + + 2)ws host + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + True + + + 526, 130 + + + 59, 12 + + + 24 + + + 1)ws path + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 8 + + + True + + + 469, 53 + + + 215, 12 + + + 23 + + + 1)http host Separated by commas (,) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + True + + + 9, 201 + + + 23, 12 + + + 22 + + + TLS + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + + + + tls + + + 124, 197 + + + 143, 20 + + + 21 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 11 + + + True + + + 282, 34 + + + 299, 12 + + + 20 + + + *tcp or kcp or QUIC camouflage type, default none + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 12 + + + 158, 58 + + + True + + + 300, 53 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 13 + + + True + + + 9, 34 + + + 95, 12 + + + 19 + + + Camouflage type + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 14 + + + True + + + 9, 62 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 124, 30 + + + 143, 20 + + + 18 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 16 + + + Bottom + + + 3, 237 + + + 723, 234 + + + 21 + + + Keep the default value if it is not clear + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 353, 175 + + + 113, 12 + + + 15 + + + *Default value tcp + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 353, 147 + + + 119, 12 + + + 14 + + + *Recommended (auto) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + 195, 171 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 175 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + aes-128-gcm + + + chacha20-poly1305 + + + auto + + + none + + + 195, 143 + + + 143, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + 127, 199 + + + 143, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + True + + + 12, 203 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 147 + + + 173, 12 + + + 8 + + + Encryption method (security) + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + 127, 114 + + + 143, 21 + + + 7 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 12, 118 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 127, 85 + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + True + + + 12, 89 + + + 53, 12 + + + 4 + + + UUID(id) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + 127, 56 + + + 143, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + True + + + 12, 60 + + + 29, 12 + + + 2 + + + Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 17 + + + True + + + 12, 31 + + + 47, 12 + + + 0 + + + Address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 18 + + + Fill + + + 0, 35 + + + 729, 474 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 509 + + + 729, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 729, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 237, 22 + + + Import client configuration + + + 237, 22 + + + Import server configuration + + + 234, 6 + + + 237, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 729, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 729, 569 + + + Edit or add a [VMess] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClient + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServerForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx new file mode 100644 index 0000000000..7c5b362330 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 服务器 + + + 生成(&G) + + + *手填,方便识别管理 + + + 不清楚则保持默认值 + + + + 95, 12 + + + 3)QUIC 加密密钥 + + + 95, 12 + + + 4)QUIC 加密方式 + + + 53, 12 + + + 默认true + + + 149, 12 + + + 3)h2 host中间逗号(,)隔开 + + + 65, 12 + + + 路径(path) + + + 161, 12 + + + 1)http host中间逗号(,)隔开 + + + 77, 12 + + + 底层传输安全 + + + 197, 12 + + + *tcp或kcp或QUIC伪装类型,默认none + + + 124, 58 + + + 334, 51 + + + 89, 12 + + + 伪装类型(type) + + + 89, 12 + + + 伪装域名(host) + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 113, 12 + + + *随便选,建议(auto) + + + 127, 171 + + + 211, 20 + + + 107, 12 + + + 传输协议(network) + + + 127, 143 + + + 211, 20 + + + 83, 12 + + + 别名(remarks) + + + 113, 12 + + + 加密方式(security) + + + 95, 12 + + + 额外ID(alterId) + + + 65, 12 + + + 用户ID(id) + + + 65, 12 + + + 端口(port) + + + 83, 12 + + + 地址(address) + + + 确定(&O) + + + 92, 21 + + + 导入配置文件 + + + 171, 22 + + + 导入客户端配置 + + + 171, 22 + + + 导入服务端配置 + + + 168, 6 + + + 171, 22 + + + 从剪贴板导入URL + + + 编辑或添加[VMess]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseForm.Designer.cs new file mode 100644 index 0000000000..f23103bbfb --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.Designer.cs @@ -0,0 +1,51 @@ +namespace v2rayN.Forms +{ + partial class BaseForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseForm)); + this.SuspendLayout(); + // + // BaseForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 273); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "BaseForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "BaseForm"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs new file mode 100644 index 0000000000..9d8f9b0efb --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.cs @@ -0,0 +1,39 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class BaseForm : Form + { + protected static Config config; + protected static System.Drawing.Icon icon; + + public BaseForm() + { + InitializeComponent(); + LoadCustomIcon(); + } + + private void LoadCustomIcon() + { + try + { + if (icon == null) + { + string file = Utils.GetPath(Global.CustomIconName); + if (!System.IO.File.Exists(file)) + { + return; + } + icon = new System.Drawing.Icon(file); + } + this.Icon = icon; + } + catch (Exception e) + { + Utils.SaveLog($"Loading custom icon failed: {e.Message}"); + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/BaseForm.resx b/v2rayN/v2rayN/Forms/BaseForm.resx new file mode 100644 index 0000000000..61360d3de7 --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.resx @@ -0,0 +1,1253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAA + AAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAACAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA + AAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAgAAAAKAAAACgAAAAsAAAAMAAAADQAAAA0AAAANAAAADQAA + AAwAAAALAAAACgAAAAoAAAAIAAAACAAAAAYAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAIAAAACAAAABAAAAAUAAAAHAAAACQAAAAwAAAAOAAAAEQAAABMAAAAVAAAAFwAA + ABgAAAAaAAAAGwAAABwAAAAcAAAAHQAAAB0AAAAcAAAAHAAAABsAAAAaAAAAGAAAABcAAAAVAAAAEwAA + ABEAAAAOAAAADAAAAAkAAAAHAAAABQAAAAQAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAAEAAAABwAAAAkAAAAMAAAAEAAA + ABMAAAAXAAAAGgAAAB4BAQAgAgEBIwMDASUDAgEmAwMBKAUEASkGAwMrCAUDKwgFAysIBQMsCAUDLAgF + AysIBQMrBgMDKwUEASkDAwEoAwIBJgMDASUCAQEjAQEAIAAAAB4AAAAaAAAAFwAAABMAAAAQAAAADAAA + AAkAAAAHAAAABAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAHAAAACgAAAA4AAAASAAAAFwAAABwAAAAgAwIBJAUDAicGBAIqBQUCKwICAi0FAwMvCQcEMQgH + BjACAwQwAAECMQYFBTURDgg5GRMJPBwWCz0cFgs9GRMJPBEOCDkGBQU1AAECMQICBDAIBwYwCQcEMQUD + Ay8CAgItBQUCKwYEAioFAwInAwIBJAAAACAAAAAcAAAAFwAAABIAAAAOAAAACgAAAAcAAAAEAAAAAgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAADQAAABIAAAAXAQAAHQIBASIDAgEmBgMDKgQD + AywAAAEtBQQEMRYRCTckHA0+OCoTSlU/G19sUCF1elomhoZjKZWOaCufkmstqphwL7Kccy+3nnQwup51 + MLqccy+3mXEvspNsLaqOaSufh2QqlHtbJ4ZtTyJ1Vj8cXzgpE0okHA0+FhEJNwUEBDEAAAEtBAMDLAYD + AyoDAgEmAgEBIgAAAB0AAAAXAAAAEgAAAA0AAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADwAA + ABUAAAAcAgIAIgQCAicFBAErBAMDLgUEBDAWEQo5QjEWT2BHH2d6WiaHkGssq6B2MMWtfzTbt4Y367+M + OfXEjzv5yZM8/M2WPv7PmD7/0Zk//9KaP//Tmz//05s//9OaP//Smj//0Jg+/82WPv3KlD37xZA7+cCM + OvW4iDjrroA126F2McWRbCyre1smh2FHH2dCMRZPFhEKOQUEBDAEAwMuBQQBKwQCAicCAgAiAAAAHAAA + ABUAAAAPAAAACgAAAAYAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAwAAAAYAAAAKAAAAEAAAABcBAQAeAwIBJAYDAyoBAAEsBwUEMSIaDDxSPBtaelomhpRt + LbGoezPVt4Y37MSQO/nMlj3/0Zk//9WcQP/YnkH/2J5B/9ieQP/XnkD/155A/9eeQP7XnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/9eeQP/YnkD/2J5B/9ieQf/WnED/0po//82WPf/FkTv5uog47Kp8 + M9WVbi6xelomh1E8GlshGQw8BwUFMgEAASwGAwMqAwIBJAEBAB4AAAAXAAAAEAAAAAoAAAAGAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAAEQAAABgBAQAgBAMBJgUD + AysDAgMvGRIKOVQ+G1p+XSiKm3MvvrKDNubCjjr5zZY+/tWcQP/XnUD/2J9B/tieQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5A/9ifQf7XnUD/1ZxA/8+YPv7Djzv5s4M25pxyL799XCeLUj0bWhkT + CzkDAgMvBQMDKwQDASYBAQAfAAAAGAAAABEAAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAJAAAADwAAABcBAQAfBAMBJgMCASsIBgQwMSQRQ2xQIXOUbS2xr4A14cOOO/nPmD7/1p1A/9ie + QP/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tieQP/WnUD/0Jg+/8SPO/mvgTXhlG0usWtOInQwIxJDCAYEMAMCASsEAwEnAQEAHwAA + ABcAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHAAAADQAAABQBAQAdBQQBJQUFAiwGBQQwRDMXTXxc + J4ahdjHKuog48syVPf7VnED/155B/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/9Wc + QP/Nlj3+uok486B2Mcp6WiaGQjIWTgYFBDAEAwIsBAMBJQEBAB0AAAAUAAAADQAAAAcAAAADAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACgAA + ABEAAAAaAwIBIwUDAioHBgQvQDAVSoFeKIynejLTv4w6+NCYPv/XnkD/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7XnkD/0Jk+/8CNOvimejLTfl0njT0u + FEoGBQQvBQMCKgMCASMAAAAaAAAAEQAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAA0AAAAWAQAAHwQDASgDAgIuNScSRHxbJoOnejPSwY06+dKa + P//YnkD+2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/tObP//Bjjr5pXky03hZJoQzJhJEAwMCLgQDASgBAAAfAAAAFgAA + AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAAQAAAAGQQC + AiQDAQIqFBAINWlOIWuedDDBvos59dGZP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/Smj//vYs59ZtyL8JlSh9sEw8INQMBAioEAgIkAAAAGQAAABAAAAAIAAAAAwAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAgAAAAQAAAAKAAAAEwIBAR0FAwInAQECLUg1GE2QaiyjtoU3686WPf/XnUD/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/zpc+/7SEN+yLZiqlRTMXTwEB + Ai4FAwInAgEBHQAAABMAAAAKAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADAAAABUDAgEgBAIBKBoU + CTVxUyNxpnkyzcWQO/zVnED/2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/8WQO/yidzHPak8hcxkTCTUEAgEoAwIBIAAAABUAAAAMAAAABQAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAACAAAABgAAAA0AAAAXAwMBIgIBAis4KhNDj2ksm7iHN+7QmD7/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/tCZ + Pv+2hTfviGQqnTUnEkUDAgIrAwMBIwAAABcAAAANAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAOAQEAGQQCAiQIBgMsXEQdWaB2 + Mb3Djzr51ZxA/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tacQP/Cjjr5mnAvv1U/G1sIBgMtBAICJAEB + ABkAAAAOAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAIAAAAHAAAADwEBABkFAwIlCQcDLnVWJHCvgDXZzJY9/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/LlT3/qHwz2m1QInIJBwMvBQMCJgEBABkAAAAPAAAABwAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA8CAQAaAwIBJhIOBjJ/Xid+toY35tGZ + P//YnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7RmT7/sYI26HZX + JYARDQYzBAIBJgIBABoAAAAPAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAYAAAAOAQEAGgYFASYjGgw4jGcrkLuJOO7Tmz//2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7UnD//toY374FeKJIgGAs5BgUBJwEBABoAAAAOAAAABgAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADQIBABkBAQEkLCENOpJrLZnAjTrz1Js//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/VnED/u4k49IdjKZwpHw07AgEBJAIBABkAAAANAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA + AAwBAQAXBgQBJSwiDjmXby2fw4469tadQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vYs594tmKqEqHg07BwUBJQEB + ABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKAQEAFgMCASImHAw2lm4umMSPO/bVnED+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/VnED+vos59ohkKZsiGgw4AwIBIgEBABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAACQEB + ABMGBAIhFQ8IMJJrLY/Djzrz1p1A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vIo59INh + KZMUDggxBgQCIQEBABMAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAQBQICHQgGAyqHYyl8wI067tWcQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/uIc38HhYJYAIBgMrBQICHQAAABAAAAAGAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADQQD + ARoEAwEnf10mbr2LOebVnED/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/UnD//s4M26HBSInEFAwEnBAQBGgAAAA0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAoFAwIWAQABI2hNIFW5hzjY05o//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/RmT//qn0021tCHFoDAQEjBAMCFgAA + AAoAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAwICEgAA + AB9GNBU/roA0vdCZPv7XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7Mlj3/nXIwwTwsEkEAAAEfAwICEgAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0GBAMbHRUJLaF2MJnMlT35155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Djzv6jGcrnhoT + CC8HBAMbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJBgQDFgAA + ACOGYiluxpE779adQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQ//cq1n/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9adQP+5hzfwc1QjcwAAACQGAwMWAAAACQAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABgIBARAAAAEdW0MbR7mIN83Um0D/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2KFH/+XCiP/pypf/26dS/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZ + P/+nejPRTjkYSgAAAR0CAQEQAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMBAAEKBgMDGBwU + CSypfDOh0Jg+/deeQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Zokf/6cqX//jw5P/qzZ7/2aNL/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155B/seSPP2SayynGBEILQcDAxgBAAELAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAACAAAABwcEAxECAAIghWEoZciSPOvXnUD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr3//n06//mw4v/2aRM/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/reHN+1uUSFqBAICIAcEAhEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAwALAAAAGE05 + Fzm6iDe/1ZtA/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f7+//jv + 4//nxY7/2aJJ/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0Jg+/6F3McVBMBQ9AgIAGAID + AAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABggGAhIHBQMgnHMvf8+YPvbXnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z69//9/f7//f39//jw4v/kvX//2aJI/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YnkH/wY4694JhKIQIBgMhCAYCEgAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAELAQEAGFxC + G0DCjjrR151A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//bs3P/kv4L/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Tmz//q3401Us3 + F0MCAgAYBQMBCwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQkHARACAgEgpXgxh9KaP/rYnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//fz8//br2f/huHX/2KFF/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/FkDv7iWQpjQQCASEJBwERAAAABQAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAwAJAAAAFWhL + H0HGkTzS2J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//Xo1P/iuXf/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSb + QP+tfzTWVD0ZRQAAABUDAwAJAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABAsIAw4HBQIdpnkygNObP/nYnkH+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//fz6//Tl + zv/fs2v/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/sSQO/qJZCmHCQYCHgsIAw4AAAAEAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBQEHBgYAE1Q+ + GTTFkTvI155B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Pky//gtW3/159C/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/0po//6p8M85FMRQ4BwcBEwYFAQcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkGBAsCAAEZnHMvatObP/LYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//Pv4//Hfwf/er2H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/wI069H5cJnIDAgIZCQYECwAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFCgQFDzUn + ESfAjTqt155B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv5//Hfwv/esWb/155B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7QmD7/n3YwtCwhDioLBQYQAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoJAQgAAAAShmIoTM+YPt/YnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pn1/+/Ztv/drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9adQP+2hjfkaE0gUgAA + ABIJCQEIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEw0GCw4K + BRmygjWC1p1A+teeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pn2/+/Y + tf/drV3/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/siTPPuOaSuKDwsFGxMNBgsAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUEAAQEBAANRjQVKMiSPLrYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+/fx/+3Uq//bqVX/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0po//6h7 + M8I2JxErBgUADQUEAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgoFBgYE + AhGOaCpK05s/5tieQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f7/+/fy/+zSqP/bqVX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUD/vIk56m1PIVMJBQMSDgoEBgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIUEQMIAAAAFLSENnvXnUH5155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+vTs/+rOof/apk//154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP/Ikzz6jWgrhAAAABUUEQMIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcP + Bws+LBMhyJI8rdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3/+vTs/+rMnP/apU7/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tKZP/+keDK0MSMPJRcPBwsAAAADAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAADIRgJznRmT/S2J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+fHm/+jJ + lv/Zo0r/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/7SFNthlSh5AAAAADAABAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsV + BgUAAAAMpXkyV9acQOvYnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+PLm/+fGj//Zo0r/154//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/wY06735cJl4AAAANGRQFBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIxcMBwwHBRK7iTl82J5B/NeeQf7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/fz/9+7g/+bDi//YoUb/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ieQf7LlT38lGwthg8KBhQiFgsHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEQCAcIQS4UG8iSPKLZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pz/9+7g/+S/gv/YoUf/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tGZPv+leTGsMyQPHRMK + CAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAABkVw0ACwoAAgAAAAhcQxwizpg+wdmfQf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/Pz/9erX/+S+gP/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/7CBNchCMBQmAgEACAoKAAJLQQoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAcEQsCBwAFCodiKTPUmz/c2J5B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/9uvZ/+K5 + dv/YoEX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUH/uog34GRK + HjoLBAYKGxALAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8VCgMLBgQLpXkxTNadQO7YnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8+TM/+G3c//Xn0L/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQf/Cjjrwf10mVQ4IBQweFAoDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAIBcJAwsIAg21hDZj155A9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/8+/r/9ObR/9+zaf/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8eS + PPeOaCtsDgoEDR8WCQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVDgcEAAABDL+MOXfXnkH4155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8d/C/9+yaf/Xn0H/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/y5U9+phwLoAAAAIMFQ4HBAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAASAfAQQAAAAMxpA7idieQfzXnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/8+/n/8uDF/92vYv/Xn0L/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Plz79oHYwkAAAAAwfHgEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABKxoQBQwKBQ/JkzyX2J5B/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8+/n/79m2/92t + X//XnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZP/+leTKeDAkFEigYDwUAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAE4IxUFRC8UE82WPaTYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/8+vf/8Nu6/9ysW//Xn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD+05s//6x+M6s0JBEYNiMTBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAS8eEAZcQhwXz5g+rtie + Qf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/7+fX/7NOq/9upV//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Um0D/sIE0tEYzFhwvHhEGAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAABKRoPBmlMIBnQmT+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PP/7dWu/9uoVf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tWcQP+0gza7UzoYHioaDwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAE5Kg4FcVMiGtGZ + PrjYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/69u//6s2d/9qmT//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+1ZxA/7WENr5aQBkfOSsPBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAADwsDwV1VSIa0Zk+uNieQf/XnkD+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/69vD/69Ci/9qm + UP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7VnED/tYU2vltCGh89LRAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCATBHNU + IhjSmj+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/58+n/6MiU/9qkTP/Xnj//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tWcQP+1hTa6WUAaHTUh + EwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKRcEa04gFdGZP67YnkH/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /v/58uj/6MiU/9mkS//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+1ZtA/7ODNbRSPRcaPSYWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM0 + HgRbQhwQ0Jg+pdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/37+H/5cGH/9miSP/Xnj//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Tmz//sIE0q0Uy + FhVKLxoEAAAAAAAAAAAAAAAAAAAAAAAAAACCRD4AYC4xAyQXDArPlz6W2J5B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//YoUf/6cmX//z6 + 9//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PT/+fLo//38+//9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/37uD/5cKI/9iiSP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/tKaP/+rfTOdHRMKDlQpKwNpNzIAAAAAAAAAAAAAAAAAAAAAACQb + CgBVPhcCAAAABs2WPYfYnkH8155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9ihR//pyZf//Pr3//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///ft3v/pypn/9ejT//38+//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/P/27Nv/471//9ih + Rf/Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/0Jg+/ah7 + Mo4AAAAHUDsWAiMaCQAAAAAAAAAAAAAAAAAAAAAAPzMNADUvCgEAAAAFyZM9ddieQfnYnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/96wZP/ht3P/8+TM//z7 + +v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/P/26tj/47x9/9igRP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Nlj36pHgxfQAAAAU2MAoBPzMNAAAAAAAAAAAAAAAAAAAA + AABuUB4AVj8XARsTBQbGkDte2J5B9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5f/9igQ//htnD/8+LJ//z7+f/9/f7//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38 + +v/159P/4rh0/9ifQ//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8mT + PPadcy9nIBcHBlE7FgFmShsAAAAAAAAAAAAAAAAAAAAAAH1bIgBrTh0BKB0JBcCMOkbYnkHu2J5B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150+/9ef + Qv/gs2v/8d/B//z6+P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38+//05c7/4bdy/9efQv/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/xZE78JduLU8rHwoFYEYaAW1QHgAAAAAAAAAAAAAA + AAAAAAAAi1M4ALluSwASABEDsYI2LNedQN3Zn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9efQv/fsWf/8d6///z59v/9/f7//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//z7+P/z48r/37Nq/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/AjTnghGIoMhsGEgOPVToAckQuAAAAAAAAAAAAAAAAAAAAAAB/dAsAvasRAAARAAKacC4Y1ZxAwdmf + Qf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQf/esGT/79m3//v49P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z7+f/x4MP/37Np/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/1ZxA/7mHN8dwUiIbCh4AArGgEAB6bwoAAAAAAAAA + AAAAAAAAAAAAAEZHAAAADwAATT8MAolkKQ7Smj+g2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9efQf/drV7/7tex//v3 + 8P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//z59v/w3sD/3a5g/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Smj//soI2qWhMIBBZSA8CABAAAEdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR4PACfZzcBRTAXBs+Y + PnjZn0H92J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/cq1n/69Gl//r28P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//v6 + 9v/v2rf/3q5h/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/s6XPf2pfDOBOygVCIpZMAKVYzIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAt25JAL9yTQEAAAAAyJI8TtieQezYn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/bqVT/69Gl//r17P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//v48//u2LT/26lW/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkH+yJI87590MFQAAAABlVk8AY5WOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADixB0A/+AeAAAA + AADAjDkt151A0tmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/aqFP/6cuZ//n07P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//v49P/s0qj/3KpY/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edQP+/jDnXlGwsMgAAAADjyBsAy7AaAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcPx4AfU8rAqF1MBHVnD+r2Z9B/9ieQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/apU3/6cyb//nx5v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//r27v/s0af/2qVO/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1JtA/7eGNrF3VyQWdksoAlM5GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdO + GQCMdxUBAAAAAtGZPnTZn0H52J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+ + ///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//apEz/5sSL//ny + 5//9/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f3+//v48v/py5r/2qdS/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQP7Olz76rX40fAAAAAONeBUBZU0ZAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArXY3AMqKQQAtFhICyJM9PtieQejYnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yokj/58eR//fv4f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//nz + 6f/pyZf/2aNL/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8aRO+ueczBGOSAVAq53OACZaDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACSghAAtrAHAAADAAGwgDYV1p1AutmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/5L6B//ft3v/8/Pr//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//r17f/nxpH/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/u4k4wIJfKBgbGAABop0GAId4 + DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+dEsAvWpTAXdSJgXSmj972Z9B/Nie + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoEX/5cGF//br2f/9/fz//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//jw4//mxIz/2KJH/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/s+YPv2xgjWDWz0cB6pgSQGkZEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAO+CbgD+iXYA//+JAMuUPTvYnkHf2J9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YoET/4bh1//Xo1P/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//ny6P/lwof/2aNJ/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/xZA746J3MUH//4YA8oJxAd55 + ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJMKACQVDgBtIM3Etad + QKvZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KFH/+nJ + l//8+vf//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoET/4rp5//Tn + 0P/9/Pv//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//bs3P/kvX//2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5A/tObP/+6iDiwiGMrFZpcOQFrRyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAnVxAALlxSAEAABMB0po/XtmfQfTYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + Qf/Xn0L/159C/9efQv/Xn0L/159C/9efQv/Zo0n/6cqY//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0L/37Jn//Lgxf/8+vf//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fu + 4P/kvX7/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH+y5U99q6ANGUGABcCn2E+AY1T + OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyiycAyJ0rAB4k + AAHDjzse155BydmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2qZQ/+K5dv/kvoH/5L6A/+S+gP/kvoD/5L6A/+XA + hf/v27r//Pv5//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0L/4LNr//LgxP/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Tn0v/iuXb/2J9D/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/AjTrNmXEuITk1AAGphSUAm3kiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKfU4AynRVAaNvNQPUmz922Z9B+tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//gtGz/9OjU//r38P/69u//+vbv//r27//69u//+vbw//v59f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0H/3a5g/+/auP/8+fT//f3+//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//fz8//Xo1P/iuHT/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D+zpc9+7OENn10UCYFv25PAbRw + RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+B + gwD/i5AA//91AMuWPSzYnkHS2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/150//+C2b//37uD//f7+//39/v/9/f7//f3+//39 + /v/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xn0H/3a9h/+/Ztv/7+fX//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv6//LiyP/fs2v/159B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/EkDrWo3gxMf//ZAC2Wl0AqlVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZaPQDLZWYBjmcpBdWcP37Zn0H62J9A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnT//4LZv//fu3//9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KtZ/+3U + rf/69/D//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pv5//Lhxv/fsmj/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/z5g++7eGNoRoSx4GolBQAX9L + MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAwXFRANB5VwBGAEQBzZc+KNieQdLZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edP//gtm//9+7f//39/v/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KpZ/+zSqf/69vD//f3+//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pr3//Dd + vf/er2P/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/FkDvVpnozLFoORQG3a00ArGRJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mswA87wPAP/AWgDCjzUD1p1Ac9mf + QfjYn0D+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/150//+C2b//37t///f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/26hT/+rPov/69Oz//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pr2/+/bu//drV//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0D+z5g++bmIN3mMaSUE/+FqAPSv + DgD/v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//wAA//8AAP/+agDTmkEf2J5Bv9mfQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnT//4LZv//fu4P/9/v7//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//v7///br + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/26hU/+rMnf/59Or//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39 + /v/9/f7/+/n1/+7Xs//drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/EkDvDrH00Iv//dwD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGdVEA1YJTAF4h + PQHVnEBW2Z9B7difQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//gtW3/9erY//z59v/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+vf/9OfS/92tX//XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2qVP/+nJlv/37+H//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX/+fPq/+zSqP/bp1P/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+zZY97riHN1pbJTECtm9HAbBo + SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sVQD/3nIAwXpDAceROw3XnkGd2Z9B/tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9upV//mxYz/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + nP/mw4n/2qZP/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2qVO/+O9 + f//pzJr/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/58WO/9yrW//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tObP//CjjqhnnIvD7RzPgHLh0UAwIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfK + HgDu0xsA5aVJANKZPy7YnkHO2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155B/9igQ//YoET/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBE/9ifQ//XnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159C/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igRP/YoET/159C/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnkD/yZM80bKCNjHVmkcA9tkcAOfK + HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaSNADwpkgBpXwvA9acP2HZn0Hy2J9B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8+YPvO9iThliGQpBMuNPQG8ijEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA6s8bAOXPFgD//wAAzZc8C9edQJPZn0H62J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9efQP7Tmz/7xJA7l6h9MQz//wAA5ccWAOrP + GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6pWAP+wWQD//0MA0Jg/JNif + Qb/Zn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1p1A/8qUPcG0hDcn//9RAP+0WwD/qlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwIs2AMaKPABOQBEB151AP9mfQdrZn0H/2J5A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQf/Plz7cwIw5QlxRGwHWlEAAyJE4AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP+7 + dgDXik8B151BW9mfQejZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0D/0Zo/6cSPO16dYz0C/+KKAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gIAA/3yEAP+6egDVmj8H2J5Ac9mfQfHYn0H+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSbP/LJkjx2sYA1CP/ikQD/fIQA/4CAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADAgEAAxIVAAKJbQAHOlj4O2J5AitmfQfbYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9if + QP7VnD/3ypQ9jbKAOA++bkkBwoRAAMGBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gEAAxYRCAP///wDOmD4U2J9Bldmf + QfrYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0H+155A+82XPZi3hzgW//9PAMeGQwC/gEAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADSpiwA0qoqAMabGQDUmj8Z2J5BntmfQfrYn0H+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/tee + QPrRmT6gwo07GvrDIgDUrCoA1qktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/4CcA/+seAMN8 + TwDZnkEY2Z9BltmfQffYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7XnkD30po/mMiTPBm6dUkA/+0eAP/gJwD//wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3SsA//YVAPHUHgDVm0EU2Z5Bi9mfQfLZn0H/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D/2J5A8tOa + P4zGkD0V//8qAP/4FQD/4iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + AAB+AIEAyZQ3AP//SADUmkAO2Z9BdNmfQejZn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5B/9edQOnTmj91xo88D///KgDKlTcAfgCBAP//AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6ekAAv4FAAJ5YPwHJlj4G2Z5BXNmf + QdvZn0H/2J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159A/tifQf/YnkHb1Js/XbiI + NwepYUMBwoNAAL19QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC/gEAAv4BAALdxQQHXnEED2J9BQNmfQcHZn0H72J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ifQf/Zn0H72J9BwdSdQEHPlz0DvXVEAb+AQAC/gEAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlUA/6pVAP+t + WQDBjC4A2Z5BJdmfQZTZn0Hy2Z9B/9ifQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Yn0H/2Z9B8tmfQZTXnUAlqHoqAP+v + WQD/q1UA/6tVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOCaRQAIAEwA155AC9ieQWLZn0HQ2Z9B/dif + Qf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0H+2Z9B/dmfQdDYnkFi155ACwoAUwDinEUA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/6tWAP+sVgD/k2MAx4tCA9ieQS/YnkGg2Z9B7tmfQf/Yn0D+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQe7YnkGg2J5BL8eLQgP/k2MA/6xWAP+r + VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAypc1APXnDwC4eD4Bn1w2ANab + Qg/Zn0FZ2Z9BxNmfQfjZn0H/2J5B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mf + QfjZn0HE2Z9BWdabQg+fXDYAuHg+AfXnDwDKlzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaVMQDjzRMAxopOAeGlUAHZoEEh2J5Bd9mfQdXZn0H72Z9B/9if + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQfvZn0HV2Z9BdtmgQSHhpVABxopOAePNEwDGlTEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+q + VQD/q1gA7dAbAYdJLQDbnUUE2J9CKtmfQYLZn0HV2Z9B+tmfQf/Yn0D/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD/2J9B/9ifQfrZn0HV2Z9Bg9if + QirgoEYEh0ktAO3QGwH/q1gA/6pVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/f4EA/3+BAP+fcgEMAIwA1pxIBNme + Qi7Zn0F72Z9BztmfQffZn0H/2J9B/tieQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP7Yn0D+2J9B/9mfQffZn0HO2Z9Be9qfQi7ZlkMFAgCRAP+ecgH/f4EA/3+BAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD/gIAA/4CqANp/XADzpFQB/9emAN6gQQTZn0Ae2Z9CY9mfQbDZn0Hj2Z9B/dif + Qf/YnkH/2J5A/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5A/9ieQf/Yn0H/2Z9B/dmfQePZn0Gw2Z9CY9mfQB7eoEEE/+ezAPOm + VQHaf1wA/4CqAP+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+ + hAD/foQA/6BzAY5EQwC6cUYB2Z9DEtmfQT7Zn0GB2Z9Bv9mfQezZn0H62Z9B/9ifQf/Yn0H+155A/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD+2J5B/9ifQf/Zn0H62Z9B7Nmf + Qb/Zn0GB2Z9BPtmfQxK6cUYBjkRDAP+gcwH/foQA/36EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA0KMtAN+pPwD/uGIAAAAAAOGi + SATbnkMV2aBBQtmfQXnZn0Gx2Z9B1tmfQfDZn0H+2Z9B/9mfQf/YnkH/2J5A/9eeQP/YnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP/XnkD/2J5B/9if + Qf/Zn0H/2Z9B/tmfQfDZn0HW2Z9BsdmfQXnZoEFC255DFeGiSAQAAAAA/7hiAN+pPwDQoy0A//8AAP// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ZbAD/iHsA/6BoAbohkgCBMUIA3aFBAdmeQBHYnkEt2Z9AUtqf + QX/Zn0Gm2Z9ByNmfQePZn0Hx2Z9B9tmfQfrZn0H+2Z9B/9ieQf/YnkH/2J5B/9ieQf/YnkH/2J5B/9ie + Qf/YnkH/2Z9B/9mfQf7Zn0H62Z9B9tmfQfHZn0Hj2Z9ByNmfQabZn0F+2Z9AUtieQS3ZnkAR3aFBAYEx + QgC6IZIA/6BoAf+IewD/mWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADSgFMA635uANaMSgD/jXgB7qBwAQAAIAD//2kA46NHBNueRAvYn0MW2Z9CLtmfQEnZn0Fj2Z9Bedie + QYzZn0Ge2Z9BrNmfQbbZn0G82Z9Bv9mfQb/Zn0G82Z9BttmfQazZn0Ge2J5BjNmfQXnZn0Fj2Z9ASdmf + Qi7Yn0MW255EC+GkSgP///8AAAAbAO6gcAH/jXgB1oxKAOt+bgDSgFMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/p1oA/94hAP+Z + awH/rGAB/2SnAP/B6gC9f2oAqngnAcCcGgDRpzoA0ao7AdudPwfZnD8M2KBBEdmgQxTaoEIX2qBCF9mg + QxTYoEER2Zw/DNudPwfRqjsB0ac6AMCcGgCqeCcBvX9qAP/B6gD/Y6YA/6xgAf+ZagH/3iEA/6daAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA/6NgAOOUUADLkzkB951ZAP/P + MQD/mW4B9qlcAbJxQwGhWz8Bj0U8AX0yOgF9MjoBj0U8AaFbPwGycUMB9qlcAf+ZbgH/zzEA951ZAMuT + OQHjlFAA/6NgAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////4AAAB///////////////+AAAAAAf/////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////4AAAAAAAAAf//////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH/////// + //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////wAAAAAAAAAAAA////////wAAAAAAAAAAAAD/ + //////4AAAAAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAA + AAAAD//////gAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAA + AAAAAAAAAAD////+AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///4 + AAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA + B///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAA + AAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA + AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/gA + AAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA8AA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA + AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA + AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAv/4A + AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA + AP//QAAAAAAAAAAAAAAAAAL//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAA + AAAAAAP//9AAAAAAAAAAAAAAAAAL///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///QAAAAA + AAAAAAAAAAAv///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////0AAAAAAAAAAAAAAAC////+ + AAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAB + /////9AAAAAAAAAAAAAAC//////gAAAAAAAAAAAAAAf/////9AAAAAAAAAAAAAAv//////gAAAAAAAAA + AAAAH//////9AAAAAAAAAAAAAL///////gAAAAAAAAAAAAB///////8AAAAAAAAAAAAA////////gAAA + AAAAAAAAAf///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////// + //4AAAAAAAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////gAAAAAAAAB/// + /////////AAAAAAAAD////////////4QAAAAAAh/////////////4AAAAAAH//////////////gAAAAA + H///////////////gEACAf////////////////AAAA////////////////////////////////////// + //////////////////////////////////8= + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs new file mode 100644 index 0000000000..5b8d5681f6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -0,0 +1,749 @@ +namespace v2rayN.Forms +{ + partial class MainForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.lvServers = new System.Windows.Forms.ListView(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddShadowsocksServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddSocksServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddCustomServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddServers = new System.Windows.Forms.ToolStripMenuItem(); + this.menuScanScreen = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.menuRemoveServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); + this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuSysAgentEnabled = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeep = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); + this.bgwPing = new System.ComponentModel.BackgroundWorker(); + this.bgwScan = new System.ComponentModel.BackgroundWorker(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tsMain = new System.Windows.Forms.ToolStrip(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbReload = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbLanguageDef = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbLanguageZhHans = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbClose = new System.Windows.Forms.ToolStripButton(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.cmsMain.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tsMain.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); + this.splitContainer1.Panel1.Controls.Add(this.lvServers); + // + // splitContainer1.Panel2 + // + resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); + this.splitContainer1.Panel2.Controls.Add(this.qrCodeControl); + this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved); + // + // lvServers + // + resources.ApplyResources(this.lvServers, "lvServers"); + this.lvServers.ContextMenuStrip = this.cmsLv; + this.lvServers.FullRowSelect = true; + this.lvServers.GridLines = true; + this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))}); + this.lvServers.MultiSelect = false; + this.lvServers.Name = "lvServers"; + this.lvServers.UseCompatibleStateImageBehavior = false; + this.lvServers.View = System.Windows.Forms.View.Details; + this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); + this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick); + this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown); + // + // cmsLv + // + resources.ApplyResources(this.cmsLv, "cmsLv"); + this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuAddVmessServer, + this.menuAddShadowsocksServer, + this.menuAddSocksServer, + this.menuAddCustomServer, + this.menuAddServers, + this.menuScanScreen, + this.toolStripSeparator1, + this.menuRemoveServer, + this.menuCopyServer, + this.menuSetDefaultServer, + this.toolStripSeparator3, + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom, + this.menuSelectAll, + this.toolStripSeparator9, + this.menuPingServer, + this.menuSpeedServer, + this.toolStripSeparator6, + this.menuExport2ClientConfig, + this.menuExport2ServerConfig, + this.menuExport2ShareUrl, + this.menuExport2SubContent}); + this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; + // + // menuAddVmessServer + // + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); + this.menuAddVmessServer.Name = "menuAddVmessServer"; + this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); + // + // menuAddShadowsocksServer + // + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); + this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); + // + // menuAddSocksServer + // + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); + this.menuAddSocksServer.Name = "menuAddSocksServer"; + this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); + // + // menuAddCustomServer + // + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); + this.menuAddCustomServer.Name = "menuAddCustomServer"; + this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); + // + // menuAddServers + // + resources.ApplyResources(this.menuAddServers, "menuAddServers"); + this.menuAddServers.Name = "menuAddServers"; + this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); + // + // menuScanScreen + // + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); + this.menuScanScreen.Name = "menuScanScreen"; + this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); + // + // toolStripSeparator1 + // + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // menuRemoveServer + // + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); + this.menuRemoveServer.Name = "menuRemoveServer"; + this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); + // + // menuCopyServer + // + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); + this.menuCopyServer.Name = "menuCopyServer"; + this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); + // + // menuSetDefaultServer + // + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); + this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); + // + // toolStripSeparator3 + // + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // menuMoveTop + // + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Name = "menuMoveTop"; + this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); + // + // menuMoveUp + // + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Name = "menuMoveUp"; + this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); + // + // menuMoveDown + // + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Name = "menuMoveDown"; + this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); + // + // menuMoveBottom + // + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Name = "menuMoveBottom"; + this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + // + // menuSelectAll + // + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // toolStripSeparator9 + // + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); + this.toolStripSeparator9.Name = "toolStripSeparator9"; + // + // menuPingServer + // + resources.ApplyResources(this.menuPingServer, "menuPingServer"); + this.menuPingServer.Name = "menuPingServer"; + this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); + // + // menuSpeedServer + // + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); + this.menuSpeedServer.Name = "menuSpeedServer"; + this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); + // + // toolStripSeparator6 + // + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); + this.toolStripSeparator6.Name = "toolStripSeparator6"; + // + // menuExport2ClientConfig + // + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); + this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); + // + // menuExport2ServerConfig + // + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); + this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); + // + // menuExport2ShareUrl + // + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); + this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); + // + // menuExport2SubContent + // + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); + this.menuExport2SubContent.Name = "menuExport2SubContent"; + this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); + // + // tsbServer + // + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + this.tsbServer.Name = "tsbServer"; + // + // qrCodeControl + // + resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); + this.qrCodeControl.Name = "qrCodeControl"; + // + // notifyMain + // + resources.ApplyResources(this.notifyMain, "notifyMain"); + this.notifyMain.ContextMenuStrip = this.cmsMain; + this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); + // + // cmsMain + // + resources.ApplyResources(this.cmsMain, "cmsMain"); + this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuSysAgentEnabled, + this.menuSysAgentMode, + this.menuServers, + this.menuAddServers2, + this.menuScanScreen2, + this.menuCopyPACUrl, + this.toolStripSeparator2, + this.menuExit}); + this.cmsMain.Name = "contextMenuStrip1"; + this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.cmsMain.ShowCheckMargin = true; + this.cmsMain.ShowImageMargin = false; + // + // menuSysAgentEnabled + // + resources.ApplyResources(this.menuSysAgentEnabled, "menuSysAgentEnabled"); + this.menuSysAgentEnabled.Name = "menuSysAgentEnabled"; + this.menuSysAgentEnabled.Click += new System.EventHandler(this.menuSysAgentEnabled_Click); + // + // menuSysAgentMode + // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); + this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuGlobal, + this.menuGlobalPAC, + this.menuKeep, + this.menuKeepPAC}); + this.menuSysAgentMode.Name = "menuSysAgentMode"; + // + // menuGlobal + // + resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; + this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); + // + // menuGlobalPAC + // + resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); + this.menuGlobalPAC.Name = "menuGlobalPAC"; + this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); + // + // menuKeep + // + resources.ApplyResources(this.menuKeep, "menuKeep"); + this.menuKeep.Name = "menuKeep"; + this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); + // + // menuKeepPAC + // + resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC"); + this.menuKeepPAC.Name = "menuKeepPAC"; + this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click); + // + // menuServers + // + resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; + // + // menuAddServers2 + // + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); + this.menuAddServers2.Name = "menuAddServers2"; + this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); + // + // menuScanScreen2 + // + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); + this.menuScanScreen2.Name = "menuScanScreen2"; + this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); + // + // menuCopyPACUrl + // + resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl"); + this.menuCopyPACUrl.Name = "menuCopyPACUrl"; + this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click); + // + // toolStripSeparator2 + // + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // menuExit + // + resources.ApplyResources(this.menuExit, "menuExit"); + this.menuExit.Name = "menuExit"; + this.menuExit.Click += new System.EventHandler(this.menuExit_Click); + // + // bgwPing + // + this.bgwPing.WorkerReportsProgress = true; + this.bgwPing.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwPing_DoWork); + this.bgwPing.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwPing_ProgressChanged); + // + // bgwScan + // + this.bgwScan.WorkerReportsProgress = true; + this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); + this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.splitContainer1); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.txtMsgBox); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtMsgBox + // + resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); + this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); + this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); + this.txtMsgBox.Name = "txtMsgBox"; + this.txtMsgBox.ReadOnly = true; + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // tsMain + // + resources.ApplyResources(this.tsMain, "tsMain"); + this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); + this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbServer, + this.toolStripSeparator4, + this.tsbSub, + this.toolStripSeparator8, + this.tsbOptionSetting, + this.toolStripSeparator5, + this.tsbReload, + this.toolStripSeparator7, + this.tsbCheckUpdate, + this.toolStripSeparator10, + this.tsbHelp, + this.tsbPromotion, + this.toolStripSeparator11, + this.tsbClose}); + this.tsMain.Name = "tsMain"; + // + // toolStripSeparator4 + // + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); + this.toolStripSeparator4.Name = "toolStripSeparator4"; + // + // tsbSub + // + resources.ApplyResources(this.tsbSub, "tsbSub"); + this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbSubSetting, + this.tsbSubUpdate}); + this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + this.tsbSub.Name = "tsbSub"; + // + // tsbSubSetting + // + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); + this.tsbSubSetting.Name = "tsbSubSetting"; + this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); + // + // tsbSubUpdate + // + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); + this.tsbSubUpdate.Name = "tsbSubUpdate"; + this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); + // + // toolStripSeparator8 + // + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); + this.toolStripSeparator8.Name = "toolStripSeparator8"; + // + // tsbOptionSetting + // + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; + this.tsbOptionSetting.Name = "tsbOptionSetting"; + this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); + // + // toolStripSeparator5 + // + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; + // + // tsbReload + // + resources.ApplyResources(this.tsbReload, "tsbReload"); + this.tsbReload.Name = "tsbReload"; + this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click); + // + // toolStripSeparator7 + // + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); + this.toolStripSeparator7.Name = "toolStripSeparator7"; + // + // tsbCheckUpdate + // + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); + this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbCheckUpdateN, + this.tsbCheckUpdateCore, + this.tsbCheckUpdatePACList, + this.tsbCheckClearPACList}); + this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + this.tsbCheckUpdate.Name = "tsbCheckUpdate"; + // + // tsbCheckUpdateN + // + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); + this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); + // + // tsbCheckUpdateCore + // + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); + this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); + // + // tsbCheckUpdatePACList + // + resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList"); + this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; + this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click); + // + // tsbCheckClearPACList + // + resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); + this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; + this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); + // + // toolStripSeparator10 + // + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); + this.toolStripSeparator10.Name = "toolStripSeparator10"; + // + // tsbHelp + // + resources.ApplyResources(this.tsbHelp, "tsbHelp"); + this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbAbout, + this.toolStripSeparator12, + this.tsbLanguageDef, + this.tsbLanguageZhHans}); + this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + this.tsbHelp.Name = "tsbHelp"; + // + // tsbAbout + // + resources.ApplyResources(this.tsbAbout, "tsbAbout"); + this.tsbAbout.Name = "tsbAbout"; + this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); + // + // toolStripSeparator12 + // + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); + this.toolStripSeparator12.Name = "toolStripSeparator12"; + // + // tsbLanguageDef + // + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); + this.tsbLanguageDef.Name = "tsbLanguageDef"; + this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); + // + // tsbLanguageZhHans + // + resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); + this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click); + // + // tsbPromotion + // + resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); + this.tsbPromotion.ForeColor = System.Drawing.Color.Black; + this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion; + this.tsbPromotion.Name = "tsbPromotion"; + this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click); + // + // toolStripSeparator11 + // + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); + this.toolStripSeparator11.Name = "toolStripSeparator11"; + // + // tsbClose + // + resources.ApplyResources(this.tsbClose, "tsbClose"); + this.tsbClose.Name = "tsbClose"; + this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); + // + // MainForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.tsMain); + this.MaximizeBox = true; + this.MinimizeBox = true; + this.Name = "MainForm"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.Load += new System.EventHandler(this.MainForm_Load); + this.Shown += new System.EventHandler(this.MainForm_Shown); + this.Resize += new System.EventHandler(this.MainForm_Resize); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.cmsLv.ResumeLayout(false); + this.cmsMain.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.tsMain.ResumeLayout(false); + this.tsMain.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtMsgBox; + private System.Windows.Forms.ListView lvServers; + private System.Windows.Forms.NotifyIcon notifyMain; + private System.Windows.Forms.ContextMenuStrip cmsMain; + private System.Windows.Forms.ToolStripMenuItem menuExit; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.ToolStripMenuItem menuServers; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.ComponentModel.BackgroundWorker bgwPing; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuAddVmessServer; + private System.Windows.Forms.ToolStripMenuItem menuRemoveServer; + private System.Windows.Forms.ToolStripMenuItem menuSetDefaultServer; + private System.Windows.Forms.ToolStripMenuItem menuCopyServer; + private System.Windows.Forms.ToolStripMenuItem menuPingServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem menuExport2ClientConfig; + private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig; + private System.Windows.Forms.ToolStrip tsMain; + private System.Windows.Forms.ToolStripDropDownButton tsbServer; + private System.Windows.Forms.ToolStripButton tsbOptionSetting; + private System.Windows.Forms.ToolStripButton tsbReload; + private System.Windows.Forms.ToolStripButton tsbClose; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; + private System.Windows.Forms.ToolStripMenuItem menuGlobal; + private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC; + private System.Windows.Forms.ToolStripMenuItem menuKeep; + private System.Windows.Forms.ToolStripMenuItem menuSysAgentEnabled; + private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl; + private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; + private System.Windows.Forms.SplitContainer splitContainer1; + private QRCodeControl qrCodeControl; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList; + private System.Windows.Forms.ToolStripMenuItem menuAddServers; + private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl; + private System.Windows.Forms.ToolStripMenuItem menuSpeedServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.ToolStripDropDownButton tsbHelp; + private System.Windows.Forms.ToolStripMenuItem tsbAbout; + private System.Windows.Forms.ToolStripMenuItem menuAddServers2; + private System.ComponentModel.BackgroundWorker bgwScan; + private System.Windows.Forms.ToolStripMenuItem menuScanScreen; + private System.Windows.Forms.ToolStripMenuItem menuScanScreen2; + private System.Windows.Forms.ToolStripDropDownButton tsbSub; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.ToolStripMenuItem tsbSubSetting; + private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate; + private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList; + private System.Windows.Forms.ToolStripMenuItem menuKeepPAC; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem tsbLanguageDef; + private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans; + private System.Windows.Forms.ToolStripButton tsbPromotion; + private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer; + } +} + diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs new file mode 100644 index 0000000000..e9a94ce429 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -0,0 +1,1370 @@ +using System; +using System.IO.Compression; +using System.Text; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.HttpProxyHandler; +using v2rayN.Mode; +using System.Collections.Generic; +using System.IO; + +namespace v2rayN.Forms +{ + public partial class MainForm : BaseForm + { + private V2rayHandler v2rayHandler; + private PACListHandle pacListHandle; + private V2rayUpdateHandle v2rayUpdateHandle; + private V2rayUpdateHandle v2rayUpdateHandle2; + private List lvSelecteds = new List(); + + #region Window 事件 + + public MainForm() + { + InitializeComponent(); + this.ShowInTaskbar = false; + //this.WindowState = FormWindowState.Minimized; + HideForm(); + this.Text = Utils.GetVersion(); + + Application.ApplicationExit += (sender, args) => + { + Utils.ClearTempPath(); + }; + } + + private void MainForm_Load(object sender, EventArgs e) + { + ConfigHandler.LoadConfig(ref config); + v2rayHandler = new V2rayHandler(); + v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; + + } + + private void MainForm_Shown(object sender, EventArgs e) + { + InitServersView(); + RefreshServers(); + + LoadV2ray(); + + HideForm(); + + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; + + HideForm(); + return; + } + } + + private void MainForm_Resize(object sender, EventArgs e) + { + //if (this.WindowState == FormWindowState.Minimized) + //{ + // HideForm(); + //} + //else + //{ + // //this.splitContainer1.SplitterDistance = config.uiItem.mainQRCodeWidth; + //} + } + + private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) + { + //config.uiItem.mainQRCodeWidth = splitContainer1.SplitterDistance; + } + + + //private const int WM_QUERYENDSESSION = 0x0011; + //protected override void WndProc(ref Message m) + //{ + // switch (m.Msg) + // { + // case WM_QUERYENDSESSION: + // CloseV2ray(); + // m.Result = (IntPtr)1; + // break; + // default: + // base.WndProc(ref m); + // break; + // } + //} + #endregion + + #region 显示服务器 listview 和 menu + + /// + /// 刷新服务器 + /// + private void RefreshServers() + { + RefreshServersView(); + RefreshServersMenu(); + } + + /// + /// 初始化服务器列表 + /// + private void InitServersView() + { + lvServers.Items.Clear(); + + lvServers.GridLines = true; + lvServers.FullRowSelect = true; + lvServers.View = View.Details; + lvServers.Scrollable = true; + lvServers.MultiSelect = true; + lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable; + + lvServers.Columns.Add("", 30, HorizontalAlignment.Center); + lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvPort"), 50, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 100, HorizontalAlignment.Left); + + } + + /// + /// 刷新服务器列表 + /// + private void RefreshServersView() + { + lvServers.Items.Clear(); + + for (int k = 0; k < config.vmess.Count; k++) + { + string def = string.Empty; + if (config.index.Equals(k)) + { + def = "√"; + } + + VmessItem item = config.vmess[k]; + ListViewItem lvItem = new ListViewItem(new string[] + { + def, + ((EConfigType)item.configType).ToString(), + item.remarks, + item.address, + item.port.ToString(), + //item.id, + //item.alterId.ToString(), + item.security, + item.network, + item.getSubRemarks(config), + item.testResult + }); + lvServers.Items.Add(lvItem); + } + + //if (lvServers.Items.Count > 0) + //{ + // if (lvServers.Items.Count <= testConfigIndex) + // { + // testConfigIndex = lvServers.Items.Count - 1; + // } + // lvServers.Items[testConfigIndex].Selected = true; + // lvServers.Select(); + //} + } + + /// + /// 刷新托盘服务器菜单 + /// + private void RefreshServersMenu() + { + menuServers.DropDownItems.Clear(); + + for (int k = 0; k < config.vmess.Count; k++) + { + VmessItem item = config.vmess[k]; + string name = item.getSummary(); + + ToolStripMenuItem ts = new ToolStripMenuItem(name); + ts.Tag = k; + if (config.index.Equals(k)) + { + ts.Checked = true; + } + ts.Click += new EventHandler(ts_Click); + menuServers.DropDownItems.Add(ts); + } + } + + private void ts_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + int index = Utils.ToInt(ts.Tag); + SetDefaultServer(index); + } + catch + { + } + } + + private void lvServers_SelectedIndexChanged(object sender, EventArgs e) + { + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + qrCodeControl.showQRCode(index, config); + } + + #endregion + + #region v2ray 操作 + + /// + /// 载入V2ray + /// + private void LoadV2ray() + { + if (Global.reloadV2ray) + { + ClearMsg(); + } + v2rayHandler.LoadV2ray(config); + Global.reloadV2ray = false; + + ChangeSysAgent(config.sysAgentEnabled); + } + + /// + /// 关闭V2ray + /// + private void CloseV2ray() + { + ConfigHandler.ToJsonFile(config); + + ChangeSysAgent(false); + + v2rayHandler.V2rayStop(); + } + + #endregion + + #region 功能按钮 + + private void lvServers_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + + if (config.vmess[index].configType == (int)EConfigType.Vmess) + { + var fm = new AddServerForm(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + else if (config.vmess[index].configType == (int)EConfigType.Shadowsocks) + { + var fm = new AddServer3Form(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + LoadV2ray(); + } + } + else if (config.vmess[index].configType == (int)EConfigType.Socks) + { + var fm = new AddServer4Form(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + LoadV2ray(); + } + } + else + { + var fm2 = new AddServer2Form(); + fm2.EditIndex = index; + if (fm2.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + } + + private void lvServers_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + } + } + switch (e.KeyCode) + { + case Keys.Enter: + menuSetDefaultServer_Click(null, null); + break; + case Keys.Delete: + menuRemoveServer_Click(null, null); + break; + case Keys.U: + menuMoveUp_Click(null, null); + break; + case Keys.D: + menuMoveDown_Click(null, null); + break; + } + } + + private void menuAddVmessServer_Click(object sender, EventArgs e) + { + AddServerForm fm = new AddServerForm(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + + private void menuRemoveServer_Click(object sender, EventArgs e) + { + + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); + } + //刷新 + RefreshServers(); + LoadV2ray(); + + } + + private void menuCopyServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (ConfigHandler.CopyServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + } + } + + private void menuSetDefaultServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + SetDefaultServer(index); + } + + + private void menuPingServer_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + ClearTestResult(); + bgwPing.RunWorkerAsync(); + } + + private void menuSpeedServer_Click(object sender, EventArgs e) + { + if (!config.sysAgentEnabled || config.listenerType != 1) + { + UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + return; + } + + UI.Show(UIRes.I18N("SpeedServerTips")); + + GetLvSelectedIndex(); + ServerSpeedTest(); + } + + private void menuExport2ClientConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (config.vmess[index].configType != (int)EConfigType.Vmess) + { + UI.Show(UIRes.I18N("NonVmessService")); + return; + } + + SaveFileDialog fileDialog = new SaveFileDialog(); + fileDialog.Filter = "Config|*.json"; + fileDialog.FilterIndex = 2; + fileDialog.RestoreDirectory = true; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + Config configCopy = Utils.DeepCopy(config); + configCopy.index = index; + string msg; + if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out msg) != 0) + { + UI.Show(msg); + } + else + { + UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + } + } + + private void menuExport2ServerConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (config.vmess[index].configType != (int)EConfigType.Vmess) + { + UI.Show(UIRes.I18N("NonVmessService")); + return; + } + + SaveFileDialog fileDialog = new SaveFileDialog(); + fileDialog.Filter = "Config|*.json"; + fileDialog.FilterIndex = 2; + fileDialog.RestoreDirectory = true; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + Config configCopy = Utils.DeepCopy(config); + configCopy.index = index; + string msg; + if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out msg) != 0) + { + UI.Show(msg); + } + else + { + UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + } + } + + private void menuExport2ShareUrl_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < lvSelecteds.Count; k++) + { + string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(sb.ToString()); + UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); + } + } + + private void menuExport2SubContent_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < lvSelecteds.Count; k++) + { + string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); + UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); + } + } + + private void tsbOptionSetting_Click(object sender, EventArgs e) + { + OptionSettingForm fm = new OptionSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + + private void tsbReload_Click(object sender, EventArgs e) + { + Global.reloadV2ray = true; + LoadV2ray(); + } + + private void tsbClose_Click(object sender, EventArgs e) + { + HideForm(); + //this.WindowState = FormWindowState.Minimized; + } + + /// + /// 设置活动服务器 + /// + /// + /// + private int SetDefaultServer(int index) + { + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return -1; + } + if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + return 0; + } + + /// + /// 取得ListView选中的行 + /// + /// + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvServers.SelectedIndices.Count <= 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return index; + } + + index = lvServers.SelectedIndices[0]; + foreach (int i in lvServers.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + private void menuAddCustomServer_Click(object sender, EventArgs e) + { + UI.Show(UIRes.I18N("CustomServerTips")); + + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Multiselect = false; + fileDialog.Filter = "Config|*.json|All|*.*"; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + + if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); + } + else + { + UI.Show(UIRes.I18N("FailedImportedCustomServer")); + } + } + + private void menuAddShadowsocksServer_Click(object sender, EventArgs e) + { + var fm = new AddServer3Form(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + ShowForm(); + } + + private void menuAddSocksServer_Click(object sender, EventArgs e) + { + var fm = new AddServer4Form(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + ShowForm(); + } + + private void menuAddServers_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + if (AddBatchServers(clipboardData) == 0) + { + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaClipboard")); + } + } + + private void menuScanScreen_Click(object sender, EventArgs e) + { + HideForm(); + bgwScan.RunWorkerAsync(); + } + + private int AddBatchServers(string clipboardData, string subid = "") + { + if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) + { + clipboardData = Utils.Base64Decode(clipboardData); + if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) + { + return -1; + } + } + RefreshServers(); + return 0; + } + + #endregion + + + #region 提示信息 + + /// + /// 消息委托 + /// + /// + /// + void v2rayHandler_ProcessEvent(bool notify, string msg) + { + AppendText(notify, msg); + } + + delegate void AppendTextDelegate(string text); + void AppendText(bool notify, string msg) + { + try + { + AppendText(msg); + if (notify) + { + notifyMsg(msg); + } + } + catch + { + } + } + + void AppendText(string text) + { + if (this.txtMsgBox.InvokeRequired) + { + Invoke(new AppendTextDelegate(AppendText), new object[] { text }); + } + else + { + //this.txtMsgBox.AppendText(text); + ShowMsg(text); + } + } + + /// + /// 提示信息 + /// + /// + private void ShowMsg(string msg) + { + if (txtMsgBox.Lines.Length > 500) + { + ClearMsg(); + } + this.txtMsgBox.AppendText(msg); + if (!msg.EndsWith("\r\n")) + { + this.txtMsgBox.AppendText("\r\n"); + } + } + + /// + /// 清除信息 + /// + private void ClearMsg() + { + this.txtMsgBox.Clear(); + } + + /// + /// 托盘信息 + /// + /// + private void notifyMsg(string msg) + { + notifyMain.Text = msg; + } + + #endregion + + + #region 托盘事件 + + private void notifyMain_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + ShowForm(); + } + } + + private void menuExit_Click(object sender, EventArgs e) + { + CloseV2ray(); + + this.Visible = false; + this.Close(); + //this.Dispose(); + //System.Environment.Exit(System.Environment.ExitCode); + Application.Exit(); + } + + + private void ShowForm() + { + this.Show(); + this.WindowState = FormWindowState.Normal; + this.Activate(); + //this.notifyIcon1.Visible = false; + this.ShowInTaskbar = true; + + SetVisibleCore(true); + } + + private void HideForm() + { + //this.WindowState = FormWindowState.Minimized; + this.Hide(); + this.notifyMain.Icon = this.Icon; + this.notifyMain.Visible = true; + this.ShowInTaskbar = false; + + SetVisibleCore(false); + } + + #endregion + + #region 后台测速 + + private void bgwPing_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + try + { + for (int k = 0; k < lvSelecteds.Count; k++) + { + int index = lvSelecteds[k]; + if (config.vmess[index].configType == (int)EConfigType.Custom) + { + continue; + } + long time = Utils.Ping(config.vmess[index].address); + bgwPing.ReportProgress(index, string.Format("{0}ms", time)); + } + } + catch + { + } + } + + private void bgwPing_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) + { + try + { + int k = e.ProgressPercentage; + string time = string.Format("{0}", Convert.ToString(e.UserState)); + SetTestResult(k, time); + } + catch + { + } + } + private void SetTestResult(int k, string txt) + { + config.vmess[k].testResult = txt; + lvServers.Items[k].SubItems[lvServers.Items[k].SubItems.Count - 1].Text = txt; + } + private void ClearTestResult() + { + for (int k = 0; k < config.vmess.Count; k++) + { + SetTestResult(k, ""); + } + } + + private int testCounter = 0; + private int ServerSpeedTestSub(int index, string url) + { + if (index >= lvSelecteds.Count) + { + return -1; + } + + if (ConfigHandler.SetDefaultServer(ref config, lvSelecteds[index]) == 0) + { + SetTestResult(lvSelecteds[index], "testing..."); + + v2rayHandler.LoadV2ray(config); + v2rayUpdateHandle2.DownloadFileAsync(config, url); + testCounter++; + return 0; + } + else + { + return -1; + } + } + private void ServerSpeedTest() + { + if (config.vmess.Count <= 0) + { + return; + } + ClearTestResult(); + + string url = Global.SpeedTestUrl; + testCounter = 0; + if (v2rayUpdateHandle2 == null) + { + v2rayUpdateHandle2 = new V2rayUpdateHandle(); + v2rayUpdateHandle2.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, args.Msg); + SetTestResult(lvSelecteds[testCounter - 1], args.Msg); + + if (ServerSpeedTestSub(testCounter, url) != 0) + { + RefreshServers(); + return; + } + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle2.Error += (sender2, args) => + { + SetTestResult(lvSelecteds[testCounter - 1], args.GetException().Message); + AppendText(true, args.GetException().Message); + + if (ServerSpeedTestSub(testCounter, url) != 0) + { + RefreshServers(); + return; + } + }; + } + if (ServerSpeedTestSub(testCounter, url) != 0) + { + return; + } + } + #endregion + + #region 移动服务器 + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveServer(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveServer(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveServer(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveServer(EMove.Bottom); + } + + private void MoveServer(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return; + } + if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvServers.Items) + { + item.Selected = true; + } + } + + #endregion + + #region 系统代理相关 + + private void menuCopyPACUrl_Click(object sender, EventArgs e) + { + Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); + } + + private void menuSysAgentEnabled_Click(object sender, EventArgs e) + { + bool isChecked = !config.sysAgentEnabled; + config.sysAgentEnabled = isChecked; + ChangeSysAgent(isChecked); + } + + private void menuGlobal_Click(object sender, EventArgs e) + { + config.listenerType = 1; + ChangePACButtonStatus(config.listenerType); + } + + private void menuGlobalPAC_Click(object sender, EventArgs e) + { + config.listenerType = 2; + ChangePACButtonStatus(config.listenerType); + } + + private void menuKeep_Click(object sender, EventArgs e) + { + config.listenerType = 3; + ChangePACButtonStatus(config.listenerType); + } + + private void menuKeepPAC_Click(object sender, EventArgs e) + { + config.listenerType = 4; + ChangePACButtonStatus(config.listenerType); + } + + private void ChangePACButtonStatus(int type) + { + if (HttpProxyHandle.Update(config, false)) + { + switch (type) + { + case 1: + menuGlobal.Checked = true; + menuGlobalPAC.Checked = false; + menuKeep.Checked = false; + menuKeepPAC.Checked = false; + break; + case 2: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = true; + menuKeep.Checked = false; + menuKeepPAC.Checked = false; + break; + case 3: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = false; + menuKeep.Checked = true; + menuKeepPAC.Checked = false; + break; + case 4: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = false; + menuKeep.Checked = false; + menuKeepPAC.Checked = true; + break; + } + } + + } + + /// + /// 改变系统代理 + /// + /// + private void ChangeSysAgent(bool isChecked) + { + if (isChecked) + { + if (HttpProxyHandle.RestartHttpAgent(config, true)) + { + ChangePACButtonStatus(config.listenerType); + } + } + else + { + HttpProxyHandle.Update(config, true); + HttpProxyHandle.CloseHttpAgent(config); + } + + menuSysAgentEnabled.Checked = + menuSysAgentMode.Enabled = isChecked; + } + #endregion + + + #region CheckUpdate + + private void tsbCheckUpdateN_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.UpdateUrl); + } + + private void tsbCheckUpdateCore_Click(object sender, EventArgs e) + { + if (v2rayUpdateHandle == null) + { + v2rayUpdateHandle = new V2rayUpdateHandle(); + v2rayUpdateHandle.AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgParsingV2rayCoreSuccessfully")); + + string url = args.Msg; + this.Invoke((MethodInvoker)(delegate + { + + if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.No) + { + return; + } + else + { + v2rayUpdateHandle.DownloadFileAsync(config, url); + } + })); + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + AppendText(false, UIRes.I18N("MsgUnpacking")); + + try + { + CloseV2ray(); + + string fileName = v2rayUpdateHandle.DownloadFileName; + fileName = Utils.GetPath(fileName); + using (ZipArchive archive = ZipFile.OpenRead(fileName)) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.Length == 0) + continue; + entry.ExtractToFile(Utils.GetPath(entry.Name), true); + } + } + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); + + Global.reloadV2ray = true; + LoadV2ray(); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); + } + catch (Exception ex) + { + AppendText(false, ex.Message); + } + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + + AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore")); + v2rayUpdateHandle.AbsoluteV2rayCore(config); + } + + private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) + { + if (pacListHandle == null) + { + pacListHandle = new PACListHandle(); + pacListHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); + } + else + { + AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); + } + }; + pacListHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); + pacListHandle.UpdatePACFromGFWList(config); + } + + private void tsbCheckClearPACList_Click(object sender, EventArgs e) + { + try + { + File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); + AppendText(false, UIRes.I18N("MsgSimplifyPAC")); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + #endregion + + #region Help + + + private void tsbAbout_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.AboutUrl); + } + + private void tsbPromotion_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.PromotionUrl); + } + #endregion + + #region ScanScreen + + + private void bgwScan_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + string ret = Utils.ScanScreen(); + bgwScan.ReportProgress(0, ret); + } + + private void bgwScan_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) + { + ShowForm(); + + string result = Convert.ToString(e.UserState); + if (string.IsNullOrEmpty(result)) + { + UI.Show(UIRes.I18N("NoValidQRcodeFound")); + } + else + { + if (AddBatchServers(result) == 0) + { + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); + } + } + } + + #endregion + + #region 订阅 + private void tsbSubSetting_Click(object sender, EventArgs e) + { + SubSettingForm fm = new SubSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + } + } + + private void tsbSubUpdate_Click(object sender, EventArgs e) + { + AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + + if (config.subItem == null || config.subItem.Count <= 0) + { + AppendText(false, UIRes.I18N("MsgNoValidSubscription")); + return; + } + + for (int k = 1; k <= config.subItem.Count; k++) + { + string id = config.subItem[k - 1].id.Trim(); + string url = config.subItem[k - 1].url.Trim(); + string hashCode = $"{k}->"; + if (config.subItem[k - 1].enabled == false) + { + continue; + } + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + continue; + } + + V2rayUpdateHandle v2rayUpdateHandle3 = new V2rayUpdateHandle(); + v2rayUpdateHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + var result = Utils.Base64Decode(args.Msg); + if (Utils.IsNullOrEmpty(result)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + return; + } + + ConfigHandler.RemoveServerViaSubid(ref config, id); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + RefreshServers(); + if (AddBatchServers(result, id) == 0) + { + } + else + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + } + AppendText(false, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle3.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + + v2rayUpdateHandle3.WebDownloadString(url); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + } + + + } + + #endregion + + #region Language + + private void tsbLanguageDef_Click(object sender, EventArgs e) + { + SetCurrentLanguage("en"); + } + + private void tsbLanguageZhHans_Click(object sender, EventArgs e) + { + SetCurrentLanguage("zh-Hans"); + } + private void SetCurrentLanguage(string value) + { + Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value); + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx new file mode 100644 index 0000000000..99934306ce --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -0,0 +1,1217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 447, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Magenta + + + 447, 22 + + + 97, 53 + + + 447, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Restart service + + + tsbSubSetting + + + menuMoveUp + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 语言-[中文简体] + + + + NoControl + + + Top + + + tsbHelp + + + 338, 22 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator6 + + + 93, 53 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 447, 22 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + toolStripSeparator7 + + + Check for updates to v2rayCore + + + Magenta + + + 447, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + Subscription + + + 992, 351 + + + 447, 22 + + + Export selected server for client configuration + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Export selected server for server configuration + + + splitContainer1 + + + ImageAboveText + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 992, 56 + + + Bottom + + + 992, 176 + + + + 100 + + + 448, 468 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 444, 6 + + + 447, 22 + + + toolStripSeparator1 + + + 4 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 338, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + Servers + + + 3 + + + 3, 17 + + + Fill + + + 6, 56 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddCustomServer + + + menuMoveDown + + + Import bulk URL from clipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Moves down to the bottom + + + 6, 12 + + + 48, 53 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobalPAC + + + Fill + + + 726, 331 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Batch export share URL to clipboard (multiple choice) + + + Update subscription + + + menuAddServers2 + + + Fill + + + 2 + + + Add [VMess] server + + + 264, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tsbAbout + + + 0 + + + toolStripSeparator5 + + + True + + + 444, 6 + + + tsbPromotion + + + 256, 331 + + + 4, 4, 4, 4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 444, 6 + + + groupBox1 + + + Add [Socks] server + + + 0 + + + 197, 22 + + + splitContainer1.Panel2 + + + 52, 53 + + + 447, 22 + + + 6, 56 + + + Test server speed (multiple choice) + + + ImageAboveText + + + splitContainer1 + + + 265, 164 + + + 547, 22 + + + $this + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Check for updates + + + tsbLanguageDef + + + panel1 + + + 3, 17 + + + 4 + + + 197, 22 + + + Only open Http proxy, do not automatically configure proxy server (direct mode) + + + 547, 22 + + + Magenta + + + Remove selected server (multiple choice) (Delete) + + + 0 + + + Help + + + menuSelectAll + + + Up to top + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Scan QR code on the screen + + + ImageAboveText + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + Promotion + + + menuAddServers + + + 447, 22 + + + menuAddVmessServer + + + tsbLanguageZhHans + + + toolStripSeparator9 + + + BottomCenter + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + Check for updates to v2rayN + + + Magenta + + + splitContainer1.Panel1 + + + 0, 66 + + + 5 + + + Server + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddShadowsocksServer + + + txtMsgBox + + + 261, 6 + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + Language-[English] + + + 264, 22 + + + menuScanScreen2 + + + 0 + + + 128, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ImageAboveText + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 417 + + + 444, 6 + + + 264, 22 + + + Setting + + + menuMoveTop + + + menuKeep + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + menuScanScreen + + + cmsLv + + + toolStripSeparator12 + + + 6, 56 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdate + + + tsMain + + + 2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentMode + + + 986, 331 + + + ImageAboveText + + + 447, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + cmsMain + + + 264, 22 + + + menuServers + + + $this + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + menuExport2ClientConfig + + + True + + + 6, 56 + + + 992, 10 + + + menuKeepPAC + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + toolStripSeparator8 + + + 89, 53 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Test server delay (multiple choice) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 447, 22 + + + 264, 22 + + + menuSysAgentEnabled + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable Http proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Subscription settings + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + Http proxy mode + + + 547, 22 + + + Only open PAC, do not automatically configure PAC + + + 447, 22 + + + MainForm + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Server list + + + lvServers + + + splitContainer1.Panel1 + + + Magenta + + + menuGlobal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + Check for updated PAC (requires Http proxy) + + + toolStripSeparator11 + + + 447, 22 + + + About + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + Information + + + $this + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + 447, 22 + + + menuRemoveServer + + + 986, 156 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Down (D) + + + menuCopyPACUrl + + + groupBox1 + + + 447, 22 + + + tsbSub + + + Magenta + + + ImageAboveText + + + Copy selected server + + + 0, 0 + + + 447, 22 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + Simplify PAC (please set Core route) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + 447, 22 + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0, 0 + + + qrCodeControl + + + 264, 22 + + + tsbServer + + + 1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + ImageAboveText + + + splitContainer1.Panel2 + + + 338, 22 + + + 184, 6 + + + 0, 0 + + + Upward (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Open Http proxy and automatically configure proxy server (global mode) + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + 64, 53 + + + Magenta + + + Open PAC and automatically configure PAC (PAC mode) + + + 447, 22 + + + Set as active server (Enter) + + + bgwPing + + + 726 + + + 6, 56 + + + Add [Shadowsocks] server + + + splitContainer1 + + + 992, 593 + + + 547, 22 + + + tsbCheckClearPACList + + + Scan QR code on the screen + + + toolStripSeparator10 + + + menuMoveBottom + + + 338, 22 + + + 6 + + + Magenta + + + 187, 22 + + + menuExport2ServerConfig + + + 0 + + + ImageAboveText + + + 6, 56 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Batch export subscription content to clipboard (multiple choice) + + + 52, 53 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Exit + + + bgwScan + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 56 + + + Close + + + 264, 22 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Import bulk URL from clipboard + + + toolStripSeparator2 + + + Add a custom configuration server + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSpeedServer + + + 2 + + + Fill + + + Copy local PAC URL + + + toolStripSeparator3 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + 447, 22 + + + 447, 22 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdatePACList + + + 232, 17 + + + zh-Hans + + + True + + + 65 + + + 137, 17 + + + 498, 17 + + + 17, 17 + + + 409, 17 + + + 327, 17 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx new file mode 100644 index 0000000000..8395e525d6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 252, 22 + + + 添加[VMess]服务器 + + + 252, 22 + + + 添加[Shadowsocks]服务器 + + + 252, 22 + + + 添加[Socks]服务器 + + + 252, 22 + + + 添加自定义配置服务器 + + + 252, 22 + + + 从剪贴板导入批量URL + + + 252, 22 + + + 扫描屏幕上的二维码 + + + 249, 6 + + + 252, 22 + + + 移除所选服务器(多选) (Delete) + + + 252, 22 + + + 复制所选服务器 + + + 252, 22 + + + 设为活动服务器 (Enter) + + + 249, 6 + + + 252, 22 + + + 上移至顶 + + + 252, 22 + + + 上移 (U) + + + 252, 22 + + + 下移 (D) + + + 252, 22 + + + 下移至底 + + + 252, 22 + + + 全选 (Ctrl+A) + + + 249, 6 + + + 252, 22 + + + 测试服务器延迟(多选) + + + 252, 22 + + + 测试服务器速度(多选) + + + 249, 6 + + + 252, 22 + + + 导出所选服务器为客户端配置 + + + 252, 22 + + + 导出所选服务器为服务端配置 + + + 252, 22 + + + 批量导出分享URL至剪贴板(多选) + + + 252, 22 + + + 批量导出订阅内容至剪贴板(多选) + + + 73, 53 + + + 服务器 + + + 253, 468 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 195, 22 + + + 启用Http代理 + + + 340, 22 + + + 开启Http代理,并自动配置代理服务器(全局模式) + + + 340, 22 + + + 开启PAC,并自动配置PAC(PAC模式) + + + 340, 22 + + + 仅开启Http代理,不自动配置代理服务器(直连模式) + + + 340, 22 + + + 仅开启PAC,不自动配置PAC + + + 195, 22 + + + Http代理模式 + + + 195, 22 + + + 服务器 + + + 195, 22 + + + 从剪贴板导入批量URL + + + 195, 22 + + + 扫描屏幕上的二维码 + + + 195, 22 + + + 复制本地PAC网址 + + + 192, 6 + + + 195, 22 + + + 退出 + + + 196, 164 + + + 服务器列表 + + + 信息 + + + 124, 22 + + + 订阅设置 + + + 124, 22 + + + 更新订阅 + + + 61, 53 + + + 订阅 + + + 76, 53 + + + 参数设置 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + 76, 53 + + + 重启服务 + + + 232, 22 + + + 检查更新v2rayN + + + 232, 22 + + + 检查更新v2rayCore + + + 232, 22 + + + 检查更新PAC (需要Http代理) + + + 232, 22 + + + 简化PAC (请设置Core路由) + + + 85, 53 + + + 检查更新 + + + 关于 + + + 69, 53 + + + 帮助 + + + 68, 53 + + + 推广 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + 关闭 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs new file mode 100644 index 0000000000..8c5eb9b9a8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -0,0 +1,623 @@ +namespace v2rayN.Forms +{ + partial class OptionSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); + this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); + this.txtremoteDNS = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); + this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); + this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); + this.cmbprotocol2 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtlocalPort2 = new System.Windows.Forms.TextBox(); + this.cmbprotocol = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.chkudpEnabled = new System.Windows.Forms.CheckBox(); + this.chklogEnabled = new System.Windows.Forms.CheckBox(); + this.cmbloglevel = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtlocalPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.txtUseragent = new System.Windows.Forms.TextBox(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.txtUserdirect = new System.Windows.Forms.TextBox(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.txtUserblock = new System.Windows.Forms.TextBox(); + this.panel3 = new System.Windows.Forms.Panel(); + this.btnSetDefRountingRule = new System.Windows.Forms.Button(); + this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.cmbroutingMode = new System.Windows.Forms.ComboBox(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); + this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.txtKcpreadBufferSize = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.txtKcpdownlinkCapacity = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.txtKcpuplinkCapacity = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.txtKcptti = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.txtKcpmtu = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.tabPage7 = new System.Windows.Forms.TabPage(); + this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); + this.txturlGFWList = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.chkAutoRun = new System.Windows.Forms.CheckBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.tabPage7.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage6); + this.tabControl1.Controls.Add(this.tabPage7); + resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.chksniffingEnabled2); + this.groupBox1.Controls.Add(this.chksniffingEnabled); + this.groupBox1.Controls.Add(this.txtremoteDNS); + this.groupBox1.Controls.Add(this.label14); + this.groupBox1.Controls.Add(this.chkmuxEnabled); + this.groupBox1.Controls.Add(this.chkAllowIn2); + this.groupBox1.Controls.Add(this.chkudpEnabled2); + this.groupBox1.Controls.Add(this.cmbprotocol2); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtlocalPort2); + this.groupBox1.Controls.Add(this.cmbprotocol); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.chkudpEnabled); + this.groupBox1.Controls.Add(this.chklogEnabled); + this.groupBox1.Controls.Add(this.cmbloglevel); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtlocalPort); + this.groupBox1.Controls.Add(this.label2); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // chksniffingEnabled2 + // + resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); + this.chksniffingEnabled2.Name = "chksniffingEnabled2"; + this.chksniffingEnabled2.UseVisualStyleBackColor = true; + // + // chksniffingEnabled + // + resources.ApplyResources(this.chksniffingEnabled, "chksniffingEnabled"); + this.chksniffingEnabled.Name = "chksniffingEnabled"; + this.chksniffingEnabled.UseVisualStyleBackColor = true; + // + // txtremoteDNS + // + resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); + this.txtremoteDNS.Name = "txtremoteDNS"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // chkmuxEnabled + // + resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled"); + this.chkmuxEnabled.Name = "chkmuxEnabled"; + this.chkmuxEnabled.UseVisualStyleBackColor = true; + // + // chkAllowIn2 + // + resources.ApplyResources(this.chkAllowIn2, "chkAllowIn2"); + this.chkAllowIn2.Name = "chkAllowIn2"; + this.chkAllowIn2.UseVisualStyleBackColor = true; + this.chkAllowIn2.CheckedChanged += new System.EventHandler(this.chkAllowIn2_CheckedChanged); + // + // chkudpEnabled2 + // + resources.ApplyResources(this.chkudpEnabled2, "chkudpEnabled2"); + this.chkudpEnabled2.Name = "chkudpEnabled2"; + this.chkudpEnabled2.UseVisualStyleBackColor = true; + // + // cmbprotocol2 + // + this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbprotocol2.FormattingEnabled = true; + this.cmbprotocol2.Items.AddRange(new object[] { + resources.GetString("cmbprotocol2.Items"), + resources.GetString("cmbprotocol2.Items1")}); + resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); + this.cmbprotocol2.Name = "cmbprotocol2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtlocalPort2 + // + resources.ApplyResources(this.txtlocalPort2, "txtlocalPort2"); + this.txtlocalPort2.Name = "txtlocalPort2"; + // + // cmbprotocol + // + this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); + this.cmbprotocol.FormattingEnabled = true; + this.cmbprotocol.Items.AddRange(new object[] { + resources.GetString("cmbprotocol.Items"), + resources.GetString("cmbprotocol.Items1")}); + this.cmbprotocol.Name = "cmbprotocol"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // chkudpEnabled + // + resources.ApplyResources(this.chkudpEnabled, "chkudpEnabled"); + this.chkudpEnabled.Name = "chkudpEnabled"; + this.chkudpEnabled.UseVisualStyleBackColor = true; + // + // chklogEnabled + // + resources.ApplyResources(this.chklogEnabled, "chklogEnabled"); + this.chklogEnabled.Name = "chklogEnabled"; + this.chklogEnabled.UseVisualStyleBackColor = true; + // + // cmbloglevel + // + this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbloglevel.FormattingEnabled = true; + this.cmbloglevel.Items.AddRange(new object[] { + resources.GetString("cmbloglevel.Items"), + resources.GetString("cmbloglevel.Items1"), + resources.GetString("cmbloglevel.Items2"), + resources.GetString("cmbloglevel.Items3"), + resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); + this.cmbloglevel.Name = "cmbloglevel"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtlocalPort + // + resources.ApplyResources(this.txtlocalPort, "txtlocalPort"); + this.txtlocalPort.Name = "txtlocalPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.tabControl2); + this.groupBox2.Controls.Add(this.panel3); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // tabControl2 + // + this.tabControl2.Controls.Add(this.tabPage3); + this.tabControl2.Controls.Add(this.tabPage4); + this.tabControl2.Controls.Add(this.tabPage5); + resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.txtUseragent); + resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // txtUseragent + // + resources.ApplyResources(this.txtUseragent, "txtUseragent"); + this.txtUseragent.Name = "txtUseragent"; + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.txtUserdirect); + resources.ApplyResources(this.tabPage4, "tabPage4"); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // txtUserdirect + // + resources.ApplyResources(this.txtUserdirect, "txtUserdirect"); + this.txtUserdirect.Name = "txtUserdirect"; + // + // tabPage5 + // + this.tabPage5.Controls.Add(this.txtUserblock); + resources.ApplyResources(this.tabPage5, "tabPage5"); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // txtUserblock + // + resources.ApplyResources(this.txtUserblock, "txtUserblock"); + this.txtUserblock.Name = "txtUserblock"; + // + // panel3 + // + this.panel3.Controls.Add(this.btnSetDefRountingRule); + this.panel3.Controls.Add(this.cmbdomainStrategy); + this.panel3.Controls.Add(this.labRoutingTips); + this.panel3.Controls.Add(this.label15); + this.panel3.Controls.Add(this.label12); + this.panel3.Controls.Add(this.cmbroutingMode); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // btnSetDefRountingRule + // + resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); + this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; + this.btnSetDefRountingRule.UseVisualStyleBackColor = true; + this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); + // + // cmbdomainStrategy + // + this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainStrategy.FormattingEnabled = true; + this.cmbdomainStrategy.Items.AddRange(new object[] { + resources.GetString("cmbdomainStrategy.Items"), + resources.GetString("cmbdomainStrategy.Items1"), + resources.GetString("cmbdomainStrategy.Items2")}); + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); + this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // cmbroutingMode + // + this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbroutingMode.FormattingEnabled = true; + this.cmbroutingMode.Items.AddRange(new object[] { + resources.GetString("cmbroutingMode.Items"), + resources.GetString("cmbroutingMode.Items1"), + resources.GetString("cmbroutingMode.Items2"), + resources.GetString("cmbroutingMode.Items3")}); + resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); + this.cmbroutingMode.Name = "cmbroutingMode"; + // + // tabPage6 + // + this.tabPage6.Controls.Add(this.chkKcpcongestion); + this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); + this.tabPage6.Controls.Add(this.label10); + this.tabPage6.Controls.Add(this.txtKcpreadBufferSize); + this.tabPage6.Controls.Add(this.label11); + this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity); + this.tabPage6.Controls.Add(this.label8); + this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity); + this.tabPage6.Controls.Add(this.label9); + this.tabPage6.Controls.Add(this.txtKcptti); + this.tabPage6.Controls.Add(this.label7); + this.tabPage6.Controls.Add(this.txtKcpmtu); + this.tabPage6.Controls.Add(this.label6); + resources.ApplyResources(this.tabPage6, "tabPage6"); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.UseVisualStyleBackColor = true; + // + // chkKcpcongestion + // + resources.ApplyResources(this.chkKcpcongestion, "chkKcpcongestion"); + this.chkKcpcongestion.Name = "chkKcpcongestion"; + this.chkKcpcongestion.UseVisualStyleBackColor = true; + // + // txtKcpwriteBufferSize + // + resources.ApplyResources(this.txtKcpwriteBufferSize, "txtKcpwriteBufferSize"); + this.txtKcpwriteBufferSize.Name = "txtKcpwriteBufferSize"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // txtKcpreadBufferSize + // + resources.ApplyResources(this.txtKcpreadBufferSize, "txtKcpreadBufferSize"); + this.txtKcpreadBufferSize.Name = "txtKcpreadBufferSize"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // txtKcpdownlinkCapacity + // + resources.ApplyResources(this.txtKcpdownlinkCapacity, "txtKcpdownlinkCapacity"); + this.txtKcpdownlinkCapacity.Name = "txtKcpdownlinkCapacity"; + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // txtKcpuplinkCapacity + // + resources.ApplyResources(this.txtKcpuplinkCapacity, "txtKcpuplinkCapacity"); + this.txtKcpuplinkCapacity.Name = "txtKcpuplinkCapacity"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // txtKcptti + // + resources.ApplyResources(this.txtKcptti, "txtKcptti"); + this.txtKcptti.Name = "txtKcptti"; + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // txtKcpmtu + // + resources.ApplyResources(this.txtKcpmtu, "txtKcpmtu"); + this.txtKcpmtu.Name = "txtKcpmtu"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // tabPage7 + // + this.tabPage7.Controls.Add(this.chkAllowLANConn); + this.tabPage7.Controls.Add(this.txturlGFWList); + this.tabPage7.Controls.Add(this.label13); + this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Name = "tabPage7"; + this.tabPage7.UseVisualStyleBackColor = true; + // + // chkAllowLANConn + // + resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); + this.chkAllowLANConn.Name = "chkAllowLANConn"; + this.chkAllowLANConn.UseVisualStyleBackColor = true; + // + // txturlGFWList + // + resources.ApplyResources(this.txturlGFWList, "txturlGFWList"); + this.txturlGFWList.Name = "txturlGFWList"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // chkAutoRun + // + resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); + this.chkAutoRun.Name = "chkAutoRun"; + this.chkAutoRun.UseVisualStyleBackColor = true; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // OptionSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "OptionSettingForm"; + this.Load += new System.EventHandler(this.OptionSettingForm_Load); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.tabPage4.ResumeLayout(false); + this.tabPage4.PerformLayout(); + this.tabPage5.ResumeLayout(false); + this.tabPage5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.tabPage6.ResumeLayout(false); + this.tabPage6.PerformLayout(); + this.tabPage7.ResumeLayout(false); + this.tabPage7.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.ComboBox cmbloglevel; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtlocalPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox chklogEnabled; + private System.Windows.Forms.CheckBox chkudpEnabled; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.ComboBox cmbprotocol; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbprotocol2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtlocalPort2; + private System.Windows.Forms.CheckBox chkudpEnabled2; + private System.Windows.Forms.CheckBox chkAllowIn2; + private System.Windows.Forms.CheckBox chkmuxEnabled; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.TextBox txtUseragent; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TextBox txtUserdirect; + private System.Windows.Forms.TextBox txtUserblock; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.TextBox txtKcpmtu; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtKcptti; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox txtKcpwriteBufferSize; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox txtKcpreadBufferSize; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox txtKcpdownlinkCapacity; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox txtKcpuplinkCapacity; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox chkKcpcongestion; + private System.Windows.Forms.TabPage tabPage7; + private System.Windows.Forms.CheckBox chkAutoRun; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txturlGFWList; + private System.Windows.Forms.CheckBox chkAllowLANConn; + private System.Windows.Forms.TextBox txtremoteDNS; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.ComboBox cmbdomainStrategy; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ComboBox cmbroutingMode; + private System.Windows.Forms.CheckBox chksniffingEnabled; + private System.Windows.Forms.CheckBox chksniffingEnabled2; + private System.Windows.Forms.Button btnSetDefRountingRule; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs new file mode 100644 index 0000000000..6cf8ebb41e --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Text; +using System.Windows.Forms; +using v2rayN.Handler; + +namespace v2rayN.Forms +{ + public partial class OptionSettingForm : BaseForm + { + public OptionSettingForm() + { + InitializeComponent(); + } + + private void OptionSettingForm_Load(object sender, EventArgs e) + { + InitBase(); + + InitRouting(); + + InitKCP(); + + InitGUI(); + } + + /// + /// 初始化基础设置 + /// + private void InitBase() + { + //日志 + chklogEnabled.Checked = config.logEnabled; + cmbloglevel.Text = config.loglevel; + + //Mux + chkmuxEnabled.Checked = config.muxEnabled; + + //本地监听 + if (config.inbound.Count > 0) + { + txtlocalPort.Text = config.inbound[0].localPort.ToString(); + cmbprotocol.Text = config.inbound[0].protocol.ToString(); + chkudpEnabled.Checked = config.inbound[0].udpEnabled; + chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled; + if (config.inbound.Count > 1) + { + txtlocalPort2.Text = config.inbound[1].localPort.ToString(); + cmbprotocol2.Text = config.inbound[1].protocol.ToString(); + chkudpEnabled2.Checked = config.inbound[1].udpEnabled; + chksniffingEnabled2.Checked = config.inbound[1].sniffingEnabled; + chkAllowIn2.Checked = true; + } + else + { + chkAllowIn2.Checked = false; + } + chkAllowIn2State(); + } + + //remoteDNS + txtremoteDNS.Text = config.remoteDNS; + } + + /// + /// 初始化路由设置 + /// + private void InitRouting() + { + //路由 + cmbdomainStrategy.Text = config.domainStrategy; + int routingMode = 0; + int.TryParse(config.routingMode, out routingMode); + cmbroutingMode.SelectedIndex = routingMode; + + txtUseragent.Text = Utils.List2String(config.useragent, true); + txtUserdirect.Text = Utils.List2String(config.userdirect, true); + txtUserblock.Text = Utils.List2String(config.userblock, true); + } + + /// + /// 初始化KCP设置 + /// + private void InitKCP() + { + txtKcpmtu.Text = config.kcpItem.mtu.ToString(); + txtKcptti.Text = config.kcpItem.tti.ToString(); + txtKcpuplinkCapacity.Text = config.kcpItem.uplinkCapacity.ToString(); + txtKcpdownlinkCapacity.Text = config.kcpItem.downlinkCapacity.ToString(); + txtKcpreadBufferSize.Text = config.kcpItem.readBufferSize.ToString(); + txtKcpwriteBufferSize.Text = config.kcpItem.writeBufferSize.ToString(); + chkKcpcongestion.Checked = config.kcpItem.congestion; + } + + /// + /// 初始化v2rayN GUI设置 + /// + private void InitGUI() + { + //开机自动启动 + chkAutoRun.Checked = Utils.IsAutoRun(); + + //自定义GFWList + txturlGFWList.Text = config.urlGFWList; + + chkAllowLANConn.Checked = config.allowLANConn; + + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (SaveBase() != 0) + { + return; + } + + if (SaveRouting() != 0) + { + return; + } + + if (SaveKCP() != 0) + { + return; + } + + if (SaveGUI() != 0) + { + return; + } + + if (ConfigHandler.SaveConfig(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + /// + /// 保存基础设置 + /// + /// + private int SaveBase() + { + //日志 + bool logEnabled = chklogEnabled.Checked; + string loglevel = cmbloglevel.Text.Trim(); + + //Mux + bool muxEnabled = chkmuxEnabled.Checked; + + //本地监听 + string localPort = txtlocalPort.Text.Trim(); + string protocol = cmbprotocol.Text.Trim(); + bool udpEnabled = chkudpEnabled.Checked; + bool sniffingEnabled = chksniffingEnabled.Checked; + if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort)) + { + UI.Show(UIRes.I18N("FillLocalListeningPort")); + return -1; + } + if (Utils.IsNullOrEmpty(protocol)) + { + UI.Show(UIRes.I18N("PleaseSelectProtocol")); + return -1; + } + config.inbound[0].localPort = Utils.ToInt(localPort); + config.inbound[0].protocol = protocol; + config.inbound[0].udpEnabled = udpEnabled; + config.inbound[0].sniffingEnabled = sniffingEnabled; + + //本地监听2 + string localPort2 = txtlocalPort2.Text.Trim(); + string protocol2 = cmbprotocol2.Text.Trim(); + bool udpEnabled2 = chkudpEnabled2.Checked; + bool sniffingEnabled2 = chksniffingEnabled2.Checked; + if (chkAllowIn2.Checked) + { + if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2)) + { + UI.Show(UIRes.I18N("FillLocalListeningPort")); + return -1; + } + if (Utils.IsNullOrEmpty(protocol2)) + { + UI.Show(UIRes.I18N("PleaseSelectProtocol")); + return -1; + } + if (config.inbound.Count < 2) + { + config.inbound.Add(new Mode.InItem()); + } + config.inbound[1].localPort = Utils.ToInt(localPort2); + config.inbound[1].protocol = protocol2; + config.inbound[1].udpEnabled = udpEnabled2; + config.inbound[1].sniffingEnabled = sniffingEnabled2; + } + else + { + if (config.inbound.Count > 1) + { + config.inbound.RemoveAt(1); + } + } + + //日志 + config.logEnabled = logEnabled; + config.loglevel = loglevel; + + //Mux + config.muxEnabled = muxEnabled; + + //remoteDNS + config.remoteDNS = txtremoteDNS.Text.Trim(); + + return 0; + } + + /// + /// 保存路由设置 + /// + /// + private int SaveRouting() + { + //路由 + string domainStrategy = cmbdomainStrategy.Text; + string routingMode = cmbroutingMode.SelectedIndex.ToString(); + + string useragent = txtUseragent.Text.Trim(); + string userdirect = txtUserdirect.Text.Trim(); + string userblock = txtUserblock.Text.Trim(); + + config.domainStrategy = domainStrategy; + config.routingMode = routingMode; + + config.useragent = Utils.String2List(useragent); + config.userdirect = Utils.String2List(userdirect); + config.userblock = Utils.String2List(userblock); + + return 0; + } + + /// + /// 保存KCP设置 + /// + /// + private int SaveKCP() + { + string mtu = txtKcpmtu.Text.Trim(); + string tti = txtKcptti.Text.Trim(); + string uplinkCapacity = txtKcpuplinkCapacity.Text.Trim(); + string downlinkCapacity = txtKcpdownlinkCapacity.Text.Trim(); + string readBufferSize = txtKcpreadBufferSize.Text.Trim(); + string writeBufferSize = txtKcpwriteBufferSize.Text.Trim(); + bool congestion = chkKcpcongestion.Checked; + + if (Utils.IsNullOrEmpty(mtu) || !Utils.IsNumberic(mtu) + || Utils.IsNullOrEmpty(tti) || !Utils.IsNumberic(tti) + || Utils.IsNullOrEmpty(uplinkCapacity) || !Utils.IsNumberic(uplinkCapacity) + || Utils.IsNullOrEmpty(downlinkCapacity) || !Utils.IsNumberic(downlinkCapacity) + || Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize) + || Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize)) + { + UI.Show(UIRes.I18N("FillKcpParameters")); + return -1; + } + config.kcpItem.mtu = Utils.ToInt(mtu); + config.kcpItem.tti = Utils.ToInt(tti); + config.kcpItem.uplinkCapacity = Utils.ToInt(uplinkCapacity); + config.kcpItem.downlinkCapacity = Utils.ToInt(downlinkCapacity); + config.kcpItem.readBufferSize = Utils.ToInt(readBufferSize); + config.kcpItem.writeBufferSize = Utils.ToInt(writeBufferSize); + config.kcpItem.congestion = congestion; + + return 0; + } + + /// + /// 保存GUI设置 + /// + /// + private int SaveGUI() + { + //开机自动启动 + Utils.SetAutoRun(chkAutoRun.Checked); + + //自定义GFWList + config.urlGFWList = txturlGFWList.Text.Trim(); + + config.allowLANConn = chkAllowLANConn.Checked; + + return 0; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void chkAllowIn2_CheckedChanged(object sender, EventArgs e) + { + chkAllowIn2State(); + } + private void chkAllowIn2State() + { + bool blAllow2 = chkAllowIn2.Checked; + txtlocalPort2.Enabled = + cmbprotocol2.Enabled = + chkudpEnabled2.Enabled = blAllow2; + } + + private void btnSetDefRountingRule_Click(object sender, EventArgs e) + { + var lstUrl = new List(); + lstUrl.Add(Global.CustomRoutingListUrl + "proxy"); + lstUrl.Add(Global.CustomRoutingListUrl + "direct"); + lstUrl.Add(Global.CustomRoutingListUrl + "block"); + + var lstTxt = new List(); + lstTxt.Add(txtUseragent); + lstTxt.Add(txtUserdirect); + lstTxt.Add(txtUserblock); + + for (int k = 0; k < lstUrl.Count; k++) + { + var txt = lstTxt[k]; + V2rayUpdateHandle v2rayUpdateHandle3 = new V2rayUpdateHandle(); + v2rayUpdateHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + var result = args.Msg; + if (Utils.IsNullOrEmpty(result)) + { + return; + } + txt.Text = result; + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle3.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + + v2rayUpdateHandle3.WebDownloadString(lstUrl[k]); + } + } + void AppendText(bool notify, string text) + { + labRoutingTips.Text = text; + } + } +} diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx new file mode 100644 index 0000000000..9a4a727c42 --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -0,0 +1,2247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 355, 16 + + + 75, 23 + + + + 7 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + 4, 22 + + + + 3, 3, 3, 3 + + + 630, 579 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 0 + + + tabPage4 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 1 + + + tabPage5 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 2 + + + Fill + + + 3, 124 + + + 618, 446 + + + 12 + + + tabControl2 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 356, 43 + + + 229, 23 + + + 18 + + + Set default custom routing rules + + + btnSetDefRountingRule + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 123, 13 + + + 209, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + 5, 83 + + + 598, 16 + + + 13 + + + *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 13, 17 + + + 95, 12 + + + 17 + + + Domain strategy + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + True + + + NoControl + + + 13, 50 + + + 77, 12 + + + 15 + + + Routing mode + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + Global + + + Bypassing the LAN address + + + Bypass mainland address + + + Bypassing LAN and mainland address + + + 123, 46 + + + 209, 20 + + + 14 + + + cmbroutingMode + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + Top + + + 3, 17 + + + 618, 107 + + + 19 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Fill + + + 3, 3 + + + 624, 573 + + + 12 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 1 + + + Core: Routing settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + chkKcpcongestion + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 0 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 5 + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + txtKcpuplinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 7 + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 12 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + txturlGFWList + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + Fill + + + 0, 10 + + + 638, 605 + + + 10 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + chksniffingEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + chksniffingEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + chkmuxEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + chkudpEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + cmbprotocol2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + cmbprotocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + chkudpEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 17 + + + Fill + + + 3, 3 + + + 624, 573 + + + 6 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + True + + + NoControl + + + 468, 60 + + + 120, 16 + + + 32 + + + Turn on Sniffing + + + False + + + chksniffingEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + NoControl + + + 468, 27 + + + 120, 16 + + + 31 + + + Turn on Sniffing + + + chksniffingEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 33, 192 + + + 402, 21 + + + 30 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 33, 168 + + + 281, 12 + + + 29 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 15, 93 + + + 174, 16 + + + 20 + + + Turn on Mux Multiplexing + + + chkmuxEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + True + + + 15, 63 + + + 120, 16 + + + 19 + + + listening port 2 + + + False + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 369, 62 + + + 84, 16 + + + 18 + + + Enable UDP + + + False + + + chkudpEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + socks + + + http + + + 257, 60 + + + 97, 20 + + + 17 + + + False + + + cmbprotocol2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 206, 64 + + + 53, 12 + + + 16 + + + protocol + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + False + + + socks + + + http + + + 257, 25 + + + 97, 20 + + + 12 + + + cmbprotocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + True + + + 206, 29 + + + 53, 12 + + + 11 + + + protocol + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 369, 27 + + + 84, 16 + + + 10 + + + Enable UDP + + + chkudpEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + True + + + 15, 124 + + + 126, 16 + + + 9 + + + Record local logs + + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + debug + + + info + + + warning + + + error + + + none + + + 257, 122 + + + 97, 20 + + + 6 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + True + + + 193, 126 + + + 59, 12 + + + 8 + + + Log level + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + True + + + 33, 29 + + + 89, 12 + + + 2 + + + Listening port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 17 + + + txtUseragent + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 0 + + + Proxy's Domain or IP + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 0 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 0 + + + txtUseragent + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + txtUserdirect + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage4 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 1 + + + Directly connected Domain or IP + + + tabPage4 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 1 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 1 + + + txtUserdirect + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage4 + + + 0 + + + txtUserblock + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage5 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 2 + + + Blocked Domain or IP + + + tabPage5 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 2 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 1 + + + txtUserblock + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage5 + + + 0 + + + True + + + 20, 143 + + + 84, 16 + + + 20 + + + congestion + + + chkKcpcongestion + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 0 + + + 345, 100 + + + 94, 21 + + + 15 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + True + + + 236, 104 + + + 95, 12 + + + 14 + + + writeBufferSize + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + 111, 100 + + + 94, 21 + + + 13 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + True + + + 18, 104 + + + 89, 12 + + + 12 + + + readBufferSize + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 + + + 345, 62 + + + 94, 21 + + + 11 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 5 + + + True + + + 236, 66 + + + 101, 12 + + + 10 + + + downlinkCapacity + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + 111, 62 + + + 94, 21 + + + 9 + + + txtKcpuplinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 7 + + + True + + + 18, 66 + + + 89, 12 + + + 8 + + + uplinkCapacity + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + 345, 24 + + + 94, 21 + + + 7 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + True + + + 236, 28 + + + 23, 12 + + + 6 + + + tti + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + 111, 24 + + + 94, 21 + + + 5 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + True + + + 18, 28 + + + 23, 12 + + + 4 + + + mtu + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 12 + + + True + + + 15, 42 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + 30, 132 + + + 468, 21 + + + 28 + + + txturlGFWList + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + 30, 111 + + + 431, 12 + + + 27 + + + Custom GFWList address (please fill in the blank without customization) + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + 15, 16 + + + 132, 16 + + + 23 + + + Boot automatically + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 615 + + + 638, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 267, 16 + + + 75, 23 + + + 8 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Top + + + 0, 0 + + + 638, 10 + + + 9 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + True + + + 6, 12 + + + 638, 675 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx new file mode 100644 index 0000000000..d0a2519d63 --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + + 96, 16 + + + 开启流量探测 + + + 96, 16 + + + 开启流量探测 + + + 191, 12 + + + 自定义DNS(可多个,用逗号(,)隔开) + + + 开启Mux多路复用(默认开启) + + + 102, 16 + + + 本地监听端口2 + + + 66, 16 + + + 开启UDP + + + 29, 12 + + + 协议 + + + 29, 12 + + + 协议 + + + 66, 16 + + + 开启UDP + + + 156, 16 + + + 记录本地日志(默认关闭) + + + 53, 12 + + + 日志等级 + + + 77, 12 + + + 本地监听端口 + + + Core:基础设置 + + + 代理的Domain或IP + + + 直连的Domain或IP + + + 阻止的Domain或IP + + + + NoControl + + + 381, 43 + + + 201, 23 + + + 一键设置默认自定义路由规则 + + + 232, 20 + + + + True + + + 383, 12 + + + *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + + 53, 12 + + + 域名策略 + + + 53, 12 + + + 路由模式 + + + 全局 + + + 绕过局域网地址 + + + 绕过大陆地址 + + + 绕过局域网及大陆地址 + + + 232, 20 + + + Core:路由设置 + + + Core:KCP设置 + + + 144, 16 + + + 允许来自局域网的连接 + + + 227, 12 + + + 自定义GFWList地址(不需自定义请填空白) + + + 180, 16 + + + 开机自动启动(可能会不成功) + + + v2rayN设置 + + + 确定(&O) + + + 参数设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs new file mode 100644 index 0000000000..5d0a2624aa --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs @@ -0,0 +1,78 @@ +namespace v2rayN.Forms +{ + partial class QRCodeControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QRCodeControl)); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.chkShow = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); + this.SuspendLayout(); + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.ReadOnly = true; + // + // picQRCode + // + resources.ApplyResources(this.picQRCode, "picQRCode"); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.TabStop = false; + // + // chkShow + // + resources.ApplyResources(this.chkShow, "chkShow"); + this.chkShow.Name = "chkShow"; + this.chkShow.UseVisualStyleBackColor = true; + this.chkShow.CheckedChanged += new System.EventHandler(this.chkShow_CheckedChanged); + // + // QRCodeControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.txtUrl); + this.Controls.Add(this.chkShow); + this.Name = "QRCodeControl"; + this.Load += new System.EventHandler(this.QRCodeControl_Load); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.PictureBox picQRCode; + private System.Windows.Forms.CheckBox chkShow; + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs new file mode 100644 index 0000000000..b9c86ed369 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -0,0 +1,47 @@ +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class QRCodeControl : UserControl + { + public QRCodeControl() + { + InitializeComponent(); + } + private void QRCodeControl_Load(object sender, System.EventArgs e) + { + chkShow_CheckedChanged(null, null); + txtUrl.MouseUp += txtUrl_MouseUp; + } + + void txtUrl_MouseUp(object sender, MouseEventArgs e) + { + txtUrl.SelectAll(); + } + + public void showQRCode(int Index, Config config) + { + if (Index >= 0) + { + string url = ConfigHandler.GetVmessQRCode(config, Index); + if (string.IsNullOrEmpty(url)) + { + picQRCode.Image = null; + txtUrl.Text = string.Empty; + return; + } + picQRCode.Image = QRCodeHelper.GetQRCode(url); + txtUrl.Text = url; + } + } + + private void chkShow_CheckedChanged(object sender, System.EventArgs e) + { + picQRCode.Visible = + txtUrl.Visible = chkShow.Checked; + } + + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.resx b/v2rayN/v2rayN/Forms/QRCodeControl.resx new file mode 100644 index 0000000000..ef0c4f0494 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + + 356, 441 + + + 0, 0 + + + + 0 + + + Show shared content + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 356, 16 + + + QRCodeControl + + + 356, 355 + + + 0, 371 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + 24 + + + Top + + + Fill + + + True + + + Zoom + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + 0, 16 + + + $this + + + chkShow + + + $this + + + txtUrl + + + 2 + + + picQRCode + + + 356, 70 + + + 25 + + + 6, 12 + + + True + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx new file mode 100644 index 0000000000..991ed0d021 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 显示分享内容 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs new file mode 100644 index 0000000000..733adb4703 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs @@ -0,0 +1,94 @@ +namespace v2rayN.Forms +{ + partial class QRCodeForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtUrl = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // picQRCode + // + this.picQRCode.Dock = System.Windows.Forms.DockStyle.Fill; + this.picQRCode.Location = new System.Drawing.Point(0, 0); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.Size = new System.Drawing.Size(482, 483); + this.picQRCode.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.picQRCode.TabIndex = 23; + this.picQRCode.TabStop = false; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtUrl); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.groupBox1.Location = new System.Drawing.Point(0, 483); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(482, 90); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "URL"; + // + // txtUrl + // + this.txtUrl.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtUrl.Location = new System.Drawing.Point(3, 17); + this.txtUrl.Multiline = true; + this.txtUrl.Name = "txtUrl"; + this.txtUrl.ReadOnly = true; + this.txtUrl.Size = new System.Drawing.Size(476, 70); + this.txtUrl.TabIndex = 0; + // + // QRCodeForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(482, 573); + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.groupBox1); + this.Name = "QRCodeForm"; + this.Text = "服务器配置二维码和URL"; + this.Load += new System.EventHandler(this.QRCodeForm_Load); + this.Shown += new System.EventHandler(this.QRCodeForm_Shown); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.PictureBox picQRCode; + + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.cs b/v2rayN/v2rayN/Forms/QRCodeForm.cs new file mode 100644 index 0000000000..d170b173c5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class QRCodeForm : BaseForm + { + public int Index { get; set; } + + public QRCodeForm() + { + InitializeComponent(); + } + + private void QRCodeForm_Load(object sender, EventArgs e) + { + txtUrl.MouseUp += txtUrl_MouseUp; + } + + void txtUrl_MouseUp(object sender, MouseEventArgs e) + { + txtUrl.SelectAll(); + } + + private void QRCodeForm_Shown(object sender, EventArgs e) + { + if (Index >= 0) + { + VmessQRCode vmessQRCode = null; + if (ConfigHandler.GetVmessQRCode(config, Index, ref vmessQRCode) != 0) + { + return; + } + string url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + picQRCode.Image = QRCodeHelper.GetQRCode(url); + txtUrl.Text = url; + } + } + + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.resx b/v2rayN/v2rayN/Forms/QRCodeForm.resx new file mode 100644 index 0000000000..1af7de150c --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs new file mode 100644 index 0000000000..30fcadf5e8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -0,0 +1,113 @@ +namespace v2rayN.Forms +{ + partial class SubSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.chkEnabled = new System.Windows.Forms.CheckBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.chkEnabled); + this.groupBox2.Controls.Add(this.btnRemove); + this.groupBox2.Controls.Add(this.txtUrl); + this.groupBox2.Controls.Add(this.txtRemarks); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // chkEnabled + // + resources.ApplyResources(this.chkEnabled, "chkEnabled"); + this.chkEnabled.Name = "chkEnabled"; + this.chkEnabled.UseVisualStyleBackColor = true; + this.chkEnabled.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // SubSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox2); + this.Name = "SubSettingControl"; + this.Load += new System.EventHandler(this.SubSettingControl_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.CheckBox chkEnabled; + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs new file mode 100644 index 0000000000..26f83e3d53 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -0,0 +1,62 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public delegate void ChangeEventHandler(object sender, EventArgs e); + public partial class SubSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public SubItem subItem { get; set; } + + public SubSettingControl() + { + InitializeComponent(); + } + + private void SubSettingControl_Load(object sender, EventArgs e) + { + BindingSub(); + } + + private void BindingSub() + { + if (subItem != null) + { + txtRemarks.Text = subItem.remarks.ToString(); + txtUrl.Text = subItem.url.ToString(); + chkEnabled.Checked = subItem.enabled; + } + } + private void EndBindingSub() + { + if (subItem != null) + { + subItem.remarks = txtRemarks.Text.Trim(); + subItem.url = txtUrl.Text.Trim(); + subItem.enabled = chkEnabled.Checked; + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (subItem != null) + { + subItem.remarks = string.Empty; + subItem.url = string.Empty; + } + + if (OnButtonClicked != null) + { + OnButtonClicked(sender, e); + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx new file mode 100644 index 0000000000..af5f03e909 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + groupBox2 + + + + 60, 16 + + + txtUrl + + + &Remove + + + 484, 21 + + + + 24 + + + 432, 46 + + + SubSettingControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + groupBox2 + + + 83, 12 + + + groupBox2 + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + 0 + + + 12, 55 + + + 127, 55 + + + 10 + + + Bottom + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + groupBox2 + + + 4 + + + 47, 12 + + + Subscription details + + + 0, 9 + + + Enable + + + chkEnabled + + + 3 + + + NoControl + + + Address (url) + + + 25 + + + 23 + + + groupBox2 + + + groupBox2 + + + 406, 23 + + + True + + + True + + + btnRemove + + + NoControl + + + label2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 584, 110 + + + NoControl + + + 584, 119 + + + 11 + + + Remarks + + + 0 + + + 12, 25 + + + 75, 23 + + + groupBox2 + + + 265, 21 + + + 10 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + txtRemarks + + + 5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + zh-Hans + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx new file mode 100644 index 0000000000..12e6dbd4dd --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 48, 16 + + + 启用 + + + 移除 + + + 29, 12 + + + 备注 + + + 65, 12 + + + 地址 (url) + + + 订阅详情 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs new file mode 100644 index 0000000000..489693c839 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs @@ -0,0 +1,97 @@ +namespace v2rayN.Forms +{ + partial class SubSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // SubSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "SubSettingForm"; + this.Load += new System.EventHandler(this.SubSettingForm_Load); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs new file mode 100644 index 0000000000..14b5fbf61e --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class SubSettingForm : BaseForm + { + List lstControls = new List(); + + public SubSettingForm() + { + InitializeComponent(); + } + + private void SubSettingForm_Load(object sender, EventArgs e) + { + if (config.subItem == null) + { + config.subItem = new List(); + } + + RefreshSubsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshSubsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.subItem.Count - 1; k >= 0; k--) + { + var item = config.subItem[k]; + if (Utils.IsNullOrEmpty(item.remarks) + && Utils.IsNullOrEmpty(item.url)) + { + if (!Utils.IsNullOrEmpty(item.id)) + { + ConfigHandler.RemoveServerViaSubid(ref config, item.id); + } + config.subItem.RemoveAt(k); + } + } + + for (int k = 0; k < config.subItem.Count; k++) + { + var item = config.subItem[k]; + SubSettingControl control = new SubSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.subItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshSubsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.subItem.Count <= 0) + { + AddSub(); + } + + if (ConfigHandler.SaveSubItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddSub(); + + RefreshSubsView(); + } + + + private void AddSub() + { + var subItem = new SubItem(); + subItem.id = string.Empty; + subItem.remarks = "remarks"; + subItem.url = "url"; + config.subItem.Add(subItem); + } + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx new file mode 100644 index 0000000000..05d3db7b73 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 0 + + + 581, 569 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 569 + + + 581, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 581, 629 + + + Subscription settings + + + SubSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx new file mode 100644 index 0000000000..628dd5abaa --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 添加(&A) + + + 确定(&O) + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 订阅设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs new file mode 100644 index 0000000000..5046c45987 --- /dev/null +++ b/v2rayN/v2rayN/Global.cs @@ -0,0 +1,170 @@ + +namespace v2rayN +{ + class Global + { + #region 常量 + + /// + /// 更新链接 + /// + public const string UpdateUrl = @"https://github.com/2dust/v2rayN/releases"; + /// + /// 关于链接 + /// + public const string AboutUrl = @"https://github.com/2dust/v2rayN"; + + /// + /// SpeedTestUrl + /// + public const string SpeedTestUrl = @"http://speedtest-sfo2.digitalocean.com/10mb.test"; + + /// + /// CustomRoutingListUrl + /// + public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"; + + /// + /// PromotionUrl + /// + public const string PromotionUrl = @"https://1.2345345.xyz/ads.html"; + + /// + /// 本软件配置文件名 + /// + public const string ConfigFileName = "guiNConfig.json"; + + /// + /// v2ray配置文件名 + /// + public const string v2rayConfigFileName = "config.json"; + + /// + /// v2ray客户端配置样例文件名 + /// + public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig.txt"; + /// + /// v2ray服务端配置样例文件名 + /// + public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig.txt"; + /// + /// v2ray配置Httprequest文件名 + /// + public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest.txt"; + /// + /// v2ray配置Httpresponse文件名 + /// + public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; + /// + /// 空白的pac文件 + /// + public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt"; + + + /// + /// 默认加密方式 + /// + public const string DefaultSecurity = "auto"; + + /// + /// 默认传输协议 + /// + public const string DefaultNetwork = "tcp"; + + /// + /// Tcp伪装http + /// + public const string TcpHeaderHttp = "http"; + + /// + /// None值 + /// + public const string None = "none"; + + /// + /// 代理 tag值 + /// + public const string agentTag = "proxy"; + + /// + /// 直连 tag值 + /// + public const string directTag = "direct"; + + /// + /// 阻止 tag值 + /// + public const string blockTag = "block"; + + /// + /// vmess + /// + public const string vmessProtocol = "vmess://"; + /// + /// shadowsocks + /// + public const string ssProtocol = "ss://"; + /// + /// socks + /// + public const string socksProtocol = "socks://"; + + /// + /// pac + /// + public const string pacFILE = "pac.txt"; + + /// + /// email + /// + public const string userEMail = "t@t.tt"; + + /// + /// MyRegPath + /// + public const string MyRegPath = "Software\\v2rayNGUI"; + + /// + /// Language + /// + public const string MyRegKeyLanguage = "CurrentLanguage"; + /// + /// Icon + /// + public const string CustomIconName = "v2rayN.ico"; + + #endregion + + #region 全局变量 + + /// + /// 是否需要重启服务V2ray + /// + public static bool reloadV2ray { get; set; } + + /// + /// 是否开启全局代理(http) + /// + public static bool sysAgent { get; set; } + + /// + /// socks端口号 + /// + public static int socksPort { get; set; } + + /// + /// 全局代理端口(http) + /// + public static int sysAgentPort { get; set; } + + /// + /// PAC监听端口号 + /// + public static int pacPort { get; set; } + + #endregion + + + + } +} diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs new file mode 100644 index 0000000000..ecefedf04a --- /dev/null +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -0,0 +1,784 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + /// + /// 本软件配置文件处理类 + /// + class ConfigHandler + { + private static string configRes = Global.ConfigFileName; + + /// + /// 载入配置文件 + /// + /// + /// + public static int LoadConfig(ref Config config) + { + //载入配置文件 + string result = Utils.LoadResource(Utils.GetPath(configRes)); + if (!Utils.IsNullOrEmpty(result)) + { + //转成Json + config = Utils.FromJson(result); + } + if (config == null) + { + config = new Config(); + config.index = -1; + config.logEnabled = false; + config.loglevel = "warning"; + config.vmess = new List(); + + //Mux + config.muxEnabled = true; + + ////默认监听端口 + //config.pacPort = 8888; + } + + //本地监听 + if (config.inbound == null) + { + config.inbound = new List(); + InItem inItem = new InItem(); + inItem.protocol = "socks"; + inItem.localPort = 10808; + inItem.udpEnabled = true; + inItem.sniffingEnabled = true; + + config.inbound.Add(inItem); + + //inItem = new InItem(); + //inItem.protocol = "http"; + //inItem.localPort = 1081; + //inItem.udpEnabled = true; + + //config.inbound.Add(inItem); + } + else + { + //http协议不由core提供,只保留socks + if (config.inbound.Count > 0) + { + config.inbound[0].protocol = "socks"; + } + } + //路由规则 + if (Utils.IsNullOrEmpty(config.domainStrategy)) + { + config.domainStrategy = "IPIfNonMatch"; + } + if (Utils.IsNullOrEmpty(config.routingMode)) + { + config.routingMode = "0"; + } + if (config.useragent == null) + { + config.useragent = new List(); + } + if (config.userdirect == null) + { + config.userdirect = new List(); + } + if (config.userblock == null) + { + config.userblock = new List(); + } + //kcp + if (config.kcpItem == null) + { + config.kcpItem = new KcpItem(); + config.kcpItem.mtu = 1350; + config.kcpItem.tti = 50; + config.kcpItem.uplinkCapacity = 12; + config.kcpItem.downlinkCapacity = 100; + config.kcpItem.readBufferSize = 2; + config.kcpItem.writeBufferSize = 2; + config.kcpItem.congestion = false; + } + if (config.uiItem == null) + { + config.uiItem = new UIItem(); + } + //// 如果是用户升级,首次会有端口号为0的情况,不可用,这里处理 + //if (config.pacPort == 0) + //{ + // config.pacPort = 8888; + //} + + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + Global.reloadV2ray = false; + } + else + { + Global.reloadV2ray = true; + + //版本升级 + for (int i = 0; i < config.vmess.Count; i++) + { + VmessItem vmessItem = config.vmess[i]; + UpgradeServerVersion(ref vmessItem); + } + } + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Vmess; + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + //删除 + config.vmess.RemoveAt(index); + + + //移除的是活动的 + if (config.index.Equals(index)) + { + if (config.vmess.Count > 0) + { + config.index = 0; + } + else + { + config.index = -1; + } + Global.reloadV2ray = true; + } + else if (index < config.index)//移除活动之前的 + { + config.index--; + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 复制服务器 + /// + /// + /// + /// + public static int CopyServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + vmessItem.configVersion = config.vmess[index].configVersion; + vmessItem.configType = config.vmess[index].configType; + vmessItem.address = config.vmess[index].address; + vmessItem.port = config.vmess[index].port; + vmessItem.id = config.vmess[index].id; + vmessItem.alterId = config.vmess[index].alterId; + vmessItem.security = config.vmess[index].security; + vmessItem.network = config.vmess[index].network; + vmessItem.headerType = config.vmess[index].headerType; + vmessItem.requestHost = config.vmess[index].requestHost; + vmessItem.path = config.vmess[index].path; + vmessItem.streamSecurity = config.vmess[index].streamSecurity; + vmessItem.remarks = string.Format("{0}-clone", config.vmess[index].remarks); + + config.vmess.Add(vmessItem); + + ToJsonFile(config); + + return 0; + } + + /// + /// 设置活动服务器 + /// + /// + /// + /// + public static int SetDefaultServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + ////和现在相同 + //if (config.index.Equals(index)) + //{ + // return -1; + //} + config.index = index; + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 保参数 + /// + /// + /// + public static int SaveConfig(ref Config config) + { + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 存储文件 + /// + /// + public static void ToJsonFile(Config config) + { + Utils.ToJsonFile(config, Utils.GetPath(configRes)); + } + + /// + /// 取得服务器QRCode配置 + /// + /// + /// + /// + public static string GetVmessQRCode(Config config, int index) + { + try + { + string url = string.Empty; + + VmessItem vmessItem = config.vmess[index]; + if (vmessItem.configType == (int)EConfigType.Vmess) + { + VmessQRCode vmessQRCode = new VmessQRCode(); + vmessQRCode.v = vmessItem.configVersion.ToString(); + vmessQRCode.ps = vmessItem.remarks.Trim(); //备注也许很长 ; + vmessQRCode.add = vmessItem.address; + vmessQRCode.port = vmessItem.port.ToString(); + vmessQRCode.id = vmessItem.id; + vmessQRCode.aid = vmessItem.alterId.ToString(); + vmessQRCode.net = vmessItem.network; + vmessQRCode.type = vmessItem.headerType; + vmessQRCode.host = vmessItem.requestHost; + vmessQRCode.path = vmessItem.path; + vmessQRCode.tls = vmessItem.streamSecurity; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + + } + else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + { + var remark = string.Empty; + if (!Utils.IsNullOrEmpty(vmessItem.remarks)) + { + remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + vmessItem.security, + vmessItem.id, + vmessItem.address, + vmessItem.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + } + else if (vmessItem.configType == (int)EConfigType.Socks) + { + var remark = string.Empty; + if (!Utils.IsNullOrEmpty(vmessItem.remarks)) + { + remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); + } + url = string.Format("{0}:{1}", + vmessItem.address, + vmessItem.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + } + else + { + } + return url; + } + catch + { + return ""; + } + } + + /// + /// 移动服务器 + /// + /// + /// + /// + /// + public static int MoveServer(ref Config config, int index, EMove eMove) + { + int count = config.vmess.Count; + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(0, vmess); + if (index < config.index) + { + // + } + else if (config.index == index) + { + config.index = 0; + } + else + { + config.index++; + } + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(index - 1, vmess); + if (index == config.index + 1) + { + config.index++; + } + else if (config.index == index) + { + config.index--; + } + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(index + 1, vmess); + if (index == config.index - 1) + { + config.index--; + } + else if (config.index == index) + { + config.index++; + } + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Add(vmess); + if (index < config.index) + { + config.index--; + } + else if (config.index == index) + { + config.index = count - 1; + } + else + { + // + } + break; + } + + } + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加自定义服务器 + /// + /// + /// + /// + public static int AddCustomServer(ref Config config, string fileName) + { + string newFileName = string.Empty; + newFileName = string.Format("{0}.json", Utils.GetGUID()); + newFileName = Path.Combine(Utils.GetTempPath(), newFileName); + + try + { + File.Copy(fileName, newFileName); + } + catch + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + vmessItem.address = newFileName; + vmessItem.configType = (int)EConfigType.Custom; + vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); + + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int EditCustomServer(ref Config config, VmessItem vmessItem, int index) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Shadowsocks; + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Socks; + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 配置文件版本升级 + /// + /// + /// + public static int UpgradeServerVersion(ref VmessItem vmessItem) + { + try + { + if (vmessItem == null + || vmessItem.configVersion == 2) + { + return 0; + } + if (vmessItem.configType == (int)EConfigType.Vmess) + { + string path = ""; + string host = ""; + string[] arrParameter; + switch (vmessItem.network) + { + case "kcp": + break; + case "ws": + //*ws(path+host),它们中间分号(;)隔开 + arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';'); + if (arrParameter.Length > 0) + { + path = arrParameter[0]; + } + if (arrParameter.Length > 1) + { + path = arrParameter[0]; + host = arrParameter[1]; + } + vmessItem.path = path; + vmessItem.requestHost = host; + break; + case "h2": + //*h2 path + arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';'); + if (arrParameter.Length > 0) + { + path = arrParameter[0]; + } + if (arrParameter.Length > 1) + { + path = arrParameter[0]; + host = arrParameter[1]; + } + vmessItem.path = path; + vmessItem.requestHost = host; + break; + default: + break; + } + } + vmessItem.configVersion = 2; + } + catch + { + } + return 0; + } + + /// + /// 批量添加服务器 + /// + /// + /// + /// + /// + public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) + //{ + // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); + //} + int countServers = 0; + + //string[] arrData = clipboardData.Split(new string[] { "\r\n" }, StringSplitOptions.None); + string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); + foreach (string str in arrData) + { + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out msg); + if (vmessItem == null) + { + continue; + } + vmessItem.subid = subid; + if (vmessItem.configType == (int)EConfigType.Vmess) + { + if (AddServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + { + if (AddShadowsocksServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == (int)EConfigType.Socks) + { + if (AddSocksServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + } + if (countServers > 0) + { + return 0; + } + return -1; + } + + /// + /// save sub + /// + /// + /// + public static int SaveSubItem(ref Config config) + { + if (config.subItem == null || config.subItem.Count <= 0) + { + return -1; + } + + foreach (SubItem sub in config.subItem) + { + if (Utils.IsNullOrEmpty(sub.id)) + { + sub.id = Utils.GetGUID(); + } + } + + ToJsonFile(config); + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServerViaSubid(ref Config config, string subid) + { + if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) + { + return -1; + } + for (int k = config.vmess.Count - 1; k >= 0; k--) + { + if (config.vmess[k].subid.Equals(subid)) + { + config.vmess.RemoveAt(k); + } + } + + ToJsonFile(config); + return 0; + } + } +} diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs new file mode 100644 index 0000000000..ec43bce1bb --- /dev/null +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -0,0 +1,190 @@ +using System; +using Microsoft.Win32; +using System.Runtime.InteropServices; + +namespace v2rayN.Handler +{ + /// + /// 设置系统代理类 + /// + class ProxySetting + { + public static bool UnsetProxy() + { + return SetProxy(null, null); + } + public static bool SetProxy(string strProxy) + { + return SetProxy(strProxy, null); + } + + public static bool SetProxy(string strProxy, string exceptions) + { + InternetPerConnOptionList list = new InternetPerConnOptionList(); + + int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3); + InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; + // USE a proxy server ... + options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + // use THIS proxy server + if (optionCount > 1) + { + options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); + // except for these addresses ... + if (optionCount > 2) + { + options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; + options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); + } + } + + // default stuff + list.dwSize = Marshal.SizeOf(list); + list.szConnection = IntPtr.Zero; + list.dwOptionCount = options.Length; + list.dwOptionError = 0; + + + int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); + // make a pointer out of all that ... + IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); + // copy the array over into that spot in memory ... + for (int i = 0; i < options.Length; ++i) + { + IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + + list.options = optionsPtr; + + // and then make a pointer out of the whole list + IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); + Marshal.StructureToPtr(list, ipcoListPtr, false); + + // and finally, call the API method! + int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, + InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, + ipcoListPtr, list.dwSize) ? -1 : 0; + if (returnvalue == 0) + { // get the error codes, they might be helpful + returnvalue = Marshal.GetLastWin32Error(); + } + // FREE the data ASAP + Marshal.FreeCoTaskMem(optionsPtr); + Marshal.FreeCoTaskMem(ipcoListPtr); + if (returnvalue > 0) + { // throw the error codes, they might be helpful + //throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + return (returnvalue < 0); + } + + + #region WinInet structures + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetPerConnOptionList + { + public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct + public IntPtr szConnection; // connection name to set/query options + public int dwOptionCount; // number of options to set/query + public int dwOptionError; // on error, which option failed + //[MarshalAs(UnmanagedType.)] + public IntPtr options; + }; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetConnectionOption + { + static readonly int Size; + public PerConnOption m_Option; + public InternetConnectionOptionValue m_Value; + static InternetConnectionOption() + { + InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); + } + + // Nested Types + [StructLayout(LayoutKind.Explicit)] + public struct InternetConnectionOptionValue + { + // Fields + [FieldOffset(0)] + public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; + [FieldOffset(0)] + public int m_Int; + [FieldOffset(0)] + public IntPtr m_StringPtr; + } + } + #endregion + + #region WinInet enums + // + // options manifests for Internet{Query|Set}Option + // + public enum InternetOption : uint + { + INTERNET_OPTION_PER_CONNECTION_OPTION = 75 + } + + // + // Options used in INTERNET_PER_CONN_OPTON struct + // + public enum PerConnOption + { + INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags + INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. + INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. + INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. + + } + + // + // PER_CONN_FLAGS + // + [Flags] + public enum PerConnFlags + { + PROXY_TYPE_DIRECT = 0x00000001, // direct to net + PROXY_TYPE_PROXY = 0x00000002, // via named proxy + PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL + PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection + } + #endregion + + internal static class NativeMethods + { + [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength); + } + + //判断是否使用代理 + public static bool UsedProxy() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + if (rk.GetValue("ProxyEnable").ToString() == "1") + { + rk.Close(); + return true; + } + else + { + rk.Close(); + return false; + } + } + //获得代理的IP和端口 + public static string GetProxyProxyServer() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + string ProxyServer = rk.GetValue("ProxyServer").ToString(); + rk.Close(); + return ProxyServer; + + } + } +} diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs new file mode 100644 index 0000000000..e5433dec32 --- /dev/null +++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs @@ -0,0 +1,41 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using ZXing; +using ZXing.QrCode; + +namespace v2rayN.Handler +{ + /// + /// 含有QR码的描述类和包装编码和渲染 + /// + public class QRCodeHelper + { + public static Image GetQRCode(string strContent) + { + Image img = null; + try + { + QrCodeEncodingOptions options = new QrCodeEncodingOptions(); + options.CharacterSet = "UTF-8"; + options.DisableECI = true; // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。 + options.ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M; // 纠错级别 + options.Width = 500; + options.Height = 500; + options.Margin = 1; + // options.Hints,更多属性,也可以在这里添加。 + + BarcodeWriter writer = new BarcodeWriter(); + writer.Format = BarcodeFormat.QR_CODE; + writer.Options = options; + Bitmap bmp = writer.Write(strContent); + img = (Image)bmp; + return img; + } + catch + { + return img; + } + } + } +} diff --git a/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs b/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs new file mode 100644 index 0000000000..57d4f56466 --- /dev/null +++ b/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace v2rayN.Handler +{ + /// + /// 路由规则文件处理类 + /// + class RoutingRuleHandler + { + /// + /// Parse Pac to v2ray rule + /// + /// + /// + public static List ParsePac(string filePath) + { + string result = Utils.LoadResource(filePath); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + //取得rule + string pattern = @"(?is)(?<=\[)(.*)(?=\])"; + Regex rgx = new Regex(pattern); + result = rgx.Match(result).Value; + int index = result.IndexOf("];"); + result = result.Substring(0, index); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + string[] arrPac = result.Split(','); + List lstPac = new List(); + foreach (string str in arrPac) + { + //处理有效值 + if (Utils.IsNullOrEmpty(str) + || str.Length <= 3) + { + continue; + } + string value = str.Replace("\",", "").Replace("\"", "").Replace(",", "").Replace("\r\n", "").Replace(" ", ""); + lstPac.Add(value); + } + + return lstPac; + } + + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs new file mode 100644 index 0000000000..531c501b12 --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -0,0 +1,1264 @@ +using System; +using System.Collections.Generic; +using System.IO; +using v2rayN.Mode; +using System.Net; +using System.Text; + +namespace v2rayN.Handler +{ + /// + /// v2ray配置文件处理类 + /// + class V2rayConfigHandler + { + private static string SampleClient = Global.v2raySampleClient; + private static string SampleServer = Global.v2raySampleServer; + + #region 生成客户端配置 + + /// + /// 生成v2ray的客户端配置文件 + /// + /// + /// + /// + /// + public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + msg = UIRes.I18N("InitialConfiguration"); + if (config.configType() == (int)EConfigType.Custom) + { + return GenerateClientCustomConfig(config, fileName, out msg); + } + + //取得默认配置 + string result = Utils.GetEmbedText(SampleClient); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedGetDefaultConfiguration"); + return -1; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + + //开始修改配置 + log(config, ref v2rayConfig, blExport); + + //本地端口 + inbound(config, ref v2rayConfig); + + //路由 + routing(config, ref v2rayConfig); + + //outbound + outbound(config, ref v2rayConfig); + + //dns + dns(config, ref v2rayConfig); + + Utils.ToJsonFile(v2rayConfig, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + /// + /// 日志 + /// + /// + /// + /// + private static int log(Config config, ref V2rayConfig v2rayConfig, bool blExport) + { + try + { + if (blExport) + { + if (config.logEnabled) + { + v2rayConfig.log.loglevel = config.loglevel; + } + else + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = ""; + v2rayConfig.log.error = ""; + } + } + else + { + if (config.logEnabled) + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = Utils.GetPath(v2rayConfig.log.access); + v2rayConfig.log.error = Utils.GetPath(v2rayConfig.log.error); + } + else + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = ""; + v2rayConfig.log.error = ""; + } + } + } + catch + { + } + return 0; + } + + /// + /// 本地端口 + /// + /// + /// + /// + private static int inbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var inbound = v2rayConfig.inbounds[0]; + //端口 + inbound.port = config.inbound[0].localPort; + inbound.protocol = config.inbound[0].protocol; + if (config.allowLANConn) + { + inbound.listen = "0.0.0.0"; + } + else + { + inbound.listen = "127.0.0.1"; + } + //开启udp + inbound.settings.udp = config.inbound[0].udpEnabled; + inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; + } + catch + { + } + return 0; + } + + /// + /// 路由 + /// + /// + /// + /// + private static int routing(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (v2rayConfig.routing != null + && v2rayConfig.routing.rules != null) + { + v2rayConfig.routing.domainStrategy = config.domainStrategy; + + //自定义 + //需代理 + routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig); + //直连 + routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig); + //阻止 + routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig); + + + switch (config.routingMode) + { + case "0": + break; + case "1": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + break; + case "2": + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + case "3": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + } + + } + } + catch + { + } + return 0; + } + private static int routingUserRule(List userRule, string tag, ref V2rayConfig v2rayConfig) + { + try + { + if (userRule != null + && userRule.Count > 0) + { + //Domain + RulesItem rulesDomain = new RulesItem(); + rulesDomain.type = "field"; + rulesDomain.outboundTag = tag; + rulesDomain.domain = new List(); + + //IP + RulesItem rulesIP = new RulesItem(); + rulesIP.type = "field"; + rulesIP.outboundTag = tag; + rulesIP.ip = new List(); + + for (int k = 0; k < userRule.Count; k++) + { + string url = userRule[k].Trim(); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + if (Utils.IsIP(url) || url.StartsWith("geoip:")) + { + rulesIP.ip.Add(url); + } + else if (Utils.IsDomain(url) + || url.StartsWith("geosite:") + || url.StartsWith("regexp:") + || url.StartsWith("domain:") + || url.StartsWith("full:")) + { + rulesDomain.domain.Add(url); + } + } + if (rulesDomain.domain.Count > 0) + { + v2rayConfig.routing.rules.Add(rulesDomain); + } + if (rulesIP.ip.Count > 0) + { + v2rayConfig.routing.rules.Add(rulesIP); + } + } + } + catch + { + } + return 0; + } + + + private static int routingGeo(string ipOrDomain, string code, string tag, ref V2rayConfig v2rayConfig) + { + try + { + if (!Utils.IsNullOrEmpty(code)) + { + //IP + if (ipOrDomain == "ip" || ipOrDomain == "") + { + RulesItem rulesItem = new RulesItem(); + rulesItem.type = "field"; + rulesItem.outboundTag = Global.directTag; + rulesItem.ip = new List(); + rulesItem.ip.Add($"geoip:{code}"); + + v2rayConfig.routing.rules.Add(rulesItem); + } + + if (ipOrDomain == "domain" || ipOrDomain == "") + { + RulesItem rulesItem = new RulesItem(); + rulesItem.type = "field"; + rulesItem.outboundTag = Global.directTag; + rulesItem.domain = new List(); + rulesItem.domain.Add($"geosite:{code}"); + v2rayConfig.routing.rules.Add(rulesItem); + } + } + } + catch + { + } + return 0; + } + + /// + /// vmess协议服务器配置 + /// + /// + /// + /// + private static int outbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var outbound = v2rayConfig.outbounds[0]; + if (config.configType() == (int)EConfigType.Vmess) + { + VnextItem vnextItem; + if (outbound.settings.vnext.Count <= 0) + { + vnextItem = new VnextItem(); + outbound.settings.vnext.Add(vnextItem); + } + else + { + vnextItem = outbound.settings.vnext[0]; + } + //远程服务器地址和端口 + vnextItem.address = config.address(); + vnextItem.port = config.port(); + + UsersItem usersItem; + if (vnextItem.users.Count <= 0) + { + usersItem = new UsersItem(); + vnextItem.users.Add(usersItem); + } + else + { + usersItem = vnextItem.users[0]; + } + //远程服务器用户ID + usersItem.id = config.id(); + usersItem.alterId = config.alterId(); + usersItem.email = Global.userEMail; + usersItem.security = config.security(); + + //Mux + outbound.mux.enabled = config.muxEnabled; + + //远程服务器底层传输配置 + StreamSettings streamSettings = outbound.streamSettings; + boundStreamSettings(config, "out", ref streamSettings); + + outbound.protocol = "vmess"; + outbound.settings.servers = null; + } + else if (config.configType() == (int)EConfigType.Shadowsocks) + { + ServersItem serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers[0]; + } + //远程服务器地址和端口 + serversItem.address = config.address(); + serversItem.port = config.port(); + serversItem.password = config.id(); + serversItem.method = config.security(); + + serversItem.ota = false; + serversItem.level = 1; + + outbound.mux.enabled = false; + + outbound.protocol = "shadowsocks"; + outbound.settings.vnext = null; + } + else if (config.configType() == (int)EConfigType.Socks) + { + ServersItem serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers[0]; + } + //远程服务器地址和端口 + serversItem.address = config.address(); + serversItem.port = config.port(); + + outbound.mux.enabled = false; + + outbound.protocol = "socks"; + outbound.settings.vnext = null; + } + } + catch + { + } + return 0; + } + + /// + /// vmess协议远程服务器底层传输配置 + /// + /// + /// + /// + /// + private static int boundStreamSettings(Config config, string iobound, ref StreamSettings streamSettings) + { + try + { + //远程服务器底层传输配置 + streamSettings.network = config.network(); + streamSettings.security = config.streamSecurity(); + + //streamSettings + switch (config.network()) + { + //kcp基本配置暂时是默认值,用户能自己设置伪装类型 + case "kcp": + KcpSettings kcpSettings = new KcpSettings(); + kcpSettings.mtu = config.kcpItem.mtu; + kcpSettings.tti = config.kcpItem.tti; + if (iobound.Equals("out")) + { + kcpSettings.uplinkCapacity = config.kcpItem.uplinkCapacity; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + else if (iobound.Equals("in")) + { + kcpSettings.uplinkCapacity = config.kcpItem.downlinkCapacity; ; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + else + { + kcpSettings.uplinkCapacity = config.kcpItem.uplinkCapacity; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + + kcpSettings.congestion = config.kcpItem.congestion; + kcpSettings.readBufferSize = config.kcpItem.readBufferSize; + kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; + kcpSettings.header = new Header(); + kcpSettings.header.type = config.headerType(); + streamSettings.kcpSettings = kcpSettings; + break; + //ws + case "ws": + WsSettings wsSettings = new WsSettings(); + wsSettings.connectionReuse = true; + + string host2 = config.requestHost(); + string path = config.path(); + if (!string.IsNullOrWhiteSpace(host2)) + { + wsSettings.headers = new Headers(); + wsSettings.headers.Host = host2; + } + if (!string.IsNullOrWhiteSpace(path)) + { + wsSettings.path = path; + } + streamSettings.wsSettings = wsSettings; + + TlsSettings tlsSettings = new TlsSettings(); + tlsSettings.allowInsecure = config.allowInsecure(); + if (!string.IsNullOrWhiteSpace(host2)) + { + tlsSettings.serverName = host2; + } + streamSettings.tlsSettings = tlsSettings; + break; + //h2 + case "h2": + HttpSettings httpSettings = new HttpSettings(); + + string host3 = config.requestHost(); + if (!string.IsNullOrWhiteSpace(host3)) + { + httpSettings.host = Utils.String2List(host3); + } + httpSettings.path = config.path(); + + streamSettings.httpSettings = httpSettings; + + TlsSettings tlsSettings2 = new TlsSettings(); + tlsSettings2.allowInsecure = config.allowInsecure(); + streamSettings.tlsSettings = tlsSettings2; + break; + //quic + case "quic": + QuicSettings quicsettings = new QuicSettings(); + quicsettings.security = config.requestHost(); + quicsettings.key = config.path(); + quicsettings.header = new Header(); + quicsettings.header.type = config.headerType(); + + streamSettings.quicSettings = quicsettings; + break; + default: + //tcp带http伪装 + if (config.headerType().Equals(Global.TcpHeaderHttp)) + { + TcpSettings tcpSettings = new TcpSettings(); + tcpSettings.connectionReuse = true; + tcpSettings.header = new Header(); + tcpSettings.header.type = config.headerType(); + + if (iobound.Equals("out")) + { + //request填入自定义Host + string request = Utils.GetEmbedText(Global.v2raySampleHttprequestFileName); + string[] arrHost = config.requestHost().Split(','); + string host = string.Join("\",\"", arrHost); + request = request.Replace("$requestHost$", string.Format("\"{0}\"", host)); + //request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost())); + + //填入自定义Path + string pathHttp = @"/"; + if (!Utils.IsNullOrEmpty(config.path())) + { + string[] arrPath = config.path().Split(','); + pathHttp = string.Join("\",\"", arrPath); + } + request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); + tcpSettings.header.request = Utils.FromJson(request); + } + else if (iobound.Equals("in")) + { + //string response = Utils.GetEmbedText(Global.v2raySampleHttpresponseFileName); + //tcpSettings.header.response = Utils.FromJson(response); + } + + streamSettings.tcpSettings = tcpSettings; + } + break; + } + } + catch + { + } + return 0; + } + + /// + /// remoteDNS + /// + /// + /// + /// + private static int dns(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (string.IsNullOrWhiteSpace(config.remoteDNS)) + { + return 0; + } + List servers = new List(); + + string[] arrDNS = config.remoteDNS.Split(','); + foreach (string str in arrDNS) + { + //if (Utils.IsIP(str)) + //{ + servers.Add(str); + //} + } + //servers.Add("localhost"); + v2rayConfig.dns = new Mode.Dns(); + v2rayConfig.dns.servers = servers; + } + catch + { + } + return 0; + } + + /// + /// 生成v2ray的客户端配置文件(自定义配置) + /// + /// + /// + /// + /// + public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + string addressFileName = config.address(); + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + File.Copy(addressFileName, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + #endregion + + #region 生成服务端端配置 + + /// + /// 生成v2ray的客户端配置文件 + /// + /// + /// + /// + /// + public static int GenerateServerConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + msg = UIRes.I18N("InitialConfiguration"); + + //取得默认配置 + string result = Utils.GetEmbedText(SampleServer); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedGetDefaultConfiguration"); + return -1; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + + ////开始修改配置 + log(config, ref v2rayConfig, true); + + //vmess协议服务器配置 + ServerInbound(config, ref v2rayConfig); + + //传出设置 + ServerOutbound(config, ref v2rayConfig); + + Utils.ToJsonFile(v2rayConfig, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + /// + /// vmess协议服务器配置 + /// + /// + /// + /// + private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var inbound = v2rayConfig.inbounds[0]; + UsersItem usersItem; + if (inbound.settings.clients.Count <= 0) + { + usersItem = new UsersItem(); + inbound.settings.clients.Add(usersItem); + } + else + { + usersItem = inbound.settings.clients[0]; + } + //远程服务器端口 + inbound.port = config.port(); + + //远程服务器用户ID + usersItem.id = config.id(); + usersItem.alterId = config.alterId(); + usersItem.email = Global.userEMail; + + //远程服务器底层传输配置 + StreamSettings streamSettings = inbound.streamSettings; + boundStreamSettings(config, "in", ref streamSettings); + } + catch + { + } + return 0; + } + + /// + /// 传出设置 + /// + /// + /// + /// + private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (v2rayConfig.outbounds[0] != null) + { + v2rayConfig.outbounds[0].settings = null; + } + } + catch + { + } + return 0; + } + #endregion + + #region 导入(导出)客户端/服务端配置 + + /// + /// 导入v2ray客户端配置 + /// + /// + /// + /// + public static VmessItem ImportFromClientConfig(string fileName, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + if (v2rayConfig.outbounds == null + || v2rayConfig.outbounds.Count <= 0) + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + var outbound = v2rayConfig.outbounds[0]; + if (outbound == null + || Utils.IsNullOrEmpty(outbound.protocol) + || outbound.protocol != "vmess" + || outbound.settings == null + || outbound.settings.vnext == null + || outbound.settings.vnext.Count <= 0 + || outbound.settings.vnext[0].users == null + || outbound.settings.vnext[0].users.Count <= 0) + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.address = outbound.settings.vnext[0].address; + vmessItem.port = outbound.settings.vnext[0].port; + vmessItem.id = outbound.settings.vnext[0].users[0].id; + vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; + vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + + //tcp or kcp + if (outbound.streamSettings != null + && outbound.streamSettings.network != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.network)) + { + vmessItem.network = outbound.streamSettings.network; + } + + //tcp伪装http + if (outbound.streamSettings != null + && outbound.streamSettings.tcpSettings != null + && outbound.streamSettings.tcpSettings.header != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.tcpSettings.header.type)) + { + if (outbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp)) + { + vmessItem.headerType = outbound.streamSettings.tcpSettings.header.type; + string request = Convert.ToString(outbound.streamSettings.tcpSettings.header.request); + if (!Utils.IsNullOrEmpty(request)) + { + V2rayTcpRequest v2rayTcpRequest = Utils.FromJson(request); + if (v2rayTcpRequest != null + && v2rayTcpRequest.headers != null + && v2rayTcpRequest.headers.Host != null + && v2rayTcpRequest.headers.Host.Count > 0) + { + vmessItem.requestHost = v2rayTcpRequest.headers.Host[0]; + } + } + } + } + //kcp伪装 + if (outbound.streamSettings != null + && outbound.streamSettings.kcpSettings != null + && outbound.streamSettings.kcpSettings.header != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.kcpSettings.header.type)) + { + vmessItem.headerType = outbound.streamSettings.kcpSettings.header.type; + } + + //ws + if (outbound.streamSettings != null + && outbound.streamSettings.wsSettings != null) + { + if (!Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.path)) + { + vmessItem.path = outbound.streamSettings.wsSettings.path; + } + if (outbound.streamSettings.wsSettings.headers != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.headers.Host)) + { + vmessItem.requestHost = outbound.streamSettings.wsSettings.headers.Host; + } + } + + //h2 + if (outbound.streamSettings != null + && outbound.streamSettings.httpSettings != null) + { + if (!Utils.IsNullOrEmpty(outbound.streamSettings.httpSettings.path)) + { + vmessItem.path = outbound.streamSettings.httpSettings.path; + } + if (outbound.streamSettings.httpSettings.host != null + && outbound.streamSettings.httpSettings.host.Count > 0) + { + vmessItem.requestHost = Utils.List2String(outbound.streamSettings.httpSettings.host); + } + } + + } + catch + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + return vmessItem; + } + + /// + /// 导入v2ray服务端配置 + /// + /// + /// + /// + public static VmessItem ImportFromServerConfig(string fileName, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + if (v2rayConfig.inbounds == null + || v2rayConfig.inbounds.Count <= 0) + { + msg = UIRes.I18N("IncorrectServerConfiguration"); + return null; + } + + var inbound = v2rayConfig.inbounds[0]; + if (inbound == null + || Utils.IsNullOrEmpty(inbound.protocol) + || inbound.protocol != "vmess" + || inbound.settings == null + || inbound.settings.clients == null + || inbound.settings.clients.Count <= 0) + { + msg = UIRes.I18N("IncorrectServerConfiguration"); + return null; + } + + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.address = string.Empty; + vmessItem.port = inbound.port; + vmessItem.id = inbound.settings.clients[0].id; + vmessItem.alterId = inbound.settings.clients[0].alterId; + + vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + + //tcp or kcp + if (inbound.streamSettings != null + && inbound.streamSettings.network != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.network)) + { + vmessItem.network = inbound.streamSettings.network; + } + + //tcp伪装http + if (inbound.streamSettings != null + && inbound.streamSettings.tcpSettings != null + && inbound.streamSettings.tcpSettings.header != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.tcpSettings.header.type)) + { + if (inbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp)) + { + vmessItem.headerType = inbound.streamSettings.tcpSettings.header.type; + string request = Convert.ToString(inbound.streamSettings.tcpSettings.header.request); + if (!Utils.IsNullOrEmpty(request)) + { + V2rayTcpRequest v2rayTcpRequest = Utils.FromJson(request); + if (v2rayTcpRequest != null + && v2rayTcpRequest.headers != null + && v2rayTcpRequest.headers.Host != null + && v2rayTcpRequest.headers.Host.Count > 0) + { + vmessItem.requestHost = v2rayTcpRequest.headers.Host[0]; + } + } + } + } + //kcp伪装 + //if (v2rayConfig.outbound.streamSettings != null + // && v2rayConfig.outbound.streamSettings.kcpSettings != null + // && v2rayConfig.outbound.streamSettings.kcpSettings.header != null + // && !Utils.IsNullOrEmpty(v2rayConfig.outbound.streamSettings.kcpSettings.header.type)) + //{ + // cmbHeaderType.Text = v2rayConfig.outbound.streamSettings.kcpSettings.header.type; + //} + + //ws + if (inbound.streamSettings != null + && inbound.streamSettings.wsSettings != null) + { + if (!Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.path)) + { + vmessItem.path = inbound.streamSettings.wsSettings.path; + } + if (inbound.streamSettings.wsSettings.headers != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.headers.Host)) + { + vmessItem.requestHost = inbound.streamSettings.wsSettings.headers.Host; + } + } + + //h2 + if (inbound.streamSettings != null + && inbound.streamSettings.httpSettings != null) + { + if (!Utils.IsNullOrEmpty(inbound.streamSettings.httpSettings.path)) + { + vmessItem.path = inbound.streamSettings.httpSettings.path; + } + if (inbound.streamSettings.httpSettings.host != null + && inbound.streamSettings.httpSettings.host.Count > 0) + { + vmessItem.requestHost = Utils.List2String(inbound.streamSettings.httpSettings.host); + } + } + } + catch + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + return vmessItem; + } + + /// + /// 从剪贴板导入URL + /// + /// + /// + /// + public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = clipboardData.Trim();// Utils.GetClipboardData(); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + if (result.StartsWith(Global.vmessProtocol)) + { + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + vmessItem = ResolveVmess4Kitsunebi(result); + } + else + { + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = vmessQRCode.ps; + vmessItem.address = vmessQRCode.add; + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = vmessQRCode.id; + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + vmessItem.network = vmessQRCode.net; + vmessItem.headerType = vmessQRCode.type; + vmessItem.requestHost = vmessQRCode.host; + vmessItem.path = vmessQRCode.path; + vmessItem.streamSecurity = vmessQRCode.tls; + } + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else if (result.StartsWith(Global.ssProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Shadowsocks; + result = result.Substring(Global.ssProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + result = Utils.Base64Decode(result.Substring(0, indexS)) + result.Substring(indexS, result.Length - indexS); + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + } + else if (result.StartsWith(Global.socksProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Socks; + result = result.Substring(Global.socksProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf(":"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } + + + string[] arr21 = result.Split(':'); + int indexPort = result.LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + vmessItem.address = result.Substring(0, indexPort); + vmessItem.port = Utils.ToInt(result.Substring(indexPort + 1, result.Length - (indexPort + 1))); + } + else + { + msg = UIRes.I18N("NonvmessOrssProtocol"); + return null; + } + } + catch + { + msg = UIRes.I18N("Incorrectconfiguration"); + return null; + } + + return vmessItem; + } + + + /// + /// 导出为客户端配置 + /// + /// + /// + /// + /// + public static int Export2ClientConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + return GenerateClientConfig(config, fileName, true, out msg); + } + + /// + /// 导出为服务端配置 + /// + /// + /// + /// + /// + public static int Export2ServerConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + return GenerateServerConfig(config, fileName, out msg); + } + + private static VmessItem ResolveVmess4Kitsunebi(string result) + { + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + result = result.Substring(0, indexSplit); + } + result = Utils.Base64Decode(result); + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + string[] arr22 = arr1[1].Split(':'); + if (arr21.Length != 2 || arr21.Length != 2) + { + return null; + } + + vmessItem.address = arr22[0]; + vmessItem.port = Utils.ToInt(arr22[1]); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.remarks = "Alien"; + vmessItem.alterId = 0; + + return vmessItem; + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs new file mode 100644 index 0000000000..244892c82c --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + + /// + /// 消息委托 + /// + /// 是否显示在托盘区 + /// 内容 + public delegate void ProcessDelegate(bool notify, string msg); + + /// + /// v2ray进程处理类 + /// + class V2rayHandler + { + private static string v2rayConfigRes = Global.v2rayConfigFileName; + private List lstV2ray; + public event ProcessDelegate ProcessEvent; + private int processId = 0; + + public V2rayHandler() + { + lstV2ray = new List(); + lstV2ray.Add("wv2ray"); + lstV2ray.Add("v2ray"); + } + + /// + /// 载入V2ray + /// + public void LoadV2ray(Config config) + { + if (Global.reloadV2ray) + { + string msg = string.Empty; + string fileName = Utils.GetPath(v2rayConfigRes); + if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out msg) != 0) + { + ShowMsg(false, msg); + } + else + { + ShowMsg(true, msg); + V2rayRestart(); + } + } + } + + /// + /// V2ray重启 + /// + private void V2rayRestart() + { + V2rayStop(); + V2rayStart(); + } + + /// + /// V2ray停止 + /// + public void V2rayStop() + { + try + { + bool blExist = true; + if (processId > 0) + { + Process p1 = Process.GetProcessById(processId); + if (p1 != null) + { + p1.Kill(); + blExist = false; + } + } + if (blExist) + { + foreach (string vName in lstV2ray) + { + Process[] killPro = Process.GetProcessesByName(vName); + foreach (Process p in killPro) + { + p.Kill(); + } + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + /// + /// V2ray启动 + /// + private void V2rayStart() + { + ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + + try + { + //查找v2ray文件是否存在 + string fileName = string.Empty; + for (int k = 0; k < lstV2ray.Count; k++) + { + string vName = string.Format("{0}.exe", lstV2ray[k]); + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + fileName = vName; + break; + } + } + if (Utils.IsNullOrEmpty(fileName)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases"); + ShowMsg(true, msg); + return; + } + + Process p = new Process(); + p.StartInfo.FileName = fileName; + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.CreateNoWindow = true; + p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + { + if (!String.IsNullOrEmpty(e.Data)) + { + string msg = e.Data + Environment.NewLine; + ShowMsg(false, msg); + } + }); + p.Start(); + p.BeginOutputReadLine(); + processId = p.Id; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + string msg = ex.Message; + ShowMsg(true, msg); + } + } + + /// + /// 消息委托 + /// + /// + /// + private void ShowMsg(bool notify, string msg) + { + if (ProcessEvent != null) + { + ProcessEvent(notify, msg); + } + } + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs b/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs new file mode 100644 index 0000000000..f04a98aab9 --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.HttpProxyHandler; + +namespace v2rayN.Handler +{ + /// + ///Update V2ray Core + /// + class V2rayUpdateHandle + { + public event EventHandler AbsoluteCompleted; + + public event EventHandler UpdateCompleted; + + public event ErrorEventHandler Error; + + public string DownloadFileName + { + get { return "v2ray-windows.zip"; } + } + + public class ResultEventArgs : EventArgs + { + public bool Success; + public string Msg; + + public ResultEventArgs(bool success, string msg) + { + this.Success = success; + this.Msg = msg; + } + } + + private string latestUrl = "https://github.com/v2ray/v2ray-core/releases/latest"; + private const string coreURL = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + private int progressPercentage = -1; + private bool blFirst = true; + private long totalBytesToReceive = 0; + private DateTime totalDatetime = new DateTime(); + + public void AbsoluteV2rayCore(Config config) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + WebRequest request = WebRequest.Create(latestUrl); + request.BeginGetResponse(new AsyncCallback(OnResponse), request); + } + + private void OnResponse(IAsyncResult ar) + { + try + { + HttpWebRequest request = (HttpWebRequest)ar.AsyncState; + HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); + string redirectUrl = response.ResponseUri.AbsoluteUri; + string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); + + string osBit = string.Empty; + if (Environment.Is64BitProcess) + { + osBit = "64"; + } + else + { + osBit = "32"; + } + string url = string.Format(coreURL, version, osBit); + if (AbsoluteCompleted != null) + { + AbsoluteCompleted(this, new ResultEventArgs(true, url)); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + + public void DownloadFileAsync(Config config, string url) + { + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + if (UpdateCompleted != null) + { + UpdateCompleted(this, new ResultEventArgs(false, url)); + } + + progressPercentage = -1; + + WebClientEx ws = new WebClientEx(); + ws.DownloadFileCompleted += ws_DownloadFileCompleted; + ws.DownloadProgressChanged += ws_DownloadProgressChanged; + ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName)); + blFirst = true; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + if (blFirst) + { + totalBytesToReceive = e.TotalBytesToReceive - e.BytesReceived; + totalDatetime = DateTime.Now; + blFirst = false; + } + if (UpdateCompleted != null) + { + if (progressPercentage != e.ProgressPercentage && e.ProgressPercentage % 10 == 0) + { + progressPercentage = e.ProgressPercentage; + string msg = string.Format("......{0}%", e.ProgressPercentage); + UpdateCompleted(this, new ResultEventArgs(false, msg)); + } + } + } + + void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + { + try + { + if (e.Error == null + || Utils.IsNullOrEmpty(e.Error.ToString())) + { + if (UpdateCompleted != null) + { + TimeSpan ts = (DateTime.Now - totalDatetime); + string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); + UpdateCompleted(this, new ResultEventArgs(true, speed)); + } + } + else + { + throw e.Error; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + /// + /// DownloadString + /// + /// + public void WebDownloadString(string url) + { + string source = string.Empty; + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + + WebClientEx ws = new WebClientEx(); + ws.DownloadStringCompleted += Ws_DownloadStringCompleted; + ws.DownloadStringAsync(new Uri(url)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private void Ws_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + if (e.Error == null + || Utils.IsNullOrEmpty(e.Error.ToString())) + { + string source = e.Result; + if (UpdateCompleted != null) + { + UpdateCompleted(this, new ResultEventArgs(true, source)); + } + } + else + { + throw e.Error; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs new file mode 100644 index 0000000000..0eb6d06362 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -0,0 +1,177 @@ +using System; +using v2rayN.Mode; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 系统代理(http)总处理 + /// 启动privoxy提供http协议 + /// 使用SysProxy设置IE系统代理或者PAC模式 + /// + class HttpProxyHandle + { + private static string GetTimestamp(DateTime value) + { + return value.ToString("yyyyMMddHHmmssfff"); + } + + public static void ReSetPACProxy(Config config) + { + if (config.listenerType == 2) + { + //SysProxyHandle.SetIEProxy(false, false, null, null); + //PACServerHandle.Stop(); + } + Update(config, false); + } + + public static bool Update(Config config, bool forceDisable) + { + int type = config.listenerType; + + if (forceDisable) + { + type = 0; + } + + try + { + if (type != 0) + { + var port = Global.sysAgentPort; + if (port <= 0) + { + return false; + } + if (type == 1) + { + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + SysProxyHandle.SetIEProxy(true, true, "127.0.0.1:" + port, null); + } + else if (type == 2) + { + string pacUrl = GetPacUrl(); + SysProxyHandle.SetIEProxy(true, false, null, pacUrl); + PACServerHandle.Stop(); + PACServerHandle.Init(config); + PACFileWatcherHandle.StartWatch(config); + } + else if (type == 3) + { + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + SysProxyHandle.SetIEProxy(false, false, null, null); + } + else if (type == 4) + { + string pacUrl = GetPacUrl(); + SysProxyHandle.SetIEProxy(false, false, null, null); + PACServerHandle.Stop(); + PACServerHandle.Init(config); + PACFileWatcherHandle.StartWatch(config); + } + } + else + { + SysProxyHandle.SetIEProxy(false, false, null, null); + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; + } + + /// + /// 启用系统代理(http) + /// + /// + public static void StartHttpAgent(Config config) + { + try + { + int localPort = config.GetLocalPort("socks"); + if (localPort > 0) + { + PrivoxyHandler.Instance.Start(localPort, config); + if (PrivoxyHandler.Instance.RunningPort > 0) + { + Global.sysAgent = true; + Global.socksPort = localPort; + Global.sysAgentPort = PrivoxyHandler.Instance.RunningPort; + Global.pacPort = Global.sysAgentPort + 1; + } + } + } + catch + { + } + } + + /// + /// 关闭系统代理 + /// + /// + public static void CloseHttpAgent(Config config) + { + try + { + ////开启全局代理则关闭 + //if (Global.sysAgent) + //{ + PrivoxyHandler.Instance.Stop(); + + Global.sysAgent = false; + Global.socksPort = 0; + Global.sysAgentPort = 0; + Global.pacPort = 0; + //} + } + catch + { + } + } + + /// + /// 重启系统代理(http) + /// + /// + /// + public static bool RestartHttpAgent(Config config, bool forced) + { + bool isRestart = false; + //强制重启或者socks端口变化 + if (forced) + { + isRestart = true; + } + else + { + int localPort = config.GetLocalPort("socks"); + if (localPort != Global.socksPort) + { + isRestart = true; + } + } + if (isRestart) + { + CloseHttpAgent(config); + StartHttpAgent(config); + return true; + } + return false; + } + + public static string GetPacUrl() + { + string pacUrl = string.Format("http://127.0.0.1:{0}/pac/?t={1}", Global.pacPort, + GetTimestamp(DateTime.Now)); + + return pacUrl; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs new file mode 100644 index 0000000000..e4b777e5df --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs @@ -0,0 +1,98 @@ +using System; +using System.Net; +using System.Text; +using System.Threading; + +namespace v2rayN.HttpProxyHandler +{ + public class HttpWebServer + { + private HttpListener _listener; + private Func _responderMethod; + + public HttpWebServer(string[] prefixes, Func method) + { + try + { + _listener = new HttpListener(); + + if (!HttpListener.IsSupported) + throw new NotSupportedException( + "Needs Windows XP SP2, Server 2003 or later."); + + // URI prefixes are required, for example + // "http://localhost:8080/index/". + if (prefixes == null || prefixes.Length == 0) + throw new ArgumentException("prefixes"); + + // A responder method is required + if (method == null) + throw new ArgumentException("method"); + + foreach (string s in prefixes) + _listener.Prefixes.Add(s); + + _responderMethod = method; + _listener.Start(); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public HttpWebServer(Func method, params string[] prefixes) + : this(prefixes, method) { } + + public void Run() + { + ThreadPool.QueueUserWorkItem((o) => + { + Utils.SaveLog("Webserver running..."); + try + { + while (_listener.IsListening) + { + ThreadPool.QueueUserWorkItem((c) => + { + var ctx = c as HttpListenerContext; + try + { + string rstr = _responderMethod(ctx.Request); + byte[] buf = Encoding.UTF8.GetBytes(rstr); + ctx.Response.StatusCode = 200; + ctx.Response.ContentType = "application/x-ns-proxy-autoconfig"; + ctx.Response.ContentLength64 = buf.Length; + ctx.Response.OutputStream.Write(buf, 0, buf.Length); + } + catch + { + } // suppress any exceptions + finally + { + // always close the stream + ctx.Response.OutputStream.Close(); + } + }, _listener.GetContext()); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } // suppress any exceptions + }); + } + + public void Stop() + { + if (_listener != null) + { + _listener.Stop(); + _listener.Close(); + _listener = null; + } + } + + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs new file mode 100644 index 0000000000..08043d7376 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs @@ -0,0 +1,45 @@ +using System.IO; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACFileWatcherHandle + { + private static FileSystemWatcher fileSystemWatcher; + + private static long fileSize; + + public static void StartWatch(Config config) + { + if (fileSystemWatcher == null) + { + fileSystemWatcher = new FileSystemWatcher(Utils.StartupPath()); + fileSystemWatcher.Filter = "pac.txt"; + fileSystemWatcher.NotifyFilter = NotifyFilters.Size; + fileSystemWatcher.Changed += (sender, args) => + { + var fileInfo = new FileInfo(args.FullPath); + if (fileSize != fileInfo.Length) + { + fileSize = fileInfo.Length; + HttpProxyHandle.ReSetPACProxy(config); + } + + }; + } + fileSystemWatcher.EnableRaisingEvents = true; + } + + public static void StopWatch() + { + if (fileSystemWatcher != null) + { + fileSystemWatcher.EnableRaisingEvents = false; + } + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs new file mode 100644 index 0000000000..0fe8d066ea --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACListHandle + { + public event EventHandler UpdateCompleted; + + public event ErrorEventHandler Error; + + public class ResultEventArgs : EventArgs + { + public bool Success; + + public ResultEventArgs(bool success) + { + this.Success = success; + } + } + + private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; + + private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; + + public void UpdatePACFromGFWList(Config config) + { + string url = GFWLIST_URL; + if (!Utils.IsNullOrEmpty(config.urlGFWList)) + { + url = config.urlGFWList; + } + + //默认用户已开启系统代理 + //var httpProxy = config.inbound.FirstOrDefault(x => x.protocol=="http"); + //if (httpProxy == null) + //{ + // throw new Exception("未发现HTTP代理,无法设置代理更新"); + //} + WebClient http = new WebClient(); + //http.Headers.Add("Connection", "Close"); + //http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), httpProxy.localPort); + http.DownloadStringCompleted += http_DownloadStringCompleted; + http.DownloadStringAsync(new Uri(url)); + } + + private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), e.Result, Encoding.UTF8); + List lines = ParseResult(e.Result); + string abpContent = Utils.UnGzip(Resources.abp_js); + abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); + File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); + if (UpdateCompleted != null) UpdateCompleted(this, new ResultEventArgs(true)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) Error(this, new ErrorEventArgs(ex)); + } + } + + public static List ParseResult(string response) + { + byte[] bytes = Convert.FromBase64String(response); + string content = Encoding.ASCII.GetString(bytes); + List valid_lines = new List(); + using (var sr = new StringReader(content)) + { + foreach (var line in sr.NonWhiteSpaceLines()) + { + if (line.BeginWithAny(IgnoredLineBegins)) + continue; + valid_lines.Add(line); + } + } + return valid_lines; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs new file mode 100644 index 0000000000..46165d3d2a --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACServerHandle + { + private static Hashtable httpWebServer = new Hashtable(); + private static Hashtable pacList = new Hashtable(); + + public static void Init(Config config) + { + InitServer("127.0.0.1"); + + if (config.allowLANConn) + { + List lstIPAddress = Utils.GetHostIPAddress(); + if (lstIPAddress.Count <= 0) + { + return; + } + foreach (string str in lstIPAddress) + { + InitServer(str); + } + } + } + + public static void InitServer(string address) + { + try + { + if (!pacList.ContainsKey(address)) + { + pacList.Add(address, GetPacList(address)); + } + + string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); + Utils.SaveLog("Webserver prefixes " + prefixes); + + HttpWebServer ws = new HttpWebServer(SendResponse, prefixes); + ws.Run(); + + if (!httpWebServer.ContainsKey(address) && ws != null) + { + httpWebServer.Add(address, ws); + } + } + catch (Exception ex) + { + Utils.SaveLog("Webserver InitServer " + ex.Message); + } + } + + public static string SendResponse(HttpListenerRequest request) + { + try + { + string[] arrAddress = request.UserHostAddress.Split(':'); + string address = "127.0.0.1"; + if (arrAddress.Length > 0) + { + address = arrAddress[0]; + } + return pacList[address].ToString(); + } + catch (Exception ex) + { + Utils.SaveLog("Webserver SendResponse " + ex.Message); + return ex.Message; + } + } + + + public static void Stop() + { + try + { + if (httpWebServer == null) + { + return; + } + foreach (var key in httpWebServer.Keys) + { + Utils.SaveLog("Webserver Stop " + key.ToString()); + ((HttpWebServer)httpWebServer[key]).Stop(); + } + httpWebServer.Clear(); + } + catch (Exception ex) + { + Utils.SaveLog("Webserver Stop " + ex.Message); + } + } + + private static string GetPacList(string address) + { + var port = Global.sysAgentPort; + if (port <= 0) + { + return "No port"; + } + try + { + List lstProxy = new List(); + lstProxy.Add(string.Format("PROXY {0}:{1};", address, port)); + var proxy = string.Join("", lstProxy.ToArray()); + + string strPacfile = Utils.GetPath(Global.pacFILE); + if (!File.Exists(strPacfile)) + { + FileManager.UncompressFile(strPacfile, Resources.pac_txt); + } + var pac = File.ReadAllText(strPacfile, Encoding.UTF8); + pac = pac.Replace("__PROXY__", proxy); + return pac; + } + catch + { } + return "No pac content"; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs new file mode 100644 index 0000000000..169ed1df78 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs @@ -0,0 +1,215 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// Privoxy处理类,提供http协议代理 + /// + class PrivoxyHandler + { + /// + /// 单例 + /// + private static PrivoxyHandler instance; + + private static int _uid; + private static string _uniqueConfigFile; + private static Job _privoxyJob; + private Process _process; + private int _runningPort; + private bool _isRunning; + + static PrivoxyHandler() + { + try + { + _uid = Application.StartupPath.GetHashCode(); // Currently we use ss's StartupPath to identify different Privoxy instance. + _uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid); + _privoxyJob = new Job(); + + FileManager.UncompressFile(Utils.GetTempPath("v2ray_privoxy.exe"), Resources.privoxy_exe); + FileManager.UncompressFile(Utils.GetTempPath("mgwz.dll"), Resources.mgwz_dll); + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private PrivoxyHandler() + { + + } + + /// + /// 单例 + /// + public static PrivoxyHandler Instance + { + get + { + if (instance == null) + { + instance = new PrivoxyHandler(); + } + return instance; + } + } + + public int RunningPort + { + get + { + return _runningPort; + } + } + + public bool IsRunning + { + get + { + return _isRunning; + } + } + + public void Start(int localPort, Config config) + { + if (_process == null) + { + Process[] existingPrivoxy = Process.GetProcessesByName("v2ray_privoxy"); + foreach (Process p in existingPrivoxy.Where(IsChildProcess)) + { + KillProcess(p); + } + string privoxyConfig = Resources.privoxy_conf; + _runningPort = GetFreePort(localPort); + privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", _runningPort.ToString()); + if (config.allowLANConn) + { + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "0.0.0.0"); + } + else + { + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "127.0.0.1"); + } + FileManager.ByteArrayToFile(Utils.GetTempPath(_uniqueConfigFile), Encoding.UTF8.GetBytes(privoxyConfig)); + + _process = new Process + { + // Configure the process using the StartInfo properties. + StartInfo = + { + FileName = "v2ray_privoxy.exe", + Arguments = _uniqueConfigFile, + WorkingDirectory = Utils.GetTempPath(), + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + CreateNoWindow = true + } + }; + _process.Start(); + + /* + * Add this process to job obj associated with this ss process, so that + * when ss exit unexpectedly, this process will be forced killed by system. + */ + _privoxyJob.AddProcess(_process.Handle); + _isRunning = true; + } + } + + public void Stop() + { + if (_process != null) + { + KillProcess(_process); + _process.Dispose(); + _process = null; + _isRunning = false; + } + } + + private static void KillProcess(Process p) + { + try + { + p.CloseMainWindow(); + p.WaitForExit(100); + if (!p.HasExited) + { + p.Kill(); + p.WaitForExit(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + /* + * We won't like to kill other ss instances' v2ray_privoxy.exe. + * This function will check whether the given process is created + * by this process by checking the module path or command line. + * + * Since it's required to put ss in different dirs to run muti instances, + * different instance will create their unique "privoxy_UID.conf" where + * UID is hash of ss's location. + */ + + private static bool IsChildProcess(Process process) + { + try + { + /* + * Under PortableMode, we could identify it by the path of v2ray_privoxy.exe. + */ + var path = process.MainModule.FileName; + + return Utils.GetTempPath("v2ray_privoxy.exe").Equals(path); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + /* + * Sometimes Process.GetProcessesByName will return some processes that + * are already dead, and that will cause exceptions here. + * We could simply ignore those exceptions. + */ + //Logging.LogUsefulException(ex); + return false; + } + } + + private int GetFreePort(int localPort) + { + int defaultPort = 8123; + try + { + //// TCP stack please do me a favor + //TcpListener l = new TcpListener(IPAddress.Loopback, 0); + //l.Start(); + //var port = ((IPEndPoint)l.LocalEndpoint).Port; + //l.Stop(); + //return port; + return localPort + 1; + } + catch (Exception ex) + { + // in case access denied + Utils.SaveLog(ex.Message, ex); + return defaultPort; + } + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs new file mode 100644 index 0000000000..a239774093 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs @@ -0,0 +1,182 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + class SysProxyHandle + { + private const string _userWininetConfigFile = "user-wininet.json"; + + private static string _queryStr; + + // In general, this won't change + // format: + // + // + // + // + private static SysproxyConfig _userSettings = null; + + enum RET_ERRORS : int + { + RET_NO_ERROR = 0, + INVALID_FORMAT = 1, + NO_PERMISSION = 2, + SYSCALL_FAILED = 3, + NO_MEMORY = 4, + INVAILD_OPTION_COUNT = 5, + }; + + static SysProxyHandle() + { + try + { + FileManager.UncompressFile(Utils.GetTempPath("sysproxy.exe"), + Environment.Is64BitOperatingSystem ? Resources.sysproxy64_exe : Resources.sysproxy_exe); + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + + } + } + + public static void SetIEProxy(bool enable, bool global, string proxyServer, string pacURL) + { + Read(); + + if (!_userSettings.UserSettingsRecorded) + { + // record user settings + ExecSysproxy("query"); + ParseQueryStr(_queryStr); + } + + string arguments; + if (enable) + { + arguments = global + ? string.Format( + //"global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*", + "global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*", + proxyServer) + : string.Format("pac {0}", pacURL); + } + else + { + // restore user settings + var flags = _userSettings.Flags; + var proxy_server = _userSettings.ProxyServer ?? "-"; + var bypass_list = _userSettings.BypassList ?? "-"; + var pac_url = _userSettings.PacUrl ?? "-"; + arguments = string.Format("set {0} {1} {2} {3}", flags, proxy_server, bypass_list, pac_url); + + // have to get new settings + _userSettings.UserSettingsRecorded = false; + } + + Save(); + ExecSysproxy(arguments); + } + + private static void ExecSysproxy(string arguments) + { + using (var process = new Process()) + { + // Configure the process using the StartInfo properties. + process.StartInfo.FileName = Utils.GetTempPath("sysproxy.exe"); + process.StartInfo.Arguments = arguments; + process.StartInfo.WorkingDirectory = Utils.GetTempPath(); + process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardError = true; + process.StartInfo.RedirectStandardOutput = true; + + // Need to provide encoding info, or output/error strings we got will be wrong. + process.StartInfo.StandardOutputEncoding = Encoding.Unicode; + process.StartInfo.StandardErrorEncoding = Encoding.Unicode; + + process.StartInfo.CreateNoWindow = true; + process.Start(); + + var stderr = process.StandardError.ReadToEnd(); + var stdout = process.StandardOutput.ReadToEnd(); + + process.WaitForExit(); + + var exitCode = process.ExitCode; + if (exitCode != (int)RET_ERRORS.RET_NO_ERROR) + { + throw new Exception(stderr); + } + + if (arguments == "query") + { + if (stdout.IsNullOrWhiteSpace() || stdout.IsNullOrEmpty()) + { + // we cannot get user settings + throw new Exception("failed to query wininet settings"); + } + _queryStr = stdout; + } + } + } + + private static void Save() + { + try + { + using (StreamWriter sw = new StreamWriter(File.Open(Utils.GetPath(_userWininetConfigFile), FileMode.Create))) + { + string jsonString = JsonConvert.SerializeObject(_userSettings, Formatting.Indented); + sw.Write(jsonString); + sw.Flush(); + } + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private static void Read() + { + try + { + string configContent = File.ReadAllText(Utils.GetPath(_userWininetConfigFile)); + _userSettings = JsonConvert.DeserializeObject(configContent); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + // Suppress all exceptions. finally block will initialize new user config settings. + } + finally + { + if (_userSettings == null) _userSettings = new SysproxyConfig(); + } + } + + private static void ParseQueryStr(string str) + { + string[] userSettingsArr = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + _userSettings.Flags = userSettingsArr[0]; + + // handle output from WinINET + if (userSettingsArr[1] == "(null)") _userSettings.ProxyServer = null; + else _userSettings.ProxyServer = userSettingsArr[1]; + if (userSettingsArr[2] == "(null)") _userSettings.BypassList = null; + else _userSettings.BypassList = userSettingsArr[2]; + if (userSettingsArr[3] == "(null)") _userSettings.PacUrl = null; + else _userSettings.PacUrl = userSettingsArr[3]; + + _userSettings.UserSettingsRecorded = true; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs b/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs new file mode 100644 index 0000000000..2ce644d5c3 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs @@ -0,0 +1,22 @@ +using System; +using System.Net; + +namespace v2rayN.HttpProxyHandler +{ + class WebClientEx : WebClient + { + public int Timeout { get; set; } + public WebClientEx(int timeout = 3000) + { + Timeout = timeout; + } + + + protected override WebRequest GetWebRequest(Uri address) + { + var request = base.GetWebRequest(address); + request.Timeout = Timeout; + return request; + } + } +} diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs new file mode 100644 index 0000000000..eb9aa9545f --- /dev/null +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -0,0 +1,493 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace v2rayN.Mode +{ + /// + /// 本软件配置文件实体类 + /// + [Serializable] + public class Config + { + /// + /// 本地监听 + /// + public List inbound { get; set; } + + /// + /// 允许日志 + /// + public bool logEnabled { get; set; } + + /// + /// 日志等级 + /// + public string loglevel { get; set; } + + /// + /// 活动配置序号 + /// + public int index { get; set; } + + /// + /// vmess服务器信息 + /// + public List vmess { get; set; } + + /// + /// 允许Mux多路复用 + /// + public bool muxEnabled { get; set; } + + /// + /// 域名解析策略 + /// + public string domainStrategy { get; set; } + + /// + /// 路由模式 + /// + public string routingMode { get; set; } + + /// + /// 用户自定义需代理的网址或ip + /// + public List useragent { get; set; } + + /// + /// 用户自定义直连的网址或ip + /// + public List userdirect { get; set; } + + /// + /// 用户自定义阻止的网址或ip + /// + public List userblock { get; set; } + + /// + /// KcpItem + /// + public KcpItem kcpItem { get; set; } + + + /// + /// 启用Http代理 + /// + public bool sysAgentEnabled { get; set; } + + /// + /// 监听状态 0-不改变 1-全局 2-PAC + /// + public int listenerType { get; set; } + + /// + /// 自定义GFWList url + /// + public string urlGFWList { get; set; } + + /// + /// 允许来自局域网的连接 + /// + public bool allowLANConn { get; set; } + + /// + /// 自定义远程DNS + /// + public string remoteDNS { get; set; } + /// + /// 订阅 + /// + public List subItem { get; set; } + /// + /// UI + /// + public UIItem uiItem { get; set; } + + #region 函数 + + public string address() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].address; + } + + public int port() + { + if (index < 0) + { + return 10808; + } + return vmess[index].port; + } + + public string id() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].id; + } + + public int alterId() + { + if (index < 0) + { + return 0; + } + return vmess[index].alterId; + } + + public string security() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].security; + } + + public string remarks() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].remarks; + } + public string network() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network)) + { + return Global.DefaultNetwork; + } + return vmess[index].network; + } + public string headerType() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType)) + { + return Global.None; + } + return vmess[index].headerType.Replace(" ", "").Trim(); + } + public string requestHost() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost)) + { + return string.Empty; + } + return vmess[index].requestHost.Replace(" ", "").Trim(); + } + public string path() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path)) + { + return string.Empty; + } + return vmess[index].path.Replace(" ", "").Trim(); + } + public string streamSecurity() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity)) + { + return string.Empty; + } + return vmess[index].streamSecurity; + } + public bool allowInsecure() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) + { + return true; + } + return Convert.ToBoolean(vmess[index].allowInsecure); + } + + public int GetLocalPort(string protocol) + { + int localPort = 0; + foreach (InItem inItem in inbound) + { + if (inItem.protocol.Equals(protocol)) + { + localPort = inItem.localPort; + break; + } + } + return localPort; + } + + public int configType() + { + if (index < 0) + { + return 0; + } + return vmess[index].configType; + } + + public string getSummary() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].getSummary(); + } + + #endregion + + } + + [Serializable] + public class VmessItem + { + public VmessItem() + { + configVersion = 1; + address = string.Empty; + port = 0; + id = string.Empty; + alterId = 0; + security = string.Empty; + network = string.Empty; + remarks = string.Empty; + headerType = string.Empty; + requestHost = string.Empty; + path = string.Empty; + streamSecurity = string.Empty; + allowInsecure = string.Empty; + configType = (int)EConfigType.Vmess; + testResult = string.Empty; + subid = string.Empty; + } + + public string getSummary() + { + string summary = string.Empty; + summary = string.Format("{0}-", ((EConfigType)configType).ToString()); + string[] arrAddr = address.Split('.'); + string addr = string.Empty; + if (arrAddr.Length > 2) + { + addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}"; + } + else if (arrAddr.Length > 1) + { + addr = $"***{arrAddr[arrAddr.Length - 1]}"; + } + else + { + addr = address; + } + if (configType == (int)EConfigType.Vmess) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else if (configType == (int)EConfigType.Shadowsocks) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else if (configType == (int)EConfigType.Socks) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else + { + summary += string.Format("{0}", remarks); + } + return summary; + } + public string getSubRemarks(Config config) + { + string subRemarks = string.Empty; + if (Utils.IsNullOrEmpty(subid)) + { + return subRemarks; + } + foreach (SubItem sub in config.subItem) + { + if (sub.id.EndsWith(subid)) + { + return sub.remarks; + } + } + if (subid.Length <= 4) + { + return subid; + } + return subid.Substring(0, 4); + } + /// + /// 版本(现在=2) + /// + public int configVersion { get; set; } + + /// + /// 远程服务器地址 + /// + public string address { get; set; } + /// + /// 远程服务器端口 + /// + public int port { get; set; } + /// + /// 远程服务器ID + /// + public string id { get; set; } + /// + /// 远程服务器额外ID + /// + public int alterId { get; set; } + /// + /// 本地安全策略 + /// + public string security { get; set; } + /// + /// tcp,kcp,ws + /// + public string network { get; set; } + /// + /// 备注或别名 + /// + public string remarks { get; set; } + + /// + /// 伪装类型 + /// + public string headerType { get; set; } + + /// + /// 伪装的域名 + /// + public string requestHost { get; set; } + + /// + /// ws h2 path + /// + public string path { get; set; } + + /// + /// 底层传输安全 + /// + public string streamSecurity { get; set; } + + /// + /// 是否允许不安全连接(用于客户端) + /// + public string allowInsecure { get; set; } + + + /// + /// config type(1=normal,2=custom) + /// + public int configType { get; set; } + + /// + /// + /// + public string testResult { get; set; } + + /// + /// SubItem id + /// + public string subid { get; set; } + } + + [Serializable] + public class InItem + { + /// + /// 本地监听端口 + /// + public int localPort { get; set; } + + /// + /// 协议,默认为socks + /// + public string protocol { get; set; } + + /// + /// 允许udp + /// + public bool udpEnabled { get; set; } + + /// + /// 开启流量探测 + /// + public bool sniffingEnabled { get; set; } = true; + } + + [Serializable] + public class KcpItem + { + /// + /// + /// + public int mtu { get; set; } + /// + /// + /// + public int tti { get; set; } + /// + /// + /// + public int uplinkCapacity { get; set; } + /// + /// + /// + public int downlinkCapacity { get; set; } + /// + /// + /// + public bool congestion { get; set; } + /// + /// + /// + public int readBufferSize { get; set; } + /// + /// + /// + public int writeBufferSize { get; set; } + } + + + [Serializable] + public class SubItem + { + /// + /// + /// + public string id { get; set; } + + /// + /// 备注 + /// + public string remarks { get; set; } + + /// + /// url + /// + public string url { get; set; } + + /// + /// enable + /// + public bool enabled { get; set; } = true; + } + + [Serializable] + public class UIItem + { + /// + /// + /// + public int mainQRCodeWidth { get; set; } = 600; + + } +} diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs new file mode 100644 index 0000000000..733c8556db --- /dev/null +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EConfigType + { + Vmess = 1, + Custom = 2, + Shadowsocks = 3, + Socks = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/EMove.cs b/v2rayN/v2rayN/Mode/EMove.cs new file mode 100644 index 0000000000..7f67d5b198 --- /dev/null +++ b/v2rayN/v2rayN/Mode/EMove.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EMove + { + Top = 1, + Up = 2, + Down = 3, + Bottom = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/SysproxyConfig.cs b/v2rayN/v2rayN/Mode/SysproxyConfig.cs new file mode 100644 index 0000000000..8b0d009794 --- /dev/null +++ b/v2rayN/v2rayN/Mode/SysproxyConfig.cs @@ -0,0 +1,21 @@ + +namespace v2rayN.Mode +{ + class SysproxyConfig + { + public bool UserSettingsRecorded; + public string Flags; + public string ProxyServer; + public string BypassList; + public string PacUrl; + + public SysproxyConfig() + { + UserSettingsRecorded = false; + Flags = "1"; + ProxyServer = ""; + BypassList = ""; + PacUrl = ""; + } + } +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs new file mode 100644 index 0000000000..a57c885a75 --- /dev/null +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -0,0 +1,455 @@ +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + /// + /// v2ray配置文件实体类 + /// 例子SampleConfig.txt + /// + public class V2rayConfig + { + /// + /// 日志配置 + /// + public Log log { get; set; } + /// + /// 传入连接配置 + /// + public List inbounds { get; set; } + /// + /// 传出连接配置 + /// + public List outbounds { get; set; } + + /// + /// DNS 配置 + /// + public Dns dns { get; set; } + /// + /// 路由配置 + /// + public Routing routing { get; set; } + } + + public class Log + { + /// + /// + /// + public string access { get; set; } + /// + /// + /// + public string error { get; set; } + /// + /// + /// + public string loglevel { get; set; } + } + + public class Inbounds + { + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public string listen { get; set; } + /// + /// + /// + public string protocol { get; set; } + /// + /// + /// + public Sniffing sniffing { get; set; } + /// + /// + /// + public Inboundsettings settings { get; set; } + + /// + /// + /// + public StreamSettings streamSettings { get; set; } + + } + + public class Inboundsettings + { + /// + /// + /// + public string auth { get; set; } + /// + /// + /// + public bool udp { get; set; } + /// + /// + /// + public string ip { get; set; } + + /// + /// + /// + public List clients { get; set; } + } + + public class UsersItem + { + /// + /// + /// + public string id { get; set; } + /// + /// + /// + public int alterId { get; set; } + /// + /// + /// + public string email { get; set; } + /// + /// + /// + public string security { get; set; } + } + public class Sniffing + { + /// + /// + /// + public bool enabled { get; set; } + /// + /// + /// + public List destOverride { get; set; } + } + + public class Outbounds + { + /// + /// 默认值agentout + /// + public string tag { get; set; } + /// + /// + /// + public string protocol { get; set; } + /// + /// + /// + public Outboundsettings settings { get; set; } + /// + /// + /// + public StreamSettings streamSettings { get; set; } + /// + /// + /// + public Mux mux { get; set; } + } + + public class Outboundsettings + { + /// + /// + /// + public List vnext { get; set; } + /// + /// + /// + public List servers { get; set; } + + /// + /// + /// + public Response response { get; set; } + } + + public class VnextItem + { + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public List users { get; set; } + } + public class ServersItem + { + /// + /// + /// + public string email { get; set; } + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public string method { get; set; } + /// + /// + /// + public bool ota { get; set; } + /// + /// + /// + public string password { get; set; } + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public int level { get; set; } + } + + public class Mux + { + /// + /// + /// + public bool enabled { get; set; } + } + + public class Response + { + /// + /// + /// + public string type { get; set; } + } + + public class Dns + { + /// + /// + /// + public List servers { get; set; } + } + + public class RulesItem + { + /// + /// + /// + public string type { get; set; } + /// + /// + /// + public string port { get; set; } + /// + /// + /// + public string outboundTag { get; set; } + + /// + /// + /// + public List ip { get; set; } + + /// + /// + /// + public List domain { get; set; } + } + + public class Routing + { + /// + /// + /// + public string domainStrategy { get; set; } + /// + /// + /// + public List rules { get; set; } + } + + public class StreamSettings + { + /// + /// + /// + public string network { get; set; } + /// + /// + /// + public string security { get; set; } + + /// + /// + /// + public TlsSettings tlsSettings { get; set; } + + /// + /// Tcp传输额外设置 + /// + public TcpSettings tcpSettings { get; set; } + /// + /// Kcp传输额外设置 + /// + public KcpSettings kcpSettings { get; set; } + /// + /// ws传输额外设置 + /// + public WsSettings wsSettings { get; set; } + /// + /// h2传输额外设置 + /// + public HttpSettings httpSettings { get; set; } + + /// + /// QUIC + /// + public QuicSettings quicSettings { get; set; } + + } + + public class TlsSettings + { + /// + /// 是否允许不安全连接(用于客户端) + /// + public bool allowInsecure { get; set; } + + /// + /// + /// + public string serverName { get; set; } + } + + public class TcpSettings + { + /// + /// 是否重用 TCP 连接 + /// + public bool connectionReuse { get; set; } + /// + /// 数据包头部伪装设置 + /// + public Header header { get; set; } + } + + public class Header + { + /// + /// 伪装 + /// + public string type { get; set; } + /// + /// 结构复杂,直接存起来 + /// + public object request { get; set; } + /// + /// 结构复杂,直接存起来 + /// + public object response { get; set; } + } + + public class KcpSettings + { + /// + /// + /// + public int mtu { get; set; } + /// + /// + /// + public int tti { get; set; } + /// + /// + /// + public int uplinkCapacity { get; set; } + /// + /// + /// + public int downlinkCapacity { get; set; } + /// + /// + /// + public bool congestion { get; set; } + /// + /// + /// + public int readBufferSize { get; set; } + /// + /// + /// + public int writeBufferSize { get; set; } + /// + /// + /// + public Header header { get; set; } + } + + public class WsSettings + { + /// + /// + /// + public bool connectionReuse { get; set; } + + /// + /// + /// + public string path { get; set; } + + /// + /// + /// + public Headers headers { get; set; } + } + public class Headers + { + /// + /// + /// + public string Host { get; set; } + } + + public class HttpSettings + { + /// + /// + /// + public string path { get; set; } + + /// + /// + /// + public List host { get; set; } + + } + + public class QuicSettings + { + /// + /// + /// + public string security { get; set; } + /// + /// + /// + public string key { get; set; } + + /// + /// + /// + public Header header { get; set; } + } + +} diff --git a/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs new file mode 100644 index 0000000000..4a4e863dfe --- /dev/null +++ b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + /// + /// Tcp伪装http的Request,只要Host + /// + public class V2rayTcpRequest + { + /// + /// + /// + public RequestHeaders headers { get; set; } + } + + public class RequestHeaders + { + /// + /// + /// + public List Host { get; set; } + } + + +} diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs new file mode 100644 index 0000000000..2902375785 --- /dev/null +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -0,0 +1,53 @@ +using System; + +namespace v2rayN.Mode +{ + [Serializable] + class VmessQRCode + { + /// + /// 版本 + /// + public string v { get; set; } + /// + /// 备注 + /// + public string ps { get; set; } + /// + /// 远程服务器地址 + /// + public string add { get; set; } + /// + /// 远程服务器端口 + /// + public string port { get; set; } + /// + /// 远程服务器ID + /// + public string id { get; set; } + /// + /// 远程服务器额外ID + /// + public string aid { get; set; } + /// + /// 传输协议tcp,kcp,ws + /// + public string net { get; set; } + /// + /// 伪装类型 + /// + public string type { get; set; } + /// + /// 伪装的域名 + /// + public string host { get; set; } + /// + /// path + /// + public string path { get; set; } + /// + /// 底层传输安全 + /// + public string tls { get; set; } + } +} diff --git a/v2rayN/v2rayN/Newtonsoft.Json.dll b/v2rayN/v2rayN/Newtonsoft.Json.dll new file mode 100644 index 0000000000..71ae7e6cee Binary files /dev/null and b/v2rayN/v2rayN/Newtonsoft.Json.dll differ diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs new file mode 100644 index 0000000000..c9abcbe603 --- /dev/null +++ b/v2rayN/v2rayN/Program.cs @@ -0,0 +1,103 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Windows.Forms; +using v2rayN.Forms; + +namespace v2rayN +{ + static class Program + { + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + if (Environment.OSVersion.Version.Major >= 6) + { + SetProcessDPIAware(); + } + + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + + AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + + Process instance = RunningInstance(); + if (instance == null) + { + Utils.SaveLog("v2rayN start up"); + + //设置语言环境 + string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + else + { + UI.Show("v2rayN is already running(v2rayN已经运行)"); + } + } + + private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + { + try + { + string resourceName = "v2rayN." + new AssemblyName(args.Name).Name + ".dll"; + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + return null; + } + byte[] assemblyData = new byte[stream.Length]; + stream.Read(assemblyData, 0, assemblyData.Length); + return Assembly.Load(assemblyData); + } + } + catch + { + return null; + } + } + + /// + /// 获取正在运行的实例,没有运行的实例返回null; + /// + public static Process RunningInstance() + { + Process current = Process.GetCurrentProcess(); + Process[] processes = Process.GetProcessesByName(current.ProcessName); + foreach (Process process in processes) + { + if (process.Id != current.Id) + { + if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == process.MainModule.FileName) + { + return process; + } + } + } + return null; + } + + static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + Utils.SaveLog("Application_ThreadException", e.Exception); + } + + static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject); + } + + } +} diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..21923c6f71 --- /dev/null +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("v2rayN")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("v2rayN")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("72d9f089-5e7a-4c5f-be0a-8a211536b483")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +//[assembly: AssemblyVersion("1.0.*")] +//[assembly: AssemblyVersion("1.0.0")] +[assembly: AssemblyFileVersion("2.30")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..7972789366 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -0,0 +1,229 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap about { + get { + object obj = ResourceManager.GetObject("about", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] abp_js { + get { + object obj = ResourceManager.GetObject("abp_js", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap checkupdate { + get { + object obj = ResourceManager.GetObject("checkupdate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] mgwz_dll { + get { + object obj = ResourceManager.GetObject("mgwz_dll", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap minimize { + get { + object obj = ResourceManager.GetObject("minimize", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap option { + get { + object obj = ResourceManager.GetObject("option", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] pac_txt { + get { + object obj = ResourceManager.GetObject("pac_txt", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ + ///toggle 0 + ///logfile v2ray_privoxy.log + ///show-on-task-bar 0 + ///activity-animation 0 + ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . + ///hide-console + /// 的本地化字符串。 + /// + internal static string privoxy_conf { + get { + return ResourceManager.GetString("privoxy_conf", resourceCulture); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] privoxy_exe { + get { + object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap promotion { + get { + object obj = ResourceManager.GetObject("promotion", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap restart { + get { + object obj = ResourceManager.GetObject("restart", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap server { + get { + object obj = ResourceManager.GetObject("server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sub { + get { + object obj = ResourceManager.GetObject("sub", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] sysproxy_exe { + get { + object obj = ResourceManager.GetObject("sysproxy_exe", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] sysproxy64_exe { + get { + object obj = ResourceManager.GetObject("sysproxy64_exe", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx new file mode 100644 index 0000000000..cb5fbb0809 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\mgwz.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 + + + ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Properties/Settings.Designer.cs b/v2rayN/v2rayN/Properties/Settings.Designer.cs new file mode 100644 index 0000000000..62dd9b4245 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/v2rayN/v2rayN/Properties/Settings.settings b/v2rayN/v2rayN/Properties/Settings.settings new file mode 100644 index 0000000000..39645652af --- /dev/null +++ b/v2rayN/v2rayN/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v2rayN/v2rayN/Resources/about.png b/v2rayN/v2rayN/Resources/about.png new file mode 100644 index 0000000000..48fa6b1bf4 Binary files /dev/null and b/v2rayN/v2rayN/Resources/about.png differ diff --git a/v2rayN/v2rayN/Resources/abp.js.gz b/v2rayN/v2rayN/Resources/abp.js.gz new file mode 100644 index 0000000000..0577c7f5c1 Binary files /dev/null and b/v2rayN/v2rayN/Resources/abp.js.gz differ diff --git a/v2rayN/v2rayN/Resources/checkupdate.png b/v2rayN/v2rayN/Resources/checkupdate.png new file mode 100644 index 0000000000..bc1fade10c Binary files /dev/null and b/v2rayN/v2rayN/Resources/checkupdate.png differ diff --git a/v2rayN/v2rayN/Resources/help.png b/v2rayN/v2rayN/Resources/help.png new file mode 100644 index 0000000000..03691a424d Binary files /dev/null and b/v2rayN/v2rayN/Resources/help.png differ diff --git a/v2rayN/v2rayN/Resources/mgwz.dll.gz b/v2rayN/v2rayN/Resources/mgwz.dll.gz new file mode 100644 index 0000000000..40a33e5d0c Binary files /dev/null and b/v2rayN/v2rayN/Resources/mgwz.dll.gz differ diff --git a/v2rayN/v2rayN/Resources/minimize.png b/v2rayN/v2rayN/Resources/minimize.png new file mode 100644 index 0000000000..82ee86e496 Binary files /dev/null and b/v2rayN/v2rayN/Resources/minimize.png differ diff --git a/v2rayN/v2rayN/Resources/option.png b/v2rayN/v2rayN/Resources/option.png new file mode 100644 index 0000000000..a0973e5806 Binary files /dev/null and b/v2rayN/v2rayN/Resources/option.png differ diff --git a/v2rayN/v2rayN/Resources/pac.txt b/v2rayN/v2rayN/Resources/pac.txt new file mode 100644 index 0000000000..4bed057c96 --- /dev/null +++ b/v2rayN/v2rayN/Resources/pac.txt @@ -0,0 +1,8046 @@ +// Generated by gfwlist2pac in precise mode +// https://github.com/clowwindy/gfwlist2pac + +var proxy = "__PROXY__"; + +var rules = [ + "|http://85.17.73.31/", + "||agnesb.fr", + "||akiba-web.com", + "||altrec.com", + "||angela-merkel.de", + "||angola.org", + "||apartmentratings.com", + "||apartments.com", + "||arena.taipei", + "||asianspiss.com", + "||assimp.org", + "||athenaeizou.com", + "||azubu.tv", + "||bankmobilevibe.com", + "||banorte.com", + "||bash-hackers.org", + "||beeg.com", + "||global.bing.com", + "||bloombergview.com", + "||booktopia.com.au", + "||boysmaster.com", + "||bynet.co.il", + "||carfax.com", + ".casinobellini.com", + "||casinobellini.com", + "||centauro.com.br", + "||chobit.cc", + "||clearsurance.com", + "||images.comico.tw", + "||static.comico.tw", + "||counter.social", + "||costco.com", + "||crossfire.co.kr", + "||d2pass.com", + "||darpa.mil", + "||dawangidc.com", + "||deezer.com", + "||desipro.de", + "||dingchin.com.tw", + "||discordapp.com", + "||discordapp.net", + "||dish.com", + "|http://img.dlsite.jp/", + "||dm530.net", + "share.dmhy.org", + "@@|https://share.dmhy.org", + "||dmm.co.jp", + "|http://www.dmm.com/netgame", + "||dnvod.tv", + "||dvdpac.com", + "||eesti.ee", + "||esurance.com", + ".expekt.com", + "||expekt.com", + ".extmatrix.com", + "||extmatrix.com", + "||fakku.net", + "||fastpic.ru", + "||filesor.com", + "||financetwitter.com", + "||flipboard.com", + "||flitto.com", + "||fnac.be", + "||fnac.com", + "||funkyimg.com", + "||fxnetworks.com", + "||g-area.org", + "||gettyimages.com", + "||getuploader.com", + "|https://raw.githubusercontent.com/programthink/zhao", + "||glass8.eu", + "||glype.com", + "||go141.com", + "||guo.media", + "||hautelook.com", + "||hautelookcdn.com", + "||wego.here.com", + "||gamer-cds.cdn.hinet.net", + "||gamer2-cds.cdn.hinet.net", + "||hmvdigital.ca", + "||hmvdigital.com", + "||homedepot.com", + "||hoovers.com", + "||hulu.com", + "||huluim.com", + "|http://secure.hustler.com", + "|http://hustlercash.com", + "|http://www.hustlercash.com", + "||hybrid-analysis.com", + "||cdn*.i-scmp.com", + "||ilovelongtoes.com", + "|http://imgmega.com/*.gif.html", + "|http://imgmega.com/*.jpg.html", + "|http://imgmega.com/*.jpeg.html", + "|http://imgmega.com/*.png.html", + "||imlive.com", + "||tw.iqiyi.com", + "||javhub.net", + "||javhuge.com", + ".javlibrary.com", + "||javlibrary.com", + "||jcpenney.com", + "||jims.net", + "||jukujo-club.com", + "||juliepost.com", + "||kawaiikawaii.jp", + "||kendatire.com", + "||khatrimaza.org", + "||kkbox.com", + "||leisurepro.com", + "||lifemiles.com", + "||longtoes.com", + "||lovetvshow.com", + "|http://www.m-sport.co.uk", + "||macgamestore.com", + "||madonna-av.com", + "||mangafox.com", + "||mangafox.me", + "||manta.com", + "||matome-plus.com", + "||matome-plus.net", + "||mattwilcox.net", + "||metarthunter.com", + "||mfxmedia.com", + "||mojim.com", + "||kb.monitorware.com", + "||monster.com", + "||moodyz.com", + "||moonbingo.com", + "||mos.ru", + "||msha.gov", + "||muzu.tv", + "||mvg.jp", + ".mybet.com", + "||mybet.com", + "||nationwide.com", + "|http://www.nbc.com/live", + "||neo-miracle.com", + "||netflix.com", + "||nflximg.com", + "||nflximg.net", + "||nflxext.com", + "||nflxso.net", + "||nflxvideo.net", + "||nic.gov", + "|http://mo.nightlife141.com", + "||nordstrom.com", + "||nordstromimage.com", + "||nordstromrack.com", + "||nottinghampost.com", + "||npsboost.com", + "||ntdtv.cz", + "||s1.nudezz.com", + "||nusatrip.com", + "||nuuvem.com", + "||omni7.jp", + "||onapp.com", + "||ontrac.com", + "@@|http://blog.ontrac.com", + "||pandora.com", + ".pandora.tv", + "||parkansky.com", + "||phmsociety.org", + "|http://*.pimg.tw/", + "||pure18.com", + "||pytorch.org", + "||qq.co.za", + "||r18.com", + "|http://radiko.jp", + "||ramcity.com.au", + "||rd.com", + "||rdio.com", + "|https://riseup.net", + "||sadistic-v.com", + "||isc.sans.edu", + "|http://cdn*.search.xxx/", + "||shiksha.com", + "||slacker.com", + "||sm-miracle.com", + "||soylentnews.org", + "||spotify.com", + "||spreadshirt.es", + "||springboardplatform.com", + "||sprite.org", + "@@|http://store.sprite.org", + "||superokayama.com", + "||superpages.com", + "||swagbucks.com", + "||switch1.jp", + "||tapanwap.com", + "||gsp.target.com", + "||login.target.com", + "||rcam.target.com", + "||thinkgeek.com", + "||thebodyshop-usa.com", + "||tma.co.jp", + "||tracfone.com", + "||tryheart.jp", + "||turntable.fm", + "||twerkingbutt.com", + "||ulop.net", + "||uukanshu.com", + "||vegasred.com", + "||vevo.com", + "||vip-enterprise.com", + "|http://viu.tv/ch/", + "|http://viu.tv/encore/", + "||vmpsoft.com", + "|http://ecsm.vs.com/", + "||wanz-factory.com", + "||ssl.webpack.de", + "||wheretowatch.com", + "||wingamestore.com", + "||wizcrafts.net", + "||vod.wwe.com", + "||xfinity.com", + "||youwin.com", + "||ytn.co.kr", + "||zattoo.com", + "||zim.vn", + "||zozotown.com", + "14.102.250.18", + "14.102.250.19", + "50.7.31.230:8898", + "174.142.105.153", + "69.65.19.160", + "||xn--4gq171p.com", + "||xn--czq75pvv1aj5c.org", + "||xn--i2ru8q2qg.com", + "||xn--oiq.cc", + "||xn--p8j9a0d9c9a.xn--q9jyb4c", + "||abebooks.com", + "|https://*.s3.amazonaws.com", + "||s3-ap-southeast-2.amazonaws.com", + "||43110.cf", + "||9gag.com", + "||agro.hk", + "||share.america.gov", + "||apkmirror.com", + "||arte.tv", + "||artstation.com", + "||bangdream.space", + "||behance.net", + "||bird.so", + "||zh.bitterwinter.org", + "||bnn.co", + "||businessinsider.com", + "||boomssr.com", + "||bwgyhw.com", + "||castbox.fm", + "||chinatimes.com", + "||clyp.it", + "||cmcn.org", + "||cmx.im", + "||dailyview.tw", + "||daum.net", + "||depositphotos.com", + "||disconnect.me", + "||doubibackup.com", + "||doubmirror.cf", + "||encyclopedia.com", + "||fangeqiang.com", + "||cloud.feedly.com", + "||flyzy2005.com", + "||foreignpolicy.com", + "||free-ss.site", + "||blog.fuckgfw233.org", + "||g0v.social", + "||globalvoices.org", + "||glorystar.me", + "||goregrish.com", + "||hbo.com", + "||spaces.hightail.com", + "||hkgalden.com", + "||hkgolden.com", + "||hudson.org", + "||ipfs.io", + "||japantimes.co.jp", + "||jiji.com", + "||jintian.net", + "||jinx.com", + "||joinmastodon.org", + "||liangzhichuanmei.com", + "||lighti.me", + "||lihkg.com", + "||line-scdn.net", + "||i.lithium.com", + "||cloud.mail.ru", + "||cdn-images.mailchimp.com", + "||mastodon.cloud", + "||mastodon.host", + "||mastodon.social", + "||matters.news", + "||me.me", + "||metart.com", + "||mohu.club", + "||mohu.ml", + "||motiyun.com", + "||msa-it.org", + "||dictionary.goo.ne.jp", + "||go.nesnode.com", + "||international-news.newsmagazine.asia", + "||nikkei.com", + "||niu.moe", + "||nofile.io", + "||now.com", + "||sukebei.nyaa.si", + "||openvpn.org", + "||onejav.com", + "||paste.ee", + "||my.pcloud.com", + "||picacomic.com", + "||pincong.rocks", + "||pixiv.net", + "||potato.im", + "||premproxy.com", + "||prism-break.org", + "||protonvpn.com", + "||api.pureapk.com", + "||quora.com", + "||quoracdn.net", + "||cdn.seatguru.com", + "||secure.raxcdn.com", + "||redd.it", + "||reddit.com", + ".redditlist.com", + "|http://redditlist.com", + "||redditmedia.com", + "||redditstatic.com", + "||rixcloud.com", + "||rixcloud.us", + "||rsdlmonitor.com", + "||shadowsocks.be", + "||shadowsocks9.com", + "||tn1.shemalez.com", + "||tn2.shemalez.com", + "||tn3.shemalez.com", + "||static.shemalez.com", + "||six-degrees.io", + "||softfamous.com", + "||softsmirror.cf", + "||sosreader.com", + "||sspanel.net", + "||sulian.me", + "||supchina.com", + "||teddysun.com", + "||textnow.me", + "||tineye.com", + "||top10vpn.com", + "||tubepornclassic.com", + "||uku.im", + "||unseen.is", + "||cn.uptodown.com", + "||uraban.me", + "||vrsmash.com", + "||vultryhw.com", + "||scache.vzw.com", + "||scache1.vzw.com", + "||scache2.vzw.com", + "||ss7.vzw.com", + "||ssr.tools", + "||steemit.com", + "||taiwanjustice.net", + "||tinc-vpn.org", + "||wenzhao.ca", + "||whatsonweibo.com", + "||wire.com", + "||blog.workflow.is", + "||xm.com", + "||xuehua.us", + "||yes-news.com", + "||you-get.org", + "||zzcloud.me", + "||aex.com", + "||allcoin.com", + "||adcex.com", + "||bcex.ca", + "||bibox.com", + "||big.one", + "||binance.com", + "||bit-z.com", + "||bitcoinworld.com", + "||bitfinex.com", + "||bithumb.com", + "||bitinka.com.ar", + "||bitmex.com", + "||btc98.com", + "||btcbank.bank", + "||btctrade.im", + "||c2cx.com", + "||chaoex.com", + "||cobinhood.com", + "||coin2co.in", + "||coinbene.com", + ".coinegg.com", + "||coinegg.com", + "||coinex.com", + "||coingi.com", + "||coinrail.co.kr", + "||cointiger.com", + "||cointobe.com", + "||coinut.com", + "||discoins.com", + "||dragonex.io", + "||ebtcbank.com", + "||etherdelta.com", + "||exmo.com", + "||exrates.me", + "||exx.com", + "||fatbtc.com", + "||gate.io", + "||gatecoin.com", + "||hbg.com", + "||hitbtc.com", + "||huobi.com", + "||huobi.pro", + "||huobipro.com", + "||bx.in.th", + "||jex.com", + "||kex.com", + "||kspcoin.com", + "||kucoin.com", + "||lbank.info", + "||livecoin.net", + "||localbitcoins.com", + "||mercatox.com", + "||oex.com", + "||okex.com", + "||otcbtc.com", + "||rightbtc.com", + "||topbtc.com", + "||xbtce.com", + "||yobit.net", + "||zb.com", + "||read01.com", + "||kknews.cc", + "china-mmm.jp.net", + ".lsxszzg.com", + ".china-mmm.net", + "||china-mmm.net", + "china-mmm.sa.com", + ".allowed.org", + ".now.im", + "||amazon.co.jp", + ".amazon.com/Dalai-Lama", + "amazon.com/Prisoner-State-Secret-Journal-Premier", + "s3-ap-northeast-1.amazonaws.com", + "||aolchannels.aol.com", + "video.aol.ca/video-detail", + "video.aol.co.uk/video-detail", + "video.aol.com", + "||video.aol.com", + "||search.aol.com", + "www.aolnews.com", + ".avmo.pw", + ".avmoo.com", + "|http://avmoo.com", + ".avmoo.net", + "|http://avmoo.net", + "||avmoo.pw", + ".javmoo.xyz", + "|http://javmoo.xyz", + ".javtag.com", + "|http://javtag.com", + ".javzoo.com", + "|http://javzoo.com", + ".tellme.pw", + ".bbc.com", + "||bbc.com", + ".bbc.co.uk", + "||bbc.co.uk", + "||bbci.co.uk", + ".bbcchinese.com", + "||bbcchinese.com", + "|http://bbc.in", + ".1dumb.com", + ".25u.com", + ".2waky.com", + ".3-a.net", + ".4dq.com", + ".4mydomain.com", + ".4pu.com", + ".acmetoy.com", + ".almostmy.com", + ".americanunfinished.com", + ".authorizeddns.net", + ".authorizeddns.org", + ".authorizeddns.us", + ".bigmoney.biz", + ".changeip.name", + ".changeip.net", + ".changeip.org", + ".cleansite.biz", + ".cleansite.info", + ".cleansite.us", + ".compress.to", + ".ddns.info", + ".ddns.me.uk", + ".ddns.mobi", + ".ddns.ms", + ".ddns.name", + ".ddns.us", + ".dhcp.biz", + ".dns-dns.com", + ".dns-stuff.com", + ".dns04.com", + ".dns05.com", + ".dns1.us", + ".dns2.us", + ".dnset.com", + ".dnsrd.com", + ".dsmtp.com", + ".dumb1.com", + ".dynamic-dns.net", + ".dynamicdns.biz", + ".dynamicdns.co.uk", + ".dynamicdns.me.uk", + ".dynamicdns.org.uk", + ".dyndns.pro", + ".dynssl.com", + ".edns.biz", + ".epac.to", + ".esmtp.biz", + ".ezua.com", + ".faqserv.com", + ".fartit.com", + ".freeddns.com", + ".freetcp.com", + ".freewww.biz", + ".freewww.info", + ".ftp1.biz", + ".ftpserver.biz", + ".gettrials.com", + ".got-game.org", + ".gr8domain.biz", + ".gr8name.biz", + ".https443.net", + ".https443.org", + ".ikwb.com", + ".instanthq.com", + ".iownyour.biz", + ".iownyour.org", + ".isasecret.com", + ".itemdb.com", + ".itsaol.com", + ".jetos.com", + ".jkub.com", + ".jungleheart.com", + ".justdied.com", + ".lflink.com", + ".lflinkup.com", + ".lflinkup.net", + ".lflinkup.org", + ".longmusic.com", + ".mefound.com", + ".moneyhome.biz", + ".mrbasic.com", + ".mrbonus.com", + ".mrface.com", + ".mrslove.com", + ".my03.com", + ".mydad.info", + ".myddns.com", + ".myftp.info", + ".myftp.name", + ".mylftv.com", + ".mymom.info", + ".mynetav.net", + ".mynetav.org", + ".mynumber.org", + ".mypicture.info", + ".mypop3.net", + ".mypop3.org", + ".mysecondarydns.com", + ".mywww.biz", + ".myz.info", + ".ninth.biz", + ".ns01.biz", + ".ns01.info", + ".ns01.us", + ".ns02.biz", + ".ns02.info", + ".ns02.us", + ".ns1.name", + ".ns2.name", + ".ns3.name", + ".ocry.com", + ".onedumb.com", + ".onmypc.biz", + ".onmypc.info", + ".onmypc.net", + ".onmypc.org", + ".onmypc.us", + ".organiccrap.com", + ".otzo.com", + ".ourhobby.com", + ".pcanywhere.net", + ".port25.biz", + ".proxydns.com", + ".qhigh.com", + ".qpoe.com", + ".rebatesrule.net", + ".sellclassics.com", + ".sendsmtp.com", + ".serveuser.com", + ".serveusers.com", + ".sexidude.com", + ".sexxxy.biz", + ".sixth.biz", + ".squirly.info", + ".ssl443.org", + ".toh.info", + ".toythieves.com", + ".trickip.net", + ".trickip.org", + ".vizvaz.com", + ".wha.la", + ".wikaba.com", + ".www1.biz", + ".wwwhost.biz", + "@@|http://xx.wwwhost.biz", + ".x24hr.com", + ".xxuz.com", + ".xxxy.biz", + ".xxxy.info", + ".ygto.com", + ".youdontcare.com", + ".yourtrap.com", + ".zyns.com", + ".zzux.com", + "d1b183sg0nvnuh.cloudfront.net", + "|https://d1b183sg0nvnuh.cloudfront.net", + "d1c37gjwa26taa.cloudfront.net", + "|https://d1c37gjwa26taa.cloudfront.net", + "d3c33hcgiwev3.cloudfront.net", + "|https://d3c33hcgiwev3.cloudfront.net", + "||d3rhr7kgmtrq1v.cloudfront.net", + ".3d-game.com", + ".4irc.com", + ".b0ne.com", + ".chatnook.com", + ".darktech.org", + ".deaftone.com", + ".dtdns.net", + ".effers.com", + ".etowns.net", + ".etowns.org", + ".flnet.org", + ".gotgeeks.com", + ".scieron.com", + ".slyip.com", + ".slyip.net", + ".suroot.com", + ".blogdns.org", + ".dyndns.org", + ".dyndns-ip.com", + ".dyndns-pics.com", + ".from-sd.com", + ".from-pr.com", + ".is-a-hunter.com", + ".dynu.com", + ".dynu.net", + ".freeddns.org", + "cdninstagram.com", + "||cdninstagram.com", + "||facebook.br", + ".facebook.com", + "||facebook.com", + "@@||v6.facebook.com", + "||facebook.design", + "||connect.facebook.net", + "||facebook.hu", + "||facebook.in", + "||facebook.nl", + "||facebook.se", + "||facebookmail.com", + "||fb.com", + "||fb.me", + "||fbcdn.net", + "||fbsbx.com", + "||fbaddins.com", + "||fbworkmail.com", + ".instagram.com", + "||instagram.com", + "||m.me", + "||messenger.com", + "||oculus.com", + "||oculuscdn.com", + "||rocksdb.org", + "@@||ip6.static.sl-reverse.com", + "||thefacebook.com", + "||whatsapp.com", + "||whatsapp.net", + "|https://www.ftchinese.com", + ".ftchinese.com/channel/video", + ".ftchinese.com/premium/001081066", + ".ftchinese.com/story/00102753", + ".ftchinese.com/story/001026616", + ".ftchinese.com/story/001026749", + ".ftchinese.com/story/001026807", + ".ftchinese.com/story/001026808", + ".ftchinese.com/story/001026834", + ".ftchinese.com/story/001026880", + ".ftchinese.com/story/001027429", + ".ftchinese.com/story/001030341", + ".ftchinese.com/story/001030502", + ".ftchinese.com/story/001030803", + ".ftchinese.com/story/001031317", + ".ftchinese.com/story/001032617", + ".ftchinese.com/story/001032636", + ".ftchinese.com/story/001032692", + ".ftchinese.com/story/001032762", + ".ftchinese.com/story/001033138", + ".ftchinese.com/story/001034917", + ".ftchinese.com/story/001034926", + ".ftchinese.com/story/001034927", + ".ftchinese.com/story/001034928", + ".ftchinese.com/story/001034952", + ".ftchinese.com/story/001035890", + ".ftchinese.com/story/001035972", + ".ftchinese.com/story/001035993", + ".ftchinese.com/story/001036417", + ".ftchinese.com/story/001037090", + ".ftchinese.com/story/001037091", + ".ftchinese.com/story/001038178", + ".ftchinese.com/story/001038199", + ".ftchinese.com/story/001038220", + ".ftchinese.com/story/001038819", + ".ftchinese.com/story/001038862", + ".ftchinese.com/story/001039067", + ".ftchinese.com/story/001039178", + ".ftchinese.com/story/001039211", + ".ftchinese.com/story/001039271", + ".ftchinese.com/story/001039295", + ".ftchinese.com/story/001039369", + ".ftchinese.com/story/001039482", + ".ftchinese.com/story/001039534", + ".ftchinese.com/story/001039555", + ".ftchinese.com/story/001039576", + ".ftchinese.com/story/001039712", + ".ftchinese.com/story/001039779", + ".ftchinese.com/story/001039809", + ".ftchinese.com/story/001040134", + ".ftchinese.com/story/001040835", + ".ftchinese.com/story/001040890", + ".ftchinese.com/story/001040918", + ".ftchinese.com/story/001040992", + ".ftchinese.com/story/001041209", + ".ftchinese.com/story/001042100", + ".ftchinese.com/story/001042252", + ".ftchinese.com/story/001042272", + ".ftchinese.com/story/001042280", + ".ftchinese.com/story/001043029", + ".ftchinese.com/story/001043066", + ".ftchinese.com/story/001043096", + ".ftchinese.com/story/001043124", + ".ftchinese.com/story/001043152", + ".ftchinese.com/story/001043189", + ".ftchinese.com/story/001043428", + ".ftchinese.com/story/001043439", + ".ftchinese.com/story/001043534", + ".ftchinese.com/story/001043675", + ".ftchinese.com/story/001043680", + ".ftchinese.com/story/001043702", + ".ftchinese.com/story/001043849", + ".ftchinese.com/story/001044099", + ".ftchinese.com/story/001044776", + ".ftchinese.com/story/001044871", + ".ftchinese.com/story/001044897", + ".ftchinese.com/story/001045114", + ".ftchinese.com/story/001045139", + ".ftchinese.com/story/001045186", + ".ftchinese.com/story/001045755", + ".ftchinese.com/story/001046087", + ".ftchinese.com/story/001046105", + ".ftchinese.com/story/001046118", + ".ftchinese.com/story/001046132", + ".ftchinese.com/story/001046517", + ".ftchinese.com/story/001046822", + ".ftchinese.com/story/001046866", + ".ftchinese.com/story/001046942", + ".ftchinese.com/story/001047180", + ".ftchinese.com/story/001047206", + ".ftchinese.com/story/001047304", + ".ftchinese.com/story/001047317", + ".ftchinese.com/story/001047345", + ".ftchinese.com/story/001047358", + ".ftchinese.com/story/001047375", + ".ftchinese.com/story/001047381", + ".ftchinese.com/story/001047413", + ".ftchinese.com/story/001047456", + ".ftchinese.com/story/001047491", + ".ftchinese.com/story/001047545", + ".ftchinese.com/story/001047558", + ".ftchinese.com/story/001047568", + ".ftchinese.com/story/001047627", + ".ftchinese.com/story/001048293", + ".ftchinese.com/story/001048343", + ".ftchinese.com/story/001048710", + ".ftchinese.com/story/001049289", + ".ftchinese.com/story/001049360", + ".ftchinese.com/story/001049896", + ".ftchinese.com/story/001050152", + ".ftchinese.com/story/001051027", + ".ftchinese.com/story/001051161", + ".ftchinese.com/story/001051372", + ".ftchinese.com/story/001051479", + ".ftchinese.com/story/001052138", + ".ftchinese.com/story/001052161", + ".ftchinese.com/story/001052525", + ".ftchinese.com/story/001052549", + ".ftchinese.com/story/001052701", + ".ftchinese.com/story/001052965", + ".ftchinese.com/story/001053149", + ".ftchinese.com/story/001053150", + ".ftchinese.com/story/001053200", + ".ftchinese.com/story/001053425", + ".ftchinese.com/story/001053496", + ".ftchinese.com/story/001053526", + ".ftchinese.com/story/001053557", + ".ftchinese.com/story/001053906", + ".ftchinese.com/story/001054049", + ".ftchinese.com/story/001054103", + ".ftchinese.com/story/001054109", + ".ftchinese.com/story/001054119", + ".ftchinese.com/story/001054123", + ".ftchinese.com/story/001054139", + ".ftchinese.com/story/001054166", + ".ftchinese.com/story/001054168", + ".ftchinese.com/story/001054190", + ".ftchinese.com/story/001054437", + ".ftchinese.com/story/001054526", + ".ftchinese.com/story/001054607", + ".ftchinese.com/story/001054644", + ".ftchinese.com/story/001054786", + ".ftchinese.com/story/001054843", + ".ftchinese.com/story/001054925", + ".ftchinese.com/story/001054940", + ".ftchinese.com/story/001055051", + ".ftchinese.com/story/001055063", + ".ftchinese.com/story/001055069", + ".ftchinese.com/story/001055136", + ".ftchinese.com/story/001055170", + ".ftchinese.com/story/001055202", + ".ftchinese.com/story/001055242", + ".ftchinese.com/story/001055263", + ".ftchinese.com/story/001055274", + ".ftchinese.com/story/001055299", + ".ftchinese.com/story/001055480", + ".ftchinese.com/story/001055551", + ".ftchinese.com/story/001055559", + ".ftchinese.com/story/001055566", + ".ftchinese.com/story/001055840", + ".ftchinese.com/story/001056099", + ".ftchinese.com/story/001056108", + ".ftchinese.com/story/001056131", + ".ftchinese.com/story/001056375", + ".ftchinese.com/story/001056491", + ".ftchinese.com/story/001056529", + ".ftchinese.com/story/001056534", + ".ftchinese.com/story/001056538", + ".ftchinese.com/story/001056541", + ".ftchinese.com/story/001056554", + ".ftchinese.com/story/001056557", + ".ftchinese.com/story/001056560", + ".ftchinese.com/story/001056567", + ".ftchinese.com/story/001056574", + ".ftchinese.com/story/001056588", + ".ftchinese.com/story/001056594", + ".ftchinese.com/story/001056596", + ".ftchinese.com/story/001056684", + ".ftchinese.com/story/001056832", + ".ftchinese.com/story/001056833", + ".ftchinese.com/story/001056851", + ".ftchinese.com/story/001056874", + ".ftchinese.com/story/001056896", + ".ftchinese.com/story/001056927", + ".ftchinese.com/story/001057011", + ".ftchinese.com/story/001057018", + ".ftchinese.com/story/001057044", + ".ftchinese.com/story/001057162", + ".ftchinese.com/story/001057500", + ".ftchinese.com/story/001057504", + ".ftchinese.com/story/001057509", + ".ftchinese.com/story/001057518", + ".ftchinese.com/story/001057532", + ".ftchinese.com/story/001057533", + ".ftchinese.com/story/001057556", + ".ftchinese.com/story/001057580", + ".ftchinese.com/story/001057638", + ".ftchinese.com/story/001057644", + ".ftchinese.com/story/001057817", + ".ftchinese.com/story/001057875", + ".ftchinese.com/story/001058009", + ".ftchinese.com/story/001058056", + ".ftchinese.com/story/001058224", + ".ftchinese.com/story/001058257", + ".ftchinese.com/story/001058295", + ".ftchinese.com/story/001058328", + ".ftchinese.com/story/001058339", + ".ftchinese.com/story/001058344", + ".ftchinese.com/story/001058352", + ".ftchinese.com/story/001058413", + ".ftchinese.com/story/001058421", + ".ftchinese.com/story/001058440", + ".ftchinese.com/story/001058458", + ".ftchinese.com/story/001058468", + ".ftchinese.com/story/001058561", + ".ftchinese.com/story/001058566", + ".ftchinese.com/story/001058567", + ".ftchinese.com/story/001058585", + ".ftchinese.com/story/001058628", + ".ftchinese.com/story/001058656", + ".ftchinese.com/story/001058665", + ".ftchinese.com/story/001058678", + ".ftchinese.com/story/001058691", + ".ftchinese.com/story/001058721", + ".ftchinese.com/story/001058728", + ".ftchinese.com/story/001059464", + ".ftchinese.com/story/001059484", + ".ftchinese.com/story/001059537", + ".ftchinese.com/story/001059538", + ".ftchinese.com/story/001059551", + ".ftchinese.com/story/001059818", + ".ftchinese.com/story/001059914", + ".ftchinese.com/story/001059920", + ".ftchinese.com/story/001059957", + ".ftchinese.com/story/001060088", + ".ftchinese.com/story/001060156", + ".ftchinese.com/story/001060157", + ".ftchinese.com/story/001060160", + ".ftchinese.com/story/001060181", + ".ftchinese.com/story/001060185", + ".ftchinese.com/story/001060493", + ".ftchinese.com/story/001060495", + ".ftchinese.com/story/001060590", + ".ftchinese.com/story/001060846", + ".ftchinese.com/story/001060847", + ".ftchinese.com/story/001060875", + ".ftchinese.com/story/001060921", + ".ftchinese.com/story/001060946", + ".ftchinese.com/story/001061120", + ".ftchinese.com/story/001061474", + ".ftchinese.com/story/001061524", + ".ftchinese.com/story/001061642", + ".ftchinese.com/story/001062017", + ".ftchinese.com/story/001062020", + ".ftchinese.com/story/001062028", + ".ftchinese.com/story/001062092", + ".ftchinese.com/story/001062096", + ".ftchinese.com/story/001062147", + ".ftchinese.com/story/001062176", + ".ftchinese.com/story/001062188", + ".ftchinese.com/story/001062254", + ".ftchinese.com/story/001062374", + ".ftchinese.com/story/001062482", + ".ftchinese.com/story/001062496", + ".ftchinese.com/story/001062501", + ".ftchinese.com/story/001062508", + ".ftchinese.com/story/001062519", + ".ftchinese.com/story/001062554", + ".ftchinese.com/story/001062741", + ".ftchinese.com/story/001062794", + ".ftchinese.com/story/001063160", + ".ftchinese.com/story/001063359", + ".ftchinese.com/story/001063512", + ".ftchinese.com/story/001063668", + ".ftchinese.com/story/001063692", + ".ftchinese.com/story/001063763", + ".ftchinese.com/story/001063764", + ".ftchinese.com/story/001063826", + ".ftchinese.com/story/001064127", + ".ftchinese.com/story/001064312", + ".ftchinese.com/story/001064705", + ".ftchinese.com/story/001064807", + ".ftchinese.com/story/001065120", + ".ftchinese.com/story/001065168", + ".ftchinese.com/story/001065249", + ".ftchinese.com/story/001065287", + ".ftchinese.com/story/001065335", + ".ftchinese.com/story/001065337", + ".ftchinese.com/story/001065541", + ".ftchinese.com/story/001065715", + ".ftchinese.com/story/001065735", + ".ftchinese.com/story/001065756", + ".ftchinese.com/story/001065802", + ".ftchinese.com/story/001066112", + ".ftchinese.com/story/001066136", + ".ftchinese.com/story/001066140", + ".ftchinese.com/story/001066465", + ".ftchinese.com/story/001066881", + ".ftchinese.com/story/001066950", + ".ftchinese.com/story/001066959", + ".ftchinese.com/story/001067435", + "www.ftchinese.com/story/001067479", + ".ftchinese.com/story/001067528", + ".ftchinese.com/story/001067545", + ".ftchinese.com/story/001067572", + ".ftchinese.com/story/001067648", + ".ftchinese.com/story/001067650", + ".ftchinese.com/story/001067680", + ".ftchinese.com/story/001067692", + ".ftchinese.com/story/001067871", + ".ftchinese.com/story/001067923", + ".ftchinese.com/story/001068062", + ".ftchinese.com/story/001068248", + ".ftchinese.com/story/001068278", + ".ftchinese.com/story/001068379", + ".ftchinese.com/story/001068483", + ".ftchinese.com/story/001068506", + ".ftchinese.com/story/001068547", + ".ftchinese.com/story/001068616", + ".ftchinese.com/story/001068622", + ".ftchinese.com/story/001068707", + ".ftchinese.com/story/001069146", + ".ftchinese.com/story/001069373", + ".ftchinese.com/story/001069516", + ".ftchinese.com/story/001069517", + ".ftchinese.com/story/001069687", + ".ftchinese.com/story/001069741", + ".ftchinese.com/story/001069861", + ".ftchinese.com/story/001069952", + ".ftchinese.com/story/001070053", + ".ftchinese.com/story/001070177", + ".ftchinese.com/story/001070307", + ".ftchinese.com/story/001070809", + ".ftchinese.com/story/001070990", + ".ftchinese.com/story/001071042", + ".ftchinese.com/story/001071044", + ".ftchinese.com/story/001071106", + ".ftchinese.com/story/001071166", + ".ftchinese.com/story/001071181", + "ftchinese.com/story/001071200", + ".ftchinese.com/story/001071208", + ".ftchinese.com/story/001071238", + ".ftchinese.com/story/001071683", + ".ftchinese.com/story/001072271", + ".ftchinese.com/story/001072348", + ".ftchinese.com/story/001072677", + ".ftchinese.com/story/001072726", + ".ftchinese.com/story/001072794", + ".ftchinese.com/story/001072853", + ".ftchinese.com/story/001072895", + ".ftchinese.com/story/001072993", + ".ftchinese.com/story/001073043", + ".ftchinese.com/story/001073103", + ".ftchinese.com/story/001073157", + ".ftchinese.com/story/001073216", + ".ftchinese.com/story/001073246", + ".ftchinese.com/story/001073305", + ".ftchinese.com/story/001073307", + ".ftchinese.com/story/001073408", + ".ftchinese.com/story/001073537", + ".ftchinese.com/story/001073672", + ".ftchinese.com/story/001073849", + ".ftchinese.com/story/001073906", + ".ftchinese.com/story/001074089", + ".ftchinese.com/story/001074110", + ".ftchinese.com/story/001074128", + ".ftchinese.com/story/001074157", + ".ftchinese.com/story/001074246", + ".ftchinese.com/story/001074307", + ".ftchinese.com/story/001074347", + ".ftchinese.com/story/001074423", + ".ftchinese.com/story/001074454", + ".ftchinese.com/story/001074467", + ".ftchinese.com/story/001074493", + ".ftchinese.com/story/001074550", + ".ftchinese.com/story/001074562", + ".ftchinese.com/story/001074653", + ".ftchinese.com/story/001074693", + ".ftchinese.com/story/001074699", + ".ftchinese.com/story/001074712", + ".ftchinese.com/story/001074713", + ".ftchinese.com/story/001074768", + ".ftchinese.com/story/001074782", + ".ftchinese.com/story/001074794", + ".ftchinese.com/story/001074822", + ".ftchinese.com/story/001074874", + ".ftchinese.com/story/001074891", + ".ftchinese.com/story/001074918", + ".ftchinese.com/story/001075081", + ".ftchinese.com/story/001075134", + ".ftchinese.com/story/001075142", + ".ftchinese.com/story/001075216", + ".ftchinese.com/story/001075230", + ".ftchinese.com/story/001075238", + ".ftchinese.com/story/001075262", + ".ftchinese.com/story/001075269", + ".ftchinese.com/story/001075491", + ".ftchinese.com/story/001075500", + ".ftchinese.com/story/001075650", + ".ftchinese.com/story/001075678", + ".ftchinese.com/story/001075703", + ".ftchinese.com/story/001075739", + ".ftchinese.com/story/001076066", + ".ftchinese.com/story/001076142", + ".ftchinese.com/story/001076459", + ".ftchinese.com/story/001076470", + ".ftchinese.com/story/001076538", + ".ftchinese.com/story/001076573", + ".ftchinese.com/story/001076901", + ".ftchinese.com/story/001077067", + ".ftchinese.com/story/001077084", + ".ftchinese.com/story/001077235", + ".ftchinese.com/story/001077344", + ".ftchinese.com/story/001077390", + ".ftchinese.com/story/001077392", + ".ftchinese.com/story/001077465", + ".ftchinese.com/story/001077468", + ".ftchinese.com/story/001077492", + ".ftchinese.com/story/001077745", + ".ftchinese.com/story/001077768", + ".ftchinese.com/story/001077804", + ".ftchinese.com/story/001077852", + ".ftchinese.com/story/001078646", + ".ftchinese.com/story/001078928", + ".ftchinese.com/story/001078967", + ".ftchinese.com/story/001079559", + ".ftchinese.com/story/001079641", + ".ftchinese.com/story/001079909", + ".ftchinese.com/story/001079934", + ".ftchinese.com/story/001079992", + ".ftchinese.com/story/001080054", + ".ftchinese.com/story/001080109", + ".ftchinese.com/story/001080169", + ".ftchinese.com/story/001080226", + ".ftchinese.com/story/001080429", + ".ftchinese.com/story/001080471", + ".ftchinese.com/story/001080550", + ".ftchinese.com/story/001080581", + ".ftchinese.com/story/001080647", + ".ftchinese.com/story/001080778", + ".ftchinese.com/story/001080892", + ".ftchinese.com/story/001080915", + ".ftchinese.com/story/001080935", + ".ftchinese.com/story/001081059", + ".ftchinese.com/story/001081127", + ".ftchinese.com/tag/%E5%8D%81%E5%85%AB%E5%B1%8A%E4%B8%89%E4%B8%AD%E5%85%A8%E4%BC%9A", + ".ftchinese.com/tag/%E6%B8%A9%E5%AE%B6%E5%AE%9D", + ".ftchinese.com/tag/%E8%96%84%E7%86%99%E6%9D%A5", + ".ftchinese.com/video/1437", + ".ftchinese.com/video/1882", + ".ftchinese.com/video/2446", + ".ftchinese.com/video/2601", + ".ftchinese.com/comments", + "||1e100.net", + "||466453.com", + "||abc.xyz", + "||about.google", + "||admob.com", + "||adsense.com", + "||agoogleaday.com", + "||ai.google", + "||ampproject.org", + "@@|https://www.ampproject.org", + "@@|https://cdn.ampproject.org", + "||android.com", + "||androidify.com", + "||androidtv.com", + "||api.ai", + ".appspot.com", + "||appspot.com", + "||autodraw.com", + "||blog.google", + "||blogblog.com", + "blogspot.com", + "/^https?:\\/\\/[^\\/]+blogspot\\.(.*)/", + ".blogspot.hk", + ".blogspot.jp", + ".blogspot.tw", + "||certificate-transparency.org", + "||chrome.com", + "||chromecast.com", + "||chromeexperiments.com", + "||chromercise.com", + "||chromestatus.com", + "||chromium.org", + "||com.google", + "||crbug.com", + "||creativelab5.com", + "||crisisresponse.google", + "||crrev.com", + "||data-vocabulary.org", + "||debug.com", + "||deepmind.com", + "||deja.com", + "||design.google", + "||digisfera.com", + "||dns.google", + "||domains.google", + "||duck.com", + "||environment.google", + "||feedburner.com", + "||firebaseio.com", + "||g.co", + "||gcr.io", + "||get.app", + "||get.dev", + "||get.how", + "||get.page", + "||getmdl.io", + "||getoutline.org", + "||ggpht.com", + "||gmail.com", + "||gmodules.com", + "||godoc.org", + "||golang.org", + "||goo.gl", + ".google.ae", + ".google.as", + ".google.am", + ".google.at", + ".google.az", + ".google.ba", + ".google.be", + ".google.bg", + ".google.ca", + ".google.cd", + ".google.ci", + ".google.co.id", + ".google.co.jp", + ".google.co.kr", + ".google.co.ma", + ".google.co.uk", + ".google.com", + ".google.de", + "||google.dev", + ".google.dj", + ".google.dk", + ".google.es", + ".google.fi", + ".google.fm", + ".google.fr", + ".google.gg", + ".google.gl", + ".google.gr", + ".google.ie", + ".google.is", + ".google.it", + ".google.jo", + ".google.kz", + ".google.lv", + ".google.mn", + ".google.ms", + ".google.nl", + ".google.nu", + ".google.no", + ".google.ro", + ".google.ru", + ".google.rw", + ".google.sc", + ".google.sh", + ".google.sk", + ".google.sm", + ".google.sn", + ".google.tk", + ".google.tm", + ".google.to", + ".google.tt", + ".google.vu", + ".google.ws", + "/^https?:\\/\\/([^\\/]+\\.)*google\\.(ac|ad|ae|af|al|am|as|at|az|ba|be|bf|bg|bi|bj|bs|bt|by|ca|cat|cd|cf|cg|ch|ci|cl|cm|co.ao|co.bw|co.ck|co.cr|co.id|co.il|co.in|co.jp|co.ke|co.kr|co.ls|co.ma|com|com.af|com.ag|com.ai|com.ar|com.au|com.bd|com.bh|com.bn|com.bo|com.br|com.bz|com.co|com.cu|com.cy|com.do|com.ec|com.eg|com.et|com.fj|com.gh|com.gi|com.gt|com.hk|com.jm|com.kh|com.kw|com.lb|com.ly|com.mm|com.mt|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.np|com.om|com.pa|com.pe|com.pg|com.ph|com.pk|com.pr|com.py|com.qa|com.sa|com.sb|com.sg|com.sl|com.sv|com.tj|com.tr|com.tw|com.ua|com.uy|com.vc|com.vn|co.mz|co.nz|co.th|co.tz|co.ug|co.uk|co.uz|co.ve|co.vi|co.za|co.zm|co.zw|cv|cz|de|dj|dk|dm|dz|ee|es|eu|fi|fm|fr|ga|ge|gg|gl|gm|gp|gr|gy|hk|hn|hr|ht|hu|ie|im|iq|is|it|it.ao|je|jo|kg|ki|kz|la|li|lk|lt|lu|lv|md|me|mg|mk|ml|mn|ms|mu|mv|mw|mx|ne|nl|no|nr|nu|org|pl|pn|ps|pt|ro|rs|ru|rw|sc|se|sh|si|sk|sm|sn|so|sr|st|td|tg|tk|tl|tm|tn|to|tt|us|vg|vn|vu|ws)\\/.*/", + "||googleapis.cn", + "||googleapis.com", + "||googleapps.com", + "||googleartproject.com", + "||googleblog.com", + "||googlebot.com", + "||googlechinawebmaster.com", + "||googlecode.com", + "||googlecommerce.com", + "||googledomains.com", + "||googlearth.com", + "||googleearth.com", + "||googledrive.com", + "||googlegroups.com", + "||googlehosted.com", + "||googleideas.com", + "||googleinsidesearch.com", + "||googlelabs.com", + "||googlemail.com", + "||googlemashups.com", + "||googlepagecreator.com", + "||googleplay.com", + "||googleplus.com", + "||googlescholar.com", + "||googlesource.com", + "||googleusercontent.com", + ".googlevideo.com", + "||googlevideo.com", + "||googleweblight.com", + "||googlezip.net", + "||groups.google.cn", + "||grow.google", + "||gstatic.com", + "||gvt0.com", + "||gvt1.com", + "@@||redirector.gvt1.com", + "||gvt3.com", + "||gwtproject.org", + "||html5rocks.com", + "||iam.soy", + "||igoogle.com", + "||itasoftware.com", + "||lers.google", + "||like.com", + "||madewithcode.com", + "||material.io", + "||nic.google", + "||on2.com", + "||panoramio.com", + "||picasaweb.com", + "||pki.goog", + "||plus.codes", + "||polymer-project.org", + "||pride.google", + "||questvisual.com", + "||admin.recaptcha.net", + "||api.recaptcha.net", + "||api-secure.recaptcha.net", + "||api-verify.recaptcha.net", + "||redhotlabs.com", + "||registry.google", + "||safety.google", + "||savethedate.foo", + "||schema.org", + "||shattered.io", + "|http://sipml5.org/", + "||stories.google", + "||sustainability.google", + "||synergyse.com", + "||teachparentstech.org", + "||tensorflow.org", + "||tfhub.dev", + "||thinkwithgoogle.com", + "||tiltbrush.com", + "||urchin.com", + "||waveprotocol.org", + "||waymo.com", + "||web.dev", + "||webmproject.org", + "||webrtc.org", + "||whatbrowser.org", + "||widevine.com", + "||withgoogle.com", + "||withyoutube.com", + "||x.company", + "||xn--ngstr-lra8j.com", + "||youtu.be", + ".youtube.com", + "||youtube.com", + "||youtube-nocookie.com", + "||youtubeeducation.com", + "||youtubegaming.com", + "||yt.be", + "||ytimg.com", + "||zynamics.com", + "||naughtyamerica.com", + "static01.nyt.com", + "||nyt.com", + "nytchina.com", + "nytcn.me", + "||nytcn.me", + "||nytco.com", + "|http://nyti.ms/", + ".nytimes.com", + "||nytimes.com", + "||nytimg.com", + "userapi.nytlog.com", + "cn.nytstyle.com", + "||nytstyle.com", + ".steamcommunity.com", + "||steamcommunity.com", + "|http://store.steampowered.com/app/333600", + "||t.me", + "||updates.tdesktop.com", + "||telegram.dog", + "||telegram.me", + "||telegram.org", + ".telegramdownload.com", + "||telesco.pe", + "||jtvnw.net", + "||ttvnw.net", + "||twitch.tv", + "||twitchcdn.net", + "||periscope.tv", + ".pscp.tv", + "||pscp.tv", + ".t.co", + "||t.co", + ".tweetdeck.com", + "||tweetdeck.com", + "||twimg.com", + ".twitpic.com", + "||twitpic.com", + ".twitter.com", + "||twitter.com", + "||twitter.jp", + "||vine.co", + "||gov.taipei", + ".gov.tw", + "|https://aiss.anws.gov.tw", + "||archives.gov.tw", + "||tacc.cwb.gov.tw", + "||data.gov.tw", + "||epa.gov.tw", + "||fa.gov.tw", + "||fda.gov.tw", + "||hpa.gov.tw", + "||immigration.gov.tw", + "||itaiwan.gov.tw", + "||mjib.gov.tw", + "||moeaic.gov.tw", + "||mofa.gov.tw", + "||mol.gov.tw", + "||mvdis.gov.tw", + "||nat.gov.tw", + "||nhi.gov.tw", + "||npa.gov.tw", + "||nsc.gov.tw", + "||ntbk.gov.tw", + "||ntbna.gov.tw", + "||ntbt.gov.tw", + "||ntsna.gov.tw", + "||pcc.gov.tw", + "||stat.gov.tw", + "||taipei.gov.tw", + "||taiwanjobs.gov.tw", + "||thb.gov.tw", + "||tipo.gov.tw", + "||wda.gov.tw", + "||teco-hk.org", + "||teco-mo.org", + "@@||aftygh.gov.tw", + "@@||aide.gov.tw", + "@@||tpde.aide.gov.tw", + "@@||arte.gov.tw", + "@@||chukuang.gov.tw", + "@@||cwb.gov.tw", + "@@||cycab.gov.tw", + "@@||dbnsa.gov.tw", + "@@||df.gov.tw", + "@@||eastcoast-nsa.gov.tw", + "@@||erv-nsa.gov.tw", + "@@||grb.gov.tw", + "@@||gysd.nyc.gov.tw", + "@@||hchcc.gov.tw", + "@@||hsinchu-cc.gov.tw", + "@@||iner.gov.tw", + "@@||klsio.gov.tw", + "@@||kmseh.gov.tw", + "@@||lungtanhr.gov.tw", + "@@||maolin-nsa.gov.tw", + "@@||matsu-news.gov.tw", + "@@||matsu-nsa.gov.tw", + "@@||matsucc.gov.tw", + "@@||moe.gov.tw", + "@@||mvdis.gov.tw", + "@@||nankan.gov.tw", + "@@||ncree.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||cromotc.nat.gov.tw", + "@@||tax.nat.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||ner.gov.tw", + "@@||nmmba.gov.tw", + "@@||nmp.gov.tw", + "@@||nmvttc.gov.tw", + "@@||northguan-nsa.gov.tw", + "@@||npm.gov.tw", + "@@||nstm.gov.tw", + "@@||ntdmh.gov.tw", + "@@||ntl.gov.tw", + "@@||ntsec.gov.tw", + "@@||ntuh.gov.tw", + "@@||nvri.gov.tw", + "@@||penghu-nsa.gov.tw", + "@@||post.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||stdtime.gov.tw", + "@@||sunmoonlake.gov.tw", + "@@||taitung-house.gov.tw", + "@@||taoyuan.gov.tw", + "@@||tphcc.gov.tw", + "@@||trimt-nsa.gov.tw", + "@@||vghtpe.gov.tw", + "@@||vghks.gov.tw", + "@@||vghtc.gov.tw", + "@@||wanfang.gov.tw", + "@@||yatsen.gov.tw", + "@@||yda.gov.tw", + "||kinmen.org.tw", + ".v2ex.com", + "@@|http://v2ex.com", + "@@|http://cdn.v2ex.com", + "@@|http://cn.v2ex.com", + "@@|http://hk.v2ex.com", + "@@|http://i.v2ex.com", + "@@|http://lax.v2ex.com", + "@@|http://neue.v2ex.com", + "@@|http://pagespeed.v2ex.com", + "@@|http://static.v2ex.com", + "@@|http://workspace.v2ex.com", + "@@|http://www.v2ex.com", + "||data.flurry.com", + "page.bid.yahoo.com", + "tw.bid.yahoo.com", + "|https://tw.bid.yahoo.com", + "blogs.yahoo.co.jp", + "||search.yahoo.co.jp", + "buy.yahoo.com.tw/gdsale", + "hk.yahoo.com", + "hk.knowledge.yahoo.com", + "tw.money.yahoo.com", + "hk.myblog.yahoo.com", + "news.yahoo.com/china-blocks-bbc", + "||hk.news.yahoo.com", + "hk.rd.yahoo.com", + "hk.search.yahoo.com/search", + "hk.video.news.yahoo.com/video", + "meme.yahoo.com", + "tw.answers.yahoo.com", + "|https://tw.answers.yahoo.com", + "||tw.knowledge.yahoo.com", + "||tw.mall.yahoo.com", + "tw.yahoo.com", + "||tw.mobi.yahoo.com", + "tw.myblog.yahoo.com", + "||tw.news.yahoo.com", + "pulse.yahoo.com", + "||search.yahoo.com", + "upcoming.yahoo.com", + "video.yahoo.com", + "||yahoo.com.hk", + "||duckduckgo-owned-server.yahoo.net", + ".030buy.com", + ".0rz.tw", + "|http://0rz.tw", + "1-apple.com.tw", + "||1-apple.com.tw", + ".10.tt", + ".100ke.org", + ".1000giri.net", + "||1000giri.net", + ".10conditionsoflove.com", + "||10musume.com", + "123rf.com", + ".12bet.com", + "||12bet.com", + ".12vpn.com", + ".12vpn.net", + "||12vpn.com", + "||12vpn.net", + ".138.com", + "141hongkong.com/forum", + "||141jj.com", + ".141tube.com", + ".1688.com.au", + ".173ng.com", + "||173ng.com", + ".177pic.info", + ".17t17p.com", + "||18board.com", + "||18board.info", + "18onlygirls.com", + ".18p2p.com", + ".18virginsex.com", + ".1949er.org", + "zhao.1984.city", + "||zhao.1984.city", + "1984bbs.com", + "||1984bbs.com", + ".1984bbs.org", + "||1984bbs.org", + ".1991way.com", + "||1991way.com", + ".1998cdp.org", + ".1bao.org", + "|http://1bao.org", + ".1eew.com", + ".1mobile.com", + "|http://*.1mobile.tw", + "||1pondo.tv", + ".2-hand.info", + ".2000fun.com/bbs", + ".2008xianzhang.info", + "||2008xianzhang.info", + "||2017.hk", + "21andy.com/blog", + ".21pron.com", + "21sextury.com", + ".228.net.tw", + "||233abc.com", + "||24hrs.ca", + "24smile.org", + "2lipstube.com", + ".2shared.com", + "30boxes.com", + ".315lz.com", + "||32red.com", + "||36rain.com", + ".3a5a.com", + "3arabtv.com", + ".3boys2girls.com", + ".3proxy.ru", + ".3ren.ca", + ".3tui.net", + "||4bluestones.biz", + ".4chan.com", + ".4everproxy.com", + "||4everproxy.com", + "||4rbtv.com", + "||4shared.com", + "taiwannation.50webs.com", + "||51.ca", + "||51jav.org", + ".51luoben.com", + "||51luoben.com", + ".5278.cc", + ".5299.tv", + "5aimiku.com", + "5i01.com", + ".5isotoi5.org", + ".5maodang.com", + "||63i.com", + ".64museum.org", + "64tianwang.com", + "64wiki.com", + ".66.ca", + "666kb.com", + "6park.com", + "||6park.com", + "||6parker.com", + "||7capture.com", + ".7cow.com", + ".8-d.com", + "|http://8-d.com", + "85cc.net", + ".85cc.us", + "|http://85cc.us", + "|http://85st.com", + ".881903.com/page/zh-tw/", + "||881903.com", + ".888.com", + ".888poker.com", + "89.64.charter.constitutionalism.solutions", + "89-64.org", + "||89-64.org", + ".8news.com.tw", + ".8z1.net", + "||8z1.net", + ".9001700.com", + "|http://908taiwan.org/", + "||91porn.com", + "||91vps.club", + ".92ccav.com", + ".991.com", + "|http://991.com", + ".99btgc01.com", + "||99btgc01.com", + ".99cn.info", + "|http://99cn.info", + "||9bis.com", + "||9bis.net", + ".tibet.a.se", + "|http://tibet.a.se", + "||a-normal-day.com", + "a5.com.ru", + "|http://aamacau.com", + ".abc.com", + ".abc.net.au", + "||abc.net.au", + ".abchinese.com", + "abclite.net", + "|https://www.abclite.net", + ".ablwang.com", + ".aboluowang.com", + "||aboluowang.com", + ".aboutgfw.com", + ".abs.edu", + ".accim.org", + ".aceros-de-hispania.com", + ".acevpn.com", + "||acevpn.com", + ".acg18.me", + "|http://acg18.me", + "||acgkj.com", + ".acmedia365.com", + ".acnw.com.au", + "actfortibet.org", + "actimes.com.au", + "activpn.com", + "||activpn.com", + "||aculo.us", + "||addictedtocoffee.de", + ".adelaidebbs.com/bbs", + ".adpl.org.hk", + "|http://adpl.org.hk", + ".adult-sex-games.com", + "||adult-sex-games.com", + "adultfriendfinder.com", + "adultkeep.net/peepshow/members/main.htm", + "||advanscene.com", + "||advertfan.com", + ".ae.org", + "||aenhancers.com", + "||af.mil", + ".afantibbs.com", + "|http://afantibbs.com", + ".ai-kan.net", + "||ai-kan.net", + "ai-wen.net", + ".aiph.net", + "||aiph.net", + ".airasia.com", + "||airconsole.com", + "|http://download.aircrack-ng.org", + ".airvpn.org", + "||airvpn.org", + ".aisex.com", + "||ait.org.tw", + "aiweiwei.com", + ".aiweiweiblog.com", + "||aiweiweiblog.com", + "||www.ajsands.com", + "a248.e.akamai.net", + "||a248.e.akamai.net", + "rfalive1.akacast.akamaistream.net", + "voa-11.akacast.akamaistream.net", + "||abematv.akamaized.net", + "||linear-abematv.akamaized.net", + "||vod-abematv.akamaized.net", + "|https://fbcdn*.akamaihd.net/", + "rthklive2-lh.akamaihd.net", + ".akademiye.org/ug", + "|http://akademiye.org/ug", + "||akiba-online.com", + "||akow.org", + ".al-islam.com", + "||al-qimmah.net", + "||alabout.com", + ".alanhou.com", + "|http://alanhou.com", + ".alarab.qa", + "||alasbarricadas.org", + "alexlur.org", + "||alforattv.net", + ".alhayat.com", + ".alicejapan.co.jp", + "aliengu.com", + "||alkasir.com", + "||allconnected.co", + ".alldrawnsex.com", + "||alldrawnsex.com", + ".allervpn.com", + "||allfinegirls.com", + ".allgirlmassage.com", + "allgirlsallowed.org", + ".allgravure.com", + "alliance.org.hk", + ".allinfa.com", + "||allinfa.com", + ".alljackpotscasino.com", + "||allmovie.com", + "||almasdarnews.com", + ".alphaporno.com", + "||alternate-tools.com", + "alternativeto.net/software", + "alvinalexander.com", + "alwaysdata.com", + "||alwaysdata.com", + "||alwaysdata.net", + ".alwaysvpn.com", + "||alwaysvpn.com", + "||am730.com.hk", + "ameblo.jp", + "||ameblo.jp", + "www1.american.edu/ted/ice/tibet", + "||americangreencard.com", + "|http://www.americorps.gov", + "||amiblockedornot.com", + ".amigobbs.net", + ".amitabhafoundation.us", + "|http://amitabhafoundation.us", + ".amnesty.org", + "||amnesty.org", + "||amnesty.org.hk", + ".amnesty.tw", + ".amnestyusa.org", + "||amnestyusa.org", + ".amnyemachen.org", + ".amoiist.com", + ".amtb-taipei.org", + "androidplus.co/apk", + ".andygod.com", + "|http://andygod.com", + "annatam.com/chinese", + "||anchorfree.com", + "||ancsconf.org", + "||andfaraway.net", + "||android-x86.org", + "angelfire.com/hi/hayashi", + "||angularjs.org", + "animecrazy.net", + ".animeshippuuden.com", + "aniscartujo.com", + "||aniscartujo.com", + "||anobii.com", + "anonymise.us", + ".anonymitynetwork.com", + ".anonymizer.com", + ".anonymouse.org", + "||anonymouse.org", + "anontext.com", + ".anpopo.com", + ".answering-islam.org", + "|http://www.antd.org", + "||anthonycalzadilla.com", + ".anti1984.com", + "antichristendom.com", + ".antiwave.net", + "|http://antiwave.net", + ".anyporn.com", + ".anysex.com", + "|http://anysex.com", + "||aobo.com.au", + ".aofriend.com", + "|http://aofriend.com", + ".aofriend.com.au", + ".aojiao.org", + "||aomiwang.com", + "video.ap.org", + ".apetube.com", + "||apiary.io", + ".apigee.com", + "||apigee.com", + "apk-dl.com", + "apkdler.com/apk/view", + ".apkmonk.com/app", + "||apkplz.com", + "apkpure.com", + "||apkpure.com", + ".aplusvpn.com", + ".appdownloader.net/Android", + ".appledaily.com", + "||appledaily.com", + "appledaily.com.hk", + "||appledaily.com.hk", + "appledaily.com.tw", + "||appledaily.com.tw", + ".appshopper.com", + "|http://appshopper.com", + "||appsocks.net", + "||appsto.re", + ".aptoide.com", + "||aptoide.com", + "||archives.gov", + ".archive.fo", + "||archive.fo", + ".archive.is", + "||archive.is", + ".archive.li", + "||archive.li", + "||archive.org", + "archive.today", + "|https://archive.today", + ".arctosia.com", + "|http://arctosia.com", + "||areca-backup.org", + ".arethusa.su", + "||arethusa.su", + "||arlingtoncemetery.mil", + "||army.mil", + ".art4tibet1998.org", + "artofpeacefoundation.org", + "artsy.net", + "||asacp.org", + "asdfg.jp/dabr", + "asg.to", + ".asia-gaming.com", + ".asiaharvest.org", + "||asiaharvest.org", + "asianews.it", + "|http://japanfirst.asianfreeforum.com/", + "||asiansexdiary.com", + "||asianwomensfilm.de", + ".asiatgp.com", + ".asiatoday.us", + "||askstudent.com", + ".askynz.net", + "||askynz.net", + "||assembla.com", + "||astrill.com", + "||atc.org.au", + ".atchinese.com", + "|http://atchinese.com", + "atgfw.org", + ".atlaspost.com", + "||atlaspost.com", + "||atdmt.com", + ".atlanta168.com/forum", + ".atnext.com", + "||atnext.com", + "ice.audionow.com", + ".av.com", + "||av.movie", + ".av-e-body.com", + "avaaz.org", + "||avaaz.org", + ".avbody.tv", + ".avcity.tv", + ".avcool.com", + ".avdb.in", + "||avdb.in", + ".avdb.tv", + "||avdb.tv", + ".avfantasy.com", + ".avgle.com", + "||avgle.com", + "||avidemux.org", + "||avoision.com", + ".avyahoo.com", + "||axureformac.com", + ".azerbaycan.tv", + "azerimix.com", + "boxun*.azurewebsites.net", + "||boxun*.azurewebsites.net", + "forum.baby-kingdom.com", + "babynet.com.hk", + "backchina.com", + "||backchina.com", + ".backpackers.com.tw/forum", + "backtotiananmen.com", + ".badiucao.com", + "||badiucao.com", + ".badjojo.com", + "badoo.com", + "|http://*2.bahamut.com.tw", + "||baidu.jp", + ".baijie.org", + "|http://baijie.org", + "||bailandaily.com", + "||baixing.me", + "||bakgeekhome.tk", + ".banana-vpn.com", + "||banana-vpn.com", + ".band.us", + ".bandwagonhost.com", + "||bandwagonhost.com", + ".bangbrosnetwork.com", + ".bangchen.net", + "|http://bangchen.net", + "||bangyoulater.com", + "bannedbook.org", + "||bannedbook.org", + ".bannednews.org", + ".baramangaonline.com", + "|http://baramangaonline.com", + ".barenakedislam.com", + "||barnabu.co.uk", + "||barton.de", + "bartvpn.com", + ".bastillepost.com", + "bayvoice.net", + "||bayvoice.net", + "dajusha.baywords.com", + "||bbchat.tv", + "||bb-chat.tv", + ".bbg.gov", + ".bbkz.com/forum", + ".bbnradio.org", + "bbs-tw.com", + ".bbsdigest.com/thread", + "||bbsfeed.com", + "bbsland.com", + ".bbsmo.com", + ".bbsone.com", + "bbtoystore.com", + ".bcast.co.nz", + ".bcc.com.tw/board", + ".bcchinese.net", + ".bcmorning.com", + "bdsmvideos.net", + ".beaconevents.com", + ".bebo.com", + "||bebo.com", + ".beevpn.com", + "||beevpn.com", + ".behindkink.com", + "||beijing1989.com", + "beijingspring.com", + "||beijingspring.com", + ".beijingzx.org", + "|http://beijingzx.org", + ".belamionline.com", + ".bell.wiki", + "|http://bell.wiki", + "bemywife.cc", + "beric.me", + ".berlintwitterwall.com", + "||berlintwitterwall.com", + ".berm.co.nz", + ".bestforchina.org", + "||bestforchina.org", + ".bestgore.com", + ".bestpornstardb.com", + "||bestvpn.com", + ".bestvpnanalysis.com", + ".bestvpnserver.com", + ".bestvpnservice.com", + ".bestvpnusa.com", + "||bet365.com", + ".betfair.com", + "||betternet.co", + ".bettervpn.com", + "||bettervpn.com", + ".bettween.com", + "||bettween.com", + "||betvictor.com", + ".bewww.net", + ".beyondfirewall.com", + "||bfnn.org", + "||bfsh.hk", + ".bgvpn.com", + "||bgvpn.com", + ".bianlei.com", + "@@||bianlei.com", + "biantailajiao.com", + "biantailajiao.in", + ".biblesforamerica.org", + "|http://biblesforamerica.org", + ".bic2011.org", + "bigfools.com", + "||bigjapanesesex.com", + ".bignews.org", + "||bignews.org", + ".bigsound.org", + ".biliworld.com", + "|http://biliworld.com", + "|http://billypan.com/wiki", + ".binux.me", + "ai.binwang.me/couplet", + "bipic.net", + ".bit.do", + "|http://bit.do", + ".bit.ly", + "|http://bit.ly", + "||bitcointalk.org", + ".bitshare.com", + "||bitshare.com", + "bitsnoop.com", + ".bitvise.com", + "||bitvise.com", + "bizhat.com", + "||bl-doujinsouko.com", + ".bjnewlife.org", + ".bjs.org", + "bjzc.org", + "||bjzc.org", + ".blacklogic.com", + ".blackvpn.com", + "||blackvpn.com", + "blewpass.com", + "tor.blingblingsquad.net", + ".blinkx.com", + "||blinkx.com", + "blinw.com", + ".blip.tv", + "||blip.tv/", + ".blockcn.com", + "||blockcn.com", + "||blockless.com", + "||blog.de", + ".blog.jp", + "|http://blog.jp", + "@@||jpush.cn", + ".blogcatalog.com", + "||blogcatalog.com", + "||blogcity.me", + ".blogger.com", + "||blogger.com", + "blogimg.jp", + "||blog.kangye.org", + ".bloglines.com", + "||bloglines.com", + "||bloglovin.com", + "rconversation.blogs.com", + "blogtd.net", + ".blogtd.org", + "|http://blogtd.org", + "||bloodshed.net", + ".bloomberg.cn", + "||bloomberg.cn", + ".bloomberg.com", + "||bloomberg.com", + "bloomberg.de", + "||bloomberg.de", + "||assets.bwbx.io", + "||bloomfortune.com", + "blueangellive.com", + ".bmfinn.com", + ".bnews.co", + "||bnews.co", + "||bnrmetal.com", + "boardreader.com/thread", + "||boardreader.com", + ".bod.asia", + "|http://bod.asia", + ".bodog88.com", + ".bolehvpn.net", + "||bolehvpn.net", + "bonbonme.com", + ".bonbonsex.com", + ".bonfoundation.org", + ".bongacams.com", + "||boobstagram.com", + "||book.com.tw", + "bookepub.com", + "||books.com.tw", + "||botanwang.com", + ".bot.nu", + ".bowenpress.com", + "||bowenpress.com", + "||app.box.com", + "dl.box.net", + "||dl.box.net", + ".boxpn.com", + "||boxpn.com", + "boxun.com", + "||boxun.com", + ".boxun.tv", + "||boxun.tv", + "boxunblog.com", + "||boxunblog.com", + ".boxunclub.com", + "boyangu.com", + ".boyfriendtv.com", + ".boysfood.com", + "||br.st", + ".brainyquote.com/quotes/authors/d/dalai_lama", + "||brandonhutchinson.com", + "||braumeister.org", + ".bravotube.net", + "||bravotube.net", + ".brazzers.com", + "||brazzers.com", + ".break.com", + "||break.com", + "breakgfw.com", + "||breakgfw.com", + "breaking911.com", + ".breakingtweets.com", + "||breakingtweets.com", + "||breakwall.net", + "briian.com/6511/freegate", + ".briefdream.com/%E7%B4%A0%E6%A3%BA", + "brizzly.com", + "||brizzly.com", + "||brkmd.com", + "broadbook.com", + ".broadpressinc.com", + "||broadpressinc.com", + "bbs.brockbbs.com", + "brucewang.net", + ".brutaltgp.com", + "||brutaltgp.com", + ".bt2mag.com", + "||bt95.com", + ".btaia.com", + ".btbtav.com", + "|http://btdigg.org", + ".btku.me", + "||btku.me", + "||btku.org", + ".btspread.com", + ".btsynckeys.com", + ".budaedu.org", + "||budaedu.org", + ".buddhanet.com.tw/zfrop/tibet", + ".buddhistchannel.tv", + ".buffered.com", + "|http://buffered.com", + ".bullog.org", + "||bullog.org", + ".bullogger.com", + "||bullogger.com", + "bunbunhk.com", + ".busayari.com", + "|http://busayari.com", + ".businessinsider.com/bing-could-be-censoring-search-results-2014", + ".businessinsider.com/china-banks-preparing-for-debt-implosion-2014", + ".businessinsider.com/hong-kong-activists-defy-police-tear-gas-as-protests-continue-overnight-2014", + ".businessinsider.com/internet-outages-reported-in-north-korea-2014", + ".businessinsider.com/iphone-6-is-approved-for-sale-in-china-2014", + ".businessinsider.com/nfl-announcers-surface-tablets-2014", + ".businessinsider.com/panama-papers", + ".businessinsider.com/umbrella-man-hong-kong-2014", + "|http://www.businessinsider.com.au/*", + ".businesstoday.com.tw", + "||businesstoday.com.tw", + ".businessweek.com", + ".busu.org/news", + "|http://busu.org/news", + "busytrade.com", + ".buugaa.com", + ".buzzhand.com", + ".buzzhand.net", + ".buzzorange.com", + "||buzzorange.com", + "||bvpn.com", + "||bwh1.net", + "bwsj.hk", + "||bx.tl", + ".c-spanvideo.org", + "||c-spanvideo.org", + "||c-est-simple.com", + ".c100tibet.org", + "||cablegatesearch.net", + ".cachinese.com", + ".cacnw.com", + "|http://cacnw.com", + ".cactusvpn.com", + "||cactusvpn.com", + ".cafepress.com", + ".cahr.org.tw", + ".calameo.com/books", + "cn.calameo.com", + "|http://cn.calameo.com", + ".calgarychinese.ca", + ".calgarychinese.com", + ".calgarychinese.net", + "|http://blog.calibre-ebook.com", + "|http://google.calstate.edu", + "falun.caltech.edu", + ".its.caltech.edu/~falun/", + ".cam4.com", + ".cam4.jp", + ".cam4.sg", + ".camfrog.com", + "||camfrog.com", + "||cams.com", + ".cams.org.sg", + "canadameet.com", + ".canalporno.com", + "|http://bbs.cantonese.asia/", + ".canyu.org", + "||canyu.org", + ".cao.im", + ".caobian.info", + "||caobian.info", + "caochangqing.com", + "||caochangqing.com", + ".cap.org.hk", + "||cap.org.hk", + ".carabinasypistolas.com", + "cardinalkungfoundation.org", + "carmotorshow.com", + "ss.carryzhou.com", + ".cartoonmovement.com", + "||cartoonmovement.com", + ".casadeltibetbcn.org", + ".casatibet.org.mx", + "|http://casatibet.org.mx", + "cari.com.my", + "||caribbeancom.com", + ".casinoking.com", + ".casinoriva.com", + "||catch22.net", + ".catchgod.com", + "|http://catchgod.com", + "||catfightpayperview.xxx", + ".catholic.org.hk", + "||catholic.org.hk", + "catholic.org.tw", + "||catholic.org.tw", + ".cathvoice.org.tw", + "||cattt.com", + ".cbc.ca", + "||cbc.ca", + ".cbsnews.com/video", + ".cbtc.org.hk", + "||cccat.cc", + "||cccat.co", + ".ccdtr.org", + "||ccdtr.org", + ".cchere.com", + "||cchere.com", + ".ccim.org", + ".cclife.ca", + "cclife.org", + "cclifefl.org", + ".ccthere.com", + "||ccthere.com", + "||ccthere.net", + ".cctmweb.net", + ".cctongbao.com/article/2078732", + "ccue.ca", + "ccue.com", + ".ccvoice.ca", + ".ccw.org.tw", + ".cgdepot.org", + "|http://cgdepot.org", + "||cdbook.org", + ".cdcparty.com", + ".cdef.org", + "||cdef.org", + "||cdig.info", + "cdjp.org", + "||cdjp.org", + ".cdn-apple.com", + "||cdn-apple.com", + ".cdnews.com.tw", + "cdp1989.org", + "cdp1998.org", + "||cdp1998.org", + "cdp2006.org", + "||cdp2006.org", + ".cdpa.url.tw", + "cdpeu.org", + "cdpusa.org", + "cdpweb.org", + "||cdpweb.org", + "cdpwu.org", + "||cdpwu.org", + "||cdw.com", + ".cecc.gov", + "||cecc.gov", + "||cellulo.info", + "||cenews.eu", + "||centerforhumanreprod.com", + "||centralnation.com", + ".centurys.net", + "|http://centurys.net", + ".cfhks.org.hk", + ".cfos.de", + ".cftfc.com", + ".cgst.edu", + ".change.org", + "||change.org", + ".changp.com", + "||changp.com", + ".changsa.net", + "|http://changsa.net", + ".channel8news.sg/news8", + ".chapm25.com", + ".chaturbate.com", + ".chuang-yen.org", + "chengmingmag.com", + ".chenguangcheng.com", + "||chenguangcheng.com", + ".chenpokong.com", + ".chenpokong.net", + "|http://chenpokong.net", + "||cherrysave.com", + ".chhongbi.org", + "chicagoncmtv.com", + "|http://chicagoncmtv.com", + ".china-week.com", + "china101.com", + "||china101.com", + "||china18.org", + "||china21.com", + "china21.org", + "||china21.org", + ".china5000.us", + "chinaaffairs.org", + "||chinaaffairs.org", + "||chinaaid.me", + "chinaaid.us", + "chinaaid.org", + "chinaaid.net", + "chinacomments.org", + "||chinacomments.org", + ".chinachange.org", + "||chinachange.org", + "chinachannel.hk", + "||chinachannel.hk", + ".chinacitynews.be", + ".chinadialogue.net", + ".chinadigitaltimes.net", + "||chinadigitaltimes.net", + ".chinaelections.org", + "||chinaelections.org", + ".chinaeweekly.com", + "||chinaeweekly.com", + "||chinafreepress.org", + ".chinagate.com", + "chinageeks.org", + "chinagfw.org", + "||chinagfw.org", + ".chinagonet.com", + ".chinagreenparty.org", + "||chinagreenparty.org", + ".chinahorizon.org", + "||chinahorizon.org", + ".chinahush.com", + ".chinainperspective.com", + "||chinainterimgov.org", + "chinalaborwatch.org", + "chinalawtranslate.com", + ".chinapost.com.tw/taiwan/national/national-news", + "chinaxchina.com/howto", + "chinalawandpolicy.com", + ".chinamule.com", + "||chinamule.com", + "chinamz.org", + ".chinanewscenter.com", + "|https://chinanewscenter.com", + ".chinapress.com.my", + "||chinapress.com.my", + ".china-review.com.ua", + "|http://china-review.com.ua", + ".chinarightsia.org", + "chinasmile.net/forums", + "chinasocialdemocraticparty.com", + "||chinasocialdemocraticparty.com", + "chinasoul.org", + "||chinasoul.org", + ".chinasucks.net", + "||chinatopsex.com", + ".chinatown.com.au", + "chinatweeps.com", + "chinaway.org", + ".chinaworker.info", + "||chinaworker.info", + "chinayouth.org.hk", + "chinayuanmin.org", + "||chinayuanmin.org", + ".chinese-hermit.net", + "chinese-leaders.org", + "chinese-memorial.org", + ".chinesedaily.com", + "||chinesedailynews.com", + ".chinesedemocracy.com", + "||chinesedemocracy.com", + "||chinesegay.org", + ".chinesen.de", + "||chinesen.de", + ".chinesenews.net.au/", + ".chinesepen.org", + ".chinesetalks.net/ch", + "||chineseupress.com", + ".chingcheong.com", + "||chingcheong.com", + ".chinman.net", + "|http://chinman.net", + "chithu.org", + "|http://chn.chosun.com", + "cnnews.chosun.com/client/news/viw.asp?cate=C01&mcate", + ".chrdnet.com", + "|http://chrdnet.com", + ".christianfreedom.org", + "|http://christianfreedom.org", + "christianstudy.com", + "||christianstudy.com", + "christusrex.org/www1/sdc", + ".chubold.com", + "chubun.com", + "chuizi.net", + "christiantimes.org.hk", + ".chrlawyers.hk", + "|http://chrlawyers.hk", + ".churchinhongkong.org/b5/index.php", + "|http://churchinhongkong.org/b5/index.php", + ".chushigangdrug.ch", + ".cienen.com", + ".cineastentreff.de", + ".cipfg.org", + "||circlethebayfortibet.org", + "||cirosantilli.com", + ".citizencn.com", + "||citizencn.com", + "|http://citizenlab.org", + "|http://www.citizenlab.org", + "||citizenscommission.hk", + ".citizenlab.org", + "citizensradio.org", + ".city365.ca", + "|http://city365.ca", + "city9x.com", + "||citypopulation.de", + ".citytalk.tw/event", + ".civicparty.hk", + "||civicparty.hk", + ".civildisobediencemovement.org", + "civilhrfront.org", + "||civilhrfront.org", + ".civiliangunner.com", + ".civilmedia.tw", + "||civilmedia.tw", + "psiphon.civisec.org", + "||vpn.cjb.net", + ".ck101.com", + "||ck101.com", + ".clarionproject.org/news/islamic-state-isis-isil-propaganda", + "||classicalguitarblog.net", + ".clb.org.hk", + "clearharmony.net", + "clearwisdom.net", + "clinica-tibet.ru", + ".clipfish.de", + "cloakpoint.com", + "||club1069.com", + "cmi.org.tw", + "|http://www.cmoinc.org", + "cmp.hku.hk", + "hkupop.hku.hk", + "||cmule.com", + "||cmule.org", + "||cms.gov", + "|http://vpn.cmu.edu", + "|http://vpn.sv.cmu.edu", + ".cn6.eu", + ".cna.com.tw", + "||cna.com.tw", + ".cnabc.com", + ".cnd.org", + "||cnd.org", + "download.cnet.com", + ".cnex.org.cn", + ".cnineu.com", + "wiki.cnitter.com", + ".cnn.com/video", + ".cnpolitics.org", + "||cnpolitics.org", + ".cn-proxy.com", + "|http://cn-proxy.com", + ".cnproxy.com", + "blog.cnyes.com", + "news.cnyes.com", + "||coat.co.jp", + ".cochina.co", + "||cochina.co", + "||cochina.org", + ".code1984.com/64", + "|http://goagent.codeplex.com", + "||codeshare.io", + "||codeskulptor.org", + "|http://tosh.comedycentral.com", + "comefromchina.com", + "||comefromchina.com", + ".comic-mega.me", + "commandarms.com", + "||commentshk.com", + ".communistcrimes.org", + "||communistcrimes.org", + "||communitychoicecu.com", + "||compileheart.com", + "||conoha.jp", + ".contactmagazine.net", + ".convio.net", + ".coobay.com", + "|http://www.cool18.com/bbs*/", + ".coolaler.com", + "||coolaler.com", + "coolder.com", + "||coolder.com", + "||coolloud.org.tw", + ".coolncute.com", + "||coolstuffinc.com", + "corumcollege.com", + ".cos-moe.com", + "|http://cos-moe.com", + ".cosplayjav.pl", + "|http://cosplayjav.pl", + ".cotweet.com", + "||cotweet.com", + ".coursehero.com", + "||coursehero.com", + "cpj.org", + "||cpj.org", + ".cq99.us", + "|http://cq99.us", + "crackle.com", + "||crackle.com", + ".crazys.cc", + ".crazyshit.com", + "||crchina.org", + "crd-net.org", + "creaders.net", + "||creaders.net", + ".creadersnet.com", + "||cristyli.com", + ".crocotube.com", + "|http://crocotube.com", + ".crossthewall.net", + "||crossthewall.net", + ".crossvpn.net", + "||crossvpn.net", + "||crucial.com", + "csdparty.com", + "||csdparty.com", + "||csuchen.de", + ".csw.org.uk", + ".ct.org.tw", + "||ct.org.tw", + ".ctao.org", + ".ctfriend.net", + ".ctitv.com.tw", + "cts.com.tw", + "|http://library.usc.cuhk.edu.hk/", + "|http://mjlsh.usc.cuhk.edu.hk/", + ".cuhkacs.org/~benng", + ".cuihua.org", + "||cuihua.org", + ".cuiweiping.net", + "||cuiweiping.net", + "||culture.tw", + ".cumlouder.com", + "||cumlouder.com", + "||curvefish.com", + ".cusu.hk", + "||cusu.hk", + ".cutscenes.net", + ".cw.com.tw", + "||cw.com.tw", + "|http://forum.cyberctm.com", + "cyberghostvpn.com", + "||cyberghostvpn.com", + "||cynscribe.com", + "cytode.us", + "||ifan.cz.cc", + "||mike.cz.cc", + "||nic.cz.cc", + ".d-fukyu.com", + "|http://d-fukyu.com", + "cl.d0z.net", + ".d100.net", + "||d100.net", + ".d2bay.com", + "|http://d2bay.com", + ".dabr.co.uk", + "||dabr.co.uk", + "dabr.eu", + "dabr.mobi", + "||dabr.mobi", + "||dabr.me", + "dadazim.com", + "||dadazim.com", + ".dadi360.com", + ".dafabet.com", + "dafagood.com", + "dafahao.com", + ".dafoh.org", + ".daftporn.com", + ".dagelijksestandaard.nl", + ".daidostup.ru", + "|http://daidostup.ru", + ".dailidaili.com", + "||dailidaili.com", + ".dailymotion.com", + "||dailymotion.com", + "daiphapinfo.net", + ".dajiyuan.com", + "||dajiyuan.de", + "dajiyuan.eu", + "dalailama.com", + ".dalailama.mn", + "|http://dalailama.mn", + ".dalailama.ru", + "||dalailama.ru", + "dalailama80.org", + ".dalailama-archives.org", + ".dalailamacenter.org", + "|http://dalailamacenter.org", + "dalailamafellows.org", + ".dalailamafilm.com", + ".dalailamafoundation.org", + ".dalailamahindi.com", + ".dalailamainaustralia.org", + ".dalailamajapanese.com", + ".dalailamaprotesters.info", + ".dalailamaquotes.org", + ".dalailamatrust.org", + ".dalailamavisit.org.nz", + ".dalailamaworld.com", + "||dalailamaworld.com", + "dalianmeng.org", + "||dalianmeng.org", + ".daliulian.org", + "||daliulian.org", + ".danke4china.net", + "||danke4china.net", + ".danwei.org", + "daolan.net", + ".daozhongxing.org", + "darktoy.net", + "||dastrassi.org", + "blog.daum.net/_blog", + ".david-kilgour.com", + "|http://david-kilgour.com", + "daxa.cn", + "||daxa.cn", + "cn.dayabook.com", + ".daylife.com/topic/dalai_lama", + "||db.tt", + ".dbc.hk/main", + "||dcard.tw", + "dcmilitary.com", + ".ddc.com.tw", + ".ddhw.info", + "||de-sci.org", + ".de-sci.org", + "packages.debian.org/zh-cn/lenny/gpass", + "||decodet.co", + ".definebabe.com", + "||delcamp.net", + "delicious.com/GFWbookmark", + ".democrats.org", + "||democrats.org", + "||desc.se", + "||dessci.com", + ".destroy-china.jp", + "||deutsche-welle.de", + "||devio.us", + "||devpn.com", + "||dfas.mil", + "dfn.org", + "dharmakara.net", + ".dharamsalanet.com", + ".diaoyuislands.org", + "||diaoyuislands.org", + ".difangwenge.org", + "|http://digiland.tw/", + "||digitalnomadsproject.org", + ".diigo.com", + "||diigo.com", + "||dilber.se", + "||furl.net", + ".dipity.com", + "||directcreative.com", + ".discuss.com.hk", + "||discuss.com.hk", + ".discuss4u.com", + "disp.cc", + ".disqus.com", + "||disqus.com", + ".dit-inc.us", + "||dit-inc.us", + ".dizhidizhi.com", + "||dizhuzhishang.com", + "djangosnippets.org", + ".djorz.com", + "||djorz.com", + "||dl-laby.jp", + "||dlsite.com", + "||dlyoutube.com", + "||dmcdn.net", + ".dnscrypt.org", + "||dnscrypt.org", + "||dns2go.com", + "||dnssec.net", + "doctorvoice.org", + ".dogfartnetwork.com/tour", + "gloryhole.com", + ".dojin.com", + ".dok-forum.net", + "||dolc.de", + "||dolf.org.hk", + "||dollf.com", + ".domain.club.tw", + ".domaintoday.com.au", + "chinese.donga.com", + "dongtaiwang.com", + "||dongtaiwang.com", + ".dongtaiwang.net", + "||dongtaiwang.net", + ".dongyangjing.com", + "|http://danbooru.donmai.us", + ".dontfilter.us", + "||dontmovetochina.com", + ".dorjeshugden.com", + ".dotplane.com", + "||dotplane.com", + "||dotsub.com", + ".dotvpn.com", + "||dotvpn.com", + ".doub.io", + "||doub.io", + "||dougscripts.com", + "||douhokanko.net", + "||doujincafe.com", + "dowei.org", + "dphk.org", + "dpp.org.tw", + "||dpp.org.tw", + "||dpr.info", + "||dragonsprings.org", + ".dreamamateurs.com", + ".drepung.org", + "||drgan.net", + ".drmingxia.org", + "|http://drmingxia.org", + "||dropbooks.tv", + "||dropbox.com", + "||api.dropboxapi.com", + "||notify.dropboxapi.com", + "||dropboxusercontent.com", + "drsunacademy.com", + ".drtuber.com", + ".dscn.info", + "|http://dscn.info", + ".dstk.dk", + "|http://dstk.dk", + "||dtiblog.com", + "||dtic.mil", + ".dtwang.org", + ".duanzhihu.com", + ".duckdns.org", + "|http://duckdns.org", + ".duckduckgo.com", + "||duckduckgo.com", + ".duckload.com/download", + "||duckmylife.com", + ".duga.jp", + "|http://duga.jp", + ".duihua.org", + "||duihua.org", + "||duihuahrjournal.org", + ".dunyabulteni.net", + ".duoweitimes.com", + "||duoweitimes.com", + "duping.net", + "||duplicati.com", + "dupola.com", + "dupola.net", + ".dushi.ca", + "||dvorak.org", + ".dw.com", + "||dw.com", + "||dw.de", + ".dw-world.com", + "||dw-world.com", + ".dw-world.de", + "|http://dw-world.de", + "www.dwheeler.com", + "dwnews.com", + "||dwnews.com", + "dwnews.net", + "||dwnews.net", + "xys.dxiong.com", + "||dynawebinc.com", + "||dysfz.cc", + ".dzze.com", + "||e-classical.com.tw", + "||e-gold.com", + ".e-gold.com", + ".e-hentai.org", + "||e-hentai.org", + ".e-hentaidb.com", + "|http://e-hentaidb.com", + "e-info.org.tw", + ".e-traderland.net/board", + ".e-zone.com.hk/discuz", + "|http://e-zone.com.hk/discuz", + ".e123.hk", + "||e123.hk", + ".earlytibet.com", + "|http://earlytibet.com", + ".earthcam.com", + ".earthvpn.com", + "||earthvpn.com", + "eastern-ark.com", + ".easternlightning.org", + ".eastturkestan.com", + "|http://www.eastturkistan.net/", + ".eastturkistan-gov.org", + ".eastturkistancc.org", + ".eastturkistangovernmentinexile.us", + "||eastturkistangovernmentinexile.us", + ".easyca.ca", + ".easypic.com", + ".ebony-beauty.com", + "ebookbrowse.com", + "ebookee.com", + "||ecfa.org.tw", + "ushuarencity.echainhost.com", + "||ecimg.tw", + "ecministry.net", + ".economist.com", + "bbs.ecstart.com", + "edgecastcdn.net", + "||edgecastcdn.net", + "/twimg\\.edgesuite\\.net\\/\\/?appledaily/", + "edicypages.com", + ".edmontonchina.cn", + ".edmontonservice.com", + "edoors.com", + ".edubridge.com", + "||edubridge.com", + ".edupro.org", + "||eevpn.com", + "efcc.org.hk", + ".efukt.com", + "|http://efukt.com", + "||eic-av.com", + "||eireinikotaerukai.com", + ".eisbb.com", + ".eksisozluk.com", + "||eksisozluk.com", + "electionsmeter.com", + "||elgoog.im", + ".ellawine.org", + ".elpais.com", + "||elpais.com", + ".eltondisney.com", + ".emaga.com/info/3407", + "emilylau.org.hk", + ".emanna.com/chineseTraditional", + "bitc.bme.emory.edu/~lzhou/blogs", + ".empfil.com", + ".emule-ed2k.com", + "|http://emule-ed2k.com", + ".emulefans.com", + "|http://emulefans.com", + ".emuparadise.me", + ".enanyang.my", + "||enewstree.com", + ".enfal.de", + "chinese.engadget.com", + "||engagedaily.org", + "englishforeveryone.org", + "||englishfromengland.co.uk", + "englishpen.org", + ".enlighten.org.tw", + "||entermap.com", + ".entnt.com", + "|http://entnt.com", + ".episcopalchurch.org", + ".epochhk.com", + "|http://epochhk.com", + "epochtimes-bg.com", + "||epochtimes-bg.com", + "epochtimes-romania.com", + "||epochtimes-romania.com", + "epochtimes.co.il", + "||epochtimes.co.il", + "epochtimes.co.kr", + "||epochtimes.co.kr", + "epochtimes.com", + "||epochtimes.com", + ".epochtimes.cz", + "epochtimes.de", + "epochtimes.fr", + ".epochtimes.ie", + ".epochtimes.it", + "epochtimes.jp", + "epochtimes.ru", + "epochtimes.se", + "epochtimestr.com", + ".epochweek.com", + "||epochweek.com", + "||epochweekly.com", + ".eporner.com", + ".equinenow.com", + "erabaru.net", + ".eracom.com.tw", + ".eraysoft.com.tr", + ".erepublik.com", + ".erights.net", + "||erights.net", + ".erktv.com", + "|http://erktv.com", + "||ernestmandel.org", + "||erodaizensyu.com", + "||erodoujinlog.com", + "||erodoujinworld.com", + "||eromanga-kingdom.com", + "||eromangadouzin.com", + ".eromon.net", + "|http://eromon.net", + ".eroprofile.com", + ".eroticsaloon.net", + ".eslite.com", + "||eslite.com", + "wiki.esu.im/%E8%9B%A4%E8%9B%A4%E8%AF%AD%E5%BD%95", + ".etaa.org.au", + ".etadult.com", + "etaiwannews.com", + "||etizer.org", + "||etokki.com", + ".ettoday.net/news/20151216/614081", + "etvonline.hk", + ".eu.org", + "||eu.org", + ".eucasino.com", + ".eulam.com", + ".eurekavpt.com", + "||eurekavpt.com", + ".euronews.com", + "||euronews.com", + "eeas.europa.eu/delegations/china/press_corner/all_news/news/2015/20150716_zh", + "eeas.europa.eu/statements-eeas/2015/151022", + ".evschool.net", + "|http://evschool.net", + "||exblog.jp", + "||blog.exblog.co.jp", + "@@||www.exblog.jp", + ".exchristian.hk", + "||exchristian.hk", + "|http://blog.excite.co.jp", + "||exmormon.org", + "||expatshield.com", + ".expecthim.com", + "||expecthim.com", + "experts-univers.com", + "||exploader.net", + ".expressvpn.com", + "||expressvpn.com", + ".extremetube.com", + "eyevio.jp", + "||eyevio.jp", + ".eyny.com", + "||eyny.com", + ".ezpc.tk/category/soft", + ".ezpeer.com", + "||facebookquotes4u.com", + ".faceless.me", + "||faceless.me", + "|http://facesoftibetanselfimmolators.info", + "||facesofnyfw.com", + ".faith100.org", + "|http://faith100.org", + ".faithfuleye.com", + "||faiththedog.info", + ".fakku.net", + ".falsefire.com", + "||falsefire.com", + "falun-co.org", + "falunart.org", + "||falunasia.info", + "|http://falunau.org", + ".falunaz.net", + "falundafa.org", + "falundafa-dc.org", + "||falundafa-florida.org", + "||falundafa-nc.org", + "||falundafa-pa.net", + "||falundafa-sacramento.org", + "falun-ny.net", + "||falundafaindia.org", + "falundafamuseum.org", + ".falungong.club", + ".falungong.de", + "falungong.org.uk", + "||falunhr.org", + "faluninfo.de", + "faluninfo.net", + ".falunpilipinas.net", + "||falunworld.net", + "familyfed.org", + ".fangeming.com", + "||fanglizhi.info", + "||fangong.org", + "fangongheike.com", + ".fanqiang.tk", + "fanqianghou.com", + "||fanqianghou.com", + ".fanqiangzhe.com", + "||fanqiangzhe.com", + "fapdu.com", + "faproxy.com", + ".fawanghuihui.org", + "fanqiangyakexi.net", + "fail.hk", + "||famunion.com", + ".fan-qiang.com", + ".fangbinxing.com", + "||fangbinxing.com", + "fangeming.com", + ".fangmincn.org", + "||fangmincn.org", + ".fanhaodang.com", + "||fanswong.com", + ".fanyue.info", + ".farwestchina.com", + "en.favotter.net", + "nytimes.map.fastly.net", + "||nytimes.map.fastly.net", + "||fast.wistia.com", + "||fastssh.com", + "||faststone.org", + "favstar.fm", + "||favstar.fm", + "faydao.com/weblog", + ".fc2.com", + ".fc2china.com", + ".fc2cn.com", + "||fc2cn.com", + "fc2blog.net", + "|http://uygur.fc2web.com/", + "video.fdbox.com", + ".fdc64.de", + ".fdc64.org", + ".fdc89.jp", + "||fourface.nodesnoop.com", + "||feelssh.com", + "feer.com", + ".feifeiss.com", + "|http://feitianacademy.org", + ".feitian-california.org", + "||feministteacher.com", + ".fengzhenghu.com", + "||fengzhenghu.com", + ".fengzhenghu.net", + "||fengzhenghu.net", + ".fevernet.com", + "|http://ff.im", + "fffff.at", + "fflick.com", + ".ffvpn.com", + "fgmtv.net", + ".fgmtv.org", + ".fhreports.net", + "|http://fhreports.net", + ".figprayer.com", + "||figprayer.com", + ".fileflyer.com", + "||fileflyer.com", + "|http://feeds.fileforum.com", + ".files2me.com", + ".fileserve.com/file", + "fillthesquare.org", + "filmingfortibet.org", + ".filthdump.com", + ".finchvpn.com", + "||finchvpn.com", + "findmespot.com", + "||findyoutube.com", + "||findyoutube.net", + ".fingerdaily.com", + "finler.net", + ".firearmsworld.net", + "|http://firearmsworld.net", + ".fireofliberty.org", + "||fireofliberty.org", + ".firetweet.io", + "||firetweet.io", + ".flagsonline.it", + "fleshbot.com", + ".fleursdeslettres.com", + "|http://fleursdeslettres.com", + "||flgg.us", + "||flgjustice.org", + "||flickr.com", + "||staticflickr.com", + "flickrhivemind.net", + ".flickriver.com", + ".fling.com", + "||flipkart.com", + "||flog.tw", + ".flyvpn.com", + "||flyvpn.com", + "|http://cn.fmnnow.com", + "fofldfradio.org", + "blog.foolsmountain.com", + ".forum4hk.com", + "fangong.forums-free.com", + "pioneer-worker.forums-free.com", + "|https://ss*.4sqi.net", + "video.foxbusiness.com", + "|http://foxgay.com", + "||fringenetwork.com", + "||flecheinthepeche.fr", + ".fochk.org", + "|http://fochk.org", + "||focustaiwan.tw", + ".focusvpn.com", + "||fofg.org", + ".fofg-europe.net", + ".fooooo.com", + "||fooooo.com", + "footwiball.com", + ".fotile.me", + "||fourthinternational.org", + "||foxdie.us", + "||foxsub.com", + "foxtang.com", + ".fpmt.org", + "|http://fpmt.org", + ".fpmt.tw", + ".fpmt-osel.org", + "||fpmtmexico.org", + "fqok.org", + "||fqrouter.com", + "||franklc.com", + ".freakshare.com", + "|http://freakshare.com", + "||free4u.com.ar", + "free-gate.org", + ".free-hada-now.org", + "free-proxy.cz", + ".free.fr/adsl", + "kineox.free.fr", + "tibetlibre.free.fr", + "||freealim.com", + "whitebear.freebearblog.org", + "||freebrowser.org", + ".freechal.com", + ".freedomchina.info", + "||freedomchina.info", + ".freedomhouse.org", + "||freedomhouse.org", + ".freedomsherald.org", + "||freedomsherald.org", + ".freefq.com", + ".freefuckvids.com", + ".freegao.com", + "||freegao.com", + "freeilhamtohti.org", + ".freekwonpyong.org", + "||saveliuxiaobo.com", + ".freelotto.com", + "||freelotto.com", + "freeman2.com", + ".freeopenvpn.com", + "freemoren.com", + "freemorenews.com", + "freemuse.org/archives/789", + "freenet-china.org", + "freenewscn.com", + "cn.freeones.com", + ".freeoz.org/bbs", + "||freeoz.org", + "||freessh.us", + "free4u.com.ar", + ".free-ssh.com", + "||free-ssh.com", + ".freechina.news/", + "||freechinaforum.org", + "||freechinaweibo.com", + ".freedomcollection.org/interviews/rebiya_kadeer", + ".freeforums.org", + "||freenetproject.org", + ".freeoz.org", + ".freetibet.net", + "||freetibet.org", + ".freetibetanheroes.org", + "|http://freetibetanheroes.org", + ".freeviewmovies.com", + ".freevpn.me", + "|http://freevpn.me", + "||freewallpaper4.me", + ".freewebs.com", + ".freewechat.com", + "||freewechat.com", + "freeweibo.com", + "||freeweibo.com", + ".freexinwen.com", + ".freeyoutubeproxy.net", + "||freeyoutubeproxy.net", + "friendfeed.com", + "friendfeed-media.com/e99a4ebe2fb4c1985c2a58775eb4422961aa5a2e", + "friends-of-tibet.org", + ".friendsoftibet.org", + "freechina.net", + "|http://www.zensur.freerk.com/", + "freevpn.nl", + "freeyellow.com", + "hk.frienddy.com/hk", + "|http://adult.friendfinder.com/", + ".fring.com", + "||fring.com", + ".fromchinatousa.net", + "||frommel.net", + ".frontlinedefenders.org", + ".frootvpn.com", + "||frootvpn.com", + "||fscked.org", + ".fsurf.com", + ".ftv.com.tw", + "fucd.com", + ".fuckcnnic.net", + "||fuckcnnic.net", + "fuckgfw.org", + ".fulione.com", + "|https://fulione.com", + "||fullerconsideration.com", + "fulue.com", + ".funf.tw", + "funp.com", + ".fuq.com", + ".furhhdl.org", + "||furinkan.com", + ".futurechinaforum.org", + "||futuremessage.org", + ".fux.com", + ".fuyin.net", + ".fuyindiantai.org", + ".fuyu.org.tw", + "||fw.cm", + ".fxcm-chinese.com", + "||fxcm-chinese.com", + "fzh999.com", + "fzh999.net", + "fzlm.com", + ".g6hentai.com", + "|http://g6hentai.com", + "||g-queen.com", + "||gabocorp.com", + ".gaeproxy.com", + ".gaforum.org", + ".galaxymacau.com", + "||galenwu.com", + ".galstars.net", + "||game735.com", + "gamebase.com.tw", + "gamejolt.com", + "|http://wiki.gamerp.jp", + "||gamer.com.tw", + ".gamer.com.tw", + ".gamez.com.tw", + "||gamez.com.tw", + ".gamousa.com", + ".gaoming.net", + "||gaoming.net", + "ganges.com", + ".gaopi.net", + "|http://gaopi.net", + ".gaozhisheng.org", + ".gaozhisheng.net", + "gardennetworks.com", + "||gardennetworks.org", + "72.52.81.22", + "||gartlive.com", + "||gate-project.com", + "||gather.com", + ".gatherproxy.com", + "gati.org.tw", + ".gaybubble.com", + ".gaycn.net", + ".gayhub.com", + "||gaymap.cc", + ".gaymenring.com", + ".gaytube.com", + "||images-gaytube.com", + ".gaywatch.com", + "|http://gaywatch.com", + ".gazotube.com", + "||gazotube.com", + "||gcc.org.hk", + "||gclooney.com", + "||gcmasia.com", + ".gcpnews.com", + "|http://gcpnews.com", + ".gdbt.net/forum", + "gdzf.org", + "||geek-art.net", + "geekerhome.com/2010/03/xixiang-project-cross-gfw", + "||geekheart.info", + ".gekikame.com", + "|http://gekikame.com", + ".gelbooru.com", + "|http://gelbooru.com", + ".geocities.co.jp", + ".geocities.com/SiliconValley/Circuit/5683/download.html", + "hk.geocities.com", + "geocities.jp", + ".gerefoundation.org", + "||getastrill.com", + ".getchu.com", + ".getcloak.com", + "||getcloak.com", + "||getfoxyproxy.org", + ".getfreedur.com", + "||getgom.com", + ".geti2p.net", + "||geti2p.net", + ".getlantern.org", + "||getlantern.org", + ".getjetso.com/forum", + "getiton.com", + ".getsocialscope.com", + "||getsync.com", + "gfbv.de", + ".gfgold.com.hk", + ".gfsale.com", + "||gfsale.com", + "gfw.org.ua", + ".gfw.press", + "||gfw.press", + ".ggssl.com", + "||ggssl.com", + ".ghostpath.com", + "||ghostpath.com", + "||ghut.org", + ".giantessnight.com", + "|http://giantessnight.com", + ".gifree.com", + "||giga-web.jp", + "tw.gigacircle.com", + "|http://cn.giganews.com/", + "gigporno.ru", + "||girlbanker.com", + ".git.io", + "||git.io", + "|http://softwaredownload.gitbooks.io", + "github.com/getlantern", + "|https://gist.github.com", + "http://cthlo.github.io/hktv", + "hahaxixi.github.io", + "|https://hahaxixi.github.io", + "||haoel.github.io", + "||rg3.github.io", + "||sikaozhe1997.github.io", + "||sodatea.github.io", + "||terminus2049.github.io", + "||toutyrater.github.io", + "wsgzao.github.io", + "|https://wsgzao.github.io", + ".gizlen.net", + "||gizlen.net", + ".gjczz.com", + "||gjczz.com", + "globaljihad.net", + "globalmediaoutreach.com", + "globalmuseumoncommunism.org", + "||globalrescue.net", + ".globaltm.org", + ".globalvoicesonline.org", + "||globalvoicesonline.org", + "||globalvpn.net", + ".glock.com", + "gluckman.com/DalaiLama", + "gmbd.cn", + "||gmhz.org", + "|http://www.gmiddle.com", + "|http://www.gmiddle.net", + ".gmll.org", + "||gnci.org.hk", + "go-pki.com", + "||goagent.biz", + "||goagentplus.com", + "gobet.cc", + "godfootsteps.org", + "||godfootsteps.org", + "godns.work", + "godsdirectcontact.co.uk", + ".godsdirectcontact.org", + "godsdirectcontact.org.tw", + ".godsimmediatecontact.com", + ".gogotunnel.com", + "||gohappy.com.tw", + ".gokbayrak.com", + ".goldbet.com", + "||goldbetsports.com", + "||goldeneyevault.com", + ".goldenfrog.com", + "||goldenfrog.com", + ".goldjizz.com", + "|http://goldjizz.com", + ".goldstep.net", + "||goldwave.com", + "gongmeng.info", + "gongm.in", + "gongminliliang.com", + ".gongwt.com", + "|http://gongwt.com", + "blog.goo.ne.jp/duck-tail_2009", + ".gooday.xyz", + "|http://gooday.xyz", + ".goodreads.com", + "||goodreads.com", + ".goodreaders.com", + "||goodreaders.com", + ".goodtv.com.tw", + ".goodtv.tv", + "||goofind.com", + ".googlesile.com", + ".gopetition.com", + "||gopetition.com", + ".goproxing.net", + ".gotrusted.com", + "||gotrusted.com", + "||gotw.ca", + "||grammaly.com", + "grandtrial.org", + ".graphis.ne.jp", + "||graphis.ne.jp", + "||graphql.org", + "greatfirewall.biz", + "||greatfirewallofchina.net", + ".greatfirewallofchina.org", + "||greatfirewallofchina.org", + "||greenfieldbookstore.com.hk", + ".greenparty.org.tw", + "||greenpeace.org", + ".greenreadings.com/forum", + "great-firewall.com", + "great-roc.org", + "greatroc.org", + "greatzhonghua.org", + ".greenpeace.com.tw", + ".greenvpn.net", + "||greenvpn.net", + ".greenvpn.org", + "||grotty-monday.com", + "gs-discuss.com", + "||gtricks.com", + "guancha.org", + "guaneryu.com", + ".guardster.com", + ".gun-world.net", + "gunsandammo.com", + "||gutteruncensored.com", + "||gvm.com.tw", + ".gzm.tv", + "||gzone-anime.info", + "||clementine-player.org", + "echofon.com", + "||greasespot.net", + "||www.klip.me", + "@@||site.locql.com", + "||stephaniered.com", + "@@||download.syniumsoftware.com", + "|http://ub0.cc", + "wozy.in", + "gospelherald.com", + "||gospelherald.com", + "|http://hk.gradconnection.com/", + "||grangorz.org", + "greatfire.org", + "||greatfire.org", + "greatfirewallofchina.org", + "||greatroc.tw", + ".gts-vpn.com", + "|http://gts-vpn.com", + ".gu-chu-sum.org", + "|http://gu-chu-sum.org", + ".guaguass.com", + "|http://guaguass.com", + ".guaguass.org", + "|http://guaguass.org", + ".guangming.com.my", + "guishan.org", + "||guishan.org", + ".gumroad.com", + "||gumroad.com", + "||gunsamerica.com", + "guruonline.hk", + "|http://gvlib.com", + ".gyalwarinpoche.com", + ".gyatsostudio.com", + ".h528.com", + ".h5dm.com", + ".h5galgame.me", + "||h-china.org", + ".h-moe.com", + "|http://h-moe.com", + "h1n1china.org", + ".hacg.club", + "||hacg.club", + ".hacg.in", + "|http://hacg.in", + ".hacg.li", + "|http://hacg.li", + ".hacg.me", + "|http://hacg.me", + ".hacg.red", + "|http://hacg.red", + ".hacken.cc/bbs", + ".hacker.org", + "||hackthatphone.net", + "hahlo.com", + "||hakkatv.org.tw", + ".handcraftedsoftware.org", + "|http://bbs.hanminzu.org/", + ".hanunyi.com", + ".hao.news/news", + "|http://ae.hao123.com", + "|http://ar.hao123.com", + "|http://br.hao123.com", + "|http://en.hao123.com", + "|http://id.hao123.com", + "|http://jp.hao123.com", + "|http://ma.hao123.com", + "|http://mx.hao123.com", + "|http://sa.hao123.com", + "|http://th.hao123.com", + "|http://tw.hao123.com", + "|http://vn.hao123.com", + "|http://hk.hao123img.com", + "|http://ld.hao123img.com", + "||happy-vpn.com", + ".haproxy.org", + "||hardsextube.com", + ".harunyahya.com", + "|http://harunyahya.com", + "bbs.hasi.wang", + "have8.com", + "@@||haygo.com", + ".hclips.com", + "||hdlt.me", + "||hdtvb.net", + ".hdzog.com", + "|http://hdzog.com", + "||heartyit.com", + ".heavy-r.com", + ".hec.su", + "|http://hec.su", + ".hecaitou.net", + "||hecaitou.net", + ".hechaji.com", + "||hechaji.com", + "||heeact.edu.tw", + ".hegre-art.com", + "|http://hegre-art.com", + "||cdn.helixstudios.net", + "||helplinfen.com", + "||helloandroid.com", + "||helloqueer.com", + ".helloss.pw", + "hellotxt.com", + "||hellotxt.com", + ".hentai.to", + ".hellouk.org/forum/lofiversion", + ".helpeachpeople.com", + "||helpeachpeople.com", + "||helpster.de", + ".helpzhuling.org", + "hentaitube.tv", + ".hentaivideoworld.com", + "||id.heroku.com", + "heqinglian.net", + "||heungkongdiscuss.com", + ".hexieshe.com", + "||hexieshe.com", + "||hexieshe.xyz", + "||hexxeh.net", + "app.heywire.com", + ".heyzo.com", + ".hgseav.com", + ".hhdcb3office.org", + ".hhthesakyatrizin.org", + "hi-on.org.tw", + "hidden-advent.org", + "||hidden-advent.org", + "hidecloud.com/blog/2008/07/29/fuck-beijing-olympics.html", + "||hide.me", + ".hidein.net", + ".hideipvpn.com", + "||hideipvpn.com", + ".hideman.net", + "||hideman.net", + "hideme.nl", + "||hidemy.name", + ".hidemyass.com", + "||hidemyass.com", + "hidemycomp.com", + "||hidemycomp.com", + ".hihiforum.com", + ".hihistory.net", + "||hihistory.net", + ".higfw.com", + "highpeakspureearth.com", + "||highrockmedia.com", + "||hiitch.com", + "||hikinggfw.org", + ".hilive.tv", + ".himalayan-foundation.org", + "himalayanglacier.com", + ".himemix.com", + "||himemix.com", + ".himemix.net", + "times.hinet.net", + ".hitomi.la", + "|http://hitomi.la", + ".hiwifi.com", + "@@||hiwifi.com", + "hizbuttahrir.org", + "hizb-ut-tahrir.info", + "hizb-ut-tahrir.org", + ".hjclub.info", + ".hk-pub.com/forum", + "|http://hk-pub.com", + ".hk01.com", + "||hk01.com", + ".hk32168.com", + "||hk32168.com", + "||hkacg.com", + "||hkacg.net", + ".hkatvnews.com", + "hkbc.net", + ".hkbf.org", + ".hkbookcity.com", + "||hkbookcity.com", + ".hkchurch.org", + "hkci.org.hk", + ".hkcmi.edu", + "||hkcnews.com", + "||hkcoc.com", + "hkday.net", + ".hkdailynews.com.hk/china.php", + "hkdf.org", + ".hkej.com", + ".hkepc.com/forum/viewthread.php?tid=1153322", + "china.hket.com", + "||hkfaa.com", + "hkfreezone.com", + "hkfront.org", + "m.hkgalden.com", + "|https://m.hkgalden.com", + ".hkgreenradio.org/home", + ".hkheadline.com*blog", + ".hkheadline.com/instantnews", + "hkhkhk.com", + "hkhrc.org.hk", + "hkhrm.org.hk", + "||hkip.org.uk", + "1989report.hkja.org.hk", + "hkjc.com", + ".hkjp.org", + ".hklft.com", + ".hklts.org.hk", + "||hklts.org.hk", + "news.hkpeanut.com", + "hkptu.org", + ".hkreporter.com", + "||hkreporter.com", + "|http://hkupop.hku.hk/", + ".hkusu.net", + "||hkusu.net", + ".hkvwet.com", + ".hkwcc.org.hk", + "||hkzone.org", + ".hmonghot.com", + "|http://hmonghot.com", + ".hmv.co.jp/", + "hnjhj.com", + "||hnjhj.com", + ".hnntube.com", + "||hola.com", + "||hola.org", + "holymountaincn.com", + "holyspiritspeaks.org", + "||holyspiritspeaks.org", + "||derekhsu.homeip.net", + ".homeperversion.com", + "|http://homeservershow.com", + "|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html", + ".hongkongfp.com", + "||hongkongfp.com", + "hongmeimei.com", + "||hongzhi.li", + ".hootsuite.com", + "||hootsuite.com", + ".hopedialogue.org", + "|http://hopedialogue.org", + ".hopto.org", + ".hornygamer.com", + ".hornytrip.com", + "|http://hornytrip.com", + ".hotav.tv", + ".hotels.cn", + "hotfrog.com.tw", + "hotgoo.com", + ".hotpornshow.com", + "hotpot.hk", + ".hotshame.com", + "||hotspotshield.com", + ".hotvpn.com", + "||hotvpn.com", + "||hougaige.com", + "||howtoforge.com", + "||hoxx.com", + ".hqcdp.org", + "||hqcdp.org", + "||hqjapanesesex.com", + "hqmovies.com", + ".hrcir.com", + ".hrcchina.org", + ".hrea.org", + ".hrichina.org", + "||hrichina.org", + ".hrtsea.com", + ".hrw.org", + "||hrw.org", + "hrweb.org", + "||hsjp.net", + "||hsselite.com", + "|http://hst.net.tw", + ".hstern.net", + ".hstt.net", + ".htkou.net", + "||htkou.net", + ".hua-yue.net", + ".huaglad.com", + "||huaglad.com", + ".huanghuagang.org", + "||huanghuagang.org", + ".huangyiyu.com", + ".huaren.us", + "||huaren.us", + ".huaren4us.com", + ".huashangnews.com", + "|http://huashangnews.com", + "bbs.huasing.org", + "huaxia-news.com", + "huaxiabao.org", + "huaxin.ph", + "||huayuworld.org", + ".huffingtonpost.com/rebiya-kadeer", + "||hugoroy.eu", + "||huhaitai.com", + "||huhamhire.com", + "huiyi.in", + ".hulkshare.com", + "humanrightsbriefing.org", + "||hung-ya.com", + "||hungerstrikeforaids.org", + "||huping.net", + "hurgokbayrak.com", + ".hurriyet.com.tr", + ".hut2.ru", + "||hutianyi.net", + "hutong9.net", + "huyandex.com", + ".hwadzan.tw", + "||hwayue.org.tw", + "||hwinfo.com", + "||hxwk.org", + "hxwq.org", + "||hyperrate.com", + "ebook.hyread.com.tw", + "||ebook.hyread.com.tw", + "||i1.hk", + "||i2p2.de", + "||i2runner.com", + "||i818hk.com", + ".i-cable.com", + ".i-part.com.tw", + ".iamtopone.com", + "iask.ca", + "||iask.ca", + "iask.bz", + "||iask.bz", + ".iav19.com", + "ibiblio.org/pub/packages/ccic", + ".iblist.com", + "||iblogserv-f.net", + "ibros.org", + "|http://cn.ibtimes.com", + ".ibvpn.com", + "||ibvpn.com", + "icams.com", + "blogs.icerocket.com/tag", + ".icij.org", + "||icij.org", + "||icl-fi.org", + ".icoco.com", + "||icoco.com", + "||furbo.org", + "||warbler.iconfactory.net", + "||iconpaper.org", + "||icu-project.org", + "w.idaiwan.com/forum", + "||iddddg.com", + "idemocracy.asia", + ".identi.ca", + "||identi.ca", + "||idiomconnection.com", + "|http://www.idlcoyote.com", + ".idouga.com", + ".idreamx.com", + "forum.idsam.com", + ".idv.tw", + ".ieasy5.com", + "|http://ieasy5.com", + ".ied2k.net", + ".ienergy1.com", + "|http://if.ttt/", + "ifanqiang.com", + ".ifcss.org", + "||ifcss.org", + "ifjc.org", + ".ift.tt", + "|http://ift.tt", + "||ifreewares.com", + "||igcd.net", + ".igfw.net", + "||igfw.net", + ".igfw.tech", + "||igfw.tech", + ".igmg.de", + "||ignitedetroit.net", + ".igotmail.com.tw", + "||igvita.com", + "||ihakka.net", + ".ihao.org/dz5", + "||iicns.com", + ".ikstar.com", + "||illusionfactory.com", + "||ilove80.be", + "||im.tv", + "@@||myvlog.im.tv", + "||im88.tw", + ".imgchili.net", + "|http://imgchili.net", + ".imageab.com", + ".imagefap.com", + "||imagefap.com", + "||imageflea.com", + "imageshack.us", + "||imagevenue.com", + "||imagezilla.net", + ".imb.org", + "|http://imb.org", + "|http://www.imdb.com/name/nm0482730", + ".imdb.com/title/tt0819354", + ".imdb.com/title/tt1540068", + ".imdb.com/title/tt4908644", + ".img.ly", + "||img.ly", + ".imgur.com", + "||imgur.com", + ".imkev.com", + "||imkev.com", + ".imlive.com", + ".immoral.jp", + "impact.org.au", + "impp.mn", + "|http://tech2.in.com/video/", + "in99.org", + "in-disguise.com", + ".incapdns.net", + ".incloak.com", + "||incloak.com", + "||incredibox.fr", + "||indiandefensenews.in", + "timesofindia.indiatimes.com/dalai", + "timesofindia.indiatimes.com/defaultinterstitial.cms", + ".indiemerch.com", + "||indiemerch.com", + "info-graf.fr", + "website.informer.com", + ".initiativesforchina.org", + ".inkui.com", + ".inmediahk.net", + "||inmediahk.net", + "||innermongolia.org", + "|http://blog.inoreader.com", + ".inote.tw", + ".insecam.org", + "|http://insecam.org", + "||insidevoa.com", + ".institut-tibetain.org", + "|http://internet.org/", + "internetdefenseleague.org", + "internetfreedom.org", + "||internetpopculture.com", + ".inthenameofconfuciusmovie.com", + "||inthenameofconfuciusmovie.com", + "inxian.com", + "||inxian.com", + "ipalter.com", + ".ipfire.org", + "||iphone4hongkong.com", + "||iphonehacks.com", + "||iphonetaiwan.org", + "||iphonix.fr", + "||ipicture.ru", + ".ipjetable.net", + "||ipjetable.net", + ".ipobar.com/read.php?", + "ipoock.com/img", + ".iportal.me", + "|http://iportal.me", + "||ippotv.com", + ".ipredator.se", + "||ipredator.se", + ".iptv.com.tw", + "||iptvbin.com", + "||ipvanish.com", + "iredmail.org", + "chinese.irib.ir", + "||ironbigfools.compython.net", + "||ironpython.net", + ".ironsocket.com", + "||ironsocket.com", + ".is.gd", + ".islahhaber.net", + ".islam.org.hk", + "|http://islam.org.hk", + ".islamawareness.net/Asia/China", + ".islamhouse.com", + "||islamhouse.com", + ".islamicity.com", + ".islamicpluralism.org", + ".islamtoday.net", + ".isaacmao.com", + "||isaacmao.com", + "||isgreat.org", + "||ismaelan.com", + ".ismalltits.com", + "||ismprofessional.net", + "isohunt.com", + "||israbox.com", + ".issuu.com", + "||issuu.com", + ".istars.co.nz", + "oversea.istarshine.com", + "||oversea.istarshine.com", + "blog.istef.info/2007/10/21/myentunnel", + ".istiqlalhewer.com", + ".istockphoto.com", + "isunaffairs.com", + "isuntv.com", + "itaboo.info", + "||itaboo.info", + ".italiatibet.org", + "download.ithome.com.tw", + "ithelp.ithome.com.tw", + "||itshidden.com", + ".itsky.it", + ".itweet.net", + "|http://itweet.net", + ".iu45.com", + ".iuhrdf.org", + "||iuhrdf.org", + ".iuksky.com", + ".ivacy.com", + "||ivacy.com", + ".iverycd.com", + ".ivpn.net", + "||ixquick.com", + ".ixxx.com", + "iyouport.com", + "||iyouport.com", + ".izaobao.us", + "||gmozomg.izihost.org", + ".izles.net", + ".izlesem.org", + "||j.mp", + "blog.jackjia.com", + "jamaat.org", + ".jamyangnorbu.com", + "|http://jamyangnorbu.com", + ".jandyx.com", + "||janwongphoto.com", + "||japan-whores.com", + ".jav.com", + ".jav101.com", + ".jav2be.com", + "||jav2be.com", + ".jav68.tv", + ".javakiba.org", + "|http://javakiba.org", + ".javbus.com", + "||javbus.com", + "||javfor.me", + ".javhd.com", + ".javhip.com", + ".javmobile.net", + "|http://javmobile.net", + ".javmoo.com", + ".javseen.com", + "|http://javseen.com", + "jbtalks.cc", + "jbtalks.com", + "jbtalks.my", + ".jdwsy.com", + "jeanyim.com", + "||jfqu36.club", + "||jfqu37.xyz", + "||jgoodies.com", + ".jiangweiping.com", + "||jiangweiping.com", + "||jiaoyou8.com", + ".jiehua.cz", + "||hk.jiepang.com", + "||tw.jiepang.com", + "jieshibaobao.com", + ".jigglegifs.com", + "56cun04.jigsy.com", + "jigong1024.com", + "daodu14.jigsy.com", + "specxinzl.jigsy.com", + "wlcnew.jigsy.com", + ".jihadology.net", + "|http://jihadology.net", + "jinbushe.org", + "||jinbushe.org", + ".jingsim.org", + "zhao.jinhai.de", + "jingpin.org", + "||jingpin.org", + "jinpianwang.com", + ".jinroukong.com", + "ac.jiruan.net", + "||jitouch.com", + ".jizzthis.com", + "jjgirls.com", + ".jkb.cc", + "|http://jkb.cc", + "jkforum.net", + "||jma.go.jp", + "research.jmsc.hku.hk/social", + "weiboscope.jmsc.hku.hk", + ".jmscult.com", + "|http://jmscult.com", + "||joachims.org", + "||jobso.tv", + ".sunwinism.joinbbs.net", + ".journalchretien.net", + "||journalofdemocracy.org", + ".joymiihub.com", + ".joyourself.com", + "jpopforum.net", + "||fiddle.jshell.net", + ".jubushoushen.com", + "||jubushoushen.com", + ".juhuaren.com", + "||juliereyc.com", + "||junauza.com", + ".june4commemoration.org", + ".junefourth-20.net", + "||junefourth-20.net", + "||bbs.junglobal.net", + ".juoaa.com", + "|http://juoaa.com", + "justfreevpn.com", + ".justicefortenzin.org", + "justpaste.it", + "justtristan.com", + "juyuange.org", + "juziyue.com", + "||juziyue.com", + "||jwmusic.org", + "@@||music.jwmusic.org", + ".jyxf.net", + "||k-doujin.net", + "||ka-wai.com", + ".kagyu.org", + "||kagyu.org.za", + ".kagyumonlam.org", + ".kagyunews.com.hk", + ".kagyuoffice.org", + "||kagyuoffice.org", + "||kagyuoffice.org.tw", + ".kaiyuan.de", + ".kakao.com", + "||kakao.com", + ".kalachakralugano.org", + ".kankan.today", + ".kannewyork.com", + "||kannewyork.com", + ".kanshifang.com", + "||kanshifang.com", + "||kantie.org", + "kanzhongguo.com", + "kanzhongguo.eu", + ".kaotic.com", + "||karayou.com", + "karkhung.com", + ".karmapa.org", + ".karmapa-teachings.org", + "||kawase.com", + ".kba-tx.org", + ".kcoolonline.com", + ".kebrum.com", + "||kebrum.com", + ".kechara.com", + ".keepandshare.com/visit/visit_page.php?i=688154", + ".keezmovies.com", + ".kendincos.net", + ".kenengba.com", + "||kenengba.com", + "||keontech.net", + ".kepard.com", + "||kepard.com", + "wiki.keso.cn/Home", + "||keycdn.com", + ".khabdha.org", + ".khmusic.com.tw", + "||kichiku-doujinko.com", + ".kik.com", + "||kik.com", + "bbs.kimy.com.tw", + ".kindleren.com", + "|http://kindleren.com", + "|http://www.kindleren.com", + ".kingdomsalvation.org", + "||kingdomsalvation.org", + "kinghost.com", + "||kingstone.com.tw", + ".kink.com", + ".kinokuniya.com", + "||kinokuniya.com", + "killwall.com", + "||killwall.com", + "||kinmen.travel", + ".kir.jp", + ".kissbbao.cn", + "|http://kiwi.kz", + "||kk-whys.co.jp", + ".kmuh.org.tw", + ".knowledgerush.com/kr/encyclopedia", + ".kobo.com", + "||kobo.com", + ".kobobooks.com", + "||kobobooks.com", + "||kodingen.com", + "@@||www.kodingen.com", + "||kompozer.net", + ".konachan.com", + "|http://konachan.com", + ".kone.com", + "||koolsolutions.com", + ".koornk.com", + "||koornk.com", + "||koranmandarin.com", + ".korenan2.com", + "|http://gojet.krtco.com.tw", + ".ksdl.org", + ".ksnews.com.tw", + "||ktzhk.com", + ".kui.name/event", + "kun.im", + ".kurashsultan.com", + "||kurtmunger.com", + "kusocity.com", + "||kwcg.ca", + "kwongwah.com.my", + ".kxsw.life", + "||kxsw.life", + ".kyofun.com", + "kyohk.net", + "||kyoyue.com", + ".kyzyhello.com", + "||kyzyhello.com", + ".kzeng.info", + "||kzeng.info", + "la-forum.org", + "ladbrokes.com", + "||labiennale.org", + ".lagranepoca.com", + "||lagranepoca.com", + ".lalulalu.com", + ".lama.com.tw", + "||lama.com.tw", + ".lamayeshe.com", + "|http://lamayeshe.com", + "|http://www.lamenhu.com", + ".lamnia.co.uk", + "||lamnia.co.uk", + "lamrim.com", + ".lanterncn.cn", + "|http://lanterncn.cn", + ".lantosfoundation.org", + ".laod.cn", + "|http://laod.cn", + "laogai.org", + "||laogai.org", + "laomiu.com", + ".laoyang.info", + "|http://laoyang.info", + "||laptoplockdown.com", + ".laqingdan.net", + "||laqingdan.net", + "||larsgeorge.com", + ".lastcombat.com", + "|http://lastcombat.com", + "||lastfm.es", + "latelinenews.com", + ".latibet.org", + "||le-vpn.com", + ".leafyvpn.net", + "||leafyvpn.net", + "leeao.com.cn/bbs/forum.php", + "lefora.com", + "||left21.hk", + ".legalporno.com", + ".legsjapan.com", + "|http://leirentv.ca", + "leisurecafe.ca", + "||lematin.ch", + ".lemonde.fr", + "||lenwhite.com", + "lerosua.org", + "||lerosua.org", + "blog.lester850.info", + "||lesoir.be", + ".letou.com", + "letscorp.net", + "||letscorp.net", + "||ss.levyhsu.com", + "||cdn.assets.lfpcontent.com", + ".lhakar.org", + "|http://lhakar.org", + ".lhasocialwork.org", + ".liangyou.net", + "||liangyou.net", + ".lianyue.net", + "||liaowangxizang.net", + ".liaowangxizang.net", + "||liberal.org.hk", + ".libertytimes.com.tw", + "blogs.libraryinformationtechnology.com/jxyz", + ".lidecheng.com/blog/fucking-gfw", + ".lighten.org.tw", + ".lightnovel.cn", + "@@|https://www.lightnovel.cn", + "limiao.net", + "linkuswell.com", + "abitno.linpie.com/use-ipv6-to-fuck-gfw", + "||line.me", + "||line-apps.com", + ".linglingfa.com", + "||lingvodics.com", + ".link-o-rama.com", + "|http://link-o-rama.com", + ".linkideo.com", + "||api.linksalpha.com", + "||apidocs.linksalpha.com", + "||www.linksalpha.com", + "||help.linksalpha.com", + "||linux.org.hk", + "linuxtoy.org/archives/installing-west-chamber-on-ubuntu", + ".lionsroar.com", + ".lipuman.com", + "||liquidvpn.com", + "||greatfire.us7.list-manage.com", + "||listentoyoutube.com", + "listorious.com", + ".liu-xiaobo.org", + "||liudejun.com", + ".liuhanyu.com", + ".liujianshu.com", + "||liujianshu.com", + ".liuxiaobo.net", + "|http://liuxiaobo.net", + "liuxiaotong.com", + "||liuxiaotong.com", + ".livedoor.jp", + ".liveleak.com", + "||liveleak.com", + ".livestation.com", + "livestream.com", + "||livestream.com", + "||livingonline.us", + "||livingstream.com", + "||livevideo.com", + ".livevideo.com", + ".liwangyang.com", + "lizhizhuangbi.com", + "lkcn.net", + ".llss.me/", + ".load.to", + ".lobsangwangyal.com", + ".localdomain.ws", + "||localdomain.ws", + "localpresshk.com", + "||lockestek.com", + "logbot.net", + "||logiqx.com", + "secure.logmein.com", + "||secure.logmein.com", + ".londonchinese.ca", + ".longhair.hk", + "longmusic.com", + "||longtermly.net", + "||lookpic.com", + ".looktoronto.com", + "|http://looktoronto.com", + ".lotsawahouse.org/tibetan-masters/fourteenth-dalai-lama", + ".lotuslight.org.hk", + ".lotuslight.org.tw", + "hkreporter.loved.hk", + "||lpsg.com", + "||lrfz.com", + ".lrip.org", + "||lrip.org", + ".lsd.org.hk", + "||lsd.org.hk", + "lsforum.net", + ".lsm.org", + "||lsm.org", + ".lsmchinese.org", + "||lsmchinese.org", + ".lsmkorean.org", + "||lsmkorean.org", + ".lsmradio.com/rad_archives", + ".lsmwebcast.com", + ".ltn.com.tw", + "|http://ltn.com.tw", + ".luke54.com", + ".luke54.org", + ".lupm.org", + "||lupm.org", + "||lushstories.com", + "luxebc.com", + "lvhai.org", + "||lvhai.org", + "||lvv2.com", + ".lyfhk.net", + "|http://lyfhk.net", + ".lzmtnews.org", + "||lzmtnews.org", + "http://*.m-team.cc", + ".macrovpn.com", + "macts.com.tw", + "||mad-ar.ch", + "||madrau.com", + "||madthumbs.com", + "||magic-net.info", + "mahabodhi.org", + "my.mail.ru", + ".maiplus.com", + "|http://maiplus.com", + ".maizhong.org", + "makkahnewspaper.com", + ".mamingzhe.com", + "manicur4ik.ru", + ".maplew.com", + "|http://maplew.com", + "||marc.info", + "marguerite.su", + "||martincartoons.com", + "maskedip.com", + ".maiio.net", + ".mail-archive.com", + ".malaysiakini.com", + "||makemymood.com", + ".manchukuo.net", + ".maniash.com", + "|http://maniash.com", + ".mansion.com", + ".mansionpoker.com", + "||martau.com", + "|http://blog.martinoei.com", + ".martsangkagyuofficial.org", + "|http://martsangkagyuofficial.org", + "maruta.be/forget", + ".marxist.com", + "||marxist.net", + ".marxists.org/chinese", + "||matainja.com", + "||mathable.io", + "||mathiew-badimon.com", + "||matsushimakaede.com", + "|http://maturejp.com", + "mayimayi.com", + ".maxing.jp", + ".mcaf.ee", + "|http://mcaf.ee", + "||mcadforums.com", + "mcfog.com", + "mcreasite.com", + ".md-t.org", + "||md-t.org", + "||meansys.com", + ".media.org.hk", + ".mediachinese.com", + "||mediachinese.com", + ".mediafire.com/?", + ".mediafire.com/download", + ".mediafreakcity.com", + "||mediafreakcity.com", + ".medium.com", + "||medium.com", + ".meetav.com", + "||meetup.com", + "mefeedia.com", + "jihadintel.meforum.org", + "||mega.nz", + "||megaproxy.com", + "||megarotic.com", + "megavideo.com", + "||megurineluka.com", + "meirixiaochao.com", + ".meltoday.com", + ".memehk.com", + "||memehk.com", + "memorybbs.com", + ".memri.org", + ".memrijttm.org", + ".mercyprophet.org", + "|http://mercyprophet.org", + "||mergersandinquisitions.org", + ".meridian-trust.org", + "|http://meridian-trust.org", + ".meripet.biz", + "|http://meripet.biz", + ".meripet.com", + "|http://meripet.com", + "merit-times.com.tw", + "meshrep.com", + ".mesotw.com/bbs", + "metacafe.com/watch", + "||meteorshowersonline.com", + "|http://www.metro.taipei/", + ".metrohk.com.hk/?cmd=detail&categoryID=2", + "||metrolife.ca", + ".metroradio.com.hk", + "|http://metroradio.com.hk", + "meyou.jp", + ".meyul.com", + "||mgoon.com", + "||mgstage.com", + "||mh4u.org", + "mhradio.org", + "|http://michaelanti.com", + "||michaelmarketl.com", + "|http://bbs.mikocon.com", + ".microvpn.com", + "|http://microvpn.com", + "middle-way.net", + ".mihk.hk/forum", + ".mihr.com", + "mihua.org", + "||mikesoltys.com", + ".milph.net", + "|http://milph.net", + ".milsurps.com", + "mimiai.net", + ".mimivip.com", + ".mimivv.com", + ".mindrolling.org", + "|http://mindrolling.org", + ".minghui.or.kr", + "|http://minghui.or.kr", + "minghui.org", + "||minghui.org", + "minghui-a.org", + "minghui-b.org", + "minghui-school.org", + ".mingjinglishi.com", + "||mingjinglishi.com", + "mingjingnews.com", + "||mingjingtimes.com", + ".mingpao.com", + "||mingpao.com", + ".mingpaocanada.com", + ".mingpaomonthly.com", + "|http://mingpaomonthly.com", + "mingpaonews.com", + ".mingpaony.com", + ".mingpaosf.com", + ".mingpaotor.com", + ".mingpaovan.com", + ".mingshengbao.com", + ".minhhue.net", + ".miniforum.org", + ".ministrybooks.org", + ".minzhuhua.net", + "||minzhuhua.net", + "minzhuzhanxian.com", + "minzhuzhongguo.org", + "||miroguide.com", + "mirrorbooks.com", + ".mist.vip", + "thecenter.mit.edu", + ".mitao.com.tw", + ".mitbbs.com", + "||mitbbs.com", + "mitbbsau.com", + ".mixero.com", + "||mixero.com", + "mixpod.com", + ".mixx.com", + "||mixx.com", + "||mizzmona.com", + ".mk5000.com", + ".mlcool.com", + "||mlzs.work", + ".mm-cg.com", + "||mmaaxx.com", + ".mmmca.com", + "mnewstv.com", + "||mobatek.net", + ".mobile01.com", + "||mobile01.com", + "||mobileways.de", + ".mobypicture.com", + "|http://moby.to", + "||moeerolibrary.com", + "wiki.moegirl.org", + ".mofaxiehui.com", + ".mofos.com", + "||mog.com", + "molihua.org", + "||mondex.org", + ".money-link.com.tw", + "|http://money-link.com.tw", + "|http://www.monlamit.org", + ".moonbbs.com", + "||moonbbs.com", + "c1522.mooo.com", + "||monitorchina.org", + "bbs.morbell.com", + "||morningsun.org", + "||moroneta.com", + ".motherless.com", + "|http://motherless.com", + "motor4ik.ru", + ".mousebreaker.com", + ".movements.org", + "||movements.org", + "||moviefap.com", + "||www.moztw.org", + ".mp3buscador.com", + "mp3ye.eu", + "||mpettis.com", + "mpfinance.com", + "mpinews.com", + "mponline.hk", + ".mqxd.org", + "|http://mqxd.org", + "mrtweet.com", + "||mrtweet.com", + "news.hk.msn.com", + "news.msn.com.tw", + "msguancha.com", + ".mswe1.org", + "|http://mswe1.org", + "||mthruf.com", + "muchosucko.com", + "||multiply.com", + "multiproxy.org", + "multiupload.com", + ".mullvad.net", + "||mullvad.net", + ".mummysgold.com", + ".murmur.tw", + "|http://murmur.tw", + ".musicade.net", + ".muslimvideo.com", + "||muzi.com", + "||muzi.net", + "||mx981.com", + ".my-formosa.com", + ".my-proxy.com", + ".my-private-network.co.uk", + "||my-private-network.co.uk", + "forum.my903.com", + ".myactimes.com/actimes", + "||myanniu.com", + ".myaudiocast.com", + "||myaudiocast.com", + ".myav.com.tw/bbs", + ".mybbs.us", + ".myca168.com", + ".mycanadanow.com", + "||bbs.mychat.to", + "||mychinamyhome.com", + ".mychinamyhome.com", + ".mychinanet.com", + ".mychinanews.com", + "||mychinanews.com", + ".mychinese.news", + "||mycnnews.com", + "||mykomica.org", + "mycould.com/discuz", + ".myeasytv.com", + "||myeclipseide.com", + ".myforum.com.hk", + "||myforum.com.hk", + "||myforum.com.uk", + ".myfreecams.com", + ".myfreepaysite.com", + ".myfreshnet.com", + ".myiphide.com", + "||myiphide.com", + "forum.mymaji.com", + "mymediarom.com/files/box", + "||mymoe.moe", + "||mymusic.net.tw", + "||myparagliding.com", + "||mypopescu.com", + "myradio.hk/podcast", + ".myreadingmanga.info", + "mysinablog.com", + ".myspace.com", + "||myspacecdn.com", + ".mytalkbox.com", + ".mytizi.com", + "||naacoalition.org", + "old.nabble.com", + "||naitik.net", + ".nakuz.com/bbs", + "||nalandabodhi.org", + "||nalandawest.org", + ".namgyal.org", + "namgyalmonastery.org", + "||namsisi.com", + ".nanyang.com", + "||nanyang.com", + ".nanyangpost.com", + "||nanyangpost.com", + ".nanzao.com", + "||jpl.nasa.gov", + "||pds.nasa.gov", + "||solarsystem.nasa.gov", + ".nakido.com", + "||nakido.com", + ".naol.ca", + ".naol.cc", + "uighur.narod.ru", + ".nat.moe", + "||nat.moe", + "cyberghost.natado.com", + "||national-lottery.co.uk", + "news.nationalgeographic.com/news/2014/06/140603-tiananmen-square", + ".nationsonline.org/oneworld/tibet", + "||line.naver.jp", + "||navyfamily.navy.mil", + "||navyreserve.navy.mil", + "||nko.navy.mil", + "||usno.navy.mil", + "naweeklytimes.com", + ".nbtvpn.com", + "|http://nbtvpn.com", + "nccwatch.org.tw", + ".nch.com.tw", + ".ncn.org", + "||ncn.org", + "||etools.ncol.com", + ".nde.de", + ".ndr.de", + ".ned.org", + "||nekoslovakia.net", + "||nepusoku.com", + "||net-fits.pro", + "bbs.netbig.com", + ".netbirds.com", + "netcolony.com", + "bolin.netfirms.com", + "||netme.cc", + "netsneak.com", + ".network54.com", + "networkedblogs.com", + ".networktunnel.net", + "neverforget8964.org", + "new-3lunch.net", + ".new-akiba.com", + ".new96.ca", + ".newcenturymc.com", + "|http://newcenturymc.com", + "newcenturynews.com", + "||newchen.com", + ".newchen.com", + ".newgrounds.com", + "newipnow.com", + ".newlandmagazine.com.au", + ".newnews.ca", + "news100.com.tw", + "newschinacomment.org", + ".newscn.org", + "||newscn.org", + "newspeak.cc/story", + ".newsancai.com", + "||newsancai.com", + ".newsdetox.ca", + ".newsdh.com", + "||newstamago.com", + "||newstapa.org", + "newstarnet.com", + ".newtaiwan.com.tw", + "newtalk.tw", + "||newtalk.tw", + "newyorktimes.com", + "||nexon.com", + ".next11.co.jp", + ".nextmag.com.tw", + ".nextmedia.com", + "||nexton-net.jp", + "nexttv.com.tw", + ".nfjtyd.com", + "||co.ng.mil", + "||nga.mil", + "ngensis.com", + ".nhentai.net", + "|http://nhentai.net", + ".nhk-ondemand.jp", + ".nicovideo.jp/watch", + "||nicovideo.jp", + "||nighost.org", + "av.nightlife141.com", + "ninecommentaries.com", + ".ninjacloak.com", + "||ninjaproxy.ninja", + "nintendium.com", + "taiwanyes.ning.com", + "usmgtcg.ning.com/forum", + "||niusnews.com", + "||njactb.org", + "njuice.com", + "||njuice.com", + "nlfreevpn.com", + ".ddns.net/", + ".gooddns.info", + "||gotdns.ch", + ".maildns.xyz", + ".no-ip.org", + ".opendn.xyz", + ".servehttp.com", + "sytes.net", + ".whodns.xyz", + ".zapto.org", + "|http://dynupdate.no-ip.com/", + "||nobel.se", + "nobelprize.org/nobel_prizes/peace/laureates/1989", + "nobelprize.org/nobel_prizes/peace/laureates/2010", + "nobodycanstop.us", + "||nobodycanstop.us", + "||nokogiri.org", + "||nokola.com", + "noodlevpn.com", + ".norbulingka.org", + "nordvpn.com", + "||nordvpn.com", + "||novelasia.com", + ".news.now.com", + "|http://news.now.com", + "news.now.com%2Fhome", + "||nownews.com", + ".nowtorrents.com", + ".noypf.com", + "||noypf.com", + "||npa.go.jp", + ".npnt.me", + "|http://npnt.me", + ".nps.gov", + ".nradio.me", + "|http://nradio.me", + ".nrk.no", + "||nrk.no", + ".ntd.tv", + "||ntd.tv", + ".ntdtv.com", + "||ntdtv.com", + ".ntdtv.co.kr", + "ntdtv.ca", + "ntdtv.org", + "ntdtv.ru", + "ntdtvla.com", + ".ntrfun.com", + "||cbs.ntu.edu.tw", + "||media.nu.nl", + ".nubiles.net", + "||nuexpo.com", + ".nukistream.com", + "||nurgo-software.com", + "||nutaku.net", + ".nuvid.com", + "||nvdst.com", + "nuzcom.com", + ".nvquan.org", + ".nvtongzhisheng.org", + "|http://nvtongzhisheng.org", + ".nwtca.org", + "|http://nyaa.eu", + ".nydus.ca", + "nylon-angel.com", + "nylonstockingsonline.com", + ".nzchinese.com", + "||nzchinese.net.nz", + "observechina.net", + ".obutu.com", + "ocaspro.com", + "occupytiananmen.com", + "oclp.hk", + ".ocreampies.com", + "||october-review.org", + "offbeatchina.com", + "officeoftibet.com", + "|http://ofile.org", + "||ogaoga.org", + "twtr2src.ogaoga.org", + ".ogate.org", + "||ogate.org", + "www2.ohchr.org/english/bodies/cat/docs/ngos/II_China_41.pdf", + ".oikos.com.tw/v4", + ".oiktv.com", + "oizoblog.com", + ".ok.ru", + "||ok.ru", + ".okayfreedom.com", + "||okayfreedom.com", + "okk.tw", + "|http://filmy.olabloga.pl/player", + "old-cat.net", + "||olumpo.com", + ".olympicwatch.org", + "omgili.com", + "||omnitalk.com", + "||omnitalk.org", + "cling.omy.sg", + "forum.omy.sg", + "news.omy.sg", + "showbiz.omy.sg", + "||on.cc", + "||onedrive.live.com", + "||onion.city", + ".onlinecha.com", + "||onlineyoutube.com", + ".onlytweets.com", + "|http://onlytweets.com", + "onmoon.net", + "onmoon.com", + ".onthehunt.com", + "|http://onthehunt.com", + ".oopsforum.com", + "open.com.hk", + "openallweb.com", + "opendemocracy.net", + "||opendemocracy.net", + ".openervpn.in", + "openid.net", + "||openid.net", + ".openleaks.org", + "||openleaks.org", + "openvpn.net", + "||openvpn.net", + "||openwebster.com", + ".openwrt.org.cn", + "@@||openwrt.org.cn", + "my.opera.com/dahema", + "||demo.opera-mini.net", + ".opus-gaming.com", + "|http://opus-gaming.com", + "www.orchidbbs.com", + ".organcare.org.tw", + "organharvestinvestigation.net", + ".orgasm.com", + ".orgfree.com", + "||orient-doll.com", + "orientaldaily.com.my", + "||orientaldaily.com.my", + "||orn.jp", + "t.orzdream.com", + "||t.orzdream.com", + "tui.orzdream.com", + "||orzistic.org", + "||osfoora.com", + ".otnd.org", + "||otnd.org", + "||otto.de", + "||ourdearamy.com", + "oursogo.com", + ".oursteps.com.au", + "||oursteps.com.au", + ".oursweb.net", + "||ourtv.hk", + "xinqimeng.over-blog.com", + "||overplay.net", + "share.ovi.com/media", + "|http://owl.li", + "|http://ht.ly", + "|http://htl.li", + "|http://mash.to", + "www.owind.com", + "|http://www.oxid.it", + "oyax.com", + "oyghan.com/wps", + ".ozchinese.com/bbs", + "||ow.ly", + "bbs.ozchinese.com", + ".ozvoice.org", + "||ozvoice.org", + ".ozxw.com", + ".ozyoyo.com", + "||pachosting.com", + ".pacificpoker.com", + ".packetix.net", + "||pacopacomama.com", + ".padmanet.com", + "page2rss.com", + "||pagodabox.com", + ".palacemoon.com", + "forum.palmislife.com", + "||eriversoft.com", + ".paldengyal.com", + "paljorpublications.com", + ".paltalk.com", + "||pandapow.co", + ".pandapow.net", + ".pandavpn-jp.com", + ".panluan.net", + "||panluan.net", + "||pao-pao.net", + "paper.li", + "paperb.us", + ".paradisehill.cc", + ".paradisepoker.com", + ".partycasino.com", + ".partypoker.com", + ".passion.com", + "||passion.com", + ".passiontimes.hk", + "pastebin.com", + ".pastie.org", + "||pastie.org", + "||blog.pathtosharepoint.com", + "pbs.org/wgbh/pages/frontline/gate", + "pbs.org/wgbh/pages/frontline/tankman", + "pbs.org/wgbh/pages/frontline/tibet", + "video.pbs.org", + "pbwiki.com", + "||pbworks.com", + "||developers.box.net", + "||wiki.oauth.net", + "||wiki.phonegap.com", + "||wiki.jqueryui.com", + "||pbxes.com", + "||pbxes.org", + "pcdvd.com.tw", + ".pchome.com.tw", + "|http://pcij.org", + ".pcstore.com.tw", + "||pct.org.tw", + "pdetails.com", + "||pdproxy.com", + "||peace.ca", + "peacefire.org", + "peacehall.com", + "||peacehall.com", + "|http://pearlher.org", + ".peeasian.com", + ".pekingduck.org", + "||pekingduck.org", + ".pemulihan.or.id", + "|http://pemulihan.or.id", + "||pen.io", + "penchinese.com", + "||penchinese.net", + ".penchinese.net", + "pengyulong.com", + "penisbot.com", + "||blog.pentalogic.net", + ".penthouse.com", + ".pentoy.hk/%E4%B8%AD%E5%9C%8B", + ".pentoy.hk/%E6%99%82%E4%BA%8B", + ".peoplebookcafe.com", + ".peoplenews.tw", + "||peoplenews.tw", + ".peopo.org", + "||peopo.org", + ".percy.in", + ".perfectgirls.net", + "perfectvpn.net", + ".persecutionblog.com", + ".persiankitty.com", + "pfd.org.hk", + "phapluan.org", + "phayul.com", + "philborges.com", + "philly.com", + "||phncdn.com", + "||photodharma.net", + "||photofocus.com", + "||phuquocservices.com", + "||picacomiccn.com", + ".picidae.net", + "||img*.picturedip.com", + "picturesocial.com", + "||pin-cong.com", + ".pin6.com", + "||pin6.com", + ".ping.fm", + "||ping.fm", + "||pinimg.com", + ".pinkrod.com", + "||pinoy-n.com", + "||pinterest.at", + "||pinterest.ca", + "||pinterest.co.kr", + "||pinterest.co.uk", + ".pinterest.com", + "||pinterest.com", + "||pinterest.de", + "||pinterest.dk", + "||pinterest.fr", + "||pinterest.jp", + "||pinterest.nl", + "||pinterest.se", + ".pipii.tv", + ".piposay.com", + "piraattilahti.org", + ".piring.com", + "||pixelqi.com", + "||css.pixnet.in", + "||pixnet.net", + ".pixnet.net", + ".pk.com", + "||placemix.com", + "|http://pictures.playboy.com", + "||playboy.com", + ".playboyplus.com", + "||playboyplus.com", + "||player.fm", + ".playno1.com", + "||playno1.com", + "||playpcesor.com", + "plays.com.tw", + "||m.plixi.com", + "plm.org.hk", + "plunder.com", + ".plurk.com", + "||plurk.com", + ".plus28.com", + ".plusbb.com", + ".pmatehunter.com", + "|http://pmatehunter.com", + ".pmates.com", + "||po2b.com", + "pobieramy.top", + "||podictionary.com", + ".pokerstars.com", + "||pokerstars.com", + ".pokerstars.net", + "zh.pokerstrategy.com", + "politicalchina.org", + "politicalconsultation.org", + ".politiscales.net", + "||poloniex.com", + ".polymerhk.com", + "|http://polymerhk.com", + ".popo.tw", + "||popvote.hk", + ".popyard.com", + "||popyard.org", + ".porn.com", + ".porn2.com", + ".porn5.com", + ".pornbase.org", + ".pornerbros.com", + "||pornhd.com", + ".pornhost.com", + ".pornhub.com", + "||pornhub.com", + ".pornhubdeutsch.net", + "|http://pornhubdeutsch.net", + "||pornmm.net", + ".pornoxo.com", + ".pornrapidshare.com", + "||pornrapidshare.com", + ".pornsharing.com", + "|http://pornsharing.com", + ".pornsocket.com", + ".pornstarclub.com", + "||pornstarclub.com", + ".porntube.com", + ".porntubenews.com", + ".porntvblog.com", + "||porntvblog.com", + ".pornvisit.com", + ".portablevpn.nl", + "||poskotanews.com", + ".post01.com", + ".post76.com", + "||post76.com", + ".post852.com", + "postadult.com", + ".postimg.org", + "||potvpn.com", + "||powercx.com", + ".powerphoto.org", + "||www.powerpointninja.com", + "||presidentlee.tw", + "||cdn.printfriendly.com", + ".pritunl.com", + "provpnaccounts.com", + "||provpnaccounts.com", + ".proxfree.com", + "||proxfree.com", + "proxyanonimo.es", + ".proxynetwork.org.uk", + "||proxynetwork.org.uk", + "||pts.org.tw", + ".pttvan.org", + "pubu.com.tw", + "puffinbrowser.com", + "pureinsight.org", + ".pushchinawall.com", + ".putty.org", + "||putty.org", + "||calebelston.com", + "||blog.fizzik.com", + "||nf.id.au", + "||sogrady.me", + "||vatn.org", + "||ventureswell.com", + "||whereiswerner.com", + ".power.com", + "||power.com", + "powerapple.com", + "||powerapple.com", + "||abc.pp.ru", + "heix.pp.ru", + "||prayforchina.net", + "||premeforwindows7.com", + "||presentationzen.com", + "||prestige-av.com", + "prisoner-state-secret-journal-premier", + ".prisoneralert.com", + "||pritunl.com", + "||privacybox.de", + ".private.com/home", + "||privateinternetaccess.com", + "privatepaste.com", + "||privatepaste.com", + "privatetunnel.com", + "||privatetunnel.com", + "||privatevpn.com", + "||procopytips.com", + "provideocoalition.com", + "||prosiben.de", + "proxifier.com", + "api.proxlet.com", + "||proxomitron.info", + ".proxpn.com", + "||proxpn.com", + ".proxylist.org.uk", + "||proxylist.org.uk", + ".proxypy.net", + "||proxypy.net", + "proxyroad.com", + ".proxytunnel.net", + "||proyectoclubes.com", + "prozz.net", + "psblog.name", + "||psblog.name", + "||psiphon.ca", + ".psiphon3.com", + "||psiphon3.com", + ".psiphontoday.com", + ".ptt.cc", + "||ptt.cc", + ".puffstore.com", + ".puuko.com", + "||pullfolio.com", + ".punyu.com/puny", + "||pureconcepts.net", + "||pureinsight.org", + "||purepdf.com", + "||purevpn.com", + ".purplelotus.org", + ".pursuestar.com", + "||pursuestar.com", + ".pussyspace.com", + ".putihome.org", + ".putlocker.com/file", + "pwned.com", + "python.com", + ".python.com.tw", + "|http://python.com.tw", + "pythonhackers.com/p", + "ss.pythonic.life/", + ".qanote.com", + "||qanote.com", + ".qgirl.com.tw", + "||qiandao.today", + ".qi-gong.me", + "||qi-gong.me", + "||qiangyou.org", + ".qidian.ca", + ".qienkuen.org", + "||qienkuen.org", + "||qiwen.lu", + "qixianglu.cn", + "bbs.qmzdd.com", + ".qkshare.com", + "qoos.com", + "||qoos.com", + "blog.qooza.hk/dafengqixi", + "||efksoft.com", + "||qstatus.com", + "||qtweeter.com", + "||qtrac.eu", + ".quannengshen.org", + "|http://quannengshen.org", + "quantumbooter.net", + "||quitccp.net", + ".quitccp.net", + "||quitccp.org", + ".quitccp.org", + ".quora.com/Chinas-Future", + ".quran.com", + "|http://quran.com", + ".quranexplorer.com", + "qusi8.net", + ".qvodzy.org", + "nemesis2.qx.net/pages/MyEnTunnel", + "qxbbs.org", + ".ra.gg", + "|http://ra.gg/", + ".radicalparty.org", + "||rael.org", + "radicalparty.org", + "radioaustralia.net.au", + ".radiohilight.net", + "||radiohilight.net", + "opml.radiotime.com", + "||radiovaticana.org", + "||radiovncr.com", + "||raggedbanner.com", + "||raidcall.com.tw", + ".raidtalk.com.tw", + ".rainbowplan.org/bbs", + "|https://raindrop.io/", + ".raizoji.or.jp", + "|http://raizoji.or.jp", + "rangwang.biz", + "rangzen.com", + "rangzen.net", + "rangzen.org", + "|http://blog.ranxiang.com/", + "ranyunfei.com", + "||ranyunfei.com", + ".rapbull.net", + "|http://rapidgator.net/", + "||rapidmoviez.com", + "rapidvpn.com", + "||rapidvpn.com", + ".raremovie.cc", + "|http://raremovie.cc", + ".raremovie.net", + "|http://raremovie.net", + "||rawgit.com", + "||rawgithub.com", + "||razyboard.com", + "rcinet.ca", + ".read100.com", + ".readingtimes.com.tw", + "||readingtimes.com.tw", + "||readmoo.com", + ".readydown.com", + "|http://readydown.com", + ".realcourage.org", + ".realitykings.com", + "||realitykings.com", + ".realraptalk.com", + ".realsexpass.com", + ".recordhistory.org", + ".recovery.org.tw", + "|http://online.recoveryversion.org", + "||recoveryversion.com.tw", + "||red-lang.org", + "redballoonsolidarity.org", + ".redchinacn.net", + "|http://redchinacn.net", + "redchinacn.org", + "redtube.com", + "referer.us", + "||referer.us", + "||reflectivecode.com", + "relaxbbs.com", + ".relay.com.tw", + ".releaseinternational.org", + "religioustolerance.org", + "renminbao.com", + "||renminbao.com", + ".renyurenquan.org", + "||renyurenquan.org", + "|http://certificate.revocationcheck.com", + "subacme.rerouted.org", + "||resilio.com", + ".reuters.com", + "||reuters.com", + "||reutersmedia.net", + ".revleft.com", + "retweetist.com", + "||retweetrank.com", + "revver.com", + ".rfa.org", + "||rfa.org", + ".rfachina.com", + ".rfamobile.org", + "rfaweb.org", + "||rferl.org", + ".rfi.fr", + "||rfi.fr", + "|http://rfi.my/", + "|http://vds.rightster.com/", + ".rigpa.org", + ".rileyguide.com", + "riku.me/", + ".ritouki.jp", + "||ritter.vg", + ".rlwlw.com", + "||rlwlw.com", + ".rmjdw.com", + ".rmjdw132.info", + ".roadshow.hk", + ".roboforex.com", + "||robustnessiskey.com", + "||rocket-inc.net", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=5mus", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=freemgl", + "||rojo.com", + "||ronjoneswriter.com", + "||rolia.net", + ".roodo.com", + ".rosechina.net", + ".rotten.com", + ".rsf.org", + "||rsf.org", + ".rsf-chinese.org", + "||rsf-chinese.org", + ".rsgamen.org", + "||phosphation13.rssing.com", + ".rssmeme.com", + "||rssmeme.com", + "||rtalabel.org", + ".rthk.hk", + "|http://rthk.hk", + ".rthk.org.hk", + "|http://rthk.org.hk", + ".rti.org.tw", + "||rti.org.tw", + ".rtycminnesota.org", + ".ruanyifeng.com/blog*some_ways_to_break_the_great_firewall", + "rukor.org", + ".runbtx.com", + ".rushbee.com", + ".ruten.com.tw", + "rutube.ru", + ".ruyiseek.com", + ".rxhj.net", + "|http://rxhj.net", + ".s1s1s1.com", + "||s-cute.com", + ".s-dragon.org", + "||s1heng.com", + "|http://www.s4miniarchive.com", + "||s8forum.com", + "cdn1.lp.saboom.com", + "||sacks.com", + "sacom.hk", + "||sacom.hk", + "||sadpanda.us", + ".safervpn.com", + "||safervpn.com", + ".saintyculture.com", + "|http://saintyculture.com", + ".saiq.me", + "||saiq.me", + "||sakuralive.com", + ".sakya.org", + ".salvation.org.hk", + "||salvation.org.hk", + ".samair.ru/proxy/type-01", + ".sambhota.org", + ".cn.sandscotaicentral.com", + "|http://cn.sandscotaicentral.com", + ".sanmin.com.tw", + "sapikachu.net", + "savemedia.com", + "||savethesounds.info", + ".savetibet.de", + "||savetibet.de", + "savetibet.fr", + "savetibet.nl", + ".savetibet.org", + "||savetibet.org", + "savetibet.ru", + ".savetibetstore.org", + "||savetibetstore.org", + "savevid.com", + "||say2.info", + ".sbme.me", + "|http://sbme.me", + ".sbs.com.au/yourlanguage", + ".scasino.com", + "|http://www.sciencemag.org/content/344/6187/953", + ".sciencenets.com", + ".scmp.com", + "||scmp.com", + ".scmpchinese.com", + "||scramble.io", + ".scribd.com", + "||scribd.com", + "||scriptspot.com", + "seapuff.com", + "domainhelp.search.com", + ".searchtruth.com", + "secretchina.com", + "||secretchina.com", + "||secretgarden.no", + ".secretsline.biz", + "||secretsline.biz", + "||securetunnel.com", + "securityinabox.org", + "|https://securityinabox.org", + ".securitykiss.com", + "||securitykiss.com", + "||seed4.me", + "news.seehua.com", + "seesmic.com", + "||seevpn.com", + "||seezone.net", + "sejie.com", + ".sendspace.com", + "|http://tweets.seraph.me/", + "sesawe.net", + "||sesawe.net", + ".sesawe.org", + "||sethwklein.net", + ".setn.com", + ".settv.com.tw", + "forum.setty.com.tw", + ".sevenload.com", + "||sevenload.com", + ".sex.com", + ".sex-11.com", + "||sex3.com", + "||sex8.cc", + ".sexandsubmission.com", + ".sexbot.com", + ".sexhu.com", + ".sexhuang.com", + "sexinsex.net", + "||sexinsex.net", + ".sextvx.com", + "67.220.91.15", + "67.220.91.18", + "67.220.91.23", + "|http://*.sf.net", + ".sfileydy.com", + "||sfshibao.com", + ".sftindia.org", + ".sftuk.org", + "||sftuk.org", + "||shadeyouvpn.com", + "shadow.ma", + ".shadowsky.xyz", + ".shadowsocks.asia", + "||www.shadowsocks.com", + ".shadowsocks.com", + "||shadowsocks.com.hk", + ".shadowsocks.org", + "||shadowsocks.org", + "||shadowsocks-r.com", + "|http://cn.shafaqna.com", + ".shambalapost.com", + ".shambhalasun.com", + ".shangfang.org", + "||shangfang.org", + "shapeservices.com", + ".sharebee.com", + "||sharecool.org", + "sharpdaily.com.hk", + "||sharpdaily.com.hk", + ".sharpdaily.hk", + ".sharpdaily.tw", + ".shat-tibet.com", + "sheikyermami.com", + ".shellfire.de", + "||shellfire.de", + ".shenshou.org", + "shenyun.com", + "shenyunperformingarts.org", + "||shenyunperformingarts.org", + "shenzhoufilm.com", + "||shenzhoufilm.com", + "||sherabgyaltsen.com", + ".shiatv.net", + ".shicheng.org", + "shinychan.com", + "shipcamouflage.com", + ".shireyishunjian.com", + ".shitaotv.org", + "||shixiao.org", + "||shizhao.org", + "shizhao.org", + "shkspr.mobi/dabr", + "||shodanhq.com", + "||shooshtime.com", + ".shop2000.com.tw", + ".shopping.com", + ".showhaotu.com", + ".showtime.jp", + ".shutterstock.com", + "||shutterstock.com", + "ch.shvoong.com", + ".shwchurch.org", + "||www.shwchurch.org", + ".shwchurch3.com", + "|http://shwchurch3.com", + ".siddharthasintent.org", + "||sidelinesnews.com", + ".sidelinessportseatery.com", + ".sijihuisuo.club", + ".sijihuisuo.com", + ".silkbook.com", + "||simbolostwitter.com", + "simplecd.org", + "||simplecd.org", + "@@||simplecd.me", + "simpleproductivityblog.com", + "bbs.sina.com/", + "bbs.sina.com%2F", + "blog.sina.com.tw", + "dailynews.sina.com/", + "dailynews.sina.com%2F", + "forum.sina.com.hk", + "home.sina.com", + "||magazines.sina.com.tw", + "news.sina.com.hk", + "news.sina.com.tw", + "news.sinchew.com.my", + ".sinchew.com.my/node/", + ".sinchew.com.my/taxonomy/term", + ".singaporepools.com.sg", + "||singaporepools.com.sg", + ".singfortibet.com", + ".singpao.com.hk", + "singtao.com", + "||singtao.com", + "news.singtao.ca", + ".singtaousa.com", + "||singtaousa.com", + "sino-monthly.com", + "||sinocast.com", + "sinocism.com", + "sinomontreal.ca", + ".sinonet.ca", + ".sinopitt.info", + ".sinoants.com", + "||sinoants.com", + ".sinoquebec.com", + ".sierrafriendsoftibet.org", + "sis.xxx", + "||sis001.com", + "sis001.us", + ".site2unblock.com", + "||site90.net", + ".sitebro.tw", + "||sitekreator.com", + "||siteks.uk.to", + "||sitemaps.org", + ".sjrt.org", + "|http://sjrt.org", + "||sjum.cn", + "||sketchappsources.com", + "||skimtube.com", + "||skybet.com", + "|http://users.skynet.be/reves/tibethome.html", + ".skyking.com.tw", + "bbs.skykiwi.com", + "|http://www.skype.com/intl/", + "|http://www.skype.com/zh-Hant", + "||skyvegas.com", + ".xskywalker.com", + "||xskywalker.com", + "||skyxvpn.com", + "m.slandr.net", + ".slaytizle.com", + ".sleazydream.com", + "||slheng.com", + "||slideshare.net", + "forum.slime.com.tw", + ".slinkset.com", + "||slickvpn.com", + ".slutload.com", + "||smartdnsproxy.com", + ".smarthide.com", + "||app.smartmailcloud.com", + "smchbooks.com", + ".smh.com.au/world/death-of-chinese-playboy-leaves-fresh-scratches-in-party-paintwork-20120903-25a8v", + "smhric.org", + ".smith.edu/dalailama", + ".smyxy.org", + "||snapchat.com", + ".snaptu.com", + "||snaptu.com", + "||sndcdn.com", + "sneakme.net", + "snowlionpub.com", + "home.so-net.net.tw/yisa_tsai", + "||soc.mil", + ".socks-proxy.net", + "||socks-proxy.net", + ".sockscap64.com", + "||sockslist.net", + ".socrec.org", + "|http://socrec.org", + ".sod.co.jp", + ".softether.org", + "||softether.org", + ".softether-download.com", + "||softether-download.com", + "||cdn.softlayer.net", + "||sogclub.com", + "sohcradio.com", + "||sohcradio.com", + ".sokmil.com", + "||sorting-algorithms.com", + ".sostibet.org", + ".soumo.info", + "||soup.io", + "@@||static.soup.io", + ".sobees.com", + "||sobees.com", + "socialwhale.com", + ".softether.co.jp", + "||softwarebychuck.com", + "blog.sogoo.org", + "soh.tw", + "||soh.tw", + "sohfrance.org", + "||sohfrance.org", + "chinese.soifind.com", + "sokamonline.com", + ".solidaritetibet.org", + ".solidfiles.com", + "||somee.com", + ".songjianjun.com", + "||songjianjun.com", + ".sonicbbs.cc", + ".sonidodelaesperanza.org", + ".sopcast.com", + ".sopcast.org", + ".sorazone.net", + "||sos.org", + "bbs.sou-tong.org", + ".soubory.com", + "|http://soubory.com", + ".soul-plus.net", + ".soulcaliburhentai.net", + "||soulcaliburhentai.net", + "||soundcloud.com", + ".soundofhope.kr", + "soundofhope.org", + "||soundofhope.org", + "||soupofmedia.com", + "|http://sourceforge.net/p*/shadowsocksgui/", + ".sourcewadio.com", + "southnews.com.tw", + "sowers.org.hk", + "||wlx.sowiki.net", + "||spankbang.com", + ".spankingtube.com", + ".spankwire.com", + "||spb.com", + "||speakerdeck.com", + "||speedify.com", + "spem.at", + "||spencertipping.com", + "||spendee.com", + "||spicevpn.com", + ".spideroak.com", + "||spideroak.com", + ".spike.com", + ".spotflux.com", + "||spotflux.com", + ".spring4u.info", + "|http://spring4u.info", + "||sproutcore.com", + "||sproxy.info", + "||srocket.us", + ".ss-link.com", + "||ss-link.com", + ".ssglobal.co/wp", + "|http://ssglobal.co", + ".ssglobal.me", + "||ssh91.com", + ".sspro.ml", + "|http://sspro.ml", + ".ssrshare.com", + "||ssrshare.com", + "||sss.camp", + "||sstmlt.moe", + "sstmlt.net", + "||sstmlt.net", + "|http://stackoverflow.com/users/895245", + ".stage64.hk", + "||stage64.hk", + "||standupfortibet.org", + "stanford.edu/group/falun", + "usinfo.state.gov", + "||statueofdemocracy.org", + ".starfishfx.com", + ".starp2p.com", + "||starp2p.com", + ".startpage.com", + "||startpage.com", + ".startuplivingchina.com", + "|http://startuplivingchina.com", + "||static-economist.com", + "||stc.com.sa", + "||steel-storm.com", + ".steganos.com", + "||steganos.com", + ".steganos.net", + ".stepchina.com", + "ny.stgloballink.com", + "hd.stheadline.com/news/realtime", + "sthoo.com", + "||sthoo.com", + ".stickam.com", + "stickeraction.com/sesawe", + ".stileproject.com", + ".sto.cc", + ".stoporganharvesting.org", + "||storagenewsletter.com", + ".storm.mg", + "||storm.mg", + ".stoptibetcrisis.net", + "||stoptibetcrisis.net", + "||storify.com", + ".stormmediagroup.com", + "||stoweboyd.com", + "stranabg.com", + "||straplessdildo.com", + "||streamingthe.net", + "streema.com/tv/NTDTV_Chinese", + "cn.streetvoice.com/article", + "cn.streetvoice.com/diary", + "cn2.streetvoice.com", + "tw.streetvoice.com", + ".strikingly.com", + "||strongvpn.com", + ".strongwindpress.com", + ".student.tw/db", + "||studentsforafreetibet.org", + "||stumbleupon.com", + "stupidvideos.com", + ".successfn.com", + "panamapapers.sueddeutsche.de", + ".sugarsync.com", + "||sugarsync.com", + ".sugobbs.com", + "||sugumiru18.com", + "||suissl.com", + "summify.com", + ".sumrando.com", + "||sumrando.com", + "sun1911.com", + ".sunporno.com", + "||sunmedia.ca", + "||sunporno.com", + ".sunskyforum.com", + ".sunta.com.tw", + ".sunvpn.net", + ".suoluo.org", + ".superfreevpn.com", + ".supervpn.net", + "||supervpn.net", + ".superzooi.com", + "|http://superzooi.com", + ".suppig.net", + ".suprememastertv.com", + "|http://suprememastertv.com", + ".surfeasy.com", + "||surfeasy.com", + ".surfeasy.com.au", + "|http://surfeasy.com.au", + "||surrenderat20.net", + ".suyangg.com", + "|http://suyangg.com", + ".svsfx.com", + ".swissinfo.ch", + "||swissinfo.ch", + ".swissvpn.net", + "||swissvpn.net", + "switchvpn.net", + "||switchvpn.net", + ".sydneytoday.com", + "||sydneytoday.com", + ".sylfoundation.org", + "||syncback.com", + "sysresccd.org", + ".sytes.net", + "blog.syx86.com/2009/09/puff", + "blog.syx86.cn/2009/09/puff", + ".szbbs.net", + ".szetowah.org.hk", + "||t-g.com", + ".t35.com", + ".t66y.com", + "||t66y.com", + ".taa-usa.org", + "|http://taa-usa.org", + ".taaze.tw", + "||taaze.tw", + "|http://www.tablesgenerator.com/", + "tabtter.jp", + ".tacem.org", + ".taconet.com.tw", + "||taedp.org.tw", + ".tafm.org", + ".tagwa.org.au", + "tagwalk.com", + "||tagwalk.com", + "tahr.org.tw", + ".taipeisociety.org", + "||taipeisociety.org", + ".taiwanbible.com", + ".taiwancon.com", + ".taiwandaily.net", + "||taiwandaily.net", + ".taiwandc.org", + ".taiwanjustice.com", + "taiwankiss.com", + "taiwannation.com", + "taiwannation.com.tw", + "||taiwanncf.org.tw", + "||taiwannews.com.tw", + "|http://www.taiwanonline.cc/", + "taiwantp.net", + "||taiwantt.org.tw", + "taiwanus.net", + "taiwanyes.com", + "taiwan-sex.com", + ".talk853.com", + ".talkboxapp.com", + "||talkboxapp.com", + ".talkcc.com", + "||talkcc.com", + ".talkonly.net", + "||talkonly.net", + "||tamiaode.tk", + "||tanc.org", + "tangben.com", + ".tangren.us", + ".taoism.net", + "|http://taoism.net", + ".taolun.info", + "||taolun.info", + ".tapatalk.com", + "||tapatalk.com", + "blog.taragana.com", + ".tascn.com.au", + "||taup.net", + "|http://www.taup.org.tw", + ".taweet.com", + "||taweet.com", + ".tbcollege.org", + "||tbcollege.org", + ".tbi.org.hk", + ".tbicn.org", + ".tbjyt.org", + "||tbpic.info", + ".tbrc.org", + "tbs-rainbow.org", + ".tbsec.org", + "||tbsec.org", + "tbskkinabalu.page.tl", + ".tbsmalaysia.org", + ".tbsn.org", + "||tbsn.org", + ".tbsseattle.org", + ".tbssqh.org", + "|http://tbssqh.org", + "tbswd.org", + ".tbtemple.org.uk", + ".tbthouston.org", + ".tccwonline.org", + ".tcewf.org", + "tchrd.org", + "tcnynj.org", + "||tcpspeed.co", + ".tcpspeed.com", + "||tcpspeed.com", + ".tcsofbc.org", + ".tcsovi.org", + ".tdm.com.mo", + "teamamericany.com", + "||techviz.net", + "||teck.in", + ".teeniefuck.net", + "teensinasia.com", + ".telecomspace.com", + "||telegraph.co.uk", + ".tenacy.com", + "||tenzinpalmo.com", + ".tew.org", + ".thaicn.com", + "||theatrum-belli.com", + "theblemish.com", + "||thebcomplex.com", + ".thebobs.com", + "||thebobs.com", + ".thechinabeat.org", + "|http://www.thechinastory.org/yearbooks/yearbook-2012/", + ".thedalailamamovie.com", + "|http://thedalailamamovie.com", + "||thedw.us", + "thefrontier.hk/tf", + "cn.thegay.com", + "|http://thegioitinhoc.vn/", + ".thegly.com", + ".thehots.info", + "thehousenews.com", + "||thehun.net", + ".theinitium.com", + "||theinitium.com", + ".thenewslens.com", + "||thenewslens.com", + ".thepiratebay.org", + "||thepiratebay.org", + ".theporndude.com", + "||theporndude.com", + "||theportalwiki.com", + "thereallove.kr", + "therock.net.nz", + "thespeeder.com", + "||thestandnews.com", + "thetibetcenter.org", + "thetibetconnection.org", + ".thetibetmuseum.org", + ".thetibetpost.com", + "||thetibetpost.com", + "||thetinhat.com", + "thetrotskymovie.com", + "thevivekspot.com", + "||thewgo.org", + ".theync.com", + "|http://theync.com", + ".thinkingtaiwan.com", + ".thisav.com", + "|http://thisav.com", + ".thlib.org", + "||thomasbernhard.org", + ".thongdreams.com", + "threatchaos.com", + "||throughnightsfire.com", + ".thumbzilla.com", + "||thywords.com", + ".thywords.com.tw", + "tiananmenmother.org", + ".tiananmenduizhi.com", + "||tiananmenduizhi.com", + "||tiananmenuniv.com", + "||tiananmenuniv.net", + "||tiandixing.org", + ".tianhuayuan.com", + ".tianlawoffice.com", + "||tianti.io", + "tiantibooks.org", + "||tiantibooks.org", + "tianyantong.org.cn", + ".tianzhu.org", + ".tibet.at", + "tibet.ca", + ".tibet.com", + "||tibet.com", + "tibet.fr", + ".tibet.net", + "||tibet.net", + "tibet.nu", + ".tibet.org", + "||tibet.org", + ".tibet.sk", + "tibet.org.tw", + ".tibet.to", + ".tibet-envoy.eu", + "||tibet-envoy.eu", + ".tibet-foundation.org", + ".tibet-house-trust.co.uk", + "tibet-info.net", + "tibet-initiative.de", + "||tibet-initiative.de", + ".tibet-munich.de", + ".tibet3rdpole.org", + "|http://tibet3rdpole.org", + "tibetaction.net", + "||tibetaction.net", + ".tibetaid.org", + "tibetalk.com", + ".tibetan.fr", + "tibetan-alliance.org", + ".tibetanarts.org", + ".tibetanbuddhistinstitute.org", + "|http://tibetanbuddhistinstitute.org", + "tibetancommunity.org", + ".tibetanjournal.com", + ".tibetanlanguage.org", + ".tibetanliberation.org", + "||tibetanliberation.org", + ".tibetcollection.com", + ".tibetanaidproject.org", + ".tibetancommunityuk.net", + "|http://tibetancommunityuk.net", + "tibetanculture.org", + "tibetanfeministcollective.org", + ".tibetanpaintings.com", + ".tibetanphotoproject.com", + ".tibetanpoliticalreview.org", + ".tibetanreview.net", + "|http://tibetansports.org", + ".tibetanwomen.org", + "|http://tibetanwomen.org", + ".tibetanyouth.org", + ".tibetanyouthcongress.org", + "||tibetanyouthcongress.org", + ".tibetcharity.dk", + "tibetcharity.in", + ".tibetchild.org", + ".tibetcity.com", + ".tibetcorps.org", + ".tibetexpress.net", + "|http://tibetexpress.net", + "tibetfocus.com", + "tibetfund.org", + ".tibetgermany.com", + "||tibetgermany.de", + ".tibethaus.com", + ".tibetheritagefund.org", + "tibethouse.jp", + "tibethouse.org", + "||tibethouse.us", + ".tibetinfonet.net", + ".tibetjustice.org", + ".tibetkomite.dk", + "|http://tibetmuseum.org", + "tibetnetwork.org", + "||tibetnetwork.org", + ".tibetoffice.ch", + "|http://tibetoffice.ch", + "tibetoffice.eu", + "tibetoffice.org", + "tibetonline.com", + "||tibetonline.com", + ".tibetoffice.com.au", + "|http://tibetoffice.com.au", + "||tibetonline.tv", + ".tibetonline.tv", + ".tibetoralhistory.org", + "|http://tibetoralhistory.org", + ".tibetpolicy.eu", + ".tibetrelieffund.co.uk", + "tibetsites.com", + ".tibetsociety.com", + "||tibetsociety.com", + ".tibetsun.com", + ".tibetsupportgroup.org", + "|http://tibetsupportgroup.org", + ".tibetswiss.ch", + ".tibettelegraph.com", + "tibettimes.net", + "||tibetwrites.org", + ".ticket.com.tw", + ".tigervpn.com", + "||tigervpn.com", + ".timdir.com", + "|http://timdir.com", + ".time.com", + "|http://time.com", + ".timsah.com", + "||blog.tiney.com", + "tintuc101.com", + ".tiny.cc", + "|http://tiny.cc", + "tinychat.com", + "||tinypaste.com", + ".tistory.com", + "||tkcs-collins.com", + ".tmagazine.com", + "||tmagazine.com", + ".tmdfish.com", + "|http://tmi.me", + ".tmpp.org", + "|http://tmpp.org", + ".tnaflix.com", + "||tnaflix.com", + ".tngrnow.com", + ".tngrnow.net", + ".tnp.org", + "|http://tnp.org", + ".to-porno.com", + "||to-porno.com", + "togetter.com", + ".tokyo-247.com", + ".tokyo-hot.com", + "||tokyo-porn-tube.com", + "||tokyocn.com", + "tw.tomonews.net", + ".tongil.or.kr", + ".tono-oka.jp", + "tonyyan.net", + ".toodoc.com", + "toonel.net", + "top81.ws", + ".topnews.in", + ".toppornsites.com", + "|http://toppornsites.com", + ".torguard.net", + "||torguard.net", + "||top.tv", + ".topshareware.com", + ".topsy.com", + "||topsy.com", + "||toptip.ca", + "tora.to", + ".torcn.com", + ".torproject.org", + "||torproject.org", + "torrentprivacy.com", + "||torrentprivacy.com", + "|http://torrentproject.se", + "||torrenty.org", + "||torrentz.eu", + "||torvpn.com", + "||totalvpn.com", + ".toutiaoabc.com", + "towngain.com", + "toypark.in", + "toytractorshow.com", + ".tparents.org", + ".tpi.org.tw", + "||tpi.org.tw", + "traffichaus.com", + "||transparency.org", + "||treemall.com.tw", + "trendsmap.com", + "||trendsmap.com", + ".trialofccp.org", + "||trialofccp.org", + ".trimondi.de/SDLE", + ".trouw.nl", + "|http://trouw.nl", + ".trt.net.tr", + "trtc.com.tw", + ".truebuddha-md.org", + "|http://truebuddha-md.org", + "trulyergonomic.com", + ".truth101.co.tv", + "|http://truth101.co.tv", + ".truthontour.org", + "|http://truthontour.org", + ".truveo.com", + ".tsctv.net", + ".tsemtulku.com", + "tsquare.tv", + ".tsu.org.tw", + "tsunagarumon.com", + ".tsctv.net", + "||tt1069.com", + ".tttan.com", + "||tttan.com", + "bb.ttv.com.tw/bb", + "tu8964.com", + ".tubaholic.com", + ".tube.com", + "tube8.com", + "||tube8.com", + ".tube911.com", + "||tube911.com", + ".tubecup.com", + ".tubegals.com", + ".tubeislam.com", + "|http://tubeislam.com", + ".tubestack.com", + "||tubewolf.com", + ".tuibeitu.net", + "tuidang.net", + ".tuidang.org", + "||tuidang.org", + ".tuidang.se", + "bbs.tuitui.info", + ".tumutanzi.com", + "|http://tumutanzi.com", + "||tumview.com", + ".tunein.com", + "|http://tunein.com", + "||tunnelbear.com", + ".tunnelr.com", + "||tunnelr.com", + ".tuo8.blue", + "||tuo8.blue", + ".tuo8.cc", + ".tuo8.club", + "||tuo8.club", + ".tuo8.fit", + ".tuo8.hk", + ".tuo8.in", + ".tuo8.ninja", + ".tuo8.org", + "||tuo8.fit", + "||tuo8.org", + ".tuo8.pw", + "|http://tuo8.pw", + "||tuo8.red", + ".tuo8.space", + "tuitwit.com", + ".turansam.org", + ".turbobit.net", + "|http://turbobit.net", + ".turbohide.com", + "||turbohide.com", + ".tushycash.com", + "|http://tushycash.com", + "||app.tutanota.com", + ".tuvpn.com", + "||tuvpn.com", + "|http://tuzaijidi.com", + "|http://*.tuzaijidi.com", + ".tw01.org", + "|http://tw01.org", + ".tumblr.com", + "||tumblr.com", + "||lecloud.net", + "|http://cosmic.monar.ch", + "||slutmoonbeam.com", + "|http://blog.soylent.com", + ".tv.com", + "|http://tv.com", + "tvants.com", + "forum.tvb.com", + "news.tvb.com/list/world", + "news.tvb.com/local", + "news.tvbs.com.tw", + ".tvboxnow.com", + "|http://tvboxnow.com/", + "tvider.com", + ".tvmost.com.hk", + ".tvplayvideos.com", + "||tvunetworks.com", + ".tw-blog.com", + "|https://tw-blog.com", + ".tw-npo.org", + ".twaitter.com", + "twapperkeeper.com", + "||twapperkeeper.com", + "||twaud.io", + ".twaud.io", + ".twavi.com", + ".twbbs.net.tw", + "twbbs.org", + "twbbs.tw", + "||twblogger.com", + "tweepmag.com", + ".tweepml.org", + "||tweepml.org", + ".tweetbackup.com", + "||tweetbackup.com", + "tweetboard.com", + "||tweetboard.com", + ".tweetboner.biz", + "||tweetboner.biz", + ".tweetcs.com", + "|http://tweetcs.com", + "|http://deck.ly", + "||mtw.tl", + "||tweetedtimes.com", + "||tweetmylast.fm", + "tweetphoto.com", + "||tweetphoto.com", + "||tweetrans.com", + "tweetree.com", + "||tweetree.com", + ".tweettunnel.com", + "||tweettunnel.com", + "||tweetwally.com", + "tweetymail.com", + "||twelve.today", + ".tweez.net", + "|http://tweez.net", + "||twftp.org", + "||twgreatdaily.com", + "twibase.com", + ".twibble.de", + "||twibble.de", + "twibbon.com", + "||twibs.com", + ".twicountry.org", + "|http://twicountry.org", + "twicsy.com", + ".twiends.com", + "|http://twiends.com", + ".twifan.com", + "|http://twifan.com", + "twiffo.com", + "||twiffo.com", + ".twilightsex.com", + "twilog.org", + "twimbow.com", + "||twindexx.com", + "twipple.jp", + "||twipple.jp", + "||twip.me", + "twishort.com", + "||twishort.com", + "twistar.cc", + "||twister.net.co", + "||twisterio.com", + "twisternow.com", + "twistory.net", + "twitbrowser.net", + "||twitcause.com", + "||twitgether.com", + "||twiggit.org", + "twitgoo.com", + "twitiq.com", + "||twitiq.com", + ".twitlonger.com", + "||twitlonger.com", + "|http://tl.gd/", + "twitmania.com", + "twitoaster.com", + "||twitoaster.com", + "||twitonmsn.com", + ".twit2d.com", + "||twit2d.com", + ".twitstat.com", + "||twitstat.com", + "||firstfivefollowers.com", + "||retweeteffect.com", + "||tweeplike.me", + "||tweepguide.com", + "||turbotwitter.com", + ".twitvid.com", + "||twitvid.com", + "|http://twt.tl", + "twittbot.net", + "||ads-twitter.com", + "||twttr.com", + "||twitter4j.org", + ".twittercounter.com", + "||twittercounter.com", + "twitterfeed.com", + ".twittergadget.com", + "||twittergadget.com", + ".twitterkr.com", + "||twitterkr.com", + "||twittermail.com", + "||twitterrific.com", + "twittertim.es", + "||twittertim.es", + "twitthat.com", + "||twitturk.com", + ".twitturly.com", + "||twitturly.com", + ".twitzap.com", + "twiyia.com", + "||twstar.net", + ".twtkr.com", + "|http://twtkr.com", + ".twnorth.org.tw", + "twskype.com", + "twtrland.com", + "twurl.nl", + ".twyac.org", + "||twyac.org", + ".txxx.com", + ".tycool.com", + "||tycool.com", + "||typepad.com", + "@@||www.typepad.com", + "@@||static.typepad.com", + "||blog.expofutures.com", + "||legaltech.law.com", + "||blogs.tampabay.com", + "||contests.twilio.com", + ".embr.in", + "||embr.in", + ".u9un.com", + "||u9un.com", + ".ubddns.org", + "|http://ubddns.org", + "||uberproxy.net", + ".uc-japan.org", + "||uc-japan.org", + ".srcf.ucam.org/salon/", + "|http://china.ucanews.com/", + "||ucdc1998.org", + "|http://hum*.uchicago.edu/faculty/ywang/history", + "||uderzo.it", + ".udn.com", + "||udn.com", + "||udn.com.tw", + "udnbkk.com/bbs", + "||uforadio.com.tw", + "ufreevpn.com", + ".ugo.com", + "||uhdwallpapers.org", + "||uhrp.org", + ".uighur.nl", + "||uighur.nl", + "uighurbiz.net", + ".ulike.net", + "ukcdp.co.uk", + "ukliferadio.co.uk", + "||ukliferadio.co.uk", + "ultravpn.fr", + "||ultravpn.fr", + "ultraxs.com", + "umich.edu/~falun", + "||unblock.cn.com", + ".unblocker.yt", + "unblock-us.com", + "||unblock-us.com", + ".unblockdmm.com", + "|http://unblockdmm.com", + "||unblocksit.es", + "uncyclomedia.org", + ".uncyclopedia.hk/wiki", + "|http://uncyclopedia.hk", + "|http://uncyclopedia.tw", + "underwoodammo.com", + "||underwoodammo.com", + "||unholyknight.com", + ".uni.cc", + "||cldr.unicode.org", + ".unification.net", + ".unification.org.tw", + "||unirule.cloud", + ".unitedsocialpress.com", + ".unix100.com", + "||unknownspace.org", + ".unodedos.com", + "unpo.org", + ".untraceable.us", + "|http://untraceable.us", + "||uocn.org", + "tor.updatestar.com", + ".upholdjustice.org", + ".upload4u.info", + "uploaded.net/file", + "|http://uploaded.net/file", + "|http://uploaded.to/file", + ".uploadstation.com/file", + ".upmedia.mg", + "||upmedia.mg", + ".upornia.com", + "|http://upornia.com", + "||uproxy.org", + "|http://tor.cn.uptodown.com/", + ".upwill.org", + "ur7s.com", + "||urbansurvival.com", + "myshare.url.com.tw/", + "||urlborg.com", + "||urlparser.com", + "us.to", + "||usacn.com", + ".usaip.eu", + "||usaip.eu", + "dalailama.usc.edu", + "iipdigital.usembassy.gov", + "||usfk.mil", + "||usma.edu", + "||usmc.mil", + ".usocctn.com", + "|http://tarr.uspto.gov/", + "||tsdr.uspto.gov", + ".ustream.tv", + "||ustream.tv", + ".usunitednews.com", + "|http://usunitednews.com", + "usus.cc", + ".utopianpal.com", + "||utopianpal.com", + ".uu-gg.com", + ".uvwxyz.xyz", + "||uvwxyz.xyz", + ".uwants.com", + ".uwants.net", + "uyghur.co.uk", + "|http://uyghur-j.org", + "||uyghuramerican.org", + ".uyghurcanadiansociety.org", + ".uyghurensemble.co.uk", + "||uyghurcongress.org", + ".uyghurpen.org", + ".uyghurpress.com", + "|https://uyghurpress.com", + ".uyghurstudies.org", + "|http://uyghurstudies.org", + "uygur.org", + "|http://uymaarip.com/", + ".v2ray.com", + "||v2ray.com", + ".van001.com", + ".van698.com", + ".vanemu.cn", + ".vanilla-jp.com", + ".vanpeople.com", + "vansky.com", + "||vaticannews.va", + "||vcf-online.org", + "||vcfbuilder.org", + ".vegasred.com", + ".velkaepocha.sk", + ".venbbs.com", + ".venchina.com", + ".venetianmacao.com", + "||venetianmacao.com", + "veoh.com", + "mysite.verizon.net", + "vermonttibet.org", + ".versavpn.com", + "||versavpn.com", + "||verybs.com", + ".vft.com.tw", + ".viber.com", + "||viber.com", + ".vica.info", + ".victimsofcommunism.org", + "|http://victimsofcommunism.org", + "||vid.me", + "||vidble.com", + "videobam.com", + "||videobam.com", + ".videodetective.com", + ".videomega.tv", + "||videomega.tv", + ".videomo.com", + "videopediaworld.com", + ".videopress.com", + ".vidinfo.org/video", + "vietdaikynguyen.com", + ".vijayatemple.org", + "vimeo.com", + "||vimeo.com", + "||vimperator.org", + "||vincnd.com", + "||vinniev.com", + "|http://www.lib.virginia.edu/area-studies/Tibet/tibet.html", + ".virtualrealporn.com", + "||virtualrealporn.com", + "visibletweets.com", + "|http://ny.visiontimes.com", + ".vital247.org", + "||viu.com", + ".vivahentai4u.net", + ".vivatube.com", + ".vivthomas.com", + "||vivthomas.com", + ".vjav.com", + "||vjav.com", + ".vjmedia.com.hk", + ".vllcs.org", + "|http://vllcs.org", + "||vmixcore.com", + "||vnet.link", + "cn.voa.mobi", + "tw.voa.mobi", + ".voachineseblog.com", + "||voachineseblog.com", + "voagd.com", + ".voacantonese.com", + "||voacantonese.com", + "voachinese.com", + "||voachinese.com", + ".voanews.com", + "||voanews.com", + "voatibetan.com", + "||voatibetan.com", + ".voatibetanenglish.com", + "||voatibetanenglish.com", + ".vocativ.com", + "vocn.tv", + ".vot.org", + "||vot.org", + ".vovo2000.com", + "|http://vovo2000.com", + ".voxer.com", + "||voxer.com", + ".voy.com", + "||vpn.ac", + ".vpn4all.com", + "||vpn4all.com", + ".vpnaccount.org", + "|http://vpnaccount.org", + ".vpnaccounts.com", + "||vpnaccounts.com", + ".vpncomparison.org", + ".vpncup.com", + "||vpncup.com", + "vpnbook.com", + ".vpncoupons.com", + "|http://vpncoupons.com", + ".vpndada.com", + "||vpndada.com", + ".vpnfan.com", + "vpnfire.com", + ".vpnfires.biz", + ".vpnforgame.net", + "||vpnforgame.net", + "||vpngate.jp", + ".vpngate.net", + "||vpngate.net", + ".vpngratis.net", + "vpnhq.com", + ".vpnmaster.com", + "||vpnmaster.com", + ".vpnmentor.com", + "||vpnmentor.com", + ".vpninja.net", + "||vpninja.net", + ".vpnintouch.com", + "||vpnintouch.net", + "vpnjack.com", + "||vpnjack.com", + ".vpnpick.com", + "||vpnpick.com", + "||vpnpop.com", + "||vpnpronet.com", + ".vpnreactor.com", + "||vpnreactor.com", + "||vpnreviewz.com", + ".vpnsecure.me", + "||vpnsecure.me", + ".vpnshazam.com", + "||vpnshazam.com", + ".vpnshieldapp.com", + "||vpnshieldapp.com", + ".vpnsp.com", + ".vpntraffic.com", + ".vpntunnel.com", + "||vpntunnel.com", + ".vpnuk.info", + "||vpnuk.info", + "||vpnunlimitedapp.com", + ".vpnvip.com", + "||vpnvip.com", + ".vpnworldwide.com", + ".vporn.com", + "||vporn.com", + ".vpser.net", + "@@||vpser.net", + "vraiesagesse.net", + ".vrmtr.com", + "||vtunnel.com", + "||vuku.cc", + "lists.w3.org/archives/public", + "||w3schools.com", + "||waffle1999.com", + ".wahas.com", + ".waigaobu.com", + "waikeung.org/php_wind", + ".wailaike.net", + ".waiwaier.com", + "|http://waiwaier.com", + "||wallmama.com", + "wallornot.org", + "||wallpapercasa.com", + ".wallproxy.com", + "@@||wallproxy.com.cn", + "||waltermartin.com", + "||waltermartin.org", + "||www.wan-press.org", + "||wanderinghorse.net", + "||wangafu.net", + "||wangjinbo.org", + ".wangjinbo.org", + "wanglixiong.com", + ".wango.org", + "||wango.org", + "wangruoshui.net", + "www.wangruowang.org", + "want-daily.com", + "wapedia.mobi/zhsimp", + "||waselpro.com", + ".watchinese.com", + ".wattpad.com", + "||wattpad.com", + ".makzhou.warehouse333.com", + "washeng.net", + ".watch8x.com", + "||watchmygf.net", + "||wav.tv", + ".wdf5.com", + ".wearehairy.com", + ".wearn.com", + "||wearn.com", + "|http://hkcoc.weather.com.hk", + "||hudatoriq.web.id", + "||web2project.net", + "webbang.net", + ".webevader.org", + ".webfreer.com", + "weblagu.com", + ".webjb.org", + ".webrush.net", + "webs-tv.net", + ".websitepulse.com/help/testtools.china-test", + "|http://www.websnapr.com", + ".webwarper.net", + "|http://webwarper.net", + "webworkerdaily.com", + ".weekmag.info", + "||wefightcensorship.org", + ".wefong.com", + "weiboleak.com", + ".weihuo.org", + "weijingsheng.org", + ".weiming.info", + "||weiming.info", + "weiquanwang.org", + "|http://weisuo.ws", + ".welovecock.com", + ".wemigrate.org", + "|http://wemigrate.org", + "wengewang.com", + "||wengewang.org", + ".wenhui.ch", + "|http://trans.wenweipo.com/gb/", + ".wenxuecity.com", + "||wenxuecity.com", + ".wenyunchao.com", + "||wenyunchao.com", + ".westca.com", + "||westca.com", + "||westernwolves.com", + ".westkit.net", + "||westpoint.edu", + ".westernshugdensociety.org", + "wetpussygames.com", + ".wetplace.com", + "wexiaobo.org", + "||wexiaobo.org", + "wezhiyong.org", + "||wezone.net", + ".wforum.com", + "||wforum.com/", + ".whatblocked.com", + "||whatblocked.com", + ".wheatseeds.org", + "||wheelockslatin.com", + ".whippedass.com", + ".whoer.net", + "||whoer.net", + "whotalking.com", + "whylover.com", + "||whyx.org", + "|http://zh.ecdm.wikia.com", + "|http://evchk.wikia.com", + "fq.wikia.com", + "zh.pttpedia.wikia.com/wiki/%E7%BF%92%E5%8C%85%E5%AD%90%E4%B9%8B%E4%BA%82", + "cn.uncyclopedia.wikia.com", + "zh.uncyclopedia.wikia.com", + "||wikileaks.ch", + "||wikileaks.com", + "||wikileaks.de", + "||wikileaks.eu", + "||wikileaks.lu", + ".wikileaks.org", + "||wikileaks.org", + "||wikileaks.pl", + ".wikileaks-forum.com", + "wildammo.com", + ".williamhill.com", + "||collateralmurder.com", + "||collateralmurder.org", + "wikilivres.info/wiki/%E9%9B%B6%E5%85%AB%E5%AE%AA%E7%AB%A0", + "||wikimapia.org", + "|http://zh.wikisource.org", + "||zh.wikinews.org", + "||ja.wikipedia.org", + "||wikipedia.org", + "||wikiwiki.jp", + "||casino.williamhill.com", + "||sports.williamhill.com", + "||vegas.williamhill.com", + "||willw.net", + "||windowsphoneme.com", + ".windscribe.com", + "||windscribe.com", + "||community.windy.com", + "||wingy.site", + "winning11.com", + "winwhispers.info", + "||wiredbytes.com", + "||wiredpen.com", + ".wisdompubs.org", + ".wisevid.com", + "||wisevid.com", + ".witnessleeteaching.com", + ".witopia.net", + ".wjbk.org", + "||wjbk.org", + "|http://wn.com", + ".wnacg.com", + ".wnacg.org", + ".wo.tc", + "||woeser.com", + "|http://woesermiddle-way.net/", + ".wokar.org", + "|http://wokar.org", + "wolfax.com", + "||wolfax.com", + "||woolyss.com", + "woopie.jp", + "||woopie.jp", + "woopie.tv", + "||woopie.tv", + "||workatruna.com", + ".workerdemo.org.hk", + ".workerempowerment.org", + "||workersthebig.net", + ".worldcat.org", + "worldjournal.com", + ".worldvpn.net", + "||worldvpn.net", + "||videopress.com", + ".wordpress.com", + "|http://*.wordpress.com", + "||chenshan20042005.wordpress.com", + "||chinaview.wordpress.com", + "||cnbbnews.wordpress.com", + "||freedominfonetweb.wordpress.com", + "||hka8964.wordpress.com", + "||hkanews.wordpress.com", + "||hqsbnet.wordpress.com", + "||hqsbonline.wordpress.com", + "||investigating.wordpress.com", + "||jobnewera.wordpress.com", + "||minghuiyw.wordpress.com", + "||wo3ttt.wordpress.com", + "||sujiatun.wordpress.com", + "||xijie.wordpress.com", + "||wp.com", + ".wow.com", + ".wow-life.net", + "||wowlegacy.ml", + "||wowporn.com", + "||wowgirls.com", + ".wowrk.com", + "woxinghuiguo.com", + ".woyaolian.org", + "|http://woyaolian.org", + ".wpoforum.com", + "||wpoforum.com", + ".wqyd.org", + "||wqyd.org", + "wrchina.org", + "wretch.cc", + ".wsj.com", + "||wsj.com", + ".wsj.net", + "||wsj.net", + ".wsjhk.com", + ".wtbn.org", + ".wtfpeople.com", + "wuerkaixi.com", + "||wufafangwen.com", + "wufi.org.tw", + "||wuguoguang.com", + "wujie.net", + "wujieliulan.com", + "||wujieliulan.com", + "wukangrui.net", + "||wuw.red", + "||wuyanblog.com", + ".wwitv.com", + "||wwitv.com", + "wzyboy.im/post/160", + ".x-berry.com", + "||x-berry.com", + "||x-art.com", + "||x-wall.org", + "x1949x.com", + "x365x.com", + "xanga.com", + "||xbabe.com", + ".xbookcn.com", + "||xbookcn.com", + "||xcafe.in", + "||xcity.jp", + ".xcritic.com", + "|http://cdn*.xda-developers.com", + ".xerotica.com", + "destiny.xfiles.to/ubbthreads", + ".xfm.pp.ru", + ".xgmyd.com", + "||xgmyd.com", + "xhamster.com", + "||xhamster.com", + ".xianba.net", + ".xianchawang.net", + ".xianjian.tw", + "|http://xianjian.tw", + ".xianqiao.net", + ".xiaobaiwu.com", + ".xiaochuncnjp.com", + ".xiaod.in", + ".xiaohexie.com", + "||xiaolan.me", + "||xiaoma.org", + "||xiaohexie.com", + "xiezhua.com", + ".xihua.es", + "forum.xinbao.de/forum", + ".xing.com", + "|http://xing.com", + ".xinmiao.com.hk", + "||xinmiao.com.hk", + "xinsheng.net", + "xinshijue.com", + "xinhuanet.org", + "|http://xinyubbs.net", + ".xiongpian.com", + ".xiuren.org", + "xizang-zhiye.org", + "xjp.cc", + "||xjp.cc", + "||xjtravelguide.com", + "xlfmtalk.com", + "||xlfmwz.info", + "||xml-training-guide.com", + "xmovies.com", + "||xnxx.com", + "xpdo.net", + "||xpud.org", + ".xrentdvd.com", + ".xskywalker.net", + "||xtube.com", + "blog.xuite.net", + "vlog.xuite.net", + "xuzhiyong.net", + "||xuchao.org", + "xuchao.net", + "||xuchao.net", + "xvideo.cc", + ".xvideos.com", + "||xvideos.com", + "||xvideos.es", + ".xkiwi.tk/", + ".xxbbx.com", + ".xxlmovies.com", + "||xxx.com", + ".xxx.xxx", + "|http://xxx.xxx", + ".xxxfuckmom.com", + "||xxxx.com.au", + ".xxxymovies.com", + "|http://xxxymovies.com", + "xys.org", + "xysblogs.org", + "xyy69.com", + "xyy69.info", + "||yakbutterblues.com", + "||yam.com", + "||yam.org.tw", + ".yanghengjun.com", + "yangjianli.com", + ".yasni.co.uk", + "||yasni.co.uk", + ".yayabay.com/forum", + ".ydy.com", + ".yeahteentube.com", + "||yeahteentube.com", + "||yecl.net", + "||yeelou.com", + "yeeyi.com", + "yegle.net", + "||yegle.net", + ".yes.xxx", + "||yes123.com.tw", + "||yesasia.com", + "||yesasia.com.hk", + ".yes-news.com", + "|http://yes-news.com", + ".yespornplease.com", + "||yespornplease.com", + "|http://yeyeclub.com", + "||yhcw.net", + ".yibada.com", + ".yibaochina.com", + ".yidio.com", + "||yidio.com", + "yilubbs.com", + "xa.yimg.com", + ".yingsuoss.com", + ".yipub.com", + "||yipub.com", + "yinlei.org/mt", + ".yizhihongxing.com", + ".yobt.com", + ".yobt.tv", + "||yobt.tv", + ".yogichen.org", + "||yogichen.org", + ".yolasite.com", + ".yomiuri.co.jp", + "yong.hu", + ".yorkbbs.ca", + "||youxu.info", + ".youjizz.com", + "||youjizz.com", + ".youmaker.com", + "||youmaker.com", + ".youngpornvideos.com", + "youngspiration.hk", + ".youpai.org", + "||youpai.org", + ".your-freedom.net", + "||yourepeat.com", + ".yourprivatevpn.com", + "||yourprivatevpn.com", + ".yousendit.com", + "||yousendit.com", + ".youthnetradio.org/tmit/forum", + "blog.youthwant.com.tw", + "me.youthwant.com.tw", + "share.youthwant.com.tw", + "topic.youthwant.com.tw", + ".youporn.com", + "||youporn.com", + ".youporngay.com", + "||youporngay.com", + ".yourlisten.com", + "|http://yourlisten.com", + ".yourlust.com", + "|http://yourlust.com", + "youshun12.com", + ".youtubecn.com", + "youversion.com", + "||youversion.com", + "blog.youxu.info/2010/03/14/west-chamber", + "ytht.net", + "yuanming.net", + ".yuanzhengtang.org", + ".yulghun.com", + "||yunchao.net", + "||yuntipub.com", + ".yuvutu.com", + "||yvesgeleyn.com", + ".ywpw.com/forums/history/post/A0/p0/html/227", + "yx51.net", + ".yyii.org", + "||yyii.org", + ".yzzk.com", + "|http://yzzk.com", + "zacebook.com", + ".zalmos.com", + "||zalmos.com", + "||zannel.com", + ".zaobao.com", + "||zaobao.com", + "|http://zaobao.com.sg", + "||zaobao.com.sg", + ".zaozon.com", + "||zdnet.com.tw", + ".zello.com", + "||zello.com", + ".zengjinyan.org", + ".zenmate.com", + "||zenmate.com", + "||zenmate.com.ru", + "||zeronet.io", + "||zeutch.com", + ".zfreet.com", + ".zgsddh.com", + "zgzcjj.net", + ".zhanbin.net", + "||zhanbin.net", + ".zhangboli.net", + "||zhangtianliang.com", + "||zhanlve.org", + "zhenghui.org", + ".zhengjian.org", + "||zhengjian.org", + "zhengwunet.org", + "zhenlibu.info", + "||zhenlibu.info", + ".zhenlibu1984.com", + "||zhenlibu1984.com", + "|http://zhenxiang.biz", + ".zhinengluyou.com", + "zhongguo.ca", + "|http://zhongguorenquan.org", + "zhongguotese.net", + "||zhongguotese.net", + "||zhongmeng.org", + ".zhoushuguang.com", + "||zhreader.com", + ".zhuangbi.me", + "||zhuangbi.me", + ".zhuanxing.cn", + "||zhuatieba.com", + "zhuichaguoji.org", + "||zhuichaguoji.org", + "|http://book.zi5.me", + ".ziddu.com/download", + "||zillionk.com", + ".zinio.com", + "||zinio.com", + ".ziporn.com", + ".zippyshare.com", + ".zkaip.com", + "||zkaip.com", + "realforum.zkiz.com", + "||zmw.cn", + ".zodgame.us", + "zomobo.net", + ".zonaeuropa.com", + "||zonaeuropa.com", + "||zonghexinwen.com", + ".zonghexinwen.net", + "||zoogvpn.com", + "||zootool.com", + ".zoozle.net", + "writer.zoho.com", + "||zorrovpn.com", + "||zpn.im", + "||zspeeder.me", + ".zsrhao.com", + ".zuo.la", + "||zuo.la", + "||zuobiao.me", + ".zuola.com", + "||zuola.com", + "||zvereff.com", + ".zynaima.com", + "zyzc9.com", + ".zzcartoon.com", + "64memo", + "aHR0cHM6Ly95ZWNsLm5ldA", + "freenet", + ".google.*/falun", + "phobos.apple.com*/video", + "q=freedom", + "q%3Dfreedom", + "remembering_tiananmen_20_years", + "search*safeweb", + "q=triangle", + "q%3DTriangle", + "ultrareach", + "ultrasurf", + "@@||aliyun.com", + "@@||baidu.com", + "@@||chinaso.com", + "@@||chinaz.com", + "@@|http://nrch.culture.tw/", + "@@||adservice.google.com", + "@@||dl.google.com", + "@@||kh.google.com", + "@@||khm.google.com", + "@@||khm0.google.com", + "@@||khm1.google.com", + "@@||khm2.google.com", + "@@||khm3.google.com", + "@@||khmdb.google.com", + "@@||tools.google.com", + "@@||clientservices.googleapis.com", + "@@||fonts.googleapis.com", + "@@||khm.googleapis.com", + "@@||khm0.googleapis.com", + "@@||khm1.googleapis.com", + "@@||khm2.googleapis.com", + "@@||khm3.googleapis.com", + "@@||khmdb.googleapis.com", + "@@||storage.googleapis.com", + "@@||translate.googleapis.com", + "@@||update.googleapis.com", + "@@||safebrowsing.googleapis.com", + "@@||cn.gravatar.com", + "@@||connectivitycheck.gstatic.com", + "@@||csi.gstatic.com", + "@@||fonts.gstatic.com", + "@@||ssl.gstatic.com", + "@@||haosou.com", + "@@||ip.cn", + "@@||jike.com", + "@@|http://translate.google.cn", + "@@|http://www.google.cn/maps", + "@@||http2.golang.org", + "@@||gov.cn", + "@@||qq.com", + "@@||sina.cn", + "@@||sina.com.cn", + "@@||sogou.com", + "@@||so.com", + "@@||soso.com", + "@@||uluai.com.cn", + "@@||weibo.com", + "@@||yahoo.cn", + "@@||youdao.com", + "@@||zhongsou.com", + "@@|http://ime.baidu.jp" +]; + +/* +* This file is part of Adblock Plus , +* Copyright (C) 2006-2014 Eyeo GmbH +* +* Adblock Plus is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 3 as +* published by the Free Software Foundation. +* +* Adblock Plus is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Adblock Plus. If not, see . +*/ + +function createDict() +{ + var result = {}; + result.__proto__ = null; + return result; +} + +function getOwnPropertyDescriptor(obj, key) +{ + if (obj.hasOwnProperty(key)) + { + return obj[key]; + } + return null; +} + +function extend(subclass, superclass, definition) +{ + if (Object.__proto__) + { + definition.__proto__ = superclass.prototype; + subclass.prototype = definition; + } + else + { + var tmpclass = function(){}, ret; + tmpclass.prototype = superclass.prototype; + subclass.prototype = new tmpclass(); + subclass.prototype.constructor = superclass; + for (var i in definition) + { + if (definition.hasOwnProperty(i)) + { + subclass.prototype[i] = definition[i]; + } + } + } +} + +function Filter(text) +{ + this.text = text; + this.subscriptions = []; +} +Filter.prototype = { + text: null, + subscriptions: null, + toString: function() + { + return this.text; + } +}; +Filter.knownFilters = createDict(); +Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; +Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; +Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; +Filter.fromText = function(text) +{ + if (text in Filter.knownFilters) + { + return Filter.knownFilters[text]; + } + var ret; + if (text.charAt(0) == "!") + { + ret = new CommentFilter(text); + } + else + { + ret = RegExpFilter.fromText(text); + } + Filter.knownFilters[ret.text] = ret; + return ret; +}; + +function InvalidFilter(text, reason) +{ + Filter.call(this, text); + this.reason = reason; +} +extend(InvalidFilter, Filter, { + reason: null +}); + +function CommentFilter(text) +{ + Filter.call(this, text); +} +extend(CommentFilter, Filter, { +}); + +function ActiveFilter(text, domains) +{ + Filter.call(this, text); + this.domainSource = domains; +} +extend(ActiveFilter, Filter, { + domainSource: null, + domainSeparator: null, + ignoreTrailingDot: true, + domainSourceIsUpperCase: false, + getDomains: function() + { + var prop = getOwnPropertyDescriptor(this, "domains"); + if (prop) + { + return prop; + } + var domains = null; + if (this.domainSource) + { + var source = this.domainSource; + if (!this.domainSourceIsUpperCase) + { + source = source.toUpperCase(); + } + var list = source.split(this.domainSeparator); + if (list.length == 1 && (list[0]).charAt(0) != "~") + { + domains = createDict(); + domains[""] = false; + if (this.ignoreTrailingDot) + { + list[0] = list[0].replace(/\.+$/, ""); + } + domains[list[0]] = true; + } + else + { + var hasIncludes = false; + for (var i = 0; i < list.length; i++) + { + var domain = list[i]; + if (this.ignoreTrailingDot) + { + domain = domain.replace(/\.+$/, ""); + } + if (domain == "") + { + continue; + } + var include; + if (domain.charAt(0) == "~") + { + include = false; + domain = domain.substr(1); + } + else + { + include = true; + hasIncludes = true; + } + if (!domains) + { + domains = createDict(); + } + domains[domain] = include; + } + domains[""] = !hasIncludes; + } + this.domainSource = null; + } + return this.domains; + }, + sitekeys: null, + isActiveOnDomain: function(docDomain, sitekey) + { + if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) + { + return false; + } + if (!this.getDomains()) + { + return true; + } + if (!docDomain) + { + return this.getDomains()[""]; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + while (true) + { + if (docDomain in this.getDomains()) + { + return this.domains[docDomain]; + } + var nextDot = docDomain.indexOf("."); + if (nextDot < 0) + { + break; + } + docDomain = docDomain.substr(nextDot + 1); + } + return this.domains[""]; + }, + isActiveOnlyOnDomain: function(docDomain) + { + if (!docDomain || !this.getDomains() || this.getDomains()[""]) + { + return false; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + for (var domain in this.getDomains()) + { + if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) + { + return false; + } + } + return true; + } +}); + +function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + ActiveFilter.call(this, text, domains, sitekeys); + if (contentType != null) + { + this.contentType = contentType; + } + if (matchCase) + { + this.matchCase = matchCase; + } + if (thirdParty != null) + { + this.thirdParty = thirdParty; + } + if (sitekeys != null) + { + this.sitekeySource = sitekeys; + } + if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") + { + var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); + this.regexp = regexp; + } + else + { + this.regexpSource = regexpSource; + } +} +extend(RegExpFilter, ActiveFilter, { + domainSourceIsUpperCase: true, + length: 1, + domainSeparator: "|", + regexpSource: null, + getRegexp: function() + { + var prop = getOwnPropertyDescriptor(this, "regexp"); + if (prop) + { + return prop; + } + var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); + var regexp = new RegExp(source, this.matchCase ? "" : "i"); + this.regexp = regexp; + return regexp; + }, + contentType: 2147483647, + matchCase: false, + thirdParty: null, + sitekeySource: null, + getSitekeys: function() + { + var prop = getOwnPropertyDescriptor(this, "sitekeys"); + if (prop) + { + return prop; + } + var sitekeys = null; + if (this.sitekeySource) + { + sitekeys = this.sitekeySource.split("|"); + this.sitekeySource = null; + } + this.sitekeys = sitekeys; + return this.sitekeys; + }, + matches: function(location, contentType, docDomain, thirdParty, sitekey) + { + if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) + { + return true; + } + return false; + } +}); +RegExpFilter.prototype["0"] = "#this"; +RegExpFilter.fromText = function(text) +{ + var blocking = true; + var origText = text; + if (text.indexOf("@@") == 0) + { + blocking = false; + text = text.substr(2); + } + var contentType = null; + var matchCase = null; + var domains = null; + var sitekeys = null; + var thirdParty = null; + var collapse = null; + var options; + var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; + if (match) + { + options = match[1].toUpperCase().split(","); + text = match.input.substr(0, match.index); + for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) + { + var option = options[_loopIndex6]; + var value = null; + var separatorIndex = option.indexOf("="); + if (separatorIndex >= 0) + { + value = option.substr(separatorIndex + 1); + option = option.substr(0, separatorIndex); + } + option = option.replace(/-/, "_"); + if (option in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = 0; + } + contentType |= RegExpFilter.typeMap[option]; + } + else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap[option.substr(1)]; + } + else if (option == "MATCH_CASE") + { + matchCase = true; + } + else if (option == "~MATCH_CASE") + { + matchCase = false; + } + else if (option == "DOMAIN" && typeof value != "undefined") + { + domains = value; + } + else if (option == "THIRD_PARTY") + { + thirdParty = true; + } + else if (option == "~THIRD_PARTY") + { + thirdParty = false; + } + else if (option == "COLLAPSE") + { + collapse = true; + } + else if (option == "~COLLAPSE") + { + collapse = false; + } + else if (option == "SITEKEY" && typeof value != "undefined") + { + sitekeys = value; + } + else + { + return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); + } + } + } + if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap.DOCUMENT; + } + try + { + if (blocking) + { + return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); + } + else + { + return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); + } + } + catch (e) + { + return new InvalidFilter(origText, e); + } +}; +RegExpFilter.typeMap = { + OTHER: 1, + SCRIPT: 2, + IMAGE: 4, + STYLESHEET: 8, + OBJECT: 16, + SUBDOCUMENT: 32, + DOCUMENT: 64, + XBL: 1, + PING: 1, + XMLHTTPREQUEST: 2048, + OBJECT_SUBREQUEST: 4096, + DTD: 1, + MEDIA: 16384, + FONT: 32768, + BACKGROUND: 4, + POPUP: 268435456, + ELEMHIDE: 1073741824 +}; +RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); + +function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + this.collapse = collapse; +} +extend(BlockingFilter, RegExpFilter, { + collapse: null +}); + +function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); +} +extend(WhitelistFilter, RegExpFilter, { +}); + +function Matcher() +{ + this.clear(); +} +Matcher.prototype = { + filterByKeyword: null, + keywordByFilter: null, + clear: function() + { + this.filterByKeyword = createDict(); + this.keywordByFilter = createDict(); + }, + add: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return; + } + var keyword = this.findKeyword(filter); + var oldEntry = this.filterByKeyword[keyword]; + if (typeof oldEntry == "undefined") + { + this.filterByKeyword[keyword] = filter; + } + else if (oldEntry.length == 1) + { + this.filterByKeyword[keyword] = [oldEntry, filter]; + } + else + { + oldEntry.push(filter); + } + this.keywordByFilter[filter.text] = keyword; + }, + remove: function(filter) + { + if (!(filter.text in this.keywordByFilter)) + { + return; + } + var keyword = this.keywordByFilter[filter.text]; + var list = this.filterByKeyword[keyword]; + if (list.length <= 1) + { + delete this.filterByKeyword[keyword]; + } + else + { + var index = list.indexOf(filter); + if (index >= 0) + { + list.splice(index, 1); + if (list.length == 1) + { + this.filterByKeyword[keyword] = list[0]; + } + } + } + delete this.keywordByFilter[filter.text]; + }, + findKeyword: function(filter) + { + var result = ""; + var text = filter.text; + if (Filter.regexpRegExp.test(text)) + { + return result; + } + var match = Filter.optionsRegExp.exec(text); + if (match) + { + text = match.input.substr(0, match.index); + } + if (text.substr(0, 2) == "@@") + { + text = text.substr(2); + } + var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); + if (!candidates) + { + return result; + } + var hash = this.filterByKeyword; + var resultCount = 16777215; + var resultLength = 0; + for (var i = 0, l = candidates.length; i < l; i++) + { + var candidate = candidates[i].substr(1); + var count = candidate in hash ? hash[candidate].length : 0; + if (count < resultCount || count == resultCount && candidate.length > resultLength) + { + result = candidate; + resultCount = count; + resultLength = candidate.length; + } + } + return result; + }, + hasFilter: function(filter) + { + return filter.text in this.keywordByFilter; + }, + getKeywordForFilter: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return this.keywordByFilter[filter.text]; + } + else + { + return null; + } + }, + _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) + { + var list = this.filterByKeyword[keyword]; + for (var i = 0; i < list.length; i++) + { + var filter = list[i]; + if (filter == "#this") + { + filter = list; + } + if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) + { + return filter; + } + } + return null; + }, + matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.filterByKeyword) + { + var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + } + return null; + } +}; + +function CombinedMatcher() +{ + this.blacklist = new Matcher(); + this.whitelist = new Matcher(); + this.resultCache = createDict(); +} +CombinedMatcher.maxCacheEntries = 1000; +CombinedMatcher.prototype = { + blacklist: null, + whitelist: null, + resultCache: null, + cacheEntries: 0, + clear: function() + { + this.blacklist.clear(); + this.whitelist.clear(); + this.resultCache = createDict(); + this.cacheEntries = 0; + }, + add: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.add(filter); + } + else + { + this.blacklist.add(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + remove: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.remove(filter); + } + else + { + this.blacklist.remove(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + findKeyword: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.findKeyword(filter); + } + else + { + return this.blacklist.findKeyword(filter); + } + }, + hasFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.hasFilter(filter); + } + else + { + return this.blacklist.hasFilter(filter); + } + }, + getKeywordForFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.getKeywordForFilter(filter); + } + else + { + return this.blacklist.getKeywordForFilter(filter); + } + }, + isSlowFilter: function(filter) + { + var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; + if (matcher.hasFilter(filter)) + { + return !matcher.getKeywordForFilter(filter); + } + else + { + return !matcher.findKeyword(filter); + } + }, + matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + var blacklistHit = null; + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.whitelist.filterByKeyword) + { + var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + if (substr in this.blacklist.filterByKeyword && blacklistHit === null) + { + blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + } + } + return blacklistHit; + }, + matchesAny: function(location, docDomain) + { + var key = location + " " + docDomain + " "; + if (key in this.resultCache) + { + return this.resultCache[key]; + } + var result = this.matchesAnyInternal(location, 0, docDomain, null, null); + if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + this.resultCache[key] = result; + this.cacheEntries++; + return result; + } +}; +var defaultMatcher = new CombinedMatcher(); + +var direct = 'DIRECT;'; + +for (var i = 0; i < rules.length; i++) { + defaultMatcher.add(Filter.fromText(rules[i])); +} + +function FindProxyForURL(url, host) { + if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { + return proxy; + } + return direct; +} diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz new file mode 100644 index 0000000000..4020d6a664 Binary files /dev/null and b/v2rayN/v2rayN/Resources/pac.txt.gz differ diff --git a/v2rayN/v2rayN/Resources/privoxy.exe.gz b/v2rayN/v2rayN/Resources/privoxy.exe.gz new file mode 100644 index 0000000000..f42c68d7fe Binary files /dev/null and b/v2rayN/v2rayN/Resources/privoxy.exe.gz differ diff --git a/v2rayN/v2rayN/Resources/privoxy_conf.txt b/v2rayN/v2rayN/Resources/privoxy_conf.txt new file mode 100644 index 0000000000..b218fc5708 --- /dev/null +++ b/v2rayN/v2rayN/Resources/privoxy_conf.txt @@ -0,0 +1,7 @@ +listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ +toggle 0 +logfile v2ray_privoxy.log +show-on-task-bar 0 +activity-animation 0 +forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . +hide-console diff --git a/v2rayN/v2rayN/Resources/promotion.png b/v2rayN/v2rayN/Resources/promotion.png new file mode 100644 index 0000000000..e7b6251f25 Binary files /dev/null and b/v2rayN/v2rayN/Resources/promotion.png differ diff --git a/v2rayN/v2rayN/Resources/restart.png b/v2rayN/v2rayN/Resources/restart.png new file mode 100644 index 0000000000..1c0e0ca60e Binary files /dev/null and b/v2rayN/v2rayN/Resources/restart.png differ diff --git a/v2rayN/v2rayN/Resources/server.png b/v2rayN/v2rayN/Resources/server.png new file mode 100644 index 0000000000..ee3b697096 Binary files /dev/null and b/v2rayN/v2rayN/Resources/server.png differ diff --git a/v2rayN/v2rayN/Resources/sub.png b/v2rayN/v2rayN/Resources/sub.png new file mode 100644 index 0000000000..c60b5b3584 Binary files /dev/null and b/v2rayN/v2rayN/Resources/sub.png differ diff --git a/v2rayN/v2rayN/Resources/sysproxy.exe.gz b/v2rayN/v2rayN/Resources/sysproxy.exe.gz new file mode 100644 index 0000000000..980d304b0c Binary files /dev/null and b/v2rayN/v2rayN/Resources/sysproxy.exe.gz differ diff --git a/v2rayN/v2rayN/Resources/sysproxy64.exe.gz b/v2rayN/v2rayN/Resources/sysproxy64.exe.gz new file mode 100644 index 0000000000..c5ff36af39 Binary files /dev/null and b/v2rayN/v2rayN/Resources/sysproxy64.exe.gz differ diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs new file mode 100644 index 0000000000..c580c02bd1 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -0,0 +1,667 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Resx { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class ResUI { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResUI() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Resx.ResUI", typeof(ResUI).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 + /// + internal static string BatchExportSubscriptionSuccessfully { + get { + return ResourceManager.GetString("BatchExportSubscriptionSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。 + /// + internal static string BatchExportURLSuccessfully { + get { + return ResourceManager.GetString("BatchExportURLSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Please check the server settings first 的本地化字符串。 + /// + internal static string CheckServerSettings { + get { + return ResourceManager.GetString("CheckServerSettings", resourceCulture); + } + } + + /// + /// 查找类似 configuration format is incorrect 的本地化字符串。 + /// + internal static string ConfigurationFormatIncorrect { + get { + return ResourceManager.GetString("ConfigurationFormatIncorrect", resourceCulture); + } + } + + /// + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. 的本地化字符串。 + /// + internal static string CustomServerTips { + get { + return ResourceManager.GetString("CustomServerTips", resourceCulture); + } + } + + /// + /// 查找类似 Whether to download? {0} 的本地化字符串。 + /// + internal static string DownloadYesNo { + get { + return ResourceManager.GetString("DownloadYesNo", resourceCulture); + } + } + + /// + /// 查找类似 Failed to convert configuration file 的本地化字符串。 + /// + internal static string FailedConversionConfiguration { + get { + return ResourceManager.GetString("FailedConversionConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to generate default configuration file 的本地化字符串。 + /// + internal static string FailedGenDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGenDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to get the default configuration 的本地化字符串。 + /// + internal static string FailedGetDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGetDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import custom configuration server 的本地化字符串。 + /// + internal static string FailedImportedCustomServer { + get { + return ResourceManager.GetString("FailedImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Failed to read configuration file 的本地化字符串。 + /// + internal static string FailedReadConfiguration { + get { + return ResourceManager.GetString("FailedReadConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct format extra ID 的本地化字符串。 + /// + internal static string FillCorrectAlterId { + get { + return ResourceManager.GetString("FillCorrectAlterId", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct format server port 的本地化字符串。 + /// + internal static string FillCorrectServerPort { + get { + return ResourceManager.GetString("FillCorrectServerPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。 + /// + internal static string FillKcpParameters { + get { + return ResourceManager.GetString("FillKcpParameters", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the local listening port 的本地化字符串。 + /// + internal static string FillLocalListeningPort { + get { + return ResourceManager.GetString("FillLocalListeningPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the password 的本地化字符串。 + /// + internal static string FillPassword { + get { + return ResourceManager.GetString("FillPassword", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the server address 的本地化字符串。 + /// + internal static string FillServerAddress { + get { + return ResourceManager.GetString("FillServerAddress", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the user ID 的本地化字符串。 + /// + internal static string FillUUID { + get { + return ResourceManager.GetString("FillUUID", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct client configuration file, please check 的本地化字符串。 + /// + internal static string IncorrectClientConfiguration { + get { + return ResourceManager.GetString("IncorrectClientConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct configuration, please check 的本地化字符串。 + /// + internal static string Incorrectconfiguration { + get { + return ResourceManager.GetString("Incorrectconfiguration", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct server configuration file, please check 的本地化字符串。 + /// + internal static string IncorrectServerConfiguration { + get { + return ResourceManager.GetString("IncorrectServerConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Initial Configuration 的本地化字符串。 + /// + internal static string InitialConfiguration { + get { + return ResourceManager.GetString("InitialConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Address 的本地化字符串。 + /// + internal static string LvAddress { + get { + return ResourceManager.GetString("LvAddress", resourceCulture); + } + } + + /// + /// 查找类似 Alias 的本地化字符串。 + /// + internal static string LvAlias { + get { + return ResourceManager.GetString("LvAlias", resourceCulture); + } + } + + /// + /// 查找类似 Security 的本地化字符串。 + /// + internal static string LvEncryptionMethod { + get { + return ResourceManager.GetString("LvEncryptionMethod", resourceCulture); + } + } + + /// + /// 查找类似 Port 的本地化字符串。 + /// + internal static string LvPort { + get { + return ResourceManager.GetString("LvPort", resourceCulture); + } + } + + /// + /// 查找类似 Type 的本地化字符串。 + /// + internal static string LvServiceType { + get { + return ResourceManager.GetString("LvServiceType", resourceCulture); + } + } + + /// + /// 查找类似 Subs 的本地化字符串。 + /// + internal static string LvSubscription { + get { + return ResourceManager.GetString("LvSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Test Results 的本地化字符串。 + /// + internal static string LvTestResults { + get { + return ResourceManager.GetString("LvTestResults", resourceCulture); + } + } + + /// + /// 查找类似 Transport 的本地化字符串。 + /// + internal static string LvTransportProtocol { + get { + return ResourceManager.GetString("LvTransportProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Clear original subscription content 的本地化字符串。 + /// + internal static string MsgClearSubscription { + get { + return ResourceManager.GetString("MsgClearSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Download V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgDownloadV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import subscription content 的本地化字符串。 + /// + internal static string MsgFailedImportSubscription { + get { + return ResourceManager.GetString("MsgFailedImportSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Get the subscription content successfully 的本地化字符串。 + /// + internal static string MsgGetSubscriptionSuccessfully { + get { + return ResourceManager.GetString("MsgGetSubscriptionSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 No valid subscriptions set 的本地化字符串。 + /// + internal static string MsgNoValidSubscription { + get { + return ResourceManager.GetString("MsgNoValidSubscription", resourceCulture); + } + } + + /// + /// 查找类似 PAC update failed 的本地化字符串。 + /// + internal static string MsgPACUpdateFailed { + get { + return ResourceManager.GetString("MsgPACUpdateFailed", resourceCulture); + } + } + + /// + /// 查找类似 PAC update succeeded 的本地化字符串。 + /// + internal static string MsgPACUpdateSuccessfully { + get { + return ResourceManager.GetString("MsgPACUpdateSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Resolve V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgParsingV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgParsingV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Simplify PAC Success 的本地化字符串。 + /// + internal static string MsgSimplifyPAC { + get { + return ResourceManager.GetString("MsgSimplifyPAC", resourceCulture); + } + } + + /// + /// 查找类似 Start getting subscriptions 的本地化字符串。 + /// + internal static string MsgStartGettingSubscriptions { + get { + return ResourceManager.GetString("MsgStartGettingSubscriptions", resourceCulture); + } + } + + /// + /// 查找类似 Start updating PAC... 的本地化字符串。 + /// + internal static string MsgStartUpdatingPAC { + get { + return ResourceManager.GetString("MsgStartUpdatingPAC", resourceCulture); + } + } + + /// + /// 查找类似 Start updating V2rayCore... 的本地化字符串。 + /// + internal static string MsgStartUpdatingV2rayCore { + get { + return ResourceManager.GetString("MsgStartUpdatingV2rayCore", resourceCulture); + } + } + + /// + /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 + /// + internal static string MsgSubscriptionDecodingFailed { + get { + return ResourceManager.GetString("MsgSubscriptionDecodingFailed", resourceCulture); + } + } + + /// + /// 查找类似 is unpacking... 的本地化字符串。 + /// + internal static string MsgUnpacking { + get { + return ResourceManager.GetString("MsgUnpacking", resourceCulture); + } + } + + /// + /// 查找类似 Update subscription end 的本地化字符串。 + /// + internal static string MsgUpdateSubscriptionEnd { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionEnd", resourceCulture); + } + } + + /// + /// 查找类似 Update subscription starts 的本地化字符串。 + /// + internal static string MsgUpdateSubscriptionStart { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionStart", resourceCulture); + } + } + + /// + /// 查找类似 Update V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgUpdateV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Update V2rayCore successfully! Restarting service... 的本地化字符串。 + /// + internal static string MsgUpdateV2rayCoreSuccessfullyMore { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfullyMore", resourceCulture); + } + } + + /// + /// 查找类似 This feature relies on the Http global proxy, please set it correctly first. 的本地化字符串。 + /// + internal static string NeedHttpGlobalProxy { + get { + return ResourceManager.GetString("NeedHttpGlobalProxy", resourceCulture); + } + } + + /// + /// 查找类似 Non-vmess or ss protocol 的本地化字符串。 + /// + internal static string NonvmessOrssProtocol { + get { + return ResourceManager.GetString("NonvmessOrssProtocol", resourceCulture); + } + } + + /// + /// 查找类似 non-Vmess service, this feature is invalid 的本地化字符串。 + /// + internal static string NonVmessService { + get { + return ResourceManager.GetString("NonVmessService", resourceCulture); + } + } + + /// + /// 查找类似 V2ray-core not found, download address: {0} 的本地化字符串。 + /// + internal static string NotFoundCore { + get { + return ResourceManager.GetString("NotFoundCore", resourceCulture); + } + } + + /// + /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 + /// + internal static string NoValidQRcodeFound { + get { + return ResourceManager.GetString("NoValidQRcodeFound", resourceCulture); + } + } + + /// + /// 查找类似 operation failed, please check retry 的本地化字符串。 + /// + internal static string OperationFailed { + get { + return ResourceManager.GetString("OperationFailed", resourceCulture); + } + } + + /// + /// 查找类似 Please Fill Remarks 的本地化字符串。 + /// + internal static string PleaseFillRemarks { + get { + return ResourceManager.GetString("PleaseFillRemarks", resourceCulture); + } + } + + /// + /// 查找类似 Please select the encryption method 的本地化字符串。 + /// + internal static string PleaseSelectEncryption { + get { + return ResourceManager.GetString("PleaseSelectEncryption", resourceCulture); + } + } + + /// + /// 查找类似 Please select an agreement 的本地化字符串。 + /// + internal static string PleaseSelectProtocol { + get { + return ResourceManager.GetString("PleaseSelectProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Please select the server first 的本地化字符串。 + /// + internal static string PleaseSelectServer { + get { + return ResourceManager.GetString("PleaseSelectServer", resourceCulture); + } + } + + /// + /// 查找类似 Are you sure to remove the server? 的本地化字符串。 + /// + internal static string RemoveServer { + get { + return ResourceManager.GetString("RemoveServer", resourceCulture); + } + } + + /// + /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 + /// + internal static string SaveClientConfigurationIn { + get { + return ResourceManager.GetString("SaveClientConfigurationIn", resourceCulture); + } + } + + /// + /// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。 + /// + internal static string SaveServerConfigurationIn { + get { + return ResourceManager.GetString("SaveServerConfigurationIn", resourceCulture); + } + } + + /// + /// 查找类似 Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! 的本地化字符串。 + /// + internal static string SpeedServerTips { + get { + return ResourceManager.GetString("SpeedServerTips", resourceCulture); + } + } + + /// + /// 查找类似 Start service ({0})...... 的本地化字符串。 + /// + internal static string StartService { + get { + return ResourceManager.GetString("StartService", resourceCulture); + } + } + + /// + /// 查找类似 Successful configuration + ///{0} 的本地化字符串。 + /// + internal static string SuccessfulConfiguration { + get { + return ResourceManager.GetString("SuccessfulConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Successfully imported custom configuration server 的本地化字符串。 + /// + internal static string SuccessfullyImportedCustomServer { + get { + return ResourceManager.GetString("SuccessfullyImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Imported bulk URL from clipboard successfully 的本地化字符串。 + /// + internal static string SuccessfullyImportedServerViaClipboard { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Scan import URL successfully 的本地化字符串。 + /// + internal static string SuccessfullyImportedServerViaScan { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture); + } + } + } +} diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx new file mode 100644 index 0000000000..b46bc37607 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Batch export subscription to clipboard successfully + + + Batch export share URL to clipboard successfully + + + Failed to import custom configuration server + + + Please fill in the correct format extra ID + + + Please fill in the correct format server port + + + Please fill in the KCP parameters correctly + + + Please fill in the local listening port + + + Please fill in the password + + + Please fill in the server address + + + Please fill in the user ID + + + This feature relies on the Http global proxy, please set it correctly first. + + + non-Vmess service, this feature is invalid + + + Scan completed, no valid QR code found + + + operation failed, please check retry + + + Please Fill Remarks + + + Please select the encryption method + + + Please select an agreement + + + Please select the server first + + + Successfully imported custom configuration server + + + Imported bulk URL from clipboard successfully + + + Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. + + + The client configuration file is saved at: {0} + + + The server configuration file is saved at: {0} + + + Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! + + + Scan import URL successfully + + + Whether to download? {0} + + + Are you sure to remove the server? + + + Please check the server settings first + + + configuration format is incorrect + + + Failed to convert configuration file + + + Failed to generate default configuration file + + + Failed to get the default configuration + + + Failed to read configuration file + + + is not the correct client configuration file, please check + + + is not the correct configuration, please check + + + is not the correct server configuration file, please check + + + Initial Configuration + + + Non-vmess or ss protocol + + + Successful configuration +{0} + + + V2ray-core not found, download address: {0} + + + Start service ({0})...... + + + Address + + + Alias + + + Security + + + Port + + + Type + + + Subs + + + Test Results + + + Transport + + + Clear original subscription content + + + Download V2rayCore successfully + + + Failed to import subscription content + + + Get the subscription content successfully + + + No valid subscriptions set + + + PAC update failed + + + PAC update succeeded + + + Resolve V2rayCore successfully + + + Simplify PAC Success + + + Start getting subscriptions + + + Start updating PAC... + + + Start updating V2rayCore... + + + Subscription content decoding failed (non-BASE64 code) + + + is unpacking... + + + Update subscription end + + + Update subscription starts + + + Update V2rayCore successfully + + + Update V2rayCore successfully! Restarting service... + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx new file mode 100644 index 0000000000..147c247a86 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 批量导出订阅内容至剪贴板成功 + + + 批量导出分享URL至剪贴板成功 + + + 导入自定义配置服务器失败 + + + 请填写正确格式额外ID + + + 请填写正确格式服务器端口 + + + 请正确填写KCP参数 + + + 请填写本地监听端口 + + + 请填写密码 + + + 请填写服务器地址 + + + 请填写用户ID + + + 此功能依赖Http全局代理,请先设置正确。 + + + 非Vmess服务,此功能无效 + + + 扫描完成,未发现有效二维码 + + + 操作失败,请检查重试 + + + 请填写备注 + + + 请选择加密方式 + + + 请选择协议 + + + 请先选择服务器 + + + 成功导入自定义配置服务器 + + + 从剪贴板导入批量URL成功 + + + 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + + + 客户端配置文件保存在:{0} + + + 服务端配置文件保存在:{0} + + + 注意:此功能依赖Http全局代理!测试完成后,请手工调整Http全局代理和活动节点。 + + + 扫描导入URL成功 + + + 是否下载? {0} + + + 是否确定移除服务器? + + + 请先检查服务器设置 + + + 配置格式不正确 + + + 转换配置文件失败 + + + 生成默认配置文件失败 + + + 取得默认配置失败 + + + 读取配置文件失败 + + + 不是正确的客户端配置文件,请检查 + + + 不是正确的配置,请检查 + + + 不是正确的服务端配置文件,请检查 + + + 初始化配置 + + + 非vmess或ss协议 + + + 配置成功 +{0} + + + 未找到v2ray-core,下载地址:{0} + + + 启动服务({0})...... + + + 地址 + + + 别名 + + + 加密方式 + + + 端口 + + + 服务类型 + + + 订阅 + + + 测试结果 + + + 传输协议 + + + 清除原订阅内容 + + + 下载V2rayCore成功 + + + 导入订阅内容失败 + + + 获取订阅内容成功 + + + 未设置有效的订阅 + + + PAC更新失败 + + + PAC更新成功 + + + 解析V2rayCore成功 + + + 简化PAC成功 + + + 开始获取订阅内容 + + + 开始更新PAC... + + + 开始更新V2rayCore... + + + 订阅内容解码失败(非BASE64码) + + + 正在解压...... + + + 更新订阅结束 + + + 更新订阅开始 + + + 更新V2rayCore成功 + + + 更新V2rayCore成功!正在重启服务... + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/Resx.zip b/v2rayN/v2rayN/Resx/Resx.zip new file mode 100644 index 0000000000..0cb38db969 Binary files /dev/null and b/v2rayN/v2rayN/Resx/Resx.zip differ diff --git a/v2rayN/v2rayN/Sample/BlankPac.txt b/v2rayN/v2rayN/Sample/BlankPac.txt new file mode 100644 index 0000000000..906a14cbf8 --- /dev/null +++ b/v2rayN/v2rayN/Sample/BlankPac.txt @@ -0,0 +1,5 @@ +var proxy = "__PROXY__"; + +function FindProxyForURL(url, host) { + return proxy; +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt new file mode 100644 index 0000000000..b134fb9db5 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -0,0 +1,71 @@ +{ + "log": { + "access": "Vaccess.log", + "error": "Verror.log", + "loglevel": "warning" + }, + "inbounds": [{ + "port": 10808, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "auth": "noauth", + "udp": true + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + }], + "outbounds": [{ + "tag": "proxy", + "protocol": "vmess", + "settings": { + "vnext": [{ + "address": "v2ray.cool", + "port": 10086, + "users": [{ + "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", + "alterId": 64, + "security": "auto" + }] + }], + "servers": [{ + "address": "v2ray.cool", + "method": "chacha20", + "ota": false, + "password": "123456", + "port": 10086, + "level": 1 + }] + }, + "streamSettings": { + "network": "tcp" + }, + "mux": { + "enabled": false + } + }, + { + "protocol": "freedom", + "settings": {}, + "tag": "direct" + }, + { + "protocol": "blackhole", + "tag": "block", + "settings": { + "response": { + "type": "http" + } + } + } + ], + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleHttprequest.txt b/v2rayN/v2rayN/Sample/SampleHttprequest.txt new file mode 100644 index 0000000000..48a0be4113 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleHttprequest.txt @@ -0,0 +1 @@ +{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleHttpresponse.txt b/v2rayN/v2rayN/Sample/SampleHttpresponse.txt new file mode 100644 index 0000000000..257eaf66ec --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleHttpresponse.txt @@ -0,0 +1 @@ +{"version":"1.1","status":"200","reason":"OK","headers":{"Content-Type":["application/octet-stream","video/mpeg"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"Pragma":"no-cache"}} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt new file mode 100644 index 0000000000..bd773f43e4 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -0,0 +1,34 @@ +{ + "log": { + "access": "/var/log/v2ray/access.log", + "error": "/var/log/v2ray/error.log", + "loglevel": "warning" + }, + "inbounds": [{ + "port": 10086, + "protocol": "vmess", + "settings": { + "clients": [{ + "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", + "level": 1, + "alterId": 64, + "email": "t@t.tt" + }] + }, + "streamSettings": { + "network": "tcp" + } + }], + "outbound": [{ + "protocol": "freedom", + "settings": {} + }, { + "protocol": "blackhole", + "settings": {}, + "tag": "block" + }], + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/StringEx.cs b/v2rayN/v2rayN/StringEx.cs new file mode 100644 index 0000000000..428567e952 --- /dev/null +++ b/v2rayN/v2rayN/StringEx.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace v2rayN +{ + static class StringEx + { + public static bool IsNullOrEmpty(this string value) + { + return string.IsNullOrEmpty(value); + } + + public static bool IsNullOrWhiteSpace(this string value) + { + return string.IsNullOrWhiteSpace(value); + } + + public static bool BeginWithAny(this string s, IEnumerable chars) + { + if (s.IsNullOrEmpty()) return false; + return chars.Contains(s[0]); + } + + public static bool IsWhiteSpace(this string value) + { + foreach (var c in value) + { + if (char.IsWhiteSpace(c)) continue; + + return false; + } + return true; + } + + + public static IEnumerable NonWhiteSpaceLines(this TextReader reader) + { + string line; + while ((line = reader.ReadLine()) != null) + { + if (line.IsWhiteSpace()) continue; + yield return line; + } + } + } +} diff --git a/v2rayN/v2rayN/Tool/CDateTime.cs b/v2rayN/v2rayN/Tool/CDateTime.cs new file mode 100644 index 0000000000..fb7a2e25f8 --- /dev/null +++ b/v2rayN/v2rayN/Tool/CDateTime.cs @@ -0,0 +1,156 @@ +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; + +namespace v2rayN +{ + class CDateTime + { + /// + /// 设置本地系统时间 + /// + public static void SetLocalTime() + { + using (WebClient wc = new WebClient()) + { + string url = ""; + string result = string.Empty; + + try + { + wc.Encoding = Encoding.UTF8; + wc.DownloadStringCompleted += wc_DownloadStringCompleted; + wc.DownloadStringAsync(new Uri(url)); + } + catch + { + } + } + } + + static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + string result = e.Result; + if (Utils.IsNullOrEmpty(result)) + { + return; + } + EWebTime webTime = Utils.FromJson(result); + if (webTime != null + && webTime.result != null + && webTime.result.stime != null + && !Utils.IsNullOrEmpty(webTime.result.stime)) + { + DateTime dtWeb = GetTimeFromLinux(webTime.result.stime); + + SYSTEMTIME st = new SYSTEMTIME(); + st.FromDateTime(dtWeb); + + //调用Win32 API设置系统时间 + Win32API.SetLocalTime(ref st); + } + } + catch + { + } + } + + /// + /// 时间戳转为C#格式时间 + /// + /// + /// + private static DateTime GetTimeFromLinux(string timeStamp) + { + DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); + long lTime = long.Parse(timeStamp + "0000000"); + TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); + } + } + + /// + /// + /// + public struct SYSTEMTIME + { + public ushort wYear; + public ushort wMonth; + public ushort wDayOfWeek; + public ushort wDay; + public ushort wHour; + public ushort wMinute; + public ushort wSecond; + public ushort wMilliseconds; + + /// + /// 从System.DateTime转换。 + /// + /// System.DateTime类型的时间。 + public void FromDateTime(DateTime time) + { + wYear = (ushort)time.Year; + wMonth = (ushort)time.Month; + wDayOfWeek = (ushort)time.DayOfWeek; + wDay = (ushort)time.Day; + wHour = (ushort)time.Hour; + wMinute = (ushort)time.Minute; + wSecond = (ushort)time.Second; + wMilliseconds = (ushort)time.Millisecond; + } + + /// + /// 转换为System.DateTime类型。 + /// + /// + public DateTime ToDateTime() + { + return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); + } + + /// + /// 静态方法。转换为System.DateTime类型。 + /// + /// SYSTEMTIME类型的时间。 + /// + public static DateTime ToDateTime(SYSTEMTIME time) + { + return time.ToDateTime(); + } + } + + public class Win32API + { + [DllImport("Kernel32.dll")] + public static extern bool SetLocalTime(ref SYSTEMTIME Time); + [DllImport("Kernel32.dll")] + public static extern void GetLocalTime(ref SYSTEMTIME Time); + } + + public class WTResult + { + /// + /// + /// + public string stime { get; set; } + } + + public class EWebTime + { + /// + /// + /// + public WTResult result { get; set; } + /// + /// + /// + public int error_code { get; set; } + /// + /// + /// + public string reason { get; set; } + } +} + diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs new file mode 100644 index 0000000000..6df1a4bb45 --- /dev/null +++ b/v2rayN/v2rayN/Tool/FileManager.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Text; + +namespace v2rayN.Tool +{ + public static class FileManager + { + public static bool ByteArrayToFile(string fileName, byte[] content) + { + try + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + fs.Write(content, 0, content.Length); + return true; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return false; + } + + public static void UncompressFile(string fileName, byte[] content) + { + // Because the uncompressed size of the file is unknown, + // we are using an arbitrary buffer size. + byte[] buffer = new byte[4096]; + int n; + + using (var fs = File.Create(fileName)) + using (var input = new GZipStream(new MemoryStream(content), + CompressionMode.Decompress, false)) + { + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + fs.Write(buffer, 0, n); + } + } + } + + public static string NonExclusiveReadAllText(string path) + { + return NonExclusiveReadAllText(path, Encoding.Default); + } + + public static string NonExclusiveReadAllText(string path, Encoding encoding) + { + try + { + using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var sr = new StreamReader(fs, encoding)) + { + return sr.ReadToEnd(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + throw ex; + } + } + } +} diff --git a/v2rayN/v2rayN/Tool/Job.cs b/v2rayN/v2rayN/Tool/Job.cs new file mode 100644 index 0000000000..64415589f0 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Job.cs @@ -0,0 +1,179 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + + +namespace v2rayN +{ + /* + * See: + * http://stackoverflow.com/questions/6266820/working-example-of-createjobobject-setinformationjobobject-pinvoke-in-net + */ + public class Job : IDisposable + { + private IntPtr handle = IntPtr.Zero; + + public Job() + { + handle = CreateJobObject(IntPtr.Zero, null); + var extendedInfoPtr = IntPtr.Zero; + var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION + { + LimitFlags = 0x2000 + }; + + var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + BasicLimitInformation = info + }; + + try + { + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + extendedInfoPtr = Marshal.AllocHGlobal(length); + Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); + + if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, + (uint) length)) + throw new Exception(string.Format("Unable to set information. Error: {0}", + Marshal.GetLastWin32Error())); + } + finally + { + if (extendedInfoPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(extendedInfoPtr); + extendedInfoPtr = IntPtr.Zero; + } + } + } + + public bool AddProcess(IntPtr processHandle) + { + var succ = AssignProcessToJobObject(handle, processHandle); + + if (!succ) + { + //Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); + } + + return succ; + } + + public bool AddProcess(int processId) + { + return AddProcess(Process.GetProcessById(processId).Handle); + } + + #region IDisposable + + private bool disposed; + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposed) return; + disposed = true; + + if (disposing) + { + // no managed objects to free + } + + if (handle != IntPtr.Zero) + { + CloseHandle(handle); + handle = IntPtr.Zero; + } + } + + ~Job() + { + Dispose(false); + } + + #endregion + + #region Interop + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr CreateJobObject(IntPtr a, string lpName); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseHandle(IntPtr hObject); + + #endregion + } + + #region Helper classes + + [StructLayout(LayoutKind.Sequential)] + struct IO_COUNTERS + { + public UInt64 ReadOperationCount; + public UInt64 WriteOperationCount; + public UInt64 OtherOperationCount; + public UInt64 ReadTransferCount; + public UInt64 WriteTransferCount; + public UInt64 OtherTransferCount; + } + + + [StructLayout(LayoutKind.Sequential)] + struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + public Int64 PerProcessUserTimeLimit; + public Int64 PerJobUserTimeLimit; + public UInt32 LimitFlags; + public UIntPtr MinimumWorkingSetSize; + public UIntPtr MaximumWorkingSetSize; + public UInt32 ActiveProcessLimit; + public UIntPtr Affinity; + public UInt32 PriorityClass; + public UInt32 SchedulingClass; + } + + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public UInt32 nLength; + public IntPtr lpSecurityDescriptor; + public Int32 bInheritHandle; + } + + [StructLayout(LayoutKind.Sequential)] + struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + public IO_COUNTERS IoInfo; + public UIntPtr ProcessMemoryLimit; + public UIntPtr JobMemoryLimit; + public UIntPtr PeakProcessMemoryUsed; + public UIntPtr PeakJobMemoryUsed; + } + + public enum JobObjectInfoType + { + AssociateCompletionPortInformation = 7, + BasicLimitInformation = 2, + BasicUIRestrictions = 4, + EndOfJobTimeInformation = 6, + ExtendedLimitInformation = 9, + SecurityLimitInformation = 5, + GroupInformation = 11 + } + + #endregion +} diff --git a/v2rayN/v2rayN/Tool/UI.cs b/v2rayN/v2rayN/Tool/UI.cs new file mode 100644 index 0000000000..8225a29158 --- /dev/null +++ b/v2rayN/v2rayN/Tool/UI.cs @@ -0,0 +1,38 @@ +using System.Globalization; +using System.Windows.Forms; + +namespace v2rayN +{ + class UI + { + public static void Show(string msg) + { + MessageBox.Show(msg); + } + + public static DialogResult ShowYesNo(string msg) + { + return MessageBox.Show(msg, "YesNo", MessageBoxButtons.YesNo); + } + + //public static string GetResourseString(string key) + //{ + // CultureInfo cultureInfo = null; + // try + // { + // string languageCode = this.LanguageCode; + // cultureInfo = new CultureInfo(languageCode); + // return Common.ResourceManager.GetString(key, cultureInfo); + // } + // catch (Exception) + // { + // //默认读取英文的多语言 + // cultureInfo = new CultureInfo(MKey.kDefaultLanguageCode); + // return Common.ResourceManager.GetString(key, cultureInfo); + // } + //} + + } + + +} diff --git a/v2rayN/v2rayN/Tool/UIRes.cs b/v2rayN/v2rayN/Tool/UIRes.cs new file mode 100644 index 0000000000..a6b455a9b5 --- /dev/null +++ b/v2rayN/v2rayN/Tool/UIRes.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.Reflection; +using System.Resources; + +namespace v2rayN +{ + public class UIRes + { + static ResourceManager res = new ResourceManager("v2rayN.Resx.ResUI", Assembly.GetExecutingAssembly()); + + static string LoadString(ResourceManager resMgr, string key) + { + var value = resMgr.GetString(key); + if (value == null) + { + throw new KeyNotFoundException($"key: {key}"); + } + return value; + } + + public static string I18N(string key) + { + return LoadString(res, key); + } + } +} diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs new file mode 100644 index 0000000000..d78cb10e65 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -0,0 +1,820 @@ +using Microsoft.Win32; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Reflection; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Drawing; +using ZXing; +using ZXing.Common; +using ZXing.QrCode; + +namespace v2rayN +{ + class Utils + { + + + #region 资源Json操作 + + /// + /// 获取嵌入文本资源 + /// + /// + /// + public static string GetEmbedText(string res) + { + string result = string.Empty; + + try + { + var assembly = Assembly.GetExecutingAssembly(); + using (Stream stream = assembly.GetManifestResourceStream(res)) + using (StreamReader reader = new StreamReader(stream)) + { + result = reader.ReadToEnd(); + } + } + catch + { + } + return result; + } + + + /// + /// 取得存储资源 + /// + /// + public static string LoadResource(string res) + { + string result = string.Empty; + + try + { + using (StreamReader reader = new StreamReader(res)) + { + result = reader.ReadToEnd(); + } + } + catch + { + } + return result; + } + + /// + /// 反序列化成对象 + /// + /// + /// + /// + public static T FromJson(string strJson) + { + try + { + T obj = JsonConvert.DeserializeObject(strJson); + return obj; + } + catch + { + return JsonConvert.DeserializeObject(""); + } + } + + /// + /// 序列化成Json + /// + /// + /// + public static string ToJson(Object obj) + { + string result = string.Empty; + try + { + result = JsonConvert.SerializeObject(obj, + Formatting.Indented, + new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); + } + catch + { + } + return result; + } + + /// + /// 保存成json文件 + /// + /// + /// + /// + public static int ToJsonFile(Object obj, string filePath) + { + int result = -1; + try + { + using (StreamWriter file = System.IO.File.CreateText(filePath)) + { + //JsonSerializer serializer = new JsonSerializer(); + JsonSerializer serializer = new JsonSerializer() { Formatting = Formatting.Indented }; + //JsonSerializer serializer = new JsonSerializer() { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore }; + + serializer.Serialize(file, obj); + } + result = 0; + } + catch + { + result = -1; + } + return result; + } + #endregion + + #region 转换函数 + + /// + /// List转逗号分隔的字符串 + /// + /// + /// + public static string List2String(List lst, bool wrap = false) + { + try + { + if (wrap) + { + return string.Join(",\r\n", lst.ToArray()); + } + else + { + return string.Join(",", lst.ToArray()); + } + } + catch + { + return string.Empty; + } + } + /// + /// 逗号分隔的字符串,转List + /// + /// + /// + public static List String2List(string str) + { + try + { + str = str.Replace("\r\n", ""); + return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); + } + catch + { + return new List(); + } + } + + /// + /// Base64编码 + /// + /// + /// + public static string Base64Encode(string plainText) + { + try + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + catch (Exception ex) + { + SaveLog("Base64Encode", ex); + return string.Empty; + } + } + + /// + /// Base64解码 + /// + /// + /// + public static string Base64Decode(string plainText) + { + try + { + plainText = plainText.Trim() + .Replace("\n", "") + .Replace("\r\n", "") + .Replace("\r", "") + .Replace(" ", ""); + + if (plainText.Length % 4 > 0) + { + plainText = plainText.PadRight(plainText.Length + 4 - plainText.Length % 4, '='); + } + + byte[] data = Convert.FromBase64String(plainText); + return Encoding.UTF8.GetString(data); + } + catch (Exception ex) + { + SaveLog("Base64Decode", ex); + return string.Empty; + } + } + + /// + /// 转Int + /// + /// + /// + public static int ToInt(object obj) + { + try + { + return Convert.ToInt32(obj); + } + catch + { + return 0; + } + } + + #endregion + + + #region 数据检查 + + /// + /// 判断输入的是否是数字 + /// + /// + /// + public static bool IsNumberic(string oText) + { + try + { + int var1 = Utils.ToInt(oText); + return true; + } + catch + { + return false; + } + } + + /// + /// 文本 + /// + /// + /// + public static bool IsNullOrEmpty(string text) + { + if (string.IsNullOrEmpty(text)) + { + return true; + } + if (text.Equals("null")) + { + return true; + } + return false; + } + + /// + /// 验证IP地址是否合法 + /// + /// + public static bool IsIP(string ip) + { + //如果为空 + if (IsNullOrEmpty(ip)) + { + return false; + } + + //清除要验证字符串中的空格 + //ip = ip.Trim(); + //可能是CIDR + if (ip.IndexOf(@"/") > 0) + { + var cidr = ip.Split('/'); + if (cidr.Length == 2) + { + if (!IsNumberic(cidr[0])) + { + return false; + } + ip = cidr[0]; + } + } + + + //模式字符串 + string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"; + + //验证 + return IsMatch(ip, pattern); + } + + /// + /// 验证Domain地址是否合法 + /// + /// + public static bool IsDomain(string domain) + { + //如果为空 + if (IsNullOrEmpty(domain)) + { + return false; + } + + //清除要验证字符串中的空格 + //domain = domain.Trim(); + + //模式字符串 + string pattern = @"^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$"; + + //验证 + return IsMatch(domain, pattern); + } + + /// + /// 验证输入字符串是否与模式字符串匹配,匹配返回true + /// + /// 输入字符串 + /// 模式字符串 + public static bool IsMatch(string input, string pattern) + { + return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase); + } + + #endregion + + #region 开机自动启动 + + private static string autoRunName = "v2rayNAutoRun"; + private static string autoRunRegPath + { + get + { + return @"Software\Microsoft\Windows\CurrentVersion\Run"; + //if (Environment.Is64BitProcess) + //{ + // return @"Software\Microsoft\Windows\CurrentVersion\Run"; + //} + //else + //{ + // return @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; + //} + } + } + + /// + /// 开机自动启动 + /// + /// + /// + public static int SetAutoRun(bool run) + { + try + { + if (run) + { + string exePath = GetExePath(); + RegWriteValue(autoRunRegPath, autoRunName, exePath); + } + else + { + RegWriteValue(autoRunRegPath, autoRunName, ""); + } + } + catch + { + } + return 0; + } + + /// + /// 是否已经设置开机自动启动 + /// + /// + public static bool IsAutoRun() + { + try + { + var value = RegReadValue(autoRunRegPath, autoRunName, ""); + string exePath = GetExePath(); + if (value?.Equals(exePath) == true) + { + return true; + } + } + catch + { + } + return false; + } + + /// + /// 获取启动了应用程序的可执行文件的路径 + /// + /// + public static string GetPath(string fileName) + { + string startupPath = StartupPath(); + if (Utils.IsNullOrEmpty(fileName)) + { + return startupPath; + } + return Path.Combine(startupPath, fileName); + } + + /// + /// 获取启动了应用程序的可执行文件的路径及文件名 + /// + /// + public static string GetExePath() + { + return Application.ExecutablePath; + } + + public static string StartupPath() + { + try + { + string exePath = GetExePath(); + return exePath.Substring(0, exePath.LastIndexOf("\\", StringComparison.Ordinal)); + } + catch + { + return Application.StartupPath; + } + } + + public static string RegReadValue(string path, string name, string def) + { + RegistryKey regKey = null; + try + { + regKey = Registry.CurrentUser.OpenSubKey(path, false); + string value = regKey?.GetValue(name) as string; + if (IsNullOrEmpty(value)) + { + return def; + } + else + { + return value; + } + } + catch + { + } + finally + { + regKey?.Close(); + } + return def; + } + + public static void RegWriteValue(string path, string name, string value) + { + RegistryKey regKey = null; + try + { + regKey = Registry.CurrentUser.CreateSubKey(path); + if (IsNullOrEmpty(value)) + { + regKey?.DeleteValue(name, false); + } + else + { + regKey?.SetValue(name, value); + } + } + catch + { + } + finally + { + regKey?.Close(); + } + } + #endregion + + #region 测速 + + /// + /// Ping + /// + /// + /// + public static long Ping(string host) + { + long roundtripTime = -1; + try + { + int timeout = 120; + int echoNum = 2; + Ping pingSender = new Ping(); + for (int i = 0; i < echoNum; i++) + { + PingReply reply = pingSender.Send(host, timeout); + if (reply.Status == IPStatus.Success) + { + if (reply.RoundtripTime < 0) + { + continue; + } + if (roundtripTime < 0 || reply.RoundtripTime < roundtripTime) + { + roundtripTime = reply.RoundtripTime; + } + } + } + } + catch + { + return -1; + } + return roundtripTime; + } + + /// + /// 取得本机 IP Address + /// + /// + public static List GetHostIPAddress() + { + List lstIPAddress = new List(); + try + { + IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName()); + foreach (IPAddress ipa in IpEntry.AddressList) + { + if (ipa.AddressFamily == AddressFamily.InterNetwork) + lstIPAddress.Add(ipa.ToString()); + } + } + catch + { + } + return lstIPAddress; + } + + + #endregion + + #region 杂项 + + /// + /// 取得版本 + /// + /// + public static string GetVersion() + { + try + { + string location = GetExePath(); + return string.Format("v2rayN - V{0} - {1}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), + File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + } + catch + { + return string.Empty; + } + } + + /// + /// 深度拷贝 + /// + /// + /// + /// + public static T DeepCopy(T obj) + { + object retval; + using (MemoryStream ms = new MemoryStream()) + { + BinaryFormatter bf = new BinaryFormatter(); + //序列化成流 + bf.Serialize(ms, obj); + ms.Seek(0, SeekOrigin.Begin); + //反序列化成对象 + retval = bf.Deserialize(ms); + ms.Close(); + } + return (T)retval; + } + + /// + /// 获取剪贴板数 + /// + /// + public static string GetClipboardData() + { + string strData = string.Empty; + try + { + IDataObject data = Clipboard.GetDataObject(); + if (data.GetDataPresent(DataFormats.Text)) + { + strData = data.GetData(DataFormats.Text).ToString(); + } + return strData; + } + catch + { + } + return strData; + } + + /// + /// 拷贝至剪贴板 + /// + /// + public static void SetClipboardData(string strData) + { + try + { + Clipboard.SetText(strData); + } + catch + { + } + } + + /// + /// 取得GUID + /// + /// + public static string GetGUID() + { + try + { + return Guid.NewGuid().ToString("D"); + } + catch + { + } + return string.Empty; + } + + #endregion + + #region TempPath + + private static string _tempPath = null; + + // return path to store temporary files + public static string GetTempPath() + { + if (_tempPath == null) + { + Directory.CreateDirectory(Path.Combine(StartupPath(), "v2ray_win_temp")); + // don't use "/", it will fail when we call explorer /select xxx/ss_win_temp\xxx.log + _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + } + return _tempPath; + } + + public static string GetTempPath(string filename) + { + return Path.Combine(GetTempPath(), filename); + } + + public static void ClearTempPath() + { + //Directory.Delete(GetTempPath(), true); + //_tempPath = null; + } + + public static string UnGzip(byte[] buf) + { + byte[] buffer = new byte[1024]; + int n; + using (MemoryStream sb = new MemoryStream()) + { + using (GZipStream input = new GZipStream(new MemoryStream(buf), + CompressionMode.Decompress, + false)) + { + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + sb.Write(buffer, 0, n); + } + } + return System.Text.Encoding.UTF8.GetString(sb.ToArray()); + } + } + + #endregion + + #region Log + + public static void SaveLog(string strContent) + { + SaveLog("info", new Exception(strContent)); + } + public static void SaveLog(string strTitle, Exception ex) + { + try + { + string path = Path.Combine(StartupPath(), "guiLogs"); + string FilePath = Path.Combine(path, DateTime.Now.ToString("yyyyMMdd") + ".txt"); + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + if (!File.Exists(FilePath)) + { + FileStream FsCreate = new FileStream(FilePath, FileMode.Create); + FsCreate.Close(); + FsCreate.Dispose(); + } + FileStream FsWrite = new FileStream(FilePath, FileMode.Append, FileAccess.Write); + StreamWriter SwWrite = new StreamWriter(FsWrite); + + string strContent = ex.ToString(); + + SwWrite.WriteLine(string.Format("{0}{1}[{2}]{3}", "--------------------------------", strTitle, DateTime.Now.ToString("HH:mm:ss"), "--------------------------------")); + SwWrite.Write(strContent); + SwWrite.WriteLine("\r\n"); + SwWrite.WriteLine(" "); + SwWrite.Flush(); + SwWrite.Close(); + } + catch { } + } + + #endregion + + + #region scan screen + + public static string ScanScreen() + { + string ret = string.Empty; + try + { + foreach (Screen screen in Screen.AllScreens) + { + using (Bitmap fullImage = new Bitmap(screen.Bounds.Width, + screen.Bounds.Height)) + { + using (Graphics g = Graphics.FromImage(fullImage)) + { + g.CopyFromScreen(screen.Bounds.X, + screen.Bounds.Y, + 0, 0, + fullImage.Size, + CopyPixelOperation.SourceCopy); + } + int maxTry = 10; + for (int i = 0; i < maxTry; i++) + { + int marginLeft = (int)((double)fullImage.Width * i / 2.5 / maxTry); + int marginTop = (int)((double)fullImage.Height * i / 2.5 / maxTry); + Rectangle cropRect = new Rectangle(marginLeft, marginTop, fullImage.Width - marginLeft * 2, fullImage.Height - marginTop * 2); + Bitmap target = new Bitmap(screen.Bounds.Width, screen.Bounds.Height); + + double imageScale = (double)screen.Bounds.Width / (double)cropRect.Width; + using (Graphics g = Graphics.FromImage(target)) + { + g.DrawImage(fullImage, new Rectangle(0, 0, target.Width, target.Height), + cropRect, + GraphicsUnit.Pixel); + } + + var source = new BitmapLuminanceSource(target); + var bitmap = new BinaryBitmap(new HybridBinarizer(source)); + QRCodeReader reader = new QRCodeReader(); + var result = reader.decode(bitmap); + if (result != null) + { + ret = result.Text; + return ret; + } + } + } + } + } + catch { } + return string.Empty; + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/app.config b/v2rayN/v2rayN/app.config new file mode 100644 index 0000000000..620ddb42c9 --- /dev/null +++ b/v2rayN/v2rayN/app.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v2rayN/v2rayN/protos/Command.cs b/v2rayN/v2rayN/protos/Command.cs new file mode 100644 index 0000000000..8c54f09bce --- /dev/null +++ b/v2rayN/v2rayN/protos/Command.cs @@ -0,0 +1,560 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: command.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace V2Ray.Core.App.Stats.Command { + + /// Holder for reflection information generated from command.proto + public static partial class CommandReflection { + + #region Descriptor + /// File descriptor for command.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static CommandReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Cg1jb21tYW5kLnByb3RvEhx2MnJheS5jb3JlLmFwcC5zdGF0cy5jb21tYW5k", + "Ii4KD0dldFN0YXRzUmVxdWVzdBIMCgRuYW1lGAEgASgJEg0KBXJlc2V0GAIg", + "ASgIIiMKBFN0YXQSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoAyJEChBH", + "ZXRTdGF0c1Jlc3BvbnNlEjAKBHN0YXQYASABKAsyIi52MnJheS5jb3JlLmFw", + "cC5zdGF0cy5jb21tYW5kLlN0YXQiCAoGQ29uZmlnMnsKDFN0YXRzU2Vydmlj", + "ZRJrCghHZXRTdGF0cxItLnYycmF5LmNvcmUuYXBwLnN0YXRzLmNvbW1hbmQu", + "R2V0U3RhdHNSZXF1ZXN0Gi4udjJyYXkuY29yZS5hcHAuc3RhdHMuY29tbWFu", + "ZC5HZXRTdGF0c1Jlc3BvbnNlIgBCTAogY29tLnYycmF5LmNvcmUuYXBwLnN0", + "YXRzLmNvbW1hbmRQAVoHY29tbWFuZKoCHFYyUmF5LkNvcmUuQXBwLlN0YXRz", + "LkNvbW1hbmRiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::V2Ray.Core.App.Stats.Command.GetStatsRequest), global::V2Ray.Core.App.Stats.Command.GetStatsRequest.Parser, new[]{ "Name", "Reset" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::V2Ray.Core.App.Stats.Command.Stat), global::V2Ray.Core.App.Stats.Command.Stat.Parser, new[]{ "Name", "Value" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::V2Ray.Core.App.Stats.Command.GetStatsResponse), global::V2Ray.Core.App.Stats.Command.GetStatsResponse.Parser, new[]{ "Stat" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::V2Ray.Core.App.Stats.Command.Config), global::V2Ray.Core.App.Stats.Command.Config.Parser, null, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class GetStatsRequest : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GetStatsRequest()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::V2Ray.Core.App.Stats.Command.CommandReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsRequest(GetStatsRequest other) : this() { + name_ = other.name_; + reset_ = other.reset_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsRequest Clone() { + return new GetStatsRequest(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private string name_ = ""; + /// + /// Name of the stat counter. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Name { + get { return name_; } + set { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "reset" field. + public const int ResetFieldNumber = 2; + private bool reset_; + /// + /// Whether or not to reset the counter to fetching its value. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Reset { + get { return reset_; } + set { + reset_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as GetStatsRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(GetStatsRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Name != other.Name) return false; + if (Reset != other.Reset) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Name.Length != 0) hash ^= Name.GetHashCode(); + if (Reset != false) hash ^= Reset.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Name.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (Reset != false) { + output.WriteRawTag(16); + output.WriteBool(Reset); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Name.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (Reset != false) { + size += 1 + 1; + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(GetStatsRequest other) { + if (other == null) { + return; + } + if (other.Name.Length != 0) { + Name = other.Name; + } + if (other.Reset != false) { + Reset = other.Reset; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 16: { + Reset = input.ReadBool(); + break; + } + } + } + } + + } + + public sealed partial class Stat : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Stat()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::V2Ray.Core.App.Stats.Command.CommandReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Stat() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Stat(Stat other) : this() { + name_ = other.name_; + value_ = other.value_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Stat Clone() { + return new Stat(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private string name_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Name { + get { return name_; } + set { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private long value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public long Value { + get { return value_; } + set { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Stat); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Stat other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Name != other.Name) return false; + if (Value != other.Value) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Name.Length != 0) hash ^= Name.GetHashCode(); + if (Value != 0L) hash ^= Value.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Name.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (Value != 0L) { + output.WriteRawTag(16); + output.WriteInt64(Value); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Name.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (Value != 0L) { + size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Stat other) { + if (other == null) { + return; + } + if (other.Name.Length != 0) { + Name = other.Name; + } + if (other.Value != 0L) { + Value = other.Value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 16: { + Value = input.ReadInt64(); + break; + } + } + } + } + + } + + public sealed partial class GetStatsResponse : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GetStatsResponse()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::V2Ray.Core.App.Stats.Command.CommandReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsResponse(GetStatsResponse other) : this() { + Stat = other.stat_ != null ? other.Stat.Clone() : null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public GetStatsResponse Clone() { + return new GetStatsResponse(this); + } + + /// Field number for the "stat" field. + public const int StatFieldNumber = 1; + private global::V2Ray.Core.App.Stats.Command.Stat stat_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public global::V2Ray.Core.App.Stats.Command.Stat Stat { + get { return stat_; } + set { + stat_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as GetStatsResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(GetStatsResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(Stat, other.Stat)) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (stat_ != null) hash ^= Stat.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (stat_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Stat); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (stat_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stat); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(GetStatsResponse other) { + if (other == null) { + return; + } + if (other.stat_ != null) { + if (stat_ == null) { + stat_ = new global::V2Ray.Core.App.Stats.Command.Stat(); + } + Stat.MergeFrom(other.Stat); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 10: { + if (stat_ == null) { + stat_ = new global::V2Ray.Core.App.Stats.Command.Stat(); + } + input.ReadMessage(stat_); + break; + } + } + } + } + + } + + public sealed partial class Config : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Config()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::V2Ray.Core.App.Stats.Command.CommandReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Config() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Config(Config other) : this() { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public Config Clone() { + return new Config(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as Config); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(Config other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(Config other) { + if (other == null) { + return; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/v2rayN/v2rayN/protos/CommandGrpc.cs b/v2rayN/v2rayN/protos/CommandGrpc.cs new file mode 100644 index 0000000000..6fdec4d626 --- /dev/null +++ b/v2rayN/v2rayN/protos/CommandGrpc.cs @@ -0,0 +1,97 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: command.proto +// +#pragma warning disable 1591 +#region Designer generated code + +using grpc = global::Grpc.Core; + +namespace V2Ray.Core.App.Stats.Command { + public static partial class StatsService + { + static readonly string __ServiceName = "v2ray.core.app.stats.command.StatsService"; + + static readonly grpc::Marshaller __Marshaller_GetStatsRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::V2Ray.Core.App.Stats.Command.GetStatsRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_GetStatsResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::V2Ray.Core.App.Stats.Command.GetStatsResponse.Parser.ParseFrom); + + static readonly grpc::Method __Method_GetStats = new grpc::Method( + grpc::MethodType.Unary, + __ServiceName, + "GetStats", + __Marshaller_GetStatsRequest, + __Marshaller_GetStatsResponse); + + /// Service descriptor + public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor + { + get { return global::V2Ray.Core.App.Stats.Command.CommandReflection.Descriptor.Services[0]; } + } + + /// Base class for server-side implementations of StatsService + public abstract partial class StatsServiceBase + { + public virtual global::System.Threading.Tasks.Task GetStats(global::V2Ray.Core.App.Stats.Command.GetStatsRequest request, grpc::ServerCallContext context) + { + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); + } + + } + + /// Client for StatsService + public partial class StatsServiceClient : grpc::ClientBase + { + /// Creates a new client for StatsService + /// The channel to use to make remote calls. + public StatsServiceClient(grpc::Channel channel) : base(channel) + { + } + /// Creates a new client for StatsService that uses a custom CallInvoker. + /// The callInvoker to use to make remote calls. + public StatsServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) + { + } + /// Protected parameterless constructor to allow creation of test doubles. + protected StatsServiceClient() : base() + { + } + /// Protected constructor to allow creation of configured clients. + /// The client configuration. + protected StatsServiceClient(ClientBaseConfiguration configuration) : base(configuration) + { + } + + public virtual global::V2Ray.Core.App.Stats.Command.GetStatsResponse GetStats(global::V2Ray.Core.App.Stats.Command.GetStatsRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return GetStats(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + public virtual global::V2Ray.Core.App.Stats.Command.GetStatsResponse GetStats(global::V2Ray.Core.App.Stats.Command.GetStatsRequest request, grpc::CallOptions options) + { + return CallInvoker.BlockingUnaryCall(__Method_GetStats, null, options, request); + } + public virtual grpc::AsyncUnaryCall GetStatsAsync(global::V2Ray.Core.App.Stats.Command.GetStatsRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return GetStatsAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + public virtual grpc::AsyncUnaryCall GetStatsAsync(global::V2Ray.Core.App.Stats.Command.GetStatsRequest request, grpc::CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_GetStats, null, options, request); + } + /// Creates a new instance of client from given ClientBaseConfiguration. + protected override StatsServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new StatsServiceClient(configuration); + } + } + + /// Creates service definition that can be registered with a server + /// An object implementing the server-side handling logic. + public static grpc::ServerServiceDefinition BindService(StatsServiceBase serviceImpl) + { + return grpc::ServerServiceDefinition.CreateBuilder() + .AddMethod(__Method_GetStats, serviceImpl.GetStats).Build(); + } + + } +} +#endregion diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj new file mode 100644 index 0000000000..33c3d80c2b --- /dev/null +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -0,0 +1,393 @@ + + + + + Debug + AnyCPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E} + WinExe + Properties + v2rayN + v2rayN + v4.6 + 512 + + false + + + 发布\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 2 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + v2rayN.ico + + + BD431FE78E8A6683106E7110882AE5C41CBF5C60 + + + v2rayN_TemporaryKey.pfx + + + false + + + false + + + + LocalIntranet + + + + + + .\Newtonsoft.Json.dll + False + + + + + + + + + + + + + + + .\zxing.dll + False + + + .\zxing.presentation.dll + False + + + + + Form + + + AddServer4Form.cs + + + Form + + + MainForm.cs + + + Form + + + SubSettingForm.cs + + + Form + + + AddServer2Form.cs + + + Form + + + AddServer3Form.cs + + + UserControl + + + QRCodeControl.cs + + + UserControl + + + SubSettingControl.cs + + + + + + + + + + + Component + + + + + + True + True + ResUI.zh-Hans.resx + + + True + True + ResUI.resx + + + Code + + + Form + + + AddServerForm.cs + + + Form + + + BaseForm.cs + + + + + + + + + + + + Form + + + OptionSettingForm.cs + + + + + + + + + + + AddServer2Form.cs + Designer + + + AddServer4Form.cs + Designer + + + AddServer4Form.cs + Designer + + + AddServer3Form.cs + Designer + + + AddServerForm.cs + Designer + + + MainForm.cs + Designer + + + MainForm.cs + Designer + + + OptionSettingForm.cs + + + QRCodeControl.cs + Designer + + + SubSettingControl.cs + + + SubSettingControl.cs + + + SubSettingForm.cs + Designer + + + AddServerForm.cs + Designer + + + BaseForm.cs + + + OptionSettingForm.cs + Designer + + + QRCodeControl.cs + Designer + + + AddServer2Form.cs + Designer + + + AddServer3Form.cs + Designer + + + SubSettingForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + ResXFileCodeGenerator + ResUI.zh-Hans.Designer.cs + Designer + + + ResXFileCodeGenerator + ResUI.Designer.cs + Designer + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj.user b/v2rayN/v2rayN/v2rayN.csproj.user new file mode 100644 index 0000000000..68f714aa55 --- /dev/null +++ b/v2rayN/v2rayN/v2rayN.csproj.user @@ -0,0 +1,17 @@ + + + + 发布\ + + + + + + zh-CN + false + ProjectFiles + + + false + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.ico b/v2rayN/v2rayN/v2rayN.ico new file mode 100644 index 0000000000..2a2f85a92a Binary files /dev/null and b/v2rayN/v2rayN/v2rayN.ico differ diff --git a/v2rayN/v2rayN/zxing.dll b/v2rayN/v2rayN/zxing.dll new file mode 100644 index 0000000000..7b99de64bb Binary files /dev/null and b/v2rayN/v2rayN/zxing.dll differ diff --git a/v2rayN/v2rayN/zxing.presentation.dll b/v2rayN/v2rayN/zxing.presentation.dll new file mode 100644 index 0000000000..8ad3f9bf55 Binary files /dev/null and b/v2rayN/v2rayN/zxing.presentation.dll differ