├── .github
└── workflows
│ └── go.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── README_zh_CN.md
├── api
├── html.go
└── router.go
├── config
├── config.go
└── config.yaml
├── doc
├── 1.png
├── 2.png
├── WhatsNew.md
└── gobindata.sh
├── go.mod
├── internal
├── app
│ ├── get.go
│ └── task.go
├── cache
│ ├── cache.go
│ └── vars.go
└── cron
│ └── cron.go
└── main.go
/.github/workflows/go.yml:
--------------------------------------------------------------------------------
1 | name: Go
2 | on: [push, pull_request]
3 | jobs:
4 |
5 | build:
6 | name: Build
7 | runs-on: ubuntu-latest
8 | steps:
9 | - name: Setup Go environment
10 | uses: actions/setup-go@v2.1.3
11 | with:
12 | go-version: 1.16.x
13 |
14 | - name: Checkout Code
15 | uses: actions/checkout@v2.3.3
16 |
17 | - name: Cache go module
18 | uses: actions/cache@v2
19 | with:
20 | path: ~/go/pkg/mod
21 | key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
22 | restore-keys: |
23 | ${{ runner.os }}-go-
24 |
25 | - name: Get dependencies and run test
26 | run: |
27 | go get
28 | go build
29 | go test ./...
30 |
31 | - name: Build
32 | if: startsWith(github.ref, 'refs/tags/')
33 | env:
34 | NAME: proxypool
35 | BINDIR: bin
36 | run: make -j releases
37 |
38 | - name: Release
39 | uses: softprops/action-gh-release@v0.1.5
40 | if: startsWith(github.ref, 'refs/tags/')
41 | env:
42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
43 | with:
44 | files: bin/*
45 | draft: true
46 | prerelease: true
47 | body: "Place config.yaml in work dir and run with `-c config.yaml`"
48 |
49 | - name: Upload artifacts
50 | uses: actions/upload-artifact@v2.2.0
51 | if: startsWith(github.ref, 'refs/tags/')
52 | with:
53 | name: build
54 | path: bin
55 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Binaries for programs and plugins
2 | *.exe
3 | *.exe~
4 | *.dll
5 | *.so
6 | *.dylib
7 | go.sum
8 | proxypoolCheck
9 | bin/*
10 | tmp/*
11 |
12 | # Test binary, build with `go test -c`
13 | *.test
14 | # Manually add it if neccessary
15 | *_test.*
16 |
17 | # Output of the go coverage tool, specifically when used with LiteIDE
18 | *.out
19 |
20 | # dep
21 | vendor
22 |
23 | # GoLand
24 | .idea/*
25 |
26 | # macOS file
27 | .DS_Store
28 |
29 | # assets
30 | assets/html/*
31 | assets/css/*
32 |
33 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | NAME=proxypoolCheck
2 | BINDIR=bin
3 | VERSION=$(shell git describe --tags || echo "unknown version")
4 | GOBUILD=CGO_ENABLED=0 go build -trimpath -ldflags '-w -s'
5 |
6 | PLATFORM_LIST = \
7 | darwin-amd64 \
8 | linux-386 \
9 | linux-amd64 \
10 | linux-armv5 \
11 | linux-armv6 \
12 | linux-armv7 \
13 | linux-armv8 \
14 | linux-mips-softfloat \
15 | linux-mips-hardfloat \
16 | linux-mipsle-softfloat \
17 | linux-mipsle-hardfloat \
18 | linux-mips64 \
19 | linux-mips64le \
20 | freebsd-386 \
21 | freebsd-amd64
22 |
23 |
24 | all: linux-amd64 darwin-amd64
25 |
26 | docker:
27 | $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
28 |
29 | darwin-amd64:
30 | GOARCH=amd64 GOOS=darwin $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
31 |
32 | linux-386:
33 | GOARCH=386 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
34 |
35 | linux-amd64:
36 | GOARCH=amd64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
37 |
38 | linux-armv5:
39 | GOARCH=arm GOOS=linux GOARM=5 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
40 |
41 | linux-armv6:
42 | GOARCH=arm GOOS=linux GOARM=6 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
43 |
44 | linux-armv7:
45 | GOARCH=arm GOOS=linux GOARM=7 $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
46 |
47 | linux-armv8:
48 | GOARCH=arm64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
49 |
50 | linux-mips-softfloat:
51 | GOARCH=mips GOMIPS=softfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
52 |
53 | linux-mips-hardfloat:
54 | GOARCH=mips GOMIPS=hardfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
55 |
56 | linux-mipsle-softfloat:
57 | GOARCH=mipsle GOMIPS=softfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
58 |
59 | linux-mipsle-hardfloat:
60 | GOARCH=mipsle GOMIPS=hardfloat GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
61 |
62 | linux-mips64:
63 | GOARCH=mips64 GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
64 |
65 | linux-mips64le:
66 | GOARCH=mips64le GOOS=linux $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
67 |
68 | freebsd-386:
69 | GOARCH=386 GOOS=freebsd $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
70 |
71 | freebsd-amd64:
72 | GOARCH=amd64 GOOS=freebsd $(GOBUILD) -o $(BINDIR)/$(NAME)-$@
73 |
74 | gz_releases=$(addsuffix .gz, $(PLATFORM_LIST))
75 |
76 | $(gz_releases): %.gz : %
77 | chmod +x $(BINDIR)/$(NAME)-$(basename $@)
78 | gzip -f -S -$(VERSION).gz $(BINDIR)/$(NAME)-$(basename $@)
79 |
80 | all-arch: $(PLATFORM_LIST)
81 |
82 | releases: $(gz_releases)
83 | clean:
84 | rm $(BINDIR)/*
85 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Proxypool Health Check
2 | ## [中文教程](README_zh_CN.md)
3 |
4 | ## Info
5 |
6 | This is proxy health check and provider part of proxypool. You should have had a
7 | [proxypool](https://github.com/ssrlive/proxypool) server available at first.
8 |
9 | Due to the poor availability of proceeding proxy health check on servers overseas, The best usage of this project is to run on your own server within Mainland China.
10 |
11 | ## Install&Run
12 |
13 | Choose either.
14 |
15 | ### 1. Use release version
16 |
17 | Download from [releases](https://github.com/ssrlive/proxypoolCheck/releases)
18 |
19 | Don't forget to add 755 permissions
20 |
21 | ```
22 | chmod +775 proxypoolcheck
23 | ```
24 |
25 | Put config.yaml into directory and run. You can use -c to specify configuration path.
26 |
27 | ```shell
28 | ./proxypoolCheck
29 | # or
30 | ./proxypoolCheck -c PathToConfig
31 | ```
32 |
33 | ### 2. Use Source
34 |
35 | Make sure golang 1.16 installed. Then download source
36 | ```sh
37 | $ go get -u -v github.com/ssrlive/proxypoolCheck
38 | ```
39 |
40 | And run
41 | ```shell script
42 | $ go run main.go -c ./config/config.yaml
43 | ```
44 | Compile into bin directory
45 | ```
46 | make
47 | ```
48 |
49 | ## Configuration
50 |
51 | ```yaml
52 | # proxypool remote server url. Blank for http://127.0.0.1:8080
53 | server_url:
54 | - https://example.proxypoolserver.com
55 | - https://example.proxypoolserver.com/clash/proxies?type=vmess
56 |
57 |
58 | # For your local server
59 | request: http # http / https
60 | domain: # default: 127.0.0.1
61 | port: # default: 80
62 |
63 | cron_interval: 15 # default: 15 minutes
64 | show_remote_speed: true # default false
65 |
66 | healthcheck_timeout: # default 5
67 | healthcheck_connection: # default 100
68 |
69 | speedtest: # default false
70 | speed_timeout: # default 10
71 | speed_connection: # default 5
72 | ```
73 |
74 | If your web server port is not the same as proxypoolCheck serving port, you should put web server port in configuration, and set an environment variable `PORT` for proxypoolCheck to serve. This will be really helpful when you are doing frp.
75 |
76 | ```
77 | export PORT=ppcheckport
78 | ```
79 |
80 | ## 声明
81 |
82 | 本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接
83 |
84 | 本项目仅限个人自己使用,**禁止使用本项目进行营利**和**做其他违法事情**,产生的一切后果本项目概不负责。
85 |
86 | ## Screenshots
87 |
88 | 
89 |
90 | 
91 |
--------------------------------------------------------------------------------
/README_zh_CN.md:
--------------------------------------------------------------------------------
1 | # Proxypool 健康检查
2 |
3 | ## 导航
4 | - [简介](#简介)
5 | - [安装和运行](#安装和运行)
6 | - [配置](#配置)
7 | - [添加自启](#添加自启)
8 | - [声明](#声明)
9 |
10 | ## 简介
11 |
12 | 此项目为[proxypool](https://github.com/ssrlive/proxypool)的代理池节点可用性检测部分,并提供检测后可用的代理。
13 |
14 | 此项目推荐在本地(即您家里)部署,或是的中国大陆服务器上运行,以提升代理池节点的实际可用比例。
15 |
16 | 在使用此项目之前,您应该有一个(或知道一个)可用的[proxypool](https://github.com/ssrlive/proxypool)服务器。
17 |
18 |
19 | ## 安装和运行
20 |
21 | 二选一
22 |
23 | ### 1. 用构建好的(推荐)
24 |
25 | 从[releases](https://github.com/ssrlive/proxypoolCheck/releases)中下载
26 |
27 | 将下载的文件重命名为proxypoolcheck(可选)
28 |
29 | 不要忘了给文件添加755权限,否则无法运行
30 |
31 | ```
32 | chmod +775 proxypoolcheck
33 | ```
34 |
35 | 您可以将config.yaml放在与proxypoolcheck文件同一文件夹内,或使用 -c 指定配置路径
36 |
37 | ```shell
38 | ./proxypoolCheck
39 | # or
40 | ./proxypoolCheck -c /指定目录/config.yaml
41 | ```
42 |
43 | ### 2. 源代码运行
44 |
45 | 确保安装golang,然后下载源码
46 | ```sh
47 | $ go get -u -v github.com/ssrlive/proxypoolCheck
48 | ```
49 |
50 | 运行
51 | ```shell script
52 | $ go run main.go -c ./config/config.yaml
53 | ```
54 |
55 | ## 配置
56 |
57 | 基本的配置
58 |
59 | ```yaml
60 | # proxypool远程服务器的地址,空白为http://127.0.0.1:8080
61 | server_url:
62 | - https://example.proxypoolserver.com
63 | - https://example.proxypoolserver.com/clash/proxies?type=vmess
64 |
65 |
66 | # 对于您的本地服务器
67 | request: http # http / https
68 | domain: # default: 127.0.0.1
69 | port: # default: 80
70 |
71 | cron_interval: 15 # default: 15 minutes
72 | show_remote_speed: true # default false
73 |
74 | healthcheck_timout: # default 5
75 | healthcheck_connection: # default 100
76 |
77 | speedtest: # default false
78 | speed_connection: # default 5
79 | speed_timeout: # default 10
80 | ```
81 |
82 | 需要修改的参数:
83 |
84 | - `server_url`:远程服务器链接,可以使用筛选参数。支持多种来源
85 | - `request`:要显示到网页的协议,默认 http,可选 https。
86 | - `domain`:要显示到网页的域名,默认 127.0.0.1。
87 | - `port`:要显示到网页上的端口,默认 80。如果本机有其他程序占用需要修改。
88 |
89 | 可选参数:
90 |
91 | - `show_remote_speed`:显示远程速度,默认false,但建议改成true(因为作者写的就是true)
92 | - `cron_interval`:工作间隔,默认15分钟
93 | - `speedtest`:是否开启测速,默认关闭。开启测速会消耗大量流量。
94 | - `speed_connection`:测速并发连接数,默认值为 5。
95 | - `speed_timeout`:单个节点测速时间限制,默认值为 10,单位为秒。超过此时间限制的节点会测速失败
96 | - `healthcheck_timeout`:单个节点健康检测时间限制,默认值为 5,单位为秒。超过此时间限制的节点为无效节点
97 | - `healthcheck_connection`:节点健康检测并发连接数,默认值为 100。丢失大量可用节点时可大幅减少此项数值。
98 |
99 |
100 | 如果您的Web服务器端口与proxypoolCheck服务端口不同,应该将web服务器端口放在配置中,并且设置环境变量`PORT`以供proxypoolCheck服务。当您使用frp时,这将非常有帮助。
101 |
102 | ```shell
103 | export PORT=ppcheckport
104 | ```
105 | ## 添加自启
106 |
107 | 此部分适用于Linux。
108 |
109 | **配置 systemd 服务**
110 |
111 | `vim /etc/systemd/system/proxypoolcheck.service` 填入下面内容:
112 | ```
113 | [Unit]
114 | Description=proxypoolcheck
115 | After=network-online.target
116 |
117 | [Service]
118 | Type=simple
119 | Restart=on-abort
120 | ExecStart=/proxypoolcheck所在的目录/proxypoolcheck -c /指定配置文件目录/config.yaml
121 |
122 | [Install]
123 | WantedBy=default.target
124 | ```
125 |
126 | **重载 systemd 服务**
127 |
128 | ```
129 | systemctl daemon-reload
130 | ```
131 |
132 | **启动proxypoolcheck服务**
133 | ```
134 | systemctl start proxypoolcheck
135 | ```
136 | 执行`systemctl status proxypoolcheck`确认有以下信息
137 |
138 | ```
139 | ● proxypoolcheck.service - proxypoolcheck
140 | Loaded: loaded (/etc/systemd/system/proxypoolcheck.service; enabled; vendor preset: enabled)
141 | Active: active (running) since Sun 2021-03-21 14:53:55 UTC; 9s ago
142 | ```
143 |
144 | **添加开机启动**
145 | ```
146 | systemctl enable proxypoolcheck
147 | ```
148 |
149 | **查询服务是否开机启动,enabled即开启自启**
150 | ```
151 | systemctl is-enabled proxypoolcheck.service
152 | ```
153 | **`reboot`重启后`systemctl status proxypoolcheck`看看是否正常,如果正常,您就可以给个star,然后关闭网页,尽情享受**
154 |
155 |
156 | ## 声明
157 |
158 | 本项目遵循 GNU General Public License v3.0 开源,在此基础上,所有使用本项目提供服务者都必须在网站首页保留指向本项目的链接
159 |
160 | 本项目仅限个人自己使用,**禁止使用本项目进行营利**和**做其他违法事情**,产生的一切后果本项目概不负责。
161 |
162 | ## Screenshots
163 |
164 | 
165 |
166 | 
167 |
--------------------------------------------------------------------------------
/api/html.go:
--------------------------------------------------------------------------------
1 | // Code generated by go-bindata. DO NOT EDIT.
2 | // sources:
3 | // assets/html/clash-config-local.yaml
4 | // assets/html/clash-config.yaml
5 | // assets/html/clash.html
6 | // assets/html/index.html
7 | // assets/html/surge.conf
8 | // assets/html/surge.html
9 | // assets/css/index.css
10 | package api
11 |
12 | import (
13 | "bytes"
14 | "compress/gzip"
15 | "fmt"
16 | "io"
17 | "io/ioutil"
18 | "os"
19 | "path/filepath"
20 | "strings"
21 | "time"
22 | )
23 |
24 | func bindataRead(data []byte, name string) ([]byte, error) {
25 | gz, err := gzip.NewReader(bytes.NewBuffer(data))
26 | if err != nil {
27 | return nil, fmt.Errorf("Read %q: %v", name, err)
28 | }
29 |
30 | var buf bytes.Buffer
31 | _, err = io.Copy(&buf, gz)
32 | clErr := gz.Close()
33 |
34 | if err != nil {
35 | return nil, fmt.Errorf("Read %q: %v", name, err)
36 | }
37 | if clErr != nil {
38 | return nil, err
39 | }
40 |
41 | return buf.Bytes(), nil
42 | }
43 |
44 | type asset struct {
45 | bytes []byte
46 | info os.FileInfo
47 | }
48 |
49 | type bindataFileInfo struct {
50 | name string
51 | size int64
52 | mode os.FileMode
53 | modTime time.Time
54 | }
55 |
56 | func (fi bindataFileInfo) Name() string {
57 | return fi.name
58 | }
59 | func (fi bindataFileInfo) Size() int64 {
60 | return fi.size
61 | }
62 | func (fi bindataFileInfo) Mode() os.FileMode {
63 | return fi.mode
64 | }
65 | func (fi bindataFileInfo) ModTime() time.Time {
66 | return fi.modTime
67 | }
68 | func (fi bindataFileInfo) IsDir() bool {
69 | return false
70 | }
71 | func (fi bindataFileInfo) Sys() interface{} {
72 | return nil
73 | }
74 |
75 | var _assetsHtmlClashConfigLocalYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\xaf\x24\xc7\x75\xdf\x77\x02\xfc\x1f\x2e\xec\x0f\x4e\x80\xe9\xde\x3b\x33\xf7\x0d\x04\x01\x4d\xea\x41\x5b\x96\x04\x52\x82\x93\x4f\xc1\xe9\xaa\xea\xee\x73\xbb\x5e\x5b\x8f\xe9\xe9\x31\x0c\x30\x46\x84\xb5\xa8\x48\x8a\x13\x45\x06\x6c\x29\xb4\x62\xc9\xa2\x6c\x39\xb2\x22\x47\x52\x24\x51\xfa\x67\x78\x97\x9b\x4f\xe6\x9f\x10\x74\xcf\xcc\xbd\x7b\x5f\x5d\x67\x88\xcd\x6e\x82\xd0\x16\x05\xea\xce\xaf\xaa\x4e\x55\x9d\x3a\x75\x5e\x75\xfa\xb7\xf7\x1e\x7f\xf9\xad\xc7\xdf\xfa\xf2\x93\xb7\xff\xe4\x83\x3f\xf9\x9f\x17\xdf\x7e\xf4\xfe\x2f\xbf\x76\xf1\xa5\x1f\x5e\xfc\xea\xad\xf7\x7f\xf1\x1f\x9f\xfc\xdb\x6f\x7c\xf0\xde\x9f\xbd\xff\xf3\xb7\x1f\xbf\xfd\x9f\x2e\xbe\xfe\xcd\x7f\xfa\xd5\xbf\x7f\xff\xbd\xdf\x7c\xf0\x8d\x77\x99\x04\x5f\x3f\x79\xf4\xb7\x17\x6f\xbf\xfb\xf8\xaf\xdf\x7a\xfc\xce\xf7\x2e\xbe\xfe\xa3\x0f\xbe\xf1\xee\xe3\xb7\xbe\x7f\xf1\xd5\x9f\x5c\x7c\xfd\x47\x2f\xbf\xf4\xdb\x7b\xeb\x26\x1f\xbc\xfb\x95\x8b\x5f\x7c\xfd\xe2\x67\xff\xfd\xe2\x57\x6f\x3d\xfe\xc5\x7f\xf8\xa7\x5f\xfd\xc5\x5e\x1d\x82\xf5\x67\x0f\x1e\x54\x18\xea\x58\xe4\xcc\xa8\x07\xab\x38\x6d\x1e\x58\x67\x96\x9d\x35\x46\xbe\xfc\x52\xdf\xde\x1a\x17\xf6\x4c\xb9\xf7\xe9\x2f\x7c\xe1\xf3\x2f\xbf\xd4\xff\xaf\xb3\xbd\xe3\x93\xd3\xfd\xeb\xbf\xbe\xf9\xb9\x57\x7f\xff\xcd\xc3\x97\x5f\xf2\x86\x35\x3e\xbb\x44\x4d\xd7\xa8\x7f\xd6\x37\xde\x03\xcd\x37\xb8\x3d\xd4\x7b\x46\x8b\xa1\xf5\x3f\xef\x01\x0a\x97\x82\x67\x37\x3b\x77\x82\xa3\x5b\x0f\x51\x1a\xb7\xf7\x19\xd4\x71\x39\xf4\xa2\x80\x7d\xee\xcd\x4b\xc4\x55\xbb\x59\xdf\x0e\xa4\x34\x6d\x26\x41\x9f\xed\x95\x20\xbd\x78\xf9\x25\x65\xb8\x38\xdb\x73\x51\x8a\x97\x5f\x92\xa6\xca\xa4\x58\x08\x79\xb6\x87\xba\x34\x2f\xbf\x24\x96\x41\x38\x0d\x32\x63\x46\x07\x67\xa4\x14\xee\x6c\x6f\x3a\x3b\xce\xf7\xf3\xfd\x7c\x7a\x76\xba\xbf\xa6\xa6\x5f\x15\x14\xfe\x6c\xfb\xef\x5d\x56\x39\x13\x6d\xff\x87\xbd\xbd\x6c\x4f\x83\x12\x67\x7b\x17\x5f\x7a\xf7\xe2\xc7\x6f\xfd\xaf\xb7\xbe\xfc\xf8\x2b\x3f\xe8\xff\xbe\xb7\x17\x3a\x2b\xce\xf6\xbc\x90\x82\x85\xf5\x5f\xae\x3a\xda\x1b\xfe\x2f\xdb\xbb\xf8\xe5\x4f\x9f\xfc\xe6\x9d\xc7\xdf\x7a\xeb\xfd\xf7\xbe\x76\xf5\xd7\x75\x2f\x17\x7f\xf9\xde\xc5\x7f\xfb\xe9\xcd\xbf\xae\x99\xe4\xa9\x1e\xbe\xfb\xe3\x27\xff\xf8\xbd\x8b\x3f\x7d\xf4\xf8\xab\xff\xf5\xea\xaf\x4f\xfe\xf1\x9d\x27\xef\xbd\x77\xf1\xed\x47\x4f\xbe\xf3\x9d\xa7\xa9\xbc\xdd\x33\x85\xca\x0f\xdf\x79\xf4\xee\x87\xef\x3c\xfa\xc9\xde\xfb\x3f\xff\xfb\x8b\xbf\x7c\xef\xda\x0f\x3f\xfa\xf0\x9d\x47\xff\x63\xef\xf1\x9f\x7f\xef\xf1\xb7\x7e\x78\xed\x87\x9f\x7f\xf8\xce\xa3\x1f\xee\x3d\xfe\xe6\x3f\x5c\xbc\xfd\x57\x17\xdf\xfe\xce\xb5\xdf\x7e\xd1\xff\xbe\xf7\xc1\xaf\xbf\x76\xb3\xb7\x7e\x98\xbf\xd9\xbb\x78\xfb\xaf\x1e\x7f\xe5\x37\x17\xdf\xfd\xfe\xb5\xdf\x7e\xd6\x37\xdc\x7b\xff\x37\xff\xee\x83\xf7\xfe\xfc\xf1\x37\x7f\x74\xed\xb7\xbf\x19\x7e\x7b\xfc\xeb\x9f\x5c\x7c\xf7\xfb\x17\x7f\xfa\x83\xf7\x7f\xf1\x17\xb7\xba\xfd\xfb\xbd\x0f\xfe\xec\xbf\x5c\xfc\xf5\xdf\x5d\xfb\xe1\x07\x1f\xbe\xf3\xe8\x6f\xf7\x2e\x7e\xfd\xb3\x9b\x84\xfc\x5d\x3f\xe0\xde\xe3\x9f\xfc\xe7\x9b\x3f\xfc\xf0\xc3\x77\x1e\x7d\x7f\xef\xc9\x57\x7e\x7c\xf3\x87\x9f\x7c\xf8\xce\xa3\x1f\xef\x3d\xf9\xea\xcf\x2e\xbe\xf4\x0f\x4f\x6d\xcf\x97\x7e\xfa\xfe\x2f\xbf\x79\xb5\xe0\xd7\x37\xe2\xe9\xcd\xbc\xbd\x11\xd1\x8b\xa7\x36\x01\xa4\x7c\xba\x83\x3b\xf7\x64\xdd\x47\x74\x32\x0b\xc2\x6f\x7b\x71\xf2\x6c\xef\x77\xfa\x13\x7f\xf6\xe0\x41\xdb\xb6\x79\xe5\x03\x04\x64\xc3\xa9\xaf\x84\x16\x0e\x82\xf8\x37\xb3\xfd\x83\xdf\x59\xe3\x51\x07\xe1\x16\x20\xcf\xf6\xe6\xfb\xfb\x77\x11\xc2\xf4\x0d\x3a\x6e\xb3\xc0\x73\xa1\xe3\xdc\xde\xa0\xe3\x4e\x8e\x7b\x2e\xa4\xf8\xea\x06\x29\xb7\x19\xfc\xb9\xd0\x11\xfd\x1d\x2c\x72\xeb\x3c\x3d\x1f\x2e\x81\x1b\xa4\xdc\x79\x7c\x9f\x0b\x29\x2e\xde\x20\xe5\x3e\x69\xf1\x5c\xa8\x81\x9b\xd4\xdc\x16\x4e\xcf\x67\x83\xea\x1b\x74\xdc\x96\x85\xcf\x85\x0e\x2e\x6e\xd0\x71\x5b\xf4\x3e\x17\x3a\x4a\x77\x83\x8e\xdb\x92\xfe\xb9\xd0\x51\x15\x37\xe8\xb8\x7d\xb1\x3c\x17\x3a\xb4\xbc\xae\xde\x5c\xbf\xc7\x9e\x13\x11\x26\xd4\xc2\x5d\x13\x6a\xb7\x35\xa6\x3b\x09\xb9\xeb\xea\x7c\x06\xf4\x6d\xa9\xb8\xa9\x5f\x6d\xa9\x90\x06\x78\x56\x80\x04\xcd\xc4\xf3\xa1\xe4\xb6\xfe\xb7\xa6\xa4\x04\x29\x0b\x60\xcd\xff\x49\x2a\xb6\xea\xb0\x75\x66\x81\x5c\xb8\xb5\xce\x08\xf1\xec\x69\x42\xfa\xde\x9f\x1a\xed\xb7\x36\xa3\x5d\xa9\xd9\x7f\xf4\x47\x7b\xf9\xa0\xe8\xff\xf1\x1f\x3f\x18\xac\x9a\x07\x1b\x0d\xf4\x5f\xb2\x7f\xf1\xca\x17\x7f\x6b\xa3\x94\x42\xa8\xcf\xf6\xac\x65\xb5\x60\xcd\xe5\x78\x0f\xb6\xff\x96\x41\xcc\x3b\x50\x9b\x69\xd5\x02\x64\xa8\xb3\x01\x7b\x39\x6d\xa1\xa1\x90\xe2\x6c\x2f\xb8\x28\xb6\x7f\xbb\x9a\xcf\xd1\x96\xff\x36\x64\x12\xd6\xa4\xc7\x33\xfd\xec\xe6\xfa\xea\x67\x27\x9f\xfe\xfd\xc9\x17\xfe\x90\x38\x63\xa6\x5f\xc8\x8c\xa3\x7f\x76\x33\xfe\xe2\x9b\xc4\xb9\x46\xff\x62\x76\x17\x9e\xe1\xee\xbe\x42\xdd\x57\x78\x21\x73\x3d\xb7\xcf\x6e\xae\xbf\xf7\x79\xe2\x5c\xcf\xed\x0b\x99\xab\xaf\x9e\xdd\x5c\xdf\xfc\x14\x71\xae\xbe\x7a\x21\x73\x75\xcf\x50\x1a\xbf\x41\x95\xc6\xee\x05\x49\xe3\xfa\x19\x9e\xd7\x4f\x53\xcf\x6b\xfd\x42\xe6\xca\xc5\xb3\x9b\xeb\x6b\x9f\x20\xce\x95\x8b\x17\x32\xd7\xd2\x3d\xbb\xb9\x7e\xf2\x0d\xe2\x5c\x4b\xf7\x42\xe6\x5a\x15\xcf\x6e\xae\x9f\xfa\x5d\xe2\x5c\xab\xe2\x85\xcc\x55\xcb\x67\x37\xd7\xcf\x7e\x86\x38\x57\x2d\x5f\xc8\x5c\xd7\x96\xcc\xb3\x9a\xaf\xbe\x52\x17\x27\x5f\x7c\x73\xf2\xea\x2b\x93\xdf\xfb\xfc\xe4\xcd\x4f\x4d\x5e\xf9\xe2\xe4\xd5\x4f\x4f\x5e\xfb\xc4\xe4\x53\xbf\x3b\xf9\xec\x67\x26\x9f\x7c\x63\x42\x96\xd9\x6b\x02\x5f\xc8\xda\x80\x7c\x56\x8c\x40\x9b\xeb\x0b\x98\xe4\xcb\x2f\xb9\x28\xc5\x36\x64\xf0\xda\xe7\xfe\xe0\x95\xd7\x3f\x9b\xbd\xf9\xc5\x4f\x7e\xf2\xf5\x7f\x35\xf1\x2a\xd8\xc9\x6b\xaf\xbf\xf1\x89\x57\xbf\x70\xed\xe7\xdf\xff\xc4\xbf\xfe\xc3\xcf\xbd\xf1\xda\x04\x1c\xc2\xec\x12\x70\x57\x0f\xa0\xac\x75\xe6\x5c\xb0\x90\x1b\x57\x4d\x6e\xc6\x22\x6e\xc1\xad\xf5\xd6\x84\x9e\xcc\x24\xb6\x90\xa6\xaa\x84\x23\x61\x2b\x11\x4c\x0c\x12\xb5\x20\x91\x51\x2d\xc2\x3e\xad\xdf\x45\x98\x52\x81\x73\x12\x70\xa9\xb3\x4c\x57\x3e\xb8\x4c\x3a\x38\x39\x1f\x6f\xb3\xdd\x87\xca\x98\x4a\x8a\x34\xae\x5f\xb2\x7e\x7d\x93\x54\x18\x2d\xb8\xc3\x85\xc8\x65\xff\x5f\x24\xba\x0b\xb3\x24\x83\x19\xd7\xa8\x7d\x80\xca\x81\x22\x35\x28\x0b\x2a\x4c\x8d\x2c\xc3\x25\x0a\x38\x47\xed\x89\x5d\x32\xae\x73\x2d\xd2\x6b\x56\x16\xbe\x58\x12\xfb\x6c\x8d\x6b\x14\xa0\x24\xc1\x77\x5b\x2a\x45\x59\x02\x25\xbc\x17\x9a\x7a\x7a\x0c\x8b\x32\xd2\x96\x6b\x0d\xed\x97\x8c\x82\x76\x86\x35\x9e\x17\xa4\x33\xd9\xd6\x10\x3c\x58\x4b\xea\xf8\x12\x3c\xba\x71\xdb\x63\x51\x02\x13\x85\x31\xcd\x1d\xc8\xd7\x3f\x9f\xbd\xfa\xfa\x6b\x6f\x4c\xe6\xf9\x74\x36\xcf\xe7\x47\xf9\x74\x76\xf4\x60\x3e\xbb\x86\x9c\x68\x93\x39\xe1\x8d\x5c\x88\x1b\x8d\x0e\xf3\xe9\xe1\x71\x3e\x9b\x1e\xe6\x27\x07\xbb\xb7\x3a\xce\x67\x87\x87\xe4\x66\x87\xb3\xfc\xf0\x24\x9f\xed\x9f\xe6\xd3\x39\x7d\xb0\xc3\x83\xfc\xb4\x9f\xdb\x41\x3e\x9f\xee\xd2\x68\x7a\x34\xcb\x67\x07\xf3\xfc\x64\x7f\xa7\x56\xc7\xf3\x7c\x7e\x90\x4f\x0f\x76\x1a\x6b\x36\x3f\xcc\x67\xf3\x7c\x76\x30\x23\xb7\x9a\x1e\x9d\xe6\x07\x87\xf9\xec\xe0\x24\x9f\x4e\x4f\x92\xcd\xae\x33\x8f\xf5\xcc\xe6\x61\x91\x64\x32\x2b\x1c\x7a\x66\xac\xa0\x80\xfb\x3b\x2d\x0d\x6a\x51\x55\xbb\x00\xd3\x27\x21\xb4\x18\xec\xfa\xe2\x4f\x62\x17\xfd\xfd\x38\x36\xfa\xf6\xc0\xf4\x9d\x06\xe1\x08\x93\x26\xc8\xa2\xc0\x85\x6f\x82\xa1\x1d\xec\x20\xa4\xa8\x1c\xe4\xb6\xa6\x42\x49\xf2\xf0\x12\x7b\xb7\x24\xda\xb2\xd5\xe9\x34\x9f\xee\x9f\xe4\x07\xf9\xfe\x83\x19\x91\x13\x37\x4d\x4e\x76\x6f\x32\x9d\x7d\x84\x36\x47\xbb\xb7\x39\xdc\xa5\xcd\xf4\xe0\x34\x9f\x0e\xe7\x7f\xbf\x6f\xb5\x4f\x6a\x75\x34\x99\xed\xef\x4f\xcf\x8a\xd9\xc9\x59\x39\x9b\xf3\xb3\xb3\x07\x07\x27\x1f\xa1\x61\xb9\x73\xc3\xa3\x63\x76\x76\x20\x4e\x08\xed\xae\xb3\xc3\xa0\x28\x12\xd8\xa6\xc7\x65\xbd\xce\x4a\xe2\xdd\x01\xed\xa9\xea\x84\x86\x85\x70\xf9\xb9\x1d\x61\xc7\xe9\xfe\x3c\x9f\xe5\xf3\x61\x27\xe6\xc4\xfd\x9b\x1d\x0e\x77\xc4\x6c\xff\x84\xbe\x7f\x93\xe9\xc1\x71\x7e\x3a\xcb\xa7\xb3\xbe\xd1\xf4\x98\xd6\x68\xb6\x3f\xcf\xa7\xfb\xbd\xb4\x1f\xce\xcb\x74\x97\x0d\x38\xf0\x35\x38\xc1\x49\xcb\x7a\x38\xdb\x67\x2c\x67\x2c\x09\x3c\x39\x99\x9e\xee\xd3\xb4\xf0\x53\x06\xac\xa6\xe9\xb2\xa7\x15\xd0\x24\x31\x14\x34\x29\xdc\xe3\xb4\x08\x39\x44\x02\x74\xd0\x5b\x68\xec\x07\x0a\x56\xa6\xd7\xcb\xee\x66\xaa\x9b\x86\x18\x56\x82\xb6\x00\x60\x9b\x8c\xd3\x34\x59\xb0\x4d\x89\x9a\xb6\xad\x60\x1b\x85\xce\x19\x9a\x8a\xda\xa3\x8d\x6e\xa8\x58\x1b\x1d\x75\x72\xc1\x20\x27\x62\x1d\xab\x7b\x0b\x08\x3d\x19\x4a\xb2\x89\x5d\x20\x69\x18\xe0\xc2\x60\xe4\x1b\x9a\xee\x0d\x2e\x36\xe0\x73\x4c\x2b\x1b\xe0\x89\xeb\xba\x20\x1e\x84\x45\x25\x69\x2b\x5a\x00\x37\x86\x88\xd4\xbc\x85\xca\xe8\xda\x78\xa2\xfb\x80\x78\x1c\x0b\x51\x83\x66\x82\x24\xb3\x0b\x2c\x0c\xcd\x04\x2c\xb0\xaa\x86\x99\xe5\xa1\x25\x80\xf5\x40\x02\xad\xe3\xc0\x0c\xea\x00\xb2\x21\x71\x57\x81\xa1\x44\x2d\xa8\x54\x07\x45\x87\x66\x2b\xb2\x1f\x47\x9a\x05\xd2\xd8\xb6\x90\xc6\xa8\x42\xb8\x2a\x67\x7a\x17\x30\xa9\xeb\x58\x38\xd7\xd1\xb0\xc6\x34\xe4\xed\x33\xa6\x19\x5c\x23\x04\xb9\x7b\x29\xce\x69\x1d\x7b\x89\x25\x91\x35\xa9\x8c\x19\x3d\x6a\xe1\x3d\x6a\x3f\x38\x24\x49\x6d\xda\x7a\x4a\x22\x82\x81\x0f\x3d\x21\x25\xc1\x45\xd4\x1f\x4f\x20\x78\x92\x5a\x9a\xc7\xa9\x06\x5d\xd1\xe4\x6d\x0f\xd5\x42\x6a\xd1\x7a\xf0\x08\xb4\xee\x9b\xe9\x3e\xcd\x11\xc8\x24\x38\x34\x7a\x17\xa7\x28\x93\x9d\xcd\x91\xb0\xba\x1a\xa8\x9c\xc3\x8c\xb2\xe0\x30\x08\x56\xd3\xa8\x36\xda\xd4\x40\x61\x60\xe6\x22\x43\xa0\xa9\x03\x2c\x90\x59\x9d\xb5\x64\x64\x57\x08\xc7\x02\xcd\x59\xc6\x01\x65\xa7\x0c\xf9\xd2\x1c\xf0\x0b\x14\x2d\x85\x12\x0e\x51\x91\x8e\x45\x0f\xa4\x9a\x05\x9c\x81\xe3\xa4\xd1\x85\xb0\x1c\x3d\x33\x51\xd3\x2e\x44\x2e\xac\xf1\x18\x6c\x6d\x82\xa1\x69\x94\x5c\x2c\x10\x74\x00\x47\x1c\xa0\xa7\x46\xeb\x9e\xed\x09\xb6\xd5\x80\x76\x9c\xea\xf1\x7b\x0a\x4e\x5a\x46\xf4\x0f\x89\x2e\x4d\x2e\x85\x63\xd2\x44\x9a\xda\xca\xb5\x9f\x55\x34\x9d\x85\x9b\xf6\xdc\x68\x41\xa4\xc2\x19\x4b\x95\xe1\x1b\x6c\xf4\xc2\x31\xa3\x83\xa0\x32\x40\x64\x4d\xff\x0f\x95\x7c\x9a\xe4\xe5\x9d\x8e\x24\xa0\x00\x17\x6a\x46\xf4\x72\xaf\xed\x1e\xe1\x16\xc8\x04\xe5\x34\x88\x5e\x82\x29\x24\xea\x86\x82\x57\xa2\xbf\xab\xa8\x87\x52\xf0\xb4\xad\x26\xa4\x05\xa4\xed\xb5\xd0\xa0\x3b\xd0\x55\xae\x3a\x02\x96\x75\x4c\x1a\x2b\x38\xf1\xaa\x12\xde\xa0\xcb\x8b\xf4\x01\x14\x43\xd8\x95\x81\xa6\xd8\x08\x22\x3a\xd3\xdf\x98\x34\x12\x16\x66\x85\xb4\x48\x89\x10\x5c\xd2\x34\xb2\x12\x5d\x7f\x9b\x01\x21\x50\x23\x91\x35\x34\xcd\xa6\x94\x18\x02\xed\x38\x94\xc6\x09\xac\xb4\x35\x12\x19\x8d\xe2\xa7\x7f\x2f\x9c\x69\xbd\x70\x24\x7d\xe0\xe9\xdf\x5b\xc1\x6a\xa0\x31\xf5\xf5\x66\x58\x10\xa7\xe5\x90\x43\x47\x39\x62\x65\x60\x75\xaf\x3a\xd2\xec\x94\x32\xa0\xaa\x48\x87\xab\x82\x20\x28\x2c\x58\x89\x20\x41\x07\xe1\x34\x2d\xc6\x2b\x82\xef\x34\xcd\x06\xac\xa4\x29\x40\x2e\x0c\x32\xe1\x69\x9d\x1b\x93\x6b\x92\xc2\x5f\x19\xc3\x9d\x00\x4e\x3b\x39\x95\x49\xfb\x01\x2a\xb3\xa0\x6c\x57\xe5\x04\x84\xfe\xd0\xd0\x26\x14\x95\x33\x40\xbb\x02\xeb\x82\x66\x6f\xd5\xc2\x99\x86\x76\x37\xd4\x58\xd5\x81\x1a\x2f\xad\x1b\xa2\x2e\x5e\x37\x45\x49\x9a\x7d\xdd\xf4\xd7\x0d\xc3\x40\x3b\xd8\x75\x23\x12\x81\xfb\x2b\x20\xed\xec\xd6\x4d\x65\x24\x17\x34\x25\xb5\x36\x26\xf8\x88\x81\x76\x10\xeb\xc8\xbd\xa1\x1d\x99\xba\xeb\x39\x95\xaa\x88\x63\x11\x50\x11\xb5\x1b\xcc\x18\x14\x44\xa7\x10\x32\x3c\x27\x91\x8b\xcc\x30\x9a\x90\x43\x55\x45\xda\x85\x80\x1a\x03\x46\xa5\x40\x92\x63\xf7\x82\xdd\x1b\x57\xba\x81\xb5\x25\xc9\x1f\x87\xde\x47\xda\xb1\x41\x1f\x0c\x6b\x06\x8d\x9e\x84\x3f\x07\x0b\x7a\xbb\x6b\x14\xe9\x75\x8e\xe7\xb4\x8b\xfc\x1c\x35\x4d\x77\x3d\x6f\x4a\xe3\x88\x76\xd3\xb9\x41\xad\xc0\x07\xc3\x89\x0c\x7c\x1e\x7d\x50\xdd\xf0\x1c\x9c\x36\x40\xf4\xc1\x82\xef\xef\x9f\x34\xb8\x81\x06\x68\xcb\x3c\x20\x99\x71\x34\xcb\xa6\x41\x9a\xfb\xb5\x31\xc4\x2b\xbd\x07\xd2\xc3\x06\x8d\xe1\xa8\x2b\xa2\xe8\x91\x42\x19\xcd\x45\x5e\xa6\x63\xc3\x52\x58\x83\x3a\x90\xa0\x58\x37\xb4\x2b\x45\xa2\x0f\x42\x6b\x13\x88\x72\x47\xe2\x42\xf8\xe0\x04\xd1\xea\x90\xa6\x52\x82\xe8\xa8\x1c\xd2\x7b\x5c\xda\x2e\xe8\x71\xac\x46\x45\x63\x06\x05\x8e\xe5\xa8\xcb\xb4\x94\x50\x10\x82\x70\x3d\x9f\xb7\xe9\x78\x84\x82\x0e\x35\x29\xf3\x40\x09\x8e\x91\x98\x89\x24\x2a\xc8\xf5\x2a\x8d\x43\x49\xc0\xe8\xca\x12\x8f\x97\x32\x05\x4a\x41\xd4\x01\x54\xe7\x2d\x10\x7d\xeb\x1b\x2c\x35\xbb\x69\x6b\xc5\xd1\xb0\x0b\xa2\xb3\x55\x0b\xd3\x22\x31\x84\x2c\x5a\x1f\xc0\x02\x49\x36\x6a\xb1\xc4\x00\x92\x68\x6d\xe9\xba\xc9\xcd\x3d\xe1\xe9\x1b\x48\x64\x43\x6e\x2b\xe9\x3e\xd1\x88\x39\x30\x1a\xb2\x69\x04\xed\xee\xd1\xa6\x44\x49\x32\x21\xb4\xa1\xf9\x34\xb4\x6b\x72\x4d\xe8\xae\xa3\x69\x77\xba\x1b\x4c\x27\x9a\xfd\xde\x83\x35\xc5\x81\xd6\x03\x69\x07\x46\x77\x74\x4d\x6d\xc0\x12\x79\xba\x0b\xd2\x90\xa1\x3e\x74\x44\x05\xd0\x34\x14\xb9\x6a\x1a\x62\xa4\xca\x68\x4a\xf2\x80\x71\x28\x74\x00\x39\x78\x80\x07\x15\x98\xe0\x9c\x31\x0b\xe1\x18\xf8\x40\x09\x78\x58\x90\x43\xd0\x8e\x42\xb2\x05\x93\xf5\xd2\x90\x22\x04\x2c\x38\x2f\xd6\x07\x90\xd4\x75\xb1\x24\x72\x82\x65\x7c\x41\x36\x06\x2c\xab\x8d\x12\x74\x34\xd9\xdf\x6a\x91\x01\x33\x8a\x98\xe1\x66\x51\x53\xb9\xd7\xe2\x12\x17\xb4\x15\x96\xd0\x09\x47\xda\x63\x19\x1d\x71\x87\xcd\xf4\x84\xb4\x52\x26\x40\x30\x39\x52\x7a\x0c\x10\x3c\x91\x09\x1c\x7a\x95\x15\x4e\x00\x2d\x88\x3c\xbc\x71\x28\x91\x78\x83\xd9\x40\xa2\x37\x0c\xae\x16\xd2\x22\xc4\x22\x92\x59\xab\xc7\x92\x70\x4e\x80\xa5\x6d\xd6\xc3\x68\x1c\x4d\x78\x0f\x48\xaa\x57\xd9\x41\x13\x83\xa0\x66\xec\xf4\xa6\x39\xea\xea\x52\x92\x53\x26\xd9\xb7\x51\xc4\x0c\x0b\x27\x78\x11\x0b\xaa\x91\xee\x04\xe7\x48\xbb\xfd\xd6\x50\x45\x76\x60\x3b\xe1\x51\x22\x95\xe8\x38\x28\xc1\x3b\x60\xd7\x84\x90\xf6\xa7\x44\x8a\xf5\xe2\x70\x49\x17\x67\xce\x00\xf7\xb5\x69\xf3\xfa\xae\x6c\xf4\xeb\x58\xcf\x88\x46\x83\x67\x0e\x0b\xda\xf8\x5e\x40\xa8\xa2\xa3\xb9\x17\x7c\x0d\xdc\xb4\x6b\x73\x9a\x22\x26\x7c\x6d\xac\x20\x85\x6b\xbc\x44\x2e\x86\x1c\x40\xd2\x4e\x78\x53\x86\x12\x94\x21\x46\xf4\xbc\x89\x9a\xd3\xf7\xc4\xfb\x4d\xfc\x8f\x34\xc7\x00\x2e\x58\xa8\x68\xc7\xc4\x07\x01\x8a\x19\xa5\xa2\xa6\x3a\x17\x7d\x10\x42\x11\x8f\xd6\x06\xdb\x82\x94\x44\x47\x63\x38\x3a\xa2\x91\xd1\xdb\x15\x64\x7d\x25\x08\x66\xb2\x9a\x76\x97\x0c\x58\x65\x88\x58\xce\x3b\x1f\x69\xe6\x58\x10\xcb\xd0\x2b\xf8\x94\x74\xf0\x5a\x54\x11\x1c\x47\x20\x76\x5d\x8b\x8d\x63\x90\x0a\x0f\x0b\x4e\x7b\xd2\x14\x50\x8b\x8e\xc6\x4c\xc1\xb8\x5d\xd2\x4a\x42\x54\x85\xa4\xdd\xd8\x21\xba\xc2\x14\x18\x48\x87\x31\xc4\x00\xda\x04\x9a\x30\x0f\x8b\xc2\x2c\xa9\x66\x57\x24\x1a\xde\x51\x7b\x21\x34\x25\x0f\x33\xda\xb5\xb8\x57\xe9\xe5\x8a\x36\x18\x6e\x5a\x22\x05\xae\x00\xcd\x91\x05\x34\x1a\x88\x29\x65\x71\xe3\x88\x22\xa4\x7a\xc6\x16\x74\xa0\xc9\xba\xc5\xcc\x01\x6d\xfc\x05\x16\x44\x05\x6e\xb0\x26\xac\x13\x9e\x48\x02\x2a\xa2\xf1\xb1\x30\xb0\x4b\x0c\x71\x61\x80\x1c\x73\x5e\x98\x25\x75\x76\x2b\x1a\x37\xb6\x73\xcf\x6a\x63\x24\x6d\xfc\x16\x7c\xdd\xab\x67\x46\x5b\x6a\x86\x6a\x0b\x21\x58\x62\xcc\xad\xad\x8d\x70\xa4\xe3\xd9\x62\x83\x0a\x2c\xd2\xbc\x42\x3d\x7a\x9d\x5b\x40\x45\x3f\x8c\x26\xd0\x62\x8a\x3d\xba\x05\x62\x3a\x78\x8b\x3a\xf2\x92\x08\x25\x26\x77\xb7\xc6\x71\x3a\x1b\xb7\xc6\x35\xa5\x34\x2d\x45\xae\xb4\xc6\x49\xce\x80\x26\x88\x5b\x4f\x8b\x16\xf6\x38\xca\x0e\x2f\x6b\x50\x3e\x10\xb9\x7d\xa9\xb3\xec\x74\xbf\x6d\x17\x61\x7f\x4e\x7c\xe9\xab\xb3\x0c\x67\x2e\x9e\x3c\x9c\x3d\xa4\x99\xd2\x4b\xbd\xa4\xb9\x62\x96\x83\x64\xa1\x6d\x47\x07\x35\xd1\x72\xe9\x40\x73\xb1\xa4\xf8\x8c\x3a\x66\x54\x81\x1a\x02\xf1\xd5\x41\x27\xe8\x29\xa2\x9d\xf0\x19\x59\x5a\x75\x46\x61\x74\x48\x34\xfd\x3a\x13\xb3\x4a\xd0\x98\x6d\x05\xa6\x20\xfa\xd1\x57\x34\x0d\x65\x25\xa4\x24\x76\x28\x9c\xd1\x22\x50\x3c\xb1\x2b\x63\x54\x1e\x47\x0e\xda\xe5\xd3\xf7\xa1\x50\x74\x1a\x77\x0e\x23\xd7\xea\x16\x64\x87\x5a\x0a\xc2\x13\xde\x0c\x5b\xe3\x46\xf2\xcf\xb7\xa8\x5e\xc4\x49\x01\x0d\xe1\x45\x88\x05\x17\x94\xd0\xc1\x41\x40\x5d\x11\x9f\xf4\x6c\x1b\xd1\xe0\x05\xe8\x66\x1d\x1c\xe9\xef\x7a\x5a\x13\x24\x06\x30\x0a\x63\x9a\x60\xec\xfa\x30\x50\xde\x2e\x31\xd6\xcb\x47\x02\x2b\x30\xa1\x03\x44\xb7\x7e\x2d\x51\xa4\xed\x6d\x26\x05\x38\x1f\x1d\xf9\xc9\x04\x33\x9e\xea\x29\x67\x0e\x58\x43\x74\x81\xdc\xc8\xa7\x4d\xbf\x56\xe0\xe8\x69\xd9\xd8\x5c\x29\xa2\x64\x58\x23\x09\x3d\xea\x85\xe1\x14\xcd\x53\xec\xb2\xb0\x62\x19\x14\x04\x87\xc4\xaa\x08\xe0\x87\x97\xca\x04\x39\x5d\x4a\xb4\x85\x01\x47\x53\x1d\x4a\x0d\x8c\x92\xf0\x38\xe0\x48\x1d\x46\xdd\x74\x54\x3f\x72\xb9\xd4\x22\xf4\xba\x03\x31\xc3\x4b\x84\xd0\xa1\x82\x8a\xe8\x85\x27\x26\xeb\xd6\x82\xa8\x13\x9d\x33\x2b\xb4\x16\x34\x93\xe1\x1c\x45\x1d\x81\xc2\x37\x0a\x50\x96\x82\xca\x38\x7a\x78\xc6\xd6\x52\x1f\xde\x69\xe2\x53\x2e\x2d\x96\xc4\x3c\x7f\x6d\x1c\xf7\xc1\x19\xda\xe9\xb9\x44\x0f\xfb\xb6\x5b\x93\x5e\xa0\xd0\x7c\x39\xd1\x0a\x67\xc9\x7c\x11\xc0\x55\x54\x9f\x4f\x8d\xba\xa9\x84\x20\xfa\x72\x1c\xb0\xd2\x68\xda\x34\x07\xb7\xd6\x9c\x76\x4c\xa3\x95\x06\xf8\x7d\x6f\x9e\x6f\xd8\x68\x62\x41\xb4\x28\x31\x52\xd8\x73\x41\x9b\xfb\xc2\x0f\xf7\x44\x5a\x8f\x2d\x91\xec\xcf\x5b\x41\x08\x09\x45\x76\x12\x84\x0f\xa5\xc4\xaa\x0e\x39\x58\x4b\xbc\x7f\xc0\x5a\x1f\x4c\xee\xee\x17\x7c\x9b\xd7\x66\x18\xa2\x16\x9e\xd0\xf3\xa4\x96\xbb\xa0\x87\x87\xf1\x04\xdc\x2e\x3d\x62\x56\xc9\x22\xf3\x02\x72\xaf\x8c\xa1\x2c\xc7\x44\x1a\xd3\x44\x9b\x81\xc5\x5d\x16\xaf\x60\xf9\xb2\x4b\xe7\xae\x80\xe6\xce\x20\xf1\x45\xf3\x1a\x8b\x25\x8d\x31\x38\x82\x34\xd5\x60\x71\x92\x7a\x8f\xc1\x70\x07\xc4\xe7\x70\x60\x31\x80\xa4\xdd\x60\x4c\xb8\x80\x25\x32\x08\x22\x0b\x0e\xb4\xb7\xe0\x84\x66\x1d\xf1\x35\x9d\xdb\x04\x7e\x89\x50\xb1\xb4\xc2\x21\x5d\xa9\x5d\xb7\xf2\x01\x02\xd1\xfb\x3f\x34\xc0\x48\xcb\xc9\x64\x4e\x40\xc0\x85\x90\x50\x1c\x12\xb5\xbe\x22\xd2\x96\x95\x0b\x61\x15\xf5\x35\x7c\x89\x4e\x14\xe0\x05\x31\xee\x55\x89\xa0\xb8\x24\x65\xcd\x57\xb6\xa6\x5d\x13\x15\xb9\x60\x55\xa5\x0c\x8f\x92\xac\xc0\x70\xc3\x88\x49\xf5\x12\x74\x45\x83\x5e\x95\xbb\x4b\x63\x17\x34\x58\x1b\x76\xf1\xae\x63\x00\x6f\xca\xd0\x02\x51\xef\x52\xc0\x45\x8b\xa1\x66\x86\xa8\xf4\x28\x08\xc2\x21\x90\x36\xd9\x1a\xd9\x29\xe1\xb2\x9d\x4a\xf1\x71\x85\x3a\x77\x82\x81\x0d\xac\x26\x46\x44\x77\x42\xfb\x7a\x48\x51\x14\x9c\x32\x05\xdf\x69\xe1\xaa\x8e\xe8\x19\x0e\x42\x7b\xe3\x06\xd9\x49\x0a\x85\x94\x75\x2c\x72\x2e\x08\x65\x9c\x50\x86\xc2\x45\xa2\xa1\xd6\xc2\x42\x58\x67\x82\x61\x46\xd2\x5c\x81\xd0\x29\xda\x09\x6f\x45\xa1\x76\xd9\xce\x56\x14\x2e\xd0\xce\x59\x5b\x43\xd8\xe5\x3d\x52\xaf\xa7\x6f\x4a\x47\x11\x5c\x7c\xf9\xf0\xf6\x58\xa7\x93\xa7\x3a\x13\x43\xa4\xd8\x6d\x5d\xa0\xa1\xa8\x16\xdb\x94\x3b\x9a\x48\x18\x80\x2a\xed\xdb\x29\xa4\x29\x72\x66\x9c\xc8\x5b\xd4\xdc\xb4\xb4\xe4\x73\x89\x0b\x51\xa2\x14\x3e\x18\xa2\x0c\xb9\xac\xda\x48\x8b\x0d\x1b\xd7\x5b\x2b\xe4\xa2\x8d\xdb\x06\xca\x8f\xdb\x50\x3d\x19\x4c\xa2\xd0\x21\xf7\xe5\x92\xb2\x3e\xfb\x6e\x45\x49\x0a\x38\x28\x64\xec\x57\xa3\x57\x16\x0b\x4c\xeb\x66\xa7\x05\xd2\x56\x1a\xa4\xdc\x3c\x4c\x1e\x4a\x0e\xa5\xf1\x86\x76\x0f\x16\x6c\xb8\x81\x68\x25\x3e\x42\x2e\xd3\x67\xa2\xc0\xb0\xce\x8a\x20\x0d\x2f\x4d\x45\xaa\x39\x21\x4d\xd5\x9f\x0d\x22\x34\xd0\x12\x21\x0a\x67\x80\x0f\xc9\x8f\xcc\x50\xb2\xc0\x19\xa8\xd2\x11\xd3\x45\x59\x69\x7c\xce\xd3\x67\x9e\x61\xe8\xac\xb1\x51\xae\xcb\xe2\x50\x5a\x48\x13\x79\xe9\x8c\xa6\xc5\xba\x59\xc0\xb0\xa0\xee\x31\x8b\x75\x93\x0b\x1e\x29\xb9\x3d\x2c\x7a\x12\x6e\xf3\xec\x3d\xaf\xd2\x1b\xd2\x43\xe3\x3a\xd6\x45\xea\x79\xfd\x88\xbc\x37\x9b\x48\xda\x6c\x34\x12\x75\x65\x28\x8e\xce\x21\xe1\x6b\x07\x0d\x6d\xfd\x60\x17\xa9\x19\xf2\xa5\x61\xd1\x07\xc0\x16\x34\x65\x5b\x9e\xfe\x9d\x92\xcf\x55\x61\x05\x0c\x1d\x23\x5a\x92\x75\x93\xd9\x48\x8b\xa4\xd4\xc6\x87\xb5\xbf\x3d\x8f\xe9\x0d\xaa\x5b\x6a\x22\x21\x96\xb8\x24\x66\x0c\xa1\xad\x8d\x16\x07\xb5\xd1\x55\x63\x88\xae\xff\x75\x9b\xcd\x82\xd3\x1e\xba\x85\x45\x41\x7c\x46\x23\x51\x37\x1e\xa4\xad\x69\x51\x36\x05\xba\x5b\x20\xf1\x35\xad\xea\x80\xed\x90\xf9\x2e\x5a\x5f\x48\xe2\x3b\x41\x6d\x5a\x4a\x92\xab\x36\xed\x2e\xf9\x94\x92\x5a\xc0\xc0\xcf\xf3\x75\xb9\x37\x20\x06\x1c\x3d\x56\x1a\x68\x3a\xaa\x57\xe0\xc2\xf0\x6a\x89\x9e\x41\x67\xc1\x35\xf4\x57\x59\x3e\x38\x21\xc2\xf0\xdc\x9a\xee\x1a\x5d\x57\x10\x4d\x2b\xf0\x34\xd5\x2e\x74\x56\x50\x73\x2f\x22\xd7\x45\x43\x73\x20\x0e\x79\x41\x80\xce\xd7\x48\x2d\x64\x8c\xde\x0a\xe7\x3b\x1f\x84\xa2\x65\x59\xb6\xd8\x10\x43\xd2\xc4\x64\xa6\xd6\xc8\xd2\x81\xa2\x1f\xc2\x65\x46\x2d\x09\x93\x8c\xa2\x4c\xfa\xfb\x67\xc8\x92\xb4\xa6\x15\xa9\x92\x90\x93\xb5\xae\x9c\xc0\xdf\xa9\xd2\x81\x95\x5b\x5a\xee\x28\x78\x7f\xe5\x52\x1d\xa4\x3e\x01\x92\xec\x26\x1b\x8e\x4f\xb3\x91\xcb\xa3\xe0\x2b\x0b\xe0\x7e\x18\xe3\x3a\xa3\x8c\xcd\x1c\xf8\x5a\x76\x01\x99\x4f\x20\xf1\xea\x7c\xa7\x40\xd9\xd3\x65\x66\xee\x07\xab\x14\x71\x6a\xf5\x94\x56\x70\x1b\x36\x69\xdb\x36\xeb\x2f\xbd\x2b\xd2\x72\x68\x80\xeb\xb5\x9a\x3f\xf6\x1d\x82\x8f\x2b\x11\x7f\x5c\x89\xf8\xff\xfe\x4a\xc4\x77\x7b\x3d\x4d\x25\x77\x78\xc0\x35\xb8\x4d\x12\xd9\x1d\x5b\x10\xe6\xeb\xde\xc1\xde\x59\x99\xe8\x6e\x2d\x28\x94\x92\x18\xd1\xdf\x62\x49\x6f\x55\x4b\xb9\x14\x4b\xe2\x7b\xc9\x52\x2e\xc9\x8f\x10\x37\x58\x2a\x0d\x9e\xf6\xaa\xae\x87\xae\xf7\x84\xf6\x10\x77\x58\x08\xae\x7d\x10\x9e\xf8\x69\x91\xeb\x6d\x68\x8f\x99\xaf\xb7\x99\x7d\x84\x36\xb4\xf2\xc8\xd7\xdb\x1c\x7c\x84\x36\xb4\x60\xca\xf5\x36\x47\x1f\xa1\xcd\xf1\x47\x68\x73\xf2\x11\xda\x9c\xde\xd3\xe6\xb2\x18\xf6\x3c\x9f\x1d\x1c\xe5\xbd\xa8\x9a\xd2\x04\xc7\x64\x7e\x9c\x1f\x1f\xe7\xd3\x13\x4a\xf5\xec\x6d\x9b\x83\xc3\xfc\xf0\x78\x3d\x0a\xb1\x4a\xf7\xd1\x41\x3e\x9d\xed\xef\x58\xda\xfb\xe8\x28\x9f\x9e\x1e\xef\xd8\x68\xb8\x15\x8e\x0f\xf3\xf9\x6c\x97\xca\xe3\xa7\xb3\xe1\xab\x11\x47\x07\x3b\xac\xdc\xf4\xf4\x24\x9f\x9f\xe4\xa7\xfd\x75\x32\x3d\xa5\xb7\x39\x38\xcc\x0f\x52\x65\xd1\xef\xf4\x7d\x08\xb1\x22\xfa\x26\xf8\x8a\x6a\xb4\x37\x0d\xb5\xdc\xdf\x25\x92\xe2\xed\x68\x68\x35\x66\xce\x0d\x71\x70\x0b\x9a\x53\x5f\x3f\xda\x41\x79\x1b\xcb\xea\xdc\x1a\x74\x9a\x53\x8b\x2c\xec\xf8\x96\xcb\x6e\xbe\x4d\x93\xee\x97\x8a\xb3\x26\x50\x23\xfa\x03\x36\x2f\xf1\x7e\xe0\x36\x6f\x94\xd4\xeb\x16\x9c\x6d\xd0\x19\x49\x6d\x45\x4e\xad\xce\x7a\x00\xde\x0b\x72\x14\x7e\x28\x9a\x4b\xbb\x0a\xa0\x10\x0a\x48\x95\xc7\x95\x28\x48\x55\x67\xd7\x3d\x12\x12\x7d\x6a\xe8\xa0\x88\x7e\x74\xf4\x75\x6f\x61\xd1\xdb\x16\x0a\x70\x25\xf8\xe8\x81\x9d\x70\x9f\x49\xd4\x02\x5c\xb6\x7b\xc3\x85\xe1\xbb\xb6\xfa\x48\x63\x5d\x2e\x14\x2e\x32\xaa\x04\xea\xb1\x5c\x48\x5c\x08\xd7\xd1\x1a\x0c\x2e\xa7\x1d\x6a\x0d\x38\x54\x04\xcd\x76\x02\x0b\xc3\x95\x3d\xf0\xf3\xb6\xcd\x60\x33\xe1\x3a\xb5\xb6\xb3\xc3\x25\x1e\xec\x2f\x4f\x8f\x25\x46\x96\x13\xfd\xfa\x13\xae\x1e\x72\x7e\x54\xb7\xb3\x83\xc8\x4a\x7a\xab\xd9\xec\xe1\x79\xd5\x2c\x96\xed\x6c\xe6\x8e\xe8\xcd\xa6\x8b\x43\x74\x33\x69\x5b\x77\x62\x3c\xb5\xd9\xd5\xd7\xf7\x16\x86\x73\xf0\x35\x21\x00\x09\x35\xa8\x18\xa8\x77\x44\x05\x6a\x7d\x9d\x8d\x81\xd7\xa8\x8c\x71\x9f\xf7\x0c\x55\xa3\x16\x89\xe9\x0e\x0d\x66\x3b\xb4\xb8\x24\x7f\xc8\xef\xa4\xf8\xc4\x8b\x82\x61\x0a\x7a\xf9\x31\xbc\x82\x95\x8a\xb0\xcc\xb1\xc9\xfa\x33\x90\xbe\xda\x61\x45\x2d\x22\xbd\xd2\x59\x2a\xae\x32\xe1\xd3\xc3\xa9\x3c\x5a\x9c\x08\x77\x58\x70\xb5\x33\x73\x0c\xbc\xb1\x22\x94\xc8\x07\x55\x39\x62\x02\x1b\x47\xaf\x45\x97\x59\x19\x69\x71\xd5\x35\xde\x52\xbf\x1d\xc7\xbd\x37\x61\xdc\x02\x9c\xf4\x8c\xe3\x44\x85\x3e\x08\xb7\xee\x3e\x27\x66\x40\x0b\xcd\x8c\x13\x61\x31\x1e\x8a\x19\x4a\xff\xe6\xfd\xe6\x14\x0e\xab\x3a\x30\x93\x88\x8e\x4f\x0a\x56\x18\x19\x0e\x0e\x8e\xd8\xe1\xec\x78\x4a\x95\x4f\x57\xb1\x2a\x62\x72\xbc\x59\x72\x46\xfc\xe2\x57\x2d\xac\x84\x50\x1a\x47\xcb\x5e\x8e\x56\x76\xc4\x2f\xa7\xd4\xc4\x0a\x73\x75\x61\xa8\x79\xe9\x85\xa1\xbe\xfe\x1d\x3a\x25\x3f\xb7\xba\x42\x8f\xc4\x3a\x37\x9b\x57\x17\x06\xc8\x17\xcb\xba\xda\x8b\x7f\x9a\x3f\x46\xf1\x7e\x9e\x81\xcd\xbc\x89\xa1\x16\xe0\x43\x36\x25\x46\x66\x26\x1c\x70\x5e\xf2\xa9\xa9\xe7\xb3\xc3\x8e\x7c\xa7\x1c\x1c\xb4\x28\x6b\x2b\xcf\xcb\x5c\x2c\x05\x8b\x41\x6c\x32\x5f\x3f\x0a\x09\xfd\xc2\x78\x84\x69\x86\xc4\xc5\xd9\x34\x98\xed\xda\x60\xbe\x6b\x83\x83\x5d\x1b\x1c\x92\x1b\xb0\x32\xdb\xbc\xbf\xb8\xb1\x68\xd6\x19\x9e\xf7\xfc\xb2\x75\x38\xa7\x78\xf0\x10\xc3\x82\xa2\x94\x1a\xa6\x03\x31\x2e\x55\x47\x49\xac\x98\x1b\x65\x44\x9a\x00\xe8\xa1\x3b\x14\x41\xac\xc1\xda\xce\x68\x8a\x5a\x3e\x50\x4b\xc0\x21\x71\xf6\x18\x16\x84\xb4\x81\x1e\x66\xb5\x5d\xbf\x74\xdb\x55\x20\x37\x0d\x3d\xa1\x63\xc0\x8e\xf8\xf4\x07\x40\xd6\xf3\x4f\x10\x2e\x6f\x9a\x7c\xbd\xca\xc9\x7e\x7b\x0d\x3f\x8c\x16\x71\x9e\xf0\x39\x3b\x76\xa8\x9a\x87\xc7\xa7\x5d\x19\xc9\xda\xc1\xe5\x00\xe3\x8c\x39\x00\x9e\xfe\x71\xb3\x96\x35\x6e\xec\xbc\x1d\x15\xb8\x4d\x2b\x9a\xd3\x4f\x75\x87\xa3\xb4\xf1\xf9\xc1\x69\x75\xba\x8a\x28\xf6\x8f\xa2\xd9\x75\xea\xaa\x0b\x8b\x21\x5e\x4c\xbb\x4b\x13\xea\xc2\xc7\x5e\xf1\x8f\xbd\xe2\x1f\x7b\xc5\x3f\xf6\x8a\xff\xff\xee\x15\xbf\xc3\x98\x53\x2c\xd7\x48\x70\xa0\xee\x58\x1f\x96\x96\xa7\xea\x0d\xe3\x34\x6d\xc6\x16\xb4\xac\x1a\x5b\x6b\xaa\x4b\xda\x1a\xa7\x6b\x62\xca\xdf\x06\x6b\x9d\x50\xd4\xea\x51\xbe\xe9\x9a\xcd\xab\xfc\x51\x15\xa1\x06\x85\x25\x68\x9f\x0b\x65\x14\xad\x8e\x5a\x68\x31\xb0\x9a\xf4\x39\xeb\x01\x49\xf5\x24\x86\xb0\xd0\x2d\xad\xe2\x3a\x19\xb9\x40\x9a\x22\x9c\x78\x01\x3a\x24\x18\xf5\x98\x94\x19\x3a\xe1\xd3\x66\x16\xfd\xd1\xf1\xf4\x21\x33\x40\x56\xb9\x26\x7c\x06\x1a\xea\xba\x56\x76\x5a\x96\x2b\x7a\xb3\xd2\x1e\xb9\x4a\x56\xe7\x0f\xfd\xaa\xd9\x55\xc9\x79\x81\x39\x03\x77\x78\x98\x50\xe2\xd6\xdb\x75\x7f\xea\xcf\x16\xf5\x74\x22\xcf\xdd\xa8\xfe\x1f\x42\x67\x03\x2c\x2c\x12\xa8\xab\x35\x1a\xcb\x1e\x92\x86\x81\xbc\xd6\xd3\x35\x49\x7c\x74\xb2\xbe\x5c\x8e\x36\x90\x11\x61\x9f\x0f\xff\xff\xe0\x24\x89\x3c\x9e\x0d\x29\x34\x7d\xb7\xb3\x24\x78\x76\x4c\xee\x77\x7f\x7f\xb8\x35\xfa\x7e\xf7\x13\xe0\xa3\xc9\xd9\xd9\xf4\xc1\x74\x96\xea\xf4\x68\x52\xb2\xfd\xfd\xb3\xb3\x07\xc7\x69\xa0\x38\xe9\x81\x84\xa1\x4b\x3e\x74\x79\xef\xd8\x97\xa7\xd7\xe6\xc0\xcf\xa3\x4f\xe5\x9e\xad\x99\x36\x38\x58\x08\x09\x7c\xf3\xe5\xb0\xfb\x52\xe0\x26\x5c\x6e\xb8\xfc\x3e\x80\x1a\x6a\x1f\x8e\x63\x24\x2e\x44\x9b\xcb\xfc\xe1\xc3\xfb\x10\x0b\x3e\xfa\x33\x68\xd8\x64\xea\xf9\x9e\x70\xb8\x97\x18\x5f\xe5\x51\x09\x7d\x5f\xfa\xe2\x15\x80\x92\xd2\xf7\xb0\x76\xf7\x2e\xcc\x15\x86\x90\x2c\x79\x3b\x33\xef\x0e\x90\xc4\x02\x8a\xfb\x66\xf6\x14\x6a\x7b\xf9\x8e\x82\x9a\xa8\x65\x24\xe0\xec\xa6\x24\xde\x08\x48\x81\x4d\x41\x62\x30\x1a\x16\x29\x59\x34\x14\xe5\xdd\x16\xca\x1c\x49\x7d\x5c\xf6\xc6\xf5\xb6\x08\xfc\xfd\x38\xbf\xfd\x64\xd2\xfd\x90\x70\x55\xe2\x69\x04\x74\xf9\x09\x9b\x14\xa6\x6e\x46\x20\x5d\x93\x66\x84\xce\xc4\x24\xcd\x4b\x04\x95\x5a\xc9\x35\x26\xc1\x4f\x1f\xe7\xf1\xde\x72\x9a\xfd\xbf\x9a\xc7\x7b\xc7\x8d\x0d\xc8\x53\x9c\x34\x60\x0a\xe6\x52\x30\x3e\x4a\xe2\x25\xef\x46\x7d\x8e\xe0\xe3\x65\xd0\x7c\x64\x83\x59\x75\x5b\x9b\xb8\xc3\x27\xca\xbd\x2c\x52\xc4\x49\x5c\xad\xb6\xe5\x8d\xc6\xa6\x1a\x82\x14\xf7\x90\x35\x29\xe4\x8a\x73\xf4\xe1\x56\x4c\xea\xfe\x0e\x4b\xd1\x6b\x61\xa9\x19\xd8\x7e\xe5\x52\xd2\xd1\x6b\xef\x79\x4a\xe8\xa1\xf0\xdc\xc4\x0e\x53\x22\x3b\x98\x18\xd2\x74\x31\xb6\x71\x23\x8f\x43\x6c\x72\xd3\xfb\x8b\x9b\x22\x8b\x39\x72\x04\x89\x65\xea\xbc\xf4\xb8\xf5\x27\x04\x13\xc0\xc8\x81\xd5\xa9\xc3\x35\x3f\x98\x1f\x9c\xec\x27\x59\x83\xc7\x15\x76\x11\x52\x4b\xcb\x8c\xca\x6a\x9f\xd5\x0d\x4f\x5d\x89\x6c\xd5\x15\xe7\xab\xd4\x54\x41\x73\xd0\xab\xe4\xb0\xe5\x79\x6d\x53\x82\xab\x89\x5d\xd4\x85\xc9\x99\x8c\xc5\x08\x6c\x36\x65\xa9\xd1\x6a\x4c\x72\x86\xaa\x92\x10\x7c\x88\x5d\xea\x8e\x1a\x30\x69\x0e\x3b\x9e\xe6\x9b\x68\xcb\xfd\x98\xf3\xd4\xf1\x3f\xe7\xe3\x77\xf3\x39\x4f\xeb\x39\xf3\xa3\xfd\x22\x76\xe9\x1b\x13\x19\x26\xb5\xb4\xc6\x1b\x6f\x92\x87\x41\x09\x0c\x29\x19\x3e\x60\x38\x84\xd4\x88\x03\xae\x97\x46\x69\x9c\x85\xa4\xa2\x16\x4d\x93\xe4\x5b\x85\x59\x7a\xb1\x14\xc6\xd4\x60\x0a\x5b\x2c\x09\x0a\x8f\x49\x6a\x45\x0a\x99\x23\xad\xbb\x17\x4c\xa7\x2e\x00\x53\x96\xc8\xc4\xfc\xe8\x30\xd1\x99\x89\x41\x1a\x93\x12\xef\x3e\xa3\x12\xb7\x40\x1f\x41\xfa\x10\x39\xa6\xa4\xfc\xb6\x84\x02\x09\x15\x2d\x87\x70\xaf\x81\xb6\x9e\x6d\xaf\x71\x5d\xd2\x99\x6d\x74\x91\xa7\x52\xea\xee\x1f\x64\x7a\x34\x4f\x90\x31\x9d\x1d\xa5\xfa\x98\x1d\xa7\x47\xe9\x92\x46\x8d\x34\xe5\xb6\xe2\xef\xfd\x20\x2d\x82\x00\x9f\xba\x5f\x3a\x9a\x66\xe4\xd3\xf7\xe3\xd5\x57\x86\x13\x98\xb4\x71\xe7\x4d\x9d\x12\x1a\x3d\x24\xa9\x0c\xf7\xa0\x0c\x75\x6a\x72\x8b\xec\xf0\x28\xd9\x53\x95\x9a\x5b\x0f\x49\x53\x5d\x99\x48\x98\xff\xcd\x27\x8d\x09\x68\x76\xf9\x59\xe8\x04\xb0\x02\x95\xb4\xf6\x07\xe0\xcd\xaf\xc9\x27\xe0\x3b\x40\x69\xec\x36\x74\xda\x1b\x47\x54\x65\xf6\xb2\xef\x3c\xfa\x31\xc7\x50\x20\xdc\x7e\xfc\xe1\x43\x02\xaa\x5f\x4b\x76\x9e\x92\xc3\x1d\xd8\x94\xf2\xac\xba\x87\x24\x4f\xcd\x7d\x9e\xa3\x4b\xbd\x59\x68\x96\xde\x84\x0d\x6a\x6d\xc8\x26\x16\xf5\xdc\x07\x02\xb7\xae\x50\xc5\x55\xcc\x71\xcc\xc0\xde\x60\x46\x3d\xb4\x2b\xb5\x9a\xed\x4f\x4f\x53\xa3\xa9\x55\xda\xbf\xbc\x01\x8d\xcf\x6e\xa5\x56\xc3\xa7\x02\x53\x46\x44\x95\x36\xe1\x36\xa0\xf1\xf1\x06\x23\x43\x8b\xd0\x2f\x7f\x52\x7a\x2b\x81\x4b\xd4\xe9\xc5\x37\xd1\xf1\x45\xfa\x48\xf7\x67\x2e\x69\xd3\xb6\xa0\x2b\x9f\x12\x61\x68\xd1\x26\xfa\x41\x9b\x4b\x18\xfd\x3d\x4b\x4f\x0c\xed\xe2\x28\x0b\x22\xe9\xea\xed\x21\x59\x0f\x4e\x5d\x3d\x35\x04\xf4\xaa\xc3\xd4\x71\xd4\x22\x78\x2b\x04\xef\x3b\x56\xe0\xef\xdf\xaa\xc9\x25\x2c\x57\xc0\xec\xa6\x18\xe3\x88\xcb\xa0\x15\xde\x28\x91\xd5\x3c\x57\x62\xcc\x9a\xdb\xd6\xd2\xa9\xef\xb3\xf6\xaf\x38\x8a\x17\x38\xbc\xd9\x18\x03\x49\xf0\x1e\x97\x59\xd4\x12\x15\xae\x8b\x1e\xe5\x71\xcc\x94\x10\xca\x1a\xa7\x31\xaa\x71\x3a\x2b\x58\x09\x29\xc5\xfa\x4e\x19\x27\xb4\xe6\x6b\x0b\xdb\xb8\x6a\xdc\x59\xd2\x74\xe3\x63\x22\x13\xc1\x38\xd7\x8b\xb9\xf1\xbe\xce\xad\xb1\x3e\x36\x98\x8b\x38\x66\xc4\x08\x61\x4b\xc7\x53\xe7\x47\x01\xf7\x4e\x2c\x8c\x8c\x43\x65\xa1\xf1\xb9\xaa\x2c\x0c\xc9\x75\x6c\x8c\xc7\xd6\x1f\x8b\xb5\x29\xe6\x1e\xb2\x98\xc7\xbb\x32\x56\xe8\x9c\xf1\x71\x11\xb1\xe6\x92\x71\xcb\xda\x82\xef\x59\xce\x1a\xcb\x8c\xd3\xe3\xdb\x60\x1d\x2e\x20\x88\x9a\xe7\x61\x8c\xf5\x9c\xe0\xb0\x2e\xb3\x55\x8f\x49\x27\xeb\xb0\x17\x3c\x9a\x43\x97\x58\xdb\x70\x1e\x6d\x6a\xe7\x83\x09\xb5\xa8\xa4\x71\x5d\x8e\xa3\xc7\x91\xa9\x44\x4f\xc0\x7c\x0a\x81\x36\x85\x50\xc9\x3e\xb4\x8e\x20\x9d\x58\xa0\x68\x93\x58\x9b\x44\x78\x26\x24\x16\x0e\x5c\x97\x44\x26\xe7\xef\x95\x48\x42\x42\xaa\x97\x42\xa5\x94\x24\x06\xaa\x70\xc8\xab\xd4\x60\x0c\x52\xb3\x67\x12\xd6\x9c\x99\x18\x51\x14\x9e\x99\xda\x24\x2f\x17\xa1\x84\x03\x99\xd2\xcc\x84\xae\x50\x0b\xd1\x73\xf1\x02\xa5\xdc\x56\x05\x1f\x95\x62\x0b\x74\x21\x82\xdc\x6e\x55\xca\x73\x2a\x52\x6b\x83\xaa\x4c\x21\x4c\x8a\x57\xcf\x41\xc1\xa6\x7c\x7d\xca\x19\x55\xc7\x5c\xf0\x31\xc9\x7a\xee\x83\x71\x89\xf1\x1a\x70\x55\x52\x11\x92\x58\x54\x11\x79\xd2\x6c\xd9\x4d\x46\xdb\x2a\xe7\x63\x02\x4e\x75\x48\xdb\x1a\x0d\x21\x26\xc3\x3c\x46\x30\x9e\x21\xed\x58\x1a\x0f\x36\x16\x12\x87\x0f\x48\xa5\xb0\x31\xa5\xcc\x98\x05\xa6\xb8\xd7\x2c\x4b\xe3\x38\xb8\x60\xb4\xdc\xd6\xf5\x4c\xa1\x0b\x2c\x24\x9a\xca\x81\xad\x31\xb9\x33\xeb\x26\x2a\x7a\x64\xa4\x21\xac\x4e\x9e\x73\xeb\xcc\xc3\x98\xd6\x0d\x9d\x67\x89\x8e\x3c\x54\x62\x5b\xb0\x6d\x04\xc5\xb0\xb7\x9a\x38\x3a\xc1\x92\x46\xee\x1a\xab\x20\xb5\x79\x9e\x19\x1b\x93\x9a\x3b\x42\x4a\xbe\x7a\x8b\x82\x63\x35\x7c\xce\x9d\xc4\x61\xeb\xfb\x36\x79\xf0\xb6\x30\x89\x3a\x25\x0e\x02\x68\x5e\x92\xf6\x36\xea\x04\x71\x51\x63\x56\xa0\x90\xa2\x14\x92\x8f\x9f\xd1\x56\x14\xa6\x6c\xb4\x69\xe5\xf0\x8c\x2b\xe5\x79\xf2\x41\x26\x55\xf4\x16\xa5\x48\x9d\xf8\xe1\x6b\x5f\x05\xe8\x26\x31\x93\x01\x37\x70\xc3\x50\x4f\x3d\x75\x07\xea\x91\x1f\xe7\x47\xfb\xc9\xa8\xd9\xe1\xb4\x4b\xe8\xeb\x27\x47\x27\x47\x29\x32\xa0\xa0\x84\xc2\x80\xb1\xd8\x0a\x08\x75\x92\x89\x00\x99\x41\xdd\xdf\x05\xc9\x1d\x02\x74\x99\x1a\x6a\x44\xa7\x0e\xc5\xd3\xc8\x51\xaf\x03\xe0\x12\xcb\xa4\x97\x1f\x54\x32\xf4\x7a\x34\x9d\xa5\x82\xd5\x1c\x92\x81\x8e\x42\x60\x00\x64\x75\x2c\xe1\xde\xec\x9d\x4b\xec\x39\xe8\xa4\xcb\xb1\x30\x66\x9b\x1c\x3a\x86\x22\xb9\xdc\x18\xa0\x44\xd0\x57\x5f\xc8\x1b\xd5\xd7\x84\x83\xf9\x51\x2a\x2c\x39\xb0\x92\x4f\x06\x72\xeb\x08\xb9\x75\xa3\x26\x6c\x1d\xd3\x0e\x39\x56\x47\xdd\xc5\x5c\x99\x02\xc7\x51\xbe\x36\x09\x4f\x14\x53\xa4\x63\xc0\x54\x41\x20\x2b\xb8\xa4\xcb\x81\x97\xac\x4c\x89\x26\x6e\x98\xa7\x18\xd1\xdc\xc4\x22\xc9\xf2\x6b\x50\x32\xfa\xc2\x4d\xec\x52\x4c\xcd\x97\x5d\xda\x99\xc3\xbb\x10\x4e\x12\x27\x48\xf4\xb6\x84\xd1\x49\xf9\x2b\x22\x47\x96\x4c\x6d\x48\x9e\x8a\x1e\xd2\x18\x5a\x92\x5c\xe9\x78\xf2\xfc\x94\x31\xc4\x54\x20\xad\xc7\xe8\xd4\x5a\x55\xa0\x79\xca\x75\x59\x09\xa4\x24\xc9\x55\x22\x58\x87\x4c\x04\x48\xad\x46\x85\xe5\xf0\x21\xf2\x04\xca\xa4\x97\xbe\x26\x65\x20\xd5\x46\x57\x4b\x4c\xf1\x56\x6f\xa1\x15\xb1\x4c\xa1\xe2\x12\x09\x6e\xea\x3a\x76\xa9\x03\x8d\x7a\xfd\x29\x1f\x2d\xda\x00\x29\xa5\x10\x43\x6d\x92\xb9\x51\xe7\xf7\x27\x72\x5e\x42\x70\xf8\xf2\xf4\xa8\xaf\xa2\x01\xec\x40\xa7\x43\x09\x0d\x0c\xf5\x43\x9b\x2e\x93\x50\x24\x33\x2e\x84\xb0\xe9\x65\x6b\x1a\x55\x27\x4d\xb4\x74\x37\xbd\x16\x29\x78\x52\x8b\x91\x46\xa6\x78\x5f\x46\x73\x8e\x32\xb9\x3d\x0a\x4c\x97\x0e\xf0\x83\xe9\xa2\x1e\xbf\x0c\x86\xb4\x83\x74\x4f\x1b\x54\xc2\xee\x34\x05\x36\xc9\x7c\x3a\x93\x86\xc4\x22\x99\x55\xd1\xad\xa0\x49\x07\x89\x51\x65\x12\x74\x95\xb1\x94\x62\xae\x17\x3d\x9f\xa6\x4c\x3d\x07\x2c\x19\x51\xb1\xd0\xd9\x64\x72\xd4\x1a\x64\x8a\x73\xc1\x42\x32\x3f\x99\x03\xca\xd4\xb5\xf1\x10\x2f\x3f\xf0\x3e\x02\xea\x92\x2b\xd6\x43\x48\x0a\x95\x83\x8e\xd5\xe0\x53\x3e\x7c\x67\x74\x55\x27\x2d\x50\x17\xab\x68\xd2\xe7\xdf\x67\x4e\x0c\x5f\x55\x4b\xc0\x40\x37\x31\x99\x22\xe3\x99\x51\x56\xb8\x71\xa3\xc2\x0b\x20\x04\xd1\xbc\xca\xd5\x58\x58\xd6\xab\x15\x4f\x65\x48\x79\x0d\x96\x3b\x93\x0a\x3e\x79\xdd\x2e\x53\x3d\xf9\x74\x7e\x50\x80\x26\xea\xca\xa6\x33\xab\x05\xa8\x05\x8a\x36\xb9\xe6\x01\x07\x9f\x3f\xab\x53\x67\x28\x72\x60\xdb\xcf\xc9\x8d\xda\xc9\x49\x15\x67\xa1\x2e\x3f\x48\x34\x66\x18\x53\xec\xb8\x56\x20\x33\xe3\x81\x88\x56\x50\x4e\xd8\x12\x81\x66\x00\x2d\x51\x81\x84\xe4\x95\xbd\x44\x5d\x47\xd0\x22\xe5\x96\x59\xaa\xf4\x1d\xd5\x81\xae\x1a\xc1\x63\x6a\xcf\x57\x35\xe8\x6a\x85\xbe\xc6\xf1\x15\x59\xd5\x98\xcc\x63\x59\x11\xde\x56\xac\xea\x88\xf5\x7d\x1a\xd5\x84\x9b\x56\x4b\x03\x3c\x3f\x17\xa1\x70\x80\xfa\xde\x77\x2e\xeb\x42\x17\xbd\xa8\xf7\x5e\x6e\xca\x5e\x64\xeb\xe2\x20\xb7\x9a\x5c\x3e\x21\x9a\x9e\xe6\xb3\x93\xf5\x7f\x1e\xcc\xef\x7d\x9c\xf4\xa9\x4f\x7c\xee\xf5\xcf\x4f\x5e\xfd\xec\x65\x1f\xeb\x3f\xff\xc1\x2b\x5f\x78\xf5\xd3\xd7\xde\x8c\xfd\xef\x00\x00\x00\xff\xff\x51\x89\x74\x74\x65\xd4\x00\x00")
76 |
77 | func assetsHtmlClashConfigLocalYamlBytes() ([]byte, error) {
78 | return bindataRead(
79 | _assetsHtmlClashConfigLocalYaml,
80 | "assets/html/clash-config-local.yaml",
81 | )
82 | }
83 |
84 | func assetsHtmlClashConfigLocalYaml() (*asset, error) {
85 | bytes, err := assetsHtmlClashConfigLocalYamlBytes()
86 | if err != nil {
87 | return nil, err
88 | }
89 |
90 | info := bindataFileInfo{name: "assets/html/clash-config-local.yaml", size: 54373, mode: os.FileMode(420), modTime: time.Unix(1603794154, 0)}
91 | a := &asset{bytes: bytes, info: info}
92 | return a, nil
93 | }
94 |
95 | var _assetsHtmlClashConfigYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\xaf\x24\xc7\x75\xdf\x77\x02\xfc\x1f\x2e\xec\x0f\x4e\x80\xe9\xde\x3b\x33\xf7\x0d\x04\x01\x4d\xea\x41\x4b\x96\x04\x52\x82\x93\x4f\xc1\xe9\xaa\xea\xee\x73\xbb\x5e\x5b\x8f\xe9\xe9\x31\x04\x30\x46\x84\xb5\xa8\x48\x8a\x13\x45\x06\x6c\x29\xb4\x62\xc9\xa2\x6c\x39\xb2\x22\x47\x52\x28\x51\xfa\x67\x78\x97\xcc\x27\xf3\x4f\x08\xba\x67\xe6\xde\xbd\xaf\xae\x33\x44\x76\x37\x41\x28\x69\x85\xdd\xe9\x5f\x55\x9f\xaa\x3a\x75\xea\xbc\xea\xf4\xef\xee\x3d\xfe\xea\x1b\x8f\xbf\xf3\xd5\x0f\xde\xfc\x93\xf7\xff\xe4\x7f\x5e\x7c\xf7\xd1\x7b\xbf\xfa\xc6\xc5\x57\x7e\x7c\xf1\xeb\x37\xde\x7b\xe7\x3f\x7e\xf0\x6f\xbf\xf5\xfe\xbb\x7f\xf6\xde\x2f\xdf\x7c\xfc\xe6\x7f\xba\xf8\xe6\xb7\xff\xe9\xd7\xff\xfe\xbd\x77\x7f\xfb\xfe\xb7\xde\x66\x12\x7c\xfd\xc1\xa3\xbf\xbd\x78\xf3\xed\xc7\x7f\xfd\xc6\xe3\xb7\x7e\x70\xf1\xcd\x9f\xbc\xff\xad\xb7\x1f\xbf\xf1\xc3\x8b\xaf\xff\xec\xe2\x9b\x3f\x79\xf1\x85\xdf\xdd\x5b\x37\x79\xff\xed\xaf\x5d\xbc\xf3\xcd\x8b\x5f\xfc\xf7\x8b\x5f\xbf\xf1\xf8\x9d\xff\xf0\x4f\xbf\xfe\x8b\xbd\x3a\x04\xeb\xcf\x1e\x3c\xa8\x30\xd4\xb1\xc8\x99\x51\x0f\x56\x71\xda\x3c\xb0\xce\x2c\x3b\x6b\x8c\x7c\xf1\x85\xbe\xbd\x35\x2e\xec\x99\x72\xef\xd3\x5f\xfc\xe2\x17\x5e\x7c\xa1\xff\xd7\xd9\xde\xf1\xc9\xe9\xfe\xf5\xa7\xaf\x7f\xfe\xe5\xcf\xbc\x7e\xf8\xe2\x0b\xde\xb0\xc6\x67\x97\xa8\xe9\x1a\xf5\xcf\xfa\xc6\x7b\xa0\xf9\x06\xb7\x87\x7a\xcf\x68\x31\xb4\xfe\xe7\x3d\x40\xe1\x52\xf0\xec\x66\xe7\x4e\x70\x74\xeb\x57\x94\xc6\xed\x7d\x16\x75\x5c\x0e\xbd\x28\x60\x9f\x7f\xfd\x12\x71\xd5\x6e\xd6\xb7\x03\x29\x4d\x9b\x49\xd0\x67\x7b\x25\x48\x2f\x5e\x7c\x41\x19\x2e\xce\xf6\x5c\x94\xe2\xc5\x17\xa4\xa9\x32\x29\x16\x42\x9e\xed\xa1\x2e\xcd\x8b\x2f\x88\x65\x10\x4e\x83\xcc\x98\xd1\xc1\x19\x29\x85\x3b\xdb\x9b\xce\x8e\xf3\xfd\x7c\x3f\x9f\x9e\x9d\xee\xaf\xa9\xe9\x67\x05\x85\x3f\xdb\xfe\xbd\xcb\x2a\x67\xa2\xed\x7f\xd8\xdb\xcb\xf6\x34\x28\x71\xb6\x77\xf1\x95\xb7\x2f\x7e\xfa\xc6\xff\x7a\xe3\xab\x8f\xbf\xf6\xa3\xfe\xf7\xbd\xbd\xd0\x59\x71\xb6\xe7\x85\x14\x2c\xac\x7f\xb9\xea\x68\x6f\xf8\x4f\xb6\x77\xf1\xab\x9f\x7f\xf0\xdb\xb7\x1e\x7f\xe7\x8d\xf7\xde\xfd\xc6\xd5\xaf\xeb\x5e\x2e\xfe\xf2\xdd\x8b\xff\xf6\xf3\x9b\xbf\xae\x99\xe4\x89\x1e\xbe\xff\xd3\x0f\xfe\xf1\x07\x17\x7f\xfa\xe8\xf1\xd7\xff\xeb\xd5\xaf\x1f\xfc\xe3\x5b\x1f\xbc\xfb\xee\xc5\x77\x1f\x7d\xf0\xbd\xef\x3d\x49\xe5\xed\x9e\x29\x54\x7e\xf8\xd6\xa3\xb7\x3f\x7c\xeb\xd1\xcf\xf6\xde\xfb\xe5\xdf\x5f\xfc\xe5\xbb\xd7\x1e\xfc\xe4\xc3\xb7\x1e\xfd\x8f\xbd\xc7\x7f\xfe\x83\xc7\xdf\xf9\xf1\xb5\x07\xbf\xfc\xf0\xad\x47\x3f\xde\x7b\xfc\xed\x7f\xb8\x78\xf3\xaf\x2e\xbe\xfb\xbd\x6b\xcf\xde\xe9\x9f\xef\xbd\xff\x9b\x6f\xdc\xec\xad\x7f\xcd\xdf\xec\x5d\xbc\xf9\x57\x8f\xbf\xf6\xdb\x8b\xef\xff\xf0\xda\xb3\x5f\xf4\x0d\xf7\xde\xfb\xed\xbf\x7b\xff\xdd\x3f\x7f\xfc\xed\x9f\x5c\x7b\xf6\x37\xc3\xb3\xc7\xbf\xf9\xd9\xc5\xf7\x7f\x78\xf1\xa7\x3f\x7a\xef\x9d\xbf\xb8\xd5\xed\xdf\xef\xbd\xff\x67\xff\xe5\xe2\xaf\xff\xee\xda\x83\x1f\x7d\xf8\xd6\xa3\xbf\xdd\xbb\xf8\xcd\x2f\x6e\x12\xf2\x77\xfd\x0b\xf7\x1e\xff\xec\x3f\xdf\x7c\xf0\xe3\x0f\xdf\x7a\xf4\xc3\xbd\x0f\xbe\xf6\xd3\x9b\x0f\x7e\xf6\xe1\x5b\x8f\x7e\xba\xf7\xc1\xd7\x7f\x71\xf1\x95\x7f\x78\x62\x79\xbe\xf2\xf3\xf7\x7e\xf5\xed\xab\x09\xbf\xbe\x10\x4f\x2e\xe6\xed\x85\x88\x5e\x3c\xb1\x08\x20\xe5\x93\x1d\xdc\xb9\x26\xeb\x3e\xa2\x93\x59\x10\x7e\xdb\x8b\x93\x67\x7b\xbf\xd7\xef\xf8\xb3\x07\x0f\xda\xb6\xcd\x2b\x1f\x20\x20\x1b\x76\x7d\x25\xb4\x70\x10\xc4\xbf\x99\xed\x1f\xfc\xde\x1a\x8f\x3a\x08\xb7\x00\x79\xb6\x37\xdf\xdf\xbf\x8b\x10\xa6\x6f\xd0\x71\x9b\x05\x9e\x09\x1d\xe7\xf6\x06\x1d\x77\x72\xdc\x33\x21\xc5\x57\x37\x48\xb9\xcd\xe0\xcf\x84\x8e\xe8\xef\x60\x91\x5b\xfb\xe9\xd9\x70\x09\xdc\x20\xe5\xce\xed\xfb\x4c\x48\x71\xf1\x06\x29\xf7\x49\x8b\x67\x42\x0d\xdc\xa4\xe6\xb6\x70\x7a\x36\x0b\x54\xdf\xa0\xe3\xb6\x2c\x7c\x26\x74\x70\x71\x83\x8e\xdb\xa2\xf7\x99\xd0\x51\xba\x1b\x74\xdc\x96\xf4\xcf\x84\x8e\xaa\xb8\x41\xc7\xed\x83\xe5\x99\xd0\xa1\xe5\x75\xf5\xe6\xfa\x39\xf6\x8c\x88\x30\xa1\x16\xee\x9a\x50\xbb\xad\x31\xdd\x49\xc8\x5d\x47\xe7\xff\x01\xfa\xb6\x54\xdc\xd4\xaf\xb6\x54\x48\x03\x3c\x2b\x40\x82\x66\xe2\xd9\x50\x72\x5b\xff\x5b\x53\x52\x82\x94\x05\xb0\xe6\x69\x52\xb1\x55\x87\xad\x33\x0b\xe4\xc2\xad\x75\x46\x88\x67\x4f\x12\xd2\xf7\xfe\xc4\xdb\x7e\xe7\x8f\xff\x78\x2f\x77\xe2\x61\x14\x3e\xec\x7d\xf9\xcb\x67\x0f\x1e\xf4\x3f\x70\xa3\x00\x75\xff\xef\xfe\x5f\x83\xda\xff\xe5\x2f\x3f\x18\x6c\x9c\x07\x1b\x7d\xf4\x5f\xb2\x7f\xf1\xd2\x97\x7e\x67\xa3\xa2\x42\xa8\xcf\xf6\x2e\x5f\xfb\x60\xfb\xb7\x0c\x62\xde\x81\xda\x8c\xae\x16\x20\x43\x9d\xb1\x5a\xb0\xe6\x72\xf4\x42\x43\x21\xc5\xd9\x5e\x70\x51\x6c\x7f\xbb\x1a\xd6\xd1\x96\x0d\x37\xd4\x12\xa6\xa6\xc7\x33\xfd\xb4\x86\xfc\xf2\xe7\x26\x9f\xfe\xcc\xe4\x8b\x7f\x94\x1a\x38\xd3\xcf\x65\xe0\xd1\x3f\xad\x81\x7f\xe9\xf5\xd4\x90\xa3\x7f\x3e\x6b\x0d\x4f\x6d\xad\x5f\x4a\xae\x32\x3c\x97\x21\x9f\xdb\xa7\x35\xe4\x3f\xf8\x42\x6a\xc8\xe7\xf6\xb9\x0c\xd9\x57\x4f\x6b\xc8\xaf\x7f\x2a\x35\x64\x5f\x3d\x97\x21\xbb\xa7\x26\xb7\x5f\x4b\xca\x6d\xf7\x9c\xe4\x76\xfd\xd4\xf6\xf2\xa7\x93\x7b\xb9\x7e\x2e\x43\xe6\xe2\x69\x0d\xf9\x95\x4f\xa4\x86\xcc\xc5\x73\x19\x72\xe9\x9e\xd6\x90\x3f\xf9\x5a\x6a\xc8\xa5\x7b\x2e\x43\xae\x8a\xa7\x35\xe4\x4f\xfd\x7e\x6a\xc8\x55\xf1\x5c\x86\xac\xe5\xd3\x1a\xf2\xe7\x3e\x9b\x1a\xb2\x96\xcf\x65\xc8\x6b\xeb\xe8\xe9\x0c\x5b\x5f\xe9\x9e\x93\x2f\xbd\x3e\x79\xf9\xa5\xc9\x1f\x7c\x61\xf2\xfa\xa7\x26\x2f\x7d\x69\xf2\xf2\xa7\x27\xaf\x7c\x62\xf2\xa9\xdf\x9f\x7c\xee\xb3\x93\x4f\xbe\x36\x49\x4b\xf7\x35\x9d\xcf\x65\x8a\x40\x3e\x1d\xb6\x48\x0c\xf9\x39\x8c\xf5\xc5\x17\x5c\x94\x62\x1b\x94\x78\xe5\xf3\x7f\xf8\xd2\xab\x9f\xcb\x5e\xff\xd2\x27\x3f\xf9\xea\xbf\x9a\x78\x15\xec\xe4\x95\x57\x5f\xfb\xc4\xcb\x5f\xbc\xf6\xf8\x33\x9f\xf8\xd7\x7f\xf4\xf9\xd7\x5e\x99\x80\x43\x98\x5d\x02\xee\xea\x01\x94\xb5\xce\x9c\x0b\x16\x72\xe3\xaa\xc9\xcd\x68\xc7\x2d\xb8\xb5\xde\x9a\xd0\x93\x99\xc4\x16\xd2\x54\x95\x70\x24\x6c\x25\x82\x89\x41\xa2\x16\x24\x32\xaa\x45\xd8\xa7\xf5\xbb\x08\x53\x2a\x70\x4e\x02\x2e\x75\x96\xe9\xca\x07\x97\x49\x07\x27\xe7\xe3\x6d\xb6\xeb\x50\x19\x53\x49\x91\xc6\xf5\x53\xd6\xcf\x6f\x92\x0a\xa3\x05\x77\xb8\x10\xb9\xec\xff\x8f\x44\x77\x61\x96\x64\x30\xe3\x1a\xb5\x0f\x50\x39\x50\xa4\x06\x65\x41\x85\xa9\x91\x69\xb8\x44\x01\xe7\xa8\x3d\xb1\x4b\xc6\x75\xae\x45\x7a\xce\xca\xc2\x17\x4b\x62\x9f\xad\x71\x8d\x02\x94\x24\xf8\x6e\x53\xa5\x28\x53\xa0\x84\xf7\x42\x53\x77\x8f\x61\x51\x46\xda\x74\xad\xa1\xfd\x94\x51\xd0\xce\xb0\xc6\xf3\x82\xb4\x27\xdb\x1a\x82\x07\x6b\x49\x1d\x5f\x82\x47\x17\x6e\xbb\x2d\x4a\x60\xa2\x30\xa6\xb9\x03\xf9\xea\x17\xb2\x97\x5f\x7d\xe5\xb5\xc9\x3c\x9f\xce\xe6\xf9\xfc\x28\x9f\xce\x8e\x1e\xcc\x67\xd7\x90\x13\x6d\x32\x27\xbc\x91\x0b\x71\xa3\xd1\x61\x3e\x3d\x3c\xce\x67\xd3\xc3\xfc\xe4\x60\xf7\x56\xc7\xf9\xec\xf0\x90\xdc\xec\x70\x96\x1f\x9e\xe4\xb3\xfd\xd3\x7c\x3a\xa7\xbf\xec\xf0\x20\x3f\xed\xc7\x76\x90\xcf\xa7\xbb\x34\x9a\x1e\xcd\xf2\xd9\xc1\x3c\x3f\xd9\xdf\xa9\xd5\xf1\x3c\x9f\x1f\xe4\xd3\x83\x9d\xde\x35\x9b\x1f\xe6\xb3\x79\x3e\x3b\x98\x91\x5b\x4d\x8f\x4e\xf3\x83\xc3\x7c\x76\x70\x92\x4f\xa7\x27\xc9\x66\xd7\x99\xc7\x7a\x66\xf3\xb0\x48\x32\x99\x15\x0e\x3d\x33\x56\x50\xc0\xfd\x99\x96\x06\xb5\xa8\xaa\x5d\x80\xe9\x9d\x10\x5a\x0c\x76\x7d\xf0\x27\xb1\x8b\xfe\x7c\x1c\x7b\xfb\x76\xc3\xf4\x9d\x06\xe1\x08\x83\x26\xc8\xa2\xc0\x85\x6f\x82\xa1\x6d\xec\x20\xa4\xa8\x1c\xe4\xb6\xa6\x42\x49\xf2\xf0\x12\x7b\xb7\x24\xda\xb2\xd5\xe9\x34\x9f\xee\x9f\xe4\x07\xf9\xfe\x83\x19\x91\x13\x37\x4d\x4e\x76\x6f\x32\x9d\x7d\x84\x36\x47\xbb\xb7\x39\xdc\xa5\xcd\xf4\xe0\x34\x9f\x0e\xfb\x7f\xbf\x6f\xb5\x4f\x6a\x75\x34\x99\xed\xef\x4f\xcf\x8a\xd9\xc9\x59\x39\x9b\xf3\xb3\xb3\x07\x07\x27\x1f\xa1\x61\xb9\x73\xc3\xa3\x63\x76\x76\x20\x4e\x08\xed\xae\xb3\xc3\xa0\x28\x12\xd8\xa6\xc7\x65\xbd\xce\x4a\xe2\xdd\x01\xed\xa9\xea\x84\x86\x85\x70\xf9\xb9\x1d\x61\xc7\xe9\xfe\x3c\x9f\xe5\xf3\x61\x25\xe6\xc4\xf5\x9b\x1d\x0e\x67\xc4\x6c\xff\x84\xbe\x7e\x93\xe9\xc1\x71\x7e\x3a\xcb\xa7\xb3\xbe\xd1\xf4\x98\xd6\x68\xb6\x3f\xcf\xa7\xfb\xbd\xb4\x1f\xf6\xcb\x74\x97\x05\x38\xf0\x35\x38\xc1\x49\xd3\x7a\x38\xdb\x67\x2c\x67\x2c\x09\x3c\x39\x99\x9e\xee\xd3\xb4\xf0\x53\x06\xac\xa6\xe9\xb2\xa7\x15\xd0\x24\x31\x14\x34\x29\xdc\xe3\xb4\x08\x39\x44\x02\x74\xd0\x5b\x68\xec\x07\x0a\x56\xa6\xd7\xcb\xee\x66\xaa\x9b\x86\x18\x56\x82\x36\x01\x60\x9b\x8c\xd3\x34\x59\xb0\x4d\x89\x9a\xb6\xac\x60\x1b\x85\xce\x19\x9a\x8a\xda\xa3\x8d\x6e\xa8\x58\x1b\x1d\x75\x70\xc1\x20\x27\x62\x1d\xab\x7b\x0b\x08\x3d\x19\x4a\xb2\x89\x5d\x20\x69\x18\xe0\xc2\x60\xe4\x1b\x9a\xee\x0d\x2e\x36\xe0\x73\x4c\x2b\x1b\xe0\x89\xf3\xba\x20\x6e\x84\x45\x25\x69\x33\x5a\x00\x37\x86\x88\xd4\xbc\x85\xca\xe8\xda\x78\xa2\xfb\x80\xb8\x1d\x0b\x51\x83\x66\x82\x24\xb3\x0b\x2c\x0c\xcd\x04\x2c\xb0\xaa\x86\x91\xe5\xa1\x25\x80\xf5\x40\x02\xad\xe3\xc0\x0c\xea\x00\xb2\x21\x71\x57\x81\xa1\x44\x2d\xa8\x54\x07\x45\x87\x66\x2b\xb2\x1f\x47\x9a\x05\xd2\xd8\xb6\x90\xc6\xa8\x42\xb8\x2a\x67\x7a\x17\x30\xa9\xeb\x58\x38\xd7\xd1\xb0\xc6\x34\xe4\xe5\x33\xa6\x19\x5c\x23\x04\xb9\x7b\x29\xce\x69\x1d\x7b\x89\x25\x91\x35\xa9\x8c\x19\x3d\x6a\xe1\x3d\x6a\x3f\x38\x24\x49\x6d\xda\x7a\x4a\x22\x82\x81\x0f\x3d\x21\x25\xc1\x45\xd4\x6f\x4f\x20\x78\x92\x5a\x9a\xc7\xa9\x06\x5d\xd1\xe4\x6d\x0f\xd5\x42\x6a\xd1\x7a\xf0\x08\xb4\xee\x9b\xe9\x3e\xcd\x11\xc8\x24\x38\x34\x7a\x17\xa7\x28\x93\x9d\xcd\x91\x30\xbb\x1a\xa8\x9c\xc3\x8c\xb2\xe0\x30\x08\x56\xd3\xa8\x36\xda\xd4\x40\x61\x60\xe6\x22\x43\xa0\xa9\x03\x2c\x90\x59\x9d\xb5\x64\x64\x57\x08\xc7\x02\xcd\x59\xc6\x01\x65\xa7\x0c\xf9\xd0\x1c\xf0\x0b\x14\x2d\x85\x12\x0e\x51\x91\xb6\x45\x0f\xa4\x9a\x05\x9c\x81\xe3\xa4\xb7\x0b\x61\x39\x7a\x66\xa2\xa6\x1d\x88\x5c\x58\xe3\x31\xd8\xda\x04\x43\xd3\x28\xb9\x58\x20\xe8\x00\x8e\xf8\x82\x9e\x1a\xad\x7b\xb6\x27\xd8\x56\x03\xda\x71\xaa\xc7\xef\x09\x38\x69\x1a\xd1\x3f\x24\xba\x34\xb9\x14\x8e\x49\x13\x69\x6a\x2b\xd7\x7e\x56\xd1\x74\x16\x6e\xda\x73\xa3\x05\x91\x0a\x67\x2c\x55\x86\x6f\xb0\xd1\x0b\xc7\x8c\x0e\x82\xca\x00\x91\x35\xfd\x1f\x2a\xf9\x34\xc9\xcb\x3b\x1d\x49\x40\x01\x2e\xd4\x8c\xe8\xe5\x5e\xdb\x3d\xc2\x2d\x90\x09\xca\x6e\x10\xbd\x04\x53\x48\xd4\x0d\x05\xaf\x44\x7f\x56\x51\x37\xa5\xe0\x69\x5b\x4d\x48\x0b\x48\x5b\x6b\xa1\x41\x77\xa0\xab\x5c\x75\x04\x2c\xeb\x98\x34\x56\x70\xe2\x51\x25\xbc\x41\x97\x17\xe9\x0d\x28\x86\xe8\x2b\x03\x4d\xb1\x11\x44\x74\xa6\x3f\x31\x69\x24\x2c\xcc\x0a\x69\x91\x12\x21\xb8\xa4\x69\x64\x25\xba\xfe\x34\x03\x42\xa0\x46\x22\x6b\x68\x9a\x4d\x29\x31\x04\xda\x76\x28\x8d\x13\x58\x69\x6b\x24\x32\x1a\xc5\x4f\x3e\x2f\x9c\x69\xbd\x70\x24\x7d\xe0\xc9\xe7\xad\x60\x35\xd0\x98\xfa\x7a\x33\x2c\x88\xc3\x72\xc8\xa1\xa3\x6c\xb1\x32\xb0\xba\x57\x1d\x69\x76\x4a\x19\x50\x55\xa4\xcd\x55\x41\x10\x14\x16\xac\x44\x90\xa0\x83\x70\x9a\x16\xe3\x15\xc1\x77\x9a\x66\x03\x56\xd2\x14\x20\x17\x06\x99\xf0\xb4\xce\x8d\xc9\x35\x49\xe1\xaf\x8c\xe1\x4e\x00\xa7\xed\x9c\xca\xa4\xfd\x00\x95\x59\x50\x96\xab\x72\x02\x42\xbf\x69\x68\x03\x8a\xca\x19\xa0\x1d\x81\x75\x41\xb3\xb7\x6a\xe1\x4c\x43\x3b\x1b\x6a\xac\xea\x40\x8d\x97\xd6\x0d\x51\x17\xaf\x9b\xa2\x24\x8d\xbe\x6e\xfa\xe3\x86\x61\xa0\x6d\xec\xba\x11\x89\xc0\xfd\x15\x90\xb6\x77\xeb\xa6\x32\x92\x0b\x9a\x92\x5a\x1b\x13\x7c\xc4\x40\xdb\x88\x75\xe4\xde\xd0\xb6\x4c\xdd\xf5\x9c\x4a\x55\xc4\xb1\x08\xa8\x88\xda\x0d\x66\x0c\x0a\xa2\x53\x08\x19\x9e\x93\xc8\x45\x66\x18\x4d\xc8\xa1\xaa\x22\xed\x40\x40\x8d\x01\xa3\x52\x20\xc9\xb1\x7b\xc1\xee\x8d\x2b\xdd\xc0\xda\x92\xe4\x8f\x43\xef\x23\x6d\xdb\xa0\x0f\x86\x35\x83\x46\x4f\xc2\x9f\x83\x05\xbd\x5d\x35\x8a\xf4\x3a\xc7\x73\xda\x41\x7e\x8e\x9a\xa6\xbb\x9e\x37\xa5\x71\x44\xbb\xe9\xdc\xa0\x56\xe0\x83\xe1\x44\x06\x3e\x8f\x3e\xa8\x6e\xb8\x70\x4e\x7b\x41\xf4\xc1\x82\xef\xcf\x9f\x34\xb8\x81\x06\x68\xd3\x3c\x20\x99\x71\x34\xcb\xa6\x41\x9a\xfb\xb5\x31\xc4\x23\xbd\x07\xd2\xc3\x06\x8d\xe1\xa8\x2b\xa2\xe8\x91\x42\x19\xcd\x45\x5e\xa6\x63\xc3\x52\x58\x83\x3a\x90\xa0\x58\x37\xb4\x23\x45\xa2\x0f\x42\x6b\x13\x88\x72\x47\xe2\x42\xf8\xe0\x04\xd1\xea\x90\xa6\x52\x82\xe8\xa8\x1c\xd2\x7b\x5c\xda\x2e\xe8\x71\xac\x46\x45\x63\x06\x05\x8e\xe5\xa8\xcb\xb4\x94\x50\x10\x82\x70\x3d\x9f\xb7\xe9\x78\x84\x82\x0e\x35\x29\xf3\x40\x09\x8e\x91\x98\x89\x24\x2a\xc8\xf5\x2a\x8d\x43\x49\xc0\xe8\xca\x12\xb7\x97\x32\x05\x4a\x41\xd4\x01\x54\xe7\x2d\x10\x7d\xeb\x1b\x2c\x35\xbb\x69\x6b\xc5\xd1\xb0\x0b\xa2\xb3\x55\x0b\xd3\x22\x31\x84\x2c\x5a\x1f\xc0\x02\x49\x36\x6a\xb1\xc4\x00\x92\x68\x6d\xe9\xba\xc9\xcd\x3d\xe1\xe9\x1b\x48\x64\x43\x6e\x2b\xe9\x3c\xd1\x88\x39\x30\x1a\xb2\x69\x04\xed\xec\xd1\xa6\x44\x49\x32\x21\xb4\xa1\xf9\x34\xb4\x6b\x72\x4d\xe8\xae\xa3\x69\x77\xba\x1b\x4c\x27\x9a\xfd\xde\x83\x35\xc5\x81\xd6\x03\x69\x1b\x46\x77\x74\x4d\x6d\xc0\x12\x79\xba\x0b\xd2\x90\xa1\x3e\x74\x44\x05\xd0\x34\x14\xb9\x6a\x1a\x62\xa4\xca\x68\x4a\xf2\x80\x71\x28\x74\x00\x39\x78\x80\x07\x15\x98\xe0\x9c\x31\x0b\xe1\x18\xf8\x40\x09\x78\x58\x90\x43\xd0\x8e\x42\xb2\x05\x93\xf5\xd2\x90\x22\x04\x2c\x38\x2f\xd6\x1b\x90\xd4\x75\xb1\x24\x72\x82\x65\x7c\x41\x36\x06\x2c\xab\x8d\x12\x74\x34\xd9\xdf\x6a\x91\x01\x33\x8a\x98\xe1\x66\x51\x53\xb9\xd7\xe2\x12\x17\xb4\x19\x96\xd0\x09\x47\x5a\x63\x19\x1d\x71\x85\xcd\xf4\x84\x34\x53\x26\x40\x30\x39\x52\x7a\x0c\x10\x3c\x91\x09\x1c\x7a\x95\x15\x4e\x00\x2d\x88\x3c\x5c\x6e\x28\x91\x78\x82\xd9\x40\xa2\x37\x0c\xae\x16\xd2\x24\xc4\x22\x92\x59\xab\xc7\x92\x70\x4e\x80\xa5\x2d\xd6\xc3\x68\x1c\x4d\x78\x0f\x48\xaa\x57\xd9\x41\x13\x83\xa0\x66\xec\xf4\xa6\x39\xea\xea\x52\x92\x53\x06\xd9\xb7\x51\xc4\x0c\x0b\x27\x78\x11\x0b\xaa\x91\xee\x04\xe7\x48\x3b\xfd\xd6\x50\x45\x76\x60\x3b\xe1\x51\x22\x95\xe8\x38\x28\xc1\x3b\x60\xd7\x84\x90\xd6\xa7\x44\x8a\xf5\xe2\x70\x49\x17\x67\xce\x00\xf7\xb5\x69\xf3\xfa\xae\x6c\xf4\xeb\x58\xcf\x88\x46\x83\x67\x0e\x0b\xda\xfb\xbd\x80\x50\x45\x47\x73\x2f\xf8\x1a\xb8\x69\xd7\xe6\x34\x45\x4c\xf8\xda\x58\x41\x0a\xd7\x78\x89\x5c\x0c\x39\x80\xa4\x95\xf0\xa6\x0c\x25\x28\x43\x8c\xe8\x79\x13\x35\xa7\xaf\x89\xf7\x9b\xf8\x1f\x69\x8c\x01\x5c\xb0\x50\xd1\xb6\x89\x0f\x02\x14\x33\x4a\x45\x4d\x75\x2e\xfa\x20\x84\x22\x6e\xad\x0d\xb6\x05\x29\x89\x8e\xc6\x70\x74\x44\x23\xa3\xb7\x2b\xc8\xfa\x4a\x10\xcc\x64\x35\xed\x2c\x19\xb0\xca\x10\xb1\x9c\x77\x3e\xd2\xcc\xb1\x20\x96\xa1\x57\xf0\x29\xe9\xe0\xb5\xa8\x22\x38\x8e\x40\xec\xba\x16\x1b\xc7\x20\x15\x1e\x16\x9c\x76\xa5\x29\xa0\x16\x1d\x8d\x99\x82\x71\xbb\xa4\x95\x84\xa8\x0a\x49\x3b\xb1\x43\x74\x85\x29\x30\x90\x36\x63\x88\x01\xb4\x09\x34\x61\x1e\x16\x85\x59\x52\xcd\xae\x48\x34\xbc\xa3\xf6\x42\x68\x4a\x1e\x66\xb4\x6b\x71\xaf\xd2\xd3\x15\x6d\x30\xdc\xb4\x44\x0a\x5c\x01\x9a\x23\x0b\x68\x34\x10\x53\xca\xe2\xc6\x11\x45\x48\xf5\x8c\x2d\xe8\x40\x93\x75\x8b\x99\x03\xda\xfb\x17\x58\x10\x15\xb8\xc1\x9a\xb0\x4e\x78\x22\x09\xa8\x88\xc6\xc7\xc2\xc0\x2e\x31\xc4\x85\x01\x72\xcc\x79\x61\x96\xd4\xd1\xad\x68\xdc\xd8\xce\x3d\xab\x8d\x91\xb4\xf7\xb7\xe0\xeb\x5e\x3d\x33\xda\x52\x33\x54\x5b\x08\xc1\x12\x63\x6e\x6d\x6d\x84\x23\x6d\xcf\x16\x1b\x54\x60\x91\xe6\x15\xea\xd1\xeb\xdc\x02\x2a\xfa\x61\x34\x81\x16\x53\xec\xd1\x2d\x10\xd3\xc1\x5b\xd4\x91\x97\x44\x28\x31\xb9\xbb\x35\x8e\xd3\xd9\xb8\x35\xae\x29\xa5\x69\x29\x72\xa5\x35\x4e\x72\x06\x34\x41\xdc\x7a\x5a\xb4\xb0\xc7\x51\x56\x78\x59\x83\xf2\x81\xc8\xed\x4b\x9d\x65\xa7\xfb\x6d\xbb\x08\xfb\x73\xe2\x4d\x5f\x9d\x65\x38\x73\xf1\xe4\xe1\xec\x21\xcd\x94\x5e\xea\x25\xcd\x15\xb3\x1c\x24\x0b\x6d\x39\x3a\xa8\x89\x96\x4b\x07\x9a\x8b\x25\xc5\x67\xd4\x31\xa3\x0a\xd4\x10\x88\xb7\x0e\x3a\x41\x4f\x11\xed\x84\xcf\xc8\xd2\xaa\x33\x0a\xa3\x43\xa2\xe9\xd7\x99\x98\x55\x82\xc6\x6c\x2b\x30\x05\xd1\x8f\xbe\xa2\x69\x28\x2b\x21\x25\xb1\x43\xe1\x8c\x16\x81\xe2\x89\x5d\x19\xa3\xf2\x38\xb2\xd1\x2e\xaf\xbe\x0f\xa5\xa8\xd3\xb8\x73\x18\x39\x56\xb7\x20\x3b\xd4\x52\x10\x9e\x70\x67\xd8\x1a\x37\x92\x7f\xbe\x45\xf5\x22\x4e\x0a\x68\x08\x37\x42\x2c\xb8\xa0\x84\x0e\x0e\x02\xea\x8a\x78\xa5\x67\xdb\x88\x06\x2f\x40\x37\xeb\xe0\x48\x7f\xd6\xd3\x9a\x20\x31\x80\x51\x18\xd3\x04\x63\xd7\x9b\x81\x72\x77\x89\xb1\x5e\x3e\x12\x58\x81\x09\x1d\x20\xba\xf5\x6d\x89\x22\x6d\x6f\x33\x29\xc0\xf9\xe8\xc8\x57\x26\x98\xf1\x54\x4f\x39\x73\xc0\x1a\xa2\x0b\xe4\x46\x3e\x6d\xfa\xb6\x02\x47\x4f\xcb\xc6\xe6\x4a\x11\x25\xc3\x1a\x49\xe8\x51\x2f\x0c\xa7\x68\x9e\x62\x97\x89\x15\xcb\xa0\x20\x38\x24\x56\x45\x00\x3f\xdc\x54\x26\xc8\xe9\x52\xa2\x2d\x0c\x38\x9a\xea\x50\x6a\x60\x94\x84\xc7\x01\x47\xea\x30\xea\xa6\xa3\xfa\x91\xcb\xa5\x16\xa1\xd7\x1d\x88\x19\x5e\x22\x84\x0e\x15\x54\x44\x2f\x3c\x31\x59\xb7\x16\x44\x9d\xe8\x9c\x59\xa1\xb5\xa0\x99\x0c\xe7\x28\xea\x08\x14\xbe\x51\x80\xb2\x14\x54\xc6\xd1\xc3\x35\xb6\x96\x7a\xf1\x4e\x13\xaf\x72\x69\xb1\x24\xe6\xf9\x6b\xe3\xb8\x0f\xce\xd0\x76\xcf\x25\x7a\x58\xb7\xdd\x9a\xf4\x02\x85\xe6\xcb\x89\x56\x38\x4b\xe6\x8b\x00\xae\xa2\xfa\x7c\x6a\xd4\x4d\x25\x04\xd1\x97\xe3\x80\x95\x46\xd3\x86\x39\xb8\xb5\xe6\xb4\x6d\x1a\xad\x34\xc0\xef\xbb\xf3\x7c\xc3\x46\x13\x0b\xa2\x45\x89\x91\xc2\x9e\x0b\xda\xd8\x17\x7e\x38\x27\xd2\x7a\x6c\x89\x64\x7f\xde\x0a\x42\x48\x28\xb2\x93\x20\x7c\x28\x25\x56\x75\xc8\xc1\x5a\xe2\xf9\x03\xd6\xfa\x60\x72\x77\xbf\xe0\xdb\xdc\x36\xc3\x10\xb5\xf0\x84\x9e\x27\xb5\xdc\x05\x3d\x5c\x8c\x27\xe0\x76\xe9\x11\xb3\x4a\x16\x99\x17\x90\x7b\x65\x0c\x65\x3a\x26\xd2\x98\x26\xda\x0c\x2c\xee\x32\x79\x05\xcb\x97\x5d\x3a\x77\x05\x34\x77\x06\x89\x37\x9a\xd7\x58\x2c\x69\x8c\xc1\x11\xa4\xa9\x06\x8b\x93\xd4\x7b\x0c\x86\x3b\x20\x5e\x87\x03\x8b\x01\x24\xed\x04\x63\xc2\x05\x2c\x91\x41\x10\x59\x70\xa0\xbd\x05\x27\x34\xeb\x88\xb7\xe9\xdc\x26\xf0\x4b\x84\x8a\xa5\x15\x0e\xe9\x4a\xed\xba\x95\x0f\x10\x88\xde\xff\xa1\x01\x46\x5a\x4e\x26\x73\x02\x02\x2e\x84\x84\xe2\x90\xa8\xf5\x15\x91\x36\xad\x5c\x08\xab\xa8\xb7\xe1\x4b\x74\xa2\x00\x2f\x88\x71\xaf\x4a\x04\xc5\x25\x29\x6b\xbe\xb2\x35\xed\x98\xa8\xc8\x05\xab\x2a\x65\x78\x94\x64\x05\x86\x1b\x46\x4c\xaa\x97\xa0\x2b\x1a\xf4\xaa\xdc\x5d\x1a\xbb\xa0\xc1\xda\xb0\x8b\x77\x1d\x03\x78\x53\x86\x16\x88\x7a\x97\x02\x2e\x5a\x0c\x35\x33\x44\xa5\x47\x41\x10\x0e\x81\xb4\xc8\xd6\xc8\x4e\x09\x97\xed\x54\x8a\x8f\x2b\xd4\xb9\x13\x0c\x6c\x60\x35\x31\x22\xba\x13\xda\xd7\x43\x8a\xa2\xe0\x94\x21\xf8\x4e\x0b\x57\x75\x44\xcf\x70\x10\xda\x1b\x37\xc8\x4e\x52\x28\xa4\xac\x63\x91\x73\x41\x28\xe3\x84\x32\x14\x2e\x12\x0d\xb5\x16\x16\xc2\x3a\x13\x0c\x33\x92\xe6\x0a\x84\x4e\xd1\x76\x78\x2b\x0a\xb5\xcb\x72\xb6\xa2\x70\x81\xb6\xcf\xda\x1a\xc2\x2e\xf7\x91\x7a\x3d\x7d\x53\x3a\x8a\xe0\xe2\xcb\x87\xbb\xc7\x3a\x9d\x3c\xd5\x99\x18\x22\xc5\x6e\xeb\x02\x0d\x45\xb5\xd8\xa6\xdc\xd1\x44\xc2\x00\x54\x69\xdf\x4e\x21\x4d\x91\x33\xe3\x44\xde\xa2\xe6\xa6\xa5\x25\x9f\x4b\x5c\x88\x12\xa5\xf0\xc1\x10\x65\xc8\x65\xd5\x46\x5a\x6c\xd8\xb8\xde\x5a\x21\x17\x6d\xdc\x36\x50\x7e\xdc\x86\xea\xc9\x60\x12\x85\x0e\xb9\x2f\x97\x94\xf9\xd9\x77\x2b\x4a\x52\xc0\x41\x21\x63\x3f\x1b\xbd\xb2\x58\x60\x5a\x37\x3b\x2d\x90\x36\xd3\x20\xe5\xe6\x62\xf2\x50\x72\x28\x8d\x37\xb4\x73\xb0\x60\xc3\x09\x44\x2b\xf1\x11\x72\x99\xde\x13\x05\x86\x75\x56\x04\xe9\xf5\xd2\x54\xa4\x9a\x13\xd2\x54\xfd\xde\x20\x42\x03\x2d\x11\xa2\x70\x06\xf8\x90\xfc\xc8\x0c\x25\x0b\x9c\x81\x2a\x1d\x31\x5d\x94\x95\xc6\xe7\x3c\xbd\xe7\x19\x86\xce\x1a\x1b\xe5\xba\x2c\x0e\xa5\x85\x34\x91\x97\xce\x68\x5a\xac\x9b\x05\x0c\x0b\xea\x1a\xb3\x58\x37\xb9\xe0\x91\x92\xdb\xc3\xa2\x27\xe1\x36\xd7\xde\xf3\x2a\xbd\x20\x3d\x34\xae\x63\x5d\xa4\x9e\xd7\x97\xc8\x7b\xb3\x89\xa4\xcd\x46\x23\x51\x57\x86\xe2\xe8\x1c\x12\xbe\x76\xd0\xd0\xd6\x17\x76\x91\x9a\x21\x5f\x1a\x16\x7d\x00\x6c\x41\x53\x96\xe5\xc9\xe7\x94\x7c\xae\x0a\x2b\x60\xe8\x18\xd1\x92\xac\x9b\xcc\x46\x5a\x24\xa5\x36\x3e\xac\xfd\xed\x79\x4c\x2f\x50\xdd\x52\x13\x09\xb1\xc4\x25\x31\x63\x08\x6d\x6d\xb4\x38\xa8\x8d\xae\x1a\x43\x74\xfd\xaf\xdb\x6c\x26\x9c\x76\xd1\x2d\x2c\x0a\xe2\x35\x1a\x89\xba\xf1\x20\x6d\x4d\x8b\xb2\x29\xd0\xdd\x02\x89\xb7\x69\x55\x07\x6c\x87\xcc\x77\xd1\xfa\x42\x12\xef\x09\x6a\xd3\x52\x92\x5c\xb5\x69\x77\xc9\xa7\x94\xd4\x02\x06\x7e\x9e\xaf\xcb\xbd\x01\x31\xe0\xe8\xb1\xd2\x40\xd3\x51\xbd\x02\x17\x86\x5b\x4b\xf4\x0c\x3a\x0b\xae\xa1\xdf\xca\xf2\xc1\x09\x11\x86\xeb\xd6\x74\xd7\xe8\xba\x82\x68\x5a\x81\xa7\xa9\x76\xa1\xb3\x82\x9a\x7b\x11\xb9\x2e\x1a\x9a\x03\x71\xc8\x0b\x02\x74\xbe\x46\x6a\x21\x63\xf4\x56\x38\xdf\xf9\x20\x14\x2d\xcb\xb2\xc5\x86\x18\x92\x26\x26\x33\xb5\x46\x96\x0e\x14\x7d\x13\x2e\x33\x6a\x49\x98\x64\x14\x65\xd2\x9f\x3f\x43\x96\xa4\x35\xad\x48\x95\x84\x9c\xac\x75\xe5\x04\xfe\x4e\x95\x0e\xac\xdc\xd2\x72\x47\xc1\xfb\x2b\x97\xea\x20\xf5\x09\x90\x64\x37\xd9\xb0\x7d\x9a\x8d\x5c\x1e\x05\x5f\x59\x00\xf7\xc3\x18\xd7\x19\xe5\xdd\xcc\x81\xaf\x65\x17\x90\xf9\x04\x12\xaf\xf6\x77\x0a\x94\x3d\x59\x66\xe6\x7e\xb0\x4a\x11\xa7\x56\x4f\x68\x05\xb7\x61\x93\xb6\x6d\xb3\xfe\xd0\xbb\x22\x2d\x87\x06\xb8\x5e\xab\xf9\x63\xdf\x21\xf8\xb8\x12\xf1\xc7\x95\x88\xff\xef\xaf\x44\x7c\xb7\xd7\xd3\x54\x72\x87\x0b\x5c\x83\xdb\x24\x91\xdd\xb1\x05\x61\xbe\xee\x1d\xec\x9d\x95\x89\xee\xd6\x82\x42\x29\x89\x11\xfd\x2d\x96\x74\x57\xb5\x94\x4b\xb1\x24\xde\x97\x2c\xe5\x92\x7c\x09\x71\x83\xa5\xd2\xe0\x69\xb7\xea\x7a\xe8\x7a\x4d\x68\x17\x71\x87\x89\xe0\xda\x07\xe1\x89\x9f\x16\xb9\xde\x86\x76\x99\xf9\x7a\x9b\xd9\x47\x68\x43\x2b\x8f\x7c\xbd\xcd\xc1\x47\x68\x43\x0b\xa6\x5c\x6f\x73\xf4\x11\xda\x1c\x7f\x84\x36\x27\x1f\xa1\xcd\xe9\x3d\x6d\x2e\x8b\x61\xcf\xf3\xd9\xc1\x51\xde\x8b\xaa\x29\x4d\x70\x4c\xe6\xc7\xf9\xf1\x71\x3e\x3d\xa1\x54\xcf\xde\xb6\x39\x38\xcc\x0f\x8f\xd7\x6f\x21\x56\xe9\x3e\x3a\xc8\xa7\xb3\xfd\x1d\x4b\x7b\x1f\x1d\xe5\xd3\xd3\xe3\x1d\x1b\x0d\xa7\xc2\xf1\x61\x3e\x9f\xed\x52\x79\xfc\x74\x36\x7c\x35\xe2\xe8\x60\x87\x99\x9b\x9e\x9e\xe4\xf3\x93\xfc\xb4\x3f\x4e\xa6\xa7\xf4\x36\x07\x87\xf9\x41\xaa\x2c\xfa\x9d\xbe\x0f\x21\x56\x44\xdf\x04\x5f\x51\x8d\xf6\xa6\xa1\x96\xfb\xbb\x44\x52\xbc\x1d\x0d\xad\xc6\xcc\xb9\x21\xbe\xdc\x82\xe6\xd4\xdb\x8f\x76\x50\xde\xc6\xb2\x3a\xb7\x06\x9d\xe6\xd4\x22\x0b\x3b\xde\xe5\xb2\x9b\x6f\xd3\xa4\xfb\xa5\xe2\xac\x09\xd4\x88\xfe\x80\xcd\x4b\xbc\x1f\xb8\xcd\x1b\x25\xf5\xba\x05\x67\x1b\x74\x46\x52\x5b\x91\x53\xab\xb3\x1e\x80\xf7\x82\x1c\x85\x1f\x8a\xe6\xd2\x8e\x02\x28\x84\x02\x52\xe5\x71\x25\x0a\x52\xd5\xd9\x75\x8f\x84\x44\x9f\x1a\x3a\x28\xa2\x1f\x7d\xfb\xba\xb7\xb0\xe8\x6d\x0b\x05\xb8\x12\x7c\x74\xc3\x4e\xb8\xcf\x24\x6a\x01\x2e\xdb\xbd\xe1\xc2\xf0\x5d\x5b\x7d\xa4\x77\x5d\x4e\x14\x2e\x32\xaa\x04\xea\xb1\x5c\x48\x5c\x08\xd7\xd1\x1a\x0c\x2e\xa7\x1d\x6a\x0d\x38\x54\x04\xcd\x76\x02\x0b\xc3\x95\x3d\xf0\xf3\xb6\xcd\x60\x33\xe0\x3a\x35\xb7\xb3\xc3\x25\x1e\xec\x2f\x4f\x8f\x25\x46\x96\x13\xfd\xfa\x13\xae\x1e\x72\x7e\x54\xb7\xb3\x83\xc8\x4a\x7a\xab\xd9\xec\xe1\x79\xd5\x2c\x96\xed\x6c\xe6\x8e\xe8\xcd\xa6\x8b\x43\x74\x33\x69\x5b\x77\x62\x3c\xb5\xd9\xd5\xd7\xf7\x16\x86\x73\xf0\x35\x21\x00\x09\x35\xa8\x18\xa8\x67\x44\x05\x6a\x7d\x9c\x8d\x81\xd7\xa8\x8c\x71\x9f\xf7\x0c\x55\xa3\x16\x89\xe1\x0e\x0d\x66\x3b\xb4\xb8\x24\x7f\xc8\xef\xa4\xf8\xc4\x8b\x82\x61\x0a\x7a\xf9\x31\xbc\x82\x95\x8a\x30\xcd\xb1\xc9\xfa\x3d\x90\x3e\xda\x61\x45\x2d\x22\xbd\xd2\x59\x2a\xae\x32\xe1\xd3\xc3\xa9\x3c\x5a\x9c\x08\x77\x58\x70\xb5\x33\x73\x0c\xbc\xb1\x22\x94\xc8\x07\x55\x39\x62\x02\x1b\x47\xaf\x45\x97\x59\x19\x69\x71\xd5\x35\xde\x52\xbf\x1d\xc7\xbd\x37\x61\xdc\x02\x9c\xf4\x8c\xe3\x44\x85\x3e\x08\xb7\xee\x3e\x27\x66\x40\x0b\xcd\x8c\x13\x61\x31\x1e\x8a\x19\x4a\xff\xe6\xfd\xe2\x14\x0e\xab\x3a\x30\x93\x88\x8e\x4f\x0a\x56\x18\x19\x0e\x0e\x8e\xd8\xe1\xec\x78\x4a\x95\x4f\x57\xb1\x2a\x62\x72\xbc\x59\x72\x46\xfc\xe2\x57\x2d\xac\x84\x50\x1a\x47\xcb\x5e\x8e\x56\x76\xc4\x2f\xa7\xd4\xc4\x0a\x73\x75\x61\xa8\x79\xe9\x85\xa1\xde\xfe\x1d\x3a\x25\x5f\xb7\xba\x42\x8f\xc4\x3a\x37\x8b\x57\x17\x06\xc8\x07\xcb\xba\xda\x8b\x7f\x92\x3f\x46\xf1\x7e\x9e\x81\xcd\xbc\x89\xa1\x16\xe0\x43\x36\x25\x46\x66\x26\x1c\x70\x5e\xf2\xa9\xa9\xe7\xb3\xc3\x8e\x7c\xa6\x1c\x1c\xb4\x28\x6b\x2b\xcf\xcb\x5c\x2c\x05\x8b\x41\x6c\x32\x5f\x3f\x0a\x09\xfd\xc4\x78\x84\x69\x86\xc4\xc9\xd9\x34\x98\xed\xda\x60\xbe\x6b\x83\x83\x5d\x1b\x1c\x92\x1b\xb0\x32\xdb\xdc\xbf\xb8\x31\x69\xd6\x19\x9e\xf7\xfc\xb2\x75\x38\xa7\x78\xf0\x10\xc3\x82\xa2\x94\x1a\xa6\x03\x31\x2e\x55\x47\x49\xac\x98\x1b\x65\x44\x9a\x00\xe8\xa1\x3b\x14\x41\xac\xc1\xda\xce\x68\x8a\x5a\x3e\x50\x4b\xc0\x21\x71\xf4\x18\x16\x84\xb4\x81\x1e\x66\xb5\x5d\xdf\x74\xdb\x55\x20\x37\x0d\x3d\xa1\x63\xc0\x8e\xf8\xf4\x07\x40\xd6\xf3\x4f\x10\x2e\x6f\x9a\x7c\x3d\xcb\xc9\x7e\x7b\x0d\x3f\x8c\x16\x71\x9e\xf0\x39\x3b\x76\xa8\x9a\x87\xc7\xa7\x5d\x19\xc9\xda\xc1\xe5\x0b\xc6\x19\x73\x00\x3c\xf9\x70\x33\x97\x35\x6e\xec\xbc\x1d\x15\xb8\x4d\x2b\x9a\xd3\x4f\x75\x87\xa3\xb4\xf1\xf9\xc1\x69\x75\xba\x8a\x28\xf6\x8f\xa2\xd9\x75\xe8\xaa\x0b\x8b\x21\x5e\x4c\x3b\x4b\x13\xea\xc2\xc7\x5e\xf1\x8f\xbd\xe2\x1f\x7b\xc5\x3f\xf6\x8a\xff\xff\xee\x15\xbf\xc3\x98\x53\x2c\xd7\x48\x70\xa0\xee\x58\x1f\x96\x96\xa7\xea\x0d\xe3\x34\x6d\xc6\x16\xb4\xac\x1a\x5b\x6b\xaa\x4b\xda\x1a\xa7\x6b\x62\xca\xdf\x06\x6b\x9d\x50\xd4\xea\x51\xbe\xe9\x9a\xcd\xad\xfc\x51\x15\xa1\x06\x85\x25\x68\x9f\x0b\x65\x14\xad\x8e\x5a\x68\x31\xb0\x9a\xf4\x39\xeb\x01\x49\xf5\x24\x86\xb0\xd0\x2d\xad\xe2\x3a\x19\xb9\x40\x9a\x22\x9c\xb8\x01\x3a\x24\x18\xf5\x98\x94\x19\x3a\xe1\xd3\x66\x16\xfd\xd1\xf1\xf4\x21\x33\x40\x56\xb9\x26\x7c\x06\x1a\xea\xba\x56\x76\x5a\x96\x2b\x7a\xb3\xd2\x1e\xb9\x4a\x56\xe7\x0f\xfd\xaa\xd9\x55\xc9\x79\x8e\x39\x03\x77\x78\x98\x50\xe2\xd6\xdb\x75\x7f\xea\xcf\x16\xf5\x64\x22\xcf\xdd\xa8\xfe\x0f\xa1\xb3\x01\x16\x16\x09\xd4\xd5\x1c\x8d\x65\x0f\x49\xc3\x40\x5e\xeb\xe9\x9a\x24\x3e\x3a\x59\x1f\x2e\x47\x1b\xc8\x88\xb0\xcf\x87\xff\x3e\x38\x49\x22\x8f\x67\x43\x0a\x4d\xdf\xed\x2c\x09\x9e\x1d\x93\xfb\xdd\xdf\x1f\x4e\x8d\xbe\xdf\xfd\x04\xf8\x68\x72\x76\x36\x7d\x30\x9d\xa5\x3a\x3d\x9a\x94\x6c\x7f\xff\xec\xec\xc1\x71\x1a\x28\x4e\x7a\x20\xe1\xd5\x25\x1f\xba\xbc\xf7\xdd\x97\xbb\xd7\xe6\xc0\xcf\xa3\x4f\xe5\x9e\xad\x99\x36\x38\x58\x08\x09\x7c\xf3\xe5\xb0\xfb\x52\xe0\x26\x5c\x6e\xb8\xfc\x3e\x80\x1a\x6a\x1f\x8e\x63\x24\x2e\x44\x9b\xcb\xfc\xe1\xc3\xfb\x10\x0b\x3e\xfa\x18\x34\x6c\x32\xf5\x7c\x4f\x38\xdc\x4b\x8c\xaf\xf2\xa8\x84\xbe\x2f\x7d\xf1\x0a\x40\x49\xe9\x7b\x58\xbb\x7b\x27\xe6\x0a\x43\x48\x96\xbc\x9d\x99\x77\x07\x48\x62\x01\xc5\x7d\x23\x7b\x02\xb5\x3d\x7c\x47\x41\x4d\xd4\x32\x12\x70\x76\x53\x12\x6f\x04\xa4\xc0\xa6\x20\x31\x18\x0d\x8b\x94\x2c\x1a\x8a\xf2\x6e\x0b\x65\x8e\xa4\x3e\x2e\x7b\xe3\x7a\x5b\x04\xfe\x7e\x9c\xdf\x7e\x32\xe9\x7e\x48\xb8\x2a\xf1\x34\x02\xba\xfc\x84\x4d\x0a\x53\x37\x23\x90\xae\x49\x33\x42\x67\x62\x92\xe6\x25\x82\x4a\xcd\xe4\x1a\x93\xe0\xa7\x8f\xf3\x78\x6f\x39\xcd\xfe\x5f\xcd\xe3\xbd\xe3\xc4\x06\xe4\x29\x4e\x1a\x30\x05\x73\x29\x18\x1f\x25\xf1\x92\x77\xa3\x3e\x47\xf0\xf1\x32\x68\x3e\xb2\xc0\xac\xba\xad\x4d\xdc\xe1\x13\xe5\x5e\x16\x29\xe2\x24\xae\x56\xdb\xf2\x46\x63\x43\x0d\x41\x8a\x7b\xc8\x9a\x14\x72\xc5\x39\xfa\x70\x2b\x26\x75\x7f\x87\xa5\xe8\xb5\xb0\xd4\x08\x6c\x3f\x73\x29\xe9\xe8\xb5\xf7\x3c\x25\xf4\x50\x78\x6e\x62\x87\x29\x91\x1d\x4c\x0c\x69\xba\x18\xdb\xb8\x91\xc7\x21\x36\xb9\xe8\xfd\xc1\x4d\x91\xc5\x1c\x39\x82\xc4\x32\xb5\x5f\x7a\xdc\xfa\x13\x82\x09\x60\xe4\xc0\xea\xd4\xe6\x9a\x1f\xcc\x0f\x4e\xf6\x93\xac\xc1\xe3\x0a\xbb\x08\xa9\xa9\x65\x46\x65\xb5\xcf\xea\x86\xa7\x8e\x44\xb6\xea\x8a\xf3\x55\x6a\xa8\xa0\x39\xe8\x55\xf2\xb5\xe5\x79\x6d\x53\x82\xab\x89\x5d\xd4\x85\xc9\x99\x8c\xc5\x08\x6c\x36\x65\xa9\xb7\xd5\x98\xe4\x0c\x55\x25\x21\xf8\x10\xbb\xd4\x19\x35\x60\xd2\x1c\x76\x3c\xcd\x37\xd1\x96\xfb\x31\xe7\xa9\xed\x7f\xce\xc7\xcf\xe6\x73\x9e\xd6\x73\xe6\x47\xfb\x45\xec\xd2\x27\x26\x32\x4c\x6a\x69\x8d\x37\xde\x24\x37\x83\x12\x18\x52\x32\x7c\xc0\x70\x08\xa9\x37\x0e\xb8\x5e\x1a\xa5\x71\x16\x92\x8a\x5a\x34\x4d\x92\x6f\x15\x66\xe9\xc9\x52\x18\x53\x2f\x53\xd8\x62\x49\x50\x78\x4c\x52\x2b\x52\xc8\x1c\x69\xde\xbd\x60\x3a\x75\x00\x98\xb2\x44\x26\xe6\x47\x87\x89\xce\x4c\x0c\xd2\x98\x94\x78\xf7\x19\x95\xb8\x05\xfa\x08\xd2\x87\xc8\x31\x25\xe5\xb7\x25\x14\x48\xa8\x68\x39\x84\x7b\x0d\xb4\xf5\x68\x7b\x8d\xeb\x92\xce\x6c\xa3\x8b\x3c\x91\x52\x77\xff\x4b\xa6\x47\xf3\x04\x19\xd3\xd9\x51\xaa\x8f\xd9\x71\xfa\x2d\x5d\xd2\xa8\x91\xa6\xdc\x56\xfc\xbd\x1f\xa4\x45\x10\xe0\x53\xe7\x4b\x47\xd3\x8c\x7c\xfa\x7c\xbc\xfa\xca\x70\x02\x93\x36\xee\xbc\xa9\x53\x42\xa3\x87\x24\x95\xe1\x1e\x94\xa1\x4e\x0d\x6e\x91\x1d\x1e\x25\x7b\xaa\x52\x63\xeb\x21\x69\xaa\x2b\x13\x09\xe3\xbf\x79\xa5\x31\x01\xcd\x2e\x3f\x0b\x9d\x00\x56\xa0\x92\xd6\xfe\x00\xbc\xf9\x35\xf9\x04\x7c\x07\x28\x8d\xdd\x86\x4e\x7b\xe3\x88\xaa\xcc\x5e\xf6\x9d\x47\x3f\xe6\x18\x0a\x84\xd3\x8f\x3f\x7c\x48\x40\xf5\x73\xc9\xce\x53\x72\xb8\x03\x9b\x52\x9e\x55\xf7\x90\xe4\xa9\xb9\xcf\x73\x74\xa9\x37\x0b\xcd\xd2\x8b\xb0\x41\xad\x0d\xd9\xc4\xa4\x9e\xfb\x40\xe0\xd6\x15\xaa\xb8\x8a\x39\x8e\x19\xd8\x1b\xcc\xa8\x87\x76\xa5\x56\xb3\xfd\xe9\x69\xea\x6d\x6a\x95\xf6\x2f\x6f\x40\xe3\xa3\x5b\xa9\xd5\xf0\xa9\xc0\x94\x11\x51\xa5\x4d\xb8\x0d\x68\xfc\x7d\x83\x91\xa1\x45\xe8\xa7\x3f\x29\xbd\x95\xc0\x25\xea\xf4\xe4\x9b\xe8\xf8\x22\xbd\xa5\xfb\x3d\x97\xb4\x69\x5b\xd0\x95\x4f\x89\x30\xb4\x68\x13\xfd\xa0\xcd\x25\x8c\x3e\xcf\xd2\x03\x43\xbb\x38\xca\x82\x48\xba\x7a\x7b\x48\xd6\x83\x53\x47\x4f\x0d\x01\xbd\xea\x30\xb5\x1d\xb5\x08\xde\x0a\xc1\xfb\x8e\x15\xf8\xfb\x97\x6a\x72\x09\xcb\x15\x30\xbb\x29\xc6\x38\xe2\x32\x68\x85\x37\x4a\x64\x35\xcf\x95\x18\xb3\xe6\xb6\xb5\x74\xea\xfb\xac\xfd\x2b\x8e\xe2\x05\x0e\x77\x36\xc6\x40\x12\xbc\xc7\x65\x16\xb5\x44\x85\xeb\xa2\x47\x79\x1c\x33\x25\x84\xb2\xc6\x69\x8c\x6a\x9c\xce\x0a\x56\x42\x4a\xb1\x3e\x53\xc6\x09\xad\xf9\xda\xc2\x36\xae\x1a\x77\x96\x34\xdd\xf8\x3b\x91\x89\x60\x9c\xeb\xc5\xdc\x78\x5f\xe7\xd6\x58\x1f\x1b\xcc\x45\x1c\x33\x62\x84\xb0\xa5\xe3\xa9\xfd\xa3\x80\x7b\x27\x16\x46\xc6\xa1\xb2\xd0\xf8\x58\x55\x16\x86\xe4\x3a\x36\xc6\x63\xeb\x8f\xc5\xda\x14\x73\x0f\x59\xcc\xe3\x5d\x19\x2b\x74\xce\xf8\xb8\x88\x58\x73\xc9\xb8\x65\x6d\xc1\xf7\x2c\x67\x8d\x65\xc6\xe9\xf1\x65\xb0\x0e\x17\x10\x44\xcd\xf3\x30\xc6\x7a\x4e\x70\x58\x97\xd9\xaa\xc7\xa4\x93\x75\xd8\x0b\x1e\xcd\xa1\x4b\xcc\x6d\x38\x8f\x36\xb5\xf2\xc1\x84\x5a\x54\xd2\xb8\x2e\xc7\xd1\xed\xc8\x54\xa2\x27\x60\x3e\x85\x40\x9b\x42\xa8\x64\x1f\x5a\x47\x90\x4e\x2c\x50\xb4\x49\xac\x4d\x22\x3c\x13\x12\x0b\x07\xae\x4b\x22\x93\xe3\xf7\x4a\x24\x21\x21\xd5\x4b\xa1\x52\x4a\x12\x03\x55\x38\xe4\x55\xea\x65\x0c\x52\xa3\x67\x12\xd6\x9c\x99\x78\xa3\x28\x3c\x33\xb5\x49\x1e\x2e\x42\x09\x07\x32\xa5\x99\x09\x5d\xa1\x16\xa2\xe7\xe2\x05\x4a\xb9\xad\x0a\x3e\x2a\xc5\x16\xe8\x42\x04\xb9\x5d\xaa\x94\xe7\x54\xa4\xe6\x06\x55\x99\x42\x98\x14\xaf\x9e\x83\x82\x4d\xf9\xfa\x94\x33\xaa\x8e\xb9\xe0\x63\x92\xf5\xdc\x07\xe3\x12\xef\x6b\xc0\x55\x49\x45\x48\x62\x51\x45\xe4\x49\xb3\x65\x37\x19\x6d\xab\x9c\x8f\x09\x38\xd5\x21\x6d\x69\x34\x84\x98\x0c\xf3\x18\xc1\x78\x86\xb4\x6d\x69\x3c\xd8\x58\x48\x1c\x3e\x20\x95\xc2\xc6\x94\x32\x63\x16\x98\xe2\x5e\xb3\x2c\x8d\xe3\xe0\x82\xd1\x72\x5b\xd7\x33\x85\x2e\xb0\x90\x68\x2a\x07\xb6\xc6\xe4\xca\xac\x9b\xa8\xe8\x91\x91\x5e\x61\x75\x72\x9f\x5b\x67\x1e\xc6\xb4\x6e\xe8\x3c\x4b\x74\xe4\xa1\x12\xdb\x82\x6d\x23\x28\x86\xbd\xd5\xc4\xd1\x09\x96\x34\x72\xd7\x58\x05\xa9\xc5\xf3\xcc\xd8\x98\xd4\xdc\x11\x52\xf2\xd5\x5b\x14\x1c\xab\xe1\x73\xee\x24\x0e\x5b\x9f\xb7\xc9\x8d\xb7\x85\x49\xd4\x29\x71\x10\x40\xf3\x92\xb4\xb6\x51\x27\x88\x8b\x1a\xb3\x02\x85\x14\xa5\x90\x7c\x7c\x8f\xb6\xa2\x30\x65\xa3\x4d\x2b\x87\x6b\x5c\x29\xcf\x93\x0f\x32\xa9\xa2\xb7\x28\x45\x6a\xc7\x0f\x5f\xfb\x2a\x40\x37\x89\x91\x0c\xb8\x81\x1b\x86\x7a\xea\xa9\x33\x50\x8f\x3c\x9c\x1f\xed\x27\xa3\x66\x87\xd3\x2e\xa1\xaf\x9f\x1c\x9d\x1c\xa5\xc8\x80\x82\x12\x0a\x03\xc6\x62\x2b\x20\xd4\x49\x26\x02\x64\x06\x75\x7f\x16\x24\x57\x08\xd0\x65\x6a\xa8\x11\x9d\xda\x14\x4f\x22\x47\xbd\x0e\x80\x4b\x2c\x93\x5e\x7e\x50\xc9\xd0\xeb\xd1\x74\x96\x0a\x56\x73\x48\x06\x3a\x0a\x81\x01\x90\xd5\xb1\x84\x7b\xb3\x77\x2e\xb1\xe7\xa0\x93\x2e\xc7\xc2\x98\x6d\x72\xe8\x18\x8a\xe4\x72\x63\x80\x12\x41\x5f\x7d\x21\x6f\x54\x5f\x13\x0e\xe6\x47\xa9\xb0\xe4\xc0\x4a\x3e\x19\xc8\xad\x23\xe4\xd6\x8d\x9a\xb0\x75\x4c\x3b\xe4\x58\x1d\x75\x17\x73\x65\x0a\x1c\x47\xf9\xda\x24\x3c\x51\x4c\x91\xb6\x01\x53\x05\x81\xac\xe0\x92\x2e\x07\x5e\xb2\x32\x25\x9a\xb8\x61\x9e\x62\x44\x73\x13\x8b\x24\xcb\xaf\x41\xc9\xe8\x0b\x37\xb1\x4b\x31\x35\x5f\x76\x69\x67\x0e\xef\x42\x38\x49\xec\x20\xd1\xdb\x12\x46\x27\xe5\xaf\x88\x1c\x59\x32\xb5\x21\xb9\x2b\x7a\x48\x63\x68\x49\x72\xa5\xe3\xc9\xfd\x53\xc6\x10\x53\x81\xb4\x1e\xa3\x53\x73\x55\x81\xe6\x29\xd7\x65\x25\x90\x92\x24\x57\x89\x60\x1d\x32\x11\x20\x35\x1b\x15\x96\xc3\x87\xc8\x13\x28\x93\x9e\xfa\x9a\x94\x81\x54\x1b\x5d\x2d\x31\xc5\x5b\xbd\x85\x56\xc4\x32\x85\x8a\x4b\x24\xb8\xa9\xeb\xd8\xa5\x36\x34\xea\xf5\xa7\x7c\xb4\x68\x03\xa4\x94\x42\x0c\xb5\x49\xe6\x46\x9d\xdf\x9f\xc8\x79\x09\xc1\xe1\xcb\xd3\xa3\xbe\x8a\x06\xb0\x03\x9d\x0e\x25\x34\x30\xd4\x0f\x6d\xba\x4c\x42\x91\xcc\xb8\x10\xc2\xa6\xa7\xad\x69\x54\x9d\x34\xd1\xd2\xdd\xf4\x5a\xa4\xe0\x49\x2d\x46\x1a\x99\xe2\x7d\x19\xcd\x39\xca\xe4\xf2\x28\x30\x5d\x3a\xc0\x0f\xa6\x8b\x7a\xfc\x30\x18\xd2\x0e\xd2\x3d\x6d\x50\x09\xbb\xd3\x14\xd8\x24\xf3\xe9\x4c\x1a\x12\x8b\x64\x56\x45\xb7\x82\x26\x1d\x24\x46\x95\x49\xd0\x55\xc6\x52\x8a\xb9\x5e\xf4\x7c\x9a\x32\xf5\x1c\xb0\x64\x44\xc5\x42\x67\x93\xc9\x51\x6b\x90\x29\xce\x05\x0b\xc9\xfc\x64\x0e\x28\x53\xc7\xc6\x43\xbc\xfc\xc0\xfb\x08\xa8\x4b\xce\x58\x0f\x21\x29\x54\x0e\x3a\x56\x83\x4f\xf9\xf0\x9d\xd1\x55\x9d\xb4\x40\x5d\xac\xa2\x49\xef\x7f\x9f\x39\x31\x7c\x55\x2d\x01\x03\xdd\xc4\x64\x8a\x8c\x67\x46\x59\xe1\xc6\x8d\x0a\x2f\x80\x10\x44\xf3\x2a\x57\x63\x61\x59\xaf\x56\x3c\x95\x21\xe5\x35\x58\xee\x4c\x2a\xf8\xe4\x75\xbb\x4c\xf5\xe4\xd3\xf9\x41\x01\x9a\xa8\x2b\x9b\xce\xac\x16\xa0\x16\x28\xda\xe4\x9c\x07\x1c\x7c\xfe\xac\x4e\xed\xa1\xc8\x81\x6d\x3f\x27\x37\x6a\x27\x27\x55\x9c\x85\xba\xfc\x20\xd1\x98\x61\x4c\xb1\xe3\x5a\x81\xcc\x8c\x07\x22\x5a\x41\xd9\x61\x4b\x04\x9a\x01\xb4\x44\x05\x12\x92\x47\xf6\x12\x75\x1d\x41\x8b\x94\x5b\x66\xa9\xd2\x67\x54\x07\xba\x6a\x04\x8f\xa9\x35\x5f\xd5\xa0\xab\x15\xfa\x1a\xc7\x67\x64\x55\x63\x32\x8f\x65\x45\xb8\x5b\xb1\xaa\x23\xd6\xf7\x69\x54\x13\x6e\x5a\x2d\x0d\xf0\xfc\x5c\x84\xc2\x01\xea\x7b\xef\xb9\xac\x0b\x5d\xf4\xa2\xde\x7b\xb9\x29\x7b\x91\xad\x8b\x83\xdc\x6a\x72\x79\x85\x68\x7a\x9a\xcf\x4e\xd6\xff\x7b\x30\xbf\xf7\x72\xd2\xa7\x3e\xf1\xf9\x57\xbf\x30\x79\xf9\x73\x97\x7d\xac\x7f\xfe\xc3\x97\xbe\xf8\xf2\xa7\xaf\xdd\x19\xfb\xdf\x01\x00\x00\xff\xff\x0f\x2c\x9d\x3f\xc7\xd4\x00\x00")
96 |
97 | func assetsHtmlClashConfigYamlBytes() ([]byte, error) {
98 | return bindataRead(
99 | _assetsHtmlClashConfigYaml,
100 | "assets/html/clash-config.yaml",
101 | )
102 | }
103 |
104 | func assetsHtmlClashConfigYaml() (*asset, error) {
105 | bytes, err := assetsHtmlClashConfigYamlBytes()
106 | if err != nil {
107 | return nil, err
108 | }
109 |
110 | info := bindataFileInfo{name: "assets/html/clash-config.yaml", size: 54471, mode: os.FileMode(420), modTime: time.Unix(1603803569, 0)}
111 | a := &asset{bytes: bytes, info: info}
112 | return a, nil
113 | }
114 |
115 | var _assetsHtmlClashHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\x5b\x53\xdb\x46\x14\x7e\x67\x86\xff\xb0\xd1\x43\x27\x4d\x91\xc5\xe5\xa1\x1d\x8f\xa4\xb4\x43\x92\x49\xdb\x87\x32\x13\x32\x49\x1f\x85\xb4\xa0\x2d\xf2\x4a\xd9\x5d\x3b\x50\x86\x19\x3b\x85\x70\x09\xb7\x24\x84\xb4\xe0\x84\x40\x93\x94\xc9\x70\xeb\x90\x49\x0d\x98\xf0\x5f\x8a\x56\x92\x9f\xf8\x0b\x1d\x49\x36\xd8\xc1\x21\xa1\x3c\xd9\xe7\xec\xb7\xdf\xb7\xe7\xac\xce\x39\x2b\x5f\xb8\xf2\x53\x7b\xe7\xcf\x1d\x57\x81\xc9\x52\x96\xda\xd8\x20\x87\xbf\xc0\xd2\x70\x8f\x22\x40\x2c\xa8\x8d\x0d\xa1\x0f\x6a\x86\xda\xd8\x00\x00\x00\x72\x0a\x32\x0d\xe8\xa6\x46\x28\x64\x8a\x90\x66\xdd\xe2\x37\x42\xcd\x9a\xc9\x98\x23\xc2\x3b\x69\x94\x51\x84\xdb\xe2\xcd\xef\xc4\x76\x3b\xe5\x68\x0c\x75\x59\x50\x00\xba\x8d\x19\xc4\x4c\x11\xbe\xbf\xaa\x40\xa3\x07\xd6\x6e\xc5\x5a\x0a\x2a\xc2\x75\x0d\x1b\x26\xb4\x8c\x6b\x04\x41\x6c\x58\xfd\x55\xbb\x3a\x49\xba\xee\x96\x0c\x82\x77\x1d\x9b\xb0\x2a\xe8\x5d\x64\x30\x53\x31\x60\x06\xe9\x50\x8c\x8c\x26\x80\x30\x62\x48\xb3\x44\xaa\x6b\x16\x54\x5a\x12\xcd\x4d\x20\xa5\xf5\xa1\x54\x3a\x55\xed\x4a\x53\x48\x22\x5b\xeb\xb2\xa0\xd2\x2c\x00\xa9\xa2\x78\x41\x14\x41\xa7\x89\x28\xb0\x10\x86\x00\x51\xd0\x6d\x13\x60\xd9\xba\x66\x01\x06\x29\x13\xc5\x6a\xa0\x6c\x21\xdc\x0b\x08\xb4\x14\x81\xb2\x7e\x0b\x52\x13\x42\x26\x00\xd6\xef\x40\x45\x60\xb0\x8f\x49\x3a\xa5\x02\x30\x09\xec\x56\x84\x44\x22\xb4\x24\x84\x0d\xd8\x97\x08\xfd\x2a\x38\x66\x3b\x0b\xd1\x87\x34\x65\x0a\x86\x98\x05\x55\x3e\x3c\x19\xbc\xdd\x6e\xb7\x34\x6a\x06\xe3\xf7\xfc\x7b\xdb\xb2\x14\x2f\x34\x36\xc8\x52\xf9\x92\x1b\x1b\xe4\x2e\xdb\xe8\xaf\x6c\x34\x50\x06\xe8\x96\x46\xa9\x22\x30\xdb\xe9\xd2\x48\x85\x32\x5a\x35\x5b\x54\x99\x32\x62\xe3\x1e\xf5\x1a\x81\x10\x74\x10\xbb\x0f\x41\x2a\x4b\x65\xa7\x2c\x99\x2d\xd5\x78\xa7\xc2\x65\x40\xaa\x13\x24\xa8\xc1\xc8\x1b\x3e\xbe\xe2\x8d\x3f\xe6\xd3\x73\xac\xa7\xb4\xfc\xb0\x94\x7b\x7c\x90\xcd\x05\xeb\xcb\xa5\xdf\x87\x79\x7e\x93\x3f\xcb\x1e\x64\x73\x7c\x78\x95\x17\xb3\xee\xce\xa3\x20\x37\xeb\xef\x3d\x74\x0b\xe3\xfe\xfc\x10\xa5\x07\xd9\x1c\xa5\xe4\x20\x9b\xcb\xa4\x60\x64\x31\x62\xff\xa2\xe1\x38\x34\x77\x7f\xc9\xcb\x6d\x1c\x16\x27\x82\xdc\x3c\x9f\x19\xe5\x53\xbb\xa5\x91\x49\x3e\x33\xe5\x4d\xcf\xb8\xef\x17\x62\x0c\x1f\x7d\x1a\x2c\xad\xc8\x92\x53\x89\x56\x32\x50\xa6\x4e\xe4\x14\xea\x0c\xd9\xb8\x36\xf4\x56\x55\xd6\x2a\x80\x1e\x02\x21\x3e\xbe\x82\x30\xc1\x82\x1a\xe5\x59\x96\xb4\x30\x0b\xad\xd5\x5b\xd3\x56\x95\x15\x93\xb5\xa9\xa5\xe1\x49\x7f\x6f\xdd\x9b\x1b\x71\x77\xdf\xc9\x92\xd9\xf6\x21\xc4\x42\x31\x61\x35\x2e\x09\x06\x06\x40\x82\xc0\x3b\x69\x48\x19\x18\x1c\x4c\x4a\x52\xe8\x30\xec\x94\x86\x70\x68\x87\x56\x58\x17\x60\x70\x30\x3e\x95\xa4\xdb\xb8\x1b\xf5\x80\x8f\x1c\x3d\xc2\x24\x25\x09\x61\xca\x34\xcb\x12\x63\xf4\xe5\x34\xb1\x94\xff\xa9\x24\xa8\x6e\x21\x5b\x9a\x5d\xe7\x1b\x45\x3e\xfc\x2a\xce\x86\x85\xea\x04\xe7\xe5\x57\x79\x7e\x33\xd8\x9f\x09\x96\x26\xbc\xa7\xef\xea\xc4\x1a\x36\x96\xa4\x24\xb5\xb4\x7e\x9d\x68\x4e\x34\x27\x5a\xea\x68\x46\xb5\x78\x1c\xe2\x27\x83\x3a\x1b\xe5\xe7\xc5\x62\xb6\xa9\x1d\xc4\xce\x20\x03\x92\xd3\xee\x11\x38\xc4\xee\xeb\x17\x9d\x32\xf4\xb0\x38\x7f\xe6\x0c\x3b\x95\x6a\xab\x9b\x50\x7f\x6d\xa1\x94\x1d\x73\x77\xff\xf4\x67\xee\xfb\x7f\xef\xf2\xe7\x0f\xce\xa1\x71\x39\xea\x36\x94\x36\x51\x4a\x9a\xa2\x72\x3b\x55\xb5\x94\x5d\xe4\x3b\xaf\xcf\xa3\x47\x1d\x08\x0d\xa5\xf9\x54\x15\xbe\xb0\xc7\xd7\xdf\x9d\x47\x45\x57\xae\xff\xd8\xd4\x79\xab\xe9\xe6\x8d\x2f\xb0\xae\xfc\xd0\x01\x2e\xea\x6e\x61\xa7\x94\xcf\x06\xaf\x73\xfe\xfc\x50\x45\x60\x02\x87\x6e\xb7\x30\xf9\xc1\xca\x97\xa7\xa7\xbe\xb0\x16\xec\xad\x9e\xe7\x78\xdd\xc8\x62\x90\x28\x04\x5c\x24\x91\x7e\xcc\x37\xe1\xb8\x85\x1d\xc7\xb6\xad\xc3\xe2\x04\x71\x8e\x16\xbe\x2a\xbb\x70\x88\x2d\x3d\x7b\x7e\x04\xc7\x4e\xec\x38\x5a\x0f\x6d\x3e\xb5\xe8\xcf\x2e\x22\xe7\x63\x21\x78\x0b\x6f\xbd\xb9\x4d\x6f\x6e\xdb\xdb\x7a\x72\x58\x9c\xaf\x05\x94\xbb\x58\xa5\x85\x84\xe3\x06\x33\x41\x3d\x09\xaa\xfd\xe2\xc3\x69\x79\x0b\x61\xc3\xbe\x4b\x93\x20\x16\xa8\xae\x70\x3e\xb9\xc5\xa7\x37\xea\x9c\xe7\x04\xd3\xed\x24\xb8\xa2\x51\xb3\xcb\xd6\x88\xe1\x16\xd6\x0e\x8b\x13\x61\x33\x1f\xd9\xf5\x36\xa6\xdd\xc2\x1b\x7f\x6d\xce\x7f\xf2\xca\xdf\x1d\xe2\xd3\x5b\x6e\x61\x3c\xf8\xeb\x51\x78\x61\xa3\xff\x78\x73\x9b\x7c\xe1\xbd\xf7\x62\xe4\xb3\x24\x3a\x88\x9d\x04\xed\x71\x2b\xf9\xf7\xfe\x23\x70\xd3\x31\x34\x06\xc1\xd5\x3e\x06\x09\xd6\x2c\x70\xc3\x4e\x13\xbd\x6e\xf1\x45\x3c\xd2\xc9\x26\x5f\x8b\xac\x42\x9c\x61\xec\x0c\x0c\x88\x40\xba\x04\xbc\xb1\xac\x97\x1f\x73\xf7\xf6\xfd\xd9\x15\x2f\xbf\x1a\x16\xf9\x8b\x5c\x3c\xd9\xbc\xfc\x24\x1f\x5f\xf2\xe7\x87\xfc\xd7\x39\x6f\x6d\x99\x8f\xbe\x28\xfd\xf1\xf2\x20\x9b\x73\xf7\xd7\xbd\xd9\x6d\x7f\x6c\xd4\x7b\xf6\x5b\x3c\x1b\x2f\x49\x83\x83\xd5\xb3\x59\xf5\x56\x97\x83\xfd\x29\x3e\xbc\xe5\x6d\xad\xf0\xa9\x45\x77\x2f\x1f\x64\x87\x2b\x53\xf9\xb0\x38\x7f\xd4\x51\xc3\xb6\x49\x93\x92\xc4\x12\x29\x28\x39\x10\xf6\x76\xa7\xb1\xa0\x7e\x5b\xfe\x17\x37\x46\xa7\x66\xee\xab\x47\x7c\xf5\x78\x7a\x10\x33\xd3\x5d\x09\xdd\x4e\x49\xbf\xa6\x5b\x7a\xa3\xef\xbf\x3f\xfc\x5c\x45\x92\x12\xd4\xcf\x41\xd5\xd5\xf4\xd6\x5e\xfa\x2b\x0f\xf8\xce\x74\x18\x75\x7e\xf5\x13\xca\x54\xc3\x34\x8d\x5a\xdb\xda\x8e\x89\x75\x13\xea\xbd\x75\x0f\xf0\x31\x70\x78\x8e\x68\x28\x67\x20\xa1\xc8\x0e\xeb\xfb\xe4\xf3\x42\x96\xca\x2f\xac\xe8\xd9\x15\xbe\xbb\xff\x0b\x00\x00\xff\xff\x27\xa2\xd6\x1a\x87\x0b\x00\x00")
116 |
117 | func assetsHtmlClashHtmlBytes() ([]byte, error) {
118 | return bindataRead(
119 | _assetsHtmlClashHtml,
120 | "assets/html/clash.html",
121 | )
122 | }
123 |
124 | func assetsHtmlClashHtml() (*asset, error) {
125 | bytes, err := assetsHtmlClashHtmlBytes()
126 | if err != nil {
127 | return nil, err
128 | }
129 |
130 | info := bindataFileInfo{name: "assets/html/clash.html", size: 2951, mode: os.FileMode(420), modTime: time.Unix(1618997397, 0)}
131 | a := &asset{bytes: bytes, info: info}
132 | return a, nil
133 | }
134 |
135 | var _assetsHtmlIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\xdd\x53\x1b\xc9\x11\x7f\xa7\x8a\xff\x61\x6e\x1f\x72\x97\x8b\xc4\x1e\xf6\x4b\x4a\xb5\xbb\x97\x14\xe7\xcb\xe5\xf2\x10\x2a\xe0\x3a\xe7\x89\x5a\xed\x0e\xda\x09\xab\xdd\xf5\xcc\x2c\xa0\x50\x54\x49\x36\x32\x1f\x06\x84\x6d\x8c\x13\x90\x8d\x21\xb6\xa3\x72\xf8\x72\xe1\x22\x02\x84\xf9\x5f\xc2\x7e\x48\x4f\xfc\x0b\xa9\xd9\x95\x8c\x3e\x10\x06\xe3\x27\x69\x7a\x7e\xfd\xeb\xe9\x9e\xee\xe9\x5e\xe1\xab\x1f\xfe\xdc\xd3\xff\xd7\xde\x5b\x40\xa3\x49\x5d\xea\xec\x10\xd8\x2f\xd0\x65\x23\x21\x72\xd0\xe0\xa4\xce\x0e\x26\x83\xb2\x2a\x75\x76\x00\x00\x80\x90\x84\x54\x06\x8a\x26\x63\x02\xa9\xc8\xd9\x74\x30\xfa\x5b\xae\x61\x4f\xa3\xd4\x8a\xc2\xbb\x36\x1a\x16\xb9\x3b\xd1\xdb\xbf\x8f\xf6\x98\x49\x4b\xa6\x28\xae\x43\x0e\x28\xa6\x41\xa1\x41\x45\xee\x8f\xb7\x44\xa8\x26\x60\xa3\xaa\x21\x27\xa1\xc8\xfd\x24\x1b\xaa\x06\x75\xf5\x47\x8c\xa0\xa1\xea\xa9\x3a\xad\x7e\x6c\x9f\xa9\x50\x44\x75\x28\xfd\x88\x21\x04\xbd\xd8\x1c\x45\x90\x08\x7c\x28\xab\xe7\xb4\xb0\x69\x41\x4c\x53\x22\x67\x26\x62\x04\x51\x38\xc0\xac\xd4\x71\xd6\x13\x70\xed\x55\x55\x48\x14\x8c\x2c\x8a\x4c\xa3\x4e\xd9\xcd\xce\x95\xdf\xef\xfb\xcb\x13\x84\x9c\xa4\x33\x84\xe0\x93\x74\x66\x38\x09\x83\x15\xc5\xe6\xdf\x64\xa3\x3c\x73\xcf\xbf\xb7\x7f\x9e\x9f\x43\x30\x35\x62\x62\x95\x5c\x96\xce\xc4\x17\xd2\x0d\x23\x38\x62\x99\x98\xd6\xd1\x8d\x20\x95\x6a\xa2\x0a\x87\x91\x02\xa3\xc1\x22\x02\x90\x81\x28\x92\xf5\x28\x51\x64\x1d\x8a\xdd\x5d\xdf\x45\x40\x52\x1e\x45\x49\x3b\x59\x2f\xb2\x09\xc4\xc1\x5a\x8e\xeb\x50\xfc\x8e\x03\x7c\xcd\xe2\x57\xd1\x28\xe8\xd7\x10\x01\x3a\x32\x20\x40\x04\x0c\x9a\x18\xe8\xa6\x22\xeb\x80\x42\x42\xa3\xd1\x7a\xa0\xa0\x23\x63\x08\x60\xa8\x8b\x1c\xa1\x29\x1d\x12\x0d\x42\xca\x01\x9a\xb2\xa0\xc8\x51\x38\x4a\x79\x85\x10\x0e\x68\x18\x0e\x8a\x5c\x57\x17\x5b\xf1\xc8\x50\xe1\x68\x17\x93\x4b\xe0\x8c\xed\x2a\x44\xcd\x34\x9d\x1d\x02\x5f\x4d\xe1\xce\x0e\x21\x6e\xaa\xa9\x1a\xab\x8a\x86\x81\xa2\xcb\x84\x88\x1c\x35\xad\xb8\x8c\x6b\x81\x0d\x76\xb5\x6e\x49\x20\x14\x9b\x46\xa2\x29\xcb\xaa\x42\x81\xd7\xba\xeb\xf1\x56\x8d\x2b\xcc\x15\x4e\x2a\x4f\xbe\x75\x67\x0a\xde\xcc\x13\x37\xb7\x44\x13\x95\xf5\x47\x95\xcc\x93\x93\x74\xa6\xbc\xb5\x5e\xf9\x47\xd6\xcd\xef\xb8\xcf\xd3\x27\xe9\x8c\x9b\xdd\x70\x4b\x69\xe7\xe0\x71\x39\xb3\xe8\x1f\x3d\x72\x8a\x33\x9f\xce\x27\xe7\x78\xcd\xcb\x6c\x9f\x96\x66\xcb\x99\x65\x77\x61\xca\x9d\x3f\xac\x4c\xce\xb9\x0b\xf3\x5e\x6e\xc1\xf9\xb0\x12\x62\xdc\xa9\x67\xe5\xb5\x82\xc0\x5b\x35\x6f\x79\x15\x0d\xb7\x7a\xfe\x35\x81\x0a\xcb\xea\xaf\x1b\x5c\xbf\x21\xf9\x87\xab\xe5\xad\x35\x81\xd7\x6e\x34\xf8\x28\x79\xf9\x39\x77\x66\xcd\xff\xcf\xb6\x9b\x7d\xe7\xe5\xa7\xdd\x6c\xa1\x72\xbf\x10\x5a\x14\xe2\x12\x18\x1b\x03\x5d\xb2\xae\x0f\x58\x61\xb0\x06\x14\xd3\x36\x28\x18\x1f\x07\x02\x1f\x97\x9c\xe2\xdb\x93\xf4\x3d\x37\xbb\xe7\x14\x37\xdd\xdc\xb6\xbf\x58\x20\xa4\x51\x95\x90\xb6\x9a\xa7\xa5\x59\x42\x70\x33\x1c\x5f\x84\x0f\x42\xd7\xa8\x11\x88\x2e\xd2\xa9\x0f\x73\x4d\x29\x94\xb5\xd5\x3a\x8b\x71\x35\x46\xa1\x6f\x21\x87\xf7\x74\xa7\x32\x99\x3b\x2d\x2d\x0b\x71\x89\x71\xd9\x04\x0e\xda\xad\xf1\x61\x54\x2d\x3c\x5e\x3e\xcd\x2e\x75\xe5\xbd\xb7\xb4\xe3\x3d\xdb\xab\x3c\x7b\x7f\xc6\xa3\xcb\x84\x0e\x28\x58\x1e\xd1\x07\x28\x4a\xc2\x16\x8a\x36\xd7\xcd\x55\xaf\x9b\x6b\xba\x6e\x41\xae\x01\x12\x18\x42\xe3\xac\x96\x74\x99\x68\x9c\xd4\xc3\x7e\x04\x5e\x96\x9a\x13\xc2\xd6\xeb\x56\xd5\x52\x0d\xd1\x95\xec\x9c\x7f\xb4\xe5\x2d\x4d\x3a\x87\x7b\xb1\x20\x8c\x18\xde\xb5\x21\x61\xde\xc6\x78\x9e\x09\x54\x33\x29\x23\x83\xad\xd9\x8a\xbd\x5e\x60\x7c\x3c\x34\xc9\x2b\xa6\x31\x88\x12\xa0\xcd\xb9\x02\x4c\x8c\xe7\x91\x41\xa8\xac\xeb\xd1\x10\xfd\xbd\x8d\x75\xf1\x33\x2d\x71\x92\x53\x4c\x57\x16\xb7\xdc\xed\x92\x9b\x7d\x1d\xba\xaa\xa3\x76\xce\xb1\xe6\x30\x9a\x8a\x5a\xd8\x1c\x46\x2a\xc4\xa7\xa5\xe5\x2b\x9b\xb5\x6a\xcf\xc9\xb9\x56\xfc\xcd\x95\x4a\x7a\xda\x39\xfc\x97\xbf\xf0\xc0\x7f\x77\xe8\xbe\x78\x78\x0d\x1b\xdf\x07\x0f\x25\x21\x11\x42\x70\x24\xa8\x80\x0b\xad\xba\x2b\x47\xee\xd6\xde\x75\xec\x29\xe2\x4f\x7f\x8a\xf4\xff\x12\xb9\xdd\xf7\x2b\x43\x11\x7f\xee\x05\xdf\x28\x4e\xf1\xa0\x92\x4f\x97\xdf\x64\xfc\xe5\x89\x9a\x81\x59\x83\x89\x9d\xe2\x5c\xd3\xce\xaf\x2f\x0e\x4a\x71\xb3\x7c\xb4\x71\x9d\xe3\x0d\x22\x9d\x42\x2c\x62\xf0\x0d\x0e\xec\x87\x7c\xb3\x96\x53\x3c\xb0\x4c\x53\x3f\x2d\xcd\x62\xeb\xe3\xc6\x6f\xaa\x22\x83\x61\x2b\xcf\x5f\x7c\x84\x1b\x56\x28\xf8\xb8\xcf\xd6\xee\xfc\xaa\xbf\xb8\x8a\xac\x76\x2e\x54\x8b\x79\x69\xdf\xdb\x7d\x7a\x5a\x5a\x6e\x04\x54\x2b\xaa\x96\xf1\xac\x87\x19\x94\x93\x5a\x41\x8d\xb9\xc8\x5a\xf0\x2f\xc8\x50\xcd\x11\x12\x03\xa1\x81\xfa\xe2\x73\xe7\x76\xdd\xdc\xf6\x39\xe7\x69\x61\xba\x13\x03\x3f\xc8\x44\x8b\x9b\x32\x56\x9d\xe2\xe6\x69\x69\x96\xf5\x91\xc9\x43\x6f\x3b\xe7\x14\xdf\xfa\x9b\x4b\xfe\xd3\xd7\xfe\xe1\x84\x9b\xdb\x75\x8a\x33\xe5\x7f\x3f\x66\x17\x36\xf5\x5f\x6f\x69\xc7\x5d\xf9\xe0\xbd\x9c\xbc\x94\x89\x5e\x6c\xc6\x40\x4f\x58\xdc\xff\x7b\xf0\x18\xdc\xb6\x54\x99\x42\x70\x6b\x94\x42\x6c\xc8\x3a\xe8\x33\x6d\xac\x9c\x5b\x16\x01\x0f\xdf\xfa\xe0\x34\x22\xeb\x10\x57\x7c\x02\xfb\x34\x59\x35\x47\xfe\x62\x2a\x43\x90\x5e\xf8\xcc\x31\x67\xaa\x7d\x2f\x68\xe5\x5f\xae\xfa\x03\xe6\x62\xd1\x5f\x2c\x7c\xc9\x1a\x8c\xfc\xdc\x1b\xe9\xfb\xc3\x17\x8b\x53\xbb\x56\x41\x6c\xcc\x26\xfa\x3e\xf6\x73\xe9\x56\x11\xa0\xeb\xb3\xf5\x6a\x2e\x07\x36\x3f\xd1\x2b\x02\xcc\xcd\x18\x7f\xdd\x6e\x51\x6f\xeb\xd2\xdd\x22\xf0\x2f\xec\x16\x40\x47\x84\x7e\x8e\x7b\x6d\x72\xa5\xf5\x02\x2f\x75\x85\x63\x63\x51\xc0\x7f\x0b\xbc\xe9\xb4\x97\x9f\x76\x8e\x8e\xfd\xc5\x82\x97\xdf\x60\x9d\xe6\x65\x26\x9c\x1f\xab\x23\xde\xf2\x84\xff\x26\xe3\x6d\xae\xbb\x53\x2f\x2b\xff\x7c\x75\x92\xce\x38\xc7\x5b\xde\xe2\xbe\x3f\x3d\xe5\x3d\xbf\x1f\x4e\xa0\xdf\xf2\xe3\xe3\x8d\x13\xcb\xc6\x7a\xf9\x78\xde\xcd\xee\x7a\xbb\x05\x77\x7e\xd5\x39\xca\x97\xd3\xd9\xda\xec\xcb\x86\x17\xb9\x7a\x29\xec\x33\x91\xc4\x78\x9e\x76\x25\x21\x6f\x41\x38\x34\x68\x1b\x9c\xf4\xbb\xea\xbf\x30\xa0\xcd\x53\x55\x8d\xef\x3c\x9e\x04\xa2\x9a\x1d\xef\x52\xcc\x24\xff\x77\xbb\x7b\x28\x88\x59\x8a\xbd\xcc\x51\x9c\xe4\xa4\xcb\xa0\xce\xb5\xe9\x6d\xbe\xf2\x0b\x0f\xdd\x83\x1c\xf3\x3a\xbf\xf1\x09\xcb\x44\x36\x88\x8d\x6e\xdc\xbc\x79\x46\xac\x68\x50\x19\x3a\xf7\x00\xed\xc0\xec\x1c\xe1\xa8\x0a\x31\x41\xa6\x11\x4c\x76\xcd\x53\x9d\xc0\x57\xbf\x63\x82\x8f\x1b\xf6\xed\xfe\xff\x00\x00\x00\xff\xff\x1f\x9e\xb3\xb3\xcb\x0f\x00\x00")
136 |
137 | func assetsHtmlIndexHtmlBytes() ([]byte, error) {
138 | return bindataRead(
139 | _assetsHtmlIndexHtml,
140 | "assets/html/index.html",
141 | )
142 | }
143 |
144 | func assetsHtmlIndexHtml() (*asset, error) {
145 | bytes, err := assetsHtmlIndexHtmlBytes()
146 | if err != nil {
147 | return nil, err
148 | }
149 |
150 | info := bindataFileInfo{name: "assets/html/index.html", size: 4043, mode: os.FileMode(420), modTime: time.Unix(1618997420, 0)}
151 | a := &asset{bytes: bytes, info: info}
152 | return a, nil
153 | }
154 |
155 | var _assetsHtmlSurgeConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x94\x5d\x6f\x1b\x45\x17\xc7\xef\x57\xda\xef\x30\x52\x6f\x77\x3d\x7e\x1e\xa0\x17\x95\x7c\x61\x25\x5b\xd7\x28\x0d\x56\xd6\x15\xaa\x50\x84\xc6\xbb\x27\xf6\xe0\xd9\x17\x66\x66\x9d\x44\x55\xa5\x44\xb4\xc5\x71\x69\x71\x40\x54\x0a\x0d\x2a\xf4\x45\x2d\x94\x20\x21\xd1\x02\x4a\xad\x7c\x19\xcf\xda\xbe\xea\x57\x40\xbb\x6b\xa7\x4b\x82\xb8\x72\x90\x7a\xb1\xf6\xcc\xee\x99\xf3\xfb\x9f\xb7\xf9\xa8\xc6\x83\x8d\xcd\x55\x5d\x5b\xa4\x1c\x1c\x89\x4a\xc8\x4d\x17\xba\xa6\x6b\xd9\x37\x54\xe1\x41\x14\xae\xea\x5a\xb6\x2b\x21\x01\x0c\x1c\x69\x20\x75\xf8\x72\x7c\xf4\x20\xde\xdf\x1a\x0e\xee\x1a\x48\x3d\xfe\x75\xfc\xdb\x13\xd5\xfd\x3c\xbe\xf3\xd0\x40\xf1\xce\x6d\xd5\x7b\x36\xd9\xda\x89\x6f\xff\xa8\x6b\x79\x4b\x54\x42\x11\x67\xa6\x04\x21\x0d\x14\x06\x8c\x3a\x9b\x66\x48\x64\xab\xd4\x92\x32\x14\x17\x30\xbe\x76\x0d\x15\xdc\xc0\x23\xd4\x47\xd7\xaf\x63\x11\xf1\x26\xe0\x90\x07\x1b\x14\x84\x91\x1c\x4d\x0d\x2f\x60\xbc\xbe\xbe\x5e\xf8\x34\x22\xcc\x09\x3c\xaf\xe0\xf8\xb8\x09\x3e\x70\x22\xe1\xe3\xff\x17\xdf\x35\x50\x14\xba\x44\x82\x49\x7d\x09\xbc\x43\x58\xe9\x9d\xf3\xc5\xa2\x81\x66\x5b\x54\x42\xe7\x8b\x45\x61\x20\x19\x30\xe0\xc4\x77\x00\x95\xd0\xff\x8a\x45\x2f\x79\x45\x3d\x08\xa2\x24\x13\xef\x09\x03\x41\x87\xb0\x28\xf1\xd4\x80\xb5\x80\x83\x19\x89\xc4\x54\xf2\x08\x74\x2d\x1f\x32\x2a\xa1\x35\xc2\x58\x83\x38\xed\xb7\x3d\xac\x7c\xed\x72\xe5\x7e\xbb\x83\x2a\x87\x21\x83\x5c\x34\x59\xbb\x1b\x28\x6d\x6a\x5d\x2b\xbb\x0d\x16\x38\xed\x7f\x30\x58\xb1\xde\xb7\x16\xea\xb3\x7f\xb3\x5e\x5d\xbe\x5a\xa9\x5e\x4c\xc7\x63\x25\x62\xb0\xaa\x6b\xe7\xd0\xca\x95\x25\xcb\xb6\xea\xba\x96\x2c\x4c\xdb\xaa\x1b\xf6\x55\xbb\x6e\x5d\x36\x16\xa7\xb3\x74\x0e\x25\xcf\x15\xbf\xc1\x81\xb4\x91\xea\xdf\x1d\x1d\x1e\x8c\x9f\xde\x50\xdd\xbd\xe1\xd1\x2f\xf1\xc1\xa3\xdc\xc9\x59\x6a\x9b\x54\xb6\xa2\x46\xc1\x09\x3c\xbc\x48\x3b\xd4\x07\xcb\x6f\x52\x1f\x70\x8d\x07\x6b\x94\x81\xc0\x9c\xac\x63\x8f\x08\x09\x1c\xdb\x69\xe2\x13\x39\x02\x24\x9e\x62\x0a\x8c\x0a\x69\x4c\x03\x4b\xf0\x65\xb7\x03\x5c\x52\x41\xfd\x26\x52\x7f\x1e\xa9\xdd\xde\x5c\xb1\x95\x88\x70\x17\xe7\x20\xa7\x04\xd4\x38\xed\x10\x67\x13\x4d\xbe\xed\x8f\x9e\x6e\xcf\x12\x37\x57\xfc\x14\x71\x0a\x7d\x89\x7e\x42\x9c\x76\x12\xf9\xf8\xa8\x3f\xee\x3f\x51\xdf\xdc\x52\xbd\xe7\xf1\x17\xdb\x71\xf7\x5e\xbc\xfd\x32\xbe\xf1\xe5\x68\xb0\x3b\x7a\xbe\x77\x06\x19\x39\x46\x9f\x12\x95\x16\x25\xe9\xcb\xb9\x52\xad\x0d\xc9\x09\x4e\xfd\x66\xbf\x53\x6e\x06\xca\xa8\xc3\xc3\x47\xa3\xfe\xad\x64\x65\x4b\x0e\xc4\x4b\x5b\xe2\xfe\x60\xb2\x77\x33\x7e\xb1\xad\x7e\xfa\x6a\x38\xf8\x3a\xde\xbf\xa3\x7a\x3f\xcc\x55\xd9\x31\xeb\x32\xb8\x94\xbc\xd9\x66\x02\xa7\x93\x98\x93\x64\x5b\x68\xf8\xc7\x81\xba\x3f\x38\x21\xea\xf5\xab\xee\xe4\xbb\x87\xaa\xbf\x1b\xbf\xf8\x5d\x3d\xbe\x37\xda\xe9\xc6\xfb\x3f\xbf\x7e\xb5\xf3\x9f\x88\xb5\xad\x13\x72\x2b\x2c\x68\x10\x86\xd4\xcd\x67\xa3\xfe\x67\xaa\xf7\xfd\x64\xeb\xc1\x7c\xbb\x28\xf5\x7f\x02\xfa\xef\x84\x4b\xc4\x69\xb3\x62\x24\xb0\x6d\x9b\x89\x1b\xd3\xf6\x69\x18\x82\xcc\x43\xa6\xee\x45\xd2\x23\x58\x04\x0e\x25\x0c\xd7\x81\x41\x93\x13\xef\x6f\xb0\xb3\x00\x7d\xd8\x22\x52\x94\xc3\xf0\xcc\x41\x4b\xd5\xe5\x93\xf5\x4a\x9e\xd9\xbd\x3c\xf7\xb1\x5b\x68\x51\x9f\x54\x6b\x19\x32\x7f\xfb\x1f\x93\x96\xca\xcb\xb9\x0f\x15\xeb\x83\x6a\xcd\x58\x78\xf3\xea\x62\x75\xb9\xbc\x94\x89\x35\x5c\x5f\x98\x6b\x84\x32\x70\x75\xed\xaf\x00\x00\x00\xff\xff\xbf\xfd\x52\x3c\xa8\x09\x00\x00")
156 |
157 | func assetsHtmlSurgeConfBytes() ([]byte, error) {
158 | return bindataRead(
159 | _assetsHtmlSurgeConf,
160 | "assets/html/surge.conf",
161 | )
162 | }
163 |
164 | func assetsHtmlSurgeConf() (*asset, error) {
165 | bytes, err := assetsHtmlSurgeConfBytes()
166 | if err != nil {
167 | return nil, err
168 | }
169 |
170 | info := bindataFileInfo{name: "assets/html/surge.conf", size: 2472, mode: os.FileMode(420), modTime: time.Unix(1598765832, 0)}
171 | a := &asset{bytes: bytes, info: info}
172 | return a, nil
173 | }
174 |
175 | var _assetsHtmlSurgeHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x5d\x6f\x1b\x45\x14\x7d\x8f\x94\xff\x30\x9d\xc7\xaa\xeb\x69\x9a\x17\x54\xed\x2e\xa0\xd2\x0a\x9e\xa8\x44\x90\xe0\x71\xb2\x7b\xe3\x1d\x32\x3b\xbb\x9d\x99\x75\x63\x22\x4b\xde\x52\x2b\x1f\x90\x8f\xd2\xa8\x40\x70\x45\x13\x0a\x8a\x50\x9a\x22\x15\xa1\xa6\x49\xc8\x8f\xc9\x7e\xd8\x4f\xf9\x0b\x68\xbd\x76\xea\x80\x23\x5a\x9e\x92\x7b\xe7\xdc\x73\xe7\xdc\x7b\x66\x6d\x5e\xfa\xe0\xe3\x1b\x53\x9f\xdf\xbe\x89\x3c\xed\x73\x7b\x7c\xcc\x2c\xfe\x22\x4e\x45\xd5\xc2\x20\xb0\x3d\x3e\x56\xe4\x80\xba\xf6\xf8\x18\x42\x08\x99\x3e\x68\x8a\x1c\x8f\x4a\x05\xda\xc2\x91\x9e\x31\xde\xc1\xe7\xce\x3c\xad\x43\x03\xee\x44\xac\x66\xe1\xcf\x8c\x4f\xdf\x37\x6e\x04\x7e\x48\x35\x9b\xe6\x80\x91\x13\x08\x0d\x42\x5b\xf8\xa3\x9b\x16\xb8\x55\x38\x5f\x2a\xa8\x0f\x16\xfe\x90\x0a\xd7\x03\xee\xde\x92\x0c\x84\xcb\xeb\x43\x55\x53\x32\x1a\x59\x52\x63\x70\x37\x0c\xa4\x1e\x82\xde\x65\xae\xf6\x2c\x17\x6a\xcc\x01\xa3\x17\x5c\x41\x4c\x30\xcd\x28\x37\x94\x43\x39\x58\x13\x95\xab\x57\x90\x4f\xe7\x98\x1f\xf9\xc3\xa9\x48\x81\xec\xc5\x74\x9a\x83\x75\x15\x23\x32\xe8\x78\xc9\x30\xd0\x94\xc7\x14\xe2\x4c\x00\x62\x0a\xcd\x04\x12\xf1\xc0\xa1\x1c\x69\x50\xda\x30\x86\x81\x26\x67\x62\x16\x49\xe0\x16\x56\xba\xce\x41\x79\x00\x1a\x23\x5d\x0f\xc1\xc2\x1a\xe6\x34\x71\x94\xc2\xc8\x93\x30\x63\xe1\x4a\xa5\x88\x08\x13\x2e\xcc\x55\x8a\xbc\x8d\x5e\xb3\xbd\x0d\xd1\x3f\x69\xfa\x14\x9a\x69\x0e\x76\xda\x5a\xe9\xfc\xb1\xff\x49\x24\xab\xd0\x59\xbe\x97\xdf\xdb\x37\x49\x79\x30\x3e\x66\x92\xfe\x92\xc7\xc7\xcc\xe9\xc0\xad\x0f\x0a\x5d\x56\x43\x0e\xa7\x4a\x59\x58\x07\xe1\x34\x95\x03\xca\xde\xa9\x37\x61\x9b\x4a\xcb\x40\x54\xed\x5b\x12\x00\xdd\x96\xc1\x1c\x03\x65\x92\x7e\xd2\x24\xde\xc4\x30\x3e\x1c\x70\xb9\xa0\x1c\xc9\xb0\xdd\x59\xf8\x2d\x5d\xde\xc9\x96\x1f\xa6\x6b\x8f\x74\xb5\xbb\xfd\xa0\x1b\x3f\x3c\x69\xc6\x9d\xbd\xed\xee\xf7\xad\xb4\xfd\x7b\xfa\xb8\x79\xd2\x8c\xd3\xd6\x6e\x7a\xd8\x4c\x5e\x7d\xdb\x89\x37\xf2\xa3\x07\xc9\xcb\xe5\x7c\xf3\xbe\x52\x27\xcd\x58\x29\x79\xd2\x8c\x6b\x3e\xf4\x22\x2d\x83\x2f\xa8\x28\xa5\x25\xc7\x5b\x59\xfc\xfc\xf4\xf0\x9b\x4e\xbc\x99\xae\x2f\xa6\xab\x07\xdd\x85\x95\x74\x7d\x35\x5b\x5b\x4f\xfe\xfa\xb1\xc4\xa4\x8b\xdf\x75\xb6\x76\x4c\x12\x0e\xd4\x12\x97\xd5\x46\x28\x57\xe0\x68\x16\x88\xf3\xd2\xaf\xd9\x26\x1d\x00\xaa\x12\x40\x9c\xad\x40\x15\x03\xc6\x76\x6f\xce\x26\xa1\xc5\x14\xae\x0d\x97\x46\x7c\x28\xea\x6f\xb8\x44\x77\x5b\x2b\xf9\xd1\x5e\xf6\x68\x21\x39\xf8\xf3\xf4\x70\x73\x7e\x1e\x55\x24\xdc\x89\x40\x69\xd4\x68\x5c\x27\xa4\x48\xb8\x81\x4f\x99\x28\xe2\x22\x2a\x5c\x8f\x1a\x8d\xb2\x27\x71\x02\x31\xc3\xaa\xe8\x82\x8b\xf5\x30\x93\xd7\x09\x21\x4c\x28\x4d\x39\x37\x4a\xfc\xbb\x91\xe4\x56\xf1\x6c\xd5\x1b\xb7\xc0\x76\xf2\xb2\xd9\xdd\xd8\x4b\x9f\x1f\xa6\xad\x5f\x4a\x91\x9c\x5d\x24\x0b\x85\x32\x98\xab\x23\xce\x94\xfe\x3f\xaa\xc2\x81\xab\xce\x75\x30\xc9\xd9\x1c\xdf\x62\x6f\xf3\xf3\x06\x22\x97\x51\xb6\xd4\xcc\xda\x4b\xc9\xd1\x71\xbe\xb1\x93\xb5\x77\x93\x83\x9f\xf3\x27\x71\x69\x8d\xac\xbd\x92\x2e\x6f\xe5\x9b\xf7\xf3\x5f\xe3\xec\xd9\x76\xba\xf8\xa4\xfb\xc3\xd3\x93\x66\x9c\x1c\xef\x65\x1b\xfb\xf9\xd2\x62\xf6\xf8\xab\xd2\x5c\x97\x49\xa3\x31\x6c\x6e\x3b\xdb\xdd\xee\x1c\xaf\xa6\xad\x17\xd9\x8b\x9d\x74\xf5\xa7\xe4\xa8\xdd\x69\xb6\x06\xb6\x3e\x3d\xdc\x34\x69\x7f\x13\x83\x61\xeb\x8a\x0f\x24\x04\x98\x9d\x89\x04\xb6\xdf\xeb\xff\x57\x8e\x33\x3c\xf7\x70\xec\x33\xbe\x51\x3c\x55\xa6\xbd\x68\xba\xe2\x04\x3e\xf9\x32\x9a\x98\xed\x4d\xac\x1e\x06\x01\x37\xa4\x8f\xed\x37\x41\x8d\xec\x99\x3d\x7b\x9a\xef\x7c\x9d\xbe\x5a\x2b\x54\xb7\x77\xff\xa3\xb3\xa2\x42\x45\xec\xda\xe4\xe4\x6b\x62\xc7\x03\x67\x76\xe4\x05\x2e\x02\x17\xf7\x40\x85\x05\x6a\x20\x15\x0b\x0a\x47\xfc\xfb\x7d\x9a\xa4\xff\x89\xea\x7d\xb7\x8a\x1f\xae\xbf\x03\x00\x00\xff\xff\x63\x2c\x09\xde\xc8\x06\x00\x00")
176 |
177 | func assetsHtmlSurgeHtmlBytes() ([]byte, error) {
178 | return bindataRead(
179 | _assetsHtmlSurgeHtml,
180 | "assets/html/surge.html",
181 | )
182 | }
183 |
184 | func assetsHtmlSurgeHtml() (*asset, error) {
185 | bytes, err := assetsHtmlSurgeHtmlBytes()
186 | if err != nil {
187 | return nil, err
188 | }
189 |
190 | info := bindataFileInfo{name: "assets/html/surge.html", size: 1736, mode: os.FileMode(420), modTime: time.Unix(1618997387, 0)}
191 | a := &asset{bytes: bytes, info: info}
192 | return a, nil
193 | }
194 |
195 | var _assetsCssIndexCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x94\xdb\x8a\xdb\x30\x10\x86\xef\xfd\x14\x03\xa1\x64\x17\x6c\x63\xe7\xb8\x28\x37\x65\x0b\xa1\x8f\xd0\x5b\xd9\x1a\xc5\xa2\xb2\x64\x24\x65\xe3\x34\xe4\xdd\x8b\x2c\x65\xd7\x4e\xda\xdd\x04\x42\x98\xc3\xef\x7f\x3e\x8d\x5c\x69\x76\x4e\xbb\xb4\x29\xd3\xa6\x84\x4b\x02\xf1\xd3\x52\x73\x10\x8a\x40\xd1\xf5\xbb\xe4\x9a\x1c\x65\x0a\x52\xc0\x25\x84\x33\x89\xdc\x85\x1c\x74\x94\x31\xa1\x0e\xb7\xd0\xee\x9a\x24\x5e\x32\x4a\x71\xad\x5c\xc6\x69\x2b\xe4\x99\xc0\x4f\x94\x6f\xe8\x44\x4d\x53\x4b\x95\xcd\x2c\x1a\xc1\x77\x43\xd9\x49\x30\xd7\x10\x28\x8b\xe2\x5b\x08\x54\xb4\xfe\x7d\x30\xfa\xa8\x58\x56\x6b\xa9\x0d\x81\x59\xf9\xea\xbf\xbb\x0f\x59\x2b\xfe\x20\x81\x72\xe5\x1d\xfa\x60\x2c\x3c\x35\xc2\xa1\xf7\x9c\x34\x65\x0a\xcd\x22\x18\xb9\xcd\xb3\xee\x7a\x28\x62\x76\xec\x31\x88\x2d\x37\x77\x62\x33\xce\x57\xeb\xe5\x22\x34\x2c\x08\xa9\x90\x6b\x83\xe3\xc6\x13\x8a\x43\xe3\x08\x28\x6d\x5a\x2a\x6f\xcd\xca\xa1\x72\x04\xe6\xb3\x79\x88\x74\xda\x0a\x27\xb4\x22\x40\x2b\xab\xe5\xd1\x3b\xfc\xd7\x63\x86\xda\x48\xd4\xe9\x8e\x40\x91\x97\xd8\x86\xb8\x33\x54\x59\xae\x4d\x4b\xc2\x5f\x49\x1d\xfe\x7a\xca\x4a\x6c\x9f\x07\x7f\xf4\x32\x91\x64\xf5\x96\x6f\xb9\xcf\x50\xd2\xe8\x37\x34\x30\xcd\xef\xf7\xfb\x1f\x2f\xaf\x43\x67\x7e\x30\x88\x6a\x9a\x5e\x2d\x39\xc7\xf5\x28\x3d\x11\x99\x8c\x5e\x69\xc9\x86\xc2\xea\xee\x11\x23\x78\x47\x19\x73\x52\x58\x97\x59\x77\x96\xe8\x99\xa9\xc8\x41\x0a\x85\x59\x13\xf5\xca\x7c\xed\x67\xf6\x5b\x07\x52\xdc\x41\xff\x60\x9b\xcd\x3f\x61\xf8\x1f\xde\x5f\x30\x3c\x4a\xc8\x85\x62\xa8\x1c\x8c\xd7\x26\x2e\xf7\x22\xb8\x4a\x92\xdc\xe9\xae\xa2\x37\x16\xf1\xbc\x08\x2c\x8a\xae\x87\x4d\x71\x5b\xa1\x2f\x76\xb8\xd2\x86\xa1\xc9\x2a\xed\x9c\x6e\x09\x94\x5d\x0f\x56\x4b\x11\x48\xe6\x0c\x6d\x6d\x04\x4c\x97\xb7\x98\x0e\x8c\x88\x0f\xd7\xa1\xc8\x5f\xa2\xcb\xdc\x62\xed\x11\xdc\xbb\x2c\x37\xef\x2e\xaf\x49\xf2\xbd\x45\x26\x28\xd8\xda\x1f\x31\x50\xc5\xe0\xa9\xa5\x7d\x16\x2f\xe4\xb6\x28\xba\xfe\x39\x2a\x4c\xde\x0f\xe3\x4b\xf3\x3e\xf1\x75\xf8\x9d\xd2\x79\x24\xb4\xba\xaf\x9f\x1a\x7d\x34\x3b\x6e\xb8\xfe\x0d\x00\x00\xff\xff\xea\x70\x8a\x8c\xb0\x04\x00\x00")
196 |
197 | func assetsCssIndexCssBytes() ([]byte, error) {
198 | return bindataRead(
199 | _assetsCssIndexCss,
200 | "assets/css/index.css",
201 | )
202 | }
203 |
204 | func assetsCssIndexCss() (*asset, error) {
205 | bytes, err := assetsCssIndexCssBytes()
206 | if err != nil {
207 | return nil, err
208 | }
209 |
210 | info := bindataFileInfo{name: "assets/css/index.css", size: 1200, mode: os.FileMode(420), modTime: time.Unix(1602612417, 0)}
211 | a := &asset{bytes: bytes, info: info}
212 | return a, nil
213 | }
214 |
215 | // Asset loads and returns the asset for the given name.
216 | // It returns an error if the asset could not be found or
217 | // could not be loaded.
218 | func Asset(name string) ([]byte, error) {
219 | cannonicalName := strings.Replace(name, "\\", "/", -1)
220 | if f, ok := _bindata[cannonicalName]; ok {
221 | a, err := f()
222 | if err != nil {
223 | return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
224 | }
225 | return a.bytes, nil
226 | }
227 | return nil, fmt.Errorf("Asset %s not found", name)
228 | }
229 |
230 | // MustAsset is like Asset but panics when Asset would return an error.
231 | // It simplifies safe initialization of global variables.
232 | func MustAsset(name string) []byte {
233 | a, err := Asset(name)
234 | if err != nil {
235 | panic("asset: Asset(" + name + "): " + err.Error())
236 | }
237 |
238 | return a
239 | }
240 |
241 | // AssetInfo loads and returns the asset info for the given name.
242 | // It returns an error if the asset could not be found or
243 | // could not be loaded.
244 | func AssetInfo(name string) (os.FileInfo, error) {
245 | cannonicalName := strings.Replace(name, "\\", "/", -1)
246 | if f, ok := _bindata[cannonicalName]; ok {
247 | a, err := f()
248 | if err != nil {
249 | return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
250 | }
251 | return a.info, nil
252 | }
253 | return nil, fmt.Errorf("AssetInfo %s not found", name)
254 | }
255 |
256 | // AssetNames returns the names of the assets.
257 | func AssetNames() []string {
258 | names := make([]string, 0, len(_bindata))
259 | for name := range _bindata {
260 | names = append(names, name)
261 | }
262 | return names
263 | }
264 |
265 | // _bindata is a table, holding each asset generator, mapped to its name.
266 | var _bindata = map[string]func() (*asset, error){
267 | "assets/html/clash-config-local.yaml": assetsHtmlClashConfigLocalYaml,
268 | "assets/html/clash-config.yaml": assetsHtmlClashConfigYaml,
269 | "assets/html/clash.html": assetsHtmlClashHtml,
270 | "assets/html/index.html": assetsHtmlIndexHtml,
271 | "assets/html/surge.conf": assetsHtmlSurgeConf,
272 | "assets/html/surge.html": assetsHtmlSurgeHtml,
273 | "assets/css/index.css": assetsCssIndexCss,
274 | }
275 |
276 | // AssetDir returns the file names below a certain
277 | // directory embedded in the file by go-bindata.
278 | // For example if you run go-bindata on data/... and data contains the
279 | // following hierarchy:
280 | // data/
281 | // foo.txt
282 | // img/
283 | // a.png
284 | // b.png
285 | // then AssetDir("data") would return []string{"foo.txt", "img"}
286 | // AssetDir("data/img") would return []string{"a.png", "b.png"}
287 | // AssetDir("foo.txt") and AssetDir("notexist") would return an error
288 | // AssetDir("") will return []string{"data"}.
289 | func AssetDir(name string) ([]string, error) {
290 | node := _bintree
291 | if len(name) != 0 {
292 | cannonicalName := strings.Replace(name, "\\", "/", -1)
293 | pathList := strings.Split(cannonicalName, "/")
294 | for _, p := range pathList {
295 | node = node.Children[p]
296 | if node == nil {
297 | return nil, fmt.Errorf("Asset %s not found", name)
298 | }
299 | }
300 | }
301 | if node.Func != nil {
302 | return nil, fmt.Errorf("Asset %s not found", name)
303 | }
304 | rv := make([]string, 0, len(node.Children))
305 | for childName := range node.Children {
306 | rv = append(rv, childName)
307 | }
308 | return rv, nil
309 | }
310 |
311 | type bintree struct {
312 | Func func() (*asset, error)
313 | Children map[string]*bintree
314 | }
315 | var _bintree = &bintree{nil, map[string]*bintree{
316 | "assets": &bintree{nil, map[string]*bintree{
317 | "css": &bintree{nil, map[string]*bintree{
318 | "index.css": &bintree{assetsCssIndexCss, map[string]*bintree{}},
319 | }},
320 | "html": &bintree{nil, map[string]*bintree{
321 | "clash-config-local.yaml": &bintree{assetsHtmlClashConfigLocalYaml, map[string]*bintree{}},
322 | "clash-config.yaml": &bintree{assetsHtmlClashConfigYaml, map[string]*bintree{}},
323 | "clash.html": &bintree{assetsHtmlClashHtml, map[string]*bintree{}},
324 | "index.html": &bintree{assetsHtmlIndexHtml, map[string]*bintree{}},
325 | "surge.conf": &bintree{assetsHtmlSurgeConf, map[string]*bintree{}},
326 | "surge.html": &bintree{assetsHtmlSurgeHtml, map[string]*bintree{}},
327 | }},
328 | }},
329 | }}
330 |
331 | // RestoreAsset restores an asset under the given directory
332 | func RestoreAsset(dir, name string) error {
333 | data, err := Asset(name)
334 | if err != nil {
335 | return err
336 | }
337 | info, err := AssetInfo(name)
338 | if err != nil {
339 | return err
340 | }
341 | err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
342 | if err != nil {
343 | return err
344 | }
345 | err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
346 | if err != nil {
347 | return err
348 | }
349 | err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
350 | if err != nil {
351 | return err
352 | }
353 | return nil
354 | }
355 |
356 | // RestoreAssets restores an asset under the given directory recursively
357 | func RestoreAssets(dir, name string) error {
358 | children, err := AssetDir(name)
359 | // File
360 | if err != nil {
361 | return RestoreAsset(dir, name)
362 | }
363 | // Dir
364 | for _, child := range children {
365 | err = RestoreAssets(dir, filepath.Join(name, child))
366 | if err != nil {
367 | return err
368 | }
369 | }
370 | return nil
371 | }
372 |
373 | func _filePath(dir, name string) string {
374 | cannonicalName := strings.Replace(name, "\\", "/", -1)
375 | return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
376 | }
377 |
378 |
--------------------------------------------------------------------------------
/api/router.go:
--------------------------------------------------------------------------------
1 | package api
2 |
3 | import (
4 | "html/template"
5 | "log"
6 | "net/http"
7 | "os"
8 | "strings"
9 | "time"
10 |
11 | "github.com/ssrlive/proxypool/pkg/provider"
12 | "github.com/ssrlive/proxypoolCheck/config"
13 | "github.com/ssrlive/proxypoolCheck/internal/app"
14 | appcache "github.com/ssrlive/proxypoolCheck/internal/cache"
15 | "github.com/gin-contrib/cache"
16 | "github.com/gin-contrib/cache/persistence"
17 | "github.com/gin-gonic/gin"
18 | )
19 |
20 | const version = "v0.7.3"
21 |
22 | var router *gin.Engine
23 |
24 | func setupRouter() {
25 | gin.SetMode(gin.ReleaseMode)
26 | router = gin.New() // 没有任何中间件的路由
27 | store := persistence.NewInMemoryStore(time.Minute)
28 | router.Use(gin.Recovery(), cache.SiteCache(store, time.Minute))
29 |
30 | _ = RestoreAssets("", "assets/html")
31 | _ = RestoreAssets("", "assets/css")
32 |
33 | temp, err := loadHTMLTemplate()
34 | if err != nil {
35 | panic(err)
36 | }
37 | router.SetHTMLTemplate(temp)
38 | router.StaticFile("/css/index.css", "assets/css/index.css")
39 | router.GET("/", func(c *gin.Context) {
40 | c.HTML(http.StatusOK, "assets/html/index.html", gin.H{
41 | "domain": config.Config.Domain,
42 | "request": config.Config.Request,
43 | "port": config.Config.Port,
44 | "all_proxies_count": appcache.AllProxiesCount,
45 | "ss_proxies_count": appcache.SSProxiesCount,
46 | "ssr_proxies_count": appcache.SSRProxiesCount,
47 | "vmess_proxies_count": appcache.VmessProxiesCount,
48 | "trojan_proxies_count": appcache.TrojanProxiesCount,
49 | "useful_proxies_count": appcache.UsableProxiesCount,
50 | "last_crawl_time": appcache.LastCrawlTime,
51 | "version": version,
52 | })
53 | })
54 | router.GET("/clash", func(c *gin.Context) {
55 | c.HTML(http.StatusOK, "assets/html/clash.html", gin.H{
56 | "domain": config.Config.Domain,
57 | "port": config.Config.Port,
58 | "request": config.Config.Request,
59 | })
60 | })
61 |
62 | router.GET("/surge", func(c *gin.Context) {
63 | c.HTML(http.StatusOK, "assets/html/surge.html", gin.H{
64 | "domain": config.Config.Domain,
65 | "request": config.Config.Request,
66 | "port": config.Config.Port,
67 | })
68 | })
69 |
70 | router.GET("/clash/config", func(c *gin.Context) {
71 | c.HTML(http.StatusOK, "assets/html/clash-config.yaml", gin.H{
72 | "domain": config.Config.Domain,
73 | "request": config.Config.Request,
74 | "port": config.Config.Port,
75 | })
76 | })
77 | router.GET("/clash/localconfig", func(c *gin.Context) {
78 | c.HTML(http.StatusOK, "assets/html/clash-config-local.yaml", gin.H{
79 | "port": config.Config.Port,
80 | })
81 | })
82 | router.GET("/clash/proxies", func(c *gin.Context) {
83 | proxyTypes := c.DefaultQuery("type", "")
84 | proxyCountry := c.DefaultQuery("c", "")
85 | proxyNotCountry := c.DefaultQuery("nc", "")
86 | proxySpeed := c.DefaultQuery("speed", "")
87 | proxyFilter := c.DefaultQuery("filter", "")
88 | text := ""
89 | if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" && proxySpeed == "" && proxyFilter == "" {
90 | text = appcache.GetString("clashproxies") // A string. To show speed in this if condition, this must be updated after speedtest
91 | if text == "" {
92 | proxies := appcache.GetProxies("proxies")
93 | clash := provider.Clash{
94 | Base: provider.Base{
95 | Proxies: &proxies,
96 | },
97 | }
98 | text = clash.Provide() // 根据Query筛选节点
99 | appcache.SetString("clashproxies", text)
100 | }
101 | } else if proxyTypes == "all" {
102 | proxies := appcache.GetProxies("allproxies")
103 | clash := provider.Clash{
104 | provider.Base{
105 | Proxies: &proxies,
106 | Types: proxyTypes,
107 | Country: proxyCountry,
108 | NotCountry: proxyNotCountry,
109 | Speed: proxySpeed,
110 | Filter: proxyFilter,
111 | },
112 | }
113 | text = clash.Provide() // 根据Query筛选节点
114 | } else {
115 | proxies := appcache.GetProxies("proxies")
116 | clash := provider.Clash{
117 | provider.Base{
118 | Proxies: &proxies,
119 | Types: proxyTypes,
120 | Country: proxyCountry,
121 | NotCountry: proxyNotCountry,
122 | Speed: proxySpeed,
123 | Filter: proxyFilter,
124 | },
125 | }
126 | text = clash.Provide() // 根据Query筛选节点
127 | }
128 | c.String(200, text)
129 | })
130 | router.GET("/surge/proxies", func(c *gin.Context) {
131 | proxyTypes := c.DefaultQuery("type", "")
132 | proxyCountry := c.DefaultQuery("c", "")
133 | proxyNotCountry := c.DefaultQuery("nc", "")
134 | proxySpeed := c.DefaultQuery("speed", "")
135 | proxyFilter := c.DefaultQuery("filter", "")
136 | text := ""
137 | if proxyTypes == "" && proxyCountry == "" && proxyNotCountry == "" && proxySpeed == "" {
138 | text = appcache.GetString("surgeproxies") // A string. To show speed in this if condition, this must be updated after speedtest
139 | if text == "" {
140 | proxies := appcache.GetProxies("proxies")
141 | surge := provider.Surge{
142 | Base: provider.Base{
143 | Proxies: &proxies,
144 | },
145 | }
146 | text = surge.Provide()
147 | appcache.SetString("surgeproxies", text)
148 | }
149 | } else if proxyTypes == "all" {
150 | proxies := appcache.GetProxies("allproxies")
151 | surge := provider.Surge{
152 | Base: provider.Base{
153 | Proxies: &proxies,
154 | Types: proxyTypes,
155 | Country: proxyCountry,
156 | NotCountry: proxyNotCountry,
157 | Speed: proxySpeed,
158 | Filter: proxyFilter,
159 | },
160 | }
161 | text = surge.Provide()
162 | } else {
163 | proxies := appcache.GetProxies("proxies")
164 | surge := provider.Surge{
165 | Base: provider.Base{
166 | Proxies: &proxies,
167 | Types: proxyTypes,
168 | Country: proxyCountry,
169 | NotCountry: proxyNotCountry,
170 | Filter: proxyFilter,
171 | },
172 | }
173 | text = surge.Provide()
174 | }
175 | c.String(200, text)
176 | })
177 | router.GET("/forceupdate", func(c *gin.Context) {
178 | err := app.InitApp()
179 | if err != nil {
180 | c.String(http.StatusOK, err.Error())
181 | }
182 | c.String(http.StatusOK, "Updated")
183 | })
184 | }
185 |
186 | func Run() {
187 | setupRouter()
188 | servePort := config.Config.Port
189 | envp := os.Getenv("PORT") // envp for heroku. DO NOT SET ENV PORT IN PERSONAL SERVER UNLESS YOU KNOW WHAT YOU ARE DOING
190 | if envp != "" {
191 | servePort = envp
192 | }
193 | // Run on this server
194 | err := router.Run(":" + servePort)
195 | if err != nil {
196 | log.Fatalf("[router.go] Web server starting failed. Make sure your port %s has not been used. \n%s", servePort, err.Error())
197 | }
198 | }
199 |
200 | // 返回页面templates
201 | func loadHTMLTemplate() (t *template.Template, err error) {
202 | t = template.New("")
203 | for _, fileName := range AssetNames() { //fileName带有路径前缀
204 | if strings.Contains(fileName, "css") {
205 | continue
206 | }
207 | data := MustAsset(fileName) //读取页面数据
208 | t, err = t.New(fileName).Parse(string(data)) //生成带路径名称的模板
209 | if err != nil {
210 | return nil, err
211 | }
212 | }
213 | return t, nil
214 | }
215 |
--------------------------------------------------------------------------------
/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "errors"
5 | "github.com/ssrlive/proxypool/pkg/tool"
6 | "github.com/ghodss/yaml"
7 | "io/ioutil"
8 | "os"
9 | "strings"
10 | )
11 |
12 | var configFilePath = "config.yaml"
13 |
14 | // ConfigOptions is a struct that represents config files
15 | type ConfigOptions struct {
16 | ServerUrl []string `json:"server_url" yaml:"server_url"`
17 | Domain string `json:"domain" yaml:"domain"`
18 | Port string `json:"port" yaml:"port"`
19 | Request string `json:"request" yaml:"request"`
20 | CronInterval uint64 `json:"cron_interval" yaml:"cron_interval"`
21 | ShowRemoteSpeed bool `json:"show_remote_speed" yaml:"show_remote_speed"`
22 | HealthCheckTimeout int `json:"healthcheck_timeout" yaml:"healthcheck_timeout"`
23 | HealthCheckConnection int `json:"healthcheck_connection" yaml:"healthcheck_connection"`
24 | SpeedTest bool `json:"speedtest" yaml:"speedtest"`
25 | SpeedConnection int `json:"speed_connection" yaml:"speed_connection"`
26 | SpeedTimeout int `json:"speed_timeout" yaml:"speed_timeout"`
27 | }
28 |
29 | var Config ConfigOptions
30 |
31 | // Parse Config file
32 | func Parse(path string) error {
33 | if path == "" {
34 | path = configFilePath
35 | } else {
36 | configFilePath = path
37 | }
38 | fileData, err := ReadFile(path)
39 | if err != nil {
40 | return err
41 | }
42 | Config = ConfigOptions{}
43 | err = yaml.Unmarshal(fileData, &Config)
44 | if err != nil {
45 | return err
46 | }
47 | // set default
48 | if Config.ServerUrl == nil{
49 | return errors.New("config error: no server url")
50 | }
51 | if Config.Domain == ""{
52 | Config.Domain = "127.0.0.1"
53 | }
54 | if Config.Port == ""{
55 | Config.Port = "80"
56 | }
57 | if Config.CronInterval == 0{
58 | Config.CronInterval = 15
59 | }
60 | if Config.Request == ""{
61 | Config.Request = "http"
62 | }
63 | if Config.HealthCheckTimeout == 0{
64 | Config.HealthCheckTimeout = 5
65 | }
66 | if Config.HealthCheckConnection == 0{
67 | Config.HealthCheckConnection = 100
68 | }
69 | if Config.SpeedConnection == 0{
70 | Config.SpeedConnection = 15
71 | }
72 | if Config.SpeedTimeout == 0 {
73 | Config.SpeedTimeout = 10
74 | }
75 | return nil
76 | }
77 |
78 |
79 | // 从本地文件或者http链接读取配置文件内容
80 | func ReadFile(path string) ([]byte, error) {
81 | if strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") {
82 | resp, err := tool.GetHttpClient().Get(path)
83 | if err != nil {
84 | return nil, errors.New("config file http get fail")
85 | }
86 | defer resp.Body.Close()
87 | return ioutil.ReadAll(resp.Body)
88 | } else {
89 | if _, err := os.Stat(path); os.IsNotExist(err) {
90 | return nil, err
91 | }
92 | return ioutil.ReadFile(path)
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/config/config.yaml:
--------------------------------------------------------------------------------
1 | # proxypool remote server url. Blank for http://127.0.0.1:8080
2 | server_url:
3 | - https://example.proxypoolserver.com
4 | # - https://example.proxypoolserver.com/clash/proxies?type=vmess
5 |
6 | # For your local server
7 | request: http # http / https
8 | domain: # default: 127.0.0.1
9 | port: # default: 80
10 |
11 | cron_interval: 15 # default: 15 minutes
12 | show_remote_speed: true # default false
13 |
14 | healthcheck_timeout: # default 5
15 | healthcheck_connection: # default 100
16 |
17 | speedtest: # default false
18 | speed_connection: # default 5
19 | speed_timeout: # default 10
20 |
--------------------------------------------------------------------------------
/doc/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ssrlive/proxypoolCheck/cccb1ddc676c00753f893c016c342672f91eac2e/doc/1.png
--------------------------------------------------------------------------------
/doc/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ssrlive/proxypoolCheck/cccb1ddc676c00753f893c016c342672f91eac2e/doc/2.png
--------------------------------------------------------------------------------
/doc/WhatsNew.md:
--------------------------------------------------------------------------------
1 | 2021-06-19(v0.3.1)
2 | - 忽略source的TLS证书校验 #24
3 | - http请求添加timeout #24
4 | - fix: 一个url请求失败后后续全都失败 #24
5 |
6 | 2021-06-03
7 | - 添加健康检测并发数设置(v0.3.0)
8 | - 更新依赖,修复 send on closed channel
9 |
10 | 2021-04-20
11 | - 添加自定义timeout
12 | - 更严格的有效性检查标准
13 |
14 |
15 | 2020-11-14
16 | - 可以分离web界面显示的端口与实际serve端口
17 | - 增加测速和筛选
18 | - 改变代码结构
19 | - 重写测速,增加自定义timeout
--------------------------------------------------------------------------------
/doc/gobindata.sh:
--------------------------------------------------------------------------------
1 | go-bindata -o api/html.go -pkg api assets/html/ assets/css
2 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/ssrlive/proxypoolCheck
2 |
3 | go 1.16
4 |
5 | require (
6 | github.com/PuerkitoBio/goquery v1.6.0 // indirect
7 | github.com/antchfx/xmlquery v1.3.3 // indirect
8 | github.com/antchfx/xpath v1.1.11 // indirect
9 | github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect
10 | github.com/ghodss/yaml v1.0.0
11 | github.com/gin-contrib/cache v1.1.0
12 | github.com/gin-gonic/gin v1.7.7
13 | github.com/go-playground/validator/v10 v10.4.1 // indirect
14 | github.com/jasonlvhit/gocron v0.0.1
15 | github.com/mattn/go-colorable v0.1.8 // indirect
16 | github.com/patrickmn/go-cache v2.1.0+incompatible
17 | github.com/ssrlive/proxypool v0.7.4
18 | github.com/ugorji/go v1.2.1 // indirect
19 | google.golang.org/appengine v1.6.7 // indirect
20 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
21 | )
22 |
--------------------------------------------------------------------------------
/internal/app/get.go:
--------------------------------------------------------------------------------
1 | package app
2 |
3 | import (
4 | "crypto/tls"
5 | "encoding/json"
6 | "errors"
7 | "github.com/ssrlive/proxypool/pkg/proxy"
8 | "github.com/ssrlive/proxypoolCheck/config"
9 | "io/ioutil"
10 | "log"
11 | "net/http"
12 | "strings"
13 | "time"
14 | )
15 |
16 | func getAllProxies() (proxy.ProxyList, error) {
17 | var proxylist proxy.ProxyList
18 | var errs []error // collect errors
19 |
20 | for _, value := range config.Config.ServerUrl {
21 | url := formatURL(value)
22 | pjson, err := getProxies(url)
23 | if err != nil {
24 | log.Printf("Error when fetch %s: %s\n", url, err.Error())
25 | errs = append(errs, err)
26 | continue
27 | }
28 | log.Printf("Get %s line count: %d\n", url, len(pjson))
29 |
30 | for i, p := range pjson {
31 | if i == 0 || len(p) < 2 {
32 | continue
33 | }
34 | p = p[2:] // remove "- "
35 |
36 | if pp, ok := convert2Proxy(p); ok {
37 | if i == 1 && pp.BaseInfo().Name == "NULL" {
38 | log.Println("no proxy on " + url)
39 | errs = append(errs, errors.New("no proxy on "+url))
40 | continue
41 | }
42 | if config.Config.ShowRemoteSpeed == true {
43 | name := strings.Replace(pp.BaseInfo().Name, " |", "_", 1)
44 | pp.SetName(name)
45 | }
46 | proxylist = append(proxylist, pp)
47 | }
48 | }
49 | }
50 |
51 | if proxylist == nil {
52 | if errs != nil {
53 | errInfo := "\n"
54 | for _, e := range errs {
55 | errInfo = errInfo + e.Error() + ";\n"
56 | }
57 | return nil, errors.New(errInfo)
58 | }
59 | return nil, errors.New("no proxy")
60 | }
61 | return proxylist, nil
62 | }
63 |
64 | func formatURL(value string) string {
65 | url := "http://127.0.0.1:8080"
66 | if value != "http://127.0.0.1:8080" {
67 | url = value
68 | if url[len(url)-1] == '/' {
69 | url = url[:len(url)-1]
70 | }
71 | }
72 | urls := strings.Split(url, "/")
73 | if urls[len(urls)-2] != "clash" {
74 | url = url + "/clash/proxies"
75 | }
76 | return url
77 | }
78 |
79 | // get proxy strings from url
80 | func getProxies(url string) ([]string, error) {
81 | //resp, err := http.Get(url)
82 | tr := &http.Transport{
83 | TLSClientConfig: &tls.Config{
84 | InsecureSkipVerify: true,
85 | },
86 | }
87 |
88 | client := &http.Client{
89 | Timeout: 5 * time.Second,
90 | Transport: tr,
91 | }
92 | resp, err := client.Get(url)
93 | if err != nil {
94 | return nil, err
95 | }
96 | defer resp.Body.Close()
97 | body, err := ioutil.ReadAll(resp.Body)
98 | proxyJson := strings.Split(string(body), "\n")
99 | if len(proxyJson) < 2 {
100 | return nil, errors.New("no proxy on " + url)
101 | }
102 | return proxyJson, nil
103 | }
104 |
105 | // Convert json string(clash format) to proxy
106 | func convert2Proxy(pjson string) (proxy.Proxy, bool) {
107 | var f interface{}
108 | err := json.Unmarshal([]byte(pjson), &f)
109 | if err != nil {
110 | return nil, false
111 | }
112 | jsnMap := f.(interface{}).(map[string]interface{})
113 |
114 | switch jsnMap["type"].(string) {
115 | case "ss":
116 | var p proxy.Shadowsocks
117 | err := json.Unmarshal([]byte(pjson), &p)
118 | if err != nil {
119 | return nil, false
120 | }
121 | return &p, true
122 | case "ssr":
123 | var p proxy.ShadowsocksR
124 | err := json.Unmarshal([]byte(pjson), &p)
125 | if err != nil {
126 | return nil, false
127 | }
128 | return &p, true
129 | case "vmess":
130 | var p proxy.Vmess
131 | err := json.Unmarshal([]byte(pjson), &p)
132 | if err != nil {
133 | return nil, false
134 | }
135 | return &p, true
136 | case "trojan":
137 | var p proxy.Trojan
138 | err := json.Unmarshal([]byte(pjson), &p)
139 | if err != nil {
140 | return nil, false
141 | }
142 | return &p, true
143 | }
144 | return nil, false
145 | }
146 |
--------------------------------------------------------------------------------
/internal/app/task.go:
--------------------------------------------------------------------------------
1 | package app
2 |
3 | import (
4 | "fmt"
5 | "github.com/ssrlive/proxypool/pkg/healthcheck"
6 | "github.com/ssrlive/proxypool/pkg/provider"
7 | "github.com/ssrlive/proxypoolCheck/config"
8 | "github.com/ssrlive/proxypoolCheck/internal/cache"
9 | "log"
10 | "time"
11 | )
12 |
13 | var location, _ = time.LoadLocation("PRC")
14 |
15 | // Get all usable proxies from proxypool server and set app vars
16 | func InitApp() error{
17 | // Get proxies from server
18 | proxies, err := getAllProxies()
19 | if err != nil {
20 | log.Println("Get proxies error: ", err)
21 | cache.LastCrawlTime = fmt.Sprint(time.Now().In(location).Format("2006-01-02 15:04:05"), err)
22 | return err
23 | }
24 | proxies = proxies.Derive().Deduplication()
25 | cache.AllProxiesCount = len(proxies)
26 |
27 | // set cache variables
28 | cache.SSProxiesCount = proxies.TypeLen("ss")
29 | cache.SSRProxiesCount = proxies.TypeLen("ssr")
30 | cache.VmessProxiesCount = proxies.TypeLen("vmess")
31 | cache.TrojanProxiesCount = proxies.TypeLen("trojan")
32 | cache.LastCrawlTime = fmt.Sprint(time.Now().In(location).Format("2006-01-02 15:04:05"))
33 | log.Println("Number of proxies:", cache.AllProxiesCount)
34 |
35 | log.Println("Now proceeding health check...")
36 |
37 | // healthcheck settings
38 | healthcheck.DelayConn = config.Config.HealthCheckConnection
39 | healthcheck.DelayTimeout = time.Duration(config.Config.HealthCheckTimeout) * time.Second
40 | healthcheck.SpeedConn = config.Config.SpeedConnection
41 | healthcheck.SpeedTimeout = time.Duration(config.Config.SpeedTimeout) * time.Second
42 |
43 | proxies = healthcheck.CleanBadProxiesWithGrpool(proxies)
44 | log.Println("Usable proxy count: ", len(proxies))
45 |
46 | // Save to cache
47 | cache.SetProxies("proxies", proxies)
48 | cache.UsableProxiesCount = len(proxies)
49 |
50 | if config.Config.SpeedTest == true {
51 | healthcheck.SpeedTestAll(proxies)
52 | }
53 |
54 | cache.SetString("clashproxies", provider.Clash{
55 | provider.Base{
56 | Proxies: &proxies,
57 | },
58 | }.Provide())
59 | cache.SetString("surgeproxies", provider.Surge{
60 | provider.Base{
61 | Proxies: &proxies,
62 | },
63 | }.Provide())
64 |
65 | fmt.Println("Open", config.Config.Domain+":"+config.Config.Port, "to check.")
66 | return nil
67 | }
68 |
69 |
--------------------------------------------------------------------------------
/internal/cache/cache.go:
--------------------------------------------------------------------------------
1 | package cache
2 |
3 | import (
4 | "github.com/ssrlive/proxypool/pkg/proxy"
5 | "github.com/patrickmn/go-cache"
6 | "time"
7 | )
8 |
9 | var Cache = cache.New(cache.NoExpiration, 10*time.Minute)
10 |
11 | // Get proxies from Cache
12 | func GetProxies(key string) proxy.ProxyList {
13 | result, found := Cache.Get(key)
14 | if found {
15 | return result.(proxy.ProxyList) //Get返回的是interface
16 | }
17 | return nil
18 | }
19 |
20 | // Set proxies to cache
21 | func SetProxies(key string, proxies proxy.ProxyList) {
22 | Cache.Set(key, proxies, cache.NoExpiration)
23 | }
24 |
25 | // Set string to cache
26 | func SetString(key, value string) {
27 | Cache.Set(key, value, cache.NoExpiration)
28 | }
29 |
30 | // Get string from cache
31 | func GetString(key string) string {
32 | result, found := Cache.Get(key)
33 | if found {
34 | return result.(string)
35 | }
36 | return ""
37 | }
38 |
--------------------------------------------------------------------------------
/internal/cache/vars.go:
--------------------------------------------------------------------------------
1 | package cache
2 |
3 | var (
4 | AllProxiesCount = 0
5 | SSRProxiesCount = 0
6 | SSProxiesCount = 0
7 | VmessProxiesCount = 0
8 | TrojanProxiesCount = 0
9 |
10 | UsableProxiesCount = 0
11 |
12 | LastCrawlTime = "Loading……"
13 | )
--------------------------------------------------------------------------------
/internal/cron/cron.go:
--------------------------------------------------------------------------------
1 | package cron
2 |
3 | import (
4 | "github.com/ssrlive/proxypoolCheck/config"
5 | "github.com/ssrlive/proxypoolCheck/internal/app"
6 | "github.com/jasonlvhit/gocron"
7 | "log"
8 | "runtime"
9 | "time"
10 | )
11 |
12 | func Cron() {
13 | _ = gocron.Every(config.Config.CronInterval).Minutes().Do(appTask)
14 | <-gocron.Start()
15 | }
16 |
17 | func appTask() {
18 | err := config.Parse("")
19 | if err != nil{
20 | log.Printf("config parse error: %s\n", err.Error())
21 | }
22 | err = app.InitApp()
23 | if err != nil { // for wake up heroku
24 | log.Printf("init app err: %s\n Try in 2 minute\n", err.Error())
25 | time.Sleep(time.Minute*2)
26 | err = app.InitApp()
27 | if err != nil {
28 | log.Printf("crawl error: %s\n", err.Error())
29 | }
30 | }
31 | runtime.GC()
32 | }
33 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "flag"
5 | "github.com/ssrlive/proxypoolCheck/api"
6 | "github.com/ssrlive/proxypoolCheck/config"
7 | "github.com/ssrlive/proxypoolCheck/internal/app"
8 | "github.com/ssrlive/proxypoolCheck/internal/cron"
9 | "log"
10 | "net/http"
11 | )
12 |
13 | var configFilePath = ""
14 |
15 | func main() {
16 | go func() {
17 | http.ListenAndServe("0.0.0.0:6061", nil)
18 | }()
19 |
20 | //Slog.SetLevel(Slog.DEBUG) // Print original pack log
21 |
22 | // fetch configuration
23 | flag.StringVar(&configFilePath, "c", "", "path to config file: config.yaml")
24 | flag.Parse()
25 | if configFilePath == "" {
26 | configFilePath = "config.yaml"
27 | }
28 | err := config.Parse(configFilePath)
29 | if err != nil {
30 | log.Fatal(err, "\n\"Config file err. Exit\"")
31 | return
32 | }
33 |
34 | go app.InitApp()
35 | log.Printf("The program will run every %v minutes\n", config.Config.CronInterval)
36 | go cron.Cron()
37 | // Run
38 | api.Run()
39 |
40 |
41 | }
42 |
--------------------------------------------------------------------------------