From 55572c8210aec573be559f138b74e0c541183535 Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Tue, 24 Aug 2021 12:24:22 +0200 Subject: [PATCH] [mirotalksfu] - first release --- .gitignore | 18 + .prettierrc.js | 7 + LICENSE | 661 + README.md | 87 +- api/README.md | 40 + api/meeting.js | 22 + api/meeting.php | 24 + api/meeting.py | 19 + api/meeting.sh | 9 + api/restAPI.png | Bin 0 -> 13025 bytes package.json | 29 + public/Room.html | 228 + public/css/Room.css | 575 + public/css/landing.css | 1793 +++ public/images/AGPLv3.png | Bin 0 -> 16063 bytes public/images/architecture.svg | 590 + public/images/background.jpg | Bin 0 -> 218242 bytes public/images/cta-illustration.svg | 1 + public/images/delete.png | Bin 0 -> 2137 bytes public/images/feature-icon-01.svg | 1 + public/images/feature-icon-02.svg | 1 + public/images/feature-icon-03.svg | 1 + public/images/feature-icon-04.svg | 1 + public/images/feature-icon-05.svg | 1 + public/images/feature-icon-06.svg | 1 + public/images/github.png | Bin 0 -> 3366 bytes public/images/hero-back-illustration.svg | 1 + public/images/hero-top-illustration.svg | 1 + public/images/loader.gif | Bin 0 -> 52927 bytes public/images/logo.svg | 1 + public/images/miroslav-pejic.png | Bin 0 -> 16600 bytes public/images/mirotalksfu.png | Bin 0 -> 209210 bytes public/images/pricing-illustration.svg | 1 + public/js/Room.js | 734 ++ public/js/RoomClient.js | 1369 +++ public/js/landing.js | 58 + public/js/newroom.js | 155 + public/landing.html | 246 + public/modules/MediasoupClient.js | 13394 +++++++++++++++++++++ public/modules/MediasoupClientCompile.js | 2 + public/newroom.html | 159 + public/permission.html | 139 + public/robots.txt | 3 + public/sounds/joined.wav | Bin 0 -> 42156 bytes public/sounds/left.wav | Bin 0 -> 42156 bytes public/sounds/message.wav | Bin 0 -> 387150 bytes public/sounds/open.wav | Bin 0 -> 100486 bytes public/sounds/recStart.wav | Bin 0 -> 297710 bytes public/sounds/recStop.wav | Bin 0 -> 352878 bytes src/Logger.js | 25 + src/Peer.js | 133 + src/Room.js | 203 + src/Server.js | 362 + src/ServerApi.js | 21 + src/config.template.js | 78 + ssl/README.md | 18 + ssl/cert.pem | 22 + ssl/https.png | Bin 0 -> 6356 bytes ssl/key.pem | 27 + 59 files changed, 21260 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .prettierrc.js create mode 100644 LICENSE create mode 100644 api/README.md create mode 100644 api/meeting.js create mode 100644 api/meeting.php create mode 100644 api/meeting.py create mode 100755 api/meeting.sh create mode 100644 api/restAPI.png create mode 100644 package.json create mode 100644 public/Room.html create mode 100644 public/css/Room.css create mode 100644 public/css/landing.css create mode 100644 public/images/AGPLv3.png create mode 100644 public/images/architecture.svg create mode 100644 public/images/background.jpg create mode 100644 public/images/cta-illustration.svg create mode 100644 public/images/delete.png create mode 100644 public/images/feature-icon-01.svg create mode 100644 public/images/feature-icon-02.svg create mode 100644 public/images/feature-icon-03.svg create mode 100644 public/images/feature-icon-04.svg create mode 100644 public/images/feature-icon-05.svg create mode 100644 public/images/feature-icon-06.svg create mode 100644 public/images/github.png create mode 100644 public/images/hero-back-illustration.svg create mode 100644 public/images/hero-top-illustration.svg create mode 100644 public/images/loader.gif create mode 100644 public/images/logo.svg create mode 100644 public/images/miroslav-pejic.png create mode 100644 public/images/mirotalksfu.png create mode 100644 public/images/pricing-illustration.svg create mode 100644 public/js/Room.js create mode 100644 public/js/RoomClient.js create mode 100644 public/js/landing.js create mode 100644 public/js/newroom.js create mode 100644 public/landing.html create mode 100644 public/modules/MediasoupClient.js create mode 100644 public/modules/MediasoupClientCompile.js create mode 100755 public/newroom.html create mode 100755 public/permission.html create mode 100644 public/robots.txt create mode 100644 public/sounds/joined.wav create mode 100644 public/sounds/left.wav create mode 100644 public/sounds/message.wav create mode 100644 public/sounds/open.wav create mode 100644 public/sounds/recStart.wav create mode 100644 public/sounds/recStop.wav create mode 100644 src/Logger.js create mode 100644 src/Peer.js create mode 100644 src/Room.js create mode 100644 src/Server.js create mode 100644 src/ServerApi.js create mode 100644 src/config.template.js create mode 100644 ssl/README.md create mode 100644 ssl/cert.pem create mode 100644 ssl/https.png create mode 100644 ssl/key.pem diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d93bbb1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# mac +.DS_Store + +# git folder +.git + +# npm +node_modules +npm-debug.log + +# package +package-lock.json + +# cache +.cache + +# personal config +config.js \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..c8c6a54 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + semi: true, + trailingComma: 'all', + singleQuote: true, + printWidth: 120, + tabWidth: 4, +}; diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8410c20 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ +GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/README.md b/README.md index 626eda6..c3ee892 100644 --- a/README.md +++ b/README.md @@ -1 +1,86 @@ -# mirotalksfu \ No newline at end of file +# mirotalksfu + +`Open Source WebRTC video calls, messaging and screen sharing` + +![License: AGPLv3](https://img.shields.io/badge/License-AGPLv3-blue.svg) +[![Donate](https://img.shields.io/badge/Donate-PayPal-brightgreen.svg)](https://paypal.me/MiroslavPejic?locale.x=it_IT) +[![Repo Link](https://img.shields.io/badge/Repo-Link-black.svg)](https://github.com/miroslavpejic85/mirotalk) +[![Code style: prettier](https://img.shields.io/badge/Code_style-Prettier-ff69b4.svg?)](https://github.com/prettier/prettier) + +Powered by `WebRTC` using [SFU](https://mediasoup.org) integrated server. + +![mirotalksfu](public/images/mirotalksfu.png) + +## Features + +- Is `100% Free` - `Open Source` and `Self Hosted` +- `No download`, `plug-in` or `login` required, entirely browser based +- `Unlimited` number of `conference rooms` and `users`, `without` call `time limitation` +- Desktop and Mobile compatible +- Optimized Room URL Sharing (share it to your participants, wait them to join) +- Webcam Streaming up to 4K quality (Front - Rear for mobile) +- Echo cancellation and noise suppression that makes your audio crystal clear +- Screen Sharing to present documents, slides, and more ... +- Chat with Emoji Picker to show you feeling and possibility to Save the conversations +- Select Microphone - Speaker and Video source +- Recording your Screen, Audio or Video +- Full Screen Mode on mouse click on the Video element +- Supports [REST API](api/README.md) (Application Programming Interface) + +## Quick Start + +- You will need to have `Node.js` installed, this project has been tested with Node version [12.X](https://nodejs.org/en/blog/release/v12.22.1/) and [14.X](https://nodejs.org/en/blog/release/v14.17.5/) `not` with `16.X`. + +```bash +# clone this repo +git clone https://github.com/miroslavpejic85/mirotalksfu.git + +# mirotalk dir +cd mirotalksfu + +# copy src/config.template.js src/config.js +cp src/config.template.js src/config.js + +# install dependencies +npm install + +# start the server +npm start +``` + +- Open https://localhost:3010 in browser + +--- + +## API + +The `response` will give you a `entrypoint / Room URL` for `your meeting`. + +```bash +curl -X POST "http://localhost:3010/api/v1/meeting" -H "authorization: mirotalksfu_default_secret" -H "Content-Type: application/json" +``` + +--- + +## Notes + +Run the project on a `Linux or Mac` system as the `mediasoup` installation could have issues on `Windows`. If you have a Windows system, consider to installing [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to be able to run it. + +--- + +## Credits + +- [Davide Pacilio](https://cruip.com/demos/solid/) (html template) +- [Dirk Vanbeveren](https://github.com/Dirvann) (sfu logic) +- [Mediasoup](https://mediasoup.org) (sfu server) + +--- + +## Contributing + +- Contributions are welcome and greatly appreciated! +- Just run before `npm run lint` + +## License + +[![AGPLv3](public/images/AGPLv3.png)](LICENSE) diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..d5b890f --- /dev/null +++ b/api/README.md @@ -0,0 +1,40 @@ +![restAPI](restAPI.png) + +## Create a meeting + +Create a meeting with a `HTTP request` containing the `API_KEY` sent to MiroTalk’s server. The response contains a `meeting` URL that can be `embedded` in your client within an `iframe`. + +```bash +# js +node meeting.js +# php +php meeting.php +# python +python meeting.py +# bash +./meeting.sh +``` + +## Embed a meeting + +Embedding a meeting into a `service` or `app` requires using an `iframe` with the `src` attribute specified as the `meeting` from `HTTP response`. + +```html + +``` + +## Fast Integration + +Develop your `website` or `application`, and bring `video meetings` in with a simple `iframe`. + +```html + +``` diff --git a/api/meeting.js b/api/meeting.js new file mode 100644 index 0000000..0699341 --- /dev/null +++ b/api/meeting.js @@ -0,0 +1,22 @@ +'use strict'; + +const fetch = require('node-fetch'); + +const API_KEY = 'mirotalksfu_default_secret'; +const MIROTALK_URL = 'http://localhost:3010/api/v1/meeting'; + +function getResponse() { + return fetch(MIROTALK_URL, { + method: 'POST', + headers: { + authorization: API_KEY, + 'Content-Type': 'application/json', + }, + }); +} + +getResponse().then(async (res) => { + console.log('Status code:', res.status); + const data = await res.json(); + console.log('meeting:', data.meeting); +}); diff --git a/api/meeting.php b/api/meeting.php new file mode 100644 index 0000000..56fff7a --- /dev/null +++ b/api/meeting.php @@ -0,0 +1,24 @@ +{'meeting'}, "\n"; diff --git a/api/meeting.py b/api/meeting.py new file mode 100644 index 0000000..a926816 --- /dev/null +++ b/api/meeting.py @@ -0,0 +1,19 @@ +import requests +import json + +API_KEY = "mirotalksfu_default_secret" +MIROTALK_URL = "http://localhost:3010/api/v1/meeting" + +headers = { + "authorization": API_KEY, + "Content-Type": "application/json", +} + +response = requests.post( + MIROTALK_URL, + headers=headers +) + +print("Status code:", response.status_code) +data = json.loads(response.text) +print("meeting:", data["meeting"]) diff --git a/api/meeting.sh b/api/meeting.sh new file mode 100755 index 0000000..96ebe65 --- /dev/null +++ b/api/meeting.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +API_KEY="mirotalksfu_default_secret" +MIROTALK_URL="http://localhost:3010/api/v1/meeting" + +curl $MIROTALK_URL \ + --header "authorization: $API_KEY" \ + --header "Content-Type: application/json" \ + --request POST \ No newline at end of file diff --git a/api/restAPI.png b/api/restAPI.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3f219f2d26ffe035b2fa2f3535e4450faeb403 GIT binary patch literal 13025 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..9ae271b --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "mirotalksfu", + "version": "1.0.0", + "description": "WebRTC SFU browser-based video calls", + "main": "Server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node src/Server.js", + "compile": "npx browserify public/modules/MediasoupClientCompile.js -o public/modules/MediasoupClient.js", + "lint": "npx prettier --write ." + }, + "author": "Miroslav Pejic", + "license": "AGPLv3", + "dependencies": { + "compression": "^1.7.4", + "cors": "^2.8.5", + "express": "^4.17.1", + "httpolyglot": "^0.1.2", + "mediasoup": "^3.8.3", + "mediasoup-client": "^3.6.37", + "ngrok": "^4.0.1", + "socket.io": "^4.1.3", + "uuid": "8.3.2" + }, + "devDependencies": { + "node-fetch": "^2.6.1", + "prettier": "2.3.2" + } +} diff --git a/public/Room.html b/public/Room.html new file mode 100644 index 0000000..3903338 --- /dev/null +++ b/public/Room.html @@ -0,0 +1,228 @@ + + + + + + MiroTalk SFU - Room Video Calls, Messaging and Screen Sharing. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+
Chat
+
+ + + +
+
+
+
+
+
+
+
Participant
+
00:00:00
+
+
Public message example
+
+
+
+
+
+
+
You
+
00:00:00
+
+
Public message example
+
+
+
+
+ + + +
+ +
+
+ + diff --git a/public/css/Room.css b/public/css/Room.css new file mode 100644 index 0000000..d5ff355 --- /dev/null +++ b/public/css/Room.css @@ -0,0 +1,575 @@ +/*-------------------------------------------------------------- +# Keyframes +--------------------------------------------------------------*/ + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-moz-keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +:root { + --msger-top: 50%; + --msger-left: 50%; + --msger-height: 680px; + --msger-width: 420px; + --msger-bg: #16171b; + --left-msg-bg: #222328; + --right-msg-bg: #0a0b0c; + --box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); +} + +* { + outline: none; + font-family: 'Verdana'; +} + +body { + background-image: url('../images/background.jpg'); + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; +} + +/*-------------------------------------------------------------- +# Control buttons +--------------------------------------------------------------*/ + +#control { + z-index: 1; + position: fixed; + padding: 10px; + top: 0; + width: 100%; + background: black; +} + +#control button { + border-radius: 5px; +} +#control p { + font-size: small; + cursor: default; +} + +/*-------------------------------------------------------------- +# Room QR +--------------------------------------------------------------*/ + +#qrRoomContainer { + display: flex; + justify-content: center; + align-items: center; +} + +/*-------------------------------------------------------------- +# Video grid +--------------------------------------------------------------*/ + +.containers { + display: grid; + grid-template-columns: repeat(2, 1fr); + column-gap: 10px; + row-gap: 10px; + border-radius: 5px; +} + +@media only screen and (max-width: 720px) { + .containers { + display: grid; + grid-template-columns: 1fr; + column-gap: 10px; + row-gap: 10px; + border-radius: 5px; + } +} + +.vid { + flex: 0 1 auto; + height: 360px; + border-radius: 10px; + cursor: pointer; +} + +video { + width: 100%; + height: 100%; + object-fit: cover; + box-shadow: var(--box-shadow); +} + +video:hover { + opacity: 0.9; +} + +video:fullscreen { + object-fit: contain; /* cover; */ + opacity: 1; +} + +.mirror { + -webkit-transform: rotateY(180deg); + -moz-transform: rotateY(180deg); + transform: rotateY(180deg); +} + +#videoMedia { + margin-top: 50px; +} + +#localMedia, +#remoteVideos { + margin: 10px; + cursor: default; +} + +.pn { + position: absolute; + display: flex; + align-items: center; + padding: 10px; + margin: 10px; + width: auto; + height: 30px; + border-radius: 5px; + margin-top: 325px; + color: white; + background: rgba(0, 0, 0, 0.7); +} + +.d, +.d video { + position: relative; +} + +.d p { + position: absolute; + padding: 10px; + margin: 10px; + width: auto; + height: 30px; + border-radius: 5px; + top: 315px; + color: white; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; +} + +/*-------------------------------------------------------------- +# Dropdown menù +--------------------------------------------------------------*/ + +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-content { + z-index: 2; + display: none; + position: absolute; + margin: auto; + padding: 10px; + min-width: 200px; + background-color: rgba(0, 0, 0, 0.7); + color: white; + overflow: auto; + border-radius: 5px; + box-shadow: var(--box-shadow); +} + +.dropdown-content select { + width: auto; + font-size: small; +} + +/*-------------------------------------------------------------- +# Recording +--------------------------------------------------------------*/ + +.recording { + display: flex; +} + +.recording button, +.recording p { + padding: 5px; + margin: 1px; + font-size: 0.8em; + border-radius: 5px; +} + +/*-------------------------------------------------------------- +# Chat Room +--------------------------------------------------------------*/ + +.chat-room { + z-index: 3; + display: none; + position: fixed; + height: var(--msger-height); + width: var(--msger-width); + background: var(--msger-bg); + border-radius: 5px; + border-radius: 10px; + box-shadow: var(--box-shadow); + overflow: hidden; +} + +.msger { + display: flex; + flex-flow: column wrap; + justify-content: space-between; + top: var(--msger-top); + left: var(--msger-left); + height: var(--msger-height); + width: var(--msger-width); + background: var(--msger-bg); +} + +/*-------------------------------------------------------------- +# Chat room header +--------------------------------------------------------------*/ + +.chat-header { + display: flex; + justify-content: space-between; + padding: 10px; + background: rgb(0, 0, 0); + color: #666; + cursor: move; +} + +.chat-header-options button { + border: none; + font-size: 1.2rem; + transition: all 0.3s ease-in-out; + background: rgb(0, 0, 0); + color: #fff; + border-radius: 5px; + transition: background 0.23s; +} + +/*-------------------------------------------------------------- +# Chat room output area +--------------------------------------------------------------*/ + +.chat-msger { + flex: 1; + overflow-y: auto; + padding: 10px; + background: var(--msger-bg); +} + +.chat-msger::-webkit-scrollbar { + width: 5px; +} + +.chat-msger::-webkit-scrollbar-track { + background: transparent; +} + +.chat-msger::-webkit-scrollbar-thumb { + background: black; + /*aqua;*/ +} + +.msg { + display: flex; + align-items: flex-end; + margin-bottom: 10px; +} + +.msg:last-of-type { + margin: 0; +} + +/*-------------------------------------------------------------- +# Chat room left side +--------------------------------------------------------------*/ + +.left-msg .msg-bubble { + background: var(--left-msg-bg); + border-bottom-left-radius: 0; + color: #fff; +} + +.left-msg .private-msg-bubble { + background: var(--private-msg-bg); + border-bottom-left-radius: 0; + color: #fff; +} + +/*-------------------------------------------------------------- +# Chat room right side +--------------------------------------------------------------*/ + +.right-msg { + flex-direction: row-reverse; +} + +.right-msg .msg-bubble { + background: var(--right-msg-bg); + border-bottom-right-radius: 0; + color: #fff; +} + +.right-msg .private-msg-bubble { + background: var(--private-msg-bg); + border-bottom-right-radius: 0; + color: #fff; +} + +.right-msg .msg-img { + margin: 0 0 0 10px; +} + +/*-------------------------------------------------------------- +# Chat room common +--------------------------------------------------------------*/ + +.msg-img { + width: 50px; + height: 50px; + margin-right: 10px; + background-repeat: no-repeat; + background-position: center; + background-size: cover; +} + +.msg-bubble { + max-width: 200px; + padding: 15px; + border-radius: 15px; +} + +.msg-info { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; +} + +.msg-info-name { + margin-right: 10px; + font-weight: bold; +} + +.msg-info-time { + font-size: 0.85em; +} + +.msg-text { + overflow-wrap: break-word; + word-wrap: break-word; + hyphens: auto; +} + +#chat-msg-a { + color: white; +} + +/*-------------------------------------------------------------- +# Chat room input area +--------------------------------------------------------------*/ + +.chat-msger-inputarea { + display: flex; + padding: 10px; + background: #222328; +} + +.chat-msger-input { + flex: 1; + padding: 10px; + border: none; + border-top-left-radius: 10px; + background: rgb(0, 0, 0); + color: white; +} + +.chat-msger-inputarea button { + width: 32px; +} + +/*-------------------------------------------------------------- +# Chat room emoji picker +--------------------------------------------------------------*/ + +emoji-picker { + top: 0px; + position: absolute; + width: 100%; + height: 100%; + --background: #16171b; + --num-columns: 9; + --emoji-size: 1.5rem; + overflow: hidden; +} + +/*-------------------------------------------------------------- +# swal2 +--------------------------------------------------------------*/ + +.swal2-validation-message, +.swal2-title, +.swal2-content, +.swal2-input { + text-align: center; + color: white !important; + background-color: transparent !important; +} + +/*-------------------------------------------------------------- +# About +--------------------------------------------------------------*/ + +#about { + cursor: default; +} + +#about b { + color: rgb(0, 180, 50); +} + +#about img { + cursor: pointer; + border-radius: 10px; +} + +#about a { + color: white; + text-decoration: none; +} + +#about a:hover { + color: rgb(0, 180, 50); + transition: all 0.3s ease-in-out; +} + +#about button { + border: none; + width: 170px; + height: 40px; + font-size: 1.2rem; + background: linear-gradient(100deg, #376df9 0, #4b4547 75%, #222222 100%); + box-shadow: 0 0 6px 0 rgb(251 255 0 / 82%); + color: #ffffff; + transition: background 0.23s; + cursor: pointer; +} + +#about button:hover { + font-weight: bold; +} + +/*-------------------------------------------------------------- +# Common +--------------------------------------------------------------*/ + +.hidden { + display: none; +} + +.show { + display: block; +} + +.center { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.fadein { + -webkit-animation: fadeIn ease-in 1; + -moz-animation: fadeIn ease-in 1; + animation: fadeIn ease-in 1; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + animation-duration: 1s; +} + +p, +button { + background: black; + color: white; + border: none; +} + +button:hover { + color: rgb(0, 180, 50); +} + +/*-------------------------------------------------------------- +# Pulse class effect +--------------------------------------------------------------*/ + +.pulsate { + animation: pulsate 3s ease-out; + animation-iteration-count: infinite; + -webkit-animation: pulsate 3s ease-out; + -webkit-animation-iteration-count: infinite; + opacity: 0.5; +} + +@-webkit-keyframes pulsate { + 0% { + opacity: 0.5; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.5; + } +} + +@keyframes pulsate { + 0% { + opacity: 0.5; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.5; + } +} + +@-webkit-keyframes pulsate { + 0% { + opacity: 0.5; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.5; + } +} diff --git a/public/css/landing.css b/public/css/landing.css new file mode 100644 index 0000000..2b418c0 --- /dev/null +++ b/public/css/landing.css @@ -0,0 +1,1793 @@ +html { + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +footer, +header, +nav, +section { + display: block; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +figcaption, +figure, +main { + display: block; +} +figure { + margin: 1em 40px; +} +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} +pre { + font-family: monospace, monospace; + font-size: 1em; +} +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} +b, +strong { + font-weight: inherit; +} +b, +strong { + font-weight: bolder; +} +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +dfn { + font-style: italic; +} +mark { + background-color: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +audio, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +img { + border-style: none; +} +svg:not(:root) { + overflow: hidden; +} +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html [type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; +} +button:-moz-focusring, +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + padding: 0.35em 0.75em 0.625em; +} +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +progress { + display: inline-block; + vertical-align: baseline; +} +textarea { + overflow: auto; +} +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; + padding: 0; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +details, +menu { + display: block; +} +summary { + display: list-item; +} +canvas { + display: inline-block; +} +template { + display: none; +} +[hidden] { + display: none; +} +html { + box-sizing: border-box; +} +*, +*:before, +*:after { + box-sizing: inherit; +} +body { + background: #1d2026; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} +hr { + border: 0; + display: block; + height: 1px; + background: #242830; + margin-top: 24px; + margin-bottom: 24px; +} +ul, +ol { + margin-top: 0; + margin-bottom: 24px; + padding-left: 24px; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li > ul, +li > ol { + margin-bottom: 0; +} +dl { + margin-top: 0; + margin-bottom: 24px; +} +dt { + font-weight: 600; +} +dd { + margin-left: 24px; + margin-bottom: 24px; +} +img { + height: auto; + max-width: 100%; + vertical-align: middle; +} +figure { + margin: 24px 0; +} +figcaption { + font-size: 16px; + line-height: 24px; + padding: 8px 0; +} +img, +svg { + display: block; +} +table { + border-collapse: collapse; + margin-bottom: 24px; + width: 100%; +} +tr { + border-bottom: 1px solid #242830; +} +th { + text-align: left; +} +th, +td { + padding: 10px 16px; +} +th:first-child, +td:first-child { + padding-left: 0; +} +th:last-child, +td:last-child { + padding-right: 0; +} +html { + font-size: 20px; + line-height: 30px; +} +body { + color: #8a94a7; + font-size: 1rem; +} +body, +button, +input, +select, +textarea { + font-family: 'IBM Plex Sans', sans-serif; +} +a { + color: #8a94a7; + text-decoration: underline; +} +a:hover, +a:active { + outline: 0; + text-decoration: none; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + clear: both; + color: #fff; + font-weight: 600; +} +h1, +.h1 { + font-size: 38px; + line-height: 48px; + letter-spacing: 0px; +} +@media (min-width: 641px) { + h1, + .h1 { + font-size: 44px; + line-height: 54px; + letter-spacing: 0px; + } +} +h2, +.h2 { + font-size: 32px; + line-height: 42px; + letter-spacing: 0px; +} +@media (min-width: 641px) { + h2, + .h2 { + font-size: 38px; + line-height: 48px; + letter-spacing: 0px; + } +} +h3, +.h3, +blockquote { + font-size: 24px; + line-height: 34px; + letter-spacing: 0px; +} +@media (min-width: 641px) { + h3, + .h3, + blockquote { + font-size: 32px; + line-height: 42px; + letter-spacing: 0px; + } +} +h4, +h5, +h6, +.h4, +.h5, +.h6 { + font-size: 20px; + line-height: 30px; + letter-spacing: -0.1px; +} +@media (min-width: 641px) { + h4, + h5, + h6, + .h4, + .h5, + .h6 { + font-size: 24px; + line-height: 34px; + letter-spacing: 0px; + } +} +@media (max-width: 640px) { + .h1-mobile { + font-size: 38px; + line-height: 48px; + letter-spacing: 0px; + } + .h2-mobile { + font-size: 32px; + line-height: 42px; + letter-spacing: 0px; + } + .h3-mobile { + font-size: 24px; + line-height: 34px; + letter-spacing: 0px; + } + .h4-mobile, + .h5-mobile, + .h6-mobile { + font-size: 20px; + line-height: 30px; + letter-spacing: -0.1px; + } +} +.text-light h1, +.text-light h2, +.text-light h3, +.text-light h4, +.text-light h5, +.text-light h6, +.text-light .h1, +.text-light .h2, +.text-light .h3, +.text-light .h4, +.text-light .h5, +.text-light .h6 { + color: !important; +} +.text-sm { + font-size: 18px; + line-height: 28px; + letter-spacing: -0.1px; +} +.text-xs { + font-size: 16px; + line-height: 24px; + letter-spacing: -0.1px; +} +h1, +h2, +.h1, +.h2 { + margin-top: 48px; + margin-bottom: 16px; +} +h3, +.h3 { + margin-top: 36px; + margin-bottom: 12px; +} +h4, +h5, +h6, +.h4, +.h5, +.h6 { + margin-top: 24px; + margin-bottom: 4px; +} +p { + margin-top: 0; + margin-bottom: 24px; +} +dfn, +cite, +em, +i { + font-style: italic; +} +blockquote { + color: #3b404c; + font-style: italic; + margin-top: 24px; + margin-bottom: 24px; + margin-left: 24px; +} +blockquote::before { + content: '\201C'; +} +blockquote::after { + content: '\201D'; +} +blockquote p { + display: inline; +} +address { + color: #8a94a7; + border-width: 1px 0; + border-style: solid; + border-color: #242830; + padding: 24px 0; + margin: 0 0 24px; +} +pre, +pre h1, +pre h2, +pre h3, +pre h4, +pre h5, +pre h6, +pre .h1, +pre .h2, +pre .h3, +pre .h4, +pre .h5, +pre .h6 { + font-family: 'Courier 10 Pitch', Courier, monospace; +} +pre, +code, +kbd, +tt, +var { + background: #1d2026; +} +pre { + font-size: 16px; + line-height: 24px; + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 24px; + margin-top: 24px; + margin-bottom: 24px; +} +code, +kbd, +tt, +var { + font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; + font-size: 16px; + padding: 2px 4px; +} +abbr, +acronym { + cursor: help; +} +mark, +ins { + text-decoration: none; +} +small { + font-size: 18px; + line-height: 28px; + letter-spacing: -0.1px; +} +b, +strong { + font-weight: 600; +} +button, +input, +select, +textarea, +label { + font-size: 20px; + line-height: 30px; +} +.container, +.container-sm { + width: 100%; + margin: 0 auto; + padding-left: 16px; + padding-right: 16px; +} +@media (min-width: 481px) { + .container, + .container-sm { + padding-left: 24px; + padding-right: 24px; + } +} +.container { + max-width: 1128px; +} +.container-sm { + max-width: 848px; +} +.container .container-sm { + max-width: 800px; + padding-left: 0; + padding-right: 0; +} +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; + word-wrap: normal !important; +} +.screen-reader-text:focus { + border-radius: 2px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + display: block; + font-size: 14px; + letter-spacing: 0px; + font-weight: 600; + line-height: 16px; + text-decoration: none; + text-transform: uppercase; + background-color: #1d2026; + color: #0270d7 !important; + border: none; + height: auto; + left: 8px; + padding: 16px 32px; + top: 8px; + width: auto; + z-index: 100000; +} +.list-reset { + list-style: none; + padding: 0; +} +.text-left { + text-align: left; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +.text-primary { + color: #0270d7; +} +.has-top-divider { + position: relative; +} +.has-top-divider::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + display: block; + height: 1px; + background: #242830; +} +.has-bottom-divider { + position: relative; +} +.has-bottom-divider::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + display: block; + height: 1px; + background: #242830; +} +.m-0 { + margin: 0; +} +.mt-0 { + margin-top: 0; +} +.mr-0 { + margin-right: 0; +} +.mb-0 { + margin-bottom: 0; +} +.ml-0 { + margin-left: 0; +} +.m-8 { + margin: 8px; +} +.mt-8 { + margin-top: 8px; +} +.mr-8 { + margin-right: 8px; +} +.mb-8 { + margin-bottom: 8px; +} +.ml-8 { + margin-left: 8px; +} +.m-16 { + margin: 16px; +} +.mt-16 { + margin-top: 16px; +} +.mr-16 { + margin-right: 16px; +} +.mb-16 { + margin-bottom: 16px; +} +.ml-16 { + margin-left: 16px; +} +.m-24 { + margin: 24px; +} +.mt-24 { + margin-top: 24px; +} +.mr-24 { + margin-right: 24px; +} +.mb-24 { + margin-bottom: 24px; +} +.ml-24 { + margin-left: 24px; +} +.m-32 { + margin: 32px; +} +.mt-32 { + margin-top: 32px; +} +.mr-32 { + margin-right: 32px; +} +.mb-32 { + margin-bottom: 32px; +} +.ml-32 { + margin-left: 32px; +} +.m-40 { + margin: 40px; +} +.mt-40 { + margin-top: 40px; +} +.mr-40 { + margin-right: 40px; +} +.mb-40 { + margin-bottom: 40px; +} +.ml-40 { + margin-left: 40px; +} +.m-48 { + margin: 48px; +} +.mt-48 { + margin-top: 48px; +} +.mr-48 { + margin-right: 48px; +} +.mb-48 { + margin-bottom: 48px; +} +.ml-48 { + margin-left: 48px; +} +.m-56 { + margin: 56px; +} +.mt-56 { + margin-top: 56px; +} +.mr-56 { + margin-right: 56px; +} +.mb-56 { + margin-bottom: 56px; +} +.ml-56 { + margin-left: 56px; +} +.m-64 { + margin: 64px; +} +.mt-64 { + margin-top: 64px; +} +.mr-64 { + margin-right: 64px; +} +.mb-64 { + margin-bottom: 64px; +} +.ml-64 { + margin-left: 64px; +} +.p-0 { + padding: 0; +} +.pt-0 { + padding-top: 0; +} +.pr-0 { + padding-right: 0; +} +.pb-0 { + padding-bottom: 0; +} +.pl-0 { + padding-left: 0; +} +.p-8 { + padding: 8px; +} +.pt-8 { + padding-top: 8px; +} +.pr-8 { + padding-right: 8px; +} +.pb-8 { + padding-bottom: 8px; +} +.pl-8 { + padding-left: 8px; +} +.p-16 { + padding: 16px; +} +.pt-16 { + padding-top: 16px; +} +.pr-16 { + padding-right: 16px; +} +.pb-16 { + padding-bottom: 16px; +} +.pl-16 { + padding-left: 16px; +} +.p-24 { + padding: 24px; +} +.pt-24 { + padding-top: 24px; +} +.pr-24 { + padding-right: 24px; +} +.pb-24 { + padding-bottom: 24px; +} +.pl-24 { + padding-left: 24px; +} +.p-32 { + padding: 32px; +} +.pt-32 { + padding-top: 32px; +} +.pr-32 { + padding-right: 32px; +} +.pb-32 { + padding-bottom: 32px; +} +.pl-32 { + padding-left: 32px; +} +.p-40 { + padding: 40px; +} +.pt-40 { + padding-top: 40px; +} +.pr-40 { + padding-right: 40px; +} +.pb-40 { + padding-bottom: 40px; +} +.pl-40 { + padding-left: 40px; +} +.p-48 { + padding: 48px; +} +.pt-48 { + padding-top: 48px; +} +.pr-48 { + padding-right: 48px; +} +.pb-48 { + padding-bottom: 48px; +} +.pl-48 { + padding-left: 48px; +} +.p-56 { + padding: 56px; +} +.pt-56 { + padding-top: 56px; +} +.pr-56 { + padding-right: 56px; +} +.pb-56 { + padding-bottom: 56px; +} +.pl-56 { + padding-left: 56px; +} +.p-64 { + padding: 64px; +} +.pt-64 { + padding-top: 64px; +} +.pr-64 { + padding-right: 64px; +} +.pb-64 { + padding-bottom: 64px; +} +.pl-64 { + padding-left: 64px; +} +.sr .has-animations .is-revealing { + visibility: hidden; +} +.has-animations .anime-element { + visibility: hidden; +} +.anime-ready .has-animations .anime-element { + visibility: visible; +} +.input, +.textarea { + background-color: #fff; + border-width: 1px; + border-style: solid; + border-color: #242830; + border-radius: 2px; + color: #8a94a7; + max-width: 100%; + width: 100%; +} +.input::-webkit-input-placeholder, +.textarea::-webkit-input-placeholder { + color: #3b404c; +} +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder { + color: #3b404c; +} +.input::-ms-input-placeholder, +.textarea::-ms-input-placeholder { + color: #3b404c; +} +.input::placeholder, +.textarea::placeholder { + color: #3b404c; +} +.input::-ms-input-placeholder, +.textarea::-ms-input-placeholder { + color: #3b404c; +} +.input:-ms-input-placeholder, +.textarea:-ms-input-placeholder { + color: #3b404c; +} +.input:hover, +.textarea:hover { + border-color: #191c21; +} +.input:active, +.input:focus, +.textarea:active, +.textarea:focus { + outline: none; + border-color: #242830; +} +.input[disabled], +.textarea[disabled] { + cursor: not-allowed; + background-color: #1d2026; + border-color: #1d2026; +} +.input { + -moz-appearance: none; + -webkit-appearance: none; + font-size: 16px; + letter-spacing: -0.1px; + line-height: 20px; + padding: 13px 16px; + height: 48px; + box-shadow: none; +} +.input .inline-input { + display: inline; + width: auto; +} +.textarea { + display: block; + min-width: 100%; + resize: vertical; +} +.textarea .inline-textarea { + display: inline; + width: auto; +} +.field-grouped > .control:not(:last-child) { + margin-bottom: 8px; +} +@media (min-width: 641px) { + .field-grouped { + display: flex; + } + .field-grouped > .control { + flex-shrink: 0; + } + .field-grouped > .control.control-expanded { + flex-grow: 1; + flex-shrink: 1; + } + .field-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 8px; + } +} +.button { + display: inline-flex; + font-size: 14px; + letter-spacing: 0px; + font-weight: 600; + line-height: 16px; + text-decoration: none !important; + text-transform: uppercase; + background-color: #242830; + color: #fff !important; + border: none; + border-radius: 2px; + cursor: pointer; + justify-content: center; + padding: 16px 32px; + height: 48px; + text-align: center; + white-space: nowrap; +} +.button:hover { + background: #262a33; +} +.button:active { + outline: 0; +} +.button::before { + border-radius: 2px; +} +.button-sm { + padding: 8px 24px; + height: 32px; +} +.button-primary { + background: #097dea; + background: linear-gradient(65deg, #0270d7 0, #0f8afd 100%); +} +.button-primary:hover { + background: #0982f4; + background: linear-gradient(65deg, #0275e1 0, #198ffd 100%); +} +.button-block { + display: flex; +} +.button-block { + display: flex; + width: 100%; +} +@media (max-width: 640px) { + .button-wide-mobile { + width: 100%; + max-width: 280px; + } +} +.site-header { + padding: 24px 0; +} +.site-header-inner { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; +} +.header-links { + display: inline-flex; +} +.header-links li { + display: inline-flex; +} +.header-links a:not(.button) { + font-size: 16px; + line-height: 24px; + letter-spacing: -0.1px; + font-weight: 600; + color: #8a94a7; + text-transform: uppercase; + text-decoration: none; + line-height: 16px; + padding: 8px 24px; +} +@media (min-width: 641px) { + .site-header { + position: relative; + } + .site-header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 700px; + background: #242830; + background: linear-gradient(80deg, rgba(36, 40, 48, 0.5) 0%, rgba(36, 40, 48, 0) 100%); + -webkit-transform-origin: 0; + transform-origin: 0; + -webkit-transform: skewY(-12deg); + transform: skewY(-12deg); + } +} +.hero { + text-align: center; + padding-top: 48px; + padding-bottom: 88px; +} +.hero-copy { + position: relative; + z-index: 1; +} +.hero-cta { + margin-bottom: 40px; +} +.hero-figure { + position: relative; +} +.hero-figure svg { + width: 100%; + height: auto; +} +.hero-figure::before, +.hero-figure::after { + content: ''; + position: absolute; + background-repeat: no-repeat; + background-size: 100%; +} +.has-animations .hero-figure::before, +.has-animations .hero-figure::after { + opacity: 0; + transition: opacity 2s ease; +} +.anime-ready .has-animations .hero-figure::before, +.anime-ready .has-animations .hero-figure::after { + opacity: 1; +} +.hero-figure::before { + top: -57.8%; + left: -1.3%; + width: 152.84%; + height: 178.78%; + background-image: url('../images/hero-back-illustration.svg'); +} +.hero-figure::after { + top: -35.6%; + left: 99.6%; + width: 57.2%; + height: 87.88%; + background-image: url('../images/hero-top-illustration.svg'); +} +.hero-figure-box { + position: absolute; + top: 0; + will-change: transform; +} +.hero-figure-box-01, +.hero-figure-box-02, +.hero-figure-box-03, +.hero-figure-box-04, +.hero-figure-box-08, +.hero-figure-box-09 { + overflow: hidden; +} +.hero-figure-box-01::before, +.hero-figure-box-02::before, +.hero-figure-box-03::before, +.hero-figure-box-04::before, +.hero-figure-box-08::before, +.hero-figure-box-09::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} +.hero-figure-box-01 { + left: 103.2%; + top: 41.9%; + width: 28.03%; + height: 37.37%; + background: linear-gradient(to left top, #00bffb, rgba(0, 191, 251, 0)); + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} +.hero-figure-box-01::before { + background: linear-gradient(to left, #15181d 0%, rgba(21, 24, 29, 0) 60%); + -webkit-transform: rotateZ(45deg) scale(1.5); + transform: rotateZ(45deg) scale(1.5); +} +.hero-figure-box-02 { + left: 61.3%; + top: 64.1%; + width: 37.87%; + height: 50.5%; + background: linear-gradient(to left top, #0270d7, rgba(2, 112, 215, 0)); + -webkit-transform: rotateZ(-45deg); + transform: rotateZ(-45deg); +} +.hero-figure-box-02::before { + background: linear-gradient(to top, #15181d 0%, rgba(21, 24, 29, 0) 60%); + -webkit-transform: rotateZ(-45deg) scale(1.5); + transform: rotateZ(-45deg) scale(1.5); +} +.hero-figure-box-03 { + left: 87.7%; + top: -56.8%; + width: 56.81%; + height: 75.75%; + background: linear-gradient(to left top, #00bffb, rgba(0, 191, 251, 0)); +} +.hero-figure-box-03::before { + background: linear-gradient(to left, #15181d 0%, rgba(21, 24, 29, 0) 60%); + -webkit-transform: rotateZ(45deg) scale(1.5); + transform: rotateZ(45deg) scale(1.5); +} +.hero-figure-box-04 { + left: 54.9%; + top: -8%; + width: 45.45%; + height: 60.6%; + background: linear-gradient(to left top, #0270d7, rgba(2, 112, 215, 0)); + -webkit-transform: rotateZ(-135deg); + transform: rotateZ(-135deg); +} +.hero-figure-box-04::before { + background: linear-gradient(to top, rgba(255, 255, 255, 0.24) 0%, rgba(255, 255, 255, 0) 60%); + -webkit-transform: rotateZ(-45deg) scale(1.5); + transform: rotateZ(-45deg) scale(1.5); +} +.hero-figure-box-05, +.hero-figure-box-06, +.hero-figure-box-07 { + background-color: #242830; + box-shadow: -20px 32px 64px rgba(0, 0, 0, 0.25); +} +.hero-figure-box-05 { + left: 17.4%; + top: 13.3%; + width: 64%; + height: 73.7%; + -webkit-transform: perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg); + transform: perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg); +} +.hero-figure-box-06 { + left: 65.5%; + top: 6.3%; + width: 30.3%; + height: 40.4%; + -webkit-transform: rotateZ(20deg); + transform: rotateZ(20deg); +} +.hero-figure-box-07 { + left: 1.9%; + top: 42.4%; + width: 12.12%; + height: 16.16%; + -webkit-transform: rotateZ(20deg); + transform: rotateZ(20deg); +} +.hero-figure-box-08 { + left: 27.1%; + top: 81.6%; + width: 19.51%; + height: 26.01%; + background: #0270d7; + -webkit-transform: rotateZ(-22deg); + transform: rotateZ(-22deg); +} +.hero-figure-box-08::before { + background: linear-gradient(to left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.48) 100%); + -webkit-transform: rotateZ(45deg) scale(1.5); + transform: rotateZ(45deg) scale(1.5); +} +.hero-figure-box-09 { + left: 42.6%; + top: -17.9%; + width: 6.63%; + height: 8.83%; + background: #00bffb; + -webkit-transform: rotateZ(-52deg); + transform: rotateZ(-52deg); +} +.hero-figure-box-09::before { + background: linear-gradient(to left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.64) 100%); + -webkit-transform: rotateZ(45deg) scale(1.5); + transform: rotateZ(45deg) scale(1.5); +} +.hero-figure-box-10 { + left: -3.8%; + top: 4.3%; + width: 3.03%; + height: 4.04%; + background: rgba(0, 191, 251, 0.32); + -webkit-transform: rotateZ(-50deg); + transform: rotateZ(-50deg); +} +@media (max-width: 640px) { + .hero-cta { + max-width: 280px; + margin-left: auto; + margin-right: auto; + } + .hero-cta .button { + display: flex; + } + .hero-cta .button + .button { + margin-top: 16px; + } + .hero-figure::after, + .hero-figure-box-03, + .hero-figure-box-04, + .hero-figure-box-09 { + display: none; + } +} +@media (min-width: 641px) { + .hero { + text-align: left; + padding-top: 64px; + padding-bottom: 88px; + } + .hero-inner { + display: flex; + justify-content: space-between; + align-items: center; + } + .hero-copy { + padding-right: 64px; + min-width: 552px; + width: 552px; + } + .hero-cta { + margin: 0; + } + .hero-cta .button { + min-width: 170px; + } + .hero-cta .button:first-child { + margin-right: 16px; + } + .hero-figure svg { + width: auto; + } +} +.features-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + margin-right: -32px; + margin-left: -32px; +} +.features-wrap:first-of-type { + margin-top: -16px; +} +.features-wrap:last-of-type { + margin-bottom: -16px; +} +.feature { + padding: 16px 32px; + width: 380px; + max-width: 380px; + flex-grow: 1; +} +.feature-inner { + height: 100%; +} +.feature-icon { + display: flex; + justify-content: center; +} +@media (min-width: 641px) { + .features-wrap:first-of-type { + margin-top: -24px; + } + .features-wrap:last-of-type { + margin-bottom: -24px; + } + .feature { + padding: 32px 32px; + } +} +.pricing-header { + margin-bottom: 48px; +} +.pricing-tables-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin-right: -12px; + margin-left: -12px; +} +.pricing-tables-wrap:first-child { + margin-top: -12px; +} +.pricing-tables-wrap:last-child { + margin-bottom: -12px; +} +.pricing-table { + position: relative; + padding: 12px; + width: 368px; + max-width: 368px; + flex-grow: 1; +} +.pricing-table::before { + content: ''; + position: absolute; + left: 50%; + width: 200%; + max-width: 200%; + height: 435px; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + bottom: 18.8%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + background-image: url('../images/pricing-illustration.svg'); +} +.pricing-table-header, +.pricing-table-features-title, +.pricing-table-features li { + border-bottom: 1px solid rgba(138, 148, 167, 0.24); +} +.pricing-table-inner { + position: relative; + display: flex; + flex-wrap: wrap; + background: #2c3039; + padding: 24px; + height: 100%; +} +.pricing-table-inner > * { + position: relative; + width: 100%; +} +.pricing-table-inner::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-shadow: 0 24px 48px rgba(21, 24, 29, 0.24); + mix-blend-mode: multiply; +} +.pricing-table-price-currency { + color: #8a94a7; +} +.pricing-table-features-title { + color: #fff; + font-weight: 700; +} +.pricing-table-features li { + display: flex; + align-items: center; + padding: 14px 0; +} +.pricing-table-features li::before { + content: ''; + width: 16px; + height: 12px; + margin-right: 16px; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUuNiA2LjRMMS42IDQgMCA1LjYgNS42IDEyIDE2IDEuNiAxNC40IDB6IiBmaWxsPSIjMDJDQkIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=); + background-repeat: no-repeat; +} +.pricing-table-cta { + align-self: flex-end; +} +@media (min-width: 641px) { + .pricing .section-paragraph { + padding-left: 90px; + padding-right: 90px; + } + .pricing-header { + margin-bottom: 52px; + } +} +.cta { + text-align: center; +} +.cta .section-inner { + padding: 48px 16px; +} +.cta .section-title { + margin-bottom: 40px; +} +.cta-inner { + position: relative; + background: #15181d; + overflow: hidden; +} +.cta-inner::before { + content: ''; + position: absolute; + right: 98px; + top: -117px; + width: 160px; + height: 187px; + background-image: url('../images/cta-illustration.svg'); + background-repeat: no-repeat; +} +.cta-inner > * { + position: relative; +} +@media (min-width: 641px) { + .cta { + text-align: left; + } + .cta .section-inner { + padding: 64px 32px; + } + .cta .section-title { + margin-bottom: 0; + padding-right: 24px; + } + .cta-inner { + display: flex; + align-items: center; + justify-content: space-between; + } +} +.is-boxed { + background: #242830; +} +.body-wrap { + background: #1d2026; + overflow: hidden; + display: flex; + flex-direction: column; + min-height: 100vh; +} +.boxed-container { + max-width: 1440px; + margin: 0 auto; + box-shadow: 0 24px 48px rgba(21, 24, 29, 0.24); + mix-blend-mode: multiply; + mix-blend-mode: normal; +} +main { + flex: 1 0 auto; +} +.section-inner { + position: relative; + padding-top: 48px; + padding-bottom: 48px; +} +@media (min-width: 641px) { + .section-inner { + padding-top: 88px; + padding-bottom: 88px; + } +} +.site-footer { + font-size: 14px; + line-height: 22px; + letter-spacing: 0px; +} +.site-footer a { + color: #8a94a7; + text-decoration: none; +} +.site-footer a:hover, +.site-footer a:active { + text-decoration: underline; +} +.site-footer-inner { + position: relative; + display: flex; + flex-wrap: wrap; + padding-top: 48px; + padding-bottom: 48px; +} +.footer-brand, +.footer-links, +.footer-social-links, +.footer-copyright { + flex: none; + width: 100%; + display: inline-flex; + justify-content: center; +} +.footer-brand, +.footer-links, +.footer-social-links { + margin-bottom: 24px; +} +.footer-social-links li { + display: inline-flex; +} +.footer-social-links li + li { + margin-left: 16px; +} +.footer-social-links li a { + padding: 8px; +} +.footer-links li + li { + margin-left: 24px; +} +@media (min-width: 641px) { + .site-footer { + margin-top: 20px; + } + .site-footer-inner { + justify-content: space-between; + padding-top: 64px; + padding-bottom: 64px; + } + .footer-brand, + .footer-links, + .footer-social-links, + .footer-copyright { + flex: 50%; + } + .footer-brand, + .footer-copyright { + justify-content: flex-start; + } + .footer-links, + .footer-social-links { + justify-content: flex-end; + } + .footer-links { + order: 1; + margin-bottom: 0; + } +} + +/*Pulse Button*/ +.pulse { + box-shadow: 0 0 0 rgba(120, 120, 120, 0.4); + animation: pulse 4s infinite; +} +.pulse:hover { + animation: none; +} + +@-webkit-keyframes pulse { + 0% { + -webkit-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); + } + 70% { + -webkit-box-shadow: 0 0 0 15px rgba(120, 120, 120, 0); + } + 100% { + -webkit-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); + } +} +@keyframes pulse { + 0% { + -moz-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); + box-shadow: 0 0 0 0 rgba(120, 120, 120, 0.4); + } + 70% { + -moz-box-shadow: 0 0 0 10px rgba(120, 120, 120, 0); + box-shadow: 0 0 0 15px rgba(120, 120, 120, 0); + } + 100% { + -moz-box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); + box-shadow: 0 0 0 0 rgba(120, 120, 120, 0); + } +} +/*Pulse Button*/ + +.tiles-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin-right: -12px; + margin-left: -12px; + margin-top: -12px; +} + +.tiles-wrap:last-of-type { + margin-bottom: -12px; +} + +.tiles-wrap:not(:last-of-type) { + margin-bottom: 12px; +} + +.tiles-wrap.push-left::after { + content: ''; + flex-basis: 330px; + max-width: 330px; + box-sizing: content-box; + padding-left: 12px; + padding-right: 12px; + height: 0; +} + +.tiles-item { + flex-basis: 330px; + max-width: 330px; + box-sizing: content-box; + padding: 12px; +} + +.tiles-item * { + box-sizing: border-box; +} + +.tiles-item-inner { + display: flex; + flex-wrap: wrap; + flex-direction: column; + height: 100%; + padding: 32px 24px; +} + +@media (min-width: 641px) { + .has-animations [class*='reveal-'] { + opacity: 0; + will-change: opacity, transform; + } + + .has-animations .reveal-from-top { + transform: translateY(-10px); + } + + .has-animations .reveal-from-bottom { + transform: translateY(10px); + } + + .has-animations .reveal-from-left { + transform: translateX(-10px); + } + + .has-animations .reveal-from-right { + transform: translateX(10px); + } + + .has-animations .reveal-scale-up { + transform: scale(0.95); + } + + .has-animations .reveal-scale-down { + transform: scale(1.05); + } + + .has-animations .reveal-rotate-from-left { + transform: perspective(1000px) rotateY(-45deg); + } + + .has-animations .reveal-rotate-from-right { + transform: perspective(1000px) rotateY(45deg); + } + + .has-animations.is-loaded [class*='reveal-'] { + transition: opacity 1s cubic-bezier(0.39, 0.575, 0.565, 1), transform 1s cubic-bezier(0.39, 0.575, 0.565, 1); + } + + .has-animations.is-loaded [class*='reveal-'].is-revealed { + opacity: 1; + transform: translate(0); + } +} + +.tiles-item-inner { + display: flex; + flex-wrap: wrap; + flex-direction: column; + height: 100%; + padding: 32px 24px; +} + +.features-tiles .tiles-item-inner { + padding-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; +} diff --git a/public/images/AGPLv3.png b/public/images/AGPLv3.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc4fc07198483122d665779f9b624554e21a4ab GIT binary patch literal 16063 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Host
+
+
+ Host +
+
+ + + + +
+
Worker 1
+
+
+ Worker 1 +
+
+ + + + +
+
WebRtcTransport
+
+
+ WebRtcTransport +
+
+ + + + + + +
+
Audio Producer
+
+
+ Audio Producer +
+
+ + + + +
+
Video Producer
+
+
+ Video Producer +
+
+ + + + + + + + +
+
PlainRtpTransport
+
+
+ PlainRtpTransport +
+
+ + + + +
+
Video Producer
+
+
+ Video Producer +
+
+ + + + + + +
+
PipeTransport
+
+
+ PipeTransport +
+
+ + + + +
+
Video Consumer
+
+
+ Video Consumer +
+
+ + + + + + + SRTP + + + + + + SRTP + + + + + +
+
Participant
+(mic/webcam on)
+
+
+
+ Participant<br>(mic/webcam on)<br> +
+
+ + + + +
+
Participant
+(viewer)
+
+
+
+ [Not supported by viewer] +
+
+ + + + + RTP + + + + + +
+
FFmpeg
+(recording)
+
+
+
+ [Not supported by viewer] +
+
+ + + + +
+
GStreamer
+(mp4 broadcaster)
+
+
+
+GStreamer<br>(mp4 broadcaster)<br> +
+
+ + + + +RTP + + + + + +
+
Router 2
+
+
+Router 2 +
+
+ + + + +
+
Router 1
+
+
+Router 1 +
+
+ + + + +
+
Worker 2
+
+
+Worker 2 +
+
+ + + + +
+
PipeTransport
+
+
+PipeTransport +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + + + +
+
Router 3
+
+
+Router 3 +
+
+ + + + +
+
PipeTransport
+
+
+PipeTransport +
+
+ + + + +
+
Video Producer
+
+
+Video Producer +
+
+ + + + +
+
Worker 3
+
+
+Worker 3 +
+
+ + + + +
+
PipeTransport
+
+
+PipeTransport +
+
+ + + + +
+
Video Producer
+
+
+Video Producer +
+
+ + + + +
+
Router 4
+
+
+Router 4 +
+
+ + + + +RTP + + + + + +RTP + + + + + + + + + +
+
Participant
+(viewer)
+
+
+
+[Not supported by viewer] +
+
+ + + + +
+
Participant
+(viewer)
+
+
+
+[Not supported by viewer] +
+
+ + + + +SRTP + + + + + +SRTP + + + + + + + + + + + + + +SRTP + + + + + +
+
Participant
+(viewer)
+
+
+
+[Not supported by viewer] +
+
+ + + + +
+
WebRtcTransport
+
+
+WebRtcTransport +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + +
+
WebRtcTransport
+
+
+WebRtcTransport +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + +
+
WebRtcTransport
+
+
+WebRtcTransport +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + +
+
WebRtcTransport
+
+
+WebRtcTransport +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + +
+
Participant
+(viewer)
+
+
+
+[Not supported by viewer] +
+
+ + + + +SRTP + + + + + +
+
WebRtcTransport
+
+
+WebRtcTransport +
+
+ + + + +
+
Audio Consumer
+
+
+Audio Consumer +
+
+ + + + +
+
Video Consumer
+
+
+Video Consumer +
+
+ + + + +
+
PlainRtpTransport
+
+
+PlainRtpTransport +
+
+ + + + +
+
Audio Consumer
+
+
+Audio Consumer +
+
+
+
\ No newline at end of file diff --git a/public/images/background.jpg b/public/images/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5a3720026f500377ba5dbbe02c678f1baec083f GIT binary patch literal 218242 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

eG=}#y2z&bUtRVFIt-omdEZS0I9(y2 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

  • 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 xU*NU=@O^_cc7Ln#Pl}&Hs$32y-2Z8zTS! literal 0 HcmV?d00001 diff --git a/public/images/cta-illustration.svg b/public/images/cta-illustration.svg new file mode 100644 index 0000000..c46d2f3 --- /dev/null +++ b/public/images/cta-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/delete.png b/public/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..4d46760e3e319c2869aaae5ee5ca01b46ba871c2 GIT binary patch literal 2137 zcmZ{lX&}`58pnVCF)?GE12msOi0Q?}bFY$c=z{P+7*FK?x83Xp; zErr4LKYtK3&4xz;z|&=BsAn4mah$cQ$VS4jOQp#QPN^~;>8Z*3tjdCb6-=Do4MED?Ei$ff#p&wlq_nCO={tba!K1GkjnbU1&`Gq-G$v0znir0mZV~BZ!@_sGh$uU2As6YvZO9P*~g>Unm z$s_;C-X5M&?R%tyImz{WU9Z+*<+5~ys=G@a!_#tL;E+dQxX5$fP^XubeIxoVrHMo4 z%i5qezHn-ZMy@K#JT^K`abf#-wV1scW^rlp8`kGonl&L-P*OL@mv9~0DafWlRs`ma z3d&6tiQ(M%z^ZlBsi~4Mw^0&(6L+b;jm zKWU(-+3zbvAo@N_(v8qRBtJQ|6LiD)iFnLdOCAR%$9GdYkb&7&ebX~5?JIH8;^vE5jw`S zXux{%L=9KSPapKAnkbJT6o1WbVQm1N$`tubVqZ!M=fD2d!EjD#cplX7kQ2{P6MB;l zPjC^Zj#@PljPJcuHgby$Sb6#P7ir4zKeX8)t#Q21vY2h2v<{c3Fg3(?hX+2dwZU&m z(?+cUR4u+zlSd?C>!=J-gF$AU<%p720w*FCvnjG{ggWg1fk6ZQ|6fZ@Jf+UapPtxX8&BSm?er9Y?+WAH#~Y{0BW&R6Ixp)InEG!2vAbpMm=0D`Lsl(wj_gG=Tyi}gjE1?5 z#E1*NiH~p@!UZd370x;tB3Sw8(3ohk;pfa<}V6S~jj%z*Wa@fk<5xwT|5*!qDtZB{S_nHLFD z>e?1xy)@zJ97rL+`g3JhL;gsaSo#_eXf0zN&iQLzQly84RB{d}zxXDGH*oNTeG%|r z$y>(>hyFIQ_lsOT1V@l*t$PSq*@Uj+b$Ln@kPRM=l*zu0#a$kP`)wE^Da#qEdFf*{ zXEj;+YlkPfP~WEYgbP22J?(jfDQ(dE=uo$!PF_Qo`l5X}ib379 z8nOC3Pqu?wA>{|P8rRPrI+djX@F=G))_{a~2RpA+@0r$YmN;l>zcuslS?41mAgF8aASEM>H_f&3^P}r{wCM z{h2l*Nof`IbAIS_Ypkct3^Xu!D|;uu|8l4iD*{fYFUFDir|#`qKgHs7l$})UV$TvN z_D(Y#TXW!q5glKYm!ACUKVk+l{p-hbFH36_B)Esm)Mgp0kt7=vC)bg9w z@Mb-V{G5__%Wa5CLU+iG4)}@wzH|O4tPocW?!3RdhRz8LD*|`Y>NGF?Xy%R--Ms3c8WdIBN?Fvtm z&Os8U<9FZWq!0^uP@?UcMGB>N>zS>da4oHI5NWS`0mGK4W}JG`ax_%t$rk+>q+=qJ zy6dcX+Y#nw4C?j(>{s8(&2s_I1LtW+phAXgxBtxzp$}PnQ!Pvk=uF69yVk)wSnEP{ zyEjUApWLm9rP$#*BcfIwtDySV6O!7_pwH~8_txiQDP=q;#VIcd!@$_nqmPd-{q>!b z8vU`K>fX{eg#Vk+%(MWB>B(2 \ No newline at end of file diff --git a/public/images/feature-icon-02.svg b/public/images/feature-icon-02.svg new file mode 100644 index 0000000..62b1193 --- /dev/null +++ b/public/images/feature-icon-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/feature-icon-03.svg b/public/images/feature-icon-03.svg new file mode 100644 index 0000000..ab7bbaa --- /dev/null +++ b/public/images/feature-icon-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/feature-icon-04.svg b/public/images/feature-icon-04.svg new file mode 100644 index 0000000..1ca34e7 --- /dev/null +++ b/public/images/feature-icon-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/feature-icon-05.svg b/public/images/feature-icon-05.svg new file mode 100644 index 0000000..43b4904 --- /dev/null +++ b/public/images/feature-icon-05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/feature-icon-06.svg b/public/images/feature-icon-06.svg new file mode 100644 index 0000000..3a0c70d --- /dev/null +++ b/public/images/feature-icon-06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/github.png b/public/images/github.png new file mode 100644 index 0000000000000000000000000000000000000000..a689f62ea07a6f54b9b6281eb7ebfdbb451d8ba2 GIT binary patch literal 3366 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 \ No newline at end of file diff --git a/public/images/hero-top-illustration.svg b/public/images/hero-top-illustration.svg new file mode 100644 index 0000000..3eec102 --- /dev/null +++ b/public/images/hero-top-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/loader.gif b/public/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f02eac12eda4199a88ee6d9737349b3daf4452b GIT binary patch literal 52927 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 literal 0 HcmV?d00001 diff --git a/public/images/logo.svg b/public/images/logo.svg new file mode 100644 index 0000000..e2e655c --- /dev/null +++ b/public/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/miroslav-pejic.png b/public/images/miroslav-pejic.png new file mode 100644 index 0000000000000000000000000000000000000000..5adec6dfbaa54b709cac1b864074c6f7ca5e889a GIT binary patch literal 16600 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 b`Tqw12JZnYR{ZBf00000NkvXXu0mjfKw*1v literal 0 HcmV?d00001 diff --git a/public/images/mirotalksfu.png b/public/images/mirotalksfu.png new file mode 100644 index 0000000000000000000000000000000000000000..1e13d96f5153c0be8a30b0c50464ae0851879ed4 GIT binary patch literal 209210 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

    7cifKEYNfAGu8ot) zP7b)dpwli6gON}Ji3W+9DEVD=B-W6n-C#FC?YQj8F>3ANNFM(ME*A6Z5EDNonOdfng8@*J3+7~eU(?^ydsuK_Tfhf-vtvssvj334-* z{WdJ_x04#?Ba!WaeFLyH+~!Di{o&r{zN6oU+28>Es2gl?;x0V%g|4{^z4{pWe>Cns zAc92OSGqbJ=1v?mB;4WBDayx$QMJ%QnG3kbvN$G*c$VsUFC3jRIdb6n;?2{6O@3`E zNZxQv>*K>t?MG2eL}MwOSyn*^8Ci=}RwNfbLcQn`#GNNdteE8q^(m0XVV?kYM2re<>$$6hnhk@DhzpWDvJ-!jY8>(_hO zJ$`eoQ%0pLUICtpj{AwIld@YV0Oh)b>*N&&d@+p=FxiL3(N%0`V5G6+4hg;+c~s3{ z)nGe@x?TneeMuRj-_gXBjX-7F!Npy=r%^|q!<~Vk5fP^(Fl9bU$uSFx?ME;+Ug<2D zk@L2I3dis7O%g8ib_v4c(T-*NYqa6BWpnuqWd@}a`>immK@j0Z7Ap`TTKv=Gf*7Ce z#P1S}iiRoq%=4BN;5U?!4QLu|Y8m(#-nUs89f)(k7Pii2&1669%sN{NDOi~5ysW%nbv+~G!rTkq;#|(q<6>M7kHxoRONKqa)hrc z{G^Z1_#vuMZXGe(GxX%BBVHg%`0S@W@)w_GWwbpznR9;IvHpMIB-am%wlyh|pGPkL z`_;^QWxQu2dh7v|y|jZI6dCDY*}8aXZ|W1py$Bf8nuiX~3|JTEKxsYP z|FFY17HrMfWMn(b{SnOoPW|z7x{NqnJC8Sa-ijFSLG))Ko>E89fMmR_nyXP1q^K-Z zpN=v=3r9XR=`IFb6Hl={Z(`UH4Epa|4v_IwLh-An#j_^bZN+lH8P^F&vQr_h7SMj*F>?AZ> zJf|fehpL%e0ch$z0fAj_z{{c;%>qfQD`0^twr$2W1j0g-*eu45uEV(>NZwiyh*ZxW zN{u}IjF|?N;4wdsgoetdHzRE5Smx%Pn`0W+9J#A5?wYyQn!_($4=22R)xu#{B~CkR!lcRFp$~9kHz0lP;}5hLJ%JXN$bHSSX0nG5@2Ttq*2T9= zK0rmh>g>e*Sy!K?x*?@;_hedm1D3ALuQLVI=>xx=*t+D-8<>M?uHu%i#$w%z68Q{S&vjH$o*i+e z{vi)FD^+Xw`wr;wddY_6XBI(J~x8UCo`GN~?{t&6t8Z_@*yor zqn2$pi+Pg9`Cwghaz0X}%8U{>>rsFV|%LmW! zPLTG&RP;MMZrDrs8Zky0m=Y;Y)W!Q52N&-ha=(1evdDW1@APh@AMb|FeXBcj#4#+U zpDe_cjJsd*dHR#}xg=XF=yx^3sD($7=M>z)PtD~`0dSimLfqE zPYf^IKBh1Xd(oD6H$FHavhqADw|lH**q!ho#zP?a0mSzo#e&o>hJ z(FZu+%Uct|qs(YutehGO#ADzb)K>2L?7AGO`xi?x$D zV{qy^*%`b+LPG3SiP3VQK=aYkf#tC&4Dm7!OZz8JR&HLrG`uwBM1;!U~O*BuFxP1i{zAvG>`XT{$&hu1Ec)*y~!P}Nv z=yKj+UmAX3?KLgp@^C~2OiJh*_t>~*g=G49QeObZx2^PPl#?*d6fc(%5q&MjotfvE z6TKQAiTA-`k)M}zSpleePWh-O3a7^yT!j;8`Fq6LT(I)a-u6!?gc>e`)XaZdFQ5G! zKLqq9WP%|MoTHhlrD+`F7QDMTRBS5wR8ORk;2LGgMP*@FysH^%FQ!oxpVKXk<(q9b zXn83`{PU1cruL$3#8frl&Iod!J5Qj2&vZMo3ri;yAvl@MAPPa&A2*e5r1?W&39AB9SBN`Lo=Xf8cbg0(%f})Tlc8|lW z%VF^Sd!FE|n;iR<#{iNVk1UIpDj(dk;Fzb9F+(1Cmy5|u!TTU8{rqz~huJsz$~x$y zcu`>jPSQpZ%q?WQ&08nKJUo=*=n5mt!yT*@kZNVT>ATT)NjfDJ?knHIrd>Xk&~|8- z9Y35|F4uTyLifUv7?9_b;R=ZDVx`VV3Wn2A6Q*G zo`3QWytKPBKj6!wF66=|!izL~E>z|`-jO)x23n;0#lzaewXK-)3Hw!Kj#{eU$OXZ! z#V8i)mZ#J0XQ_~@hc{dM<($$DtDU0O4#=hOKwg^3YhOge0sfpf^6;6Hr>xyys2xHC zG!#!r&kw^>tjJVP8jMdSApeUf6fH1xLp;Z3Z5bN(CMbS+-=#@IGVIIKyx@(mV5cg=-eXbF#Kibxqm4<;#xZ;z{ zbVI0U(po&`29Oo0SIds(8tQn&^>mgolBxnX!q=@T?`$k$v?&dD7+jDJ1yUWYGD6B- zC^riv6N0jZ8p3d5L*u1%^{a$uMd?9l-UYXM z;wqauL%tPpr7kPH;9eQ;`oka-VP8s*WmZz@lzK@wPOl{Y1L*k&n(p4OYGo4`c9FQU zW#E;C+ho}}v`2~$HR|=F>1`$@+IU}tG$LopD+iC2-U_#U{9nhyVWt69>(A@D?HAD; z&1ct<6VFSWt+f*V<9GVG!e?nbf8+MvFo}Hdmib$7Z0&%u0<{sU!hn_|IJY#rFw1{E>eFdjVV)Ymn1-uv6qNbK^*!Gt_ z<6$>Y`7FW5mc}&;og?z3fCsF6m7ZP6np+=LahidyT*Yj#@0sb1$!_0IObCe=CI3zV zP^>b{{`xmrot-j5wp!3Tt^ZfwzH`$;-(VUN(b5#puD9+cABg??7db0)(t{Eax2Dv- zD%Tfc)2^J8eH#G2)CL*s@z#WY64xY>173y;jaOU%(M2QnvnMwLb1whUBTKD8Qhz^m zM0tgLQiRh<>f3PA24a7AS>BBM`I$D{8W4~9$OrFz_=-@LydLB?|0~L#;<;t?#p*Bx z>tY6K7O(q7-TL|XC!-`WOWY-b{-?XJ9RV^hQ8pD54)ibggXJPa(!&Z8%qhSM@c`m1 zt24vQw>McI{ljtdx5f{;N{GX5V_<9XBPW(8x}>%~X}Iq{Y4j#g2fG7ux5%YI8-Rju zsxw-n($_wVYN*&@kx9R8k`Tf7qE-7AW|Ajs01M_t8np&w)fXn`aRqN>Mh5r)#-D3# zu-i6v$Txo7oYx=R?US$aDOEstaf@`vFVx@1KGvpt5AzV)mTkX7J8H!-U>xEX#XmD@ zbqAj8$9ysx!yLWkGIKQCjNqS^hgmz z9Yl){Zqeq@Ah_;O;i$JH2=|Qg^iWrhsJfjJ61?8uG&_h*0g@@>k+V?hTNl3maHCtj|Pfzf8)5bFFH77jK)r7 z+EeH6F6f<5mF2pRsy|YI+hZ+~cD`OrX9gN@{M)14w4zwrjNV1;6RUb3FqOuzZ3$vD zmREJp)!+^}QpO-Req3q<3e#dF5oTZghgrIG^t_0Nuvj@S$#-d(=!tUhMjKfg6W;l4 zzk{?r_pdta*5zqAj^`rJYK$WUY>D|=xyns>240gEIh7BbJTu<5Wam^aTR|SDHV9-R zI$lQsRoIsgy$m<`rgj?zU6Ohvwn8kDT_I|{ws|f`X74}HQDI)TP5KrU8mQ%=y$M1T7NTl1`pG-phfZ}O##%h+0gAXEVLQgasfSrTv%8q@RV~}b< z(@WlN&lWiOni+ZnMrHqf)stOD+SmfSkw0N!)c$u(jg zCF?Y4&a@7Zt|?I7ALQo}IUzIb{7w6X_5zBvAF59LY7+=$57G!7?MO^qL1Ej0J!oue z|3rEAoCpqXysJrkP|t^^Wg|!YfcemGaYsZ~Xi3h(nzC?fU{$g792*l+1ICG0uD~PS zfEopx@8*|As$_Gq-J19{@5vv~@xnpG7&Egz;k`TvNYYJkeH5i?vStZl>NiwHxtJy( z`dpm4&ul!jyQ*Tb%Xrhq|MGz5wj%k7%Vd+rmyK@=9oDjmuCuYl6Lgh5Gcse2JgZ?p zx}AdQbAl_+&7{$}qa$BId#@1+sR(-@PY`{ZKm@10$H{P0CE!DkKcioAS!w^Qe4u|D z0?zK$fKPWYs8#X0@nkx!4+`hGg-=GPr1I)Ki|V;iJ$M_URxuU3=S3azm79wI_<5D% z)CT$Sl7HVx5Bk&IVH40v%B%tAUWCkj#=eDhFNbmY5dTcQ&?A=!-10+ZR0GRr9C{XN zR{&UK@b6bwRb>9{bH!g?Bx$QJUmNE(zTianX907%j?pDWjq_FdE`kZCLqJ>(sKuB7{FG?$3|5vgprM6J_Yn z(j54fEQ+rWXmIzPrh!6;(pv_P?{S$~%9iptJjw}wKYonYCqlI-R$YDpx)Bi}*M?H) zry_~SFFZu~#V%|MqB6ho!`;LjSazJ!j~=MrF{h+6(WOX{Z2huiaQMmA4Mawq&={S~ zY?GmxTynIL7v^O*UOLgXlr&2ccKN&pZa+$am295qKTtDutk6S7YILZWv`yF$JNaNnOJ$EO(U51&nPzk2H_#V9H z<8QJcT2Dj~);LqI0!6rWk>}j7C8fvKVy9Rw4rr}v=Br+{x5y~qLoB&4H>{HWmku-X zjvwXNMY7*uZSHYo>nW}}%L+PQn+>~tfiv~oSJjslZ-2jp-TxC;d1oguclh7q2HI9+juU#EBug>ngnpx*kzNdmlp(j8o{$@A!{EsUaJ;`{C@y zTc~|_x#p+_u4}HvCa*n>mUoJd9X8Vw3*0S*K~&sk9(Fnqo#+%ZfK4Vsv|`L3*$UUF z5*2%_&2a^p1C8wWhIs^}hR~bQgQ!#|&_yS6l!Nztfz;vXZ1SSU0wl&mczH`IHdy%nwQ*p|jv(hOF9*)w@YU6F`s? zP0|w|nuID!Fp4#yO#@`($>q5tSMwW>o;IESF5o!uj8A|5k)uk1%xf)o?7M zn*ArTF)RLbi|xUlql>@IQ=KAL5Fx*67&zd^?_G1a8GT$#5zHV)zM5q6x>XG6BQ%o= z#uxaN5o!n_nmNM@GF<5`KSCyvo)S_BgZ_<%g^N!*%4fyR!7nF8jb?uJrl7UE@Q2Wq z0rzouMa=RWkBCee9_t^m>&-AfNqa{RAv6D@Xm*}F$;aRywQ zSzl3;`#xZTQWzUSZfsdsm4NxO5vCZ`vj38^=mb+e^O!7+)-=dfX3E0J*GS9lgaZ{= zcI(c_pA;PzN0;w&;Xw!A6eRB#6~r4SFXV$t(=y8}#;#ZnfG$1GGbE~>DL=?X6E)m; zzgq)RBVnj@piTq00m9{1HM|d@L zQ42{Ol^`pywe^4Jjvop?21ed-xli8X?z!(*#`2N>OlUxNQcK;wv@h9XHa38NiB~`g z<6UO3a4hUVG)+1Bum~#no`J~{iLqrOM5%(Lh}KBpeDP^3WdbOYc^>M9#laR}nB z;#-3#-)C?8#qdfhZ%U9EqB419CC=Ng2p6Q$ot2j35 z!F%kp3(0&qIVP(EEDw(O4yT$atf5Bo7mq>&JSE+fhj)n>?%#MN5@&tEi}&O3#i0v% zJiUkdPfUt~zJRGhesVCVT(!8MBtA7{O&0z&rFJVfG{BM76Pu|NfqSFJ$b@}smK6NF zQ{vXO>Qz#;SDi4SzRZfFRGLmuXBELR`O;OieV5Zof!1mu5 z(pMT3C@l-=JKoFTM24I;n?)X}zn4*2NI3u2U5Ls10obI32v|i?^qbqfQ0)=gsx4=r2ee&D3=6W=(($m(fttT3 zPXA-4S1@onovu^V)bO%XVT*0sV>wuiBMnT7t_r=$}xL&}(_x z$kXjyig$y2`)gY;Lh*x}`zG|!DZ8%&szNb`Z)H8QS4r>pW_eY4ko7c&|J`HGlLwAD zBXb<1&jrRy4ztbeL*g>{XW7U9Psx5-53q;!dt7kMvad17 zvHB#}Xx1Eaq{$m@j(WT5&hM!;~u8;KJ>4(*vZxkT& zsq4RYxrhg3TXK@Zs;+ERpy>;oIRALp`Zr1+32lGe_Mc4E^|+suz$FTQL|mhrrx>az z6R(dBfT#j*{7aw+*;>RBCNevlvV})<2CT_;@|2e z@jOT*!$30)0_ZgbxQ<1Vm{SBnzjxCuc1S$R{YJ|a4ch0%#p}ATU-|a0D0$q(Dm3@$ z^k*cMp5zA|llm3W^s0_q{N$eI6>vuPf5#VzsJiczt;QF(MI!W;O8p<#@Ob#JBD>Wz z=aENwD(<1C%>(f38xpAJfOBMGHsZ2R<93H=8wFUtwb0A;CN|D4DicHdK@3bCvsv4E zl!qCzj2XRYG_$HEDkga&ErMd+UIPE#a__*)jqiJQgiSm{R-u8UBK)2XsVcw8m@8c% z$SqJ+v3&}Odiny~!kT3r&kNm!esXE)o@#Fh8Q65eu`Z6TB3|;IJ-1$3oPF`Xrv`LE znUuVI{E~0!y(;^L&Utx3oXzG~ypN-(5BD-}TNnf8@sMGjsa0?b|9#&NRE?$yTo*IA z6wpJW`7?ROEuoaY4=f6dCnMJ~4=KK53eSQCgQ0Clq?Wh1`MR|jbVywqf%>6~Lz>Q? zI8o`Ohd4xGbO4*pE;GcbhO!Wz#YHQ{OGCb+7}+!Bk~Ms>ec|E|envNY_?hcQtqeSO zmQ9{&oT=_0{;(7%zKwLr|i~8Hee_`r zR@1k>q}EX!YrJy;fEo8o93yTL+M7{F$W8|rHN&J#MMm&q(HH96x;&c+Y3UX2%;Cz7 z`-ka(pYinP-X2ws+z++7l;@u7LZWE(OGR>*Z~MvL!zG$U6~v7|QuNOFJ*nf~3f%j_ zL|=-PAzf*6N13_$YHTaNQ^+G?k9Fk9zOgJ$N)^Nn>H9nAK(YUs{{Ixh)*z)kyo(Xd zM!6al#@<-Y(mm!34rrV`!gh8}bmfOGxGSDD=gWJ)xJ)VGG@GvWL;0YIKl9G2`$2elir79@)Ho@EQXoOJFHz0%L27@v)cjg3}xWEPr$=u%q9PoOPwsqE>Pa@I@ zM1h0B)z7c5B`jVoH2j9VS#XzLaFai@EAKq& zvaq2<;NM%d?1{orSA?UehlX-_hi15zyOI_nR|fNPlvzTrpZ?xgU1hs+{^SQNlCqE3 z_IDlRull%o?Ea^I)nmiKhn;uZ}Z0r6UJ@5>nAfvHRAgp?w z7psq>KPjId?T}D(?(4x;zWJN|aKX~yn=U6c?D;(q)qqc@l{nj#*mL+mEiSmi7Nps9 zO5gRbxCvr?c7IDSBp8zuzOWH=W8{&}W(09^;=0g}F{>bq1wN@XQJC^Sj%8WLH@FEB zxY7$`7Pqe(ju3!Ge#=INq$1?AhbLpKyCyP14Os|oNvT#DfMP9k`gbKtLTJ7zhHQX# z9=*s^Wi>ul_>j^F{9 z20aIQOJvnD1*G{|w#wA!5}WMij|gvo1IA6a z(yWp+2?Vh@t zNmnYo^bWrjf$%<8aVB+$9|Kf%O?>ZtG?&~Bk5@R|SO?GM*d^{HuoC)jz6ms@%-{ z*r!?(Js`uZvlU`p<}^0peHer%FZ30F&AxX^!v6xCyEh9E{V`6_#<_+l0u;{ z>?8~sGi(7T_R%}{hvb@vBr||#&`smD71wX{C~8C+y|m;5tY?0wt4aq@zpb< z!41e_K-4q(2EUO8l}Wx&xSa23RLP&5{|cyF*PEzh$FxwBWeI$#ByD$FjkWf%l#hn( z2V+(*GQgg>G&b=J;LU?;^7DN5F(tn1!g~E_^bQ5u={A&2i`A;PuyM`GRE0(WYJ>UD zR&DjeAy!Tc#hG1Y1;Nuz-!_^#?7)$^cGflJaO;XvWtv zJai6>w`5_SiDdc}Z`+x8%Z3L1y+K#FIWwiRkjbw&+L~}7x9Npwz9%X$-eqA+iZ~OG zp|`K>D5p>u-7#+C&jj5}7(6R+ZnR{^ z#_o1~>beQ>w{f^@>sXo7!@ONg;w{~aB-Q#fVYmEO$K`trk4z$-@wkbdK{7&ON}X7t zBf{zN)juOrCQ}g?Zp(!MPgcQniJ5hqhN}-vK#M+q9_+ll#zFfk>w;raCT;P7S4f<5 zt>>enS>r#Ss5lqYi802L#vgEwnka=tBqT@2>mxnSe}u-mfkQ!7?;zT=2)i|^g2#Gm z^q5;hI)oLKXI>4FZYbhg#lsrS#o5j>THyDcd=;Xa4V3&o3UX{u%qDw(oWzVOY$A&* z+G~Ai!dXwmbY^3G{@~ueBsFs!ulIkzj)|o6L_wBVMw#7z?1D3S6W;w zp?8p_n6ZzG@oP+;>RLqVumI^Icu~xUeseuY-Ep|jxbBQRi9Z^^#bQ6 zMO7$mmJu+lBCXjZU28j9b57^iHTVwOYIHKTWC@9-}w|}T+^~m;T<$G$G7qmDsEJgL@t>?=NfjBQ~x8!_OiqlnyAdjs7vLjUEIVP zc(u9m!DNBlA3Uzbz-#ks-fe$H_#1w-iRp9k{0a_H{zdMgtNpox{4v{}Q{$f1;k1Yh zstfL1XP?;iZ~mE9$ugeU)_TuWO1K-6DV7`2PM<|I`C=Iv_(&K2U0vkeeD(wE^0t2o zz1<2((_N0F?H?sJ?(+1K3_1?Is?dSCqG}6NQs1Pix#knmgQI*UaW8tAH!c%T@q^ZD ztb3v}gN`V+u6Aa7p2FWOc3S734rox0>i0@>==*6(!%fP+ZC5E(AYIml!j># z?)iWdRckSp%U#&^D4|y>jBYCnm>;vapPA1*-fonO`V_yw`&0?1pwTa;5>2gt=L!J| zz+#SE__%>i&srn5C^q=42WSy#9f)&&=oP_-C$Oq`YkI#f5YlAiW@64Z#7jZjob)CGBRlLK)?bHl(3 z71C9RvDHed7XlH3k|nJwq&=0fS@erf>llmT-s+iLUn9EyqxCAV8o=OT zz>VgsB|jTqQCHm8R2laeFheUcNs?HHqNqi=LTe_I8+evwcLEMLQGnwgEC@tsfIvbe zU+^q?sX2S+T2Vd&TU};GZ|(H1&FYYwQj#ZO#fx~nbG%b=oh$7eB!wE#xKFyXABs}9 zyQv*{YnDbl*M(GzA0zE`NgMEnxJ$N_sj4j2lJo;wrwGY+ZAsOFKq(pc#HPLvN(vHH95MQi zLB`e?5tkrcuXwgaQjEVqS45dPIXCVR?2sPMkKQG=!gj0Ef!RjAmM6DW3l^`?;3oma zZd*O_y7>&zS{?yMpUHZi1*9M?}#lPE~VI`!W4KW^7M ze+%$Dcugy-`0GosD0aq4P*AB{g_eC;j=w^gPXdBg%$$C)E9xjWX!0hc^13naR|Ejg zmTfW)0N!D(6Oocbpz9WpAzCdKx@vwn)zHjLlQ`B0lK5lx^)o(|w{M}=GDZ$jPiwy3 zqi`!lLdeLMtw_jW{v5}?GrkccD35YK*xRAtnFL3D%TI9*3BhjK_f?D>Ix5C9= zUlWP!ZsS{9Qdj*(`EwSKk-(;%O7Qv%U;A%z5pc=Z#GmPsmFNu21)h~V=cl^#{=(7RsUl`p^Gw_6r$ ztVhZ^N1dib`+|AWv+uI1>Zc;2;Ph=HeB)VsA>+zHsUxCJXAc}>_IDFpDITKzgnKgf32<5G? zaF@I{q&fdi5={=Lv}>2^p^pKtM`e3GnlnEdfMP6q;4XRee6C+nf``E>Rn+s{ zepsfE{!iib1whHBU0OfMcfTc`F2}A!Oevkp=j^I0@I9y~T%4eM@8xAQXYle=(^b9_ zHt4pB)~05KWvR`HON07P?4&(_ykg3x?m)rb)8A6goVN!0Nk^y^c62{@em=qIgl~5` z+DhjGIa%tu7bYO-`p43iF>O&}XIsai#<1lLCs6z9V6JFe!!JR2h1_4jv>KACY@Cay zpdb$q6ee|Y(lQm%1bm36D#9*s^owb9zSq@C%6TzC(8eOaeA{;pU<|^~Q~w1nhXcdO z$;F7#A1Ws_IrUg6eUn?ZJpmtJidtT`Y;+(A-SOmVG^PP37}v!mq}wkr-a+UNz*6k= zoEK@nblai`oq&dZ(u)QQY4ra(-%BO^ez$HFv-Z}%Ry1%{9tc7E4!e$09mZVhiSykN zr32Jt7#oRXp7HYh%i!Q6NY9EVI;w_!sgR!>Ugh_;<}Aw5fwHC0^6PT$=q2PyNDZK1 z;@~FSUzQk1)%Oo{-COkmWfdl6*Uf@=f7e+J)pjX5I}7u8YC!m4Yr>CD^&hWbF~c!P z?D-dZx}VS1-ruI%aq4m5wxu0kSYZYVHMWx6s&qvHAAZV2q8LG?N|G#npdRJHKQ4K` zZ7^u=UDg6-F$lOTONfFPzDg<@CCT@QN>jA0lr;353Ki5K!&WdeX@X~pE3jPSvZ&0p z%IU$1^qfxNQ&j73Oe0N3{I0;{04ZYB&Fn99qSxcVl?9$=>Yi7Z!Vx)N^7 zV!)q12?R9*;Yb=K?&R)@-EX++zoC4y2AcV$f^o1xX}CN-RxIDP@TjXfXy?i}qOR#?l2Dz?~zy`^RA#|LULoK#T)bu7(Uugw4^?|^{7nybMh2u`mb>Uyw z+;i;WoxNn^^~5eWgRx*axcq|s3yLJAk&o=vtyJL9Q$lhvFBs~WX7+7UOml+xfZ}0Z zUQB(EXu$q3)bZ_zhkVd$PqA;^tC)!0p1;b}Xzz%;iv>p|gbtXNB;uTl8(jK`$#vrz z#$;~z+T6iB`~y{aiKdi7VWKoEA#hX@{sO$opmTMPM}vIDf%vn(Nxmy92nYJ(C(?x_ zZA~C#JIpS?iM^*-utBhm;)kFd#0?8Ze>s%KrzozXqoX66mC3X#iZ3$(^pGt*q%9)g z9Uo=1V+$Ky(7k z2=yRblstFA%e9pf5%+mFZ0@8bMP{)5`}+vnI^5~8%1_!Re0feTPxr`jn0edDZ%8Q0 z(Dp|;E9rOVP(zFwT#cwyt;dKv>8>0P9jIFpU+R`Q0zA<;v3?^Cz%K#%+7zOYYBQmx ztk?2Iw9Pr_AYPAcRS-?=EqFWQDg1%>wkzSth7GQ6;9+Qz%DA>B^Y!aTRJ_kqQrWY0 z3cFT0`A9osuE>a&Qy}7Ze^b_dn20&AFeKKD6qaw}{*k`Gw!{j48=`@iUSIg6)6Y*n zxJ4{B;7QhZU2Qm!i=>|vH#xgN z!qpG*Z>q;88iCrMiE`k*Ldj5Rd|^>$`uuP~h`Kac*ShG3Thvhrl=Sc9;cS~Ij_;52 zbq17E#C;>)M$UlTmpTr+6u9+St*h}K1mbE6E)`OHH@2tX2K)CeX(uh38vg|4o`-Wq zX#-WQTzy8=3jLY`fiX3QS-*@o+tLNKW@-e}%e`U#DIvcnVwf-JIo!b2&x!gt`BE}% zlcTZ`88LB>>Yjdl4zQ+t@g-LRm-pm~JbB1aqtc2qSedP##mBKCyo;1~zVONV`f&Zn zWxq0pNFzsaznABe$Do`Gih5m5pPe?e2+wu}%g!JIqr1u4^TdCh zwc#%bpAs!!(j$NXMRM;yP$^8GO7V7gelGSE3ZM&n%#GEN9Fmaf1MS5bBn`(9l+G(s z6#48$aEIC5-tyeZe5)hpZ$Q)2n)w9LIHP_RFUt37hMle7tGeCfha9`zS~@m5O}c#N z2y$2MQnz$ejSJ({rT@UZ0t>a_mg* zb<#RrMzV?re(0GB{IKXOw+X6QyL*RmvCy(|4ow`(7;4$0ekB_zjBN4G2)TV$RUu#K zdS{fd|ASi7bX%WM-C?_}*uY!gK#zGf6!V!C?Pav-@VbOoq*&)_jzRx)1W^#{s;Rh# z4ZquYQlAoN`sSEhm)uK)TuU;z_QGJTRqVI(orJh#kO&gFAMy$Hsa> zlD>gZ4hIJNbQ>D{V>>!^UUedY7iyI{dFpch$<)lulr=D9`tus7≦J7d4)V@&B)q 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ⅅ4;APt2Yote#Jw|5T>1zrE{{ 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 z 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�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%0D8SL*&5p~%{l-t5azDU zxincojmbIbY7?NI_u!5sSHS4qG(Tr2jp!`xbnQ`O03J>A+qxlP44eTIJ()UYUkC$~ z=3A|`V&vk3MJTlfm)QM5Gj1OdLwQnD6zgTirJ{NE(9bo=XkA5rMdg74Q8yP1q|L3A zrK4KIO(fOaHZ1I%nJsEm`Jem^}q&|0g|X~6~5gqB!^LdCDs+Rn~r;v zj#xgI)OYfG`x72a8lp*;dC;btJP*}-T<`QhkJsPjZ2OWCISioQr8CZ2Innq9$df5N z*++0btHdROm47QNh4^Cs@@g(ZWw>H@V{1%8#cPWo=?R<)prPJy9<*U(Onr>Sja$D>ywWrIE1~(L9_#1dB;a$k z%$iE)_l)qLKWA^QPXBnwYYht=We8uqi~fh`@(JbvCs%xx66V?AwK!q626C}PmwjwQ0lRqY=n8X5LqRdf(ALebsn^ULBT`CR)#=P^t%#L^9 z=d%N!tD~dZQD$}kY42@Pey*$3lYEc!;s%P+I21fnZ158DPa*GNaxP+f-{YLDoyGyK z&`-sT6Ts(ZK?;N3`p<(nu($xPubB%uTVHiQAnYg&7&z29m-25n+IU0q{X!DTsM;O@ zP0~VsT{&Nf>115threhe? z+Y@)%LKs(ivcO*v61+*OTB78O=eRM-*w4X@0(DZ9xM}#(trP3w_Wssp&Kx!YK zNzz=z8?oRH#7%saD`--Atp=R#=8S_%E^8KsAgj=3(liT}pH#Q5*QrzecWY#O;M7*w&8fo_l#sj#dr({~ zY5Map)9=3TDmN+=kM-8Tm2C#v=oX@TgsL9h-uE7iOwJC4g&&8-i`3!3Zh~i9DU{MH zL%cUH%oMg|_O<>eZwq86I|$9}Yf~9~`FrbZ4nz-u;u#L-PP)vMz|A|Q9N9`oRdiy5 zq;$}`OHFn2Z^#QPF)t}fD%_zb(aMhyo-P@P@t6OCV@>pE&a1LJ%xT>ZQeHnok>`Q- z3Y%xWL9#bl;khfq%A*30(Y;CIA+cve3f8^u+QQA!2Hz)6FnbTwD&Rbxvdi6yTrrv( zBfU(dRZ~E}bO#a=bzM#Q)0k){@xpJ6BzF?LGUG)Q#0Wdj?@3E#eAA2pP+!?XD;{2k zqat|?wu@$j19;NRsQ>=TbVj*t8#!^NVeHxF%ud~}z}y7rRiYm)o#EZ-TCN1X!aj90 zVJWD+eVu#jTaTD&FRcmj`7o`RfLI8H5v)8w1VOeV06CSe?Hm(&-0!UAW*F{Hdi}B z^ss~zRc=+#X$gYOnVn64>XoyKw&G1X+ri(eq*H@J)jbvDQ!7NtxD?TPu3S`#@0Z>f zfAMeh-lvnIW@Qk*PsD#?H^OQ+zBn}VIOr#!1vm!-SG1(X$l5fXD|nKfB^ZR?8GmAK zcg=DTOd+I;y7<%0Ac{2f&^*BoHmp5F(7{}W06#ssVSn~XdkQUK`^-y`orLdSLr${% z)$UUna@)1P_l_Q>)p$W{SXu&{ULt@6yo`T`+z}a%$hZK;e>*>AqH6RAJ9Gz98f=kk zyqg4y^v7LMd9E|n`ro$m9uRa1_MJ{Iy$jD-e)5uXA^Ep=ol8|g_wJO*G<5aKK<;ix zh8^=e{h*^&`~B&Pl7hqc`LK`@e5K32niU1l)TT2^HZ%PN?eQc}_8rvJ*V~hZ23I#m zZoUH1Xzx1C{7)HKwpLPvh~s8E65dQLZI*~R@&ywNBjt3?#C*uWk}vAxnBQ7;(UOy~ zZw#vczRYPYbbUVr#HL5_*jY@;tk2^vizwfjb*K{bmzMhUdWN& zP*5{O`2o|cE#L8se_JS1#C$$X#FO7KNzm@I79HY`w$6u&q4}ASuh>5inSd9xP?nv0 zwQ9^uJHJ<%GnIEJ+ft1|J^}#);1#<3vGqyw_CGW8&7&7vtpj6)X2xKcp7kyv!(VVJ zf*FsT3X{Rw0a1pnNzB2STbYKPH@8o2swUuR4v4vfq)QguQoRmZaMvSAKU7_*ChtHU zbArtLRUBq;{1HNghf&Xl5|D00<6X)jvP~l2DV1+V8h%>QiH(m|E*xI6Hxu6oT;a-3 zija^di`VuSbU(!B9LBtx)^&bI1~%7q1%Q+8ef- zi`1PUh9!SE6Bs72uGCsf)1tlGf+3$>;EZUm0!@$QQ=HLk1^T6w($^=DeX~=#R}(9= z=W8ciF-vm2_6XlL&O`c6WLHxIFQFK|USqB02>Rw2y<4{6e1G%YExf=Luj zPw4Ltc9s=1dje@Ex${vLzTF$IpB=wZo!K8U3yr@_p7Z&8Hps_wsx&RUiRI*@DVsW; zd;Ln{VH^^;)hzgrl9g*BmZEy#@enrYSlozP`*oL~P5YsM;z`qCzwU(3E`4bXsiK|_ z#Ox3(?ulFumX9$Ey2lDXzaf*cnX8Kqt@%{`z|j(XOgH@poCFD*z(&J4W;&dq9AwN= zR2C$e4ULmqX_IRMcR7bfuW)IiERqVLtB`zF?@|aG4wmEc#m@ovl0j#)3DL80&x>9} z3{P324J6AU&4q3-^V-)q7cX;{%OctyiRsM&`Z(tzFJR$#+p}k2&E)0l&K&8CD4en_ zaBHk;D+$eShnE(oJM}YkN8#c@DV6 z??<3sIc()YcQkkm!I25QE`dh+j*BpSvO8lAm|3Ae@4)`}#sm(%xm};OiE#hzZuXlO z;P&uk_CJ9iU^Hk4BQ|aSAM)2=_Ov__HX;sZjldV2duju}bG<3R3g+BL!zJ}Y<>`Rb4S$uor#M-uR|dx6i1p?s^OncSy>tgS{jxzULnQt*nmbkMJgs zR?jk+(k$mJ<3*A$nm63W{5cFQ*N^Jd_I0toh;S#dXjWjZz(=IM z2jDzQZ!0Ks*y~OA}n6U4`|%G zk4Y`x|1{|$9(Ja?z<%ucAG#s{^*nx2t-<4o3G*#;`%YQk&FYI5q$3f}?11eZ@k@?& z%;znSP2Q$Co-wF06Hi>YW+r}?Mby3g@mkUBb<~QBf0N$2Am_nKDBK$rD$2k8>>-iP zdCLN+StQM>Ma-o&!=i)X<>!md-gc@mqDQwKV{PypOpuRm!t@~Rd7a^N3Y+lxwbCWyuS<&*g>lXKAW|=ZvX677h}67H*tvim_i$G1u465h&E^4mkcR7{Nd zlC2quO%*NK-jcd8(zEZ>^88VZxt%fQCvC)c5S!uHT4PiNCH5sk7u=jTGS0)DMt=BV zn2%QbdU~+p(uz*_pWdZ2A%9JFEzs3)Nx!rs=}TW%ybss|FKex(N?I#t1W+Ls+*xo? zZ~RDYrty7nkE4g*bvC;VSZGuL=`F*_&iPHSMdFyBWa{nuBOmcZ`BU+B~>(I|Z` z>8Pva&|JrHb0yXZTX?ABdP_3vy1RRXLDS_wRw^OA+0V1shsLfHxqt6WpfEDuDDaJ) zMmCO+i-wyWP;!%p(hz&^mfm>a^{aa9#B1Mgfg2_iR{L#ZZkhE`gMl#+caKW~7CSqAa`40_ZzVARej5l^2g_`%gwtQ*6DP*_p+VT$rT~2On5L zZ@4E1gvU#q68levDULLp{1=TsC%mdaahnt(3zwZaRHO$as!WY0yj1k-PpW2TPaKu|2p6L_bN!FpZyk!{B&PbPy-oj zYb7En2&dv%wGeKQ#rpH>F(E0)OdN;HaLi%IeS(dYoOhXpP5>t;GZiM~Z#KcmY;GR| zQ>0qTRgR;hy2>obAy4c0E`>Gos?x{S>PR-p4EOrFSp-2T!%VZT@LVNQ9Wpf(+ro2uN`qBfBr!vgz@?C6jJRtjw-4{mM5zWbs$h37AD}fq`!bj04aC* zmuM+8+aoA!myA|S6|q=-Z+b`~s#S=fegqz$|DI>f`-C(R7%(U5@OyvUJs<&!_ANtj4JDYbsu79XMeQ*+Loy`?o(m->+S5kg~lpALit z3&Pzkm$N7AuS@P`6W&h45Bqel@2rK}|LkgJzbf}k*jEYuev_HnGJfFxTy0zUwFY>3 zX7!nmRnLxHdYy_)Jw)3ly>1hGJ4-jh1}`pUhtH}0p;~;&3Z82j!H_%;)IVf|0#^IsTkqt~G&AuFztL*s|9AF&{s0)T z$a{%|r&@=94>$f*k(*cjK1~z{+e+&~W74H@n}5fP7YeyBn(e1?JJ=1`^=J-;7CP$Q zh7MdIxt~Fk`SJSch`D#1Xd%t?c;v~kn7=_kY)NeO(a8*|OlfH$;QY?Aq z)=o#$%F zG$+A@-K3nE2D%!a&ERtafw+UsIdzI^Uj{j91TxQgU~?!cCJ*CP{eQlTU1Ek$PKL`V z5K1VH0N{MAM`gT3zz1^>Rv^R=S5jmo6OPOsVD9L-?fndw$cu$%Bnx8r1-5??)ym;{ zN-Wz{&;<0UD2B<`@K}VNgOJhS^@gChK7}1sl|xdES}W3Kdwg-I|_qi3)$wc!f z@TK!_kJ3GjLhgCZjQq?$$_aCZGpN-cTz&70%$Lro@9(CJMOz0{)8E2uk;(FyG{MmxYl>NUKgK2`#A$OI4qY=Fly)fuA76VL6>Mc-#J?JCPW zkeU$==bE_dXV?{zN~hTEfEimU&11$^p~gAMV3@%_c53=mxaa30Awk9b0)^3dq#~yJ z`iF9x*DF1F$K_TkMRZZ^9m@8|@>Jwoc%)ffYB%`M{){7md(c6o1M|IaZFf$jCY?Bf zP!ornbNO`2czxjJztJ)%We=mZdx3h@Y6sa`D>3*POBV6$W(y7Z3zh$X{@hD-(XtV? zwrBzsq0TZx4|7avf#Z!@qj-A?GWPE%>8gbb9+wjS{j;uvY`QBLX`J%7o|C=Hap(I` zpnH^<;1x0{9dQ3f7X)OuXzS?ep;3V=+BRhn%seC(htONRb~;0p>>v~E_&ifv3a z5Vig$vBP&dj`hxx3ir^A$BEVjb~Acet$lv}tRSNahm_83~u-8#Ih`lli5#%3*# z)ghXapQU*0s987rA}*7kCZgf&H%)(5rEE5?c1aey#11Mm#c1uzaCA@gl*+b%f>RYH4*1zi2!`Z6<3= zcTRLiM1FCNQh@;&o~rY5N*J+ia{EY~4$Zp#_jGN5Sh%Xuv?&N9)SB+ZjFuJPM)BeI zi5JzUf7Mj?To|=3kqNa1QMaCjtslQ{%!(Gpz=w~Fz zR5acgp8e&)FW|+!<11*@@4~K^V+z+XQS9z7I+lMdU2D5Bs+9ZVS?gTH+(eMSead&y zNX7NBx#;5Uy|EImajX+zLh8MnEkM1SzWMWhU2b=AXdn;=-N;aj6n!#coo>us0P~b# z`*Io7O*kvu)K!<2T*g~rKi8%=4}#M7?(tvnSunOPE+{;Z+FzorcTE$Bh!3H)2yWl< znT%D^Al6+B%c<}L;PEpey08+wbK#mW^~?(PuUk2!${fB52wHobFW|`zASdV6P?KnK zZgfEA#Usx4O0nnE-(NjZ=zuZRh?aBI>z%xa9br>#4Qwhh)aGnegsx&jN5f1=3J1mC zU39ryQ=2?GrL~7eceZU^X|$8?p(LHAMDBB<<<+44@DW30EXmzYy~2%d@a%(kkvw{{ zmB(dA5|9tqJnRmG{pp)nYcTrr#Y7+FHYF`1z;wVT!r!mIfin{#OU=sa6bcqE=0$C&Dc+ba^34jcpWMYM7ceYSSv z)+pom#PkIN`>){Qnp2Z)&XCl!h-(=s;4&jvAQj3wiD4erQ<8z1BvG;g-03eGylwtG z&t#1_QyAsElbycV^zlbqZZC91=#C~@`8c?AcP4~xEF&3?_$s^goGqxW8DXeWaIe|G zwfyg>>OFqXRCm{M9Bstf>u7F}H7H%C`q2rryRXsb9>JWX1e`jqA^i5YHRttm!SUHY ztskx(3#zjMwb~vR+gq#u1VNeD41lwhGKil8o;nq&Ssx)Bz>g&+6#ZJl}cG9~MMvXpSSdra=*OXFSab=;$Pj zThET`?t_J(Y16}lA#jtojcUjP~y%h-a4dTAB-&%`1YFs-ygw@Ltx;1VI_mPLl{#Fs^VJr-1{1L>|yYYqZ z|5Cz+$#LO?BQwPv`~SjO0X#xm_gM3bTOl67#loedzH%qyC9bJ;BW^yBWN*r?BrK5{ zE;=;Mu4$!^AYXhEcUN!mlf6WWuVvE)wIN44r1MA98+9{Swu<18$s6?1Gr#kRmac6M zn|$uXL7G7lH0zbI`lG(94y!X?y`Bwdw%g#T#~iMia7ugQcaF!4%Ajy1;i|n(6yhTj z+RvT_=tdb~+Nkxs82sXTrdsD=tmL#!M~AYDsIM_xZ5W>iKf+DwMljlnL_S(TIXKvw zk_M*e_nypzh@Kt-nYKQtOJi|&!b%FXOB~6l#%bqO;$oFt^=ojNE(9YcN=sfCrV%Zx zt;le2aZkhpY?->F5*V0StQMOTDs=C6T_d76{;prlMuho8VTnz5eD?G|{GEN#5jkt`upcg?s|d%*D;Gwj5&*(qv|*(=<^w*VmJh=;(s!^m|vPb|%s zbsfLxUzGzlV~sqj)u`r~v@de+pAG&}xO)PwLvCs@-B*6s)Sc`qh8cnpYuJ!+75rVq zyRukcGUXo?QR|}Ib|o|De=J>xKh^*DCo(ecy~dTju90xFM`UMQlC11&6_Sf~$%-jQh4SQpByyYmZ0@mGpamzK`Eu@P5Buuk$+Rd7kHWo`-TsoX*O<&QEl` z;Egbw+mjrywm=&vKKq@(O8*o31l@d{v#-e|nmP<`ar#($rTCJi_@L8--L=lw6W7&1 z8K#6(69T+}_LjIm$Riba%zG+fc56tlpk1`?L~qd5n-em+*gJI zwmy+dmg8Bfg$10$TMi2&qn)}>&IJrN_@Vq-z_iSft@DzRMHZ{nf!yB^OXN}NDcbPV zDgBstfBfi?LOK|Bh}Y-!4I2ZMV;u_414_*4JE!Dh(wfKJ#&w{(gOw>V%w7D=H)U_| ziE}YnV>0SOmGp)viZt*{bap_$h-SS2-p8{v9^_S|wDmvEgMH~yF9#(l*#EIKY=?bB zP=PE8n7y=8ovPf*^OO3CXGiJ|QMdHPkxWTL)hlz!U5muBz&Wf)5AHHg8Sew^PQJ1`;4)pv1 z{_eeKZC84sfkh8d0q`xAhh5{AJZ~D$97%O!XDhm7QB`|=6u60A?Balaq0};9J_YDL zCKul_Hj`o%KEgHm^ds!bfx~bf4h5b;-@AaJB=RfVqM@eurOJ7*2aTY1jsjT96`Idp zwRYJwOX|ma0jc#F_tzQDn+J|P>)|%xlR_@gzCyd;=>~49Qp*jpv$K8KbByd~#lpz0 zeUH90r8lALRxisyIKPO!j~nOCmCJsD9=oHtd{gEbEL3Y?BI`d~=;+j0J4XJc{to}g z)Y}AcX~p#--}q5N%Y!U5Dlx8@v0gQXB~!cNA7niJ&yTl@!~%#Qa_@vA!1n z?+~KF!Ldjj*GXqAh7-y0=esyBjU|Fnr#&gywvc#;op9^9H1VY|@Adh=EiHeA%h0qy zgf+b``secPq~ctEmXGKUzqZt)AHf9Aosm8{0G(iU}25-Gs`tLdd%IcqJ1%|gR@wmmj@ zHty%~EX&;2(7{PRO50Xer1qCfr&auPXv!){>p4w9>MrT*Tg<%Y)L}6H5=3M3+f7}{ z6>;-dK;z)>b^2Bju+S3!!%lbKGHhN!y%-{_eegx%c&Db zx7NVN+%B9o@(aTbk$o}T8&)9{VA7SD+%!J>*SJmHcb4%v0Ag`l+}_3au(evNjjo5@ zC-2qaVUqLp+}?j48w^~>-`mDc@VtIOG79i|m%1gZN-#rQb+)wV1{;_ux6Ljc)yC$? zh_;IJ5RY71s;y!9(EHA&n(s{Nbj|od2nvD8-E?4-ZfcC@LE0|{=mw$36OE@)cfjVd z_B;I{<4$YRFla$CgIWT7Cu)N1 zPL@fVb>nyjD}uX|gZU?PkUo;vZdt@%9F5}tdek}ithCGjhrV5*y2Rgxc8!-Vre?(j zU-`YYqhV4QClyO2@es)YIaFvLuq2^e*hDRi7~Kvie6ww74&`c503Qn*r zN%RyswPrEAQP-0WcBa;oj*vdWUe0yhD|+=OugEo*b|V>i(+Y2=81rg1WSv~*bmuZ} zVsi*La)UxchO zrTCR!Y$S4?`Zdpiuy!YG=p%NN0F|5XDD%)Ak-}u5z!zlxK@V%{3WlG-JT1^S7%^{N z@O>Rg~=~*aNUW^VzE)F7Mw&}CW zPSJuE_^AG5;;mekFCuEhg^x&?0M~vmzy0+rxM|c|+1=dL2^fSUvp-o$^k~_1oi&@l zp_gcHDdRln-{`xmHm_9C_$xIByBibttn~NaRX;(blsONwyS)yaRFtV8XkjK-95-^0 z&_J^Xn1-SqoIquDQwKWHv+p)y0NCgtg*Xey?Jgk^K$wH=!Twz)6*3Q)f1 z2ZigI|^*?XU-a)K+nWDsZm*yj8n{cSB**B18e!7d&{!n>JYW9E@Z>p#A$bw_~VJ|=}tevimr-CiCMAThlM>z4FLE>Ggtu7l}r8?1lB-_s0^A1%zR8e^5}sftS$E2 zk$SYUx~nY{#_X1A@&;7{r<_q}h+=impOgj{tQ?oYqA71~Lr8YKgCvb)#DY3uC1 zk+AgvWkg&s8$;B{$kv9&CB)g<>guY0-_hBk!@ng{leQnH}MpENc8U?R56%GwN{E&hEbIuoKzN`X%P$3u#J$GyoErS?=gd`T^ptQYC4j z$mm>MnMrRYv4^X~lYA5Ao3*VM;T?eUv}3$kU>r>Ce#962f)Lzy7;Z*BgKOG8=0Jcm5MsKHD15gHb> zJ0Ep&@6h=H-#@Tg3!<}K*gTEV*J>}IOA4XoSV*XoJ!1=xY@H?iJ+r+fGqm&EU*wlO zp}io(l(<4;MWOk1^f&mye4u23YY$%Ts>GYW$GYgT-l#A;U0l?t6w*zKxbUIW6Ly{n zTszlG*T3U|gG$n~wEG|p1N1B>z+NcRXhCTNLK+5K<;ps<9j`U^m%qyvD z7qX@FktFn`1EC7HZfePeypR*%4+X#lkN`SLrkx!p9@}$ z-}xwBbojO~rD+pB@CLAhtkroW*w zjjhSRgYhu=>x6@~g3L-mViKbhIuCEaY%L=LD`;OHj^5nhF~pZ6ly&MR#S&zS8v6l> z`98)^V}dhIH(}~#989L%`QM^;5=<#lw8&aaz7*Z3tDVcdC)`cos@Iy`9cDvm5xnhLjp?cxqc9hctDz!&RZdY&r z_*{)c2AlQ+=L*PcSh7cOD6!l+r90mFM+MC50QY2IN0SnWPcF^6DDb$VV199;=b7e# zfr7LK1GKVR;}czj?7weGWXvZX@tI%SN=}p?e>6?Tx&z0|3FwE_`F06P^?JE>mFFc= z6v8d(i*xT%9$avTb&8kbxo0|oDM09~HmAiHtsGpD;Q3-%pZ&0SX=~UK{rdxPA>I&g zEFeB(@U2HmO0DnT?6Z7HLsCucmVc&1$kN08YEv0IM&+@yH2!d2jXc>Kb1*^->x?Ma zGuSpQI>WN6jPd4C2JplY`UlnYt9DH;wx|_@S8kY1iEGDe!hM7$_a!yVy6{Oh) z#1`%bI{%7l=6A$j?$-6cqUYD|iw-D$8`5N|dCIn%B$h2Y1;ooD1A#Xv+zZ4sU-pYQ zi=8F*KM^olwWpd5Ff-=LXNaa+DR3H#j)nTt71HcFIQJ@PKY;0_^~wh^;ycu^*#(%l zEG8Tnu-m;syR!6=Tl}b}G29u)f~z%4Nl)vN0kTP}wC4JVrt+4S#|X*9e-{~dHwhQe zhe=(l^6sz*{c^YzI_5J>*)~#AP$)sKB)6vhHkKm_Jer(}0wW5h?cKebJ6pCCoEQo)JTGHCYBS+`)VMm^_qv;ORPz1y+lJ7q#g9gH(# z6{g+W)1_51bTP$mWOLf>OskhupA3IIR7Rb)^Q2#;#Rs)g9`SeFswH!azX8H@A-wyk z>(CZj-k#&Re~I!Y%$at|p8=1%H_47@PzIgvs7l1+72}F{`g26EVci+eHWZid+Zm@% zb;#t$!vRzy(u_BxYRusa!u}T2fDOM`E?@{A#Pw^eqh(HYGz9{u^EP|Xu1c&b=Eu** z(Q=rJ>xmdLM8kcQl?l?AY+kpunNs+?x&2Rg;U|E>d~?8Ba)#Qz?yL!&x_ezISa!xL zFw9EPX_ru(Y@zAJ)9MWuGgq5WpbuG)&R%A4QkTD-W)zH9Qh9p8#|Ldmx(@r}H4*fT z1iy}w+?)_*;?8n`rI6dq>3C;Z(x8IPB1D17=fX;EDz>P4(^G-vT1Q3Pg&}H|098ff zNQp~*hB^c;!e%tsOxzAblSSU6WZ9)$9^iCiaw`17!d)NBjmLw}R<{OV#BCnN3tboQ3`&BHD8bk2Ubg~j&jsoALmEJEycjR>yHWrqEx8kg0 zUJ5lUX(3oGRkuy0O_#jo+Bu1dLzu-3>03QG+S4U;7hkV_(w&wiB5NqJo)8tR`s->A zuz*;<-ti?Lh_WV^;LEMY-b}Ds4V*iAB0ebF!bB?(5J`ATxsmX7iq&%L3e5Ed?kB?b zHqfjIT4-48O;VfA)Bx%5@V)`ZzOpFsQqoD;)=HRz09mazH{Y&ue^tg*qCJ`+jAFMf=_S*)5rz z_8TTFi-^LEpN=O-r#W66>;-pzlPl;$^r0k~K04iO_>je)au58cPTBt!QHpbel?xzS zVa)r`opmQl+8mIt!cH>DMlb9Y7is@z$`7H^eib$8yg&%Pw1V zT0CT_C+vDae;4o~G5P(0vpk|t;%s3b>Y#>}*=_#0?Z%vuKTs3PmDb?uPK6wC=SQG>8ZzY^=o8zkHZ_CnjzTOd z6-GH5b3H#I7_^W&e&5NA=t%B=PpX&AjS1}lQTpKLJ<72$xb33XR((Xh@3XpNNWuy^ zz@k~=&#lQv&9K*x@tnKVprs!MU0s6dL000JU2@^vebz+*Qs|bX%%ylg^$(gDZ$hpQ z*_m9bN*uu7tGp+3jaB2#AjUqUT~aA>NAW4H2|skl6-Nei6k?{15nmX;!}z1rJu+7Q zVw!9|%Si&%Wk658k!F zhDMdXIsJy@C{MJDf2IYB4Dx;a2JzcFM!*PQEEqK0zG3@LmCto;MEjB;P&jAEb`7?t!dlMOnvt2gT@cHV>Fvn+DZBm z6uJ>N`}sc$VxcPiV&2i7;fq9%EeZ* z?D=QaDl}aZ^802y&j9VZ{KUzid5m{TEi-Krbue+>0OE30HBoaxDk+1+`$DhvtU~qx zKEgPNi1_rDK4coO<#$rQ9Wbo@ZRQMak6uLt=HxEwzzR(HcxOk>Z9{g1s*KIjjGg^O zG;0eCQIQNNO{;=11SyQmG?f3Y3u|Md8^_@W!`TOYsOaRbCVEZWhOqe_7!p=l7W?lq zlk5b}jaIux#_=wp#4xJ^IeCQvpTppx4^Bh|!hs7E=$P4)^l;)3_6m`@GLb$WPs9l! zLv$J#V24hH<~+?Ung_T?qsIb#Sz@v#EZXN49~sq~Y8nQj(~0U0csuqGdEn*$bc340@FLXP#)NcYbbvZazE-p2RVx-+1#S zI=M-waDNh$+ckJ&M&b0u@2B$3rB|+UxCN~mqc2VRwYOm>#AFQ|{mvykc7mWgma}J zM-9{4U*TD}^X$<79MbF%BQ1a>)Ivl2!0c(}weyE087lyRC;Dv+2_^mNWOaCnHz4dh zwIK|XfG0rdiy)ggmj7J*fJcJ>xikTre{c68PE*!cGb;lykb99({O}@u2CToV$h1XlLH7r-Q{J4ghZy9dAO%X2s4%S?^L)Fa&IwGDzCPJ%_m;7S zEsh#sD#a3-Jw7VYym#v}Mdx)J-OqjbEYbD@H?B_0%Qyf{XHBpr2;oth*CC`RIdD&? z)caJaw8eY&`8nEv1#?R<=BXmp-oI)3a?d}zP>?%0*$eJ))|=)iE_<;0v!ZyX6VTx1 z=6>*p#t}qg;Y27Ql-A>b|q3?UwNHnz)&XY?1soJlq4lX@ua}bR_^vX45F3y!b zcq>*^y!j)2XF{L#(&h)ZYW!N@-DP|g?k?2GSd-K2PKI8d4#enRs|92fvFXo+)Em63 zvT-EPG#zjBkLCvUT#}ukB0jZe)Xm<$GVRzD!p%$dd-i!#<2AD=zI;vFKuU;YX1kvH5A_;Rt?y08N}__WUDAhUg;*Mly%9>%|%PdBZ?h*Pl2LxC3L*;$DQaH9~9Z z;LXGfGdwJMrUpH9)%MY4(EZ$AzOLivL*@mtfKbVpHCR1**umwV9arNdAph9&V&Fhh zS^MMd+%Yq*ay)}#w}F;qqMo0~%Z8nMn~q8CWM(eN;JKrZ+nZ;v{U{D4W)v{LD&8%8 zw`1nUG3fLGkJ{e$(x(Nm*IX%4DAJax~|9ZO93=^n0CM_?Hy4 zr_eZr*;De`QzBut_8&w??(@3+42zgh>k@^CNq9ALRhx<_6TJo&!X|m&oVx;dH2GSp z>E$o-Hyey%aM=SZ`)0WsOPNX01k)6$iB5)!*%AM$`l)-IM2a|OD-hPBLgLY#eUA7p zkq;OR1*EQdm0p<8wlkTR#!D!hYGR`B1yN{NVL(Q1ya;P6)gi>s*l$^_;W}(TO&%Y2 zgQOuw-E?x}Ko(2qvy=3aYeSCtcbpRbr+SgPVG!&te-2!W*a;xO>GFV;y-4Dkc@F$e zF1&?MZ^}${mBPqLyjhF$6~`Fc@1mjY)OVK3&qcWrhN-njL+sI?l9*7E4WU@}5uOOuk_^zlf-$QHWV?G~O$y(XtY6qn%#FSU`p27buo3Mv*NH zvDy|?wLe~o^6&+)o~v$90IhVq%pjghj{jb zgbcC--c!i{PZDKqWgT}>2L>fWHco`4cU#Q?#M%9%rADErDn8Iq)#+dSK07ln_wbrVQ!|#CbooJy?}mmMfvFgO`!oBo9CaUcw~|=9-j&=cmzV*TflL$5cym% zJ}R7lf%l!Lc{i2|QgGrT7289<{oZ*YG3YV`QLZub&v)$gl0+6I(za@{C#zOBB|L)ts-saQab%_Tsg?a`hN%;LS2EW4bC?DmcFI;`-XV0|t~CUuhzE zjb4j+Cb4lIPP6Qf&RV`0}2vlxCFMmK-p{qO0jv0nC z;`8INQs2loUDEp+9*q8@^uLc^eJm1kq%-?y`aJ#mA&dLSly{s~kP3EC>nZTy!+QP+ z`lEl@&4FgY4a`In-kSZA${lEW1sXC1f&xD@@OETnP^^f-2FCk$NBp4gd&$6qfj~$; zNporFH%~}dJEhajUZrPG)qV|{PWvU7tmMW7ZUGmwd2X8T_rZP5p~47NIt>+Ak}8AJ zoWqBV#{eSU{K9UM%HgjHy7iwr#o-z1D@;i{%4?@i)Q=cnSF=8pQRxJl=a)LSs@{t= zFi(w)7_&mVw$)!J)3&C@)Qf15naACtE*{isd*@26x3e1QF)8a4)GBjNmLf;kloqJv0d5&Y__n~C- zmkVx?e<~b(J-V_@wbHxJl`|Z28;7YMKNmgZB3pO2M^1x#Aperud9867Hw#gyiMz&H0HVsoxO%jP>8=77(uF5ae&a*{k2YnX z2u%n4d&KoueoFq}kV`!oanRZSJ6f{oL9iHhs7QGLI}LR7@8!=eL#?E9hdivSiU&#me?FOO~4fGMeEg+|HGEBSD3zf>fVuM*}J*J+p((Hlw2TrI{$F79A@Pq(co6gm0%F*UY%IU=QQ*Q zdkYB04;YI3K&)V3%Q5n`>=0f_iMk++bC7kti<>kfri?hepySx^J#mX;b|OeX&DadI z4hI};=STng)I!I&+L94k`=z!-?Ypa`vT;30A}1ThTPSN+6^$piW5f=MrejA+Tq4z# zP);q}{N&H)is3aU`3<`;7gC1Gc|G-tL6Mn(@9K8IG++*8!`Z{wE=%KmjbTP) zQ4ZQibXz+ZuPA1H{GctYbP!(?_QBCf;>%Hi5a=fgn{gs=wm09;p9C3Rx=v~w(!j)N zpN3!mRMN(wW1%Wv5S9HC@roLO;XNV<{77VKJbIq?$T(8y748$h`hxpcqezq@(sw7g zbTQtMeZYz}NI7%IFAFa72bG%!!#yOtwUoXE2;_D5Rr3xqA>8eI3%`&bk3$6&e`0YS z&%!PuhHTA)>B?QmfTcb6E)^`f=`&e8pGJ8(cn45hyOXA7obr#2svL&}eMksHgwf>L zxZL2f_3PcQF5eH;gm&+ByHSaF+@GXRDv9pqPCp^l6`~@kz>SeTdfvOYT}!|9?wi4N ze#}`}APcNe$wVe!wF{8PgEYCjepO;ABeFV97O9$50L@_s^sb|IibX&(5x$?An%MH2 zU%9<^k`w{y))V$V<<@@RQO8FCC9~pSAtfzas&4pc{U%eP#KVfVQCYvRZv^E=?V+h+ zn&>o@=0P>>cmdWk>ZFp&$jME>ueGhvxLfX3nZ)^!S)(lr;{9<}zdslUXD>Y%NxUHz zG*xSkjqmEu@z!vX=pa<-&ONkZfzTZj!Xw^-0*D@zN&CFSV91rB6G`U;XDBbvZeJt4 z-!-==^js)c!1c~=#OGk4)h4;)RyZ(EuU5A;l{qQ$@_p~St@off=!`H+(W$3z#WRe9qVFzL4IP0(b9MKHI6Td)M zr#0V{XsZ%t<)Q^SCE(~Q!ZASP52^LdM5y?TL-;UdL#=kNQ3-Eh=p%A6xbUe(6QXZ< z;*=mU9 z?Tl|4&U%y|f11aHG`c(Tl>CgQhCrRky^W8Px&^5CPJ zO7Y^*FnmVXFVs*Xt~pnpDA1pfe@PM#7NLA7!*}X#!c^NDZkvv~^?}#*$!|E9JWov>(Ac+6 z?NM2&f2j^%AD{i`DOvvkBuV(b_+J$(D2NwFS$5qDj4}JXh&%F7+2{qH7aldvZ zX}P<)hOOP%RV=P%o|Htra2#|FV!TV?4IG-~tVp9HqZYUVes=ryO92Kn8b9=!eS zeNbLKn?0~lu(8YW_%Qmzr^R9$Wy~DzRo?gpP8UYl+!LrAbc5}Vd$q_d&t9W)w_J^+ zY-h2aknB=L)~S>qnB&?3sJLN%nAzKIF=s~g)tmkl6}MbFn_UgXrZOQ)=zdfrKxnxCii ztr)o}@a2!YLK{c=x&_Sh?XJM!CUxgAH-Tm`%Sbt;S)__^VoVl&%+1WtJ9Tic*!Ir? z6Tf@Zjbx7HCGb6r=u{`-vjg)+)%HSi{I%gbZ_rLD~H^ydd1E}Q-Z*}RR_HTJzVV^ zki=8g*p>P0kOCv!_yfBc*osRRzz(QMdcB(Qd>LkUFXA*eG$~bbu$aZbOdeCFC`)vV zu`^D|G}TmEewn!M;ZJ{Qx?wKGyvh05EvIVFlI_3(bsMf0YSydT;S|6qv4#DOF>SnOj6%lUPtt`;XZ<>+ldd;pjiT(`niV}8ctZ>2Y} z-dcaOsa|E>7VP*-{c?E#UmO{j1aQ-{7h|_cr%rd0obEJfXfPL4C=_52n3a+t*+4yC zw15N7J6`Y)6P<(*jz^5nXq1>u%I$2;78CF?_unhc+DPOYBC~50z!8}6TgZkFfYIRy z<0A~(7BKg9)wdIPqV?i}Z)bzF($2}c8>9EJB%j3Ss+CeOB~B{7_+=T_>Q^mAy+K9XyQ<~9%dc!YV z>e&!SI#E28SDG?_?+Ht^`k1@rut`!+77+LJztx{`&(v@=@FjF=!ZI>=(fF{Q?rS`9MGE!qz3&-cm_a4vwgQXM3sqf zU@z=8u0C{o=9gNgL4yOmKu5sC)LJ)h-mx;FGsVA(F2C3i9;z{n ze&d+>FE_QEBY9h?%_x(a;i$-DR?HeCoon<*eADI%fz^z_p4mP~t4w$g5u^dWK8+lm zW3L+Voy*)!q=bo2v$r+_G}dFo`bWF!=gRrQeERQlUivau6^u8zaq7(Pv9q`J-{BKJ zYySBmRph2pSl2+O`@F+nPH|+@y)D&ItChPI$hiXz?O$9k{f;liZ^4EfDo|7aVhJjd zY3Gan;zVyuh=r{^i6Fz@gbdzp#QkMwdSk7^qe}y$OJXaS+DRLBLO7WjgJpr=Nf3;| z?n{P2;Za=xvd&&a4%%UswczO$4GWZQI7z8^Qv=T535UEIH`?9VM6QAe+ zXueei5Nt~H>wFqX3p4hs0=X{5uCEQ88+^ToJ~mAW(H~WU-%`Kj!FWM&R%w(JqC}qO zi@zL8?T70(j6tkBqRrg&;`rAgR-DNK0;9UP+^mCyiwS&OSL+f#*n9zgi**Xe2<@ zdAee_FzJn}e+In1J&rxmDT1B__zYk z`#_&|gz27{1T;I$xfsxjvm-P<$Fr%4|9OQQ+s|5XSR?+oFJn_Do;?=qIIoTY-$a=X zeQaz2z>~P`WeGJcYPUMgU=M%&PhAmZdU02_I~v|pbbkShsj)C)<}|du5u~MO z!U|^I74!2F_nOocO!Bk(HF1~9RvU7sL_*>1cD|6$;|gS;FJw*%$Fe1_51vRP!S>ES~D=g`%C~?pu_(GYkphbdQosyu3W1i-DF_z4n zDGUd1H{&^cOZ8y8#JFT9{BnDp8`M@WZ(cOyGvk`vdFd6_u!q)d=WJ(6L^I(9AtJ*1Qsp-xc>U^0yuO4EN7*04F2?tz z2ch3^VWAURL)ha_ePa=%zhk=vDnWRCY+&HRYtpy7c_&Sdd-1HArX6^yh-aR*UeV8z zt>Hkw;s7FqV$*R+_P{6Dsc1#UwzIGFc`^iS?(j1PsXw(uDqpEF zHqYA#E-u3zSv1O*!=b=d!pwYcrfpXw{_lb75x3gIt24SuD9r~jiVXxMlL0S-R}MW# zV$LPC^KUY=X zbZ>_Q5MkJ{X{b81Suer7Q8HRYIM96VQ=)0UD~Zt)ro!J0`1Oa}68>QOffO#Mh4JOo zJ9}GHA^*7Plwb4J#q5D*TYp*!)v0i&A;$0+J%kwuimPFtUr9sFXy6VGDmcnCQ)_EO z)4pte;eF7;42KKEn_#&B@aRZEgCM0!7 zhz7Pyuebfzw58j^T4%(5mw#SFA{nE!dkcV(f%JaFlLARtbU}H`*PxBQuXfz`GsKF3 zuezv|x%glgtFqjPumcn%rxU6d>Z3Nc1iTmdEM~s1`3FNlFhuOZQZ}#a4%t$e=I61!M1?H5)6^dHvI@#az2Xbg z1iL_3v982Jr_93QdwDQaU8;pcD#{K8zPO7xX^|mJJ+gr%lkU1@wNK`d+W}RVp*eZ1 zd@=dZj9-yBym(|t9Zj`3^-F1h3QG{o2|rIhqVB@w$O7Bf{3vo5?kNKDUHE%tM1_b} z2m@K>;OuXW95K=2OMEJEIrwS#nIshcC0i{<-KHpjSJP{vU9m>g-JI-ZgA=m2gnuRJ zZvlgX7FYPPCWnS_n6QpqZGM$b9ily>R2Rx}Ev!IkXst=%CL%q%zhaX%2sV%B5APVD z38_pQyukQ+2%&q-ln=j5hHl-M7xsiDTl#INC5!lfFfb;h&nhjBEbogWN2t*+bEr6g zTm5#H_SVtr-Tt6K+`NC$2hB@h$M*EBLc5H1Z!ys#75b?J4-)8iUSd%E77p|U+r2Z< z>$(pXmBIbD;?`)wM=xN}u@7NAMsq;kr;xD7Up{qEuuuV=1o|oKl;O*C_+?0?bsmuS zcl_sHX;Ya;PMxGJn>(50x9*bYZ}aA^_?tXklwY0Y_3**M82DfkO^6|vgMk@nbkER% zeO}ou^)y!WoqOfVeCPnB-P7b<*}lpf>nk|h<#+h=twFteXPP!|gA>X6n~^UZ6c13t zXh%kmJ1s&9l7<<%9eBDrCNtNJpiwPfXq?UVP3Wjnj?d>!Rv>Fw{HS`4HgvLA^Pj{u zcHWuvM$>;ZU_dqb^*+oxTmDUzdfR%-h#@)Zxbt${*^cb!KbF{)Tm7qFrPYy)21U_i zma9;ujRXx>qqq~#I!>^(Ene64)x!S-xblt%Y;`BFD-F~68AB=!j422`V>6tc^7$O{ zL_^$pzoirPpA*(Z3;&>2^9(+b1l~*dk)H&yR(=U^)j!K#JI_&>J*bLf#R_ijf`&Hu zZUU;wX5buk0{<<3?wh}|j0$VKotz*p5f%R`beV^y1$L!m#YP#w7QpX4>m-*J15=?^?W;)Mp1o6baQ~g?(_wHY1Ya2oP#!kO;&=p zoJM>cW}9ap*Z-H$4SjNoE!+M3WBH>PvktAC;6%d8-;oFwwA(xRc|`2{fm1-DM*=0o zg;WjnePllY$~e3!N}s)Z@jBX-7d5Q=+&li!)!7gE$7(8ltMXJ$xMU&4r~WYq!p#+x zPk{syz)4h~dpVYse2spm^K9v?eu_VbG!adz*#T;=KK|XpX3<~59NN2gI%QmUajWMD z0W2^g<70)^Lpy>)D2NDi8ED&w2qy~6p56T>{dr_LkotjiQcZh6VAEu4-C^_L-d1gM z@f{#0z=}*iF~SO-JWFclAhe(9d4ukJ0=^`cTJ5*`X!dlXbB=N5S*2eFCjja|?DDDEK6(+c)` zRF0KTVz~{g{3&@8uv6|k3FsP6ke^t55jum-I=NGQz97}SjxI5vC}{L{Ty8Ac3N~?l z*o0Ht#P&r-YQ86bmsy8@UgtF|7}owtzRPx1VZZXLX%0r`8R0&oZR?|w__*+SVkkvE z%fYNycd%c^-~)hvXUruSYn)=w|AZ7cn%OH(hfpAb;?0i6=&1*&1s1$9|ZpO2k!*5TIO$gte>tp1mV3v9g~od5b*n6Q zQmc8;=c;uIfpx}7`d<+EADmORDKOrUWdSzhcl5gxZ&bO5dROgnXTCId&?~%5-|)!V z@~igr(eOYx;=t`56qZ)!Ycr4d;G`?%RO2f34W)x(R!2ys%MG}p9$m>XYuH$owCaX!^u_&h!|6l`U*h}=zlNoap{=jS&O zr_L2x6s6464CVLNtu@~@8yG?9qqTH$X9`oJa*EKOjWs?##&Luwo<8Y2I>$F8Il@JT#`aU??7CRWet*vtjfR@^LZ0{79LtD2bK zBcD3w{3+h{XfjENt$}2&B5ck?D_;)8KZtts^ucEQjbdShA3p zfB)O%n@{W>`j!JtxD5)s6?Ys>P&?r17Wu@U64K=sUpUUOAp_?92&aLB|MHo}-9qhT zm?g)+p_rb`l%0ChiveYfG=`}UtdWu9Kaf6M}pitAEB`0zjA(>>rGOAJM=7pES zGbN$TeGFf!zKeeP_F_BfyYFQK%YuQXD$bQ=nW3=L26|p6%1GazCDnRd#a@!=*j@hC zqI(W1amDp3W9mrkle!11W!$twTRc;*jCSd)KMwaC@s?{Z4b)~O+^tvEDnxl}CtTK# zM879JrSZULx~pG<^h|n|$)u>&Ez)Wl@CB(3-Nvc5`D0>rON{+^m;#ap_|uM6pBBUz zoocF@|FM5CmTJPC8xQ>27P1eu2*oj`O&O(02XLJ0kc4(nvl?xzNAR?kI8jb0e##pB zt(l)C(qt@VQDeERu`l(X%kNg#r$P5EAwyTQHQ%+RK=KF`T1a`zj~tR9T=ij9gtxT))Lkp7l&WwKSsdk_zII%8YiS( zKbNG+=^LEBIv>rdyRCU}Mv3I-KoZN^mzF!5g~SH=h44>{UG;OVG`QqC@TPttc;tBx zt;TXYIsDM3T3;*h%D&qJDz}tG-nyU|YF)-{ntie5k-BoLKZyf))3q??7Q6DJfaxPX z4}Dzv`{KprDQ$(sDdvB$Pr=H*i|^G%^21zW^!T2R|CT&>(d^g>{J__Xd65|P`tH41 z4laCAl$;}vN7m@|X5J$+Gv$!MRYHPe;SpS}#Z}%ltYgQp8J(I1gxu__w!x20D}=b@ zkH-413RN3q;|;^UQO4*F%ITNokbYS@w}2L9f%;m;Nq`>irh=ap;}K8eCvQS4n=-;= z(Nd459G5SkQaE?tgBZ8<2759*+bBGbuTvyMedOliZKW|@L66&CwWH9r1yPE@4 zyHdq=YlsHd%$+LQg`3yTjV3wGaY>s*GM1^z2ELaNfPG9%t;Q#UIhK1})mvt^x0d%f zRSzwID_$dOZ<{Q##{J^Yt~kjO0{aa9?P(?Tsa*jw6=c&GH z*t#bFOh(pnA@>UT$)USLV;t$pn_~awH$?X*yqyYr?nn4m|)^4k&LI%D2DRKPv@Q8YAnDNK8bH?ZEcN)Ak3sbaPLBMQJw)8e;KrnMg7C8$}GCBT-qMD4qCU&-p~($do?r;6<=} zXu@NWLC4M5^8f4Ty2IK0+Hh2VRBchTR#8%0>{Ye3Xw=>#v0AGlHZ5(9M6KE-sJ5t@ zDJ5o&phnHsj1?nlkE&U|w_pBC^5&c;&wW4dbDeX&=f1H3d#AtXB1>-Vs@}!L{UZ!r zR;ZQ4+O?l9xuOcCz*0CUd0ufK#dMgkcOcih$XK8xB!CFngVL6};<+cqMy~0ojuTSv zhi1zpjXw|2=Rik&v6?Xmz^XaMGF}xDULll6q5oTFP5Mu@+m#zTr2B8PoBY;3$5r?I z^I>**ju!Gw`e1DfysP@viW(DF_wYSY`A4MDO0mfn>$vrPX(B6OI z7LJ>Yy#o8@Z7wAM4mZLREd9Z?(L546Yz0D8|NZc7AZybIss<)a{E|OOy za(&W^l<}_EW6c`9rXy}C{u}Q&ETFNIlf=t+5ET1ZgMTD^&gCHBY|Jzgu<<*K@$_#Q z*xu1##iZ8uayN2>t4%QRT`<#)rN2{@fpsbfCJ4tET|+Ti2mI>6Sy<)-u!5wM7lMB7 z5PtX$8ZR#Ik6ETq!Gi!-TY!AJTh)JKamn8gWT`zpT9 z?@b$x0mc0$2<;2-{K#IBj-BM<=QF^w9pLd|mR*(IT5Z6)wVTG&ZrktWmGynO$Yn0w z5Y#7KIVj_Vy$anO#1^xoq4{)qLdX77WkMm(iXB_w=h*ca&zd+~Ru30z_b&&6Y&LWD zLn+bcn1LSz*|>v;WI>i3V0Go6_w!jtFU!CNRB`?AbK>+E=G@CP*LI}gWQ&=rTZ!=p zA>o8jxh+OV8ZR)SbJN>FD-4-{| z{}A-)DCNpJ09dFWNwTwpCV9u(G6Hyyh#oH%74J@}gmFP$+`JklmZW`;ZAY~?c7B@7xJ>BOC)q(=hf_=+|JuZN_0PN~Sx&b*mDgx;O0uuo2Adz$vCRDv3I zwqFVU`YA6ysZ$UQ?m-8AV>WVg@H^Yw#Ipqb5hbM(aB2938{=BCi-m-&mHt~e+=F%R zB}cwz;sR`fz8u}g&TT@S_!;-`BmC$Z$KjMH(*AZj6DdL??+BB7^fz{}^M0?RK#S~8 zHAaQ=KWf-=nc55?hSryxfz~9ccNK7h+Oo6SMSY?M#y*>4B5o2+sd58nFO9&3H@S^D zIO32BWrIV{p} z=5q0Pa|ZLPWt5aL(ah3DdhrT~mvN_Y4@tAuUlPSMPSrdSi9M1YlO?TJhiIxbzv{r& zVGI|d*4Y<0nH8+47=6UlGQ*+Fr0* z=za%M;>ul%KbcIERZOp*!@_Mb`_|h|K;r=p*nr^BUmvt@=h47$-+lvOz_|HgHWSD0n zvK?<`EiXp!vM!t)aB{?;LR@w2ERDViwJpn)^kaszvb^-tv!cNhltYH4@9st2fu7r?`D2iR&ZJ700M(fbHOi`eMkXXZ{KD$9JWibN(b?i}?;J_k-?itamB1#Eo zNs=&Cdahz>$hF`80UpOuAmm@T>Ko+sfXFS3Tj)HJ!{T{$1HPdq1f$0=JQas>n~+Wad|$lwV!v;1#~yr1=6xO{9`A3}M%^7?Dg*iwpK) zgq}>bIEa+ZfBcO5b3rbW_aRY|0BR#F*GnQl3>Je((oN-Q+@m z9fL}?6d?<;eiUDWQSdS_v{GPJfqnGQOruC`z{i?@zlR==ABQZ$cToL`GB8c7VM5;v z*AC78oC8L=+iI}~61bxawbtl6`96S{>b_IcM?y$&dfakyR4g3KkQGlEX_%l0Yi=z4?kOL$%|>1l(l@iKJD+Y$?~<7AE55^a4(Gr zuI*ZFLLJWxZ@bI)FGec`VrnSz0G4?xLKihpU6RefWRJk$2$)O z%ulY1vf1Vv)9|ejJQQS|N0Z3+eXD#Ny(ZHd+$jBv z`jS1d6IxccyG*4YjtJ#8;QUCSXWwzm6k2%!5BF9xB^JH9k1)y_qc8)2hbMpY4QE(4 zSVTTQx*t?dPU{ozDi`G=c-4>cHPVzF8hFYfsge;(nAd_l-tD@Ou94#K9Q0$U0!Gd& zBgHf$?FCS1H2%(3TcCgdTVZP;VK^{kQM764B$%I*+Ac=2@fK_?a|J&F=j(kQyWt}W z9hm8781vp}nB@$whc6R;8FSyd=Nm}<#H~5Xn}5c)AyJ>}L)LrcGy%3~q)WOS&ky7L zD_wv5xd@80QAiWfpQ4;>Bv;&xB9-mm&IaGs0%u(boGn#~hY8brfC}U;kC#__myDkV zW~yM5%}AqLfW zPZRcjzToAA+DAf*?+e>nF<515GllK$=NxkU@_a{N4_fE(!wBK3Dx13YYa}yR7cy4y z?gFfP1*l2%C!12O-P^abC(<)j=kSMAv`d&qe~M(*tSx;GYmyOe8)o;4qsJm3_^0oUL_oe)s0bBFg>K~+Y zL)%2migwFCry3!pZd4cw2l8*8yT{r6;?&IMV0<|_Ia=cJOK8;w0&Z+V){8RJzOl0m zd087WtY*L|^ueuY1>+8LHg!m4WDJ^;MgF%6Nld&sZj9-C?fUws)7>YUw&FGSu=%a> zaSfR+{d6d&bd@raPI7BbvL>sr+%0(*v5ELQ%nLxR7?7k!Cpg0hpb? z8N6F_ujxj)6;oj@_K%pxHicw(q-gU>y48tbJN~`I#7qD`;VLkk-g{Tlz%TK5g&YBj z>d+08WT#MNQTKCYK(^JNG6zD(I1QH}?tH)`ElivKj`}UY2%Y?;Y;>h+0TBDn*C+Og z7j^d#0Il*zZ<$j`RgFa71&oU^gY0wSkZr@E-*_K9tWR+Kl7V)ru{x@Dfh z*W_tSI_!`L)P*AeG0L_vbaT6ZN@rtr`I-*q{g7x9o>Sm_gvEqoXy(nR9MhHKCff|o z$?xG`^=Jpac&EOn2b(}fB^vFcMII%yAf-v;wVDJBeJN4`YNoh$gkBA>?3t8q3O!>e z2j`o`841BaW9a(}t8RFSxqc@qMsjojJn@u7?3S1Bph!6Pge+EiH@!#hQTFpi^`$2yWHu+;lCW+| z6~#N>%|akBaZ|nBK~Ck?qdAiRj1?2)k2wh>*hQdG@k7uAo<}vMhf#6hBv}^q!(D;w zqmR~zJ6Cc)$HcDKbRC4C)W#=PZe}X)>y%tAm=QA%nD%uP0BZ2EYf7?C-dTcCNX<;if?t z#R6Ea7tI4y0Hre z(xdO}*^ZB_yynTkw(JC-#eNr6-l-RiGV2euBrDb$<#fPr?|{gCxUdbUl1oA`4nYS} zo7S>Md&9&4`Nt}58vx+kyK87$`)sru6Qh!HnB4?3LtOwJ&pH2o((@& zA$AY$WL<8ds3y+J!Sri!Ie(MmgQve}4?RO%moHFv*@XMQx>AI?RQA~$Ov8%)i4MB~ z6~-@9CoEG|PgPY*2r4!S!s*`~IDQ4{D;AF14P!KOhI*8zjI@cUP6V z4uGwUAz6#VWsoyuunJaHK ziKXG=9SF5FC^&+L-Sf50)xau#Fc`+PcLlOD2|ZU^s|=4>kE*B4eN6a3U6xWZ?hy;%{HNb-4l&#O=2g7$dNC7pvI?EAU$U%`F*lNtg@ zkjgmR>c~()NM}*`W?nVr%;VKR%kx^IlB4YLrmPv-M@tMlII5jQ+5w@BUmDz^)_plI{5woYyu0Y(=^SMC}9@LZ+ z-;(a}cc7EVGf*0*NvpTA-{Wju{-Yct`PzAjq2fPnk)I{(w*3rXV+zVfv6f)d3(ZYIA>Kg76?$Dd{`sk} zx3O0D`VEB6>Noq!AqrU9Q68&?uHmCzo!iw*mq8#lf?2@d%L+~2B3E|reZyE|N|bh$ zlX6uZ$a4nRcC?1-ZyuC$>L$)GVqox`NVgPkABN(m07WiC%|~6VTxu7&kq$W z#%oXrhjyV?ZKLj;vuja`_S6DYNcFWI{xX6&12UjOs9yQ7ar>KU)p=Aj10{$DEuLLu zS8kMDc}Y|C^

    ?$IQT_5Kah(i6_bY#_msyDF+n&pYy4O=FZItKM6U@S{{G3G51a7 zlU5Gk=k0B50jBJpO)VWO#m>|cD_LFVf`xayHmXP!Zf)JN5Vq;@Rj--5Y_OjTa6EnwFlo+CM1ss4tgwJE>u>K zt~)FFnlE;Gjm1Fe{hrhYyD}Z@0k9vF;!SK&7QK&8Y`W%aVPz!?$f{C*$ zWxcmu^65d!@0G;ocGj}UQxlh~oI8&jfey-*b9 z--_1os+vt{-RpJQjZ-rl=oR)GP2IO#YLw&3c?keAka^zG*jtg?8jjG3Hme~zLD^2~Sld}^Gzh`p|U zftc8rzOk0Sjhie{as%d`fI8|-`lsoHMexa0h#O}t<5bzaS4$Vhdcqo_7}o{8OkN>B zGiYDgHrS`L-b`q-iO`tHmpL=-B1`iO2!c@)QXr=Tue~xK4b4D56U$NC1dvk|YWG5f7m0r)f6bUHBcjlPeORg0 z5GMfKF35{mch|*_jOLAA`G7Pz`<(n)$nA$2c<}xq>|3Lb-HxLwwK`U3*jbfL(;jiwBTI& zI;)z%po}-*!}9D%=9g$VV-b6JJIrAm9=6hYHnw-TX6LbQazL|Tbvii9y(q+T*_gwJ zFP$KqEJO@XgzBNZXjE>Y5;vS=QhiHv3$lgTf4(n*3)-$+)J#x5ab7Pm^QTl7md;!ELy~%GC&+q>Fx}-!+NG93 zIHefQMoUe-)bi1MrtxgU)xQP~ViYT9D1Q9Jp=c-2!*Qqng827oZi7^W_Sf+P6si2n z{M(#(z61`ANjrtR=m`(p?7{|BPmkk{*FOBzy*@_?Ld$;mg3|+K(7z%D(r%!ECPd~J zT|H}Y{5*PpuR9yJGl(>Y%vwCDbk?PFsjrO-a1gETxmw;={vSCUDPz@M3_YAWfdVN# zGBQc|xrXOa5QH(TAME07Xd)CNJ{3Hv#|reSfEU3)49BicqPUcNpFz`a5H(A+!KIk# z+{|4)ZqQC6Q3^3M?=0S*3$Os`!FRv-y*>U@ZYEU7wNC z$~{&KlYvy{`mSv1T{NkXsNGJI0)e`efyeXlIooR!L+Izj%R_+@wTPZhuE}MS-sLHx znuDtUcReWioF3Flxt|+6U8979dtOqcjm`a~q99Rg*Qx6Dkccg|@rhahDt5sd;zO_o z{(60=4YS0C)`YWg-MERvuNJtv7~f%(ISmN(x!~)8CfR4y`w^k_e#(&6^7>6Hzb(&- z3`-DhTwk!5dbV ze#Dr-@emb3?>+8t!vcjPKEp(Kwv!LAK$}q?3T3lZh^Vh9W~Q`mG8MR}Vyx&dzs8O_ zoF)s^B4Ro~pdWNk_vN9*l@$8Re3f^hn`bUh=WLrZ2i=|FSNYWWlK92Q@0P}QbS8|-N0ty(zj zs|TNiRRcwJ!x>U5N3m{WX)X>MG|2h6=_#0`nh9_qy#DDZdO;=;b?dXz>m2O0*Sk;l z=jAuqWMx?G;PnAs6Ywci)Ww-%W4iT!#{$Or3r|TsgT= zN?ImGY#*dY2F*ZbJ9bg zRqkB=7lew7J3>_(e=^ftUnxV`3Z8ImvZh{_kdyyp)7&!*E@?|YlNK0Qi#l8d&DU?_ z=+gC_+XsIf9sMDa`H`4SPuZF}sgM99+M?rw!uCKRSFxmJgnk8p4r&Vcob8LekNVQq z-ji>(e%>6QJR*>gs#}%g2RU?6b9Q+vL^3ce`vh=hh6@Y!{n)IzXOHdR7XTx{f5BZ7 z?<3epe9F6J8GAfE%RLREy95P&I8KnJIvq^qe=Vl1)wf>ZOxefs3?w1Li{W4p;{;<` zN?tvEPZ=5Z0C;~kte_E0IFy(HsxmjBta6jQ`U(4<67;swkj33w{2ERc;D4Cp)A6>% Ty6@vi5b(OM1Jkb1bb9eWY#m#~ literal 0 HcmV?d00001 diff --git a/public/images/pricing-illustration.svg b/public/images/pricing-illustration.svg new file mode 100644 index 0000000..982f983 --- /dev/null +++ b/public/images/pricing-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/js/Room.js b/public/js/Room.js new file mode 100644 index 0000000..eee5465 --- /dev/null +++ b/public/js/Room.js @@ -0,0 +1,734 @@ +'use strict'; + +if (location.href.substr(0, 5) !== 'https') location.href = 'https' + location.href.substr(4, location.href.length - 4); + +const RoomURL = window.location.href; + +const swalBackground = 'rgba(0, 0, 0, 0.7)'; +const swalImageUrl = '../images/pricing-illustration.svg'; + +const url = { + ipLookup: 'https://extreme-ip-lookup.com/json/', +}; + +let rc = null; +let producer = null; + +let peer_name = 'peer_' + getRandomNumber(5); +let peer_geo = null; +let peer_info = null; + +let room_id = location.pathname.substring(6); +let isEnumerateDevices = false; + +let isAudioAllowed = false; +let isVideoAllowed = false; +let isAudioOn = true; +let isVideoOn = true; + +let recTimer = null; +let recElapsedTime = null; + +const socket = io(); + +function getRandomNumber(length) { + let result = ''; + let characters = '0123456789'; + let charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +function initClient() { + if (!DetectRTC.isMobileDevice) { + setTippy('sessionTime', 'Session time', 'bottom'); + setTippy('exitButton', 'Exit room', 'bottom'); + setTippy('shareButton', 'Share Room', 'bottom'); + setTippy('devicesButton', 'Devices', 'bottom'); + setTippy('chatButton', 'Chat', 'bottom'); + setTippy('chatCleanButton', 'Clean', 'bottom'); + setTippy('chatSaveButton', 'Save', 'bottom'); + setTippy('chatCloseButton', 'Close', 'bottom'); + setTippy('chatMessage', 'Press enter to send', 'top-start'); + setTippy('chatSendButton', 'Send', 'top'); + setTippy('chatEmojiButton', 'Emoji', 'top'); + setTippy('fullScreenButton', 'Full Screen', 'bottom'); + setTippy('recButton', 'Recording', 'bottom'); + setTippy('startRecButton', 'Start Recording', 'bottom'); + setTippy('stopRecButton', 'Stop Recording', 'bottom'); + setTippy('pauseRecButton', 'Pause Recording', 'bottom'); + setTippy('resumeRecButton', 'Resume Recording', 'bottom'); + setTippy('stopAudioButton', 'Stop Audio', 'bottom'); + setTippy('startAudioButton', 'Start Audio', 'bottom'); + setTippy('swapCameraButton', 'Swap Camera', 'bottom'); + setTippy('startVideoButton', 'Start Video', 'bottom'); + setTippy('stopVideoButton', 'Stop Video', 'bottom'); + setTippy('startScreenButton', 'Start Screen', 'bottom'); + setTippy('stopScreenButton', 'Stop Screen', 'bottom'); + setTippy('aboutButton', 'About', 'bottom'); + } + initEnumerateDevices(); +} + +function setTippy(elem, content, placement) { + tippy(document.getElementById(elem), { + content: content, + placement: placement, + }); +} + +// #################################################### +// ENUMERATE DEVICES +// #################################################### + +async function initEnumerateDevices() { + if (isEnumerateDevices) return; + console.log('01 ----> init Enumerate Devices'); + + // allow the audio + await navigator.mediaDevices + .getUserMedia({ audio: true }) + .then((stream) => { + enumerateAudioDevices(stream); + isAudioAllowed = true; + }) + .catch(() => { + isAudioAllowed = false; + }); + + // allow the video + await navigator.mediaDevices + .getUserMedia({ video: true }) + .then((stream) => { + enumerateVideoDevices(stream); + isVideoAllowed = true; + }) + .catch(() => { + isVideoAllowed = false; + }); + + if (!isAudioAllowed && !isVideoAllowed) { + window.location.href = `/permission?room_id=${room_id}&message=Not allowed both Audio and Video`; + } else { + getPeerInfo(); + getPeerGeoLocation(); + whoAreYou(); + } +} + +function enumerateAudioDevices(stream) { + console.log('02 ----> Get Audio Devices'); + navigator.mediaDevices + .enumerateDevices() + .then((devices) => + devices.forEach((device) => { + let el = null; + if ('audioinput' === device.kind) { + el = microphoneSelect; + } else if ('audiooutput' === device.kind) { + el = speakerSelect; + } + if (!el) return; + appenChild(device, el); + }), + ) + .then(() => { + stopTracks(stream); + isEnumerateDevices = true; + speakerSelect.disabled = !('sinkId' in HTMLMediaElement.prototype); + }); +} + +function enumerateVideoDevices(stream) { + console.log('03 ----> Get Video Devices'); + navigator.mediaDevices + .enumerateDevices() + .then((devices) => + devices.forEach((device) => { + let el = null; + if ('videoinput' === device.kind) { + el = videoSelect; + } + if (!el) return; + appenChild(device, el); + }), + ) + .then(() => { + stopTracks(stream); + isEnumerateDevices = true; + }); +} + +function stopTracks(stream) { + stream.getTracks().forEach((track) => { + track.stop(); + }); +} + +function appenChild(device, el) { + let option = document.createElement('option'); + option.value = device.deviceId; + option.innerText = device.label; + el.appendChild(option); +} + +// #################################################### +// SOME PEER INFO +// #################################################### + +function getPeerInfo() { + peer_info = { + detectRTCversion: DetectRTC.version, + isWebRTCSupported: DetectRTC.isWebRTCSupported, + isMobileDevice: DetectRTC.isMobileDevice, + osName: DetectRTC.osName, + osVersion: DetectRTC.osVersion, + browserName: DetectRTC.browser.name, + browserVersion: DetectRTC.browser.version, + }; +} + +function getPeerGeoLocation() { + fetch(url.ipLookup) + .then((res) => res.json()) + .then((outJson) => { + peer_geo = outJson; + }) + .catch((ex) => console.warn('IP Lookup', ex)); +} + +// #################################################### +// ENTER YOUR NAME | Enable/Disable AUDIO/VIDEO +// #################################################### + +function whoAreYou() { + console.log('04 ----> Who are you'); + + Swal.fire({ + allowOutsideClick: false, + allowEscapeKey: false, + background: swalBackground, + input: 'text', + inputPlaceholder: 'Enter your name', + html: `
    + + `, + confirmButtonText: `Join meeting`, + showClass: { + popup: 'animate__animated animate__fadeInDown', + }, + hideClass: { + popup: 'animate__animated animate__fadeOutUp', + }, + inputValidator: (name) => { + if (!name) return 'Please enter your name'; + peer_name = name; + }, + }).then(() => { + shareRoom(); + joinRoom(peer_name, room_id); + }); + + let initAudioButton = document.getElementById('initAudioButton'); + let initVideoButton = document.getElementById('initVideoButton'); + if (!isAudioAllowed) initAudioButton.className = 'hidden'; + if (!isVideoAllowed) initVideoButton.className = 'hidden'; + if (!DetectRTC.isMobileDevice) { + setTippy('initAudioButton', 'Enable / Disable audio', 'left'); + setTippy('initVideoButton', 'Enable / Disable video', 'right'); + } +} + +function handleAudio(e) { + isAudioOn ? (isAudioOn = false) : (isAudioOn = true); + e.target.className = 'fas fa-microphone' + (isAudioOn ? '' : '-slash'); +} + +function handleVideo(e) { + isVideoOn ? (isVideoOn = false) : (isVideoOn = true); + e.target.className = 'fas fa-video' + (isVideoOn ? '' : '-slash'); +} + +// #################################################### +// SHARE ROOM +// #################################################### + +async function shareRoom(useNavigator = false) { + if (navigator.share && useNavigator) { + try { + await navigator.share({ url: RoomURL }); + userLog('info', 'Room Shared successfully', 'top-end'); + } catch (err) { + share(); + } + } else { + share(); + } + function share() { + sound('open'); + + Swal.fire({ + background: swalBackground, + imageUrl: swalImageUrl, + position: 'center', + title: 'Hello ' + peer_name + '', + html: + ` +
    +

    +

    +

    Share this meeting invite others to join.

    +

    ` + + RoomURL + + `

    `, + showDenyButton: true, + showCancelButton: true, + confirmButtonText: `Copy meeting URL`, + denyButtonText: `Email invite`, + cancelButtonText: `Close`, + showClass: { + popup: 'animate__animated animate__fadeInUp', + }, + hideClass: { + popup: 'animate__animated animate__fadeOutUp', + }, + }).then((result) => { + if (result.isConfirmed) { + copyRoomURL(); + } else if (result.isDenied) { + let message = { + email: '', + subject: 'Please join our MiroTalkSfu Video Chat Meeting', + body: 'Click to join: ' + RoomURL, + }; + shareRoomByEmail(message); + } + }); + makeRoomQR(); + } +} + +// #################################################### +// ROOM UTILITY +// #################################################### + +function makeRoomQR() { + let qr = new QRious({ + element: document.getElementById('qrRoom'), + value: RoomURL, + }); + qr.set({ + size: 128, + }); +} + +function copyRoomURL() { + let tmpInput = document.createElement('input'); + document.body.appendChild(tmpInput); + tmpInput.value = RoomURL; + tmpInput.select(); + document.execCommand('copy'); + document.body.removeChild(tmpInput); + userLog('info', 'Room URL copied to clipboard', 'top-end'); +} + +function shareRoomByEmail(message) { + let email = message.email; + let subject = message.subject; + let emailBody = message.body; + document.location = 'mailto:' + email + '?subject=' + subject + '&body=' + emailBody; +} + +// #################################################### +// JOIN TO ROOM +// #################################################### + +function joinRoom(peer_name, room_id) { + if (rc && rc.isConnected()) { + console.log('Already connected to a room'); + } else { + console.log('05 ----> join to Room ' + room_id); + rc = new RoomClient( + localMedia, + remoteVideos, + remoteAudios, + window.mediasoupClient, + socket, + room_id, + peer_name, + peer_geo, + peer_info, + isAudioAllowed, + isVideoAllowed, + isAudioOn, + isVideoOn, + roomIsReady, + ); + handleRoomClientEvents(); + } +} + +function roomIsReady() { + control.className = ''; + show(exitButton); + show(shareButton); + show(recButton); + show(startRecButton); + show(chatButton); + show(chatSendButton); + show(chatEmojiButton); + if (DetectRTC.isMobileDevice) { + show(swapCameraButton); + setChatSize(); + } else { + rc.makeDraggable(chatRoom, chatHeader); + show(startScreenButton); + } + if (DetectRTC.browser.name != 'Safari') { + document.onfullscreenchange = () => { + if (!document.fullscreenElement) rc.isDocumentOnFullScreen = false; + }; + show(fullScreenButton); + } + show(devicesButton); + if (isAudioAllowed) show(startAudioButton); + if (isVideoAllowed) show(startVideoButton); + show(videoMedia); + show(aboutButton); + handleButtons(); + handleSelects(); + handleInputs(); + startSessionTimer(); +} + +function hide(elem) { + elem.className = 'hidden'; +} + +function show(elem) { + elem.className = ''; +} + +// #################################################### +// SET CHAT MOBILE +// #################################################### + +function setChatSize() { + document.documentElement.style.setProperty('--msger-width', '99%'); + document.documentElement.style.setProperty('--msger-height', '99%'); +} + +// #################################################### +// SESSION TIMER +// #################################################### + +function startSessionTimer() { + sessionTime.style.display = 'inline'; + let callStartTime = Date.now(); + setInterval(function printTime() { + let callElapsedTime = Date.now() - callStartTime; + sessionTime.innerHTML = getTimeToString(callElapsedTime); + }, 1000); +} + +function getTimeToString(time) { + let diffInHrs = time / 3600000; + let hh = Math.floor(diffInHrs); + let diffInMin = (diffInHrs - hh) * 60; + let mm = Math.floor(diffInMin); + let diffInSec = (diffInMin - mm) * 60; + let ss = Math.floor(diffInSec); + let formattedHH = hh.toString().padStart(2, '0'); + let formattedMM = mm.toString().padStart(2, '0'); + let formattedSS = ss.toString().padStart(2, '0'); + return `${formattedHH}:${formattedMM}:${formattedSS}`; +} + +// #################################################### +// RECORDING TIMER +// #################################################### + +function secondsToHms(d) { + d = Number(d); + let h = Math.floor(d / 3600); + let m = Math.floor((d % 3600) / 60); + let s = Math.floor((d % 3600) % 60); + let hDisplay = h > 0 ? h + 'h' : ''; + let mDisplay = m > 0 ? m + 'm' : ''; + let sDisplay = s > 0 ? s + 's' : ''; + return hDisplay + ' ' + mDisplay + ' ' + sDisplay; +} + +function startRecordingTimer() { + recElapsedTime = 0; + recTimer = setInterval(function printTime() { + if (rc.isRecording()) { + recElapsedTime++; + recordingStatus.innerHTML = '🔴 REC ' + secondsToHms(recElapsedTime); + } + }, 1000); +} +function stopRecordingTimer() { + clearInterval(recTimer); +} + +// #################################################### +// HTML BUTTONS +// #################################################### + +function handleButtons() { + exitButton.onclick = () => { + rc.exit(); + }; + shareButton.onclick = () => { + shareRoom(true); + }; + devicesButton.onclick = () => { + rc.toggleDevices(); + }; + chatButton.onclick = () => { + rc.toggleChat(); + }; + chatCleanButton.onclick = () => { + rc.chatClean(); + }; + chatSaveButton.onclick = () => { + rc.chatSave(); + }; + chatCloseButton.onclick = () => { + rc.toggleChat(); + }; + chatSendButton.onclick = () => { + rc.sendMessage(); + }; + chatEmojiButton.onclick = () => { + rc.toggleChatEmoji(); + }; + fullScreenButton.onclick = () => { + rc.toggleFullScreen(); + }; + recButton.onclick = () => { + rc.toggleRecording(); + }; + startRecButton.onclick = () => { + rc.startRecording(); + }; + stopRecButton.onclick = () => { + rc.stopRecording(); + }; + pauseRecButton.onclick = () => { + rc.pauseRecording(); + }; + resumeRecButton.onclick = () => { + rc.resumeRecording(); + }; + swapCameraButton.onclick = () => { + rc.closeThenProduce(RoomClient.mediaType.video, null, true); + }; + startAudioButton.onclick = () => { + rc.produce(RoomClient.mediaType.audio, microphoneSelect.value); + // rc.resumeProducer(RoomClient.mediaType.audio); + }; + stopAudioButton.onclick = () => { + rc.closeProducer(RoomClient.mediaType.audio); + // rc.pauseProducer(RoomClient.mediaType.audio); + }; + startVideoButton.onclick = () => { + rc.produce(RoomClient.mediaType.video, videoSelect.value); + // rc.resumeProducer(RoomClient.mediaType.video); + }; + stopVideoButton.onclick = () => { + rc.closeProducer(RoomClient.mediaType.video); + // rc.pauseProducer(RoomClient.mediaType.video); + }; + startScreenButton.onclick = () => { + rc.produce(RoomClient.mediaType.screen); + }; + stopScreenButton.onclick = () => { + rc.closeProducer(RoomClient.mediaType.screen); + }; + aboutButton.onclick = () => { + showAbout(); + }; +} + +// #################################################### +// HTML SELECTS +// #################################################### + +function handleSelects() { + microphoneSelect.onchange = () => { + rc.closeThenProduce(RoomClient.mediaType.audio, microphoneSelect.value); + }; + speakerSelect.onchange = () => { + rc.attachSinkId(localMedia, speakerSelect.value); + }; + videoSelect.onchange = () => { + rc.closeThenProduce(RoomClient.mediaType.video, videoSelect.value); + }; +} + +// #################################################### +// HTML INPUTS +// #################################################### + +function handleInputs() { + chatMessage.onkeyup = (e) => { + if (e.keyCode === 13) { + e.preventDefault(); + chatSendButton.click(); + } + }; + rc.getId('chatEmoji').addEventListener('emoji-click', (e) => { + chatMessage.value += e.detail.emoji.unicode; + rc.toggleChatEmoji(); + }); +} + +// #################################################### +// ROOM CLIENT EVENT LISTNERS +// #################################################### + +function handleRoomClientEvents() { + rc.on(RoomClient.EVENTS.startRec, () => { + hide(startRecButton); + show(stopRecButton); + show(pauseRecButton); + startRecordingTimer(); + }); + rc.on(RoomClient.EVENTS.pauseRec, () => { + hide(pauseRecButton); + show(resumeRecButton); + }); + rc.on(RoomClient.EVENTS.resumeRec, () => { + hide(resumeRecButton); + show(pauseRecButton); + }); + rc.on(RoomClient.EVENTS.stopRec, () => { + hide(stopRecButton); + hide(pauseRecButton); + hide(resumeRecButton); + show(startRecButton); + stopRecordingTimer(); + }); + rc.on(RoomClient.EVENTS.startAudio, () => { + hide(startAudioButton); + show(stopAudioButton); + }); + rc.on(RoomClient.EVENTS.pauseAudio, () => { + console.log('Room Client pause audio'); + hide(stopAudioButton); + show(startAudioButton); + }); + rc.on(RoomClient.EVENTS.resumeAudio, () => { + console.log('Room Client resume audio'); + hide(startAudioButton); + show(stopAudioButton); + }); + rc.on(RoomClient.EVENTS.stopAudio, () => { + hide(stopAudioButton); + show(startAudioButton); + }); + rc.on(RoomClient.EVENTS.startVideo, () => { + hide(startVideoButton); + show(stopVideoButton); + }); + rc.on(RoomClient.EVENTS.pauseVideo, () => { + console.log('Room Client pause video'); + hide(stopVideoButton); + show(startVideoButton); + }); + rc.on(RoomClient.EVENTS.resumeVideo, () => { + console.log('Room Client resume video'); + hide(startVideoButton); + show(stopVideoButton); + }); + rc.on(RoomClient.EVENTS.stopVideo, () => { + hide(stopVideoButton); + show(startVideoButton); + }); + rc.on(RoomClient.EVENTS.startScreen, () => { + hide(startScreenButton); + show(stopScreenButton); + }); + rc.on(RoomClient.EVENTS.pauseScreen, () => { + console.log('Room Client pause screen'); + }); + rc.on(RoomClient.EVENTS.resumeScreen, () => { + console.log('Room Client resume screen'); + }); + rc.on(RoomClient.EVENTS.stopScreen, () => { + hide(stopScreenButton); + show(startScreenButton); + }); + rc.on(RoomClient.EVENTS.exitRoom, () => { + window.location.href = '/newroom'; + }); +} + +// #################################################### +// SHOW LOG +// #################################################### + +function userLog(icon, message, position) { + const Toast = Swal.mixin({ + background: swalBackground, + toast: true, + position: position, + showConfirmButton: false, + timer: 3000, + }); + Toast.fire({ + icon: icon, + title: message, + }); +} + +// #################################################### +// SOUND +// #################################################### + +async function sound(name) { + let sound = '../sounds/' + name + '.wav'; + let audioToPlay = new Audio(sound); + try { + await audioToPlay.play(); + } catch (err) { + return false; + } +} + +// #################################################### +// ABOUT +// #################################################### + +function showAbout() { + sound('open'); + + Swal.fire({ + background: swalBackground, + imageUrl: swalImageUrl, + position: 'center', + html: ` +
    +
    + `, + showClass: { + popup: 'animate__animated animate__fadeInUp', + }, + hideClass: { + popup: 'animate__animated animate__fadeOutUp', + }, + }); +} diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js new file mode 100644 index 0000000..d0be659 --- /dev/null +++ b/public/js/RoomClient.js @@ -0,0 +1,1369 @@ +'use strict'; + +const cfg = { + msgAvatar: 'https://eu.ui-avatars.com/api', +}; + +const html = { + newline: '
    ', +}; + +const image = { + poster: '../images/loader.gif', + delete: '../images/delete.png', +}; + +const mediaType = { + audio: 'audioType', + video: 'videoType', + camera: 'cameraType', + screen: 'screenType', +}; + +const _EVENTS = { + openRoom: 'openRoom', + exitRoom: 'exitRoom', + startRec: 'startRec', + pauseRec: 'pauseRec', + resumeRec: 'resumeRec', + stopRec: 'stopRec', + startVideo: 'startVideo', + pauseVideo: 'pauseVideo', + resumeVideo: 'resumeVideo', + stopVideo: 'stopVideo', + startAudio: 'startAudio', + pauseAudio: 'pauseAudio', + resumeAudio: 'resumeAudio', + stopAudio: 'stopAudio', + startScreen: 'startScreen', + pauseScreen: 'pauseScreen', + resumeScreen: 'resumeScreen', + stopScreen: 'stopScreen', +}; + +let recordedBlobs; + +class RoomClient { + constructor( + localMediaEl, + remoteVideoEl, + remoteAudioEl, + mediasoupClient, + socket, + room_id, + peer_name, + peer_geo, + peer_info, + isAudioAllowed, + isVideoAllowed, + isAudioOn, + isVideoOn, + successCallback, + ) { + this.localMediaEl = localMediaEl; + this.remoteVideoEl = remoteVideoEl; + this.remoteAudioEl = remoteAudioEl; + this.mediasoupClient = mediasoupClient; + + this.socket = socket; + this.room_id = room_id; + this.peer_name = peer_name; + this.peer_geo = peer_geo; + this.peer_info = peer_info; + this.peer_info.peerName = peer_name; + + this.isAudioAllowed = isAudioAllowed; + this.isVideoAllowed = isVideoAllowed; + this.isAudioOn = isAudioOn; + this.isVideoOn = isVideoOn; + this.producerTransport = null; + this.consumerTransport = null; + this.device = null; + + this.isMobileDevice = DetectRTC.isMobileDevice; + + this._isConnected = false; + this.peerGeo = null; + this.peerInfo = null; + this.isVideoOnFullScreen = false; + this.isDocumentOnFullScreen = false; + this.isChatOpen = false; + this.camVideo = false; + this.camera = 'user'; + + this.chatMessages = []; + this.leftMsgAvatar = null; + this.rightMsgAvatar = null; + + this.localVideoStream = null; + this.localScreenStream = null; + this.localAudioStream = null; + this.mediaRecorder = null; + this.recScreenStream = null; + this._isRecording = false; + + this.connectedRoom = null; + this.debug = false; + + this.consumers = new Map(); + this.producers = new Map(); + this.producerLabel = new Map(); + this.eventListeners = new Map(); + + console.log('06 ----> Load Mediasoup Client v', mediasoupClient.version); + + Object.keys(_EVENTS).forEach( + function (evt) { + this.eventListeners.set(evt, []); + }.bind(this), + ); + + this.socket.request = function request(type, data = {}) { + return new Promise((resolve, reject) => { + socket.emit(type, data, (data) => { + if (data.error) { + reject(data.error); + } else { + resolve(data); + } + }); + }); + }; + + // #################################################### + // CREATE ROOM AND JOIN + // #################################################### + + this.createRoom(this.room_id).then( + async function () { + let data = { + room_id: this.room_id, + peer_name: this.peer_name, + peer_audio: this.isAudioOn, + peer_video: this.isVideoOn, + peer_info: this.peer_info, + peer_geo: this.peer_geo, + }; + await this.join(data); + this.initSockets(); + this._isConnected = true; + successCallback(); + }.bind(this), + ); + } + + // #################################################### + // GET STARTED + // #################################################### + + async createRoom(room_id) { + await this.socket + .request('createRoom', { + room_id, + }) + .catch((err) => { + console.log('Create room error:', err); + }); + } + + async join(data) { + socket + .request('join', data) + .then( + async function (room) { + this.connectedRoom = room; + console.log('07 ----> Joined to room', this.connectedRoom); + const data = await this.socket.request('getRouterRtpCapabilities'); + this.device = await this.loadDevice(data); + console.log('08 ----> Get Router Rtp Capabilities codecs: ', this.device.rtpCapabilities.codecs); + await this.initTransports(this.device); + this.startLocalMedia(); + this.socket.emit('getProducers'); + }.bind(this), + ) + .catch((err) => { + console.log('Join error:', err); + }); + } + + async loadDevice(routerRtpCapabilities) { + let device; + try { + device = new this.mediasoupClient.Device(); + } catch (error) { + if (error.name === 'UnsupportedError') { + console.error('Browser not supported'); + this.userLog('error', 'Browser not supported', 'center'); + } + console.error('Browser not supported: ', error); + this.userLog('error', 'Browser not supported: ' + error, 'center'); + } + await device.load({ + routerRtpCapabilities, + }); + return device; + } + + // #################################################### + // PRODUCER TRANSPORT + // #################################################### + + async initTransports(device) { + { + const data = await this.socket.request('createWebRtcTransport', { + forceTcp: false, + rtpCapabilities: device.rtpCapabilities, + }); + + if (data.error) { + console.error('Create WebRtc Transport for Producer err: ', data.error); + return; + } + + this.producerTransport = device.createSendTransport(data); + this.producerTransport.on( + 'connect', + async function ({ dtlsParameters }, callback, errback) { + this.socket + .request('connectTransport', { + dtlsParameters, + transport_id: data.id, + }) + .then(callback) + .catch(errback); + }.bind(this), + ); + + this.producerTransport.on( + 'produce', + async function ({ kind, rtpParameters }, callback, errback) { + try { + const { producer_id } = await this.socket.request('produce', { + producerTransportId: this.producerTransport.id, + kind, + rtpParameters, + }); + callback({ + id: producer_id, + }); + } catch (err) { + errback(err); + } + }.bind(this), + ); + + this.producerTransport.on( + 'connectionstatechange', + function (state) { + switch (state) { + case 'connecting': + break; + + case 'connected': + console.log('Producer Transport connected'); + break; + + case 'failed': + console.warn('Producer Transport failed'); + this.producerTransport.close(); + break; + + default: + break; + } + }.bind(this), + ); + } + + // #################################################### + // CONSUMER TRANSPORT + // #################################################### + + { + const data = await this.socket.request('createWebRtcTransport', { + forceTcp: false, + }); + + if (data.error) { + console.error('Create WebRtc Transport for Consumer err: ', data.error); + return; + } + + this.consumerTransport = device.createRecvTransport(data); + this.consumerTransport.on( + 'connect', + function ({ dtlsParameters }, callback, errback) { + this.socket + .request('connectTransport', { + transport_id: this.consumerTransport.id, + dtlsParameters, + }) + .then(callback) + .catch(errback); + }.bind(this), + ); + + this.consumerTransport.on( + 'connectionstatechange', + async function (state) { + switch (state) { + case 'connecting': + break; + + case 'connected': + console.log('Consumer Transport connected'); + break; + + case 'failed': + console.warn('Consumer Transport failed'); + this.consumerTransport.close(); + break; + + default: + break; + } + }.bind(this), + ); + } + } + + // #################################################### + // TODO DATACHANNEL TRANSPORT + // #################################################### + + + // #################################################### + // SOCKET ON + // #################################################### + + initSockets() { + this.socket.on( + 'consumerClosed', + function ({ consumer_id }) { + console.log('Closing consumer:', consumer_id); + this.removeConsumer(consumer_id); + }.bind(this), + ); + + this.socket.on( + 'newProducers', + async function (data) { + if (data.length > 0) { + console.log('New producers', data); + for (let { producer_id, peer_name, peer_info } of data) { + await this.consume(producer_id, peer_name, peer_info); + } + } + }.bind(this), + ); + + this.socket.on( + 'message', + function (data) { + console.log('message', data); + this.showMessage(data); + }.bind(this), + ); + + this.socket.on( + 'disconnect', + function () { + this.exit(true); + }.bind(this), + ); + } + + // #################################################### + // START LOCAL AUDIO VIDEO MEDIA + // #################################################### + + startLocalMedia() { + if (this.isAudioAllowed && this.isAudioOn) { + console.log('09 ----> Start audio media'); + this.produce(mediaType.audio, microphoneSelect.value); + } + if (this.isVideoAllowed && this.isVideoOn) { + console.log('10 ----> Start video media'); + this.produce(mediaType.video, videoSelect.value); + } + } + + // #################################################### + // PRODUCER + // #################################################### + + async produce(type, deviceId = null, swapCamera = false) { + let mediaConstraints = {}; + let audio = false; + let screen = false; + switch (type) { + case mediaType.audio: + mediaConstraints = this.getAudioConstraints(deviceId); + audio = true; + break; + case mediaType.video: + if (swapCamera) { + mediaConstraints = this.getCameraConstraints(); + } else { + mediaConstraints = this.getVideoConstraints(deviceId); + } + break; + case mediaType.screen: + mediaConstraints = this.getScreenConstraints(); + screen = true; + break; + default: + return; + } + if (!this.device.canProduce('video') && !audio) { + console.error('Cannot produce video'); + return; + } + if (this.producerLabel.has(type)) { + console.log('Producer already exists for this type ' + type); + return; + } + console.log('Mediacontraints:', mediaConstraints); + let stream; + try { + stream = screen + ? await navigator.mediaDevices.getDisplayMedia() + : await navigator.mediaDevices.getUserMedia(mediaConstraints); + console.log('Supported Constraints', navigator.mediaDevices.getSupportedConstraints()); + + const track = audio ? stream.getAudioTracks()[0] : stream.getVideoTracks()[0]; + const params = { + track, + }; + + if (!audio && !screen) { + params.encodings = this.getEncoding(); + params.codecOptions = { + videoGoogleStartBitrate: 1000, + }; + } + producer = await this.producerTransport.produce(params); + + console.log('Producer', producer); + + this.producers.set(producer.id, producer); + + let elem; + if (!audio) { + this.localVideoStream = stream; + elem = await this.handleProducer(producer.id, type, stream); + } else { + this.localAudioStream = stream; + } + + producer.on('trackended', () => { + this.closeProducer(type); + }); + + producer.on('transportclose', () => { + console.log('Producer transport close'); + if (!audio) { + elem.srcObject.getTracks().forEach(function (track) { + track.stop(); + }); + elem.parentNode.removeChild(elem); + } + this.producers.delete(producer.id); + }); + + producer.on('close', () => { + console.log('Closing producer'); + if (!audio) { + elem.srcObject.getTracks().forEach(function (track) { + track.stop(); + }); + elem.parentNode.removeChild(elem); + } + this.producers.delete(producer.id); + }); + + this.producerLabel.set(type, producer.id); + + switch (type) { + case mediaType.audio: + this.event(_EVENTS.startAudio); + break; + case mediaType.video: + this.event(_EVENTS.startVideo); + break; + case mediaType.screen: + this.event(_EVENTS.startScreen); + break; + default: + return; + } + } catch (err) { + console.log('Produce error:', err); + } + } + + getAudioConstraints(deviceId) { + return { + audio: { + echoCancellation: true, + noiseSuppression: true, + sampleRate: 44100, + deviceId: deviceId, + }, + video: false, + }; + } + + getCameraConstraints() { + this.camera = this.camera == 'user' ? 'environment' : 'user'; + if (this.camera != 'user') this.camVideo = { facingMode: { exact: this.camera } }; + else this.camVideo = true; + return { + audio: false, + video: this.camVideo, + }; + } + + getVideoConstraints(deviceId) { + return { + audio: false, + video: { + width: { + min: 640, + ideal: 1920, + max: 3840, + }, + height: { + min: 480, + ideal: 1080, + max: 2160, + }, + deviceId: deviceId, + aspectRatio: 1.777, // 16:9 + frameRate: 15, // 15fps + }, + }; + } + + getScreenConstraints() { + return { + video: { + frameRate: { + min: 5, + ideal: 15, + max: 30, + }, + }, + }; + } + + getEncoding() { + return [ + { + rid: 'r0', + maxBitrate: 100000, + scalabilityMode: 'S1T3', + }, + { + rid: 'r1', + maxBitrate: 300000, + scalabilityMode: 'S1T3', + }, + { + rid: 'r2', + maxBitrate: 900000, + scalabilityMode: 'S1T3', + }, + ]; + } + + closeThenProduce(type, deviceId, swapCamera = false) { + this.closeProducer(type); + this.produce(type, deviceId, swapCamera); + } + + async handleProducer(id, type, stream) { + let elem, d, p; + d = document.createElement('div'); + d.className = 'd'; + d.id = id + '_d'; + elem = document.createElement('video'); + elem.id = id; + elem.playsinline = false; + elem.autoplay = true; + elem.poster = image.poster; + if (this.isMobileDevice || type === mediaType.screen) elem.className = 'vid'; + else elem.className = 'vid mirror'; + p = document.createElement('p'); + p.id = id + '_name'; + p.className = 'pn'; + p.innerHTML = '👤 ' + this.peer_name; + d.appendChild(elem); + d.appendChild(p); + this.localMediaEl.appendChild(d); + this.attachMediaStream(elem, stream, type, 'Producer'); + this.handleFS(elem.id); + this.setTippy(elem.id, 'Full Screen', 'top-end'); + if (this.debug) { + this.setTippy( + p.id, + JSON.stringify( + this.peer_info, + ['peerName', 'isMobileDevice', 'osName', 'osVersion', 'browserName', 'browserVersion'], + 2, + ), + 'top-start', + ); + } + this.sound('joined'); + return elem; + } + + pauseProducer(type) { + if (!this.producerLabel.has(type)) { + console.log('There is no producer for this type ' + type); + return; + } + + let producer_id = this.producerLabel.get(type); + this.producers.get(producer_id).pause(); + + switch (type) { + case mediaType.audio: + this.event(_EVENTS.pauseAudio); + break; + case mediaType.video: + this.event(_EVENTS.pauseVideo); + break; + case mediaType.screen: + this.event(_EVENTS.pauseScreen); + break; + default: + return; + } + } + + resumeProducer(type) { + if (!this.producerLabel.has(type)) { + console.log('There is no producer for this type ' + type); + return; + } + + let producer_id = this.producerLabel.get(type); + this.producers.get(producer_id).resume(); + + switch (type) { + case mediaType.audio: + this.event(_EVENTS.resumeAudio); + break; + case mediaType.video: + this.event(_EVENTS.resumeVideo); + break; + case mediaType.screen: + this.event(_EVENTS.resumeScreen); + break; + default: + return; + } + } + + closeProducer(type) { + if (!this.producerLabel.has(type)) { + console.log('There is no producer for this type ' + type); + return; + } + + let producer_id = this.producerLabel.get(type); + console.log('Close producer', producer_id); + + this.socket.emit('producerClosed', { + producer_id, + }); + + this.producers.get(producer_id).close(); + this.producers.delete(producer_id); + this.producerLabel.delete(type); + + if (type !== mediaType.audio) { + let elem = this.getId(producer_id); + let d = this.getId(producer_id + '_d'); + elem.srcObject.getTracks().forEach(function (track) { + track.stop(); + }); + d.parentNode.removeChild(d); + } + + switch (type) { + case mediaType.audio: + this.event(_EVENTS.stopAudio); + break; + case mediaType.video: + this.event(_EVENTS.stopVideo); + break; + case mediaType.screen: + this.event(_EVENTS.stopScreen); + break; + default: + return; + } + + this.sound('left'); + } + + // #################################################### + // CONSUMER + // #################################################### + + async consume(producer_id, peer_name, peer_info) { + this.getConsumeStream(producer_id).then( + function ({ consumer, stream, kind }) { + this.consumers.set(consumer.id, consumer); + + if (kind === 'video') { + this.handleConsumer(consumer.id, mediaType.video, stream, peer_name, peer_info); + } else { + this.handleConsumer(consumer.id, mediaType.audio, stream, peer_name, peer_info); + } + + consumer.on( + 'trackended', + function () { + this.removeConsumer(consumer.id); + }.bind(this), + ); + + consumer.on( + 'transportclose', + function () { + this.removeConsumer(consumer.id); + }.bind(this), + ); + }.bind(this), + ); + } + + async getConsumeStream(producerId) { + const { rtpCapabilities } = this.device; + const data = await this.socket.request('consume', { + rtpCapabilities, + consumerTransportId: this.consumerTransport.id, + producerId, + }); + const { id, kind, rtpParameters } = data; + const codecOptions = {}; + const consumer = await this.consumerTransport.consume({ + id, + producerId, + kind, + rtpParameters, + codecOptions, + }); + const stream = new MediaStream(); + stream.addTrack(consumer.track); + + return { + consumer, + stream, + kind, + }; + } + + handleConsumer(id, type, stream, peer_name, peer_info) { + let elem, d, p; + switch (type) { + case mediaType.video: + d = document.createElement('div'); + d.className = 'd'; + d.id = id + '_d'; + elem = document.createElement('video'); + elem.id = id; + elem.playsinline = false; + elem.autoplay = true; + elem.className = 'vid'; + elem.poster = image.poster; + p = document.createElement('p'); + p.id = id + '_name'; + p.innerHTML = '👤 ' + peer_name; + d.appendChild(elem); + d.appendChild(p); + this.remoteVideoEl.appendChild(d); + this.attachMediaStream(elem, stream, mediaType.video, 'Consumer'); + this.handleFS(elem.id); + this.setTippy(elem.id, 'Full Screen', 'top-end'); + if (this.debug) { + this.setTippy( + p.id, + JSON.stringify( + peer_info, + ['peerName', 'isMobileDevice', 'osName', 'osVersion', 'browserName', 'browserVersion'], + 2, + ), + 'top-start', + ); + } + this.sound('joined'); + break; + case mediaType.audio: + elem = document.createElement('audio'); + elem.id = id; + elem.playsinline = false; + elem.autoplay = true; + this.remoteAudioEl.appendChild(elem); + this.attachMediaStream(elem, stream, mediaType.audio, 'Consumer'); + break; + } + return elem; + } + + removeConsumer(consumer_id) { + let elem = this.getId(consumer_id); + let d = this.getId(consumer_id + '_d'); + elem.srcObject.getTracks().forEach(function (track) { + track.stop(); + }); + if (d) d.parentNode.removeChild(d); + + this.consumers.delete(consumer_id); + this.sound('left'); + } + + // #################################################### + // EXIT ROOM + // #################################################### + + exit(offline = false) { + let clean = function () { + this._isConnected = false; + this.consumerTransport.close(); + this.producerTransport.close(); + this.socket.off('disconnect'); + this.socket.off('newProducers'); + this.socket.off('consumerClosed'); + }.bind(this); + + if (!offline) { + this.socket + .request('exitRoom') + .then((e) => console.log('Exit Room', e)) + .catch((e) => console.warn('Exit Room ', e)) + .finally( + function () { + clean(); + }.bind(this), + ); + } else { + clean(); + } + + this.event(_EVENTS.exitRoom); + } + + // #################################################### + // HELPERS + // #################################################### + + attachMediaStream(elem, stream, mediaType, type) { + console.log(type + ' Success attached media ' + mediaType); + elem.srcObject = stream; + } + + attachSinkId(elem, sinkId) { + if (typeof elem.sinkId !== 'undefined') { + elem.setSinkId(sinkId) + .then(() => { + console.log(`Success, audio output device attached: ${sinkId}`); + }) + .catch((err) => { + let errorMessage = err; + if (err.name === 'SecurityError') + errorMessage = `You need to use HTTPS for selecting audio output device: ${err}`; + console.error('Attach SinkId error: ', errorMessage); + this.userLog('error', errorMessage, 'top-end'); + this.getId('speakerSelect').selectedIndex = 0; + }); + } else { + let error = `Browser seems doesn't support output device selection.`; + console.warn(error); + this.userLog('error', error, 'top-end'); + } + } + + event(evt) { + if (this.eventListeners.has(evt)) { + this.eventListeners.get(evt).forEach((callback) => callback()); + } + } + + on(evt, callback) { + this.eventListeners.get(evt).push(callback); + } + + // #################################################### + // SET + // #################################################### + + setTippy(elem, content, placement) { + if (DetectRTC.isMobileDevice) return; + tippy(this.getId(elem), { + content: content, + placement: placement, + }); + } + + // #################################################### + // GET + // #################################################### + + isConnected() { + return this._isConnected; + } + + isRecording() { + return this._isRecording; + } + + static get mediaType() { + return mediaType; + } + + static get EVENTS() { + return _EVENTS; + } + + getTimeNow() { + return new Date().toTimeString().split(' ')[0]; + } + + getId(id) { + return document.getElementById(id); + } + + async getMyRoomInfo() { + let roomInfo = await this.socket.request('getMyRoomInfo'); + console.log('Room info', roomInfo); + return roomInfo; + } + + // #################################################### + // UTILITY + // #################################################### + + toggleDevices() { + this.getId('myDevices').classList.toggle('show'); + } + + async sound(name) { + let sound = '../sounds/' + name + '.wav'; + let audioToPlay = new Audio(sound); + try { + await audioToPlay.play(); + } catch (err) { + return false; + } + } + + userLog(icon, message, position) { + const Toast = Swal.mixin({ + background: swalBackground, + toast: true, + position: position, + showConfirmButton: false, + timer: 5000, + }); + Toast.fire({ + icon: icon, + title: message, + }); + } + + thereIsConsumers() { + if (this.consumers.size > 0) { + return true; + } + this.userLog('info', 'No participants in the room', 'top-end'); + return false; + } + + // #################################################### + // FULL SCREEN + // #################################################### + + toggleFullScreen() { + if (!document.fullscreenElement) { + document.documentElement.requestFullscreen(); + this.isDocumentOnFullScreen = true; + } else { + if (document.exitFullscreen) { + document.exitFullscreen(); + this.isDocumentOnFullScreen = false; + } + } + } + + handleFS(id) { + let videoPlayer = this.getId(id); + videoPlayer.addEventListener('fullscreenchange', (e) => { + if (videoPlayer.controls || this.isDocumentOnFullScreen) return; + let fullscreenElement = document.fullscreenElement; + if (!fullscreenElement) { + videoPlayer.style.pointerEvents = 'auto'; + this.isVideoOnFullScreen = false; + } + }); + videoPlayer.addEventListener('webkitfullscreenchange', (e) => { + if (videoPlayer.controls || this.isDocumentOnFullScreen) return; + let webkitIsFullScreen = document.webkitIsFullScreen; + if (!webkitIsFullScreen) { + videoPlayer.style.pointerEvents = 'auto'; + this.isVideoOnFullScreen = false; + } + }); + videoPlayer.addEventListener('click', () => { + if (videoPlayer.controls || this.isDocumentOnFullScreen) return; + if (!this.isVideoOnFullScreen) { + if (videoPlayer.requestFullscreen) { + videoPlayer.requestFullscreen(); + } else if (videoPlayer.webkitRequestFullscreen) { + videoPlayer.webkitRequestFullscreen(); + } else if (videoPlayer.msRequestFullscreen) { + videoPlayer.msRequestFullscreen(); + } + this.isVideoOnFullScreen = true; + videoPlayer.style.pointerEvents = 'none'; + } else { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + this.isVideoOnFullScreen = false; + videoPlayer.style.pointerEvents = 'auto'; + } + }); + } + + // #################################################### + // DRAGGABLE + // #################################################### + + makeDraggable(elmnt, dragObj) { + let pos1 = 0, + pos2 = 0, + pos3 = 0, + pos4 = 0; + if (dragObj) { + dragObj.onmousedown = dragMouseDown; + } else { + elmnt.onmousedown = dragMouseDown; + } + function dragMouseDown(e) { + e = e || window.event; + e.preventDefault(); + pos3 = e.clientX; + pos4 = e.clientY; + document.onmouseup = closeDragElement; + document.onmousemove = elementDrag; + } + function elementDrag(e) { + e = e || window.event; + e.preventDefault(); + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + elmnt.style.top = elmnt.offsetTop - pos2 + 'px'; + elmnt.style.left = elmnt.offsetLeft - pos1 + 'px'; + } + function closeDragElement() { + document.onmouseup = null; + document.onmousemove = null; + } + } + + // #################################################### + // CHAT + // #################################################### + + toggleChat() { + let chatRoom = this.getId('chatRoom'); + if (this.isChatOpen == false) { + chatRoom.style.display = 'block'; + chatRoom.style.top = '50%'; + chatRoom.style.left = '50%'; + this.sound('open'); + this.isChatOpen = true; + } else { + chatRoom.style.display = 'none'; + this.isChatOpen = false; + } + } + + toggleChatEmoji() { + this.getId('chatEmoji').classList.toggle('show'); + } + + sendMessage() { + if (!this.thereIsConsumers()) { + chatMessage.value = ''; + return; + } + let peer_msg = this.formatMsg(chatMessage.value); + if (!peer_msg) return; + let data = { + peer_name: this.peer_name, + peer_msg: peer_msg, + }; + this.socket.emit('message', data); + this.setMsgAvatar('right', this.peer_name); + this.appendMessage('right', this.rightMsgAvatar, this.peer_name, peer_msg); + chatMessage.value = ''; + } + + showMessage(data) { + if (!this.isChatOpen) this.toggleChat(); + this.setMsgAvatar('left', data.peer_name); + this.appendMessage('left', this.leftMsgAvatar, data.peer_name, data.peer_msg); + this.sound('message'); + } + + setMsgAvatar(avatar, peerName) { + let avatarImg = cfg.msgAvatar + '?name=' + peerName + '&size=32' + '&background=random&rounded=true'; + avatar === 'left' ? (this.leftMsgAvatar = avatarImg) : (this.rightMsgAvatar = avatarImg); + } + + appendMessage(side, img, from, msg) { + let time = this.getTimeNow(); + let msgHTML = ` +
    +
    +
    +
    +
    ${from}
    +
    ${time}
    +
    +
    ${msg}
    +
    +
    + `; + this.collectMessages(time, from, msg); + chatMsger.insertAdjacentHTML('beforeend', msgHTML); + chatMsger.scrollTop += 500; + } + + formatMsg(message) { + let urlRegex = /(https?:\/\/[^\s]+)/g; + return message.replace(urlRegex, (url) => { + if (message.match(/\.(jpeg|jpg|gif|png|tiff|bmp)$/)) + return 'img'; + return '' + url + ''; + }); + } + + collectMessages(time, from, msg) { + this.chatMessages.push({ + time: time, + from: from, + msg: msg, + }); + } + + chatClean() { + Swal.fire({ + background: swalBackground, + position: 'center', + title: 'Clean up chat Messages?', + imageUrl: image.delete, + showDenyButton: true, + confirmButtonText: `Yes`, + denyButtonText: `No`, + showClass: { + popup: 'animate__animated animate__fadeInDown', + }, + hideClass: { + popup: 'animate__animated animate__fadeOutUp', + }, + }).then((result) => { + if (result.isConfirmed) { + let msgs = chatMsger.firstChild; + while (msgs) { + chatMsger.removeChild(msgs); + msgs = chatMsger.firstChild; + } + this.chatMessages = []; + } + }); + } + + chatSave() { + if (this.chatMessages.length === 0) { + userLog('info', 'No chat messages to save', 'top-end'); + return; + } + + const newDate = new Date(); + const date = newDate.toISOString().split('T')[0]; + const time = newDate.toTimeString().split(' ')[0]; + + let a = document.createElement('a'); + a.href = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(this.chatMessages, null, 1)); + a.download = `${date}-${time}` + '-CHAT.txt'; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }, 100); + } + + // #################################################### + // RECORDING + // #################################################### + + toggleRecording() { + this.getId('recording').classList.toggle('show'); + } + + getSupportedMimeTypes() { + const possibleTypes = [ + 'video/webm;codecs=vp9,opus', + 'video/webm;codecs=vp8,opus', + 'video/webm;codecs=h264,opus', + 'video/mp4;codecs=h264,aac', + 'video/mp4', + ]; + return possibleTypes.filter((mimeType) => { + return MediaRecorder.isTypeSupported(mimeType); + }); + } + + startRecording() { + recordedBlobs = []; + let options = this.getSupportedMimeTypes(); + console.log('MediaRecorder supported options', options); + options = { mimeType: options[0] }; + try { + if (this.isMobileDevice) { + // on mobile devices recording camera + audio + let newStream = this.getNewStream(this.localVideoStream, this.localAudioStream); + this.mediaRecorder = new MediaRecorder(newStream, options); + console.log('Created MediaRecorder', this.mediaRecorder, 'with options', options); + this.getId('swapCameraButton').className = 'hidden'; + this._isRecording = true; + this.handleMediaRecorder(); + this.event(_EVENTS.startRec); + this.sound('recStart'); + } else { + // on desktop devices recording screen/window... + audio + const constraints = { video: true }; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then((screenStream) => { + this.recScreenStream = this.getNewStream(screenStream, this.localAudioStream); + this.mediaRecorder = new MediaRecorder(this.recScreenStream, options); + console.log('Created MediaRecorder', this.mediaRecorder, 'with options', options); + this._isRecording = true; + this.handleMediaRecorder(); + this.event(_EVENTS.startRec); + this.sound('recStart'); + }) + .catch((err) => { + console.error('Error Unable to recording the screen + audio', err); + this.userLog('error', 'Unable to recording the screen + audio reason: ' + err, 'top-end'); + }); + } + } catch (err) { + console.error('Exception while creating MediaRecorder: ', err); + this.userLog('error', "Can't start stream recording reason: " + err, 'top-end'); + return; + } + } + + getNewStream(videoStream, audioStream) { + let newStream = null; + let videoStreamTrack = videoStream ? videoStream.getVideoTracks()[0] : undefined; + let audioStreamTrack = audioStream ? audioStream.getAudioTracks()[0] : undefined; + if (videoStreamTrack && audioStreamTrack) { + newStream = new MediaStream([videoStreamTrack, audioStreamTrack]); + } else if (videoStreamTrack) { + newStream = new MediaStream([videoStreamTrack]); + } else if (audioStreamTrack) { + newStream = new MediaStream([audioStreamTrack]); + } + return newStream; + } + + handleMediaRecorder() { + this.mediaRecorder.start(); + this.mediaRecorder.addEventListener('start', this.handleMediaRecorderStart); + this.mediaRecorder.addEventListener('dataavailable', this.handleMediaRecorderData); + this.mediaRecorder.addEventListener('stop', this.handleMediaRecorderStop); + } + + handleMediaRecorderStart(evt) { + console.log('MediaRecorder started: ', evt); + } + + handleMediaRecorderData(evt) { + console.log('MediaRecorder data: ', evt); + if (evt.data && evt.data.size > 0) recordedBlobs.push(evt.data); + } + + handleMediaRecorderStop(evt) { + try { + console.log('MediaRecorder stopped: ', evt); + console.log('MediaRecorder Blobs: ', recordedBlobs); + + const newDate = new Date(); + const date = newDate.toISOString().split('T')[0]; + const time = newDate.toTimeString().split(' ')[0]; + + const type = recordedBlobs[0].type.includes('mp4') ? 'mp4' : 'webm'; + const blob = new Blob(recordedBlobs, { type: 'video/' + type }); + const recFileName = `${date}-${time}` + '-REC.' + type; + + console.log('MediaRecorder Download Blobs'); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.style.display = 'none'; + a.href = url; + a.download = recFileName; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }, 100); + console.log(`🔴 Recording FILE: ${recFileName} done 👍`); + } catch (ex) { + console.warn('Recording save failed', ex); + } + } + + pauseRecording() { + this._isRecording = false; + this.mediaRecorder.pause(); + this.event(_EVENTS.pauseRec); + } + + resumeRecording() { + this._isRecording = true; + this.mediaRecorder.resume(); + this.event(_EVENTS.resumeRec); + } + + stopRecording() { + this._isRecording = false; + this.mediaRecorder.stop(); + if (this.recScreenStream) { + this.recScreenStream.getTracks().forEach((track) => { + if (track.kind === 'video') track.stop(); + }); + } + if (this.isMobileDevice) this.getId('swapCameraButton').className = ''; + this.getId('recordingStatus').innerHTML = '🔴 REC 0s'; + this.event(_EVENTS.stopRec); + this.sound('recStop'); + } +} diff --git a/public/js/landing.js b/public/js/landing.js new file mode 100644 index 0000000..e90aaf7 --- /dev/null +++ b/public/js/landing.js @@ -0,0 +1,58 @@ +!(function () { + window; + const e = document.documentElement; + if ((e.classList.remove('no-js'), e.classList.add('js'), document.body.classList.contains('has-animations'))) { + (window.sr = ScrollReveal()).reveal('.feature, .pricing-table-inner', { + duration: 600, + distance: '20px', + easing: 'cubic-bezier(0.5, -0.01, 0, 1.005)', + origin: 'bottom', + interval: 100, + }), + e.classList.add('anime-ready'), + anime + .timeline({ targets: '.hero-figure-box-05' }) + .add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400), + }) + .add({ duration: 400, easing: 'easeInOutExpo', scaleX: 1 }) + .add({ + duration: 800, + rotateY: '-15deg', + rotateX: '8deg', + rotateZ: '-1deg', + }), + anime + .timeline({ targets: '.hero-figure-box-06, .hero-figure-box-07' }) + .add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400), + }) + .add({ duration: 400, easing: 'easeInOutExpo', scaleX: 1 }) + .add({ duration: 800, rotateZ: '20deg' }), + anime({ + targets: + '.hero-figure-box-01, .hero-figure-box-02, .hero-figure-box-03, .hero-figure-box-04, .hero-figure-box-08, .hero-figure-box-09, .hero-figure-box-10', + duration: anime.random(600, 800), + delay: anime.random(600, 800), + rotate: [ + anime.random(-360, 360), + function (e) { + return e.getAttribute('data-rotation'); + }, + ], + scale: [0.7, 1], + opacity: [0, 1], + easing: 'easeInOutExpo', + }); + } +})(); diff --git a/public/js/newroom.js b/public/js/newroom.js new file mode 100644 index 0000000..995c73a --- /dev/null +++ b/public/js/newroom.js @@ -0,0 +1,155 @@ +'use strict'; + +let adjectives = [ + 'small', + 'big', + 'large', + 'smelly', + 'new', + 'happy', + 'shiny', + 'old', + 'clean', + 'nice', + 'bad', + 'cool', + 'hot', + 'cold', + 'warm', + 'hungry', + 'slow', + 'fast', + 'red', + 'white', + 'black', + 'blue', + 'green', + 'basic', + 'strong', + 'cute', + 'poor', + 'nice', + 'huge', + 'rare', + 'lucky', + 'weak', + 'tall', + 'short', + 'tiny', + 'great', + 'long', + 'single', + 'rich', + 'young', + 'dirty', + 'fresh', + 'brown', + 'dark', + 'crazy', + 'sad', + 'loud', + 'brave', + 'calm', + 'silly', + 'smart', +]; + +let nouns = [ + 'dog', + 'bat', + 'wrench', + 'apple', + 'pear', + 'ghost', + 'cat', + 'wolf', + 'squid', + 'goat', + 'snail', + 'hat', + 'sock', + 'plum', + 'bear', + 'snake', + 'turtle', + 'horse', + 'spoon', + 'fork', + 'spider', + 'tree', + 'chair', + 'table', + 'couch', + 'towel', + 'panda', + 'bread', + 'grape', + 'cake', + 'brick', + 'rat', + 'mouse', + 'bird', + 'oven', + 'phone', + 'photo', + 'frog', + 'bear', + 'camel', + 'sheep', + 'shark', + 'tiger', + 'zebra', + 'duck', + 'eagle', + 'fish', + 'kitten', + 'lobster', + 'monkey', + 'owl', + 'puppy', + 'pig', + 'rabbit', + 'fox', + 'whale', + 'beaver', + 'gorilla', + 'lizard', + 'parrot', + 'sloth', + 'swan', +]; + +function getRandomNumber(length) { + let result = ''; + let characters = '0123456789'; + let charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +let adjective = adjectives[Math.floor(Math.random() * adjectives.length)]; +let noun = nouns[Math.floor(Math.random() * nouns.length)]; +let num = getRandomNumber(5); +noun = noun.charAt(0).toUpperCase() + noun.substring(1); +adjective = adjective.charAt(0).toUpperCase() + adjective.substring(1); +document.getElementById('roomName').value = ''; + +// #################################################### +// TYPPING EFECT +// #################################################### + +let i = 0; +let txt = num + adjective + noun; +let speed = 100; + +function typeWriter() { + if (i < txt.length) { + document.getElementById('roomName').value += txt.charAt(i); + i++; + setTimeout(typeWriter, speed); + } +} + +typeWriter(); diff --git a/public/landing.html b/public/landing.html new file mode 100644 index 0000000..4482cfd --- /dev/null +++ b/public/landing.html @@ -0,0 +1,246 @@ + + + + + + MiroTalk SFU a Free Video Calls and Screen Sharing. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    +
    +

    + MiroTalk SFU
    Free browser based real-time video calls.
    + Simple, Secure, Fast. +

    +

    + Start your next video call with a single click. No download, plug-in or login + required. Just get straight to talking, messaging and sharing your screen. +

    +
    + TRY NOW +
    +
    + +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    + Unlimited number of conference rooms and users without call time limitation! +

    +

    + MiroTalk with SFU integrated Server. We engineered a platform with maximum video + quality lowest latency that makes your calls crystal clear. +

    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + mirotalksfu-screen +
    +

    Screen Sharing

    +

    + Share your screen, application window, present your documents, slides and + more. +

    +
    +
    +
    +
    +
    + mirotalksfu-webcam +
    +

    WebCam Streaming

    +

    + Having the webcam on, allows participants to make a deeper connection with + you. Up to 4k resolution. +

    +
    +
    +
    +
    +
    + mirotalksfu-audio +
    +

    Audio Streaming

    +

    + Echo cancellation and noise suppression that makes your audio crystal clear. +

    +
    +
    +
    +
    +
    + mirotalksfu-chat +
    +

    Chat

    +

    + Chat with others in meeting with integrated emoji picker to show you + feeling. +

    +
    +
    +
    +
    +
    + mirotalksfu-recording +
    +

    Recording meeting

    +

    + Record your Screen, Video and Audio on Your browser Blobs. Save it for use + it in future or to share with others. +

    +
    +
    +
    +
    +
    + mirotalksfu-recording +
    +

    Total privacy

    +

    + Data stays between you and your participants. MiroTalk SFU don't collect or + share personal information. +

    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Meet the team

    +
    + Team member author +
    + +
    Miroslav Pejic
    +
    + Full Stack Developer +
    +
    +
    +
    +
    + + +
    + + + + + diff --git a/public/modules/MediasoupClient.js b/public/modules/MediasoupClient.js new file mode 100644 index 0000000..2af1358 --- /dev/null +++ b/public/modules/MediasoupClient.js @@ -0,0 +1,13394 @@ +(function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw ((a.code = 'MODULE_NOT_FOUND'), a); + } + var p = (n[i] = { exports: {} }); + e[i][0].call( + p.exports, + function (r) { + var n = e[i][1][r]; + return o(n || r); + }, + p, + p.exports, + r, + e, + n, + t, + ); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o; + } + return r; +})()( + { + 1: [ + function (require, module, exports) { + const client = require('mediasoup-client'); + window.mediasoupClient = client; + }, + { 'mediasoup-client': 35 }, + ], + 2: [ + function (require, module, exports) { + 'use strict'; + var __awaiter = + (this && this.__awaiter) || + function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator['throw'](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, '__esModule', { value: true }); + class AwaitQueue { + constructor( + { ClosedErrorClass = Error, StoppedErrorClass = Error } = { + ClosedErrorClass: Error, + StoppedErrorClass: Error, + }, + ) { + // Closed flag. + this.closed = false; + // Queue of pending tasks. + this.pendingTasks = []; + // Error class used when rejecting a task due to AwaitQueue being closed. + this.ClosedErrorClass = Error; + // Error class used when rejecting a task due to AwaitQueue being stopped. + this.StoppedErrorClass = Error; + this.ClosedErrorClass = ClosedErrorClass; + this.StoppedErrorClass = StoppedErrorClass; + } + /** + * The number of ongoing enqueued tasks. + */ + get size() { + return this.pendingTasks.length; + } + /** + * Closes the AwaitQueue. Pending tasks will be rejected with ClosedErrorClass + * error. + */ + close() { + if (this.closed) return; + this.closed = true; + for (const pendingTask of this.pendingTasks) { + pendingTask.stopped = true; + pendingTask.reject(new this.ClosedErrorClass('AwaitQueue closed')); + } + // Enpty the pending tasks array. + this.pendingTasks.length = 0; + } + /** + * Accepts a task as argument (and an optional task name) and enqueues it after + * pending tasks. Once processed, the push() method resolves (or rejects) with + * the result returned by the given task. + * + * The given task must return a Promise or directly a value. + */ + push(task, name) { + return __awaiter(this, void 0, void 0, function* () { + if (this.closed) throw new this.ClosedErrorClass('AwaitQueue closed'); + if (typeof task !== 'function') throw new TypeError('given task is not a function'); + if (!task.name && name) { + try { + Object.defineProperty(task, 'name', { value: name }); + } catch (error) {} + } + return new Promise((resolve, reject) => { + const pendingTask = { + task, + name, + resolve, + reject, + stopped: false, + enqueuedAt: new Date(), + executedAt: undefined, + }; + // Append task to the queue. + this.pendingTasks.push(pendingTask); + // And run it if this is the only task in the queue. + if (this.pendingTasks.length === 1) this.next(); + }); + }); + } + /** + * Make ongoing pending tasks reject with the given StoppedErrorClass error. + * The AwaitQueue instance is still usable for future tasks added via push() + * method. + */ + stop() { + if (this.closed) return; + for (const pendingTask of this.pendingTasks) { + pendingTask.stopped = true; + pendingTask.reject(new this.StoppedErrorClass('AwaitQueue stopped')); + } + // Enpty the pending tasks array. + this.pendingTasks.length = 0; + } + dump() { + const now = new Date(); + return this.pendingTasks.map((pendingTask) => { + return { + task: pendingTask.task, + name: pendingTask.name, + enqueuedTime: pendingTask.executedAt + ? pendingTask.executedAt.getTime() - pendingTask.enqueuedAt.getTime() + : now.getTime() - pendingTask.enqueuedAt.getTime(), + executingTime: pendingTask.executedAt + ? now.getTime() - pendingTask.executedAt.getTime() + : 0, + }; + }); + } + next() { + return __awaiter(this, void 0, void 0, function* () { + // Take the first pending task. + const pendingTask = this.pendingTasks[0]; + if (!pendingTask) return; + // Execute it. + yield this.executeTask(pendingTask); + // Remove the first pending task (the completed one) from the queue. + this.pendingTasks.shift(); + // And continue. + this.next(); + }); + } + executeTask(pendingTask) { + return __awaiter(this, void 0, void 0, function* () { + // If the task is stopped, ignore it. + if (pendingTask.stopped) return; + pendingTask.executedAt = new Date(); + try { + const result = yield pendingTask.task(); + // If the task is stopped, ignore it. + if (pendingTask.stopped) return; + // Resolve the task with the returned result (if any). + pendingTask.resolve(result); + } catch (error) { + // If the task is stopped, ignore it. + if (pendingTask.stopped) return; + // Reject the task with its own error. + pendingTask.reject(error); + } + }); + } + } + exports.AwaitQueue = AwaitQueue; + }, + {}, + ], + 3: [ + function (require, module, exports) { + !(function (e, t) { + 'object' == typeof exports && 'object' == typeof module + ? (module.exports = t()) + : 'function' == typeof define && define.amd + ? define([], t) + : 'object' == typeof exports + ? (exports.bowser = t()) + : (e.bowser = t()); + })(this, function () { + return (function (e) { + var t = {}; + function r(n) { + if (t[n]) return t[n].exports; + var i = (t[n] = { i: n, l: !1, exports: {} }); + return e[n].call(i.exports, i, i.exports, r), (i.l = !0), i.exports; + } + return ( + (r.m = e), + (r.c = t), + (r.d = function (e, t, n) { + r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n }); + }), + (r.r = function (e) { + 'undefined' != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), + Object.defineProperty(e, '__esModule', { value: !0 }); + }), + (r.t = function (e, t) { + if ((1 & t && (e = r(e)), 8 & t)) return e; + if (4 & t && 'object' == typeof e && e && e.__esModule) return e; + var n = Object.create(null); + if ( + (r.r(n), + Object.defineProperty(n, 'default', { enumerable: !0, value: e }), + 2 & t && 'string' != typeof e) + ) + for (var i in e) + r.d( + n, + i, + function (t) { + return e[t]; + }.bind(null, i), + ); + return n; + }), + (r.n = function (e) { + var t = + e && e.__esModule + ? function () { + return e.default; + } + : function () { + return e; + }; + return r.d(t, 'a', t), t; + }), + (r.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (r.p = ''), + r((r.s = 90)) + ); + })({ + 17: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n = r(18), + i = (function () { + function e() {} + return ( + (e.getFirstMatch = function (e, t) { + var r = t.match(e); + return (r && r.length > 0 && r[1]) || ''; + }), + (e.getSecondMatch = function (e, t) { + var r = t.match(e); + return (r && r.length > 1 && r[2]) || ''; + }), + (e.matchAndReturnConst = function (e, t, r) { + if (e.test(t)) return r; + }), + (e.getWindowsVersionName = function (e) { + switch (e) { + case 'NT': + return 'NT'; + case 'XP': + return 'XP'; + case 'NT 5.0': + return '2000'; + case 'NT 5.1': + return 'XP'; + case 'NT 5.2': + return '2003'; + case 'NT 6.0': + return 'Vista'; + case 'NT 6.1': + return '7'; + case 'NT 6.2': + return '8'; + case 'NT 6.3': + return '8.1'; + case 'NT 10.0': + return '10'; + default: + return; + } + }), + (e.getMacOSVersionName = function (e) { + var t = e + .split('.') + .splice(0, 2) + .map(function (e) { + return parseInt(e, 10) || 0; + }); + if ((t.push(0), 10 === t[0])) + switch (t[1]) { + case 5: + return 'Leopard'; + case 6: + return 'Snow Leopard'; + case 7: + return 'Lion'; + case 8: + return 'Mountain Lion'; + case 9: + return 'Mavericks'; + case 10: + return 'Yosemite'; + case 11: + return 'El Capitan'; + case 12: + return 'Sierra'; + case 13: + return 'High Sierra'; + case 14: + return 'Mojave'; + case 15: + return 'Catalina'; + default: + return; + } + }), + (e.getAndroidVersionName = function (e) { + var t = e + .split('.') + .splice(0, 2) + .map(function (e) { + return parseInt(e, 10) || 0; + }); + if ((t.push(0), !(1 === t[0] && t[1] < 5))) + return 1 === t[0] && t[1] < 6 + ? 'Cupcake' + : 1 === t[0] && t[1] >= 6 + ? 'Donut' + : 2 === t[0] && t[1] < 2 + ? 'Eclair' + : 2 === t[0] && 2 === t[1] + ? 'Froyo' + : 2 === t[0] && t[1] > 2 + ? 'Gingerbread' + : 3 === t[0] + ? 'Honeycomb' + : 4 === t[0] && t[1] < 1 + ? 'Ice Cream Sandwich' + : 4 === t[0] && t[1] < 4 + ? 'Jelly Bean' + : 4 === t[0] && t[1] >= 4 + ? 'KitKat' + : 5 === t[0] + ? 'Lollipop' + : 6 === t[0] + ? 'Marshmallow' + : 7 === t[0] + ? 'Nougat' + : 8 === t[0] + ? 'Oreo' + : 9 === t[0] + ? 'Pie' + : void 0; + }), + (e.getVersionPrecision = function (e) { + return e.split('.').length; + }), + (e.compareVersions = function (t, r, n) { + void 0 === n && (n = !1); + var i = e.getVersionPrecision(t), + s = e.getVersionPrecision(r), + a = Math.max(i, s), + o = 0, + u = e.map([t, r], function (t) { + var r = a - e.getVersionPrecision(t), + n = t + new Array(r + 1).join('.0'); + return e + .map(n.split('.'), function (e) { + return new Array(20 - e.length).join('0') + e; + }) + .reverse(); + }); + for (n && (o = a - Math.min(i, s)), a -= 1; a >= o; ) { + if (u[0][a] > u[1][a]) return 1; + if (u[0][a] === u[1][a]) { + if (a === o) return 0; + a -= 1; + } else if (u[0][a] < u[1][a]) return -1; + } + }), + (e.map = function (e, t) { + var r, + n = []; + if (Array.prototype.map) return Array.prototype.map.call(e, t); + for (r = 0; r < e.length; r += 1) n.push(t(e[r])); + return n; + }), + (e.find = function (e, t) { + var r, n; + if (Array.prototype.find) return Array.prototype.find.call(e, t); + for (r = 0, n = e.length; r < n; r += 1) { + var i = e[r]; + if (t(i, r)) return i; + } + }), + (e.assign = function (e) { + for ( + var t, + r, + n = e, + i = arguments.length, + s = new Array(i > 1 ? i - 1 : 0), + a = 1; + a < i; + a++ + ) + s[a - 1] = arguments[a]; + if (Object.assign) return Object.assign.apply(Object, [e].concat(s)); + var o = function () { + var e = s[t]; + 'object' == typeof e && + null !== e && + Object.keys(e).forEach(function (t) { + n[t] = e[t]; + }); + }; + for (t = 0, r = s.length; t < r; t += 1) o(); + return e; + }), + (e.getBrowserAlias = function (e) { + return n.BROWSER_ALIASES_MAP[e]; + }), + (e.getBrowserTypeByAlias = function (e) { + return n.BROWSER_MAP[e] || ''; + }), + e + ); + })(); + (t.default = i), (e.exports = t.default); + }, + 18: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), + (t.ENGINE_MAP = + t.OS_MAP = + t.PLATFORMS_MAP = + t.BROWSER_MAP = + t.BROWSER_ALIASES_MAP = + void 0); + t.BROWSER_ALIASES_MAP = { + 'Amazon Silk': 'amazon_silk', + 'Android Browser': 'android', + Bada: 'bada', + BlackBerry: 'blackberry', + Chrome: 'chrome', + Chromium: 'chromium', + Electron: 'electron', + Epiphany: 'epiphany', + Firefox: 'firefox', + Focus: 'focus', + Generic: 'generic', + 'Google Search': 'google_search', + Googlebot: 'googlebot', + 'Internet Explorer': 'ie', + 'K-Meleon': 'k_meleon', + Maxthon: 'maxthon', + 'Microsoft Edge': 'edge', + 'MZ Browser': 'mz', + 'NAVER Whale Browser': 'naver', + Opera: 'opera', + 'Opera Coast': 'opera_coast', + PhantomJS: 'phantomjs', + Puffin: 'puffin', + QupZilla: 'qupzilla', + QQ: 'qq', + QQLite: 'qqlite', + Safari: 'safari', + Sailfish: 'sailfish', + 'Samsung Internet for Android': 'samsung_internet', + SeaMonkey: 'seamonkey', + Sleipnir: 'sleipnir', + Swing: 'swing', + Tizen: 'tizen', + 'UC Browser': 'uc', + Vivaldi: 'vivaldi', + 'WebOS Browser': 'webos', + WeChat: 'wechat', + 'Yandex Browser': 'yandex', + Roku: 'roku', + }; + t.BROWSER_MAP = { + amazon_silk: 'Amazon Silk', + android: 'Android Browser', + bada: 'Bada', + blackberry: 'BlackBerry', + chrome: 'Chrome', + chromium: 'Chromium', + electron: 'Electron', + epiphany: 'Epiphany', + firefox: 'Firefox', + focus: 'Focus', + generic: 'Generic', + googlebot: 'Googlebot', + google_search: 'Google Search', + ie: 'Internet Explorer', + k_meleon: 'K-Meleon', + maxthon: 'Maxthon', + edge: 'Microsoft Edge', + mz: 'MZ Browser', + naver: 'NAVER Whale Browser', + opera: 'Opera', + opera_coast: 'Opera Coast', + phantomjs: 'PhantomJS', + puffin: 'Puffin', + qupzilla: 'QupZilla', + qq: 'QQ Browser', + qqlite: 'QQ Browser Lite', + safari: 'Safari', + sailfish: 'Sailfish', + samsung_internet: 'Samsung Internet for Android', + seamonkey: 'SeaMonkey', + sleipnir: 'Sleipnir', + swing: 'Swing', + tizen: 'Tizen', + uc: 'UC Browser', + vivaldi: 'Vivaldi', + webos: 'WebOS Browser', + wechat: 'WeChat', + yandex: 'Yandex Browser', + }; + t.PLATFORMS_MAP = { tablet: 'tablet', mobile: 'mobile', desktop: 'desktop', tv: 'tv' }; + t.OS_MAP = { + WindowsPhone: 'Windows Phone', + Windows: 'Windows', + MacOS: 'macOS', + iOS: 'iOS', + Android: 'Android', + WebOS: 'WebOS', + BlackBerry: 'BlackBerry', + Bada: 'Bada', + Tizen: 'Tizen', + Linux: 'Linux', + ChromeOS: 'Chrome OS', + PlayStation4: 'PlayStation 4', + Roku: 'Roku', + }; + t.ENGINE_MAP = { + EdgeHTML: 'EdgeHTML', + Blink: 'Blink', + Trident: 'Trident', + Presto: 'Presto', + Gecko: 'Gecko', + WebKit: 'WebKit', + }; + }, + 90: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n, + i = (n = r(91)) && n.__esModule ? n : { default: n }, + s = r(18); + function a(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r]; + (n.enumerable = n.enumerable || !1), + (n.configurable = !0), + 'value' in n && (n.writable = !0), + Object.defineProperty(e, n.key, n); + } + } + var o = (function () { + function e() {} + var t, r, n; + return ( + (e.getParser = function (e, t) { + if ((void 0 === t && (t = !1), 'string' != typeof e)) + throw new Error('UserAgent should be a string'); + return new i.default(e, t); + }), + (e.parse = function (e) { + return new i.default(e).getResult(); + }), + (t = e), + (n = [ + { + key: 'BROWSER_MAP', + get: function () { + return s.BROWSER_MAP; + }, + }, + { + key: 'ENGINE_MAP', + get: function () { + return s.ENGINE_MAP; + }, + }, + { + key: 'OS_MAP', + get: function () { + return s.OS_MAP; + }, + }, + { + key: 'PLATFORMS_MAP', + get: function () { + return s.PLATFORMS_MAP; + }, + }, + ]), + (r = null) && a(t.prototype, r), + n && a(t, n), + e + ); + })(); + (t.default = o), (e.exports = t.default); + }, + 91: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n = u(r(92)), + i = u(r(93)), + s = u(r(94)), + a = u(r(95)), + o = u(r(17)); + function u(e) { + return e && e.__esModule ? e : { default: e }; + } + var d = (function () { + function e(e, t) { + if ((void 0 === t && (t = !1), null == e || '' === e)) + throw new Error("UserAgent parameter can't be empty"); + (this._ua = e), (this.parsedResult = {}), !0 !== t && this.parse(); + } + var t = e.prototype; + return ( + (t.getUA = function () { + return this._ua; + }), + (t.test = function (e) { + return e.test(this._ua); + }), + (t.parseBrowser = function () { + var e = this; + this.parsedResult.browser = {}; + var t = o.default.find(n.default, function (t) { + if ('function' == typeof t.test) return t.test(e); + if (t.test instanceof Array) + return t.test.some(function (t) { + return e.test(t); + }); + throw new Error("Browser's test function is not valid"); + }); + return ( + t && (this.parsedResult.browser = t.describe(this.getUA())), + this.parsedResult.browser + ); + }), + (t.getBrowser = function () { + return this.parsedResult.browser + ? this.parsedResult.browser + : this.parseBrowser(); + }), + (t.getBrowserName = function (e) { + return e + ? String(this.getBrowser().name).toLowerCase() || '' + : this.getBrowser().name || ''; + }), + (t.getBrowserVersion = function () { + return this.getBrowser().version; + }), + (t.getOS = function () { + return this.parsedResult.os ? this.parsedResult.os : this.parseOS(); + }), + (t.parseOS = function () { + var e = this; + this.parsedResult.os = {}; + var t = o.default.find(i.default, function (t) { + if ('function' == typeof t.test) return t.test(e); + if (t.test instanceof Array) + return t.test.some(function (t) { + return e.test(t); + }); + throw new Error("Browser's test function is not valid"); + }); + return ( + t && (this.parsedResult.os = t.describe(this.getUA())), this.parsedResult.os + ); + }), + (t.getOSName = function (e) { + var t = this.getOS().name; + return e ? String(t).toLowerCase() || '' : t || ''; + }), + (t.getOSVersion = function () { + return this.getOS().version; + }), + (t.getPlatform = function () { + return this.parsedResult.platform + ? this.parsedResult.platform + : this.parsePlatform(); + }), + (t.getPlatformType = function (e) { + void 0 === e && (e = !1); + var t = this.getPlatform().type; + return e ? String(t).toLowerCase() || '' : t || ''; + }), + (t.parsePlatform = function () { + var e = this; + this.parsedResult.platform = {}; + var t = o.default.find(s.default, function (t) { + if ('function' == typeof t.test) return t.test(e); + if (t.test instanceof Array) + return t.test.some(function (t) { + return e.test(t); + }); + throw new Error("Browser's test function is not valid"); + }); + return ( + t && (this.parsedResult.platform = t.describe(this.getUA())), + this.parsedResult.platform + ); + }), + (t.getEngine = function () { + return this.parsedResult.engine ? this.parsedResult.engine : this.parseEngine(); + }), + (t.getEngineName = function (e) { + return e + ? String(this.getEngine().name).toLowerCase() || '' + : this.getEngine().name || ''; + }), + (t.parseEngine = function () { + var e = this; + this.parsedResult.engine = {}; + var t = o.default.find(a.default, function (t) { + if ('function' == typeof t.test) return t.test(e); + if (t.test instanceof Array) + return t.test.some(function (t) { + return e.test(t); + }); + throw new Error("Browser's test function is not valid"); + }); + return ( + t && (this.parsedResult.engine = t.describe(this.getUA())), + this.parsedResult.engine + ); + }), + (t.parse = function () { + return ( + this.parseBrowser(), + this.parseOS(), + this.parsePlatform(), + this.parseEngine(), + this + ); + }), + (t.getResult = function () { + return o.default.assign({}, this.parsedResult); + }), + (t.satisfies = function (e) { + var t = this, + r = {}, + n = 0, + i = {}, + s = 0; + if ( + (Object.keys(e).forEach(function (t) { + var a = e[t]; + 'string' == typeof a + ? ((i[t] = a), (s += 1)) + : 'object' == typeof a && ((r[t] = a), (n += 1)); + }), + n > 0) + ) { + var a = Object.keys(r), + u = o.default.find(a, function (e) { + return t.isOS(e); + }); + if (u) { + var d = this.satisfies(r[u]); + if (void 0 !== d) return d; + } + var c = o.default.find(a, function (e) { + return t.isPlatform(e); + }); + if (c) { + var f = this.satisfies(r[c]); + if (void 0 !== f) return f; + } + } + if (s > 0) { + var l = Object.keys(i), + h = o.default.find(l, function (e) { + return t.isBrowser(e, !0); + }); + if (void 0 !== h) return this.compareVersion(i[h]); + } + }), + (t.isBrowser = function (e, t) { + void 0 === t && (t = !1); + var r = this.getBrowserName().toLowerCase(), + n = e.toLowerCase(), + i = o.default.getBrowserTypeByAlias(n); + return t && i && (n = i.toLowerCase()), n === r; + }), + (t.compareVersion = function (e) { + var t = [0], + r = e, + n = !1, + i = this.getBrowserVersion(); + if ('string' == typeof i) + return ( + '>' === e[0] || '<' === e[0] + ? ((r = e.substr(1)), + '=' === e[1] ? ((n = !0), (r = e.substr(2))) : (t = []), + '>' === e[0] ? t.push(1) : t.push(-1)) + : '=' === e[0] + ? (r = e.substr(1)) + : '~' === e[0] && ((n = !0), (r = e.substr(1))), + t.indexOf(o.default.compareVersions(i, r, n)) > -1 + ); + }), + (t.isOS = function (e) { + return this.getOSName(!0) === String(e).toLowerCase(); + }), + (t.isPlatform = function (e) { + return this.getPlatformType(!0) === String(e).toLowerCase(); + }), + (t.isEngine = function (e) { + return this.getEngineName(!0) === String(e).toLowerCase(); + }), + (t.is = function (e, t) { + return ( + void 0 === t && (t = !1), + this.isBrowser(e, t) || this.isOS(e) || this.isPlatform(e) + ); + }), + (t.some = function (e) { + var t = this; + return ( + void 0 === e && (e = []), + e.some(function (e) { + return t.is(e); + }) + ); + }), + e + ); + })(); + (t.default = d), (e.exports = t.default); + }, + 92: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n, + i = (n = r(17)) && n.__esModule ? n : { default: n }; + var s = /version\/(\d+(\.?_?\d+)+)/i, + a = [ + { + test: [/googlebot/i], + describe: function (e) { + var t = { name: 'Googlebot' }, + r = + i.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/opera/i], + describe: function (e) { + var t = { name: 'Opera' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/opr\/|opios/i], + describe: function (e) { + var t = { name: 'Opera' }, + r = + i.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/SamsungBrowser/i], + describe: function (e) { + var t = { name: 'Samsung Internet for Android' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch( + /(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, + e, + ); + return r && (t.version = r), t; + }, + }, + { + test: [/Whale/i], + describe: function (e) { + var t = { name: 'NAVER Whale Browser' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/MZBrowser/i], + describe: function (e) { + var t = { name: 'MZ Browser' }, + r = + i.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/focus/i], + describe: function (e) { + var t = { name: 'Focus' }, + r = + i.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/swing/i], + describe: function (e) { + var t = { name: 'Swing' }, + r = + i.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/coast/i], + describe: function (e) { + var t = { name: 'Opera Coast' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/opt\/\d+(?:.?_?\d+)+/i], + describe: function (e) { + var t = { name: 'Opera Touch' }, + r = + i.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/yabrowser/i], + describe: function (e) { + var t = { name: 'Yandex Browser' }, + r = + i.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/ucbrowser/i], + describe: function (e) { + var t = { name: 'UC Browser' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/Maxthon|mxios/i], + describe: function (e) { + var t = { name: 'Maxthon' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch( + /(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, + e, + ); + return r && (t.version = r), t; + }, + }, + { + test: [/epiphany/i], + describe: function (e) { + var t = { name: 'Epiphany' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/puffin/i], + describe: function (e) { + var t = { name: 'Puffin' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/sleipnir/i], + describe: function (e) { + var t = { name: 'Sleipnir' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/k-meleon/i], + describe: function (e) { + var t = { name: 'K-Meleon' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/micromessenger/i], + describe: function (e) { + var t = { name: 'WeChat' }, + r = + i.default.getFirstMatch( + /(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, + e, + ) || i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/qqbrowser/i], + describe: function (e) { + var t = { + name: /qqbrowserlite/i.test(e) ? 'QQ Browser Lite' : 'QQ Browser', + }, + r = + i.default.getFirstMatch( + /(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, + e, + ) || i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/msie|trident/i], + describe: function (e) { + var t = { name: 'Internet Explorer' }, + r = i.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/\sedg\//i], + describe: function (e) { + var t = { name: 'Microsoft Edge' }, + r = i.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/edg([ea]|ios)/i], + describe: function (e) { + var t = { name: 'Microsoft Edge' }, + r = i.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/vivaldi/i], + describe: function (e) { + var t = { name: 'Vivaldi' }, + r = i.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/seamonkey/i], + describe: function (e) { + var t = { name: 'SeaMonkey' }, + r = i.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/sailfish/i], + describe: function (e) { + var t = { name: 'Sailfish' }, + r = i.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/silk/i], + describe: function (e) { + var t = { name: 'Amazon Silk' }, + r = i.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/phantom/i], + describe: function (e) { + var t = { name: 'PhantomJS' }, + r = i.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/slimerjs/i], + describe: function (e) { + var t = { name: 'SlimerJS' }, + r = i.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe: function (e) { + var t = { name: 'BlackBerry' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/(web|hpw)[o0]s/i], + describe: function (e) { + var t = { name: 'WebOS Browser' }, + r = + i.default.getFirstMatch(s, e) || + i.default.getFirstMatch( + /w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, + e, + ); + return r && (t.version = r), t; + }, + }, + { + test: [/bada/i], + describe: function (e) { + var t = { name: 'Bada' }, + r = i.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/tizen/i], + describe: function (e) { + var t = { name: 'Tizen' }, + r = + i.default.getFirstMatch( + /(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, + e, + ) || i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/qupzilla/i], + describe: function (e) { + var t = { name: 'QupZilla' }, + r = + i.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/firefox|iceweasel|fxios/i], + describe: function (e) { + var t = { name: 'Firefox' }, + r = i.default.getFirstMatch( + /(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, + e, + ); + return r && (t.version = r), t; + }, + }, + { + test: [/electron/i], + describe: function (e) { + var t = { name: 'Electron' }, + r = i.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/MiuiBrowser/i], + describe: function (e) { + var t = { name: 'Miui' }, + r = i.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/chromium/i], + describe: function (e) { + var t = { name: 'Chromium' }, + r = + i.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, e) || + i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/chrome|crios|crmo/i], + describe: function (e) { + var t = { name: 'Chrome' }, + r = i.default.getFirstMatch( + /(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, + e, + ); + return r && (t.version = r), t; + }, + }, + { + test: [/GSA/i], + describe: function (e) { + var t = { name: 'Google Search' }, + r = i.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: function (e) { + var t = !e.test(/like android/i), + r = e.test(/android/i); + return t && r; + }, + describe: function (e) { + var t = { name: 'Android Browser' }, + r = i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/playstation 4/i], + describe: function (e) { + var t = { name: 'PlayStation 4' }, + r = i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/safari|applewebkit/i], + describe: function (e) { + var t = { name: 'Safari' }, + r = i.default.getFirstMatch(s, e); + return r && (t.version = r), t; + }, + }, + { + test: [/.*/i], + describe: function (e) { + var t = -1 !== e.search('\\(') ? /^(.*)\/(.*)[ \t]\((.*)/ : /^(.*)\/(.*) /; + return { + name: i.default.getFirstMatch(t, e), + version: i.default.getSecondMatch(t, e), + }; + }, + }, + ]; + (t.default = a), (e.exports = t.default); + }, + 93: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n, + i = (n = r(17)) && n.__esModule ? n : { default: n }, + s = r(18); + var a = [ + { + test: [/Roku\/DVP/], + describe: function (e) { + var t = i.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, e); + return { name: s.OS_MAP.Roku, version: t }; + }, + }, + { + test: [/windows phone/i], + describe: function (e) { + var t = i.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, e); + return { name: s.OS_MAP.WindowsPhone, version: t }; + }, + }, + { + test: [/windows /i], + describe: function (e) { + var t = i.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, e), + r = i.default.getWindowsVersionName(t); + return { name: s.OS_MAP.Windows, version: t, versionName: r }; + }, + }, + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe: function (e) { + var t = { name: s.OS_MAP.iOS }, + r = i.default.getSecondMatch(/(Version\/)(\d[\d.]+)/, e); + return r && (t.version = r), t; + }, + }, + { + test: [/macintosh/i], + describe: function (e) { + var t = i.default + .getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, e) + .replace(/[_\s]/g, '.'), + r = i.default.getMacOSVersionName(t), + n = { name: s.OS_MAP.MacOS, version: t }; + return r && (n.versionName = r), n; + }, + }, + { + test: [/(ipod|iphone|ipad)/i], + describe: function (e) { + var t = i.default + .getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, e) + .replace(/[_\s]/g, '.'); + return { name: s.OS_MAP.iOS, version: t }; + }, + }, + { + test: function (e) { + var t = !e.test(/like android/i), + r = e.test(/android/i); + return t && r; + }, + describe: function (e) { + var t = i.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, e), + r = i.default.getAndroidVersionName(t), + n = { name: s.OS_MAP.Android, version: t }; + return r && (n.versionName = r), n; + }, + }, + { + test: [/(web|hpw)[o0]s/i], + describe: function (e) { + var t = i.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, e), + r = { name: s.OS_MAP.WebOS }; + return t && t.length && (r.version = t), r; + }, + }, + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe: function (e) { + var t = + i.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, e) || + i.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, e) || + i.default.getFirstMatch(/\bbb(\d+)/i, e); + return { name: s.OS_MAP.BlackBerry, version: t }; + }, + }, + { + test: [/bada/i], + describe: function (e) { + var t = i.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, e); + return { name: s.OS_MAP.Bada, version: t }; + }, + }, + { + test: [/tizen/i], + describe: function (e) { + var t = i.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, e); + return { name: s.OS_MAP.Tizen, version: t }; + }, + }, + { + test: [/linux/i], + describe: function () { + return { name: s.OS_MAP.Linux }; + }, + }, + { + test: [/CrOS/], + describe: function () { + return { name: s.OS_MAP.ChromeOS }; + }, + }, + { + test: [/PlayStation 4/], + describe: function (e) { + var t = i.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, e); + return { name: s.OS_MAP.PlayStation4, version: t }; + }, + }, + ]; + (t.default = a), (e.exports = t.default); + }, + 94: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n, + i = (n = r(17)) && n.__esModule ? n : { default: n }, + s = r(18); + var a = [ + { + test: [/googlebot/i], + describe: function () { + return { type: 'bot', vendor: 'Google' }; + }, + }, + { + test: [/huawei/i], + describe: function (e) { + var t = i.default.getFirstMatch(/(can-l01)/i, e) && 'Nova', + r = { type: s.PLATFORMS_MAP.mobile, vendor: 'Huawei' }; + return t && (r.model = t), r; + }, + }, + { + test: [/nexus\s*(?:7|8|9|10).*/i], + describe: function () { + return { type: s.PLATFORMS_MAP.tablet, vendor: 'Nexus' }; + }, + }, + { + test: [/ipad/i], + describe: function () { + return { type: s.PLATFORMS_MAP.tablet, vendor: 'Apple', model: 'iPad' }; + }, + }, + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe: function () { + return { type: s.PLATFORMS_MAP.tablet, vendor: 'Apple', model: 'iPad' }; + }, + }, + { + test: [/kftt build/i], + describe: function () { + return { + type: s.PLATFORMS_MAP.tablet, + vendor: 'Amazon', + model: 'Kindle Fire HD 7', + }; + }, + }, + { + test: [/silk/i], + describe: function () { + return { type: s.PLATFORMS_MAP.tablet, vendor: 'Amazon' }; + }, + }, + { + test: [/tablet(?! pc)/i], + describe: function () { + return { type: s.PLATFORMS_MAP.tablet }; + }, + }, + { + test: function (e) { + var t = e.test(/ipod|iphone/i), + r = e.test(/like (ipod|iphone)/i); + return t && !r; + }, + describe: function (e) { + var t = i.default.getFirstMatch(/(ipod|iphone)/i, e); + return { type: s.PLATFORMS_MAP.mobile, vendor: 'Apple', model: t }; + }, + }, + { + test: [/nexus\s*[0-6].*/i, /galaxy nexus/i], + describe: function () { + return { type: s.PLATFORMS_MAP.mobile, vendor: 'Nexus' }; + }, + }, + { + test: [/[^-]mobi/i], + describe: function () { + return { type: s.PLATFORMS_MAP.mobile }; + }, + }, + { + test: function (e) { + return 'blackberry' === e.getBrowserName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.mobile, vendor: 'BlackBerry' }; + }, + }, + { + test: function (e) { + return 'bada' === e.getBrowserName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.mobile }; + }, + }, + { + test: function (e) { + return 'windows phone' === e.getBrowserName(); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.mobile, vendor: 'Microsoft' }; + }, + }, + { + test: function (e) { + var t = Number(String(e.getOSVersion()).split('.')[0]); + return 'android' === e.getOSName(!0) && t >= 3; + }, + describe: function () { + return { type: s.PLATFORMS_MAP.tablet }; + }, + }, + { + test: function (e) { + return 'android' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.mobile }; + }, + }, + { + test: function (e) { + return 'macos' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.desktop, vendor: 'Apple' }; + }, + }, + { + test: function (e) { + return 'windows' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.desktop }; + }, + }, + { + test: function (e) { + return 'linux' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.desktop }; + }, + }, + { + test: function (e) { + return 'playstation 4' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.tv }; + }, + }, + { + test: function (e) { + return 'roku' === e.getOSName(!0); + }, + describe: function () { + return { type: s.PLATFORMS_MAP.tv }; + }, + }, + ]; + (t.default = a), (e.exports = t.default); + }, + 95: function (e, t, r) { + 'use strict'; + (t.__esModule = !0), (t.default = void 0); + var n, + i = (n = r(17)) && n.__esModule ? n : { default: n }, + s = r(18); + var a = [ + { + test: function (e) { + return 'microsoft edge' === e.getBrowserName(!0); + }, + describe: function (e) { + if (/\sedg\//i.test(e)) return { name: s.ENGINE_MAP.Blink }; + var t = i.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, e); + return { name: s.ENGINE_MAP.EdgeHTML, version: t }; + }, + }, + { + test: [/trident/i], + describe: function (e) { + var t = { name: s.ENGINE_MAP.Trident }, + r = i.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: function (e) { + return e.test(/presto/i); + }, + describe: function (e) { + var t = { name: s.ENGINE_MAP.Presto }, + r = i.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: function (e) { + var t = e.test(/gecko/i), + r = e.test(/like gecko/i); + return t && !r; + }, + describe: function (e) { + var t = { name: s.ENGINE_MAP.Gecko }, + r = i.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + { + test: [/(apple)?webkit\/537\.36/i], + describe: function () { + return { name: s.ENGINE_MAP.Blink }; + }, + }, + { + test: [/(apple)?webkit/i], + describe: function (e) { + var t = { name: s.ENGINE_MAP.WebKit }, + r = i.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, e); + return r && (t.version = r), t; + }, + }, + ]; + (t.default = a), (e.exports = t.default); + }, + }); + }); + }, + {}, + ], + 4: [ + function (require, module, exports) { + const debug = require('debug')('h264-profile-level-id'); + + /* eslint-disable no-console */ + debug.log = console.info.bind(console); + /* eslint-enable no-console */ + + const ProfileConstrainedBaseline = 1; + const ProfileBaseline = 2; + const ProfileMain = 3; + const ProfileConstrainedHigh = 4; + const ProfileHigh = 5; + + exports.ProfileConstrainedBaseline = ProfileConstrainedBaseline; + exports.ProfileBaseline = ProfileBaseline; + exports.ProfileMain = ProfileMain; + exports.ProfileConstrainedHigh = ProfileConstrainedHigh; + exports.ProfileHigh = ProfileHigh; + + // All values are equal to ten times the level number, except level 1b which is + // special. + const Level1_b = 0; + const Level1 = 10; + const Level1_1 = 11; + const Level1_2 = 12; + const Level1_3 = 13; + const Level2 = 20; + const Level2_1 = 21; + const Level2_2 = 22; + const Level3 = 30; + const Level3_1 = 31; + const Level3_2 = 32; + const Level4 = 40; + const Level4_1 = 41; + const Level4_2 = 42; + const Level5 = 50; + const Level5_1 = 51; + const Level5_2 = 52; + + exports.Level1_b = Level1_b; + exports.Level1 = Level1; + exports.Level1_1 = Level1_1; + exports.Level1_2 = Level1_2; + exports.Level1_3 = Level1_3; + exports.Level2 = Level2; + exports.Level2_1 = Level2_1; + exports.Level2_2 = Level2_2; + exports.Level3 = Level3; + exports.Level3_1 = Level3_1; + exports.Level3_2 = Level3_2; + exports.Level4 = Level4; + exports.Level4_1 = Level4_1; + exports.Level4_2 = Level4_2; + exports.Level5 = Level5; + exports.Level5_1 = Level5_1; + exports.Level5_2 = Level5_2; + + class ProfileLevelId { + constructor(profile, level) { + this.profile = profile; + this.level = level; + } + } + + exports.ProfileLevelId = ProfileLevelId; + + // Default ProfileLevelId. + // + // TODO: The default should really be profile Baseline and level 1 according to + // the spec: https://tools.ietf.org/html/rfc6184#section-8.1. In order to not + // break backwards compatibility with older versions of WebRTC where external + // codecs don't have any parameters, use profile ConstrainedBaseline level 3_1 + // instead. This workaround will only be done in an interim period to allow + // external clients to update their code. + // + // http://crbug/webrtc/6337. + const DefaultProfileLevelId = new ProfileLevelId(ProfileConstrainedBaseline, Level3_1); + + // For level_idc=11 and profile_idc=0x42, 0x4D, or 0x58, the constraint set3 + // flag specifies if level 1b or level 1.1 is used. + const ConstraintSet3Flag = 0x10; + + // Class for matching bit patterns such as "x1xx0000" where 'x' is allowed to be + // either 0 or 1. + class BitPattern { + constructor(str) { + this._mask = ~byteMaskString('x', str); + this._maskedValue = byteMaskString('1', str); + } + + isMatch(value) { + return this._maskedValue === (value & this._mask); + } + } + + // Class for converting between profile_idc/profile_iop to Profile. + class ProfilePattern { + constructor(profile_idc, profile_iop, profile) { + this.profile_idc = profile_idc; + this.profile_iop = profile_iop; + this.profile = profile; + } + } + + // This is from https://tools.ietf.org/html/rfc6184#section-8.1. + const ProfilePatterns = [ + new ProfilePattern(0x42, new BitPattern('x1xx0000'), ProfileConstrainedBaseline), + new ProfilePattern(0x4d, new BitPattern('1xxx0000'), ProfileConstrainedBaseline), + new ProfilePattern(0x58, new BitPattern('11xx0000'), ProfileConstrainedBaseline), + new ProfilePattern(0x42, new BitPattern('x0xx0000'), ProfileBaseline), + new ProfilePattern(0x58, new BitPattern('10xx0000'), ProfileBaseline), + new ProfilePattern(0x4d, new BitPattern('0x0x0000'), ProfileMain), + new ProfilePattern(0x64, new BitPattern('00000000'), ProfileHigh), + new ProfilePattern(0x64, new BitPattern('00001100'), ProfileConstrainedHigh), + ]; + + /** + * Parse profile level id that is represented as a string of 3 hex bytes. + * Nothing will be returned if the string is not a recognized H264 profile + * level id. + * + * @param {String} str - profile-level-id value as a string of 3 hex bytes. + * + * @returns {ProfileLevelId} + */ + exports.parseProfileLevelId = function (str) { + // The string should consist of 3 bytes in hexadecimal format. + if (typeof str !== 'string' || str.length !== 6) return null; + + const profile_level_id_numeric = parseInt(str, 16); + + if (profile_level_id_numeric === 0) return null; + + // Separate into three bytes. + const level_idc = profile_level_id_numeric & 0xff; + const profile_iop = (profile_level_id_numeric >> 8) & 0xff; + const profile_idc = (profile_level_id_numeric >> 16) & 0xff; + + // Parse level based on level_idc and constraint set 3 flag. + let level; + + switch (level_idc) { + case Level1_1: { + level = (profile_iop & ConstraintSet3Flag) !== 0 ? Level1_b : Level1_1; + break; + } + case Level1: + case Level1_2: + case Level1_3: + case Level2: + case Level2_1: + case Level2_2: + case Level3: + case Level3_1: + case Level3_2: + case Level4: + case Level4_1: + case Level4_2: + case Level5: + case Level5_1: + case Level5_2: { + level = level_idc; + break; + } + // Unrecognized level_idc. + default: { + debug('parseProfileLevelId() | unrecognized level_idc:%s', level_idc); + + return null; + } + } + + // Parse profile_idc/profile_iop into a Profile enum. + for (const pattern of ProfilePatterns) { + if (profile_idc === pattern.profile_idc && pattern.profile_iop.isMatch(profile_iop)) { + return new ProfileLevelId(pattern.profile, level); + } + } + + debug('parseProfileLevelId() | unrecognized profile_idc/profile_iop combination'); + + return null; + }; + + /** + * Returns canonical string representation as three hex bytes of the profile + * level id, or returns nothing for invalid profile level ids. + * + * @param {ProfileLevelId} profile_level_id + * + * @returns {String} + */ + exports.profileLevelIdToString = function (profile_level_id) { + // Handle special case level == 1b. + if (profile_level_id.level == Level1_b) { + switch (profile_level_id.profile) { + case ProfileConstrainedBaseline: { + return '42f00b'; + } + case ProfileBaseline: { + return '42100b'; + } + case ProfileMain: { + return '4d100b'; + } + // Level 1_b is not allowed for other profiles. + default: { + debug( + 'profileLevelIdToString() | Level 1_b not is allowed for profile:%s', + profile_level_id.profile, + ); + + return null; + } + } + } + + let profile_idc_iop_string; + + switch (profile_level_id.profile) { + case ProfileConstrainedBaseline: { + profile_idc_iop_string = '42e0'; + break; + } + case ProfileBaseline: { + profile_idc_iop_string = '4200'; + break; + } + case ProfileMain: { + profile_idc_iop_string = '4d00'; + break; + } + case ProfileConstrainedHigh: { + profile_idc_iop_string = '640c'; + break; + } + case ProfileHigh: { + profile_idc_iop_string = '6400'; + break; + } + default: { + debug('profileLevelIdToString() | unrecognized profile:%s', profile_level_id.profile); + + return null; + } + } + + let levelStr = profile_level_id.level.toString(16); + + if (levelStr.length === 1) levelStr = `0${levelStr}`; + + return `${profile_idc_iop_string}${levelStr}`; + }; + + /** + * Parse profile level id that is represented as a string of 3 hex bytes + * contained in an SDP key-value map. A default profile level id will be + * returned if the profile-level-id key is missing. Nothing will be returned if + * the key is present but the string is invalid. + * + * @param {Object} [params={}] - Codec parameters object. + * + * @returns {ProfileLevelId} + */ + exports.parseSdpProfileLevelId = function (params = {}) { + const profile_level_id = params['profile-level-id']; + + return !profile_level_id ? DefaultProfileLevelId : exports.parseProfileLevelId(profile_level_id); + }; + + /** + * Returns true if the parameters have the same H264 profile, i.e. the same + * H264 profile (Baseline, High, etc). + * + * @param {Object} [params1={}] - Codec parameters object. + * @param {Object} [params2={}] - Codec parameters object. + * + * @returns {Boolean} + */ + exports.isSameProfile = function (params1 = {}, params2 = {}) { + const profile_level_id_1 = exports.parseSdpProfileLevelId(params1); + const profile_level_id_2 = exports.parseSdpProfileLevelId(params2); + + // Compare H264 profiles, but not levels. + return Boolean( + profile_level_id_1 && + profile_level_id_2 && + profile_level_id_1.profile === profile_level_id_2.profile, + ); + }; + + /** + * Generate codec parameters that will be used as answer in an SDP negotiation + * based on local supported parameters and remote offered parameters. Both + * local_supported_params and remote_offered_params represent sendrecv media + * descriptions, i.e they are a mix of both encode and decode capabilities. In + * theory, when the profile in local_supported_params represent a strict superset + * of the profile in remote_offered_params, we could limit the profile in the + * answer to the profile in remote_offered_params. + * + * However, to simplify the code, each supported H264 profile should be listed + * explicitly in the list of local supported codecs, even if they are redundant. + * Then each local codec in the list should be tested one at a time against the + * remote codec, and only when the profiles are equal should this function be + * called. Therefore, this function does not need to handle profile intersection, + * and the profile of local_supported_params and remote_offered_params must be + * equal before calling this function. The parameters that are used when + * negotiating are the level part of profile-level-id and level-asymmetry-allowed. + * + * @param {Object} [local_supported_params={}] + * @param {Object} [remote_offered_params={}] + * + * @returns {String} Canonical string representation as three hex bytes of the + * profile level id, or null if no one of the params have profile-level-id. + * + * @throws {TypeError} If Profile mismatch or invalid params. + */ + exports.generateProfileLevelIdForAnswer = function ( + local_supported_params = {}, + remote_offered_params = {}, + ) { + // If both local and remote params do not contain profile-level-id, they are + // both using the default profile. In this case, don't return anything. + if (!local_supported_params['profile-level-id'] && !remote_offered_params['profile-level-id']) { + debug('generateProfileLevelIdForAnswer() | no profile-level-id in local and remote params'); + + return null; + } + + // Parse profile-level-ids. + const local_profile_level_id = exports.parseSdpProfileLevelId(local_supported_params); + const remote_profile_level_id = exports.parseSdpProfileLevelId(remote_offered_params); + + // The local and remote codec must have valid and equal H264 Profiles. + if (!local_profile_level_id) throw new TypeError('invalid local_profile_level_id'); + + if (!remote_profile_level_id) throw new TypeError('invalid remote_profile_level_id'); + + if (local_profile_level_id.profile !== remote_profile_level_id.profile) + throw new TypeError('H264 Profile mismatch'); + + // Parse level information. + const level_asymmetry_allowed = + isLevelAsymmetryAllowed(local_supported_params) && + isLevelAsymmetryAllowed(remote_offered_params); + + const local_level = local_profile_level_id.level; + const remote_level = remote_profile_level_id.level; + const min_level = minLevel(local_level, remote_level); + + // Determine answer level. When level asymmetry is not allowed, level upgrade + // is not allowed, i.e., the level in the answer must be equal to or lower + // than the level in the offer. + const answer_level = level_asymmetry_allowed ? local_level : min_level; + + debug( + 'generateProfileLevelIdForAnswer() | result: [profile:%s, level:%s]', + local_profile_level_id.profile, + answer_level, + ); + + // Return the resulting profile-level-id for the answer parameters. + return exports.profileLevelIdToString( + new ProfileLevelId(local_profile_level_id.profile, answer_level), + ); + }; + + // Convert a string of 8 characters into a byte where the positions containing + // character c will have their bit set. For example, c = 'x', str = "x1xx0000" + // will return 0b10110000. + function byteMaskString(c, str) { + return ( + ((str[0] === c) << 7) | + ((str[1] === c) << 6) | + ((str[2] === c) << 5) | + ((str[3] === c) << 4) | + ((str[4] === c) << 3) | + ((str[5] === c) << 2) | + ((str[6] === c) << 1) | + ((str[7] === c) << 0) + ); + } + + // Compare H264 levels and handle the level 1b case. + function isLessLevel(a, b) { + if (a === Level1_b) return b !== Level1 && b !== Level1_b; + + if (b === Level1_b) return a !== Level1; + + return a < b; + } + + function minLevel(a, b) { + return isLessLevel(a, b) ? a : b; + } + + function isLevelAsymmetryAllowed(params = {}) { + const level_asymmetry_allowed = params['level-asymmetry-allowed']; + + return level_asymmetry_allowed === 1 || level_asymmetry_allowed === '1'; + } + }, + { debug: 5 }, + ], + 5: [ + function (require, module, exports) { + (function (process) { + (function () { + /* eslint-env browser */ + + /** + * This is the web browser implementation of `debug()`. + */ + + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn( + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.', + ); + } + }; + })(); + + /** + * Colors. + */ + + exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33', + ]; + + /** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + + // eslint-disable-next-line complexity + function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if ( + typeof window !== 'undefined' && + window.process && + (window.process.type === 'renderer' || window.process.__nwjs) + ) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if ( + typeof navigator !== 'undefined' && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) + ) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return ( + (typeof document !== 'undefined' && + document.documentElement && + document.documentElement.style && + document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && + window.console && + (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && + parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)) + ); + } + + /** + * Colorize log arguments if enabled. + * + * @api public + */ + + function formatArgs(args) { + args[0] = + (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); + } + + /** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ + exports.log = console.debug || console.log || (() => {}); + + /** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + /** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; + } + + /** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + + function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + module.exports = require('./common')(exports); + + const { formatters } = module.exports; + + /** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + + formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } + }; + }.call(this)); + }.call(this, require('_process'))); + }, + { './common': 6, _process: 48 }, + ], + 6: [ + function (require, module, exports) { + /** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require('ms'); + createDebug.destroy = destroy; + + Object.keys(env).forEach((key) => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + + return enabledCache; + }, + set: (v) => { + enableOverride = v; + }, + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug( + this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace, + ); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map((namespace) => '-' + namespace), + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp + .toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn( + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.', + ); + } + + createDebug.enable(createDebug.load()); + + return createDebug; + } + + module.exports = setup; + }, + { ms: 7 }, + ], + 7: [ + function (require, module, exports) { + /** + * Helpers. + */ + + var s = 1000; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + module.exports = function (val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val)); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = + /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str, + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + }, + {}, + ], + 8: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Consumer = void 0; + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const errors_1 = require('./errors'); + const logger = new Logger_1.Logger('Consumer'); + class Consumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits transportclose + * @emits trackended + * @emits @getstats + * @emits @close + */ + constructor({ id, localId, producerId, rtpReceiver, track, rtpParameters, appData }) { + super(); + // Closed flag. + this._closed = false; + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor()'); + this._id = id; + this._localId = localId; + this._producerId = producerId; + this._rtpReceiver = rtpReceiver; + this._track = track; + this._rtpParameters = rtpParameters; + this._paused = !track.enabled; + this._appData = appData; + this._onTrackEnded = this._onTrackEnded.bind(this); + this._handleTrack(); + } + /** + * Consumer id. + */ + get id() { + return this._id; + } + /** + * Local id. + */ + get localId() { + return this._localId; + } + /** + * Associated Producer id. + */ + get producerId() { + return this._producerId; + } + /** + * Whether the Consumer is closed. + */ + get closed() { + return this._closed; + } + /** + * Media kind. + */ + get kind() { + return this._track.kind; + } + /** + * Associated RTCRtpReceiver. + */ + get rtpReceiver() { + return this._rtpReceiver; + } + /** + * The associated track. + */ + get track() { + return this._track; + } + /** + * RTP parameters. + */ + get rtpParameters() { + return this._rtpParameters; + } + /** + * Whether the Consumer is paused. + */ + get paused() { + return this._paused; + } + /** + * App custom data. + */ + get appData() { + return this._appData; + } + /** + * Invalid setter. + */ + set appData(appData) { + throw new Error('cannot override appData object'); + } + /** + * Observer. + * + * @emits close + * @emits pause + * @emits resume + * @emits trackended + */ + get observer() { + return this._observer; + } + /** + * Closes the Consumer. + */ + close() { + if (this._closed) return; + logger.debug('close()'); + this._closed = true; + this._destroyTrack(); + this.emit('@close'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Transport was closed. + */ + transportClosed() { + if (this._closed) return; + logger.debug('transportClosed()'); + this._closed = true; + this._destroyTrack(); + this.safeEmit('transportclose'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Get associated RTCRtpReceiver stats. + */ + async getStats() { + if (this._closed) throw new errors_1.InvalidStateError('closed'); + return this.safeEmitAsPromise('@getstats'); + } + /** + * Pauses receiving media. + */ + pause() { + logger.debug('pause()'); + if (this._closed) { + logger.error('pause() | Consumer closed'); + return; + } + this._paused = true; + this._track.enabled = false; + // Emit observer event. + this._observer.safeEmit('pause'); + } + /** + * Resumes receiving media. + */ + resume() { + logger.debug('resume()'); + if (this._closed) { + logger.error('resume() | Consumer closed'); + return; + } + this._paused = false; + this._track.enabled = true; + // Emit observer event. + this._observer.safeEmit('resume'); + } + _onTrackEnded() { + logger.debug('track "ended" event'); + this.safeEmit('trackended'); + // Emit observer event. + this._observer.safeEmit('trackended'); + } + _handleTrack() { + this._track.addEventListener('ended', this._onTrackEnded); + } + _destroyTrack() { + try { + this._track.removeEventListener('ended', this._onTrackEnded); + this._track.stop(); + } catch (error) {} + } + } + exports.Consumer = Consumer; + }, + { './EnhancedEventEmitter': 12, './Logger': 13, './errors': 18 }, + ], + 9: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.DataConsumer = void 0; + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const logger = new Logger_1.Logger('DataConsumer'); + class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits transportclose + * @emits open + * @emits error - (error: Error) + * @emits close + * @emits message - (message: any) + * @emits @close + */ + constructor({ id, dataProducerId, dataChannel, sctpStreamParameters, appData }) { + super(); + // Closed flag. + this._closed = false; + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor()'); + this._id = id; + this._dataProducerId = dataProducerId; + this._dataChannel = dataChannel; + this._sctpStreamParameters = sctpStreamParameters; + this._appData = appData; + this._handleDataChannel(); + } + /** + * DataConsumer id. + */ + get id() { + return this._id; + } + /** + * Associated DataProducer id. + */ + get dataProducerId() { + return this._dataProducerId; + } + /** + * Whether the DataConsumer is closed. + */ + get closed() { + return this._closed; + } + /** + * SCTP stream parameters. + */ + get sctpStreamParameters() { + return this._sctpStreamParameters; + } + /** + * DataChannel readyState. + */ + get readyState() { + return this._dataChannel.readyState; + } + /** + * DataChannel label. + */ + get label() { + return this._dataChannel.label; + } + /** + * DataChannel protocol. + */ + get protocol() { + return this._dataChannel.protocol; + } + /** + * DataChannel binaryType. + */ + get binaryType() { + return this._dataChannel.binaryType; + } + /** + * Set DataChannel binaryType. + */ + set binaryType(binaryType) { + this._dataChannel.binaryType = binaryType; + } + /** + * App custom data. + */ + get appData() { + return this._appData; + } + /** + * Invalid setter. + */ + set appData(appData) { + throw new Error('cannot override appData object'); + } + /** + * Observer. + * + * @emits close + */ + get observer() { + return this._observer; + } + /** + * Closes the DataConsumer. + */ + close() { + if (this._closed) return; + logger.debug('close()'); + this._closed = true; + this._dataChannel.close(); + this.emit('@close'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Transport was closed. + */ + transportClosed() { + if (this._closed) return; + logger.debug('transportClosed()'); + this._closed = true; + this._dataChannel.close(); + this.safeEmit('transportclose'); + // Emit observer event. + this._observer.safeEmit('close'); + } + _handleDataChannel() { + this._dataChannel.addEventListener('open', () => { + if (this._closed) return; + logger.debug('DataChannel "open" event'); + this.safeEmit('open'); + }); + this._dataChannel.addEventListener('error', (event) => { + if (this._closed) return; + let { error } = event; + if (!error) error = new Error('unknown DataChannel error'); + if (error.errorDetail === 'sctp-failure') { + logger.error( + 'DataChannel SCTP error [sctpCauseCode:%s]: %s', + error.sctpCauseCode, + error.message, + ); + } else { + logger.error('DataChannel "error" event: %o', error); + } + this.safeEmit('error', error); + }); + this._dataChannel.addEventListener('close', () => { + if (this._closed) return; + logger.warn('DataChannel "close" event'); + this._closed = true; + this.emit('@close'); + this.safeEmit('close'); + }); + this._dataChannel.addEventListener('message', (event) => { + if (this._closed) return; + this.safeEmit('message', event.data); + }); + } + } + exports.DataConsumer = DataConsumer; + }, + { './EnhancedEventEmitter': 12, './Logger': 13 }, + ], + 10: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.DataProducer = void 0; + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const errors_1 = require('./errors'); + const logger = new Logger_1.Logger('DataProducer'); + class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits transportclose + * @emits open + * @emits error - (error: Error) + * @emits close + * @emits bufferedamountlow + * @emits @close + */ + constructor({ id, dataChannel, sctpStreamParameters, appData }) { + super(); + // Closed flag. + this._closed = false; + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor()'); + this._id = id; + this._dataChannel = dataChannel; + this._sctpStreamParameters = sctpStreamParameters; + this._appData = appData; + this._handleDataChannel(); + } + /** + * DataProducer id. + */ + get id() { + return this._id; + } + /** + * Whether the DataProducer is closed. + */ + get closed() { + return this._closed; + } + /** + * SCTP stream parameters. + */ + get sctpStreamParameters() { + return this._sctpStreamParameters; + } + /** + * DataChannel readyState. + */ + get readyState() { + return this._dataChannel.readyState; + } + /** + * DataChannel label. + */ + get label() { + return this._dataChannel.label; + } + /** + * DataChannel protocol. + */ + get protocol() { + return this._dataChannel.protocol; + } + /** + * DataChannel bufferedAmount. + */ + get bufferedAmount() { + return this._dataChannel.bufferedAmount; + } + /** + * DataChannel bufferedAmountLowThreshold. + */ + get bufferedAmountLowThreshold() { + return this._dataChannel.bufferedAmountLowThreshold; + } + /** + * Set DataChannel bufferedAmountLowThreshold. + */ + set bufferedAmountLowThreshold(bufferedAmountLowThreshold) { + this._dataChannel.bufferedAmountLowThreshold = bufferedAmountLowThreshold; + } + /** + * App custom data. + */ + get appData() { + return this._appData; + } + /** + * Invalid setter. + */ + set appData(appData) { + throw new Error('cannot override appData object'); + } + /** + * Observer. + * + * @emits close + */ + get observer() { + return this._observer; + } + /** + * Closes the DataProducer. + */ + close() { + if (this._closed) return; + logger.debug('close()'); + this._closed = true; + this._dataChannel.close(); + this.emit('@close'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Transport was closed. + */ + transportClosed() { + if (this._closed) return; + logger.debug('transportClosed()'); + this._closed = true; + this._dataChannel.close(); + this.safeEmit('transportclose'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Send a message. + * + * @param {String|Blob|ArrayBuffer|ArrayBufferView} data. + */ + send(data) { + logger.debug('send()'); + if (this._closed) throw new errors_1.InvalidStateError('closed'); + this._dataChannel.send(data); + } + _handleDataChannel() { + this._dataChannel.addEventListener('open', () => { + if (this._closed) return; + logger.debug('DataChannel "open" event'); + this.safeEmit('open'); + }); + this._dataChannel.addEventListener('error', (event) => { + if (this._closed) return; + let { error } = event; + if (!error) error = new Error('unknown DataChannel error'); + if (error.errorDetail === 'sctp-failure') { + logger.error( + 'DataChannel SCTP error [sctpCauseCode:%s]: %s', + error.sctpCauseCode, + error.message, + ); + } else { + logger.error('DataChannel "error" event: %o', error); + } + this.safeEmit('error', error); + }); + this._dataChannel.addEventListener('close', () => { + if (this._closed) return; + logger.warn('DataChannel "close" event'); + this._closed = true; + this.emit('@close'); + this.safeEmit('close'); + }); + this._dataChannel.addEventListener('message', () => { + if (this._closed) return; + logger.warn('DataChannel "message" event in a DataProducer, message discarded'); + }); + this._dataChannel.addEventListener('bufferedamountlow', () => { + if (this._closed) return; + this.safeEmit('bufferedamountlow'); + }); + } + } + exports.DataProducer = DataProducer; + }, + { './EnhancedEventEmitter': 12, './Logger': 13, './errors': 18 }, + ], + 11: [ + function (require, module, exports) { + 'use strict'; + /* global RTCRtpTransceiver */ + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Device = exports.detectDevice = void 0; + const bowser_1 = __importDefault(require('bowser')); + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const errors_1 = require('./errors'); + const utils = __importStar(require('./utils')); + const ortc = __importStar(require('./ortc')); + const Transport_1 = require('./Transport'); + const Chrome74_1 = require('./handlers/Chrome74'); + const Chrome70_1 = require('./handlers/Chrome70'); + const Chrome67_1 = require('./handlers/Chrome67'); + const Chrome55_1 = require('./handlers/Chrome55'); + const Firefox60_1 = require('./handlers/Firefox60'); + const Safari12_1 = require('./handlers/Safari12'); + const Safari11_1 = require('./handlers/Safari11'); + const Edge11_1 = require('./handlers/Edge11'); + const ReactNative_1 = require('./handlers/ReactNative'); + const logger = new Logger_1.Logger('Device'); + function detectDevice() { + // React-Native. + // NOTE: react-native-webrtc >= 1.75.0 is required. + if (typeof navigator === 'object' && navigator.product === 'ReactNative') { + if (typeof RTCPeerConnection === 'undefined') { + logger.warn('this._detectDevice() | unsupported ReactNative without RTCPeerConnection'); + return undefined; + } + logger.debug('this._detectDevice() | ReactNative handler chosen'); + return 'ReactNative'; + } + // Browser. + else if (typeof navigator === 'object' && typeof navigator.userAgent === 'string') { + const ua = navigator.userAgent; + const browser = bowser_1.default.getParser(ua); + const engine = browser.getEngine(); + // Chrome and Chromium. + if (browser.satisfies({ chrome: '>=74', chromium: '>=74' })) { + return 'Chrome74'; + } else if (browser.satisfies({ chrome: '>=70', chromium: '>=70' })) { + return 'Chrome70'; + } else if (browser.satisfies({ chrome: '>=67', chromium: '>=67' })) { + return 'Chrome67'; + } else if (browser.satisfies({ chrome: '>=55', chromium: '>=55' })) { + return 'Chrome55'; + } + // Firefox. + else if (browser.satisfies({ firefox: '>=60' })) { + return 'Firefox60'; + } + // Safari with Unified-Plan support enabled. + else if ( + browser.satisfies({ safari: '>=12.0' }) && + typeof RTCRtpTransceiver !== 'undefined' && + RTCRtpTransceiver.prototype.hasOwnProperty('currentDirection') + ) { + return 'Safari12'; + } + // Safari with Plab-B support. + else if (browser.satisfies({ safari: '>=11' })) { + return 'Safari11'; + } + // Old Edge with ORTC support. + else if ( + browser.satisfies({ 'microsoft edge': '>=11' }) && + browser.satisfies({ 'microsoft edge': '<=18' }) + ) { + return 'Edge11'; + } + // Best effort for Chromium based browsers. + else if (engine.name && engine.name.toLowerCase() === 'blink') { + const match = ua.match(/(?:(?:Chrome|Chromium))[ /](\w+)/i); + if (match) { + const version = Number(match[1]); + if (version >= 74) { + return 'Chrome74'; + } else if (version >= 70) { + return 'Chrome70'; + } else if (version >= 67) { + return 'Chrome67'; + } else { + return 'Chrome55'; + } + } else { + return 'Chrome74'; + } + } + // Unsupported browser. + else { + logger.warn( + 'this._detectDevice() | browser not supported [name:%s, version:%s]', + browser.getBrowserName(), + browser.getBrowserVersion(), + ); + return undefined; + } + } + // Unknown device. + else { + logger.warn('this._detectDevice() | unknown device'); + return undefined; + } + } + exports.detectDevice = detectDevice; + class Device { + /** + * Create a new Device to connect to mediasoup server. + * + * @throws {UnsupportedError} if device is not supported. + */ + constructor({ handlerName, handlerFactory, Handler } = {}) { + // Loaded flag. + this._loaded = false; + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor()'); + // Handle deprecated option. + if (Handler) { + logger.warn( + 'constructor() | Handler option is DEPRECATED, use handlerName or handlerFactory instead', + ); + if (typeof Handler === 'string') handlerName = Handler; + else + throw new TypeError( + 'non string Handler option no longer supported, use handlerFactory instead', + ); + } + if (handlerName && handlerFactory) { + throw new TypeError('just one of handlerName or handlerInterface can be given'); + } + if (handlerFactory) { + this._handlerFactory = handlerFactory; + } else { + if (handlerName) { + logger.debug('constructor() | handler given: %s', handlerName); + } else { + handlerName = detectDevice(); + if (handlerName) logger.debug('constructor() | detected handler: %s', handlerName); + else throw new errors_1.UnsupportedError('device not supported'); + } + switch (handlerName) { + case 'Chrome74': + this._handlerFactory = Chrome74_1.Chrome74.createFactory(); + break; + case 'Chrome70': + this._handlerFactory = Chrome70_1.Chrome70.createFactory(); + break; + case 'Chrome67': + this._handlerFactory = Chrome67_1.Chrome67.createFactory(); + break; + case 'Chrome55': + this._handlerFactory = Chrome55_1.Chrome55.createFactory(); + break; + case 'Firefox60': + this._handlerFactory = Firefox60_1.Firefox60.createFactory(); + break; + case 'Safari12': + this._handlerFactory = Safari12_1.Safari12.createFactory(); + break; + case 'Safari11': + this._handlerFactory = Safari11_1.Safari11.createFactory(); + break; + case 'Edge11': + this._handlerFactory = Edge11_1.Edge11.createFactory(); + break; + case 'ReactNative': + this._handlerFactory = ReactNative_1.ReactNative.createFactory(); + break; + default: + throw new TypeError(`unknown handlerName "${handlerName}"`); + } + } + // Create a temporal handler to get its name. + const handler = this._handlerFactory(); + this._handlerName = handler.name; + handler.close(); + this._extendedRtpCapabilities = undefined; + this._recvRtpCapabilities = undefined; + this._canProduceByKind = { + audio: false, + video: false, + }; + this._sctpCapabilities = undefined; + } + /** + * The RTC handler name. + */ + get handlerName() { + return this._handlerName; + } + /** + * Whether the Device is loaded. + */ + get loaded() { + return this._loaded; + } + /** + * RTP capabilities of the Device for receiving media. + * + * @throws {InvalidStateError} if not loaded. + */ + get rtpCapabilities() { + if (!this._loaded) throw new errors_1.InvalidStateError('not loaded'); + return this._recvRtpCapabilities; + } + /** + * SCTP capabilities of the Device. + * + * @throws {InvalidStateError} if not loaded. + */ + get sctpCapabilities() { + if (!this._loaded) throw new errors_1.InvalidStateError('not loaded'); + return this._sctpCapabilities; + } + /** + * Observer. + * + * @emits newtransport - (transport: Transport) + */ + get observer() { + return this._observer; + } + /** + * Initialize the Device. + */ + async load({ routerRtpCapabilities }) { + logger.debug('load() [routerRtpCapabilities:%o]', routerRtpCapabilities); + routerRtpCapabilities = utils.clone(routerRtpCapabilities, undefined); + // Temporal handler to get its capabilities. + let handler; + try { + if (this._loaded) throw new errors_1.InvalidStateError('already loaded'); + // This may throw. + ortc.validateRtpCapabilities(routerRtpCapabilities); + handler = this._handlerFactory(); + const nativeRtpCapabilities = await handler.getNativeRtpCapabilities(); + logger.debug('load() | got native RTP capabilities:%o', nativeRtpCapabilities); + // This may throw. + ortc.validateRtpCapabilities(nativeRtpCapabilities); + // Get extended RTP capabilities. + this._extendedRtpCapabilities = ortc.getExtendedRtpCapabilities( + nativeRtpCapabilities, + routerRtpCapabilities, + ); + logger.debug('load() | got extended RTP capabilities:%o', this._extendedRtpCapabilities); + // Check whether we can produce audio/video. + this._canProduceByKind.audio = ortc.canSend('audio', this._extendedRtpCapabilities); + this._canProduceByKind.video = ortc.canSend('video', this._extendedRtpCapabilities); + // Generate our receiving RTP capabilities for receiving media. + this._recvRtpCapabilities = ortc.getRecvRtpCapabilities(this._extendedRtpCapabilities); + // This may throw. + ortc.validateRtpCapabilities(this._recvRtpCapabilities); + logger.debug('load() | got receiving RTP capabilities:%o', this._recvRtpCapabilities); + // Generate our SCTP capabilities. + this._sctpCapabilities = await handler.getNativeSctpCapabilities(); + logger.debug('load() | got native SCTP capabilities:%o', this._sctpCapabilities); + // This may throw. + ortc.validateSctpCapabilities(this._sctpCapabilities); + logger.debug('load() succeeded'); + this._loaded = true; + handler.close(); + } catch (error) { + if (handler) handler.close(); + throw error; + } + } + /** + * Whether we can produce audio/video. + * + * @throws {InvalidStateError} if not loaded. + * @throws {TypeError} if wrong arguments. + */ + canProduce(kind) { + if (!this._loaded) throw new errors_1.InvalidStateError('not loaded'); + else if (kind !== 'audio' && kind !== 'video') throw new TypeError(`invalid kind "${kind}"`); + return this._canProduceByKind[kind]; + } + /** + * Creates a Transport for sending media. + * + * @throws {InvalidStateError} if not loaded. + * @throws {TypeError} if wrong arguments. + */ + createSendTransport({ + id, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + appData = {}, + }) { + logger.debug('createSendTransport()'); + return this._createTransport({ + direction: 'send', + id: id, + iceParameters: iceParameters, + iceCandidates: iceCandidates, + dtlsParameters: dtlsParameters, + sctpParameters: sctpParameters, + iceServers: iceServers, + iceTransportPolicy: iceTransportPolicy, + additionalSettings: additionalSettings, + proprietaryConstraints: proprietaryConstraints, + appData: appData, + }); + } + /** + * Creates a Transport for receiving media. + * + * @throws {InvalidStateError} if not loaded. + * @throws {TypeError} if wrong arguments. + */ + createRecvTransport({ + id, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + appData = {}, + }) { + logger.debug('createRecvTransport()'); + return this._createTransport({ + direction: 'recv', + id: id, + iceParameters: iceParameters, + iceCandidates: iceCandidates, + dtlsParameters: dtlsParameters, + sctpParameters: sctpParameters, + iceServers: iceServers, + iceTransportPolicy: iceTransportPolicy, + additionalSettings: additionalSettings, + proprietaryConstraints: proprietaryConstraints, + appData: appData, + }); + } + _createTransport({ + direction, + id, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + appData = {}, + }) { + if (!this._loaded) throw new errors_1.InvalidStateError('not loaded'); + else if (typeof id !== 'string') throw new TypeError('missing id'); + else if (typeof iceParameters !== 'object') throw new TypeError('missing iceParameters'); + else if (!Array.isArray(iceCandidates)) throw new TypeError('missing iceCandidates'); + else if (typeof dtlsParameters !== 'object') throw new TypeError('missing dtlsParameters'); + else if (sctpParameters && typeof sctpParameters !== 'object') + throw new TypeError('wrong sctpParameters'); + else if (appData && typeof appData !== 'object') + throw new TypeError('if given, appData must be an object'); + // Create a new Transport. + const transport = new Transport_1.Transport({ + direction, + id, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + appData, + handlerFactory: this._handlerFactory, + extendedRtpCapabilities: this._extendedRtpCapabilities, + canProduceByKind: this._canProduceByKind, + }); + // Emit observer event. + this._observer.safeEmit('newtransport', transport); + return transport; + } + } + exports.Device = Device; + }, + { + './EnhancedEventEmitter': 12, + './Logger': 13, + './Transport': 17, + './errors': 18, + './handlers/Chrome55': 19, + './handlers/Chrome67': 20, + './handlers/Chrome70': 21, + './handlers/Chrome74': 22, + './handlers/Edge11': 23, + './handlers/Firefox60': 24, + './handlers/ReactNative': 26, + './handlers/Safari11': 27, + './handlers/Safari12': 28, + './ortc': 36, + './utils': 39, + bowser: 3, + }, + ], + 12: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.EnhancedEventEmitter = void 0; + const events_1 = require('events'); + const Logger_1 = require('./Logger'); + const logger = new Logger_1.Logger('EnhancedEventEmitter'); + class EnhancedEventEmitter extends events_1.EventEmitter { + constructor() { + super(); + this.setMaxListeners(Infinity); + } + safeEmit(event, ...args) { + const numListeners = this.listenerCount(event); + try { + return this.emit(event, ...args); + } catch (error) { + logger.error('safeEmit() | event listener threw an error [event:%s]:%o', event, error); + return Boolean(numListeners); + } + } + async safeEmitAsPromise(event, ...args) { + return new Promise((resolve, reject) => { + try { + this.emit(event, ...args, resolve, reject); + } catch (error) { + logger.error( + 'safeEmitAsPromise() | event listener threw an error [event:%s]:%o', + event, + error, + ); + reject(error); + } + }); + } + } + exports.EnhancedEventEmitter = EnhancedEventEmitter; + }, + { './Logger': 13, events: 47 }, + ], + 13: [ + function (require, module, exports) { + 'use strict'; + var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Logger = void 0; + const debug_1 = __importDefault(require('debug')); + const APP_NAME = 'mediasoup-client'; + class Logger { + constructor(prefix) { + if (prefix) { + this._debug = debug_1.default(`${APP_NAME}:${prefix}`); + this._warn = debug_1.default(`${APP_NAME}:WARN:${prefix}`); + this._error = debug_1.default(`${APP_NAME}:ERROR:${prefix}`); + } else { + this._debug = debug_1.default(APP_NAME); + this._warn = debug_1.default(`${APP_NAME}:WARN`); + this._error = debug_1.default(`${APP_NAME}:ERROR`); + } + /* eslint-disable no-console */ + this._debug.log = console.info.bind(console); + this._warn.log = console.warn.bind(console); + this._error.log = console.error.bind(console); + /* eslint-enable no-console */ + } + get debug() { + return this._debug; + } + get warn() { + return this._warn; + } + get error() { + return this._error; + } + } + exports.Logger = Logger; + }, + { debug: 40 }, + ], + 14: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Producer = void 0; + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const errors_1 = require('./errors'); + const logger = new Logger_1.Logger('Producer'); + class Producer extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits transportclose + * @emits trackended + * @emits @replacetrack - (track: MediaStreamTrack | null) + * @emits @setmaxspatiallayer - (spatialLayer: string) + * @emits @setrtpencodingparameters - (params: any) + * @emits @getstats + * @emits @close + */ + constructor({ + id, + localId, + rtpSender, + track, + rtpParameters, + stopTracks, + disableTrackOnPause, + zeroRtpOnPause, + appData, + }) { + super(); + // Closed flag. + this._closed = false; + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor()'); + this._id = id; + this._localId = localId; + this._rtpSender = rtpSender; + this._track = track; + this._kind = track.kind; + this._rtpParameters = rtpParameters; + this._paused = disableTrackOnPause ? !track.enabled : false; + this._maxSpatialLayer = undefined; + this._stopTracks = stopTracks; + this._disableTrackOnPause = disableTrackOnPause; + this._zeroRtpOnPause = zeroRtpOnPause; + this._appData = appData; + this._onTrackEnded = this._onTrackEnded.bind(this); + // NOTE: Minor issue. If zeroRtpOnPause is true, we cannot emit the + // '@replacetrack' event here, so RTCRtpSender.track won't be null. + this._handleTrack(); + } + /** + * Producer id. + */ + get id() { + return this._id; + } + /** + * Local id. + */ + get localId() { + return this._localId; + } + /** + * Whether the Producer is closed. + */ + get closed() { + return this._closed; + } + /** + * Media kind. + */ + get kind() { + return this._kind; + } + /** + * Associated RTCRtpSender. + */ + get rtpSender() { + return this._rtpSender; + } + /** + * The associated track. + */ + get track() { + return this._track; + } + /** + * RTP parameters. + */ + get rtpParameters() { + return this._rtpParameters; + } + /** + * Whether the Producer is paused. + */ + get paused() { + return this._paused; + } + /** + * Max spatial layer. + * + * @type {Number | undefined} + */ + get maxSpatialLayer() { + return this._maxSpatialLayer; + } + /** + * App custom data. + */ + get appData() { + return this._appData; + } + /** + * Invalid setter. + */ + set appData(appData) { + throw new Error('cannot override appData object'); + } + /** + * Observer. + * + * @emits close + * @emits pause + * @emits resume + * @emits trackended + */ + get observer() { + return this._observer; + } + /** + * Closes the Producer. + */ + close() { + if (this._closed) return; + logger.debug('close()'); + this._closed = true; + this._destroyTrack(); + this.emit('@close'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Transport was closed. + */ + transportClosed() { + if (this._closed) return; + logger.debug('transportClosed()'); + this._closed = true; + this._destroyTrack(); + this.safeEmit('transportclose'); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Get associated RTCRtpSender stats. + */ + async getStats() { + if (this._closed) throw new errors_1.InvalidStateError('closed'); + return this.safeEmitAsPromise('@getstats'); + } + /** + * Pauses sending media. + */ + pause() { + logger.debug('pause()'); + if (this._closed) { + logger.error('pause() | Producer closed'); + return; + } + this._paused = true; + if (this._track && this._disableTrackOnPause) { + this._track.enabled = false; + } + if (this._zeroRtpOnPause) { + this.safeEmitAsPromise('@replacetrack', null).catch(() => {}); + } + // Emit observer event. + this._observer.safeEmit('pause'); + } + /** + * Resumes sending media. + */ + resume() { + logger.debug('resume()'); + if (this._closed) { + logger.error('resume() | Producer closed'); + return; + } + this._paused = false; + if (this._track && this._disableTrackOnPause) { + this._track.enabled = true; + } + if (this._zeroRtpOnPause) { + this.safeEmitAsPromise('@replacetrack', this._track).catch(() => {}); + } + // Emit observer event. + this._observer.safeEmit('resume'); + } + /** + * Replaces the current track with a new one or null. + */ + async replaceTrack({ track }) { + logger.debug('replaceTrack() [track:%o]', track); + if (this._closed) { + // This must be done here. Otherwise there is no chance to stop the given + // track. + if (track && this._stopTracks) { + try { + track.stop(); + } catch (error) {} + } + throw new errors_1.InvalidStateError('closed'); + } else if (track && track.readyState === 'ended') { + throw new errors_1.InvalidStateError('track ended'); + } + // Do nothing if this is the same track as the current handled one. + if (track === this._track) { + logger.debug('replaceTrack() | same track, ignored'); + return; + } + if (!this._zeroRtpOnPause || !this._paused) { + await this.safeEmitAsPromise('@replacetrack', track); + } + // Destroy the previous track. + this._destroyTrack(); + // Set the new track. + this._track = track; + // If this Producer was paused/resumed and the state of the new + // track does not match, fix it. + if (this._track && this._disableTrackOnPause) { + if (!this._paused) this._track.enabled = true; + else if (this._paused) this._track.enabled = false; + } + // Handle the effective track. + this._handleTrack(); + } + /** + * Sets the video max spatial layer to be sent. + */ + async setMaxSpatialLayer(spatialLayer) { + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (this._kind !== 'video') throw new errors_1.UnsupportedError('not a video Producer'); + else if (typeof spatialLayer !== 'number') throw new TypeError('invalid spatialLayer'); + if (spatialLayer === this._maxSpatialLayer) return; + await this.safeEmitAsPromise('@setmaxspatiallayer', spatialLayer); + this._maxSpatialLayer = spatialLayer; + } + /** + * Sets the DSCP value. + */ + async setRtpEncodingParameters(params) { + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (typeof params !== 'object') throw new TypeError('invalid params'); + await this.safeEmitAsPromise('@setrtpencodingparameters', params); + } + _onTrackEnded() { + logger.debug('track "ended" event'); + this.safeEmit('trackended'); + // Emit observer event. + this._observer.safeEmit('trackended'); + } + _handleTrack() { + if (!this._track) return; + this._track.addEventListener('ended', this._onTrackEnded); + } + _destroyTrack() { + if (!this._track) return; + try { + this._track.removeEventListener('ended', this._onTrackEnded); + // Just stop the track unless the app set stopTracks: false. + if (this._stopTracks) this._track.stop(); + } catch (error) {} + } + } + exports.Producer = Producer; + }, + { './EnhancedEventEmitter': 12, './Logger': 13, './errors': 18 }, + ], + 15: [ + function (require, module, exports) { + 'use strict'; + /** + * The RTP capabilities define what mediasoup or an endpoint can receive at + * media level. + */ + Object.defineProperty(exports, '__esModule', { value: true }); + }, + {}, + ], + 16: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + }, + {}, + ], + 17: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Transport = void 0; + const awaitqueue_1 = require('awaitqueue'); + const Logger_1 = require('./Logger'); + const EnhancedEventEmitter_1 = require('./EnhancedEventEmitter'); + const errors_1 = require('./errors'); + const utils = __importStar(require('./utils')); + const ortc = __importStar(require('./ortc')); + const Producer_1 = require('./Producer'); + const Consumer_1 = require('./Consumer'); + const DataProducer_1 = require('./DataProducer'); + const DataConsumer_1 = require('./DataConsumer'); + const logger = new Logger_1.Logger('Transport'); + class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits connect - (transportLocalParameters: any, callback: Function, errback: Function) + * @emits connectionstatechange - (connectionState: ConnectionState) + * @emits produce - (producerLocalParameters: any, callback: Function, errback: Function) + * @emits producedata - (dataProducerLocalParameters: any, callback: Function, errback: Function) + */ + constructor({ + direction, + id, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + appData, + handlerFactory, + extendedRtpCapabilities, + canProduceByKind, + }) { + super(); + // Closed flag. + this._closed = false; + // Transport connection state. + this._connectionState = 'new'; + // Map of Producers indexed by id. + this._producers = new Map(); + // Map of Consumers indexed by id. + this._consumers = new Map(); + // Map of DataProducers indexed by id. + this._dataProducers = new Map(); + // Map of DataConsumers indexed by id. + this._dataConsumers = new Map(); + // Whether the Consumer for RTP probation has been created. + this._probatorConsumerCreated = false; + // AwaitQueue instance to make async tasks happen sequentially. + this._awaitQueue = new awaitqueue_1.AwaitQueue({ + ClosedErrorClass: errors_1.InvalidStateError, + }); + // Observer instance. + this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); + logger.debug('constructor() [id:%s, direction:%s]', id, direction); + this._id = id; + this._direction = direction; + this._extendedRtpCapabilities = extendedRtpCapabilities; + this._canProduceByKind = canProduceByKind; + this._maxSctpMessageSize = sctpParameters ? sctpParameters.maxMessageSize : null; + // Clone and sanitize additionalSettings. + additionalSettings = utils.clone(additionalSettings, {}); + delete additionalSettings.iceServers; + delete additionalSettings.iceTransportPolicy; + delete additionalSettings.bundlePolicy; + delete additionalSettings.rtcpMuxPolicy; + delete additionalSettings.sdpSemantics; + this._handler = handlerFactory(); + this._handler.run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }); + this._appData = appData; + this._handleHandler(); + } + /** + * Transport id. + */ + get id() { + return this._id; + } + /** + * Whether the Transport is closed. + */ + get closed() { + return this._closed; + } + /** + * Transport direction. + */ + get direction() { + return this._direction; + } + /** + * RTC handler instance. + */ + get handler() { + return this._handler; + } + /** + * Connection state. + */ + get connectionState() { + return this._connectionState; + } + /** + * App custom data. + */ + get appData() { + return this._appData; + } + /** + * Invalid setter. + */ + set appData(appData) { + throw new Error('cannot override appData object'); + } + /** + * Observer. + * + * @emits close + * @emits newproducer - (producer: Producer) + * @emits newconsumer - (producer: Producer) + * @emits newdataproducer - (dataProducer: DataProducer) + * @emits newdataconsumer - (dataProducer: DataProducer) + */ + get observer() { + return this._observer; + } + /** + * Close the Transport. + */ + close() { + if (this._closed) return; + logger.debug('close()'); + this._closed = true; + // Close the AwaitQueue. + this._awaitQueue.close(); + // Close the handler. + this._handler.close(); + // Close all Producers. + for (const producer of this._producers.values()) { + producer.transportClosed(); + } + this._producers.clear(); + // Close all Consumers. + for (const consumer of this._consumers.values()) { + consumer.transportClosed(); + } + this._consumers.clear(); + // Close all DataProducers. + for (const dataProducer of this._dataProducers.values()) { + dataProducer.transportClosed(); + } + this._dataProducers.clear(); + // Close all DataConsumers. + for (const dataConsumer of this._dataConsumers.values()) { + dataConsumer.transportClosed(); + } + this._dataConsumers.clear(); + // Emit observer event. + this._observer.safeEmit('close'); + } + /** + * Get associated Transport (RTCPeerConnection) stats. + * + * @returns {RTCStatsReport} + */ + async getStats() { + if (this._closed) throw new errors_1.InvalidStateError('closed'); + return this._handler.getTransportStats(); + } + /** + * Restart ICE connection. + */ + async restartIce({ iceParameters }) { + logger.debug('restartIce()'); + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (!iceParameters) throw new TypeError('missing iceParameters'); + // Enqueue command. + return this._awaitQueue.push( + async () => this._handler.restartIce(iceParameters), + 'transport.restartIce()', + ); + } + /** + * Update ICE servers. + */ + async updateIceServers({ iceServers } = {}) { + logger.debug('updateIceServers()'); + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (!Array.isArray(iceServers)) throw new TypeError('missing iceServers'); + // Enqueue command. + return this._awaitQueue.push( + async () => this._handler.updateIceServers(iceServers), + 'transport.updateIceServers()', + ); + } + /** + * Create a Producer. + */ + async produce({ + track, + encodings, + codecOptions, + codec, + stopTracks = true, + disableTrackOnPause = true, + zeroRtpOnPause = false, + appData = {}, + } = {}) { + logger.debug('produce() [track:%o]', track); + if (!track) throw new TypeError('missing track'); + else if (this._direction !== 'send') + throw new errors_1.UnsupportedError('not a sending Transport'); + else if (!this._canProduceByKind[track.kind]) + throw new errors_1.UnsupportedError(`cannot produce ${track.kind}`); + else if (track.readyState === 'ended') throw new errors_1.InvalidStateError('track ended'); + else if (this.listenerCount('connect') === 0 && this._connectionState === 'new') + throw new TypeError('no "connect" listener set into this transport'); + else if (this.listenerCount('produce') === 0) + throw new TypeError('no "produce" listener set into this transport'); + else if (appData && typeof appData !== 'object') + throw new TypeError('if given, appData must be an object'); + // Enqueue command. + return ( + this._awaitQueue + .push(async () => { + let normalizedEncodings; + if (encodings && !Array.isArray(encodings)) { + throw TypeError('encodings must be an array'); + } else if (encodings && encodings.length === 0) { + normalizedEncodings = undefined; + } else if (encodings) { + normalizedEncodings = encodings.map((encoding) => { + const normalizedEncoding = { active: true }; + if (encoding.active === false) normalizedEncoding.active = false; + if (typeof encoding.dtx === 'boolean') + normalizedEncoding.dtx = encoding.dtx; + if (typeof encoding.scalabilityMode === 'string') + normalizedEncoding.scalabilityMode = encoding.scalabilityMode; + if (typeof encoding.scaleResolutionDownBy === 'number') + normalizedEncoding.scaleResolutionDownBy = + encoding.scaleResolutionDownBy; + if (typeof encoding.maxBitrate === 'number') + normalizedEncoding.maxBitrate = encoding.maxBitrate; + if (typeof encoding.maxFramerate === 'number') + normalizedEncoding.maxFramerate = encoding.maxFramerate; + if (typeof encoding.adaptivePtime === 'boolean') + normalizedEncoding.adaptivePtime = encoding.adaptivePtime; + if (typeof encoding.priority === 'string') + normalizedEncoding.priority = encoding.priority; + if (typeof encoding.networkPriority === 'string') + normalizedEncoding.networkPriority = encoding.networkPriority; + return normalizedEncoding; + }); + } + const { localId, rtpParameters, rtpSender } = await this._handler.send({ + track, + encodings: normalizedEncodings, + codecOptions, + codec, + }); + try { + // This will fill rtpParameters's missing fields with default values. + ortc.validateRtpParameters(rtpParameters); + const { id } = await this.safeEmitAsPromise('produce', { + kind: track.kind, + rtpParameters, + appData, + }); + const producer = new Producer_1.Producer({ + id, + localId, + rtpSender, + track, + rtpParameters, + stopTracks, + disableTrackOnPause, + zeroRtpOnPause, + appData, + }); + this._producers.set(producer.id, producer); + this._handleProducer(producer); + // Emit observer event. + this._observer.safeEmit('newproducer', producer); + return producer; + } catch (error) { + this._handler.stopSending(localId).catch(() => {}); + throw error; + } + }, 'transport.produce()') + // This catch is needed to stop the given track if the command above + // failed due to closed Transport. + .catch((error) => { + if (stopTracks) { + try { + track.stop(); + } catch (error2) {} + } + throw error; + }) + ); + } + /** + * Create a Consumer to consume a remote Producer. + */ + async consume({ id, producerId, kind, rtpParameters, appData = {} }) { + logger.debug('consume()'); + rtpParameters = utils.clone(rtpParameters, undefined); + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (this._direction !== 'recv') + throw new errors_1.UnsupportedError('not a receiving Transport'); + else if (typeof id !== 'string') throw new TypeError('missing id'); + else if (typeof producerId !== 'string') throw new TypeError('missing producerId'); + else if (kind !== 'audio' && kind !== 'video') throw new TypeError(`invalid kind '${kind}'`); + else if (this.listenerCount('connect') === 0 && this._connectionState === 'new') + throw new TypeError('no "connect" listener set into this transport'); + else if (appData && typeof appData !== 'object') + throw new TypeError('if given, appData must be an object'); + // Enqueue command. + return this._awaitQueue.push(async () => { + // Ensure the device can consume it. + const canConsume = ortc.canReceive(rtpParameters, this._extendedRtpCapabilities); + if (!canConsume) throw new errors_1.UnsupportedError('cannot consume this Producer'); + const { localId, rtpReceiver, track } = await this._handler.receive({ + trackId: id, + kind, + rtpParameters, + }); + const consumer = new Consumer_1.Consumer({ + id, + localId, + producerId, + rtpReceiver, + track, + rtpParameters, + appData, + }); + this._consumers.set(consumer.id, consumer); + this._handleConsumer(consumer); + // If this is the first video Consumer and the Consumer for RTP probation + // has not yet been created, create it now. + if (!this._probatorConsumerCreated && kind === 'video') { + try { + const probatorRtpParameters = ortc.generateProbatorRtpParameters( + consumer.rtpParameters, + ); + await this._handler.receive({ + trackId: 'probator', + kind: 'video', + rtpParameters: probatorRtpParameters, + }); + logger.debug('consume() | Consumer for RTP probation created'); + this._probatorConsumerCreated = true; + } catch (error) { + logger.error('consume() | failed to create Consumer for RTP probation:%o', error); + } + } + // Emit observer event. + this._observer.safeEmit('newconsumer', consumer); + return consumer; + }, 'transport.consume()'); + } + /** + * Create a DataProducer + */ + async produceData({ + ordered = true, + maxPacketLifeTime, + maxRetransmits, + label = '', + protocol = '', + appData = {}, + } = {}) { + logger.debug('produceData()'); + if (this._direction !== 'send') throw new errors_1.UnsupportedError('not a sending Transport'); + else if (!this._maxSctpMessageSize) + throw new errors_1.UnsupportedError('SCTP not enabled by remote Transport'); + else if (this.listenerCount('connect') === 0 && this._connectionState === 'new') + throw new TypeError('no "connect" listener set into this transport'); + else if (this.listenerCount('producedata') === 0) + throw new TypeError('no "producedata" listener set into this transport'); + else if (appData && typeof appData !== 'object') + throw new TypeError('if given, appData must be an object'); + if (maxPacketLifeTime || maxRetransmits) ordered = false; + // Enqueue command. + return this._awaitQueue.push(async () => { + const { dataChannel, sctpStreamParameters } = await this._handler.sendDataChannel({ + ordered, + maxPacketLifeTime, + maxRetransmits, + label, + protocol, + }); + // This will fill sctpStreamParameters's missing fields with default values. + ortc.validateSctpStreamParameters(sctpStreamParameters); + const { id } = await this.safeEmitAsPromise('producedata', { + sctpStreamParameters, + label, + protocol, + appData, + }); + const dataProducer = new DataProducer_1.DataProducer({ + id, + dataChannel, + sctpStreamParameters, + appData, + }); + this._dataProducers.set(dataProducer.id, dataProducer); + this._handleDataProducer(dataProducer); + // Emit observer event. + this._observer.safeEmit('newdataproducer', dataProducer); + return dataProducer; + }, 'transport.produceData()'); + } + /** + * Create a DataConsumer + */ + async consumeData({ + id, + dataProducerId, + sctpStreamParameters, + label = '', + protocol = '', + appData = {}, + }) { + logger.debug('consumeData()'); + sctpStreamParameters = utils.clone(sctpStreamParameters, undefined); + if (this._closed) throw new errors_1.InvalidStateError('closed'); + else if (this._direction !== 'recv') + throw new errors_1.UnsupportedError('not a receiving Transport'); + else if (!this._maxSctpMessageSize) + throw new errors_1.UnsupportedError('SCTP not enabled by remote Transport'); + else if (typeof id !== 'string') throw new TypeError('missing id'); + else if (typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); + else if (this.listenerCount('connect') === 0 && this._connectionState === 'new') + throw new TypeError('no "connect" listener set into this transport'); + else if (appData && typeof appData !== 'object') + throw new TypeError('if given, appData must be an object'); + // This may throw. + ortc.validateSctpStreamParameters(sctpStreamParameters); + // Enqueue command. + return this._awaitQueue.push(async () => { + const { dataChannel } = await this._handler.receiveDataChannel({ + sctpStreamParameters, + label, + protocol, + }); + const dataConsumer = new DataConsumer_1.DataConsumer({ + id, + dataProducerId, + dataChannel, + sctpStreamParameters, + appData, + }); + this._dataConsumers.set(dataConsumer.id, dataConsumer); + this._handleDataConsumer(dataConsumer); + // Emit observer event. + this._observer.safeEmit('newdataconsumer', dataConsumer); + return dataConsumer; + }, 'transport.consumeData()'); + } + _handleHandler() { + const handler = this._handler; + handler.on('@connect', ({ dtlsParameters }, callback, errback) => { + if (this._closed) { + errback(new errors_1.InvalidStateError('closed')); + return; + } + this.safeEmit('connect', { dtlsParameters }, callback, errback); + }); + handler.on('@connectionstatechange', (connectionState) => { + if (connectionState === this._connectionState) return; + logger.debug('connection state changed to %s', connectionState); + this._connectionState = connectionState; + if (!this._closed) this.safeEmit('connectionstatechange', connectionState); + }); + } + _handleProducer(producer) { + producer.on('@close', () => { + this._producers.delete(producer.id); + if (this._closed) return; + this._awaitQueue + .push(async () => this._handler.stopSending(producer.localId), 'producer @close event') + .catch((error) => logger.warn('producer.close() failed:%o', error)); + }); + producer.on('@replacetrack', (track, callback, errback) => { + this._awaitQueue + .push( + async () => this._handler.replaceTrack(producer.localId, track), + 'producer @replacetrack event', + ) + .then(callback) + .catch(errback); + }); + producer.on('@setmaxspatiallayer', (spatialLayer, callback, errback) => { + this._awaitQueue + .push( + async () => this._handler.setMaxSpatialLayer(producer.localId, spatialLayer), + 'producer @setmaxspatiallayer event', + ) + .then(callback) + .catch(errback); + }); + producer.on('@setrtpencodingparameters', (params, callback, errback) => { + this._awaitQueue + .push( + async () => this._handler.setRtpEncodingParameters(producer.localId, params), + 'producer @setrtpencodingparameters event', + ) + .then(callback) + .catch(errback); + }); + producer.on('@getstats', (callback, errback) => { + if (this._closed) return errback(new errors_1.InvalidStateError('closed')); + this._handler.getSenderStats(producer.localId).then(callback).catch(errback); + }); + } + _handleConsumer(consumer) { + consumer.on('@close', () => { + this._consumers.delete(consumer.id); + if (this._closed) return; + this._awaitQueue + .push( + async () => this._handler.stopReceiving(consumer.localId), + 'consumer @close event', + ) + .catch(() => {}); + }); + consumer.on('@getstats', (callback, errback) => { + if (this._closed) return errback(new errors_1.InvalidStateError('closed')); + this._handler.getReceiverStats(consumer.localId).then(callback).catch(errback); + }); + } + _handleDataProducer(dataProducer) { + dataProducer.on('@close', () => { + this._dataProducers.delete(dataProducer.id); + }); + } + _handleDataConsumer(dataConsumer) { + dataConsumer.on('@close', () => { + this._dataConsumers.delete(dataConsumer.id); + }); + } + } + exports.Transport = Transport; + }, + { + './Consumer': 8, + './DataConsumer': 9, + './DataProducer': 10, + './EnhancedEventEmitter': 12, + './Logger': 13, + './Producer': 14, + './errors': 18, + './ortc': 36, + './utils': 39, + awaitqueue: 2, + }, + ], + 18: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.InvalidStateError = exports.UnsupportedError = void 0; + /** + * Error indicating not support for something. + */ + class UnsupportedError extends Error { + constructor(message) { + super(message); + this.name = 'UnsupportedError'; + if (Error.hasOwnProperty('captureStackTrace')) { + // Just in V8. + // @ts-ignore + Error.captureStackTrace(this, UnsupportedError); + } else { + this.stack = new Error(message).stack; + } + } + } + exports.UnsupportedError = UnsupportedError; + /** + * Error produced when calling a method in an invalid state. + */ + class InvalidStateError extends Error { + constructor(message) { + super(message); + this.name = 'InvalidStateError'; + if (Error.hasOwnProperty('captureStackTrace')) { + // Just in V8. + // @ts-ignore + Error.captureStackTrace(this, InvalidStateError); + } else { + this.stack = new Error(message).stack; + } + } + } + exports.InvalidStateError = InvalidStateError; + }, + {}, + ], + 19: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Chrome55 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const errors_1 = require('../errors'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpPlanBUtils = __importStar(require('./sdp/planBUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('Chrome55'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Chrome55 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Map of sending MediaStreamTracks indexed by localId. + this._mapSendLocalIdTrack = new Map(); + // Next sending localId. + this._nextSendLocalId = 0; + // Map of MID, RTP parameters and RTCRtpReceiver indexed by local id. + // Value is an Object with mid, rtpParameters and rtpReceiver. + this._mapRecvLocalIdInfo = new Map(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Chrome55(); + } + get name() { + return 'Chrome55'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }); + try { + const offer = await pc.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: true, + }); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + planB: true, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (codec) { + logger.warn('send() | codec selection is not available in %s handler', this.name); + } + this._sendStream.addTrack(track); + this._pc.addStream(this._sendStream); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (track.kind === 'video' && encodings && encodings.length > 1) { + logger.debug('send() | enabling simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === 'video'); + sdpPlanBUtils.addLegacySimulcast({ + offerMediaObject, + track, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === track.kind); + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpPlanBUtils.getRtpEncodings({ offerMediaObject, track }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // If VP8 and there is effective simulcast, add scalabilityMode to each + // encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + const localId = String(this._nextSendLocalId); + this._nextSendLocalId++; + // Insert into the map. + this._mapSendLocalIdTrack.set(localId, track); + return { + localId: localId, + rtpParameters: sendingRtpParameters, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const track = this._mapSendLocalIdTrack.get(localId); + if (!track) throw new Error('track not found'); + this._mapSendLocalIdTrack.delete(localId); + this._sendStream.removeTrack(track); + this._pc.addStream(this._sendStream); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + try { + await this._pc.setLocalDescription(offer); + } catch (error) { + // NOTE: If there are no sending tracks, setLocalDescription() will fail with + // "Failed to create channels". If so, ignore it. + if (this._sendStream.getTracks().length === 0) { + logger.warn( + 'stopSending() | ignoring expected error due no sending tracks: %s', + error.toString(), + ); + return; + } + throw error; + } + if (this._pc.signalingState === 'stable') return; + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + localId, + track, + ) { + throw new errors_1.UnsupportedError('not implemented'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setMaxSpatialLayer(localId, spatialLayer) { + throw new errors_1.UnsupportedError(' not implemented'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setRtpEncodingParameters(localId, params) { + throw new errors_1.UnsupportedError('not supported'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async getSenderStats(localId) { + throw new errors_1.UnsupportedError('not implemented'); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = trackId; + const mid = kind; + const streamId = rtpParameters.rtcp.cname; + this._remoteSdp.receive({ + mid, + kind, + offerRtpParameters: rtpParameters, + streamId, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === mid); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const stream = this._pc.getRemoteStreams().find((s) => s.id === streamId); + const track = stream.getTrackById(localId); + if (!track) throw new Error('remote track not found'); + // Insert into the map. + this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters }); + return { localId, track }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {}; + // Remove from the map. + this._mapRecvLocalIdInfo.delete(localId); + this._remoteSdp.planBStopReceiving({ mid: mid, offerRtpParameters: rtpParameters }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async getReceiverStats(localId) { + throw new errors_1.UnsupportedError('not implemented'); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation({ oldDataChannelSpec: true }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Chrome55 = Chrome55; + }, + { + '../Logger': 13, + '../errors': 18, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/planBUtils': 33, + 'sdp-transform': 44, + }, + ], + 20: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Chrome67 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpPlanBUtils = __importStar(require('./sdp/planBUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('Chrome67'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Chrome67 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Map of RTCRtpSender indexed by localId. + this._mapSendLocalIdRtpSender = new Map(); + // Next sending localId. + this._nextSendLocalId = 0; + // Map of MID, RTP parameters and RTCRtpReceiver indexed by local id. + // Value is an Object with mid, rtpParameters and rtpReceiver. + this._mapRecvLocalIdInfo = new Map(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Chrome67(); + } + get name() { + return 'Chrome67'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }); + try { + const offer = await pc.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: true, + }); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + planB: true, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (codec) { + logger.warn('send() | codec selection is not available in %s handler', this.name); + } + this._sendStream.addTrack(track); + this._pc.addTrack(track, this._sendStream); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (track.kind === 'video' && encodings && encodings.length > 1) { + logger.debug('send() | enabling simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === 'video'); + sdpPlanBUtils.addLegacySimulcast({ + offerMediaObject, + track, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === track.kind); + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpPlanBUtils.getRtpEncodings({ offerMediaObject, track }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // If VP8 and there is effective simulcast, add scalabilityMode to each + // encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + const localId = String(this._nextSendLocalId); + this._nextSendLocalId++; + const rtpSender = this._pc.getSenders().find((s) => s.track === track); + // Insert into the map. + this._mapSendLocalIdRtpSender.set(localId, rtpSender); + return { + localId: localId, + rtpParameters: sendingRtpParameters, + rtpSender, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + this._pc.removeTrack(rtpSender); + if (rtpSender.track) this._sendStream.removeTrack(rtpSender.track); + this._mapSendLocalIdRtpSender.delete(localId); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + try { + await this._pc.setLocalDescription(offer); + } catch (error) { + // NOTE: If there are no sending tracks, setLocalDescription() will fail with + // "Failed to create channels". If so, ignore it. + if (this._sendStream.getTracks().length === 0) { + logger.warn( + 'stopSending() | ignoring expected error due no sending tracks: %s', + error.toString(), + ); + return; + } + throw error; + } + if (this._pc.signalingState === 'stable') return; + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const oldTrack = rtpSender.track; + await rtpSender.replaceTrack(track); + // Remove the old track from the local stream. + if (oldTrack) this._sendStream.removeTrack(oldTrack); + // Add the new track to the local stream. + if (track) this._sendStream.addTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await rtpSender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await rtpSender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + return rtpSender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = trackId; + const mid = kind; + this._remoteSdp.receive({ + mid, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === mid); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const rtpReceiver = this._pc.getReceivers().find((r) => r.track && r.track.id === localId); + if (!rtpReceiver) throw new Error('new RTCRtpReceiver not'); + // Insert into the map. + this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver }); + return { + localId, + track: rtpReceiver.track, + rtpReceiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {}; + // Remove from the map. + this._mapRecvLocalIdInfo.delete(localId); + this._remoteSdp.planBStopReceiving({ mid: mid, offerRtpParameters: rtpParameters }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId) || {}; + if (!rtpReceiver) throw new Error('associated RTCRtpReceiver not found'); + return rtpReceiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation({ oldDataChannelSpec: true }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Chrome67 = Chrome67; + }, + { + '../Logger': 13, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/planBUtils': 33, + 'sdp-transform': 44, + }, + ], + 21: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Chrome70 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpUnifiedPlanUtils = __importStar(require('./sdp/unifiedPlanUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const scalabilityModes_1 = require('../scalabilityModes'); + const logger = new Logger_1.Logger('Chrome70'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Chrome70 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Map of RTCTransceivers indexed by MID. + this._mapMidTransceiver = new Map(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Chrome70(); + } + get name() { + return 'Chrome70'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'unified-plan', + }); + try { + pc.addTransceiver('audio'); + pc.addTransceiver('video'); + const offer = await pc.createOffer(); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'unified-plan', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + // This may throw. + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs, codec); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + // This may throw. + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec); + const mediaSectionIdx = this._remoteSdp.getNextMediaSectionIdx(); + const transceiver = this._pc.addTransceiver(track, { + direction: 'sendonly', + streams: [this._sendStream], + }); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (encodings && encodings.length > 1) { + logger.debug('send() | enabling legacy simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + sdpUnifiedPlanUtils.addLegacySimulcast({ + offerMediaObject, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + // Special case for VP9 with SVC. + let hackVp9Svc = false; + const layers = scalabilityModes_1.parse((encodings || [{}])[0].scalabilityMode); + if ( + encodings && + encodings.length === 1 && + layers.spatialLayers > 1 && + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9' + ) { + logger.debug('send() | enabling legacy simulcast for VP9 SVC'); + hackVp9Svc = true; + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + sdpUnifiedPlanUtils.addLegacySimulcast({ + offerMediaObject, + numStreams: layers.spatialLayers, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + // If encodings are given, apply them now. + if (encodings) { + logger.debug('send() | applying given encodings'); + const parameters = transceiver.sender.getParameters(); + for (let idx = 0; idx < (parameters.encodings || []).length; ++idx) { + const encoding = parameters.encodings[idx]; + const desiredEncoding = encodings[idx]; + // Should not happen but just in case. + if (!desiredEncoding) break; + parameters.encodings[idx] = Object.assign(encoding, desiredEncoding); + } + await transceiver.sender.setParameters(parameters); + } + // We can now get the transceiver.mid. + const localId = transceiver.mid; + // Set MID. + sendingRtpParameters.mid = localId; + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // Hack for VP9 SVC. + if (hackVp9Svc) { + sendingRtpParameters.encodings = [sendingRtpParameters.encodings[0]]; + } + // If VP8 or H264 and there is effective simulcast, add scalabilityMode to + // each encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' || + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264') + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + reuseMid: mediaSectionIdx.reuseMid, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + rtpParameters: sendingRtpParameters, + rtpSender: transceiver.sender, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + transceiver.sender.replaceTrack(null); + this._pc.removeTrack(transceiver.sender); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + await transceiver.sender.replaceTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await transceiver.sender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await transceiver.sender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.sender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = rtpParameters.mid || String(this._mapMidTransceiver.size); + this._remoteSdp.receive({ + mid: localId, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === localId); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const transceiver = this._pc.getTransceivers().find((t) => t.mid === localId); + if (!transceiver) throw new Error('new RTCRtpTransceiver not found'); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + track: transceiver.receiver.track, + rtpReceiver: transceiver.receiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.receiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation(); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Chrome70 = Chrome70; + }, + { + '../Logger': 13, + '../ortc': 36, + '../scalabilityModes': 37, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/unifiedPlanUtils': 34, + 'sdp-transform': 44, + }, + ], + 22: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Chrome74 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpUnifiedPlanUtils = __importStar(require('./sdp/unifiedPlanUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const scalabilityModes_1 = require('../scalabilityModes'); + const logger = new Logger_1.Logger('Chrome74'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Chrome74 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Map of RTCTransceivers indexed by MID. + this._mapMidTransceiver = new Map(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Chrome74(); + } + get name() { + return 'Chrome74'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'unified-plan', + }); + try { + pc.addTransceiver('audio'); + pc.addTransceiver('video'); + const offer = await pc.createOffer(); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'unified-plan', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (encodings && encodings.length > 1) { + encodings.forEach((encoding, idx) => { + encoding.rid = `r${idx}`; + }); + } + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + // This may throw. + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs, codec); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + // This may throw. + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec); + const mediaSectionIdx = this._remoteSdp.getNextMediaSectionIdx(); + const transceiver = this._pc.addTransceiver(track, { + direction: 'sendonly', + streams: [this._sendStream], + sendEncodings: encodings, + }); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + // Special case for VP9 with SVC. + let hackVp9Svc = false; + const layers = scalabilityModes_1.parse((encodings || [{}])[0].scalabilityMode); + if ( + encodings && + encodings.length === 1 && + layers.spatialLayers > 1 && + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9' + ) { + logger.debug('send() | enabling legacy simulcast for VP9 SVC'); + hackVp9Svc = true; + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + sdpUnifiedPlanUtils.addLegacySimulcast({ + offerMediaObject, + numStreams: layers.spatialLayers, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + // We can now get the transceiver.mid. + const localId = transceiver.mid; + // Set MID. + sendingRtpParameters.mid = localId; + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings by parsing the SDP offer if no encodings are given. + if (!encodings) { + sendingRtpParameters.encodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + } + // Set RTP encodings by parsing the SDP offer and complete them with given + // one if just a single encoding has been given. + else if (encodings.length === 1) { + let newEncodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + Object.assign(newEncodings[0], encodings[0]); + // Hack for VP9 SVC. + if (hackVp9Svc) newEncodings = [newEncodings[0]]; + sendingRtpParameters.encodings = newEncodings; + } + // Otherwise if more than 1 encoding are given use them verbatim. + else { + sendingRtpParameters.encodings = encodings; + } + // If VP8 or H264 and there is effective simulcast, add scalabilityMode to + // each encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' || + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264') + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + reuseMid: mediaSectionIdx.reuseMid, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + extmapAllowMixed: true, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + rtpParameters: sendingRtpParameters, + rtpSender: transceiver.sender, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + transceiver.sender.replaceTrack(null); + this._pc.removeTrack(transceiver.sender); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + await transceiver.sender.replaceTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await transceiver.sender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await transceiver.sender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.sender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = rtpParameters.mid || String(this._mapMidTransceiver.size); + this._remoteSdp.receive({ + mid: localId, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === localId); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const transceiver = this._pc.getTransceivers().find((t) => t.mid === localId); + if (!transceiver) throw new Error('new RTCRtpTransceiver not found'); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + track: transceiver.receiver.track, + rtpReceiver: transceiver.receiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.receiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation(); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Chrome74 = Chrome74; + }, + { + '../Logger': 13, + '../ortc': 36, + '../scalabilityModes': 37, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/unifiedPlanUtils': 34, + 'sdp-transform': 44, + }, + ], + 23: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Edge11 = void 0; + const Logger_1 = require('../Logger'); + const errors_1 = require('../errors'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const edgeUtils = __importStar(require('./ortc/edgeUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const logger = new Logger_1.Logger('Edge11'); + class Edge11 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Map of RTCRtpSenders indexed by id. + this._rtpSenders = new Map(); + // Map of RTCRtpReceivers indexed by id. + this._rtpReceivers = new Map(); + // Next localId for sending tracks. + this._nextSendLocalId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Edge11(); + } + get name() { + return 'Edge11'; + } + close() { + logger.debug('close()'); + // Close the ICE gatherer. + // NOTE: Not yet implemented by Edge. + try { + this._iceGatherer.close(); + } catch (error) {} + // Close the ICE transport. + try { + this._iceTransport.stop(); + } catch (error) {} + // Close the DTLS transport. + try { + this._dtlsTransport.stop(); + } catch (error) {} + // Close RTCRtpSenders. + for (const rtpSender of this._rtpSenders.values()) { + try { + rtpSender.stop(); + } catch (error) {} + } + // Close RTCRtpReceivers. + for (const rtpReceiver of this._rtpReceivers.values()) { + try { + rtpReceiver.stop(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + return edgeUtils.getCapabilities(); + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: { OS: 0, MIS: 0 }, + }; + } + run({ + direction, // eslint-disable-line @typescript-eslint/no-unused-vars + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, // eslint-disable-line @typescript-eslint/no-unused-vars + iceServers, + iceTransportPolicy, + additionalSettings, // eslint-disable-line @typescript-eslint/no-unused-vars + proprietaryConstraints, // eslint-disable-line @typescript-eslint/no-unused-vars + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._remoteIceParameters = iceParameters; + this._remoteIceCandidates = iceCandidates; + this._remoteDtlsParameters = dtlsParameters; + this._cname = `CNAME-${utils.generateRandomNumber()}`; + this._setIceGatherer({ iceServers, iceTransportPolicy }); + this._setIceTransport(); + this._setDtlsTransport(); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async updateIceServers(iceServers) { + // NOTE: Edge 11 does not implement iceGatherer.gater(). + throw new errors_1.UnsupportedError('not supported'); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + this._remoteIceParameters = iceParameters; + if (!this._transportReady) return; + logger.debug('restartIce() | calling iceTransport.start()'); + this._iceTransport.start(this._iceGatherer, iceParameters, 'controlling'); + for (const candidate of this._remoteIceCandidates) { + this._iceTransport.addRemoteCandidate(candidate); + } + this._iceTransport.addRemoteCandidate({}); + } + async getTransportStats() { + return this._iceTransport.getStats(); + } + async send( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + { track, encodings, codecOptions, codec }, + ) { + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (!this._transportReady) await this._setupTransport({ localDtlsRole: 'server' }); + logger.debug('send() | calling new RTCRtpSender()'); + const rtpSender = new RTCRtpSender(track, this._dtlsTransport); + const rtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + rtpParameters.codecs = ortc.reduceCodecs(rtpParameters.codecs, codec); + const useRtx = rtpParameters.codecs.some((_codec) => /.+\/rtx$/i.test(_codec.mimeType)); + if (!encodings) encodings = [{}]; + for (const encoding of encodings) { + encoding.ssrc = utils.generateRandomNumber(); + if (useRtx) encoding.rtx = { ssrc: utils.generateRandomNumber() }; + } + rtpParameters.encodings = encodings; + // Fill RTCRtpParameters.rtcp. + rtpParameters.rtcp = { + cname: this._cname, + reducedSize: true, + mux: true, + }; + // NOTE: Convert our standard RTCRtpParameters into those that Edge + // expects. + const edgeRtpParameters = edgeUtils.mangleRtpParameters(rtpParameters); + logger.debug('send() | calling rtpSender.send() [params:%o]', edgeRtpParameters); + await rtpSender.send(edgeRtpParameters); + const localId = String(this._nextSendLocalId); + this._nextSendLocalId++; + // Store it. + this._rtpSenders.set(localId, rtpSender); + return { localId, rtpParameters, rtpSender }; + } + async stopSending(localId) { + logger.debug('stopSending() [localId:%s]', localId); + const rtpSender = this._rtpSenders.get(localId); + if (!rtpSender) throw new Error('RTCRtpSender not found'); + this._rtpSenders.delete(localId); + try { + logger.debug('stopSending() | calling rtpSender.stop()'); + rtpSender.stop(); + } catch (error) { + logger.warn('stopSending() | rtpSender.stop() failed:%o', error); + throw error; + } + } + async replaceTrack(localId, track) { + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const rtpSender = this._rtpSenders.get(localId); + if (!rtpSender) throw new Error('RTCRtpSender not found'); + rtpSender.setTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const rtpSender = this._rtpSenders.get(localId); + if (!rtpSender) throw new Error('RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await rtpSender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const rtpSender = this._rtpSenders.get(localId); + if (!rtpSender) throw new Error('RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await rtpSender.setParameters(parameters); + } + async getSenderStats(localId) { + const rtpSender = this._rtpSenders.get(localId); + if (!rtpSender) throw new Error('RTCRtpSender not found'); + return rtpSender.getStats(); + } + async sendDataChannel( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + options, + ) { + throw new errors_1.UnsupportedError('not implemented'); + } + async receive({ trackId, kind, rtpParameters }) { + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + if (!this._transportReady) await this._setupTransport({ localDtlsRole: 'server' }); + logger.debug('receive() | calling new RTCRtpReceiver()'); + const rtpReceiver = new RTCRtpReceiver(this._dtlsTransport, kind); + rtpReceiver.addEventListener('error', (event) => { + logger.error('rtpReceiver "error" event [event:%o]', event); + }); + // NOTE: Convert our standard RTCRtpParameters into those that Edge + // expects. + const edgeRtpParameters = edgeUtils.mangleRtpParameters(rtpParameters); + logger.debug('receive() | calling rtpReceiver.receive() [params:%o]', edgeRtpParameters); + await rtpReceiver.receive(edgeRtpParameters); + const localId = trackId; + // Store it. + this._rtpReceivers.set(localId, rtpReceiver); + return { + localId, + track: rtpReceiver.track, + rtpReceiver, + }; + } + async stopReceiving(localId) { + logger.debug('stopReceiving() [localId:%s]', localId); + const rtpReceiver = this._rtpReceivers.get(localId); + if (!rtpReceiver) throw new Error('RTCRtpReceiver not found'); + this._rtpReceivers.delete(localId); + try { + logger.debug('stopReceiving() | calling rtpReceiver.stop()'); + rtpReceiver.stop(); + } catch (error) { + logger.warn('stopReceiving() | rtpReceiver.stop() failed:%o', error); + } + } + async getReceiverStats(localId) { + const rtpReceiver = this._rtpReceivers.get(localId); + if (!rtpReceiver) throw new Error('RTCRtpReceiver not found'); + return rtpReceiver.getStats(); + } + async receiveDataChannel( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + options, + ) { + throw new errors_1.UnsupportedError('not implemented'); + } + _setIceGatherer({ iceServers, iceTransportPolicy }) { + const iceGatherer = new RTCIceGatherer({ + iceServers: iceServers || [], + gatherPolicy: iceTransportPolicy || 'all', + }); + iceGatherer.addEventListener('error', (event) => { + logger.error('iceGatherer "error" event [event:%o]', event); + }); + // NOTE: Not yet implemented by Edge, which starts gathering automatically. + try { + iceGatherer.gather(); + } catch (error) { + logger.debug('_setIceGatherer() | iceGatherer.gather() failed: %s', error.toString()); + } + this._iceGatherer = iceGatherer; + } + _setIceTransport() { + const iceTransport = new RTCIceTransport(this._iceGatherer); + // NOTE: Not yet implemented by Edge. + iceTransport.addEventListener('statechange', () => { + switch (iceTransport.state) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + // NOTE: Not standard, but implemented by Edge. + iceTransport.addEventListener('icestatechange', () => { + switch (iceTransport.state) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + iceTransport.addEventListener('candidatepairchange', (event) => { + logger.debug('iceTransport "candidatepairchange" event [pair:%o]', event.pair); + }); + this._iceTransport = iceTransport; + } + _setDtlsTransport() { + const dtlsTransport = new RTCDtlsTransport(this._iceTransport); + // NOTE: Not yet implemented by Edge. + dtlsTransport.addEventListener('statechange', () => { + logger.debug('dtlsTransport "statechange" event [state:%s]', dtlsTransport.state); + }); + // NOTE: Not standard, but implemented by Edge. + dtlsTransport.addEventListener('dtlsstatechange', () => { + logger.debug('dtlsTransport "dtlsstatechange" event [state:%s]', dtlsTransport.state); + if (dtlsTransport.state === 'closed') this.emit('@connectionstatechange', 'closed'); + }); + dtlsTransport.addEventListener('error', (event) => { + logger.error('dtlsTransport "error" event [event:%o]', event); + }); + this._dtlsTransport = dtlsTransport; + } + async _setupTransport({ localDtlsRole }) { + logger.debug('_setupTransport()'); + // Get our local DTLS parameters. + const dtlsParameters = this._dtlsTransport.getLocalParameters(); + dtlsParameters.role = localDtlsRole; + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + // Start the RTCIceTransport. + this._iceTransport.start(this._iceGatherer, this._remoteIceParameters, 'controlling'); + // Add remote ICE candidates. + for (const candidate of this._remoteIceCandidates) { + this._iceTransport.addRemoteCandidate(candidate); + } + // Also signal a 'complete' candidate as per spec. + // NOTE: It should be {complete: true} but Edge prefers {}. + // NOTE: If we don't signal end of candidates, the Edge RTCIceTransport + // won't enter the 'completed' state. + this._iceTransport.addRemoteCandidate({}); + // NOTE: Edge does not like SHA less than 256. + this._remoteDtlsParameters.fingerprints = this._remoteDtlsParameters.fingerprints.filter( + (fingerprint) => { + return ( + fingerprint.algorithm === 'sha-256' || + fingerprint.algorithm === 'sha-384' || + fingerprint.algorithm === 'sha-512' + ); + }, + ); + // Start the RTCDtlsTransport. + this._dtlsTransport.start(this._remoteDtlsParameters); + this._transportReady = true; + } + } + exports.Edge11 = Edge11; + }, + { + '../Logger': 13, + '../errors': 18, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './ortc/edgeUtils': 29, + }, + ], + 24: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Firefox60 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const errors_1 = require('../errors'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpUnifiedPlanUtils = __importStar(require('./sdp/unifiedPlanUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('Firefox60'); + const SCTP_NUM_STREAMS = { OS: 16, MIS: 2048 }; + class Firefox60 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Map of RTCTransceivers indexed by MID. + this._mapMidTransceiver = new Map(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Firefox60(); + } + get name() { + return 'Firefox60'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + }); + // NOTE: We need to add a real video track to get the RID extension mapping. + const canvas = document.createElement('canvas'); + // NOTE: Otherwise Firefox fails in next line. + canvas.getContext('2d'); + const fakeStream = canvas.captureStream(); + const fakeVideoTrack = fakeStream.getVideoTracks()[0]; + try { + pc.addTransceiver('audio', { direction: 'sendrecv' }); + const videoTransceiver = pc.addTransceiver(fakeVideoTrack, { direction: 'sendrecv' }); + const parameters = videoTransceiver.sender.getParameters(); + const encodings = [ + { rid: 'r0', maxBitrate: 100000 }, + { rid: 'r1', maxBitrate: 500000 }, + ]; + parameters.encodings = encodings; + await videoTransceiver.sender.setParameters(parameters); + const offer = await pc.createOffer(); + try { + canvas.remove(); + } catch (error) {} + try { + fakeVideoTrack.stop(); + } catch (error) {} + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + canvas.remove(); + } catch (error2) {} + try { + fakeVideoTrack.stop(); + } catch (error2) {} + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async updateIceServers(iceServers) { + // NOTE: Firefox does not implement pc.setConfiguration(). + throw new errors_1.UnsupportedError('not supported'); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (encodings) { + encodings = utils.clone(encodings, []); + if (encodings.length > 1) { + encodings.forEach((encoding, idx) => { + encoding.rid = `r${idx}`; + }); + // Clone the encodings and reverse them because Firefox likes them + // from high to low. + encodings.reverse(); + } + } + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + // This may throw. + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs, codec); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + // This may throw. + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec); + // NOTE: Firefox fails sometimes to properly anticipate the closed media + // section that it should use, so don't reuse closed media sections. + // https://github.com/versatica/mediasoup-client/issues/104 + // + // const mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx(); + const transceiver = this._pc.addTransceiver(track, { + direction: 'sendonly', + streams: [this._sendStream], + }); + // NOTE: This is not spec compliants. Encodings should be given in addTransceiver + // second argument, but Firefox does not support it. + if (encodings) { + const parameters = transceiver.sender.getParameters(); + parameters.encodings = encodings; + await transceiver.sender.setParameters(parameters); + } + const offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + // In Firefox use DTLS role client even if we are the "offerer" since + // Firefox does not respect ICE-Lite. + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + // We can now get the transceiver.mid. + const localId = transceiver.mid; + // Set MID. + sendingRtpParameters.mid = localId; + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + const offerMediaObject = localSdpObject.media[localSdpObject.media.length - 1]; + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings by parsing the SDP offer if no encodings are given. + if (!encodings) { + sendingRtpParameters.encodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + } + // Set RTP encodings by parsing the SDP offer and complete them with given + // one if just a single encoding has been given. + else if (encodings.length === 1) { + const newEncodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + Object.assign(newEncodings[0], encodings[0]); + sendingRtpParameters.encodings = newEncodings; + } + // Otherwise if more than 1 encoding are given use them verbatim (but + // reverse them back since we reversed them above to satisfy Firefox). + else { + sendingRtpParameters.encodings = encodings.reverse(); + } + // If VP8 or H264 and there is effective simulcast, add scalabilityMode to + // each encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' || + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264') + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + extmapAllowMixed: true, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + rtpParameters: sendingRtpParameters, + rtpSender: transceiver.sender, + }; + } + async stopSending(localId) { + logger.debug('stopSending() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated transceiver not found'); + transceiver.sender.replaceTrack(null); + this._pc.removeTrack(transceiver.sender); + // NOTE: Cannot use closeMediaSection() due to the the note above in send() + // method. + // this._remoteSdp!.closeMediaSection(transceiver.mid); + this._remoteSdp.disableMediaSection(transceiver.mid); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + await transceiver.sender.replaceTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated transceiver not found'); + const parameters = transceiver.sender.getParameters(); + // NOTE: We require encodings given from low to high, however Firefox + // requires them in reverse order, so do magic here. + spatialLayer = parameters.encodings.length - 1 - spatialLayer; + parameters.encodings.forEach((encoding, idx) => { + if (idx >= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await transceiver.sender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await transceiver.sender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.sender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = rtpParameters.mid || String(this._mapMidTransceiver.size); + this._remoteSdp.receive({ + mid: localId, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === localId); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const transceiver = this._pc.getTransceivers().find((t) => t.mid === localId); + if (!transceiver) throw new Error('new RTCRtpTransceiver not found'); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + track: transceiver.receiver.track, + rtpReceiver: transceiver.receiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.receiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation(); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Firefox60 = Firefox60; + }, + { + '../Logger': 13, + '../errors': 18, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/unifiedPlanUtils': 34, + 'sdp-transform': 44, + }, + ], + 25: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.HandlerInterface = void 0; + const EnhancedEventEmitter_1 = require('../EnhancedEventEmitter'); + class HandlerInterface extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @emits @connect - ( + * { dtlsParameters: DtlsParameters }, + * callback: Function, + * errback: Function + * ) + * @emits @connectionstatechange - (connectionState: ConnectionState) + */ + constructor() { + super(); + } + } + exports.HandlerInterface = HandlerInterface; + }, + { '../EnhancedEventEmitter': 12 }, + ], + 26: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.ReactNative = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const errors_1 = require('../errors'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpPlanBUtils = __importStar(require('./sdp/planBUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('ReactNative'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class ReactNative extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Map of sending MediaStreamTracks indexed by localId. + this._mapSendLocalIdTrack = new Map(); + // Next sending localId. + this._nextSendLocalId = 0; + // Map of MID, RTP parameters and RTCRtpReceiver indexed by local id. + // Value is an Object with mid, rtpParameters and rtpReceiver. + this._mapRecvLocalIdInfo = new Map(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new ReactNative(); + } + get name() { + return 'ReactNative'; + } + close() { + logger.debug('close()'); + // Free/dispose native stream and tracks. + // @ts-ignore (proprietary API in react-native-webrtc). + this._sendStream.release(); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }); + try { + const offer = await pc.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: true, + }); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + planB: true, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (codec) { + logger.warn('send() | codec selection is not available in %s handler', this.name); + } + this._sendStream.addTrack(track); + this._pc.addStream(this._sendStream); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (track.kind === 'video' && encodings && encodings.length > 1) { + logger.debug('send() | enabling simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === 'video'); + sdpPlanBUtils.addLegacySimulcast({ + offerMediaObject, + track, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === track.kind); + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpPlanBUtils.getRtpEncodings({ offerMediaObject, track }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // If VP8 or H264 and there is effective simulcast, add scalabilityMode to + // each encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' || + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264') + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + const localId = String(this._nextSendLocalId); + this._nextSendLocalId++; + // Insert into the map. + this._mapSendLocalIdTrack.set(localId, track); + return { + localId: localId, + rtpParameters: sendingRtpParameters, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const track = this._mapSendLocalIdTrack.get(localId); + if (!track) throw new Error('track not found'); + this._mapSendLocalIdTrack.delete(localId); + this._sendStream.removeTrack(track); + this._pc.addStream(this._sendStream); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + try { + await this._pc.setLocalDescription(offer); + } catch (error) { + // NOTE: If there are no sending tracks, setLocalDescription() will fail with + // "Failed to create channels". If so, ignore it. + if (this._sendStream.getTracks().length === 0) { + logger.warn( + 'stopSending() | ignoring expected error due no sending tracks: %s', + error.toString(), + ); + return; + } + throw error; + } + if (this._pc.signalingState === 'stable') return; + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + localId, + track, + ) { + throw new errors_1.UnsupportedError('not implemented'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setMaxSpatialLayer(localId, spatialLayer) { + throw new errors_1.UnsupportedError('not implemented'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setRtpEncodingParameters(localId, params) { + throw new errors_1.UnsupportedError('not implemented'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async getSenderStats(localId) { + throw new errors_1.UnsupportedError('not implemented'); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = trackId; + const mid = kind; + let streamId = rtpParameters.rtcp.cname; + // NOTE: In React-Native we cannot reuse the same remote MediaStream for new + // remote tracks. This is because react-native-webrtc does not react on new + // tracks generated within already existing streams, so force the streamId + // to be different. + logger.debug( + 'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc', + ); + streamId += `-hack-${utils.generateRandomNumber()}`; + this._remoteSdp.receive({ + mid, + kind, + offerRtpParameters: rtpParameters, + streamId, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === mid); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const stream = this._pc.getRemoteStreams().find((s) => s.id === streamId); + const track = stream.getTrackById(localId); + if (!track) throw new Error('remote track not found'); + // Insert into the map. + this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters }); + return { localId, track }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {}; + // Remove from the map. + this._mapRecvLocalIdInfo.delete(localId); + this._remoteSdp.planBStopReceiving({ mid: mid, offerRtpParameters: rtpParameters }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async getReceiverStats(localId) { + throw new errors_1.UnsupportedError('not implemented'); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmitTime: maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation({ oldDataChannelSpec: true }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.ReactNative = ReactNative; + }, + { + '../Logger': 13, + '../errors': 18, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/planBUtils': 33, + 'sdp-transform': 44, + }, + ], + 27: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Safari11 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpPlanBUtils = __importStar(require('./sdp/planBUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('Safari11'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Safari11 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Map of RTCRtpSender indexed by localId. + this._mapSendLocalIdRtpSender = new Map(); + // Next sending localId. + this._nextSendLocalId = 0; + // Map of MID, RTP parameters and RTCRtpReceiver indexed by local id. + // Value is an Object with mid, rtpParameters and rtpReceiver. + this._mapRecvLocalIdInfo = new Map(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Safari11(); + } + get name() { + return 'Safari11'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + sdpSemantics: 'plan-b', + }); + try { + const offer = await pc.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: true, + }); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + planB: true, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + if (codec) { + logger.warn('send() | codec selection is not available in %s handler', this.name); + } + this._sendStream.addTrack(track); + this._pc.addTrack(track, this._sendStream); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (track.kind === 'video' && encodings && encodings.length > 1) { + logger.debug('send() | enabling simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === 'video'); + sdpPlanBUtils.addLegacySimulcast({ + offerMediaObject, + track, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media.find((m) => m.type === track.kind); + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpPlanBUtils.getRtpEncodings({ offerMediaObject, track }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // If VP8 and there is effective simulcast, add scalabilityMode to each + // encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + const localId = String(this._nextSendLocalId); + this._nextSendLocalId++; + const rtpSender = this._pc.getSenders().find((s) => s.track === track); + // Insert into the map. + this._mapSendLocalIdRtpSender.set(localId, rtpSender); + return { + localId: localId, + rtpParameters: sendingRtpParameters, + rtpSender, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + if (rtpSender.track) this._sendStream.removeTrack(rtpSender.track); + this._mapSendLocalIdRtpSender.delete(localId); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + try { + await this._pc.setLocalDescription(offer); + } catch (error) { + // NOTE: If there are no sending tracks, setLocalDescription() will fail with + // "Failed to create channels". If so, ignore it. + if (this._sendStream.getTracks().length === 0) { + logger.warn( + 'stopSending() | ignoring expected error due no sending tracks: %s', + error.toString(), + ); + return; + } + throw error; + } + if (this._pc.signalingState === 'stable') return; + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const oldTrack = rtpSender.track; + await rtpSender.replaceTrack(track); + // Remove the old track from the local stream. + if (oldTrack) this._sendStream.removeTrack(oldTrack); + // Add the new track to the local stream. + if (track) this._sendStream.addTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await rtpSender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + const parameters = rtpSender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await rtpSender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const rtpSender = this._mapSendLocalIdRtpSender.get(localId); + if (!rtpSender) throw new Error('associated RTCRtpSender not found'); + return rtpSender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = trackId; + const mid = kind; + this._remoteSdp.receive({ + mid, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === mid); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const rtpReceiver = this._pc.getReceivers().find((r) => r.track && r.track.id === localId); + if (!rtpReceiver) throw new Error('new RTCRtpReceiver not'); + // Insert into the map. + this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver }); + return { + localId, + track: rtpReceiver.track, + rtpReceiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {}; + // Remove from the map. + this._mapRecvLocalIdInfo.delete(localId); + this._remoteSdp.planBStopReceiving({ mid: mid, offerRtpParameters: rtpParameters }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId) || {}; + if (!rtpReceiver) throw new Error('associated RTCRtpReceiver not found'); + return rtpReceiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation({ oldDataChannelSpec: true }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Safari11 = Safari11; + }, + { + '../Logger': 13, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/planBUtils': 33, + 'sdp-transform': 44, + }, + ], + 28: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.Safari12 = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../Logger'); + const utils = __importStar(require('../utils')); + const ortc = __importStar(require('../ortc')); + const sdpCommonUtils = __importStar(require('./sdp/commonUtils')); + const sdpUnifiedPlanUtils = __importStar(require('./sdp/unifiedPlanUtils')); + const HandlerInterface_1 = require('./HandlerInterface'); + const RemoteSdp_1 = require('./sdp/RemoteSdp'); + const logger = new Logger_1.Logger('Safari12'); + const SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 }; + class Safari12 extends HandlerInterface_1.HandlerInterface { + constructor() { + super(); + // Map of RTCTransceivers indexed by MID. + this._mapMidTransceiver = new Map(); + // Local stream for sending. + this._sendStream = new MediaStream(); + // Whether a DataChannel m=application section has been created. + this._hasDataChannelMediaSection = false; + // Sending DataChannel id value counter. Incremented for each new DataChannel. + this._nextSendSctpStreamId = 0; + // Got transport local and remote parameters. + this._transportReady = false; + } + /** + * Creates a factory function. + */ + static createFactory() { + return () => new Safari12(); + } + get name() { + return 'Safari12'; + } + close() { + logger.debug('close()'); + // Close RTCPeerConnection. + if (this._pc) { + try { + this._pc.close(); + } catch (error) {} + } + } + async getNativeRtpCapabilities() { + logger.debug('getNativeRtpCapabilities()'); + const pc = new RTCPeerConnection({ + iceServers: [], + iceTransportPolicy: 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + }); + try { + pc.addTransceiver('audio'); + pc.addTransceiver('video'); + const offer = await pc.createOffer(); + try { + pc.close(); + } catch (error) {} + const sdpObject = sdpTransform.parse(offer.sdp); + const nativeRtpCapabilities = sdpCommonUtils.extractRtpCapabilities({ sdpObject }); + return nativeRtpCapabilities; + } catch (error) { + try { + pc.close(); + } catch (error2) {} + throw error; + } + } + async getNativeSctpCapabilities() { + logger.debug('getNativeSctpCapabilities()'); + return { + numStreams: SCTP_NUM_STREAMS, + }; + } + run({ + direction, + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + iceServers, + iceTransportPolicy, + additionalSettings, + proprietaryConstraints, + extendedRtpCapabilities, + }) { + logger.debug('run()'); + this._direction = direction; + this._remoteSdp = new RemoteSdp_1.RemoteSdp({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + }); + this._sendingRtpParametersByKind = { + audio: ortc.getSendingRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRtpParameters('video', extendedRtpCapabilities), + }; + this._sendingRemoteRtpParametersByKind = { + audio: ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities), + video: ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities), + }; + this._pc = new RTCPeerConnection( + Object.assign( + { + iceServers: iceServers || [], + iceTransportPolicy: iceTransportPolicy || 'all', + bundlePolicy: 'max-bundle', + rtcpMuxPolicy: 'require', + }, + additionalSettings, + ), + proprietaryConstraints, + ); + // Handle RTCPeerConnection connection status. + this._pc.addEventListener('iceconnectionstatechange', () => { + switch (this._pc.iceConnectionState) { + case 'checking': + this.emit('@connectionstatechange', 'connecting'); + break; + case 'connected': + case 'completed': + this.emit('@connectionstatechange', 'connected'); + break; + case 'failed': + this.emit('@connectionstatechange', 'failed'); + break; + case 'disconnected': + this.emit('@connectionstatechange', 'disconnected'); + break; + case 'closed': + this.emit('@connectionstatechange', 'closed'); + break; + } + }); + } + async updateIceServers(iceServers) { + logger.debug('updateIceServers()'); + const configuration = this._pc.getConfiguration(); + configuration.iceServers = iceServers; + this._pc.setConfiguration(configuration); + } + async restartIce(iceParameters) { + logger.debug('restartIce()'); + // Provide the remote SDP handler with new remote ICE parameters. + this._remoteSdp.updateIceParameters(iceParameters); + if (!this._transportReady) return; + if (this._direction === 'send') { + const offer = await this._pc.createOffer({ iceRestart: true }); + logger.debug('restartIce() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } else { + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('restartIce() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('restartIce() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + } + async getTransportStats() { + return this._pc.getStats(); + } + async send({ track, encodings, codecOptions, codec }) { + this._assertSendDirection(); + logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id); + const sendingRtpParameters = utils.clone(this._sendingRtpParametersByKind[track.kind], {}); + // This may throw. + sendingRtpParameters.codecs = ortc.reduceCodecs(sendingRtpParameters.codecs, codec); + const sendingRemoteRtpParameters = utils.clone( + this._sendingRemoteRtpParametersByKind[track.kind], + {}, + ); + // This may throw. + sendingRemoteRtpParameters.codecs = ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec); + const mediaSectionIdx = this._remoteSdp.getNextMediaSectionIdx(); + const transceiver = this._pc.addTransceiver(track, { + direction: 'sendonly', + streams: [this._sendStream], + }); + let offer = await this._pc.createOffer(); + let localSdpObject = sdpTransform.parse(offer.sdp); + let offerMediaObject; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + if (encodings && encodings.length > 1) { + logger.debug('send() | enabling legacy simulcast'); + localSdpObject = sdpTransform.parse(offer.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + sdpUnifiedPlanUtils.addLegacySimulcast({ + offerMediaObject, + numStreams: encodings.length, + }); + offer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) }; + } + logger.debug('send() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + // We can now get the transceiver.mid. + const localId = transceiver.mid; + // Set MID. + sendingRtpParameters.mid = localId; + localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + offerMediaObject = localSdpObject.media[mediaSectionIdx.idx]; + // Set RTCP CNAME. + sendingRtpParameters.rtcp.cname = sdpCommonUtils.getCname({ offerMediaObject }); + // Set RTP encodings. + sendingRtpParameters.encodings = sdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject }); + // Complete encodings with given values. + if (encodings) { + for (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx) { + if (encodings[idx]) Object.assign(sendingRtpParameters.encodings[idx], encodings[idx]); + } + } + // If VP8 or H264 and there is effective simulcast, add scalabilityMode to + // each encoding. + if ( + sendingRtpParameters.encodings.length > 1 && + (sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' || + sendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264') + ) { + for (const encoding of sendingRtpParameters.encodings) { + encoding.scalabilityMode = 'S1T3'; + } + } + this._remoteSdp.send({ + offerMediaObject, + reuseMid: mediaSectionIdx.reuseMid, + offerRtpParameters: sendingRtpParameters, + answerRtpParameters: sendingRemoteRtpParameters, + codecOptions, + }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('send() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + rtpParameters: sendingRtpParameters, + rtpSender: transceiver.sender, + }; + } + async stopSending(localId) { + this._assertSendDirection(); + logger.debug('stopSending() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + transceiver.sender.replaceTrack(null); + this._pc.removeTrack(transceiver.sender); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = await this._pc.createOffer(); + logger.debug('stopSending() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopSending() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + } + async replaceTrack(localId, track) { + this._assertSendDirection(); + if (track) { + logger.debug('replaceTrack() [localId:%s, track.id:%s]', localId, track.id); + } else { + logger.debug('replaceTrack() [localId:%s, no track]', localId); + } + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + await transceiver.sender.replaceTrack(track); + } + async setMaxSpatialLayer(localId, spatialLayer) { + this._assertSendDirection(); + logger.debug('setMaxSpatialLayer() [localId:%s, spatialLayer:%s]', localId, spatialLayer); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + if (idx <= spatialLayer) encoding.active = true; + else encoding.active = false; + }); + await transceiver.sender.setParameters(parameters); + } + async setRtpEncodingParameters(localId, params) { + this._assertSendDirection(); + logger.debug('setRtpEncodingParameters() [localId:%s, params:%o]', localId, params); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + const parameters = transceiver.sender.getParameters(); + parameters.encodings.forEach((encoding, idx) => { + parameters.encodings[idx] = Object.assign(Object.assign({}, encoding), params); + }); + await transceiver.sender.setParameters(parameters); + } + async getSenderStats(localId) { + this._assertSendDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.sender.getStats(); + } + async sendDataChannel({ ordered, maxPacketLifeTime, maxRetransmits, label, protocol }) { + this._assertSendDirection(); + const options = { + negotiated: true, + id: this._nextSendSctpStreamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('sendDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // Increase next id. + this._nextSendSctpStreamId = ++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS; + // If this is the first DataChannel we need to create the SDP answer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + const offer = await this._pc.createOffer(); + const localSdpObject = sdpTransform.parse(offer.sdp); + const offerMediaObject = localSdpObject.media.find((m) => m.type === 'application'); + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'server', localSdpObject }); + logger.debug('sendDataChannel() | calling pc.setLocalDescription() [offer:%o]', offer); + await this._pc.setLocalDescription(offer); + this._remoteSdp.sendSctpAssociation({ offerMediaObject }); + const answer = { type: 'answer', sdp: this._remoteSdp.getSdp() }; + logger.debug('sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]', answer); + await this._pc.setRemoteDescription(answer); + this._hasDataChannelMediaSection = true; + } + const sctpStreamParameters = { + streamId: options.id, + ordered: options.ordered, + maxPacketLifeTime: options.maxPacketLifeTime, + maxRetransmits: options.maxRetransmits, + }; + return { dataChannel, sctpStreamParameters }; + } + async receive({ trackId, kind, rtpParameters }) { + this._assertRecvDirection(); + logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind); + const localId = rtpParameters.mid || String(this._mapMidTransceiver.size); + this._remoteSdp.receive({ + mid: localId, + kind, + offerRtpParameters: rtpParameters, + streamId: rtpParameters.rtcp.cname, + trackId, + }); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receive() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + let answer = await this._pc.createAnswer(); + const localSdpObject = sdpTransform.parse(answer.sdp); + const answerMediaObject = localSdpObject.media.find((m) => String(m.mid) === localId); + // May need to modify codec parameters in the answer based on codec + // parameters in the offer. + sdpCommonUtils.applyCodecParameters({ + offerRtpParameters: rtpParameters, + answerMediaObject, + }); + answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) }; + if (!this._transportReady) + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + logger.debug('receive() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + const transceiver = this._pc.getTransceivers().find((t) => t.mid === localId); + if (!transceiver) throw new Error('new RTCRtpTransceiver not found'); + // Store in the map. + this._mapMidTransceiver.set(localId, transceiver); + return { + localId, + track: transceiver.receiver.track, + rtpReceiver: transceiver.receiver, + }; + } + async stopReceiving(localId) { + this._assertRecvDirection(); + logger.debug('stopReceiving() [localId:%s]', localId); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + this._remoteSdp.closeMediaSection(transceiver.mid); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('stopReceiving() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + logger.debug('stopReceiving() | calling pc.setLocalDescription() [answer:%o]', answer); + await this._pc.setLocalDescription(answer); + } + async getReceiverStats(localId) { + this._assertRecvDirection(); + const transceiver = this._mapMidTransceiver.get(localId); + if (!transceiver) throw new Error('associated RTCRtpTransceiver not found'); + return transceiver.receiver.getStats(); + } + async receiveDataChannel({ sctpStreamParameters, label, protocol }) { + this._assertRecvDirection(); + const { streamId, ordered, maxPacketLifeTime, maxRetransmits } = sctpStreamParameters; + const options = { + negotiated: true, + id: streamId, + ordered, + maxPacketLifeTime, + maxRetransmits, + protocol, + }; + logger.debug('receiveDataChannel() [options:%o]', options); + const dataChannel = this._pc.createDataChannel(label, options); + // If this is the first DataChannel we need to create the SDP offer with + // m=application section. + if (!this._hasDataChannelMediaSection) { + this._remoteSdp.receiveSctpAssociation(); + const offer = { type: 'offer', sdp: this._remoteSdp.getSdp() }; + logger.debug('receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]', offer); + await this._pc.setRemoteDescription(offer); + const answer = await this._pc.createAnswer(); + if (!this._transportReady) { + const localSdpObject = sdpTransform.parse(answer.sdp); + await this._setupTransport({ localDtlsRole: 'client', localSdpObject }); + } + logger.debug( + 'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]', + answer, + ); + await this._pc.setLocalDescription(answer); + this._hasDataChannelMediaSection = true; + } + return { dataChannel }; + } + async _setupTransport({ localDtlsRole, localSdpObject }) { + if (!localSdpObject) localSdpObject = sdpTransform.parse(this._pc.localDescription.sdp); + // Get our local DTLS parameters. + const dtlsParameters = sdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject }); + // Set our DTLS role. + dtlsParameters.role = localDtlsRole; + // Update the remote DTLS role in the SDP. + this._remoteSdp.updateDtlsRole(localDtlsRole === 'client' ? 'server' : 'client'); + // Need to tell the remote transport about our parameters. + await this.safeEmitAsPromise('@connect', { dtlsParameters }); + this._transportReady = true; + } + _assertSendDirection() { + if (this._direction !== 'send') { + throw new Error('method can just be called for handlers with "send" direction'); + } + } + _assertRecvDirection() { + if (this._direction !== 'recv') { + throw new Error('method can just be called for handlers with "recv" direction'); + } + } + } + exports.Safari12 = Safari12; + }, + { + '../Logger': 13, + '../ortc': 36, + '../utils': 39, + './HandlerInterface': 25, + './sdp/RemoteSdp': 31, + './sdp/commonUtils': 32, + './sdp/unifiedPlanUtils': 34, + 'sdp-transform': 44, + }, + ], + 29: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.mangleRtpParameters = exports.getCapabilities = void 0; + const utils = __importStar(require('../../utils')); + /** + * Normalize ORTC based Edge's RTCRtpReceiver.getCapabilities() to produce a full + * compliant ORTC RTCRtpCapabilities. + */ + function getCapabilities() { + const nativeCaps = RTCRtpReceiver.getCapabilities(); + const caps = utils.clone(nativeCaps, {}); + for (const codec of caps.codecs) { + // Rename numChannels to channels. + codec.channels = codec.numChannels; + delete codec.numChannels; + // Add mimeType. + codec.mimeType = codec.mimeType || `${codec.kind}/${codec.name}`; + // NOTE: Edge sets some numeric parameters as string rather than number. Fix them. + if (codec.parameters) { + const parameters = codec.parameters; + if (parameters.apt) parameters.apt = Number(parameters.apt); + if (parameters['packetization-mode']) + parameters['packetization-mode'] = Number(parameters['packetization-mode']); + } + // Delete emty parameter String in rtcpFeedback. + for (const feedback of codec.rtcpFeedback || []) { + if (!feedback.parameter) feedback.parameter = ''; + } + } + return caps; + } + exports.getCapabilities = getCapabilities; + /** + * Generate RTCRtpParameters as ORTC based Edge likes. + */ + function mangleRtpParameters(rtpParameters) { + const params = utils.clone(rtpParameters, {}); + // Rename mid to muxId. + if (params.mid) { + params.muxId = params.mid; + delete params.mid; + } + for (const codec of params.codecs) { + // Rename channels to numChannels. + if (codec.channels) { + codec.numChannels = codec.channels; + delete codec.channels; + } + // Add codec.name (requried by Edge). + if (codec.mimeType && !codec.name) codec.name = codec.mimeType.split('/')[1]; + // Remove mimeType. + delete codec.mimeType; + } + return params; + } + exports.mangleRtpParameters = mangleRtpParameters; + }, + { '../../utils': 39 }, + ], + 30: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.OfferMediaSection = exports.AnswerMediaSection = exports.MediaSection = void 0; + const utils = __importStar(require('../../utils')); + class MediaSection { + constructor({ iceParameters, iceCandidates, dtlsParameters, planB = false }) { + this._mediaObject = {}; + this._planB = planB; + if (iceParameters) { + this.setIceParameters(iceParameters); + } + if (iceCandidates) { + this._mediaObject.candidates = []; + for (const candidate of iceCandidates) { + const candidateObject = {}; + // mediasoup does mandates rtcp-mux so candidates component is always + // RTP (1). + candidateObject.component = 1; + candidateObject.foundation = candidate.foundation; + candidateObject.ip = candidate.ip; + candidateObject.port = candidate.port; + candidateObject.priority = candidate.priority; + candidateObject.transport = candidate.protocol; + candidateObject.type = candidate.type; + if (candidate.tcpType) candidateObject.tcptype = candidate.tcpType; + this._mediaObject.candidates.push(candidateObject); + } + this._mediaObject.endOfCandidates = 'end-of-candidates'; + this._mediaObject.iceOptions = 'renomination'; + } + if (dtlsParameters) { + this.setDtlsRole(dtlsParameters.role); + } + } + get mid() { + return String(this._mediaObject.mid); + } + get closed() { + return this._mediaObject.port === 0; + } + getObject() { + return this._mediaObject; + } + setIceParameters(iceParameters) { + this._mediaObject.iceUfrag = iceParameters.usernameFragment; + this._mediaObject.icePwd = iceParameters.password; + } + disable() { + this._mediaObject.direction = 'inactive'; + delete this._mediaObject.ext; + delete this._mediaObject.ssrcs; + delete this._mediaObject.ssrcGroups; + delete this._mediaObject.simulcast; + delete this._mediaObject.simulcast_03; + delete this._mediaObject.rids; + } + close() { + this._mediaObject.direction = 'inactive'; + this._mediaObject.port = 0; + delete this._mediaObject.ext; + delete this._mediaObject.ssrcs; + delete this._mediaObject.ssrcGroups; + delete this._mediaObject.simulcast; + delete this._mediaObject.simulcast_03; + delete this._mediaObject.rids; + delete this._mediaObject.extmapAllowMixed; + } + } + exports.MediaSection = MediaSection; + class AnswerMediaSection extends MediaSection { + constructor({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + plainRtpParameters, + planB = false, + offerMediaObject, + offerRtpParameters, + answerRtpParameters, + codecOptions, + extmapAllowMixed = false, + }) { + super({ iceParameters, iceCandidates, dtlsParameters, planB }); + this._mediaObject.mid = String(offerMediaObject.mid); + this._mediaObject.type = offerMediaObject.type; + this._mediaObject.protocol = offerMediaObject.protocol; + if (!plainRtpParameters) { + this._mediaObject.connection = { ip: '127.0.0.1', version: 4 }; + this._mediaObject.port = 7; + } else { + this._mediaObject.connection = { + ip: plainRtpParameters.ip, + version: plainRtpParameters.ipVersion, + }; + this._mediaObject.port = plainRtpParameters.port; + } + switch (offerMediaObject.type) { + case 'audio': + case 'video': { + this._mediaObject.direction = 'recvonly'; + this._mediaObject.rtp = []; + this._mediaObject.rtcpFb = []; + this._mediaObject.fmtp = []; + for (const codec of answerRtpParameters.codecs) { + const rtp = { + payload: codec.payloadType, + codec: getCodecName(codec), + rate: codec.clockRate, + }; + if (codec.channels > 1) rtp.encoding = codec.channels; + this._mediaObject.rtp.push(rtp); + const codecParameters = utils.clone(codec.parameters, {}); + if (codecOptions) { + const { + opusStereo, + opusFec, + opusDtx, + opusMaxPlaybackRate, + opusMaxAverageBitrate, + opusPtime, + videoGoogleStartBitrate, + videoGoogleMaxBitrate, + videoGoogleMinBitrate, + } = codecOptions; + const offerCodec = offerRtpParameters.codecs.find( + (c) => c.payloadType === codec.payloadType, + ); + switch (codec.mimeType.toLowerCase()) { + case 'audio/opus': { + if (opusStereo !== undefined) { + offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0; + codecParameters.stereo = opusStereo ? 1 : 0; + } + if (opusFec !== undefined) { + offerCodec.parameters.useinbandfec = opusFec ? 1 : 0; + codecParameters.useinbandfec = opusFec ? 1 : 0; + } + if (opusDtx !== undefined) { + offerCodec.parameters.usedtx = opusDtx ? 1 : 0; + codecParameters.usedtx = opusDtx ? 1 : 0; + } + if (opusMaxPlaybackRate !== undefined) { + codecParameters.maxplaybackrate = opusMaxPlaybackRate; + } + if (opusMaxAverageBitrate !== undefined) { + codecParameters.maxaveragebitrate = opusMaxAverageBitrate; + } + if (opusPtime !== undefined) { + offerCodec.parameters.ptime = opusPtime; + codecParameters.ptime = opusPtime; + } + break; + } + case 'video/vp8': + case 'video/vp9': + case 'video/h264': + case 'video/h265': { + if (videoGoogleStartBitrate !== undefined) + codecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate; + if (videoGoogleMaxBitrate !== undefined) + codecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate; + if (videoGoogleMinBitrate !== undefined) + codecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate; + break; + } + } + } + const fmtp = { + payload: codec.payloadType, + config: '', + }; + for (const key of Object.keys(codecParameters)) { + if (fmtp.config) fmtp.config += ';'; + fmtp.config += `${key}=${codecParameters[key]}`; + } + if (fmtp.config) this._mediaObject.fmtp.push(fmtp); + for (const fb of codec.rtcpFeedback) { + this._mediaObject.rtcpFb.push({ + payload: codec.payloadType, + type: fb.type, + subtype: fb.parameter, + }); + } + } + this._mediaObject.payloads = answerRtpParameters.codecs + .map((codec) => codec.payloadType) + .join(' '); + this._mediaObject.ext = []; + for (const ext of answerRtpParameters.headerExtensions) { + // Don't add a header extension if not present in the offer. + const found = (offerMediaObject.ext || []).some( + (localExt) => localExt.uri === ext.uri, + ); + if (!found) continue; + this._mediaObject.ext.push({ + uri: ext.uri, + value: ext.id, + }); + } + // Allow both 1 byte and 2 bytes length header extensions. + if (extmapAllowMixed && offerMediaObject.extmapAllowMixed === 'extmap-allow-mixed') { + this._mediaObject.extmapAllowMixed = 'extmap-allow-mixed'; + } + // Simulcast. + if (offerMediaObject.simulcast) { + this._mediaObject.simulcast = { + dir1: 'recv', + list1: offerMediaObject.simulcast.list1, + }; + this._mediaObject.rids = []; + for (const rid of offerMediaObject.rids || []) { + if (rid.direction !== 'send') continue; + this._mediaObject.rids.push({ + id: rid.id, + direction: 'recv', + }); + } + } + // Simulcast (draft version 03). + else if (offerMediaObject.simulcast_03) { + // eslint-disable-next-line camelcase + this._mediaObject.simulcast_03 = { + value: offerMediaObject.simulcast_03.value.replace(/send/g, 'recv'), + }; + this._mediaObject.rids = []; + for (const rid of offerMediaObject.rids || []) { + if (rid.direction !== 'send') continue; + this._mediaObject.rids.push({ + id: rid.id, + direction: 'recv', + }); + } + } + this._mediaObject.rtcpMux = 'rtcp-mux'; + this._mediaObject.rtcpRsize = 'rtcp-rsize'; + if (this._planB && this._mediaObject.type === 'video') + this._mediaObject.xGoogleFlag = 'conference'; + break; + } + case 'application': { + // New spec. + if (typeof offerMediaObject.sctpPort === 'number') { + this._mediaObject.payloads = 'webrtc-datachannel'; + this._mediaObject.sctpPort = sctpParameters.port; + this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize; + } + // Old spec. + else if (offerMediaObject.sctpmap) { + this._mediaObject.payloads = sctpParameters.port; + this._mediaObject.sctpmap = { + app: 'webrtc-datachannel', + sctpmapNumber: sctpParameters.port, + maxMessageSize: sctpParameters.maxMessageSize, + }; + } + break; + } + } + } + setDtlsRole(role) { + switch (role) { + case 'client': + this._mediaObject.setup = 'active'; + break; + case 'server': + this._mediaObject.setup = 'passive'; + break; + case 'auto': + this._mediaObject.setup = 'actpass'; + break; + } + } + } + exports.AnswerMediaSection = AnswerMediaSection; + class OfferMediaSection extends MediaSection { + constructor({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + plainRtpParameters, + planB = false, + mid, + kind, + offerRtpParameters, + streamId, + trackId, + oldDataChannelSpec = false, + }) { + super({ iceParameters, iceCandidates, dtlsParameters, planB }); + this._mediaObject.mid = String(mid); + this._mediaObject.type = kind; + if (!plainRtpParameters) { + this._mediaObject.connection = { ip: '127.0.0.1', version: 4 }; + if (!sctpParameters) this._mediaObject.protocol = 'UDP/TLS/RTP/SAVPF'; + else this._mediaObject.protocol = 'UDP/DTLS/SCTP'; + this._mediaObject.port = 7; + } else { + this._mediaObject.connection = { + ip: plainRtpParameters.ip, + version: plainRtpParameters.ipVersion, + }; + this._mediaObject.protocol = 'RTP/AVP'; + this._mediaObject.port = plainRtpParameters.port; + } + switch (kind) { + case 'audio': + case 'video': { + this._mediaObject.direction = 'sendonly'; + this._mediaObject.rtp = []; + this._mediaObject.rtcpFb = []; + this._mediaObject.fmtp = []; + if (!this._planB) this._mediaObject.msid = `${streamId || '-'} ${trackId}`; + for (const codec of offerRtpParameters.codecs) { + const rtp = { + payload: codec.payloadType, + codec: getCodecName(codec), + rate: codec.clockRate, + }; + if (codec.channels > 1) rtp.encoding = codec.channels; + this._mediaObject.rtp.push(rtp); + const fmtp = { + payload: codec.payloadType, + config: '', + }; + for (const key of Object.keys(codec.parameters)) { + if (fmtp.config) fmtp.config += ';'; + fmtp.config += `${key}=${codec.parameters[key]}`; + } + if (fmtp.config) this._mediaObject.fmtp.push(fmtp); + for (const fb of codec.rtcpFeedback) { + this._mediaObject.rtcpFb.push({ + payload: codec.payloadType, + type: fb.type, + subtype: fb.parameter, + }); + } + } + this._mediaObject.payloads = offerRtpParameters.codecs + .map((codec) => codec.payloadType) + .join(' '); + this._mediaObject.ext = []; + for (const ext of offerRtpParameters.headerExtensions) { + this._mediaObject.ext.push({ + uri: ext.uri, + value: ext.id, + }); + } + this._mediaObject.rtcpMux = 'rtcp-mux'; + this._mediaObject.rtcpRsize = 'rtcp-rsize'; + const encoding = offerRtpParameters.encodings[0]; + const ssrc = encoding.ssrc; + const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined; + this._mediaObject.ssrcs = []; + this._mediaObject.ssrcGroups = []; + if (offerRtpParameters.rtcp.cname) { + this._mediaObject.ssrcs.push({ + id: ssrc, + attribute: 'cname', + value: offerRtpParameters.rtcp.cname, + }); + } + if (this._planB) { + this._mediaObject.ssrcs.push({ + id: ssrc, + attribute: 'msid', + value: `${streamId || '-'} ${trackId}`, + }); + } + if (rtxSsrc) { + if (offerRtpParameters.rtcp.cname) { + this._mediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'cname', + value: offerRtpParameters.rtcp.cname, + }); + } + if (this._planB) { + this._mediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'msid', + value: `${streamId || '-'} ${trackId}`, + }); + } + // Associate original and retransmission SSRCs. + this._mediaObject.ssrcGroups.push({ + semantics: 'FID', + ssrcs: `${ssrc} ${rtxSsrc}`, + }); + } + break; + } + case 'application': { + // New spec. + if (!oldDataChannelSpec) { + this._mediaObject.payloads = 'webrtc-datachannel'; + this._mediaObject.sctpPort = sctpParameters.port; + this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize; + } + // Old spec. + else { + this._mediaObject.payloads = sctpParameters.port; + this._mediaObject.sctpmap = { + app: 'webrtc-datachannel', + sctpmapNumber: sctpParameters.port, + maxMessageSize: sctpParameters.maxMessageSize, + }; + } + break; + } + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setDtlsRole(role) { + // Always 'actpass'. + this._mediaObject.setup = 'actpass'; + } + planBReceive({ offerRtpParameters, streamId, trackId }) { + const encoding = offerRtpParameters.encodings[0]; + const ssrc = encoding.ssrc; + const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined; + const payloads = this._mediaObject.payloads.split(' '); + for (const codec of offerRtpParameters.codecs) { + if (payloads.includes(String(codec.payloadType))) { + continue; + } + const rtp = { + payload: codec.payloadType, + codec: getCodecName(codec), + rate: codec.clockRate, + }; + if (codec.channels > 1) rtp.encoding = codec.channels; + this._mediaObject.rtp.push(rtp); + const fmtp = { + payload: codec.payloadType, + config: '', + }; + for (const key of Object.keys(codec.parameters)) { + if (fmtp.config) fmtp.config += ';'; + fmtp.config += `${key}=${codec.parameters[key]}`; + } + if (fmtp.config) this._mediaObject.fmtp.push(fmtp); + for (const fb of codec.rtcpFeedback) { + this._mediaObject.rtcpFb.push({ + payload: codec.payloadType, + type: fb.type, + subtype: fb.parameter, + }); + } + } + this._mediaObject.payloads += ` ${offerRtpParameters.codecs + .filter((codec) => !this._mediaObject.payloads.includes(codec.payloadType)) + .map((codec) => codec.payloadType) + .join(' ')}`; + this._mediaObject.payloads = this._mediaObject.payloads.trim(); + if (offerRtpParameters.rtcp.cname) { + this._mediaObject.ssrcs.push({ + id: ssrc, + attribute: 'cname', + value: offerRtpParameters.rtcp.cname, + }); + } + this._mediaObject.ssrcs.push({ + id: ssrc, + attribute: 'msid', + value: `${streamId || '-'} ${trackId}`, + }); + if (rtxSsrc) { + if (offerRtpParameters.rtcp.cname) { + this._mediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'cname', + value: offerRtpParameters.rtcp.cname, + }); + } + this._mediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'msid', + value: `${streamId || '-'} ${trackId}`, + }); + // Associate original and retransmission SSRCs. + this._mediaObject.ssrcGroups.push({ + semantics: 'FID', + ssrcs: `${ssrc} ${rtxSsrc}`, + }); + } + } + planBStopReceiving({ offerRtpParameters }) { + const encoding = offerRtpParameters.encodings[0]; + const ssrc = encoding.ssrc; + const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined; + this._mediaObject.ssrcs = this._mediaObject.ssrcs.filter( + (s) => s.id !== ssrc && s.id !== rtxSsrc, + ); + if (rtxSsrc) { + this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups.filter( + (group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`, + ); + } + } + } + exports.OfferMediaSection = OfferMediaSection; + function getCodecName(codec) { + const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i'); + const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType); + if (!mimeTypeMatch) throw new TypeError('invalid codec.mimeType'); + return mimeTypeMatch[2]; + } + }, + { '../../utils': 39 }, + ], + 31: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.RemoteSdp = void 0; + const sdpTransform = __importStar(require('sdp-transform')); + const Logger_1 = require('../../Logger'); + const MediaSection_1 = require('./MediaSection'); + const logger = new Logger_1.Logger('RemoteSdp'); + class RemoteSdp { + constructor({ + iceParameters, + iceCandidates, + dtlsParameters, + sctpParameters, + plainRtpParameters, + planB = false, + }) { + // MediaSection instances with same order as in the SDP. + this._mediaSections = []; + // MediaSection indices indexed by MID. + this._midToIndex = new Map(); + this._iceParameters = iceParameters; + this._iceCandidates = iceCandidates; + this._dtlsParameters = dtlsParameters; + this._sctpParameters = sctpParameters; + this._plainRtpParameters = plainRtpParameters; + this._planB = planB; + this._sdpObject = { + version: 0, + origin: { + address: '0.0.0.0', + ipVer: 4, + netType: 'IN', + sessionId: 10000, + sessionVersion: 0, + username: 'mediasoup-client', + }, + name: '-', + timing: { start: 0, stop: 0 }, + media: [], + }; + // If ICE parameters are given, add ICE-Lite indicator. + if (iceParameters && iceParameters.iceLite) { + this._sdpObject.icelite = 'ice-lite'; + } + // If DTLS parameters are given, assume WebRTC and BUNDLE. + if (dtlsParameters) { + this._sdpObject.msidSemantic = { semantic: 'WMS', token: '*' }; + // NOTE: We take the latest fingerprint. + const numFingerprints = this._dtlsParameters.fingerprints.length; + this._sdpObject.fingerprint = { + type: dtlsParameters.fingerprints[numFingerprints - 1].algorithm, + hash: dtlsParameters.fingerprints[numFingerprints - 1].value, + }; + this._sdpObject.groups = [{ type: 'BUNDLE', mids: '' }]; + } + // If there are plain RPT parameters, override SDP origin. + if (plainRtpParameters) { + this._sdpObject.origin.address = plainRtpParameters.ip; + this._sdpObject.origin.ipVer = plainRtpParameters.ipVersion; + } + } + updateIceParameters(iceParameters) { + logger.debug('updateIceParameters() [iceParameters:%o]', iceParameters); + this._iceParameters = iceParameters; + this._sdpObject.icelite = iceParameters.iceLite ? 'ice-lite' : undefined; + for (const mediaSection of this._mediaSections) { + mediaSection.setIceParameters(iceParameters); + } + } + updateDtlsRole(role) { + logger.debug('updateDtlsRole() [role:%s]', role); + this._dtlsParameters.role = role; + for (const mediaSection of this._mediaSections) { + mediaSection.setDtlsRole(role); + } + } + getNextMediaSectionIdx() { + // If a closed media section is found, return its index. + for (let idx = 0; idx < this._mediaSections.length; ++idx) { + const mediaSection = this._mediaSections[idx]; + if (mediaSection.closed) return { idx, reuseMid: mediaSection.mid }; + } + // If no closed media section is found, return next one. + return { idx: this._mediaSections.length }; + } + send({ + offerMediaObject, + reuseMid, + offerRtpParameters, + answerRtpParameters, + codecOptions, + extmapAllowMixed = false, + }) { + const mediaSection = new MediaSection_1.AnswerMediaSection({ + iceParameters: this._iceParameters, + iceCandidates: this._iceCandidates, + dtlsParameters: this._dtlsParameters, + plainRtpParameters: this._plainRtpParameters, + planB: this._planB, + offerMediaObject, + offerRtpParameters, + answerRtpParameters, + codecOptions, + extmapAllowMixed, + }); + // Unified-Plan with closed media section replacement. + if (reuseMid) { + this._replaceMediaSection(mediaSection, reuseMid); + } + // Unified-Plan or Plan-B with different media kind. + else if (!this._midToIndex.has(mediaSection.mid)) { + this._addMediaSection(mediaSection); + } + // Plan-B with same media kind. + else { + this._replaceMediaSection(mediaSection); + } + } + receive({ mid, kind, offerRtpParameters, streamId, trackId }) { + const idx = this._midToIndex.get(mid); + let mediaSection; + if (idx !== undefined) mediaSection = this._mediaSections[idx]; + // Unified-Plan or different media kind. + if (!mediaSection) { + mediaSection = new MediaSection_1.OfferMediaSection({ + iceParameters: this._iceParameters, + iceCandidates: this._iceCandidates, + dtlsParameters: this._dtlsParameters, + plainRtpParameters: this._plainRtpParameters, + planB: this._planB, + mid, + kind, + offerRtpParameters, + streamId, + trackId, + }); + // Let's try to recycle a closed media section (if any). + // NOTE: Yes, we can recycle a closed m=audio section with a new m=video. + const oldMediaSection = this._mediaSections.find((m) => m.closed); + if (oldMediaSection) { + this._replaceMediaSection(mediaSection, oldMediaSection.mid); + } else { + this._addMediaSection(mediaSection); + } + } + // Plan-B. + else { + mediaSection.planBReceive({ offerRtpParameters, streamId, trackId }); + this._replaceMediaSection(mediaSection); + } + } + disableMediaSection(mid) { + const idx = this._midToIndex.get(mid); + if (idx === undefined) { + throw new Error(`no media section found with mid '${mid}'`); + } + const mediaSection = this._mediaSections[idx]; + mediaSection.disable(); + } + closeMediaSection(mid) { + const idx = this._midToIndex.get(mid); + if (idx === undefined) { + throw new Error(`no media section found with mid '${mid}'`); + } + const mediaSection = this._mediaSections[idx]; + // NOTE: Closing the first m section is a pain since it invalidates the + // bundled transport, so let's avoid it. + if (mid === this._firstMid) { + logger.debug( + 'closeMediaSection() | cannot close first media section, disabling it instead [mid:%s]', + mid, + ); + this.disableMediaSection(mid); + return; + } + mediaSection.close(); + // Regenerate BUNDLE mids. + this._regenerateBundleMids(); + } + planBStopReceiving({ mid, offerRtpParameters }) { + const idx = this._midToIndex.get(mid); + if (idx === undefined) { + throw new Error(`no media section found with mid '${mid}'`); + } + const mediaSection = this._mediaSections[idx]; + mediaSection.planBStopReceiving({ offerRtpParameters }); + this._replaceMediaSection(mediaSection); + } + sendSctpAssociation({ offerMediaObject }) { + const mediaSection = new MediaSection_1.AnswerMediaSection({ + iceParameters: this._iceParameters, + iceCandidates: this._iceCandidates, + dtlsParameters: this._dtlsParameters, + sctpParameters: this._sctpParameters, + plainRtpParameters: this._plainRtpParameters, + offerMediaObject, + }); + this._addMediaSection(mediaSection); + } + receiveSctpAssociation({ oldDataChannelSpec = false } = {}) { + const mediaSection = new MediaSection_1.OfferMediaSection({ + iceParameters: this._iceParameters, + iceCandidates: this._iceCandidates, + dtlsParameters: this._dtlsParameters, + sctpParameters: this._sctpParameters, + plainRtpParameters: this._plainRtpParameters, + mid: 'datachannel', + kind: 'application', + oldDataChannelSpec, + }); + this._addMediaSection(mediaSection); + } + getSdp() { + // Increase SDP version. + this._sdpObject.origin.sessionVersion++; + return sdpTransform.write(this._sdpObject); + } + _addMediaSection(newMediaSection) { + if (!this._firstMid) this._firstMid = newMediaSection.mid; + // Add to the vector. + this._mediaSections.push(newMediaSection); + // Add to the map. + this._midToIndex.set(newMediaSection.mid, this._mediaSections.length - 1); + // Add to the SDP object. + this._sdpObject.media.push(newMediaSection.getObject()); + // Regenerate BUNDLE mids. + this._regenerateBundleMids(); + } + _replaceMediaSection(newMediaSection, reuseMid) { + // Store it in the map. + if (typeof reuseMid === 'string') { + const idx = this._midToIndex.get(reuseMid); + if (idx === undefined) { + throw new Error(`no media section found for reuseMid '${reuseMid}'`); + } + const oldMediaSection = this._mediaSections[idx]; + // Replace the index in the vector with the new media section. + this._mediaSections[idx] = newMediaSection; + // Update the map. + this._midToIndex.delete(oldMediaSection.mid); + this._midToIndex.set(newMediaSection.mid, idx); + // Update the SDP object. + this._sdpObject.media[idx] = newMediaSection.getObject(); + // Regenerate BUNDLE mids. + this._regenerateBundleMids(); + } else { + const idx = this._midToIndex.get(newMediaSection.mid); + if (idx === undefined) { + throw new Error(`no media section found with mid '${newMediaSection.mid}'`); + } + // Replace the index in the vector with the new media section. + this._mediaSections[idx] = newMediaSection; + // Update the SDP object. + this._sdpObject.media[idx] = newMediaSection.getObject(); + } + } + _regenerateBundleMids() { + if (!this._dtlsParameters) return; + this._sdpObject.groups[0].mids = this._mediaSections + .filter((mediaSection) => !mediaSection.closed) + .map((mediaSection) => mediaSection.mid) + .join(' '); + } + } + exports.RemoteSdp = RemoteSdp; + }, + { '../../Logger': 13, './MediaSection': 30, 'sdp-transform': 44 }, + ], + 32: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.applyCodecParameters = + exports.getCname = + exports.extractDtlsParameters = + exports.extractRtpCapabilities = + void 0; + const sdpTransform = __importStar(require('sdp-transform')); + function extractRtpCapabilities({ sdpObject }) { + // Map of RtpCodecParameters indexed by payload type. + const codecsMap = new Map(); + // Array of RtpHeaderExtensions. + const headerExtensions = []; + // Whether a m=audio/video section has been already found. + let gotAudio = false; + let gotVideo = false; + for (const m of sdpObject.media) { + const kind = m.type; + switch (kind) { + case 'audio': { + if (gotAudio) continue; + gotAudio = true; + break; + } + case 'video': { + if (gotVideo) continue; + gotVideo = true; + break; + } + default: { + continue; + } + } + // Get codecs. + for (const rtp of m.rtp) { + const codec = { + kind: kind, + mimeType: `${kind}/${rtp.codec}`, + preferredPayloadType: rtp.payload, + clockRate: rtp.rate, + channels: rtp.encoding, + parameters: {}, + rtcpFeedback: [], + }; + codecsMap.set(codec.preferredPayloadType, codec); + } + // Get codec parameters. + for (const fmtp of m.fmtp || []) { + const parameters = sdpTransform.parseParams(fmtp.config); + const codec = codecsMap.get(fmtp.payload); + if (!codec) continue; + // Specials case to convert parameter value to string. + if (parameters && parameters.hasOwnProperty('profile-level-id')) + parameters['profile-level-id'] = String(parameters['profile-level-id']); + codec.parameters = parameters; + } + // Get RTCP feedback for each codec. + for (const fb of m.rtcpFb || []) { + const codec = codecsMap.get(fb.payload); + if (!codec) continue; + const feedback = { + type: fb.type, + parameter: fb.subtype, + }; + if (!feedback.parameter) delete feedback.parameter; + codec.rtcpFeedback.push(feedback); + } + // Get RTP header extensions. + for (const ext of m.ext || []) { + // Ignore encrypted extensions (not yet supported in mediasoup). + if (ext['encrypt-uri']) continue; + const headerExtension = { + kind: kind, + uri: ext.uri, + preferredId: ext.value, + }; + headerExtensions.push(headerExtension); + } + } + const rtpCapabilities = { + codecs: Array.from(codecsMap.values()), + headerExtensions: headerExtensions, + }; + return rtpCapabilities; + } + exports.extractRtpCapabilities = extractRtpCapabilities; + function extractDtlsParameters({ sdpObject }) { + const mediaObject = (sdpObject.media || []).find((m) => m.iceUfrag && m.port !== 0); + if (!mediaObject) throw new Error('no active media section found'); + const fingerprint = mediaObject.fingerprint || sdpObject.fingerprint; + let role; + switch (mediaObject.setup) { + case 'active': + role = 'client'; + break; + case 'passive': + role = 'server'; + break; + case 'actpass': + role = 'auto'; + break; + } + const dtlsParameters = { + role, + fingerprints: [ + { + algorithm: fingerprint.type, + value: fingerprint.hash, + }, + ], + }; + return dtlsParameters; + } + exports.extractDtlsParameters = extractDtlsParameters; + function getCname({ offerMediaObject }) { + const ssrcCnameLine = (offerMediaObject.ssrcs || []).find((line) => line.attribute === 'cname'); + if (!ssrcCnameLine) return ''; + return ssrcCnameLine.value; + } + exports.getCname = getCname; + /** + * Apply codec parameters in the given SDP m= section answer based on the + * given RTP parameters of an offer. + */ + function applyCodecParameters({ offerRtpParameters, answerMediaObject }) { + for (const codec of offerRtpParameters.codecs) { + const mimeType = codec.mimeType.toLowerCase(); + // Avoid parsing codec parameters for unhandled codecs. + if (mimeType !== 'audio/opus') continue; + const rtp = (answerMediaObject.rtp || []).find((r) => r.payload === codec.payloadType); + if (!rtp) continue; + // Just in case. + answerMediaObject.fmtp = answerMediaObject.fmtp || []; + let fmtp = answerMediaObject.fmtp.find((f) => f.payload === codec.payloadType); + if (!fmtp) { + fmtp = { payload: codec.payloadType, config: '' }; + answerMediaObject.fmtp.push(fmtp); + } + const parameters = sdpTransform.parseParams(fmtp.config); + switch (mimeType) { + case 'audio/opus': { + const spropStereo = codec.parameters['sprop-stereo']; + if (spropStereo !== undefined) parameters.stereo = spropStereo ? 1 : 0; + break; + } + } + // Write the codec fmtp.config back. + fmtp.config = ''; + for (const key of Object.keys(parameters)) { + if (fmtp.config) fmtp.config += ';'; + fmtp.config += `${key}=${parameters[key]}`; + } + } + } + exports.applyCodecParameters = applyCodecParameters; + }, + { 'sdp-transform': 44 }, + ], + 33: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.addLegacySimulcast = exports.getRtpEncodings = void 0; + function getRtpEncodings({ offerMediaObject, track }) { + // First media SSRC (or the only one). + let firstSsrc; + const ssrcs = new Set(); + for (const line of offerMediaObject.ssrcs || []) { + if (line.attribute !== 'msid') continue; + const trackId = line.value.split(' ')[1]; + if (trackId === track.id) { + const ssrc = line.id; + ssrcs.add(ssrc); + if (!firstSsrc) firstSsrc = ssrc; + } + } + if (ssrcs.size === 0) + throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`); + const ssrcToRtxSsrc = new Map(); + // First assume RTX is used. + for (const line of offerMediaObject.ssrcGroups || []) { + if (line.semantics !== 'FID') continue; + let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/); + ssrc = Number(ssrc); + rtxSsrc = Number(rtxSsrc); + if (ssrcs.has(ssrc)) { + // Remove both the SSRC and RTX SSRC from the set so later we know that they + // are already handled. + ssrcs.delete(ssrc); + ssrcs.delete(rtxSsrc); + // Add to the map. + ssrcToRtxSsrc.set(ssrc, rtxSsrc); + } + } + // If the set of SSRCs is not empty it means that RTX is not being used, so take + // media SSRCs from there. + for (const ssrc of ssrcs) { + // Add to the map. + ssrcToRtxSsrc.set(ssrc, null); + } + const encodings = []; + for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) { + const encoding = { ssrc }; + if (rtxSsrc) encoding.rtx = { ssrc: rtxSsrc }; + encodings.push(encoding); + } + return encodings; + } + exports.getRtpEncodings = getRtpEncodings; + /** + * Adds multi-ssrc based simulcast into the given SDP media section offer. + */ + function addLegacySimulcast({ offerMediaObject, track, numStreams }) { + if (numStreams <= 1) throw new TypeError('numStreams must be greater than 1'); + let firstSsrc; + let firstRtxSsrc; + let streamId; + // Get the SSRC. + const ssrcMsidLine = (offerMediaObject.ssrcs || []).find((line) => { + if (line.attribute !== 'msid') return false; + const trackId = line.value.split(' ')[1]; + if (trackId === track.id) { + firstSsrc = line.id; + streamId = line.value.split(' ')[0]; + return true; + } else { + return false; + } + }); + if (!ssrcMsidLine) + throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`); + // Get the SSRC for RTX. + (offerMediaObject.ssrcGroups || []).some((line) => { + if (line.semantics !== 'FID') return false; + const ssrcs = line.ssrcs.split(/\s+/); + if (Number(ssrcs[0]) === firstSsrc) { + firstRtxSsrc = Number(ssrcs[1]); + return true; + } else { + return false; + } + }); + const ssrcCnameLine = offerMediaObject.ssrcs.find( + (line) => line.attribute === 'cname' && line.id === firstSsrc, + ); + if (!ssrcCnameLine) + throw new Error(`a=ssrc line with cname information not found [track.id:${track.id}]`); + const cname = ssrcCnameLine.value; + const ssrcs = []; + const rtxSsrcs = []; + for (let i = 0; i < numStreams; ++i) { + ssrcs.push(firstSsrc + i); + if (firstRtxSsrc) rtxSsrcs.push(firstRtxSsrc + i); + } + offerMediaObject.ssrcGroups = offerMediaObject.ssrcGroups || []; + offerMediaObject.ssrcs = offerMediaObject.ssrcs || []; + offerMediaObject.ssrcGroups.push({ + semantics: 'SIM', + ssrcs: ssrcs.join(' '), + }); + for (let i = 0; i < ssrcs.length; ++i) { + const ssrc = ssrcs[i]; + offerMediaObject.ssrcs.push({ + id: ssrc, + attribute: 'cname', + value: cname, + }); + offerMediaObject.ssrcs.push({ + id: ssrc, + attribute: 'msid', + value: `${streamId} ${track.id}`, + }); + } + for (let i = 0; i < rtxSsrcs.length; ++i) { + const ssrc = ssrcs[i]; + const rtxSsrc = rtxSsrcs[i]; + offerMediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'cname', + value: cname, + }); + offerMediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'msid', + value: `${streamId} ${track.id}`, + }); + offerMediaObject.ssrcGroups.push({ + semantics: 'FID', + ssrcs: `${ssrc} ${rtxSsrc}`, + }); + } + } + exports.addLegacySimulcast = addLegacySimulcast; + }, + {}, + ], + 34: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.addLegacySimulcast = exports.getRtpEncodings = void 0; + function getRtpEncodings({ offerMediaObject }) { + const ssrcs = new Set(); + for (const line of offerMediaObject.ssrcs || []) { + const ssrc = line.id; + ssrcs.add(ssrc); + } + if (ssrcs.size === 0) throw new Error('no a=ssrc lines found'); + const ssrcToRtxSsrc = new Map(); + // First assume RTX is used. + for (const line of offerMediaObject.ssrcGroups || []) { + if (line.semantics !== 'FID') continue; + let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/); + ssrc = Number(ssrc); + rtxSsrc = Number(rtxSsrc); + if (ssrcs.has(ssrc)) { + // Remove both the SSRC and RTX SSRC from the set so later we know that they + // are already handled. + ssrcs.delete(ssrc); + ssrcs.delete(rtxSsrc); + // Add to the map. + ssrcToRtxSsrc.set(ssrc, rtxSsrc); + } + } + // If the set of SSRCs is not empty it means that RTX is not being used, so take + // media SSRCs from there. + for (const ssrc of ssrcs) { + // Add to the map. + ssrcToRtxSsrc.set(ssrc, null); + } + const encodings = []; + for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) { + const encoding = { ssrc }; + if (rtxSsrc) encoding.rtx = { ssrc: rtxSsrc }; + encodings.push(encoding); + } + return encodings; + } + exports.getRtpEncodings = getRtpEncodings; + /** + * Adds multi-ssrc based simulcast into the given SDP media section offer. + */ + function addLegacySimulcast({ offerMediaObject, numStreams }) { + if (numStreams <= 1) throw new TypeError('numStreams must be greater than 1'); + // Get the SSRC. + const ssrcMsidLine = (offerMediaObject.ssrcs || []).find((line) => line.attribute === 'msid'); + if (!ssrcMsidLine) throw new Error('a=ssrc line with msid information not found'); + const [streamId, trackId] = ssrcMsidLine.value.split(' '); + const firstSsrc = ssrcMsidLine.id; + let firstRtxSsrc; + // Get the SSRC for RTX. + (offerMediaObject.ssrcGroups || []).some((line) => { + if (line.semantics !== 'FID') return false; + const ssrcs = line.ssrcs.split(/\s+/); + if (Number(ssrcs[0]) === firstSsrc) { + firstRtxSsrc = Number(ssrcs[1]); + return true; + } else { + return false; + } + }); + const ssrcCnameLine = offerMediaObject.ssrcs.find((line) => line.attribute === 'cname'); + if (!ssrcCnameLine) throw new Error('a=ssrc line with cname information not found'); + const cname = ssrcCnameLine.value; + const ssrcs = []; + const rtxSsrcs = []; + for (let i = 0; i < numStreams; ++i) { + ssrcs.push(firstSsrc + i); + if (firstRtxSsrc) rtxSsrcs.push(firstRtxSsrc + i); + } + offerMediaObject.ssrcGroups = []; + offerMediaObject.ssrcs = []; + offerMediaObject.ssrcGroups.push({ + semantics: 'SIM', + ssrcs: ssrcs.join(' '), + }); + for (let i = 0; i < ssrcs.length; ++i) { + const ssrc = ssrcs[i]; + offerMediaObject.ssrcs.push({ + id: ssrc, + attribute: 'cname', + value: cname, + }); + offerMediaObject.ssrcs.push({ + id: ssrc, + attribute: 'msid', + value: `${streamId} ${trackId}`, + }); + } + for (let i = 0; i < rtxSsrcs.length; ++i) { + const ssrc = ssrcs[i]; + const rtxSsrc = rtxSsrcs[i]; + offerMediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'cname', + value: cname, + }); + offerMediaObject.ssrcs.push({ + id: rtxSsrc, + attribute: 'msid', + value: `${streamId} ${trackId}`, + }); + offerMediaObject.ssrcGroups.push({ + semantics: 'FID', + ssrcs: `${ssrc} ${rtxSsrc}`, + }); + } + } + exports.addLegacySimulcast = addLegacySimulcast; + }, + {}, + ], + 35: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.debug = exports.detectDevice = exports.Device = exports.version = exports.types = void 0; + const debug_1 = __importDefault(require('debug')); + exports.debug = debug_1.default; + const Device_1 = require('./Device'); + Object.defineProperty(exports, 'Device', { + enumerable: true, + get: function () { + return Device_1.Device; + }, + }); + Object.defineProperty(exports, 'detectDevice', { + enumerable: true, + get: function () { + return Device_1.detectDevice; + }, + }); + const types = __importStar(require('./types')); + exports.types = types; + /** + * Expose mediasoup-client version. + */ + exports.version = '3.6.37'; + /** + * Expose parseScalabilityMode() function. + */ + var scalabilityModes_1 = require('./scalabilityModes'); + Object.defineProperty(exports, 'parseScalabilityMode', { + enumerable: true, + get: function () { + return scalabilityModes_1.parse; + }, + }); + }, + { './Device': 11, './scalabilityModes': 37, './types': 38, debug: 40 }, + ], + 36: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = + (this && this.__setModuleDefault) || + (Object.create + ? function (o, v) { + Object.defineProperty(o, 'default', { enumerable: true, value: v }); + } + : function (o, v) { + o['default'] = v; + }); + var __importStar = + (this && this.__importStar) || + function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (k !== 'default' && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.canReceive = + exports.canSend = + exports.generateProbatorRtpParameters = + exports.reduceCodecs = + exports.getSendingRemoteRtpParameters = + exports.getSendingRtpParameters = + exports.getRecvRtpCapabilities = + exports.getExtendedRtpCapabilities = + exports.validateSctpStreamParameters = + exports.validateSctpParameters = + exports.validateNumSctpStreams = + exports.validateSctpCapabilities = + exports.validateRtcpParameters = + exports.validateRtpEncodingParameters = + exports.validateRtpHeaderExtensionParameters = + exports.validateRtpCodecParameters = + exports.validateRtpParameters = + exports.validateRtpHeaderExtension = + exports.validateRtcpFeedback = + exports.validateRtpCodecCapability = + exports.validateRtpCapabilities = + void 0; + const h264 = __importStar(require('h264-profile-level-id')); + const utils = __importStar(require('./utils')); + const RTP_PROBATOR_MID = 'probator'; + const RTP_PROBATOR_SSRC = 1234; + const RTP_PROBATOR_CODEC_PAYLOAD_TYPE = 127; + /** + * Validates RtpCapabilities. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpCapabilities(caps) { + if (typeof caps !== 'object') throw new TypeError('caps is not an object'); + // codecs is optional. If unset, fill with an empty array. + if (caps.codecs && !Array.isArray(caps.codecs)) throw new TypeError('caps.codecs is not an array'); + else if (!caps.codecs) caps.codecs = []; + for (const codec of caps.codecs) { + validateRtpCodecCapability(codec); + } + // headerExtensions is optional. If unset, fill with an empty array. + if (caps.headerExtensions && !Array.isArray(caps.headerExtensions)) + throw new TypeError('caps.headerExtensions is not an array'); + else if (!caps.headerExtensions) caps.headerExtensions = []; + for (const ext of caps.headerExtensions) { + validateRtpHeaderExtension(ext); + } + } + exports.validateRtpCapabilities = validateRtpCapabilities; + /** + * Validates RtpCodecCapability. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpCodecCapability(codec) { + const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i'); + if (typeof codec !== 'object') throw new TypeError('codec is not an object'); + // mimeType is mandatory. + if (!codec.mimeType || typeof codec.mimeType !== 'string') + throw new TypeError('missing codec.mimeType'); + const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType); + if (!mimeTypeMatch) throw new TypeError('invalid codec.mimeType'); + // Just override kind with media component of mimeType. + codec.kind = mimeTypeMatch[1].toLowerCase(); + // preferredPayloadType is optional. + if (codec.preferredPayloadType && typeof codec.preferredPayloadType !== 'number') + throw new TypeError('invalid codec.preferredPayloadType'); + // clockRate is mandatory. + if (typeof codec.clockRate !== 'number') throw new TypeError('missing codec.clockRate'); + // channels is optional. If unset, set it to 1 (just if audio). + if (codec.kind === 'audio') { + if (typeof codec.channels !== 'number') codec.channels = 1; + } else { + delete codec.channels; + } + // parameters is optional. If unset, set it to an empty object. + if (!codec.parameters || typeof codec.parameters !== 'object') codec.parameters = {}; + for (const key of Object.keys(codec.parameters)) { + let value = codec.parameters[key]; + if (value === undefined) { + codec.parameters[key] = ''; + value = ''; + } + if (typeof value !== 'string' && typeof value !== 'number') { + throw new TypeError(`invalid codec parameter [key:${key}s, value:${value}]`); + } + // Specific parameters validation. + if (key === 'apt') { + if (typeof value !== 'number') throw new TypeError('invalid codec apt parameter'); + } + } + // rtcpFeedback is optional. If unset, set it to an empty array. + if (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback)) codec.rtcpFeedback = []; + for (const fb of codec.rtcpFeedback) { + validateRtcpFeedback(fb); + } + } + exports.validateRtpCodecCapability = validateRtpCodecCapability; + /** + * Validates RtcpFeedback. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtcpFeedback(fb) { + if (typeof fb !== 'object') throw new TypeError('fb is not an object'); + // type is mandatory. + if (!fb.type || typeof fb.type !== 'string') throw new TypeError('missing fb.type'); + // parameter is optional. If unset set it to an empty string. + if (!fb.parameter || typeof fb.parameter !== 'string') fb.parameter = ''; + } + exports.validateRtcpFeedback = validateRtcpFeedback; + /** + * Validates RtpHeaderExtension. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpHeaderExtension(ext) { + if (typeof ext !== 'object') throw new TypeError('ext is not an object'); + // kind is mandatory. + if (ext.kind !== 'audio' && ext.kind !== 'video') throw new TypeError('invalid ext.kind'); + // uri is mandatory. + if (!ext.uri || typeof ext.uri !== 'string') throw new TypeError('missing ext.uri'); + // preferredId is mandatory. + if (typeof ext.preferredId !== 'number') throw new TypeError('missing ext.preferredId'); + // preferredEncrypt is optional. If unset set it to false. + if (ext.preferredEncrypt && typeof ext.preferredEncrypt !== 'boolean') + throw new TypeError('invalid ext.preferredEncrypt'); + else if (!ext.preferredEncrypt) ext.preferredEncrypt = false; + // direction is optional. If unset set it to sendrecv. + if (ext.direction && typeof ext.direction !== 'string') + throw new TypeError('invalid ext.direction'); + else if (!ext.direction) ext.direction = 'sendrecv'; + } + exports.validateRtpHeaderExtension = validateRtpHeaderExtension; + /** + * Validates RtpParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpParameters(params) { + if (typeof params !== 'object') throw new TypeError('params is not an object'); + // mid is optional. + if (params.mid && typeof params.mid !== 'string') throw new TypeError('params.mid is not a string'); + // codecs is mandatory. + if (!Array.isArray(params.codecs)) throw new TypeError('missing params.codecs'); + for (const codec of params.codecs) { + validateRtpCodecParameters(codec); + } + // headerExtensions is optional. If unset, fill with an empty array. + if (params.headerExtensions && !Array.isArray(params.headerExtensions)) + throw new TypeError('params.headerExtensions is not an array'); + else if (!params.headerExtensions) params.headerExtensions = []; + for (const ext of params.headerExtensions) { + validateRtpHeaderExtensionParameters(ext); + } + // encodings is optional. If unset, fill with an empty array. + if (params.encodings && !Array.isArray(params.encodings)) + throw new TypeError('params.encodings is not an array'); + else if (!params.encodings) params.encodings = []; + for (const encoding of params.encodings) { + validateRtpEncodingParameters(encoding); + } + // rtcp is optional. If unset, fill with an empty object. + if (params.rtcp && typeof params.rtcp !== 'object') + throw new TypeError('params.rtcp is not an object'); + else if (!params.rtcp) params.rtcp = {}; + validateRtcpParameters(params.rtcp); + } + exports.validateRtpParameters = validateRtpParameters; + /** + * Validates RtpCodecParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpCodecParameters(codec) { + const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i'); + if (typeof codec !== 'object') throw new TypeError('codec is not an object'); + // mimeType is mandatory. + if (!codec.mimeType || typeof codec.mimeType !== 'string') + throw new TypeError('missing codec.mimeType'); + const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType); + if (!mimeTypeMatch) throw new TypeError('invalid codec.mimeType'); + // payloadType is mandatory. + if (typeof codec.payloadType !== 'number') throw new TypeError('missing codec.payloadType'); + // clockRate is mandatory. + if (typeof codec.clockRate !== 'number') throw new TypeError('missing codec.clockRate'); + const kind = mimeTypeMatch[1].toLowerCase(); + // channels is optional. If unset, set it to 1 (just if audio). + if (kind === 'audio') { + if (typeof codec.channels !== 'number') codec.channels = 1; + } else { + delete codec.channels; + } + // parameters is optional. If unset, set it to an empty object. + if (!codec.parameters || typeof codec.parameters !== 'object') codec.parameters = {}; + for (const key of Object.keys(codec.parameters)) { + let value = codec.parameters[key]; + if (value === undefined) { + codec.parameters[key] = ''; + value = ''; + } + if (typeof value !== 'string' && typeof value !== 'number') { + throw new TypeError(`invalid codec parameter [key:${key}s, value:${value}]`); + } + // Specific parameters validation. + if (key === 'apt') { + if (typeof value !== 'number') throw new TypeError('invalid codec apt parameter'); + } + } + // rtcpFeedback is optional. If unset, set it to an empty array. + if (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback)) codec.rtcpFeedback = []; + for (const fb of codec.rtcpFeedback) { + validateRtcpFeedback(fb); + } + } + exports.validateRtpCodecParameters = validateRtpCodecParameters; + /** + * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpHeaderExtensionParameters(ext) { + if (typeof ext !== 'object') throw new TypeError('ext is not an object'); + // uri is mandatory. + if (!ext.uri || typeof ext.uri !== 'string') throw new TypeError('missing ext.uri'); + // id is mandatory. + if (typeof ext.id !== 'number') throw new TypeError('missing ext.id'); + // encrypt is optional. If unset set it to false. + if (ext.encrypt && typeof ext.encrypt !== 'boolean') throw new TypeError('invalid ext.encrypt'); + else if (!ext.encrypt) ext.encrypt = false; + // parameters is optional. If unset, set it to an empty object. + if (!ext.parameters || typeof ext.parameters !== 'object') ext.parameters = {}; + for (const key of Object.keys(ext.parameters)) { + let value = ext.parameters[key]; + if (value === undefined) { + ext.parameters[key] = ''; + value = ''; + } + if (typeof value !== 'string' && typeof value !== 'number') + throw new TypeError('invalid header extension parameter'); + } + } + exports.validateRtpHeaderExtensionParameters = validateRtpHeaderExtensionParameters; + /** + * Validates RtpEncodingParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtpEncodingParameters(encoding) { + if (typeof encoding !== 'object') throw new TypeError('encoding is not an object'); + // ssrc is optional. + if (encoding.ssrc && typeof encoding.ssrc !== 'number') + throw new TypeError('invalid encoding.ssrc'); + // rid is optional. + if (encoding.rid && typeof encoding.rid !== 'string') throw new TypeError('invalid encoding.rid'); + // rtx is optional. + if (encoding.rtx && typeof encoding.rtx !== 'object') { + throw new TypeError('invalid encoding.rtx'); + } else if (encoding.rtx) { + // RTX ssrc is mandatory if rtx is present. + if (typeof encoding.rtx.ssrc !== 'number') throw new TypeError('missing encoding.rtx.ssrc'); + } + // dtx is optional. If unset set it to false. + if (!encoding.dtx || typeof encoding.dtx !== 'boolean') encoding.dtx = false; + // scalabilityMode is optional. + if (encoding.scalabilityMode && typeof encoding.scalabilityMode !== 'string') + throw new TypeError('invalid encoding.scalabilityMode'); + } + exports.validateRtpEncodingParameters = validateRtpEncodingParameters; + /** + * Validates RtcpParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateRtcpParameters(rtcp) { + if (typeof rtcp !== 'object') throw new TypeError('rtcp is not an object'); + // cname is optional. + if (rtcp.cname && typeof rtcp.cname !== 'string') throw new TypeError('invalid rtcp.cname'); + // reducedSize is optional. If unset set it to true. + if (!rtcp.reducedSize || typeof rtcp.reducedSize !== 'boolean') rtcp.reducedSize = true; + } + exports.validateRtcpParameters = validateRtcpParameters; + /** + * Validates SctpCapabilities. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateSctpCapabilities(caps) { + if (typeof caps !== 'object') throw new TypeError('caps is not an object'); + // numStreams is mandatory. + if (!caps.numStreams || typeof caps.numStreams !== 'object') + throw new TypeError('missing caps.numStreams'); + validateNumSctpStreams(caps.numStreams); + } + exports.validateSctpCapabilities = validateSctpCapabilities; + /** + * Validates NumSctpStreams. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateNumSctpStreams(numStreams) { + if (typeof numStreams !== 'object') throw new TypeError('numStreams is not an object'); + // OS is mandatory. + if (typeof numStreams.OS !== 'number') throw new TypeError('missing numStreams.OS'); + // MIS is mandatory. + if (typeof numStreams.MIS !== 'number') throw new TypeError('missing numStreams.MIS'); + } + exports.validateNumSctpStreams = validateNumSctpStreams; + /** + * Validates SctpParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateSctpParameters(params) { + if (typeof params !== 'object') throw new TypeError('params is not an object'); + // port is mandatory. + if (typeof params.port !== 'number') throw new TypeError('missing params.port'); + // OS is mandatory. + if (typeof params.OS !== 'number') throw new TypeError('missing params.OS'); + // MIS is mandatory. + if (typeof params.MIS !== 'number') throw new TypeError('missing params.MIS'); + // maxMessageSize is mandatory. + if (typeof params.maxMessageSize !== 'number') throw new TypeError('missing params.maxMessageSize'); + } + exports.validateSctpParameters = validateSctpParameters; + /** + * Validates SctpStreamParameters. It may modify given data by adding missing + * fields with default values. + * It throws if invalid. + */ + function validateSctpStreamParameters(params) { + if (typeof params !== 'object') throw new TypeError('params is not an object'); + // streamId is mandatory. + if (typeof params.streamId !== 'number') throw new TypeError('missing params.streamId'); + // ordered is optional. + let orderedGiven = false; + if (typeof params.ordered === 'boolean') orderedGiven = true; + else params.ordered = true; + // maxPacketLifeTime is optional. + if (params.maxPacketLifeTime && typeof params.maxPacketLifeTime !== 'number') + throw new TypeError('invalid params.maxPacketLifeTime'); + // maxRetransmits is optional. + if (params.maxRetransmits && typeof params.maxRetransmits !== 'number') + throw new TypeError('invalid params.maxRetransmits'); + if (params.maxPacketLifeTime && params.maxRetransmits) + throw new TypeError('cannot provide both maxPacketLifeTime and maxRetransmits'); + if (orderedGiven && params.ordered && (params.maxPacketLifeTime || params.maxRetransmits)) { + throw new TypeError('cannot be ordered with maxPacketLifeTime or maxRetransmits'); + } else if (!orderedGiven && (params.maxPacketLifeTime || params.maxRetransmits)) { + params.ordered = false; + } + // label is optional. + if (params.label && typeof params.label !== 'string') throw new TypeError('invalid params.label'); + // protocol is optional. + if (params.protocol && typeof params.protocol !== 'string') + throw new TypeError('invalid params.protocol'); + } + exports.validateSctpStreamParameters = validateSctpStreamParameters; + /** + * Generate extended RTP capabilities for sending and receiving. + */ + function getExtendedRtpCapabilities(localCaps, remoteCaps) { + const extendedRtpCapabilities = { + codecs: [], + headerExtensions: [], + }; + // Match media codecs and keep the order preferred by remoteCaps. + for (const remoteCodec of remoteCaps.codecs || []) { + if (isRtxCodec(remoteCodec)) continue; + const matchingLocalCodec = (localCaps.codecs || []).find((localCodec) => + matchCodecs(localCodec, remoteCodec, { strict: true, modify: true }), + ); + if (!matchingLocalCodec) continue; + const extendedCodec = { + mimeType: matchingLocalCodec.mimeType, + kind: matchingLocalCodec.kind, + clockRate: matchingLocalCodec.clockRate, + channels: matchingLocalCodec.channels, + localPayloadType: matchingLocalCodec.preferredPayloadType, + localRtxPayloadType: undefined, + remotePayloadType: remoteCodec.preferredPayloadType, + remoteRtxPayloadType: undefined, + localParameters: matchingLocalCodec.parameters, + remoteParameters: remoteCodec.parameters, + rtcpFeedback: reduceRtcpFeedback(matchingLocalCodec, remoteCodec), + }; + extendedRtpCapabilities.codecs.push(extendedCodec); + } + // Match RTX codecs. + for (const extendedCodec of extendedRtpCapabilities.codecs) { + const matchingLocalRtxCodec = localCaps.codecs.find( + (localCodec) => + isRtxCodec(localCodec) && localCodec.parameters.apt === extendedCodec.localPayloadType, + ); + const matchingRemoteRtxCodec = remoteCaps.codecs.find( + (remoteCodec) => + isRtxCodec(remoteCodec) && + remoteCodec.parameters.apt === extendedCodec.remotePayloadType, + ); + if (matchingLocalRtxCodec && matchingRemoteRtxCodec) { + extendedCodec.localRtxPayloadType = matchingLocalRtxCodec.preferredPayloadType; + extendedCodec.remoteRtxPayloadType = matchingRemoteRtxCodec.preferredPayloadType; + } + } + // Match header extensions. + for (const remoteExt of remoteCaps.headerExtensions) { + const matchingLocalExt = localCaps.headerExtensions.find((localExt) => + matchHeaderExtensions(localExt, remoteExt), + ); + if (!matchingLocalExt) continue; + const extendedExt = { + kind: remoteExt.kind, + uri: remoteExt.uri, + sendId: matchingLocalExt.preferredId, + recvId: remoteExt.preferredId, + encrypt: matchingLocalExt.preferredEncrypt, + direction: 'sendrecv', + }; + switch (remoteExt.direction) { + case 'sendrecv': + extendedExt.direction = 'sendrecv'; + break; + case 'recvonly': + extendedExt.direction = 'sendonly'; + break; + case 'sendonly': + extendedExt.direction = 'recvonly'; + break; + case 'inactive': + extendedExt.direction = 'inactive'; + break; + } + extendedRtpCapabilities.headerExtensions.push(extendedExt); + } + return extendedRtpCapabilities; + } + exports.getExtendedRtpCapabilities = getExtendedRtpCapabilities; + /** + * Generate RTP capabilities for receiving media based on the given extended + * RTP capabilities. + */ + function getRecvRtpCapabilities(extendedRtpCapabilities) { + const rtpCapabilities = { + codecs: [], + headerExtensions: [], + }; + for (const extendedCodec of extendedRtpCapabilities.codecs) { + const codec = { + mimeType: extendedCodec.mimeType, + kind: extendedCodec.kind, + preferredPayloadType: extendedCodec.remotePayloadType, + clockRate: extendedCodec.clockRate, + channels: extendedCodec.channels, + parameters: extendedCodec.localParameters, + rtcpFeedback: extendedCodec.rtcpFeedback, + }; + rtpCapabilities.codecs.push(codec); + // Add RTX codec. + if (!extendedCodec.remoteRtxPayloadType) continue; + const rtxCodec = { + mimeType: `${extendedCodec.kind}/rtx`, + kind: extendedCodec.kind, + preferredPayloadType: extendedCodec.remoteRtxPayloadType, + clockRate: extendedCodec.clockRate, + parameters: { + apt: extendedCodec.remotePayloadType, + }, + rtcpFeedback: [], + }; + rtpCapabilities.codecs.push(rtxCodec); + // TODO: In the future, we need to add FEC, CN, etc, codecs. + } + for (const extendedExtension of extendedRtpCapabilities.headerExtensions) { + // Ignore RTP extensions not valid for receiving. + if (extendedExtension.direction !== 'sendrecv' && extendedExtension.direction !== 'recvonly') { + continue; + } + const ext = { + kind: extendedExtension.kind, + uri: extendedExtension.uri, + preferredId: extendedExtension.recvId, + preferredEncrypt: extendedExtension.encrypt, + direction: extendedExtension.direction, + }; + rtpCapabilities.headerExtensions.push(ext); + } + return rtpCapabilities; + } + exports.getRecvRtpCapabilities = getRecvRtpCapabilities; + /** + * Generate RTP parameters of the given kind for sending media. + * NOTE: mid, encodings and rtcp fields are left empty. + */ + function getSendingRtpParameters(kind, extendedRtpCapabilities) { + const rtpParameters = { + mid: undefined, + codecs: [], + headerExtensions: [], + encodings: [], + rtcp: {}, + }; + for (const extendedCodec of extendedRtpCapabilities.codecs) { + if (extendedCodec.kind !== kind) continue; + const codec = { + mimeType: extendedCodec.mimeType, + payloadType: extendedCodec.localPayloadType, + clockRate: extendedCodec.clockRate, + channels: extendedCodec.channels, + parameters: extendedCodec.localParameters, + rtcpFeedback: extendedCodec.rtcpFeedback, + }; + rtpParameters.codecs.push(codec); + // Add RTX codec. + if (extendedCodec.localRtxPayloadType) { + const rtxCodec = { + mimeType: `${extendedCodec.kind}/rtx`, + payloadType: extendedCodec.localRtxPayloadType, + clockRate: extendedCodec.clockRate, + parameters: { + apt: extendedCodec.localPayloadType, + }, + rtcpFeedback: [], + }; + rtpParameters.codecs.push(rtxCodec); + } + } + for (const extendedExtension of extendedRtpCapabilities.headerExtensions) { + // Ignore RTP extensions of a different kind and those not valid for sending. + if ( + (extendedExtension.kind && extendedExtension.kind !== kind) || + (extendedExtension.direction !== 'sendrecv' && extendedExtension.direction !== 'sendonly') + ) { + continue; + } + const ext = { + uri: extendedExtension.uri, + id: extendedExtension.sendId, + encrypt: extendedExtension.encrypt, + parameters: {}, + }; + rtpParameters.headerExtensions.push(ext); + } + return rtpParameters; + } + exports.getSendingRtpParameters = getSendingRtpParameters; + /** + * Generate RTP parameters of the given kind suitable for the remote SDP answer. + */ + function getSendingRemoteRtpParameters(kind, extendedRtpCapabilities) { + const rtpParameters = { + mid: undefined, + codecs: [], + headerExtensions: [], + encodings: [], + rtcp: {}, + }; + for (const extendedCodec of extendedRtpCapabilities.codecs) { + if (extendedCodec.kind !== kind) continue; + const codec = { + mimeType: extendedCodec.mimeType, + payloadType: extendedCodec.localPayloadType, + clockRate: extendedCodec.clockRate, + channels: extendedCodec.channels, + parameters: extendedCodec.remoteParameters, + rtcpFeedback: extendedCodec.rtcpFeedback, + }; + rtpParameters.codecs.push(codec); + // Add RTX codec. + if (extendedCodec.localRtxPayloadType) { + const rtxCodec = { + mimeType: `${extendedCodec.kind}/rtx`, + payloadType: extendedCodec.localRtxPayloadType, + clockRate: extendedCodec.clockRate, + parameters: { + apt: extendedCodec.localPayloadType, + }, + rtcpFeedback: [], + }; + rtpParameters.codecs.push(rtxCodec); + } + } + for (const extendedExtension of extendedRtpCapabilities.headerExtensions) { + // Ignore RTP extensions of a different kind and those not valid for sending. + if ( + (extendedExtension.kind && extendedExtension.kind !== kind) || + (extendedExtension.direction !== 'sendrecv' && extendedExtension.direction !== 'sendonly') + ) { + continue; + } + const ext = { + uri: extendedExtension.uri, + id: extendedExtension.sendId, + encrypt: extendedExtension.encrypt, + parameters: {}, + }; + rtpParameters.headerExtensions.push(ext); + } + // Reduce codecs' RTCP feedback. Use Transport-CC if available, REMB otherwise. + if ( + rtpParameters.headerExtensions.some( + (ext) => + ext.uri === 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01', + ) + ) { + for (const codec of rtpParameters.codecs) { + codec.rtcpFeedback = (codec.rtcpFeedback || []).filter((fb) => fb.type !== 'goog-remb'); + } + } else if ( + rtpParameters.headerExtensions.some( + (ext) => ext.uri === 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time', + ) + ) { + for (const codec of rtpParameters.codecs) { + codec.rtcpFeedback = (codec.rtcpFeedback || []).filter((fb) => fb.type !== 'transport-cc'); + } + } else { + for (const codec of rtpParameters.codecs) { + codec.rtcpFeedback = (codec.rtcpFeedback || []).filter( + (fb) => fb.type !== 'transport-cc' && fb.type !== 'goog-remb', + ); + } + } + return rtpParameters; + } + exports.getSendingRemoteRtpParameters = getSendingRemoteRtpParameters; + /** + * Reduce given codecs by returning an array of codecs "compatible" with the + * given capability codec. If no capability codec is given, take the first + * one(s). + * + * Given codecs must be generated by ortc.getSendingRtpParameters() or + * ortc.getSendingRemoteRtpParameters(). + * + * The returned array of codecs also include a RTX codec if available. + */ + function reduceCodecs(codecs, capCodec) { + const filteredCodecs = []; + // If no capability codec is given, take the first one (and RTX). + if (!capCodec) { + filteredCodecs.push(codecs[0]); + if (isRtxCodec(codecs[1])) filteredCodecs.push(codecs[1]); + } + // Otherwise look for a compatible set of codecs. + else { + for (let idx = 0; idx < codecs.length; ++idx) { + if (matchCodecs(codecs[idx], capCodec)) { + filteredCodecs.push(codecs[idx]); + if (isRtxCodec(codecs[idx + 1])) filteredCodecs.push(codecs[idx + 1]); + break; + } + } + if (filteredCodecs.length === 0) throw new TypeError('no matching codec found'); + } + return filteredCodecs; + } + exports.reduceCodecs = reduceCodecs; + /** + * Create RTP parameters for a Consumer for the RTP probator. + */ + function generateProbatorRtpParameters(videoRtpParameters) { + // Clone given reference video RTP parameters. + videoRtpParameters = utils.clone(videoRtpParameters, {}); + // This may throw. + validateRtpParameters(videoRtpParameters); + const rtpParameters = { + mid: RTP_PROBATOR_MID, + codecs: [], + headerExtensions: [], + encodings: [{ ssrc: RTP_PROBATOR_SSRC }], + rtcp: { cname: 'probator' }, + }; + rtpParameters.codecs.push(videoRtpParameters.codecs[0]); + rtpParameters.codecs[0].payloadType = RTP_PROBATOR_CODEC_PAYLOAD_TYPE; + rtpParameters.headerExtensions = videoRtpParameters.headerExtensions; + return rtpParameters; + } + exports.generateProbatorRtpParameters = generateProbatorRtpParameters; + /** + * Whether media can be sent based on the given RTP capabilities. + */ + function canSend(kind, extendedRtpCapabilities) { + return extendedRtpCapabilities.codecs.some((codec) => codec.kind === kind); + } + exports.canSend = canSend; + /** + * Whether the given RTP parameters can be received with the given RTP + * capabilities. + */ + function canReceive(rtpParameters, extendedRtpCapabilities) { + // This may throw. + validateRtpParameters(rtpParameters); + if (rtpParameters.codecs.length === 0) return false; + const firstMediaCodec = rtpParameters.codecs[0]; + return extendedRtpCapabilities.codecs.some( + (codec) => codec.remotePayloadType === firstMediaCodec.payloadType, + ); + } + exports.canReceive = canReceive; + function isRtxCodec(codec) { + if (!codec) return false; + return /.+\/rtx$/i.test(codec.mimeType); + } + function matchCodecs(aCodec, bCodec, { strict = false, modify = false } = {}) { + const aMimeType = aCodec.mimeType.toLowerCase(); + const bMimeType = bCodec.mimeType.toLowerCase(); + if (aMimeType !== bMimeType) return false; + if (aCodec.clockRate !== bCodec.clockRate) return false; + if (aCodec.channels !== bCodec.channels) return false; + // Per codec special checks. + switch (aMimeType) { + case 'video/h264': { + const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0; + const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0; + if (aPacketizationMode !== bPacketizationMode) return false; + // If strict matching check profile-level-id. + if (strict) { + if (!h264.isSameProfile(aCodec.parameters, bCodec.parameters)) return false; + let selectedProfileLevelId; + try { + selectedProfileLevelId = h264.generateProfileLevelIdForAnswer( + aCodec.parameters, + bCodec.parameters, + ); + } catch (error) { + return false; + } + if (modify) { + if (selectedProfileLevelId) { + aCodec.parameters['profile-level-id'] = selectedProfileLevelId; + bCodec.parameters['profile-level-id'] = selectedProfileLevelId; + } else { + delete aCodec.parameters['profile-level-id']; + delete bCodec.parameters['profile-level-id']; + } + } + } + break; + } + case 'video/vp9': { + // If strict matching check profile-id. + if (strict) { + const aProfileId = aCodec.parameters['profile-id'] || 0; + const bProfileId = bCodec.parameters['profile-id'] || 0; + if (aProfileId !== bProfileId) return false; + } + break; + } + } + return true; + } + function matchHeaderExtensions(aExt, bExt) { + if (aExt.kind && bExt.kind && aExt.kind !== bExt.kind) return false; + if (aExt.uri !== bExt.uri) return false; + return true; + } + function reduceRtcpFeedback(codecA, codecB) { + const reducedRtcpFeedback = []; + for (const aFb of codecA.rtcpFeedback || []) { + const matchingBFb = (codecB.rtcpFeedback || []).find( + (bFb) => + bFb.type === aFb.type && + (bFb.parameter === aFb.parameter || (!bFb.parameter && !aFb.parameter)), + ); + if (matchingBFb) reducedRtcpFeedback.push(matchingBFb); + } + return reducedRtcpFeedback; + } + }, + { './utils': 39, 'h264-profile-level-id': 4 }, + ], + 37: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.parse = void 0; + const ScalabilityModeRegex = new RegExp('^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})'); + function parse(scalabilityMode) { + const match = ScalabilityModeRegex.exec(scalabilityMode || ''); + if (match) { + return { + spatialLayers: Number(match[1]), + temporalLayers: Number(match[2]), + }; + } else { + return { + spatialLayers: 1, + temporalLayers: 1, + }; + } + } + exports.parse = parse; + }, + {}, + ], + 38: [ + function (require, module, exports) { + 'use strict'; + var __createBinding = + (this && this.__createBinding) || + (Object.create + ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { + enumerable: true, + get: function () { + return m[k]; + }, + }); + } + : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = + (this && this.__exportStar) || + function (m, exports) { + for (var p in m) + if (p !== 'default' && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); + }; + Object.defineProperty(exports, '__esModule', { value: true }); + __exportStar(require('./Device'), exports); + __exportStar(require('./Transport'), exports); + __exportStar(require('./Producer'), exports); + __exportStar(require('./Consumer'), exports); + __exportStar(require('./DataProducer'), exports); + __exportStar(require('./DataConsumer'), exports); + __exportStar(require('./RtpParameters'), exports); + __exportStar(require('./SctpParameters'), exports); + __exportStar(require('./handlers/HandlerInterface'), exports); + __exportStar(require('./errors'), exports); + }, + { + './Consumer': 8, + './DataConsumer': 9, + './DataProducer': 10, + './Device': 11, + './Producer': 14, + './RtpParameters': 15, + './SctpParameters': 16, + './Transport': 17, + './errors': 18, + './handlers/HandlerInterface': 25, + }, + ], + 39: [ + function (require, module, exports) { + 'use strict'; + Object.defineProperty(exports, '__esModule', { value: true }); + exports.generateRandomNumber = exports.clone = void 0; + /** + * Clones the given data. + */ + function clone(data, defaultValue) { + if (typeof data === 'undefined') return defaultValue; + return JSON.parse(JSON.stringify(data)); + } + exports.clone = clone; + /** + * Generates a random positive integer. + */ + function generateRandomNumber() { + return Math.round(Math.random() * 10000000); + } + exports.generateRandomNumber = generateRandomNumber; + }, + {}, + ], + 40: [ + function (require, module, exports) { + arguments[4][5][0].apply(exports, arguments); + }, + { './common': 41, _process: 48, dup: 5 }, + ], + 41: [ + function (require, module, exports) { + arguments[4][6][0].apply(exports, arguments); + }, + { dup: 6, ms: 42 }, + ], + 42: [ + function (require, module, exports) { + arguments[4][7][0].apply(exports, arguments); + }, + { dup: 7 }, + ], + 43: [ + function (require, module, exports) { + var grammar = (module.exports = { + v: [ + { + name: 'version', + reg: /^(\d*)$/, + }, + ], + o: [ + { + // o=- 20518 0 IN IP4 203.0.113.1 + // NB: sessionId will be a String in most cases because it is huge + name: 'origin', + reg: /^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/, + names: ['username', 'sessionId', 'sessionVersion', 'netType', 'ipVer', 'address'], + format: '%s %s %d %s IP%d %s', + }, + ], + // default parsing of these only (though some of these feel outdated) + s: [{ name: 'name' }], + i: [{ name: 'description' }], + u: [{ name: 'uri' }], + e: [{ name: 'email' }], + p: [{ name: 'phone' }], + z: [{ name: 'timezones' }], // TODO: this one can actually be parsed properly... + r: [{ name: 'repeats' }], // TODO: this one can also be parsed properly + // k: [{}], // outdated thing ignored + t: [ + { + // t=0 0 + name: 'timing', + reg: /^(\d*) (\d*)/, + names: ['start', 'stop'], + format: '%d %d', + }, + ], + c: [ + { + // c=IN IP4 10.47.197.26 + name: 'connection', + reg: /^IN IP(\d) (\S*)/, + names: ['version', 'ip'], + format: 'IN IP%d %s', + }, + ], + b: [ + { + // b=AS:4000 + push: 'bandwidth', + reg: /^(TIAS|AS|CT|RR|RS):(\d*)/, + names: ['type', 'limit'], + format: '%s:%s', + }, + ], + m: [ + { + // m=video 51744 RTP/AVP 126 97 98 34 31 + // NB: special - pushes to session + // TODO: rtp/fmtp should be filtered by the payloads found here? + reg: /^(\w*) (\d*) ([\w/]*)(?: (.*))?/, + names: ['type', 'port', 'protocol', 'payloads'], + format: '%s %d %s %s', + }, + ], + a: [ + { + // a=rtpmap:110 opus/48000/2 + push: 'rtp', + reg: /^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/, + names: ['payload', 'codec', 'rate', 'encoding'], + format: function (o) { + return o.encoding ? 'rtpmap:%d %s/%s/%s' : o.rate ? 'rtpmap:%d %s/%s' : 'rtpmap:%d %s'; + }, + }, + { + // a=fmtp:108 profile-level-id=24;object=23;bitrate=64000 + // a=fmtp:111 minptime=10; useinbandfec=1 + push: 'fmtp', + reg: /^fmtp:(\d*) ([\S| ]*)/, + names: ['payload', 'config'], + format: 'fmtp:%d %s', + }, + { + // a=control:streamid=0 + name: 'control', + reg: /^control:(.*)/, + format: 'control:%s', + }, + { + // a=rtcp:65179 IN IP4 193.84.77.194 + name: 'rtcp', + reg: /^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/, + names: ['port', 'netType', 'ipVer', 'address'], + format: function (o) { + return o.address != null ? 'rtcp:%d %s IP%d %s' : 'rtcp:%d'; + }, + }, + { + // a=rtcp-fb:98 trr-int 100 + push: 'rtcpFbTrrInt', + reg: /^rtcp-fb:(\*|\d*) trr-int (\d*)/, + names: ['payload', 'value'], + format: 'rtcp-fb:%s trr-int %d', + }, + { + // a=rtcp-fb:98 nack rpsi + push: 'rtcpFb', + reg: /^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/, + names: ['payload', 'type', 'subtype'], + format: function (o) { + return o.subtype != null ? 'rtcp-fb:%s %s %s' : 'rtcp-fb:%s %s'; + }, + }, + { + // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset + // a=extmap:1/recvonly URI-gps-string + // a=extmap:3 urn:ietf:params:rtp-hdrext:encrypt urn:ietf:params:rtp-hdrext:smpte-tc 25@600/24 + push: 'ext', + reg: /^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/, + names: ['value', 'direction', 'encrypt-uri', 'uri', 'config'], + format: function (o) { + return ( + 'extmap:%d' + + (o.direction ? '/%s' : '%v') + + (o['encrypt-uri'] ? ' %s' : '%v') + + ' %s' + + (o.config ? ' %s' : '') + ); + }, + }, + { + // a=extmap-allow-mixed + name: 'extmapAllowMixed', + reg: /^(extmap-allow-mixed)/, + }, + { + // a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:32 + push: 'crypto', + reg: /^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/, + names: ['id', 'suite', 'config', 'sessionConfig'], + format: function (o) { + return o.sessionConfig != null ? 'crypto:%d %s %s %s' : 'crypto:%d %s %s'; + }, + }, + { + // a=setup:actpass + name: 'setup', + reg: /^setup:(\w*)/, + format: 'setup:%s', + }, + { + // a=connection:new + name: 'connectionType', + reg: /^connection:(new|existing)/, + format: 'connection:%s', + }, + { + // a=mid:1 + name: 'mid', + reg: /^mid:([^\s]*)/, + format: 'mid:%s', + }, + { + // a=msid:0c8b064d-d807-43b4-b434-f92a889d8587 98178685-d409-46e0-8e16-7ef0db0db64a + name: 'msid', + reg: /^msid:(.*)/, + format: 'msid:%s', + }, + { + // a=ptime:20 + name: 'ptime', + reg: /^ptime:(\d*(?:\.\d*)*)/, + format: 'ptime:%d', + }, + { + // a=maxptime:60 + name: 'maxptime', + reg: /^maxptime:(\d*(?:\.\d*)*)/, + format: 'maxptime:%d', + }, + { + // a=sendrecv + name: 'direction', + reg: /^(sendrecv|recvonly|sendonly|inactive)/, + }, + { + // a=ice-lite + name: 'icelite', + reg: /^(ice-lite)/, + }, + { + // a=ice-ufrag:F7gI + name: 'iceUfrag', + reg: /^ice-ufrag:(\S*)/, + format: 'ice-ufrag:%s', + }, + { + // a=ice-pwd:x9cml/YzichV2+XlhiMu8g + name: 'icePwd', + reg: /^ice-pwd:(\S*)/, + format: 'ice-pwd:%s', + }, + { + // a=fingerprint:SHA-1 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33 + name: 'fingerprint', + reg: /^fingerprint:(\S*) (\S*)/, + names: ['type', 'hash'], + format: 'fingerprint:%s %s', + }, + { + // a=candidate:0 1 UDP 2113667327 203.0.113.1 54400 typ host + // a=candidate:1162875081 1 udp 2113937151 192.168.34.75 60017 typ host generation 0 network-id 3 network-cost 10 + // a=candidate:3289912957 2 udp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 generation 0 network-id 3 network-cost 10 + // a=candidate:229815620 1 tcp 1518280447 192.168.150.19 60017 typ host tcptype active generation 0 network-id 3 network-cost 10 + // a=candidate:3289912957 2 tcp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 tcptype passive generation 0 network-id 3 network-cost 10 + push: 'candidates', + reg: /^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/, + names: [ + 'foundation', + 'component', + 'transport', + 'priority', + 'ip', + 'port', + 'type', + 'raddr', + 'rport', + 'tcptype', + 'generation', + 'network-id', + 'network-cost', + ], + format: function (o) { + var str = 'candidate:%s %d %s %d %s %d typ %s'; + + str += o.raddr != null ? ' raddr %s rport %d' : '%v%v'; + + // NB: candidate has three optional chunks, so %void middles one if it's missing + str += o.tcptype != null ? ' tcptype %s' : '%v'; + + if (o.generation != null) { + str += ' generation %d'; + } + + str += o['network-id'] != null ? ' network-id %d' : '%v'; + str += o['network-cost'] != null ? ' network-cost %d' : '%v'; + return str; + }, + }, + { + // a=end-of-candidates (keep after the candidates line for readability) + name: 'endOfCandidates', + reg: /^(end-of-candidates)/, + }, + { + // a=remote-candidates:1 203.0.113.1 54400 2 203.0.113.1 54401 ... + name: 'remoteCandidates', + reg: /^remote-candidates:(.*)/, + format: 'remote-candidates:%s', + }, + { + // a=ice-options:google-ice + name: 'iceOptions', + reg: /^ice-options:(\S*)/, + format: 'ice-options:%s', + }, + { + // a=ssrc:2566107569 cname:t9YU8M1UxTF8Y1A1 + push: 'ssrcs', + reg: /^ssrc:(\d*) ([\w_-]*)(?::(.*))?/, + names: ['id', 'attribute', 'value'], + format: function (o) { + var str = 'ssrc:%d'; + if (o.attribute != null) { + str += ' %s'; + if (o.value != null) { + str += ':%s'; + } + } + return str; + }, + }, + { + // a=ssrc-group:FEC 1 2 + // a=ssrc-group:FEC-FR 3004364195 1080772241 + push: 'ssrcGroups', + // token-char = %x21 / %x23-27 / %x2A-2B / %x2D-2E / %x30-39 / %x41-5A / %x5E-7E + reg: /^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/, + names: ['semantics', 'ssrcs'], + format: 'ssrc-group:%s %s', + }, + { + // a=msid-semantic: WMS Jvlam5X3SX1OP6pn20zWogvaKJz5Hjf9OnlV + name: 'msidSemantic', + reg: /^msid-semantic:\s?(\w*) (\S*)/, + names: ['semantic', 'token'], + format: 'msid-semantic: %s %s', // space after ':' is not accidental + }, + { + // a=group:BUNDLE audio video + push: 'groups', + reg: /^group:(\w*) (.*)/, + names: ['type', 'mids'], + format: 'group:%s %s', + }, + { + // a=rtcp-mux + name: 'rtcpMux', + reg: /^(rtcp-mux)/, + }, + { + // a=rtcp-rsize + name: 'rtcpRsize', + reg: /^(rtcp-rsize)/, + }, + { + // a=sctpmap:5000 webrtc-datachannel 1024 + name: 'sctpmap', + reg: /^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/, + names: ['sctpmapNumber', 'app', 'maxMessageSize'], + format: function (o) { + return o.maxMessageSize != null ? 'sctpmap:%s %s %s' : 'sctpmap:%s %s'; + }, + }, + { + // a=x-google-flag:conference + name: 'xGoogleFlag', + reg: /^x-google-flag:([^\s]*)/, + format: 'x-google-flag:%s', + }, + { + // a=rid:1 send max-width=1280;max-height=720;max-fps=30;depend=0 + push: 'rids', + reg: /^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/, + names: ['id', 'direction', 'params'], + format: function (o) { + return o.params ? 'rid:%s %s %s' : 'rid:%s %s'; + }, + }, + { + // a=imageattr:97 send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250] + // a=imageattr:* send [x=800,y=640] recv * + // a=imageattr:100 recv [x=320,y=240] + push: 'imageattrs', + reg: new RegExp( + // a=imageattr:97 + '^imageattr:(\\d+|\\*)' + + // send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] + '[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)' + + // recv [x=330,y=250] + '(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?', + ), + names: ['pt', 'dir1', 'attrs1', 'dir2', 'attrs2'], + format: function (o) { + return 'imageattr:%s %s %s' + (o.dir2 ? ' %s %s' : ''); + }, + }, + { + // a=simulcast:send 1,2,3;~4,~5 recv 6;~7,~8 + // a=simulcast:recv 1;4,5 send 6;7 + name: 'simulcast', + reg: new RegExp( + // a=simulcast: + '^simulcast:' + + // send 1,2,3;~4,~5 + '(send|recv) ([a-zA-Z0-9\\-_~;,]+)' + + // space + recv 6;~7,~8 + '(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?' + + // end + '$', + ), + names: ['dir1', 'list1', 'dir2', 'list2'], + format: function (o) { + return 'simulcast:%s %s' + (o.dir2 ? ' %s %s' : ''); + }, + }, + { + // old simulcast draft 03 (implemented by Firefox) + // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-03 + // a=simulcast: recv pt=97;98 send pt=97 + // a=simulcast: send rid=5;6;7 paused=6,7 + name: 'simulcast_03', + reg: /^simulcast:[\s\t]+([\S+\s\t]+)$/, + names: ['value'], + format: 'simulcast: %s', + }, + { + // a=framerate:25 + // a=framerate:29.97 + name: 'framerate', + reg: /^framerate:(\d+(?:$|\.\d+))/, + format: 'framerate:%s', + }, + { + // RFC4570 + // a=source-filter: incl IN IP4 239.5.2.31 10.1.15.5 + name: 'sourceFilter', + reg: /^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/, + names: ['filterMode', 'netType', 'addressTypes', 'destAddress', 'srcList'], + format: 'source-filter: %s %s %s %s %s', + }, + { + // a=bundle-only + name: 'bundleOnly', + reg: /^(bundle-only)/, + }, + { + // a=label:1 + name: 'label', + reg: /^label:(.+)/, + format: 'label:%s', + }, + { + // RFC version 26 for SCTP over DTLS + // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-5 + name: 'sctpPort', + reg: /^sctp-port:(\d+)$/, + format: 'sctp-port:%s', + }, + { + // RFC version 26 for SCTP over DTLS + // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-6 + name: 'maxMessageSize', + reg: /^max-message-size:(\d+)$/, + format: 'max-message-size:%s', + }, + { + // RFC7273 + // a=ts-refclk:ptp=IEEE1588-2008:39-A7-94-FF-FE-07-CB-D0:37 + push: 'tsRefClocks', + reg: /^ts-refclk:([^\s=]*)(?:=(\S*))?/, + names: ['clksrc', 'clksrcExt'], + format: function (o) { + return 'ts-refclk:%s' + (o.clksrcExt != null ? '=%s' : ''); + }, + }, + { + // RFC7273 + // a=mediaclk:direct=963214424 + name: 'mediaClk', + reg: /^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/, + names: ['id', 'mediaClockName', 'mediaClockValue', 'rateNumerator', 'rateDenominator'], + format: function (o) { + var str = 'mediaclk:'; + str += o.id != null ? 'id=%s %s' : '%v%s'; + str += o.mediaClockValue != null ? '=%s' : ''; + str += o.rateNumerator != null ? ' rate=%s' : ''; + str += o.rateDenominator != null ? '/%s' : ''; + return str; + }, + }, + { + // a=keywds:keywords + name: 'keywords', + reg: /^keywds:(.+)$/, + format: 'keywds:%s', + }, + { + // a=content:main + name: 'content', + reg: /^content:(.+)/, + format: 'content:%s', + }, + // BFCP https://tools.ietf.org/html/rfc4583 + { + // a=floorctrl:c-s + name: 'bfcpFloorCtrl', + reg: /^floorctrl:(c-only|s-only|c-s)/, + format: 'floorctrl:%s', + }, + { + // a=confid:1 + name: 'bfcpConfId', + reg: /^confid:(\d+)/, + format: 'confid:%s', + }, + { + // a=userid:1 + name: 'bfcpUserId', + reg: /^userid:(\d+)/, + format: 'userid:%s', + }, + { + // a=floorid:1 + name: 'bfcpFloorId', + reg: /^floorid:(.+) (?:m-stream|mstrm):(.+)/, + names: ['id', 'mStream'], + format: 'floorid:%s mstrm:%s', + }, + { + // any a= that we don't understand is kept verbatim on media.invalid + push: 'invalid', + names: ['value'], + }, + ], + }); + + // set sensible defaults to avoid polluting the grammar with boring details + Object.keys(grammar).forEach(function (key) { + var objs = grammar[key]; + objs.forEach(function (obj) { + if (!obj.reg) { + obj.reg = /(.*)/; + } + if (!obj.format) { + obj.format = '%s'; + } + }); + }); + }, + {}, + ], + 44: [ + function (require, module, exports) { + var parser = require('./parser'); + var writer = require('./writer'); + + exports.write = writer; + exports.parse = parser.parse; + exports.parseParams = parser.parseParams; + exports.parseFmtpConfig = parser.parseFmtpConfig; // Alias of parseParams(). + exports.parsePayloads = parser.parsePayloads; + exports.parseRemoteCandidates = parser.parseRemoteCandidates; + exports.parseImageAttributes = parser.parseImageAttributes; + exports.parseSimulcastStreamList = parser.parseSimulcastStreamList; + }, + { './parser': 45, './writer': 46 }, + ], + 45: [ + function (require, module, exports) { + var toIntIfInt = function (v) { + return String(Number(v)) === v ? Number(v) : v; + }; + + var attachProperties = function (match, location, names, rawName) { + if (rawName && !names) { + location[rawName] = toIntIfInt(match[1]); + } else { + for (var i = 0; i < names.length; i += 1) { + if (match[i + 1] != null) { + location[names[i]] = toIntIfInt(match[i + 1]); + } + } + } + }; + + var parseReg = function (obj, location, content) { + var needsBlank = obj.name && obj.names; + if (obj.push && !location[obj.push]) { + location[obj.push] = []; + } else if (needsBlank && !location[obj.name]) { + location[obj.name] = {}; + } + var keyLocation = obj.push + ? {} // blank object that will be pushed + : needsBlank + ? location[obj.name] + : location; // otherwise, named location or root + + attachProperties(content.match(obj.reg), keyLocation, obj.names, obj.name); + + if (obj.push) { + location[obj.push].push(keyLocation); + } + }; + + var grammar = require('./grammar'); + var validLine = RegExp.prototype.test.bind(/^([a-z])=(.*)/); + + exports.parse = function (sdp) { + var session = {}, + media = [], + location = session; // points at where properties go under (one of the above) + + // parse lines we understand + sdp.split(/(\r\n|\r|\n)/) + .filter(validLine) + .forEach(function (l) { + var type = l[0]; + var content = l.slice(2); + if (type === 'm') { + media.push({ rtp: [], fmtp: [] }); + location = media[media.length - 1]; // point at latest media line + } + + for (var j = 0; j < (grammar[type] || []).length; j += 1) { + var obj = grammar[type][j]; + if (obj.reg.test(content)) { + return parseReg(obj, location, content); + } + } + }); + + session.media = media; // link it up + return session; + }; + + var paramReducer = function (acc, expr) { + var s = expr.split(/=(.+)/, 2); + if (s.length === 2) { + acc[s[0]] = toIntIfInt(s[1]); + } else if (s.length === 1 && expr.length > 1) { + acc[s[0]] = undefined; + } + return acc; + }; + + exports.parseParams = function (str) { + return str.split(/;\s?/).reduce(paramReducer, {}); + }; + + // For backward compatibility - alias will be removed in 3.0.0 + exports.parseFmtpConfig = exports.parseParams; + + exports.parsePayloads = function (str) { + return str.toString().split(' ').map(Number); + }; + + exports.parseRemoteCandidates = function (str) { + var candidates = []; + var parts = str.split(' ').map(toIntIfInt); + for (var i = 0; i < parts.length; i += 3) { + candidates.push({ + component: parts[i], + ip: parts[i + 1], + port: parts[i + 2], + }); + } + return candidates; + }; + + exports.parseImageAttributes = function (str) { + return str.split(' ').map(function (item) { + return item + .substring(1, item.length - 1) + .split(',') + .reduce(paramReducer, {}); + }); + }; + + exports.parseSimulcastStreamList = function (str) { + return str.split(';').map(function (stream) { + return stream.split(',').map(function (format) { + var scid, + paused = false; + + if (format[0] !== '~') { + scid = toIntIfInt(format); + } else { + scid = toIntIfInt(format.substring(1, format.length)); + paused = true; + } + + return { + scid: scid, + paused: paused, + }; + }); + }); + }; + }, + { './grammar': 43 }, + ], + 46: [ + function (require, module, exports) { + var grammar = require('./grammar'); + + // customized util.format - discards excess arguments and can void middle ones + var formatRegExp = /%[sdv%]/g; + var format = function (formatStr) { + var i = 1; + var args = arguments; + var len = args.length; + return formatStr.replace(formatRegExp, function (x) { + if (i >= len) { + return x; // missing argument + } + var arg = args[i]; + i += 1; + switch (x) { + case '%%': + return '%'; + case '%s': + return String(arg); + case '%d': + return Number(arg); + case '%v': + return ''; + } + }); + // NB: we discard excess arguments - they are typically undefined from makeLine + }; + + var makeLine = function (type, obj, location) { + var str = + obj.format instanceof Function + ? obj.format(obj.push ? location : location[obj.name]) + : obj.format; + + var args = [type + '=' + str]; + if (obj.names) { + for (var i = 0; i < obj.names.length; i += 1) { + var n = obj.names[i]; + if (obj.name) { + args.push(location[obj.name][n]); + } else { + // for mLine and push attributes + args.push(location[obj.names[i]]); + } + } + } else { + args.push(location[obj.name]); + } + return format.apply(null, args); + }; + + // RFC specified order + // TODO: extend this with all the rest + var defaultOuterOrder = ['v', 'o', 's', 'i', 'u', 'e', 'p', 'c', 'b', 't', 'r', 'z', 'a']; + var defaultInnerOrder = ['i', 'c', 'b', 'a']; + + module.exports = function (session, opts) { + opts = opts || {}; + // ensure certain properties exist + if (session.version == null) { + session.version = 0; // 'v=0' must be there (only defined version atm) + } + if (session.name == null) { + session.name = ' '; // 's= ' must be there if no meaningful name set + } + session.media.forEach(function (mLine) { + if (mLine.payloads == null) { + mLine.payloads = ''; + } + }); + + var outerOrder = opts.outerOrder || defaultOuterOrder; + var innerOrder = opts.innerOrder || defaultInnerOrder; + var sdp = []; + + // loop through outerOrder for matching properties on session + outerOrder.forEach(function (type) { + grammar[type].forEach(function (obj) { + if (obj.name in session && session[obj.name] != null) { + sdp.push(makeLine(type, obj, session)); + } else if (obj.push in session && session[obj.push] != null) { + session[obj.push].forEach(function (el) { + sdp.push(makeLine(type, obj, el)); + }); + } + }); + }); + + // then for each media line, follow the innerOrder + session.media.forEach(function (mLine) { + sdp.push(makeLine('m', grammar.m[0], mLine)); + + innerOrder.forEach(function (type) { + grammar[type].forEach(function (obj) { + if (obj.name in mLine && mLine[obj.name] != null) { + sdp.push(makeLine(type, obj, mLine)); + } else if (obj.push in mLine && mLine[obj.push] != null) { + mLine[obj.push].forEach(function (el) { + sdp.push(makeLine(type, obj, el)); + }); + } + }); + }); + }); + + return sdp.join('\r\n') + '\r\n'; + }; + }, + { './grammar': 43 }, + ], + 47: [ + function (require, module, exports) { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + 'use strict'; + + var R = typeof Reflect === 'object' ? Reflect : null; + var ReflectApply = + R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; + + var ReflectOwnKeys; + if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys; + } else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); + }; + } else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; + } + + function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); + } + + var NumberIsNaN = + Number.isNaN || + function NumberIsNaN(value) { + return value !== value; + }; + + function EventEmitter() { + EventEmitter.init.call(this); + } + module.exports = EventEmitter; + module.exports.once = once; + + // Backwards-compat with node 0.10.x + EventEmitter.EventEmitter = EventEmitter; + + EventEmitter.prototype._events = undefined; + EventEmitter.prototype._eventsCount = 0; + EventEmitter.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + var defaultMaxListeners = 10; + + function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + typeof listener, + ); + } + } + + Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + '.', + ); + } + defaultMaxListeners = arg; + }, + }); + + EventEmitter.init = function () { + if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; + }; + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.', + ); + } + this._maxListeners = n; + return this; + }; + + function _getMaxListeners(that) { + if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); + }; + + EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === 'error'; + + var events = this._events; + if (events !== undefined) doError = doError && events.error === undefined; + else if (!doError) return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error( + 'Possible EventEmitter memory leak detected. ' + + existing.length + + ' ' + + String(type) + + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit', + ); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; + } + + EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); + }; + + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + + EventEmitter.prototype.prependListener = function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } + } + + function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; + } + + EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + + EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + + // Emits a 'removeListener' event if and only if the listener was removed. + EventEmitter.prototype.removeListener = function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) return this; + + list = events[type]; + if (list === undefined) return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) return this; + + if (position === 0) list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + + EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + + function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) return []; + + var evlistener = events[type]; + if (evlistener === undefined) return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); + } + + EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); + }; + + EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); + }; + + EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + }; + + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; + } + + function spliceOne(list, index) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + + function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + } + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); + } + + function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } + } + + function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter, + ); + } + } + }, + {}, + ], + 48: [ + function (require, module, exports) { + // shim for using process in browser + var process = (module.exports = {}); + + // cached from whatever global is present so that test runners that stub it + // don't break things. But we need to wrap it in a try catch in case it is + // wrapped in strict mode code which doesn't define any globals. It's inside a + // function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + })(); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function (name) { + return []; + }; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { + return '/'; + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + }, + {}, + ], + }, + {}, + [1], +); diff --git a/public/modules/MediasoupClientCompile.js b/public/modules/MediasoupClientCompile.js new file mode 100644 index 0000000..d55a4a0 --- /dev/null +++ b/public/modules/MediasoupClientCompile.js @@ -0,0 +1,2 @@ +const client = require('mediasoup-client'); +window.mediasoupClient = client; diff --git a/public/newroom.html b/public/newroom.html new file mode 100755 index 0000000..53ca0ac --- /dev/null +++ b/public/newroom.html @@ -0,0 +1,159 @@ + + + + + + MiroTalk SFU - Create your Room name and start the new call. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    +
    +

    + Pick name.
    + Share URL.
    + Start conference. +

    +

    + Each room has its own disposable URL. Just pick a room name and share your custom + URL. It's really that easy. +

    +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +

    + Pick a room name.
    + How about this one? +

    +
    +
    + + + +
    +
    +
    +
    +
    +
    + + +
    + + + + + diff --git a/public/permission.html b/public/permission.html new file mode 100755 index 0000000..8e225e6 --- /dev/null +++ b/public/permission.html @@ -0,0 +1,139 @@ + + + + + + MiroTalk SFU - Allow Video or Audio access to join in the Room. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    +
    +

    Access denied.

    +

    +

    + This app will not work without camera or microphone access. Please Try again and + allow it. +

    + +
    + TRY AGAIN +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..21fed79 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# Allow crawling of all content +User-agent: * +Disallow: \ No newline at end of file diff --git a/public/sounds/joined.wav b/public/sounds/joined.wav new file mode 100644 index 0000000000000000000000000000000000000000..16ceb80ac6b4f78d9c15ccfd43551f95a7a60018 GIT binary patch literal 42156 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 literal 0 HcmV?d00001 diff --git a/public/sounds/left.wav b/public/sounds/left.wav new file mode 100644 index 0000000000000000000000000000000000000000..0c9cee0a3dd0aea2b05f16ba2431b751e85641e3 GIT binary patch literal 42156 zcmX_}1DNzo*R8|u9zC{g+qP}nwr$(CZQHhO4SE{Uxs&(%&sA5_m_|CO+Iy|FSJgDA zUZu*WO@h$0e3QyudJjq$PY?u=R%w?YOlu|zk`Pbm)P7L=alA(6Zwi~tv;TKr5mcUY z2_C^MgbCq7Twb3*NGv3$r4`Z$nS?AtP9c|2Kqx2_7m5iLgmOX+p{h_{s4KJ(8VT)% zHbOU{yUon$M4K+m7Ul{|gr&k7VYRS9*dlBdb_sigeZpbd3E`A*UN|RQ7p@Ao zgxkUc;gRrMcp#4xt_VmvW1`$S?w z9wl<_MX(PM!+DJ?ilW9lqlMpm(i=YWk#LXiIwPDGc5@W#gk{2fVX81z7$Wo#Ita~$ zI{coJ{Jxw*dLg9{Ux>r`6NG3h%KBz~wO(59tb5jD>!x+vx?)|n&RgfK)7A;=q;-^S zKigjJ9kLEO+kWeawU2xItpjX__}gJ?7tihFb~n%L-Tdm2Hc)-P*=} z8;`bFJJ|1GzlT@;_xUII*0a`Cj^U2=(0XdUwLV+lt!T?bk46KxWzbP3NekCTg)ex70Zcr#rk49v7^{a z94HPKCy7(U1>zEMwYW*#F76YLil@Z$;uZ0(cu#yOJ{LcWU&NncwD?cdX|m*!!e~jQ zgi;zQt&~a1F6ER8(aK0=rAktDsgBe@YAUs*b*1%|21rAs;nG-Xlr%}2EKQN7OVgwo z?5ENu(nd+ccttO%JMU=5yDLjYr2>3%63HXQia*4s;#Kho$2MOaC-xAViB*fmvi>ay3RG*ZLPHySktUwRxhig)yS%4m9`34 zS*?^-JWH_x=3n!@`NF(qUNDcEyUmT}GIO>$*&J>THoKY~%w}c-vzl4KEMXQl^O!lz z3}zZLxtZ8ZV1}C!rfRxP#k363)C|M$8Ga+$@EU)ODB}<9m+{T`Y5Xug8{dt0?B5x0 zjaSBV%Up@#iL=`umnNrLl<`v6}mBhwk3$d%%R~#x%5GRX^#D(HI zaf7&vK7Uv|DP9mSi?_u4;v?}b?XUPt^oxe*l0v0q^!6;YJW^q)xKy5AUR!D`wUoNi zYe&+vXGsgCwbEv3pLAF{Cta3qNKd2((tGKZ^hNq0eV4vUKc#Qd4{pCnA9?1D^ip~u z-IeZ1S9$dr>8Nx-+Qa)dN-L$MeAaA6#}sM2G>*?6#y1S14VC&!gV_eK^^*EXouwX( zmo|);x>7BvoK%dX%gAwtNt*aad?Q{L&oO3}iDSf`{OVF-9?reVdAUt=SVP?I%ay9c zXh}gn@LFH22aJ`Y#H{sP_eJ!PS=MB0rZts&bFGE+k@duP%`ICHKzAhh>cgl<9 z8S+56vs_0mCufn9%7*lrD}G2?$5rdj^~g_jj1ixS$B3)L`1Qr;hf(y)9rV{OM5*+G zVZGpdF0%St^%I+JNSN z?mz5b=pW#(=P%$-;E(n__Z|0b@J;vi_qFlW@D=mr_NDP9@rCd?6=Z_mG5U3sK9he!|9=IO( z9B>EI2P+3#aXc%7r-ILdfnZXtnASuat}WM2Xm2z@&#KqZ`{_&d3;GW|kx|a*Wh^81 z#TZ%5rshQRl=;=nXf>h#-L_=V$SC0?Bf2Pk=%Dyp%tPGW4DeI}^sp)CrY3ym|Y3u3W>F8<0ZBriC@Ko@W^knm-_k?>) z_YdBA*1f|$*FDVL++ER~&aJvXxvsc2xF)*Vxk|cHyS(Z{b-y~Dqp7H7R0Z|5a#mTc zjH7Q>P*N*y<%@ieV_zjtmV3x8<+5@?Ik6lrM-eCPN>`-4#DuwI$i7l1@?tqDx0G56 zk^JH(a`Q=Xi#VIn)JCjEbW0!_M9hoi!WoRkCg8U;;F`}MnZ1nOF;-i8Sph2}{mgIv zHlLV}%(I-|z2**cE4^+LZ8P`xnTO4b<~8#LU)jE~{{kZU#P&t_ z#iKvqwm-y*C@@?=P{4C>_$4XH3^|>+QCX}fwjyHpCuU3)mlMzSh-ZlwPsEQzXH8V4 zctnegQZ5I5lyk609jUq0kl5UmtqJ!UN;Rb##O%_%CWn+6R1qJT=@-8dac&Xu_lVm- zKU2gZVrTM01+j>jo*X5JF`UnbAlH4uCJ^ov;$?y;zmWIf>Fz;$6q@d-Hk!UIAfZz&{%71F^(9=i4Ax7q_-f9NHB*) zyoh5aG?SRA&2&VMEM`tKo0;3p3tA`uYAMK8gh$1>SKKURmM6y4G8>uA!4SR8G3GQd z&t}li4RFvuQ?im+IYAE1zzoyDr)RAgFdA_;ofaf&^J$;8_ZSa1alb3tf5)f%x5M87e#@s?iweE zm-CI$Mi-+2=P#oXVZ;zKFYEjCCHfe>J5jT=o=%Ui$7)}-yV?b9kG4^pr%ly{X#=&c zS{JRg)>dn-wW77tI%(atKKy00Hd9-yt>?9;v|HL!?T_Zy;^?XL0(v>Usoqr|q0iSh z=qL4C`e)szConP-#TpyEjTy#j<1832+6V_TRyRAD)9DS@`4wUOqI%WLt~yW_2}kjdkrJ zrdh7E?&|K&?iuba?(^=~?r68$lg^WyC{~vk*45L?GsH8}Gr=?2Gu1QGGs82>Go9P1 zo++Mjp7H!;xMz@O0I%vzoa^doP0VZRX~sM2c^VQ0>v*bqs(Z?Ls(4CyN_&cV3K1W3 zdNO%Zdy;q}JhI1d|8akCKXPAjA8>DSPj`=Uw{=%@=XJ+*dtLWj`&~0#U0vl}NnGF6 zi|S0Zo0?sf)yv9aGHfR0k9zW0b4U3b@cc05A=`q&+;$zZ}T7Y-|#>2|Mgq`M0`rwK+8biz^uTA!1=(l zfG?0Rm@imA*fTgUxFdKw_$wIBG1bxfY74b}+B5o58oj*UNuN&te5~tw21ffZdd)5J zUp6?$6!W0@-AqN?p2i4_werBc*THcU!``NWnSx?*P~ag@WqxqTF8QOJnRB{Ed7#8q zE2$&ZJ?eXMUs+c#*Fx7R*E^R&-mBtn&-GbC#=7Lb=l(*@Gu+{1z0{sGo-CfMp6q15 ztYo*0^q{8jaMJeFJXkkIK{(e8ilzwY1eU$h^zue2}pfRFB%?pNf)JMP== z)9y3w-Smd#?rD5qS9ddaS$A%Ce7EL$>AK)r?;7W7<0|4xM4vcEmhM8fcB?Oy&B_p^ zj1sCmmefa8N?mi0n^bcqat22fEA$!q zFuj}JT(6{;(6i|&^-y}#U+ohk{-$1XRQOb%+=;=leOvEcx|FKRvSkf%f0bD zH;qU!hrce;mh#Hg+IDTTc0k*!9oLR&mxwkuwcFYquKQE%h4!A?kIwB&aL_aDx%NoA zN4vqRE;+A0rJW(-oM3;H_ny$MYv+kScX{ngqSsG)kEBQFiS-WjSqS##Jz1!fgGe9YQtq$ak%2o;D zY-TH&6~_v(bW;b<{4=BA`cY=I=`%%3q{k$HCFg`CSF#$DZ3bE6IgYI;I5$vS{#hy* zCol221=`VM@Xao`a*6D4Rym{`lPkeNb{8r6#R5-%yu*LmoHc`6fyOwtCLvT1pi-R7sdrE+xH^ObJnR z`H%ckz9t`$*U2;CKF#IQat2wDKS`HhJ!8RJMWqPoC(6+(uvBfbyez&Hj-kKx6>5SN zLxpc}%-t}_k&M{-T%o*H7ArAVLA3-ch-zVPk|py@QgVKNkY{bse>Yw~1B|twtNfa) z63VqN1nX=I?wrL{IfT~t7;G6MM4%Mr5DUZe8-R*?a1^7(8C;uXWYz63vD2WFd$9Wt z=vmQl`w*CYI-*Mh#1G;(9);m9kIuOcHO!=f@pm5XW&o7c(wq9p4)rlg?YwJHWfpd(r#N8!xtGY`fT*u?J&c#JYSreNBC1ecOBweVQ*L zJbIXai~pWq2;?O5&kURh{0*cJHVw`RUI_|XQEdp(|DTpe@1gJ3f9tu7e#Ran)+hnT zzhkC^FC4SN(O~uqL7@rEMic9x|3pdE1}CZ3NUVe*>S;djFihi?d<6y7hqc6g!i_~HM;?uTs;n;OOKcHZSO7!JAUQb>zWKVE=-^Qp9s#6vd}Ro_WOW>f{PhctA{_VfBE?rX$uoGtZk#;Sg=iDrR;wz8N$= zz#dL>b=H$7XBuN^1C8NEe`5%UY?Lt>i=42Ypp&`aiuuslnxW8-`JX0w4u1SX_)Ns|2_C8($&5!;Kc(dxVM+xnng4nnaX1s|S9Y+H=Fw86D0M(B96}zNF0H2R;q0A8U$}`*`5ZO!tMp0wBmI(o6ZL*^ z?+1G2XOzk}(o^X%YUUN`6i9Oy8s{=TVFI|bhtvp_t0as%E#G9ImcEAVoq+|e=D0=> zeVdBa;nLZN$u7~yuYF2I;xPKx5~B8Su1ss8mQaRslbTGgTQM-d+tgcjlf`F~iMtc~ z%cF}WMxp-&E4^gyF;}1o^#Ze$fz8^;?wj!lWVhW|05|S#G=+H;Fp|Uie5gsU^y{cf z`}J-5YJH(Thj=v^4megH&3=MDUY`l#TdFSuFYVHg>Sy6^4?s=7;BcxD*GOe#HwyB3 zwLniD=m*1%NyZ!)`x;}fu?t>z(zuOI|AOy-ho1i(RP`I3{|~DFKSsD+0q`0@aD2e2 z2$+Uu2viAN)C&@tNnz+Y%>3Z5s-UE{Wk!q$g#viV%UjSQAm? zkAQIgptoirI=4aHSuAW5uA!{N3gKuK#po+7=@%nVRTmRSwoxlNMsK)Cf4BhuK1JR; z1UlJ(;yRmt(@*R|cCNyeNsY?!m)v=t&zmOfu@kttK%utriMvdl$SPJQmy*ToRlZ91`phY#yu> zEECKV%o#kr;J+pZC7ua`+a(XC3+4zG3YH)T)em-pdyNZD39brm2_6q# z555R~B`$|*nc!j7wMJS$ZIrf5+Xk|Jp#9cNEw!Foucfz!(=UJ%T+`pe%90xSQ4_jz z^|zwAd^g;vDwX){)2X=J2T`T~XLcmE908kzgHF3rp}2&em7e}TQ9Lew7gM3nk3+xy zB&C*Xpj7TfMNXtt0zGV1o+yf1Ky9tgQ}>}%Dy~AVrmiulhnHQSU2b<)cV%}+_el3r zxYTv`bC{RxNeoXbhz42L)7)Y9!#tzl@l!qXXiGgyJgYn_XsbQTxwn*i3q8v`^F0eZ zb3Jq5{Ik#iW_TvCpXhM^(M0Hxe8LdV2o!)JZ2f4x(E@sSx_COHdA9bnLHCaErXA2Zj7NdRSkhnUUK_X#CM1!lak$1N9DYxSYCz&T|j$v>J`4F9@ZamRn1# z8NnaHyWo_K!NtMh!S2Dj^sCJDDJ}3T@F;LGum@dWdSGCnOQ24md>~&SWgsrf`CtEA zw1Er$L;kJ)RsOmDDgF`uA*cgA{4LM~8u^>}>$BDMH|KtHe+N|YKK_3G;rf?bNQqN<}@rUY4FZL0?0Z`$Wvj1Fs!stS~MSi4viU^@P!#hx4Se z>QeRFg@PAOwCyddCHI&@9$&TXOLZr3XLlDsSE%D|jRMu%J(&JF);+~N$vx9O znXEt6J)YYUw88FPXzuOYEzsWUxGTBKyNkK=yYslyyED3z&~GB#A#Ru3av3h4E5;S& z`tJHkPx^pj@Z9wPCFwe&;;ieq>yT@wYqM*$YaYij(ly-G4K1MoJ*}WClPkVUbVaJq z)SDdf8g-J|Lv5@URnw@J@lrD%i@oagzs>}ebh#WTb->cRxy;)Q0pgZ?`1H+8gl_$w~yHp zHe3P)HZ{tmK}L8(p15cnBU7y+j!Ymrb|bIUHp-K)vcS^A3`>vFzvxf&+xl_+u)dDG zG>u5vA9bj?UK35Cu%1`XpeNVk>Mq^VVu)5>sr|g5f8RnaIFCMX60PBYwp-h!?VxSZ zwi4IuZ3jBU9-cqQUyq?Frh$J9M*e+7~|cuNI|wwSX2R8d{pH z%eth8u=jxUUF=FQ5Y?}4ri&mF%+GAfw6(i zdj<~j5@3<3L^s}?$2C|9BHN6XvC}+4MdK8T#wkb1ILW;u z=ox#7-P=%OH-IRXp=it`nvX*TABL*Y2Sua{nXL_1u_?@_9@>39u4g@zjrx3-t#mX- z-)PD!TBCq;G5hk(!+G~4)RDP--g+X`0W_4W)L7n|e_*wtRO2(jXUi}aTYzi^lGW!@ zW#36f^(+;HN9b7Js3v$Vzh$60c;LzjsHi7|=_X=JjNc;xEdt+;M=&ixh@$@bi|YG( z>pqP0`6K4JKstFK7|T@kC^cpTxM8d96@H3m{RcgMnY$z@))Y{%c+YTKoPkPvU^WG zz)$@qTug;Cqkvcl3|ozAN*hpXKdSBHL92_!rQ&9IxLs+#0$P8L()}AAZi=CflOzW` zygXR75p}(u(jao?G}!oRFz0RutzM;C{t~1b1uu6y`bjpqm|ThqY(2RxDoS4%!YFyF zJWXCGFM#o`lsCv5<@Iofjns%Yu&t%7l$Xd$VH4A6qvVmitEb#aZXq|Kidcb9%S}r` z3zcPA0}X$sivLi$j~aiD+WuZ?2U^D(X$dv@Ss>xbPKACXwfP~^KinfCt3%Th1S%f8c~g^g~nZpN>mZFq0AuX#3&G=6a`9nDc%IL?ZJ;Q+dc&@9c;uIb`-_tI?kP^jspz(jGh)w)h|69s2J{~nsA=B^qWC=H0FX@?LKpns?tmP zi{H`KGH?dVOZAD^eYpY)q*bt!Qz#p6q<@km$CES41>}ly1GytQ)p+{DIy?fly7of; zMSfG1L`q8P`h}HpC}2&f_IIc1KTH`5=bod?Q&uRe&~>(;r0pjQ9!GIIqnxK*R<5A6 zT|sxdtlZ(=4fMBbC~=oj-!Af+v%K~w3f(T=wN=@stV6R~hQDB*GL6hL8pJn%Z|a0A zp@CA1`fn*XZZ5RGr06t~;>BO^8Xv=D`6M-;b!4aU@({U$+!(Jz0e(?DJO)4EV;A_X zOX+((=~ZQ^e8$7?@g8Ms7oLj2FvSvZNm2aC8Q#qq?}t015b?u{Tj!Xgy|pF|rK6tm zo(Q$soMCn+w&lUk6a$|*L1kqEDo-ugPhvwb-lC81MjanZCTgG;AqR!((b_Ar$8PlS zNz~0+Yt^(uS{hKb7u0?S)V?t|H#jWVC0Gv>o&~I~2i^zn295;Q2WEh)S_LWu@&@7u zOsXw6sGltJkN0=+*YOwhr|`@EPriG;y}s4HQNAv|TKEo<`;6GHu{UFn#;%N=6x%zt zNo?uZY_aiTHI$i$-m~64-qqe2-qGIf-ge%4-m2bW-ooB2-b~(<-sIkd-UQyb-b8Fk z*{AWQ_h$3v=M@#bHM}jn9Z`73c;|Rmc=viwc<*`NdZWE^Y)U@8Vr;$G9kA-=ZGFo#rw&DkiGLpc0yD}P&o1e`H{A*oMsxMf-trS8vRJ(1$O`>l$uKpD9 z0QzPKE~R$VP7X?MC7Fm;k1E?r`HcLYzMn~{j6OIKHTfc_NKwSgt# z>Qm#pvb)NF^mkfhI-N)YDkxH;Dj`GY~|w~F2x=AD<;CX+kq0w zQO`<)4sO6O-+?18qYdl^uPjF?n1Ws~7}U{))&dmL*l{Q}2AwoBlwUy`gbZI0vRK@mCY)I&Qb?7&=tfm24~<>rvh>k=g1Q{?O$TL z?HNvrE|7&IE`rCeBGtFrMD`X!JED6xSVez)0fU9nv~iBxb~g1AJKoQrzCVY|wE!RP zLN?nayqw!*XwA#nR9K^PJ_aNHnF|x%O+7MnaEiQ z$Xp8Qd93gqKg)CK_}7FBxE}ZM8&>nnXXCURNd=@gdRHs5cXd!yF}%Ck9b6ZVPt`}x z{6y93Iaux*3fM8&?iO%m0o(^g)XBI-COl8JJb&A1{`o?&I@8k?9dK(JOJT%RbMjz01E2AONz5+GT z!f0OEjI?N9Nr?U7Mm)m}Gw~QMZYlC}Kf;Iu&rX8ImX_Lkc35{2+$t4ts?AvInfM#j)HI)bUIQQyo1u8Rk{{{yOjfH&kQHLqpp9>ZY_Ev%YOOvp^d(hbi0&6R&d z{yxE&UX34SGVG&2zqO51g)NH9Cmm-g3|-ET`}hO=^9EO7pRto`zl5AJmTPbOj_Pvl zig6v&z(Q3+q$2(e<@AnzQ9q_{*Vm(iO@fDZ*E^!wRn<$v;nM5LV1c6k3kLdxiuQR} ziLTYgJGmr)>7qmC3esv1q`p#$*;&BbN04ZYu1aKEF`dgyIA zVC=PFbbVoh3#d~cV_dx?`ifMLv*AK&M0^~FlWq@e>lLgh9tgKQJz_AiZ8x#~lOW=+ zFF}kLL_FC8n*Rz?O;2U9CEoWXWa3+>>$04QDqJhM9}HwGTFVPLnrd%G>Z}c@(T>HP zx&yR%ALYfXc+@0nPU?Hr)TUH{22%5zP3>=!x>G%_o>i}_ch#rV72i=;{7KICs$4)6 zM9JlGh0sD>VYCSDMNm@=VN=*l>W@LHi}vfIdFMYWjK8Tdeo^1@Nv}{&o~e&$chq}m zC^y*7^G#>e3v4H8$JE2>5%mCVuezHf*+$!}ZlEf;MqNQ$q%Pnnr_sjJhH%uqs8hC8 zTauIO;PNO*X3nanR1@L>GL_%_&Zl7KQ=sM5Wa*LMlBP;kr4VN%j-tt5aNC}Rw=JT2 z*-@@9=O;@`@;`9?DQP`5%swcqC8QLRBz++R@4>}4n7msS2I>;OkS+F+bB5qqD=Vaf zH-CpQ9VV)dW1Lr~>Yv#1l3Op4R~Hi@I&$?35mDTD$zBsF4-mcn&o5HS$Z8}tB*ROe zx{qIE7pmJV)Qg^a8~m#k&>AzKb0~TYz4JL9j?*YEn-~!@w2@kG5MDj4KEBr?^#4>^ zn5KY~e}R=B2X6$=1`h^z1=j?Z24@5(gPI4RS+@%|M!T+r3RomqAecRv3C%kh+ICzN zZd>&>0#+ap(C`-p*?ipdqZ<+wK$)&!L@*w&P8Q6Fs+l`j7}QxYSUuPP7jB1O@8ICz z*x>Zwg5YYj#e?9`tLW@+gWrN)0#&${0%g1~W3~?Cw<}|L6u)5^NdFLH?=gOrNHn1c zJuTy|3`n)L-dP_?6=go>V?X--V-&1dTqj95TSbj(M3K*;~=vdo>3n$L9v=ws91Wjj#= zZz*q-?~1O-Y9cD=In{#T;41XfW@;PyY)^Fnb^NjF2z4sj^>mzTQ&H(>sB^hDo5wTg z%Xb8BcCNV7o7*+>!J!YdJMYbAF{=F>QtZg z_tXJjGtyt_FZCDPdx|dkgzY)cy<~gKD?aj?FSPGe41ej-`d{jXF=&@T-O>f}C?Ym^ zDTGR5JR?3MA`#!3f|iDs-f5Xoelu}Q8H`*wRde7Q&B`;Gc`hS=&q&U)kyr{N8Sjn{ z>WTyU3U_cAG63IzXv4SpobUB=1X21wJYRolQT&!jr^WEwqMcVE`*2(`@Aq&-3BY%$ z_=YUty}aPQqA1Z7L4ozDq_pMC^)d#dx=tYe*)>l)SMH$Fa+3PjO}uokjW1NdeT-%m z)RqwZl?m0TFyp!k9HcSVuM=5x5F>mtS9KnW=qmhUTTzh?p~7B3pSlThdEj8MC*~`3 zr8njWl+w@UM|@!);U=HhKGVK%?<0SEM|(wkMn--Le|dzr`Zn7YXU^7D>Ky0IGfsax z2NFKbcAW3BzwIE~0W{wu+#Ulhodo?|a9Ge~-g}dycmjfc$1!~2JAavxrk9eUfHy1z zj2)kTn-ULMR>zA}8kbltRMh6+@orS8N1(FKptrB4?WWmtV=lqu?!ua0F_-WM%qfPs zQ6_U2Y(>|eYncFymz24dDRDce<2D1;?+iS$pGn4M&&G_)oJ6+}B3R7z^H~8tiO_nl)+V(g8f-ZKhKcL=_^{wTn`h^w7B;?5wL zuDINKII3?C?)Tw-e@5zHUON<*)fj%!B!1IOJe5n}foquavzcFJ&ucu6PJNyXdYh5{ z288+(?ZH;7WmM@naG5j?O3n|vDG$e~&kTfCAlshc+mT@AX|TctM2NT8z;XT*_2UCNVI*^jB*_xvqK~Blhh?R@SWv2n`dXivTW!#0Z9l{? zXFlQr6vP$yzBa@8_mD@9;*B_m&UOtQ;1*7kJ0OmGsK5`oeN5D}Z|`w?lfT~JHJ5np z8RcpOfW!SLc9R9xFLKdUL4eGO)cmEf#r z=j_`v^4xG+FUW#X@AHZ$&Y1m7y!hjcS)DPf;`EGbrLa=**}34!#jR5KeQJO!np6MiOr2u@ zeS9p{kva73RrKtwjG^O{IeaMV->h%3ukMe)7#I|+pnT|--j>0rN95C z1q2<{E(G-=3B5gomoE>ouRqZ%9)*L&mNpgKU~Dj!VS_kX+ORD6n*wGJ=xaF-{VL9 zLkmbgiDHB7kt5_d%x6n1r>3QsGs{`=K;{B_7eFN|BA1|*p;f@US_L#wO|DAiq=sBq zuH{r>>Y!KGk(;78Hbq%$#J&NjqanAAoqYr6wmyHU%U^1?`3ZEeC!p z&Nmgn>y=y1#`mX})1uBLmE&_{Zd5vhnGun+FL)|m@jGn2?jnlaA*wT*aD^>q_QZHt zS8vWh3r2etbn<*sHsU}$NtFUbhqvNm6!YWaZWOx(jDx|P>*mb;DK2J4NeW@^&v)4R zCHzVo@UKo3df|lZ-k{g8@pE9}4aOo=m?3B|&B?uG;iwtN%PMmkzJV|9!C_B19DEVp zrBQlc9Nu;(EAvm{Q-#&F?=X%BsPSj0?{0V8>638@^oD^qW=3Es91oeaL}>FG zdh^@h^Weqcx!}&==HPsE=;5f*?eIU?JR>6HSIk zas8ow!Eg9te9^w|w0FLb%sG7Pd*plJd%$*|M~{3jeb0FAjqfwA z)6oj}^Z6^$8ZrN(Gv70U8He-yE19Kn(0|f@lld1P{89d(KQxdakR^~OP$p0_&@9lM zTEis#r)vVc0%!O|ubB1W4al&lv^Xq^2W!K!y5X{z2pd`z+>6uV7BdvT!h~ezjikjP zR9dTn7ST-`iobOMd~PrE0B)hv|3rTXXNEvdy%g-PC5rtheYU<9@5wnFD4)N7)iw$kuBx^)I1l!2KJ&o+{DZLO}6AvB{@#vf>Z_S!6AB4rJ95ev6A}LL3qXu z<)QMHIzhA&pjHqMo|1`qj5d?0#EixU_$%6~U13W@)#2(yc+osGidE`*oXWdU3XU?r z<1#wJT|CUs)z>HuU)3LKBrSjfA-Xixg<|1GpYWhl*qTKgHrpTV#tSXul@?vVOq|oP z=oG)HPJBY4c!Dl*6=mWmj_6H%*8*7CL^xOK>|qR-fMx60I)v&pICxUxxf{3yL9 z+n-0t*$!G*KwV%s^~#a3DJBOS8tLymTK={+Op*(hqyh&qr>#>qx}6e*!%)${TitK0U7)iIQ|oe`yaD0{AjQu9-25- zA}SuK$=vpQj1n-%>L{|!z^h$AsDsGdlWFt8rK>>|JHWn&sDGUWkKSd4j91Lp_yS7) z2jbQpRQey{j_=^@3}o;uAQXFTlR~VTQ5fc0f^$rd>yiSee!w(uxkV6 zo;77_g~HdGEZ>pY2A!PNnS9@ciniT)gKqnf`v=g5pahN(hO*MgNb<#4RR2k!-f0dR zn2%z-$fk1KH@_|Njfxoly9T}Y!8 zf!<%!p3oz2gXzyZ6_CUHy6sdZ?ccnBO2|w&z(j`)^ykcVd75pWdP#Xa2FxM2nn#W9~$<)n8 zk-PgkZlKoG*&33?tHW?Bp%a%xDa?-pF^8EM4^kQ;dNP#5B&f)V*e7J47`-A9&Ay+M zza~S&uvLt-)G9Jim&xJi8u{>M6v07T+NoGnMZ2$$^3e1+*1Z0oPIs+(Jcfhq<2-cjW(%v1|OA8xA|R$Jt|$$TJ+pFZiu5LCpX0?2mA2 zn^)T-@Pqly*=(-;1vLGM$2O|A?|o zpVve~J6v)UBWo68Y9;lPt?Gs*|xfa*YWs0Sh}i_0YsIXW#2I1V$?beO{*`sxQ*vb~BX?> zDa@>>fDOMV<~>R zsVHS5r~>ss@o9$gQx&&+F(V&Uy>zHfaZ#H@kZ2V1Rz9PBJp+&4q$+d{cj6&X={9OZ zEAiUS)#rgur{Sp|hiiH;b13`bTI`E5-h4a?uzs*+5XoVrB^)LUFjuIx@c`1ALbZj#LOnR)@+`S9!2J zj`@U3aS-ihuHHrY1~b6kFt6~h9F!%{P9jz_$$$$a7nrXI^KC0A)tC#|0Cl`MxTq~N z1-np->Y?<+6V+E4#5Ndxc_{l~td25_Il9BRZ$GwMKQ>!^9>hEP@SbjLot*iGotcf? zj!$esYs#lL1z*-IP(pQ;L9oqHp{Q%Wy{Gv z7hbI#VASkNX0+`rREIL+;Z4u{pma(KoLs5+MakF_(BdlLG!MU1QbZ(PzpTmsSQ+LU zvll<$e|arG#s6`Kd5jnESsj=6Fz<3bsBa+^xrrdZfy~D2h##;%e6%#HabySoC6-+v zz<=<~XPosjC`4Oe({pg14d9wIk*ZOJ$_cxSKyUiTRlAE@ZLhcyon<2Yy#u;cd5~N> z)D(-Ajoy$WPZGOU5XpvuBASCgiVGR(C6eF=#XOKgE;Aa9_9N>L+@t1ygb}a-C3iNnSVl0L zr5oCKBcmp&Z%KGcHrPrM#=GK-_h0DSuc-jrvuBP_*RiX>%a}nkmH9Kn@YeUF7TiW} z%vuUnaG)2%mz;;0_vxs|CcyEl>VEvczu=`Ga3?=^W;~yTHyzUsGf!{}Z7nQy3A3bU zGhccNbEn5L^J9opH}0+VqUzLxl^42DL++rpXBCFF+_t54gwb~5erI0MmDlyc(La!P z4Wq&~mb&v4=3dWY=JjIS{;M7L^B$^J$En0!#qInMr}G{~7lpgo_9n;E6Y44S zOw9Gprx$hVS#_v!x5DSvlV3RsXZ z`c4q@6|}84#C;!ZFfpj5Ai1GFjIa;bX125b(izb1D^R?Kn?HqE)%HOqz4g}$AjAmelZ2*ZwngfRc2}ZKrxDg-k2Ays21-3Zn#&c5LMR0Y);U> zpTZh#kF5vAB`wUcAi7L7*idU$8R&&e=Q2le1r_XV%!xe$Z#u_#y2(m5j~QLB zX`gA|3*qpGP|PgK{kQ?Z+{=F{9W=F-HIL%HO=_8}Ir=ym|vGd&QW2 z$^M1>TzBrBJ~rTtu<_?Yw2PUzY9>-SA4VVU zh4-WbQK$u2#CFS9!$Vw#d|CuVk{fqUCdZFry!h*PuBk=)!#}D)gU(jpZ zL63-6x4|k`88>!q?-(wP1K^hZ%q!bV6x+cZicJoN*+4{F%eE4a(F*RZ;@)aD`*sEQ zR*?5svaRNs4cxA$ZTR1Ncd&-e4(9Rg;xqU0*@tLHY4*3B;9Jib=b1-y#TmPoS!d@K z+dYuO1CH-8mFy=R?GwiI3y%3M+k5tJaM`>e;=bngt+T!7@jD*BLHT*bYwcD4p0Yh) zyUQot=H4|v_Y$9f>3_fY0!MHjq;ej`=p09NitU(lbO(sy2c33+#|OCg-%;CV=NNxG z#dgkl=V?Ce9G`4|u8nu@kOiLbo%XSQ;7r@qyFZ+H+kYjRw)fkfml)4sDyfK0nH+Xf z5D!r)m`-J9r67A2L`&vbbOaf7gBA6Mm5jhCGm)7SGr*$@=@To#NgIh{TVW*jI#Q>} zQRj(i7h(N&drWk**~l|TyMF`2uxoz*F^^w7`UTIhYj9s3#_^3uHW#t^$!Fg25w`Y@ zcfWEt&10C`ed+;sU^`c6mq2Id92R724u|;u{cxkbPTg@6Old7gwwg-wO7=_GFClZT zfJ-gq_P@3e7sz7g`DNVNeS9T#%hkMdz0>QrqUY{H+t|miI|N@m#;CBJWEU7AH(`z)I>=Hu)N;_~a+uT#HhbpB|24aIx0F{db1EHk zc;#&F*(>_ZpiOn=hfF0dOmJ$2c6DY1+hF3vV7_+{HNgSw?doA)T7T{haH=Q$Ij%u8 zyS6xlcMJpZj^cC1(I!(loX#iD>?n^3oRaWL*<)ZdtuXb7*6kP@HX+4}FEs2Ef z(Gj}iaUTS(wz=VC6fnE~Vyi97ag(k?f7r$+s!$=RKkF_>O$} z4d(ZcdQ2?yv2`4Lm@mL;aae`OR#{Sm&a*qd(t@D$(vFr=L#%^N*O=Mat;nyPQ15zD zN3-ja!%*}_vsT$uoTPJDVbWezbq$)|HgSizpLW!#-&`US-xBXog?LPj?=AlQFV4K} zzo>?GMaR#q7@hj1z*?)Sv)-yo?r>AT@Hm^TF~(yhxCovLp{d+Tk^=rDwDNwthUn+B z{!mB!#wUN|8(#8FkI{-B;7z*;LcL5K@hmfg4{=mGoJ!$Zn8#9(!aUk^+C(ZNqtPda z;%Vy-H|Z&M!`a-CT-6r!xdj!IW;kq{;EHWP#me@^)?%xHu2jR(nkuoc=xpVwt&{_e zlt*bQ!@UyRE6M%h?2GZJD6KGfr64#tk5hfjjn^j!XWw2MG_{zN7N08;*HOU?u96>y z{};~wi7WV$Yk3Ft>^$uVy4p_E&~=XMcrra=2q?QNoV_`DvpT(}7#d)9XZ7EBtb%Nz z7yd$dctdslHYX63wXp;Y6+X;JCL=w0lh4vulx4&w1@jV%%Ha`GxrR z2YwlgE^5Fs6+S(TZ%It-NJZ?(MC`}|=PZt|rULp_U0O5LE?Xt-#gPssUW{WT&Y~@2 z46diyWA6ZN(o<-@mr>8|@Jk;#W9}PcE|P|M%n})M|2OIqfh$s=m}X$yS?bBZ7ZI(yZgWKw+|)o$p2j2_Sk#K z$g|gKw$}pu%b4>E_PWn;&^D9N(s9kR(+i5wJIYe|ufcj(_PVX@=zBex6*L%*JRU@A zuOYgG`rUeQEB)85f}f#3U&96P0Pg$>r282K{x>7R$5;{=9U)ZM6QR$i0{v!U<(KTV zJXB2zq1~6DZd!(_d^y-$6>xD)R)nd`oUQuQ>l;!SaIlz~hS@9tqm0){i<}hl)|HXq? zF^1I{zS7=NA$AY03C>G^%>FSiFSEeGde8_ zMO>6Kg9!N(h3y3l_L@_7*n+k@AD90a;%^TJnN~v+D~uwR2H$iD6^B@ArEjQ~UZMZ( zB^TH^X%d;HKX|k`nXf#V&|cv$iQ@&Z*JpacXs}VkVFz#8Ycbm>vmdixTH)N zp0G@4sfn1irkDY6lNG{-Q<3e-%7QKML|4;_YX$K= zXVj8YXY^=RPz(ME{tUjMI(r{S=y_b32ZFotXRZmZpiVoJO6@qDp+kecXq|9zwg|Sy zAKHWpX02ci*0ie}tPm_mD@7%@B)28l?Ax+Du0*R&s~xNpY{+|B1l!QMQu*u`9K^~B zV}g@dA7L)vvl36}HrA;-$Vv(4@P*z9K4R^>kIa^j4C>f&Lh*;D#J8PY%f~7W6|~A) zLtLWmsgL&4M(`VF!0DGUlW9AZ=o8FIz5(lg#X4tyI5UPOvsPImJvDqg4=X2@Vis^+ z=99Hy9&j(_0S`xAn8Dg*Hrw8(AAoINK!JG7)%b?H&WCp`1lL+J$0t{ax@u*7efFxD z{kXD|VcRy|-wh@{&+05s!Q8(=w)PC+q%e;>=%Q87^xDF;hf0Ww-Ga$+}>pRs6pE8yLSh)g%hz4n@=0kV1m;!jp)?v=*7T9@(NmblQL zRaK@qGa2pmrw%hC|2ka!In44W3{%HB9wH}#b7n&8E6Cb-WniPV9B)M%ho$zzBR!Nk zt&`+=aM=~`+Rd=@z4Cte?=e{M1vv9Pl&=@C^LMc8Z}9CXIJky8R$z5wH>z12B_Zly zaz|0ih_;p;oz2$X@;XXf0cI=OieVu(Tcaz+Rv5jm0Q>w(K1Zv|&3m$<(xpS4OUWlC zRN^ZUtQ{t!#RX*Bk@_2D;2pniW|&j zI!`t{js|RFl`Yf*SE2^aXAPDqR18O=<_sdIb|<^GqV`{poLh-HNO7k=mdVM@@u-og zxUKBk*eASrPw`ycB(tBR+5ekhGppg*_7Gln*r^yOjm!R0ir~sTmJR!5j%e9tj=p5{5<)$`(SUCyWY31otDDixQ75F_qgC zydyO&9S9{O@jM%&$zH#$7?q%M4$G-QWw|lm+!mhGg=TY{!5r5ZJl|8v33DCxvW`m0 zR`P_s()dxB!a10N{ktAH-p3E1mT&ypKm6)waGM5dk)8i%5yxQ*2^yo0*#FPMt|a9H!`Ke4!r+)9@7U#V#TRra8 zr3O`tYGqxpPXq2ZWZ#&5V~|iYZd;)3H>b7aQCn`?ux|}J>ELV~(fzwpHSXqAjr*|g z=d?ji-FOI2y5U^)(PYu_vN;>qK_=6?zNJ7)LOPppj>;d z+$L&N+nFu5o33A>Ws#5rfRz>d}F%T+n+Ww{bXohwq13R)hnRCcadCMs#EiL^<$lJP(gVN}&z z;0XJ_oQOhzYwm?5MxlWI!eRTB{_qa&_|%y@_mG})6P#hMhG1)8M_`=$LBHGSQ+Acu zX3O&&4m^oIHyZvrgg)344{QhUb1UkU_359L!6aot*Y>C=z?jI6LYAJU4Sc2xT1Vpm{ z_00CX&vNvWY25p7o6hrg&1t%`mc(3MXScH_SWc;pFjQI47ds~^vPNh5# zEuZu2i!y?Xq7@e9jFjS>lyzD~_7!OrU_%u+UzNFU?<@1T3R^YjwleI*ey$qN*_vZj z;!QQqZB^nxHCRhcD#LX-!_Nd#&h}pr|*~7Tm#R%F% zJIFH!c(jYSzKzFQ8JC+GQR~>Ra2V+dJUR;*)6@CfiL^0}XT(-@d&5vW6Ej*7Q5q3- zY7mXe5TR_>X-;Qs*dFnutcDa$6Q~show4v8?)u*tcnY_>i#Oteb%xk^gc$mtJA5^n zz&>ZTI%D(Mk>r8_oZrs)*llNQJ+49x=X#dlO6TY5XC;QGrOziN_S=pL(F&prM>@Ke z?ZkiPaM&woUuV#T57E!<)l}?x9E<6{Gx1K0r8+$jmC#-v#jZ~`Wu>q>R9DNP2^XgR zkrU@cM%E2W#*EJhYSp%E5#!A5_({e3Et=^QnvLhLqGO&x-8_!oxet`Lon~vlYtVI9 zFqd%&wH6!a&%XD7o}3Y9NKVjael+l+V9?SisnuaGjW`djI3w-wg?6ES-xu|Km@`j%g5&U*&pBL9 zyx8dYJ8W0g8I;tkRQzl|$4fNRZ^WG#YDAW)IJr3m5h@Egw-C9!B4evQqp2;qzPl6Q zrV{byGgj82Y8=LmaEYycV{5KMrFe1M#;AS+OROx+B?X1To#tIa}!8Cs?KZ z9tw*+-&z+ucz{xaeG0=2YdHE>Z_tuGpL!WccNgCCb8yQC@XSwePOm7VOxfP{EYwE} z!>=pCVe7$e+ry0ek6ixHfG%8f4q~KUq98Yi<`%t{gp{$b;<~W7pf|ujS3BZlwk|Tc+Pe? zhp`WHnuqtXxEgg{yUBc}!pgRGbw^?eBmu{8Y zGQ;y9c->w}@dw*i=Rd!Eqi*~e%=(f2TiR=y{oh|+;#_{>xR)P*^lven;07}Zt}*k# z_A;M_0~~`19KgxBopZB}wwyMfHF2iV#vf^+MHa0q3uZ;!*(LS6Up0;do{O z=rdp7`w!>^r$7r^n8C4-+&_*?-;;RRlzd(uM3o!YR#GCY04DtdMth0-;VND%l09PWC!Yo2hXxcl<7sSVMX! zqoo()rZqZ1U8+pwX@zMy9M?+<_+A`Fp+YRNYfJyAa(ra0zM%GDS6gnv4=)l&jxoM> zGtxIP>et}GUP4ruPL!B{QZNceIoO%S-T}p+HI9;|RCepLR#!DzIk;y@W=j=jO~Aa& z+sf|D*Rto7rDlF;GThqygdUfHS@tTp;YAfe?^@M+)ZWIhs#USpb1G5GK7qw$2^sy9+g=< z<_MYRc_uOsO@^ch@kXH}Qb?pI6dDjxl+q+`)OTHLKl*;_ckg}9KIiPShx=alTL1N5 zYlBx52el{*N2fAU3#oIVF07XZMDknU4Y$P~evG`gZZOJwk>5S!!btSp6X>}aq2(5E zzDqgpRm6$bgOY3^HuNzOD0SLVVnQdmUcZr4_7Cx(%<$G^#pFSYsl)Ch4pfymP+hKi zV`6-*i2@n9?oR}0BzDXca=hjfC0RjqW!&n|aVJ*p)F_$VI_C*=E47DPU zswFzAJ34AKKFTcg(-J%v>rQ=wHFtza!0+Tg$ppKF*{=+<^}Wp0&CyRinW4u~RpL2% z<9|axeFFFJJ9_HhAon@YPu75_8v3avJ-aU$_9PJP=kdf>(f8j2|FQ=3(Le?-1v$SS z9hDc4ym(Ygt-(`7e7aLpv{XB=xt_3Y29iZFhA}sVkv9{W4gX^fp6B!A8!QUVwT!X4 zoaaATtLjzSDtyz`ykCt@vu@PueDYf47cD1C;T599OZn|$xIB(*$M$^u*x6{pX)LF* zoXo#X2pNZ#92GJQjX5M_ApUND@|S!vRKE;8IKpnMyK$`DV5M|ni|C{HV`ub()uN8Wm*j;(C;TCr}t>b3Uq7 zL?kj0$^J8t#gpjzZ>Z+=IT*)I;tCtdOnMFd@-lw)b7+_eWNHoNF7zbJs4ZHi0WpGF zpd{r%d5hpZXNRkh8Eo+!p7Kd%n*E@Q?~@(27Rzc0{>QV}OJk#IN^iUhed32<>ej+G zx(hq5NHAxzV-tzx|BYXGnz`)|w%s)KqNOd$Dn=(`V&GmqlY0$3ia1e0wXsITx05HvC`nj;^GS zXA0(ChJXHqBl&y8(tieFI*BEI6pTOd6O4lHifpDWpq!hS+c!jZqSn0Gu*<^2Ux1}Q zmr*qfYhY^Vze&LW9R-3lj4?L|ZP=G(A4EILS}&bhc4Az13Tcm~Y|FNG!6fa#x?@Cd zA7$Br49yO_Zy%p^Wa)1@(;kQS))g(=4ZKy$qzC_EthX<0xc*ov{jlu%689g-$d{Em zmi2g!XM9A0$Kc0|$9I{`aw=CP4C!cjgRwNJWoHr+Touft=UQ%64Q`0rYt zLT9!pT|;{C?cSVcAI_@}mYA%+L9}6<>1fVW-tD+Jn;9JKOuRQE!}FMz7BV~eTm-eA z9NcxpgExX(zsKF(&OJ8fb0DHSN4Wpr(GN}&A^II(OiwHWv7O7X-^?<-fj(qk%1f^* zgdbJ}YpysxSXs2?U08LM(!DSJExjtSo4V-GRPah8Ko5cE)DK_kVc22~z*(BGY>aQ! zkk|FY$7;m)8pSso@XPw~+f?>)KNh2&S>mnLU|o%WsTxw5|E+}FMKk79j+k|M=IwGE zm&aBXZy{MH@5}L7c|J{HnZlSc1Fs_ctHK^@gqL_P|75&7l_M~6RUiMOF=MU;USDhG zgSL#r$Cwq2IQM2;8euk0JqBjwlgKni?(B$lzmOhTUV)e66FAp0!q#S@zjS`{fXfBW2PF&yCJl}yc-A}+@Gb-N$taDeff4zq$}U=f^=dZ#>9=8wFdWZ z&ObHezv^LsIM3a~F;qs%6X7mJRI^xQY!ry><{U&jeZK8gL_RZs98;c=4Cp`7vnphy zACLI<*D)*Z=gNEvg1n1}!%nW&R@!^8h~EKAeg`z!OcJlCNMC{giUf)YE)6VV1y_F= z*MAB4#UhZ5MCNm6<|0<*dMYr!ncTUla8rG<<~T$|au|rnKP$yPk^9bi>H;dfu~V7^3C_@v+CXpbKm<-ee({@|MZ8M^5&P%KCFrHpBx-z+wo zm8TVMn-5*bZZ zw^1xdlX;i4u~?^LqME>Hd|_XWOMmYZ2S>#xqu7@G#(j)oUt`(ta6Yw4+)(~uDE~H? zHZY`bXp%l0n~|hm9J97>=g>FpI18WV;CXp|jp5E1Yp=(-*MTKd6J(`w@L}#mla=5q z72sOkjJ~)D>?Ipl@(SuBWI$J(Cu`;Ru$hmeE5AlN>_szdM<;AV1FS~Rnz^!oduQ&| z1V-@??yLxB2W;p^(Cw*M(KYBDcM>D9-{hbtUB+lNi~kqqmgCG&2V#_($6`MJGWzoz z{P`r`YB+XtPsV0@=I>_MBK4T#tx;DtqDf}+`E;KvL7e}==J^$0@D!Gixk#TPqU9T~ zm{x;gzXF2zLSW=Gu?(NU`WueDXVkwJ)>}tBPJMo>!rYG^S_2fZLezUJ3=hECw$~x@ zN;AL)IEyFyBOdKH@Gd`x`}kpSE7#-suY~cr1ZKb-kiRL&D177r_{-M8YX>LZ=P*8S zp*C#p3S^a(z`rkm4{r4qYq?wkKmHHutDGhqAUnN-SDXc3a)nKUCb4{zdo%NUZmH)K}2Xf`B(=c zBJdk}^fF=rH`C+q0K2Nl+?9$ZG{dYX^V~Q_i?u12fa1T2A8MuI{jgrXXT1H1KFfmD zkrRZhU|1SenBUb{jYCU4#)$778bN;247}gDfjhiHKFI4Z|2Bd?e1M<)DQti*z~jEf zcRm9n|1YpoDcEw9vSzr3m~{^DyWF67K3!doQaQZw6!-#FVJFqbPnQiOGb!ODwS_&D z@QwPUqZNb6P8mh*k@3_*m;{zE14QBJz!&C#way1|SP1s8I32xM3L>!rMB+7?NX4rl z7yo6s3QS`auUsx+`!bf+Sg^v$LiRDA%FEBierJMATJ2;!G7|3laE@aT+@~HKR|k+3 z*-Q;V8t&)l#TP14jin^#R*>_&83g89qVyS{ft}?_oC2-&s*S zZ@55&UR&!7_T{O_{yR$6?IC8d1KjU@$gcE!)}7!HTM;eQ4amBP-LJ!{dLw$tQtT?D z_%AX;E&!LBgT{RtD{3Zo@D!rCPtd2djE7=F871w371fcLPiyAgmgwSU*w_t;FV_op zt8wX+z&1oT3P+6~s|Hz(Bnv(FKg2=BIex}QIEkfj7%$;7`u0a?>TO^h@8SooqtCCT z=P$+fcmb>G8Elbhcuteh+)o7VVI*i+MAwW4$@8^NP?x|!+Ocd+&Zd0iRxDeFz0-ni zHpiH8x>o3YeYQstqe*7o_F@lxSc<3&W$z>49#~m^Y*ZDR%rVTugPY3?;yj|gw+wkD z>_2M^y~#-3i2t^k@wx--<`e9r{djU;vDAmsr}}|&{u%F0-|crSBR!t~g>7^xwK+0| zb(Do!Oa}3_SV-BZOOunPEqW8nn;7>uV=3juVk*eGAg>BC{}sd=x}9ZFuKDc|k1mQ0 zC4-Iq=#NDpKEL=Gdty)B3YJ??S8z#ct*lPFCFRZpJAK}5sP&Y@tAwHSRkmmFpc?V6I z&y_T`w4z6~;Z9@dQ)DLU`?%yyN5D#-4_2aneVO1*k(PUEG!_n7_bGjQ1TaELRLz)s-K@Xv9#9&Ks zRlUAm^THr`h3M_KaX)TFyhk^3k8&c}5o=>zhiLU)4c>P-7Vu@r<-|fWVHM-_;`!Pa z{-j@=jsEc?W8_CX4n6Xtj1;}Gh76G{!^|e1it~C=Xx>)y7+>jy+Tb5f3Sc zKVi;IF+7aI!IQZapCb?6NKQPF>+x3P(#WcjVRHp*(VNA5ZUdH;ef7e&WXIc2x zm3+tCf~&B!u4YeGbQVhzO}d4>=f$VV$Nw20EW*E+#8(orNeO(WQo46zB;P2#n39N+ zJc!1iMa@A%(-5_Q&ylc>n0$$@jCG$HA%mw6quh+}1}T54MOfYvm78h_AQO>;qQ=b_0Kgg5m98e=i{Xj$ku z^9oiI+f?gq2=0gaccS^N$ATjyXQmA!vlaVFi&5Q}{mM8>MI2eOmBhZQb1W6nC}lV< zeZ8U_shZ4jBTvAwB1=sEOlC%i<3n7_GZy<2sXD=^IK-Ivf-7^75wS0-Y3yKBY-JwN zOMN?dG;6rduQDo}O%`(x5;lz)C{u|oKf(PQ8{=Xq_um|n?(~dK^pkc-8oj6~y-Ac( zw6O+#O)28$+AG@=5S&(QDCRxjIk5)Oi+!cpe_j3qK!VmY~eh%ksbAMAjW$mBj6yhvqMA;jP)NShIWG3=nusF zMUVfY$;YsoW@fHaq64l&b7V)XS9mMqK0hP=cE)@$#(GI`*s|ccRzs`FD8HXE{t)-1 zA+vW{jOxzZF)@sxF?PM5GZ=f%25VqR#7$&VS#`sB${za4SM;3kLc==qW@6M_$GmzA zI=m>ly&~HFUdD&jJ=!8Yv3O*OO~wnglEUJ!n%=;kdJn{JH`bOF-G3qn=RA@bANK~V zwLDnZMacf4>6!0?)4<#oV&?t#@e02vEi5;OY+|_qmcH#R@*39hY8|hvBD9{fdlUA)xjQRqD`?AkWz9dUAucA{ z=q2j@EhIO>r~b`@oiQh#6*(iS|4k+yI+p4~;uu5lRtAEanBmhE>43Ban`n+l(+DQB zxP%yHC9*Nh&M5+ZnIAmD%J_Y7dIh9u|6A;^%4bp^~R&*9XzCuFU-~gKE=iv8)chQH^+e74k1D(o*0L zRixrfCF1ZYtjp8NQBTe+h!oc4c~_p#D)728uPY*zXjNI(U@tY1yAgA8Q>hY=iqxZ? zjn9i{#L;*>E#lZZ5ZCWSWUL#<+lS*$qG3ZK0yma(n}q(HhG#yVbGDlPyvVD32`_y) zVg&O|;$RzygBb;rv-Dv^JFP==0N?#<^w~FPGHb~sl~&J_ADIz+=t`^{Yfa_izTAr3 zhRsq8i>XvZoob-HtOuoSBKq1AYovWxAy#1>%Do>KGtpDn3D0A>EoHV^i#4z*{D|Gy z0LEKn1D;|AJPT_$0~+gU@U9z~<7*{5ERkqL%;BMtrzB#EJPU{x7P4?5k5q#~9u1K~mfDZ*7TJn90|MBQT$@C2LX1ro3vxT12BU@0#(h z3F}6@YCvm*nD-|$z9Gv8`Bf@g>hbMVwmitWJ%A_v0IxjLIyA9O&)jNLHMt5_n@T~a zi2arh#!(U(Da;ki$CbNqPtGDXZ=iG^p z!D+Ujb=D)sKUTrMTmt?%4}aX}k2v?}g%2l+Aqv_Ji%XA4-$s9`4)c|0sB_mvo2nr8 z-z|vN)b;e3toYuU(Mp%Xy*!8KsRycd`aW#RL-?m(U}akQXHWR9a_#iUH`5b0U`?&Z znp%go`UdgJ*XX16(555Pa(X z^m}dZK3G~tOS>Ru4r`^i2_L;BBjpk1_$JKt#(wKD??1p8G6Gu*jp&%FNrXeqXbyl? zSrwVT@_&mXdMkPj@`8cwfyDEd{&h`)!?7RtShrtj9$xn)=TnuN^^{QO{F;U5*+&- z(Tva+{I}g6)>fgoGG3#?oV7kz0lr(1^De}hC)d#PPon!p*`uu_|4@>DDosny-OTXh zc(mC(SEJ|2xyYwBVsGp}mD$a>zY+gtEXCmULanyd8c(eQO)I<;eWVMm7p-sf8kz5d zVO|+qA09TJm7k4Xjbk|mi+(KLnR((*u%5_r5^J;1_1Wx?$@=0JKi6vXHxv22{=j&e zF}(5o!?@_Tqwx=|Mxlpjjp{+PfxI5TasWp(klt+55*0x*2VE9G&uGcfcVnBjYO>AG zlTjevG=Sf@FSFSPv){q|>oES!GaJS6**rqC;3r`*OvcKcik)k&`csU$XM!2z7&K>n zKBMy`Jj|sunM01)*O*mS6A4+%SY8))h&J)&U>tnFNdFMeX%|atfbYSd+KcQ9Y)-^M z-QYZQ5L@OebcIVJEXVM`jv^uy$3eMd4jjWbI~uP}uvCs?Zy&{PJre8WJKv^%&pZgX zB$30T;n!)OAEy2P_m8vPy?jeMfzFbxa02b6FYNMX+OKT;nb^-6UYTR_dw7f@D(3@R z!7any&xi&zTUhKR3nC*uYxtWvSmtD26=%B{U(_n+w}ls-_|ZiJM>FF?zCroGgG4*4 z2J4_2^KUgY@!hn0u?xk$Qt`1LrZqxKn`zSwo3R;4lpeAcWP)i~h1sf%og(|BEBalZ zqaS%x16U3Lbsf%f6w9&1HOI4@2r6rgdursgOvfvkfp0Pke(N*L8s^w2X4ou3mNJ_x zXK9X&bsJZaL9+@J*gEFMLEoWmChoR1;sx&#hkKt4S*ytHWM~RZi6aTT1|MEZI3?zCjDD-NqlGiyh^ATP_ zmf&M8#$H*7x-4r}0@D?^*>8={+;jk|33$mg0$x zxx0D-GEI_9t5oj&ee?qJvcx-#U5k}gq|cNOPeIJJXyArs4dtP)t zYJW9P%$nXm)63=Nm__C&+|L;O6vSgEBX=94I6*tsfF!+&IP%4(7orK~AZDD*Vm4N9 zBvmxjZzItvBHU^;bgVhX%;UJt@G_`W;2MQ)1`E~h?#?lH#)PEV{D`C|53_5N8HMF&ixHn+h ztc`J>aBj@x+<+E%E0*u@sWBquZN})^$R>XI9-nVa-{#m|$JV#fKX(smkR-OWiFX@$ z_jYV?ul~olt`yc)V;C1<&UwlwtF z%c0v|;0nwSjW-`H@f>>4T*Ikcvnh!APv)eKMn<3^hN2M$5xwe-Z`2iCD{g7jz`P~1 z{OU)9!kC3|jOuvx6}Z=B@vw>qK6x9cs))Y5B`durGZwYDee#?OIR_&3Mtbb4`3B{alR8$&8nAjGU1%qO<^dVh=nXT*7vEin4W@B2BP^>tjF3 zpR_uud483#waoR?>Mb2MY9Z`aF@jq_32qFwP&Pc%tRQV7@jhqZf8^d!EFH|?45-16 z$VuYT-{RpO0lBln(PvTNV;3Iqb}+to@rK_<)`0z48F?va<%=wz2dA75T4)s_*`*?h zV_=)gb{&lO-5(#kH|Rlk{Bqg5vLIUFvo`}Xs2>>+W)#)N%dZ)DL4~L%dna-AlCbuR zMP5WfGOh9d31C7&bF8~rWEU{qMbQ?MUrK>g2yEudVnqK|r9PX`E zb2H&@XJIMdC@Vhrb%?0!4IqCv;+^MVou6fXJofz5i7ph#;2ofYB?GlBfmdHT*j?rD z@>9SLtMbk#XIk~A8oqxGP=FeNh*Sp?s17zzmHea1Up@^zw6}|GT+TJA+HLC9FC%u$ooNPxk6kuC}p$bFrV{9>|!S21YcAyD}E*auoMx zB=gb`bftGp-ehlPEA6N5Xw4+@qweg$oYn@rwH52uF~_xHj!R>%v$mCSAjOzci)b#b zd-X`PR;-(cJc1RKv?gIuSsklB+v=m0%~&^cy#cm#5=Xiis}-Y{5qNjZ!0KzCZ(>|p z#$Y)_Ojb+Fy4=O-rG;rm#quDzvA1LsJMU+uADe-3IbsA}p5l2tg>%>re}*;jBi_Uh z*cPYI@ZT~LjN~6-TpYp{GyWuQ@)`b;6~6bP_vJIw{h<=qvuJ0uK`edAqd6Yk3ImrXpYf73Hl;Xu4TIwtBt06_pWA6)^heKRX5DFq4?Emo{JEf7coAwt|H z8F$xnU3u?$A5Ks2KKJwf&ijq|e~8SUz1O9rvH|MuL?i|EYi4&)*&Q-=+8e%-KKx=iluI|NnQ#{ik%|d;eX2 z|GUrQ`~UR%r}X~cc<-N%{ZH@xC;9rnvCTiF;lua-C$acZeSEn8504v4(}(FN6aEVY){On9{_9iZ|Lr^q9V2wy zP+CIi`!Hv|;D7N3|Ji?S>HFWJ6WT8xCv?nE8bbLDrS-$SQ3?OK4?h>$S7_gOtkCPj zyoU1mVY)xep(pt7eYjod^P&CycliyaFO=pFb4ero_deV{w2#m}|6QI#X$qw=l;#if z@$Yl{zrXY0XF~f4?H7*|dWB++@eiddl+IAPLwWfy*L1?a_u+P-&xZCD+BY66RKG9{ zq4Z$dLg~bGhw>51ojdqnT)}@9+A{Rn(7tfLc#KfI@z|J#Pz*4Qq4Z+xE*efpTo~%q(U*k z{bSzom>By|o-tjR*HAt&XBJ=vCSU{xp#L}UJ=_Mj#n0epF%B4mP~JbxH^v;}k9o#& z`D=bddBr>mf#?Hbg7|~KL=Erbc9{QA-apKDsN6ryH`YN+50*)&d@;TMF3-B)f6)fD z|LTYzsEk8-#(ahW$-hVme-Gcs?Lu+Ec!gqt zbs$v!7zd0u#vNZ+_Wv#pe^>rkzJK*$dE;j=h9A~t`5vnISnvN@_dl%n_}LHZ0A5cp zuA%(@Q@#Id`D4C9`3=>9P+5n5;{OqDhw=FE90O7_s>uTsc$9!OZLV5nXdjDbmaeIu_-oy0N)Rl|36*xL+3wUcRsx4VfwIau>NB?h3WvtBXk|WxP)SZ z`TT2sL+3Z{2lp3(^&YQxm~VWA$~kns$8y6we|T>TvIK12Dzykpui-&mel#W0fp*-Tx(EUF2Km2?MUOOUc>O(gXN6dVLC$B zwNP2(-zfAq<`3&L{=_(7ov-?r>R@%l-?&fQUJ3C1(Dg3Vmcjhv`HykN7~@aOGo}f* z!L}Wy5z`bZH%xyVNCcRFd>`{1IxnIKQ4R0o&sc!@#InWxVw~`N!1qG2!Fm;nJsuN( z57mAA9n*qkfN8_B#(II}g>@OzkNGbLn0I_1;s5YGtOpn)j2p%j_kr*|ye@>^$IoLN zFdtZ+p|s=YFm{-JtmBw2OfSX-(}i^c^MiG^3}D^DJZ6ATKqG+rs08@{x50R|2TcL) z7whaR@ETxRv7Y14Vu0zxZLt1e95Ln?XUywc@E*Ja_}M&A3NS8M&oI6CS&Rp!xfSRN z@c)=ztRp{xufa`#=^hErgWo_ia5{K8xCX2R7Xj|$C$IrvTCNAL2gife0Iv<>K|g@y z^(OeHAP0T;S{(7mI5rp zU0^S`2KIsBAQiL$x4>G$+J=jnmY^kk3$Sdl4Eutw!32QifY*+lU>zs~9SI#9w%B=%6T#F_pSK0K1wRA3!FIxSf|MvF9wr=aIPR6; zm7qOf4_pHMgZ&%oLK-2hVZYA_&k4x@Ki3lAc3%d+47MP&AWR2XZdlJQ1uq4^0a*ac z{SIhNXiXRf76lgt%K~MA*kEjM0yqlr{2T(d0wGaIB!MJC5&`3d^;19;5T}6O3BMEY zGy4Mj0(ktLgq?&r#5u$k0QZggJpr(OVOoxX>)<$;3Gh6?^BaFZ4VD9}D|nntfNASV z=t+18UVyK_&%vLANdV)ri?EBJ2aiEJa65Rr;d-^7upc68YWRO=LTAFs;K|@5uob)j zSg)3W&7cdwa|5p{O8_1V>*=T921qBS6E71kHBe&p&+R2Z1hAa3KH<57|HrzE^-c(s0cD_duywCE!IEHEYF%nwsa>h`m*UuU6wA3T2HP2nej7YV&ufgak1lK@5t`R zekT4*)Ys~3kK`Q5>F~V6^SBprFD`@pm-#PW6ul@)b|<^JQQWA7%@#Jh(dtGkA4qAF z(q=*P1$65%QG)4pI1Jg@M6M?jGT-dS-Gs-YOz}OQuk8zd_BL9ppW1@^*mK&R2e4}Oehfl zDgN{J^V`p-=1tApSG=!yM$wF-ZaLj@+W*=9&r9Gy&Viiqh2sm^@7eDc#o>d9ZoVtTXGzmyR#J{PyzOzBzq!Ze-ucp800x zo2R8uOV3-+Th9p22wJDMPTkXbPiuL5dHZf{yR{`WCp5p5bSY_9*sib|at(QY{%!lWUEO?j^Pw3-GX{V!nt#!}s7+Cu-@%S%JDOcfzn1O* zgPRX--lkofcJ11>YkM#4URtrFSi+<5C>OjJyl;GOd?%8vKK zCL%y?Ol~ZVm&QNkJ>})vbM5CV&Q~mdyZr6a*Gpg9UfEtf%zc=9rT9v5xH??@-0|G; zH1ISq9UQbDv|p{eTDPuXUBQs7Az2%qZ+N~mYiZV<>^s@K9A3^BufBMd@*?F$3!r+X zdetVkP42fj-{x%0+L(3X`HAQAvgT#o%DCIGlQA2H*Ig) zvV>&`59JT#Uapthj^2(g0)^Z{?qkJcMcYPg8*Oa1vDy7r_ggVQpn0JAByg+6trinn zO=#5z>~68UMW^PSnjZmUTaImcq1A;}6I)Dd(IdS_`i=o8i_%n{*;_%i9sq`Mh+GoCho+Prtm-Ys9Yc-bNe z^afcV52S#x&Br!R1cyO3ur;+cy`6qLePhDLguUT=!}w{1@P{=&@*$Y?90z zVU8$>E{KkZiHPYF*(Wj}2}nd75od95ad4Vtnq_+Z^!mDrx(aS7w{%6xijsn|g0k_| zhCyJ(xLnyPwK_o%*5e4#iaFC*{l>$9&}S*)xlFQ2?zleH#m(5peO z3}EW(sjr^^CnyDL!7@;pU77vt?X$OC-gkK)Ruxt?Ks7+sP2Ww=GO~=P^{4d=4MSs6 znv^LuDK**E+12fo?UcJTyEG&#$qLC0q_fglo-j|?y~ul!1+fLOTjRFI?T^_XLyjaz zwvo4yZ?O`5-{zbRf5v9ZDizc>HA`HN;Rn)LyAEnNrd zo76X%3IdsdOkIX9gPcxIf0Fbh$sg^Ho+O_n-zMHBo+z9sECX%B+J-4)0A4*ovMgCP zRWwzU&&p@n33ft9M@Pp&-9g<#Ibfcl#HdL^g<{j&RI*MQ?W$8&n*_Q-vX-aLQP z?OnHb*NUzcEiPYN-l(=w?Pk?xm0e@kOx8};j@FFUl&DHn{(67?dewSWo+eKdZHzW< zwr{pS^#j^dS_(gfkJq&?!oLXL6uBw#23Q}lK0>F^DYE6+@>gJd`1tUwsH~`m@ekvZ zQ<77DYW!2Bv;od0&L$P$0ayaU!NtsrnU^vyW%N()pWd`l(?+#% zwQ>6*_eFjo|3dz|mq0#|N-Y#I)m^B;q8}(bwTg@yd%Xz|o!oPyDf^w5}la* zlZMH|&U&l^8){3hc~#<0v`nY+Lh zkPoO$s7)lGG_y2wB=|n#`;3Uj5smMq-b)>oJSurg{FL}b(Tk$};r{T?<)6#9NViDO zNzO?cgPCD7!%9RYqOO9jf*&|PaPHIZ(-TMur0%}%zN?O_jz7(RnlI@u={IXOYo@5C zsIYBAs3X)FY7MoUYBtpzt~y*rsi0KoN^~Xfiry9VF6dqG&AV^jwaIIf*YRz~x3k{N zdUHSber`)pnNyjg1pRaS=Mvr!-snKDyk2>8^XKM&RrFO6qm)s4pyEKq#p;XIVx?I5 zrtVE$k}63xS3Os4)mSz7fjDEFG1Zc4Y2#?)=;iI@ttHeF=F;ZU7P1$zZ}D&O8;Ki< zpGuxeewY0&8>kqlI30dE9GVXiEu&gS$zo(NXX4Jp?M>X9IK0vDMtf5Cqz*|RlK!Ca zgT^%(H5pekuVzLziEI)Bo@YMKOb3%QCTC1*JgqS_wbKJBffS7Au!La=ePjE^u8vwA zC5wi;E`^)QOl1zB44_~;ccXiwd%117&0%yH zGj*A|9_k+Ig!+W~@0H&xo7Fa}CDssYo>o1rO0P_>beFlyx|Vb;8Cx{A=xqMk{4sfB z^7g*j`({e+l-$=juN&$lA(xQ54zz#M{!Pl;l((buM&%X0D|~mX;8?+>qDw{m5`M|! zvd3jVSN>eNsAf@3ow82ptasKItBci-w2!pU^w0Fzxjth#V<9*Qju=mjr#Mg?s3X^r ztqd#UH1{<3u<)?(XxP!PY-zT1hkS>;X?WA{#}SVsx<_@7DvU0S{w?;mSY`q<;X=}d zq`oPAQ?{mUO>5t{edFF4y)y~`Gn1J~1X&qb8B@T$#`hXONq>^QAZ z_J?kJZ+k^fku%$pZAmev7+dIC=-#Q{sk7>{>MNC%N?VPs##iO5(pBgxZk63C8(T8A z#9QPodRg$YfRInfzngbA&-vE*_8?ddc7hwA2BhSrdw&Gmn%|4=KnN-f90F-$g1HVLglYja0)$6NPXce%gZA5V%W zjiZgD4Py;sRdOr27J)^8_lg&i7m_Slmh6$@k>X9nn+Rq!GkQ$ynAl(Ae~s5C>JzQW z*5uPEr&G+S=G6SO{Im(_6VlIsn_xc}2sCM$v?<`1)L&Bfr0huvCI^#siMqtK@oVE< zF|L?JQH!Ez5wwWw^6T<%q~Az;h4l&x2m``Z{8jwhoZFnAm_IR7X{ofXq^=}xfE&Ox z*Vt?9Q!G;~gN=iY$8^VZ-89`a?N#kn{al2w#d zR9aA4@J0R?`5oSMc(*!lbzU?OfziMK&c8eVZeISp{ALBs3KWHk!pTLGi&BeIi~E=M zFFjg*wA@kYs2o`{vgVocnX<8}v1+4cqsE{!=++q57zbJgS|-{j+V8pUx#s%j`eqYm z6IM}HQKmAcGMsEDJCmQur;4beufo0xTPIy79Vs6vPY+KIPmN5CoD@AN`dRF=*d_^0 z5|$<{O*E^eocHvY)0(WsH;(MX^prozb&6Foh@w_)-KE-GziD?$MV1Be9M{4oXiZPh0#`# zR*{YejtBO7_Ige`PCGbOj#Y2e8~f<{=-FDfmZGMpS@o=Xnv$lpR9mXCjkvXZYx!rT zpOwms<;6{lnigFzxL$BG|7Ly@fP*6eAkCNN4*@U0*9Bh}3@98>*r%vZ(T4XM-Zw63 zT+*eiOWCQ4Qx$2|Y1LvMgDaoA#UbDp!?joNt^D z#|)?xD&-OV5j};S!j9#|@~#N32<#%eNGg#^TFP3=hAW0ERz$3bI2&~~sywDVh9A$5 z7bl7nA0$0Uf}yQOMPNkAh?IliHpl^m;4YX7{%G_^qrBw2SDt=V*sN_l6lQMsWzhZFp;OaBA zXKL%~>gyP4hFYW*X`}Vg`o6}##%tzl=2^B`wiV75&KggRXG35^;8W74BsEn{9l;#I z{EG7xr#Zhlf1hxl@V5B2_@3mR^Km%4eVna5i!_+7Bq8adP8i82U=W{@01P6LCMp{17uJYETp_f)(*x z{#?FSx>vd&Y(ZFmQGbzCAQk+|{gumLGuS)^kMWH1jPfb*Q{qYgNk8Ai_x$4c#j)MG z-TK`0+%(uQ*buG@*I`?mq#~*8O1rY8rljUp)vc;y6~`)0m7OZ9Dyb@&Q9Psgv-h99 z|EB1hB3GfS@G95~4uHFWUPLeY0gQY<^8KpfRmFr-LMiqc3>Aio%<9bQ6}2mBAJjdl z)2g&8qL!$IAp?D;G1Iuryv)qDv26y2!4c<)^KAET_eT&Th{q|%DIU6qE?^7T`P_VN zUqN5NYSC)Z=CI9SYou$W%jC=C--Le?zBY1g>~q&?o2Hz*e71SiwB&LDPgvvwgFD$AZU#b)-5{0xf~og4u%UWqaB4c=LF>1iJ)FL`y_1 z!&-)6zvZm#tZbQLnPOzb$cWZat)slr-stVI+hZ%^D&wl-tK)Yi>`HKg=)~wm3D72J z6MhEWz;E%t#oOX+aoSjI?4FoCF_tJxlsHlx$qVO&dt@G&R-%;{#0D`@L=?#cGC?FS zlILc-*@u{in0A_-#-uPQ^@MuDS^ru8JkLDOSm#*hHrqBE*TS`w7)y*wy;2{h3)A(} z^wWH+`c`$g?rP!1e z`!v@yS6^>m@9eMVuf>kkm`-rFZ3b z9N99uW%QGnCo#M@UK~4~9e)QTCL|^d2NS^OAR4@he-l3voQyjecOv#g z?B_9`$NU`ibJW9#hY?p5R~7qZ`(@utzL#tjZxvq@UKAGc3;A}gooi$p*%z4?nThm7 z`cTSHN*`h$Vr(Eb;Pf~>7N^D8*xuNF&2r7M(X`QY)Ns^LtSiFuhdEP!roK>F zsASeMYll=1sm`j*s$5&Kwqi~Bn)2sm&&!4YF$k0fN||NMvSwg8u!5hh9ur zIbLRf8Hgvw6I)YSQyS45(My;m%pRN`oG*D_@&*Y831lLf=#BV|c$Z|C1jm9pC^{$v z5rT+Uk*^|0M~{xa5OX2sX6((_rEyE+9H2{lm-zAj@@f31@nmoy?m(P1)*8zI&~1+H zAJsogeitX?)5*9n%)iP{gt{ab;??0ZIhZN zH7BZ0RQ0XwTiK?fO~sexUzV4Ym6WXmqrq^n2wVpVNDCi+OPFr>$@Af8)M8d<_K$q^>h2@_Iu8I&bgkso?-rB{xO6xglXhy z@DssCQ68s2hs=9b@FxcUg5pMy%FAsEm2#d z)Y0l_S}ZNL0xXGJ5|f6}5ygsP zg;(a4g-gSwJ;Hi~eJlD_bWd53@(GKXX#lx89Nzfs+lSy%g8wY!}s(3k)BA; zNasjrp{>w%*mBr%%yi6@W5_Wm^a}l#+Ap=2)tA-kdUbttU3A^J+HtjatM69#sp?Y| zQ5jL$vZ7_h?(*H`O#uPe%j{)vN|tv9he1k3N`(awtB6&@tA|%>YBV($l^2y;>bKM{ zP%lvT*Y?*&>Lc})hDyU((^=C-%SOu{+a6nmqrx%UJ=={F9x1_;U@9q=<^8 z100S$97~EL#kB){z$ZWqupjUl*dDVzW>@sC=mAj!qFzP3ico|r!h6Yk$#EPFPV=!el8Vm8EZVmYy+ zz_(x}m;{o*gO~>~NuYmp|7aXz!LgR!;l0E6$oI%`%mBw)`-=ODaU8+KH}Tu@+VaM8 z#&d?ShOij$!ZH1aq=zJ&GpG4!{%)Rbo~zEQ&Pn!3_Mz6H)>Y~0@s;sw^VjCC)~?o$_Kx<2&V^33 zTkYQG+vl4aoEmITYESY|Jd_{kKhUx5WMCWE&$!RH3;7HAEFnvHLUcmZEv#D@Ofg8# z%g)P2Dn=@xIUPPQa$w|=s3lP&qDMr#z}T3vF}uJCuoFxKT(CKMb98Q0Zd74pVdRey zKSs0+ZyA1Eeq3&s+NIqk-6e;_hs187TR2)UT5y$jm8aooI98UG^?>n!@j2~t+9~oW zaxtNpzzVPe1HA*iPhC%4OB_oaGi)<#`z-q`8k5F^efzumyLy>UrkkRfqB*ZRukzG+ z>ZU2DDap0u+Vbl1YFvOa1yDhLWq#!gPz)GVjH)j{9#~(!zIt)Z;+m7SCu^B?%({d1 z2kX14yEcq{9@ZV!bue@=iD|<7{CVPeBCcT=;2Yq}b?3S_J2yMm z+Sl5zS+7~K{j}1w(quJQ4deCW_4l>+wK9!NvqZH-rLWW1ZC7qr&a9nTyS8R+O;L4G z^%M{Z9951g10YwEt2=^Iphr!QnxxvK+8)Xt%A<8h>!MZBsvGJX>VevU+G<_3ZmMCb zq0(5{&}MR5+?M;c`?d#;2M&Up;9l-s?u`ya2Vhu`u!y{fY@`~g%^A%Zcz+GB1MDN* zBiuNC9RGyigdk0nCVD7-D4rmhAn`~&(pBl5!Xo+x%kSrhzw(z#_f}9|y zH@i1`408;#3B3vZCFLch1E~Y)aPV-$IltSp+cVrX+%?QG%(2C`#b&S=EHlhA%vz(? zINdPaP^c@^eX9LbdqsUk-BQ(31yfLU_m%gRMYTn>jls2=Yc-QWOArehfq~#OXkOdA zHUL<4th#~q1M45D9;rUpe6A_emT9Nyr#0M<`kVTj?wRkIKe2vdt+mzK9y=a8%3Nix zmfn`$oBo@AT(?s}svr%d4y5j&@1XBt?qQB+k7oxs0nTdPYMzVlYUnq4L>|$Gunl1t zhxM}cvI2R5+^(=IO2SLRH%4rXAVv}+2Y?k|EBFqK03@(9Vrj(X@XO(66lWAuqDQW;c+#rnm1m)50SsadI!s-^1e`t17a zb=T|OD&Hzoz}4ETwbKF4pR@va-}(x?0>hNUl+rqBU08iseJ@on)j9P!b&@todqH4m%Ph+*Myt`f&c4px%h}7>-QC^2)VtK1@6Y%5A@m{KC*5zj&-bGD zqIY3-VG`Ly_8!h24vWX)E#NQUzZbk0^cMAQsH3eUtt5w~hov>L8d*Rdkk=?`6g$Ir zhI1ph5o5q+a2V_YGeH#iG5p7HtwO8t$$j#7vUjpo(p6H9gd^D^-Xi9Sc%nmsLjoL= zdBuIj9m5&J$zkQNpgYP;rYF;blpy67(l4YAgbsw~{^$M~-WlGO?w0Nr&KAy@_L=rv zYp!*qWu(PsvYB=pcN^0U>4y8d`?>+z0a~3}r~XOxlWI-+06kEv#Qyzelx4RjIC2_tN&#{;vC7*WA$DfNfr~nQWeFnQD1! zeQOr6E_B zt6QjDs7=x&Y1}GM@2<}Pd+PSoH3raKRlWi50FF_$t!rEN6X;Oip`NCqsYq&)8ivO; zxR2Mm*Sf}r#)gf?jm9!lnJLqfY1wGqX!Y1Uwq1^0j?u2su2G&*o{heZzQRCZpc%0l zaW#20`6Bfq^%wdt^aacXOd6ZUUc_0%dBJ_bg()BYJi$Ccjxa~qPTWrXW7v;jE{RLh zRMu41LEb?wPza#cb5S7+mxT`nv%z%G15m(^iXUMMfnuP1pnRNcoUF67v(y*n3;Rj@ zlen{}v#3l^CRoE?!%yL*@LqCWaz?O6u%9xYGKmZ#1Cl{gl9l8m#3RIR!EQl|&*FRN zdFZ+8y6e(8bdEvxLG~(Zm36aav!#={lNraIcNumW8tWVD|J44eou`?nX{m0hPF5wW z`q%fbzg%~@t|#CCm(rz#>7Tk(FdO86(e@&QMV(Ba zOmD+%!z^GGu=;TNa87VfaJ4)wueG4H;0NIkLbXUO!u1ZvCC4Sj(qgGrrj@;rzmU&U z%u`f?`0)7fPM|%A1l5Xa#RfnDL*zr`3uFsqII@s|FUevEF6j-h2}vCnv2bzOzm(im{M?sVN~&Q;Tg+Xe#JGH-2usV7g!;Tga9X))Cgu}?RRG>vqEa)R<3?Kc{(kLkhc!Ft4g#17|%bI0?>^G@(j@YMpfprfdx zXpeZ0SQ(}agC$4O_OkY}M0ujT2z;UV0`53x6gdEFn)28m9hbE#aaj-(^u8q+TW zUk0$P7ww7mbaZue?QraHi0xwgUF%)zQp-|HTXS18+$xNx45thO^#k?rG2IKz3(Zya zRrL$i3#fS#)$aP;^<97nkO0oNHv@}68Ca}Ztm>lfqVA;Wq`|)Ib=`Fx3@aKI8W$R~ zOj#y{MPV6l9dG@`_KS_~pgT4?H#*z8+qxsYk=_h{h9B4b;`#KN{F+=&EvMpK2=@65 zECZ`2rzd9fEwT$ z3G5HG1gB)DWR=oNDQ4<%*yFI};^pFaQM?HIVvG5U`I)>-o|$9j{L227J%KfWrDy0F zed&GaUs1oJ&L__&_a^oxN`jK0#;5U>d&(OglpN|D>MXVw+rPJcZ|i04WffUOmLgM; zX`gYQae!fffve~0vAy$J^ID^ZS1a(V>Q~iBkONwy$;LLDmxZ!f@!L*Tsxjo6pmmpp(v zfSN*2q31Ai7(H1%SqIn$*l#&+IaD5%*MZ-Gzf7=9fbDOu$SX<>OATuyX(Ne{MnLZ| zTRKQK2u4iL%F2Kf;5cVJz%`XKfl+FdehS7*#!LE#^$(MYW#X5@m%_z@#ezhBA|K~l zPjgOl=CJ3mQ&=gi=Zxo!F7z(+jns|QljM`+!^FcxTnj$iKiiLMLHD`$x%E!HbD?9Q z1N$oF)^h84%Xtg-2RoZOn{Yh+wf?pKjP8u?N9~W=N18_(0l+cM)&L*cs0O&EMgxRu zp?WmP1xqzcHAA#RwBvQ-b-VSu^)L-$Xk}_;`riD#`IY6Bg=(YP+S}XPv9Ffp%xY*e zLFhdXeGh%OHuWXpC83y9Oe&%jQLfUi(k3t_Fe;c8%+~DI>;;?!oMYT$+~>UKJUidc zPZlN%hlz%XmWY>#SB9+&nVg4RKZk%oG<6+ar3x`IEOgX*wfe1*U^+DhvP&z z_iIv{)awDB(@`J{#Dm^oE3ktNnhhFkE49_N)eX`Q(r+?sGQ2guHO86a%(E=BESId8 ztXiAamf^^7taPq)>Ro!*TF+X~r@l{p$${hmOq~%jNtvV!N(Mzl6VY<%xpbVrea(8! zl5u35&$*v-zvg|-JHov|IN^FE2lzzxNkbgx%I3o8=_L5; z6PZuylkNvN&(TlPPckWNQdoa+e{r}dT!i~u$6wbl9%AFzI5*fg*o#<;SlH*hMZZN) zp{3B~QRY#0l6H~~5DpOb1oi|D_zw84d#-zIE}LtdbDYy`H``CyPTA&K=UTg3x>^)w zh1m$NKMj8x&g#$VkLr%oxT-TH0Gvpe|5v0%Jjc@C8^7?t?^F(|ZFf)-Kjg z&`r=S(l65E^|;PhXKZY4Y@TbGYdLE@Yb~>t*}@!Qj?vE1&ik(WuFpK5d0bwXH`kx* ze-eBWd`Nsqyh*-E-c8+2#p_lPqlnR-)taqm6`(gxy8mMT5kH z#5i7p*U}pxQ<^DV4K4v3JG}{ZgQ37Cu|cnBj^tk0y|7AgrMN;=A$ll$DBLF4CK%2i z&X3{6@L(AR2k(PBSUXq)nFE~8g3W?G{5=}Z`8)1AZdl^y z%64Qsw%NDYr`V?0dRTi{Q!FVKx|wcP8kNRB41XAI>Tl{F=pN{_@WTG+L(N0Y4A2V1 zfCSJ5d<}3s>2vMpS_^ord#uB@!fV58gVX3VrkT^s<1FJW+pOEHcWifTuoTY@)4I+T zt`#nu+veWs-RT|bAL_?7&e6nZBArYpmrzP5J7_y-k&H;j8s-}2Q`S=!Oe?YlTmcvF z8U6YF8``7TemW#NB*OJ26T&8hF(eGhdVuTq*iyDM2H>?7ZXuE^fb)DfMvZlIzj(j+ zr0Apw$F3&{CJEB{>3kU4;NIul=j>qbU{7XEX2FtQW;MOKA)Yul)0W(pJe@e5xIVZ( zh;zwryl=dCpWo@)>B?|sICXZN{h95V4bMd!bKYRyU|wiiXqsT0U>s!_Wtgp>t;aPc z*dJX1QUH!^)&hJ{wN!08uo2*WXt!>+Zn%E9zMG+&VUTf7x0fxyDjs3A2US zI@vqfr#hxOb~<-Dvt8M)WKXi^C+|<*PyL@Ze9;4rjhrT(Ce5bIrpRbA+A;bux{u*w zv}Uzt4Py^uPv%VK%;L`CF61rbE$1)iuNABntQ4*k;@Zs&aR#)0a>bvAeI9lKsvbEyFDX&f~QLmvonO{ecjewPvjv*a43D4F=d}$36khO`kKI zGyG)y$#~Or(^O(EF_W!iYld2F3=W z3DE=IWkx9?>fCDj4M`5sSmbVHuz)hz2+}d>2dtN|9331uPUU6s{Jm7T_4c zAl@KeIyarm;;=YomYD@hl9<_yY{oVEHTqiGT3Rz|GwNOPU2-BRk+hhwn1J_Cx}WZ! z>7D5{x{dCmuA?r@*JQ_J$Cvgm?MrM+Y~NYGvu?3$vFtMMG9NJ=G2JxYG-?bQLs#%v z|5!g0U~F;i2hL}tgWg~{_yaUEG&4K~-x|L)jx_=ESo3_#d<*t(Pufn}uG+8KZ#ix` z?l|u_aqghpUG9dd9PeV^VxP@#^X~}m2zDTLAl8yF?v6i`( zxtz6}HH$rqjdf@scObV9uMe*)zbijekSU-DDZ*ReGtp0qQ_q+l9<8h;#b9Ir38FSk9XJ*O$VDH|SDU^QblV`eZi7*e{Fjsw9P zDH|zlGMhY)IFE?eds#phSngZy^Lc!pQ|?o4yw~HsX_8}-W1fAUeT8j>ZJl+Ub%SMt zWwUv+`Jm~b>Avy4kpdPN78vLNYVDF?3(Oa=w9eP;yL2cdbQqh{&9X2Jd1?SEa8~_8}b`+ zA8H@!5!w;jbNX}o8^#;P6Xp}ZuV~WTFzR|H{5Tyi+GE8Q}|Q(p9($|1i)_L zZdfrF5Ox!F6HNz;z&tPxU|*dJ9tj@_hk*Nn`vMYxEU)M_xxJ!D|*_79lr~8|doq>d*1!c-MH=ct*NMx(CC2 z&Lrm~=W@q##~%BhhI{^bc)sP5<&x!=`IZ@~I{mhqH&Xt*fo8ox7cTsAs5Whj)k9 z)|d0BKIXUds)T%6O!He5NSoPuk`WF#30pZTK(slm1WwSH)d`CfQlc#gY|yZ5^G zx_)y0!+4aEi=tC&DaO$fj!1O#!i3^@H&74_Si8Z8A-5G zDHD2^3ytr<2-66BM9uWn{M3BHa-!khzS_3hHs3zqKE^S|(cRhI*~Hbvh0l34_cZs6 z@{aPJ^qurE0*nCmKd3}1aV=>rNl(_3J5oDRXVGTSmeZFvocCjyW0{>vXczG zG`+LhRqfKcwQio5=k4d~=fkxv(x5bm&$&`a6w)m6Eb?v2Z3;9as6kqg=B0b-b&NX3 zbLMmAS=L$BCiW)wEY2)WA8sEmwjHa$X8vYAj+d?h*&qnyLb)&s@BnuBu7FXXo?p)& z27c!K%)`DW&cCO?I_2){?rfaDUddd^#IYG1L;QvI3vDNLCv_ZU9EDHjlW~1ZM|dvx zb>MYihJS`X!WZGI_tblG+`yINs&ZC2{SLn)5_E)l$kDdZww2bE4gFEIS#9nNu9~iz zx&s_P`5hbsSZ9xdI{;tUZ@mOMnmfX$)MmVHd~f~Uit~Z}?fvbzRyoWW=EN7qv(#Pc z)_e3Gg-_wb=Oup+{2oXlq!9KJ_Yz$s7pWJe7v)>(x77VKK;KXQj`1C13Uf+B9SvuP zQuqpAo?Gt&O{ld!TEe>nrD1&SQ>ajz8^x+Ko1&O$I)*erEmN^1Y?hTxuQw zU`dE+JHT_gEl3BMpc}w?c?F2fBJ*y5W7hc0Bd)K*`}=zPdixZ|6bH_6N?lTy1-y5^ zcNcgHJbJI*8|RPn<25upm>tAtk+FYQN-ibCPzW`i7Eg<$N78YOw-{VvUSfX7`i?c4 zJ(}H|)0{)(5@B`8W9}^8ES?KY=TGPV2K0b0;Nv5nxO}7`jt;(qe;?pBMxK#36ddLr z=Hgf~ET3UBK^iNKHJCY=xstK6A)YU3FKLC;Lh1|33(67l5%N&dP?D42B@0TDKr=@(#|Zlf`zqTi+Xd?dtIDFXv>5Cab^l6?hmOg;>J z$NP?#%gyDIK@umap*=s2HI9XCw2O?33|zDspap0`z@oCKFr`k$^^Ev@Gk#CO>cHwi zra#kf_u9R%G|_|S9QNxYKu>2+=X}R}$3FW$`)%888;<460Itc;HfNhh0xEcIdTsgz z8~{7PK7fC}1L5Xy^IE{S@GbYjChI2aG}|;=UwdDBCX6TJ^GN03vg@*IgL{J;*EHey z*H+(FAD%nW!RX*>!fFC6=OMNrw;<1<%%ND=}KYl+r^EdG?gJO&7&qU7(_X_tJ*BRG)=X)my;5wb@_UZQhw*5Ao!^1UQt1YYXagv5{{YmCY<~9K9 zBA(x2AQ|)n_zag0%(l$7;9CAaz%JV^8}6?oJj;js&j;A2nBkt`?(XUCY2|I@?dI#| zo8zD3zZ|$6!0#g&OdL!+NIFQ$B4?4SC{>hVYB3eBW1H!l>4O-97}%bv0oPd9SZmp9 z**HIf=lyYj>+;uvKYWz{P=t@-d~$~ zntG`w^1@NI= z>=zXQ9G9oqD7FV+lYNu@3&$6ZL}#K?3of}XHMHrwc)ECC>9IH57w&^cHT@F;69V{M z9~y#&(3sSiG?qM;yoj=hGKV^c+LzXshR+NXf_;pAjFHTd%y?EjjN}_wH`zDY3poop zGOny4rZgUn*AL+RW-HhYwt9^^4A*SU}>PYzqh}ouchx3?>P z7AzOCzXvBBCmpk$vz<7`WdP^g=iD-^jxH;CVJv5>fsc$jpUbcK9{ ze1>v{vWB{b`YG*Gni1@!@1^5-i3%Kob=m`10~)?m=_mG2>`YE3tbRNWJst}ujhhBN z^S<2CU;@COI6j>Td>kK~<(E0#!Cm%UwgOCHO<|p3o?&WXaYtQ9DL99$Bq>Q*#4I9y?+JdF2cGk|hNQEvvv0b0y7#Q-tjFi}xxWBcT~}Q+FxWZR zdB}0dQD?7%(Y8+Z^S1N0mY~F1Vm$`F29v=kFd9q+-vWHz9@m6mJN_NOz7a0iECRcn zyPQ2;Jsa9f``!E9ojjeetLnMtz2@ER+wI%o-{C(KI1|VT<^=r&KLMYqYe{ZNPN$?( zsPOs&d`0`Jq5XvS`vr^zj3j0ftj;TE?qcm?;kw5cpfjg4XCJ`%C%h@Jxonudl)%+M z#^nQ8D$U6Qy8yPiuCcGNWnemMI_m=S0@K7WG1>uK*HBNZhr3Z%+CJ(&Y5}Ey;wSrI zq?S&05FNy~gtvq<@VzH%0&4SJ-tnooy+=dWZM^JK!`p0uF;y0RLA5l59z~^?+=2PcW?^5nk3}iz?JgFoq$xJX4@cW={2W|&0`!D*(g}=5zqu_aOHmw;f;`xV^W%R|78lF8j9lxA?KFH^cYS;CBgK zC0-@oA>AQeBwr+NplqOEn+3=6cG7mzQt7EMyZnegmNAy$2S=GlnK=IZ5a3)Mjztv! zB8SLPfCLZ^+&&pP)yH_n+2 z1;06ebB2TO9N#%G0Bb-TcyD`eI}837Pv;#TRoO-R>3uSj-biR65D0`0(mPT_1VIth z4-}*$9i;arRho!^^eSDNRO!8hR1!i$dZr|k>FusH&%Jkkf2iN*BgvU_-t)eDueJ7C zFdzH^mV)izGT<4jqqU>;AgE`nXS)i%w|{R}JJgPU0M}|CV9lV%=FIm ze((F<_pSe1|4+z^njxGaoFkeOIM4T%^p%;GFWDQV)Jo{G_-kzbTIctSR$) zvY&lia$Ew5hByIq7IhZ&6!sJ{e~DQ}ZGCM6@A+w-X`XZLbEw|S+kCE`GZeXKF~S%jScw#z z0`XzVVF~vwRe<*mf8TSUuc9v;*ZGQ>%9(8EDyOQZs$K)0p}qh!0Bb0`XSaYAU_59C zs7c-oAdOJ1R;~`bi+U@1D-OyJ%K4clnp*sIWLie9^xM2aiVdexx%?ZW^T>( z&-E|xE%0%@;xmtJzIzDx*Y&R}8Bi0W1#=v890m3QyqN~spV*$Df;q%y#fP4;+2Bji z8MFc|0P88#N&Nz@fDkmgSAZaUko^ew)bXjK6z~~+1}+sdDSk&2OuYQVMB1^x$} z$7xUs^zb$&fi|Ec;B{;WR3KHAs#*bH?^JQGAP3_V;}raFHU+HLu?EU>np5JGi~vW) zN5$_%??g_alS{miwOiIiLw%uv_xu#k6c6u_+F*lggNx51{TMuFcLay+hbgFQ75vT(5 z;WG|%grWL!-Z98I$XNz{asA?wxFzoOfO~psM&^3wdi(nN`q=Ac{viEd{JA~gk@%5# zp=4oTe}4iQUCm_8pdz~@>n86ee*?JgIRNib8yEs@*KY6>lmHuW0bWP?jWWOm!0XBV z!A<2&Wk+ySaa5rMKgoZRv%b_49F`u2!zVh>ODYwYid%yTq6wn4!nJ|=9ley?>s|L= z_m+4{JdMB#cx}usvug}^?|knZ0v2_Cxk~aM*SjD`NM+`{};*zV#^h9k7nV zYs-J8mJe|-);L?7Z8As)+$*q_yxy_i(bU-#9nM#Q^O4u(b@6)E^3?L&08_kEysdq$ zeIdxp<5?b&8GZtN7;*~y36=xalh`v#SEfUKI#p>wCdUtey({h^_zc*jHtAT9i@wJ|a7BED zvU~9$(IC+R;Q}GGBg_J1?=#(-4u_4*%Q`vp$@qTw!}UktUC(ti8fFNR#{DeAO3SBXbZ*z?zeO(@-7D&hsLoFuz$qs`Ge~RmkG>q&vDbw zy9=<-g*a628{Zorvn`JZjtF)LcL?W;=8HZTe=b%_)RMEH2m0bqz-O}0WUs(*`EYp& zn5~$t5GsYJurH*1P1#=6UNsx=`kez;z$L(I`a75dxHfo|UgaLZY?i+ieB4X#SBGEzsnPqI%U1K)_h5$_c36x|ly7G?-C1k6w6A(8%?R^C?L*`C>+m+qI? zy>xK@b_)0boB&F@ z(!K!jEX(zyp|hd$7Wl&Th3g&o(fy;FUdiR2<(`J#hTf0hyzjhktADG1psSPkv|g#&-tn!!!h}&t{9VMd6@> zu!Hbx!PkPH{XhFR`8N4(dT)9~V7OTfW#re)4tvj?~Hez0Ucc(UH3pQcQ5>@ z58MNwTV}m`jdzW=r?01vn#*dy8uLHGe}t<=t3|!Uy>LP?ikC{3N@P-*bQ!=_S~_1g zADt$@Y=wM#IY284OTP@(^z<$$eKn)Ug39G;rkPQrg z?;O@VJ_71@&j9xOdI9R{Sf}H==p6K@ZNPQub!l(#R`OOd8t{xX8$ik-8Ul_Bj|-W9 z%YD;$|9Jl?-zlHZ>w{9`J1_Gx2Z3C7u6qjL{&1sfBV5ZhTt}Tp@h17i`P%W?F&FT< zqFrf!0nUR1;194Ha6fPbPL2G$y`ECH2dElC| zKFod4eUJ{`gB67V#FA0mM8H zrwUVrwZUk?=s>o03H+2T!A4}JK$7E`1$buK2`hT8`BDBc@ICa9_mJm6mo^DFqz>s)z>F#uN%O(fT_S{1yf%DGu zff`gHOf*{n`^||!1uS+;pq~NxryWrdf%-=SM+2xPzHqDqh|h5}b2fuIWv`PW_ceg~ z&spwSftpA^Pe0EU&=kFo^PrEfkIw|y0~sY4C8#B=C42=~ACD48iMIlwL-b8mBZ10P)<18XVDOwQe)3&?fkI<|u;fY-GRU_XQPQ=S2sb1@Pu1}6a|$&OLZ zQO^HBv@81m-=FmI6$0*o_W-q5?fo6Z`Qm(M!EFC*e~KUl)!WyCzl47YS&R4p+KJo2 zEpR{_A&HP|0etRxkNyj~%en{FQhG7_%KOTH1CK!g@PK$lyg~=KXT>pCjtC~j2l;!W|ghfBW=HE?r*4D5I9cQpggozGFxSng~AvK(2ConR992K*0jt^5p32izac z1cw3F&ac7WfO-nnlevc&L4)W2xuc|gI)GMiCU_b4hB3Mj*yLz6@VLK14WRk4cN5{dmWC#|8U^K)s#MGixSXPsf14 z_QCdS0C}_HEnvTWBX|ZxE)i0AreG)kg^Rs`p`M|h#qPy!-ZZQ&edGJa_pkR~Z#Q2z z-#GucKvq4o+o>DL0!u_oL_Nhl#ofW5;JV~G?wDUCDPW~^rIhbuKA&iD26PCl3(*sP z4ZXYx@(J=Xa2;^(PfyHR*;-j9cncm$A4#{#w#oL%_sOTqrpn|1QL|F+C(=dfqHiSM zF!ob&2b>e16Bh~#g^vJz@`&~nd?ox!I1`!p^nnZkQT`}Dd*Bh!W+i$Py{uXAJots@ z3(rFLLO0L(tC77<&Ep*B9Oo$4sDNgN_a*PWFu-dz(>W7e{rS#M9G^J&ZsPrV%6`he z9q3(p*HvJ4m>t{U7CCC;v{uC9*Wj^2sxiS7(nhN~?Y zW*ugYLGS&L`H(rqloHT{%PZs+^d7aTXj9Rls6)}U@@wS>krR<1OOPSPw?dPqNn7`5 z-J`VBwA7yRp7J-%-ZXpJ{AF|IPb@YqHc8(~-=ZBML>yvD3UU@ci~1~TN%JMmcPH*n zoEtGWVosAeO*kM1(Z!{UJ}mk`jncj5_nIemN$j#Rd1W&D+K-<-ewO$s@zI)`H97QK ztLm%j^E`#JW@_u)*14fYp+)7d%3rZ*T~u0BivKG;Iwv{@V;+Jx)Y?#swe*_VHM7S( zANTyjyASVr>3ZqH zE%2ix#{ZI#MuFV5zWFI8{#7?S{7--fw%q?bU`?8xD64ccwl~eLCsCN&jWP z%zoLws(;m^phrQFJ6893(C5J#5d9|l&7!-D?)JOi@BZSqi{JkI@aKnXAFO?Fr}9qa zUin`6>x$PE^`6&ze*V_^TaWP>0sUwFy7lXZri7++uhYHG4#^J5%CePZU;4iEwMc4_ z)I6nm%KU`+3A~0YQ&y&|s=KOgVRB*e!6pZrq$pFAOUyvFMAp4t_j+SmjA_v2EMnG))lnR#8> zuC(34rVE>fHxFr0GSs9<9cajXfuYwoW3K>I)&><#vE zmO+WLYvS0L@k;uSg!zctqpeCb>=KMbC@AD7+}_Bkv>sqQ)0B z3X=+xm|JUtMy^9yhq4wKEi#xH_e=RN<-2KD7 zzux}!_9W<>+BvoL`_}KN$r|Ap;kaYIW4>2>uee81k0SQNse9sli`q%GlYX!Ldu?}w zJK}iw@$iRrAJ(1HVoD2!jCX9+vDJW<16n?8{;)Z-@y~*HN$-*_MO})zqQ9bF8oo3f zw%;1e*oh2|3}y}i^H)%=%9i9w@=g_>Dy{&n-nDvn{n_;mY9=^lZ%IC56d2yHZW}}fP^zWCL<;TmzJ;U^vs;h zoQ(2}a`t3rS!P+Xj9JES4c{8r6W7c2@=4K?qND0W)iKmE)cPd$lh_5(3!<;pzE(S; zaYW+_%`P-M21Wr(iX~+_Xy3Gb(>V?2H2f7gX6wV&BTb@Nm@-lsSqtd!$wlUIhl&mr zxV`e#;B4X9!bU}nicaR7%xUzx(d&Po{`>UilbcUs!BLP2qQUtW=U>dtnw!-ozYWqX z7w0nUdpeyaBqL`;$zJX{|NI~2Aoa#^H0N*(om@b|$T#2v)cqUDf*yiWO{wO7#QliG*u>b! zU}%k@HB_}!wek}45}zeMOBSbyX;n&j+~jeSk>Hoczck+3aBIV`gs_CxHCorG6Imy+ zPk5j3C80|~=LXFU+Ai5H;hwysp`(G>Z1)TA7q=3~vgnt81lAbZT7C&yR^Ktyp8!A^GyY&0tP1CGT$=u48*f_cTIN< zbENj__v&|t?GAIqIAVI#?om4@AtwQC%)||#K0XZquk)|9eyuexW?l?^ne)Qtg)yV1 zr@p7YSW&Fte(ziBw^r)-9~&MUdRO$Wh%SvTWp?bk+;zDJvkzvcfS)>_Tb=nW;;j_L(jqF;? z3Aj^qr|6T9pM3m1@Ao|JQTo2^`*z~1iLaRbKMrtCO&xIb<%|b32PF@)gD)SZH=`x&PAS!+#I$!>|)5pkn6hZI`)Ql33mzEgAPVU`&`pp zQzt_wL%XteWm^ij6rRjGnYSTlL(b86N8h~%jdB|0{0Zv5uls&m{8)8?-ua5WC@zuFl|6={LhG`A) zpK5dzv;kWhZfTg+Age*|dcEs;YkF(8h-ncsC45SFYH(`sX6|R}5nLmcwUo8Kt@CZ2PwReK z_fK#JWYo#1Go#jwT6b&Qt#KggKvXb1+Vl=~(RI=FR`phK&(+$~+T*o)t@|qXRh~4S zG%^?AVDZ7?i3Jl2_)Lw-9g~|34uY=lyT0F&w8f-U`;NDLw|%S=e1P_kSu;HiJq>B_?sqNfT9jOnToC&q z_Cw#izImeoew92?z9_%t$Ce-eDE_0E*>m)mr(4o3)UkB(bn<9K8WDBS`9b+X6h9P3 z7Dm>OtslE4eoefjj--yfp1d9;d>jo^KO1}n+9tM5tgc&KcUY}qwVuU3i)CiSuOYvN z)CsB+#6I5x(E|~CAC_uMb+Rehw7G0^*`lIFMFa8&ch6eZH1qgeqPF16w@u!En=70H5c>ms5u_38m(fE z&7zP+A@?HgMeK^%6*D4kM4UO^9Dk|irJ8&Pyr}u2=I;32@y%;Aufe>PRpG0`XCZHS zoNk=%EHYGH%U;XmLb*`h)1Vnx z4fxM>3+oobidFn~`QPR1OzTX|EX^#1wnAG&cSASzXzcN=(yY>Kg2!%V_{{M8QTL-D ziK;QN=ERyC>uju(nvj~{sOPBHJh6G=(|S+qJx_R^V69`VQ&O{}W_E0L?CQwXk%K}9 zh5Cd1L5ZqF)p*Hx$rJArZw-45`%jfWRi;;@SEQDtmZX17|9CC$S{}wLynB@SD6=HJ zgh%G||I+?T!&sd3))}ocHfL?l;-2L14}X8?SlF?Uxg+!@x2|ekHN-K*aT#;(x=6Z6 zPAg6;c4~HNmg|@6w}ovBn-?`NYHRG)*p+cB)FZ!^zm`uCO%bu5$R2?QTI&1e`{rGSU4{W=1Iq9y7T@@IzC9o*vu~ZcOgE59dDce9ZR|XEl9U`DG=IL+tre^YK6V|K!b}8T<(U%F~diA!j1a zL|CFN(af3rH15;58{j-pgK4qTVsoN$qF#o-3}t3q$TFUgTTkTj^Zs zq*i4zH2yP8Gfe#|`c>2`tyjt%Zr+c~;?4rU6#i1k8E|h(-jpCBv7GP98kQOs`h(dk z`_=cW&j24O{bTesVN^j#SVUL^N^nt8HKJ;?sM(_CKehj40&CSV0ItpdEAe@9~m1H8}noAkF<`)BGSCZ!PtYbBVtCx)QhSY#oV8bAsa&~ zb(K1LSdh@Wil*VND{NL?X&1 zMir-uV;(!NUpdGC!@>V*{jb*C__^`Sc03b#CX#!XGF_RjrlzLmGBRGi5q%>X=^5$y z!}f>mM&*r4{0N5SWy{Oh1nyPPtHAQ!@_tdyqMXQgk%4(@pJ#uby&GU$+B*)6YL(wA zpX=B2lIJD)V)xH1G4^O<7kX_h=oo`NjX3qcoxCWK4~;r%x>YG~A>=tt3$ zVkX6$0_(x)=+n{oV21%t!rN5T_T9#IkR>2IJPL@s<>a7+-_wK=GC}wt!k&Thf zRL@l3(%sU@L*=2T!%v4Z4-ez#VsFLWiaS{IV9lkqmg0@Ru2wYQ`~f~sEn{28GSg8S zCJm#XnOgmoij@j#^J@BP`W87BIo4a&TXvXsn0i+9tUybpbZg<(!uI*?^Vhv!_x@eZ zyBr-zeV6)<#=k0X=lz}c)AOh2?fwEoD zUZ!eNHQn{y_4|?6H!5OO1n)(8v>ekCMnr!OE=FC9>L1xZGCDjue0j+75c&xZXb)&v zZ(J^4E^i}lBi;@D{V&k%wY0ai|5p85wYo}OHN-T;bh_en#gVcjWm`+P2C}2}m+miZ zU)H{CX!+3c?wExqHjB+Tid*{F`q)}KTRW+h`2;g&=_h-ne56bWN(fpLye7CQax_jv zoQUAh^D*{gY(ZQ>9G~w7H5=5-jn9p54@7aIIL;fp8F@1@3WLa|>8I&!8k?q%vX8Pz zQY5*E8L!ld^tSf4cCYMS=`=VEnPr(}Yl_ztcly}rCX8vb` z@AAIO%gWEn&o9g`QxEv1w+3wuVr}eX z*vT;FP;H3Z5J`huC%_Cq?g4Iv-3sd&(ldnfB93d1Yrj-~sivlQkYtdg1mRoH;BQ#! zSn6Ov)MCqGi_vT}k1&of_OIw)5mz1;$m_~4%P;$^{Il}L7~+>^NHdHuk1#X;;CtKm zHfkPSCv<_9T{yqD|S}QDVl}x32PD2BH{%=L|SB7L|KFi3<(<&rVG)9FtdKYcE6VT z?My|cqMx*%ls#qkM_I?D7Vu8>o$8TQBdhp4|7-Zyzzi9FuY6W&Rn)?ygRF{<#*Rkj z`*gN+w$!)Px3R}a?IzE$>}#;zG#>hJkxrz$9(+BR&+wp#K@nFlPw9Qk`xw?_v303Y z0v3alu_t3|$JCDbJM!=@(EI z;V3zTalXMj-8&t<+VmXI8{b9NMfL+UPV_Y7x$<1puNkZcE6?TMA|s}bsg7x}VX@(2 z#YLoc{aH~C)*99tP8d%Z*O}LuqbyMt)|a@SX$4;?Vo7{F%RZGpmBy%IRBtg4=bZkW zK9Ko>HD_ex$jINKe~WG#+cs8JLsg>=co6#_Ru3LWKaS?v_*K}eu(iQ!gZm;wrk=W< znx2$@klp3?`F(XNP>YM7L%A-p9k|v5L zihsj=ah*r!`4m~5vG!Pd2!>W+3_%sMCJGU{Z!{PUR{^Z|hDF9j#ve^TnoJ0o;C?;_ z*&oXt%N;(K&$ZRN)q6#7MX*`2S#nWvQ88OHTQgQSR(B})Q1G$PW1%m?UxXv-Ch~4H zh`Af%16M(PkQkj9Juz}(WL{Wa7+Ms;2Z9a+?NRShFIFs8uzx}w<_qMx(C>lxdJDEH zmCWsD-SK+K^%C~umV8|DacjX=OtDBQs0kK=Z6CLNTwJuc$X;SESy{faywXrn_ zUS(Njp@-(U`?&iyW@05FhlRe4^@{Zhda^nMbqKnnzoTCkvMgj~=*-Xppb682<%Z@m zVkwl_ARBcXbt|6P)7 zaT#F73}-QNZVdCxT3K3I?pW_wsUdiV{Av14VlZQzxlo7Yhvm!*92Yb$h?x%uLk@;q z2)huL5s?vbD(X}ei@$uvxp$rqjz=AjYKk1){IL8m_Ia4eK@YQA;a2RD?vkz(t`i1% zgS^a7qEB{k)!-`beWEePf@hE?nE&S~^c14pfeBOdKYk7tfv*a`Dn#5)@fW3Els+nd zR32xHGyZJ;+01Wj`YvL- zLSEL$udg#GZn$@5xlX>4he;wHteLRTQm z+VRnWG;8}u*32kQV#eiIWUd}D95G~>vP`3qRlV1`*E-!f-ARql8^N2veb7kONXCBo z6!jE!z!!|%bY9a!z<2scAO_X?YCUrUrfR2Zuc)u6sX^|f=%lzHy&$DtjDCjRp57kT z3b>B;xAnL6L$2hws&Q3(wx*k>o5urY_|&VcSE;O0R&BRzx7@bgwl;Azam;tkcQJbh zvO}LiXb{dswrUM!4dthrPc_^p|DpdwKRIM_$mp=qVSOU{M4XO19r<0_Tj^GQ3%y|rSqs@P@h~y7U3jK_?|SbFat1lMwrqqC<+|m%rC(LQs%4eSD!&1| zFJ0hT)wL>oMb)q#*jQiK>DuW!4z1r4-xJ>t!XJdYB)iaXsi7FG9;{|g(H-3#-PGWz z!L37Ehx)_(VKX9TM0^_gY26h;bDd?~*B?)z?L6EVN*Z` zw~vpydc+pkf2#hex>i-KDn7qU4NDEwitH=hSGu}nbqSXJ;?v+cm|rr#a1j*A?D(oOtL{HHvpJoHqBIzyfG zr_dM0Op~uHUs>KEGlmDbWJ@yc+Uu6{)#n4buhEWZ2X$|(Q78M7ecuSa5eUUXag;1d z)=t?@S*fm6Bf=o)obH^Cb7o(Mybc+F9O0kBe+oAPX1X5%+>@9?&7sU7lpq6oF>)MT z@ITE{%u~>NzFV|gMA1L{zVR6DLVsKnOA`zCqs$Iv{pexY!?LxdYfIBg(n{8V?H~#P z(Jjhal=1$&Yq)E;V7g%1Te-LLmgSb^Tids`xz4%H|2+SBo+B^lf1>}1c1m_iuFI~= z=*_CHuCJzFy>n1!O7esH>G~l7btq-Dx=(^W3C!JCuU@aNt*RZ!geW+#rCW{F4^iC2_66*vy!3xg`5A~mXFZHSJQ{ASjO%=Zw zv%zdYEJwwevNL5LN)p#c;tTM ze(Zbf8!j9!T#oF$wbHfHgYcx@SKe11S07h16M$!oPmv2W3G@JGv}d%(;A^MnTB%a1 zm@~OhzEDnI67|^3Z`xh2i8)QzpI()G$zoS;MSn z>}TxPT-RK8ym!3c3BD67!rWVGj;R^k3SIjKWPs{5dW{G(b=Cr&Q}Vzi z%gEJCawIwYPQR09?7uK?y_dh2pIY<1;=SSpvIVjs$|1_rnAtf|J29}fC+HLOn}at8 zzYBR6ay9g7D8rpFRs%c!W1;*=LL?zy>c7;p@4@^6`XT$v`v>-RdBQy5Jl{NDlsn4Z z(9zKG*80}U42*)xg36bsmnPO0x>anq+%?%b+3CO_5!N3M zSr1v;0{WxJgXds_ZG(+ktxe8N>&y?v~K?zV^NL?Go$~(7*K?GM?#2e4~1!V*Uv0 zPRn%5bQu4l?-kN3gmW>Df|Fo6fNe4)9f!{m;+k&*iMwpA?-G(G#M@ z<`BP%^LN|tfq6iit2S2!G;qcx#&;F(Dz27aEmwj)WqXjQJ{u{_x5`eGpD0f!vfch?`=5=v`Zn+*i2Ne|*TS!b-@wl|NIFP5Mm{Ex@t>ehP!HA&*6?Mt z20Q`Gq6!0uDNr9$9a2qDPEb;RoG4F}GcT#XxWAZ<82UsWcpiAZc7N^WeYXkzNqVE0 zQMkpr#X1Mj$IDC~_B-fV>+S6AWR?;4^ox-L)>zP3012ZgU6L;OOa7NUNtL8x-UI7} zh+PW$UjM!RYVg(IhanF`z6|{`bRy^gIK-I!+lTsx`drLM|3mYKW(a(`%xlF~Q~H_s zGjSt9Bf(2#q+M`caAK^eogqDOmN-i^vcf}6p(ggT^%eSxzU6((Gs-f`4gk&xSW~{H zob#r38h09pn1`4VHC}lP`7IBv53S47#TR2--E-n|J zmz|dlR}NP)-ysqiFI>;L_u#pMXScSYZ9{(n-vOTKI1i8W9e&gOrW>anr>zUWxLsja zQ2R?y|L4Nbg*3R`blr3@3n$x}ZMERztMpYew~~3b8!I+e{8j!}c?{q+WtR1n@+sxp zDz;TLF*Y%lp!vKOS-6cYjV)*iTIpBX<=W-?&HI}-NsuIB%UUQ}C>mgH z0oSY(niCrC7oU~b6VkY&Nkg55f|t{Qnz zm(-Wk%pl{lM-NU%QAd%$FYsS=Uv;P*k)>e28Uc+(IaZ|s_ewEz+F^j}vv)FDsZ#(Iip>BS!aIbKQc!`+43eKLP zS5Sr_ItiKt%_C4pTL%*nyYcm^{YmqahWn6cRkR9QS_Qo^yod05mp&3b5{>G8%s=iumI;;#4k3rU zqqL*c1#iuG)%d_HoD13uT33)OXpnx8{z&kVU}{%-g!aG{9UfW}uy*o1_<8VD{nWs0 zwPBiJ8fKgM;kmsby&X=3ac)%|z$|PU zv+wHf>eV{6j%(Is)n(OM_?SPJeJ-P4Bu$VeV7C2lm{Ui89AqL^NXISSN^d25F)fTO z0<)^9Wtk1wTi{>02W?|$W4LC#X8fP|e`c-`%)vixJ#FPa1(pQYV`MFMhmU8NXqc#@ zq@$#vtf8!~qOPJ^S*`q5{jHkWybl2PPu%PO4xXu>sV}N7s#YUYWgPM<=-qfOeJ(A+ z;3lr2-y$=Id9w6TZgy>Uu{O&0{8QUgo8RiU9tX^oV2A_X{mh?w<9Oqk?wamu;%VZc zesi;bvww+jiSUj1jd+S|ip;0*DH^C7sM!l?8Pqapscxz6t^TcE8KMmN2zrI~3he|i zo(CtSE+I{Vn*{IC?a>|79@Ngm?1zDv!$7a;Ny$kG&z={27ku=*WH>S$n{AtIJCMnE zr0Pf&Yc@}ePmI*OP(ymK{9yS=!1c2XaHcsmQINw0)=-}JAi1%QwU4#agXj17J)4lB z{;%*~A+t}oN7*RfD4(XBrsR2zhN}I5d!=A)u=a)K1=6`|Xt3p1=V0jaP0Y}w--uq$ zO_EKL5uy>IAVH9TXXVkzeZey3=GyX;<0nT0djmW3Ceo~Ff&G%iCc)I0X|^`@Hufp- zso}A9-FDx0^ShA1d`l0U7@uv@ZPKQSri$s9_t9F@TElF|%Am?1&a-Ddeg@{t^EzUT zPsktg|;5;%4^CvXlJB7?z`w2s^i0!}_S*T{xy-%HUB_F; zd)#;2H&`%Oz@7?yNb``D{X+Rdc|d(Y&F_`Ep^LhUI*;C?=kvWVWMRl3;AbEQoq{_B zn{*~!d{BIl0s#b#^@|1Z>SOfz3RMU`Ac^zB>JptE(_Q`?cB#R3t+B5-(r?S zvA@_)4;Lh1l1s>f;n|V7LyI+w19Mx@Ce$&fd3NyZ;JA=DOr`uhq#1x@Cb&7!>2-Q) z3WsAhK{r)5RYyff1=q7%;#=Ymf)9dQ-dkSQ*qN==+1A-Mwt8&!imDY=+sxa{X~s0; za>H`Nsftq-O#y=#89uiIaPCSQQyUX380H~WL#m1_MV4pQXI6TVz3|Ag-V`PX6DUPW zQK~pq%sMfjVP*lmQoRbim)dLEYu1530W(z>su!x6zd~(kbIeF>CT|w-d4);BBs|xh z@SpI%fk|PUXPk%qHhNL_JN5_OOT2~wEd%m3|?qGLt0pPp=IbeN^ zb+N;m!y2BWsc~2#TOsQ!=_}cd{C%E1HX)ba>aaR;Y&n6MYM)~M7q!znO*>8OXLc}j zF#J>TPsLO)3A_Zi47Uu4rbN?q^L2Bts$PNY>IK#XR@OrYxdyqY!DO#tg>Z$i7cwrm zPeX}NM*sh3s?P#>YVXwV)Xg-_G+%*+fS#+Rs->!7$Xe~E=%-+wAM4Ak1v4vSpkSbY z=Y=d!Rv?3d?;85YG5*fZEcZWcenKhhM)jzm@@TLC??^h}4r0=A!4yq2+ z!I@tctPEB{vJsf~NiXG2cmcO~wsGv@a2v)cwu<&DV|BjmHef3^Kre z=&#@&SY}vexM#d)9B3YBeuoTk)^l0&XI9hC$it}TspmQAJL%)P$GZIxt`C8l(=f*{#|ZlfJFg@6_#Z&BJ=uN{9EOjV+MomO1Marow%$|7UT7+4DqxL) z*+I-MU|7?0)pHfU(~-z>-5<0+CW~w7kd{op}*wb9=53}{OIO!rg5g8#-7HF zhK+{W0HaeY(2g}T*b;PcMf9{Y@}kFoAx zL4VvScgm@Sy&%3IRtwca>YF}AraisHd`BY|+e)q4%*vU8n$ue2TH{5-MVy#EG59Kc z6+wm|OjX%n*ks%km_4<)a&e`<%3rmtdRcW}TVET`F8p1Odyjh^euuvVvwRMT4~fS} z$4FbrTgeL)1&UUfAI*NqE>HkiGd~2%Rpl!7K5i*)1@e!t!B@;|+YE7r__^@8@I0~} zxR;#hndoWlZtdp1_tfz;;FYenRoe~%UQ_1Fu&!4d^Nj{#mc$#^8`osdWKWg1$~(b7 z!A}otyf|JwUpik(A1yP-*~hx2xur2{&Dwgpdb-Z~&UzWb*8c~-2b|TwKHeqd;|~oQ z8njxoTC+yAMzuk)L9tV|Q#L~~LsBWM6h`}_{cSyMJx82J0yDjN-e4AWhpG-$E6pp- zHB2>3HH|fmD-A0RtwAHe=Y6Mh*n2dYsyY{>GcCL1=G*6nR zqraoSo3NWuBo>J;OD;?3;p~D;g^S9IN@k!AQx8*L0K7MNzK;d0{pgfBC5`Nm#L1}{ znk$(bSVPAO#tP>8=K2gCLm=;XwQIHO3*?b9W1>4UN?+JsVE1&>W&nNcee4y0h5He% z5w0qCmHQX(FJ9adzF!2t2u6xVijE`0l7B`AWe24J8E$+>j@FLW?!?@6YVxSTtQ%Yx zcj+gA`*XK`w?0>wt2>5SE&n7}NxuMJ-Z?$gPJ$p&h6x|_P2E}1Wxsarl`IbvyM zZDtKe#yIPg3Xj6G!neYAKyVN$XW(%pc%$KlAT zVh#}ZBFtv!E9)z>NGuZW@pz6^A=Bq4?@!(YPl8A4mb%lNX@Pw6y~yHW_7)@rftm=j zjtap&$2|wns9W7z-OS%%&0i@{3Yf{jb%`5^t38l;Kq1-u%<>r-9mrXj8O_dJ$%@ ze`op5^0xYI^%l%JzT>##;92`6X7=G2FL*6{Eu1NyDQ+NbAhpV@vO|hP3a&l(RQFV^ z)UEJ#our-yc>bHKnyZ?xoUfdyn5bYL%R<>gSzpXl+ArQO{!{p;kb9m?Z>D!O<|s2C zrN66xpkHUTTk%$JZ8zJ@Hk8vavGhw!xO`$?<5&~OBad;%xDR>`dSa1Lx)vF_jfIT^ za|c#QS4pWkr=E>}em_k=%{bKMb_MMU`Uf)v=IQ6@AAt+te;^fe)-3Rd?!hcfnh$x7 z=Cc$liH0xDP#!JP77ybKmq6=HY3O&vPD`ru1pIK|UpO zz5YNZCHMF2%S;B;yEFUmF6KI4R$NwGl3$YFk=>E)lkSu9{;nsgCt_A>M_)%DYq%%e zC*12@>s>>gL!Hz;^u&xNW|3zDp83{-mX4N=wwPLj`Wv|NXRoAOhs#B`(TJKsf+b`RB?xLn37$8yJu#ng?w$SwtTW(oR@DVz$dTu{lX^peOd$JB@|)y>=z@s7i^IOd zzDRGRH_x5t{?GNFi~SAmn>e@ZjqQ!?3gA15*Ea+3nGbb^x^}sDxnbAxuERWQxj-&R zMfQ>mi8s_ov)9!})kn2iy;;p(NG9f>%Mn`S2kZ3f^hd#Lz&-s>n8`9QXkgGy%}q_N zDpv)WoI)$t%4;BNKUb71qL%ju?+@Oq$g)`BSmC&CyKduoo;}Pfl~*bon;V-ICWUE; zafp$@m7L$_2dvefG@Ud-rdqicv%f1Xm6kEqF;>n_8Hbq^DCxO>^!*q(d$t#~7o~~Q z#49kHo%u+d)2UD?R1ZLNb#qkg#;Jb_Wm{#6B1O?%-d#Qr8fd*#FCC6t z)*;B^|Hl7~|DyMz_h-+~9%l14#heIOOPwCO$Nn{_1zLf*pc344+;mhrE1f?fU!I=% z9=;wvW>gLk4hZySj!KV8v!Gi)q&%b)s0C{Jsyb^sYexr-4$Nhf>1BA^ch)BXuAc({ z_f;jD5)I83JkxzA|4zP8x={Kp=0ap*o<*21%s1LS+RZExo`1KYsz@zf%c_=D`^@{y z?0@by?uJVw(P+R2uUNw@%uSnQnq;B}9k%>{hDc}?TF=iYprE;Z`{|?vs{j&YC+0xn4cbEgj z9F+opfj`NY4$clv&WPZ?vmQtQ%$8woVyt6qAg9>mGPx#sCV6;n zZ3d0hUBO+!710%uSK^g)l6R8VSJqeVSM67&AzR#onF00TjccxJ4yAvYu7kdVz9ZnZ z-J;u~`#0#{AnO0msn4ldOT{)*&VB^X$0sqjiZ!8jo^~E)d#1q$S=(0I#?1QLRky2Z zWB%?7(+g9PvB>xpKpcwEXYd*L_l-@BO_R-&1LvgfmhOR>NiA$GZ2a9;AhVhoE$sW& zLq7Q{(JK-6KCNV}Wbftg<(-wCm8>H_2JG4O1zbxemEoTx&i9?ZN*5`{LB#P;kb%8Pvq^JSdscft=zh>2m@|(U=fFIsYUr_e zJ>Lht54xhgqOFT8_kOB=stJk-iXE7rbr`wZKZ<@7-Sgk`%MfbSAD^H!AgD1HRm;FQ%_S5 z*QKZBuDUK}ZZTJLGJM9J0dsZtfjCE;!w8ruzs|kR&HdpI zz8?a!9GLOEUc6qMDovH594No3ys3meU)>HfC^_R|A?C2m#*90}Ng%PL7b8XVFLf{R zMrs|Ho%~SqP$NRdbDT0x*;(FMK2$nX3Ol&?Br+SBq14aa&y6FLlR1mjVX!|>4=8I+ zoP)UCxE)oJhDITX2YUhMrxlnB%!4pvg<2x+L+SnFn#TMvK3_J!Eimi&JMnj7*i{2F ze3+TGMY%;e5_8|^K?_y~t0MukZrH>7f3+q)i+zw$6(fxaDk|& zE1xUp-uE=J#o05+)8uKWyYvKkf==j8=*%D+tO5QYKc?T+45F@p&r}cO6pxdSldqSq zmr^5BUszwb+_&8K(f!fA&AH9VT9MYKwN0;{Uj4Z0aTV*#Ri-Lh@k|FXH~MEV7i5BC zremgTbGEr-RmZBmmc154m0GuBCJXm|Z;_|f#@ojGz5jcEQ(;r#W6@&~bCh*5os4I6 z>YOr_naUB!pFId}fZu=yP~*USI_B7ol#P@Pln#_~#sM?@Sl8e@hGcKDH{25**xNIA zoc)FfaNU00{x2{C)|N{FXGkQwlih!M{`81_V&4e=2>)BbTfsijKG79q*D@pJhT?{z znW~xUEA?0Ev6y$o+6U(au?PA$I0YsH_U+pNNO!ce)U(uwm4}tw$I^SvHI#b?_PV*} z?e6OC>g(w1*lXJxIM36Ia=-F^}8J*jt;)?zwlEJ@&tSR zZhg8X_IA<(g*7`KOw?a5NLi5b0DF(i`pf!f1!e_MQWf>k^U?Fs>}Gb8=M}Ys3jWMc zXQ^kom*6nM0Ya(0n3y*Z(?ZW{3$346~ysZC>bB}W~US?eLqxPeASGlXiq?q)T z^OZx5(vR2^@jdo#bdPn9wTiZia^8&o6x3E-13W*MgC5Zy(HXHBF~)IStS(|NV-{%a zsTW%g|IAaEpS%U{cE%Pwa~{P%if2p|NsJ_NMwQQTBbWk;ft5)slXfQVOl+3WEMZyP zvN-ya(r=G_ni6UWmG6EfyOO=j*kw>RK##jTp**1l*n5W3rf)>*h}6a@jZZl~eJN*@GbUS;#jfKz*qd=#xvaF) z+G)7%boxuOKF8WU0|(Zgk^#T>0r2&mfxhfQ_$#s}{{UWWSGB7eW4vFmoAMYukMrC4 z?bqgO;UP;uw7;T%3C~!@7xXaY_fFrrx4~W*iSl(U6XOaxZpTAUQ<8FcjBITPxR@8|CiE0#P&a8Z-E0*D(BRKEtx9Gkvy@TF z$Q8>K%Mr~HWsKqmR@e%&{xlM#ji!w<2jrdmhxvyYZ^zrsoMz4*X^+%P>7@+P28kW^ z1L4#9#{0$#*=;;~uiP2Po^lAZOVds~&+=)?r@5DO56)wSlBma=h+TLmyeGW2+ZGzZ z0onkK@yr?Lj8h1{=a*uaVz(o=h4yMWG#HlO@^cQso9azXN=ZuL3=_RjxVty~r}R*T z?)h{q+i4sMS@$_xzVe`W)yA}M|=v{eQJ}ozb-s_$APMhkQ>Us~a zWWE#gyz`)340(&k6~`v`!f_WcM-vaS!|$^^c7615^>H!3YNR#NSR133oBkV|C1t)m z2fHsu$41BcM*9lg*cZ?$bLJ)w;2H1=?2GP;K94<*vA0VN!aMt&T}i4W-I8y~oKK`* z=ri{-_Yio7Z;0Cvw<~^E{K9V6 zv+1UGQ{&y+13to6tSeS~qrFi-T0gohyeyn9lrA(5dp)1{p7{D=H*(9AmMQB$t^ZUT zWc=Um-j&!lJ1u2e%GuPjsagD4{9OWF0=t8|gLSdXvQD&4bT;-V(BI&&b69Bb?qHvA zPpzlsad})*+*8~eJR3Y6q0?f0UV`az8gSEl(_04cXQWj!CSMP$Pl4 z74vA;L)+`^^+D<&wWM59-fC~P3z!AWSTq(b8z~!M{#YPbAUMN6L+Hj%r<_g+eF}Y= z1d>5@z%w;DB{}8$)bCSI_)hqcMu`1$tnqHd9;*A;8OlC5b@A-2vYz`!eWOl?$0xnp zI>L{VH6GTTc#fuxOB=^KY9!d=+2T3mKIFa!uTTDAPl&?!Y$ltv zk>heMs6ezpbYNs)BsVAm`2ACNS36oeO8s&-qnmNoJZombU>x-)honQ|o9_V+aK;kU zhA+pCmF;oc<95XFh(D455|1PfO&XeX1{?<58JYpGzSkn5MZ)#C>v8PSHFGy}uh3WM zSJW#i=QQd<(|g`LZ_bR(jQtV$L+CIzVYf%dK*qo<-z;Cf)OxA?Qu?KQ{PgkDR`3h> z3-n6ql|l^^b5zc+G{^oQ{x0};84?>3+m87H&Vn%3L5d=?FNE<_oqZz6`rOngH}^J2 zrujSG%$wdzpf})s#d-c)u3KCK;L4@v(%-4?#Qxj`(gG=H2kouaR%;dfhL;=54ZeT8 zPme^7z$Lb8jAcjrbZuzuGpjZDQu6%t=GQNYEItZZ{B&NEng8^Y&Zsw_f(iQ0msJYE?DXfw<3N z0Ct-cgui^PXszhh@YXPAQ5FRj1w1f-XU*vf<~XYWY8Sa@`ft!7r9(=y)Mlx(eY1Uk z`~UWH_OffJYlwG36o2^6SF@|xDB*~`9@Ks?-z^7U+IjAI?y2yahvg6y)#JPe0nc~p zbQp&`aX)cKAqpu7nquD;_r30dKR5fH)H=L_&hw^u)4XNeGN>uwP7LNm^eg6G#!-Op zXD-Zhv!BcP=&JC-S!^v9JDajfS*6ADV!4M3^d2G~zV5m1!Kwl;wT);EByiv7eb73o zwRom2lUh>Fl0=R0R%kIhL6dRBdqm{OtoyIg)@Yoq7!98c{8!kV|Jn;r@T5pmgmw2M z%oTI~C$}%RFJo#(@s7eCR>Y*7yQ!H{GbL+k*3@KQvTrW-Q(g{S4)9Xs?hxJ)bK$YI z7vA5CoyATu_$hBxHY$a&|L`C*E3E0V&io#-iiMaTjrSaCLCa zLVtF;HeLHl{Yo7nkC0C}r=0rm6K8!SCwATBFmf1~;6Yw8S~AMH>ONou*a~zsq}GBJ z@NN0m_}3_dxv>%U2%9r$?9iF#lpqH|6v$RG9;s* zRnW@m*3I}{GG1ccnRO99>*ns}?oqB$uD$wR zu`_#`I!)y~VOgoHv>mT>QM;)9t@Ewehf`6hs4xd(K77u7&Yi`Z#moBk7u@m*jdddaoC5srvw(Mr?-J(% zl!OxA#=ngp9XC4ew&%9^-7kQL@e}ol`U3l1e|3I!=z~ln^K#g!!q~n>s7B~$;Anue z`_wjO1FVzO2ZaIeebzm+$e)lu;U0F1 z)$-QzE_W|?D=x*=MeCwXQYI-)p+)#$eXuqgn+}fY--vdAcu&iE%X+ER`~lF5_>Aj}i#ut`g3?-P?Ur&&VQ-B+wqlr3%xC4Z zYM3?5Rz@qMeXMqo1x)7YV|w>b8s%va~DUfrv6AIxm` zY_Z#%b&{6=ZD+V)-1Bq=YcQK}+I8AR4Loz?hFU|7?>B3he>;CWtP#|;>WZ2ub&3mO z3t~Iqm!AZ#My_Im!Q)8QXjUjR2S+(8@*wsghS40eh1J4Z2+#S`&S@u3j+2*SKR9!x zwyw4=)|pH>-yxp$6y|)Zun&;6 z$<}IXwX@t=&W@e#=ge~^clxsMF+My#oHvv=^he;2KwW=be>z_}U+vV|skc&YrK|>v z0q^~usXbGfOa12m&Hp6uB#5+G2fWa>}U3L_(${ns{>E^z36@B zapiG+cx)P$86T# zXP7h0oyJaa&$C9yZ=U@ZqD3`yL)(ZQW31P2H?|wpZ8o$U+7p}!&H?Fw#CiU=*fYl( z^D^uY;`!~3^TxdbtR?X-@0!?EoTKLw&n3Rlad>`mH(oyfIA5agd z|H}W$2e7lOr`6Lc3H?ty>_%X(kU2Sfb@cTZrU0pjs;ZLAQh3pk->y)bhUa zz8>%vS|3;+pne$Rn_>DEu^!O^J8)XUt$JORG~!);(XDZe|}l`M9;@6+~aywAQ>zE#djXT_evht@;uj(Nun86l3j8AW47 zWBuTf&u{)dh=Hons=_nBZLDpKb4`oQ#U^Z=EqeDikQzvv<;^nhWqt#!7me_Y@GS8z z@lp@m7v3(M@yVE&5l)u#6aNH@0cU@xW2bhAd+wN<%*0OW6wE2L!d}Ih%1mX1G(sw6 zm$D7~Nx~4sFw7b8xoi$@4%P_N5H%+*L9Gv7rM$vze-K~(`II85Mey$iQW>k33zQ3V z4t5r^Yi!tySjAXjtgu#CeJ~4>g55(cup4i$x>sfWoxR&1+&_rju{=i^1M+!p1>7sq z-QC^2z_q}2O~0lmfNU_za5tT7<1yD;htfvrw%O*EDhB2*Yg+m75DW|?VsvT@u%zqe*#ykD|H|7?epFD-}j@{ z7s!YGlf&U(@&$GT;x#i8tOV=5{obA;O_8XhYN@tV4`XLDBv`Iu?qY84JsIa2Cw6qb z^1MQo>A0spVD0WKc5_eZSWsE?#I(u!GH-t+uj^8Ne@3f^>BJP%cbQKT5QTG^_2Rn{;OWsUDwU?n>~$bans_c72uo-WKjux zFPU#v2mdDgi`&0eLW}qoVrF_W_u#pFF6LXTU8Tq=GAxyynbu5;eKqzA*uyvxIuYuM zJ+f**6}_dWsZUdz1FUyRO-)Hn$())wbrI<6>+2imALri?*brb`!20rF?5&|+SrxO2 zS==seKXaZr&E#e>cM&FZtVUAza%qIWbG907*`YxS?(uV~lmZtZIAT8zE! z*R*Teb@jUX6ZR_c?BJY5K0BXX0DG+(V~0>bqn|M;HYs)}dI;6z%9vKnh-uRj;*NhD zeJpBCql{6;dUL(Wvll;t!`PTHLssl$e5<|HSYJqsomTm zvnSR9xxkHt8wpLpr1(if*T%fAgS&(Kx_(_}KjmlTXJstBhN!2=WM(qU!mE)vTa$2; zurKHf&J4^9RPk5w^X{3KIxn>pz;T?K0q_jS<;&&E>(A>?4kQOS1H34-DD)}(DZC1^ z1oJVsz~2+!|BKQ^DW{TC>_K}CL!BzFDz2vPrf!t-Jc9va>hoYNpk`!@dyLo*m#U|V zxG7mn){@jDl{#6@s;#rv*$XlIxWn9G^4)tBdlcht9BNircPa+D0Y2k;v3fD)r<~{Q zYxT8$v461-ItLv~vZTq%WTn1VUrTZ&xqiV;o70}tp1t0^LW40OenNbE%*y#d>BQ2B z1ps>^qrs*4OYx`UPRI4}_VF_3b_I}30k0Fu%Ot7ydb`%G@((2F)|}8Jn@rc6qzZ z*&x^t{1K>ptIgtUxgXM_0T|ffIsIynDJ(BIzReK+^zM0_xv2}%BJ>(?_~qP zcXbosA;|N59riTx%vEf~&g0~9*h^U;FOUnU1=RQ2dyO^s7zV_sxBmdxuVel>C}9wy z`{xN#q9o4G#R-cOvIA;`seR!)&E5iQ4n?#g+6e3b{0Xx}&F$tkJx;o#hX{M7$ei$; zaJf*q(7nLDz*7HG|2p3~AFO75J5zVU&1X{TbnqA~@-6c5|9&iREbs_^XgovdIYoUI zYiraueeZnlJdhqp`JhMSE=TG>zHoiv;vP8GJu_nmS98!4(5LA%_QdfI>wLrXVfs*MwF+IcOchSbN<3XZ}~H71j*?bY^d zYqqu1+-W{E9vV)}LB?Jz#u+c>y?jrXfVZG;tZ$6HJoc10pRwLvFLKX-6cBv`lsz@h zQ?R}@(KFFA&^ypu4_@#2;1P(GAtH9Vm2fNJB48X<7|e#x4135;y-mG0+&A0}T@6JX zS`mBmIG@(p>Fm_RzULN33xi$+?Xb5iO*l>XNbpE-U|?XNoxh!*?_wVCKJ`6L)2FGQ zV*qjq80sJDpB9)FSPzd1&R@KNAzo{|C6HJc|4|E%y?v#mQsPcMq8w4YnpbP3x6%h- zZnd1doY=oj%_!q)3GBeXlO8m8HFwR?=jeAa$4pJeXXl5;7sKO+$MgH9-{3gF`#pl$59)&#$1RTQ>Fw#|IWf*P&IO5G(RtE(^J@5w@=^yDI6BrYi7n~Pd z5n2)27v2}9uhwSlnB_M{Ezw2iqLWe1C^u3XDf85M>V56LMjb7CM&H3JklGyTS#AT) zVSNVLyV|>!!z=Tn_7QF~l{DrAS(U8Hc4@nm>?Aw6u@Hg!4Aw+hC!_W!A7Jf%JGc(g zVuu^`j{My+NB!LTT!Bo4MLg*umC3u6bOc_(Jhd zKtt%nc^6d&e4dP%&O*<=)w|W(2z%J>V8>l=>`mvs-;PR0k$d*Cd)a+3@Aqfy&sa0e zp|E$zd2?z=>ce}ev%j;Sb-JHGYw!)&0Xq3R`CA8C2dK5>Tp)F>>`PUTRgcA+@#a6+ zyUw`r5PD)CGGAe>euQg;i{}FWbksU( zQ`M;|wK$NWNvz+s#$LTXm@Qsot}$;IHw=HwkE&Ks$kYAT3}Hl>@Lx z`VV&6_Hg%b>TDnBkMx3Isy0<)4suvItaOpP$UevC?6LQVeT#nh zl(Ozv7rVfRpfC6$`azEE7_If>T$I{ z_M$#B~xzM-J zw;Sa1=R+mb=l2Kv0gSN*!=Z49KR{RPNAt^URi z?sxh-eY!9)h*eYc6A!F`HOTtR8j`yB}u1Mx&Q@ zQa&j+R2!-o%hE<;zs_FwUiUiBI?pigFmD6wq0a(+^>M(t$s)iDj>R8CSF}d_@VMb( zCY3tYWv*qe@_KoZd*)Jd37tJ_;5E&f=IYq$Sj}k7DDP^{^o|RT3w|5;HZaLQ$sh0q zd~3iMz#KjWa6XAOl$Ak%*;V#TQz9vmaj|i+>SlG5fA0~_2dm6sK@;aUK)(6dSdqO6!vO<0jjE1)i0DUl;hHIiS?@nb_1L9O6#B- zWdAKQ_#yT~jJlg=(Pz;xC;_jmg`k*GOvLq>t;|+I=*f#XMVyjSNvW&cRc0T6^#%G$ z)yFP8#`e_EQkSzUZdY7K_?$70=X}U>zDl!*@HRkQ4*mKd74;ngM}QZ?giU~V{Dk0y z;KR1Pt{c}4eq))jz@VShPg;T5=S#{Zh5L>3>-qIeu1uJkIpr#W z8ScSgD(D2*2;{87I(;3g;F``jah1ACod?fo*4*C1H2;u&$UbMCvtap+=((&p&=_bO zi5+1DLFAy2=|SC4KLs0SZsjx$+Xm}}3qr#sV~CDIb<31;xSsom7D7S>qPq(+GKuL|A@UKM*jIlI&} zzA0RmS3ym(BYrNZ1rEj?jC%~vyaSl0qGpJFQ)+jq-`XH=kk3FbcGbFS;n!^pj17!Y zAHW&(J)u1z`bv!sj1K(i|I=R_&_|lj^D$`ZZ|bK8hp`oPVjN)Nd`mrec|AZMXOX$c ztb#c$=C-L)s+32`qi{Zkz0WoJ8qr&_P{(WQZY$1DdUwfFZ+HI{6 zsHfIbzl1SAd(vZ_u})vRug&Lk(mZJfjiB*0U_F=jP#Qo@UK_x;rKQo*C)1cUX#`VH*{R3pX3{mC9kHaVMo)4Ay|U$|gh;L&F> z2V#GoT2aRFwLohy1JDn*r_s|WiUpXg_m#2B*qnPPBbAYw!Ut>(JoWNud9=0qTK%Kz zqYF|FH)o;8d&i5~{nNOoaZTczV5)Oyd}qK~{*kyNaBI&JSI}F~%Yx=F*s;vsEYFVi z@BrE*ZIaI0=j~V6i(Ur46Bke)nID-i>h={w6+_vB*@GnlB?2@3GjXfu^Ybox2Uxdb zZFxdqLV&)GV?$#@oB?6XWkiiA?_RzW7wii*y-hf`HC7p`>{NG(d!GG`N$?Hhy;Q+n z0qzZL+%*9IUi|)!V9$AGz*^H;^{m(dy+z(4cayqFC7qH^IlG+AdfZlXtNG4&hiUJ! z#xB%BcsKO}ypLF`Z(=l|?UC`=1kg4;vLD&(oj#GCNZFKZ3THv6N9*nC?V@&;o_m?F zT$1(pNzkiPSDXAlpn!-!6?ZDGEa>X(>a7KB0evb~>#Oy8T0QLnJPIpguMF?aDb^J0 zym8)W9BUj)h$cjzhM$UWer6D$E_w~#F1(l00gRpda{6;(!gjvDNuWufVz6RR%qU@o zqyqL%kH-!Z#!b7-U1nYEY1`~6uB~^NdOO-?J6oBh(B&upU_1!FT3&<_2Sf=+`lR+6K-5KFE$n zM8#*XgEQI}Hx1zVA>)}(&{`|M0Z$mADErO#0qXJK{503qg`hflV=^$Gm z8^>w`{{;UDGH#`ghgyR|u|lz<#!;h#)xo-L-?lj?P!nDR)M4}4Y}7Vtob4$MACe6K zEk75%0C-37UsDS{QJ<(|4X@T6(0}5ba!y$#uabL0i%4Df_xATTwIBgAfJwlL=0am3 z*XkNCVlTwmX=ASfYtMT?4|r!auo_s^?dtZ|(5z;_ey0DcFYLko`0SXc;4BCA0tK-T z<^`Z$v?^v#8IL{#55YFj3UE%0ecEI0V{Xn^7uSpH%s(c=3+t`)R-)E{vnszEzZ(_d z$G|?!9g!XP}WNC!4 zbuY}TvM)B(o@)Q&{NqTnB=ehXpf*r@YrQpU0}@?{s5DP>T>(Mx0kFT58}NC)!cLv$ zU=zH_E?}maano>VxYW*R=ddQa1wI_?3s7%A%b0~z#$)^y`zv+=JOlI`yTJ&7nD?c3A7t`S zxqao$08g4*(6LU@r|8riJcPF=`)70EOUzm@6Q~9Y3 zNr=igh>5;@cjx~-em<>n|xN~YPe1xb4*bv(gn+lcz{tSFa8TSvxoD1ty zz3tvY6V94If4RTR8ZF~8_L8XuV4sV9!=m1z-sgZhCi_S1F{Q?(#_b2q0JZGQsm5WR ziZj67Bq6cT;U?a*Algr{yRXxS8GZ=Cg`?-8}PQ-V{1y8^ocS;2AtasNE9 z0Ne%r1N{S)f|Y`tZDOLvBsxtrO_Z8UA7%=edqQGhSC%S^Txqm2T45f!UE8kBfOmL) z`25TS=fPue67&FkUn&F6D`W;e)t>5bWw^rFF_V-@Vjmzo=xTKpb$edut-%xQ2igjF z&tC@_a7#@E%ulmeS*-M!W%oE9bU=XQ7kwGl1|c)hio1%tcrP**W&gE}w+-8S-ofx1 z+zeQA9tLs)YIaU}PI)$9KMQLTS)hlZC%|}Ryn-NDt|4!C~l3sC%A+T~|ky zqYB?~o}sOrR!$GpjW${vEemtx%>e7n1;DG=D{&{uhHO*;{5e=_qLzcPOb9&0{2+6# z`|^D`H@r!I)_&G5!QcHRc8F3h!1$8->e=4eUe2R60WAQ14)1&Kd%FPErB=FEy1To& z3*89kQGdhyDEnSKb|rxzV%?5@ILz7ZfMeD%YnQ#t{>Aylp$27`JWS^N6N@md(3j!QQ4O=&@4#&A zEGq6T?mY?^cXF006S#|A&D4cngXi3H_j5PnX!gFS9Y~|5QJD`Gf{tQ{J;dhRNh70? zkq#amN>mYEr|+?gg7*?*%?;3puohAlR0C5$hG2%^6L30oI!8FcpN=_ge)R5R2o*eiG$ za|z!A)}HuG`+}EXO>m9KJ3GS5t2{h$ibso!GxRQcRNdfbaueS1^is_&=a!2p#gy7= zZI!W58SH*#Y+ut=6AoDuTq^<3)2iSYJdN`M>VlKN0Cj-6SXr!$gO5*Rsj*bXDdV)l zoZfHNZx+hoW<$VSiQhc$`p3Wo<*|Q>-#l{`_LNl2cYgxco$C(kmW(^fs%6#X+H&oo z{!qW`y6aksx);BBYO5D{7kSgirH^Y1=o?uH_`E(u^~1e?c>eHgb#E2@nyPwLo%z9E zn1g5`w~*I6>zxNAUT*E z%nl!UHo|U(Zwj5m{pkH@RqQprU|uk5L+3Nond$s4{VwkLQ_3mjo_bH^OzdRL9h#t? ztDb8x7y%-7II8^PByf{nmPG)d9=QW#)fa zp4J&qJI0uv-+WCV;(arl`3x{F;90?MeyB85qE?RaZAq=9Hc6kP&v(riu{}L`*rV^| z?d6RD-s{}~HMXAv_DJ}Lap*hradzvw^@-XhJ~`$$jq-vhq~+JGXUDBzju4SM19bT_y^v_CX6JTu%q(mg^Q;j!4USY5NO zc^UoGoR|fvB2|$%57-fX!LjOCb(%I!qn`rx!}(nKPyzeKH4Jc;2ICugFTiKcvxz+= z_9ycz`NbW20XrP1!TcNyz>L*t>~cu}{Mq9{N-QPD@4g7=2iUuxZ_YPITcd@Zv4zvZ zDGU$)yjXbr4ZMh1d&#Tk)$2eDkOgyo=K-}WJVS4RikJuEJ6auZXyGt?vx))gGdR~6 zfOh?ic1ByOE>+p*ISXAd^9SZi{N@)xvpyj@A^Jn)he$(shgS$y2z3c|2~x8-9#DH< z1MvHQ54H!l2WN$5g}R2j3hycEwYtW-#vWlIHTx8-W&HNoWxt|P7= z-9NgsVQhT%ZQ#Z^rivFl?FnhTjzND--&4+h3`vdjO z`X+T4ucNP{)K;GipA7H79;m;t`-Si5!N9@5NYD`s0e1o8)NexH2+w2oqTYeTSYnLY z;*c3KyVzaq#hCwE3w;*jp3}-{qlcZ@^%>{+{I zuJjLlxOc)&b-AMfelpLBKPk z2j+$u+f$FD;ZJqUP*s60koB4Epd;o{AK*bzL&yF+^-4*geXxD-S>Tz7l?DX{p^85`a0&E8 zPrhWRWGEhcyZ;5J;C)ArKh{~O$;@bHv^&7RYOpj|;+^sfc9d>cw~IN&?s|9qC8*@8 zB+k&u@ZS9n@LXkmkGVW+Blp$&a9qi&eyx11u%C_}iPx=@Y$w~xt>xA`^PQ-VY%(@M zMbb>XoAh1o0T`d=FmssK0DHTW>`6A`SjIN|=36Q)m38Vm^`-Vw`vgOPWAM)Bd&hV5 z9AKSp6F3RB0p^@Jz;w@aaVJqS}dyrmsewcqD2^>>JQ;Y?^19hwmca$?aeb;9Na*xobRYJa@7Go4LR)eV0z}yRK?i zp>J6ut&zA(@EhwJi?#1RVt>SbkNzHA6j>x{c&vM{o|Fxo#U3bn-OmBk+%Zpj57__s zHT-LMF!akm!0&P$c0MMVN#l97+zQf?7eXi~Uf!_1u_-KdgW0 z`V!evM|8$VL-8~K4ta${E}sux4lA(-gx}I|==N4CtCe~3Jb9orP#WM2a8}u?>=Y|S z-17_JNAS`3XbcDZ)>#vwUTrpb4cN;o56@uUW7I}bbGu4fCA8`xB_#Y@sI6wa5d)k( z;|vn(c+5d(06y1mKsvA-^^+Iw7s7Xfy@zeuHf_2(U2TEcj1TCiwsqP%2do2DRm|)% zXQK|#7x6{jg|Qwz^ePk&ehB^$ObZ?b9tExewCMwFf^Aqn6S})q;Z@-uBR@tuMmt7F zKp%S5xN1;;w9H;6e0r}+SEXz6HJLT8SJ<6!1#=VBD?SIz>8W8O8NoJv8=mI>f1cUU zgJR6g_=expZfUnf?Z-vz_4ooXXQp`TO_i z9#IcHq#ROu%f00n(8RL-eHeQ|*wbo&J$?1z@4#MNEqKSa3$+Wa4XzCq0q+9u#Pj5= z7ytDkFgi3kL>+l<%>T<#ISNTyte#QNpx!WpoxyJHw07uEOFd2>rH?XD9jJEIx@x&F z3(x)-;|}IWtlPx_#&xXOuGiLUIl*FevHDJVr?^2_3QPQX*=#Kh=2`QsPZ;QJ0!|sH zjP8KvCv#uEuO|U>`3GPVe8MNd_lZ9b{k+b)LNfFgFTr^1 z=tYae+YL+xLqQer$nywQ{raAf@X%uIp*{Q@%4_8{tS42k%h%;DQWuGF9pehdY`bH- zW7M$y3Ev~0i}Y#W5b5OLWOV6Ei}#dz@mAnEm=KyEw9DBd+2C^SkG#QBZ^kWspg&_A z$~fgK=_@HGc5r8epB4YPs-{Afeo5<~cYwqFAEGuI*27RVJ<{g`)^8SK{v$15Z6sAm zg-SoC!hA6;X326mIh;=L`DdRfA7JeftwC{Sc7uNd>)Uex^%l%a*(X_qy~us+K6XW? zqQhnjYwP&+%f&IX(;t4EMN}h{=@hGQz+XB9y)QGhKOWaG`tl!Sn z=jubXp;`y*;`$06qUWS@qTaOA+G#Ns&uC;cK8t-8%N)%tW8-KFV~k@3#{$bc1B?K{U-JxmIch!6~I}Ewt!k! z>PfZ$NWgHyE)?3PJa!(+iS6^wc`@U?1O83_D*r0kv450t6Tjc*fEs~9*!6G{l=7B> z`_TZnA`SL70o09i=8s-9D3^=4o;ucp(Cg1oW+WkCPKV>098V+8dgWRnin90n=_dXlitv=|f$6$-rr^hcZypSJ$d{?SpfQL#hV(?su7 zz7x##R!A#^CX+ciHDd#{fm%j*^ZyLa0qV!dA;8+*P58|4?m7;ATv0Go8LG_0KIaM2 z1fg~K-TvMF&-xFYq6XF`a}$1haiR}W3$xrMK?5)bTmg))ne#Iy*o6J^^EGG>EdjN` zCG-+{BDBy?m8Z%Q^gY=}Tw*V=Geb{x);MeMj$Vb?n3a*05#BWi;T!7#3xf-xx@j6L z4$6U{AOJRpHit%pM+m>Ug3*G}e9*q~9ob-RFfII{wxB+=$Bdh5E47tcYAux-|L5R4 z{X2aN_y@cOtmCsDM#GVj(2{;sKO!3Gs0j*T48nVaXXsqa8~z8aH0vYB zjAKSuz%!I}GuHFiqssuFyscoMHPC8^`PqC5s7;5*8mNF%@)l)eLu``2N&<}TMR*Ajh+_*vVkZPnaLZt>06fd}46>!j#$7dMI< ztP$sr=8xu$Tw?c&fruHR}E9k$oz^ulpFB&Ob;D) zKdYa$!`@*t|7J~>8p4yxNo5~=Zdgx93;)_aU=270m?O;roKsn=t<}B+E74m>1kIJ^ zN;m8W;JeiqI$pk`C@&+r{LVUN9>aEreCD6VpU9TR89#w#fU#*tGo$$CSx3oiXSP3r zBbXVbC(JB)mb?poCePu=N%7tTc$v+Hwu-Unbvy?f~-yo}*)tm)NS*1kHo_+0=&Pow?G{-z{U+mN2@9Ze% zO*ZNqb?VXC*QQ=I7xo^n0*psf0Q;egLHX`dPs;O_x;E;{kE%!2Ey@;UICco8$6guk zS;-5%+#7g?KSK{T2obFY(niuoN{35_xub}^BR)gUA@Y9b-Osv6m2j0XS}AZNJQkUV z*_M9L!Z4=3k3A^)Fh|(HY2eg?hN_@kP~7v7wxMeLR^>fT%|l(l{EhchSHSo7S7@yH zJb#DhdJ({!^^AN*J};e@_`dsWA5@|Z?8DY!xSJFdUSssJJ#HLFWpsnFAMp9+gxAY7 zK#lfm@TdK!Jp!85a#A_zGx;+)E42I6qJ6J@uXVxhyf2_l^;fYUH7}qZoVD^i(3~+I^vOPXhqObg0gW8*K=xbP z7;OyJ-^O6Rk3KV-!kfengLa7T`3!mAb5AYrqeh`dp(lW~Xg>R*(V`-*k2m5)jb|pb zGJn~B+4r1#4&N>7XAcS}x*VVh@z{BF3iDsQQ#fB!S}m=zX0{F_Li<)9 z^aMOhS*!mKn%vRAM$=*p;GYrp+ zXU0wN0pvDwn?t}G!2VM$yOyYp`~xk^25E!1lQ=WEOWma&M_*_?`i874@C+S;8D7p# zeGhhmqkuEuyx;w9KU6#4xLM<0rY{qd0N$o;Fk`bZv=I?}p%68=e4dwq8^f=|z~|8BUI08p zJ4HK1>&EKFsF|3IUF)Zyxn-P!vbFPGdM|t?_bdCAx$0a|b7KCPQ_m@$Bjfohz|t(- z@XNKYzz*!AD*;$*VtqXk*BKbU_AKZ_T&nAn*l9F;bvv4jS3vv)dh9 z1nfb=wg}yW^Y%RKbL;@`-IDN9ET|Mzs;E`O`O^%3&tIbUMU4P8z}G-sPhCX!D@ART z&vPay19&GfPhzi>S~JG=ka`Kd&_rpX&<8U2Wb7g8iO`HS$8Meek^Vw&e=~FwRna=3 z|APMoPlJ133nBBXE_|B!&N8m62G~z(0(d9o0@Pyll6px~vE%r%eHn`6 zGB#&oivs!=CWFrb?|a@+{N68tx|kt&12)MKLh%N`v@QDmywr|-O=6A<+0^4 z_ITc#?@h*vyp!`l$1KT`{2W|_cj;>Ec(09pihOn-K^i@c&@9`U4VCR7ttEH_T~i9l@Cdr&+~In1k)LS1_?@Fifp@;%rOc*gR%^E}V*${hCYb(m!;ZLjd2F^`2(PeyNde+D2aW8>>u%dXPjREu#d;Miamyv`bvEn_U7@M z`w6}i)N0d1k-xk8R(-MW&26}i?6K^zs_^RR6zL>1B)rS}gTml*!1?%Q-~ebAZWcx; zhVI8HF^k*>T6gx8R-3DZ=9V$z2j_!xMYZwBo(moUx9-+602!P` zzo{pn#)Nkgq*_8ZbQOEQs2$1(7~8IaW-L8m4Uaj*Vt5JF0*pNif);@P9`ks{gazyZ zaFTi^G|a4r7LW_b8I%l4cJwX^Xa%(N@Z-D<*f(H6Gr~PW=tx+1;tUP@oH@Z2_Z28@ zo4eP;>*KP1S^pceY`3u+lJCiOXfBz}f5-jsY^n{8E60^gpdofheve&x%iwkU%6?@x z0cSA7Sp}SeW|%P&-%;kF)Hm>4JqM~|*8CBmwwV1B&WRs|#)Gxh>t6COeaz zBG`@n8XktcBRSL0x~2z|!p;KDbWxWx4Kx9qXP}0Wd;O>>I|6v#=8NXTZRQic#|Hjz z_JV)s_SnzI`pDPv*YamrqV*9__t^;k%KW~WFBJu)0DDO%wUgR6AVp14Cjk%Wuk=?o z${XcN(j|#~Mb1|(x0l-qV1hM4=*HMPY6YqS)|du@KS3@l7q;B|X?4YXcY4e@G1ne1 zjTgFb)(ARc-iL89f2X%VPghS`QMv}W2Z($r$&-YMo2)F&dw5rIR_&GR6*>+1T{ZL? z!Y8_g+CpupG*t4-`Q=B>BZvJ!))sl5vp!r9JC5r{>qh%V`bIW}H-_nt#a$uYKyAJ51A z@DJnA5_SpuC15R}4tkSm(dUvBN#U821kDd?c#Gl1!{@~Ovy{7(`*-jfSl~Z!3JeFf z%SMFN$o0Mcz0k2vRwt{oFxxg#9w}Fqs!IHRSkq?zkTubtV?W2%N7qNs!Fv~@M`AA- zdz;I_V8HWqF`x!#et3SkN~DVD$uEyCkM@rBjN~>$1_S1uzo@@p18GV1jB*A_vtptL zHU(Z~Jd>$+8DozTHM|kl2rFtvp>kR#?sneqQ^6je-Y@VZstC4VZu&81?fG8wK42`8 zDyPbS!;f;Iv(Tx8oeTVDvqlq&g~WVcqiCb(D0mv54xh&Ms>?UMeqnWRLs+>{NCt{nUOOj}T`U z@A|!fHMHMA3-CgHfo|SFaen>=Eo(N=SMDox_Q$Yufm#PXPd=wv)-0h9-)-*3tvW`; zPwab~0FeK{EwLvufT+-ivIor=?gm&WFO(VUFqRmrjn$Z^vCiEMvuF1~GkAdS0dD|% z9v1-P)2e{+KSE}qU(SZ!Y#ud_T2v{jQP9PSUi5d9niy`#OOpJRUYHaKUTGoE8_nb-E(j2V64Fg$9f z$T~FUF$Uv& z%u4KCU@XM@rZS*DWG0|L#{$4UF6V9-4^n$aZ3KICDS+Q)E4h_iQYk5F3+!96Cvy}~ zlk*2C29Lf~;3bHFCxAMg?tpVEjREsz#wtI-2c7xx&bG5Nr z_;N<^CpTynX%*QP-WIM1U?(SXBlbc+fx6fQa2t$+&m}c`Hv#7?`$G#i)*NfDv({Pr zuw&*o=QpRn)L&vf+pV~-sBkt|^{~sA=k9*cUFt4n zk~7I~0qdBrF=uoGn(3+7O_>Js#jN4+o2Pb+as2Gv4N`32QgJ%rItP@6enyi#3bog2!YYc-GXgYKU*1ad;NYfBnnZLY!M8;2Ficn{g(4#mS&AXBI(Q zkOpjr2C6Q2qr8E;@g&8TZMgv$0guid*pcD^)9h(N@309ycg869u!Cd+;2g~%@CqiJJUpnyE9ou?XQqY16NP6f z>-3{QZmRI?8h^Q;@!v|Df<$2u?xWuRzZvNjr@&VS*fg)QOl?WwSppkTMk`Sc6eh^ z2bRX2#yu45|DVqc`$&^PIdB4V(-}cE_!PB*A8RkQmpW1zsf>U>Jm+>YU~kFa*54N6 zjMK(x<9+OX>?B7vm`+4N^$S%No3SQsn9(d9GiXGm3 zPxf2;tpoM}G5^KytSJ2U*lRol-Aa44Ju31SRsMeYj#6v)9ViZ%$MX!$3=Y6^zYgHL z&6-s%K<|)y*xA<^e1I=E--XY>W%Dw&W9>DM0QO+`JUfD0U?BWMzjVID2JgQd=36-q135VDern0hkXB05t&LO`f0heqg_I4X6yi$$NnH>2Kgg z)6Q%s;+1ajp{|8|FA*kkcfcBXji^J$p|`~Qm3c7ZYQ|8N!582fcK!?k%;%0H?__P{ zhI|9cksNX-sgs!hV!lkxSYfaa`@EjC4W7T_De?>!E~&&xnb z>^oq+ejt1yDnd{AwfVJK!Kz?Yv@6=#F;Dsq?1t8h`8@mc{N{&ZZ}N4(bF>m@07?L! z1HXbw;3a$)CIbz0lsn2xv5S{IjOu`KWqm*m3AMMp12{v&n%yJ7n5i;Y1~@Br1bhcS zLiXj?KzGP*zJgLg$*<;DIbU-ewA5Qd<$puxOy4oU7``c>uAwI2eRKw1a}B}o`tSN} z_)dh-Y)cP{pnhIhE-YgOkHj2eJLY@WLnq5`p0Q|Q&<(SOJ0d#}x#tk?D0_C_fi8gY zKIfALVpohe>cy7L4bjG!x##QvwMLHVm>%eid4^uc?8UFrucDWnAA0%6U@)|zj{#$+ z=78UP8;~3DIrIO{ck~bJ^5x%~^}C1CL+J~^Z~nf09}1^V_Dk!fs55(^u{&d)fs$ks zvd|q+ww=1YyE3MU8$~Q0M@YfqvpLD^~8Q!KT)Uo6|;(;V~4>s@DY@8 zmvOfM$sh+{Kc0GPY8hD@DWjDUv!1Ls43Y=Q?WA^60jGfQLwbgJiBu!i_!3Z)GnaEm zk-sAq!TIocJk4?84uBe+@!$?<8EGl<&Kc1e(bBQfu>knT_($}S*}G+4dl8;(OW>XI zEqe2L;6K9W$-9-YeM9Jfe**KtWWY1t1^6AY_w^JS7wYz|K@XV$G?AK!-h2@HkpX}; z(eWSy;Pa%`X&zu-g!ex0`K911`zu6RXT;3BTXIVW!DM-|+)wGJw1w`YDD>y7BQUo7 z2)bhK@Dj-C&I(uIx^V4kgvhj*@a~!AnkBT>b@V!7o@$A@MEu^5%g2Roo%wBRXcEd{ ze`IBN2T%*V1U^!CqIaU%0P`h^f!Be-pcnWVuz$=LfZoe};4_&3&(4#8chX#VWiPP+ zbUw^ITVURVvEMzg2)(fi(B3i!X77mgWZvJ^PMDAZYXf$pF85@Vz`fcH^zkPV!IFA--gW}{DgLOY?oR9`YxR#{(- zm*eG^*aNf|bD50SX25fwz3sd3MWGI_MYKh96a1KR0(y>30(}8%diw#-f{lQ8(m!Al zJdvp_s$flL`+R$02Yf?#Mr4EU1iu~DY&?MX${_d~Zi{Xcp8MUfdy4nc9>7>>D%b&- z?2HBM>9O}*K2{zsN}q%`_h05;=2`2k$f3tW^Hu}?J~IBC28`{K)Fh}~M`KdxEUNQC zmGwI2NUZ&EPMH0E-m8rh6*9JD5js7BZcl4qJy8>eT+S=JXO2h1RJ7r~&wX zKEOQsaPSH}&mw@i9qYCmvFGTZd{EvZZISr*ZH0Nin(z{BZ?+fOz;m&4F%}gnfhCb8 z;vHq4N$tZDzu8dZ{;b z(*>|Q;tF6cM2+$V@D8McJAm(J9l*NO?||?0NodV71J4c!t;>7k6ZA5`y_voKT02^OU@-{8T9a@F>f}-oFe-3 zyjzNb9@sa!H?lWU3_QR-QofhV0Ar~8plYP5*jYw>J?r(0uz#a1bg#AHsl?cjdJX>F z--ET7SL!ZzmkVK5pSf>0czf|2<#SA@r4t(PMD%1CXO9KB0edyPKU3rsR6`reGvLQ? z4Sw-u0OKI`=bu_n#XX+}UKot$d6shChBKax0BZ`l;XBIb&pH5KSk_0V7vs;8NzEkc z3Og|mSsAnXdq4qK0c4k}T(Vmh&y(*bdz}IJ>~98T0b|y4+Bs3bOHdQk!b)L<{pk$w zHF;`3wVBuO{J94mOFGaf)=13NosXP{gHQ$WJlA6GcnX*dwgc9hsM(=5^bF_$|AAb{ z<#}!}cgbpJ74h^v=o5Gkd?$Y=^PkHcozLtAU=N;mdw;;#iLofp)-fOlpa!x5*aGh+ zzE?TGkMR5EH_!MvWQDAefbZpL=$tkK)+C6i3vZXpfU##G!0(;?yMv%DIIW*%8%Zw&-;d^Mb9I<9Oqu@w zxH|K2E2Q>+@4e4yKvbq^6b&SlAt{)>FKbyoUGB z21N!%>eJVKb?oZcPB5<5Ki^if}dAQH2<&4-A8H*y_lQ7kGH(lS}ALB zDt4sxrdE&%FXwof$?bo_9a&3qE(v!|Xgk$GM}j_n3H{c&p;CIKaR1r+^kN(BGszehiH5JAvAVd(?W|xx~3}-mM>Bn{{pI8=ua*^wvNYK_lKPun$_@N^K!6 zmKOUB7N#vsdy+eK4}kg7M!1JNMU3yi_>ZyNmCy+afHnDl(*L0wyKK63KGe|Im(eey z)>F+r2U4edA?t;#!Sv89rH9SA&l)h4yP|);_&ZZbJua38?+kQ?NuO^`bTX9TJ)_m| zc>M8r1}ve+etH7<9M&f7$*jZ-+0hhz%tjSrmKs##A=~>f9wFdhf)S|zEhf@!8Yw+Pz zZ|>W;kvaZTU|s10dVAGqwnGi>;hhimi*|!4FbhUOTTo}3Nj=G5HPUOOt2b1>V2- z8Jub9lIW7?nAI^$J*YN4nOATR!M89VIv{9f$GKb38izTi`ey~uhMC8a9^y6UVU-?E z`I)Hl^Pm66P#Vl{*pPzxsQCDNxC0M}D{YL4WYn*)XEeVh&I zG<%>Y^QVRAH&xFt_Z&(8NPXV2aDO&OLs|#+k@N@8yfOYVcn9i(GeC90nwWm|2s8a^ z=l-7hB!9L8+_$HX^q!f!p$~5lZ=fz*1V&#R9oF-&3x5TT-kj65wSH_psclAEBCM>8 zY4K@sdrY;%g_y&Z3ulh z*5qf#W}=|p71MttA_*$MwIkzrpAe}uH7GeKnIAsl9;Z5>-gJPw1Jy>1NsXQC)lt_s zmq$JiTH?L*FspZe82vEXJ=Q%|KdpY6f9_JKm7^9fX7Xkx?~_@tTMx(KD69qNQcHkm z{!IFr^it56`v-c)dWL!A;gR7H&t%JF%b+*4{qJsLYeU7LM@El~eY~~wG!zE!zc~dK zTI><~8meVf3)u%vt+pILv6yiUK=`=*&2J^tc9-w|7`0;!(bm6)2oRTg+y8+ zZ3+CZzFeL=b+i@!_x?T~aSw%>{aeYm@T7&33$hkuH31W{?O;xE5Ipw}!{=cC)&}UD z>YTcS3-0DY2YOchuIxYl9VYWuhOzn-u!qF+z8cO$CL9FMep7J9p%PeAGEZL1?E2y8 z;pmyjnTR%JE$?A@HjFn8WFFuK;hQp_k3Sz@&buWA!PveATm!kGAh3dK^ z)yHoHbLsbZS7vx}c(Qw{d#VEOa{dnQQ+KEntHZS6$ym3vZYc8`gGS=HSI1Keb3NNb zB9_2&zRzU$?XiW?h0!ALG;@w~>G5>m4@eG3768}Nbu&gX=bR7fB!7Xve+VSuJ>L1N zn5sx;$NtbeqBdYoyF0c!wwQP2?60^o$CY%74h{DpJI|M4dw)AH<2OG(KdzH$2+Mglvjvm@ z->AJBD#0*tLEeXQ+$aA%m?s(6`&ra~3!nub1>?}VytR@6>f81^OoqLX3Hp0=kxgJu zs$TzP>`QK*XdE*~YzCjwH+PylBGf|{Bo{EHS|@op>u|`EigN#@vn)%&o+f+poW*cP z$us{9b7*-|d8q1tnQ9to8i~VV?!6ox8y&R7s`OBrE49keD&+I!xEo@#M$#fdmtRD!?jW24wPp2sHFRgPw#2qDDc>#3ER2edimJ0e0He6G&l;xrc{$jY zwJqdIH}YFj62g4lr7|c1%NzdmvPxoV=9J|tYk>Onx`a_Lf)NH>%N1vUVow6r*0Pnqxqo2h- z^&6pQyk~r4#ztNqEgO3Ap6BiM2car7hCy%~o?|A_FWkKIcJ4$z1Yh%x+AQw>Qor-e zI|FPDM2*8f5OaAonu*|^{0;m}JHZ&nT;BL_1Xw@U_L|q39~hS#pMS?4x}AYmqon!e zBVa75uQz6D3a+RAR;@y9*7!huWd_uwPdyro^2+H?v8icOL;u=V?vJ^L*^aUBH`L&+ zp6B63&<2zQ?Ppi`nZBU{V0`yl?6pu+vYz@gJ*;cE)B7v#MKO1y9Fy4)K8k-7^pW=5 z@n9@E4(uPZZrm0|!U=emH>UOR@5J8;KFJwNb>4xz)$~&GrDW4o(^URQej>l|oqGFCu!(nv z$AEdLOa{-p`_uIt$y-r{xfk^t=uJnAwFkA4vfRgi2Gk>Ja5w88Fp_)p)g-i)A&$eY z>yJ*sa_9=i0oFXV4|(7n?sQPgaVFWgDIb_i)`BBhM}kgQFRNZw8E}8r1obX!JH}RH z!P>-P&~Lbx`q00omSvt{z3^Ey?tP#}@;;mZ`|;FA?}O{$V2*=yL=4H16IxOK_Kf`) z`!W2CRd^4id8B!`qpvQ#6@I@x=wDmT9ks^x#z6;oFRwXhN7bF)gLmLF_y;=jcG;ic zdr()>3po$kao?rA2RG0YPWu(N@&Aw-KtI3zljalFG%~<__&MwW*V1#p8eWGIVBbhr z$O{vq6QXI*EYd9a`GVYM;(FEq*K;VSX{*UtUn&gdPTH|O&?MP}*Gcv!pG!TL%7o#> zi~4zUrEi!!SBtp;#cL|y(z!LGLzs__q0_lX?*wzFWArz;)+OPc^mo$t5%(2@$C$eu z#=SW6xw~g+YH7HmZy9~e>I+4nS7xuwUGZJ<$}kt5`9ApL;vW}R!$Q~yq{|nZ@ow%` zXwEyY-c9xzbJZnyFV5Kv<4`~Ii>VjGT{NCo=eI76T}sF2l-Tvoae{fK>$o1A{qVC{ zm&n$aZ(&|zd2~75dliCaZ$H+PaELjXK449A9lgvif@^9#Zx4<()H83-fp%djn78@; zwvDva>_^nF)Ccu}yFpFCTF9;RtPTWgaTdAEH{F!GneBfUZi89ee{4Zk8#;`6dF{M@ z(>T}jV_xIWVcxisxyc(~aC~s+ZG1W7TNkz`O-9a$td<2YDwGA8Laqj)N2w%`! z9;OFD+fV_1pf2xBfcMs^ z-wkD6%^p1K8nxjR{SM~NEkXNP4O)S9ouA=u=E3Jc`BZs!&(c&~-W;`tI+&VF^;q>- z8o$1Rn%oKbHC)FOMNcpXjpU4kyP>bic};lxUP{)<##-jcT3JP@6!P0aL4JD;GFTzpig&iu7h8pIBzoy0>A7ba1HmMehwX(5%Lbv zyve+wZ`j;Mz3CjhM<1bnehHMKCjLCQj_ys@)E=FOAQ?+?Bjub}Gcf*E2RIu!OVzVc z=n?gMT1jobHPHH${50!RZZPZ+YVq2e2H@xU5-#HoW_1+fCiPHfhG#;(XuYVLY!eKi z@1iihiSL8+QpTfSLnhcKVlHa_v@^%f5c?O%Q6SuVr|xIW+=8CAcbS>~D)Loi88hTd zc(=qeYF+7Wc$;@LJi~QhG4IAd2+51di#uQ~`~d1EZQv(p#(NR_p<8CR%B9MA0%=`7s>Y1fR ztLEM&vrXor_@a1Wn8I6xbs!J?fh~2fnm{xL*SkD#?pRMM#~lWn;7w{No&a|9i*25lLb@N`}8XGgMqz|VTsPS*%o}q`pxY@g01~5aL7v^#2 zaYOhc>yJ=Baz42R)P*)+-uW$*Mu(mXCAd4!^HQ2#ednHxrU$7x&6pX52o3HgGMhq=%pZEa6SIqF}D1pZ^ApGyBZX<}P;c zk+2u9G1$B8Y|kdRi91}zf&a~9Py_rNw98j=XST7uXI?$Q+QA8M4%PKM1y^v-VP3ev z{XLtYADH*|OYfJyD{U8+t5mor!G1AoE5A~!_WWpz?xo+s{dJJ{pDKbq4|%~}8_)M$ zP!vjoK7I}qppS6`HX!SGqhB=tN^>=ua9(iM@)liQ+X6M7dP&%!2*r)nS z*H)e09vu5RZiMa3ws!>mNG&iQuK?dCzo*jBCCt~Tk*L+Vmi8?>8>x=3R*Gbu>jwpagkmi%UPZFO4noD-QRGOL3c=hfhPx_&o+dWh%!4(JOfp*?f< zzk>bCc@ud~0=a>iO=%+LmMXCws`r{lQhxw(W+$CwwxeWS)ap+8D)cM!ao24~No5uS$N0|Mw z-d`?KE>eZJhKzk*;=W=vJQKlInXNKc##eG<eWqd&B3R@cxwqSm$?Iy3uv8NDjTewAaD!ye4fy!WG^T^|D@z%?xk z>fq}2b>Rg4+dbeI^Dz38HPrp=pEXv08Pr9$aQBv)p`XFMYVNC^a14w??KLrPn+vxw zTcZv2%yS9XaSdi@jw*(?`EQdnqA|8T0@|&5k$T}yuOZPP(IUJ#WgW(Pqj|Kk{5Y5h{lN2=4(6Vo`)k1O!81B4 zGAd$i{SCMhzT{3jd$Y7xA+DgOY7|U@rC<%uyBUpH3o%dd0bCckj?UPLk+RXU(H~(T zb=8~c>s|on=lx+fl;)n9jxY$`glrv673P`5qXz;SwAAD zSwo*tJQ3&h_J(0*$^3ID_uS+L&wMAS4tIlpeE~Lt`P4GdMyQQ+t@VlU`tjS$YJ;1$b-A>2fZB*Uv^muUc$N2ODM5yNCUP_DGY{Iu+J!Sellw#q za;I4zFecJYsv}Q?sqi**0MGkI=BsLgn(m3%iJ*zS!YrL}h`HFW^g38aF9p_;f6DwR z^FGjq>T}FL&D$%3XZ=<%X0kqaIrrMCjhM@S02R0w{|v06j;to}1hY!kDvhPpN9?70 zfxCk|)B2!}FbIrWypyCg7%Q90zXIl-o1&Ydjle!c{rnha42#2xZJPDVAx%~OG^GwTE53`9s@gB$(pbb?6_j~R`KaLt+ z5il<|R=0;_cgF5;<{#s}oC=^uS_1~aacCQF8{Rok>%Rc@ZBI(s7`j6(i{MixoNgu*4xP$jL?TfHBVconGy(7j=k8oGIIpZ35igz+j!sF?WhuHo` z?%`8MUIga!-+^m704jm8Kt=Fu?TPK7lekpOxK_V8iF+45;chr%w#%Rcy8UYIi!2HQ z=}|PPnUygMrS3T<8R~^tv}Q)lj9#Ems>M62E8zaj`*}U=+sy9F0vmtXudyBa(U0c7 zQWLfBHWSn#4|<;;Gwa5m9YB9%4N*PK{CEIVg5S7*p*NV@=#y45KUx<&SN*^`@ye`~ z?1nzU#~U*lld3QK&&`2f19OZ%sXnO;=o{%9Da>1U>I5Uuv5hU(f&Kmyfe<>~z35q2 z16>Qo^xD&!aF91=AA>J>mq}mHj2w9qZ*FekZ3*jieX`{{bA~fufpFvAlwE#vyZ_U?)o>* zy%XGr??7j04QipD`6ZyHZ~Ufa-!auO+#77%6o*fvp9ULxId{T+2v<^1?hX2+JGn{f z6_^fl-~;Fd_kp_Ulb}wferFA23H2TICUcmZn8U8l8%Um$@9DF;9Y%92XC{UEmmm+U z<=sx}as5C|#F+kXcq0Bpd=pgTF26O zL#_F4s0_yV+5zJjwa^mqGyOZpO#kq<)KjoKwL9o{=eRFI8+|_>(4Ei>UG+C`p74I=mHatgO?wrKcs|XZ&&6;B^ZSp1I^G!2Cv^eW zd2jmO(A)MS{j7I^d;B2t>&D9V+&-OpIyEdgENBe*vhoF;c@Ot<)dTmQ+D8sB&s+ds z!Zx@fenof#@<-k!t-<>S%b*_jsr(7XfKMf#3U$xL=;Z!6<~q+Z2m2=&vwsH1!Q5Rx z^y>Tl>yyfWF@$kwDL9yQkei%7%X%M-@vV#h2%fvA;U}n1 zU!3-$BJ;f3AN!(>cZ}igVFt|etDm>t?!7%%b9aV!OX=G?f%(0*)&1KItmij@&$*XS zTWnlAf;Xh}8NV<~l?R$(~X~fpbZh@?Nd`)0nAr zX6elFa6R|^sE3-X6r@i^ztMxdCRZd^WGvWIGz$vG3UVXUiy^+(mi`0gp?hIAJO}C` z#`Kfneptu*VO7C3u}|rI@_cd%cz1;7dK>jm{knCJ<**;F;vNLG$&FAsRXNm=Z|02^ zV-D+n+R&HjsdhGI0+{=>heg2u4EJ-j;cm{SKpoWmd7ifmyvySnFemZnH&?MXYi%XP zFVDQWlDUTa%bBJ1+$n18CKz zV8?alYJq51}Gnwo9TRL_(@mv-+KaF)XQ=QD65 zeuP)tUyR=br!r1)3(>c{ZgtCQ=NHK_`O0x~94YT|q5zEi~pWu`}TJT0E_I$k#5WT@3l>$J|Ts7nmDtljirRD;>{iWUOn``Vx#-J7wO zF0u_7Ti`sHCryAPxc-O1+@M%iu~5$$%G|K_&U5+*^ELVcYrd&SRZj;hlhF{=}GWMQ+Pw9Hf&+G+qlF%kptS$ zqx~^=>!}4@3f2(KgFW-jz*zJySd7-`nYTaWB-+xCumkk*_r&iBdD8j#`FLyICpE`v zOV62wghik~xGZ&9m|?3xkJES1JlZ_;-Z~>U5SGBNpbd48?f~O{{ZctN9X%Z#2hRQ( zkLy#mrnUynsR%Q%o0#2Ji}2@nPhJhK=WXyXi~wU+V^?P$iZg?&?NA$1Z>q+<**`!d z?lQBN;^~w54 z?cei>=M(yQdmi-RJ>WJVB+mE^j)H-l^|`T-ZA16-R*g0^Eh{bf2m1)km8OC@PWCy| z-dI~Q*3?Jt2KVSm*aB*lt>6aOAKg!M^ENk7+!UP~nH#wqJX2ku0BoSIt`B(Tjq&yC z*T5~HZ5;$^cMtFepITF4dL>4}WoTd4r;Xv(LtSR~tkvab4y+S=0jI$D=^C&H`~=#w z_Oml+8??JWbEm?+U=DaRax~0L+u!kK^3Cuzw*4$>%;z)DhkN1wVBUKOc+XWna9^GV z?Wex~UAO?|0Y8I#`!pE4)TQ2UukjG>tSi8~hcn@J=Je-)TDh9M8lB(q&i`<~4uuAg z2dsbChjas2m%0b63mNNO1Nv|Gr*X9VQs3m7-Uv0}75EPBV7|xi^~%VV!6#)!vLb3< z)~t+s?fIGym(%0l4%~;97Xy9F)i9g;n4W}^pdGa)q6SqFT<(8wLN{(zo2jY5o$zgM81ZK(TX8&dy2a+FM>7f-EccIeXqeYzu{k5ZAJmEI73qTj?mEaN=C`=^=1S`b+fdISqIPxlD=$OpWulaa^>_r|Ji zHU@jW?H#)v%qvMM)b4gicXI>G(2$3?$JI6#rWVqv)I607mNB#BpJPqX{Ta`SXGM~c z&_8-Vc~mcOAK#j~H8mb`Qf%)HYBlctg2crB3>E0Nng$o37WW;F1p6K?g6G}*em}UL z%|R_i4MN>PyD>UCI?VpuN^e{nYV%{bN8*>PU#MzV$oe?(anPK`F$;Sgd=~!;yJ@4f<-IdkN6Od-cIcPODt&wA zcjhR+FdOX8IDlHuH@u5ujO-cd%YBCStG0*T+!xyv4)7kKXIm}LS^A>joob>q0Mqn&?jE{f9#>FxOL~SC?^3wWXCnt;v6{I`gy6CtlCo{Se4W zfp{VqZ@ACYy*`0B)Ti&?eCP)_2kz73unwG8r~oU{R)qWH^aI}g){$DGwUvK(P+qOD z6}>b1`2sM4`+C%zUgxg;9Pml}ldvCaFmK~NHAiX=AA&xmJcI zx1`s>x@Q;Wv(JE9hqkdc_ldZk^IeAE6LXBIO+JMKAI1b#-(d~PmT&OY;RM&AszdHuYamwx_IW~Exf9B@w>GwGL% zMgQg=S@&oUAaw|S-Z-x!sNbEVKc+miWe!p;OdZU=3v(U)(%8(gnFZjh_*e0+psz0t zCBRzJ8?Xmz@)pNDFqa<#W$7v03nRH_@@}+X+n$jlGjpXLOv=TUmhyFor!LvO2o+!)^aruqDO*bZt?+EjIJXQs40ec?QG zh;-lu>-~`~(JoQ_iD#rTde8h}hHzDqUExd`{A0CFgpbQv;>Z{c5>~WX`ITJY(uR|X0 zgz?@ldyM_uAAz>|Gth>r;hCq~6J*|Qu4(U$>#6qRI=kL#p);TbXe-nJ)gImi^@ksl zKZJQD?Wgd`#toDjf1;j9<^t6m0t9?XhSQ2KV!BHH5Ts2bfh-ad`BDF9E?RjfKE^o zJnvQDSul^%Ck=)(pzXDvaTxlpxu9{4{RN~CA^yu1%@rL4=Fs-9^oGe`jZ^nnr4Y+P?laxbjl4!p-91`C*9cm~w)w43U9hrn8rHr1M^aq50hoAtjf8!5}} zO_RgBzRv7C#GUZQ7uI5yg0a1t(`-@7J9#-U5Wxv#lUi+-U?dPb&{V7}FVP>n>gL#ng=6m3o*DtwG-J@Op%RB$!k-@LwDe%{DYBtw`Igc8i zn#Vk75BgN&&_q@u^Z}XIR|aFMb)eof8WN!GaQ>?^_b|lat=LwYz_*%PkJ6N0lH2G^OLtEw(BdG`$<=x<0r=V?EU!MYgr%l0r zRr60{C;Od@35S5%iSx_5c-K>{(K_;a-gi|WJID;IwW{0TVDcc}+L%yJE|Dw|@+9+l zd&JDudV{g5dFmUWR`oFbm8+pzv>Fw_ZPB*$@*jmqxUY6DWI}E9kHKILYK*T|G6j0V zonTyVkG=7Mxu-r!yQHr$H(bm7*QM|@_nZAfzr$m&BXdW1Kkv`@pYbWs1sXvuFs6SE z*1=88in*6{_{Q~_FoC-(v|q>IRqElM`F;?IMo-hleLQl0G^fz}0zX$dwx<~EDG&Xt&?uL88zC1OkX>b@SGWRtJjO)9>FJO-0 z_oa?_3RrUg3qjkGQe*o3O5(l0dvwNLltaOexhpk+XfZvpgz+h99ya=M=X z@@DE-s0aFP^V`v&7E}K}JR9m0#!DBVKJ|||a5eq5ufZ{}W??KcQ9jO_cE8R`~ z^EsFRpM$x*xl?N>0vnh~)#j=--VZambK?@Q?xm*XT}av+HG8$Up}d`QB~0cGRekv0 z_};Kb-ylxXx4#M#;U}>EF$~O;S|?g3c0yZfAod@aN1Jn-dzOfl;AWfm!~LvkqVBz` zn5XsUvG3o{^*Fe1{paQ|v%r3na&RDWfR{yH4Rxh2sb)L{YOUv~g{**4&;zEm)J8}s;$~(7{l9NI#*O5MfzDyLOIaauLg7XPr#h>I5_X6k3Ryn zm`j`w#-Y|6)pt*VTAOxH`)B@mJDSr-*a^8}xk8Mj9jXMkfcDk1s9x#*tO^%+i*h2| z1v^qZLhSS)_i0`Y)->mWwZ^{iHp~L|uD{HY#=!+}_GKYl8@-k;`@vCb0-g``ZEfOo zuomK6*F(@9^h4I=8iDcWLHf$xgsWgwY*f&fwPU9vr$g_+H13M_J`3|V>sLn8z3^{0_z&>Vpq+2m2PVkHvcOV)z^G;0_OSrWe5T-xU03`mE2v zT-DsJ1}u#(4fl9_z)aRz?$WIU=EUc@I`%tT^$!wsShd$QWC@=F!#!M8_3s+ii}A zz9Q}8A@Izp)0rFH2<}z?x%t$qP!BExV`k5*-;2MWcB(KKN4R$Sd3}+&yZ+rZT@0SR zd$^nE9WXxd_ptA*c(iypBSq1)jLp@J>`$~0?=Wa9n}K!uK44s`u4j#8D>DxE316Tu z;{`a5hGRZwTxZ{raj1W`vG7Rdd#;8_iAhXxl}IeeToB&GE|^&`(=&bq4#8hggu4ej zz#`Cx+1IoWviGOw@4D1=!6*B@^?|>jZM1EukC_V@6W0V|QZ-QPy5{lL=JXlnRqAZ& zm)0&yg8H4YnCHr#rKQjxT7a?BqhS8zpZ_&5!V>Z%{k(froyPvk2K4T42mf62ikrA| z+jaUHvY;||WLXb+39`@pt?9R>pGi9t>iFiX?(Gtw{ZhYb%Uqd%j&{h}{7U+(?uX@x z<>4)e4cv3%nz^3t%kROw>09vcZ>E0S3pPXPL}@C}?RfNSgjHa^u~89S*X8YAi(JAvPivAwZ|=VK{c z$(n&As9pX_hmB6g!f)oQ+HOs(~e%Ab$QsM>LaV6Dl_g&;6CR6 z)nIR>CTv~9^Ol<)fxE$;Jau|=B>jZ7Zf&W#ytcHIGbH4Ttsn>Z`>Bf>=l;$d%V*#j z*Dq;L^@mfz*eNd^&*m5YH~ENUpMh;qpZmG=i%qC+sm&Cmm+o26&qrx4sRFL0`KIxc zalLD7E;SWyhtJ8It>JzW{Up@s)Cr8cwMETgL)L~cleU!mCMv=zdK6oNKK_^ZFDRp5 z(fKef{wZt+^QcxZA96D@rl0>CoLx1yUI_Q`#?04X3~B6pGjAFV2Yvaq%p$oT+kr8% zd6Kcc|NKw-%GQFjzLmh-)4cHtSjG&X>v<>G+vxc+4z-5#A{dX32mQag)FYs6OOK?J zv9%60?fbZ2Yz5TfE>Sg(V%!gByuJidpbga*8Hb8z-yHuEu(zxRtmO_De_nICqTm@^ z!(7EB(31Mg+N`xfV_w9);jX9qQ!R-!HT2?5icgBa4e!As_#3LzU;jRst3JUUk3Yjx zbZ1jy4d>7}@ME} zG=wYQC;IEG9SsHZB>(FE+yMSEPc;_S?%20$&xD^}O~YD?dV+PO7U14H1lmx~xG_^# zaDTeS{#wX=WcEf_U-akQ7~L53Q14ec#hVZnz}#0|Rv&$kyL#+du#VXmN`jix3NTli z2l^##sPi8a;UBQi>|1EWOxsZ~CcKQ^5$9IZB55Ia)X%r$?lt{Qj9=Ca)t0oQ=AY`5 zo_WG9rm1!Wjrl3`JNu%(jC|=dW#ljBy#0wd14VEV%F06#NeLN!O%Z!!7$y@N)ZT z)TE6;C%K;c;7ft~RXboFKM~B6Tu(J!ZT*v=pQ{Y!xqj|Ou!i}X`ml$)#<~LLH}Ns= z4!42wa2@0Y|5^!N1nulK+=KrdYyxZ13!xhQG4>vL-WG%Ui1CWLp=&e~Jk$0)s6Bc9 z?J2P?;pa4$*S}j+ay|Vnj3Mp+SkL=iL&2EL+~I8UEEVO=VI7T2^+m_QJk4C*_1pvI zov#Ydc$(KoOgfPfi=%!^xoM^Y%Xv9 zbp!WPsxiB-)VK7ncW_6=8({4IE3myoJgCn<#|*f>*Y)fRkAn72pJdIZ4D6%FO`B+a z-kLxvnc`NX-65t}hMuhLwAWEzt0tvBW349-_pIoXv>ndDIA3%Mth2dCb2HCd7y5#J zXAgMB&Fz1KO)v#oLk<`p8z1W3{;c-%=_8Dj{ki-ZD!|v=VOj%rBzA=N$Z{oeg>!Fj z$Rltc+y$;@H~0)LLLJ^P`vCmaonD-Cpk8jyU@o=`YVw}9`EGvR(Cz^Gn;*e^-uPN= z#Qf<1sF}VG&x5&uG2X|}1So??R`GVO^}5DT5cKswgL~6_;t;r=`b1-J z1FfR1f<9vnOTTm))JUF#8L$mb_zo4gp8mbHd;k9eV7;^w7>m?}RcL8`-*2VfO8t@i zBjj%Ok92^)xbMt*Mse8A``GV6XJ`P`z}`I1yScvWSvygio1ex7efgQJXP9FDBg>rH z&uL%LHn^XAZ9V~Wb3cndR$bu?sEJ$#p8vgI95M>5`&j=_8`FpCQ|y~i-?UfQn9Mqh zYiR5=8|H&PN*n6`R|WKo+ECB@KsX4-p~g-6#j)@klx5bmE6j#{5Qi8uVHs%|;Vt4- z+=Dm-oL5k5GH>0(T(h6&XYQx6=V&}ygBr6w#QdfcxSoAM4QXBGy38S9yjcUREmwt( zFbz(@{q%{Mcb-8i_th8>){te!Yo1xR<-< z)!XcWc^f>t`b71ngK!Bm6lx^qpw?$x-}BM)OeAg!HsQtSiy_84Oi%a#(6^~Es~;J! zt1SO{D$YsEJyunhphc zkM(uf3hq07_yAY{JK-p}wp+pe2K&m?n$|I6Vb1JlP@njNcZyoVN_y7SW6a&GeOj}$ zjxXF*qz&j~S)W@EaJ{8;7d<=qId^sbv(P@3t=-gDT8J zt0S4KYlGaA`g(o5aq{P2e)!iOyMS9AOo7|t~p0mMRX#}V@x$mrhT3>Q6x{ms!lVA+0?|%*M0BxxHvNqpb z#n1I5tWK>?6$9;0GAkM8Bt5rkc#ng%CHry)!BddEp7xS`4Ut47(HJI!`}$GthS&nG zr)SYUWbUo@+7FI^>#2RzmmA-!e`SERPV*x_r*Tzt(B`U9%>iww{Yf)Ht*Ih7BXEGa zlJ>>9ReKEFr}`v+sV{rpe*(2T?S}PN^9%Q(=hRB!kcet`(d|26*+!#BCU z?osWmanmSjO8G!rZ0s_Ww=vFeKb_y9Hr!dM@yzkNKh1fxi|$WjqnDs5=$Ab2Y9^z= zdeW`jThI@zc~;~tiMe2nT}{@?uYOT7zBCdJnuz-AN&7mAlY%f z{$neBC!SSfN%JK0PHkgGG9&cVPGH_cKd5GC&N~*YBdbLji@pwO0C%C$Xv)7qSxsPVP2lYf7K2SmRGYYW;@zk>thi`w8K zV1CyhoR?8=(pJxaf$%D5zb1lqz#OzB{h`LK-$60%eCq|qjWwvPX?N5#%|F#hiZXX@ z4Q?c?g#B;?%tft_41)$>UEcl-dxpkG$A^B#_ag5_3>I5~_S{%!5i>>)!BO5nd<_bM zH4ghlt#>>Fu4P}C1ID415|zTcn*KL+xr=HURHqlmyd}Hu&3e#qFh|jETi5&zjOX2> zY9zP9bzpvM+@xLT3fenug<636oq4&s_>)iq+@qdvV^OtbdsAIsZI1t+>#0Vgzp&rz zIrtXJ(L*r<)L)H7?X5BYtPZch9QYn~gMYPtY)$?l;3(1wIU)208;^uuO={hRK%0Gt zTupuC2kz=HSBfX%iFe^PFrS|UuYi7D-=s~Q06U;?qA=a{-GbIsin}(n!{+kZWozft z;Bwykb6@-l<|uv+*Hb;@cBuNF-sHJAhB9_?k4}L0Pzbaa>H%uZYg22(Jc#yRO@1f+ zM8=}7>3c8@+@Ja@`&9LfQ^7pTGoP*Db*DE)J)s^w>c;8r(ZXqk!yX;Moel0u&%XMT zKHhz6PlVc(acDzO<7o~1>EqRJE@ZC4{D+R4`3&_N4vmUD8pT|)8HoVNt*@w4bLa7cmG$zy@&UGhk*H~F{t{T z=RP~OH-_2;U%((RF0f8HpLDLGLqu)#e-Lm9=+*{gMx?&+Mnq z*ZEz0)my^Z#M!Xt%Fst^Pma3$^I#mRZ}RLLH*JK=5|>f^cp|(Pb2WASp^z(?EBIaa zj{C?QS0AmeU4VD$o&{}>`6n`P^or2Ictyf^Ny<}|M7Ebu#VJ*~~Z2zRQ@rOw_S zv{CDr)fouJWQD+UU`;N2J&p4{|E{xnwY?nbcmF^w?s*&!?k9CGV+r$$ci|v-<{yKB zpq{J-s!v)DGr@SuJn1-hqznXOE@Kw^4gAiHo8CnGRu{4-$g?^CiomkOvQYmllqi%q z%>4q(K)-IC$^7XzxREz6o(6j(?AL7zu4fHq*jIqFO2#Xs#o;`xr7C`X^!l*(JoCo) z>NO|8byW-d6#9a>;Vs~KcRj7y9qOLu zYv!J}Fehm~^Al)G)Dg4e&@J>esyA7K)5p&M*Kq@=mAJmHvvIv~sB=}u&c-6uVGVC? z-V4TwY7DQ@b79={4%`A8nKSGP>h{Moj|c73^;B1Oe>&4`pV*V|DP+JSynC<&oX1i- zznT6c{QD`~!@r+}%6Z$0WhCM8PPcMLRhIeaD zh9h9^`6#G~dd7|Ct;J6U_vaIEJ*?(^sOI2)&?l)43_%;rU{yn^;YAFof^2vz96)211R4u+#(oo)tP1ZO+U zQ^tY1sJ=-1>Hi)JepX`<^TRYy%XtOLf-#u+h_q%G~Y_zekwU;-*J!+1A3;MC^_ByDInjaZ|J`J_Ne$wT!fn z>8*M00(Gjs@F#eei8^m(x;Lx^{tKSjufaLR+Rzi+qps&#SOvyR=5qdjkHfv-d9qGx zAGA8LdZ1@m`>fXNpJ7gxe)bKvZ`h=TmYX@C)cw%^> zK3D_&H}l`{&X4!Jn8WAiuBLim&3QH0{M!sxz+K6^LhhNL`+%%bZUTL*dGtXj$-T_> z!wi6F;8{1nHy8BG+lSB=TzB`g+Jk*G=JM_}YeaKEZAbs4-t0d0&-1V9Q0kIuX`?~S zUZ3U@q-v zH+E_Z=ATi1d7e9hb!E?uzGw;z1$8_7M)dQ>1>QTOHey_E?6jBnyuSo%jP1aD$h*w! zLoW>4Rr9FUFbcMVKIsWC4pm<@#Kqq)JsC#yX z?%-d|Ny~tK%U;`NU|iB4tkcY+rmLowy`IKRw}El_i(sG9mc*7&Pu4FPkLCf_(!Xj~ zt&3_u_d#*)DS8H$gId%3V0>!~xETtOLv(?qpiMLuww|ny)Q+l!=#Q*>Xbbci`M}S< z8njQ9;Lp^bsn5XtTz{8sKmG3PZM5c*E0rtwq`GMOuYg*L@s|5rE!6#P{4fN}(cGWL z={v#obRX6S>v8&}uHc!sZm&~Z#r$0tP=9bAm`nRJHh~|h|N9*q8`pt@%$=(j-3!Oj zHzz?G@XQy5Yr)*fc*&geeb^5r>5u3N>h{CC{X9bqmcp-r+4oiLk2?&;Y) z0HwGms4Hk|{)N)?tf?Klu5F+dGzR;b)Gn-b>)YK^J;C#C+^qdDuGc=Qy=bpI@BYEA zrJA8W$({f;DSKC3PxC@+uhvlQx6s}!1nUORfO_0vFkf+>=4vg#MDcUz1O?$|`n;!r`H=ppGnkVO0CUbma6{G&bd0nM z{>a{@x>QlENmzd{ZgCBaC#uu$;%tbf3Q~Rxwmg@BB)OoyBW6^0sF0rf;AGg zAkVs*h_RCM3RS^4!8~>(bOQH*b*n4jUwS9inO#@c*Ivekpw6d$dJ)u`to4~EI9p=8 z<7`cNYB2r5nCUcFGctzvyxZ%f9d%7>gYneK*vX*x>F4bq)Lywaz90wFt}MZ48nam^ zYzfXBnA5j_OTjgJ4|+m-XbJw+8i_izG5u9pSA{nr{T@z$d(>Wczo+&vAFKt{A&xXx zasQeBxrXjhwI5@oJHdbEuV1O@so_k47eF8CnK$ooO^xaGJFcDQ+!#&27eVvG!pq7$aB{GH%k(S*v;h z^i66YuAygLP0zeDI}Wu6)_-4{<39IXI*;qwFb@6(?5}tT27tEI_$dzF1z!SO$E)FD z>|$&ij0bzgjJeDWs)6hIJa}LSf%eW=)VmS><}M_)`^Vr4@BU8w6z;DbMUS1fQ%1v= za1g8|H3qf6y`X+)U!mG>gH(f%ciXpdA9DkK9%~Q@Fkdo$(ogD}nu58Jw$$EwwNPz? zT2pWEJh?9Bovx>GsJ_R38*?OUISO)~3*&riqV`amyX*#YC1d+ZpwBZlGj8+T7oiuZ zIlKwR?c3oLWP!2N1?FWBf_rliREM)@BkBR>D7z!OBi(^x7xDb4Eq;~!D$Gnql9BL+ zL1+4B_4OwcClf1RDtPwC!Ypu(=3ls#H$eP%KmG6BodJh(Tglh_Yx9p1faYxy`NmLN#zb{r%LM9tVAod%^hgFj#vy0NPU5)qXK; zgLQ+$U{B+-@b!QBys?F~7{3VDs5i_2Ys$Yt0<10T`^}N;*-`6j1)g{FW#feuwX$(w zeyu)Yea71MOHc@m?>+MmfDYLjljq(TN@jz3)IV@D_Y>*kr@=|6f_A5WQ)@C;(I=RH zKMEg!HC%mpJuvRHRy-WsE7p08p|o%M4S(4;W8T>Y3WIs4bpZFLag%=DxX(KLUQm-c z1Q)=Z$y&((SPnK|R*6&zd6&M)v*4evE?baUlt*DOWbaY)Q1@soEf&uEKJMn!CiDdL zdixp8J)IHs+!1RiAqv0rP6qwbNcaGjfI4(x-q2OI8w&^EZu&#b<&jasnfE?0;~irrYpsXC z+)`g;FT-1)W@j!x4E$%-KaBO&9sXjbaXGvW`Xx7@dWSisF~0g;_8v8lcTKN{+rj;- z#%y1y@r?SK8p%iC?`vG~Ay~^Wm(+K=o*#jBR6leS?1ON9XTr-+8H_>ISM;medi|~W z!vy+%v_oGczX?`x!8$a!&?^xYUJ8V3uozgeG z57xo8rE1EqqkGeMzbcq3X+NEb_Gd6|bDvKKV=^@-|9sExb@b%a2KS%({UR_%`Uzay zFTj89dA}3PJI%F>pY^i?!8l@iYI@MW>|uEl^1y2H9nY}!&lB8_*?6Y96fqSGMnBV53rrrw7C!OWf=eTC=z&+{Os@=Jk&LkS2s^4ie zwND?zGvJvuXVPb{0efGZ-_hsmf2xJK;Q4@G+(+D?7P#3`aQe^`X%?MHe^3&8?A-B491-Le(ivE%vecVt439X`kDHj z`iOCue$iTx+J^lO#!cGLTJRLS1+L?l;JUsK+5&x6dH9DpD|<4u_s&)5Yaa&Bj+#tP z_>`W1_o%t}Cf==b&)owS5?#BEpxyimw5dOW{UT-Q%XjU^z)#?r?+eB-)+XF5o;iOt z;!Z4U5XM4;yAgGoJ3u>R{Ap~ejn^Mt4(9vXT;oP#(Yl~kY;JD+WZvxeWxcK?c*dWC z-r)XpP1Q!sU+(5EeD}Eel{Ta>Z&f`9=1Thb63o)tE1G@gzm9z!>UP%d)b{jKL!d3V zmk&~dejEIG&67Rz{%jv%<&2NF&>z$r%ECc((UDLcvVFX9(mc?1egv-VAyBKgmj4PY zg7joM>Rp>K=b|oYF8>K=!_>Fl1+@?Tw>hS{ru)lY`3g+>Chw7oOt+vcq)p+0lSU0ftIu;IqcG@`7If=r| z*fa*uwK1r^=sZNw=v@TY)mU^f3P@*}0q^9t zg=;}g-g=#}(l8hd*}1&2sIkAf{0LB2QD3p9WKV}VnA*r8&}JK3YzFt9`K9Y=EdT6( zxVG+5`#07kWYV{xnZgBN25y*V9~n80fpK>CXT^gXgF}=zGmMN`rL}<9chB ztI+McLuqgiswtVjyGQl)AA&y07{FLHdw*&xtRcSxuBW{Q<_-E}{qq}OPk{DQ&0d|! zvu+MA#@WX7#lTxXYv(%Z13eSw6NTVz&=#ou=)265)Ms9W z)u2!GOe_X{`~%P(%!TY1^}MSuna{gd&6kWtCqOGu>$e7CoZ>Ha-dn+3-p{=+xi8F3 zl}wfl{SE`@!&8&XOk{HN?f1ccdd`iR{HytrG3w>qE#&-%ap)E(%zdP40zZKHOJCRq z&a`CLK#ZI8JFcfSIb$XLgL$C6@7j57sC6ZKO{_(!-}#+f;I2jI7RG=zBQ+(pCAB+! ztLtfP-dNvy+5dm$TQZYr9Qr5NXJuc-FK|7xyT(Lncyqz|Ph)!brh9cisMSve{njn; z|L5{gGLK~**B^|D7jti${^U|v%A2@7!TwwAsONqiEC&72W-y-8COim(U_BUzYBxRu zgAw=8bT|vdt$fb>&)W5Vt?oI8gT9ompc1eHqK0FQ19K^u$tN*s9X`j7w z&)QA*rRUxAW_{!_@ZWJi8xv?RvTFwZ-nTIWrPgK7v3dxDWK@YD?Ba%{R}1G3agJ zc^?JFTIL0h_`V4E``yJoitbT;vNp`P=}j;eRg+cow62^7E&&g&F`_@8YpJ$uFQfKT zZOr(`z6ICFoIy?AyG_*R)tQY~^ijsY*0YR9jjhZ(OVST%|DAcKd6M-3a|zF__R!v2 z{kJjbEHHQ91nyPW*7daZJcCUraQuDY=2-TL|-X1|w8|G)HnxtAH_+e$c&X50L&)-A;X5E!02T-&5PH z4Off#0<6_}hM$0b;JMbHn{%3f+K=n{`p@-S)xca}0cb<*m9mG~elh*8`hkAlS)Y!O z9orA3M&A$$fm*WXeg{}b`W@_N(r+~dZRlz+4pnb*kJ=CG*&71xE42gjiJ@S=qBd$S zWWKIeXCImV%024;r^aZ{kgOe?sa2peS~?j ze%`aPmAUg5K#lqPtnaf1gIcG4$6CiKFz@^fw4>%qe?w7vZH=4W0{xQxjP{tXfUD@6 zvPStOWPK5KvwSIlKGCSg8c)k6d5ZdOs`!b*j#wo_Przq(-$AjB)kj>Uj25 z7|)wa`1j^Y_L-Q=`` zU_DjMNlnQd*L+^=TYekV4u1yYZU1aFZes>DFEvEt3iqh~Ma{krXd?%K@sWFVKIr!+ z!RuiB?|N>d-`ai`>$ba?Z&7!#C(ZBBbD}d(ZTR#D%aQjXf8DH70u? zv;#NL=kPFSAHD_cZ(H~pjAh&}&enKV%{@K8?m2q{)RW9T8-VeWIjDKPIgFoIKjoTQ zr!>wp7k6E>rTT4SK6A_LJ?dF7@5|2Tjjil$ItG5$dZ10#KD+<@v(>iUqvrFTd+VRB z=^HQ#+^epwb!KZH#`IUg56q~)3C4KZWPPnZVl{KR+92!5aJz$JlikVscmU+@<$j^I_?$58ln9$GXc{dTY*TB9n{kL^wV^P=79Nsw> zV|+Cdd+$8^`hMd@bEQdO>|~FV-;MiIUvIrmjmi2|wjI?+8Pn^tTvIitzrfFH96BDX z8>o-CN1Z)UV=hANQ+>qsG#=HbPXo`o{>Yw3?dLu4FLP@4vswewK54_$v(9j@gSOpT z_8NK}w0+mXcHYu47Si81XLFXG@9nS>w59%Ub0}-bYAD(I-5Gju?&EC}Yy7{0F`~B2 zK6hh#pBYVQS|`Nh~KF;#Xs9RhBJmaVmX3#+>Bnu7eH-k987`9;C}U=o5wqw z{vG|xeZkM5#;8qFFR-W4pWzgDpS%ld8~^Z*t9!Hu7>7EqXid&|-u-FrbOiMC##GJ0 z7|S!S4OIu62gdg5BYtktQSGX^e71hKoEnH4ZU?vv zwEg<-m0*l-UT+NVy6WHEvu}X@)_>=BP^a>Y^agvoj3u<&_VgS7SXWX*GA3#bFM&FU zvAlcL9NzWx%ohOjq;a5~@_W}d`}-fnU;4AC)2Q2b0{ifGFsD5lT&o+w7<3=FH;tW+ z0%3N-|4*N!erhb50kxQ=8w0i&`+kh;-G{EBy0Yu)|JHum+hM+B z-BTMn1?-XcXTBcvamG*TB-&BWzB;IJl>W&-(-^>g?0OorRR@0$eVlb5>juw&XZ|qc zXEwSbxJRD{&;3Yv7hKyO&=Az7jxeh>4a}WA^9y*Vs2TWk`Tg1lY!9M-{ua&;7zNq+;^-u1Mv(bzeAJ=F+|@zw0jn_Nrxr#ZfV<~yMMHWx5HED!C#Tvm<1?@aq` zeb75yV*E0vbPsj}wNc|z_oi!WZKMHcYmYIfHVf2rjA_*vjqCK6Q|TKp&(P+nyVZbX zR+3wpSB6+rA8t>rYpP#22Q|NUo=N?rHM|YR^(;ZS6UO~%+@Kbu&TGu*7hpcG#%o>2 zxJjMHJ*t0lUmAm|)w?(KN7`ETCfDFOaF1C7$=;vZE9*+`PyZb4roPDY?mFw^)%)x- ztN@)rpJZ(BJ&kJ2+R*jz54iWNX*LCGA^P>+&>hs6?uWdvhZ(vLL0{_kvWC7kW3oIj zhdP%2@f^LC>caMkdgk|YAKu5Hzfu1%&ot(=Z`Ad*X8#0u*3J9(g8ocx^`32Dd~Kejz4Y_tfOsSxa!`GdTAw+cF^PGjF_W5rdi54?|9RfciL5KR zmg-CHSL?av@vi5k^!Qr?aer!ywITW>`$Vk|ntxi;NROq58r*%nsrV2)0d2q>sy^5+ z;xG5J_VWq21~xH2sckk!Hf}P8?;i0St5Nv5+>@@SIkEbP`rZ*RrvD1m9rR^Y zA$x!RNI$##Q#)k8nylSDwOpk!IAL|v`Z*6vW_yl%?`FSz!X>dIo zfxf9Tbb{vK-ZiGze$D~4fHGj7U@gM$Oubg0bOV@s4g$}74ls|juJJ6Wd1_0oExV>w zL4VZ?J^=kY;bE3B!ke%i)YH_|jTiOtH!&Y*E!jNMy=Tns8ft?)>*hz+J+z&kcjJH+ zU{933B-?%(>#6COe~kcrkU6KZiW;b~Q+wzO#sKbR>w2Z=J5gux`|-QdPTTW08a6=& z6laH42kV>qp#EU|q-N3uw6EIGm0=aMekTpc- zTXP7{ytPmDIBjSRXbrV$ zy3h%Fk!ORo5ci|D)3{UZ&YnEiRl91w|0-CQ_rGy|>=p3$vfro;%mQnbx6!+y_HG>d zGx&43ey*v$-k8)HqWe_6-keVVsph7SH)c{d(uS@9{i%7p`lFg%eQ-TpTk}w3Cu^>L zpAmlP=k>+LjK)o#S9{bxhm&9&YX6AmT)#dZ{vT&|0%d7kT?<@5WiW|i0(lP5-GG83 z0YT9?&;@8jaX^g`Md$*2Pha%mgzJF{-L0ZHqwpZ0(%m=*L4_ERNYl+IDk2~l73c;; z1RR)Tw2SQDwf0)yy6ZNYS7$A5b=9qVzi)r%oW0Nf|G$gejZ{n;~MKH~-dXZAFj=bxFlE&m^%uO(>vT@q#@GyTm8Uj4lZn95T;|H*{eldj)8 zftTdGH46RAIl;oZV|hWZ#F3M76jzz|d8X#14<*cvJX|8cdac~EW+fkB%7-z7PA71a z{M5fam!83iuICpM^cXx3O2E@vvi_;2=_9(6AHpB8*TD=*KbbxCSc?Zd0QUyXOQ?CX z@wjgKNc7`#5_jajce>I%4^OpzXS_Ok-pury#KYD+ER*~b*X)(B2KAkUFS`Dy#5IZP zQ2N^1IDf)CPlxiB<)Y(J^VUDMNonU@WdI3dlI{3 z&+U;3pG(Ihpk?S62Vs8^Jo!!I>q<0?btT-Zm*RbWRBtdV@}=eI4hh%BjQ5>{y5|?X zCxPo}`o)Q(6Q?BLNw;p6{W$zTo&as@{vGofp2sizVl%pWHV^5e2PJTmbvZh8_k=vY zHT%KONZ8xDU4kEOZC3sG+zC8y?GVo|O3+PrW{(q$_?+}64G%xPlwY!4f_8Eb-3f^w zCN|9d%zGr{xphzL0CEP;>!DA{X9%bZJ<aOPM2p&&M2o6h zGps&p9~#e-hCec)pX!@>j5(fPYUZ`3gcIfWTNBom%oQ{wPI+I#ePGunpzF;^Z%XL>UW;xrx6m`zUZxVaW&g+*6L@-V;)XRhtT{cwi+^JRr^E1t z3HLO-Il;Fx!{3cp`Ld$X;jy2n}$S(~5tka?q;^WM1Ib>&OaPI@WbMC0>J zaIoW~2XL6YlArLjp8!U%(j#GKezvz(=$-UFJgpDH-rv}}qHios@PxgWJ)-YPoRYAf zOpDS*PfN&0c;a>I_D@R4VLJ4*gf&xsj#}d{?wQbAzL2oq`>@2B`5eB36ZR{p-}4jl z@6d!jqr6W+)6+}GCiDjDq+85vF`AQ3$R2xp#pnj>lAllTc&kIL(dnW3qduvR+S4pw ziYLA@EAiRnv;7JD#%&YpCG5x1N6eitq~+-(+Fp;b=joFP`K#uA&d?Uwmu~&k{dv}_ z%n&>-`;++gS0rW=Ni?fDY0rdu*E_5y;auLG`A>ez zG5c=y(A5dLNw1`ps_o^gIYxf2NWk;Z1PzN<3=rlKzKGh=uXrLjo>z|J`FHBy9JM0B zKQ&{?A+r*V!y9}?_DRFjtfY<~zV5?E^QD}m?Q!})Ck{;52fwI?GHxt$~<)c|iA2oNyEq>`%svO)VohGX;~ki8kHz1Ds?o(f(6*o1v3_(-oZ z$MXy1C7)hR$dBqKGlgEO=C{h)y!B{3hi+UqJ_22Fa017;2TaZ5aoF)g=hIvM*GSXbH^Lj?r{N82Iy8kn?z|E6k6A?@laK1%9vpqt+KBwr6U_WLnTNVh zf?v;zv!<~!VGo6CMk}dv`$gJA`JvYD@e*&w+KD~8`Y|2GyPlJ^0iLLPU}3~_3e2PZ zpMRHiWw_#Z`|8d4>nCs$O>kJ^xe5A<4sosMdO8$$sL}7{KJWJ?c1x_E;M;#G@xFwa z-o6{2h}r0EiH|4jeY`f|ew>#jKAQMJ!kQ<)LS6FKX&u+_-3j{_=qBgHujAXn(WAa< zU#R@lL(Pf$-h#y6C+Hu0LHHv$hu+jL`FC`veH*ks|4yIfL(7}T=e{v(O7OIY+pJ`U zctyhcr8$xorP#7+7o@0AxylhUT}zA#~~;sZT1p@-U+ z&Tq2Mf;@|JD5_`Tw!0`;R4Pr;T%uARkEm{VZWUh|kM| z=XqS2py6StcIYSG4L$0MFY3JQO@Qe;67rO{$s^&*!Bn2YPd|mF9Mub8?ONK8LvP{X z`pm8qPZlTYqw45wvyxuR=f_L#Rl=eAD8H4zs3!Scf19{C zpU3&Z#6Kh+k+?GZy#F;pKjHO#6Szqqh3AJ8rzU=y@O;{7VPbg#>Fkzpju#{znzb_5 zkY6lE=<90}a@2f;-}O>SK#Tq&VJ{xvo-YkgIZEHtPx4ML#RE$dyeB=|Bd#?o$xm~d zTC`@MF3nx8r*#25NT0twq3)L_=*&A3);rYyUnJBzO|Q@LnRqJG3G=e!{A|MP;kbAV z{2IJ$?N=XtQ)1@?Zd#SS-sU0vbbR8Ngh!fQ{>n`~^y!H=CU`7n&qwDz0{0G>t>GCN zG5UW<9FTPo^NO`P>pOg8oNrA;o!bv;TZe8dGUCM=c!+cvl5pi{BEP{BY$dQ zzr-gJ=Oy%G*NDdEqrr3YtP9%fV6Iq}po?HhKjBJst{>^0>PY`wnb4nL>T@X6JWWf7 z@#Xl(ass9&CtxW*ajpK!+cvAI#V059Q2Se>1)7pzl8|VfLce zXq|=#XD483e-3`qOEvbp zvqw+e(^pFqFf}X5Q9Xn=xmm(BG{f2N;Ij};PtZQ{lh+JS{yi*dd~5M^6dn471g&~= z!rI;o6N?i#$roRcN2!OJBX&(#!#4l?AOSN6%fB;s(%NPw^OG;XH!C|{IqI0bh8fg7 zA#^kj!1J^x{lv?ItLvyX@RHeT!|c0-r}aL2C-fAv+K$j>x6ZsZllhJ__pP~a)F)3`bJECb zwq{3<()RC6;CS4`AF;1VP9K<9npmCS5!kP(4tYLw3(tw)p?|7r_3gamChv(hR7b8m z9(LaL=(=ai-jAt-eQtWFyyqv;@Vq5?NiV@xFXf@&ExaVBd7^YM|I&3*3p_k~ob1Vg zlYW`@zmBy{dq&Nm!u_CTdHnSK#0d#J&lA_ToRf7`b%P(R74q=viMsy)p4Qx#Bo-#j zpVPDPrraaqXP-%|Nc=jn`OM}s|CIPt;^NVreNTxpG%ezz}2 ze!e~d&vz$$mV^GfI>8fteqvEV%@a!2J=HwE_4SPGlb0hrBs_~3yOo;w7q=*>i*aSO!<@ch2NFX-~9a{3D?t_ftr{~SpUQ| za@1@IH{Pe3r{`h0LBjgI{q>(qSdZe_<5GSL@5i-v4b5#h**yQ{1dg}He*c>Lv-|c( zBTQlUfrS3)o(9}R^V3ehOSq5DoMbMre^(*TPnfawIp<`a=X21Z`l7mXeQ^+8f~TH} zr*OaD(U!F+o${Ltdg9Rjah5eP28|Gx|08 zJP~|Od*b#}6V~vo#aD;wxwOI2iSH%!kLMRKr$ga?P=aRC_w~a&;=VA03dOxAZHu22c9KwZj?qv&>1*JD*Ef3!#JToBwS- ztNO=@a}sCH25vW(-kR_nd%^jk_KN)=@z4kU`2W^~r}MQQh?~_M4NTX&r_OAtSMt+f zDKBY!J;;H{ugYsC_^6~`zi3i$4MbI>>XYap)r#+%(HF(jPFtjeG7x7Bq zs=v`9`htGzZ_G(*il*m@%02Ute6-f7SKA||f0=jbCbiMEWP2o@ld%4yKJ;hxYM;ex z6V{V?_trz?<828w&&M}^%2j;CUzVegs)Zc@6@}w2(QDG&%|@0L-9Vof~T4{XY&u~dS073 z&2{8A`8-(rK=jbF5$`2m44?CN53bV`t{XQGAgz6EKJUixd7Rbp=ToZ>m>=RJraJ$sVZq<@-; zil^L!ryg58Y5L;nwRm!7AhVF#rj_i;F(<(mN713yAu<)-X_X z-ux8_xe41}B-Fh7KkO@Y-4%27PUXzekGsnqOR#9z4Y>g z{Jc8xyM&(LelfiC?u7jI8a~s3hh;s0exdE{H?WSOhtn>6B-%)h>ZdqUuG+hdm+T$k zjd(8K&wd9vJ~zRKz&B<~z0!N=o4k8@YHftRP=k7|`p|Q%E4@2m?UyDu=gKuYoo`Q% zT3@o?MxC2Qg&v^hKb5fG#JoB;p;uY=vJQcFo1^x5?2x!K>mX+(KAgby);7#S^wD(* zxd~Ig3I3<+aaVKH?8&pgCqdiuUGT8=9T@0i`zEXtEla?R#>PYN6!LVu=5ZPS!E9ii z&bqK##yM(UPQp?z)kEc}*;C!GPWTK2vl?wrYtU|L)%DXyarTQ6W+s@L*Y#3s9@ayx zC8_yOChWES$HbEpd!M+B?EqmY?_xm+GPN zjo$(*+DMMlN&2VxNe`t{;Z27+PrbsLfqfHrUQgj0@I{}Pz%$bcc+pVwI}b|8%l9Yr zPgwG$dAL8%zDu)**Tk26#j_ITwLKEn(yz(>_^&5EnBW)FMED-}SbNt~^-X-m*M~Vz znx`VSZ%WYh*81&pP=|UQ&kZkFSF%2IWP&Ef_q3e4@#x?5C(lmrG=sPX{97Ki+@yo9 zPpEf(6JJS=3g63F{nL!(ea$etC*(M<#rxfPQdz7d|6pVmUG*Wq)VPwy{E;P!t? zcrFjX%*@}h&)t3jdQN{?ns6V*Qxn!Lew3gmt!2RTMTuu7=zM#0Xe8c}S(8?hmu3N) z-kKC&L~ibzkoS5Sz003~r@C-n`k0y0nmZmB@&^CobTcX~;#jSJnUP@0tJjZtBXW>8 zC^zLLu9vIo!E7pr%}8dn)&(x4LFuzcWKX(TUagxYVTs4(#dmHGb^AkK( zdnR^I*bAqB;s)VGUV-pf6~qwFro7=CjdtyO?kL2@<^-y@?b&t4TAFwtjmwEL( ze|e4z)Dh0Jchd3jY1}u3nVNl%;X~sVQRJ)aHX59 zLGohF|Fi*rhMuj*P4hB+c_e!1>l1R(8WT>pFV755kK!kJs~_kMt^p0pf4~Kl-Yud2^+s6XB>3TXGm6>FY;UI5&*UvX z!E>$8%hk@naG=-l()I~GlJ_A$X?Z%-db}Cb(TYsYHvfh?d{S2C00eR&I0Ijsj+Z=-?!@W3BNJTL#{1ii$YpesD` zVqp#Q`pnj0c&pY5JAZo5?GpI=kc9e%C;To;@bh4LQR15kJ@%amz1JQ$vocRq-I+hl zZ#=|$c;Cw!#wQZ+q}h3RtFsPg4V2&XjRX(xtc1CV=C?+NyWWuabi(}khLLv_32kPw})H^)+ zUGArFKjAI;+`4Zi=+J!=){FE=bGS>U7vqn3 zANxnF?a(j>C!CiVP@i0$&`%v74z~UQZyG?Yy9P9rzK`4VQ2q#Bf*lO`O9Hm|h+f0H zW`Fa*3lr}D!gYKEbD22_&;LULCz&abjToNh&)>|3?|ptCtkt?Xm4ElOg#3JDKF8PoPG(|#ar}Cuyrk*rUi}5G_SnPJ zJ#N*ba@^eIb@@$ZalGQ*PdyaZsCm33KjA6pCpo$}0ry=Kn@P8c+PjR8aGCtpHy)q;ckTt@+v8gNp~p-m%u3eBd9%gS z46nbB=O{gDrjn!lVg3e9$&)iLnD^*-Ia)k@?`M8zjZ}ZoclB@c*AWREuW!>A?gQh; z?UOh-L2KgrWwY8|55-4*uI6d`Z4)%C<96S;`mqOA53&a19>47q_ruK~6eDwi8 z$L(^{?C*H3VbBTYCG`$3>jCngZldWu!nOXg=Xw5+lk`yUMeop{`XSF4->B(h5-_wL z!W)&NIO-z_`^Sr?9;!ciJ-omVRWCH#{)s0gtR=(bxP&>~dUM!4P{4CkqLT6Z!d%42iAzH83m z6Z4MnJ3k)(=$)|SgL?FSW>R`k4(r`~73|FA4i+&6PY6I+K5QN8Oa z^KAcA@83zZ-uZ!gvvZ_vaIO9)KkZdgCvelt;OHFXr@pDT;?6}0I>+^QEz~-#pm*|< z^i7(K_B1Qe@?T5HQJiFtwlBI>y_>bnXs($V3CHs_^+Y)7o%jcyaJ(?Vv$t+Xm+GT* zz}^Y706$d!*F#({$L3moAi-}l%bUfmufHepj|tw=rU{h}PhKcYXA*o;8dS~8Q69+; z6TWy(2PDjZ-h&?0$E;(RmE<0c>H5-yaulX~Uml*{Swn|?H4}|MJHv?QM1R6mPdRlq ze9v>DrQkV}z+tWjZ`(RDO|O5tCu+-ewjAXfO|M7ln`U@;em7x0vQ7tM9<%50_T4LL z4TN?!$9ZknjqW%x;oRw_+w(bNX8EHN?gz2Ak;lXbT`z%)1kGf|ho`j?{Xw6w_m1|m zR|+SYljMx|QF}ZY+Jz@8S8%vIg{$2BazcKZJ?JI#5j=TC`mY@II(j1x$35mGdI|UG zr>>v;)n|Os7Br2%!DFR;X$tGeW=GiUn|N1(mn=ukp4L6o`e_M$fagpD$WMF4HYS zHha^M)|J#AUiwHvujEtGhVs(!P4Y!yLi-GTQGF7oJY{nxj;f~T`4l# z&5_pU`AAPp$VWK3@8eMkT1r2l1N2)tt%uq>vS~g;(;QFN7f-e4+<45m0e{o>_SoTd zy_80lqqGtY@ZJQD*LPh9UJ)+!#gE6S_*{<$4k4wnMuP3Z0dBjJ4z9?~EVwZ&VQXZM>gE#df*O1>WkDim@xAW}j`v052-*_B$ zu*C0rskur2gfmV$AaP{EJrCy2jpJ3D6X1z2E2@NMQWO6 zqU-+8kd*wm9wy(O6;3hl=yPuiiEyl&%V!_ zwWh?oz(-~k^R60J?|LPzBq!l0d=F1O6+fwY$J#lGKGzdzFuFni)I0HjT37dajGCvN ztUKWeczS>Rd$^9gI_pZfns(xMsAYQ8y!6oo&KG7RwN6{@mB8_4f@`vW$g$FPdXnqy zJ)O5TbZeivP3Hl)oRTol(?h&w8h?I5jeGR(y%YFI|CFEKPu!94IYT&J57pOTYHiJ| zOJCD${29H6hEv~qyK5~s^#kjmxZZl5I_0zPny_~Iw+Z_uXeWM>y2eBDk&owlKl3}- z^QPzv@2wy6y1Xy{g}%r4JSQ`#T9&W49RJXq9${@?sLvhPJYikIJ_%e(*E>EM#4)KI z{m19^*zY07cyMPWXmxne?f;zcnGe=F|98S3M!oaX32UXU!##=3vws=K+cU*?;Z@i- zV^+dT_RI5|)H6@ixxvsJDtP%g$?p~?(WOTB+NI~m9EZS(QhYU_1=U$p6+ck2Rb*k zs*mxB;khuO_GwUjuLr=BuGi<~Z}ZdaiBt4Zo&YS>^3ZF-K{%hbcTV=<>)$X{i_X`a z_J#xu)B>*vo*U%8Grm2IucqOszWJkq26$b9zEbb<8K?2?=x92WZZb#UdAw*=vQ8;K zf0qBhxc&D3FM)4(b8y7_dnI0#;6L-2tRLGOabbd{cYh8%t#^7|=jPnu@Qj3h$gfw= z^rl*;m2f+KsD|_anBp(_q({)9{0AN&JmoxYQsc111$apRG&gx)xoSrBW&Z5Eq~^W1 z^#OZ)ag#NTXC>gdf5Ki7eu=#~`l`JUuS`5UAxF*ec+|1-tQ{XMqqpWwgiM9tvC`SE^l{6Fo?;)Asf^ zI5#=!*wj8gQj_NHw)Z0zwKNCt0IZ)_-`7LD zzH4V@vQLx-vK9ibmn8JeNjS@ce#ToSn)O>6mbZRrxSBcTOwmwi0ezv)@8#S^0oU2E?zN6kyP8AqGxFG*M<*9|{ilh707i*vN!q@3h+T{CkoPO`3~huS~#_X+u_U&8av zv*CL`<3m3^@tA};i>~MExc06&?sFaWahllu3)?1=&JWo8g}db+ok<_*n|dj|M1RUt zdmBEH_)0<_HOtF!{n-7;JW+K|%b0QGi(a@#0-kS8;Cp@^9uo2suCx`+ghM@_pNiwH zxmi=9iS$T)OK!r{4CUHcBcNeCPhHR#FG}Df@1?)^40zhy`nnlZ4}Ez;ty}BhKOL6f ziSX*pQ}S2co3ZT2z-xMz^H4*spKJQL#M=^P95d66`OG!m(UOEd>3&6Pn|O&I!UKh? zwK-hR8~J+T(!^Z}Yf5^u9Mw;7y&04T%Olx6q5jmgyu?xJ{n&)Qst4!=dIC+L@A@15 zAK%dos^;aWe1xT5t)F^?tK5|@dZ@fErd|)<(G+IiVrnllok?%*n=oVIc%1a6#B>6l z^4R?&)P$4hb&$D2t7Z2ipdtmEsqxJ-`n z1@zQkykt!^AgkNars;c^{lSp3Bz|J@Vxwl?`snFMChX%CTIjR zw0w{scnMd~80KNx{waybl9?+LxJK@&Yq=;V@jNVFoxoA7o8!zVQc&C%subVG2)u%sk=z=z2bY*|qt(G`=t$dTqkoV=Z~- zgnGyE@>5D7J#PAm{DgrXgKz0Ubu3rtO~+&n365rC+8dVE z(e);4LO9-h;0wR$k+6iJ`S$Dt9ZCn9L;arrLu0uPW-Zsob%H0&Gp_4#l6-_^ImshT zX(xDFCp9b42VO(Jq5(TAxwd9*=g%jSpR40*(&}bU`@?aPyrk{vdR(vG&GR2l=%3b3 zev$C^*7)r|J3PUg9CEz*vm6gI91lZlNa`FHsdf2FgW4~GKi%`7chXE|X8A`i>6tK9 zXRyRe>iri9{Y-wgf4V+6P@gt8S_hVE{3aSy4$_{7Cf=7gGVy`L!UT-vu36u{5%ZOr zr@v?t+S)ue&PiM3^K9Dj$?VS$y+481c+Bp_ zx9({+#Km%J^Mrk(aN>`eEnzB8Vd;F~iU0i`7vcA(CiGwUw10Zd_Ro4vW@&lrcQ~Gr z;X1gd$2sfUYJu-YhnmUhbagyGLBGpUIcbmhAqm`6PO@jm3_!bnph3`^Xb{ObeJLXeRT4Yvh{Y zc=zq|;M@wnU~bRM_B5ww7;3kzL8%g)I6;~gZb=fc$yvXu|C>-QTI4kFO`olG&9lj z{!K6PMfOVI6FH_A()Ik%NqEB4`{)O}eP28aHD7IER+3ZvCfXh^@j75CPjQnxq@P}v zfbRJEPLkI=YJJ1KB|JR)&CT=n9ymvu2fyG5+$0C(B27wj3g7#gUT^lq@pwre)u+@w z4Q3XiL)AAdal1$V=AD?OU{BZkTfM_Ia@}YNo~T(zFSX|89;7EE>~GXlpO>(Pw_8GP z!qbf8%e?^luw3_g>dp057kWD1o+k_k^ZdOt_h$P1>1amh&(Wi5AC6{w{9Ziy`!qdm zuqGkLeXfE3--+vFT@rWTW}3(PrE`OoYbz(!`lLPzQ*)AaB{kKWhZBtnH#w=!aJ%cK zuhRN>3D0}3`4b;{9b898@HKeE_WjwHZs@i?%p1k!W>L5b`qTa!Gm`%4GpDRC>czNp zI^pqEuUUMG4Juj6+!Crqu6$Wc0!9=Ig&n}q)# zhBZ{5Ykg?K{wX!@eC3OINx#80JOwqaX7G{v_h_92p8B1&wHGAJSo*KO*NgQ=nCg?( z>*!AS;sxs@xXW{SRC*_^=(Wu@{CfMP`NZq3v)*X-)HmhfD-y3un2l&AbG`Kszq4lq z&s!_?S?1Pi^?uh%4LBY;)cy`j!P#naj+EUTN;y}TXQP5Lii^`!|l z&%Zk(fq!|v@{4E0`>_`fW-wLTa@C_=fdBCpFItblDYQLp0!z9{&Z}+OQ=NOn`*5Yv zVCrx90C*S&n#;^eye8TQHavTpNv*#qVP=Bkbi(7S610<=$4kEGP;1eAM;ea~(W@Ot zImx_8L+XPx(D{jz6EH0&;UoJ;t$(O@+TWU<{JbTxQ9c6-o_eTzX!$O58O~6L@Zclh zCG(QJDW39Fm`NR@*&F8aOMcQm<^r#Q-|&t6l$-bmzOpGp6O=l2tI0UbIgF_o~cL_6@Wt(}=^e3@O;q4`JenNG+Z+Eadd z^l!OK3%~*&`5RhKj<27=!lH z<0ZJNZTSdCx>WC+n~=-!T$SKg@mcgK=iz$m+q?u?(LDz4&vYNHJzsogTJ)R*uIGX1 zmv|k%_LcEW`68ZYjqWe={{oTYFHV@{`FHZ4K6LGH5-&{+<3(7Subm@aa%{AcJe9Zd zx1415^tW_6Jmsf+#7X)yoh0y+eAN@=vFGc(<}I_C*QU|nNt@eKqwcMJ&PmWlYJb-R zZ7)Bcoq+M?2^>F3hw3Y?pPJ_ZTcg}BVV-v{-0kr;uSi&b^Z6{Wv}R{-1Dy|7dvMN3 z;4hlVIsL_ftLag$m-Ex{w9>-9zXX{MK#a8&nd9QT+hsplokI((z667tjD5O}KjkIu%Y^0`9tlz}r#I3>){5;V(K}&^kMO&>RF2{#bCSQ~HCdCU8$OY6uZH(9TgxvTub-(u zb=}z$mN=M?ul8|%*OJX4T}w7c%5@qAAF1*BP4M)+pUF>s6!)r&dfW7v+04F*H7{pr0Ba?B1Fc1anq9rlxMp(x`WbH%J~SwO#Al-E;V66$x!@a}tkC z_)_y-M>cC(`=ljcDraF0PtP~6(ls$Ki^q3YcizBP~2gmk7H zbbaNe`BTVK{nSjuXLRl90rfsNLDS0v`KM3nmwG2}S+C~Vo9ER%Zi1=0pu5{c^%&Zz z-iZ2Lcb#=dpL@|BDmTsWVtxYG<9|HwGi0qH`+NLm-op!y&9$`d!xzFy)(5p4L$1KM%&7WB%lc>Y;M9JkMX^ zGr>~-+%W-9I+Pzu8|W9-7I6}7hcoqc*VX+>{B`^7pO~-@kFL~1?IF=CVW{rue0&6F z_t*1KtS2$RszI$GACZvz=6Lm|mpL!_=Dcu@{Ddc6Sg#4Tau%jE6@4$KX)XO1uhC!i zMEUdbf?g56_cJ|P4R)UAHOY6csfU`E?3uPFo!614j_^|V_#B3Gz8)ZNt&MJ!Fvrub zbiH+2n$PjkbhNP^`o+Xy3EXV$(|vVxlXar%P?#=B@axzu8T8VGUg_R%`3gt1enH~L3As#X!BY?RnXJ4k+Saw|oa8)l zw7JFk!O1-69N`C7d0Br1o-n5e^ogm2ovC^T<(NG2h8vJbC(vgxcnV{7pjNq?PmqpDV^^vZqzOdo9OD3z~K5IJ2jk$MbU3 zti*#`llhZ&f*I^!2uq>2noD7AUj$AvC+Qb-{epy?cb(i@pufpc{f`Gn1L-@wV?75jAi2G@Cg`nvk}qog5D=rkw*UR7wSGnvO=)p9Y9Q8hWb}{9}Sz9uL!W4dT)9eIKIjY|M zUM~CW3I2-f;yBHH_`&tWiT2Cz>}hdppYHvHr}_Nn33?QU>fQWKo61pndqu)}r!V_( z%t?BvH7dH^wX#1(E%1e1M|mbchj^-Y=P8OO&q;s6^KwkR>-};Mmg<~`#b+|p<9z(? zz065^fag6nq3*qge3$=ni!R44a@73k9%c1TzvHH@X9K_Mt8$k&Mc2dBni39m-PMn4 zhYM-AlM?QKQ}gyXwTG%_`MDyY*5PRli9VIHmnCq#9_nx0`@jn|$GX3S?}F#`>f)*1 z%*vF_>%ulF!9Ea!SsB6Yw!x?H7*VDpgCRzrz`lWs< zaJ!%J!X2yJlGo~8j?B70xe)x#qm!__$)#GvUOzs0DUh{aXk;iIlGSP7GLwdoF~6VkHZ~s6wY0LvgQd> z*TC#57vO5&1iWw^Zt}VUj_@{jdLNqGwa~k*r+96>)Z9yxnwzY*!4+2So5cMzs{6Rj zMR26C{9gZDnlQtvC3rdq{m60XIqFg_*^6f%32)SW#dOf)5-_FR@0q!0bk7_f!tH7u zp5`mwogQj$lYJ9r1$!NM%x5MpOVHeMr+zw(h%cNcE{9<;EuOG0p6YgpC+$S%!w?VA zQ001kK`zTroS|oUAHKEzj0e>{{bRk&UJ#xK?06=6fH_Les&o75VQmi%KC?zkGpjAH z>$n_?o^A$)CvJkn-U+_DS(1jr;d1n@#2vFi%lpD#p2Jtc@jNSQe*Aj6$!zQO)ja-{ zH~b&iOeOFW?C^ydO7O${Ot01N<(Ao#Mv!x`f}eWF17>@DQ|PJc-tS-wbNMW{&1qg+ ze_ov6i>h6Fo$Pslq1smGW=tHUr_xmBDZj@@`mTK=*63(uud5E!yIC90TmRt^!9x#~ zmu66PeOt*Iw5k3{r@|Gc)=sSJ>%ll4C%I?Xx+<=am;5HR2S?nkPwHnhJReAZ zcdq)VI`SNN(#_UsVX3BI1w*gv_<20?U-+JfhnrwMoaenSJiV7al=`Q<7Bd+x#`-$1D@s zb>0(~(2%sK9JNj__uN~j&S3~kn8MZyF>8 zwc%~^Cr+oE-i)=tS5~ zC-hRY9X+6~a61l{^J*HWs(rY^lHUYp*HCZxQ#p#;)v(;tC-u(iP%{!O3R4A3OX;JY zPuKGV^bdU6S;;Y&xAjnK>2$eVgXjI>aQS&_)%_n5o^PL+>*4d? ztkKyMPA@rM8rv*k-jR3mMDK(jpNW3q<+(QtU*KT1Ib2uTX?8yjEsJmD10K3=cHgaa zB_Uto3TwTgI?W6!msU!%RbUkfAGc`xQmHUJ71l~2X(De21aF1M+myQdb zg1=^FGDFEz*y~e{S-(*GU7uIeUK_6FCAsNQe>E%lq6v7@G@4#RN9cWcN!{XX+)cOB z@NyB3kDm3MaMPm_aJ4RPPBpLU6?{O)?={UHbg}-8i_M>UpPIGLNguVhhEBrs@)VwO zRer)0&erGTG9Ojl+aKDxKQ8;t=_bCbbCxT5jh=|V+edM|9x5m0t@)U~<43^~4vtq{ z!G@0YT6(FvcMj%T;eGU1dw=kk=T1Iivfe9-bDI?ejKe%p~&;#^V zJyy-r`1s6Bpq9KQovX*YzSgyIvOdZqG3)R}X(wx$v=Q9ks&@)AydG*+g1hIM<>~qb z34WkHa!SJWGUKXI9O3-ri(IAK;Y!c^QHAa^(xhfmy$R3L{_34}rqk&!c}LHiKWQ?# z>e0XP7Cm6@R}-#81LpR}YyrYN8M*&}czTEX3>risj`iH)RulJhxj*d`^c*!}!29}OP4mwXYLzjy2IY}+i zdFCrxR*pM%{U46%9sdZub6D^Cw(H>U=`VhP-aW}1(HG?@?D$IhDSYu1AJkkAPirT* zOy75Xa4el`?$mF1L1r491PikcjgDh@a`xlFjwa=gc=T^S$L&5J*LtZvO*AM^#6Ctm zN7v(Exnu@>LZUOZn#MQI&us13^itPcZR!JbqcwGN=iG#vlH*>F&a4ilKk+*)dR4-E z!dL#nUS7)~*OAvkv+;)UpZ)gcPcu5a;A-6nwzR39DL3^6`^)5~`+f1JS;TqhDeBH~ zIhOAvPE5#Anum5WN5YhEEKkj$BLd8SX?Z_0Pi>VjtEzQt(YzJ+C0b89JK;R#jJ_sU z_-IoJxhXH<2Ty!1e2Nc3lGyT*Wlg~hb8P2DT83AbDSuy&WiKlsC=|FPj5#H7`#7sX;XkKlv(m z;Ox5VtN6X%2t47UwtV3@c?vr-9~^03c?)Mf6;GK1+PA&09=#wj#M9>zz;k7S-#m^d zKd*T5np}fL2{q;Q^!Xv4^y2XeYiriktzGi&X(xJAed8aTeoul<;y>dfUNo=C%!<$C z_~8kfN!{akd87WE8{MOZaku;{rs^E79%*lSNqx>w@JCz+9Ip?19bY&|A2k>0pThU@ zL~go<&Qrf|&U`?etPad){EcO^9<$tpo0&<^#OdaHJ=MSU0W&I1FGq1aPu1}{7w1K5 zsCnE0Pg;jArzPbkEbXJkL1rSlX?4P*fBU&UAXnACoaR^gJO{Iq|G$cUa%Dm;>3`-W zc*4oG#Yu8g?W=XOkv#QtIf}dVD07Zk1U_B|Ua-_F)x7+~v2wKauBYiWt#|pU*LW{j z@Q9Zt^hN)_rEy-uNwgu4_SNv z*{nbEqj*l2CCr_0wQmRJJ`;xrU?22?gf%KTYOe!b<{W7qwTBaNF1*w`4D}*;qlV0K zj#Dn_PkJsLN*{Dh3D?L^*NKLJsk-;*-+BxkAV+bTJ!9jXWZva3!-p5o$CID*6HN+F z;d|?%a#TN{walGnExJ}M$$vA1`r!Z4i+Emc@$l5U^$&fsy55?d+34p9ehHl2GeTFH zJ@p6r)!*Cez+>h)xn5=mGohX)$DAK6Ol!gnr>k@LdYq)|X;*pR@8unT#Hl&H?@S*FdHfdcsYPN+5OzCvBOq25FdGtI|YxW*}j;l2hzsE~BOwF5b^?rI3rq)^XQgzC2 zhl`%5H=5DuDSYmnh5A(Meg_MhOU=`w!?h2&+AsL=P3Qpmf&-nW{PCKu9nRx(!2+IL zQ!<0X)Ep!a>tw?)v~#X zhSyik?E;Q804%LP;d*>#O-iogCVX#Q38tUEp7ImN!&C09NSN(uQoOFWS|gzW zU}^rhPtba&-lT8gOvmPY)ZxVmz0N&L>eM{%-cS8d&fzEZPj})USbEeq=_c!)=J;I_ zd;s}rMp%?Ef4WZgkX(?!Px_oZRkJiAT;!c&lC$PTczA>(tYM`84zYxx@b~a_U5X_R zn}ns=+bqv-H}B9uurkxbj|Ro{*6KX^x18lE>$TRBc+>FIH+T_dTknmN)F982X0&c$ zJsqdWGyTvWZ#f7<9)5MGI;WXnIw!#krJLaC@725cleVRu%=55x{cs7M#uaLq-p2cQ z2XClz0T0J&Zj`I?7q)Pvo!}_H&7wk{!qv6u>*^QyPkvel#Cu&o#?wBFU2e)jIjP3= zN_t-SzM9@FB}dIxyn6na-tSm(CCzkA!Yt3bv!|0Eic|2sbs{+8@ZV?6n74Fef;U1l z*#n`E(xdX#^Klt30H$UpeoNPp@e)m=)~jV;1WP#TpHm4uCDf_8)9>J_e$_s#VCs6v zPgv6W#njLB1^F#cov$9}-02BksCt*9G?Tp3JK-rW;fRA)CCr_;ou1;;cMW;coTT5V zJ8Kj?OM6FnMC#R=yftJsE+^q;Ere%BhYH{O8LZ8s=6bWLK1$!aHfCA+*1bDC1M?v~ z>2me$d~p%2DTio${7x@<^lv@NOa*Jtg{}UoC#Y|=)_w|K=Ouq(s$aB^x<)i8jVrfk zNbB-GQx|9R?bSV8>37(|QGW72%~1YdFrEufa}xi7W>8D&f==VB4QF|u)rgDiS)fJD z?7R^EoxFsj^*MPeXPcwA3ODH!^-0X2dZ>P)4%9pyPCKbj^$Q!dE*D`2TlqwX_;+*E ztgP;fqh6}!<)!O`*FEY1@P()6>KA5L*Ti+=#aN@`i`c7RoleceQV!~yW_Nyw7@yg55;4zNzh(; zh#u4I_EcFE%6#vURJyL$l zN!&(vdOeRc16zq?Kq+JOoF*Q$ICtc3+dvD#7!v z2fg4LsUyAJv6#{5ZGL_CHJRn@yS4U7E17}x$osO#4yHp-RDZ==c%E*uj!bXSp!Api z>9c(0r`}?wp}o~4&VVD%kVDpccqRN0kJdiay6RwbFI!#=q=Vj%w}p*?o=nj4`1LQTfF4#RbB!knd_cs<$)mkco-*1cRTrtp-X@>c%R{ST&_a04C6v!re4 zM!Charzz=qb0{|=t66+Ev_sCDNG57_8E@=`4h*Fofw^X@#4 zPiRT~w3w=WJp&K9MzGYweEA;E@RrBpn0EHW^K#9s1SfN)`O@5pQp2ju@dXD##*ZQ&A z$IJ96f0;hFZ?;@d-=Y4Ici;jp3{c_LK~iwu+M{+VP>?}X3qjlVa2cK zG4nooBp&ro{nZ@BL!k@m+2f<3XK#MzYdL>)NdM@ae-55`)wKIe~_qwz_u3wbk z!SU>U?vQz19?Hi_`AG}dn`;&r>L%ymoP3!DaWL%-Pct~Lh@PY?VMU9oYdLDI&ZFLG zHlqFIF|Q9F(Mw%Z;s>6cQ13iSU-HGg*%=!j>7n|iJ}P|gXL=L8qu1hi+DTn`4Vp>+ z;77nze-?67&8t0qw0P37UdLSS@#r4xiIc0;cswU~W&TzN=U8s?41B-<6YSCOM?$ z^)%SPRQ@?0ng)h))1!Y6=S}^u^-g2Tb2$n(c@I;0>CwN7r&-iB&|~y$@8z2D@amCF z@cpH3HeoyP=l>`IMPeiOnfmluRp%F{YbrXNt+B!UWPI@TJV5g7bdf|KAFMo^YxPRw*J0{nXp20~z z*FnwKTjt;KoaCswR`)bK9`Xodd_{lqnBd9hxAtML15Pr3@d++X@Icj~TBUj98*M2^ zVd`AvCC>1uHvJr)_{%ZNGaAU;yf)1QQ@QJXJcmXz$Iu8~%j*wkP@X*>56|3a3>6#P0rGsE*j zX?mUrpC7MT^R%8coa6Dl^L3tZq1`$ssT-K$3;|F1IhAm{u=jk}G)L7KuCKP2tIo;4 z=_R#LJoR8&!F%xStp%!C`yBB6k_0VkW-_zON&F;WI_}w9FO}o+|rEhvrMUY0rors;Baq>|<2- z_BYwfNH@V$KgM&NR=T8huTE%DIf|3*>7;w?AF-Yx_voTI z33I4g$4C08zA8`6sPLpi-Q(nX40%b8;w7_^oEhgOwJk^CC_kOAd{v+Ns6IPBcgl0z z<4cahR9@oQ;)$m`M?Sj_op-C9_#~Y_<(!$mK1tV?%uJ$OkDF*LYjyfB&&j%{I@9Cn z4|G>@9sNBMYqBs|BtUarDb{adHQ^=41n3D@f#_TgFc=NF9o%e1g_#Np~1 zuFe&@Klp}$0Y4ETwj{BmMmZKJ${0@ zd0t*GO1Lia!2Icb98deG95vJ1_rbfT)nTgc`SE(Fyj1J()lc=FM3=7CHK- z@GLK>Yxt>i{Z07Z&v0r^+G(4lO8NbtMAQAo{KYR3%M@u)hSMqW96o$S!0ra zdZpSgH|e3)K<2k*=>&sESNB+1knRjod$JN%Ca81|d@x7j@_62<9 zu9}yhdM>|TzpzH0@`tAPC_m+{8OIzTpUqjYk$1RU zPgdLN9){+6k8)J5(5hJ8;3z9@ck?bVRlF~9NB zowFRJ$q*Y9>q*5@ z&BM{-u+}>#wbtQCzr#?^bd9W4buW(Z{Y+2welW%J3^D)N2T7)usjHyG&i9hyuUSGYoB^3&7)@ViyBtTu+t~iH=Xa1X2Mt2<@8QI zs#(5xj^}3AlW2>sPvBj>2k*#5b)#oGK6y(ksiR`4p75v~fY%U9YyNb#>xS#$Eq~R5 z-lo5}cJ-U;k90lR9MpLp2jL=fd^riG-HXE?aUY2_X|tD}HLQ2KNxfU2ms>oN1qpuK z{DeG|lQ32H`YEksHidWbwBJ^(^P1>-n#r0K9qPKNLzt*p`~pw)3`=>V7UibngK=jh zx!m3fA33L<;acxbt_pnb=YCH!$xXTA+Q3t9?yS_cWEu$1bpF&Y)j17{@7q89UjM{L z_Mgy9_O>~GbFtdtSrkwG6Bhh88eRXiH(VaVQO~4D@e)3wnYs^0Pw1@Vo;-Ti>}8(E z@!msC;$Y{AR~&-z4Bza25!%_HNAK>wokMNlMbZs1~{_g!;Ph4T$-0W?hmt*qN`aC@C zd6<)cc^qZEnb(Jt)V)5+WA>S>)>h06JW*?`-VX-wR3o@sjl)px3_TLx(@=gl zmCy$~-?6(E`T)G-pmUMC!uPlV?(!P%b^Xfg;pE=Orw^JVc_ezMSqYEhCG~C1!yX9z z0G4W!So`jF&x;k>r=nnPgJn_3dUFL7P9w(V0 z)jUl3o#uJ<4O@IfE77NN*o?&U!%6m=(M!V~YEByOq4IOsL*a?v;i#X=+wQ%o{)D6a zqu158o=hW|jc}CEQ>*LsG`Z^9wTH@4bxM!(H|+D&6PG6BCk*8#%_-EnpZOgxRDY1y z`lnoXtd7rdITriH=o&r-9lmg&m*A;4s%LeNht#)6d5Nq1p01Lc?pLrss+tKW@k8}b z9PC`>j~Z>>z*LT^XSpcgC@1MUxkc}^Z&rJDZBEX2{lm3 zp?jRvE==hl{)oMzw0-l_BQ0h99-h1@{Zs$7)+gU_r@GP09E<$XL#->Blgv0idx@^+ z-Q#dGy}hEa6~3qUtv%@tG?w*v`N_M(M_x}aQSYvs^W`_;dFKcx{jiwgCIL?vJAZ3W za#@ZQQ-80vec^L?0Yl-M(M#UPbKt4&{k_-n`g)2vi9bR+sbAg^tgI=kd-%yowXO%~ zpYVn|{N*-3l>aYBy*5AF7wvXg!nxxm-mrZNFy(KWedtm835NQmfH5ADpSVch)ho=c zda;_9_sbJF38r+T+;J`SK>ASbs2Md0TY=O4+t2AM*B_p8TW?hJda*CL3RgIK^lyA` zE~R<9-@&zWot!_uQ}_C)S&3f^Q}v9Wcpvi7>;y->6PEZ$z55$;D^0J5!c#wTO!CGY zqwdW$<{SGu@d`|RCcS!=t9k%z^-Qyo+~lEH*V8}gCHFe1c{yqwz$M01(7aJ*Sbj+z;~K7DUJS)Y+h#Z=z8zVa1run@lYGx(?{&x4!m zfX5xbo~*WofBU(-^jzmi&&VH`%1u4bY(qEEk?I|ua#J3{P<^X;x>Qfq1LQ33f~mj3 zNqjrHR^H18{T)B9N;qG$=aPi{RJZC^&8uhF>7{Di+KApMPhrf9ZoSi=W&`&vOGE775ymE<7Ia5_(kc7iKykLz*N(u7`$ z=heO5;q}ZL>cKUp53Nhm-)4FFN&DbzwG1!X2(Qzfd=g>(j!zF$nAdA^Eyj7C_d@SF zUpb{F<(zp(kE6NaXwIbZJvw)|!rS%t+~TTt%5iy0kNU#v!uRsjb%THPL^N^jcCu9^?Ccd^uHm`>z{B{ z@36)1^uF3x_dFE3Nx$W*=%I2{KbH46$vmd!^%&RDxw@usk~=gK{NUQ~Z`U5?^r(KQ zr>bTA15^2`e-3APcLTZu0}+ zsh7|txYae5H|BYJa?0~`kF_P9C_M^OebhQA9QpVj{ab$0R=A6{x3*tQ<-9d&>q@j4 zo~J8l8##nKU<6m!7+=Cx&I))sR`~@}&(r@MyWI2l@>S22_rkS;Biua?mR{Ry$$wt3 z9Mwx{$#T8C<1^!QJ=Ge#c~hu$`71wRx@cBA;d=8t4IwYQr)$eY#KC+ayln5W{i3{0 z>-4aK8SKhU@)e$P7uU;C{+&K5zj-5ivYGbmgc^XSUgt~xz{L4F7UwH}TK8s8-^hxf8up>J6_U1h3|2bT$R7{s=7BXxgM?y z{|=t=lV(!$>OyYOm(?`zQ#tux6Rb?jb4PQp*!I~Vz(=Di0!pf|MU^$xw+ zd#F|UMLW@!_A9A%xkxYJbv_f0$5DEz-U?Tk!_;-4@68FWyYr#j)O_bpS_hu=IbCTD zgpY@Na1b0P@lx@`W%9cIi2PLVdMH2CJmWp-PC0{foTI)jZ*V64?a{yCDNp67en9UJ zxoKQO;iT#(I9EUE6Y{$~wE0O-$~F2)y~{y0Zr;R2aK%q%P1PmY+kOFP_$w;DmeRAWnxNpG3%6`rhw(eRxT3 zPbc`ej=$QTjY;iAFO;^IpZ1NYceA|y z$zL{?IcHe>|KLgI>xb~fMQg*e_3k%nF(*BxIvFEyyQ$st;lZZdoFobZb^VY#P|nm6@QIq4CWa?>nD3&2zVwEkfa z3f*K4*}9Th-VC80Xf<_@Q_M=`cs))J5OUJL;UJIor=eyte-1U1TKCm@_dCzgXI;DY z7j>XN^PAMG9Hl8~bu*AYisNAjOPmB-c?;_yC*d>uclBhP>Ri;k95v7LnQ0u{Jk(8{ zKVb($SPFdr@9PQtXnbV;cP(gHpFKc_=_T-V-Mp6^Rr7SH^Mo7!Q(t$!I7r}QwNxL^ zbLS@X-|A4g2*dx5=j1hMQG0%9r%61om&#N96rS*fGrZxh=Jim#=5-veS=n*%)9f8F z&ooEjftTvx4YfT@ulDJCTm@tKOE;NUVX6nqb2{|DtL^cIaNe|N`=>mX1GJu6mgBhH zmvi7@@kTw?6V*>Wk1lPGkxNqvwJN`?4Z&tu_wbaH&Cy}q)A#D$Ja5+GRpU|pqM$hdNYVy54fNISK=L zEC(F3+#YHsoa9R{k*jN)LH(`wYL0eZs=kLQKMCL07d0yh`N@w`^JV~e@~8DtYXFW_ z4Y}5QhUTdG)7l#Cq;}o^$@eg;^OlMyj)JLww~xY|*5U=!b8AZ(n>Z7ofZ*;r-G$Y8z`XqQyUy&nn6}I|<9@FcmN7E4anJ$;3xM@*> z9+iXD_T?szOA|2Vo$9&v?D7H4UGxbZ;yQcJ;XGeF7iN8Fh^M+XyUWY*9!jsOcWe58 zZV#omo1f#eJY3aK`zKzKU)A&Sn>Nyq9lvV?SE2rW$y@cVueD!$Jy=?+gJnO1L~gB(w{rf^I=C%n;F2}d_Sr}O!hcpU%8$v@RY>yLO1 znqlbSc^~JD3uzxYrv~*(+QYd{&4z2P?qLfD&wH>wT3&+fIHu~b*Ux;QKD)L=OY%p} zJ-9}HY|ZPXa@Avfd%u^P%d^Rzj=P?hpsJ`PI)i?a$Nh_K|J({8PRCwzNLypofaE-jsKlB3m=uz#}ACcSb zE3S{%Rqxi=;Hii5H+gwxdijUTX?;BtzVtjS%}8>S4#n~CG$YFi`JuPCp4RHj^E8h2 z-z5q6yUSBK$0J#gz~%g8yw5N3y`RC;+)2Cg`}I&W7cELV;UzkPKI1jxV>RjhtG%7G z*!o=~Vc7^lv!oDW2=^To2bweZrF#<>8sfX(yPvp9|l} zRoLm39_6I94}BB2`x~{ccevi_-TUh8Y6PDACLW%(C4JPs2Q!a6g(<$LHT3}a2^iyc zc*7DO@$Ps{W+h$=-NeU&r#kRnI0G+N)97)qfhoM4Km2f#@I5Z^bI0yET_@3B8~z@C zelM3@2OOt=m^o=BIaM6hI?W{KU(P)We&;!!5C8Gpgegsr-)SHH(>z%``FLtv z_`aCx3G&$A(XjGU&O0_5LjTm$oTvQ3NieXcUOf55w2(Z6CoFL~JpCKa@b8 zI&1uL-QJO*x2(UI3-vg4>Dt0e9_pidCC>0Dw_Ja}gR7i`r&@0B^g8;cIlAHBI1djE z`={4b?{p)MSGVvqd+MEXQqQD8@esZjW={MMUp|WG%Tsv{Q^)DJyuVzrHbHmW>%hOW zhnYWOE|+_7!#g|>T9oeesE3;K^#GXi?fjknC-@znd>J&~egJC&deU^v( zPOZxU$Lt#DxiITI?=|t98C2A7($72(uJy59Gn`aR@icx>^XeL=I0$}tU6?oFELS~8 zpM|FxNe^-CYC+BWs$Vac@R9jOe)5>rF|JYDv^_4u_2nbEO7{=fjTx*lQ*PXS-YikIc6+SL>AjK77GJjCg8L;n!I_cOn1Z}xZku-C)MJmKaj zj#2Y^DBl>r!w;sg^yuGy?)Q3wzDvX6C0>i`?4Z7oM zp{~)8muMKg#0TaFTc@+fiS`-tJYIq+4B@KYf)2Mm_Oy#zo zVc))WCD%!gTCb)IO0_Ac1RVUVn5r%K<9V1BPc_~cV%pc1|MDH*snhmR z^A3E>lFd;%sd!G(PQx6P@AQM~?ObrAwOzcy6S5zP9;fTgJJ#pr9=!1Vu;$f1jQzZL z>JiOR+*B=UPYx~0x33nh4t_zsTQ|Bg!J>Ruj8=iWh z^&_C6?9;?@yRpmDSPY-eZUE}5_&%&I9lgu^kp)@)?^+r7spQ~{- zFIw;TN^a6ka+*f4Hbsk$&q>xk`D?h44t5OX4(D!Of~)ZTczw$~e`7s~UT{t11g+%J zyx`}458GZV*Fz6c^J57>@06 z%}eSPK}p_JydU0^Dvd8 za22qmmGHY>OS|GDet`a=$E%s*N!P=ZFQR|yduGRKCiQMsH)E=8{n8^`VQSx_K3mPi z6Dhybq523-=DP8J`D}8te5BUpq8x&uUgS}o`nli3M6dKWw2{AurLS?{PVU21?vAe| zJNIh)VUAAHO=?|!3OZ_>RR821_=1ZbM>91?<)m{K@GYOi!t>OxV^&+Rl85!{;VOon zy&U#Fu7h6cob?hKN3FsXCe@?3UN6N>YFtjLcaQ!}gVF-<#AW!Hm^no0um-tusT_3e~#QZ6rVBx*>L|DNL z|G*Hg!uM*vyk1PpNv(UY>_C=#vNV0vc8iU}_AEg)uSj;?3p^ z>N2q)E-~P5C_0tr)9Ands_W%7YXib^1|M@QWDi70+`>a-^AGN1@)~Z2qrQg=Cf>_0tP7|eTqCbGhH}NNFliJIY+_n&`sAbKCi*Vs8x25w^5yZAs$=YSsVv)zk#`E8TPo)@cl$}RN97v&oo z6xZ~~PxUyOOUYaIv%eZaUNbh%YrOco@iZ5t(N8?Zz4{18>!k9LUcBRsH}3M1+KFda z8{wnkUOj5PfVY^>`_o3S(mK6;Idae%zZmwp?s(V~&FbCfHzv zmHfmjX;PDiytkb`{Wm1m?L0%_p=wdjlxUQn$a~hc#J%|^oyHRfzwIQB- zPEHo@=JV>G@;q(QB)^o~d8cL$rG}E{F*cX?-zMVfIUOHWH#o1{gsJaRKUp{Ad17CT z(jJ}|zUdRsv`N=|(($!oKE2a8FDc&LJAGDz(i&|xS89C(M>*acY3HAqzRf@RifdD6 z@HT5fv?MpHBh~hDd~+r9A~{K2Z|P{o#chmj2`dJr8m2eA)TGtC?C8ZOsX{twZVcKYz8>o9J0x z(6f17qUNIwIuUzk%+o0U6u&$YFF8nj<0{r^)_h64%S-m#c<00X*t($Ss_G`SeZOHI96vHBskwPW6qvYz|JNJqw{XIY&IpL-ISlVyN)~ zIZ6#+KRoH%`Z5nui-{xOYdqx$OszYKd%j1f>QQS?p1skZ_{Uc5B){vi6zghMJk1B> zCG#!oS87}HPv=%k$nn09f6|z^6e}2s>(wc(YSm9ZPp|xuX59mZHGG{9&(7%_G*q59 zm#=Q3GxK?Cqw^Xr9H=CiXX1d zr9XK(uk%<7=Ap~evr9Q!t!}M(>rlGX=rw)X2UE{X)v@NVYFpQ5jK#dUi+LfRGoKfy z^0Q|c^obK*@;H7cPuu_FSChj&@ib=5mG~W=bcKsJrcGKBpEWFE_!A#BPR`9+>0kZ8 z2k4cC+_!a6T+bScMrlyZNuLG^ht|!Db}h{_1@cF+#8cvo^z!%+FS`Y{PIy=nnro-dMF=W5A~h$qPb@=Z(hUu z%1iP#R&+?4c&d}+BwR67GhyntclLi`Dlb`cGIna;)=1JQ{ov)ku@$4mJC?Ld!}i;p zoprA? zs&?XgYDjbPoh$KCT;(Nt)q8KdwL5hdmTG!A&AijvfSR8EJqIy%=1Ag^j`&V2akL&p zr*x^c=9E4+{^>7`Vprp%KC2!xPBbnTH(yfQ%PYJPN6+Wwqt#~~D(2-TOyw>6<7s`F zAIo*+cwSSEH}_QIH21^>A9GJ}Pp4wvd{e`bCV8iI5$t2>dFNk$HRHpZt-Y8Z@oRti zXLFhS(>P4*G71yIL9=NRxh=7Cm&f0#nZZo^=0vX{%_*Ynz6-; zhQy^fca1giZ#y65nJyi?w(236yW^)$*CjKTV+xq?{o zy);5E=JK8?sTa%f)lA|Ux8_PcQ!3BP`}~v_(6PGJI;!=R>QJ?VwSu0{^K4!tKIzlF zzcIx(rkLYXZYtN~=sf&X^Vlt#A=gHQbTE7$DbV;A)M|yG3Tk}!-J5JrT>r8Tz=hgg0oo0T9r~Ai6 z%wUC?d#A~C8OPNo4Z42Ei?#BR*S7g=c{-Qe!Si-Kw3=zxL+NvQ(kR`^@%F0*wWhl3 zp*-E6IHaBRP&t}LtsAL>_+&iAyoT+1s5w9$YCQ7LT?;+e?c@W^u*@J9>-V z<|1{pH37|QW8`x=%Q0!6U!3zK&*;qM)2Db=x69@9h^r>vX;b|fPshpe#-^Beovy)J znl+&Ek~}Z&F%h?(Vd5%}%RRJMGsmZ2EcvH;-t$g%ES)=-XMgm$>!5O>y2<_1RPo7A z)lfWA^BNOe?Ss4hqcPk9N;Y9{qk>mt?lG>bLv>QGGg z8Hj6jUG5Ffzx`@Em$$ZorQD61`iM^!?_!=#`D^PUxH`r>-rAk@`qrAP51QYqL&ZD~ z#e+VvqDR*x_Iacp3ykwhjO?#IacpbM{G(=ll#k)-{v2aGoRgQRMf;toy!5u-r1q>1 zZJtD{Z*zIRB*wO`my137u|6c9(5D#2ls3h^IX#A&c*jzXuMXuCG-`dtGwJftIgfY0 zwB{OclsD)|Y`SmF>uOOvu+2NuDbH{&Y-{ex_IR#N)ef!O_dC(*r{$P4h(dtbgwqo3yT<))|k5`9)TS&vdIr~^Cj17oW-4aV9(~| zWa~})TZh(|F_njQZNz)qX;i*9pO@>^q0N#Cz%5xzsrBU!L!G4&oOhtaztf+D zds=Ujo4!_?{&BsDKCPvc=V^SOCs_;iyGh?={SE_KD%WEumR*9y5fE{ zYQD6;Z|c8W@QhBqD0lEeafzSUmM_05r$7Gpn8hr{`6u1Rwz-qo*YG^&OU_NBo8R~M zIO6`So5Z*pRKt>oo@-9cKY5jV@ZIjsoRH7S@pRQ(ULB+c?U~Z%BzXx}agR0T_H_(x z@9*#SIdVD4y^CeF5RQDv{mSj?5c3*6-;+o9syTTz)UtIR`K^YvapD>FGaimrGtg7{ z$U2_2dNJJdBtD8E-xTwj*S5*`n5wO4TP?~zT&H{Ry<$(U5cB;WM_sOFGM^O7>Lq!c zhw@JOy&Qk?R2PW*H=g{H&*15v-7iMQ7&rW|R4>PLYbW~MT%T5XEdS8F#@6|Hae2>o zIDd1c;=XnJG};;-wi<1=K7!@BCR&bHQ}j$}*GD|N=y&1fN#^e5B{e;rYFNtoJXOs^ zpLlw{*L=ykz4@2*!G1f^`dxKXH4Uy}omR{9dhh8AOFAg_#h7E|GF)rk=gHM$&O=AB zRPUViJRil44#oIaw154k5m%q>T*>j)Ry{*?eZG@U#Qe_Z{k99!)|~b^2yW`6ui5AS z`8#LxC_d{MGEKLBx4&hKXKVJxQU0K%jY~e~+Gt6OrR~eowc}Q-(9IAyCy2`Kdm{vJqLN?sqR)YdafqspVmic(fpGxTN5>3!a1hampupJ!`7|J zN#*&7|lEbiqcb-DUpjox!) zH7T8nZ62U`Z5x*S(-=68#*Gi%yFNVCEC8pw@2V%+- zd87Q~87Mtsh^=0%)2H=N@os;|@r_Tly|qgoj!7{uhiuH#m0V<-&v2#D{1Z#Q={!7H zZLh}Hytm!wjh8W@`)a73iTF*8HD|RtR&;27Ns}0B)2r}=11 zd8n9=DV^h|cF?>wZ=hLvE%(W7TR#>1^d^?^!V*JqPOqBRw)u=dV6X0Syc*9K8EfO` z-qfO=_3}FFqSo;8QFWzt4>2vaF{Mq-Yul`$s0Vni8a5Aodp7SojivjICk>uFF~#$& znacAtQQXV#HRrWGFEw7y?_BCext_N0kXz(?bw2Hhe_ZKQle28Y+dep2w-f8MX^f1Q zG4QL+U<_tXAn5~EMa9X0X zJWpKGArGy2zd6YmU`2a*D26rL@=@#^U#u@r^BlRUc=vo5OR=qv66c!N=I^wLIXxQ( zYa_;nK3$*hbx+ou#G*Xx89I$(feAK#FDlnqKgJE;8h^E2{<5ESCcnjzkF2#ABf94& zeA;s*>j%d2TyHYY?qBTG&OGFr#T7k>Z8~=z_fhlS_B<5Z;((s$UJaFp@wpPV2 ztOfE=b0uq8G%C+qJK!PF6lejf! zl3#ctebS&fr%`^X$CPe;t|s6Q#=tq$Vd>L%%ZHxx(2aP+Q+-ccG)8MQswVY&JbsER zO=@1_D0kV%zVdr4#k;i;H7@9Rbi)(SuBRvb{m-4-aBVA&Ny?uEF4>dk~*|^2iebFZ$r6Kq4 zS&+P>c9LI~CywePjV_ldE!*EXcs5Vx^vOewmHB*3%_oed{A7MnjN*mGYR~&vZa&8^ zrpq#|({weNSf{0G(I<`KSFF<~@6_njcAwKS&rPGo22 zyq*T>6GOf!_Vu`8x*odm&X4g_<2t{&lJUz&vBV;M(v+CR;*9Y$ifJ65{IfdLevWZI zUM$Das5)G%mgi}%xW`OQFqzq-T_VH>M`X1xu`O zH$pH`U7L;)zaU={R!(=P>7z z2gI7@HE*^ynLj($_|Orpw*F);F6PxjI8}?5=hgOSp63Z^)RBjnCp)k4GRO5@Vj`Zd!TlOv_w2e(o-`Iy zS}woSB4%{1d5v}c;k=G5?(@(med1Ki$1|22^So3|P%WwsQFjd8vGjq4t!MHs&$Ja(R}Uig{xscT|t^ z(&~G$%MrZ~|v=RyWa|cyFF02WkAYd6Ip^y1BpO<7p1&y2P44b0zC{o=wW};uMQm z;w0~=H^n@S(q?gQo6m4nuc`_BUd(*!ufLj_!FtoyPJHxfG z`x%3sC&|U-BkOLM&|12r!;>kVa*^7JR?U&*FmqOQmw4x&^hpnVOzf#;mZzG>?{Vl& zo{`(ljl{QDH{UGgt((v)=GfD7dEWYR@&318zwt9}&6V;{*MSdiv?XtdP5P>NZ+r75 ztj-$1IjRx%T-Bd6T3xUHjAip9+~o3q|JAI6SgX^#woSdyW9ifwU}~OJj`#h%NBv^% z;(o;?J>e-&)0$Yu3pX6i-_7SWc^+39m9uz4`sBgQlgwwIc*-e!C!TmMPaHMzi*+3B zPmk(N;~~~+-aBXBf$dXWFYbA#_-$>3KF_(5x(R3T-&{#fG9Kl4YhkO=VxGsz$#hi> ziVsfZq%@j7Hz(Oo4wK7T8&QK*hnjctYBfFYl$UW3r|uh1{QmN*@uh8aMz71)Jvc5u z)q9V7KI&X@M)AILBuw&9@s5`m-??WzZBL*0J66p_^X9e2%oxfCyo^SzU#LUP7kQt& zB45kfSc!XHDc94azIl8#)6V0oLFrR|S4a3Am3e18v!g!Jd`JwlYF=Pss@!a_+2%Vyh5LOXgP@{ zH6FlMY4?q%d8aYr&v)D5%PU9)hH%D?F{&B{;_%px$+kfRGo@ZUe`iA)3c@mDa*&ON5YLthXBhsii#Rj|d zg$0etPny@ZrCA<86ZWUsn)kM+Q9MuotX@)s(wZ3F`6h<6*|QJ5_qO9LXQfl)(sNI7 z@B7`4d$Xn{XYAZl9l3L*Jd}T8sbQQ>c>|9)bCTNDTGRfwAik4-ixb*&EqLLFgB(;7 zySDiZ*F4o2q+4UcJIe7iyFTJL=aG-!>L)cO4f23;6K!hrizW8zEOk?Bc(i}kqUCw( zcg4MVQtQj>qd2ZkF;z411^%#gXnD!JQw*GS=+;d*xo>$KKlfj=EuQq3pJJLH;HP!Zz)(kI{8Ig)uTZ{gY2x6I+oNf^*5rWoKV&NtT6C047=_0;uJKHwPVSZ!Jx zQjfPD+S>BYJ?T;HM4S3*Ci>;Oj%n>qo;O~;OMIBG@H9MWsJh8-!^ON@Z@z@7T;5z> zj?&6Ww0X|s)w9;FoU`X2yB^v+9#^%FxGlF}Tr=)*vtPB6+U*Z;99Ba1IihbQ5f1uN4+HZ22E6GoB zT@S_YCmO95bstabBVyHhCN^hnF9(TrO&!Gt(y2K>wf)vk`wT=ZoNFU#ln!yj0mqv6 z@w5+Ku05u>YTnz9IbA!R=khoAY`&C_nm5WT)%IeZ_RhH{&5C{ct+uZgHGkzH<_zM% zwb4km(>Yf%f8>dBH;<&r^BIWubV|D$^TtC>+uBHTCAIxoH{sL$(-S|!LG${|LFsgv zrq8(MADHH)X|(5b)lkhr)tKriUMZjBr^#7rCHV_WHJA03UBAmiJ*}zB$NNml znp5kcV%wS$hU=kt;@xw3a{~J0!|Gaf10UhhtuL!9dX6kF(kOl5V4N|-Sg)PB#4itR zZTVbZPN#gs*p%-*t6QCl`_@J=75n(%ilv@@@idR8Y4fdp?x`;EJ?^2r6jN)=exE>J zbVjG@CtNX;f9MfI&3oI`1N7`UGM<0^)vT@3sJvt@c0Tvy-8{!S$;lMYZE?lvE#}kb z8TT|UCf#>)Crn!_k@GRaRjyHI(jtDE*S7l{e}2J-Y2Eppn)IQrBD0V zznGVs_-M~W@Zf{=Mt8haJmV+!)tus7Pp7tHO3RK>FZE1G{cP;qOTQhl9@K9gc%PWX zMlIU2c{Nk|K7E$+}t~b5u6Q||c4d5Sgra=i6J_wPE2Q|vITd5;O+;+f{sr(>V=iR*VvTf=|yP;t*Q z@zu*mr+?C>ap57x%6R+E{1Z=kn170QHIL^)<)r3GG>L0-q}3;H5bM@c>2qVf{C?K- z__!AQ)QrvPU1QBQ@k(d*JNf1TG+V>G+~oZ9Q_NRC^_#rBwA^GqNwYja^O`34f_-?W z8o}}W!*#kQ-(8L`-nV9=QCgE{j%=vNDytm!w^eG>ScmC-bU6=2& zM!`eXq2}^(2c6Ovoypf?pH_J(c02%IJ?~Tl&?mp8Yh$5~HAnC)_5AIfxkPItX*8ZV zs>54%(l=*XuIY3=Rm|atss1~rtwpINc>qRyQGH5>)}?r*9!LH_&-Syw`K(&Z81XFM zC&#NpX;cpOY{}e4KEYG`#*+qV6;sXYlcl+Ud}cg$j>J>eKk3u`<5A34FNw|K+_e_# z_A4*tqu9ys{&=!KuWjS6pS%>0@;#1t;YW)!sovDQrq$xzzBDbr857qiUVNWto@$tC zP4-=n7R`wB7d-f7J}(_c9r-`Z0iN}pov%=5GvQ~Twg&O`S+ z-_=Z5x-Rik%s<6_-dRp^e7T+GHSe)>k36EB=X~e<)0#8Sq`T#brMZ*l z^=dSx>LyH$k@0dZtI=|jxngrqajzDV>oKEK{KUUryz^4NK+Eca^-Cj~dlC1ZgQ!R8wD~+;<#(=4{Nt#3 zt>vBA9T(HnU~Oy`&KVtP(Ipv2`}9EsQBiYn%B1ZY-=VST+QSF&Cy;to<`|X^E!R<2K9itKpo0A)JT1pV)oA18oV3qZ)MsZcD*n}&bcmgtU&CAO^11!0o8&lSWz5}!?~kdNKbg|0 z+@!{ocf>u0TRX{Fv{@Z$9MoL$621F2$JstOeHZV`k|wK}%1JnwJNDaV zd5I?TPBH#9L;9*g`6#W@D6e%~F;DBp%eARF%;)*29ISStCG{gF>L*&mQ+~n^OZ8C= zSDZ1mpZy&t-sL27Pv_*(JkMltXCne}w{&GUFEru4>7`J!0H4O_a@yf#0@ zQvGSpDHl2Rji>L5r}4xyFU6Do;uWj6o^JC9y5?o^bf038hG^5ei1i`)Iem)v@;k2L zo=&%|f7)LzGcI@dMdE<)hr&^Tm`HE}uowSig#r)rXHFaZaB;}-d#!{W6#WWw~4dTA_ z5guxcS`#fViFJR*6a)8;QSpi$ebr)#yM3xn@j6?vzhjh_7Wb!@Rx6!(2~X`OK5Bev zM14&+>KS=MUdEIMid!{hxk=n(iyvL;y)P%NkJ2dbkn7FoF*RoD3ALzt4cGGh#yh^Q z53BfKcs6V`>}arYphXPjjE(h^V{3JCPIZ0xy`DaC=CStY6V*&|o$vAeVoh!>&x?8W zjeDmn8vVo*%jL-z=u-}p%gXaSlrPi1^H+<;R6Sa*=L31^Q@$^@%lYfGvBwwN{PScg zKjX3MpIF5-4?VSMpX&NIp03@!REN^1`=+V#lAJAuX-{s#ONmpYhJ5HwXen_w%N9G zB$~yU58&HeUhTB8Up_i@S}qdrCr`(#8JyGkX<&1F^Q4V;T1%UB_^AfvvFXzqp!_b* z)k?86Zq{GL1YKf*lWU=|(+7W&j~vTy^W3!E`C_?s)6SEccVbySN~6s=y{FTB6#uQ8 z{w!1Ry*VlWq|yBIO`~Vb%SX*WH|A-uxQ~if(mFu*T;mZMu^ zcAc8{v`TCCaqaXcp3~?0Lt6E@{T$;QTQ^nPoAcm!dg)tU!Z&^LVoZ0gWIU^x#JrsJ z6!XnHF+4qVYo_A2wdu)83M$7#%_nszw9>>+Dn(>TtG5n^_ytCZ&mX~(D zN!*=v(_3AS+cI6Q#r;`>w$_w~R@2K(t&5c7X^TGbi48ur<+plu+}VtgeHtg@ak6cl z#M+bfIBd)JbctVWwMxtO&qryVHycOS@mAY6S5lv=h2$HtFW=*bt>$$aZLO&~wDnMH z1g(b_@8Y98@4j6RJ-Tn+=^FW-*1X>KCqKnHoz^!d&KpnXIqTBpDYmgxmzMMCGmYAg zt^M#<-&+q*kET;&Nh9>q8cFk|nDWGvX*~5$wf)BZ+ZrUj9KZVfG-rzC)}m)#lI!zQHHP~VgHLOs)%Vq-w3tR|b6K`#7t7|Ga$R$z ztwVh`2H)v3jeceQf6n`{uE&41?)cSZ`RJT~7U$TR*Kb>G_S{p<^W=CMJNePy)=uvppFQbwJ=7SbQTsX$ zZenqt&ymE%pqfHZm-VA6+_Ky+wkVK^hww8{M&!6G092Bt7jj(E>i83MrkTG z+o#b}r;gjkLyV989B+(pl{dtGYoa|1*;+KN*wLuw_0wEw^=S;#r}aqQ)^iZ`s5K%? ztclWRYfki8tk>IyYfO1)>!7>V^wXG+r)xZ0d{4Ic#c+>bjeh5&)uY8aU8YUjPNwvE z&OiB$JX_3TN=xb-KAJ{xr9B!H*Z9_K6X!UlP5H?2&U3CQSJ$i8@=s$+S5N+VGQ`ck zH0iiQXy_okoEvL^jC!KSpU8i>)PfXM2cT7KVb)T3zm;0`EdRoU9`)VlM}5$ z=hJ9;iB>hb^%=&Sld40-{XX|--g#=YdZ$>$qh_17abB%-u8r94T=sQ*`dprymzpc> z`rYQFugvt19(u;Te8*Q@qa0hFmxIMUjmk~dp3-POnnrnPI$aMn29BZcYNm8*oiLup zF(1Wb8RVr{)NIo*TE4h#^I06zeznu)rKcQEi?OT*)t@=3x%^X}H=i!gTX*7hXHMF> zi5}CaUX$OeL5uyE@(!BML#vyt$@mlho13tS$uf*%?DEZYx_w%=Z*0HIORLlM(DhIL z%4f?-YFcAtyo{Y|!n2sCA08?%<)J)L4TKXN(&Xm(bm}wv*jK$(p6}Ulb^X)xxw8(% zkuF{1+0v^%-e=#j7*;n`gKjQLqvoJAC+2^`(s9i>`TP1Ojch(TS*nBNZE?OHnl|aR z`V&*WAU8efbL;w3pBwY1KJlWnCyl04nylHD&K+w^PJJ#{`I_cVuGrRS6LUJ2kHk73 zPM^l`O`mT$K7HbfVJwUH^8GTE@6DCUOZ2bSE$-E8{Dy~%eepuC_?BB-=TBN*(0Hs) z%SX*W%So-1;8e|&PGhOJ4NuJRbewp%E~0KQUdG#X%M0pyxuQIuPUR%Ey*xv!Vp<-@ z7QdSJbR5fK-toLc{Up!h$*1x3ePY9R`*R)U_L%b2xVpxgZJN(D`<`u&%}X)H_ta@? z_&?!_DV<`v9*XH(+`CV4>E1Ul;fYnTpO5m-^-!PVZhzxYp06HNKNvIXBmK@HmT|-` zZ5G4z7jHcC z(&9drZ#?r*byNC`XL*T_Ry)xqCb5WV4E1qbZ90xu)V$Y>Pi&2cd*!F{NAX_`Wj_8% zqd3O09RI{~W8S^d&C^^yeTsG3{2dQXqv|HLD5hJB=ARh2f86+GIpr%8{qZj@T7H?g zreS^C(&kfM%1ilRYxle{FXflwJC@}nJnbWooq0(N_|7yM(`r!+s-5WV$w%o`!#WSG zZrYgVA99`A$(Y474?T67wpO25?fW!Kx7*q$w)h(n9!j6h=c}XmXk3ebyzs4gPm^?v zKd&esIbS*6b;|`I*@Vk=K+UfYHx_GzE0i=f-?<`RdR-^oi-I)4X&&a$ozr*7n9Bwx@qS#e8`_eabr;hP_U!SpMZ#qf@yp zoqm^(igj$nIc7YQF4anMea(B@eU9&w;l_+q>BPx0^j`4)}Jxz(aPkB6SIUtYrQE5m>N>-}5Yua{bL+Ip04 ziw*N7xnAt2)7a*#Y4NH5sXp`2VxHDE=F{a<%=>I}(y}Zkxwf~tXX~N-@T{5gPj#u+ zsIETC_3~LftDDwGKh;geE^Vg0PraBc7v-PTN;~JIQ9SX$Q@#=FtJAGPw-&{j58&#! zVqcEh`YDZ`K8is(s$9=Y@haboZ_WGiJkO0~byM;Fd)%=)|fuUc}$ykuda&U?VtFi%TuR&E<88af6{1v$^*7xc-Er4gVv2v zH4}aKYpzsXFDKDxbyM;F6Q1dlS5(ut4q6TR(_BM>612h?S6C8PdxN(F8^IE z8dqy@ zD_?a@TAECI`nJ`#@40_t!Y6Po=JQZY&wRh}E)V6Ud1tu^bNs8D)VK6++Wn| zGwyN0hX&~}rg6X$j?ZYE$X|nfw4!L-Fs&!)8 zJT#qRi`zEa-H)1jYbKtz>myiSPUiicK?-@ebb?{f^(E1lAKb<@c+FO4Z?xW=~Ewx>@#%k$2cM)|mL z^@nNoD5mMOd@qh^mHx0TC)L}QHtm~-KI!vhDn{a(K3jh}HE6qLzZzYq?Y4D1&CqM( zA~yNPlUA24kKBg09A+QdRf zb^2nodtPnjmHNEV=V@{ENgw;(K6|d!sd`kr7WXGhTHJ;$rfJi0&S6|!o9}WT#?!rt zKWl2$Ok$q4)RV>hYIAvF{KV9Fyyf_}+UfK`+B%!-uH~!S_nG5j?0${M8UM?b?r_y` z+h&^>Pn)qcM#jwdxCU_|-^Npprzg6Smx^~x`C_#wwi?}PTZ2~9JAU<9oVUJIjK{G1 zPkXL2eXTaz-hNMg`#dpR4~?N%rawBQ%fF0|dac=B+++JY8pX7{v~j;4N|UwNK5g+I#yrrZLJ(@a3O!$eV}Kr#^kRdx+&zPCDaVY|~=8)IVu6uEqk>a?&z=(&nkJ)n%_&pZmJc zX+(2>apjxoQfj$~(_Kk9_O%&h&ZKpgW&mou2-A)}T1^gXQ{`=iO^e%S+hM z8=kn~m`>BGUgMuWx1aqTSB~G<@A;hX`)++?W4PSYw)&^|@3Y2d`L2KRKy0^m%0u%} zn)TZD{L}twt~BcWzEjLpH$Cy(JWr39#q+zkFW0YDTff_yDIXOt;uas*wk+ZycDLF7 z)Y@nDnTN)({GL8no6X^^gVt<2=ktzro}GWXZd^C^pXyP1E9T=GTl)069G^yufBDIJ z;L}=DxvAJcna1^uZQE<!rBL zbMljT@%`?_pWJJWL=I^VDrQeFEgzk^DetUyGA2*jjHS3pn{hm~wK1Je+b7O3Jo{zp zJh-~=Ge_~n^#FWhoQHb<6AyJy;_f>S702tNV!U?7dim(|&okE-?`JJ4Zqi)6ZCbSw z4QR$=Tifl|dE$y`asNrD^jECY;~Dd~ZeDUuW9?d9i#Z@|ZY@ezJ6GDei7vO{oNr?J zq|frvxdz(&Gp2aN?CfLp#4)BFA4{6uxc^CwU)*C^iz%I!i$2Br&gXZ1QY`R_u*^qBtDEOFK{iiTf_V(e>_XPR8552*=$dnSXS55r}O*1_0Y}l?md0d+gXFgus)XQl;=Lxp|RxGPjjXCEsHaE zpLxo@CuiIC9L0P!)aH6@o_NyZ+0y6cq+&j%;*3WX^VLktw3w$o8pJP_^(Rwf@F_=? z^V4XxlxxWk^8n+1YH{B$&+k|k?_1xWJfAeW`n12=(>coV#@%%+Pr8vS=t#`xqjD3y zrPXREd~5k9ZRVln`}I*dZ*x*w-Fy_&xRz@^_3oqgl=I#1Tij!F>QroFSo5AP<)V|P zdhFDv`-!J}&O?iPTHD$QNAazlOyg-B9AAAe#~Ul!vGVc`UY4eGtxJ#S6e)p!$SjKbpxpAI0jZbs=vtCM@pIFA~Q=bQjyVF0v z%SX#HO>Un)SDSozwdvaYxgR`RyIY>sOte{?W0;TTo1f|?8f~5ViRtRI7^g?qw~U^A za{aPgl^*G)n*N-3^1e^nd}3LwuSVr}V|DuH#=Dq|X>+AF|4gTEF~1%v$2srmp?@YP zJ+WP$F-%F@m{_3 zyZ*WQOrxJ-{OPmR^ryIAuHyKN`IuJAdyh5d_Kj&Zld)T->iVBB#Y@h?Z<}qOSib49 zdD60sQ*6$@&!2kxrr&rL`y2OX%$JK+pHD2)sJdYDQZb)C`Iww5|GM{$dGj2xOLy_a zuNKFR@Ab^h>t}qQ9Ag)g`nK!i_$lw(C$@2Q&v}42tsdp2)lKO%zE64n%uB_5OkJ1! zy17Z6D1TIo@={#Ier)m8yw`lz923v=%(G7NUDZg&wD?{I<(s!Y)=z!Mh`~>Onoi@n zv5)Dt%}MrmYao^hy76CKzglfAlz+$et+s#CVcXJU{f%J0oP-829Ej%E7P$1_jG@=c>VPx>=8eQ}&m zo_#uYpHCb&A3fJRl zPqCj)*8}j{#w#`ZtTvs`_lS*hQTh~r%d)kR&F|%(ugL!6-#C8C^Si!u)=nGe<$GgY z4F9x`uX~K+$uNF+iD8;clf1II($=G1Yd*7&{rP}%VEkR(wDTqPXt9s2IIe!eZ(DJ0 zzt)%X&T^75D=#fq<60f{cO&}s4{zUw^;64B8-tUpxL@zwoRnuSS8=}eQaQ=?SUQeo zSFgsOF?mZNZWEv`2&-TG;n;G0ti4jQKQp_W9j2V_hgxeitpuFJg3D|gRcLHFRrouDbw}NQ=4!4EZ)z&2aFE?Q-{^*p?$scJI6EQ2t;G|&|x3>A*exLG???{(V-kEQvP5tWge4SR`^qL2J zVj8m;p8d(Qnh8&1=eu3!>NA#N635kO{L(3Jtl74jj497>jx(<>Pq9&)my4cwF59=) zagOh)+2y*me0e{eo-DnOcN(S7n4bE?)IHG(-N?Oi({jaTHHz7`)ns0|H7Cu-@lBJb z4&(CH$4`Imvw7>wQUCaFL*8_{TyfjxGcDh&23?kPu(5t}#IP6_*Q-rFxvgAY{Qr(d zPrm8YIDgmdyKVPhoyR=QuD_nXdU|VIm+9)Wn0Id96W2F=p4u$-zufcd-_t*f_02)X zi$?i$aqj+of7+z8?pbcx{L=gSG^juIx$oPrGV5|;_->+Y7*a*r+7C$#w=~F zcW!Q9p7d9|7w2(ZhB$7_Z=OGE&t-?psnudMt);V1eHzrK!_7leKi7bKUOcNu%YZyz{F<`saUFo5eUUJ^95Bv*Np$PN(^5^%1>( zYU#K>9jDdr_=)E?jwU}R~H1sJa<(FrF`e$6L zp`Nt)#5K10V4C|$zj+;VjGy?fJ~vOr7`JV|R%UFHar`^>nPfe@evCJ>Gk8NCIde%&?`;7V3rH{N5Zf8v=oi}}@N zET1_3B-X##|Lc+w;wG(NnB{V)#>j%kq33Tm2dPd^C+NS8U>nS8UJzOQrv~F7m|E zeWcH{S*&A2Z}}(Rl%L8)+y9w7pB`Og9km<(^#%nH_tauI&-~oh-=I-#j#) z=`%gXb^DF=PZ~XQQX0i^V}12mtzVyB-!zJ=v2pG+TAh?e&wRdG``y>eHm1Mhp?T)n zpB{=U-}o->%k#xOuH`72%tPbXd!L;;Jy{m(bh>el*>a$>Q=h-{e&uKY4D^G{y7`RHW!>HYFtZO3ypx@#mq;Th8>Z91>9 zb8W8OpZgMr)l21};{4R-YO>cSTgSZRraW|GKOfBls!KoR@O*VS$Ms2{r#3&udATW_ zp89mIV*Pitxh&}rx2KjypY(Zp=+>fX^oi#i(@%_J`#W5JqES3QF+DZvet6kx^vp*m z+v0xvyz`0c#{H?$_0c!BXAN+2^*+s>`OW>N*Wn&hH^Ztuj_wrrqzU$+$ti<`o`sy@2*8A*9o6B|e`NUM5 zev0`wo-sYOiD^8a@_S5AuB)-9*FV*2`|UZ-G23x!Eb99#eXllMbNZBLi*@(wzGI0A ztzkriG2A@V>prtzO!>tb>sXfCW9VMp=W5V>Jn8C;!S?CC_1*h-{T|bK>ieGhw(Ivh ziu?5Gp6K%v*V9MiTb#!*jz7_+?>u82(^E6);i+%m)tuL9@u}Z^J6^x%e;bGP>A1d& zKK;d!W~!Ic=gBaArpKqAMq`Za$@RN+kz(C-cFo;G{oB31ZGY2Xy30pTFU>RS+s|=n z)pxos*BaY1?ze7=?fPgQ@KqW8@vrUi+clWAO6o2$vWA-($tey(`zxFZtL4_ zzw}A#ZyI&I@qA*54Sw{vQLjF#{%m`iO{@9o>eP3nPv6_$$t_0pvHGr$W&QeT@qcp7 z2Trz6EI(<~c>8lt@T_jJXfcumpc&wh1! z#{3i0FW3Czzfn4Q#^tGBR&TGoaBBneT(_@7{BfN zET(iV_J11x%k+1+#yGCq$F}~7ah#U*`MP~N-udGB#MHgeYI*(>*SGjjm-;i`f67n3 z_lae(o<8GNzuf+n*RlR--*>%#Kn*nQN$-G86| zw0}F#xqZ)i7PB=k>|S`{H=}GsgR@x)(jcxJ2jPrr=7Dk_% z{c4V_nSVA1b$;Kq4c~2lH`#CgF%J7@JhmB=b6nycXMK$7V^`ny`aQPu#nkt84PD#b z#@^%J|97wVxc|=ApT76$d-h(u?jH5sw?6juPx0`(+d9`%zu*1#daw0-ecspk{)xrE zvh6(o@4P>+{q6l5ho|v*V*1^-r}MvE%kSLZ?)!GW-`&3Fe0u#hmQVZI_VoQvJU+30 z+yCj@w!K};r|oa&di(C5Y=1lFr|Wq8?Co5(|KwVp_IW$!+co@|?Qh?4ZvUO@JCFTW z-amcspWXJ;>-aMqe{#%EzyE)0zdy^d7sw^ z|9t0T&Yh%ENh-O1Z!*-XRKEO>ah%mJRj*vTu6cJkSkNX^aZ_5AfQ3U$B{W-oI{QCcQoSDbGcUQ!i3e??^X2ov1y92jx za1M7))8>BJ{1$<&xMO~;&0U>&W!5Fo-vyUu=E*#pUS_-toXMZ{U+reB*1>jnE_aP) zjKn*$7X$7b!DmytV_m$U^UuC!UxrJ}UJSS#W6EINeXmT%|Mha~zcAx|HMnc{YvzmY zid@PBcNN4^aL4A^?A^Q%;={DLUlTvqWmaKmqqTwHTHR;UPTB$3KT8LFZ1l9z8f^FB z*$*%+=AEgV9~(b@w7GB0TX%$cCba56=>)#cn3-Aq#IgdGDL@SuH>XSaNo$EZ{1cGYu3+MtiTt7bPvAM_>!Tq`MUeg#bS_m3@^AmXRv56Yo1Kq zl)wJDqfC1c^S|Ex>Khzqdb@n{-(En-&v^}R1?MtrbNicpyZ_8vms5hPHP7z4Ob@sI z>l?wj+&ijkY%&1?ha{B~(n)SHra(n#h=Z-P`49?v( z{Oakh_P^Nv@A`w9*kI#VyZf!cRQMH~;lDEn>;Jc>+Zx=L8RvpK_b+S&=XANxZ8u|G zX*X}(IfA%y-v!qfq=@O`?%Mn|brg4^zncHfz{;IpBC>F08qnK8I3QxDR?U5yzP)O>E;^mXSn6Hn*2ME{I|G-LF-;YjM}-wwk)TMt23K?yk;!#nglU++OYszvgv!WUN+j zmBICx(twMbU$X?q24{EY4gNO$%^u7@qhn0zT1C?%i2EQ0g8OmX|NmCtt}SR=gZp&9 zXy$h@U`Ctons)cQW~D~k2D$`(xtwLHX2-#Qzs9?@|KcLpVrKon|J?7JIexYO;s!G= z_{P;`E@fT2X!@Box_!+1pj8OAoAnv1;qF18?%Fcb<^;IY#fN!s#=C7UH<_^p6E3A( z`nhc`?t<%eXE&>G`xs0GwY@1_8*6NmYhO*9u`Cj^8_N;2ORmjwCC6AHPoTe^&^>u(_V z?3VIpJ7;#_y%}d{YiRBEwF9(wS7d1J&ST17)O2a@QaQ+_=IQ@(j4K(zRk>dlOm^Cq2+#IYMO1ZQ&HJASGTf>JzN}AGq-SDqzw|=h1gPDThzIX9q zaAKZKKT~&cIO`^KLF8D zx?sk;5Q;JsbC|i!w?a@i-*$25{KQF+Vx}~EarYe9E}mQ+=VHNN!qC;Fc~DM_Jeam$ z&q4Z{{^p-Muc5KQkNX`LCoVobm^BDy%^u8V))K_7Nq4Z##-oXC9plBSzZ>~j%!{8;NN6a^=q!YV!|H^i z9tSOP0r3C{STvT9g$2q)ECx#)fN+#C1CWTtVu_G9NrX`e0}u~=6R`L{f8zao6AN!+ zvLu+_%#skZCdTZE@U=wvY9h#B0`OfzaA87lK?1Bf9_SnwG>?li4)zfnbT$wRdy9d6 zMhCs4p&o{M2*8VH4@yHXjygx(&_L-g;GnPChq@o&!}E8PKLX`f{5C(P{0i!P19iUZ z_y2=P{T8F%1i+_XW2V=b^%Z7)1uDM5*IwgGuYlDzSb?F)JIKOYzz3}ABUWhO6IN^B zb70lsSXnq$7>-@V{0ZUMr3-$vxjG~q6pIPUg#%&)O2T*zaLZ`GmU#}ta~MkVY|4

    KW%1w3_!HNTnsefpa~C@;h;ox@Py%oSm2460lo;sb96k%0K^2u#%}|0 z0rAk90FVeh65;zvK-Xk|q?jQYW=f73lVkQ&_*yFLC?$593Xl@An-cU(1x%y_mXZTw z$pA@#y~My~B0xf5H!iRno4o|xUtrZQu3)1jXJfAzR{j)&*Cm@5t-CQE~PQe(ct0~p0tH-Yii>r`!Fpn0UB)g&!x}@eUN67{>|0pB(VQY6EuVqOF9E4x*q^CuNCXSK z`-ZxK?|2`H{zd~E{q1^K#!h=dT`%?=iakfe8p5#W=#cK1fN=0oEW9y#B{u4D07kdO z!@KzCmk^KuYfcC*NsPG?W8NhAMiP80G1iv^Ye@q6F`SVUG)WBFBn8!zvBzkC2)GBh zi*^GyK#%JINX)K+K3AYk3|!XnQN~9Zk6i*>0bB(guK-8?0B=`_~U zhQ#_n5u>k--ZI!XHsvii^A+^f3-I();Qt}$aTnZs3;O9g-d+VSbuDAT3k>+4yYdw6poLbCIJ0is}LV$ z0_X?#cRbKJ0eCe&c-2^l_;@yLaq-@T1ehltxW)X$0rwc)6CDr+2nC0EP?M-JVApsj z#!K`Ae1J&c@7qt#b@A!q)Yx!i|~y#Uo;0-i&9o`O@J zfrFlcs~&;#9)t6qK++#WcRkW+0BOO6rgZD(`H@Z?XnPnaQ?mQe2=_7W7pEpbJubK` zPJq+y;+uEz{kvGl1FY*l_VEB~e1tVW1pXg_4o?720ncEKo zw0ny-Q@#tpH*m{W=)NF)fe!rq6F!0JpHTmZ_aE^4eLzRP$4u|R8}Bgdd+^D7eCZ9~ zZ2+F(&GP`f!q;Eo=QZFJeqN%-E5Hkke1TCfFxzv?{~X_Y3ch-RH5fjAg7rNDZ#@Km zKM3#^2QDn^JrocFV5BbrASoaPy90dQ)foZV&@VUek{38B0NfM?9g2cB#X+x9pj#Qx zuPo?V7W6F-39SgtQ31SA5j;^5{815nQW1Pw5qwht{8IsZR1Q!U{8|PaRT4Z_0vuKn zP#jPc@H^THgX0PT3ZhSba9uudT|V%6Zpd;jXujN-Hy7s51^&wg&6*Q(oD<*AiFM?F z#>kGfWd|>11rKEf-(&@SGY9r`OQ(mnN(&8?2AU}~y9mCz04??pG}jqut2242p|N7df+_Gchn4ZNOxSBy=W z8YY5Dlk^om71WyvO3s6}UZ@Z2WqO}pr+4b@_}Qm7qjjA=uh&2~uY#6e25DOaYA*y; z=LWu*gw50$@YOu{ViA0?ET9IU0h_8@vT3>#pa=R4U~}|vj2Xig=DaD8i(P4V0Sl3NqpUj=ryB5ZXj*x+K|_#&7uKR7)%=Ff@mWW)Eeuzflc zzMY=!2KIMAgYJNI>;$&ALprvDYqw*++n_nO1G_tc-JQ@VyP#cmL)+{DcJ~0g`@ru9 zfZao|V@H6qL#@1 zb*%N@fTVKZA{1I6F8q_E0gn3zcsK*RoC1zcL6e;T9ghKrM?uFUx&z8?fIg`IiE;?u zjR5|}u#=$0Nj({3r?B&SI_8>*xo3htGeMh~&_pw#C8vSgCqr{hf(9H5NgoEu7zBCf z3%ThEX>JE;Yyw%W#p*y>n?Ro1K-#*nEUXtx!3MxC4~E_x4*NR_KEN30l5x;072Y37h=!fUtpnP|{YY#4H1#W1D{`DYl)u4|mVpXLuPa){e->|w2 z(A~+Po8myXdLX0bbkX>zufXdMp$V^p?&pECQ-Hsr(e^@1?u5i`LHkCG*Z^3EerwTx zJ;rT-_S=MV3oPq))OQ2+0uBIzf)Z<{+@d3skO#!^8#*WiLHZsG4Wx?8wCCCBGl>`cfJP?H^TJ{=(8`CJ@j5>RywR8#9UC*ngM`Hg-s9s-34!Ot zSWOa0XA($PQb<=)U@0lMBMG=AF{CRo+XH>I1KhR+%6UanM$U$4+w-e;C7bK-W=r9oU7!Ii%rw{5WpwUc7)jUYo zVo2g@NZUq8;dV&hKG5`Uz$vtx*XtqQ>mh9$Ah8=D{~MtPHeyv9vHC6Gg{|1-Htcve zu(S`@I0T(yw0Z<^ei5dKL% z_|19YXXk~*%L{v$2lm-m>)&97bFsR3ZjSa2=+^_*vp;;D!I1Kiko)oIH5s;fI&AqY z*znn`I-ARCuzAo1b6IVawFBjB=!RK<>8u``1Q?H5N3r_QB@NkMtO4uC8nK?NG4x48 z)*jFb&=l>B0QK=x2S2p}Kh-gN6+lH+6W^{4i(eP(sRupOFtE<-tR*aYdqllG;ED7{ z%rFd;mkcus!!ait^lhALMp#L&yaSfLLKoW5kBlGIUO)`KU&rKo zbZov?#{tCV`*b+UP=G|;25)=A9H-mzUplc^#uA$(YZh)qsL`^_B zKmoL8frO<--$WP}iyeS8?Smxkg}&GW9kLs|xC;`p6VkCAytx(9u^Ha-M!;G~$tpar zfb=Xyzr~QU`H;XlkoZ}cYXG!Oo{?1x!#hPo2H`38~UErZ6_Fn~fsHo%d(mFmbin1`C z3!pt0-e=WeJQMJeMmsE-{>I|#S1hK!$3pZKrs+6~q8;oDtz>U$7JEt~*#m->r&jDb z)nxxtNp^*DvP+Z<5CZt7FVbVc1$~9~>wjq-V2-{?qxD_-Q$M0E`Z=}G@2G+PPPH^q z6&(uwkwBN%X`oB8Lx=pXt3aF7gx0CA+vw)d813~?=%$H!5H!R%;BO{yx*WLP0t>tk z7XBo3`c>$byZHSKdgdb_GN8jRK_{Gp-8c)pBsxYFLSN zuo{~Y3vJiG!%HgzjrIptUKh{;^-j?3eW2TivQ6ODb$Tvz$_ngaE9N-}-}E%*{TH6# zBXHDPc!rSx!6!osrsyPms!qpe=xltp&d2BK;(UQF&zI;be7Ua4*XRa(qi({t>K1&L zZVgFl%m3Ex_zB&CpVjU8Ika8S&G}{Bi2ti=0V)GZ@@qOj%FO(VPL6l6_(e$LKj5Y_ z;HDGcrla7d!}<)Q?g*r1AN1o6>|rxtJ+$^Z>}3t8vig6pJ@C99```4l-&T}n%x=Iw z;N&3YIE?p4Fy=VsI0<~60zOUy&i;hcXgi5M$AL5R-2;%`ov;R5pu5+?axaE$odHWQ z4jN`KEO2kcgzceynj))N8{Sey=+@$hF7iP;Wks0=KS>d1#D=8^MgGH_FWHb~6Q6&E zNBAC|#Cuq_cd%mbz^R7zpY<@<&u;K~-WX-@@dj|OS~PTAOFD#XrFMYfOX zvGvr3Erf(krBQ4Q&1OSr4f~7svw?J;{Ym#x|Hy`u;NvJhpGN8Ve9FsLQc1p*s`5kB zkpDw1`7P?eUr-nRgSzt&-IFKO-FQab5mMiV|DhZ5W}sPLU6fA*53B$`9MB$qRewZ$ zeH;5Z0S&wf5!M_;X+xp4+e4pMhrd{ebwe!G2a)3dcy0rsg9oy+fL(|+mc#R#s=KhE zx-IJt%hm#xtQKOEvanW#pfhv8J4pj>PY9hC4yo|K8z(xWeY6{TV3qz#v-KAmt3N|W ze5LOC2es8v)I>W}S94umThI%k&=0Y6Ssh=O)`@i)okEw>X`v}Hz~{&eeUTl$%5U&n z^1{z3sC(;Tday2qIIIF>v^pZGdeFj6^nQ3ZCv^{Ki++&tq3|Qdfl|{zp?T2ZOW+x; zf{(Wm5^18porp{JAx1Ir%3=6*N8z)dfMlLVc@F;GB~b8R_;NQPz4xF`o?!e7_>6Dh zHGPKE{{RQrcrqF181M??!Hy>f<}$%s%mqK**irPmg5M9=0rr;d zWKnD*lYA8m)naDwnP7K2H$Riw%o`jV$5)8qW-9N1GI;RXo>z!pk*3BgVfa*05@43*x5Sz1FHug zqJa+K4RiwD5Zbh{&cmBR3pUp^cq`qKw}sTT*CTjmJ&X6yYj_{Mj}Oohe2~7whw9gS zxQ^l@v{#JOam8qz5|BlV(s{&iT|^AgrNls8QS{Y+h%UN{Xr(KQhIp=~ON&x?pAY>q z>5L+oPAsD9Xu?l^{+3?xyL6pL&{4jZHtFT$FrFs}n`QITTtV&t%V z^p@qIyDTfTN)|c>*o)`QEDx<^g<zb%A$QOLnzcV@F&cQC0X#1S&e!Sv(8NdKGo1wOBA|sY zB6htB@Aev`;wB{IHvGHWh<s7Q;kD@KQEgjV5 zC_-nTTRMbZ>$l3MFR2i=Tg7LKRBARxWoJEAe%4I=&Z?;rtb{7f@&GcaQY@7!&XTCY zEP=|y;;F1GA^IoBxC|Y?tYF6(jXs9vMC>yv7^ex{~t4~@_nsgJHe z9dvtW%du2juc4~?6jjzw0ZdoZ$)WcO=@y8`y6CRh%UH+OyLE0N}Wo0bXss}T9H7f7HM=6kz0q0vYLUTKk;7rK75h0@HMu>ZmfV^Yt1XN^1L_8!k4fZJc4~-U)g1rg708u_$=0*4`5??Gq#GCXNNdEPo9`PhS+BdofkSNA%|5(#2*1KaRKD74P-70=6ee(w-Hj(0TE6*-HSbhq%WpD zkowy!6|}@lm6GpJCHM%1nblBUKrP^j)DEtlQ~aZIoxgM*^JmU${>FL7BLUIW3!YBh z=cUy}-cB9llhsPTUybE2Ra>5zN&qJb_%M3KcGEughQ_kA@MjxAvrk7J;iNu_xM?Py zI>OT}1>K$;dc}r5dO!!*34%vQm)U&!myHJurc103oo3zP8Fi=itT)YtcQl-hppI-B zRc9+H54o)Rdj3DVY5*n**&lj1uxL zSZiZy%d3K>rD-)U0|3J5R zY-sy@(E1JZYCc3y=d1K!_`@Ce2VI-TVa0hKmX+6l1?~jPJRBT8n>}Nz!Hqki?GCe( z`1zYfu!FGX2L6UcKMv3AALzepYzKSD*1}3JV1&3l7XOQ-!aR9-16GNbVJ&zLHh?E$ zGq~1U_zQg=KKnbq4RSYA=MepLbQz8Gd&=(4X8bCvz$MSYbMZL55&zCc@at?1hu_C%vM0P3^YfZ4rpU=siWn@5c&BrT z^E#i{0+@;VpE@(Vtz_`DqKV?LWx4fjWJV70w0a?+A7ZF#JiE@o3uzy#h^$c~Xwx3L zBO3=VcqKfHBgpwb!1)blgOF#ett%n!>BgeNCwdP(brsRuK}2rrC9*NLyj%2ma4P;uf-Th}@PVa@~h0^*p@fdu*Y8!#W{DR1Ds0d}N6}L&smHA8Z%& z-eP!z6X^`%%?+$Cje}Ng&AL%RXju;%3Jp4m7U;#)T<@f``aC_O7qo^rypB{l3l-Pz zRWrRy4bel?Qe90Q*Xh+u%~f>v%=wL7bn37p&H%R8S;+P{huI7SCs`P9S#*`H>e!^<_c^Ll>w#;vqh8z^*HPh?9(0O z$^<;o+{kpb)kP75N_b_bDJdIA(CF~Mqr>8zS23ZjD)2h6!%5U0{>XXDH##ZA0H>O$ z=nN4_9q3{Ernq1;xzWxjr`i?dpLQGB(H<;EE7f3IWWtcEBN^gt%& zqkK%lPmhl{GCNL){(u+K1F_vaoP(Xl8Db=Iu34c=njxb-8ye+2G7o}((}nmw-IX8H zE0C+Y&L`*&;w6<{;1QAkXdxH~zrs*=NKo@8C^8M@H!ZwBk*iyIsIp_(|3p zQTZ6Q1s>fpc8ASip?oAO0^QV|H-}eSiQVP7S$vUzRTGhVoVc!!iEa9a7_T$S7P=T)D0B_%{F6<-Wi8O2=K>Yb{TxTyXRFI5e}sjf&y z4MZNQFDgqZIP^K}$2)j$pJ^)pL<8ZK zwTDiv%b!qLejDERMM@1%J{I3b92V~zr0o^!MGsj+y2XmqRhAAuW++`?AJsW_OPyyY z)CIOfU1V$2CAL^yVe`~gwm|*MmZ)oNt-8T>sXOerdcdx!r|_I#Gh2ONap*hCNQxCA zi&vr;ygoeORScn_-q%hMb&Z&&2n1|o|z2KlvV@Mssp0{h9rgq#(xHe0bMYap zE+5SX@(FAKpTzc{yu`<{r+gUu%=b2m!C(D`Xp@NA>@PiL2vJdw%LKxoSitY+=DZk12}0o3N3tAhe4Cyr8{~XJ=f#u zqwYYqu1a230C7b|O2?8?UX~F0JR#L*$*2q3hO>e+k5#5^tU2P9{`3H`$TzluqVeO< zl6NR4c(FJ#vQ=O`8uA>-tRv3hb@X4z7mY<6Hw_v3`FtfJhJEndFX_GT-j5(&Ju={Jg9XpS8o;*#hY0VX#dd>65NYS9BTLuJh9j zot66Pbks!G8qDxYku1yYgqHi>cKGG8UK(J}x2_GqNL@Lm~lum}MY*yq{ ziXp>N16jV-I3xZOd56j1+T}P^+Xd}^0#WIeKvsDQ@}J9*lh}d0{4wM}ufVT-i1Ibs zzJgaAt@XDva^ zO0*NZnSvd3#BR!CHyLy`lDYsrrt)-*n$imJ@^G3-t!NjOqZ{CKn_^Nr{Z&=fcU1pC z_GPoWpyw*T9;Gs|UaBr@sYbIJYA-9T-m!uz9nY?s@bqdHblXLq0v0p5Dk)N`euzQV zi7e`t$g89*rLxG{>JQmowU@)xAh}FUlE>8?`9dv_F=?(WLQ`Z18X@OXFL@5p7t>{6 z&9cg#I+on5zruUHA+oT&qCJ}@Rb2E`I5C&~=PRNG zdnXz)E^D$lvNB69E3!1O*C}LmJU3%X^k&b*G)?9daI+2Gz;?4M6K7p6# zyZ8sl%Phu4L6%P3LXPz>-2xe@LE=2k69Z|N$U#?OYrctfDyi(M%F05jmkd>_r$<~kLuznsBV8)v&!!+B(tbfS3*IypSKol2gZPBTv~r>m!s)5lZZ>FufSboTUc zntG-?6+C;Lte&Ti*OO4)x2mZv)_C=&by}6OJS45MbOaH0KY55U$ZvE}WYaxFQ$*?$ zk+0eVEIq(!mVhoyi<5=YtS8P0xbDwpArqSg=R!x-LDmG8NjrDgI_D*;?|f#logeIq z?PH7VDAvvX#46e^ST_4MOJJX2mc51f{4>}$e{c5PUxV5H%q-MaI;nkC=d)Mox^_Q3 z*siEI+e!6P`yHimj#67^Hf?b_k>ix4swx>RQ-1YT-BlIos9H?x)hC*(O6u`yq8_HM z>Om?l8>A|;q3SO-9zMYwb(XD$J=~|F*d^uVZ&fTFo#OFa6qh%EJsb(UxP_wFJwzbU za2B5r-gHw)?-<05TcDkSwnK%4=jnZxHj;pMneazLH770GWbu}1n^iVWWy>W z1D`|x0iJBdqYzC#p~;A%mV;+^BZ7>8RlUR4(;MXNY*_nnv4GNuxs+ebqAFr0wH32z zn3zWk#1h&mR#Sx7O83P<`XtVgkPj)Y`~g2Hrp_s|=%TWst}Hw1hH|`aCs*rU@`xTJ zujx_psh%j`>lyO1o+Cf$`S2|l%13&M{8ulRr}PTBTd$O>^cpz}Fj}vY{n6e@FP6>q zJXuFila=&XSzHf>@7had(CuX`-Bf<3I`RfpmOH7GoJd7v3(6<+QV!{*^zx=kCO4?K za)=6nCb30U^;vk-OJqIniKEU{u^btZ@yI|w07o*e$G5G z!&xHsI%~u;^hu%)i+buGF%KH*0b-y`^j7qtFVF=)L|h#OAKQ;u*)MQcOO%7mO#xiN zA1ub=QdZ(#IhaS68+dGana7v!c~a>SX=EaiNv0LqWM=W3%qsHAOrn5HDe}wMB9A1V zOTOgU>}`8AyR&4Jg^1h6VVTEiD8rpz z^0hrip0nr39rj|m6foVMC&$?n{VXh0fVc>9GA5ZMN6YLi;vNvg7MPc4OVu zUaec%-*rQ~602`7W)1Dntc6{Ucem&8QT9{5(9SOQ**(M^dz*0VS0a^@M3!~R%MMOw zImsC#w>b;tzs?5v-PtS?K_?bhGh{o}UrtdqHj)rgl@mAF*7c!U$q=Q__>cV{oFsti07XmB7N(`6W<|m z*>_4D2ORJn6nlNE#eUy7am3eBocH}E?)kp+&%WI}y1xt0;!nma`OmWM{$6apKM_0a z->1L%>*);kM`~b?q49QdI%scG@9c6asdLY%==|yQcTza3oe2AqGsL!?;&uiV-L9sd z`TMH#{`u;p|DZbSzo%~d{VLL*kkZ(>slHu_X4}o^uHBQeIwNU_Gm~yOD=3fJMzhor zic}Zjqu!^}@U(x!3C4V!ZAkd>omdH+r#8~RK@(2k({c8-UFQ^6bzkvS??N`=9sHgo z;OC-pFsmn*v3BwV>nvZg4l;~4k=c1gS%YVjeYhp(^XuXWUo4*S#v)Y26}iMQUQcx5 ze~ECuLTq4XMOpSnJkZgROUVM8SV3-}R=EeHOJ0nO|tV?;{cQF->i9dHfy7u**a;bwVv5Y(LcUb)QM$v zb;7I_PN;PY5U!$GB~=`&yGm{?Qd!_d6|>%`T2>gfw=&W&s|3xr>dAp3R zK3h}q2Ske~nr9s)@a&+ZofCx(LIghq~C^nvBpgqj9jl7=4#69DQd3pmHVQg`f zY0zeo@Vro7&uJCrS*yZ5lT}<#ZY?YTdgFPezIo!~PvXl_h<7MO_a3EiuUE(L*3}{2jhcD! z7rver?5*bryYETCFM0;@gPv=AttYdX=IJMTdya@Y9xiixipvmBUwPYFDc4))WH0N3 z%x8sJUt|hvqs(SC!&6LI*g7BzTWv%kD_rEacJu636Q0iU@MP9D7Sn3TgoVEvl>7BN z*2)JJ(J^kmK5qcsK$#vTm?t^a!VeFOeaC!$u%a^cS9c({>?Po)hQ% zWpp%EPv3Gn=`GGsJ;9lyyE&V5L+2DcfJeH#V?)CwVx^rttRnPeb*DM}{hq9qGmQ0c zCa{stRJIVX5B1y5V8&G^mP6HKEmUqcA9oS1tLr)eEz}LEzFtZ(^(*?D@*$@&T*st~ zuoa0}Bh?cB$;BGB5gNIXlM;SOO&(zn;uGveyq3L_r?HRoAN~k_)qe*1^l!e{zll%s z&xT&@$A|c9@ZtUpe6l~1E%%>dfBUDgm;MGUnVk~8##6n@UZ;I_SKYwLtB*Q1Pr)-9x+`SxuSx|IOM0ctOPP}b#Xe>pElucTWoQMx`^cZsOX@>D z$xg{D?2|0O<6HB2Zi{$1tCgs29T$zPG_sL3P}Z@|%W_sSE0@*Aif^s5KFUYdF&WP@ zNfz-`l}$V$vbX23_{-B>4Dh5D9Xyx$AD$6Bji(@gZGB{`t@W&-h0|Fp4_hO(E)Ng? zAu_Q&#Vnk~41(v`3HNB5ArDs%cTB1y<5pQ0!CkY9$c}WR5;{6gMfRwox+@^3Dz2lP zlKO&ER&RAG=|xU;J=3YLXE`nOGN+^7<@DB9L36(|L1$GnH7v1Sre^CGYO>CS6TBhR zPG6?7Iz2Ke13|ef$l7IRJ#b2s9e(U{oSQ6GD{wNPd34oSoOE`GVK^f#>C}-PXQ{ko zKY@>$%Ia;`x2oD>t*rKXE7U%2z4TwT&iZdyYyFq3G5(`g8~+BYw129V%HP!@UwP}X zFS+%P?}LP0l)HT6h%q ze^q(^MU@wj)_+08MJfH)Rg~|E`sVwpKKnxHi!UwNzTy<>Z%T>$e^Czq0;=TSPwo6S zXuSVB?eNFf5B<1TZCBC7?GCz&JzCGVSLoyRVg1^^sl%NwIwyRbnodU6&ne9oK#q?) zL)iysB}<7|zNYfC(JCuHj0}=r&BQs&1wIgW4F0APLg;~_BCPpT{XyK&8D%QgRCZvq zvM_tSVMltB7^nN^iySgjo$d z@8kl{d3n{dQ7X@PnbO-q7VuV*WxTm$X>W2_*c(%3^oB^UH=4Zbi6_^2(#g)AA~LabKIjY`=EK$!wMytyqz17x` zj%o~`PDl@xJYaJ#*=S@uFYw;DQ5B~9BTI2jEV=6Pf< z_e`;ww~XDutNk0j$Nb;C6a9HY8vEOXPqiQ``z;`8kedE?t3^3=B@eX9zM5-^Cu) zUZlXym{C*)C#{=V72E^egiNm&*0w&*ke9K~>Jb~F67r-t;XUiL=A&@}RNEQF^E=~t zR%bNN>HNt{IURXBr#@nVlKcuzj1nSC)EXJ1UFtDTVE%z+-NXLI`C?MsjrtRR1@}Pr z#b2Yg!#$V=EG@6XX7f@kOyp-nk@^22GP5o+GkYMjvp=kYY=>2q#r1Sx?L1@IR?lYk z!E=kH@p^c9Z(iQq+miS2PUQW)+jvj!Ro=q;kyr3~MS5=%5$VY$j(LiRk)Fz;gr~Xq zVf7WOtx2M)wOV|Te~St7nn)#|i|yj8C@Fm6JdYH0`DgKvy+Drjrud;xi7|ScNU9g$ zp3HDjo7&-KOC_;UWyL91bYz0x^0&@8e!$ttr#cgPC#N&7;#A>zo!@v$CoYfWL^0_+ zWR88BMcJDGvzZ@J4RcyBFERwtos=w=gTJ10A^`JrOsAa=adK&8`{hMwDV>9*Y& z8G-V2#Li5+?3lF1cGMjEhZe@gH0Z_<`M zUDvn!>Wy|IEfDuLcGBs+PKZvV-qN4y0^L`es4PvU&D4Y9Lk)4G{12STmBD@V;`n=*-*LiLR7)zR7pUKL z9#uqNbPDOtPHr6y@#{7_k#1yrb*TLbl(nhxLTqXDIPL00k`-iK){R0ts_Ert- zPHLsy3^8gomB%Tj`Zzh%b|tLQ2krBunO zkjhT=RWTZvRhzhi@qb{)@e0I<{_(d-@}A z0=XJDkj~<-0YB(L$j~jsx#eM;`aHuuzgW2URs=bdHcYdrEDhg_8*=wqeXemTo|+Hm zCHQ3Cl+WP<`9eO6FXmfOM&S7=pTvE97>_A>A>ZGU7ZBBX1yPhY5E*zU5seQP@7Pok z!Iq1~I4SAEE+YzlBM{ahXPZV2LN2$Et|z}zH@SsI%FZ-RW~W*5tC}iLAVOKBI?BPS zyzHowK+8TAP1I`9Otlp4kYnnl&hVkCH=m?Z@r5daZBTvKe%#$Xi+j2^)JWXVEvUb% z_c%Aj*)+9>i z*{JvPSnLQ+Pml9kI2SB}lc0rsH}~_EytbIc*CL+(E=urX$lVT>ciC=a1fCge|h?|;-2x0tOe|#wT=z2cCrH2LH11^XS-ws>xX!wh`hrDvL=^=k1Z3i zd0&woTA~X7P4wV##T?-G2!F}n@;f}KKs+JNfden_E#d}$B3|-D$aq(gNyRW(MC_2w z#WOiZB(ye*^42xc-%?_&l^&6NB^mDNBFlIt$bp`fa;s;LeBwDO<9d(FqTWNYxp%Al z)4M>9^A3@dyv^h&Zz0*k8(UWQz7T1=hs0~oG_l6hS~T_)645=e#9r$qZ($wfUTY!W zC#dMfd`df)^K(Kj!b)NPZJ`^d$ab1b2UNmnsT>hcye37dQ8B(IG^<|FZn_ z8MZtL?(>%C6TyA$)h7Ojdcq5-q#_40h?#L~GlM!U(klnIHS@^qs-4V()6633m@Egr zs0S~li%MgSQ~9k;s-$&Cm9yedIjaVhwB}Pj>osMtitBjR98EYsc`mE6f8+*aUL_wV z>+|MvHP0j8;m@tIiL;`G7%wJ?GO)cr_(idbKNElOZ;*5;$Fo>6BTFie>r6OR$rm^? zT~D=SeQGYF<2GxA>L#bEuClReEwdqa&A^Gboj7tY?vTz$+%&`)jEr&_QN!_w;?7B) z-5JSKIHhP!9`2N937xns1LB&Z&Jo14EA&8TqF(9@(x;t1`n}Ur$5p*_ zKGjdxP=jzMbA;}r#^G#iGGMCir>5yHxV_&5Wkodwc3=|pz$9%ulk|OOvi{qdj=ARP zA(*#?vl&tUUY*W42J3!azqfDbf9(hQ0AlJD_Den1ex*C3tZF~gIqio!%)X-^`LF5S z{>yr_|AMaLzo^st|J9#;cl2@J6FnDJx3^EQy1oRgm@hla?yJaB`P#F@zOjIHEVb_} z`_1>9RrGP**_VRP_Z8$k@RoYHs-S@wiL;c%iR)077(3epz^W71hk=rfl%PrFQZtxhs z0i2?e@W`lx>_=2n=8F!CMw};OpSaoX^`)PTIu^so%iKOH2BHM z;@{#l_4jmU`U^S{e(7lcb-SRw+3s#nve(*u?5B2nJB`!EZtirl7div&o6amdmfCBV zQjhJfDy}n2RdjZ$5l)0UKt>Xk~UVpD`ufO_JLCl)fn ztL+Vx-@Zb}{ZUlipF%(ImDJsQ%{BK8)N`X|=)6&@_4UZzdT=EEmyO7C`qhuidLv-q zkAHOiA4hfBA3Jr4AIo*+9}{$&A3gMxA9eMqAHQpFWEx#FGE}dP{6tpNZE7ENf-XmG zreeO?w8=M+lKGp{M1MJo^k<`%c07uJ7n#F(sU|wt)H8Sqh1C`{PAyQE)EE_qdZ|j( zO!cQf)O;$cwo@*3m@=wEh}E}KYGi!UsUdi7K-pDJDxe%yTAft2F}@@6`6HEAtx_kP zb846qrAjzii8-z4q`eg9SdXZYok{1md+S*CDgE7#|0@iq*f0GT*jImM9^D?sbKBQ> zOFO+-WOory?X9AK^A4w*>EsWmu51Nseod{HmFTQIPLE_U+yLCKqhx;MJ+~op&c+|f zRs6h6CU(jxVve-MpR%=VDo@JNGNqLjdDX=7gcU=^_E@rkhsh-9?$Yl* z-yfBk-R!fw^v-nMy61P!4V;9v%bOV3<_!w$^I8Y4d8GnTFCmcEf8zG>H@av1UT%Jo z-(4eKJGtay=b)_Sv{qlZqi6HIIuGwJ zdN?_P(&wx}1>9b!zxy-V;HE{FU4kCCiT0-Z$?kH$+EK2s1zi`Nb5fytPEK@+mq59B zB{YH6Ll0;xR1lQJv2d2SgNLDF;LKbC*$gpg9{Lkp-7$7Cu)>RgADoLG>S<`29*3&x zA&Bel=z{tU`fI?_n{h7s7KQOJ zaTYBTEznu<#zsYdn@3XH7S5>)WdUGPPAQg50nc!9UoO=yccSYsj4vP1e8W~rAaZ> zn&wq|X&x2F3aFM0_FGm{y=HAxW=8I29Tg=gU`Br|Rg*I+KGj&?#P>$yy92M0gz^j-PJc~R%>(4U}y#uC=_r$!2TGKn4)}m+; z`&XoSq1x}*0{|L$GW&Abb`x_3?&hR2lN4edpr==;&n z`asm`#nEJDSTv_;75&+ijkYxDqk{~N&Npu&JI&?De`Zf4(X5Un*g270c3h;q9UQ4= zd&9r)k4QJ$HPYYqj10AdA|vcXSj!_r?6F8+`yT#Z`e+B+GTPcMk2bUKV3qY++Ie0( z``znioBBiTF@LHpAePuwVuMX7x7iu6xY_`9<09*;k#?YNZbLe+?FX;5Z=m+{wqwm_ zTgCK5G2r|85489-;ME%jwR4iom&60kX3)9%6sSxq*RuY4SrY znHije$#FZwaa|Jy#`ZlZM32Csavd!I4ekOECGkLw{sz5-gFwh-2mjF$$hArf+{bFD zI17<<=oCqgTGM23o=c5puV(5YHyyTTd++~8_h zm*KgERaUKnSKtzRLCv%o^hh}IbcS9?b>PY~+si-+*RjXJO*92K<9gsS{SnBJd+;h; zuA6};?-D7YOVe2BX}?wqJbn$>ZncbUP*2zzm6ESjRrnU*Di5lu{EAw|->L09PVeU> zV0F>E`3k*}Ki2bjHZu_R{JQ+8$-tA_SFD>|%g)+1EGPPbO+iQLC)ABL#L4J>yqBaW z&B+)NhOXaiT$$#=E9f!g1O3y8CE87F4g_i!wvG8+^EaOW)k7Im-3jT1&Tjp}8LbPr z_4EKYhu-UQ9dSM($$f^>xWn;T=sx#x_LAgIBf6cxrN8pQ>?Kod1RKCp zvd4TEE#owYb3dg=oPFf2GZ4xvgv` zH`Z=-Pnl2d6q7m7($oqRH-7}unh}AZnHWH@lpYb#x^sY?OXZc)?O zt!&b}P0dxOn;GehHMyO?%pG7c#`CKtKmTfO!|pViRkS%+KYNaD0PgXvb!Z{926pPQ z?vm`3A0-zQ8_zH|gmBIM;i?OOFNCASuM4uU5HON%bqcDgR&t zzQJZHMBYDW*#CQAGcvt@$Pw;F%r&N&Fm0a*zT7>n<$@{TxzFjqQ;w%sQCybPO3NPl5m1+r@QN^y1w3_O93C8RZ|nIvzxEL4PRFc%x2Zhj8^rbdMj^| zsr2SQ`CZSIM|3^;r%sTS^i>!Vwm=+G9mEJ#TKuBYh=5|^uJrtEGUCsb${#LcM0c59 zbd)7UC)rr^kORaBxj-zGd&L2HSG<*BkwL}D)+(c1rSi*9s)+nW7m|x~9{5=qWdoBS zw;Nw1wa-Kkdq$kG8{iZE_^#guZ}kV`vHlEP-(QYX`5W;a zZwsCWtCqJB+vsw@Z-hbx&g+5mruJ`b1#zhkC z%E)%64nCBAnW*SRJivb9uknCf-2%r#H{;^7hy_ z-ea52cTqjR0B9zS&`y6Kdg{+X0kIL~702OszK5EMZ>W`s#Z5$RpwnvM5~2_ONi4?F zKZ_su0w3{&&NiLVEo9odTg_58kG?a($T;&`K&(e!wS+DG!<x#!2aPmYv%^wO5RoZRUCabsHR{~)TRKbq{roroN1nm&$?kin=>qR3TF2{8h<6cQH92tS z=s1)n`qW;FRJ1c9YfYm_oXHUxqJxq5N{72B7WpjGN5;rnkqmN5p883=Q>xfm+ zTq2E^M*PpqBy#%Y#6iEOXexG!u!xh3WFJ{ZJ(iDDV>MD=R_RQ2z1y4s+M=v^0uH7= z;Jzl1wXqQUHXo3#;C)3MXe@MvTjEV@6|T#l;BPzyne9|1Io)1lhdYB539Ke-1OE~y zxDEOctI5LPL~2|k(Y2)mhqgV5-$cjWLZ+3l_Ohd2^h1H8+6~)q%US<0eH>>eo^FN|X-X&Dm`xkwQ&PV@7hohO%4rp4mHt3~A(Y0tg zlmfbsJ-yfVu6Ncp@;BH=P~Gm;xxG z|3as9X3&Dx;C4DafqpUx>d)l0szlGJDL`Q!qifVVx&kQ7^*~kbRq5C@m6nBo$jqc2 z)>Mb+0{skBnG2wPZKdNu1$$xofE%F>-41>9^vIHF=oVD#f0IslFz6c9NoimhmXW7e zkj=O*bYT|Js`v)|0SJgkC@qjv+1UV~B7Q-ffd`M?1|P&qP+xo4m*6w%L$Lh}HE27$ z!kh+*E*q)?6k0y>z$Ar#nbPz0cTgX{=$7iMJ|%r!L&{`O{Dki6IuuAmm}c4EdW~C|MW~2(6iVeHJZJVZCPtsnB5l< z+Fop@5x*n-%TGpY0eKwjwqR~;DU>p)G7v8r!P9Qeg*sPXI%)`sr{xn&|w3C3p-k4}61-ss zWut%MEzr-(&lZz4EGJFEchg?HGCRhvGU7Dng`9`Hw$sXK;@og*Ils6$owe>)ZrpXe zPM{W_6?n|fz&-nG;0cWn)}d*F+ewOGJi)>C_Y@>Ls?a33x1ylZN1WkA?4i zRa~R1MRNA1sLuL}Zmgde!A6VGY_aIe4vU8Dy~xZm%V)G5bg|aKZ}DC3Bh^$XaLfDy zqm@zuc`^ci@?%JIg4`!iwQrgj^Ao5xE$w?yXgaAKz;RuM%IJ~(Q9idv#A7=M6qcXG zahq0bvH>y6#)<(pvuJK>i1K!f$ZpSyB;c`Nqj_Ze*V zLQiO~0o~tpw+F#*dd##%=YTuCW@^*wj zV&$cN#Iyd%!bf5pjo0UTus z_%Zv0F0f0W5pPD@*-Z2=-0SwRcIXUigdVcmNC0t^i8n#N@{VXIABr~e1?VB)gOWP; zP*q2v;Z7#J)2V_#Ih}D{_fOo-U5+=qd+}HIGAr+#o7eG>HO-e6@mJ~*3I3qD{rkd1E-bmi>=>v??OA>Zc) zoZsDiPSCCFY>)6MiHuuZec zBvPKd#vk!7KwQj64e%>S&@FCHKmyZf^aOIt%4h@rjH8ySF?N8gXg>>T`-_u?ia+5_ zUD?$3sc}I$yY7wGo4u-fzUS(x-g!0Ko37S+b<`;@UVZZ}%YyziIoz)x_nYCs98yIUeLS!ehM& zcs^9<+q@(ArgsW!?-0)KZ@|C%Q}81HH+p#6z~wXOvnTLtp&~=&JuSoE|>gmHvFY)Gul`_?OHn zzb&vuUvyzHT#pf4KNho84VgwAlIvwjRb1{-7erCrRr~`SY&vt%A7keE4@^%#pKa+6 zu&w;-Kfg4}A=<#z90eZJ6=F0e5yZD&{_fK|4p$*}!@&8poIA3_cS%D`7 z*Wn|94fvh=H;#2zL!I|OT#3)YE!kw;kB-JO$siz#dP7!FH;hqNTm-U>{xAdZdZ26G zsfDHmCa|)9A>^A=)_do|cXL zzzRhQvLca6ta79}Ya1!g#z!)_ z{&Dm$oGgv48!Zdxi~;CPWFy)axsRqtT--iV4403z!#_o)V;tFozl5LTcj2VuYxoyJ zBfUwM$TCtla)FGGd?hC$NogROmo|!4gx|6O4MkhgYF>M~2x_J`UN2hG??=b`gXtB2 zB>hoL00n3^ohMe%b7BwuF7ALjLRd~&iWQbaSs{6bWs&K5K#t-s#2da_GfHuHlq&Haio9sSNR!~LN#%V3@JJH=?fLQGlV z#EcV1f|o`2V0sxB>?_v<&dGv-%xZ@_OyzfPsMSs$ozxkl2k~qA7E5mmv94w^B%M5h zw6kKQgq;Qbi7^c88~C#U`VoN&G_Ns0J{b^}f9l_*XJ$jtNy zNG#i@9soPG1&G;^aT`_`m*WAP$$5adyAgeK z`=e`tGH5Fddm9&X#@33RVR2k@yCyET%^OeblKAK5L;OYaQ^FCGA6CYMGv<5zZL==^ zqbU;~wAun;B02r(csfswrI{FVM}RGJD`3X4(9be5$vDC-L$)d!kF6Q80F_OSGxmE4tF1 zAHCz=j!L&MXuK=EWP!|nAh6v}bZd)S?q{*nT_9(=_rnRvJ{xq~e}f`LQ9#o@mvpeCq+=HW9I?g@4&K48}45@r|Ptxw|$ z`XRohd^}8LAO%%T;>n@pw%kH4$QR_QOif?OU%~Y|gjQC|=mfQoURCF5CViC-0&VcR z-a`wS#dMzOOMUY*Wc0Z7f;|T`@&vLPRUpZ52#?2`fDHQ$_l1w%kW=6>9SBuXPN>%& z+9hm(^;kn&A9~d*`F-=2Z-fr%X!E<%(#&wmn14Z$KkLMr{~TZ6c0TCK4*02@J9@oy zO;2$y>n=dRS8}fEwD9p4epMgk7r}LQ3S4OWbZWj)-)4*TbfB)vutEAU?WBj$COSxK z=sBc47C7=R+#vqDx%_Q9m=AT;FM6;CsW^WD%FK# z1#fzBRiD;XCumPqn9Wj4*bb%HE!Bd1Y70-RJ@Czyb{gw`PEWns`BPtX7U@sU1|4+w z>GbYto!h+vz4seBuX__dzM_$P60Xcnz1&%;TR2m-5*h@^8pZSd2b_lWCU# zf0dYwT8b&Cw3vx9i3KRBSczP*4PkKxN&gx8?j!ut&jz$qeZ0>f3)RLR+}HntYx?C-ooBKL-beWMHA)wrPLAsCpFcl>No$BEbZTy>HPB&`v>GF?;rWZTPkmR z)8s90xV-1}l+V5266XH3jrBp>67q1{LfTwAecb-0kJ=Xc zkZqt3*s2<`GvI5o>2>x8y%2`X{t1-rANDzTukNeN_OAMB9;?0Py&7bc%5NZ~RriOgD~(DpCu9ZF7f#-}+EhQiiN35|w!s#zY zaD+rDl<0Ryul!}`wtoek^9?%W=fOMtdiYLcQH2~kh`{%U>DcYtLZXnyfOnxNkU zx=r8gW^WLh>?zdC8;4taE@|jZCiOi|TX2kw{latkfAc|p(7EDw zcJhNqWS&THwP@!4As4#0<$1S?`sVIb@qsKlU0{y>DS%C~Kwo3r=jOTF$R2ag*#Eg@ zP(SxyRKv}RGq?+JqQl4;r#Jb_`H%Dj-%({}JWc0Zp&_2YuJWpEGw;Ku@>#4KU&m_m z?W{20%~J7g48zA?*aG&9jb*o3H+F&5V<%Z*c9bQsBkV1lYL5f4^%p(QdeQ$_HTr^O zq+upWkUu0@_z6;hZvjSj1^E9KLx1mo;PqHdUh#iP&^bx+IuA%~CqlYADd+^J1YP2^ zq#J>^-RZ2NyMe>~*Lg`-JDg2-vaudcWmd)Mz>+!R*=@d-&E#iTS^kbaU{aKWQO*x0v)fDm?A}t1+?uMDdsa4e8_7zr zUuJL@iH}Y_vB^mxS~wqk$*=o!`B^_JzwB=Xhh9;J#coiXO3+SX4_PmYk*{JGt|W^> zhQLmQRZ;NP@33!G5!(&=hM?h_na~w34DXUh@Yy+N3S^m2jVh4vD^V4HGl?*j$U98SsC=q^-|`e-Yugwv2&7}$0E2~rqZq2c5T?3p!f zGI|ZNXFHe$l$)z`ucmC6F2w5TmaLQ>$BOHXtct$II%=OS(%Ja~pj--?(Li)<1LEsB zA8&tj;!sUzB^u+D#rvH5@ah^)3c2ZN5BDJ5=r&@n-8U?2pg(UL2=o61dO3Fk_nj2M zQf|ZGM0aNJlzTDw)pcWnfl4vS0wZH$1N&kU-NcwnZlTzPZjaao?#5W-ypCP!WQoh; zw2u3S&x^~%PsL4U-{PLr)bWLA$@spcPW%SkI{q%|7*A2B`24nQd~?$%eu}Ode_R!T zvA^l#Ye*iyM7)iQ_^0Dq`OD)jc)jDQc*Wz+M!&~4i>`}JjMRx;7I_!bBr-fEV+6&B z@Q~o^@T}VQwBsT&mvxDrpf96eNgof~VX*&f@yEknb=by( z7wEJsWyXLeP*z_6Cr1Xg*$k7vfdUqb8jBt1mfsL}^50?C?@tbU-^gUIE$!kRp)I{Q z_PbY|jqrN14c;jB!W+Tz_+8itzZ|>cD_Tlypi4zX7=Ce%bbwrwV{$F*ND8$9XYyj$ zk^ctft$1Pdk@Y~s z*kYuCr5Z%ff$QrcBsLyLyYNPo4v&NRMRg&kC;_Hm9JfayYpj5Y15fWJlR{TFv(zhK zfG6tZGOsQU*X6DlsiwhhSx4NK8O3;sL=pMbe1MRQs}+@?$XIxN9I$fkRlcuH>s-yFTn>qL_}ex$0iBhu3u z6q)E$ip+J=z!KpJ&WmtQ=T5kub32^Rc@k#Mm+*ZajQq>IQ8CO2-=2mpxI}*$=ub)Rmif3!TpCqi4X$P&$)!Cpd##a7XGqfo^(ypq{=R$g492 zk?s(@sFnq1sY}5+>T58lf-xs$s+ch{ZA?WO9}^?L1s{sj!F^&iJU{XsuMDpxyF$(AwZs?}{eFn${@#ms`Ig?<_4R_2?CT(R+?SsM zfiFh_>pnLRw*34qnDcXwn53Vd#-#XMHMYp-C9z#UKaJh@IbB?aFSX(pf9VmI>+7Vr zOJDzr8~JT%T$%6l;%MTSxLb*B<2Hv1#7zo+iR~C!7yC=JZft7rL(FGyOw18KK4zkr z7px&u1*uvV*rRd=+UWhR)J@!(uxll^+ngD;zoTsx=XaFR*^emrDie8S{DJqy@A(Y; z1v;vdPsDLf2b|f-i%SD7+r$}-206)K_giewI;p_{Jjdj7gQk-^Mz3^z^~fEhQU}7a zZeW-k6QFW)V4k=d$RpkbF8L}j+;@Xzd?y$W&m-QOK-fDQi1Ys!DC>6!jP)}H9{N|^ zU&TQ8sz~Z~mMfhkD!X%Dt>AMYv7<9MmulEkv6LE%=~PfVU?JgGt#uoBhh0 zn(NLKy~aJNIs~Ll8mu5U1Sg9;F^~O)F%|vyG26WCvH853u?M2fV_QZW#>PiW#@>p= z#qNn*i`gET5OX?`Kjv%Xe6V1&X>d&RcHmL8R-mf4-QD5ExS9P%&TM}cxBd~2^!{W=;y%w7u1W)bd}LcAgV^moG7JSgHDQ6c#;?kHR4m; z7`hN`#85Iy>>&HZBN8JO87Sju6f&pgDNL)wsXeJVLcV|p@+Hg=`G6?F9Nah}c{zf+%#AFL}TRMTq{GU(3@Szjokxx_Y+f`e>3fQQag>8v)gz-dy((7_qeeSf#kc!x1-(sM?4j(tOoo8 zj^!=MK6ak8U?u1`x}1)o0L9Z5;No2a{`ALe27E;loCB^!A)XGH>`nGZUdeu8FU(;! z8}ej+HKkYz^O}B!WXAt=UV08Pqc1|j!hQW2(nm%^^2iUkGW3iF!nA?S<~U3?YiKju zXON=W%dE0ezqV6#A#nANL3`D0;IWHhBNyX;AsfD{97Xa-Ng`q-y(kFVEGDoeKw&Hp zWBF1M;@d@Q=a$f=6ulU3X~vY-22&UNdkRqg?`+%2qUx!d(Xx1?#{9y8h9IyUUw zx5u2$XtMJO)p7dZADp-NKi-tg=Lbm>{v%Dn+tZs2)J%4RHe?~1oN;!Gx@;-+Xcu~$ zmVkar96WnZ($gE{JUKzSlLLgoT8xj9y!b3R1k7-K^pL?o#cWPxSNL3$tH$Y z1I{{$Ndk_(Sjd6FbdUZ@w(C1&x84JZ+SADmxN7foR>B|~EHn5NE5Wp?PLMu673Mo^ zH!xArD3}Sg-WIbBZD(+eE`fxL>$aVV0Yb1UIuBQHq&|QOLW0#}@P|(UuXsT<249ma zaSyo%Q+W(8ffW5hVh29!FT-v9(b)HzO&6vQeSzW^d@I9vEt>ONKrvnK)h@Pt2sIB_5Z}6T8ZMiK(TVcujoxK1ba9 z-b&p1UO+tm?h2gv#xIh1*&m#^$G@7m(k~vG?*9`S=I0N0@%M(C`PCw|{QHqge&1+C z-}S2dOT89;L4S~c++X205;y!8B3|^7^@Wnl#1!>eq|}w<8ofjoF=2VaG*At}6Z#BN zVS1xZ;D$d6e$SL9g1dv0{D?V6lGvYU8~YnwZ)ebtb`ubDJ85sUk#2x=lt+;36pu^M z;@FaAkTd}OaJbu5Br7l?Tfw7v5D&*^a0z?^dVP=ZCiE7!L*S=??A)u6J~_drAY~vA z^s~uAR-0_#UC#!8xvb#!&qTWG4B+ug4|##Lgrq$PfbSK;m8^zDZ;fZMV@ki$dCEVPJ}MjOd9yOm6`>q&k)hx})H zlToG;$!B87Lwyd<)FW|aof}Ja8SR2xy~mFA6Q!e}sye3ZXkDMQEb^mRJE@O_XSR;z7JPaU_|PSb>g6 z)Uful$%)Bq|xx~GWNv!8q4&8Sbg_;FK=yafaIBW2IxNmS!WOFbs`d{#$=(}J; z??X^|_k!#F9l`oyNH78%(n5JPPyp!Dqi{B>soS|1^fjlFDG7D!VxGx{*#uh$T)k^( z8MwzzMfHHHT!&MFySg!Mji$rI%p*7}Ow5@DSvwT6@<+q83`e&FM`R~b7XF4GWp}bg zb|ItX@1(74Me53?q_(V2n#nq(FRaC~5#-LdCUL33Y+YHZcwjntgCr>P1HA+@!pI3;Bav@I}a_Sgxw!;VK1gr(U4CY6s-d zjY4%)RY*gMLH!iW!&Z~+X~^+G(37g7x0*SSOY<7Kqm?0@;BT{9C$W9?a9dly15alQ zlmlGhIdxfF0=|1goskUFbIE2+=}X<0W-<3@CsUSfG7H#O^NN)KihiW+z)#uPJOsmOh|B~cyetcmXEZGxN6XSov@tzM zI@3l35-RavP__os6rgZzgG7vas69=z&FFIbD`cXSqe&r2__j#_*Tj&q<^?4DorU-L zM)IqfPHLN;q_L?FpDPUSsAS}SCK0Am+{VvfHb}rOhq)LNackQja(+9)e8@I1f#Nru z33RijXat^#mcY!W6PQEayD~0B{=|dGNqicrkF>Nb8ASV&+jJfD@UM}@@S6+v1NiB3 z0_R+Ua;E}q==?$#Ipyhp&~*v8d1x^=9c}6cX>T`7M!S#56!#dJ>MkSW+}@<0Tb#6T zKjV__5**`}!Z)0AXr@yKm3PkDC%l3k%(oiOe=^h93?0W9?BU~7JdIOx$!eLN)R5b; z5_RxV@g2Ht%TPB_7u6FCRS-vPF)_>*6lK9(L2VIn!;}>pO${-_v=n1ZKhU=4h=m52 zQ|JhOGe5~vwzZsP|CS*uWM|mrpM&G7Bg{ei07TY6!r}T3H{Fj)j{?a)t;MH=GPr$2qCp?PR#J}^xxCZ|T z7>5{0xDqG{|AI7ogWj{J=r((VPO=AR8?5E9X2Kf79-;xTy20}fpbWKPcTh`q3)VGw zeg<`9Fn0+&@}t>2G>;8On^^~Rk^PE3Lt564JPr8h3HpP7vh(&WDjX78!LL7zF{|kr)1M9pl`ad+A~*s*qdJhHe^XV4yrjkU zf()AqvZ>i7j_ORJke=)Rqqtv44fl@8XtcE)7Ih_w9uu=76GYZXQ*k(4M6?N~5-iNc zu8{J3g`{63#03qd5ib%;ikpe;#I3{y;zQysks_2yHVF-aj>27;B3xO`3-3``BL(%z z$UnMwG?&Tgtub%BbasnB(+&{QmXp6jJ_}4*RB7;J-2+#LX#>Pkvd`8aUC~tFP0o@n z7}N5k6r{y;2fbCMJl5Yx9u%(oxjkvtfylj6YjbxWmcLFKp-tJEg_w* znu&!80JS08eXgxz9@yW3&>LmCLk8Zz=&bpSzMJf@TQtN?;SMkp(!VdjbgMYnMH<1o ze--*2rtXx(^>GqV)E}T9$SO!CZwGleserybYv<5D;O$Rh3$gX44=ZNYvcviktE6AE z(<;P%Rbh5pzGq$KEym?;wpC1LT|{eERODbu#RrPTR?0*l&_xQ z__4n74Sp>DhnuQe_?}8c9rZ%w>7p<_<{S`1&FwV{Oe5+F75h8A4R?jP60g-W(n0m5 zPo<#0%i-*$_|AF?=&1Q8`3ygelihFY9Q77Ct-T|Th~99Pz$z0x>^z9fcSb~-IvFC| zIT2pX{|M*jDZ?As<V{(UbnJS^Wx?`xX znjD%dw}y6!+o8L@4q-n>xUg3*+$}mJyg9NaEW=mAEy7;-d?;h2eyCz3F|kc#dt%?n zjKooq$%*44YvJ*6V!ueqP}|6sP_@X<;cSujVHMsIxg4GxT@)VbwF!^#Glyr37olx( zE%e7ahhpL9|6)HU4nlhq|H0!EAChL!dM}iii~o@LizB|*c0YZu8Tjjl|4aev9p2R=%4#Y3> zr^L4wwc~%1H2$945;s@XimRd@#D3K6VkeusF==g;n3Z;IFb(np6Ht}FOElgsi4Qs> z@khQ3rvn1HCX;vs4UoOWC5Q-cg+0YEmm6lK&4qoY9Za&$4T%C@fb-oBlREmKN-%jk zo%vvu-T<%XuJ($~XAkPA*`UvXa=Frs(&J1=-4l{l+M8_pcVi&O{I-I0WVOIdRC`Q2 z;AzXNIGa&bv<`SQzd}aaW69Aq*$|z96Za7*(LqRQJ|qv|Q!*2|DW{STGE5RwTUuV7 zqXShzwnxojMtx$x>Wch-dKUknZ}QTR-PJ$ie)VAZC$#$%B%no!ywyl#L z_Nd0dgN;RZ_+~U85~-@eUhs*P#?x4ToSE&x+bD*d>}GH!_K+gLV*QQh&@?!nO+s_P znUoIPb{oJwQyOZ#3(f)E$}OwkyQkIQKr034ubdLxB4c8@$%!!~WHctJY#Xb@;aE>3 z#9`SmE{&WPS3&NN>nR_`t&`v5UP>L8N7=YRDjauKJ&Mby_r;CWlj5H08gaFZj6G;p z#}={WV*j=0V+x~RWA>rr!HPJ4@Eo2Us7>Cwmq>B95*_AjrTaj$`Nlf19PA&~g1%$3 z$WQzXuFete!GA_m`9!;h|7Q;JJmw~!qCfC&iaG67Cg;BV1v;`w6}x*fdLZe8z?Tf@8VHt=4$-MvJ2zGvL?o(o-|_&{s_hrk|K zX+@I2WDyKtY1}{MCpW3OBFj{wLeZ%JZh|6aPx*I+JJ~s6uwQTS)FeSu!hd9zPAVz?p*YQQhEh)IAuF1_jsH ze!+6~_uxHKIXK*;4Q4m*1Gn|=z)U?VP*>Lsq|&Jauhl1azq;VgRa@LXYLVMOjdzQy zL2erLhihdU_mynmUY3>JU9y<_Kbh5?D3iJaqz3Q8Tjw`<(`h4*Iql^(r@LI`43_hp ziE@&&P!0n}es^a(WW61h6`eCOt8+z4{-3-A{)c(|v8>NuO2XgC&FrhJ%{=*nQn=?O zRZ)^z4Fo0rBd({~;2!EMnxXQcosd8BK)o}Lt_Tj^zjS;3QO(ii)CoOBhV&hg!(O7Ej1;v+BTemwa6g+jJkcHo2k!5o6*hHfjeVZD#vV^xZFj=j z3(qenZm^-m9X3zsr0o&9Z}*2F!z`Qz^$S--55j#>oydB0Hu3~jkEX+yqpfgrZyA2) zJ;EdXbdcKIglrO%NF_)qzb~(oe(D`e_6w8cI!X#bR{s&GV6#SeO`UTfyGi7yoW1;{>xDAJV&VH+>PO){i0A?h_si{74SSF25rgnIZ`( z2U`6%5y2b8XXx0y!kNV*{K~%rO7IOl+P{RG_-Al2|0qreoPg{9gN3&ohrL-i;*ADs zu?Kvv1y12t!`c0!xVWDcSMpQg+I~{p&`*Gs9G+)_&lQ9JS0Cr}2Y^RuDdzq;_#RQX zUb)C)uLb$fn?^2sN67{6J2~g&r02Xg^n$mLUiYrjhhBia^C~gn4P!rmmYC0f%4+#Z zcyGTnU+lN$=lvlZi&?yaSjESQ&HS?1#?#BKys!M5Uyw_AE;XG`Q$zSy)s8pU)%XdW zo98$2d=X?WTk!O?xBJ;qy8=AG6IoBxlO0Bo(~L{8#yBH`-;_PU?`bA-nYIHr#d0!* z-XXu!SXvxTF%-H`m&i=uPq#sS;w9kLpF!pG9T;{6=?@TYjs$dVzd+W{6WR!!qgl`v z8iDBvmm$~fZ#dmdu-R!BYe{XGYzYZQ&|w${nTgFv*yJP6VRGj+a~&Txt6>gbKRn-5 z#N%KFR9~2W*A6CXG%)>8RZ||7GcJ%|S0R0M0j%b>m`MdB`ZZJ0On_X{5~h)P0r_V$ z;QUt{a!H@4{?M%*YRaimCM5qfd*mcDPELUi!(>xVPA~=KC|G?>8QIn}kkw3o$lO~g zsktfd>R7cw*HZoU3{^(oP)eoNdsJK9UHuLG!8h=12B#zbq8 zwb26PY83c=?>#OJjO_*9hdE%z+6eGQoT5pP zf|)JZ*i=-ST}EYD3Y?p@#f<#}i7NvCNo&D;h^6E#`Ak}npXqZvn|8rZ=m(SsUOBzl zH@l4uvmaT&X68#xeO}581E23IK3$&%!siu_)!cccayW-n4QHe3?yOZaoh^`7azfp7 zUa63iLMLwNBfUB!K_Tev06AMR{3(EV&6sl|?U_t-IRdNkCXgnGG&sIB`uuI*mO zCEUs+v%8nXxp`^SSxKKeDcMzLDm&yT_K(wpFLrM8Nls~}pEDnv6K|YfoWgD6FEIi!%hL`~=+6rfAd88Q(~CqrQ#-C$IZj00EG67&Thg?Vvb(Pi++ zo`w$DX~=oI2n^pn+>d<3{}E2g(adBM{e`55RMxp{5^;fh7|O4a*F2Hbg7lizPEq>F zsY`RaooHisFzw||q=Vd9w5L0lHgaduT<$pf*@1VK)0j2@KI1dTbOb*~H2aebV8zLE z`Vg|?hu{q)h#fK;b%L|NDKygNfXwY#aE3s3HlzXlr=mKk8moaIf~4I&>VJL*b;ir6 zLecj!PxOrJ719>j0hv)GPh}>7IUTUDeN|v->YqQhx(< z61yqkkfUA@!-NFLZ+L;Lm~t@3Z#ML4pTNA|959WrGfcHv0aJyq z(6c5=li9Sahb;k}k~*w0YRjIXUTh>D%JPtL>@}Inw$NE@IGfAr^SLayGm{bbPj=Vs z#Wn`&v;M*CtXRxP`aWhoT@c%d7K;m!GjY?%ukk;TQ}KV}!U+ZOoP^!zRYC=nH^~Lt zK1mBZEy*XdCdovzDM>c7GRYY|K1mPVJjstbRgz=sbV4uHF(IQ$jK3)d#7~p2<7&!Z zI3n@>6!>?SMq0ifM7+1F}F6I zKIo^i2^k=xh%GYG*+?_aC?3;Dw-~GIPGs+#t8BKD1bUgqJl>wePe9>0-!_dQc5S1p z9cpy8FB&~;(;Q|uGN;=M%~ke2GXj|aN9?B7DSMWM>~-sq{mt58r}nJ0%X_BT?L9;7 zv7YYsQcowOX9d}(J^k!x&t&_)XOn%`6K!AhDEok?BK*i>oM6uhC!dG7u~q|jv9;K( zY&~(`nmI(6*&jaX!{V-?#TcWB%!!njn_w`6@VcrH-+<@xpIXnF>R?P|pjp#CP{nV8 zy112IM_#rf-DnZ?cAL=xv@cCY$D-pi1;m@F__yQ0S{_8VlFmr2ZU9ze89JL}!+#k- zml8kOOn#6fhTKVw(>K&r8~WH5V0*0ZPN8oN*a zuv>7C-9QH^8oS|LG8~DevytPmo?A4M7oaDQ=W&V8q|y95y~`PU#2c~~dO-?Epy z2)b#*FyY+K@9MlMAInjiT!-;rB;kbELz$zxK5+{XTK6GX#X zWFB~(oj|544gPgH{el=^oN26wmc9eN{UuUEM}bnf`#NF#o?UxYKqx4>!Y8{=g4b$5J;Eu7fI+RpvNO3vNHGR_NJfAM}QUp=R?ud_1< zU$?`z*7@kW;uP@voq_%`?m_=(?0VBkwF5xEw+1B=XRnBb77({0=XE;`DTy&O%Rv zIEZs3+=K)~&@UkD-XI+JVGDe;33u-=yq3rk(X-eZq`P<5$$2pl9W=;$FVqHpL7nD@ z)Lni+y+m5r8y=%x^FN@SWYsq@D>=;Rgy zYMsEU@vpeL@ap^_ufdxeHTg|k^~{?5j9G)1uxjviRxK{9I=m%P0@rw&@&`x=l%61- z&fAY?^NzyXP#ESG^2eTae6uHl2YU|l)Sfe_5-;(N))oHSyoiK^QyiokzQowXGZ?e^ z20n!6<<0nhR*+X`g586zqAy*^DD8~iYi4lT9$`K+pRNM0x}Nrdx*SRNs~(`1WG1=Q zQ}oT&>s{!bjRB{kq0FH3OM%>uuh2!mhI;R*qVf@3XHTF=d4cTb_i8qhi_hb0luWK` ztGu9_)Ph5^C)gBo!LL55FM{ov1|-*>q%ks`r{cG8jI>6Dx(RE>XRH?m7+mTs7M`oj z>=0{Zm9E}xB_cPAFY^Rj7}V}NeObr6n zw3g1U((8Bfo7xT!Zg2P)^2omGt*EXxiA<`iu%VQUm9g$E8Sb8!ece;C1hPsJovZQ; z7!fm__p+&zDAPDz^~eVI%+9Zx+oj-jtfWr)tEr*>Dk`_XoO*~oF3gt`dtMs#FVR#7 z5)2$wq(Ff~e;D(fT+f}*jV{2pIj zUXITvx5p=yi{t-_Iq{FglK5j{Py8D3G=7}OoX}B>NT@7cC1eww|8eo<-w$_Y;tRK! z@2>mWcgtPnzvH&EpSqcy@9sOt6uaF5Vx(v$s>q3gse|IWLQRZnqzM@a*VBG^4$79H ztg_0$r>ZDSV`>>m^#%A-N@8NO5ZcEV&^~6eCXxEq4bsm_OD9-e>2zx+oo4-_ov=51#pj5nE${ta39Q-6J`s(#ca&y<9Qfo7UTWQ^t_YlvZl~v*D_Dz z^s|l?GRLxPW-FG`EXEiny79()`p!5EjohO%W+A=DjL<9L zm!4#vAi-t>xV>J$gFKXdG7NqYnw(KaS#WEjjZeI*xeCvHEk4=$!UB=XvB*<~CH20d zq24+4r?(Pq5%8Pr42UFg0Yga1!15$GkijGNK(7wmrMCo5(`y5}>Y0I6b&tSox>O+3 z@d4k}u7D>{XGN<7?A?^fl5qqigZUgn%Eu_*44{{~n$xv}hUKC4ZpzI?%BEKk71|Yxa zx#)yh!6DG)yx$Uvo@NgyX%TmhG9FOoOs zp_|&1d>0jv?ihfl>jfxF`?R5Efx*;UA5qx5kcmGLbnMSMyKYC|>;>byD$R$JRSBJs zRnco$BT&{l>2Z7@$n_JE%DzDFF*a+Dc~}RT*Y!U0wYE*4t_D5jII9@hXEi_?X>a0K z(?}Z6CX&~4niTdtC;2=+lEIUPQcp4Z&Zb)eUL3O{TQ zbRXXEv9uNMPfxOT$T6>pzCr=h$NKLK{E%;w|vb)huDH^#^@CWsf zo8U5Tgn)&FXdUy{u znGIm^v=8e?JE6L+$6AwuEE;uW9ep31+zpsv_n`N{D@1Zl9 zsH4$etVC1j2>L*!1Gje?>!N-`BM`*DBemwZtN@4OHlveF1NPoD(|{B5ndoF45ErbO zB9EuDnCvMnVmx39dVjgiy^q}~-Yf1l?-}=$_ndph8|_~8zH-laZFi41n^@v)AclFz zi-z7Pk==_V8cf&Dc;?92o>#J!r=rU2S*zY!T18m>^f2q5u3}X|CdM`b4LjX$_NBAU zv$T(yj5Rh}vkK-y>}Y4(?J)g|+XE zc{TBnSv+y7x%OXUGs(Z?W@tjRA>$_-Q{oF5R{RaVGOimh9`}RY`#Y3P`TL1h`P+(G ze~*y2f0C1!Kf(IepY7_^pAVA$%_7VHZ6YTB9p^s#yWOc1ch5c_N9@M&W&9uFhxq0u z97?SAk0rYQy8XMHcrRhOuYJNGe|&snds}=dXHa}rw^4kcs1ompYVqG?i}>eiWc+0v z9v?wo#ZRZX6I!$32^n~FLJTkRZ>+KOUmBApZZ$*TXh}%iVvY8t^7wsYJd^z~9@Ea` zooBc4rgA2GmpiMxY1|Foh3*osDMow8iU!{I@S4?^mpxnM5Kp2^;;F9ISrb$)D^jgD z?_(PAU5zqqunS#P3Y3p|?7jL(Z=vUZ5USm!$W9s#rhPMzN(zHuZ>a?N7N?|BG9NOC zV#EMBUDS|uMH-n_d=zo+F%j#|5zmq7{t;PQ3ds<8MWARem{=-I@mQo2Ib}&PM79^F z!(UGc`E~3E&(%~AXJe(4*f*BK|f782|Qry&O_<5-G zB6VqGPeLcI>mi}~x*4czW0ri(ngykA6*b@U1=HRovbwjd4D&t~*S#S^dozn-0cYLj z0e#$F0qNX90k@n10SlaE>hx%%X z_Y&O@u$gWQoQ1^GF?49s;k0V95b8@dk8V!BiIC+&CIs#@cLn}5VgjoeUjvtNI}kZ3NxCu_ zc%Q}vwm|;sb8;eZ1eq6@p0tF6J|J+qJ`~VQHw`GLpL$d2Hr@bz!IN5N_Y~1Xz~DS& zF4RAbM^K;_B+a2$oXozEy|g8L3pGL(REwSTdbU+1<2lj>Ur!48aDxqGLe-eY`&%|t!`tFOOzA0je zFTc3qyY5!<_i@kqsoTb0?>Ke^XSegv?(UAXvxv0zLvg}CU-tCZRH^+xRJ3ogp6@G4 zI{VI&ioOOkkMBCo;;X@O`65{vUkcvB*PoB|9p^iJE`RMSX=L?xFuM7N8oT`?4WGZe zQQxj;thIf}&D_B2I7RsyXFL1p1hN`#FkJ-a^-K2?cGDbsm}sqzirMgxorjZ5xRYcJ z7f+Ytm#;uVs*EJCaQ{Y?(I2DMApxu?5~Oco7CkAkwyus8=`@LTwfnE4_W#R`@^-HOr{B^NOmo(OD^DhFWMwsif8yH3oI_9jlj4=h>qhdHi~ar!fijghS&Z zNQkEs4fdR*Rglpd;2FnmSx?w>t28fV&Et>EH++Oy%J7;Kjg`g)BZr~EaxG`(<-N=; zY`&QlIl!yvZ8J6fVlF1iOby-0TCi&h={(j&mD}p0GFs`BffRs`=29f#c9WrIWq6%( z$S>gKh8d>Jglj!d0Zx1_ISI7qm$a)a1AJcDYo{->A)s_E z1m)wHzRy4FbVha%+&Yml#s;#&cu#hNuy+`FO-GE=G}7Q~tC~1j!B@(KPI&@}meC|eZX+*bDET9MkYsQslv0IAM`V)C zQlKoWC;Edrsnh6nx|W`x2WjMW>&p6w&WxNYp}xWyV(Vx{Q9pCCRY|=Zywf@A6)3S6 zbqE|I!!cDIs9NaWDu)hIU%|uNr~bolrnoAg(yHe&5h<$=K?;eK55-hDTC|X9L^gTA z{S1%)e(}Q@BNjPTM0tmZxAqlxnZ3YmWOs1Ac0u>HUpcG&FP#4Vvra94gp zI6mJZ=a+A}^TW5nN$~A+O#c-pr~kcE*Y9yh`%Ae8{5@Qse~sJFe&X)1Gm8{XcQFlK ze(fkR%WWaki)}JeII^B>1vlGnHAyj?YC7sYdatfTv_1zHWHq{$MA3I7H!DErqW1j8 zcA#e#OPBF9ESA?|`HcRoH-3*BjLj^@*w1{%QI^R(!pfMDtTx=)jm#;mff>ZAA%U^5 zX`(Z5m;N?Z(QD`gtT8g86Yz)>Lk?FQuLq8m(qnP|R0O@zK~mcP98h8GkZQ-qt0Jr( zIGX7d_)M5}T$bl)xI9Lu%fpxj90yJ7B3MTEX+BVf(@8-CWO~LhMbq#yXwjc>IfJ2l z$}-4f@HE_JmE}9uMkcTk(%>s)Dt=aG1;;8k&#vIHQaSk|m66|uGbS0PZq0EvUaSwI zcRPcnCN1EiN%y}*MVzS?Q=2rTg(#(M=t*?X$B@;u3^_>S^(A^3yvK3+9?0=A)WpZP z)gihJu0ndmlIuHj5nH0(1DP?i! z(eoqUBNvpBIlz&~PL9Z|PMKtO%>ad$L7*4SS9r zdOkz5VMZ~2!f4AWH2d|5UInhV*J3?9DeXZ{$iTk1 zFKM{D6I7USw4mDxY=+V_#>q%=pTjTYBa5BiWU2F=Y<9jOY2iD0g)52soz!u^l3DHt za^HPP@{1Up^d3QsJ|m|^rqeg?qwMyteyv>vngw@ zpRr21JI@53cA^S4ZmavoCRN28pw^nDz#xf}#jHc1tPGQLt)j?s`791w;o`W}RUERi zh^&9~OML#%FYBT!NDSn-bEyo8!!wX@zF=?pbnJO7y#opi{P{%T}#&Ken=Wkxoq zpHbAQV$^Yx8hxB+e6bVGFFJj>;}qf*+|Mk;4QD6aAg19utRtSlMYRSAN8Lc%EQTF{ z(Va4u#L3H~rivnq!SZ~k4v@0?3<=Zs$qW656ea2Dc%m%=PyyMM~ zMVQyP!hi8S$eo+ZyW>wvUXq^yQ*!`2jV|#xc88W?bLl7An69E}X?-wK6UZsDg{&q` z$T*S+(&83f8!8lJ52|!zJErw*(DC(PJw7il>q+vEt|hmCLA+GI5i|5jF%|^oK{`zI z0Jp1?9wpl7v7&{ZDw^oUNC?>>YU>N4D$+vAXiF9Vy*VS2Ml3x?#;G&%6;26PR0*{Q z>+)i(&m+NBXbX~d85IJO_G$fDYB0TPk%ibLg5+6JNcu>;C`wO3Wj9UCrj0}-Xkypt zE8LsA-EVZF`UikedZjXmq6Cu?~J9J9CRt2igYH@K_)o=unXTO zqny1+37LUeY)7)%DMF4oj(+7_26K3xZs<1G^WD_?v3pVluCzpSKZ$WX9IuIpHt94yV&q&t{1`!HwGDjRJBhsPcyCUFpI zI)mADh}3{zb0E|Ki`g!^7f<^IR)$5hA#e?bvr{aFZDDb20!s>APj;xc^7E@SA0JJ# z!t)sbEz1wq4qBF<=x)u>y}?Hf$8coIOPG<5C7@H1oZ_Rt<8Ic| z-5_1X&8{8iExLOV@L&vAgPdxrwUboUb6&~1PLyon%$I$ge&9LRlTl6q`N;{CIbA5! z+^0yLxhQ^MmnYFTxG5Hi^l}ljR?DHl+KjB(!=j>!5mS*^ehtZ-$>HN^qo>QY zaK6W)YnKbmiEcPEt|KqNn$M#p>96zRb@`8e*6nCk5=qz2G6usTd=fqO zr0lTKjlDFEFoDFa)JQSOY98WQOaVS&O(PB(jA$d$SY|vhnj(n>VKwGD7{JS5eZRn< z2qXfE{Pt-X+N3F-ic{~qP9r$Bef$x^-`3&r- z-Q`_YTSkH@IGd${Qb&q%?5D8Ud+~t26YG%47eo_9R+>~kL2q>t*5x{6wDjpM(1G8R z?KM*#%s!8(e&BAdQ|VOH{uQYXTw*R{xyjC0^gOt zwEV0r>y8QBW}Nfiv4^|>Z)yzUr;S5AmuX{KQ_Hwwh9NCD+9+jt&6ZY8vxhap>}jnr zTU&?CGS)@YvM!mo&12?V6Ma{6EHZHFn~RZxQ`Wd+JmT|>5xlmMj3@FPY$qm_9r+WQ zln;ZqI0+rab|VF*8D=wny_fEUuOt|%+nm~>Kh#5VQEfxDJQ7Zh|Hwj>l59|~^=Y+N ze^ZlnA^3$uaGyUwGHfOCN1?-{vYo1GG~ak!87%bY)ssV1u<6>3;WUEw!BP#`z&F^f}YSSxgCrf(n(B z{B!Q;>CPmb)hVhk*)P=?d!ede*H#F4lkfefk(L^YB+;hwu|GRfMgNI($Ukjl9})}f zHR6>$19XH@BHZaOGP=FQ8n?H|CkBb*Vw`9#=ZFNkL99Xdx`w_3710mOAd+BrF9MxU zQyI)g%D-&A9M5k^1g*+pMoIP37>KGQQq4Dis~EGiR^}L-El=tq;G-5sUo(R>miWy5 zq!0aZ{^|?o>>TzN=qOEB(Sbq;ES($wg?HPJpFw81>%~oM=xut>_gegg$bX z)1S^R8t5LU#o;aQ=w7CC-0SdxfMDs~g&ONAsJtJL<&l83$P4aiF4jp_VRL0$c32K) zkHJFyD|a#r2@Gk~J(g9yMX&l7E1+yvOfhs10(gCuiU+C8VA$s6o6(&_R}vo8_PmT9 z#s|RBy+!XsZu$f6fp)eGDP(lS`Z=D=HCB*wpwuNA=SV5@7Vg)F$X|X&{+TaGRpbj# zw;qyc>n=&@xkcJ~Zjj}kn%IQv1k8lUVj%KV;4HHFiv$U^ze&3zO?voLB_!)hwv^ zLs>^$aDKqewTPv2HnQ{fAvVU2W)N)sXe>J|#->PXx=QbN zpXyWYVSU40sh_!%^>?h#6l-;65u_`krtE^+a+a8^qo85=i1e*Y@&WR;e0rYDhFtOb zgsS1Bx>`>rs_W#m`bQ+#R@HSA=vYGNHN73&=6kdQap^WvfW?zmtUjH9H6|RCqHC-L zUfaFQggPl3?~f`unpfsUjOu)zQI-ENO7bRVR=x`gU5@E{XX_B#YlSku)reL1BxjS6 zFMZfEpT6-lL=1*Svw1I(!f;|0@zy6fy-A4Wy{BJ$)`CUUOZWGb&{;gLx?tT<-N5Tf z#K~m_=GV#0Y-*_?WIE%WT)}V4bU62}#66!0X%8DQ+buxP%EROq_TzV$=twzIXH%*4 zf9f!*eU{slWNK4sXF-Yt1$HT(Gf1g_Tuu8@~khZ%xG*Q zEwmv^&YEC#Y{ovbrmQ({%nn1Jme#0;6LD>J#i+^BnAMO)R~ZWMitM3To^h)TD`XXC zb*%!>Qe?+TI4x^wSvU>*XlCmJ{c3_KZ62cikW!w(97WF<&1kTZpGq#tYUm(JLm_h; z^rQi-6$xPZ$R1EXTGHFvPd4eTWC&`PYT6_L`i#D>#zV_r8LCF5va0LoF@eS?`>AHK zs^T)OIsp&DF!4a<$4uk3y9e16TVxk^lSIa#{No&wSDY)D+s4XJbf1w}~p;y<5lPdTH;#wFV#0(%6u$yP$4pIcIm7Qt$zn6J)?BkH$!t_n(5^@ZMPA3TGOtfrf)hI%V{ zZweVMU37DOS~u2NNj*J|)PlRAnl6e?v9sh@1ux6weZBLTXV6qSDs0O4v6n~we&uxQK7Lv$S z6;zl-z+%fx3QG?XWB%#-;saKghk7K4x9QvyU=8fk!;m;x+*zZ2_F^54S8JC&QLnIv z>G^hdz1VJs6sd~(jGaS&w3*K6yvO{D(1G2-J+@_bWRH}<^C?H zY9bvld~Kw=qACE5;4X*wHcNG>Z#Dr3#6hrU2F^%LB^925jF+C>e)H5c!1 z1T}OIZLAK^>MD{J!^i32l5*t$`drq*s*s5;kYA8t5`}tt0{X(W$VXw4Gvc~lBj)H3 zoVhy-3#$5ys<@bx-2R@vKD4+UBn(SNrd4yJpjM)cJRwI z79}xn?u$EMv+O2b$g%jjmV-5QOss@2=b`e-lt^P}q`S)L&|9CeAf>2I|HR|G22MX5<9N|C(MwDDfH_N%`Cyt>-Wj7ip>eCaV2&%uNaM}GNIm9jU&)rS#fDO7I z`jHiG12P?q&=5B*8Q~H#(*2_+VDd5BeXG~uI)wLcxxc}i5ITuSMoNhs$f78PQ%W6j z6epGMNHr-SCz5^=6au-C2>85PsN*C;UBsCqn)K24NVI-RibHF=9P6S>-jg2ap4@=W zwgl)UOQEw(V9!WveiIYEqr^a-U0Y)$*#Z{s7b7_-Y{uxmW|-cDtfhPA52ekus(@8b zHMHVoZ)=mBU^SKVECo{3A+gRHB-UF+#cC_gU1*(kr&!C}LDq1$wbkA&Z`E_tSk>KM zW_9<9S=(K0Hh24(J=_ZBB-d+haG!w$6k+^EPIz9?+~@&@+YZ5uI1$V1fgZn2?nGk8 z52ukgL@bPia< zokLaw=b%*>A7^lOSjn9YR%&O7mD@q4r8Cg#;&=z_Z?(}3x zsOXPW^0O>j2J)%039l(<@+9&wj}=e(De;?c5H=4JJ{|&&&`@!Q4-mWgATgeg6t#J% zF!@SxksTHj*$YtyUGguqj$BK_WFz_rXU?K(D~J(|;RE@lTj)jbjFmvg^p2W?=k7O2 zjvYM;J@_D*nkAKk*(Gs>%@7%R3(=S77YDgVB=UH0W4^gVjW6ydxL9u(Onfu42x?Xq z$<1Jq#+)xwnCAsCZSm2lBrh0K1v}Ts)s{%Ri&DykBkOlhs+?THQv{_kErkZ(Vtg zf0H}-YdM2IlO6d>S%80(zu7-|h$U4cSRo{*G*Q3lD7BAnfot@xsz9mcAPYPpz4Q?R z3IlpE3&;;Whom8k2`HtcEjf!W(OWWwq(F*FJ@k=g(hYESZ6aCNCNdm)#u&Dal;W$% zS`G#r+;kHROrnesBy9{PAIxqf*lGciX?5I*Mael&22^*1%=3QMZ@tmFSimklC}4(O zAJAE!4k)2x0*JmFa9dprSf#cG1gkLt1ytpL-}1NjxLo0#DT{mC%afksvZ5zI?y;w!9EsNP@V76uZXIlipJeWluE_D!K*e zIv$ig^Xjdlvj)jn$B1ZfuCz`sOOe_#7=4{N zWDnN0Px2bc1D9qG^#L8;54f9NkW%^v8K)zmw4X(il8%^5~}_s^G+)9(Anqya2mT__q$WjU4Zw>IK$o7 z_BwYFQnl;bj_a|Di#z__Vv~Qf7~_8}+Tvti)gLU2__xU1{m|PyK1Z|I4oX;yPoe*I67xPjSAf&(PPka5t+H?kJT*)K;M)88{)2WNA3I zr$WDYMW)9qeNU87vqf7Z91K&xar)g1S87XK%$=m7oB^tj1KzPy5(;K76wFU$M|&F_ zYyG9;FC-uNzlx*&2(iWAS1k4C7jyjI+*$sE?i~L_cZt7=yV0Kqx_;{3@PBsR`yV;P zj&^d}*PQzHO=qb6#93?qaBkRMP#cT6rJRm#e|QYGI@jDcjwQ0YjYP1!1Sj<8;yrS} z^NG>2x40y?i&W~J2vXV5mu@5fs#(aPKZ-NLdw5QhVNzNiIV3@<4Vj5P+#YzH?x|~V zHGLqNv`eb!xOKR9tEe(8u;ptv6uQDD)tgK-o zp{5YOz?!;CYS)6a%-yDj}|CNrLXMkaBd?r!gE-f_5 z(*Z_TkgdXKKH~u8#v}TU|D)%5Dz*VMz6rcC>%i->vN&O-5=X;rV}s>FaCi=r{Bten0b}P3Wk<(gOM? zvUTF=P37QjVQivG$~vly&^8xfnN$TPWJC5&c7dXED9*vt*jfU(au`b|`(d73n`OiKxgheQD$1jnLrKtKd-6v819$f>On-Z+IwYqGC9maq zvJsQP?y?>&gu3>hxQ&%Q1zU@m_(&1PT8cBQwD`d?h}2xWCHZ%^E`Np$-kZ2C;Qdqh z+;KM*uJ7!$dj>Atx!`Hw9>oL_L|K|dY@-FlAUGS#(f)$a#o`V*DYlT$VhqV3o1?E^ zgiM!7$SL_t`;c2y7CMO$>M(xdJ^1+}bTPdfPun5<&Clz5`jIAJh!rBKFr_Y!owPfd zjZVM@avtZcKiFGyP}FGjDH(?fcr%SBmnfm{kW=K)95gvxu-RE1T7-2(GQS8&gKK!$|D+OT}^r#E0-S%21x&B1hX7X!f?bFa_H$}}+T&c)lo0aP3F&q8b% za%|@Cw{$a)qR03o8pCVTj~sFB`~pddPF?|{6sc-_(5=A#=x5Z`lZ*tl$Ou=Pjpk~f zA?0x+Ql2w{UZVIES`<7>O4Kpp&{d7|# zRu?1#2*-@-4LoIM^%Jb5_1Jj5hjjpxxjZVObb2)=+IRRf$s}SA1W8b=Ho1t9tvGXE@&d|&_SRS&eD14CVh<@ z(F4eJorFBsk(j7A)2@!kJ-S9^g=V@K*5B%6r)&nrc`(T%hmdb#0!~0-WUg3D`hW=9 z0Ggu`@XKZwvq>5eLXtswpHws?DMS&HRwN-=#5bK++|VV(E)dG+<77P=g!7)d8@y(N zK`j|Cn(5id+gyn%WGh^y`$UL7A!h4~Aer9~k*G?};JT%6ikJA@cYRpcdXuooG?5mW z=Xvn|E=L@;E>FkWUExcgfvklcbO>@6G9%R_ z+80MB`53Fzde~^ zuM-Ec%)Zeq$TxvS_$D&fHx@LiLF|~nGs|JuW(({*j5z`m;}~i?tLX%{3sSqY(7A9a zq{nG-J34gbptZh&C#j9@ioGfoW>=ThXEH{0qXpGn`a+gti{wI9SH1u*B`erP&5?IB zikB7hd7`_TpLAF8DefFz&mGEBx()dYCnMkOykwJ{)vT4%m=$sSpj&LFKkT~nq5XxN zw`Y^Xc3~1}-v)hbB(7{a(!Qyp>`CgBT~1xM6Xaw2l>BJVl|DO2CUq*yyiRsm-SNsG z#}T1Uyx8f)iMviB2v{04krXlrLNogExU>TUuL_8yJXe7zRrXZ!EHJGyn zv2!bAl04NB{3s@$tMw3LqJCoZ&^64)db?Rc2U_{`Kr5}jYFW_o`&3WQcThCnt4E$U z%Egu5`w7JLe=3JJiB91ypyNG_^$pJ$z1*`)xAVNy$vnBqDXSk+jG_p!I2dXjXd&|e zjl$Hbg3*s1=T})doQwCfP*9Yg@lCV@G*eTJWndVlBFW5Ux}lj_Pc*ly2(tqGNipy% z4Uo)ADpOmBMK-IO$YrGx*{vIH1|$vzT8-R9Grjx5{N|i6FFOm&olZw{sguK;<-9UN zp+cDjM$|IrH;-^u^Q#WJ(#{)}*`0yR(EMz+dxPF^htXuX6I+YxWIdkZPk3@l%6J_j zkLh#p0ddt@*HMM^bj)zis~^f$kD;!(q6X-bYO{_~53%|iBnp%AlPU;z>~wM;T5cpZ zV~TzcbJnt&eAV){~Tr9?;3 z!ukU30JYXate4PGP!IV^8-nY#7+w75I9cXLy)hDd%LV!$OUi;-Yc_?ggjV7Kb`LNA z%gXRfNban`2l3u~9G{Ksza4xGYN|f`5%^Z0;9!pD5TNn<%*4zk(C7|VM{br189M2W z)ijgQoMtf?&2B`I90roujbvc&9@ANk?$A&s(@Bk!iW>b@JkJVm>q9ub7t15OH8i1F z{_qu~tTBL$HR_WSaH|O;6RBYak|`!9=Yi#+me#c_gG{lKk<(Tt;D`ptWczhPy`RdgeEv3YtntD*a#LsN&HR@tFHO{5)E3@r&lSxPmL`eYj@V~U}d z;-S&1gx!F%2TZi!*yusattsO=(`dqKoHv0|G;Qe3xJ=zV#E}WZKSXWx( zr`RkSlb`sBD$9CgmaL2%mjWacs^qRvh=D(?U#eBea_FI(LPanY8s+_Zk9v+;nv#4f zAEsFK(2?&+x}k5KM=nNX8cq&~eV}d~MMCf?=qpaa33!w|bN7>z?l!UsJkELUG%_Bu z{vmFA($B3z`kIVUL_A;>33GQd|<(#Cs7XEI77`%Eh8R zTrXjAoHzjn)^E&y3ajCwuNnhS+$7|}g^8kinHZ+S#ZlBi3M|sPNMxTw62(oDS|&we zMnhyBhtknVM_VU9(2Ft|`vDbg2Dm`$AXRv{n!z@!RqURMfGXoKD+`5gAAOar)it54DzyeBOW@=XuBnu5?P{ znXYC;p$=c9m%w#%!f32xjiQ>G$#qWf2CA8lRa^6%>T5=*k>(OL&YYmentjy}vyBSE zRJ5*HTIDly!Vi#K-7}QjVEmHZjaM><5d((!StJkdmz8-q6vHdzEH+!_V-w)B9wysj zQt+7s%h9BxB%~b_Ty10;-A=BDHZL!9dHX?rtqQ%~ZLuD|*Cvc1# zTTWTE(P^e8I{j2XXPWAbDcJ}(UgtZv;f(#PzBxn}cQZrDUsgZC6Iw|O)Z4`@^wzdw z8hsW?UQcwW`i;(oMaJmNUGc_^+1|MG5S>71O0EK63#2xRv?K`&SHA}h09iLb3CFDQ0#e;$=_phm^GO=Eg%oB- zNG*1qv}G?zANGrkLOMh!OAj@Eak`YD(+ryZI^-d)#k6`g(z;h50csHoWV2XNHjy=E zLs>u8jZK64U=^#*BG6Acf_}EwCgDMk0sUEQlY9YIfO6RKb(`%R-UsYY`CCpvVBiZGw z>I+3oT3qMg0v?F^KZCxkuBlsUoI(PL`l!CZpR`k2dZ5gz%gM6ZkWGbdiaKVfSAu29m8}6{hJI$sO^Fd=;4~lMN{LK+FL)quX|q_LhlsBFGlY z@f(js2k#X16%o3sVzq!$PRBUA#qfX~=8bp-X=To$I< z<82mv{G5(g%aA8okM@POrz_4TZ529M%0*VxZYW{8AT=emu8*AUreN`PP#slYRY;9j zL@iLUG8{_P zK@oXLe^xQ*=)KTY^;g|T`!Q?tlH)oPdO3xlJFZL$Ad{sb=|cMBPZ$}EnNuh^LFSTM zm_WV2g!mH__22*hT17sR733*d0;k7(5`j+I3^Ef6n`xM^OhK1uGT8~8Yd0N=RHJF+ z8an17Y8K|{v&kFGYgXfGBj=)rHy>5ze7yP#$TG2rgrHN?7gc94s;F*a58jU=W1);( zB%;Y)@rc|Lui;wx3>QlrDlP}#N1^{oX&S{)5fe<(9L#;h%{8!ZeCVrtTkIe7Bk>u_i@PGYuqjjhtrY>K{s8Q(tE8c$>` zsDeuAa(EgA&7x1!bb2&RtBcU|`ZY2c7Lr`L26F7;!KT@ztLg5#j?MvX$OqM2?^Dh6 zWYt)=Q}uN@xcsxKayki=6L4aJ{*xIKgS6U${wX!CoGP6zrLy6-pC4ae0vhc~dZMa> zer^-J5xSFo(4Cx7E%i-&`~;tWhkySQ-^<2-W9Xzhx%R8f_`ep?w?Sk(47JKy)fMxH z5bPbxkk@_)|Mv&lmjCoanSty>r8`@8Aw5yI*2Ebgn>Z7GVx{5U2A;AV&&1)XfJkW;2$|9m}3O8`v)AG8^xFVND$m&*kLewq1!o zwVU!&b`alU4?w2bNIuCP5Bl{KZsWV!Ph%g50zE{FPmTdz`e$LQ7yn zoCo-xQS7U;j1_T5v0-ipcFe8Cs3^gjh&)({vq9~hgOvoKW4x@)F3A=wKn=u9bs<}z zqSy_Et`wfblDZ7a8+!f8Ifo37K)jDYA>CNs{`IIr*=aZ8-I9rg!BUdOJg&09-I7ObRYlcuB;HPk z6LExUrn-X>&`kALRk0=)!*|VruSlg%DY$Kr3FT8h-1qUarjA3VR2Jx<)9>LN5`qrbUpMom!YSLQx7nA`AvK1By79R z%YNyqtSV^w#aK%5!IhqrKh^7I;rGNOR7K()f_57 z=cxw$`lo$bLY4LuQB6ICsA1(NQ_n}|XkMm?=Y_$VS9RfQ_6fDE!phH698J?Qs1jFJ z{hT@~FG^HzsU0omZ&X&n)R1PXrE;aJAh*MEKB8ueOR6}!L2qmra~R&^+rO({@O(EL z$sE&IPI{Bb3Daqv^*X!L`(KY*X?k(1I&Z*JPrLP z>FTFm%7*CA7F1bPJXJ+~Aih2$ClOn3RDFmU%TvotD1WOk5#8A=5;=Y8#w{okqE6~K zyX^;hfiEe4*mbXArmUuSvkg5$>C7tmf~<*I;Ibe4zLXvy;_BQY%>8Wl!?c~@2H9?) z`BmNQ)*sCtKez?qzDMSj@4C6;yJ)WZE|`nHE9MftQP-Ke_yGOZ_vpB2UoxB2&2I}* z1!(B@u|wUtWVnYx`(M~U=-Z^H1H77UFZ$}KVy@mTcImrxgooqn63A~li;UC-q}9cl zwNXL}a6(sSmw$8;7zakY)h~G7N#<`X5w}2SLeR{)py8hD+w_SovIlfie0*ZNMPD-; z^hC2-mo_W(Z@m;o-V)tSFW1@hT9o^?>h0v@L&yNDqF0m_R%3)Ot$E}tk19=fvlq-| zGs-L*eBaC#Upjk$F0jjRli&EZ+F0%*8{ozi-P{0Tp^k9x=8D|1+;y{0qDET*0u zWrF1+vja};BWmSd_0#6!Ue{IYMQ;^O{#Kd%U>5oJ9rEym=(bgXg**rZbGe$Mj;SEj z+d8OMs-pUYI^t)#0N$!l`H*blg6b`Is3LN<(#-TaDQc+E^Z}OzZK2`S_R=7O^o4^;=@4 zTjrWRWq#^C*rSc6F1Bu>S!vE-?Udb&H{EZh&=GaRJ~S!l5@|1@+b!g0zsRLZp#3{a z_5i^hV})8^OQ=n@pW1I%tJCl~FLRo&*?4G+XT!G?bB^1J&Q4p^S!F9Z)4?-`*j!F~ zo6MCRQM7nej(BZZVM&Sn2N-i;_<#dxtQc0HG zOoV6v`>+@s1Q1$57l?Sm)SDyP5&_6& zjoonXcpkYSp11BP&u@3T$D`+alIX!6f8Edn`_j``8>f%H>P*!O(JX4~oP+Q5N`F$0 z*{L#-oiJ-mwKG1v*h#sZr-54w_oHXH?C&eiuSfRjGd%nru}2r+J|;8 z({ayG@w-mX{C&FB9;5p6#0C+=4zu@Ip?rS9j)AE>6*b$1c0E6}n2PTVer}w-$unM| zI{3?Ww~pvYk8&$GyNy8gYudb`0#>dBe=ol+EwY00r=&+T9?M~cn{w1V%g`-ULcqoy?uEKy2iU1C&1tu> z+340cGti0|>^3wV+-A)EYj4WAy-h*5u-TbZlFr>>lDi>jm3?I;!BUm6sob76le?69 z=2cr39IhcaZ7;VS_0XAOt9uAs_nE*sz(P$+Z*L(vS62c%t|J}ONS0&;a(}j(iZEIW z%M><)tc8~5C{&zx;0vDFpA|5ZQTG|pwWth3f_=LEaKPJ4H`Q`tS>E^sPHJn5?r&GqpU>d+nH4T-AZA=NgL`C8` zU0Q$W((8;@)u5ph{!Vzl_6I?+U=_zSx7#vTHHS}pdI0W2iX34{q=+YS<$EgexN zNL(}%sSV8+oy|s3&>V%MaSPl21-?Wqd{cH=6(lr+?jePqE?>F3WC$JCM_nyE2-+U0IkN8Q`%s;itZH?I@nws4Zcyey%&IvsVWGh2UmKu|s5Iy1dmMLa!B73L<@ zXBuiVPfFX;Q_r^WjJM4^du>C{Gh5peO;l#)U1?8c!8H?kJbhsqj1n0=lc)(zrzSK_ zr14DP<8U79A+md#hQkgvf3k_FXonKkNM;Y zG>$jGr1XaCJl;dPjCX{t?X9SrdgJTX-j{A0n1L<4E8Pa(DQ-n?kekOl3|{6a_oruu zd)>3q-QclD~UJ0N#;$;$8;vX*PrQd0p_=-k_q!PHs`63ZS(}0v7R}mIjn}< zo@2)6+%y;9fX;MW1IO5=fJORP6(A}phc%a;bLmj(V<9xPum ztYRg2Ee-5#vd#yvbi%NAZ?Svdv4%c73tfgeHi4Ln&6|zh{xp97cw2-BuY?$Yx>Pql zwn72CuFWmV!9>evV~I56u`&5wzvxtdW|pBwG7KfcW_A@hBIV!UZbCARQ_~7eFX;Maa}?0 z)OqwOol4K7RuQBl(9`I>g#S=bhZ+*V(3u1IBvUYy^OU-TlW%=J<)&Z;r`_+x;qk@cWy=# zM%TwZw+w94+UBg=#vF9}o2~A6v%+0sX1P0IOM z;Kt_XmCfq9CchiWR1lx3?h14TW7w|P@1brMR050HRYa=$`8y#X@~BJLNcbs<$dq#F zq@og0Vk_NU4AS$d>75Xp>7O`9XZ$l=kZ7|JlZOY(f@YztYxXe@HdKx`AMm>hG&O~~ zV)8IqwLB*Z?89_da7O7+ng{b{Ga5Ii`S?V|r5+odxW$?P=Qmx4@6Ax>v036=Gl!ky z=ApCQ`~_7^>X`wnXQZhKi@KwyjTzyoYvy_?n9ZJ|=7c8?mLaQo<4I@2Jt<90Z!(k0 zo5bX1mG&kwb-W2oTd$w#A}|$Gi{p zDeryedEC<%SQq*HqW2-6Kh|eaPCem$st22OHz1;gkPw~Fe{rUMu-uJqI_p^?L zp2lNOgx>5?roSh)3E?TGTsCt=VsKGd3b~n&dSxqH7 zP#$C+afrzw-xxpX*gqnReM!7>kBY-}vBZX;(iS3q(M^$F+(UEXsTcxQwwliVi*)vX z5=O*<{gFe)l;vd{_#l3=ExPDk=&bIBvI|Nrq7~}qb!Dh1Bln5ia=u6frzEDVEdGil z;sYM{8A$#EBAEL`rBUkEVf3SXK#Ak8_>L;?YMl~|{@nPIa&iyst*&klna&+0ANc0T zg}!z4ryc<7zAQg7W9U%icR4lEtJ+7VQe`3ws7!Ei;zV{*IwDB@j+oEdqHM$|l`!&- z${YDcHHrMGCPx}|24u(Ui|f>dueZjR$nmk7y77r1V>_vsS~?Pc{#<`h<;+8H=kqE8 zeb>5nky>Sg)JLpgKKk8yi*#z8F!DAtNnEjCrjfH`5vnHDWCiLbshQ{YOVmdfp{o2( z6p`cT(rbr`Oc}0cdUWAEV3MC~BT&7xT<;h5Ff7`=SiW80ZM*DaFwRA2I5#pObS6Cl z3#ERGx>Prvkm|O-@Pn=U&TS?xx&y!xXNpDcR-&OxRJ31&sJI zzt?WCOrYn;ibT|-^j0vIo%HZTVK8gu7BdI7{!qA|P0?4+M`cCQwRIJR_c`3_hG^C& z664@F9F;R+hSoxjJq{5?2pxg5Oh?tk^i}EU68y^a&(lnqU8>uwA-bMwL5FZfaOQ$q zs%-j+Ob?qPEsD4qbSpZvbIKC*N;E*jr@x*f7V6g2`E!bJ9f`8YRU2s5fDR6~vC&p) zWlL~fGFd;g-g}@Zf0+)_9MYu|OP~=Sn`!T(yX7bPv1RnPsKtpsnF~Np&-U z2=$Z`F}(dmG4EQ@k^bRHUXNVwEeHd+Ei*%>%UdvlZ!?YWx>u>Q-VAD|x3pToB=JCR zS5=4J-^||O3iStd)Dx)2q1{x?(@4buHM#Dj1an>d$cI%kP|&#cM=Dj!waKcbB~ zLMPlv6qqYeQH(C0(~Wo?9E?hpJqXUT8@y*1HGq9`wmB+0)2mY2+(9YzEqQdLe4zc* zNu6130|{KN>!{hf1HIOPYO)@$rt7&>RpBS=4NM!~qOR&~>MhGlr*T%Z4#aSo3Z$m8 z(oDcI4rSl=P}yvAI{2!nG5>lt(|~e#m9?K_CUHwv5Qn(et5EWoEGLNp%rR&ySBW}w zo(>}$8mn)bZR zPNd+m(Nvi6hviX2EoNHvU^5S^bVL=V&orrtPFG28va0&dbsb36c)qh+?;%bKaW?3e zte<@DI`}&W{dFgl*!MNDuhtiwWYl~L6ZbYj4|Rme>#Q?|-FSufxZa!3ZYUA~K z+1Bn1aF(6)v)u-r_-oI@j`+`4NzA76A_x`UUcMuugD*_9_Iar1WszNc734r)D>>0O z5G|((@(ecbqi=~!=`N$EZjqeo&XQN%aWGl~WqaL0?$xzrOt7!^CM{FG9I~5t#O_zo zT-hOVa(>5&fz&#hFxjmH6D!gSw6)lkA8iYD(=JhmVBfE@%9(@;cwbZ_n%nNEMvQO@ z*@+Hb+ev9BF`s56v0yJgHg=NR;!b9p(kX2JGH>iQ)xT}@gN|1_Y-@ENo8V;vY9aB7 zZsbc?{SEShn1JF}SG4e{U}GDn%S`f^Oe89ra1(M?)>8QwrVxuIe7$_gmB{^pZZRaw>`AQ6-$yvJKqh zkxmi0#Q7q2IqSt4r=_^*BoR-XP$scXv+uAHZ;7LyJGYogy_AYw7nE57%r;b6=7U@g za}McND4dma2BXf>lAOP?KA{Tf+1RkQWO;d1YO1yAK_LD0EM{G|kkxcn?!-?K492uh z&!ro@E0b8uiEJi4T6qc$j}P$q?pPmn?!5L07Ji?dWB0(}-b3ArUJr4U?EM^?DN*(R zM|O;O4?7?N{4$oy^KmTv?zQaW^I|=obcTp8`-`Ho4s&R;iYf9B zmgSUvASYQv-)?#p!&?J_Ce-QvsaUi5us;>IbTbeH;4yCZ#t;XhS#Tl$*1&3Q&UUwgNYucbTD zSI6DxE9qYMWpFjm&F?<(b%!mriSK-HoBHx-f8RhI8F^S=iFD{ms%d&hE->XH!%*Dz zx8EZA+mMK(Fl#+xRzx*1Bx0)Q7!e{GMZ}iXm?l^*Vz?|7u~n9gxW`A$1i{p*Mg()T zBdVw#5%tvQh(>BzL_>8nqPBVwQBnCt2B>n8S=5lo_-b!tr2G^4LYAiLKGnBfKK9L( z`Q1Tqikr)~ZW%J(OjIUfG9B?dy1Ea=ZF5cpFp*>dS@d^1hsxu4u}lo-E)Aq6(i;`A z9_Rx0fGgQcBnMS4!)!BH24bk1E~e1w#%>mi@f!=(H8G1$)v@XqU2rjEOO*y*em?k= zy&o%LuGNBe72AX3~uVKKTHJr0upLc5@O{!eiLc-$c`Soa&#koJDxgq zO$v`c`M5HZVf!5M9MtbU3v_(%V4~6%x|X+`Zs*ORdwG))twv}0+@8z?Xy^Un)?pQ8 zc4AuZANm*tb#^~$?rHTxPeI+=Q%hI$bl1r}(@>V(tB*R*U=YPKEznBJPAB3ob%cpt z5oWR~&aAx=HWi$gSMZg0V9|!7AXrmwC$f4jA~*{V;Hn(QgKZIG=p$Sqm(qv6g8I}3 zJl$TpT`uB@!{98t;vrWhlG3+f*le22R60xD4;eKK|h21l<2<&Q$aihU1U=q1WA;ig{oBU7(q- zf=p*MnJ&pi<~MxWyY=#tDJ-@?1KbaFd{p;{I>LT!m$Ni2Ory@m_#$E@ITz8K8^O6r{OrFUYu znVlAHMrS|uon$&LF?A$!5nj+sbe`B`gDPvsf;_iWIYc4)Q{$+(^rsA!2boVg1Lkli zxk8ncKbUA*+W92Lzu20+dIx8yV{uw zRx-w>cY;u&9LW@%3AO-y+(&Yq9V3t0Z1Ax{#2*_dQea=p(1+0l*7PjlZ;yyD5ZvV^ z0m>U?P@U|FBI+V}L!Xs9^*6atr&QzUUmD7!xdD2X3Z%Cw2)&G{`YmyqOFR}AzHu^# znjm$sBu*XpDr49ihpFEFMGdAnc-%<%F=ye?#1)a8zf*L)PJmw@rHL7r%;Bb3PXzW5 z4q6PAm7eu)wzfJ3f;SzEzMTyObMHq^+ev+gUw8`)`Y@9wHqdvwz?_j&;9-n4ZK!Sd zgG>LQZ}2c#)flma-l)w~N{^b?HWa?q8#5Kvht9A-tKg6Ffw^R`Eo@5L6BYX5HkX}f z%fqB-%MP5($HR7t{b5JJ@9F~@*aCgT3g}d20~L*CSAnN~kVi~G@_^ywnkQ6VV_`Lw zBw`!rjMtl-s_+40X^-cMo6|Ght?8-bcJ(B3gFTOYb3Ge|9SHG)_W5B zmU@J5s^@3q0MF;h2CN*OACW%CjXdkb_KkPa`N}u}zF(@YZ=LGptE;B_BIOR>T6xn~ zQ%3lH!%bZ&YQlaU>iX<|=$$=aYGF*B!4}ug(EnRwmg(*$L>Dny$1pkJo;2Y!1cO*_ zq+|CYYH6>{Fs)hf?HHZb&f#2a(z#G6%Vl5d?C=~iz|P6JIE`HB7L@bd@^Z0TO|E68{9d;L^YH@68#7aZ@nc@x53;qJsKf0*dts7zLB^Jh zDnczH<*~f;LooWj!C}hEjE`nkfY@C&N6275z%5RSo<=zlpMJd0sMlSmqIgi>5u518 zT1`c9jn0K1tt?LvOFh;-sVI&>Q-jGIWTnf^V)+Dpjf{2$HLK-JJz6ZKm`A)b727@< zU57wCTvs`qzV=hHy7Z{xXwc-4!73%WSR8stHFef6qO?PV?c5ean5s6_IUyD}2VimT z;^TIhvD?K^W?Z#pl1^#o2+u!@N^&SH+^1qRyuQlHrKcgTJS)@7QL><9G9mMwn#+x% zw`|L6NWts5MThGwI%pc$3o@m>E#H|ilr`Q{jsDKO-9NIw2?w|OLxuXM9Av)8$>tR} z%w2iWoR`0tOqdO3C+s4+&pM*sQ(k5iX=OJumR)cy|H4ozE!*>#vVjx7qiVN~Ds?M3 zp9$hY;}t|eO+{7U4JK@o67m*i|O3t1fB6c zQOA8})mh(v%y^&1jQ2h&u3JYHfsNA5^;4_e4^-RE$?ST$9H|?4%FoKg=P7tB zksiq!ppxs(MD@*74%l$TbbzXXwpkk;8{7U<&d~R%y&vZNFOgw-uryR9Q=43}xbetl z^y3dPyQ!W{5eG~MagS5~+oS~P{)MfZLfL_-O znUDA?4pRa?qpx{~>h?K%OCG_;9<-4l%egU=Ml+)^^P6e8 zm-uS6T_Hx2akr(vzAD|Fh3#q1a&(o}R%dTdR;f{W&q%JE3#IpBwt-X44slx8`A#nj zx5}P$=Gd#wI(mclqkMP4hR`>6+Ia_p^~bJs6f+2>PaLkXX zWMm6*nHg#5R{dbpG3hT74$D2b4EsP}<}#r+5Vln_`I@@>cKZGYn7ESZh~gLg``xfP z`sm9d4}CRXU?c9Nr(+RYb2lfnlM4NF&c;UQT(kY`{A#ax_RXVP{MnMj z9%M(L+}jLA(^9PLdYny$_lraP8bi0Xv2|6O5Y^N4`0zqZ-KmLR@2*#wsd|vvt!tRa zI*o}<9j7D{{rZ}DdIO4B&rB(ug5S~rO}3f#4mF7*t`r-YVzn49?QC}`Y|V@CYQKx6 zZc@3~Eksqbmb`_I^cT06^us#l)BR*a-4#|+b9`APc~$$PRnB_`)vjU=(0MtT%4rkg zuguinzkvfBCiWUj>{W|MD=CVeVK5svGbv>dkwgX4&L%L;?Q>nn?$M>uaPqfZbOKvd z|24VwW0Q;udrZB8IfWyQU?#gqmoR=hg-NT!bwTP;HT7=Yl^WDU-AixQHFT)XiH?38 zYFOXs5WVYmLlJDI`On>hI@oRcTYj10)PnlCd0-M%wH@3xwv9W`wxUMU%3Z+c>ufuB zhwbDZwB6kk%%?bK2e}uRLVE$tzq2rqPT587QF@5?*$GW1wO~;(aQcSUKBHu7uAt80`(je8n!7^77A%I_C z%O=WFaWzB=@U(Bom89H>*$P3c4v@0@V^!1-v;IWIZOPwX7$p=G+JZR&)f#{b?X<@-O$ z7_VcEx2R%pikga!Y8ZV9tEn1XqH6GyTr`b5kA2-nHouVC!8o}SiyJ~b^HR1#tD&J3 zs*2a?<{usr!2`kC?>DU0J#g>JX_|LJ!N+44VkDMr(rH@QfzB{Ia$QOMhlr; zgySi`px6EqExh|=IafpjvYbNnZ=|pb;f4g$0ooa*-fH5t$syhnzkW5(nci@STI~${ zQ+r$07PLLA!)%9J@YL6_g9ovbtC za*(Hitm)}0(|d-&sY~gEooYV3X_ld_CS~(EYJtt7Q-^>iuISm#8|Jhkbd{jhP$4B-5a)L*Gd zzt{8h8@-Ym^;Z4zU#ThV@8SR*u#?K@%DPg>3H~CF5Q`*!76==^% z90tNYpBngHGs)aB3(a2`W@$K&l{kyN?G5?|pRfk0DD5N3CFOFvo%+%>dER~@GKj0b(?b%I_&PoHlAHgh1!^+Q|qb7 zZ4ZO!%m)wbFSgPPG124}ov>h)&1ahnPF_+fdmg5rgzM>aH;k~Ku#um22iU_ctP49b zhG}Y(;{kHv2`Z3LwScoQkeq!w{ootTL3^5>@Wpx9lRdea-l#{sqmcBiBm4qs!W%|ahn8iC)YqahK|R6;U|gklODxhd2^r=rI( z#TMf6@_fGm&+9CL?JzM6R#Ko{!|&UV%HJh$h==ezK8T7$!9{FzUPmJGt~4@^%_^U2J2r}H5?T)21Ux4y!xgq^T5 z=kxgpcq5&`8tNI3DP!WmK2HYwJPWv60BVy}LE&1`12X`I$uy%lVKHE!Bs5|0IW;Vl zRCLc2v#qE)4KV|mrZ}4ph;7*43*7bRHnEK$%Z@J^!-9#rvI}fovB!3z<}-|n@^lf6 zT77zI2gRrv)TjE>mCF4HD$g@T68vITxkCitC923Xq6vs-XL*^r-v#o^Q$+O##Zu7I z4P@7QO4DuIs{fh(R9j4YE$=cIuXmBQq7l7ly=q@I_~ z2aNy=9Om(KtH_+^*^JtlxX~xnQ){VZg+VqbVRL9XMx@e5N zVP4An=v6*NjqW9=*gG>selabnxt5iGOcv=gv8f$@7hZc8+jWG=+N<$~li(us5!s09 z^Vm|NFgvv*QGNxkbq)K{HX=i7OZBEFT`@!KB0B+`Y=Iqwo={hEy5@YhHqR>e|2yMP z2U1!%n2BsNGKYTHgDGT(Ys6>ND&Lr^;+c60>*0&IMRsw+#9)ucXC>j4Cr5EJg?zxr zFus0=r}++N*2ia*r*^%$*WoD#ckvSplpftYZHj-_6fOJ$Ea3#3oxw zuEF~)BgbFJ$5~|Hllk5lo;#e}XCO*ny=-b;Lp-$XB}@XC59CEP?ISp0*F<@EmZj}c zQJnJ|V0SSeeg{{1J4nJVP}hB2^}{d?Pm7FHE;GOk$pAMq1HG~tY+US6CRQm{Ggcrv z`SZ92`{-S|N6%6u_9(UTv!$tZwWh~9NV#T-3a3x)2Rr2p$SeAB>Ye$f-olA_3o8GP zuTj%uQqomA7xsfktN@P~r=r`gaG9&CN~a=YMvb3xj2t$JWv z11)KDsKRy&8UKIa zts9B3Ho#8XK)=%lE7?hg-ZmfS+=rF%q5I^++Pg5<3_K7CZ#bGgM`zSICT^XzsqJZ- z-5$3A_5cX(cH7vlW+%?JBk1a%g}&8#+XUrFW-0O4UfQ^z5C2W7nn; z^9^A3NlVibTh|EJ4g~H^7>1*d~14^8c$T7OJkgOMd)_y7Y58YCaHg{I)+qOYTZP!Tu4m>6z;$ zi-}TjE#qP3o{64f8~uL6=mV@M)(JnN*_t}->~dTc8z zn1M1SXyq?3qMP)j>;W%YjPl|*eFN<5k?gKt$d3A*?4Uo%uB?9Oo{i$`S^A}1ryt9s zObCDlCVw&|AQ8P#g?c=Zv(B1I@;zQFF1S|#a-PO$kPL>Oynqw5*UqD6 zJWRZ^?S*TrqX}7%ibh&`7GsO-!e?{P;hqhBNKiDoBJZI#MHL#xVT@1

    CsIiJ8r7m-v$UXtxxF(t)*W?QZ1^-pIe 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 literal 0 HcmV?d00001 diff --git a/public/sounds/recStart.wav b/public/sounds/recStart.wav new file mode 100644 index 0000000000000000000000000000000000000000..166d3b8f7ac08566da50df5c76d58a0f81628455 GIT binary patch literal 297710 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�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 aeoo-$1b$B7=LCLE;O7K>PT-$Af&V{N1u3rp literal 0 HcmV?d00001 diff --git a/public/sounds/recStop.wav b/public/sounds/recStop.wav new file mode 100644 index 0000000000000000000000000000000000000000..3d97f5d9ed9f393ab7ddae7cef619bacd7e025c1 GIT binary patch literal 352878 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

    -wn6aR$|Tf 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 transport.close()); + } + + // #################################################### + // PRODUCER + // #################################################### + + getProducer(producer_id) { + return this.producers.get(producer_id); + } + + async createProducer(producerTransportId, rtpParameters, kind) { + let producer = await this.transports.get(producerTransportId).produce({ + kind, + rtpParameters, + }); + + this.producers.set(producer.id, producer); + + producer.on( + 'transportclose', + function () { + log.debug('Producer transport close', { + peer_name: this.peer_name, + consumer_id: producer.id, + }); + producer.close(); + this.producers.delete(producer.id); + }.bind(this), + ); + + return producer; + } + + closeProducer(producer_id) { + try { + this.producers.get(producer_id).close(); + } catch (ex) { + log.warn('Close Producer', ex); + } + this.producers.delete(producer_id); + } + + // #################################################### + // CONSUMER + // #################################################### + + async createConsumer(consumer_transport_id, producer_id, rtpCapabilities) { + let consumerTransport = this.transports.get(consumer_transport_id); + let consumer = null; + + try { + consumer = await consumerTransport.consume({ + producerId: producer_id, + rtpCapabilities, + paused: false, + }); + } catch (error) { + console.error('Consume failed', error); + return; + } + + if (consumer.type === 'simulcast') { + await consumer.setPreferredLayers({ + spatialLayer: 2, + temporalLayer: 2, + }); + } + + this.consumers.set(consumer.id, consumer); + + consumer.on( + 'transportclose', + function () { + log.debug('Consumer transport close', { + peer_name: this.peer_name, + consumer_id: consumer.id, + }); + this.consumers.delete(consumer.id); + }.bind(this), + ); + + return { + consumer, + params: { + producerId: producer_id, + id: consumer.id, + kind: consumer.kind, + rtpParameters: consumer.rtpParameters, + type: consumer.type, + producerPaused: consumer.producerPaused, + }, + }; + } + + removeConsumer(consumer_id) { + this.consumers.delete(consumer_id); + } +}; diff --git a/src/Room.js b/src/Room.js new file mode 100644 index 0000000..52fd3f0 --- /dev/null +++ b/src/Room.js @@ -0,0 +1,203 @@ +'use strict'; + +const config = require('./config'); +const Logger = require('./Logger'); +const log = new Logger('Room'); + +module.exports = class Room { + constructor(room_id, worker, io) { + this.id = room_id; + this.worker = worker; + this.router = null; + this.io = io; + this.peers = new Map(); + this.createTheRouter(); + } + + // #################################################### + // ROUTER + // #################################################### + + createTheRouter() { + const mediaCodecs = config.mediasoup.router.mediaCodecs; + this.worker + .createRouter({ + mediaCodecs, + }) + .then( + function (router) { + this.router = router; + }.bind(this), + ); + } + + getRtpCapabilities() { + return this.router.rtpCapabilities; + } + + // #################################################### + // PEERS + // #################################################### + + addPeer(peer) { + this.peers.set(peer.id, peer); + } + + getPeers() { + return this.peers; + } + + toJson() { + return { + id: this.id, + peers: JSON.stringify([...this.peers]), + }; + } + + getProducerListForPeer() { + let producerList = []; + this.peers.forEach((peer) => { + peer.producers.forEach((producer) => { + producerList.push({ + producer_id: producer.id, + peer_name: peer.peer_name, + peer_info: peer.peer_info, + }); + }); + }); + return producerList; + } + + async connectPeerTransport(socket_id, transport_id, dtlsParameters) { + if (!this.peers.has(socket_id)) return; + await this.peers.get(socket_id).connectTransport(transport_id, dtlsParameters); + } + + async removePeer(socket_id) { + this.peers.get(socket_id).close(); + this.peers.delete(socket_id); + } + + // #################################################### + // WEBRTC TRANSPORT + // #################################################### + + async createWebRtcTransport(socket_id) { + const { maxIncomingBitrate, initialAvailableOutgoingBitrate } = config.mediasoup.webRtcTransport; + + const transport = await this.router.createWebRtcTransport({ + listenIps: config.mediasoup.webRtcTransport.listenIps, + enableUdp: true, + enableTcp: true, + preferUdp: true, + initialAvailableOutgoingBitrate, + }); + + if (maxIncomingBitrate) { + try { + await transport.setMaxIncomingBitrate(maxIncomingBitrate); + } catch (error) {} + } + + transport.on( + 'dtlsstatechange', + function (dtlsState) { + if (dtlsState === 'closed') { + log.debug('Transport close', { peer_name: this.peers.get(socket_id).peer_name }); + transport.close(); + } + }.bind(this), + ); + + transport.on('close', () => { + log.debug('Transport close', { peer_name: this.peers.get(socket_id).peer_name }); + }); + + log.debug('Adding transport', { transportId: transport.id }); + this.peers.get(socket_id).addTransport(transport); + return { + params: { + id: transport.id, + iceParameters: transport.iceParameters, + iceCandidates: transport.iceCandidates, + dtlsParameters: transport.dtlsParameters, + }, + }; + } + + // #################################################### + // PRODUCE + // #################################################### + + async produce(socket_id, producerTransportId, rtpParameters, kind) { + return new Promise( + async function (resolve, reject) { + let producer = await this.peers.get(socket_id).createProducer(producerTransportId, rtpParameters, kind); + resolve(producer.id); + this.broadCast(socket_id, 'newProducers', [ + { + producer_id: producer.id, + producer_socket_id: socket_id, + peer_name: this.peers.get(socket_id).peer_name, + }, + ]); + }.bind(this), + ); + } + + // #################################################### + // CONSUME + // #################################################### + + async consume(socket_id, consumer_transport_id, producer_id, rtpCapabilities) { + if ( + !this.router.canConsume({ + producerId: producer_id, + rtpCapabilities, + }) + ) { + log.error('can not consume'); + return; + } + + let { consumer, params } = await this.peers + .get(socket_id) + .createConsumer(consumer_transport_id, producer_id, rtpCapabilities); + + consumer.on( + 'producerclose', + function () { + log.debug('Consumer closed due to producerclose event', { + peer_name: this.peers.get(socket_id).peer_name, + consumer_id: consumer.id, + }); + this.peers.get(socket_id).removeConsumer(consumer.id); + + // tell client consumer is dead + this.io.to(socket_id).emit('consumerClosed', { + consumer_id: consumer.id, + }); + }.bind(this), + ); + + return params; + } + + closeProducer(socket_id, producer_id) { + this.peers.get(socket_id).closeProducer(producer_id); + } + + // #################################################### + // SENDER + // #################################################### + + broadCast(socket_id, peer_name, data) { + for (let otherID of Array.from(this.peers.keys()).filter((id) => id !== socket_id)) { + this.send(otherID, peer_name, data); + } + } + + send(socket_id, peer_name, data) { + this.io.to(socket_id).emit(peer_name, data); + } +}; diff --git a/src/Server.js b/src/Server.js new file mode 100644 index 0000000..27a21be --- /dev/null +++ b/src/Server.js @@ -0,0 +1,362 @@ +'use strict'; + +const express = require('express'); +const cors = require('cors'); +const app = express(); +const compression = require('compression'); +const https = require('httpolyglot'); +const fs = require('fs'); +const mediasoup = require('mediasoup'); +const config = require('./config'); +const path = require('path'); +const ngrok = require('ngrok'); +const Room = require('./Room'); +const Peer = require('./Peer'); +const ServerApi = require('./ServerApi'); +const Logger = require('./Logger'); +const log = new Logger('Server'); + +const options = { + key: fs.readFileSync(path.join(__dirname, config.sslKey), 'utf-8'), + cert: fs.readFileSync(path.join(__dirname, config.sslCrt), 'utf-8'), +}; + +const httpsServer = https.createServer(options, app); +const io = require('socket.io')(httpsServer); +const localHost = 'https://' + 'localhost' + ':' + config.listenPort; // config.listenIp + +// all mediasoup workers +let workers = []; +let nextMediasoupWorkerIdx = 0; + +// all Room lists +let roomList = new Map(); + +app.use(cors()); +app.use(compression()); +app.use(express.static(path.join(__dirname, '..', 'public'))); + +// Remove trailing slashes in url handle bad requests +app.use((err, req, res, next) => { + if (err instanceof SyntaxError && err.status === 400 && 'body' in err) { + log.debug('Request Error', { + header: req.headers, + body: req.body, + error: err.message, + }); + return res.status(400).send({ status: 404, message: err.message }); // Bad request + } + if (req.path.substr(-1) === '/' && req.path.length > 1) { + let query = req.url.slice(req.path.length); + res.redirect(301, req.path.slice(0, -1) + query); + } else { + next(); + } +}); + +// all start from here +app.get(['/'], (req, res) => { + res.sendFile(path.join(__dirname, '..', 'public/landing.html')); +}); + +// set new room name and join +app.get(['/newroom'], (req, res) => { + res.sendFile(path.join(__dirname, '..', 'public/newroom.html')); +}); + +// if not allow video/audio +app.get(['/permission'], (req, res) => { + res.sendFile(path.join(__dirname, '..', 'public/permission.html')); +}); + +// no room name specified to join +app.get('/join/', (req, res) => { + res.redirect('/'); +}); + +// join to room +app.get('/join/*', (req, res) => { + if (Object.keys(req.query).length > 0) { + log.debug('redirect:' + req.url + ' to ' + url.parse(req.url).pathname); + res.redirect(url.parse(req.url).pathname); + } else { + res.sendFile(path.join(__dirname, '..', 'public/Room.html')); + } +}); + +// #################################################### +// API +// #################################################### + +// Api parse body data as json +app.use(express.json()); + +// request meeting room endpoint +app.post(['/api/v1/meeting'], (req, res) => { + // check if user was authorized for the api call + let host = req.headers.host; + let authorization = req.headers.authorization; + let api = new ServerApi(host, authorization); + if (!api.isAuthorized()) { + log.debug('MiroTalk get meeting - Unauthorized', { + header: req.headers, + body: req.body, + }); + return res.status(403).json({ error: 'Unauthorized!' }); + } + // setup meeting URL + let meetingURL = api.getMeetingURL(); + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({ meeting: meetingURL })); + // log.debug the output if all done + log.debug('MiroTalk get meeting - Authorized', { + header: req.headers, + body: req.body, + meeting: meetingURL, + }); +}); + +// #################################################### +// NGROK +// #################################################### + +async function ngrokStart() { + try { + await ngrok.authtoken(config.ngrokAuthToken); + await ngrok.connect(config.listenPort); + let api = ngrok.getApi(); + let data = await api.listTunnels(); + let pu0 = data.tunnels[0].public_url; + let pu1 = data.tunnels[1].public_url; + let tunnel = pu0.startsWith('https') ? pu0 : pu1; + log.debug('Listening on', { + https: localHost, + ngrok: tunnel, + }); + } catch (err) { + console.error('Ngrok Start error: ', err); + process.exit(1); + } +} + +// #################################################### +// START SERVER +// #################################################### + +httpsServer.listen(config.listenPort, () => { + if (config.ngrokAuthToken !== '') { + ngrokStart(); + return; + } + log.debug('Listening on', { + https: localHost, + }); +}); + +// #################################################### +// WORKERS +// #################################################### + +(async () => { + await createWorkers(); +})(); + +async function createWorkers() { + let { numWorkers } = config.mediasoup; + + for (let i = 0; i < numWorkers; i++) { + let worker = await mediasoup.createWorker({ + logLevel: config.mediasoup.worker.logLevel, + logTags: config.mediasoup.worker.logTags, + rtcMinPort: config.mediasoup.worker.rtcMinPort, + rtcMaxPort: config.mediasoup.worker.rtcMaxPort, + }); + worker.on('died', () => { + console.error('Mediasoup worker died, exiting in 2 seconds... [pid:%d]', worker.pid); + setTimeout(() => process.exit(1), 2000); + }); + workers.push(worker); + } +} + +async function getMediasoupWorker() { + const worker = workers[nextMediasoupWorkerIdx]; + if (++nextMediasoupWorkerIdx === workers.length) nextMediasoupWorkerIdx = 0; + return worker; +} + +// #################################################### +// SOCKET IO +// #################################################### + +io.on('connection', (socket) => { + socket.on('createRoom', async ({ room_id }, callback) => { + socket.room_id = room_id; + + if (roomList.has(socket.room_id)) { + callback('already exists'); + } else { + log.debug('Created room', { room_id: socket.room_id }); + let worker = await getMediasoupWorker(); + roomList.set(socket.room_id, new Room(socket.room_id, worker, io)); + callback(socket.room_id); + } + }); + + socket.on('join', (data, cb) => { + log.debug('User joined', data); + + if (!roomList.has(socket.room_id)) { + return cb({ + error: 'Room does not exist', + }); + } + + roomList.get(socket.room_id).addPeer(new Peer(socket.id, data)); + cb(roomList.get(socket.room_id).toJson()); + }); + + socket.on('getRouterRtpCapabilities', (_, callback) => { + log.debug('Get RouterRtpCapabilities', getPeerName()); + try { + callback(roomList.get(socket.room_id).getRtpCapabilities()); + } catch (err) { + callback({ + error: err.message, + }); + } + }); + + socket.on('getProducers', () => { + if (!roomList.has(socket.room_id)) return; + + log.debug('Get producers', getPeerName()); + + // send all the current producer to newly joined member + let producerList = roomList.get(socket.room_id).getProducerListForPeer(); + + socket.emit('newProducers', producerList); + }); + + socket.on('createWebRtcTransport', async (_, callback) => { + log.debug('Create webrtc transport', getPeerName()); + try { + const { params } = await roomList.get(socket.room_id).createWebRtcTransport(socket.id); + callback(params); + } catch (err) { + console.error('Create WebRtc Transport error: ', err); + callback({ + error: err.message, + }); + } + }); + + socket.on('connectTransport', async ({ transport_id, dtlsParameters }, callback) => { + log.debug('Connect transport', getPeerName()); + + if (!roomList.has(socket.room_id)) return; + await roomList.get(socket.room_id).connectPeerTransport(socket.id, transport_id, dtlsParameters); + + callback('success'); + }); + + socket.on('produce', async ({ kind, rtpParameters, producerTransportId }, callback) => { + if (!roomList.has(socket.room_id)) { + return callback({ error: 'Room not found' }); + } + + let producer_id = await roomList + .get(socket.room_id) + .produce(socket.id, producerTransportId, rtpParameters, kind); + + log.debug('Produce', { + kind: kind, + peer_name: getPeerName(false), + producer_id: producer_id, + }); + + callback({ + producer_id, + }); + }); + + socket.on('consume', async ({ consumerTransportId, producerId, rtpCapabilities }, callback) => { + if (!roomList.has(socket.room_id)) { + return callback({ error: 'Room not found' }); + } + + let params = await roomList + .get(socket.room_id) + .consume(socket.id, consumerTransportId, producerId, rtpCapabilities); + + log.debug('Consuming', { + peer_name: getPeerName(false), + producer_id: producerId, + consumer_id: params.id, + }); + + callback(params); + }); + + socket.on('producerClosed', ({ producer_id }) => { + log.debug('Producer close', getPeerName()); + + roomList.get(socket.room_id).closeProducer(socket.id, producer_id); + }); + + socket.on('resume', async (_, callback) => { + await consumer.resume(); + callback(); + }); + + socket.on('getMyRoomInfo', (_, cb) => { + cb(roomList.get(socket.room_id).toJson()); + }); + + socket.on('message', (data) => { + log.debug('message', data); + roomList.get(socket.room_id).broadCast(socket.id, 'message', { + peer_name: data.peer_name, + peer_msg: data.peer_msg, + }); + }); + + socket.on('disconnect', () => { + if (!socket.room_id) return; + + log.debug('Disconnect', getPeerName()); + + roomList.get(socket.room_id).removePeer(socket.id); + }); + + socket.on('exitRoom', async (_, callback) => { + if (!roomList.has(socket.room_id)) { + callback({ + error: 'Not currently in a room', + }); + return; + } + log.debug('Exit room', getPeerName()); + + // close transports + await roomList.get(socket.room_id).removePeer(socket.id); + if (roomList.get(socket.room_id).getPeers().size === 0) { + roomList.delete(socket.room_id); + } + + socket.room_id = null; + + callback('Successfully exited room'); + }); + + // common + function getPeerName(json = true) { + if (json) { + return { + peer_name: + roomList.get(socket.room_id) && roomList.get(socket.room_id).getPeers().get(socket.id).peer_name, + }; + } + return roomList.get(socket.room_id) && roomList.get(socket.room_id).getPeers().get(socket.id).peer_name; + } +}); diff --git a/src/ServerApi.js b/src/ServerApi.js new file mode 100644 index 0000000..ac424e3 --- /dev/null +++ b/src/ServerApi.js @@ -0,0 +1,21 @@ +'use strict'; + +const config = require('./config'); +const { v4: uuidV4 } = require('uuid'); + +module.exports = class ServerApi { + constructor(host, authorization) { + this._host = host; + this._authorization = authorization; + this._api_key_secret = config.apiKeySecret; + } + + isAuthorized() { + if (this._authorization != this._api_key_secret) return false; + return true; + } + + getMeetingURL() { + return 'https://' + this._host + '/join/' + uuidV4(); + } +}; diff --git a/src/config.template.js b/src/config.template.js new file mode 100644 index 0000000..05cfa79 --- /dev/null +++ b/src/config.template.js @@ -0,0 +1,78 @@ +'use strict'; + +const os = require('os'); +const ifaces = os.networkInterfaces(); + +const getLocalIp = () => { + let localIp = '127.0.0.1'; + Object.keys(ifaces).forEach((ifname) => { + for (const iface of ifaces[ifname]) { + // Ignore IPv6 and 127.0.0.1 + if (iface.family !== 'IPv4' || iface.internal !== false) { + continue; + } + // Set the local ip to the first IPv4 address found and exit the loop + localIp = iface.address; + return; + } + }); + return localIp; +}; + +// https://api.ipify.org + +module.exports = { + listenIp: '0.0.0.0', + listenPort: 3010, + // ssl/README.md + sslCrt: '../ssl/cert.pem', + sslKey: '../ssl/key.pem', + /* + Ngrok + 1. Goto https://ngrok.com + 2. Get started for free + 3. Copy YourNgrokAuthToken: https://dashboard.ngrok.com/get-started/your-authtoken + */ + ngrokAuthToken: '', + apiKeySecret: 'mirotalksfu_default_secret', + mediasoup: { + // Worker settings + numWorkers: Object.keys(os.cpus()).length, + worker: { + rtcMinPort: 40000, + rtcMaxPort: 41000, + logLevel: 'warn', + logTags: ['info', 'ice', 'dtls', 'rtp', 'srtp', 'rtcp'], + }, + // Router settings + router: { + mediaCodecs: [ + { + kind: 'audio', + mimeType: 'audio/opus', + clockRate: 48000, + channels: 2, + }, + { + kind: 'video', + mimeType: 'video/VP8', + clockRate: 90000, + parameters: { + 'x-google-start-bitrate': 1000, + }, + }, + ], + }, + // WebRtcTransport settings + webRtcTransport: { + listenIps: [ + { + ip: '0.0.0.0', + announcedIp: getLocalIp(), // replace by public static IP address https://api.ipify.org + }, + ], + maxIncomingBitrate: 1500000, + initialAvailableOutgoingBitrate: 1000000, + }, + }, +}; diff --git a/ssl/README.md b/ssl/README.md new file mode 100644 index 0000000..16af437 --- /dev/null +++ b/ssl/README.md @@ -0,0 +1,18 @@ +## Self-signed certificate + +![mirotalksfu-https](https.png) + +```bash +# install openssl 4 ubuntu +apt install openssl +# install openssl 4 mac +brew install openssl + +# self-signed certificate +openssl genrsa -out key.pem +openssl req -new -key key.pem -out csr.pem +openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem +rm csr.pem + +# https://www.sslchecker.com/certdecoder +``` diff --git a/ssl/cert.pem b/ssl/cert.pem new file mode 100644 index 0000000..893c641 --- /dev/null +++ b/ssl/cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDlTCCAn0CFBM91H+g2aRKsaRrCmo3NdYjwfWUMA0GCSqGSIb3DQEBCwUAMIGG +MQswCQYDVQQGEwJJVDEOMAwGA1UECAwFSXRhbHkxETAPBgNVBAoMCE1pcm9UYWxr +MQ8wDQYDVQQLDAZXZWJSVEMxFzAVBgNVBAMMDk1pcm9zbGF2IFBlamljMSowKAYJ +KoZIhvcNAQkBFhttaXJvc2xhdi5wZWppYy44NUBnbWFpbC5jb20wHhcNMjEwODEx +MTUwOTUzWhcNNDgxMjI2MTUwOTUzWjCBhjELMAkGA1UEBhMCSVQxDjAMBgNVBAgM +BUl0YWx5MREwDwYDVQQKDAhNaXJvVGFsazEPMA0GA1UECwwGV2ViUlRDMRcwFQYD +VQQDDA5NaXJvc2xhdiBQZWppYzEqMCgGCSqGSIb3DQEJARYbbWlyb3NsYXYucGVq +aWMuODVAZ21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +rn2tC9W6wqjDI7B/4LfEnE4ILBOdwa9889QjmWUToKua7iXTpaSNP3SefKY50Q8T +BFfkZXEGyqAESBUn2rYeHtebgLQTKHsixhSCdHqpBDOyYFeTywGiRP4gQHFKbExd +X2AAD1ptTjHVuSlg/ojWstESBh/4TktifKzy3PKVKX6p889eDfyJtlv0PADAkon/ +rZp3hHq0FORhvQEER1sm6g58WyIfqGWjW7bb7/bkyS1baQI16fPeexfu1Rs7y4kx +gX7+9/oA40D3rz0Wf378PTwVzbYCF+hZo/H9yJGTUAZSz84zNbSLvKBZFPfabA2A +l92uPgNWoct06uf7ubEJhwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAyH68yi+mf +2HNwEscSLN1oU9uXNC4hwHi2xoPrpxoLsbhoc/aVhgd5peOEmIlOQPQofCO/JSKt +HqidURSt8U+WrcsXz3HTdq+m/Qw3E/BA5CDXL/LUmIh43cZzkWSawx2EocJr7g1W +JeAtUt8xpDtuLlTMjoGGmTsKQG7ub8NcYN7EEqWa2v+2qSTqvhASMs+cf7DT2HZI +I3q2v6l1N+DcpO8ey8dbLhbhd4d+bGjyjEcT+clDHFrKsqiYDCS99sOmedmHoyZk ++h+CzXICtqFSrAAGE/PoetQtJlojwnu9mJN/xj3i/zJTZTRh3jOGF8Hfg2bvwgdg +vMYRLwtknqya +-----END CERTIFICATE----- diff --git a/ssl/https.png b/ssl/https.png new file mode 100644 index 0000000000000000000000000000000000000000..467dbdee6aa8ba1acb0b66cbe5eaa90721c804e1 GIT binary patch literal 6356 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