+674
COPYING
+674
COPYING
···
1
+
GNU GENERAL PUBLIC LICENSE
2
+
Version 3, 29 June 2007
3
+
4
+
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
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
+
<one line to give the program's name and a brief idea of what it does.>
635
+
Copyright (C) <year> <name of author>
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 <https://www.gnu.org/licenses/>.
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
+
<program> Copyright (C) <year> <name of author>
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
+
<https://www.gnu.org/licenses/>.
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
+
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+2206
Cargo.lock
+2206
Cargo.lock
···
3
3
version = 4
4
4
5
5
[[package]]
6
+
name = "addr2line"
7
+
version = "0.24.2"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10
+
dependencies = [
11
+
"gimli",
12
+
]
13
+
14
+
[[package]]
15
+
name = "adler2"
16
+
version = "2.0.1"
17
+
source = "registry+https://github.com/rust-lang/crates.io-index"
18
+
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
19
+
20
+
[[package]]
21
+
name = "async-trait"
22
+
version = "0.1.89"
23
+
source = "registry+https://github.com/rust-lang/crates.io-index"
24
+
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
25
+
dependencies = [
26
+
"proc-macro2",
27
+
"quote",
28
+
"syn 2.0.106",
29
+
]
30
+
31
+
[[package]]
32
+
name = "atomic-waker"
33
+
version = "1.1.2"
34
+
source = "registry+https://github.com/rust-lang/crates.io-index"
35
+
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
36
+
37
+
[[package]]
38
+
name = "autocfg"
39
+
version = "1.5.0"
40
+
source = "registry+https://github.com/rust-lang/crates.io-index"
41
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
42
+
43
+
[[package]]
44
+
name = "backtrace"
45
+
version = "0.3.75"
46
+
source = "registry+https://github.com/rust-lang/crates.io-index"
47
+
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
48
+
dependencies = [
49
+
"addr2line",
50
+
"cfg-if 1.0.3",
51
+
"libc",
52
+
"miniz_oxide",
53
+
"object",
54
+
"rustc-demangle",
55
+
"windows-targets",
56
+
]
57
+
58
+
[[package]]
59
+
name = "base64"
60
+
version = "0.22.1"
61
+
source = "registry+https://github.com/rust-lang/crates.io-index"
62
+
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
63
+
64
+
[[package]]
65
+
name = "bitflags"
66
+
version = "1.3.2"
67
+
source = "registry+https://github.com/rust-lang/crates.io-index"
68
+
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
69
+
70
+
[[package]]
71
+
name = "bitflags"
72
+
version = "2.9.4"
73
+
source = "registry+https://github.com/rust-lang/crates.io-index"
74
+
checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
75
+
76
+
[[package]]
77
+
name = "block-buffer"
78
+
version = "0.7.3"
79
+
source = "registry+https://github.com/rust-lang/crates.io-index"
80
+
checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
81
+
dependencies = [
82
+
"block-padding",
83
+
"byte-tools",
84
+
"byteorder",
85
+
"generic-array",
86
+
]
87
+
88
+
[[package]]
89
+
name = "block-padding"
90
+
version = "0.1.5"
91
+
source = "registry+https://github.com/rust-lang/crates.io-index"
92
+
checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
93
+
dependencies = [
94
+
"byte-tools",
95
+
]
96
+
97
+
[[package]]
98
+
name = "bumpalo"
99
+
version = "3.19.0"
100
+
source = "registry+https://github.com/rust-lang/crates.io-index"
101
+
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
102
+
103
+
[[package]]
104
+
name = "byte-tools"
105
+
version = "0.3.1"
106
+
source = "registry+https://github.com/rust-lang/crates.io-index"
107
+
checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
108
+
109
+
[[package]]
110
+
name = "byteorder"
111
+
version = "1.5.0"
112
+
source = "registry+https://github.com/rust-lang/crates.io-index"
113
+
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
114
+
115
+
[[package]]
116
+
name = "bytes"
117
+
version = "0.4.12"
118
+
source = "registry+https://github.com/rust-lang/crates.io-index"
119
+
checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
120
+
dependencies = [
121
+
"byteorder",
122
+
"iovec",
123
+
]
124
+
125
+
[[package]]
126
+
name = "bytes"
127
+
version = "1.10.1"
128
+
source = "registry+https://github.com/rust-lang/crates.io-index"
129
+
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
130
+
131
+
[[package]]
132
+
name = "cc"
133
+
version = "1.2.36"
134
+
source = "registry+https://github.com/rust-lang/crates.io-index"
135
+
checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
136
+
dependencies = [
137
+
"find-msvc-tools",
138
+
"shlex",
139
+
]
140
+
141
+
[[package]]
142
+
name = "cfg-if"
143
+
version = "0.1.10"
144
+
source = "registry+https://github.com/rust-lang/crates.io-index"
145
+
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
146
+
147
+
[[package]]
148
+
name = "cfg-if"
149
+
version = "1.0.3"
150
+
source = "registry+https://github.com/rust-lang/crates.io-index"
151
+
checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9"
152
+
153
+
[[package]]
154
+
name = "core-foundation"
155
+
version = "0.9.4"
156
+
source = "registry+https://github.com/rust-lang/crates.io-index"
157
+
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
158
+
dependencies = [
159
+
"core-foundation-sys",
160
+
"libc",
161
+
]
162
+
163
+
[[package]]
164
+
name = "core-foundation-sys"
165
+
version = "0.8.7"
166
+
source = "registry+https://github.com/rust-lang/crates.io-index"
167
+
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
168
+
169
+
[[package]]
170
+
name = "data-encoding"
171
+
version = "2.9.0"
172
+
source = "registry+https://github.com/rust-lang/crates.io-index"
173
+
checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
174
+
175
+
[[package]]
176
+
name = "digest"
177
+
version = "0.8.1"
178
+
source = "registry+https://github.com/rust-lang/crates.io-index"
179
+
checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
180
+
dependencies = [
181
+
"generic-array",
182
+
]
183
+
184
+
[[package]]
185
+
name = "displaydoc"
186
+
version = "0.2.5"
187
+
source = "registry+https://github.com/rust-lang/crates.io-index"
188
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
189
+
dependencies = [
190
+
"proc-macro2",
191
+
"quote",
192
+
"syn 2.0.106",
193
+
]
194
+
195
+
[[package]]
196
+
name = "encoding_rs"
197
+
version = "0.8.35"
198
+
source = "registry+https://github.com/rust-lang/crates.io-index"
199
+
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
200
+
dependencies = [
201
+
"cfg-if 1.0.3",
202
+
]
203
+
204
+
[[package]]
205
+
name = "enum-as-inner"
206
+
version = "0.3.4"
207
+
source = "registry+https://github.com/rust-lang/crates.io-index"
208
+
checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4"
209
+
dependencies = [
210
+
"heck",
211
+
"proc-macro2",
212
+
"quote",
213
+
"syn 1.0.109",
214
+
]
215
+
216
+
[[package]]
217
+
name = "equivalent"
218
+
version = "1.0.2"
219
+
source = "registry+https://github.com/rust-lang/crates.io-index"
220
+
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
221
+
222
+
[[package]]
223
+
name = "errno"
224
+
version = "0.3.13"
225
+
source = "registry+https://github.com/rust-lang/crates.io-index"
226
+
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
227
+
dependencies = [
228
+
"libc",
229
+
"windows-sys 0.59.0",
230
+
]
231
+
232
+
[[package]]
233
+
name = "fake-simd"
234
+
version = "0.1.2"
235
+
source = "registry+https://github.com/rust-lang/crates.io-index"
236
+
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
237
+
238
+
[[package]]
239
+
name = "fastrand"
240
+
version = "2.3.0"
241
+
source = "registry+https://github.com/rust-lang/crates.io-index"
242
+
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
243
+
244
+
[[package]]
245
+
name = "find-msvc-tools"
246
+
version = "0.1.1"
247
+
source = "registry+https://github.com/rust-lang/crates.io-index"
248
+
checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d"
249
+
250
+
[[package]]
251
+
name = "fnv"
252
+
version = "1.0.7"
253
+
source = "registry+https://github.com/rust-lang/crates.io-index"
254
+
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
255
+
256
+
[[package]]
257
+
name = "foreign-types"
258
+
version = "0.3.2"
259
+
source = "registry+https://github.com/rust-lang/crates.io-index"
260
+
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
261
+
dependencies = [
262
+
"foreign-types-shared",
263
+
]
264
+
265
+
[[package]]
266
+
name = "foreign-types-shared"
267
+
version = "0.1.1"
268
+
source = "registry+https://github.com/rust-lang/crates.io-index"
269
+
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
270
+
271
+
[[package]]
272
+
name = "form_urlencoded"
273
+
version = "1.2.2"
274
+
source = "registry+https://github.com/rust-lang/crates.io-index"
275
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
276
+
dependencies = [
277
+
"percent-encoding",
278
+
]
279
+
280
+
[[package]]
281
+
name = "fuchsia-zircon"
282
+
version = "0.3.3"
283
+
source = "registry+https://github.com/rust-lang/crates.io-index"
284
+
checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
285
+
dependencies = [
286
+
"bitflags 1.3.2",
287
+
"fuchsia-zircon-sys",
288
+
]
289
+
290
+
[[package]]
291
+
name = "fuchsia-zircon-sys"
292
+
version = "0.3.3"
293
+
source = "registry+https://github.com/rust-lang/crates.io-index"
294
+
checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
295
+
296
+
[[package]]
297
+
name = "futures-channel"
298
+
version = "0.3.31"
299
+
source = "registry+https://github.com/rust-lang/crates.io-index"
300
+
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
301
+
dependencies = [
302
+
"futures-core",
303
+
"futures-sink",
304
+
]
305
+
306
+
[[package]]
307
+
name = "futures-core"
308
+
version = "0.3.31"
309
+
source = "registry+https://github.com/rust-lang/crates.io-index"
310
+
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
311
+
312
+
[[package]]
313
+
name = "futures-io"
314
+
version = "0.3.31"
315
+
source = "registry+https://github.com/rust-lang/crates.io-index"
316
+
checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
317
+
318
+
[[package]]
319
+
name = "futures-sink"
320
+
version = "0.3.31"
321
+
source = "registry+https://github.com/rust-lang/crates.io-index"
322
+
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
323
+
324
+
[[package]]
325
+
name = "futures-task"
326
+
version = "0.3.31"
327
+
source = "registry+https://github.com/rust-lang/crates.io-index"
328
+
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
329
+
330
+
[[package]]
331
+
name = "futures-util"
332
+
version = "0.3.31"
333
+
source = "registry+https://github.com/rust-lang/crates.io-index"
334
+
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
335
+
dependencies = [
336
+
"futures-core",
337
+
"futures-io",
338
+
"futures-sink",
339
+
"futures-task",
340
+
"memchr",
341
+
"pin-project-lite",
342
+
"pin-utils",
343
+
"slab",
344
+
]
345
+
346
+
[[package]]
347
+
name = "generic-array"
348
+
version = "0.12.4"
349
+
source = "registry+https://github.com/rust-lang/crates.io-index"
350
+
checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
351
+
dependencies = [
352
+
"typenum",
353
+
]
354
+
355
+
[[package]]
356
+
name = "getrandom"
357
+
version = "0.1.16"
358
+
source = "registry+https://github.com/rust-lang/crates.io-index"
359
+
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
360
+
dependencies = [
361
+
"cfg-if 1.0.3",
362
+
"libc",
363
+
"wasi 0.9.0+wasi-snapshot-preview1",
364
+
]
365
+
366
+
[[package]]
367
+
name = "getrandom"
368
+
version = "0.2.16"
369
+
source = "registry+https://github.com/rust-lang/crates.io-index"
370
+
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
371
+
dependencies = [
372
+
"cfg-if 1.0.3",
373
+
"libc",
374
+
"wasi 0.11.1+wasi-snapshot-preview1",
375
+
]
376
+
377
+
[[package]]
378
+
name = "getrandom"
379
+
version = "0.3.3"
380
+
source = "registry+https://github.com/rust-lang/crates.io-index"
381
+
checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
382
+
dependencies = [
383
+
"cfg-if 1.0.3",
384
+
"libc",
385
+
"r-efi",
386
+
"wasi 0.14.4+wasi-0.2.4",
387
+
]
388
+
389
+
[[package]]
390
+
name = "gimli"
391
+
version = "0.31.1"
392
+
source = "registry+https://github.com/rust-lang/crates.io-index"
393
+
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
394
+
395
+
[[package]]
396
+
name = "h2"
397
+
version = "0.4.12"
398
+
source = "registry+https://github.com/rust-lang/crates.io-index"
399
+
checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386"
400
+
dependencies = [
401
+
"atomic-waker",
402
+
"bytes 1.10.1",
403
+
"fnv",
404
+
"futures-core",
405
+
"futures-sink",
406
+
"http",
407
+
"indexmap",
408
+
"slab",
409
+
"tokio",
410
+
"tokio-util",
411
+
"tracing",
412
+
]
413
+
414
+
[[package]]
415
+
name = "hashbrown"
416
+
version = "0.15.5"
417
+
source = "registry+https://github.com/rust-lang/crates.io-index"
418
+
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
419
+
420
+
[[package]]
421
+
name = "heck"
422
+
version = "0.4.1"
423
+
source = "registry+https://github.com/rust-lang/crates.io-index"
424
+
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
425
+
426
+
[[package]]
427
+
name = "http"
428
+
version = "1.3.1"
429
+
source = "registry+https://github.com/rust-lang/crates.io-index"
430
+
checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
431
+
dependencies = [
432
+
"bytes 1.10.1",
433
+
"fnv",
434
+
"itoa",
435
+
]
436
+
437
+
[[package]]
438
+
name = "http-body"
439
+
version = "1.0.1"
440
+
source = "registry+https://github.com/rust-lang/crates.io-index"
441
+
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
442
+
dependencies = [
443
+
"bytes 1.10.1",
444
+
"http",
445
+
]
446
+
447
+
[[package]]
448
+
name = "http-body-util"
449
+
version = "0.1.3"
450
+
source = "registry+https://github.com/rust-lang/crates.io-index"
451
+
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
452
+
dependencies = [
453
+
"bytes 1.10.1",
454
+
"futures-core",
455
+
"http",
456
+
"http-body",
457
+
"pin-project-lite",
458
+
]
459
+
460
+
[[package]]
461
+
name = "httparse"
462
+
version = "1.10.1"
463
+
source = "registry+https://github.com/rust-lang/crates.io-index"
464
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
465
+
466
+
[[package]]
467
+
name = "hyper"
468
+
version = "1.7.0"
469
+
source = "registry+https://github.com/rust-lang/crates.io-index"
470
+
checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
471
+
dependencies = [
472
+
"atomic-waker",
473
+
"bytes 1.10.1",
474
+
"futures-channel",
475
+
"futures-core",
476
+
"h2",
477
+
"http",
478
+
"http-body",
479
+
"httparse",
480
+
"itoa",
481
+
"pin-project-lite",
482
+
"pin-utils",
483
+
"smallvec",
484
+
"tokio",
485
+
"want",
486
+
]
487
+
488
+
[[package]]
489
+
name = "hyper-rustls"
490
+
version = "0.27.7"
491
+
source = "registry+https://github.com/rust-lang/crates.io-index"
492
+
checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
493
+
dependencies = [
494
+
"http",
495
+
"hyper",
496
+
"hyper-util",
497
+
"rustls",
498
+
"rustls-pki-types",
499
+
"tokio",
500
+
"tokio-rustls",
501
+
"tower-service",
502
+
]
503
+
504
+
[[package]]
505
+
name = "hyper-tls"
506
+
version = "0.6.0"
507
+
source = "registry+https://github.com/rust-lang/crates.io-index"
508
+
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
509
+
dependencies = [
510
+
"bytes 1.10.1",
511
+
"http-body-util",
512
+
"hyper",
513
+
"hyper-util",
514
+
"native-tls",
515
+
"tokio",
516
+
"tokio-native-tls",
517
+
"tower-service",
518
+
]
519
+
520
+
[[package]]
521
+
name = "hyper-util"
522
+
version = "0.1.16"
523
+
source = "registry+https://github.com/rust-lang/crates.io-index"
524
+
checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e"
525
+
dependencies = [
526
+
"base64",
527
+
"bytes 1.10.1",
528
+
"futures-channel",
529
+
"futures-core",
530
+
"futures-util",
531
+
"http",
532
+
"http-body",
533
+
"hyper",
534
+
"ipnet",
535
+
"libc",
536
+
"percent-encoding",
537
+
"pin-project-lite",
538
+
"socket2 0.6.0",
539
+
"system-configuration",
540
+
"tokio",
541
+
"tower-service",
542
+
"tracing",
543
+
"windows-registry",
544
+
]
545
+
546
+
[[package]]
547
+
name = "icu_collections"
548
+
version = "2.0.0"
549
+
source = "registry+https://github.com/rust-lang/crates.io-index"
550
+
checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
551
+
dependencies = [
552
+
"displaydoc",
553
+
"potential_utf",
554
+
"yoke",
555
+
"zerofrom",
556
+
"zerovec",
557
+
]
558
+
559
+
[[package]]
560
+
name = "icu_locale_core"
561
+
version = "2.0.0"
562
+
source = "registry+https://github.com/rust-lang/crates.io-index"
563
+
checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
564
+
dependencies = [
565
+
"displaydoc",
566
+
"litemap",
567
+
"tinystr",
568
+
"writeable",
569
+
"zerovec",
570
+
]
571
+
572
+
[[package]]
573
+
name = "icu_normalizer"
574
+
version = "2.0.0"
575
+
source = "registry+https://github.com/rust-lang/crates.io-index"
576
+
checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
577
+
dependencies = [
578
+
"displaydoc",
579
+
"icu_collections",
580
+
"icu_normalizer_data",
581
+
"icu_properties",
582
+
"icu_provider",
583
+
"smallvec",
584
+
"zerovec",
585
+
]
586
+
587
+
[[package]]
588
+
name = "icu_normalizer_data"
589
+
version = "2.0.0"
590
+
source = "registry+https://github.com/rust-lang/crates.io-index"
591
+
checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
592
+
593
+
[[package]]
594
+
name = "icu_properties"
595
+
version = "2.0.1"
596
+
source = "registry+https://github.com/rust-lang/crates.io-index"
597
+
checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
598
+
dependencies = [
599
+
"displaydoc",
600
+
"icu_collections",
601
+
"icu_locale_core",
602
+
"icu_properties_data",
603
+
"icu_provider",
604
+
"potential_utf",
605
+
"zerotrie",
606
+
"zerovec",
607
+
]
608
+
609
+
[[package]]
610
+
name = "icu_properties_data"
611
+
version = "2.0.1"
612
+
source = "registry+https://github.com/rust-lang/crates.io-index"
613
+
checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
614
+
615
+
[[package]]
616
+
name = "icu_provider"
617
+
version = "2.0.0"
618
+
source = "registry+https://github.com/rust-lang/crates.io-index"
619
+
checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
620
+
dependencies = [
621
+
"displaydoc",
622
+
"icu_locale_core",
623
+
"stable_deref_trait",
624
+
"tinystr",
625
+
"writeable",
626
+
"yoke",
627
+
"zerofrom",
628
+
"zerotrie",
629
+
"zerovec",
630
+
]
631
+
632
+
[[package]]
633
+
name = "idna"
634
+
version = "0.2.3"
635
+
source = "registry+https://github.com/rust-lang/crates.io-index"
636
+
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
637
+
dependencies = [
638
+
"matches",
639
+
"unicode-bidi",
640
+
"unicode-normalization",
641
+
]
642
+
643
+
[[package]]
644
+
name = "idna"
645
+
version = "1.1.0"
646
+
source = "registry+https://github.com/rust-lang/crates.io-index"
647
+
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
648
+
dependencies = [
649
+
"idna_adapter",
650
+
"smallvec",
651
+
"utf8_iter",
652
+
]
653
+
654
+
[[package]]
655
+
name = "idna_adapter"
656
+
version = "1.2.1"
657
+
source = "registry+https://github.com/rust-lang/crates.io-index"
658
+
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
659
+
dependencies = [
660
+
"icu_normalizer",
661
+
"icu_properties",
662
+
]
663
+
664
+
[[package]]
665
+
name = "indexmap"
666
+
version = "2.11.0"
667
+
source = "registry+https://github.com/rust-lang/crates.io-index"
668
+
checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
669
+
dependencies = [
670
+
"equivalent",
671
+
"hashbrown",
672
+
]
673
+
674
+
[[package]]
675
+
name = "instant"
676
+
version = "0.1.13"
677
+
source = "registry+https://github.com/rust-lang/crates.io-index"
678
+
checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
679
+
dependencies = [
680
+
"cfg-if 1.0.3",
681
+
]
682
+
683
+
[[package]]
684
+
name = "io-uring"
685
+
version = "0.7.10"
686
+
source = "registry+https://github.com/rust-lang/crates.io-index"
687
+
checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
688
+
dependencies = [
689
+
"bitflags 2.9.4",
690
+
"cfg-if 1.0.3",
691
+
"libc",
692
+
]
693
+
694
+
[[package]]
695
+
name = "iovec"
696
+
version = "0.1.4"
697
+
source = "registry+https://github.com/rust-lang/crates.io-index"
698
+
checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
699
+
dependencies = [
700
+
"libc",
701
+
]
702
+
703
+
[[package]]
704
+
name = "ipconfig"
705
+
version = "0.2.2"
706
+
source = "registry+https://github.com/rust-lang/crates.io-index"
707
+
checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7"
708
+
dependencies = [
709
+
"socket2 0.3.19",
710
+
"widestring",
711
+
"winapi 0.3.9",
712
+
"winreg",
713
+
]
714
+
715
+
[[package]]
716
+
name = "ipnet"
717
+
version = "2.11.0"
718
+
source = "registry+https://github.com/rust-lang/crates.io-index"
719
+
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
720
+
721
+
[[package]]
722
+
name = "iri-string"
723
+
version = "0.7.8"
724
+
source = "registry+https://github.com/rust-lang/crates.io-index"
725
+
checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
726
+
dependencies = [
727
+
"memchr",
728
+
"serde",
729
+
]
730
+
731
+
[[package]]
732
+
name = "itoa"
733
+
version = "1.0.15"
734
+
source = "registry+https://github.com/rust-lang/crates.io-index"
735
+
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
736
+
737
+
[[package]]
738
+
name = "js-sys"
739
+
version = "0.3.78"
740
+
source = "registry+https://github.com/rust-lang/crates.io-index"
741
+
checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738"
742
+
dependencies = [
743
+
"once_cell",
744
+
"wasm-bindgen",
745
+
]
746
+
747
+
[[package]]
748
+
name = "json"
749
+
version = "0.12.4"
750
+
source = "registry+https://github.com/rust-lang/crates.io-index"
751
+
checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd"
752
+
753
+
[[package]]
754
+
name = "kernel32-sys"
755
+
version = "0.2.2"
756
+
source = "registry+https://github.com/rust-lang/crates.io-index"
757
+
checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
758
+
dependencies = [
759
+
"winapi 0.2.8",
760
+
"winapi-build",
761
+
]
762
+
763
+
[[package]]
764
+
name = "lazy_static"
765
+
version = "1.5.0"
766
+
source = "registry+https://github.com/rust-lang/crates.io-index"
767
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
768
+
769
+
[[package]]
770
+
name = "lazycell"
771
+
version = "1.3.0"
772
+
source = "registry+https://github.com/rust-lang/crates.io-index"
773
+
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
774
+
775
+
[[package]]
776
+
name = "libc"
777
+
version = "0.2.175"
778
+
source = "registry+https://github.com/rust-lang/crates.io-index"
779
+
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
780
+
781
+
[[package]]
782
+
name = "linked-hash-map"
783
+
version = "0.5.6"
784
+
source = "registry+https://github.com/rust-lang/crates.io-index"
785
+
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
786
+
787
+
[[package]]
788
+
name = "linux-raw-sys"
789
+
version = "0.9.4"
790
+
source = "registry+https://github.com/rust-lang/crates.io-index"
791
+
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
792
+
793
+
[[package]]
794
+
name = "litemap"
795
+
version = "0.8.0"
796
+
source = "registry+https://github.com/rust-lang/crates.io-index"
797
+
checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
798
+
799
+
[[package]]
800
+
name = "lock_api"
801
+
version = "0.4.13"
802
+
source = "registry+https://github.com/rust-lang/crates.io-index"
803
+
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
804
+
dependencies = [
805
+
"autocfg",
806
+
"scopeguard",
807
+
]
808
+
809
+
[[package]]
810
+
name = "log"
811
+
version = "0.4.28"
812
+
source = "registry+https://github.com/rust-lang/crates.io-index"
813
+
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
814
+
815
+
[[package]]
816
+
name = "lru-cache"
817
+
version = "0.1.2"
818
+
source = "registry+https://github.com/rust-lang/crates.io-index"
819
+
checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
820
+
dependencies = [
821
+
"linked-hash-map",
822
+
]
823
+
824
+
[[package]]
825
+
name = "matches"
826
+
version = "0.1.10"
827
+
source = "registry+https://github.com/rust-lang/crates.io-index"
828
+
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
829
+
830
+
[[package]]
831
+
name = "memchr"
832
+
version = "2.7.5"
833
+
source = "registry+https://github.com/rust-lang/crates.io-index"
834
+
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
835
+
836
+
[[package]]
837
+
name = "mime"
838
+
version = "0.3.17"
839
+
source = "registry+https://github.com/rust-lang/crates.io-index"
840
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
841
+
842
+
[[package]]
843
+
name = "miniz_oxide"
844
+
version = "0.8.9"
845
+
source = "registry+https://github.com/rust-lang/crates.io-index"
846
+
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
847
+
dependencies = [
848
+
"adler2",
849
+
]
850
+
851
+
[[package]]
852
+
name = "mio"
853
+
version = "0.6.23"
854
+
source = "registry+https://github.com/rust-lang/crates.io-index"
855
+
checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
856
+
dependencies = [
857
+
"cfg-if 0.1.10",
858
+
"fuchsia-zircon",
859
+
"fuchsia-zircon-sys",
860
+
"iovec",
861
+
"kernel32-sys",
862
+
"libc",
863
+
"log",
864
+
"miow",
865
+
"net2",
866
+
"slab",
867
+
"winapi 0.2.8",
868
+
]
869
+
870
+
[[package]]
871
+
name = "mio"
872
+
version = "1.0.4"
873
+
source = "registry+https://github.com/rust-lang/crates.io-index"
874
+
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
875
+
dependencies = [
876
+
"libc",
877
+
"wasi 0.11.1+wasi-snapshot-preview1",
878
+
"windows-sys 0.59.0",
879
+
]
880
+
881
+
[[package]]
882
+
name = "mio-extras"
883
+
version = "2.0.6"
884
+
source = "registry+https://github.com/rust-lang/crates.io-index"
885
+
checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
886
+
dependencies = [
887
+
"lazycell",
888
+
"log",
889
+
"mio 0.6.23",
890
+
"slab",
891
+
]
892
+
893
+
[[package]]
894
+
name = "miow"
895
+
version = "0.2.2"
896
+
source = "registry+https://github.com/rust-lang/crates.io-index"
897
+
checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
898
+
dependencies = [
899
+
"kernel32-sys",
900
+
"net2",
901
+
"winapi 0.2.8",
902
+
"ws2_32-sys",
903
+
]
904
+
905
+
[[package]]
906
+
name = "native-tls"
907
+
version = "0.2.14"
908
+
source = "registry+https://github.com/rust-lang/crates.io-index"
909
+
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
910
+
dependencies = [
911
+
"libc",
912
+
"log",
913
+
"openssl",
914
+
"openssl-probe",
915
+
"openssl-sys",
916
+
"schannel",
917
+
"security-framework",
918
+
"security-framework-sys",
919
+
"tempfile",
920
+
]
921
+
922
+
[[package]]
923
+
name = "net2"
924
+
version = "0.2.39"
925
+
source = "registry+https://github.com/rust-lang/crates.io-index"
926
+
checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac"
927
+
dependencies = [
928
+
"cfg-if 0.1.10",
929
+
"libc",
930
+
"winapi 0.3.9",
931
+
]
932
+
933
+
[[package]]
934
+
name = "object"
935
+
version = "0.36.7"
936
+
source = "registry+https://github.com/rust-lang/crates.io-index"
937
+
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
938
+
dependencies = [
939
+
"memchr",
940
+
]
941
+
942
+
[[package]]
943
+
name = "once_cell"
944
+
version = "1.21.3"
945
+
source = "registry+https://github.com/rust-lang/crates.io-index"
946
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
947
+
948
+
[[package]]
949
+
name = "opaque-debug"
950
+
version = "0.2.3"
951
+
source = "registry+https://github.com/rust-lang/crates.io-index"
952
+
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
953
+
954
+
[[package]]
955
+
name = "openssl"
956
+
version = "0.10.73"
957
+
source = "registry+https://github.com/rust-lang/crates.io-index"
958
+
checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
959
+
dependencies = [
960
+
"bitflags 2.9.4",
961
+
"cfg-if 1.0.3",
962
+
"foreign-types",
963
+
"libc",
964
+
"once_cell",
965
+
"openssl-macros",
966
+
"openssl-sys",
967
+
]
968
+
969
+
[[package]]
970
+
name = "openssl-macros"
971
+
version = "0.1.1"
972
+
source = "registry+https://github.com/rust-lang/crates.io-index"
973
+
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
974
+
dependencies = [
975
+
"proc-macro2",
976
+
"quote",
977
+
"syn 2.0.106",
978
+
]
979
+
980
+
[[package]]
981
+
name = "openssl-probe"
982
+
version = "0.1.6"
983
+
source = "registry+https://github.com/rust-lang/crates.io-index"
984
+
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
985
+
986
+
[[package]]
987
+
name = "openssl-sys"
988
+
version = "0.9.109"
989
+
source = "registry+https://github.com/rust-lang/crates.io-index"
990
+
checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
991
+
dependencies = [
992
+
"cc",
993
+
"libc",
994
+
"pkg-config",
995
+
"vcpkg",
996
+
]
997
+
998
+
[[package]]
999
+
name = "parking_lot"
1000
+
version = "0.11.2"
1001
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1002
+
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
1003
+
dependencies = [
1004
+
"instant",
1005
+
"lock_api",
1006
+
"parking_lot_core",
1007
+
]
1008
+
1009
+
[[package]]
1010
+
name = "parking_lot_core"
1011
+
version = "0.8.6"
1012
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1013
+
checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
1014
+
dependencies = [
1015
+
"cfg-if 1.0.3",
1016
+
"instant",
1017
+
"libc",
1018
+
"redox_syscall",
1019
+
"smallvec",
1020
+
"winapi 0.3.9",
1021
+
]
1022
+
1023
+
[[package]]
1024
+
name = "percent-encoding"
1025
+
version = "2.3.2"
1026
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1027
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1028
+
1029
+
[[package]]
1030
+
name = "pin-project-lite"
1031
+
version = "0.2.16"
1032
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1033
+
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1034
+
1035
+
[[package]]
1036
+
name = "pin-utils"
1037
+
version = "0.1.0"
1038
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1039
+
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1040
+
1041
+
[[package]]
1042
+
name = "pkg-config"
1043
+
version = "0.3.32"
1044
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1045
+
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
1046
+
1047
+
[[package]]
1048
+
name = "potential_utf"
1049
+
version = "0.1.3"
1050
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1051
+
checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
1052
+
dependencies = [
1053
+
"zerovec",
1054
+
]
1055
+
1056
+
[[package]]
1057
+
name = "ppv-lite86"
1058
+
version = "0.2.21"
1059
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1060
+
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
1061
+
dependencies = [
1062
+
"zerocopy",
1063
+
]
1064
+
1065
+
[[package]]
1066
+
name = "proc-macro2"
1067
+
version = "1.0.101"
1068
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1069
+
checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
1070
+
dependencies = [
1071
+
"unicode-ident",
1072
+
]
1073
+
1074
+
[[package]]
1075
+
name = "quote"
1076
+
version = "1.0.40"
1077
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1078
+
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
1079
+
dependencies = [
1080
+
"proc-macro2",
1081
+
]
1082
+
1083
+
[[package]]
1084
+
name = "r-efi"
1085
+
version = "5.3.0"
1086
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1087
+
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
1088
+
1089
+
[[package]]
1090
+
name = "rand"
1091
+
version = "0.7.3"
1092
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1093
+
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
1094
+
dependencies = [
1095
+
"getrandom 0.1.16",
1096
+
"libc",
1097
+
"rand_chacha 0.2.2",
1098
+
"rand_core 0.5.1",
1099
+
"rand_hc",
1100
+
]
1101
+
1102
+
[[package]]
1103
+
name = "rand"
1104
+
version = "0.8.5"
1105
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1106
+
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1107
+
dependencies = [
1108
+
"libc",
1109
+
"rand_chacha 0.3.1",
1110
+
"rand_core 0.6.4",
1111
+
]
1112
+
1113
+
[[package]]
1114
+
name = "rand_chacha"
1115
+
version = "0.2.2"
1116
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1117
+
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
1118
+
dependencies = [
1119
+
"ppv-lite86",
1120
+
"rand_core 0.5.1",
1121
+
]
1122
+
1123
+
[[package]]
1124
+
name = "rand_chacha"
1125
+
version = "0.3.1"
1126
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1127
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1128
+
dependencies = [
1129
+
"ppv-lite86",
1130
+
"rand_core 0.6.4",
1131
+
]
1132
+
1133
+
[[package]]
1134
+
name = "rand_core"
1135
+
version = "0.5.1"
1136
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1137
+
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
1138
+
dependencies = [
1139
+
"getrandom 0.1.16",
1140
+
]
1141
+
1142
+
[[package]]
1143
+
name = "rand_core"
1144
+
version = "0.6.4"
1145
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1146
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1147
+
dependencies = [
1148
+
"getrandom 0.2.16",
1149
+
]
1150
+
1151
+
[[package]]
1152
+
name = "rand_hc"
1153
+
version = "0.2.0"
1154
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1155
+
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
1156
+
dependencies = [
1157
+
"rand_core 0.5.1",
1158
+
]
1159
+
1160
+
[[package]]
1161
+
name = "redox_syscall"
1162
+
version = "0.2.16"
1163
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1164
+
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
1165
+
dependencies = [
1166
+
"bitflags 1.3.2",
1167
+
]
1168
+
1169
+
[[package]]
1170
+
name = "reqwest"
1171
+
version = "0.12.23"
1172
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1173
+
checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb"
1174
+
dependencies = [
1175
+
"base64",
1176
+
"bytes 1.10.1",
1177
+
"encoding_rs",
1178
+
"futures-channel",
1179
+
"futures-core",
1180
+
"futures-util",
1181
+
"h2",
1182
+
"http",
1183
+
"http-body",
1184
+
"http-body-util",
1185
+
"hyper",
1186
+
"hyper-rustls",
1187
+
"hyper-tls",
1188
+
"hyper-util",
1189
+
"js-sys",
1190
+
"log",
1191
+
"mime",
1192
+
"native-tls",
1193
+
"percent-encoding",
1194
+
"pin-project-lite",
1195
+
"rustls-pki-types",
1196
+
"serde",
1197
+
"serde_json",
1198
+
"serde_urlencoded",
1199
+
"sync_wrapper",
1200
+
"tokio",
1201
+
"tokio-native-tls",
1202
+
"tower",
1203
+
"tower-http",
1204
+
"tower-service",
1205
+
"url",
1206
+
"wasm-bindgen",
1207
+
"wasm-bindgen-futures",
1208
+
"web-sys",
1209
+
]
1210
+
1211
+
[[package]]
1212
+
name = "resolv-conf"
1213
+
version = "0.7.4"
1214
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1215
+
checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3"
1216
+
1217
+
[[package]]
1218
+
name = "ring"
1219
+
version = "0.17.14"
1220
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1221
+
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
1222
+
dependencies = [
1223
+
"cc",
1224
+
"cfg-if 1.0.3",
1225
+
"getrandom 0.2.16",
1226
+
"libc",
1227
+
"untrusted",
1228
+
"windows-sys 0.52.0",
1229
+
]
1230
+
1231
+
[[package]]
1232
+
name = "rustc-demangle"
1233
+
version = "0.1.26"
1234
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1235
+
checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace"
1236
+
1237
+
[[package]]
1238
+
name = "rustix"
1239
+
version = "1.0.8"
1240
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1241
+
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
1242
+
dependencies = [
1243
+
"bitflags 2.9.4",
1244
+
"errno",
1245
+
"libc",
1246
+
"linux-raw-sys",
1247
+
"windows-sys 0.59.0",
1248
+
]
1249
+
1250
+
[[package]]
1251
+
name = "rustls"
1252
+
version = "0.23.31"
1253
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1254
+
checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc"
1255
+
dependencies = [
1256
+
"once_cell",
1257
+
"rustls-pki-types",
1258
+
"rustls-webpki",
1259
+
"subtle",
1260
+
"zeroize",
1261
+
]
1262
+
1263
+
[[package]]
1264
+
name = "rustls-pki-types"
1265
+
version = "1.12.0"
1266
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1267
+
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
1268
+
dependencies = [
1269
+
"zeroize",
1270
+
]
1271
+
1272
+
[[package]]
1273
+
name = "rustls-webpki"
1274
+
version = "0.103.4"
1275
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1276
+
checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
1277
+
dependencies = [
1278
+
"ring",
1279
+
"rustls-pki-types",
1280
+
"untrusted",
1281
+
]
1282
+
1283
+
[[package]]
1284
+
name = "rustversion"
1285
+
version = "1.0.22"
1286
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1287
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1288
+
1289
+
[[package]]
1290
+
name = "ryu"
1291
+
version = "1.0.20"
1292
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1293
+
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1294
+
1295
+
[[package]]
1296
+
name = "schannel"
1297
+
version = "0.1.27"
1298
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1299
+
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1300
+
dependencies = [
1301
+
"windows-sys 0.59.0",
1302
+
]
1303
+
1304
+
[[package]]
1305
+
name = "scopeguard"
1306
+
version = "1.2.0"
1307
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1308
+
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1309
+
1310
+
[[package]]
1311
+
name = "security-framework"
1312
+
version = "2.11.1"
1313
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1314
+
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1315
+
dependencies = [
1316
+
"bitflags 2.9.4",
1317
+
"core-foundation",
1318
+
"core-foundation-sys",
1319
+
"libc",
1320
+
"security-framework-sys",
1321
+
]
1322
+
1323
+
[[package]]
1324
+
name = "security-framework-sys"
1325
+
version = "2.14.0"
1326
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1327
+
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1328
+
dependencies = [
1329
+
"core-foundation-sys",
1330
+
"libc",
1331
+
]
1332
+
1333
+
[[package]]
1334
+
name = "serde"
1335
+
version = "1.0.219"
1336
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1337
+
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
1338
+
dependencies = [
1339
+
"serde_derive",
1340
+
]
1341
+
1342
+
[[package]]
1343
+
name = "serde_derive"
1344
+
version = "1.0.219"
1345
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1346
+
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
1347
+
dependencies = [
1348
+
"proc-macro2",
1349
+
"quote",
1350
+
"syn 2.0.106",
1351
+
]
1352
+
1353
+
[[package]]
1354
+
name = "serde_json"
1355
+
version = "1.0.143"
1356
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1357
+
checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
1358
+
dependencies = [
1359
+
"itoa",
1360
+
"memchr",
1361
+
"ryu",
1362
+
"serde",
1363
+
]
1364
+
1365
+
[[package]]
1366
+
name = "serde_urlencoded"
1367
+
version = "0.7.1"
1368
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1369
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1370
+
dependencies = [
1371
+
"form_urlencoded",
1372
+
"itoa",
1373
+
"ryu",
1374
+
"serde",
1375
+
]
1376
+
1377
+
[[package]]
1378
+
name = "sha-1"
1379
+
version = "0.8.2"
1380
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1381
+
checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
1382
+
dependencies = [
1383
+
"block-buffer",
1384
+
"digest",
1385
+
"fake-simd",
1386
+
"opaque-debug",
1387
+
]
1388
+
1389
+
[[package]]
1390
+
name = "shlex"
1391
+
version = "1.3.0"
1392
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1393
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1394
+
1395
+
[[package]]
1396
+
name = "slab"
1397
+
version = "0.4.11"
1398
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1399
+
checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
1400
+
1401
+
[[package]]
1402
+
name = "smallvec"
1403
+
version = "1.15.1"
1404
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1405
+
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1406
+
1407
+
[[package]]
1408
+
name = "socket2"
1409
+
version = "0.3.19"
1410
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1411
+
checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e"
1412
+
dependencies = [
1413
+
"cfg-if 1.0.3",
1414
+
"libc",
1415
+
"winapi 0.3.9",
1416
+
]
1417
+
1418
+
[[package]]
1419
+
name = "socket2"
1420
+
version = "0.6.0"
1421
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1422
+
checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
1423
+
dependencies = [
1424
+
"libc",
1425
+
"windows-sys 0.59.0",
1426
+
]
1427
+
1428
+
[[package]]
1429
+
name = "stable_deref_trait"
1430
+
version = "1.2.0"
1431
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1432
+
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1433
+
1434
+
[[package]]
1435
+
name = "subtle"
1436
+
version = "2.6.1"
1437
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1438
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1439
+
1440
+
[[package]]
1441
+
name = "syn"
1442
+
version = "1.0.109"
1443
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1444
+
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
1445
+
dependencies = [
1446
+
"proc-macro2",
1447
+
"quote",
1448
+
"unicode-ident",
1449
+
]
1450
+
1451
+
[[package]]
1452
+
name = "syn"
1453
+
version = "2.0.106"
1454
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1455
+
checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
1456
+
dependencies = [
1457
+
"proc-macro2",
1458
+
"quote",
1459
+
"unicode-ident",
1460
+
]
1461
+
1462
+
[[package]]
1463
+
name = "sync_wrapper"
1464
+
version = "1.0.2"
1465
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1466
+
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1467
+
dependencies = [
1468
+
"futures-core",
1469
+
]
1470
+
1471
+
[[package]]
1472
+
name = "synstructure"
1473
+
version = "0.13.2"
1474
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1475
+
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
1476
+
dependencies = [
1477
+
"proc-macro2",
1478
+
"quote",
1479
+
"syn 2.0.106",
1480
+
]
1481
+
1482
+
[[package]]
1483
+
name = "system-configuration"
1484
+
version = "0.6.1"
1485
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1486
+
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
1487
+
dependencies = [
1488
+
"bitflags 2.9.4",
1489
+
"core-foundation",
1490
+
"system-configuration-sys",
1491
+
]
1492
+
1493
+
[[package]]
1494
+
name = "system-configuration-sys"
1495
+
version = "0.6.0"
1496
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1497
+
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
1498
+
dependencies = [
1499
+
"core-foundation-sys",
1500
+
"libc",
1501
+
]
1502
+
1503
+
[[package]]
6
1504
name = "tangled-on-commit"
7
1505
version = "0.1.0"
1506
+
dependencies = [
1507
+
"json",
1508
+
"reqwest",
1509
+
"trust-dns-resolver",
1510
+
"ws",
1511
+
]
1512
+
1513
+
[[package]]
1514
+
name = "tempfile"
1515
+
version = "3.21.0"
1516
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1517
+
checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
1518
+
dependencies = [
1519
+
"fastrand",
1520
+
"getrandom 0.3.3",
1521
+
"once_cell",
1522
+
"rustix",
1523
+
"windows-sys 0.59.0",
1524
+
]
1525
+
1526
+
[[package]]
1527
+
name = "thiserror"
1528
+
version = "1.0.69"
1529
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1530
+
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
1531
+
dependencies = [
1532
+
"thiserror-impl",
1533
+
]
1534
+
1535
+
[[package]]
1536
+
name = "thiserror-impl"
1537
+
version = "1.0.69"
1538
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1539
+
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
1540
+
dependencies = [
1541
+
"proc-macro2",
1542
+
"quote",
1543
+
"syn 2.0.106",
1544
+
]
1545
+
1546
+
[[package]]
1547
+
name = "tinystr"
1548
+
version = "0.8.1"
1549
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1550
+
checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
1551
+
dependencies = [
1552
+
"displaydoc",
1553
+
"zerovec",
1554
+
]
1555
+
1556
+
[[package]]
1557
+
name = "tinyvec"
1558
+
version = "1.10.0"
1559
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1560
+
checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
1561
+
dependencies = [
1562
+
"tinyvec_macros",
1563
+
]
1564
+
1565
+
[[package]]
1566
+
name = "tinyvec_macros"
1567
+
version = "0.1.1"
1568
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1569
+
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1570
+
1571
+
[[package]]
1572
+
name = "tokio"
1573
+
version = "1.47.1"
1574
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1575
+
checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
1576
+
dependencies = [
1577
+
"backtrace",
1578
+
"bytes 1.10.1",
1579
+
"io-uring",
1580
+
"libc",
1581
+
"mio 1.0.4",
1582
+
"pin-project-lite",
1583
+
"slab",
1584
+
"socket2 0.6.0",
1585
+
"windows-sys 0.59.0",
1586
+
]
1587
+
1588
+
[[package]]
1589
+
name = "tokio-native-tls"
1590
+
version = "0.3.1"
1591
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1592
+
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
1593
+
dependencies = [
1594
+
"native-tls",
1595
+
"tokio",
1596
+
]
1597
+
1598
+
[[package]]
1599
+
name = "tokio-rustls"
1600
+
version = "0.26.2"
1601
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1602
+
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
1603
+
dependencies = [
1604
+
"rustls",
1605
+
"tokio",
1606
+
]
1607
+
1608
+
[[package]]
1609
+
name = "tokio-util"
1610
+
version = "0.7.16"
1611
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1612
+
checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
1613
+
dependencies = [
1614
+
"bytes 1.10.1",
1615
+
"futures-core",
1616
+
"futures-sink",
1617
+
"pin-project-lite",
1618
+
"tokio",
1619
+
]
1620
+
1621
+
[[package]]
1622
+
name = "tower"
1623
+
version = "0.5.2"
1624
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1625
+
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1626
+
dependencies = [
1627
+
"futures-core",
1628
+
"futures-util",
1629
+
"pin-project-lite",
1630
+
"sync_wrapper",
1631
+
"tokio",
1632
+
"tower-layer",
1633
+
"tower-service",
1634
+
]
1635
+
1636
+
[[package]]
1637
+
name = "tower-http"
1638
+
version = "0.6.6"
1639
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1640
+
checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
1641
+
dependencies = [
1642
+
"bitflags 2.9.4",
1643
+
"bytes 1.10.1",
1644
+
"futures-util",
1645
+
"http",
1646
+
"http-body",
1647
+
"iri-string",
1648
+
"pin-project-lite",
1649
+
"tower",
1650
+
"tower-layer",
1651
+
"tower-service",
1652
+
]
1653
+
1654
+
[[package]]
1655
+
name = "tower-layer"
1656
+
version = "0.3.3"
1657
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1658
+
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
1659
+
1660
+
[[package]]
1661
+
name = "tower-service"
1662
+
version = "0.3.3"
1663
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1664
+
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
1665
+
1666
+
[[package]]
1667
+
name = "tracing"
1668
+
version = "0.1.41"
1669
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1670
+
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
1671
+
dependencies = [
1672
+
"pin-project-lite",
1673
+
"tracing-core",
1674
+
]
1675
+
1676
+
[[package]]
1677
+
name = "tracing-core"
1678
+
version = "0.1.34"
1679
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1680
+
checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
1681
+
dependencies = [
1682
+
"once_cell",
1683
+
]
1684
+
1685
+
[[package]]
1686
+
name = "trust-dns-proto"
1687
+
version = "0.20.4"
1688
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1689
+
checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31"
1690
+
dependencies = [
1691
+
"async-trait",
1692
+
"cfg-if 1.0.3",
1693
+
"data-encoding",
1694
+
"enum-as-inner",
1695
+
"futures-channel",
1696
+
"futures-io",
1697
+
"futures-util",
1698
+
"idna 0.2.3",
1699
+
"ipnet",
1700
+
"lazy_static",
1701
+
"log",
1702
+
"rand 0.8.5",
1703
+
"smallvec",
1704
+
"thiserror",
1705
+
"tinyvec",
1706
+
"tokio",
1707
+
"url",
1708
+
]
1709
+
1710
+
[[package]]
1711
+
name = "trust-dns-resolver"
1712
+
version = "0.20.4"
1713
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1714
+
checksum = "ecae383baad9995efaa34ce8e57d12c3f305e545887472a492b838f4b5cfb77a"
1715
+
dependencies = [
1716
+
"cfg-if 1.0.3",
1717
+
"futures-util",
1718
+
"ipconfig",
1719
+
"lazy_static",
1720
+
"log",
1721
+
"lru-cache",
1722
+
"parking_lot",
1723
+
"resolv-conf",
1724
+
"smallvec",
1725
+
"thiserror",
1726
+
"tokio",
1727
+
"trust-dns-proto",
1728
+
]
1729
+
1730
+
[[package]]
1731
+
name = "try-lock"
1732
+
version = "0.2.5"
1733
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1734
+
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
1735
+
1736
+
[[package]]
1737
+
name = "typenum"
1738
+
version = "1.18.0"
1739
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1740
+
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
1741
+
1742
+
[[package]]
1743
+
name = "unicode-bidi"
1744
+
version = "0.3.18"
1745
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1746
+
checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
1747
+
1748
+
[[package]]
1749
+
name = "unicode-ident"
1750
+
version = "1.0.18"
1751
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1752
+
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
1753
+
1754
+
[[package]]
1755
+
name = "unicode-normalization"
1756
+
version = "0.1.24"
1757
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1758
+
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
1759
+
dependencies = [
1760
+
"tinyvec",
1761
+
]
1762
+
1763
+
[[package]]
1764
+
name = "untrusted"
1765
+
version = "0.9.0"
1766
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1767
+
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
1768
+
1769
+
[[package]]
1770
+
name = "url"
1771
+
version = "2.5.7"
1772
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1773
+
checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b"
1774
+
dependencies = [
1775
+
"form_urlencoded",
1776
+
"idna 1.1.0",
1777
+
"percent-encoding",
1778
+
"serde",
1779
+
]
1780
+
1781
+
[[package]]
1782
+
name = "utf8_iter"
1783
+
version = "1.0.4"
1784
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1785
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
1786
+
1787
+
[[package]]
1788
+
name = "vcpkg"
1789
+
version = "0.2.15"
1790
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1791
+
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1792
+
1793
+
[[package]]
1794
+
name = "want"
1795
+
version = "0.3.1"
1796
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1797
+
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
1798
+
dependencies = [
1799
+
"try-lock",
1800
+
]
1801
+
1802
+
[[package]]
1803
+
name = "wasi"
1804
+
version = "0.9.0+wasi-snapshot-preview1"
1805
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1806
+
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
1807
+
1808
+
[[package]]
1809
+
name = "wasi"
1810
+
version = "0.11.1+wasi-snapshot-preview1"
1811
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1812
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
1813
+
1814
+
[[package]]
1815
+
name = "wasi"
1816
+
version = "0.14.4+wasi-0.2.4"
1817
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1818
+
checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a"
1819
+
dependencies = [
1820
+
"wit-bindgen",
1821
+
]
1822
+
1823
+
[[package]]
1824
+
name = "wasm-bindgen"
1825
+
version = "0.2.101"
1826
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1827
+
checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b"
1828
+
dependencies = [
1829
+
"cfg-if 1.0.3",
1830
+
"once_cell",
1831
+
"rustversion",
1832
+
"wasm-bindgen-macro",
1833
+
"wasm-bindgen-shared",
1834
+
]
1835
+
1836
+
[[package]]
1837
+
name = "wasm-bindgen-backend"
1838
+
version = "0.2.101"
1839
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1840
+
checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb"
1841
+
dependencies = [
1842
+
"bumpalo",
1843
+
"log",
1844
+
"proc-macro2",
1845
+
"quote",
1846
+
"syn 2.0.106",
1847
+
"wasm-bindgen-shared",
1848
+
]
1849
+
1850
+
[[package]]
1851
+
name = "wasm-bindgen-futures"
1852
+
version = "0.4.51"
1853
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1854
+
checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe"
1855
+
dependencies = [
1856
+
"cfg-if 1.0.3",
1857
+
"js-sys",
1858
+
"once_cell",
1859
+
"wasm-bindgen",
1860
+
"web-sys",
1861
+
]
1862
+
1863
+
[[package]]
1864
+
name = "wasm-bindgen-macro"
1865
+
version = "0.2.101"
1866
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1867
+
checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d"
1868
+
dependencies = [
1869
+
"quote",
1870
+
"wasm-bindgen-macro-support",
1871
+
]
1872
+
1873
+
[[package]]
1874
+
name = "wasm-bindgen-macro-support"
1875
+
version = "0.2.101"
1876
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1877
+
checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa"
1878
+
dependencies = [
1879
+
"proc-macro2",
1880
+
"quote",
1881
+
"syn 2.0.106",
1882
+
"wasm-bindgen-backend",
1883
+
"wasm-bindgen-shared",
1884
+
]
1885
+
1886
+
[[package]]
1887
+
name = "wasm-bindgen-shared"
1888
+
version = "0.2.101"
1889
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1890
+
checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1"
1891
+
dependencies = [
1892
+
"unicode-ident",
1893
+
]
1894
+
1895
+
[[package]]
1896
+
name = "web-sys"
1897
+
version = "0.3.78"
1898
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1899
+
checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12"
1900
+
dependencies = [
1901
+
"js-sys",
1902
+
"wasm-bindgen",
1903
+
]
1904
+
1905
+
[[package]]
1906
+
name = "widestring"
1907
+
version = "0.4.3"
1908
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1909
+
checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
1910
+
1911
+
[[package]]
1912
+
name = "winapi"
1913
+
version = "0.2.8"
1914
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1915
+
checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
1916
+
1917
+
[[package]]
1918
+
name = "winapi"
1919
+
version = "0.3.9"
1920
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1921
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1922
+
dependencies = [
1923
+
"winapi-i686-pc-windows-gnu",
1924
+
"winapi-x86_64-pc-windows-gnu",
1925
+
]
1926
+
1927
+
[[package]]
1928
+
name = "winapi-build"
1929
+
version = "0.1.1"
1930
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1931
+
checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
1932
+
1933
+
[[package]]
1934
+
name = "winapi-i686-pc-windows-gnu"
1935
+
version = "0.4.0"
1936
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1937
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1938
+
1939
+
[[package]]
1940
+
name = "winapi-x86_64-pc-windows-gnu"
1941
+
version = "0.4.0"
1942
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1943
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1944
+
1945
+
[[package]]
1946
+
name = "windows-link"
1947
+
version = "0.1.3"
1948
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1949
+
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
1950
+
1951
+
[[package]]
1952
+
name = "windows-registry"
1953
+
version = "0.5.3"
1954
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1955
+
checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
1956
+
dependencies = [
1957
+
"windows-link",
1958
+
"windows-result",
1959
+
"windows-strings",
1960
+
]
1961
+
1962
+
[[package]]
1963
+
name = "windows-result"
1964
+
version = "0.3.4"
1965
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1966
+
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
1967
+
dependencies = [
1968
+
"windows-link",
1969
+
]
1970
+
1971
+
[[package]]
1972
+
name = "windows-strings"
1973
+
version = "0.4.2"
1974
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1975
+
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
1976
+
dependencies = [
1977
+
"windows-link",
1978
+
]
1979
+
1980
+
[[package]]
1981
+
name = "windows-sys"
1982
+
version = "0.52.0"
1983
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1984
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1985
+
dependencies = [
1986
+
"windows-targets",
1987
+
]
1988
+
1989
+
[[package]]
1990
+
name = "windows-sys"
1991
+
version = "0.59.0"
1992
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1993
+
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1994
+
dependencies = [
1995
+
"windows-targets",
1996
+
]
1997
+
1998
+
[[package]]
1999
+
name = "windows-targets"
2000
+
version = "0.52.6"
2001
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2002
+
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2003
+
dependencies = [
2004
+
"windows_aarch64_gnullvm",
2005
+
"windows_aarch64_msvc",
2006
+
"windows_i686_gnu",
2007
+
"windows_i686_gnullvm",
2008
+
"windows_i686_msvc",
2009
+
"windows_x86_64_gnu",
2010
+
"windows_x86_64_gnullvm",
2011
+
"windows_x86_64_msvc",
2012
+
]
2013
+
2014
+
[[package]]
2015
+
name = "windows_aarch64_gnullvm"
2016
+
version = "0.52.6"
2017
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2018
+
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2019
+
2020
+
[[package]]
2021
+
name = "windows_aarch64_msvc"
2022
+
version = "0.52.6"
2023
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2024
+
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2025
+
2026
+
[[package]]
2027
+
name = "windows_i686_gnu"
2028
+
version = "0.52.6"
2029
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2030
+
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2031
+
2032
+
[[package]]
2033
+
name = "windows_i686_gnullvm"
2034
+
version = "0.52.6"
2035
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2036
+
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2037
+
2038
+
[[package]]
2039
+
name = "windows_i686_msvc"
2040
+
version = "0.52.6"
2041
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2042
+
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2043
+
2044
+
[[package]]
2045
+
name = "windows_x86_64_gnu"
2046
+
version = "0.52.6"
2047
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2048
+
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2049
+
2050
+
[[package]]
2051
+
name = "windows_x86_64_gnullvm"
2052
+
version = "0.52.6"
2053
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2054
+
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2055
+
2056
+
[[package]]
2057
+
name = "windows_x86_64_msvc"
2058
+
version = "0.52.6"
2059
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2060
+
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2061
+
2062
+
[[package]]
2063
+
name = "winreg"
2064
+
version = "0.6.2"
2065
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2066
+
checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
2067
+
dependencies = [
2068
+
"winapi 0.3.9",
2069
+
]
2070
+
2071
+
[[package]]
2072
+
name = "wit-bindgen"
2073
+
version = "0.45.1"
2074
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2075
+
checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36"
2076
+
2077
+
[[package]]
2078
+
name = "writeable"
2079
+
version = "0.6.1"
2080
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2081
+
checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
2082
+
2083
+
[[package]]
2084
+
name = "ws"
2085
+
version = "0.9.2"
2086
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2087
+
checksum = "25fe90c75f236a0a00247d5900226aea4f2d7b05ccc34da9e7a8880ff59b5848"
2088
+
dependencies = [
2089
+
"byteorder",
2090
+
"bytes 0.4.12",
2091
+
"httparse",
2092
+
"log",
2093
+
"mio 0.6.23",
2094
+
"mio-extras",
2095
+
"rand 0.7.3",
2096
+
"sha-1",
2097
+
"slab",
2098
+
"url",
2099
+
]
2100
+
2101
+
[[package]]
2102
+
name = "ws2_32-sys"
2103
+
version = "0.2.1"
2104
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2105
+
checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
2106
+
dependencies = [
2107
+
"winapi 0.2.8",
2108
+
"winapi-build",
2109
+
]
2110
+
2111
+
[[package]]
2112
+
name = "yoke"
2113
+
version = "0.8.0"
2114
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2115
+
checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
2116
+
dependencies = [
2117
+
"serde",
2118
+
"stable_deref_trait",
2119
+
"yoke-derive",
2120
+
"zerofrom",
2121
+
]
2122
+
2123
+
[[package]]
2124
+
name = "yoke-derive"
2125
+
version = "0.8.0"
2126
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2127
+
checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
2128
+
dependencies = [
2129
+
"proc-macro2",
2130
+
"quote",
2131
+
"syn 2.0.106",
2132
+
"synstructure",
2133
+
]
2134
+
2135
+
[[package]]
2136
+
name = "zerocopy"
2137
+
version = "0.8.26"
2138
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2139
+
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
2140
+
dependencies = [
2141
+
"zerocopy-derive",
2142
+
]
2143
+
2144
+
[[package]]
2145
+
name = "zerocopy-derive"
2146
+
version = "0.8.26"
2147
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2148
+
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
2149
+
dependencies = [
2150
+
"proc-macro2",
2151
+
"quote",
2152
+
"syn 2.0.106",
2153
+
]
2154
+
2155
+
[[package]]
2156
+
name = "zerofrom"
2157
+
version = "0.1.6"
2158
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2159
+
checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
2160
+
dependencies = [
2161
+
"zerofrom-derive",
2162
+
]
2163
+
2164
+
[[package]]
2165
+
name = "zerofrom-derive"
2166
+
version = "0.1.6"
2167
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2168
+
checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
2169
+
dependencies = [
2170
+
"proc-macro2",
2171
+
"quote",
2172
+
"syn 2.0.106",
2173
+
"synstructure",
2174
+
]
2175
+
2176
+
[[package]]
2177
+
name = "zeroize"
2178
+
version = "1.8.1"
2179
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2180
+
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2181
+
2182
+
[[package]]
2183
+
name = "zerotrie"
2184
+
version = "0.2.2"
2185
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2186
+
checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
2187
+
dependencies = [
2188
+
"displaydoc",
2189
+
"yoke",
2190
+
"zerofrom",
2191
+
]
2192
+
2193
+
[[package]]
2194
+
name = "zerovec"
2195
+
version = "0.11.4"
2196
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2197
+
checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
2198
+
dependencies = [
2199
+
"yoke",
2200
+
"zerofrom",
2201
+
"zerovec-derive",
2202
+
]
2203
+
2204
+
[[package]]
2205
+
name = "zerovec-derive"
2206
+
version = "0.11.1"
2207
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2208
+
checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
2209
+
dependencies = [
2210
+
"proc-macro2",
2211
+
"quote",
2212
+
"syn 2.0.106",
2213
+
]
+6
Cargo.toml
+6
Cargo.toml
+63
README.md
+63
README.md
···
1
+
# `tangled-on-commit`
2
+
3
+
Run a shell command whenever a specific repo gets a commit
4
+
5
+
```sh
6
+
$ tangled-on-commit @vielle.dev/tangled-on-commit ./commit.sh
7
+
```
8
+
9
+
> Created for linux. Should work fine on MacOS. Will not work on windows.
10
+
> Note: The shell command is placed inside `/bin/sh -c "COMMAND"`, so make sure to escape quotes and backslashes. I reccomend executing a shell file and piping stdout and stderr to a log file
11
+
12
+
## Installation
13
+
14
+
Prerequisites:
15
+
16
+
- `Git`
17
+
- `Rust` (1.88+)
18
+
- `Cargo`
19
+
- `OpenSSL` (required for ssl connection)
20
+
- `pkg-config` (required for ssl connection)
21
+
22
+
1. Clone this repo:
23
+
`git clone git@tangled.sh:vielle.dev/tangled-on-commit`
24
+
2. Compile the binary:
25
+
`cargo build --release`
26
+
3. Copy the binary to your path:
27
+
`sudo cp ./target/release/tangled-on-commit /bin`
28
+
29
+
## Usage
30
+
31
+
### CLI Arguments
32
+
33
+
- `tangled-on-commit (-h | --help)`
34
+
Displays this message
35
+
36
+
- `tangled-on-commit`
37
+
No specified handle, repo, or command. Falls back to config/env
38
+
39
+
- `tangled-on-commit SHELL`
40
+
Uses config/env for handle and repo
41
+
42
+
- `tangled-on-commit @HANDLE SHELL`
43
+
Uses config/env for repo
44
+
45
+
- `tangled-on-commit REPO SHELL`
46
+
Uses config/env for handle
47
+
48
+
- `tangled-on-commit @HANDLE/REPO SHELL`
49
+
`tangled-on-commit HANDLE REPO SHELL`
50
+
No config/env
51
+
52
+
### JSON
53
+
54
+
Loads the file `tangled-on-commit.json` from cwd if it exists.
55
+
Reads keys \"handle\", \"repo_name\", and \"shell\".
56
+
Unknown keys are ignored and any key can be ommitted
57
+
JSON is used if the arguments aren't passed to the CLI
58
+
59
+
### Env
60
+
61
+
Loads the environment variables `TANGLED_ON_COMMIT_HANDLE` and `TANGLED_ON_COMMIT_REPO_NAME`
62
+
Shell cannot be set by environment variables.
63
+
Env variables are used if relevant keys are ommitted an arguments aren't passed to the CLI.
+215
src/args.rs
+215
src/args.rs
···
1
+
fn help() {
2
+
println!(
3
+
"Help: tangled-on-commit
4
+
Listen for commits on a specified repository and execute a shell command.
5
+
6
+
CLI Arguments:
7
+
`tangled-on-commit (-h | --help)`
8
+
Displays this message
9
+
10
+
`tangled-on-commit`
11
+
No specified handle, repo, or command. Falls back to config/env
12
+
13
+
`tangled-on-commit SHELL`
14
+
Uses config/env for handle and repo
15
+
16
+
`tangled-on-commit @HANDLE SHELL`
17
+
Uses config/env for repo
18
+
19
+
`tangled-on-commit REPO SHELL`
20
+
Uses config/env for handle
21
+
22
+
`tangled-on-commit @HANDLE/REPO SHELL`
23
+
`tangled-on-commit HANDLE REPO SHELL`
24
+
No config/env
25
+
26
+
JSON:
27
+
Loads the file `tangled-on-commit.json` from cwd if it exists.
28
+
Reads keys \"handle\", \"repo_name\", and \"shell\".
29
+
Unknown keys are ignored and any key can be ommitted
30
+
JSON is used if the arguments aren't passed to the CLI
31
+
32
+
Env:
33
+
Loads the environment variables `TANGLED_ON_COMMIT_HANDLE` and `TANGLED_ON_COMMIT_REPO_NAME`
34
+
Shell cannot be set by environment variables.
35
+
Env variables are used if relevant keys are ommitted an arguments aren't passed to the CLI.
36
+
"
37
+
)
38
+
}
39
+
40
+
#[derive(Debug)]
41
+
pub struct Config {
42
+
pub handle: String,
43
+
pub repo_name: String,
44
+
pub shell: String,
45
+
}
46
+
47
+
pub fn load_config() -> Result<Config, ()> {
48
+
// load config from cli args if present
49
+
// if omitted, fallback to a local `tangled-on-commit.json` file
50
+
// if key omitted or file not found, fall back to env
51
+
// if env omitted, error out and quit
52
+
// note: shell is not loaded from env (to avoid the user unknowingly executing scripts)
53
+
54
+
// if any args are `-h` || `--help` display help and quit
55
+
for arg in std::env::args() {
56
+
if arg == "-h" || arg == "--help" {
57
+
help();
58
+
return Err(());
59
+
}
60
+
}
61
+
62
+
// if 0 args are passed, skip
63
+
// if 1 arg is passed, its the shell command
64
+
// if 2 args are passed:
65
+
// if arg 1 starts in @ its a handle
66
+
// if it contains a / the contents after the slash is the reponame
67
+
// else its the reponame
68
+
// arg 2 is always the shell command
69
+
// if 3 args are passed its handle repo shell
70
+
// if more args are passed its an error
71
+
72
+
let mut handle: Option<String> = None;
73
+
let mut repo_name: Option<String> = None;
74
+
let mut shell: Option<String> = None;
75
+
match std::env::args().collect::<Vec<_>>().len() {
76
+
// 0 args (std env args includes this script)
77
+
1 => {}
78
+
2 => {
79
+
shell = Some(
80
+
std::env::args()
81
+
.last()
82
+
.expect("Invalid state: 2 `Some` std::env::args() but found no Some values"),
83
+
)
84
+
}
85
+
3 => {
86
+
// load args and consume first
87
+
let mut args = std::env::args();
88
+
args.next();
89
+
90
+
if let Some(val) = args.next() {
91
+
if val.starts_with("@") {
92
+
if val.contains("/") {
93
+
let entries: Vec<_> = val.split("/").collect();
94
+
if entries.len() != 2 {
95
+
println!("Invalid argument: `{}` is malformed", val);
96
+
return Err(());
97
+
}
98
+
handle = Some(entries[0][1..].to_string());
99
+
repo_name = Some(entries[1].to_string());
100
+
} else {
101
+
handle = Some(val[1..].to_string());
102
+
}
103
+
} else {
104
+
repo_name = Some(val)
105
+
};
106
+
}
107
+
shell = Some(
108
+
args.next()
109
+
.expect("Invalid state: 3 `Some` std::env::args() but only found 2"),
110
+
);
111
+
}
112
+
4 => {
113
+
// load args and consume first
114
+
let mut args = std::env::args();
115
+
args.next();
116
+
117
+
handle = Some(
118
+
args.next()
119
+
.expect("Invalid state: 4 `Some` std::env::args() but only found 1"),
120
+
);
121
+
repo_name = Some(
122
+
args.next()
123
+
.expect("Invalid state: 4 `Some` std::env::args() but only found 2"),
124
+
);
125
+
shell = Some(
126
+
args.next()
127
+
.expect("Invalid state: 4 `Some` std::env::args() but only found 3"),
128
+
);
129
+
}
130
+
_ => {
131
+
// err
132
+
}
133
+
}
134
+
135
+
if let Some(ref handle) = handle
136
+
&& let Some(ref repo_name) = repo_name
137
+
&& let Some(ref shell) = shell
138
+
{
139
+
return Ok(Config {
140
+
handle: handle.to_string(),
141
+
repo_name: repo_name.to_string(),
142
+
shell: shell.to_string(),
143
+
});
144
+
}
145
+
146
+
// now load config
147
+
if let Ok(file) = std::fs::read_to_string("./tangled-on-commit.json") {
148
+
if let Ok(parsed) = json::parse(&file) {
149
+
if handle.is_none()
150
+
&& let Some(json_handle) = parsed["handle"].as_str()
151
+
{
152
+
handle = Some(String::from(json_handle))
153
+
}
154
+
if repo_name.is_none()
155
+
&& let Some(json_repo_name) = parsed["repo_name"].as_str()
156
+
{
157
+
repo_name = Some(String::from(json_repo_name))
158
+
}
159
+
if shell.is_none()
160
+
&& let Some(json_shell) = parsed["shell"].as_str()
161
+
{
162
+
shell = Some(String::from(json_shell))
163
+
}
164
+
}
165
+
}
166
+
167
+
if let Some(ref handle) = handle
168
+
&& let Some(ref repo_name) = repo_name
169
+
&& let Some(ref shell) = shell
170
+
{
171
+
return Ok(Config {
172
+
handle: handle.to_string(),
173
+
repo_name: repo_name.to_string(),
174
+
shell: shell.to_string(),
175
+
});
176
+
}
177
+
178
+
// now load from env
179
+
if handle.is_none()
180
+
&& let Ok(env_handle) = std::env::var("TANGLED_ON_COMMIT_HANDLE")
181
+
{
182
+
handle = Some(String::from(env_handle))
183
+
}
184
+
if repo_name.is_none()
185
+
&& let Ok(env_repo_name) = std::env::var("TANGLED_ON_COMMIT_REPO_NAME")
186
+
{
187
+
repo_name = Some(String::from(env_repo_name))
188
+
}
189
+
190
+
if let Some(ref handle) = handle
191
+
&& let Some(ref repo_name) = repo_name
192
+
&& let Some(ref shell) = shell
193
+
{
194
+
return Ok(Config {
195
+
handle: handle.to_string(),
196
+
repo_name: repo_name.to_string(),
197
+
shell: shell.to_string(),
198
+
});
199
+
}
200
+
201
+
// couldnt resolve every value
202
+
// print an error and quit
203
+
println!("Unable to find a value for every setting. Missing values for:");
204
+
if handle.is_none() {
205
+
println!("- handle");
206
+
}
207
+
if repo_name.is_none() {
208
+
println!("- repo_name");
209
+
}
210
+
if shell.is_none() {
211
+
println!("- shell");
212
+
}
213
+
println!("\nRun `tangled-on-commit --help` to see the help message");
214
+
return Err(());
215
+
}
+194
src/did.rs
+194
src/did.rs
···
1
+
use trust_dns_resolver::Resolver;
2
+
use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
3
+
4
+
#[derive(Debug)]
5
+
pub struct DidDoc {
6
+
pub did: String,
7
+
pub pds: String,
8
+
}
9
+
10
+
fn get_txt_did(handle: &String) -> Result<String, ()> {
11
+
println!(" Trying dns TXT for _atproto.{}", handle);
12
+
// create a txt resolver
13
+
let resolver = match Resolver::new(ResolverConfig::default(), ResolverOpts::default()) {
14
+
Ok(val) => val,
15
+
Err(_) => {
16
+
println!(" Couldn't create a DNS resolver");
17
+
return Err(());
18
+
}
19
+
};
20
+
21
+
// resolve _atproto.handle to a TXT record
22
+
let txt_res = match resolver.txt_lookup("_atproto.".to_owned() + &handle) {
23
+
Ok(val) => val,
24
+
Err(_) => {
25
+
println!(" Couldn't resolve to a TXT record");
26
+
return Err(());
27
+
} // collect all entries and convert to strings
28
+
}
29
+
.into_iter()
30
+
.map(|x| x.to_string())
31
+
.collect::<Vec<_>>();
32
+
33
+
// filter entries which do not start with `did=`
34
+
let did_res = txt_res
35
+
.clone()
36
+
.extract_if(.., |x| x.starts_with("did="))
37
+
.collect::<Vec<_>>();
38
+
// only 1 did= can exist
39
+
// https://atproto.com/specs/handle#:~:text=If%20multiple%20valid%20records%20with%20different%20DIDs%20are%20present,%20resolution%20should%20fail.
40
+
if did_res.len() != 1 {
41
+
println!(" Found too many DIDs for this handle");
42
+
return Err(());
43
+
}
44
+
45
+
return Ok(did_res[0][4..].to_string());
46
+
}
47
+
48
+
fn get_http_did(handle: &String) -> Result<String, ()> {
49
+
println!(
50
+
" Trying https for https://{}/.well-known/atproto-did",
51
+
handle
52
+
);
53
+
let res =
54
+
match reqwest::blocking::get("https://".to_owned() + handle + "/.well-known/atproto-did") {
55
+
Ok(val) => val,
56
+
Err(_) => {
57
+
println!(" GET request failed");
58
+
return Err(());
59
+
}
60
+
};
61
+
62
+
// as per spec, non 2xx code means failure
63
+
if !res.status().is_success() {
64
+
println!(
65
+
" Got non 2xx status code: {}",
66
+
res.status().as_str()
67
+
);
68
+
return Err(());
69
+
}
70
+
71
+
let did_unparsed = match res.text() {
72
+
Ok(val) => val,
73
+
Err(_) => {
74
+
println!(" Missing or malformed body response");
75
+
return Err(());
76
+
}
77
+
};
78
+
79
+
let did = did_unparsed.trim();
80
+
81
+
if !did.starts_with("did:") {
82
+
println!(" Did not find a DID");
83
+
return Err(());
84
+
};
85
+
return Ok(String::from(did));
86
+
}
87
+
88
+
fn parse_doc(did: String, text: String) -> Result<DidDoc, ()> {
89
+
let text_json = match json::parse(&text) {
90
+
Ok(val) => val,
91
+
Err(_) => {
92
+
println!(" Malformed DID document");
93
+
return Err(());
94
+
}
95
+
};
96
+
97
+
for service in text_json["service"].members() {
98
+
if service["id"]
99
+
.as_str()
100
+
.is_some_and(|x| x.ends_with("#atproto_pds"))
101
+
&& service["type"]
102
+
.as_str()
103
+
.is_some_and(|x| x == "AtprotoPersonalDataServer")
104
+
&& let Some(pds) = service["serviceEndpoint"].as_str()
105
+
{
106
+
return Ok(DidDoc {
107
+
did: did,
108
+
pds: pds.to_string(),
109
+
});
110
+
}
111
+
}
112
+
113
+
println!(" Missing fields from DID document");
114
+
return Err(());
115
+
}
116
+
117
+
fn get_plc_doc(plc: &str) -> Result<DidDoc, ()> {
118
+
let res = match reqwest::blocking::get("https://plc.directory/did:plc:".to_owned() + plc) {
119
+
Ok(val) => val,
120
+
Err(_) => {
121
+
println!(" GET request failed");
122
+
return Err(());
123
+
}
124
+
};
125
+
126
+
if !res.status().is_success() {
127
+
println!(" Got non 2xx status code: {}", res.status().as_str());
128
+
129
+
return Err(());
130
+
}
131
+
132
+
return parse_doc(
133
+
"did:plc:".to_owned() + plc,
134
+
match res.text() {
135
+
Ok(val) => val,
136
+
Err(_) => {
137
+
println!(" Missing or malformed body response");
138
+
return Err(());
139
+
}
140
+
},
141
+
);
142
+
}
143
+
144
+
fn get_web_doc(web: &str) -> Result<DidDoc, ()> {
145
+
let res = match reqwest::blocking::get("https://".to_owned() + web + "/.well-known/did.json") {
146
+
Ok(val) => val,
147
+
Err(_) => {
148
+
println!(" GET request failed");
149
+
return Err(());
150
+
}
151
+
};
152
+
153
+
if !res.status().is_success() {
154
+
println!(" Got non 2xx status code: {}", res.status().as_str());
155
+
return Err(());
156
+
}
157
+
158
+
return parse_doc(
159
+
"did:web:".to_owned() + web,
160
+
match res.text() {
161
+
Ok(val) => val,
162
+
Err(_) => {
163
+
println!(" Missing or malformed body response");
164
+
return Err(());
165
+
}
166
+
},
167
+
);
168
+
}
169
+
170
+
pub fn get_did(handle: &String) -> Result<DidDoc, ()> {
171
+
println!(" Getting DID for {}", handle);
172
+
let did = if let Ok(did) = get_txt_did(&handle) {
173
+
did
174
+
} else {
175
+
if let Ok(did) = get_http_did(&handle) {
176
+
did
177
+
} else {
178
+
println!(" Could not get a DID");
179
+
return Err(());
180
+
}
181
+
};
182
+
183
+
println!(" Getting DID document for {}", did);
184
+
let did_doc = if did.starts_with("did:plc:") {
185
+
get_plc_doc(&did[8..])
186
+
} else if did.starts_with("did:web:") {
187
+
get_web_doc(&did[8..])
188
+
} else {
189
+
println!(" Could not get a DID document");
190
+
Err(())
191
+
};
192
+
193
+
return did_doc;
194
+
}
+66
src/knot.rs
+66
src/knot.rs
···
1
+
pub fn find_knot(did: &String, repo_name: &String, pds: &String) -> Result<String, ()> {
2
+
// https://docs.bsky.app/docs/api/com-atproto-repo-list-records
3
+
let mut cursor: Option<String> = None;
4
+
5
+
loop {
6
+
let url = format!(
7
+
"{0}/xrpc/com.atproto.repo.listRecords?collection=sh.tangled.repo&repo={1}&cursor={2}",
8
+
pds.clone(),
9
+
did.clone(),
10
+
cursor.clone().unwrap_or(String::new())
11
+
);
12
+
13
+
let res = match reqwest::blocking::get(url) {
14
+
Ok(val) => val,
15
+
Err(_) => {
16
+
println!(" Failed to load repos.");
17
+
return Err(());
18
+
}
19
+
};
20
+
21
+
if !res.status().is_success() {
22
+
println!(" Got non 2xx code when loading repos");
23
+
return Err(());
24
+
}
25
+
26
+
let body = match res.text() {
27
+
Ok(val) => match json::parse(&val) {
28
+
Ok(val) => val,
29
+
Err(_) => {
30
+
println!(" Invalid or malformed response response");
31
+
return Err(());
32
+
}
33
+
},
34
+
Err(_) => {
35
+
println!(" Missing body from response");
36
+
return Err(());
37
+
}
38
+
};
39
+
40
+
// must contain a records array
41
+
if !body["records"].is_array() {
42
+
println!(" Invalid or malformed response response");
43
+
return Err(());
44
+
}
45
+
for record in body["records"].members() {
46
+
if let Some(val) = record["value"]["name"].as_str()
47
+
&& val == repo_name
48
+
{
49
+
if let Some(knot) = record["value"]["knot"].as_str() {
50
+
return Ok(String::from(knot));
51
+
} else {
52
+
println!(" Repo didn't have a valid knot");
53
+
return Err(());
54
+
}
55
+
}
56
+
}
57
+
58
+
if let Some(val) = body["cursor"].as_str() {
59
+
cursor = Some(String::from(val))
60
+
} else {
61
+
break;
62
+
}
63
+
}
64
+
65
+
return Err(());
66
+
}
+82
-3
src/main.rs
+82
-3
src/main.rs
···
1
-
fn main() -> Result<(), i32> {
2
-
println!("Hello, world!");
1
+
use std::process::Command;
2
+
3
+
mod args;
4
+
mod did;
5
+
mod knot;
6
+
7
+
fn main() -> Result<(), ()> {
8
+
// load configuration
9
+
let config = match args::load_config() {
10
+
Ok(res) => res,
11
+
Err(_) => return Err(()),
12
+
};
13
+
14
+
// resolve handle to did
15
+
println!("Resolving {}", config.handle);
16
+
let did_doc = match did::get_did(&config.handle) {
17
+
Ok(res) => res,
18
+
Err(_) => return Err(()),
19
+
};
20
+
println!(
21
+
" Found DID `{0}` hosted at `{1}`",
22
+
did_doc.did, did_doc.pds
23
+
);
24
+
25
+
// resolve did+repoName to knotserver
26
+
println!("Resolving @{0}/{1}", config.handle, config.repo_name);
27
+
let knot_server = match knot::find_knot(&did_doc.did, &config.repo_name, &did_doc.pds) {
28
+
Ok(val) => val,
29
+
Err(_) => return Err(()),
30
+
};
31
+
println!(" Found knot `{}`", knot_server);
32
+
33
+
// connect to /events on knotserver
34
+
println!(
35
+
"Connecting to `{}`",
36
+
format!("wss://{}/events", knot_server)
37
+
);
38
+
39
+
match ws::connect(format!("ws://{}/events", knot_server), |_out| {
40
+
println!(" Connection successful");
41
+
|msg: ws::Message| {
42
+
// parse json
43
+
let body = match json::parse(match msg.as_text() {
44
+
Ok(val) => val,
45
+
Err(_) => return Ok(()),
46
+
}) {
47
+
Ok(val) => val,
48
+
Err(_) => {
49
+
println!(" Invalid body. Skipping message");
50
+
return Ok(());
51
+
}
52
+
};
3
53
4
-
return Ok(())
54
+
// filter by did and reponame
55
+
if let Some(repo_did) = body["event"]["repoDid"].as_str()
56
+
&& let Some(repo) = body["event"]["repoName"].as_str()
57
+
&& repo_did != &did_doc.did
58
+
&& repo != &config.repo_name
59
+
{
60
+
// repo doesnt match so skip
61
+
return Ok(());
62
+
}
63
+
64
+
println!(" Executing `/bin/sh -c {}`", &config.shell);
65
+
66
+
// exec shell command in /bin/sh
67
+
match Command::new("/bin/sh")
68
+
.arg("-c")
69
+
.arg(&config.shell)
70
+
.output()
71
+
{
72
+
Ok(val) => val,
73
+
Err(_) => return Ok(()),
74
+
};
75
+
76
+
Ok(())
77
+
}
78
+
}) {
79
+
Ok(_) => {}
80
+
Err(err) => println!(" Connection failed: {}", err),
81
+
};
82
+
83
+
return Ok(());
5
84
}