From 8f841fe3a3c6ac125e0e9fc19db6307985d4fb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Tue, 23 May 2023 13:19:28 +0200 Subject: [PATCH] Initial commit --- .gitignore | 4 + COPYING.CC-By-SA | 359 + COPYING.CC0 | 121 + Dockerfile | 17 + README.md | 20 + app/__init__.py | 0 app/__main__.py | 4 + app/app.py | 124 + app/openscad/bottle-clip.scad | 119 + app/openscad/thing-logos/fablab-cube2.dxf | 1964 +++ app/openscad/thing-logos/fablab-cube2.svg | 2676 ++++ app/openscad/write/Write.scad | 378 + app/openscad/write/orbitron.dxf | 16730 ++++++++++++++++++++ app/static/logo.svg | 81 + app/static/pico.css | 2675 ++++ app/templates/index.html | 22 + docker-compose.yml.example | 7 + poetry.lock | 308 + pyproject.toml | 18 + 19 files changed, 25627 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING.CC-By-SA create mode 100644 COPYING.CC0 create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/__main__.py create mode 100644 app/app.py create mode 100644 app/openscad/bottle-clip.scad create mode 100644 app/openscad/thing-logos/fablab-cube2.dxf create mode 100644 app/openscad/thing-logos/fablab-cube2.svg create mode 100644 app/openscad/write/Write.scad create mode 100644 app/openscad/write/orbitron.dxf create mode 100644 app/static/logo.svg create mode 100644 app/static/pico.css create mode 100644 app/templates/index.html create mode 100644 docker-compose.yml.example create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3cbbbfd --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.stl +docker-compose.yml +*.py[c|o] +__pycache__/ diff --git a/COPYING.CC-By-SA b/COPYING.CC-By-SA new file mode 100644 index 0000000..604209a --- /dev/null +++ b/COPYING.CC-By-SA @@ -0,0 +1,359 @@ +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at https://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/COPYING.CC0 b/COPYING.CC0 new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/COPYING.CC0 @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f9bad53 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.11-alpine + +RUN apk add poetry && \ + apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ openscad + +# switch users +RUN adduser -S app && \ + install -D -d -o app /app \ +USER app +WORKDIR /app + +COPY pyproject.toml poetry.lock README.md /app/ +COPY app/ /app/app/ + +RUN poetry install + +CMD poetry run uvicorn --host 0.0.0.0 --port 8000 app.app:app diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4c9bf3 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# FabLab Bottle Clip Generator + +This project renders bottle clips for a given name with the widely known FabLab "cube" logo. + +The generator allows users to generate and download STL files generated on the server using +[OpenSCAD](https://openscad.org/) and the +[parametric bottle name tag](https://www.thingiverse.com/thing:38861) project. + + +## Licensing + +The OpenSCAD code of the parametric bottle clip generator is licensed under the terms of the +[CC-By-SA 3.0 Unported license](https://creativecommons.org/licenses/by-sa/3.0/). A copy of the license can be found +in `COPYING.CC-By-SA`. + +The remaining Python code is licensed under the terms of the [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +license. A copy of the license can be found in `COPYING.CC0`. + +The FabLab "cube logo" is not subject to copyright protection and is considered to be in the public domain. The +drawings derived from it which this project uses are in the public domain as well. diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/__main__.py b/app/__main__.py new file mode 100644 index 0000000..8d3505f --- /dev/null +++ b/app/__main__.py @@ -0,0 +1,4 @@ +from .app import app + + +app.run(debug=True) diff --git a/app/app.py b/app/app.py new file mode 100644 index 0000000..d12d2ac --- /dev/null +++ b/app/app.py @@ -0,0 +1,124 @@ +import asyncio +import io +import shutil +import tempfile +from distutils.dir_util import copy_tree +from pathlib import Path + +from quart import Quart, abort, send_file, render_template, request +from werkzeug.utils import secure_filename + +app = Quart(__name__, static_folder="static", template_folder="templates") + + +# allow at most these many scad processes in parallel +semaphore = asyncio.Semaphore(2) + + +def package_path() -> Path: + return Path(__file__).parent + + +class Generator: + GENERATOR_SCAD_FILE_NAME = "generator.scad" + GENERATED_STL_FILE_NAME = "generated.stl" + + def __init__(self, name: str, tempdir: Path | str): + self._name = name + self._tempdir = Path(tempdir) + + def _generate_scad_template(self) -> str: + return f""" + use + $fn=180; + // one name tag for 0.5l Club Mate and similar bottles + bottle_clip(name="{self._name}", logo="thing-logos/fablab-cube2.dxf"); + """ + + def _generate_files_in_temp_dir(self): + copy_tree(str(package_path() / "openscad"), str(self._tempdir)) + + with open(self._tempdir / self.GENERATOR_SCAD_FILE_NAME, "w") as f: + f.write(self._generate_scad_template()) + + async def generate_stl(self) -> str: + self._generate_files_in_temp_dir() + + openscad_path = shutil.which("openscad") + + if not openscad_path: + abort(500) + + proc = await asyncio.create_subprocess_exec( + openscad_path, + self.GENERATOR_SCAD_FILE_NAME, + "-o", + self.GENERATED_STL_FILE_NAME, + # "--hardwarnings", + cwd=self._tempdir, + ) + + await proc.wait() + + if proc.returncode != 0: + abort(500) + + return self.GENERATED_STL_FILE_NAME + + +@app.route("/generate/") +async def generate_rest(name: str): + async with semaphore: + with tempfile.TemporaryDirectory(prefix="fablab-bottle-clip-generator-") as tempdir: + generator = Generator(name, tempdir) + + generated_stl_file_name = await generator.generate_stl() + + # to be able to use send_file with a temporary directory, we need buffer the entire file in memory + # before the context manager gets to delete the dir + bytes_io = io.BytesIO() + + with open(Path(tempdir) / generated_stl_file_name, "rb") as f: + while True: + data = f.read(4096) + if not data: + break + bytes_io.write(data) + + # using secure_filename allows us to send the file to the user with some safe yet reasonably + # identifiable filename + return await send_file( + bytes_io, + mimetype="model/stl", + as_attachment=True, + attachment_filename=secure_filename(f"{name}.stl") + ) + + +# aside from the RESTful API above, we need a "traditional" HTML forms compatible end point +@app.route("/generate") +async def generate_form(): + try: + name = request.args["name"] + except KeyError: + abort(400) + return + + return await generate_rest(name) + + +@app.route("/") +async def index(): + return await render_template("index.html") + + +async def test(): + with tempfile.TemporaryDirectory() as td: + generator = Generator("testabc", td) + generated_stl_file_name = await generator.generate_stl() + shutil.copy(Path(td) / generated_stl_file_name, ".") + + +if __name__ == "__main__": + import asyncio + asyncio.run(test()) diff --git a/app/openscad/bottle-clip.scad b/app/openscad/bottle-clip.scad new file mode 100644 index 0000000..1ab7c6a --- /dev/null +++ b/app/openscad/bottle-clip.scad @@ -0,0 +1,119 @@ +/** + * A name tag that can easily be clipped to the neck of your bottle. + * Copyright (C) 2013 Roland Hieber + * + * See examples.scad for examples on how to use this module. + * + * The contents of this file are licenced under CC-BY-SA 3.0 Unported. + * See https://creativecommons.org/licenses/by-sa/3.0/deed for the + * licensing terms. + */ + +include + +/** + * Creates one instance of a bottle clip name tag. The default values are + * suitable for 0.5l Club Mate bottles (and similar bottles). By default, logo + * and text are placed on the name tag so they both share half the height. If + * there is no logo, the text uses the total height instead. + * Parameters: + * ru: the radius on the upper side of the clip + * rl: the radius on the lower side of the clip + * ht: the height of the clip + * width: the thickness of the wall. Values near 2.5 usually result in a good + * clippiness for PLA prints. + * name: the name that is printed on your name tag. For the default ru/rt/ht + * values, this string should not exceed 18 characters to fit on the name tag. + * gap: width of the opening gap, in degrees. For rigid materials this value + * usually needs to be near 180 (but if you set it to >= 180, you won't have + * anything left for holding the clip on the bottle). For flexible materials + * like Ninjaflex, choose something near 0. For springy materials like PLA or + * ABS, 90 has proven to be a good value. + * logo: the path to a DXF file representing a logo that should be put above + * the name. Logo files should be no larger than 50 units in height and should + * be centered on the point (25,25). Also all units in the DXF file should be + * in mm. This parameter can be empty; in this case, the text uses the total + * height of the name tag. + * font: the path to a font for Write.scad. + */ +module bottle_clip(ru=13, rl=17.5, ht=26, width=2.5, name="", gap=90, + logo="thing-logos/stratum0-lowres.dxf", font="write/orbitron.dxf") { + + e=100; // should be big enough, used for the outer boundary of the text/logo + + difference() { + rotate([0,0,-45]) union() { + // main cylinder + cylinder(r1=rl+width, r2=ru+width, h=ht); + // text and logo + if(logo == "") { + writecylinder(name, [0,0,3], rl+0.5, ht/13*7, h=ht/13*8, t=max(rl,ru), + font=font); + } else { + writecylinder(name, [0,0,0], rl+0.5, ht/13*7, h=ht/13*4, t=max(rl,ru), + font=font); + translate([0,0,ht*3/4-0.1]) + rotate([90,0,0]) + scale([ht/100,ht/100,1]) + translate([-25,-25,0.5]) + linear_extrude(height=max(ru,rl)*2) + import(logo); + } + } + // inner cylinder which is substracted + translate([0,0,-1]) + cylinder(r1=rl, r2=ru, h=ht+2); + // outer cylinder which is substracted, so the text and the logo end + // somewhere on the outside ;-) + difference () { + cylinder(r1=rl+e, r2=ru+e, h=ht); + translate([0,0,-1]) + // Note: bottom edges of characters are hard to print when character + // depth is > 0.7 + cylinder(r1=rl+width+0.7, r2=ru+width+0.7, h=ht+2); + } + + // finally, substract an equilateral triangle as a gap so we can clip it to + // the bottle + gap_x=50*sin(45-gap/2); + gap_y=50*cos(45-gap/2); + translate([0,0,-1]) + linear_extrude(height=50) + polygon(points=[[0,0], [gap_x, gap_y], [50,50], [gap_y, gap_x]]); + } +} + +/** + * Creates one instance of a bottle clip name tag suitable for 0.33l longneck + * bottles (like fritz cola, etc.). All parameters are passed to the module + * bottle_clip(), see there for their documentation. + */ +module bottle_clip_longneck(name="", width=2.5, gap=90, + logo="thing-logos/stratum0-lowres.dxf", font="write/orbitron.dxf") { + bottle_clip(name=name, ru=13, rl=15, ht=26, width=width, logo=logo, gap=gap, + font=font); +} + +/** + * Creates one instance of a bottle clip name tag suitable for 0.33l DIN 6199 + * beer bottles (also known as "Steinie", "Stubbi", "Knolle", etc.). Because of + * reasons, there is no logo, but all other parameters are passed to the module + * bottle_clip(), see there for their documentation. + */ +module bottle_clip_steinie(name="", width=2.5, gap=90, font="write/orbitron.dxf") { + bottle_clip(name=name, ru=13, rl=17.5, ht=13, width=width, logo="", gap=gap, + font=font); +} + +/* + * Create one instance of a bottle clip name tag suitable for 0.5l DIN 6198 + * bottle (also known as "Euroflasche" or "Euroform 2"). All parameters are + * passed to the module bottle_clip(), see there for their documentation. + */ +module bottle_clip_euro2(name="", width=2.5, gap=90, + logo="thing-logos/stratum0-lowres.dxf", font="write/orbitron.dxf") { + bottle_clip(name=name, ru=13, rl=22.5, ht=26, width=width, logo=logo, gap=gap, + font=font); +} + +// vim: set noet ts=2 sw=2 tw=80: diff --git a/app/openscad/thing-logos/fablab-cube2.dxf b/app/openscad/thing-logos/fablab-cube2.dxf new file mode 100644 index 0000000..821d21e --- /dev/null +++ b/app/openscad/thing-logos/fablab-cube2.dxf @@ -0,0 +1,1964 @@ +999 +"DXF R12 Output" (www.mydxf.blogspot.com) + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1009 + 9 +$EXTMIN + 10 + 0 + 20 + 0 + 9 +$EXTMAX + 10 + 8.5 + 20 + 11 + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES +0 +LINE +8 +Layer 1 +10 +18.320800 +20 +5.473940 +11 +18.320800 +21 +11.169800 +0 +LINE +8 +Layer 1 +10 +18.320800 +20 +11.169800 +11 +18.914850 +21 +11.458090 +0 +LINE +8 +Layer 1 +10 +18.914850 +20 +11.458090 +11 +19.819403 +21 +12.189185 +0 +LINE +8 +Layer 1 +10 +19.819403 +20 +12.189185 +11 +20.493612 +21 +13.156154 +0 +LINE +8 +Layer 1 +10 +20.493612 +20 +13.156154 +11 +20.934815 +21 +14.318045 +0 +LINE +8 +Layer 1 +10 +20.934815 +20 +14.318045 +11 +21.140350 +21 +15.633909 +0 +LINE +8 +Layer 1 +10 +21.140350 +20 +15.633909 +11 +21.107556 +21 +17.062795 +0 +LINE +8 +Layer 1 +10 +21.107556 +20 +17.062795 +11 +20.833771 +21 +18.563755 +0 +LINE +8 +Layer 1 +10 +20.833771 +20 +18.563755 +11 +20.316333 +21 +20.095836 +0 +LINE +8 +Layer 1 +10 +20.316333 +20 +20.095836 +11 +19.552580 +21 +21.618090 +0 +LINE +8 +Layer 1 +10 +19.552580 +20 +21.618090 +11 +18.589017 +21 +23.022259 +0 +LINE +8 +Layer 1 +10 +18.589017 +20 +23.022259 +11 +17.498507 +21 +24.215730 +0 +LINE +8 +Layer 1 +10 +17.498507 +20 +24.215730 +11 +16.317907 +21 +25.181103 +0 +LINE +8 +Layer 1 +10 +16.317907 +20 +25.181103 +11 +15.084072 +21 +25.900974 +0 +LINE +8 +Layer 1 +10 +15.084072 +20 +25.900974 +11 +13.833859 +21 +26.357941 +0 +LINE +8 +Layer 1 +10 +13.833859 +20 +26.357941 +11 +12.604122 +21 +26.534603 +0 +LINE +8 +Layer 1 +10 +12.604122 +20 +26.534603 +11 +11.431717 +21 +26.413557 +0 +LINE +8 +Layer 1 +10 +11.431717 +20 +26.413557 +11 +10.353500 +21 +25.977400 +0 +LINE +8 +Layer 1 +10 +10.353500 +20 +25.977400 +11 +9.448947 +21 +25.246305 +0 +LINE +8 +Layer 1 +10 +9.448947 +20 +25.246305 +11 +8.774738 +21 +24.279336 +0 +LINE +8 +Layer 1 +10 +8.774738 +20 +24.279336 +11 +8.333535 +21 +23.117445 +0 +LINE +8 +Layer 1 +10 +8.333535 +20 +23.117445 +11 +8.128000 +21 +21.801581 +0 +LINE +8 +Layer 1 +10 +8.128000 +20 +21.801581 +11 +8.160794 +21 +20.372695 +0 +LINE +8 +Layer 1 +10 +8.160794 +20 +20.372695 +11 +8.434579 +21 +18.871735 +0 +LINE +8 +Layer 1 +10 +8.434579 +20 +18.871735 +11 +8.952017 +21 +17.339654 +0 +LINE +8 +Layer 1 +10 +8.952017 +20 +17.339654 +11 +9.715770 +21 +15.817400 +0 +LINE +8 +Layer 1 +10 +9.715770 +20 +15.817400 +11 +10.982490 +21 +14.043990 +0 +LINE +8 +Layer 1 +10 +10.982490 +20 +14.043990 +11 +10.982500 +21 +9.815750 +0 +LINE +8 +Layer 1 +10 +10.982500 +20 +9.815750 +11 +5.129380 +21 +13.161600 +0 +LINE +8 +Layer 1 +10 +5.129380 +20 +13.161600 +11 +5.129380 +21 +34.136800 +0 +LINE +8 +Layer 1 +10 +5.129380 +20 +34.136800 +11 +3.076420 +21 +35.490900 +0 +LINE +8 +Layer 1 +10 +3.076420 +20 +35.490900 +11 +1.829078 +21 +32.846097 +0 +LINE +8 +Layer 1 +10 +1.829078 +20 +32.846097 +11 +0.907699 +21 +30.037475 +0 +LINE +8 +Layer 1 +10 +0.907699 +20 +30.037475 +11 +0.336853 +21 +27.087966 +0 +LINE +8 +Layer 1 +10 +0.336853 +20 +27.087966 +11 +0.141111 +21 +24.020500 +0 +LINE +8 +Layer 1 +10 +0.141111 +20 +24.020500 +11 +0.259421 +21 +21.627918 +0 +LINE +8 +Layer 1 +10 +0.259421 +20 +21.627918 +11 +0.606834 +21 +19.302903 +0 +LINE +8 +Layer 1 +10 +0.606834 +20 +19.302903 +11 +1.172076 +21 +17.056717 +0 +LINE +8 +Layer 1 +10 +1.172076 +20 +17.056717 +11 +1.943873 +21 +14.900622 +0 +LINE +8 +Layer 1 +10 +1.943873 +20 +14.900622 +11 +2.910952 +21 +12.845879 +0 +LINE +8 +Layer 1 +10 +2.910952 +20 +12.845879 +11 +4.062038 +21 +10.903749 +0 +LINE +8 +Layer 1 +10 +4.062038 +20 +10.903749 +11 +5.385858 +21 +9.085494 +0 +LINE +8 +Layer 1 +10 +5.385858 +20 +9.085494 +11 +6.871136 +21 +7.402375 +0 +LINE +8 +Layer 1 +10 +6.871136 +20 +7.402375 +11 +8.506600 +21 +5.865654 +0 +LINE +8 +Layer 1 +10 +8.506600 +20 +5.865654 +11 +10.280974 +21 +4.486592 +0 +LINE +8 +Layer 1 +10 +10.280974 +20 +4.486592 +11 +12.182986 +21 +3.276450 +0 +LINE +8 +Layer 1 +10 +12.182986 +20 +3.276450 +11 +14.201361 +21 +2.246491 +0 +LINE +8 +Layer 1 +10 +14.201361 +20 +2.246491 +11 +16.324825 +21 +1.407974 +0 +LINE +8 +Layer 1 +10 +16.324825 +20 +1.407974 +11 +18.542104 +21 +0.772163 +0 +LINE +8 +Layer 1 +10 +18.542104 +20 +0.772163 +11 +20.841924 +21 +0.350318 +0 +LINE +8 +Layer 1 +10 +20.841924 +20 +0.350318 +11 +23.213011 +21 +0.153700 +0 +LINE +8 +Layer 1 +10 +23.213011 +20 +0.153700 +11 +23.213000 +21 +2.617260 +0 +LINE +8 +Layer 1 +10 +23.213000 +20 +2.617260 +11 +18.320800 +21 +5.473940 +0 +LINE +8 +Layer 1 +10 +11.524200 +20 +38.810600 +11 +15.105970 +21 +36.687750 +0 +LINE +8 +Layer 1 +10 +15.105970 +20 +36.687750 +11 +15.036082 +21 +35.228830 +0 +LINE +8 +Layer 1 +10 +15.036082 +20 +35.228830 +11 +15.239894 +21 +34.085092 +0 +LINE +8 +Layer 1 +10 +15.239894 +20 +34.085092 +11 +15.795161 +21 +33.032263 +0 +LINE +8 +Layer 1 +10 +15.795161 +20 +33.032263 +11 +16.656940 +21 +32.090000 +0 +LINE +8 +Layer 1 +10 +16.656940 +20 +32.090000 +11 +17.780288 +21 +31.277959 +0 +LINE +8 +Layer 1 +10 +17.780288 +20 +31.277959 +11 +19.120262 +21 +30.615795 +0 +LINE +8 +Layer 1 +10 +19.120262 +20 +30.615795 +11 +20.631919 +21 +30.123165 +0 +LINE +8 +Layer 1 +10 +20.631919 +20 +30.123165 +11 +22.270317 +21 +29.819725 +0 +LINE +8 +Layer 1 +10 +22.270317 +20 +29.819725 +11 +23.990512 +21 +29.725130 +0 +LINE +8 +Layer 1 +10 +23.990512 +20 +29.725130 +11 +25.669665 +21 +29.866220 +0 +LINE +8 +Layer 1 +10 +25.669665 +20 +29.866220 +11 +27.199347 +21 +30.234689 +0 +LINE +8 +Layer 1 +10 +27.199347 +20 +30.234689 +11 +28.556219 +21 +30.797470 +0 +LINE +8 +Layer 1 +10 +28.556219 +20 +30.797470 +11 +29.716939 +21 +31.521491 +0 +LINE +8 +Layer 1 +10 +29.716939 +20 +31.521491 +11 +30.658168 +21 +32.373685 +0 +LINE +8 +Layer 1 +10 +30.658168 +20 +32.373685 +11 +31.356564 +21 +33.320980 +0 +LINE +8 +Layer 1 +10 +31.356564 +20 +33.320980 +11 +31.788788 +21 +34.330308 +0 +LINE +8 +Layer 1 +10 +31.788788 +20 +34.330308 +11 +31.931500 +21 +35.368600 +0 +LINE +8 +Layer 1 +10 +31.931500 +20 +35.368600 +11 +31.783502 +21 +36.515698 +0 +LINE +8 +Layer 1 +10 +31.783502 +20 +36.515698 +11 +31.369942 +21 +37.578955 +0 +LINE +8 +Layer 1 +10 +31.369942 +20 +37.578955 +11 +30.706996 +21 +38.539224 +0 +LINE +8 +Layer 1 +10 +30.706996 +20 +38.539224 +11 +29.810837 +21 +39.377363 +0 +LINE +8 +Layer 1 +10 +29.810837 +20 +39.377363 +11 +28.697644 +21 +40.074224 +0 +LINE +8 +Layer 1 +10 +28.697644 +20 +40.074224 +11 +27.383589 +21 +40.610664 +0 +LINE +8 +Layer 1 +10 +27.383589 +20 +40.610664 +11 +25.884849 +21 +40.967538 +0 +LINE +8 +Layer 1 +10 +25.884849 +20 +40.967538 +11 +24.217600 +21 +41.125700 +0 +LINE +8 +Layer 1 +10 +24.217600 +20 +41.125700 +11 +21.995387 +21 +40.990300 +0 +LINE +8 +Layer 1 +10 +21.995387 +20 +40.990300 +11 +20.434900 +21 +40.723800 +0 +LINE +8 +Layer 1 +10 +20.434900 +20 +40.723800 +11 +17.822830 +21 +42.392380 +0 +LINE +8 +Layer 1 +10 +17.822830 +20 +42.392380 +11 +24.025410 +21 +45.930470 +0 +LINE +8 +Layer 1 +10 +24.025410 +20 +45.930470 +11 +42.318610 +21 +35.298770 +0 +LINE +8 +Layer 1 +10 +42.318610 +20 +35.298770 +11 +44.415260 +21 +36.451930 +0 +LINE +8 +Layer 1 +10 +44.415260 +20 +36.451930 +11 +42.745892 +21 +38.852544 +0 +LINE +8 +Layer 1 +10 +42.745892 +20 +38.852544 +11 +40.770195 +21 +41.052504 +0 +LINE +8 +Layer 1 +10 +40.770195 +20 +41.052504 +11 +38.496365 +21 +43.018244 +0 +LINE +8 +Layer 1 +10 +38.496365 +20 +43.018244 +11 +35.932600 +21 +44.716200 +0 +LINE +8 +Layer 1 +10 +35.932600 +20 +44.716200 +11 +33.802795 +21 +45.809127 +0 +LINE +8 +Layer 1 +10 +33.802795 +20 +45.809127 +11 +31.616939 +21 +46.669700 +0 +LINE +8 +Layer 1 +10 +31.616939 +20 +46.669700 +11 +29.390439 +21 +47.302054 +0 +LINE +8 +Layer 1 +10 +29.390439 +20 +47.302054 +11 +27.138704 +21 +47.710322 +0 +LINE +8 +Layer 1 +10 +27.138704 +20 +47.710322 +11 +24.877140 +21 +47.898637 +0 +LINE +8 +Layer 1 +10 +24.877140 +20 +47.898637 +11 +22.621155 +21 +47.871132 +0 +LINE +8 +Layer 1 +10 +22.621155 +20 +47.871132 +11 +20.386157 +21 +47.631942 +0 +LINE +8 +Layer 1 +10 +20.386157 +20 +47.631942 +11 +18.187554 +21 +47.185200 +0 +LINE +8 +Layer 1 +10 +18.187554 +20 +47.185200 +11 +16.040752 +21 +46.535039 +0 +LINE +8 +Layer 1 +10 +16.040752 +20 +46.535039 +11 +13.961160 +21 +45.685593 +0 +LINE +8 +Layer 1 +10 +13.961160 +20 +45.685593 +11 +11.964185 +21 +44.640994 +0 +LINE +8 +Layer 1 +10 +11.964185 +20 +44.640994 +11 +10.065235 +21 +43.405378 +0 +LINE +8 +Layer 1 +10 +10.065235 +20 +43.405378 +11 +8.279716 +21 +41.982877 +0 +LINE +8 +Layer 1 +10 +8.279716 +20 +41.982877 +11 +6.623038 +21 +40.377625 +0 +LINE +8 +Layer 1 +10 +6.623038 +20 +40.377625 +11 +5.110606 +21 +38.593754 +0 +LINE +8 +Layer 1 +10 +5.110606 +20 +38.593754 +11 +3.757830 +21 +36.635400 +0 +LINE +8 +Layer 1 +10 +3.757830 +20 +36.635400 +11 +5.837000 +21 +35.325000 +0 +LINE +8 +Layer 1 +10 +5.837000 +20 +35.325000 +11 +11.524200 +21 +38.810600 +0 +LINE +8 +Layer 1 +10 +42.947600 +20 +27.252900 +11 +39.060070 +21 +25.217410 +0 +LINE +8 +Layer 1 +10 +39.060070 +20 +25.217410 +11 +37.863230 +21 +26.160901 +0 +LINE +8 +Layer 1 +10 +37.863230 +20 +26.160901 +11 +36.776294 +21 +26.573013 +0 +LINE +8 +Layer 1 +10 +36.776294 +20 +26.573013 +11 +35.603464 +21 +26.668273 +0 +LINE +8 +Layer 1 +10 +35.603464 +20 +26.668273 +11 +34.380881 +21 +26.464801 +0 +LINE +8 +Layer 1 +10 +34.380881 +20 +26.464801 +11 +33.144681 +21 +25.980720 +0 +LINE +8 +Layer 1 +10 +33.144681 +20 +25.980720 +11 +31.931005 +21 +25.234147 +0 +LINE +8 +Layer 1 +10 +31.931005 +20 +25.234147 +11 +30.775990 +21 +24.243205 +0 +LINE +8 +Layer 1 +10 +30.775990 +20 +24.243205 +11 +29.715776 +21 +23.026012 +0 +LINE +8 +Layer 1 +10 +29.715776 +20 +23.026012 +11 +28.786500 +21 +21.600691 +0 +LINE +8 +Layer 1 +10 +28.786500 +20 +21.600691 +11 +28.053288 +21 +20.056769 +0 +LINE +8 +Layer 1 +10 +28.053288 +20 +20.056769 +11 +27.551444 +21 +18.500766 +0 +LINE +8 +Layer 1 +10 +27.551444 +20 +18.500766 +11 +27.282197 +21 +16.976293 +0 +LINE +8 +Layer 1 +10 +27.282197 +20 +16.976293 +11 +27.246775 +21 +15.526962 +0 +LINE +8 +Layer 1 +10 +27.246775 +20 +15.526962 +11 +27.446407 +21 +14.196385 +0 +LINE +8 +Layer 1 +10 +27.446407 +20 +14.196385 +11 +27.882321 +21 +13.028173 +0 +LINE +8 +Layer 1 +10 +27.882321 +20 +13.028173 +11 +28.555746 +21 +12.065938 +0 +LINE +8 +Layer 1 +10 +28.555746 +20 +12.065938 +11 +29.467911 +21 +11.353291 +0 +LINE +8 +Layer 1 +10 +29.467911 +20 +11.353291 +11 +30.557082 +21 +10.932921 +0 +LINE +8 +Layer 1 +10 +30.557082 +20 +10.932921 +11 +31.735729 +21 +10.815889 +0 +LINE +8 +Layer 1 +10 +31.735729 +20 +10.815889 +11 +32.966383 +21 +10.988579 +0 +LINE +8 +Layer 1 +10 +32.966383 +20 +10.988579 +11 +34.211574 +21 +11.437376 +0 +LINE +8 +Layer 1 +10 +34.211574 +20 +11.437376 +11 +35.433832 +21 +12.148662 +0 +LINE +8 +Layer 1 +10 +35.433832 +20 +12.148662 +11 +36.595689 +21 +13.108822 +0 +LINE +8 +Layer 1 +10 +36.595689 +20 +13.108822 +11 +37.659675 +21 +14.304240 +0 +LINE +8 +Layer 1 +10 +37.659675 +20 +14.304240 +11 +38.588321 +21 +15.721301 +0 +LINE +8 +Layer 1 +10 +38.588321 +20 +15.721301 +11 +39.182370 +21 +17.138721 +0 +LINE +8 +Layer 1 +10 +39.182370 +20 +17.138721 +11 +39.671591 +21 +18.569241 +0 +LINE +8 +Layer 1 +10 +39.671591 +20 +18.569241 +11 +42.982551 +21 +20.482431 +0 +LINE +8 +Layer 1 +10 +42.982551 +20 +20.482431 +11 +42.965082 +21 +13.205321 +0 +LINE +8 +Layer 1 +10 +42.965082 +20 +13.205321 +11 +24.715482 +21 +2.547321 +0 +LINE +8 +Layer 1 +10 +24.715482 +20 +2.547321 +11 +24.724216 +21 +0.144911 +0 +LINE +8 +Layer 1 +10 +24.724216 +20 +0.144911 +11 +27.634270 +21 +0.404808 +0 +LINE +8 +Layer 1 +10 +27.634270 +20 +0.404808 +11 +30.523844 +21 +1.031619 +0 +LINE +8 +Layer 1 +10 +30.523844 +20 +1.031619 +11 +33.359353 +21 +2.031896 +0 +LINE +8 +Layer 1 +10 +33.359353 +20 +2.031896 +11 +36.107216 +21 +3.412191 +0 +LINE +8 +Layer 1 +10 +36.107216 +20 +3.412191 +11 +38.111769 +21 +4.724226 +0 +LINE +8 +Layer 1 +10 +38.111769 +20 +4.724226 +11 +39.942512 +21 +6.199614 +0 +LINE +8 +Layer 1 +10 +39.942512 +20 +6.199614 +11 +41.595378 +21 +7.822958 +0 +LINE +8 +Layer 1 +10 +41.595378 +20 +7.822958 +11 +43.066297 +21 +9.578865 +0 +LINE +8 +Layer 1 +10 +43.066297 +20 +9.578865 +11 +44.351199 +21 +11.451941 +0 +LINE +8 +Layer 1 +10 +44.351199 +20 +11.451941 +11 +45.446015 +21 +13.426791 +0 +LINE +8 +Layer 1 +10 +45.446015 +20 +13.426791 +11 +46.346676 +21 +15.488020 +0 +LINE +8 +Layer 1 +10 +46.346676 +20 +15.488020 +11 +47.049111 +21 +17.620235 +0 +LINE +8 +Layer 1 +10 +47.049111 +20 +17.620235 +11 +47.549253 +21 +19.808040 +0 +LINE +8 +Layer 1 +10 +47.549253 +20 +19.808040 +11 +47.843031 +21 +22.036042 +0 +LINE +8 +Layer 1 +10 +47.843031 +20 +22.036042 +11 +47.926376 +21 +24.288846 +0 +LINE +8 +Layer 1 +10 +47.926376 +20 +24.288846 +11 +47.795218 +21 +26.551057 +0 +LINE +8 +Layer 1 +10 +47.795218 +20 +26.551057 +11 +47.445489 +21 +28.807282 +0 +LINE +8 +Layer 1 +10 +47.445489 +20 +28.807282 +11 +46.873118 +21 +31.042125 +0 +LINE +8 +Layer 1 +10 +46.873118 +20 +31.042125 +11 +46.074037 +21 +33.240193 +0 +LINE +8 +Layer 1 +10 +46.074037 +20 +33.240193 +11 +45.044176 +21 +35.386091 +0 +LINE +8 +Layer 1 +10 +45.044176 +20 +35.386091 +11 +42.947526 +21 +34.232931 +0 +LINE +8 +Layer 1 +10 +42.947526 +20 +34.232931 +11 +42.947600 +21 +27.252900 + 0 +ENDSEC + 0 +EOF \ No newline at end of file diff --git a/app/openscad/thing-logos/fablab-cube2.svg b/app/openscad/thing-logos/fablab-cube2.svg new file mode 100644 index 0000000..7447232 --- /dev/null +++ b/app/openscad/thing-logos/fablab-cube2.svg @@ -0,0 +1,2676 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1009 + 9 +$FILLMODE + 70 + 0 + 9 +$SPLFRAME + 70 + 1 + 9 +$EXTMIN + 10 +0 + 20 +0 + 30 +0.0 + 9 +$EXTMAX + 10 +1058.33 + 20 +1058.33 + 30 +0.0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +LAYER + 70 +1 + 0 +LAYER + 2 +0 + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.1759 + 20 +5.23656 + 30 +0.0 + 11 +17.1759 + 21 +10.5765 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.1759 + 20 +10.5765 + 30 +0.0 + 11 +17.2227 + 21 +10.5958 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.2227 + 20 +10.5958 + 30 +0.0 + 11 +17.6871 + 21 +10.8204 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.6871 + 20 +10.8204 + 30 +0.0 + 11 +17.7326 + 21 +10.8465 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.7326 + 20 +10.8465 + 30 +0.0 + 11 +18.1805 + 21 +11.1111 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +18.1805 + 20 +11.1111 + 30 +0.0 + 11 +19.2112 + 21 +12.4395 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.2112 + 20 +12.4395 + 30 +0.0 + 11 +19.8189 + 21 +14.7616 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.8189 + 20 +14.7616 + 30 +0.0 + 11 +19.5309 + 21 +17.5093 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.5309 + 20 +17.5093 + 30 +0.0 + 11 +18.7206 + 21 +19.7101 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +18.7206 + 20 +19.7101 + 30 +0.0 + 11 +18.3307 + 21 +20.3715 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +18.3307 + 20 +20.3715 + 30 +0.0 + 11 +17.9393 + 21 +21.0344 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.9393 + 20 +21.0344 + 30 +0.0 + 11 +16.4042 + 21 +22.8079 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +16.4042 + 20 +22.8079 + 30 +0.0 + 11 +14.14 + 21 +24.3871 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.14 + 20 +24.3871 + 30 +0.0 + 11 +11.8153 + 21 +24.9825 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +11.8153 + 20 +24.9825 + 30 +0.0 + 11 +10.1548 + 21 +24.7234 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +10.1548 + 20 +24.7234 + 30 +0.0 + 11 +9.70689 + 21 +24.4588 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.70689 + 20 +24.4588 + 30 +0.0 + 11 +9.25767 + 21 +24.1956 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.25767 + 20 +24.1956 + 30 +0.0 + 11 +8.22551 + 21 +22.8672 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +8.22551 + 20 +22.8672 + 30 +0.0 + 11 +7.61919 + 21 +20.5438 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +7.61919 + 20 +20.5438 + 30 +0.0 + 11 +7.9072 + 21 +17.7974 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +7.9072 + 20 +17.7974 + 30 +0.0 + 11 +8.71746 + 21 +15.5966 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +8.71746 + 20 +15.5966 + 30 +0.0 + 11 +9.10883 + 21 +14.9338 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.10883 + 20 +14.9338 + 30 +0.0 + 11 +9.1984 + 21 +14.7822 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.1984 + 20 +14.7822 + 30 +0.0 + 11 +10.1892 + 21 +13.3973 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +10.1892 + 20 +13.3973 + 30 +0.0 + 11 +10.2967 + 21 +13.2719 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +10.2967 + 20 +13.2719 + 30 +0.0 + 11 +10.2967 + 21 +9.30727 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +10.2967 + 20 +9.30727 + 30 +0.0 + 11 +4.80935 + 21 +12.4437 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +4.80935 + 20 +12.4437 + 30 +0.0 + 11 +4.80935 + 21 +32.1083 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +4.80935 + 20 +32.1083 + 30 +0.0 + 11 +2.88423 + 21 +33.3775 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +2.88423 + 20 +33.3775 + 30 +0.0 + 11 +2.44602 + 21 +32.5796 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +2.44602 + 20 +32.5796 + 30 +0.0 + 11 +0.850251 + 21 +28.2663 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +0.850251 + 20 +28.2663 + 30 +0.0 + 11 +0.132292 + 21 +24.0357 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +0.132292 + 20 +24.0357 + 30 +0.0 + 11 +0.132292 + 21 +22.6246 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +0.132292 + 20 +22.6246 + 30 +0.0 + 11 +0.132292 + 21 +21.5194 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +0.132292 + 20 +21.5194 + 30 +0.0 + 11 +0.567754 + 21 +18.2025 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +0.567754 + 20 +18.2025 + 30 +0.0 + 11 +1.82177 + 21 +14.0753 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +1.82177 + 20 +14.0753 + 30 +0.0 + 11 +3.80753 + 21 +10.3284 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +3.80753 + 20 +10.3284 + 30 +0.0 + 11 +6.44095 + 21 +7.04592 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +6.44095 + 20 +7.04592 + 30 +0.0 + 11 +9.63799 + 21 +4.3119 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.63799 + 20 +4.3119 + 30 +0.0 + 11 +13.3132 + 21 +2.21175 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +13.3132 + 20 +2.21175 + 30 +0.0 + 11 +17.3826 + 21 +0.829578 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.3826 + 20 +0.829578 + 30 +0.0 + 11 +20.6637 + 21 +0.286632 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +20.6637 + 20 +0.286632 + 30 +0.0 + 11 +21.762 + 21 +0.249425 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +21.762 + 20 +0.249425 + 30 +0.0 + 11 +21.762 + 21 +2.55902 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +21.762 + 20 +2.55902 + 30 +0.0 + 11 +17.1759 + 21 +5.23656 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +10.8038 + 20 +36.4906 + 30 +0.0 + 11 +14.1621 + 21 +34.4992 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.1621 + 20 +34.4992 + 30 +0.0 + 11 +14.1456 + 21 +34.3628 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.1456 + 20 +34.3628 + 30 +0.0 + 11 +14.1042 + 21 +33.6903 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.1042 + 20 +33.6903 + 30 +0.0 + 11 +14.0959 + 21 +33.2727 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.0959 + 20 +33.2727 + 30 +0.0 + 11 +14.0959 + 21 +33.1322 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.0959 + 20 +33.1322 + 30 +0.0 + 11 +14.1015 + 21 +32.6168 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.1015 + 20 +32.6168 + 30 +0.0 + 11 +14.807 + 21 +31.0734 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +14.807 + 20 +31.0734 + 30 +0.0 + 11 +16.6688 + 21 +29.428 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +16.6688 + 20 +29.428 + 30 +0.0 + 11 +19.3421 + 21 +28.3463 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.3421 + 20 +28.3463 + 30 +0.0 + 11 +21.7041 + 21 +27.9659 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +21.7041 + 20 +27.9659 + 30 +0.0 + 11 +22.491 + 21 +27.9728 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +22.491 + 20 +27.9728 + 30 +0.0 + 11 +23.2434 + 21 +27.9797 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +23.2434 + 20 +27.9797 + 30 +0.0 + 11 +25.4992 + 21 +28.451 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +25.4992 + 20 +28.451 + 30 +0.0 + 11 +27.8584 + 21 +29.6568 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +27.8584 + 20 +29.6568 + 30 +0.0 + 11 +29.3963 + 21 +31.3435 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.3963 + 20 +31.3435 + 30 +0.0 + 11 +29.9406 + 21 +32.7849 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.9406 + 20 +32.7849 + 30 +0.0 + 11 +29.9365 + 21 +33.2631 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.9365 + 20 +33.2631 + 30 +0.0 + 11 +29.9324 + 21 +33.7826 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.9324 + 20 +33.7826 + 30 +0.0 + 11 +29.4087 + 21 +35.337 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.4087 + 20 +35.337 + 30 +0.0 + 11 +27.9466 + 21 +37.0223 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +27.9466 + 20 +37.0223 + 30 +0.0 + 11 +25.6715 + 21 +38.1787 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +25.6715 + 20 +38.1787 + 30 +0.0 + 11 +23.4487 + 21 +38.6387 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +23.4487 + 20 +38.6387 + 30 +0.0 + 11 +22.7046 + 21 +38.6609 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +22.7046 + 20 +38.6609 + 30 +0.0 + 11 +22.4331 + 21 +38.669 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +22.4331 + 20 +38.669 + 30 +0.0 + 11 +21.6187 + 21 +38.6362 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +21.6187 + 20 +38.6362 + 30 +0.0 + 11 +20.621 + 21 +38.5339 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +20.621 + 20 +38.5339 + 30 +0.0 + 11 +19.7776 + 21 +38.4006 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.7776 + 20 +38.4006 + 30 +0.0 + 11 +19.3118 + 21 +38.3134 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.3118 + 20 +38.3134 + 30 +0.0 + 11 +19.1575 + 21 +38.2834 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +19.1575 + 20 +38.2834 + 30 +0.0 + 11 +16.7087 + 21 +39.8473 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +16.7087 + 20 +39.8473 + 30 +0.0 + 11 +22.524 + 21 +43.1641 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +22.524 + 20 +43.1641 + 30 +0.0 + 11 +39.6737 + 21 +33.197 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +39.6737 + 20 +33.197 + 30 +0.0 + 11 +41.6387 + 21 +34.2787 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +41.6387 + 20 +34.2787 + 30 +0.0 + 11 +41.166 + 21 +35.0573 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +41.166 + 20 +35.0573 + 30 +0.0 + 11 +38.2214 + 21 +38.5921 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +38.2214 + 20 +38.5921 + 30 +0.0 + 11 +34.5323 + 21 +41.541 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +34.5323 + 20 +41.541 + 30 +0.0 + 11 +33.6875 + 21 +42.0261 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +33.6875 + 20 +42.0261 + 30 +0.0 + 11 +32.7298 + 21 +42.5785 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +32.7298 + 20 +42.5785 + 30 +0.0 + 11 +29.6402 + 21 +43.8573 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.6402 + 20 +43.8573 + 30 +0.0 + 11 +25.4427 + 21 +44.8331 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +25.4427 + 20 +44.8331 + 30 +0.0 + 11 +21.2066 + 21 +44.9848 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +21.2066 + 20 +44.9848 + 30 +0.0 + 11 +17.0505 + 21 +44.341 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +17.0505 + 20 +44.341 + 30 +0.0 + 11 +13.0886 + 21 +42.9355 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +13.0886 + 20 +42.9355 + 30 +0.0 + 11 +9.43543 + 21 +40.798 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +9.43543 + 20 +40.798 + 30 +0.0 + 11 +6.20945 + 21 +37.9596 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +6.20945 + 20 +37.9596 + 30 +0.0 + 11 +4.10242 + 21 +35.3854 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +4.10242 + 20 +35.3854 + 30 +0.0 + 11 +3.52364 + 21 +34.451 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +3.52364 + 20 +34.451 + 30 +0.0 + 11 +5.47218 + 21 +33.2218 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +5.47218 + 20 +33.2218 + 30 +0.0 + 11 +10.8038 + 21 +36.4906 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +40.2636 + 20 +25.655 + 30 +0.0 + 11 +36.6187 + 21 +23.7464 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.6187 + 20 +23.7464 + 30 +0.0 + 11 +36.5855 + 21 +23.7532 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.5855 + 20 +23.7532 + 30 +0.0 + 11 +36.4134 + 21 +23.8814 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.4134 + 20 +23.8814 + 30 +0.0 + 11 +36.0758 + 21 +24.1584 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.0758 + 20 +24.1584 + 30 +0.0 + 11 +35.7297 + 21 +24.4519 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +35.7297 + 20 +24.4519 + 30 +0.0 + 11 +35.541 + 21 +24.6049 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +35.541 + 20 +24.6049 + 30 +0.0 + 11 +35.4969 + 21 +24.631 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +35.4969 + 20 +24.631 + 30 +0.0 + 11 +35.0421 + 21 +24.886 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +35.0421 + 20 +24.886 + 30 +0.0 + 11 +33.3775 + 21 +25.1079 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +33.3775 + 20 +25.1079 + 30 +0.0 + 11 +31.072 + 21 +24.463 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +31.072 + 20 +24.463 + 30 +0.0 + 11 +28.852 + 21 +22.8327 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +28.852 + 20 +22.8327 + 30 +0.0 + 11 +27.361 + 21 +21.0261 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +27.361 + 20 +21.0261 + 30 +0.0 + 11 +26.9875 + 21 +20.355 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +26.9875 + 20 +20.355 + 30 +0.0 + 11 +26.6099 + 21 +19.6784 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +26.6099 + 20 +19.6784 + 30 +0.0 + 11 +25.8286 + 21 +17.4501 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +25.8286 + 20 +17.4501 + 30 +0.0 + 11 +25.5433 + 21 +14.6623 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +25.5433 + 20 +14.6623 + 30 +0.0 + 11 +26.1386 + 21 +12.3197 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +26.1386 + 20 +12.3197 + 30 +0.0 + 11 +27.1749 + 21 +10.9995 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +27.1749 + 20 +10.9995 + 30 +0.0 + 11 +27.6269 + 21 +10.7487 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +27.6269 + 20 +10.7487 + 30 +0.0 + 11 +28.0844 + 21 +10.4938 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +28.0844 + 20 +10.4938 + 30 +0.0 + 11 +29.7518 + 21 +10.2457 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +29.7518 + 20 +10.2457 + 30 +0.0 + 11 +32.0725 + 21 +10.8286 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +32.0725 + 20 +10.8286 + 30 +0.0 + 11 +34.3076 + 21 +12.3954 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +34.3076 + 20 +12.3954 + 30 +0.0 + 11 +35.8055 + 21 +14.1786 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +35.8055 + 20 +14.1786 + 30 +0.0 + 11 +36.1763 + 21 +14.8442 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.1763 + 20 +14.8442 + 30 +0.0 + 11 +36.255 + 21 +14.9862 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.255 + 20 +14.9862 + 30 +0.0 + 11 +36.449 + 21 +15.4327 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.449 + 20 +15.4327 + 30 +0.0 + 11 +36.733 + 21 +16.1727 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.733 + 20 +16.1727 + 30 +0.0 + 11 +36.9919 + 21 +16.9182 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +36.9919 + 20 +16.9182 + 30 +0.0 + 11 +37.1408 + 21 +17.3661 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +37.1408 + 20 +17.3661 + 30 +0.0 + 11 +37.192 + 21 +17.5135 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +37.192 + 20 +17.5135 + 30 +0.0 + 11 +40.2967 + 21 +19.3077 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +40.2967 + 20 +19.3077 + 30 +0.0 + 11 +40.2802 + 21 +12.485 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +40.2802 + 20 +12.485 + 30 +0.0 + 11 +23.1703 + 21 +2.49287 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +23.1703 + 20 +2.49287 + 30 +0.0 + 11 +23.1786 + 21 +0.241157 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +23.1786 + 20 +0.241157 + 30 +0.0 + 11 +24.0867 + 21 +0.265961 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +24.0867 + 20 +0.265961 + 30 +0.0 + 11 +28.615 + 21 +1.07211 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +28.615 + 20 +1.07211 + 30 +0.0 + 11 +33.0081 + 21 +2.81395 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +33.0081 + 20 +2.81395 + 30 +0.0 + 11 +33.8501 + 21 +3.30454 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +33.8501 + 20 +3.30454 + 30 +0.0 + 11 +34.8038 + 21 +3.86401 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +34.8038 + 20 +3.86401 + 30 +0.0 + 11 +37.4456 + 21 +5.91866 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +37.4456 + 20 +5.91866 + 30 +0.0 + 11 +40.3737 + 21 +9.0854 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +40.3737 + 20 +9.0854 + 30 +0.0 + 11 +42.605 + 21 +12.6931 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +42.605 + 20 +12.6931 + 30 +0.0 + 11 +44.1082 + 21 +16.6247 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +44.1082 + 20 +16.6247 + 30 +0.0 + 11 +44.8525 + 21 +20.7643 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +44.8525 + 20 +20.7643 + 30 +0.0 + 11 +44.807 + 21 +24.9976 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +44.807 + 20 +24.9976 + 30 +0.0 + 11 +43.9431 + 21 +29.2075 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +43.9431 + 20 +29.2075 + 30 +0.0 + 11 +42.7524 + 21 +32.3136 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +42.7524 + 20 +32.3136 + 30 +0.0 + 11 +42.2286 + 21 +33.2796 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +42.2286 + 20 +33.2796 + 30 +0.0 + 11 +40.2636 + 21 +32.1979 + 31 +0.0 + 0 +LINE + 8 +0 + 62 + 0 + 10 +40.2636 + 20 +32.1979 + 30 +0.0 + 11 +40.2636 + 21 +25.655 + 31 +0.0 + 0 +ENDSEC + 0 +EOF diff --git a/app/openscad/write/Write.scad b/app/openscad/write/Write.scad new file mode 100644 index 0000000..4fa9a92 --- /dev/null +++ b/app/openscad/write/Write.scad @@ -0,0 +1,378 @@ +/* Version 3 + Added support for font selection (default is Letters.dxf) + Added WriteCube module + Added Rotate for text (rotates on the plane of the text) + Added writesphere + Added space= (spacing between characters in char widths) def=1 + Added writecylinder() + + By Harlan Martin + harlan@sutlog.com + January 2012 + + (The file TestWrite.scad gives More usage examples) + (This module requires the file Letters.dxf to reside in the same folder) + (The file Letters.dfx was created with inkscape..Each letter is in its own layer) + (This module seperates each letter in the string and imports it from Letters.dfx) + +*/ + + pi=3.1415926535897932384626433832795028841971693993751058209; + pi2=pi*2; + + +// These control the default values for write() writesphere() writecube() +// if the parameters are not included in the call. Feel free to set your own +// defaults. + +//default settings + center=false; + h = 4; //mm letter height + t = 1; //mm letter thickness + space =1; //extra space between characters in (character widths) + rotate=0; // text rotation (clockwise) + font = "Letters.dxf"; //default for aditional fonts + + +// write cube defaults + face = "front"; // default face (top,bottom,left,right,back,front) + up =0; //mm up from center on face of cube + down=0; + right =0; //mm left from center on face of cube + left=0; + + +// write sphere defaults + rounded=false; //default for rounded letters on writesphere + north=0; // intial text position (I suggest leave these 0 defaults) + south=0; + east=0; + west=0; + spin=0; +// writecylinder defaults + middle=0; //(mm toward middle of circle) + ccw=false; //write on top or bottom in a ccw direction + r1=0; //(not implimented yet) + r2=0; //(not implimented yet) + + + +// Contact me if your interested in how to make your own font files +// Its tedious and time consuming, but not very hard + + +module writecylinder(text,where,radius,height){ + wid=(.125* h *5.5 * space); + widall=wid*(len(text)-1)/2; + //angle that measures width of letters on sphere + function NAngle(radius)=(wid/(pi2*radius))*360; + //angle of half width of text + function mmangle(radius)=(widall/(pi2*radius)*360); + + if ((face=="top")||(face=="bottom") ){ + if (face=="top" ){ + if (center==true){ + writecircle(text,where+[0,0,height/2],radius-h,rotate=rotate,font=font,h=h,t=t, + space=space,east=east,west=west,middle=middle,ccw=ccw); + }else{ + writecircle(text,where+[0,0,height],radius-h,rotate=rotate,font=font,h=h,t=t, + space=space,east=east,west=west,middle=middle,ccw=ccw); + } + }else{ + rotate(180,[1,0,0]) + if (center==true){ + writecircle(text,where+[0,0,height/2],radius-h,rotate=rotate,font=font,h=h,t=t, + space=space,east=east,west=west,middle=middle,ccw=ccw); + }else{ + writecircle(text,where+[0,0,0],radius-h,rotate=rotate,font=font,h=h,t=t, + space=space,east=east,west=west,middle=middle,ccw=ccw); + } + } + + }else{ +// if (radius>0){ + if (center==true) { + rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1]) + translate(where) + writethecylinder(text,where,radius,height,r1=radius,r2=radius,h=h, + rotate=rotate,t=t,font=font,face=face,up=up,down=down, + east=east,west=west,center=center,space=space,rounded=rounded); + } else{ + rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1]) + translate(where+[0,0,height/2]) + writethecylinder(text,where,radius,height,r1=radius,r2=radius,h=h, + rotate=rotate,t=t,font=font,face=face,up=up,down=down, + east=east,west=west,center=center,space=space,rounded=rounded); + } +// the remarked out code is for cone shaped cylinders (not complete) +// }else{ +// if (center==true) { +// rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1]) +// translate(where) +// writethecylinder(text,where,radius,height,r1=r1,r2=r2,h=h, +// rotate=rotate,t=t,font=font,face=face,up=up,down=down, +// east=east,west=west,center=center,space=space,rounded=rounded); +// } else{ +// rotate(-mmangle(radius)*(1-abs(rotate)/90),[0,0,1]) +// translate(where+[0,0,height/2]) +// writethecylinder(text,where,radius,height,r1=r1,r2=r2,h=h, +// rotate=rotate,t=t,font=font,face=face,up=up,down=down, +// east=east,west=west,center=center,space=space,rounded=rounded); +// } +// } + } +} +module writecircle(text,where,radius){ + wid=(.125* h *5.5 * space); + widall=wid*(len(text)-1)/2; + //angle that measures width of letters on sphere + function NAngle(radius)=(wid/(pi2*radius))*360; + //angle of half width of text + function mmangle(radius)=(widall/(pi2*radius)*360); + + if (ccw==true){ + rotate(-rotate+east-west,[0,0,1]){ + rotate(-mmangle(radius-middle),[0,0,1]){ + translate(where) + for (r=[0:len(text)-1]){ + rotate(-90+r*NAngle(radius-middle),[0,0,1]) // bottom out=-270+r + translate([radius-middle,0,0]) + //rotate(90,[1,0,0]) + //rotate(90,[0,1,0]) + rotate(-270,[0,0,1]) // flip text (botom out = -270) + write(text[r],center=true,h=h,t=t,font=font); + } + } + } + }else{ + rotate(-rotate-east+west,[0,0,1]){ + rotate(mmangle(radius-middle),[0,0,1]){ + translate(where) + for (r=[0:len(text)-1]){ + rotate(90-r*NAngle(radius-middle),[0,0,1]) // bottom out=-270+r + translate([radius-middle,0,0]) + //rotate(90,[1,0,0]) + //rotate(90,[0,1,0]) + rotate(270,[0,0,1]) // flip text (botom out = -270) + write(text[r],center=true,h=h,t=t,font=font); + } + } + } + } + +} +module writethecylinder(text,where,radius,height,r1,r2){ + wid=(.125* h *5.5 * space); + widall=wid*(len(text)-1)/2; + //angle that measures width of letters on sphere + function NAngle(radius)=(wid/(pi2*radius))*360*(1-abs(rotate)/90); + //angle of half width of text + + function mmangle(radius)=(widall/(pi2*radius)*360); + translate([0,0,up-down]) + rotate(east-west,[0,0,1]) + for (r=[0:len(text)-1]){ + rotate(-90+(r*NAngle(radius)),[0,0,1]) + translate([radius,0,-r*((rotate)/90*wid)+(len(text)-1)/2*((rotate)/90*wid)]) + rotate(90,[1,0,0]) + rotate(90,[0,1,0]) + write(text[r],center=true,h=h,rotate=rotate,t=t,font=font); + //echo("zloc=",height/2-r*((rotate)/90*wid)+(len(text)-1)/2*((rotate)/90*wid)); + } + +} + + +module writesphere(text,where,radius){ + wid=(.125* h *5.5 * space); + widall=wid*(len(text)-1)/2; + + echo("-----------------",widall,wid,mmangle(radius)); + //angle that measures width of letters on sphere + function NAngle(radius)=(wid/(pi2*radius))*360; + //angle of half width of text + function mmangle(radius)=(widall/(pi2*radius)*360); + + rotate(east-west,[0,0,1]){ + rotate(south-north,[1,0,0]){ + rotate(spin,[0,1,0]){ + rotate(-mmangle(radius),[0,0,1]){ + if ( rounded== false ){ + translate(where) + for (r=[0:len(text)-1]){ + rotate(-90+r*NAngle(radius),[0,0,1]) + translate([radius,0,0]) + rotate(90,[1,0,0]) + rotate(90,[0,1,0]) + write(text[r],center=true,h=h,rotate=rotate,t=t,font=font); + } + }else{ + difference(){ + translate(where) + for (r=[0:len(text)-1]){ + rotate(-90+r*NAngle(radius),[0,0,1]) + translate([radius,0,0]) + rotate(90,[1,0,0]) + rotate(90,[0,1,0]) + write(text[r],center=true,h=h,rotate=rotate,t=t*2+h,font=font); + } + difference(){ //rounded outside + sphere(radius+(t*2+h)*2); + sphere(radius+t/2); + } + sphere(radius-t/2); // rounded inside for indented text + } + } + } +}}} +} + + +module writecube(text,where,size){ + if (str(size)[0] != "["){ + // its a square cube (size was not a matrix so make it one) + writethecube(text,where,[size,size,size],h=h,rotate=rotate,space=space, + t=t,font=font,face=face,up=up,down=down,right=right,left=left); + + }else{ + // its not square + writethecube(text,where,size,h=h,rotate=rotate,space=space, + t=t,font=font,face=face,up=up,down=down,right=right,left=left); + } +} +// I split the writecube module into 2 pieces.. easier to add features later +module writethecube(text,where,size){ + if (face=="front") { + translate([where[0]+right-left,where[1]-size[1]/2,where[2]+up-down]) + rotate(90,[1,0,0]) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } + if (face=="back") { + translate([where[0]+right-left,where[1]+size[1]/2,where[2]+up-down]) + rotate(90,[1,0,0]) // rotate around the x axis + rotate(180,[0,1,0]) // rotate around the y axis (z before rotation) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } + if (face=="left") { + translate([where[0]-size[0]/2,where[1]-right+left,where[2]+up-down ]) + rotate(90,[1,0,0]) // rotate around the x axis + rotate(90,[0,-1,0]) // rotate around the y axis (z before rotation) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } + if (face=="right") { + translate([where[0]+size[0]/2,where[1]+right-left,where[2] +up-down]) + rotate(90,[1,0,0]) // rotate around the x axis + rotate(90,[0,1,0]) // rotate around the y axis (z before rotation) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } + if (face=="top") { + translate([where[0]+right-left,where[1]+up-down,where[2]+size[2]/2 ]) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } + if (face=="bottom") { + translate([where[0]+right-left,where[1]-up+down,where[2]-size[2]/2 ]) + rotate(180,[1,0,0]) + write(text,center=true,h=h,rotate=rotate,t=t,font=font); + } +} + +module write(word){ + + echo (h); + echo (word); + echo ("There are " ,len(word) ," letters in this string"); +// echo ("The second letter is ",word[1]); +// echo (str(word[0],"_")); +rotate(rotate,[0,0,-1]){ + for (r = [0:len(word)]){ // count off each character + // if the letter is lower case, add an underscore to the end for file lookup + if ((word[r] == "a" ) || (word[r]== "b") || (word[r]== "c") + || (word[r]== "d") || (word[r]== "e") || (word[r]== "f") + || (word[r]== "g") || (word[r]== "h") || (word[r]== "i") + || (word[r]== "j") || (word[r]== "k") || (word[r]== "l") + || (word[r]== "m") || (word[r]== "n") || (word[r]== "o") + || (word[r]== "p") || (word[r]== "q") || (word[r]== "r") + || (word[r]== "s") || (word[r]== "t") || (word[r]== "u") + || (word[r]== "v") || (word[r]== "w") || (word[r]== "x") + || (word[r]== "y" )|| (word[r]== "z")){ + if (center == true) { + translate([0,-h/2,0]){ + scale([.125*h,.125*h,t]){ + translate([ (-len(word)*5.5*space/2) + (r*5.5*space),0,0]) + linear_extrude(height=1,convexity=10,center=true){ + import(file = font,layer=str(word[r],"_")); + } + } + } + }else{ + translate([0,0,t/2]){ + scale([.125*h,.125*h,t]){ + translate([r*5.5*space,0,0]) + linear_extrude(height=1,convexity=10,center=true){ + import(file = font,layer=str(word[r],"_")); + } + } + } + } + + }else{ + if (center == true) { + translate([0,-h/2,0]){ + scale([.125*h,.125*h,t]){ + translate([ (-len(word)*5.5*space/2) + (r*5.5*space),0,0]) + linear_extrude(height=1,convexity=10,center=true){ + import(file = font,layer=str(word[r])); + } + } + } + }else{ + translate([0,0,t/2]){ + scale([.125*h,.125*h,t]){ + translate([r*5.5*space,0,0]) + linear_extrude(height=1,convexity=10,center=true){ + import(file = font,layer=str(word[r])); + } + } + } + } + } + } +} +} + +/*writecylinder test +translate([0,0,0]) +%cylinder(r=20,h=40,center=true); +color([1,0,0]) +writecylinder("rotate=90",[0,0,0],20,40,center=true,down=0,rotate=90); +writecylinder("rotate = 30,east = 90",[0,0,0],20,40,center=true,down=0,rotate=30,east=90); +writecylinder("ccw = true",[0,0,0],20,40,center=true,down=0,face="top",ccw=true); +writecylinder("middle = 8",[0,0,0],20,40,h=3,center=true,down=0,face="top",middle=8); +writecylinder("face = top",[0,0,0],20,40,center=true,down=0,face="top"); +writecylinder("east=90",[0,0,0],20,40,h=3,center=true,down=0,face="top",east=90); +writecylinder("west=90",[0,0,0],20,40,h=3,center=true,down=0,face="top",ccw=true,west=90); +writecylinder("face = bottom",[0,0,0],20,40,center=true,down=0,face="bottom"); +*/ +/*writesphere test +sphere(20); +color([1,0,0]) +writesphere("Hello World",[0,0,0],20,t=1,h=6); +*/ +/* writecube test +translate([30,30,30]) +cube([10,15,30],center=true); +write("hello",center=true,rotate =30); +color([1,0,0]) +writecube( "front",[30,30,30],[10,15,30],h=5,rotate=-90); +color([0,1,0]) +writecube( "back",[30,30,30],size=[10,15,30],h=5,face="back",rotate=90,t=4); +color([0,0,1]) +writecube( "left",[30,30,30],[10,15,30],h=5,face="left",up=5); +color([1,1,0]) +writecube( "right",where=[30,30,30],size=[10,15,30],h=5,face="right",rotate=55); +color([1,0,1]) +writecube( "top",where=[30,30,30],size=[10,15,30],h=5,face="top"); +color([1,1,1]) +writecube( "bttm",where=[30,30,30],size=[10,15,30],h=5,face="bottom",rotate=90); +*/ + diff --git a/app/openscad/write/orbitron.dxf b/app/openscad/write/orbitron.dxf new file mode 100644 index 0000000..d5b14c9 --- /dev/null +++ b/app/openscad/write/orbitron.dxf @@ -0,0 +1,16730 @@ +999 +DXF created by Inkscape + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1014 + 9 +$HANDSEED + 5 +FFFF + 9 +$MEASUREMENT + 70 + 1 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +330 +0 +100 +AcDbSymbolTable + 70 + 4 + 0 +VPORT + 5 +2E +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*ACTIVE + 70 + 0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +210.0 + 22 +148.5 + 13 +0.0 + 23 +0.0 + 14 +10.0 + 24 +10.0 + 15 +10.0 + 25 +10.0 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +341.0 + 41 +1.24 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +LTYPE + 5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYBLOCK + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYLAYER + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +100 +AcDbSymbolTable + 70 +94 + 0 +LAYER + 5 +50 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +51 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +A + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +52 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +B + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +53 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +C + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +54 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +D + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +55 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +E + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +56 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +F + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +57 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +G + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +58 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +H + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +59 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +I + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5a +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +J + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5b +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +K + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5c +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +L + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5d +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +M + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5e +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +N + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +5f +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +O + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +60 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +P + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +61 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Q + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +62 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +R + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +63 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +S + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +64 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +T + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +65 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +U + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +66 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +V + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +67 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +W + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +68 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +X + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +69 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Y + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6a +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Z + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6b +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +a_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6c +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +b_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6d +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +c_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6e +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +d_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +6f +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +e_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +70 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +f_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +71 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +g_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +72 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +h_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +73 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +i_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +74 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +j_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +75 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +k_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +76 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +l_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +77 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +m_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +78 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +n_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +79 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +o_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7a +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +p_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7b +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +q_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7c +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +r_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7d +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +s_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7e +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +t_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +7f +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +u_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +80 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +v_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +81 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +w_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +82 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +x_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +83 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +y_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +84 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +z_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +85 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +1 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +86 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +2 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +87 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +3 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +88 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +4 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +89 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +5 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8a +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +6 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8b +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +7 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8c +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +8 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8d +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +9 + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8e +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +~ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +8f +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +` + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +90 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +! + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +91 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +@ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +92 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +# + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +93 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +$ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +94 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +% + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +95 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +^ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +96 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +& + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +97 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +* + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +98 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +( + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +99 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +) + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9a +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +_ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9b +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +- + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9c +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 ++ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9d +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 += + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9e +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +{ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +9f +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +} + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a0 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +[ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +] + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +| + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a3 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +\ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a4 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +: + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a5 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +; + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a6 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +' + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a7 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +" + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a8 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +, + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +a9 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +. + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +aa +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +/ + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +ab +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +< + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +ac +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +> + 70 +0 + 6 +CONTINUOUS + 0 +LAYER + 5 +ad +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +? + 70 +0 + 6 +CONTINUOUS + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +STYLE + 5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +STANDARD + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +2.5 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +APPID + 5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +ISO-25 + 70 + 0 + 3 + + 4 + + 5 + + 6 + + 7 + + 40 +1.0 + 41 +2.5 + 42 +0.625 + 43 +3.75 + 44 +1.25 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 +140 +2.5 +141 +2.5 +142 +0.0 +143 +0.03937007874016 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.625 + 71 + 0 + 72 + 0 + 73 + 0 + 74 + 0 + 75 + 0 + 76 + 0 + 77 + 1 + 78 + 8 +170 + 0 +171 + 3 +172 + 1 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 +270 + 2 +271 + 2 +272 + 2 +273 + 2 +274 + 3 +340 +11 +275 + 0 +280 + 0 +281 + 0 +282 + 0 +283 + 0 +284 + 8 +285 + 0 +286 + 0 +287 + 3 +288 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +BLOCK_RECORD + 5 +1F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*MODEL_SPACE + 0 +BLOCK_RECORD + 5 +1B +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*PAPER_SPACE + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*MODEL_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*MODEL_SPACE + 1 + + 0 +ENDBLK + 5 +21 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*PAPER_SPACE + 1 + + 0 +ENDBLK + 5 +1D +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +LWPOLYLINE + 5 +100 +100 +AcDbEntity + 8 +A + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519163 + 20 +8.015482 + 30 +0.0 + 10 +4.811996 + 20 +7.699392 + 30 +0.0 + 10 +5.009658 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +4.318271 + 20 +0.000293 + 30 +0.0 + 10 +4.318271 + 20 +2.845253 + 30 +0.0 + 10 +0.762078 + 20 +2.845253 + 30 +0.0 + 10 +0.762078 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917322 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +101 +100 +AcDbEntity + 8 +A + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +4.318271 + 20 +4.064129 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917322 + 20 +6.909088 + 30 +0.0 + 10 +0.807940 + 20 +6.835706 + 30 +0.0 + 10 +0.762078 + 20 +6.660697 + 30 +0.0 + 10 +0.762078 + 20 +4.064129 + 30 +0.0 + 10 +4.318271 + 20 +4.064129 + 30 +0.0 + 0 +LWPOLYLINE + 5 +102 +100 +AcDbEntity + 8 +B + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +4.776899 + 20 +4.369020 + 30 +0.0 + 10 +4.999215 + 20 +3.894974 + 30 +0.0 + 10 +5.080282 + 20 +3.285192 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009765 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +3.951369 + 20 +8.128307 + 30 +0.0 + 10 +4.307721 + 20 +8.015482 + 30 +0.0 + 10 +4.600553 + 20 +7.699392 + 30 +0.0 + 10 +4.798108 + 20 +7.230862 + 30 +0.0 + 10 +4.868624 + 20 +6.660697 + 30 +0.0 + 10 +4.868624 + 20 +5.001193 + 30 +0.0 + 10 +4.776899 + 20 +4.369020 + 30 +0.0 + 0 +LWPOLYLINE + 5 +103 +100 +AcDbEntity + 8 +B + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +5.001193 + 30 +0.0 + 10 +0.808156 + 20 +4.826184 + 30 +0.0 + 10 +0.917537 + 20 +4.752802 + 30 +0.0 + 10 +3.951369 + 20 +4.752802 + 30 +0.0 + 10 +4.060751 + 20 +4.826184 + 30 +0.0 + 10 +4.106614 + 20 +5.001193 + 30 +0.0 + 10 +4.106614 + 20 +6.660697 + 30 +0.0 + 10 +4.060751 + 20 +6.835706 + 30 +0.0 + 10 +3.951369 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 0 +LWPOLYLINE + 5 +104 +100 +AcDbEntity + 8 +B + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.318271 + 20 +3.285192 + 30 +0.0 + 10 +4.272409 + 20 +3.460204 + 30 +0.0 + 10 +4.163027 + 20 +3.533583 + 30 +0.0 + 10 +0.917537 + 20 +3.533583 + 30 +0.0 + 10 +0.808156 + 20 +3.460204 + 30 +0.0 + 10 +0.762293 + 20 +3.285192 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.285192 + 30 +0.0 + 0 +LWPOLYLINE + 5 +105 +100 +AcDbEntity + 8 +C + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +0.920110 + 20 +6.909085 + 30 +0.0 + 10 +0.810422 + 20 +6.835702 + 30 +0.0 + 10 +0.764431 + 20 +6.660692 + 30 +0.0 + 10 +0.764431 + 20 +1.467901 + 30 +0.0 + 10 +0.810422 + 20 +1.292888 + 30 +0.0 + 10 +0.920110 + 20 +1.219508 + 30 +0.0 + 10 +5.080282 + 20 +1.219508 + 30 +0.0 + 10 +5.080282 + 20 +0.000288 + 30 +0.0 + 10 +0.920110 + 20 +0.000288 + 30 +0.0 + 10 +0.562759 + 20 +0.113116 + 30 +0.0 + 10 +0.269105 + 20 +0.429202 + 30 +0.0 + 10 +0.070997 + 20 +0.897736 + 30 +0.0 + 10 +0.000282 + 20 +1.467901 + 30 +0.0 + 10 +0.000282 + 20 +6.660692 + 30 +0.0 + 10 +0.070997 + 20 +7.230857 + 30 +0.0 + 10 +0.269105 + 20 +7.699387 + 30 +0.0 + 10 +0.562759 + 20 +8.015477 + 30 +0.0 + 10 +0.920110 + 20 +8.128301 + 30 +0.0 + 10 +5.080282 + 20 +8.128301 + 30 +0.0 + 10 +5.080282 + 20 +6.909085 + 30 +0.0 + 10 +0.920110 + 20 +6.909085 + 30 +0.0 + 0 +LWPOLYLINE + 5 +106 +100 +AcDbEntity + 8 +D + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519163 + 20 +8.015482 + 30 +0.0 + 10 +4.811996 + 20 +7.699392 + 30 +0.0 + 10 +5.009658 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.811996 + 20 +0.429209 + 30 +0.0 + 10 +4.519163 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +107 +100 +AcDbEntity + 8 +D + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917322 + 20 +6.909088 + 30 +0.0 + 10 +0.807940 + 20 +6.835706 + 30 +0.0 + 10 +0.762078 + 20 +6.660697 + 30 +0.0 + 10 +0.762078 + 20 +1.467903 + 30 +0.0 + 10 +0.807940 + 20 +1.292894 + 30 +0.0 + 10 +0.917322 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 0 +LWPOLYLINE + 5 +108 +100 +AcDbEntity + 8 +E + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +5.080282 + 20 +6.909086 + 30 +0.0 + 10 +0.831367 + 20 +6.909086 + 30 +0.0 + 10 +0.831367 + 20 +4.673909 + 30 +0.0 + 10 +4.248963 + 20 +4.673909 + 30 +0.0 + 10 +4.248963 + 20 +3.454690 + 30 +0.0 + 10 +0.831367 + 20 +3.454690 + 30 +0.0 + 10 +0.831367 + 20 +1.219510 + 30 +0.0 + 10 +5.080282 + 20 +1.219510 + 30 +0.0 + 10 +5.080282 + 20 +0.000291 + 30 +0.0 + 10 +0.000282 + 20 +0.000291 + 30 +0.0 + 10 +0.000282 + 20 +8.128305 + 30 +0.0 + 10 +5.080282 + 20 +8.128305 + 30 +0.0 + 10 +5.080282 + 20 +6.909086 + 30 +0.0 + 0 +LWPOLYLINE + 5 +109 +100 +AcDbEntity + 8 +F + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +6.909088 + 30 +0.0 + 10 +0.831367 + 20 +6.909088 + 30 +0.0 + 10 +0.831367 + 20 +4.673911 + 30 +0.0 + 10 +4.248962 + 20 +4.673911 + 30 +0.0 + 10 +4.248962 + 20 +3.454693 + 30 +0.0 + 10 +0.831367 + 20 +3.454693 + 30 +0.0 + 10 +0.831367 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10a +100 +AcDbEntity + 8 +G + 62 +7 +100 +AcDbPolyline + 90 +39 + 70 +0 + 10 +5.080282 + 20 +6.175282 + 30 +0.0 + 10 +4.318271 + 20 +6.175282 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.229038 + 30 +0.0 + 10 +3.118734 + 20 +3.229038 + 30 +0.0 + 10 +3.118734 + 20 +4.448257 + 30 +0.0 + 10 +5.080282 + 20 +4.448257 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009765 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812211 + 20 +7.699392 + 30 +0.0 + 10 +5.009765 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +6.175282 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10b +100 +AcDbEntity + 8 +H + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +5.080282 + 20 +8.128305 + 30 +0.0 + 10 +5.080282 + 20 +0.000291 + 30 +0.0 + 10 +4.335846 + 20 +0.000291 + 30 +0.0 + 10 +4.335846 + 20 +3.454687 + 30 +0.0 + 10 +0.744718 + 20 +3.454687 + 30 +0.0 + 10 +0.744718 + 20 +0.000291 + 30 +0.0 + 10 +0.000282 + 20 +0.000291 + 30 +0.0 + 10 +0.000282 + 20 +8.128305 + 30 +0.0 + 10 +0.744718 + 20 +8.128305 + 30 +0.0 + 10 +0.744718 + 20 +4.673908 + 30 +0.0 + 10 +4.335846 + 20 +4.673908 + 30 +0.0 + 10 +4.335846 + 20 +8.128305 + 30 +0.0 + 10 +5.080282 + 20 +8.128305 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10c +100 +AcDbEntity + 8 +I + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +3.764494 + 20 +0.000288 + 30 +0.0 + 10 +1.294141 + 20 +0.000288 + 30 +0.0 + 10 +1.272211 + 20 +1.197850 + 30 +0.0 + 10 +2.115417 + 20 +1.153753 + 30 +0.0 + 10 +2.115417 + 20 +6.930730 + 30 +0.0 + 10 +1.316071 + 20 +6.974827 + 30 +0.0 + 10 +1.272211 + 20 +8.128288 + 30 +0.0 + 10 +3.764494 + 20 +8.128288 + 30 +0.0 + 10 +3.764494 + 20 +6.974827 + 30 +0.0 + 10 +2.877428 + 20 +6.930730 + 30 +0.0 + 10 +2.877428 + 20 +1.153753 + 30 +0.0 + 10 +3.742564 + 20 +1.175926 + 30 +0.0 + 10 +3.764494 + 20 +0.000288 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10d +100 +AcDbEntity + 8 +J + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009766 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519379 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +2.258210 + 30 +0.0 + 10 +0.762293 + 20 +2.258210 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10e +100 +AcDbEntity + 8 +K + 62 +7 +100 +AcDbPolyline + 90 +16 + 70 +0 + 10 +5.080283 + 20 +8.128311 + 30 +0.0 + 10 +5.080283 + 20 +7.958811 + 30 +0.0 + 10 +2.961751 + 20 +4.064131 + 30 +0.0 + 10 +5.080283 + 20 +0.169795 + 30 +0.0 + 10 +5.080283 + 20 +0.000295 + 30 +0.0 + 10 +4.142044 + 20 +0.000295 + 30 +0.0 + 10 +2.257961 + 20 +3.454695 + 30 +0.0 + 10 +0.791991 + 20 +3.454695 + 30 +0.0 + 10 +0.791991 + 20 +0.000295 + 30 +0.0 + 10 +0.000282 + 20 +0.000295 + 30 +0.0 + 10 +0.000282 + 20 +8.128311 + 30 +0.0 + 10 +0.791991 + 20 +8.128311 + 30 +0.0 + 10 +0.791991 + 20 +4.673915 + 30 +0.0 + 10 +2.257961 + 20 +4.673915 + 30 +0.0 + 10 +4.142044 + 20 +8.128311 + 30 +0.0 + 10 +5.080283 + 20 +8.128311 + 30 +0.0 + 0 +LWPOLYLINE + 5 +10f +100 +AcDbEntity + 8 +L + 62 +7 +100 +AcDbPolyline + 90 +7 + 70 +0 + 10 +0.000282 + 20 +8.139677 + 30 +0.0 + 10 +0.762293 + 20 +8.139677 + 30 +0.0 + 10 +0.762293 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +8.139677 + 30 +0.0 + 0 +LWPOLYLINE + 5 +110 +100 +AcDbEntity + 8 +M + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.277217 + 20 +8.128314 + 30 +0.0 + 10 +5.080282 + 20 +8.128314 + 30 +0.0 + 10 +5.080282 + 20 +0.000299 + 30 +0.0 + 10 +4.261555 + 20 +0.000299 + 30 +0.0 + 10 +4.261555 + 20 +6.208896 + 30 +0.0 + 10 +2.540187 + 20 +2.472501 + 30 +0.0 + 10 +0.813647 + 20 +6.208896 + 30 +0.0 + 10 +0.813647 + 20 +0.000299 + 30 +0.0 + 10 +0.000282 + 20 +0.000299 + 30 +0.0 + 10 +0.000282 + 20 +8.128314 + 30 +0.0 + 10 +0.797078 + 20 +8.128314 + 30 +0.0 + 10 +2.540187 + 20 +4.369025 + 30 +0.0 + 10 +4.277217 + 20 +8.128314 + 30 +0.0 + 0 +LWPOLYLINE + 5 +111 +100 +AcDbEntity + 8 +N + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +4.177238 + 20 +0.000293 + 30 +0.0 + 10 +0.762293 + 20 +6.502567 + 30 +0.0 + 10 +0.762293 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +0.903326 + 20 +8.128307 + 30 +0.0 + 10 +4.318271 + 20 +1.626034 + 30 +0.0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +112 +100 +AcDbEntity + 8 +O + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +4.163242 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812211 + 20 +7.699392 + 30 +0.0 + 10 +5.009766 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009766 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163242 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561294 + 20 +0.113122 + 30 +0.0 + 10 +0.268461 + 20 +0.429209 + 30 +0.0 + 10 +0.070907 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070907 + 20 +7.230862 + 30 +0.0 + 10 +0.268461 + 20 +7.699392 + 30 +0.0 + 10 +0.561294 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163242 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +113 +100 +AcDbEntity + 8 +O + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.163242 + 20 +1.219512 + 30 +0.0 + 10 +4.272516 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272516 + 20 +6.835706 + 30 +0.0 + 10 +4.163242 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163242 + 20 +1.219512 + 30 +0.0 + 0 +LWPOLYLINE + 5 +114 +100 +AcDbEntity + 8 +P + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +4.163027 + 20 +8.116937 + 30 +0.0 + 10 +4.519378 + 20 +7.998429 + 30 +0.0 + 10 +4.812211 + 20 +7.682339 + 30 +0.0 + 10 +5.009766 + 20 +7.219492 + 30 +0.0 + 10 +5.080282 + 20 +6.649327 + 30 +0.0 + 10 +5.080282 + 20 +4.369020 + 30 +0.0 + 10 +5.009766 + 20 +3.798856 + 30 +0.0 + 10 +4.812211 + 20 +3.336180 + 30 +0.0 + 10 +4.519378 + 20 +3.020094 + 30 +0.0 + 10 +4.163027 + 20 +2.901410 + 30 +0.0 + 10 +0.917537 + 20 +2.901410 + 30 +0.0 + 10 +0.836362 + 20 +2.907086 + 30 +0.0 + 10 +0.762293 + 20 +2.924150 + 30 +0.0 + 10 +0.762293 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +8.116941 + 30 +0.0 + 10 +4.163027 + 20 +8.116937 + 30 +0.0 + 0 +LWPOLYLINE + 5 +115 +100 +AcDbEntity + 8 +P + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.318271 + 20 +6.649327 + 30 +0.0 + 10 +4.272409 + 20 +6.824340 + 30 +0.0 + 10 +4.163027 + 20 +6.897718 + 30 +0.0 + 10 +0.917537 + 20 +6.897718 + 30 +0.0 + 10 +0.808156 + 20 +6.824340 + 30 +0.0 + 10 +0.762293 + 20 +6.649327 + 30 +0.0 + 10 +0.762293 + 20 +4.369020 + 30 +0.0 + 10 +0.808156 + 20 +4.194008 + 30 +0.0 + 10 +0.917537 + 20 +4.120629 + 30 +0.0 + 10 +4.163027 + 20 +4.120629 + 30 +0.0 + 10 +4.272409 + 20 +4.194008 + 30 +0.0 + 10 +4.318271 + 20 +4.369020 + 30 +0.0 + 10 +4.318271 + 20 +6.649327 + 30 +0.0 + 0 +LWPOLYLINE + 5 +116 +100 +AcDbEntity + 8 +Q + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +5.080282 + 20 +1.219504 + 30 +0.0 + 10 +5.080282 + 20 +0.000287 + 30 +0.0 + 10 +0.815593 + 20 +0.000287 + 30 +0.0 + 10 +0.498943 + 20 +0.113112 + 30 +0.0 + 10 +0.238655 + 20 +0.429199 + 30 +0.0 + 10 +0.063057 + 20 +0.897733 + 30 +0.0 + 10 +0.000282 + 20 +1.467896 + 30 +0.0 + 10 +0.000282 + 20 +6.660678 + 30 +0.0 + 10 +0.063057 + 20 +7.230841 + 30 +0.0 + 10 +0.238655 + 20 +7.699375 + 30 +0.0 + 10 +0.498943 + 20 +8.015462 + 30 +0.0 + 10 +0.815593 + 20 +8.128287 + 30 +0.0 + 10 +3.700569 + 20 +8.128287 + 30 +0.0 + 10 +4.017124 + 20 +8.015462 + 30 +0.0 + 10 +4.277411 + 20 +7.699375 + 30 +0.0 + 10 +4.453009 + 20 +7.230841 + 30 +0.0 + 10 +4.515689 + 20 +6.660678 + 30 +0.0 + 10 +4.515689 + 20 +1.467896 + 30 +0.0 + 10 +4.512626 + 20 +1.338017 + 30 +0.0 + 10 +4.503249 + 20 +1.219504 + 30 +0.0 + 10 +5.080282 + 20 +1.219504 + 30 +0.0 + 0 +LWPOLYLINE + 5 +117 +100 +AcDbEntity + 8 +Q + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +3.700569 + 20 +1.219504 + 30 +0.0 + 10 +3.797699 + 20 +1.292886 + 30 +0.0 + 10 +3.838368 + 20 +1.467896 + 30 +0.0 + 10 +3.838368 + 20 +6.660678 + 30 +0.0 + 10 +3.797699 + 20 +6.835688 + 30 +0.0 + 10 +3.700569 + 20 +6.909070 + 30 +0.0 + 10 +0.815593 + 20 +6.909070 + 30 +0.0 + 10 +0.718368 + 20 +6.835688 + 30 +0.0 + 10 +0.677603 + 20 +6.660678 + 30 +0.0 + 10 +0.677603 + 20 +1.467896 + 30 +0.0 + 10 +0.718368 + 20 +1.292886 + 30 +0.0 + 10 +0.815593 + 20 +1.219504 + 30 +0.0 + 10 +3.700569 + 20 +1.219504 + 30 +0.0 + 0 +LWPOLYLINE + 5 +118 +100 +AcDbEntity + 8 +R + 62 +7 +100 +AcDbPolyline + 90 +22 + 70 +0 + 10 +5.080282 + 20 +4.369020 + 30 +0.0 + 10 +5.009766 + 20 +3.798856 + 30 +0.0 + 10 +4.812211 + 20 +3.336180 + 30 +0.0 + 10 +4.519378 + 20 +3.020094 + 30 +0.0 + 10 +4.163027 + 20 +2.901410 + 30 +0.0 + 10 +3.647986 + 20 +2.901410 + 30 +0.0 + 10 +5.080282 + 20 +0.169794 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +4.177238 + 20 +0.000293 + 30 +0.0 + 10 +2.653217 + 20 +2.901410 + 30 +0.0 + 10 +0.917537 + 20 +2.901410 + 30 +0.0 + 10 +0.836362 + 20 +2.907086 + 30 +0.0 + 10 +0.762293 + 20 +2.924150 + 30 +0.0 + 10 +0.762293 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +8.116941 + 30 +0.0 + 10 +4.163027 + 20 +8.116941 + 30 +0.0 + 10 +4.519378 + 20 +7.998432 + 30 +0.0 + 10 +4.812211 + 20 +7.682342 + 30 +0.0 + 10 +5.009766 + 20 +7.219495 + 30 +0.0 + 10 +5.080282 + 20 +6.649331 + 30 +0.0 + 10 +5.080282 + 20 +4.369020 + 30 +0.0 + 0 +LWPOLYLINE + 5 +119 +100 +AcDbEntity + 8 +R + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.163027 + 20 +4.120629 + 30 +0.0 + 10 +4.272409 + 20 +4.194008 + 30 +0.0 + 10 +4.318271 + 20 +4.369020 + 30 +0.0 + 10 +4.318271 + 20 +6.649327 + 30 +0.0 + 10 +4.272409 + 20 +6.824340 + 30 +0.0 + 10 +4.163027 + 20 +6.897718 + 30 +0.0 + 10 +0.917537 + 20 +6.897718 + 30 +0.0 + 10 +0.808156 + 20 +6.824340 + 30 +0.0 + 10 +0.762293 + 20 +6.649327 + 30 +0.0 + 10 +0.762293 + 20 +4.369020 + 30 +0.0 + 10 +0.808156 + 20 +4.194008 + 30 +0.0 + 10 +0.917537 + 20 +4.120629 + 30 +0.0 + 10 +4.163027 + 20 +4.120629 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11a +100 +AcDbEntity + 8 +S + 62 +7 +100 +AcDbPolyline + 90 +53 + 70 +0 + 10 +5.080282 + 20 +6.186652 + 30 +0.0 + 10 +4.318271 + 20 +6.186652 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +4.922303 + 30 +0.0 + 10 +0.808156 + 20 +4.747290 + 30 +0.0 + 10 +0.917537 + 20 +4.673911 + 30 +0.0 + 10 +4.163027 + 20 +4.673911 + 30 +0.0 + 10 +4.519379 + 20 +4.561082 + 30 +0.0 + 10 +4.812211 + 20 +4.244996 + 30 +0.0 + 10 +5.009766 + 20 +3.776462 + 30 +0.0 + 10 +5.080282 + 20 +3.206301 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009766 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519379 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268461 + 20 +0.429209 + 30 +0.0 + 10 +0.070907 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +1.941949 + 30 +0.0 + 10 +0.762293 + 20 +1.941949 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.206301 + 30 +0.0 + 10 +4.272409 + 20 +3.381310 + 30 +0.0 + 10 +4.163027 + 20 +3.454693 + 30 +0.0 + 10 +0.917537 + 20 +3.454693 + 30 +0.0 + 10 +0.561186 + 20 +3.567518 + 30 +0.0 + 10 +0.268461 + 20 +3.883604 + 30 +0.0 + 10 +0.070907 + 20 +4.352138 + 30 +0.0 + 10 +0.000282 + 20 +4.922303 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070907 + 20 +7.230862 + 30 +0.0 + 10 +0.268461 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519379 + 20 +8.015482 + 30 +0.0 + 10 +4.812211 + 20 +7.699392 + 30 +0.0 + 10 +5.009766 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +6.186652 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11b +100 +AcDbEntity + 8 +T + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +6.909088 + 30 +0.0 + 10 +2.921288 + 20 +6.909088 + 30 +0.0 + 10 +2.921288 + 20 +0.000293 + 30 +0.0 + 10 +2.159277 + 20 +0.000293 + 30 +0.0 + 10 +2.159277 + 20 +6.909088 + 30 +0.0 + 10 +0.000282 + 20 +6.909088 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11c +100 +AcDbEntity + 8 +U + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009766 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163242 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561294 + 20 +0.113122 + 30 +0.0 + 10 +0.268461 + 20 +0.429209 + 30 +0.0 + 10 +0.070907 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +0.762293 + 20 +8.128307 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163242 + 20 +1.219512 + 30 +0.0 + 10 +4.272516 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11d +100 +AcDbEntity + 8 +V + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +4.409476 + 20 +8.128319 + 30 +0.0 + 10 +5.080282 + 20 +8.128319 + 30 +0.0 + 10 +2.835071 + 20 +0.000304 + 30 +0.0 + 10 +2.250777 + 20 +0.000304 + 30 +0.0 + 10 +0.000282 + 20 +8.128319 + 30 +0.0 + 10 +0.676537 + 20 +8.128319 + 30 +0.0 + 10 +2.543006 + 20 +1.377654 + 30 +0.0 + 10 +4.409476 + 20 +8.128319 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11e +100 +AcDbEntity + 8 +W + 62 +7 +100 +AcDbPolyline + 90 +16 + 70 +0 + 10 +5.080282 + 20 +8.128316 + 30 +0.0 + 10 +3.880038 + 20 +0.000299 + 30 +0.0 + 10 +3.477021 + 20 +0.000299 + 30 +0.0 + 10 +2.537906 + 20 +6.333420 + 30 +0.0 + 10 +1.603544 + 20 +0.000299 + 30 +0.0 + 10 +1.594317 + 20 +0.011685 + 30 +0.0 + 10 +1.598931 + 20 +0.000299 + 30 +0.0 + 10 +1.200387 + 20 +0.000299 + 30 +0.0 + 10 +0.000282 + 20 +8.128316 + 30 +0.0 + 10 +0.649023 + 20 +8.128316 + 30 +0.0 + 10 +1.382977 + 20 +2.483593 + 30 +0.0 + 10 +2.135858 + 20 +8.128316 + 30 +0.0 + 10 +2.944714 + 20 +8.128316 + 30 +0.0 + 10 +3.678538 + 20 +2.483531 + 30 +0.0 + 10 +4.412223 + 20 +8.128254 + 30 +0.0 + 10 +5.080282 + 20 +8.128316 + 30 +0.0 + 0 +LWPOLYLINE + 5 +11f +100 +AcDbEntity + 8 +X + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +5.080564 + 20 +8.128307 + 30 +0.0 + 10 +5.080564 + 20 +7.958810 + 30 +0.0 + 10 +3.034612 + 20 +4.064129 + 30 +0.0 + 10 +5.080564 + 20 +0.169794 + 30 +0.0 + 10 +5.080564 + 20 +0.000293 + 30 +0.0 + 10 +4.177520 + 20 +0.000293 + 30 +0.0 + 10 +2.540672 + 20 +3.116037 + 30 +0.0 + 10 +0.903824 + 20 +0.000293 + 30 +0.0 + 10 +0.000564 + 20 +0.000293 + 30 +0.0 + 10 +0.000564 + 20 +0.169794 + 30 +0.0 + 10 +2.039627 + 20 +4.064129 + 30 +0.0 + 10 +0.000564 + 20 +7.958810 + 30 +0.0 + 10 +0.000564 + 20 +8.128307 + 30 +0.0 + 10 +0.903824 + 20 +8.128307 + 30 +0.0 + 10 +2.540672 + 20 +5.012563 + 30 +0.0 + 10 +4.177520 + 20 +8.128307 + 30 +0.0 + 10 +5.080564 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +120 +100 +AcDbEntity + 8 +Y + 62 +7 +100 +AcDbPolyline + 90 +10 + 70 +0 + 10 +5.080282 + 20 +8.128297 + 30 +0.0 + 10 +2.895623 + 20 +3.048157 + 30 +0.0 + 10 +2.895623 + 20 +0.000281 + 30 +0.0 + 10 +2.184941 + 20 +0.000281 + 30 +0.0 + 10 +2.184941 + 20 +3.048157 + 30 +0.0 + 10 +0.000282 + 20 +8.128297 + 30 +0.0 + 10 +0.836071 + 20 +8.128297 + 30 +0.0 + 10 +2.540383 + 20 +4.425507 + 30 +0.0 + 10 +4.238067 + 20 +8.128297 + 30 +0.0 + 10 +5.080282 + 20 +8.128297 + 30 +0.0 + 0 +LWPOLYLINE + 5 +121 +100 +AcDbEntity + 8 +Z + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +6.683434 + 30 +0.0 + 10 +1.016368 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +1.445167 + 30 +0.0 + 10 +4.064411 + 20 +6.909088 + 30 +0.0 + 10 +0.000282 + 20 +6.909088 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +122 +100 +AcDbEntity + 8 +a_ + 62 +7 +100 +AcDbPolyline + 90 +19 + 70 +0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 10 +4.395784 + 20 +6.434872 + 30 +0.0 + 10 +4.753142 + 20 +6.118782 + 30 +0.0 + 10 +4.994228 + 20 +5.650251 + 30 +0.0 + 10 +5.080283 + 20 +5.080430 + 30 +0.0 + 10 +5.080283 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327422 + 20 +0.429209 + 30 +0.0 + 10 +0.086337 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +3.883606 + 30 +0.0 + 10 +4.150364 + 20 +3.883606 + 30 +0.0 + 10 +4.150364 + 20 +5.080430 + 30 +0.0 + 10 +4.094395 + 20 +5.255269 + 30 +0.0 + 10 +3.960911 + 20 +5.328476 + 30 +0.0 + 10 +0.000282 + 20 +5.328476 + 30 +0.0 + 10 +0.000282 + 20 +6.547698 + 30 +0.0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 0 +LWPOLYLINE + 5 +123 +100 +AcDbEntity + 8 +a_ + 62 +7 +100 +AcDbPolyline + 90 +7 + 70 +0 + 10 +4.150364 + 20 +2.664385 + 30 +0.0 + 10 +0.930201 + 20 +2.664385 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +4.150364 + 20 +1.219511 + 30 +0.0 + 10 +4.150364 + 20 +2.664385 + 30 +0.0 + 0 +LWPOLYLINE + 5 +124 +100 +AcDbEntity + 8 +b_ + 62 +7 +100 +AcDbPolyline + 90 +15 + 70 +0 + 10 +3.960969 + 20 +6.547668 + 30 +0.0 + 10 +4.395688 + 20 +6.434839 + 30 +0.0 + 10 +4.753028 + 20 +6.118754 + 30 +0.0 + 10 +4.994101 + 20 +5.650220 + 30 +0.0 + 10 +5.080282 + 20 +5.080401 + 30 +0.0 + 10 +5.080282 + 20 +1.467875 + 30 +0.0 + 10 +4.994101 + 20 +0.897709 + 30 +0.0 + 10 +4.753028 + 20 +0.429176 + 30 +0.0 + 10 +4.395688 + 20 +0.113090 + 30 +0.0 + 10 +3.960969 + 20 +0.000262 + 30 +0.0 + 10 +0.000282 + 20 +0.000262 + 30 +0.0 + 10 +0.000282 + 20 +8.692584 + 30 +0.0 + 10 +0.930153 + 20 +8.692584 + 30 +0.0 + 10 +0.930153 + 20 +6.547668 + 30 +0.0 + 10 +3.960969 + 20 +6.547668 + 30 +0.0 + 0 +LWPOLYLINE + 5 +125 +100 +AcDbEntity + 8 +b_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.150412 + 20 +5.080401 + 30 +0.0 + 10 +4.094446 + 20 +5.255238 + 30 +0.0 + 10 +3.960969 + 20 +5.328447 + 30 +0.0 + 10 +1.119595 + 20 +5.328447 + 30 +0.0 + 10 +0.986119 + 20 +5.255238 + 30 +0.0 + 10 +0.930153 + 20 +5.080401 + 30 +0.0 + 10 +0.930153 + 20 +1.467875 + 30 +0.0 + 10 +0.986119 + 20 +1.292863 + 30 +0.0 + 10 +1.119595 + 20 +1.219482 + 30 +0.0 + 10 +3.960969 + 20 +1.219482 + 30 +0.0 + 10 +4.094446 + 20 +1.292863 + 30 +0.0 + 10 +4.150412 + 20 +1.467875 + 30 +0.0 + 10 +4.150412 + 20 +5.080401 + 30 +0.0 + 0 +LWPOLYLINE + 5 +126 +100 +AcDbEntity + 8 +c_ + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +5.080282 + 20 +1.219511 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327554 + 20 +0.429209 + 30 +0.0 + 10 +0.086469 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +5.080430 + 30 +0.0 + 10 +0.086469 + 20 +5.650251 + 30 +0.0 + 10 +0.327554 + 20 +6.118782 + 30 +0.0 + 10 +0.684780 + 20 +6.434872 + 30 +0.0 + 10 +1.119653 + 20 +6.547698 + 30 +0.0 + 10 +5.063203 + 20 +6.547698 + 30 +0.0 + 10 +5.063203 + 20 +5.328476 + 30 +0.0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 10 +0.986170 + 20 +5.255269 + 30 +0.0 + 10 +0.930201 + 20 +5.080430 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +5.080282 + 20 +1.219511 + 30 +0.0 + 0 +LWPOLYLINE + 5 +127 +100 +AcDbEntity + 8 +d_ + 62 +7 +100 +AcDbPolyline + 90 +15 + 70 +0 + 10 +5.080283 + 20 +8.692613 + 30 +0.0 + 10 +5.080283 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327422 + 20 +0.429209 + 30 +0.0 + 10 +0.086337 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +5.080430 + 30 +0.0 + 10 +0.086337 + 20 +5.650251 + 30 +0.0 + 10 +0.327422 + 20 +6.118782 + 30 +0.0 + 10 +0.684780 + 20 +6.434872 + 30 +0.0 + 10 +1.119653 + 20 +6.547698 + 30 +0.0 + 10 +4.150364 + 20 +6.547698 + 30 +0.0 + 10 +4.150364 + 20 +8.692613 + 30 +0.0 + 10 +5.080283 + 20 +8.692613 + 30 +0.0 + 0 +LWPOLYLINE + 5 +128 +100 +AcDbEntity + 8 +d_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +3.960911 + 20 +1.219511 + 30 +0.0 + 10 +4.094395 + 20 +1.292893 + 30 +0.0 + 10 +4.150364 + 20 +1.467904 + 30 +0.0 + 10 +4.150364 + 20 +5.080430 + 30 +0.0 + 10 +4.094395 + 20 +5.255269 + 30 +0.0 + 10 +3.960911 + 20 +5.328476 + 30 +0.0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 10 +0.986170 + 20 +5.255269 + 30 +0.0 + 10 +0.930201 + 20 +5.080430 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +3.960911 + 20 +1.219511 + 30 +0.0 + 0 +LWPOLYLINE + 5 +129 +100 +AcDbEntity + 8 +e_ + 62 +7 +100 +AcDbPolyline + 90 +23 + 70 +0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 10 +4.395784 + 20 +6.434872 + 30 +0.0 + 10 +4.753142 + 20 +6.118782 + 30 +0.0 + 10 +4.994227 + 20 +5.650251 + 30 +0.0 + 10 +5.080282 + 20 +5.080430 + 30 +0.0 + 10 +5.080282 + 20 +2.664385 + 30 +0.0 + 10 +0.930201 + 20 +2.664385 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +5.080282 + 20 +1.219511 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327554 + 20 +0.429209 + 30 +0.0 + 10 +0.086469 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +5.080430 + 30 +0.0 + 10 +0.086469 + 20 +5.650251 + 30 +0.0 + 10 +0.327554 + 20 +6.118782 + 30 +0.0 + 10 +0.684780 + 20 +6.434872 + 30 +0.0 + 10 +1.119653 + 20 +6.547698 + 30 +0.0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12a +100 +AcDbEntity + 8 +e_ + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +4.150363 + 20 +3.883606 + 30 +0.0 + 10 +4.150363 + 20 +5.080430 + 30 +0.0 + 10 +4.094395 + 20 +5.255269 + 30 +0.0 + 10 +3.960911 + 20 +5.328476 + 30 +0.0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 10 +0.986170 + 20 +5.255269 + 30 +0.0 + 10 +0.930201 + 20 +5.080430 + 30 +0.0 + 10 +0.930201 + 20 +3.883606 + 30 +0.0 + 10 +4.150363 + 20 +3.883606 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12b +100 +AcDbEntity + 8 +f_ + 62 +7 +100 +AcDbPolyline + 90 +18 + 70 +0 + 10 +2.084180 + 20 +7.473384 + 30 +0.0 + 10 +1.919781 + 20 +7.400002 + 30 +0.0 + 10 +1.850849 + 20 +7.225336 + 30 +0.0 + 10 +1.850849 + 20 +6.547686 + 30 +0.0 + 10 +4.374444 + 20 +6.547686 + 30 +0.0 + 10 +4.374444 + 20 +5.328458 + 30 +0.0 + 10 +1.850849 + 20 +5.328458 + 30 +0.0 + 10 +1.850849 + 20 +0.000269 + 30 +0.0 + 10 +0.705556 + 20 +0.000269 + 30 +0.0 + 10 +0.705556 + 20 +3.612806 + 30 +0.0 + 10 +0.705556 + 20 +7.225336 + 30 +0.0 + 10 +0.811541 + 20 +7.795156 + 30 +0.0 + 10 +1.108463 + 20 +8.263689 + 30 +0.0 + 10 +1.548588 + 20 +8.579777 + 30 +0.0 + 10 +2.084180 + 20 +8.692603 + 30 +0.0 + 10 +4.374444 + 20 +8.692603 + 30 +0.0 + 10 +4.374444 + 20 +7.473384 + 30 +0.0 + 10 +2.084180 + 20 +7.473384 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12c +100 +AcDbEntity + 8 +g_ + 62 +7 +100 +AcDbPolyline + 90 +29 + 70 +0 + 10 +5.080282 + 20 +2.428985 + 30 +0.0 + 10 +5.080282 + 20 +2.417610 + 30 +0.0 + 10 +5.080282 + 20 +-1.194916 + 30 +0.0 + 10 +4.994100 + 20 +-1.765081 + 30 +0.0 + 10 +4.753028 + 20 +-2.233440 + 30 +0.0 + 10 +4.395820 + 20 +-2.549529 + 30 +0.0 + 10 +3.960969 + 20 +-2.662526 + 30 +0.0 + 10 +0.878654 + 20 +-2.662526 + 30 +0.0 + 10 +0.878654 + 20 +-1.443308 + 30 +0.0 + 10 +3.960969 + 20 +-1.443308 + 30 +0.0 + 10 +4.094446 + 20 +-1.369928 + 30 +0.0 + 10 +4.150412 + 20 +-1.194916 + 30 +0.0 + 10 +4.150412 + 20 +-0.065958 + 30 +0.0 + 10 +1.119595 + 20 +-0.065958 + 30 +0.0 + 10 +0.684876 + 20 +0.046868 + 30 +0.0 + 10 +0.327537 + 20 +0.362956 + 30 +0.0 + 10 +0.086464 + 20 +0.831490 + 30 +0.0 + 10 +0.000282 + 20 +1.401652 + 30 +0.0 + 10 +0.000282 + 20 +5.014178 + 30 +0.0 + 10 +0.086464 + 20 +5.583998 + 30 +0.0 + 10 +0.327537 + 20 +6.052531 + 30 +0.0 + 10 +0.684876 + 20 +6.368620 + 30 +0.0 + 10 +1.119595 + 20 +6.481445 + 30 +0.0 + 10 +3.960969 + 20 +6.481445 + 30 +0.0 + 10 +4.395820 + 20 +6.368620 + 30 +0.0 + 10 +4.753028 + 20 +6.052531 + 30 +0.0 + 10 +4.994100 + 20 +5.583998 + 30 +0.0 + 10 +5.080282 + 20 +5.014178 + 30 +0.0 + 10 +5.080282 + 20 +2.428985 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12d +100 +AcDbEntity + 8 +g_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +3.960969 + 20 +1.153266 + 30 +0.0 + 10 +4.094446 + 20 +1.226647 + 30 +0.0 + 10 +4.150412 + 20 +1.401659 + 30 +0.0 + 10 +4.150412 + 20 +5.014185 + 30 +0.0 + 10 +4.094446 + 20 +5.189025 + 30 +0.0 + 10 +3.960969 + 20 +5.262234 + 30 +0.0 + 10 +1.119595 + 20 +5.262234 + 30 +0.0 + 10 +0.986119 + 20 +5.189025 + 30 +0.0 + 10 +0.930153 + 20 +5.014185 + 30 +0.0 + 10 +0.930153 + 20 +1.401659 + 30 +0.0 + 10 +0.986119 + 20 +1.226647 + 30 +0.0 + 10 +1.119595 + 20 +1.153266 + 30 +0.0 + 10 +3.960969 + 20 +1.153266 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12e +100 +AcDbEntity + 8 +h_ + 62 +7 +100 +AcDbPolyline + 90 +19 + 70 +0 + 10 +3.960969 + 20 +6.547687 + 30 +0.0 + 10 +4.395688 + 20 +6.434858 + 30 +0.0 + 10 +4.748692 + 20 +6.118773 + 30 +0.0 + 10 +4.989765 + 20 +5.650239 + 30 +0.0 + 10 +5.080282 + 20 +5.080420 + 30 +0.0 + 10 +5.080282 + 20 +0.000281 + 30 +0.0 + 10 +4.150412 + 20 +0.000281 + 30 +0.0 + 10 +4.150412 + 20 +5.080420 + 30 +0.0 + 10 +4.094446 + 20 +5.255257 + 30 +0.0 + 10 +3.960969 + 20 +5.328467 + 30 +0.0 + 10 +1.119595 + 20 +5.328467 + 30 +0.0 + 10 +0.986119 + 20 +5.255257 + 30 +0.0 + 10 +0.930153 + 20 +5.080420 + 30 +0.0 + 10 +0.930153 + 20 +0.000281 + 30 +0.0 + 10 +0.000282 + 20 +0.000281 + 30 +0.0 + 10 +0.000282 + 20 +8.692604 + 30 +0.0 + 10 +0.930153 + 20 +8.692604 + 30 +0.0 + 10 +0.930153 + 20 +6.547687 + 30 +0.0 + 10 +3.960969 + 20 +6.547687 + 30 +0.0 + 0 +LWPOLYLINE + 5 +12f +100 +AcDbEntity + 8 +i_ + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.116949 + 20 +6.547696 + 30 +0.0 + 10 +3.104727 + 20 +6.547696 + 30 +0.0 + 10 +3.104727 + 20 +0.000291 + 30 +0.0 + 10 +2.116949 + 20 +0.000291 + 30 +0.0 + 10 +2.116949 + 20 +6.547696 + 30 +0.0 + 0 +LWPOLYLINE + 5 +130 +100 +AcDbEntity + 8 +i_ + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +3.104727 + 20 +8.692611 + 30 +0.0 + 10 +3.104727 + 20 +7.473393 + 30 +0.0 + 10 +2.116949 + 20 +7.473393 + 30 +0.0 + 10 +2.116949 + 20 +8.692611 + 30 +0.0 + 10 +3.104727 + 20 +8.692611 + 30 +0.0 + 0 +LWPOLYLINE + 5 +131 +100 +AcDbEntity + 8 +j_ + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +3.810282 + 20 +8.652944 + 30 +0.0 + 10 +3.810282 + 20 +7.433724 + 30 +0.0 + 10 +2.721755 + 20 +7.433724 + 30 +0.0 + 10 +2.721755 + 20 +8.652944 + 30 +0.0 + 10 +3.810282 + 20 +8.652944 + 30 +0.0 + 0 +LWPOLYLINE + 5 +132 +100 +AcDbEntity + 8 +j_ + 62 +7 +100 +AcDbPolyline + 90 +14 + 70 +0 + 10 +3.810282 + 20 +2.444193 + 30 +0.0 + 10 +3.810282 + 20 +-1.168337 + 30 +0.0 + 10 +3.709396 + 20 +-1.738510 + 30 +0.0 + 10 +3.427191 + 20 +-2.206847 + 30 +0.0 + 10 +3.009035 + 20 +-2.522945 + 30 +0.0 + 10 +2.499989 + 20 +-2.635937 + 30 +0.0 + 10 +0.000282 + 20 +-2.635937 + 30 +0.0 + 10 +0.000282 + 20 +-1.416726 + 30 +0.0 + 10 +2.499989 + 20 +-1.416726 + 30 +0.0 + 10 +2.656240 + 20 +-1.343345 + 30 +0.0 + 10 +2.721755 + 20 +-1.168337 + 30 +0.0 + 10 +2.721755 + 20 +6.485634 + 30 +0.0 + 10 +3.810282 + 20 +6.485634 + 30 +0.0 + 10 +3.810282 + 20 +2.444193 + 30 +0.0 + 0 +LWPOLYLINE + 5 +133 +100 +AcDbEntity + 8 +k_ + 62 +7 +100 +AcDbPolyline + 90 +16 + 70 +0 + 10 +5.080282 + 20 +6.547701 + 30 +0.0 + 10 +5.080282 + 20 +6.378545 + 30 +0.0 + 10 +2.910699 + 20 +3.274171 + 30 +0.0 + 10 +5.080282 + 20 +0.169793 + 30 +0.0 + 10 +5.080282 + 20 +0.000296 + 30 +0.0 + 10 +3.965043 + 20 +0.000296 + 30 +0.0 + 10 +2.074137 + 20 +2.664387 + 30 +0.0 + 10 +0.941348 + 20 +2.664387 + 30 +0.0 + 10 +0.941348 + 20 +0.000296 + 30 +0.0 + 10 +0.000282 + 20 +0.000296 + 30 +0.0 + 10 +0.000282 + 20 +8.692616 + 30 +0.0 + 10 +0.941348 + 20 +8.692616 + 30 +0.0 + 10 +0.941348 + 20 +3.883607 + 30 +0.0 + 10 +2.074137 + 20 +3.883607 + 30 +0.0 + 10 +3.965043 + 20 +6.547701 + 30 +0.0 + 10 +5.080282 + 20 +6.547701 + 30 +0.0 + 0 +LWPOLYLINE + 5 +134 +100 +AcDbEntity + 8 +l_ + 62 +7 +100 +AcDbPolyline + 90 +14 + 70 +0 + 10 +1.058333 + 20 +5.080425 + 30 +0.0 + 10 +1.058333 + 20 +8.692615 + 30 +0.0 + 10 +2.277553 + 20 +8.692615 + 30 +0.0 + 10 +2.277553 + 20 +1.467896 + 30 +0.0 + 10 +2.350933 + 20 +1.292890 + 30 +0.0 + 10 +2.525944 + 20 +1.219512 + 30 +0.0 + 10 +3.745163 + 20 +1.219512 + 30 +0.0 + 10 +3.745163 + 20 +0.000284 + 30 +0.0 + 10 +2.525944 + 20 +0.000284 + 30 +0.0 + 10 +1.955781 + 20 +0.113116 + 30 +0.0 + 10 +1.487248 + 20 +0.429205 + 30 +0.0 + 10 +1.171160 + 20 +0.897722 + 30 +0.0 + 10 +1.058333 + 20 +1.467896 + 30 +0.0 + 10 +1.058333 + 20 +5.080425 + 30 +0.0 + 0 +LWPOLYLINE + 5 +135 +100 +AcDbEntity + 8 +m_ + 62 +7 +100 +AcDbPolyline + 90 +25 + 70 +0 + 10 +4.322225 + 20 +6.547695 + 30 +0.0 + 10 +4.616620 + 20 +6.434866 + 30 +0.0 + 10 +4.858685 + 20 +6.118779 + 30 +0.0 + 10 +5.021991 + 20 +5.650245 + 30 +0.0 + 10 +5.080282 + 20 +5.080426 + 30 +0.0 + 10 +5.080282 + 20 +0.000289 + 30 +0.0 + 10 +4.173911 + 20 +0.000289 + 30 +0.0 + 10 +4.173911 + 20 +5.080426 + 30 +0.0 + 10 +4.135999 + 20 +5.255265 + 30 +0.0 + 10 +4.039885 + 20 +5.328473 + 30 +0.0 + 10 +3.127687 + 20 +5.328473 + 30 +0.0 + 10 +3.037269 + 20 +5.255265 + 30 +0.0 + 10 +2.999357 + 20 +5.080426 + 30 +0.0 + 10 +2.999357 + 20 +0.000289 + 30 +0.0 + 10 +2.228356 + 20 +0.000289 + 30 +0.0 + 10 +2.228356 + 20 +5.080426 + 30 +0.0 + 10 +2.190444 + 20 +5.255265 + 30 +0.0 + 10 +2.100025 + 20 +5.328473 + 30 +0.0 + 10 +0.910832 + 20 +5.328559 + 30 +0.0 + 10 +0.820413 + 20 +5.255352 + 30 +0.0 + 10 +0.782501 + 20 +5.080513 + 30 +0.0 + 10 +0.782501 + 20 +0.000375 + 30 +0.0 + 10 +0.000282 + 20 +0.000289 + 30 +0.0 + 10 +0.000282 + 20 +6.547695 + 30 +0.0 + 10 +4.322225 + 20 +6.547695 + 30 +0.0 + 0 +LWPOLYLINE + 5 +136 +100 +AcDbEntity + 8 +n_ + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +3.961533 + 20 +6.547687 + 30 +0.0 + 10 +4.396253 + 20 +6.434858 + 30 +0.0 + 10 +4.753592 + 20 +6.118773 + 30 +0.0 + 10 +4.994665 + 20 +5.650239 + 30 +0.0 + 10 +5.080847 + 20 +5.080420 + 30 +0.0 + 10 +5.080847 + 20 +0.000281 + 30 +0.0 + 10 +4.150976 + 20 +0.000281 + 30 +0.0 + 10 +4.150976 + 20 +5.080420 + 30 +0.0 + 10 +4.095010 + 20 +5.255257 + 30 +0.0 + 10 +3.961533 + 20 +5.328467 + 30 +0.0 + 10 +1.120160 + 20 +5.328467 + 30 +0.0 + 10 +0.986683 + 20 +5.255257 + 30 +0.0 + 10 +0.930717 + 20 +5.080420 + 30 +0.0 + 10 +0.930717 + 20 +0.000281 + 30 +0.0 + 10 +0.000847 + 20 +0.000281 + 30 +0.0 + 10 +0.000847 + 20 +6.547687 + 30 +0.0 + 10 +3.961533 + 20 +6.547687 + 30 +0.0 + 0 +LWPOLYLINE + 5 +137 +100 +AcDbEntity + 8 +o_ + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 10 +4.395784 + 20 +6.434872 + 30 +0.0 + 10 +4.753142 + 20 +6.118782 + 30 +0.0 + 10 +4.994228 + 20 +5.650251 + 30 +0.0 + 10 +5.080283 + 20 +5.080430 + 30 +0.0 + 10 +5.080283 + 20 +1.467904 + 30 +0.0 + 10 +4.994228 + 20 +0.897741 + 30 +0.0 + 10 +4.753142 + 20 +0.429209 + 30 +0.0 + 10 +4.395784 + 20 +0.113119 + 30 +0.0 + 10 +3.960911 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327554 + 20 +0.429209 + 30 +0.0 + 10 +0.086469 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +5.080430 + 30 +0.0 + 10 +0.086469 + 20 +5.650251 + 30 +0.0 + 10 +0.327554 + 20 +6.118782 + 30 +0.0 + 10 +0.684780 + 20 +6.434872 + 30 +0.0 + 10 +1.119653 + 20 +6.547698 + 30 +0.0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 0 +LWPOLYLINE + 5 +138 +100 +AcDbEntity + 8 +o_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 10 +0.986170 + 20 +5.255269 + 30 +0.0 + 10 +0.930201 + 20 +5.080430 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +3.960911 + 20 +1.219511 + 30 +0.0 + 10 +4.094395 + 20 +1.292893 + 30 +0.0 + 10 +4.150364 + 20 +1.467904 + 30 +0.0 + 10 +4.150364 + 20 +5.080430 + 30 +0.0 + 10 +4.094395 + 20 +5.255269 + 30 +0.0 + 10 +3.960911 + 20 +5.328476 + 30 +0.0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 0 +LWPOLYLINE + 5 +139 +100 +AcDbEntity + 8 +p_ + 62 +7 +100 +AcDbPolyline + 90 +15 + 70 +0 + 10 +3.960969 + 20 +6.527509 + 30 +0.0 + 10 +4.395688 + 20 +6.414680 + 30 +0.0 + 10 +4.753028 + 20 +6.098595 + 30 +0.0 + 10 +4.994100 + 20 +5.630061 + 30 +0.0 + 10 +5.080282 + 20 +5.060242 + 30 +0.0 + 10 +5.080282 + 20 +1.447716 + 30 +0.0 + 10 +4.994100 + 20 +0.877551 + 30 +0.0 + 10 +4.753028 + 20 +0.409017 + 30 +0.0 + 10 +4.395688 + 20 +0.092932 + 30 +0.0 + 10 +3.960969 + 20 +-0.019897 + 30 +0.0 + 10 +0.930153 + 20 +-0.019897 + 30 +0.0 + 10 +0.930153 + 20 +-2.616465 + 30 +0.0 + 10 +0.000282 + 20 +-2.616465 + 30 +0.0 + 10 +0.000282 + 20 +6.527509 + 30 +0.0 + 10 +3.960969 + 20 +6.527509 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13a +100 +AcDbEntity + 8 +p_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.150411 + 20 +5.060242 + 30 +0.0 + 10 +4.094446 + 20 +5.235079 + 30 +0.0 + 10 +3.960969 + 20 +5.308288 + 30 +0.0 + 10 +1.119595 + 20 +5.308288 + 30 +0.0 + 10 +0.986119 + 20 +5.235079 + 30 +0.0 + 10 +0.930153 + 20 +5.060242 + 30 +0.0 + 10 +0.930153 + 20 +1.447716 + 30 +0.0 + 10 +0.986119 + 20 +1.272704 + 30 +0.0 + 10 +1.119595 + 20 +1.199323 + 30 +0.0 + 10 +3.960969 + 20 +1.199323 + 30 +0.0 + 10 +4.094446 + 20 +1.272704 + 30 +0.0 + 10 +4.150411 + 20 +1.447716 + 30 +0.0 + 10 +4.150411 + 20 +5.060242 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13b +100 +AcDbEntity + 8 +q_ + 62 +7 +100 +AcDbPolyline + 90 +15 + 70 +0 + 10 +0.000282 + 20 +5.079011 + 30 +0.0 + 10 +0.086469 + 20 +5.648829 + 30 +0.0 + 10 +0.327554 + 20 +6.117363 + 30 +0.0 + 10 +0.684780 + 20 +6.433450 + 30 +0.0 + 10 +1.119653 + 20 +6.546276 + 30 +0.0 + 10 +5.080283 + 20 +6.546276 + 30 +0.0 + 10 +5.080283 + 20 +-2.597694 + 30 +0.0 + 10 +4.150626 + 20 +-2.597694 + 30 +0.0 + 10 +4.150626 + 20 +-0.001125 + 30 +0.0 + 10 +1.119653 + 20 +-0.001125 + 30 +0.0 + 10 +0.684780 + 20 +0.111701 + 30 +0.0 + 10 +0.327554 + 20 +0.427787 + 30 +0.0 + 10 +0.086469 + 20 +0.896322 + 30 +0.0 + 10 +0.000282 + 20 +1.466485 + 30 +0.0 + 10 +0.000282 + 20 +5.079011 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13c +100 +AcDbEntity + 8 +q_ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +0.930201 + 20 +1.466485 + 30 +0.0 + 10 +0.986170 + 20 +1.291475 + 30 +0.0 + 10 +1.119653 + 20 +1.218093 + 30 +0.0 + 10 +3.961174 + 20 +1.218093 + 30 +0.0 + 10 +4.094658 + 20 +1.291475 + 30 +0.0 + 10 +4.150626 + 20 +1.466485 + 30 +0.0 + 10 +4.150626 + 20 +5.079011 + 30 +0.0 + 10 +4.094658 + 20 +5.253851 + 30 +0.0 + 10 +3.961174 + 20 +5.327058 + 30 +0.0 + 10 +1.119653 + 20 +5.327058 + 30 +0.0 + 10 +0.986170 + 20 +5.253851 + 30 +0.0 + 10 +0.930201 + 20 +5.079011 + 30 +0.0 + 10 +0.930201 + 20 +1.466485 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13d +100 +AcDbEntity + 8 +r_ + 62 +7 +100 +AcDbPolyline + 90 +14 + 70 +0 + 10 +4.559172 + 20 +6.547693 + 30 +0.0 + 10 +4.559172 + 20 +5.328474 + 30 +0.0 + 10 +1.739454 + 20 +5.328474 + 30 +0.0 + 10 +1.604537 + 20 +5.255264 + 30 +0.0 + 10 +1.547967 + 20 +5.080428 + 30 +0.0 + 10 +1.547967 + 20 +0.000289 + 30 +0.0 + 10 +0.608061 + 20 +0.000289 + 30 +0.0 + 10 +0.608061 + 20 +1.467898 + 30 +0.0 + 10 +0.608061 + 20 +5.080428 + 30 +0.0 + 10 +0.695040 + 20 +5.650244 + 30 +0.0 + 10 +0.938715 + 20 +6.118777 + 30 +0.0 + 10 +1.299911 + 20 +6.434864 + 30 +0.0 + 10 +1.739454 + 20 +6.547693 + 30 +0.0 + 10 +4.559172 + 20 +6.547693 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13e +100 +AcDbEntity + 8 +s_ + 62 +7 +100 +AcDbPolyline + 90 +53 + 70 +0 + 10 +5.080282 + 20 +4.832041 + 30 +0.0 + 10 +4.150363 + 20 +4.832041 + 30 +0.0 + 10 +4.150363 + 20 +5.080430 + 30 +0.0 + 10 +4.094395 + 20 +5.255269 + 30 +0.0 + 10 +3.960911 + 20 +5.328476 + 30 +0.0 + 10 +1.119653 + 20 +5.328476 + 30 +0.0 + 10 +0.986170 + 20 +5.255269 + 30 +0.0 + 10 +0.930201 + 20 +5.080430 + 30 +0.0 + 10 +0.930201 + 20 +4.131995 + 30 +0.0 + 10 +0.986170 + 20 +3.956985 + 30 +0.0 + 10 +1.119653 + 20 +3.883606 + 30 +0.0 + 10 +3.960911 + 20 +3.883606 + 30 +0.0 + 10 +4.395784 + 20 +3.770777 + 30 +0.0 + 10 +4.753142 + 20 +3.454690 + 30 +0.0 + 10 +4.994227 + 20 +2.986159 + 30 +0.0 + 10 +5.080282 + 20 +2.415996 + 30 +0.0 + 10 +5.080282 + 20 +1.467904 + 30 +0.0 + 10 +4.994227 + 20 +0.897741 + 30 +0.0 + 10 +4.753142 + 20 +0.429209 + 30 +0.0 + 10 +4.395784 + 20 +0.113119 + 30 +0.0 + 10 +3.960911 + 20 +0.000293 + 30 +0.0 + 10 +1.119653 + 20 +0.000293 + 30 +0.0 + 10 +0.684780 + 20 +0.113119 + 30 +0.0 + 10 +0.327422 + 20 +0.429209 + 30 +0.0 + 10 +0.086337 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +1.716296 + 30 +0.0 + 10 +0.930201 + 20 +1.716296 + 30 +0.0 + 10 +0.930201 + 20 +1.467904 + 30 +0.0 + 10 +0.986170 + 20 +1.292893 + 30 +0.0 + 10 +1.119653 + 20 +1.219511 + 30 +0.0 + 10 +3.960911 + 20 +1.219511 + 30 +0.0 + 10 +4.094395 + 20 +1.292893 + 30 +0.0 + 10 +4.150363 + 20 +1.467904 + 30 +0.0 + 10 +4.150363 + 20 +2.415996 + 30 +0.0 + 10 +4.094395 + 20 +2.591006 + 30 +0.0 + 10 +3.960911 + 20 +2.664385 + 30 +0.0 + 10 +1.119653 + 20 +2.664385 + 30 +0.0 + 10 +0.684780 + 20 +2.777385 + 30 +0.0 + 10 +0.327422 + 20 +3.093472 + 30 +0.0 + 10 +0.086337 + 20 +3.561832 + 30 +0.0 + 10 +0.000282 + 20 +4.131995 + 30 +0.0 + 10 +0.000282 + 20 +5.080430 + 30 +0.0 + 10 +0.086337 + 20 +5.650251 + 30 +0.0 + 10 +0.327422 + 20 +6.118782 + 30 +0.0 + 10 +0.684780 + 20 +6.434872 + 30 +0.0 + 10 +1.119653 + 20 +6.547698 + 30 +0.0 + 10 +3.960911 + 20 +6.547698 + 30 +0.0 + 10 +4.395784 + 20 +6.434872 + 30 +0.0 + 10 +4.753142 + 20 +6.118782 + 30 +0.0 + 10 +4.994227 + 20 +5.650251 + 30 +0.0 + 10 +5.080282 + 20 +5.080430 + 30 +0.0 + 10 +5.080282 + 20 +4.832041 + 30 +0.0 + 0 +LWPOLYLINE + 5 +13f +100 +AcDbEntity + 8 +t_ + 62 +7 +100 +AcDbPolyline + 90 +18 + 70 +0 + 10 +1.574120 + 20 +5.328471 + 30 +0.0 + 10 +1.574120 + 20 +1.467898 + 30 +0.0 + 10 +1.632447 + 20 +1.292888 + 30 +0.0 + 10 +1.771554 + 20 +1.219507 + 30 +0.0 + 10 +3.709470 + 20 +1.219507 + 30 +0.0 + 10 +3.709470 + 20 +0.000287 + 30 +0.0 + 10 +1.771554 + 20 +0.000287 + 30 +0.0 + 10 +1.318360 + 20 +0.113113 + 30 +0.0 + 10 +0.945947 + 20 +0.429203 + 30 +0.0 + 10 +0.694706 + 20 +0.897735 + 30 +0.0 + 10 +0.605025 + 20 +1.467898 + 30 +0.0 + 10 +0.605025 + 20 +5.080425 + 30 +0.0 + 10 +0.605025 + 20 +8.692607 + 30 +0.0 + 10 +1.574120 + 20 +8.692607 + 30 +0.0 + 10 +1.574120 + 20 +6.547692 + 30 +0.0 + 10 +3.709470 + 20 +6.547692 + 30 +0.0 + 10 +3.709470 + 20 +5.328471 + 30 +0.0 + 10 +1.574120 + 20 +5.328471 + 30 +0.0 + 0 +LWPOLYLINE + 5 +140 +100 +AcDbEntity + 8 +u_ + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +5.080565 + 20 +6.547698 + 30 +0.0 + 10 +5.080565 + 20 +1.467904 + 30 +0.0 + 10 +4.994378 + 20 +0.897741 + 30 +0.0 + 10 +4.753293 + 20 +0.429209 + 30 +0.0 + 10 +4.396067 + 20 +0.113119 + 30 +0.0 + 10 +3.961194 + 20 +0.000293 + 30 +0.0 + 10 +1.119936 + 20 +0.000293 + 30 +0.0 + 10 +0.685063 + 20 +0.113119 + 30 +0.0 + 10 +0.327705 + 20 +0.429209 + 30 +0.0 + 10 +0.086619 + 20 +0.897741 + 30 +0.0 + 10 +0.000564 + 20 +1.467904 + 30 +0.0 + 10 +0.000564 + 20 +6.547698 + 30 +0.0 + 10 +0.930483 + 20 +6.547698 + 30 +0.0 + 10 +0.930483 + 20 +1.467904 + 30 +0.0 + 10 +0.986452 + 20 +1.292893 + 30 +0.0 + 10 +1.119936 + 20 +1.219511 + 30 +0.0 + 10 +3.961194 + 20 +1.219511 + 30 +0.0 + 10 +4.094677 + 20 +1.292893 + 30 +0.0 + 10 +4.150646 + 20 +1.467904 + 30 +0.0 + 10 +4.150646 + 20 +6.547698 + 30 +0.0 + 10 +5.080565 + 20 +6.547698 + 30 +0.0 + 0 +LWPOLYLINE + 5 +141 +100 +AcDbEntity + 8 +v_ + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +5.080282 + 20 +6.547685 + 30 +0.0 + 10 +2.907018 + 20 +0.000280 + 30 +0.0 + 10 +2.173546 + 20 +0.000280 + 30 +0.0 + 10 +0.000282 + 20 +6.547685 + 30 +0.0 + 10 +0.849194 + 20 +6.547685 + 30 +0.0 + 10 +2.540178 + 20 +1.377630 + 30 +0.0 + 10 +4.238002 + 20 +6.547685 + 30 +0.0 + 10 +5.080282 + 20 +6.547685 + 30 +0.0 + 0 +LWPOLYLINE + 5 +142 +100 +AcDbEntity + 8 +w_ + 62 +7 +100 +AcDbPolyline + 90 +16 + 70 +0 + 10 +5.081129 + 20 +6.547692 + 30 +0.0 + 10 +3.974714 + 20 +0.000290 + 30 +0.0 + 10 +3.528214 + 20 +0.000290 + 30 +0.0 + 10 +2.538574 + 20 +4.865799 + 30 +0.0 + 10 +1.604842 + 20 +0.000290 + 30 +0.0 + 10 +1.594621 + 20 +0.011655 + 30 +0.0 + 10 +1.599731 + 20 +0.000290 + 30 +0.0 + 10 +1.158188 + 20 +0.000290 + 30 +0.0 + 10 +0.001129 + 20 +6.547692 + 30 +0.0 + 10 +0.731324 + 20 +6.547692 + 30 +0.0 + 10 +1.440180 + 20 +2.540005 + 30 +0.0 + 10 +2.228982 + 20 +6.547692 + 30 +0.0 + 10 +2.853121 + 20 +6.547692 + 30 +0.0 + 10 +3.663527 + 20 +2.540005 + 30 +0.0 + 10 +4.324970 + 20 +6.547692 + 30 +0.0 + 10 +5.081129 + 20 +6.547692 + 30 +0.0 + 0 +LWPOLYLINE + 5 +143 +100 +AcDbEntity + 8 +x_ + 62 +7 +100 +AcDbPolyline + 90 +17 + 70 +0 + 10 +5.080282 + 20 +6.547696 + 30 +0.0 + 10 +5.080282 + 20 +6.378542 + 30 +0.0 + 10 +3.132876 + 20 +3.330665 + 30 +0.0 + 10 +5.080282 + 20 +0.169791 + 30 +0.0 + 10 +5.080282 + 20 +0.000292 + 30 +0.0 + 10 +3.996638 + 20 +0.000292 + 30 +0.0 + 10 +2.540411 + 20 +2.382229 + 30 +0.0 + 10 +1.084184 + 20 +0.000292 + 30 +0.0 + 10 +0.000282 + 20 +0.000292 + 30 +0.0 + 10 +0.000282 + 20 +0.169791 + 30 +0.0 + 10 +1.939162 + 20 +3.330665 + 30 +0.0 + 10 +0.000282 + 20 +6.378542 + 30 +0.0 + 10 +0.000282 + 20 +6.547696 + 30 +0.0 + 10 +1.084184 + 20 +6.547696 + 30 +0.0 + 10 +2.540411 + 20 +4.278756 + 30 +0.0 + 10 +3.996638 + 20 +6.547696 + 30 +0.0 + 10 +5.080282 + 20 +6.547696 + 30 +0.0 + 0 +LWPOLYLINE + 5 +144 +100 +AcDbEntity + 8 +y_ + 62 +7 +100 +AcDbPolyline + 90 +29 + 70 +0 + 10 +5.080283 + 20 +2.488385 + 30 +0.0 + 10 +5.080283 + 20 +2.465991 + 30 +0.0 + 10 +5.080283 + 20 +-1.146538 + 30 +0.0 + 10 +4.994228 + 20 +-1.716702 + 30 +0.0 + 10 +4.753142 + 20 +-2.185062 + 30 +0.0 + 10 +4.395784 + 20 +-2.501148 + 30 +0.0 + 10 +3.961174 + 20 +-2.614149 + 30 +0.0 + 10 +0.878699 + 20 +-2.614149 + 30 +0.0 + 10 +0.878699 + 20 +-1.394928 + 30 +0.0 + 10 +3.961174 + 20 +-1.394928 + 30 +0.0 + 10 +4.094395 + 20 +-1.321549 + 30 +0.0 + 10 +4.150364 + 20 +-1.146538 + 30 +0.0 + 10 +4.150364 + 20 +-0.017580 + 30 +0.0 + 10 +1.119653 + 20 +-0.017580 + 30 +0.0 + 10 +0.684780 + 20 +0.095249 + 30 +0.0 + 10 +0.327554 + 20 +0.411336 + 30 +0.0 + 10 +0.086469 + 20 +0.879870 + 30 +0.0 + 10 +0.000282 + 20 +1.450033 + 30 +0.0 + 10 +0.000282 + 20 +6.507433 + 30 +0.0 + 10 +0.930201 + 20 +6.507433 + 30 +0.0 + 10 +0.930201 + 20 +1.450033 + 30 +0.0 + 10 +0.986170 + 20 +1.275023 + 30 +0.0 + 10 +1.119653 + 20 +1.201644 + 30 +0.0 + 10 +3.961174 + 20 +1.201644 + 30 +0.0 + 10 +4.094395 + 20 +1.275023 + 30 +0.0 + 10 +4.150364 + 20 +1.450033 + 30 +0.0 + 10 +4.150364 + 20 +6.507433 + 30 +0.0 + 10 +5.080283 + 20 +6.507433 + 30 +0.0 + 10 +5.080283 + 20 +2.488385 + 30 +0.0 + 0 +LWPOLYLINE + 5 +145 +100 +AcDbEntity + 8 +z_ + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +0.000282 + 20 +6.547703 + 30 +0.0 + 10 +5.080282 + 20 +6.547703 + 30 +0.0 + 10 +5.080282 + 20 +5.102810 + 30 +0.0 + 10 +1.240197 + 20 +1.219517 + 30 +0.0 + 10 +5.080282 + 20 +1.219517 + 30 +0.0 + 10 +5.080282 + 20 +0.000288 + 30 +0.0 + 10 +0.000282 + 20 +0.000288 + 30 +0.0 + 10 +0.000282 + 20 +1.445153 + 30 +0.0 + 10 +3.840367 + 20 +5.328475 + 30 +0.0 + 10 +0.000282 + 20 +5.328475 + 30 +0.0 + 10 +0.000282 + 20 +6.547703 + 30 +0.0 + 0 +LWPOLYLINE + 5 +146 +100 +AcDbEntity + 8 +0 + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812104 + 20 +7.699392 + 30 +0.0 + 10 +5.009658 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.812104 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +147 +100 +AcDbEntity + 8 +0 + 62 +7 +100 +AcDbPolyline + 90 +6 + 70 +0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +2.472495 + 30 +0.0 + 10 +4.064196 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 0 +LWPOLYLINE + 5 +148 +100 +AcDbEntity + 8 +0 + 62 +7 +100 +AcDbPolyline + 90 +6 + 70 +0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +5.656106 + 30 +0.0 + 10 +1.016153 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 0 +LWPOLYLINE + 5 +149 +100 +AcDbEntity + 8 +1 + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +2.605402 + 20 +8.128304 + 30 +0.0 + 10 +3.701967 + 20 +8.128304 + 30 +0.0 + 10 +3.701967 + 20 +0.000290 + 30 +0.0 + 10 +2.783882 + 20 +0.000290 + 30 +0.0 + 10 +2.783882 + 20 +6.502564 + 30 +0.0 + 10 +2.078262 + 20 +5.384975 + 30 +0.0 + 10 +0.879745 + 20 +5.384975 + 30 +0.0 + 10 +2.605402 + 20 +8.128304 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14a +100 +AcDbEntity + 8 +2 + 62 +7 +100 +AcDbPolyline + 90 +41 + 70 +0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812103 + 20 +7.699392 + 30 +0.0 + 10 +5.009658 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +4.809302 + 30 +0.0 + 10 +5.009658 + 20 +4.239138 + 30 +0.0 + 10 +4.812103 + 20 +3.770779 + 30 +0.0 + 10 +4.519378 + 20 +3.454693 + 30 +0.0 + 10 +4.163027 + 20 +3.341692 + 30 +0.0 + 10 +0.917537 + 20 +3.341692 + 30 +0.0 + 10 +0.808156 + 20 +3.268310 + 30 +0.0 + 10 +0.762293 + 20 +3.093301 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +0.000293 + 30 +0.0 + 10 +0.000282 + 20 +3.093301 + 30 +0.0 + 10 +0.070799 + 20 +3.663465 + 30 +0.0 + 10 +0.268353 + 20 +4.131996 + 30 +0.0 + 10 +0.561186 + 20 +4.448085 + 30 +0.0 + 10 +0.917537 + 20 +4.560911 + 30 +0.0 + 10 +4.163027 + 20 +4.560911 + 30 +0.0 + 10 +4.272409 + 20 +4.634293 + 30 +0.0 + 10 +4.318271 + 20 +4.809302 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +6.186652 + 30 +0.0 + 10 +0.000282 + 20 +6.186652 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14b +100 +AcDbEntity + 8 +3 + 62 +7 +100 +AcDbPolyline + 90 +49 + 70 +0 + 10 +4.776899 + 20 +4.369020 + 30 +0.0 + 10 +4.999107 + 20 +3.894974 + 30 +0.0 + 10 +5.080282 + 20 +3.285192 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.812104 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +1.806558 + 30 +0.0 + 10 +0.762293 + 20 +1.806558 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.285192 + 30 +0.0 + 10 +4.272409 + 20 +3.460204 + 30 +0.0 + 10 +4.163027 + 20 +3.533583 + 30 +0.0 + 10 +0.917537 + 20 +3.533583 + 30 +0.0 + 10 +0.917537 + 20 +4.752802 + 30 +0.0 + 10 +3.951369 + 20 +4.752802 + 30 +0.0 + 10 +4.060751 + 20 +4.826184 + 30 +0.0 + 10 +4.106614 + 20 +5.001193 + 30 +0.0 + 10 +4.106614 + 20 +6.660697 + 30 +0.0 + 10 +4.060751 + 20 +6.835706 + 30 +0.0 + 10 +3.951369 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +6.209045 + 30 +0.0 + 10 +0.000282 + 20 +6.209045 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +3.951369 + 20 +8.128307 + 30 +0.0 + 10 +4.307721 + 20 +8.015482 + 30 +0.0 + 10 +4.600446 + 20 +7.699392 + 30 +0.0 + 10 +4.798000 + 20 +7.230862 + 30 +0.0 + 10 +4.868624 + 20 +6.660697 + 30 +0.0 + 10 +4.868624 + 20 +5.001193 + 30 +0.0 + 10 +4.776899 + 20 +4.369020 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14c +100 +AcDbEntity + 8 +4 + 62 +7 +100 +AcDbPolyline + 90 +12 + 70 +0 + 10 +5.080282 + 20 +3.285182 + 30 +0.0 + 10 +5.080282 + 20 +2.066306 + 30 +0.0 + 10 +4.299746 + 20 +2.066306 + 30 +0.0 + 10 +4.299746 + 20 +0.000283 + 30 +0.0 + 10 +3.504606 + 20 +0.000283 + 30 +0.0 + 10 +3.504606 + 20 +2.066306 + 30 +0.0 + 10 +0.000282 + 20 +2.066306 + 30 +0.0 + 10 +0.000282 + 20 +3.285182 + 30 +0.0 + 10 +3.504606 + 20 +8.128295 + 30 +0.0 + 10 +4.299746 + 20 +8.128295 + 30 +0.0 + 10 +4.299746 + 20 +3.285182 + 30 +0.0 + 10 +5.080282 + 20 +3.285182 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14d +100 +AcDbEntity + 8 +4 + 62 +7 +100 +AcDbPolyline + 90 +4 + 70 +0 + 10 +1.156033 + 20 +3.285182 + 30 +0.0 + 10 +3.504606 + 20 +3.285182 + 30 +0.0 + 10 +3.504606 + 20 +6.209036 + 30 +0.0 + 10 +1.156033 + 20 +3.285182 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14e +100 +AcDbEntity + 8 +5 + 62 +7 +100 +AcDbPolyline + 90 +41 + 70 +0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +5.035299 + 30 +0.0 + 10 +0.808156 + 20 +4.860290 + 30 +0.0 + 10 +0.917537 + 20 +4.786908 + 30 +0.0 + 10 +4.163027 + 20 +4.786908 + 30 +0.0 + 10 +4.519378 + 20 +4.673911 + 30 +0.0 + 10 +4.812103 + 20 +4.357821 + 30 +0.0 + 10 +5.009658 + 20 +3.889463 + 30 +0.0 + 10 +5.080282 + 20 +3.319298 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.812103 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +1.941949 + 30 +0.0 + 10 +0.762293 + 20 +1.941949 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.319298 + 30 +0.0 + 10 +4.272409 + 20 +3.494311 + 30 +0.0 + 10 +4.163027 + 20 +3.567689 + 30 +0.0 + 10 +0.000282 + 20 +3.567689 + 30 +0.0 + 10 +0.000282 + 20 +4.786908 + 30 +0.0 + 10 +0.014278 + 20 +4.786908 + 30 +0.0 + 10 +0.003835 + 20 +4.905249 + 30 +0.0 + 10 +0.000282 + 20 +5.035299 + 30 +0.0 + 10 +0.000282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +8.128307 + 30 +0.0 + 10 +5.080282 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 0 +LWPOLYLINE + 5 +14f +100 +AcDbEntity + 8 +6 + 62 +7 +100 +AcDbPolyline + 90 +30 + 70 +0 + 10 +4.163027 + 20 +4.786908 + 30 +0.0 + 10 +4.519378 + 20 +4.673911 + 30 +0.0 + 10 +4.812104 + 20 +4.357821 + 30 +0.0 + 10 +5.009658 + 20 +3.889463 + 30 +0.0 + 10 +5.080282 + 20 +3.319298 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.812104 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.233652 + 20 +8.128307 + 30 +0.0 + 10 +4.233652 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +5.035299 + 30 +0.0 + 10 +0.808156 + 20 +4.860290 + 30 +0.0 + 10 +0.917537 + 20 +4.786908 + 30 +0.0 + 10 +3.316396 + 20 +4.786908 + 30 +0.0 + 10 +4.163027 + 20 +4.786908 + 30 +0.0 + 0 +LWPOLYLINE + 5 +150 +100 +AcDbEntity + 8 +6 + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +4.318271 + 20 +3.319298 + 30 +0.0 + 10 +4.272409 + 20 +3.494311 + 30 +0.0 + 10 +4.163027 + 20 +3.567689 + 30 +0.0 + 10 +0.762293 + 20 +3.567689 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.319298 + 30 +0.0 + 0 +LWPOLYLINE + 5 +151 +100 +AcDbEntity + 8 +7 + 62 +7 +100 +AcDbPolyline + 90 +14 + 70 +0 + 10 +0.085031 + 20 +8.128304 + 30 +0.0 + 10 +3.979585 + 20 +8.128304 + 30 +0.0 + 10 +4.407203 + 20 +8.015479 + 30 +0.0 + 10 +4.758600 + 20 +7.699392 + 30 +0.0 + 10 +4.995663 + 20 +7.230859 + 30 +0.0 + 10 +5.080282 + 20 +6.660696 + 30 +0.0 + 10 +5.080282 + 20 +0.000292 + 30 +0.0 + 10 +4.165877 + 20 +0.000292 + 30 +0.0 + 10 +4.165877 + 20 +6.660696 + 30 +0.0 + 10 +4.110842 + 20 +6.835705 + 30 +0.0 + 10 +3.979585 + 20 +6.909084 + 30 +0.0 + 10 +0.000282 + 20 +6.909084 + 30 +0.0 + 10 +0.000282 + 20 +8.128304 + 30 +0.0 + 10 +0.085031 + 20 +8.128304 + 30 +0.0 + 0 +LWPOLYLINE + 5 +152 +100 +AcDbEntity + 8 +8 + 62 +7 +100 +AcDbPolyline + 90 +27 + 70 +0 + 10 +5.080282 + 20 +5.035299 + 30 +0.0 + 10 +4.903937 + 20 +4.177129 + 30 +0.0 + 10 +5.080282 + 20 +3.319298 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009658 + 20 +0.897742 + 30 +0.0 + 10 +4.812103 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +3.319298 + 30 +0.0 + 10 +0.176628 + 20 +4.177129 + 30 +0.0 + 10 +0.000282 + 20 +5.035299 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.487511 + 20 +8.032360 + 30 +0.0 + 10 +4.762688 + 20 +7.772774 + 30 +0.0 + 10 +4.967348 + 20 +7.388989 + 30 +0.0 + 10 +5.080282 + 20 +6.909088 + 30 +0.0 + 10 +5.080282 + 20 +5.035299 + 30 +0.0 + 0 +LWPOLYLINE + 5 +153 +100 +AcDbEntity + 8 +8 + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.318271 + 20 +3.319298 + 30 +0.0 + 10 +4.272409 + 20 +3.494311 + 30 +0.0 + 10 +4.163027 + 20 +3.567689 + 30 +0.0 + 10 +0.917537 + 20 +3.567689 + 30 +0.0 + 10 +0.808156 + 20 +3.494311 + 30 +0.0 + 10 +0.762293 + 20 +3.319298 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.319298 + 30 +0.0 + 0 +LWPOLYLINE + 5 +154 +100 +AcDbEntity + 8 +8 + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.318271 + 20 +6.649327 + 30 +0.0 + 10 +4.272409 + 20 +6.824340 + 30 +0.0 + 10 +4.163027 + 20 +6.897718 + 30 +0.0 + 10 +0.917537 + 20 +6.897718 + 30 +0.0 + 10 +0.808156 + 20 +6.824340 + 30 +0.0 + 10 +0.762293 + 20 +6.649327 + 30 +0.0 + 10 +0.762293 + 20 +4.910933 + 30 +0.0 + 10 +0.808156 + 20 +4.735924 + 30 +0.0 + 10 +0.917537 + 20 +4.662541 + 30 +0.0 + 10 +4.163027 + 20 +4.662541 + 30 +0.0 + 10 +4.272409 + 20 +4.735924 + 30 +0.0 + 10 +4.318271 + 20 +4.910933 + 30 +0.0 + 10 +4.318271 + 20 +6.649327 + 30 +0.0 + 0 +LWPOLYLINE + 5 +155 +100 +AcDbEntity + 8 +9 + 62 +7 +100 +AcDbPolyline + 90 +33 + 70 +0 + 10 +0.917537 + 20 +3.341692 + 30 +0.0 + 10 +0.561186 + 20 +3.454693 + 30 +0.0 + 10 +0.268461 + 20 +3.770779 + 30 +0.0 + 10 +0.070907 + 20 +4.239138 + 30 +0.0 + 10 +0.000282 + 20 +4.809302 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070907 + 20 +7.230862 + 30 +0.0 + 10 +0.268461 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812211 + 20 +7.699392 + 30 +0.0 + 10 +5.009765 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +1.467903 + 30 +0.0 + 10 +5.009765 + 20 +0.897742 + 30 +0.0 + 10 +4.812211 + 20 +0.429209 + 30 +0.0 + 10 +4.519378 + 20 +0.113122 + 30 +0.0 + 10 +4.163027 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.596606 + 20 +0.096240 + 30 +0.0 + 10 +0.324874 + 20 +0.355827 + 30 +0.0 + 10 +0.123767 + 20 +0.739612 + 30 +0.0 + 10 +0.014493 + 20 +1.219512 + 30 +0.0 + 10 +4.163027 + 20 +1.219512 + 30 +0.0 + 10 +4.272409 + 20 +1.292894 + 30 +0.0 + 10 +4.318271 + 20 +1.467903 + 30 +0.0 + 10 +4.318271 + 20 +3.093301 + 30 +0.0 + 10 +4.272409 + 20 +3.268310 + 30 +0.0 + 10 +4.163027 + 20 +3.341692 + 30 +0.0 + 10 +1.764168 + 20 +3.341692 + 30 +0.0 + 10 +0.917537 + 20 +3.341692 + 30 +0.0 + 0 +LWPOLYLINE + 5 +156 +100 +AcDbEntity + 8 +9 + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +0.762293 + 20 +4.809302 + 30 +0.0 + 10 +0.808156 + 20 +4.634293 + 30 +0.0 + 10 +0.917537 + 20 +4.560911 + 30 +0.0 + 10 +4.318271 + 20 +4.560911 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +4.809302 + 30 +0.0 + 0 +LWPOLYLINE + 5 +157 +100 +AcDbEntity + 8 +~ + 62 +7 +100 +AcDbPolyline + 90 +22 + 70 +0 + 10 +3.488189 + 20 +3.612248 + 30 +0.0 + 10 +3.951038 + 20 +3.691327 + 30 +0.0 + 10 +4.368756 + 20 +3.905788 + 30 +0.0 + 10 +4.368756 + 20 +3.070353 + 30 +0.0 + 10 +3.967919 + 20 +2.929270 + 30 +0.0 + 10 +3.488189 + 20 +2.867097 + 30 +0.0 + 10 +2.918026 + 20 +2.985602 + 30 +0.0 + 10 +2.381797 + 20 +3.250863 + 30 +0.0 + 10 +1.828687 + 20 +3.516152 + 30 +0.0 + 10 +1.230274 + 20 +3.634657 + 30 +0.0 + 10 +1.015817 + 20 +3.629012 + 30 +0.0 + 10 +0.773110 + 20 +3.595258 + 30 +0.0 + 10 +0.552968 + 20 +3.516208 + 30 +0.0 + 10 +0.394838 + 20 +3.375125 + 30 +0.0 + 10 +0.394838 + 20 +4.221594 + 30 +0.0 + 10 +0.761913 + 20 +4.334568 + 30 +0.0 + 10 +1.230274 + 20 +4.379723 + 30 +0.0 + 10 +1.817490 + 20 +4.272394 + 30 +0.0 + 10 +2.359232 + 20 +4.029683 + 30 +0.0 + 10 +2.900973 + 20 +3.770095 + 30 +0.0 + 10 +3.488189 + 20 +3.612135 + 30 +0.0 + 10 +3.488189 + 20 +3.612248 + 30 +0.0 + 0 +LWPOLYLINE + 5 +158 +100 +AcDbEntity + 8 +` + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.933783 + 20 +6.256985 + 30 +0.0 + 10 +2.216608 + 20 +6.256985 + 30 +0.0 + 10 +2.216608 + 20 +8.085504 + 30 +0.0 + 10 +2.933783 + 20 +8.085504 + 30 +0.0 + 10 +2.933783 + 20 +6.256985 + 30 +0.0 + 0 +LWPOLYLINE + 5 +159 +100 +AcDbEntity + 8 +! + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +1.910957 + 20 +0.000292 + 30 +0.0 + 10 +1.910957 + 20 +1.219511 + 30 +0.0 + 10 +2.757623 + 20 +1.219511 + 30 +0.0 + 10 +2.757623 + 20 +0.000292 + 30 +0.0 + 10 +1.910957 + 20 +0.000292 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15a +100 +AcDbEntity + 8 +! + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +1.910957 + 20 +8.128291 + 30 +0.0 + 10 +2.757623 + 20 +8.128291 + 30 +0.0 + 10 +2.757623 + 20 +2.258205 + 30 +0.0 + 10 +1.910957 + 20 +2.258205 + 30 +0.0 + 10 +1.910957 + 20 +8.128291 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15b +100 +AcDbEntity + 8 +@ + 62 +7 +100 +AcDbPolyline + 90 +45 + 70 +0 + 10 +2.857769 + 20 +5.983391 + 30 +0.0 + 10 +3.214120 + 20 +5.870565 + 30 +0.0 + 10 +3.506845 + 20 +5.554475 + 30 +0.0 + 10 +3.704399 + 20 +5.085945 + 30 +0.0 + 10 +3.775024 + 20 +4.515781 + 30 +0.0 + 10 +3.775024 + 20 +3.138778 + 30 +0.0 + 10 +4.318271 + 20 +3.138778 + 30 +0.0 + 10 +4.318271 + 20 +6.660697 + 30 +0.0 + 10 +4.272409 + 20 +6.835706 + 30 +0.0 + 10 +4.163027 + 20 +6.909088 + 30 +0.0 + 10 +0.917537 + 20 +6.909088 + 30 +0.0 + 10 +0.808156 + 20 +6.835706 + 30 +0.0 + 10 +0.762293 + 20 +6.660697 + 30 +0.0 + 10 +0.762293 + 20 +1.467903 + 30 +0.0 + 10 +0.808156 + 20 +1.292894 + 30 +0.0 + 10 +0.917537 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +1.219512 + 30 +0.0 + 10 +5.080282 + 20 +0.000293 + 30 +0.0 + 10 +0.917537 + 20 +0.000293 + 30 +0.0 + 10 +0.561186 + 20 +0.113122 + 30 +0.0 + 10 +0.268353 + 20 +0.429209 + 30 +0.0 + 10 +0.070799 + 20 +0.897742 + 30 +0.0 + 10 +0.000282 + 20 +1.467903 + 30 +0.0 + 10 +0.000282 + 20 +6.660697 + 30 +0.0 + 10 +0.070799 + 20 +7.230862 + 30 +0.0 + 10 +0.268353 + 20 +7.699392 + 30 +0.0 + 10 +0.561186 + 20 +8.015482 + 30 +0.0 + 10 +0.917537 + 20 +8.128307 + 30 +0.0 + 10 +4.163027 + 20 +8.128307 + 30 +0.0 + 10 +4.519378 + 20 +8.015482 + 30 +0.0 + 10 +4.812104 + 20 +7.699392 + 30 +0.0 + 10 +5.009658 + 20 +7.230862 + 30 +0.0 + 10 +5.080282 + 20 +6.660697 + 30 +0.0 + 10 +5.080282 + 20 +2.145210 + 30 +0.0 + 10 +2.222796 + 20 +2.145210 + 30 +0.0 + 10 +1.866444 + 20 +2.258039 + 30 +0.0 + 10 +1.573612 + 20 +2.574125 + 30 +0.0 + 10 +1.376057 + 20 +3.042659 + 30 +0.0 + 10 +1.305541 + 20 +3.612820 + 30 +0.0 + 10 +1.305541 + 20 +4.515781 + 30 +0.0 + 10 +1.376057 + 20 +5.085945 + 30 +0.0 + 10 +1.573612 + 20 +5.554475 + 30 +0.0 + 10 +1.866444 + 20 +5.870565 + 30 +0.0 + 10 +2.222796 + 20 +5.983391 + 30 +0.0 + 10 +2.857769 + 20 +5.983391 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15c +100 +AcDbEntity + 8 +@ + 62 +7 +100 +AcDbPolyline + 90 +11 + 70 +0 + 10 +3.154046 + 20 +3.138778 + 30 +0.0 + 10 +3.154046 + 20 +4.741778 + 30 +0.0 + 10 +3.108184 + 20 +4.916444 + 30 +0.0 + 10 +2.998802 + 20 +4.989826 + 30 +0.0 + 10 +2.081547 + 20 +4.989826 + 30 +0.0 + 10 +1.972165 + 20 +4.916444 + 30 +0.0 + 10 +1.926303 + 20 +4.741778 + 30 +0.0 + 10 +1.926303 + 20 +3.386822 + 30 +0.0 + 10 +1.972165 + 20 +3.211985 + 30 +0.0 + 10 +2.081547 + 20 +3.138778 + 30 +0.0 + 10 +3.154046 + 20 +3.138778 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15d +100 +AcDbEntity + 8 +# + 62 +7 +100 +AcDbPolyline + 90 +29 + 70 +0 + 10 +5.080282 + 20 +5.080417 + 30 +0.0 + 10 +4.255435 + 20 +5.080417 + 30 +0.0 + 10 +3.853586 + 20 +3.070894 + 30 +0.0 + 10 +4.865399 + 20 +3.070894 + 30 +0.0 + 10 +4.865399 + 20 +1.851674 + 30 +0.0 + 10 +3.617765 + 20 +1.851674 + 30 +0.0 + 10 +3.271329 + 20 +0.000280 + 30 +0.0 + 10 +2.522834 + 20 +0.000280 + 30 +0.0 + 10 +2.869481 + 20 +1.851674 + 30 +0.0 + 10 +1.379257 + 20 +1.851674 + 30 +0.0 + 10 +1.032821 + 20 +0.000280 + 30 +0.0 + 10 +0.284326 + 20 +0.000280 + 30 +0.0 + 10 +0.630761 + 20 +1.851674 + 30 +0.0 + 10 +0.000282 + 20 +1.851674 + 30 +0.0 + 10 +0.000282 + 20 +3.070894 + 30 +0.0 + 10 +0.866583 + 20 +3.070894 + 30 +0.0 + 10 +1.268432 + 20 +5.080417 + 30 +0.0 + 10 +0.214954 + 20 +5.080417 + 30 +0.0 + 10 +0.214954 + 20 +6.299637 + 30 +0.0 + 10 +1.504042 + 20 +6.299637 + 30 +0.0 + 10 +1.878395 + 20 +8.094531 + 30 +0.0 + 10 +2.626891 + 20 +8.094531 + 30 +0.0 + 10 +2.252537 + 20 +6.299637 + 30 +0.0 + 10 +3.742549 + 20 +6.299637 + 30 +0.0 + 10 +4.116903 + 20 +8.094531 + 30 +0.0 + 10 +4.865399 + 20 +8.094531 + 30 +0.0 + 10 +4.491045 + 20 +6.299637 + 30 +0.0 + 10 +5.080282 + 20 +6.299637 + 30 +0.0 + 10 +5.080282 + 20 +5.080417 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15e +100 +AcDbEntity + 8 +# + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +3.105091 + 20 +3.070894 + 30 +0.0 + 10 +3.506939 + 20 +5.080417 + 30 +0.0 + 10 +2.016927 + 20 +5.080417 + 30 +0.0 + 10 +1.615079 + 20 +3.070894 + 30 +0.0 + 10 +3.105091 + 20 +3.070894 + 30 +0.0 + 0 +LWPOLYLINE + 5 +15f +100 +AcDbEntity + 8 +$ + 62 +7 +100 +AcDbPolyline + 90 +53 + 70 +0 + 10 +5.080282 + 20 +6.155387 + 30 +0.0 + 10 +4.318271 + 20 +6.155387 + 30 +0.0 + 10 +4.318271 + 20 +6.629429 + 30 +0.0 + 10 +4.272409 + 20 +6.804441 + 30 +0.0 + 10 +4.163027 + 20 +6.877820 + 30 +0.0 + 10 +2.921288 + 20 +6.877820 + 30 +0.0 + 10 +2.921288 + 20 +4.642643 + 30 +0.0 + 10 +4.163027 + 20 +4.642643 + 30 +0.0 + 10 +4.519379 + 20 +4.529817 + 30 +0.0 + 10 +4.812211 + 20 +4.213731 + 30 +0.0 + 10 +5.009766 + 20 +3.745197 + 30 +0.0 + 10 +5.080282 + 20 +3.175033 + 30 +0.0 + 10 +5.080282 + 20 +1.436638 + 30 +0.0 + 10 +5.009766 + 20 +0.866474 + 30 +0.0 + 10 +4.812211 + 20 +0.397940 + 30 +0.0 + 10 +4.519379 + 20 +0.081854 + 30 +0.0 + 10 +4.163027 + 20 +-0.030972 + 30 +0.0 + 10 +2.921288 + 20 +-0.030972 + 30 +0.0 + 10 +2.921288 + 20 +-1.250191 + 30 +0.0 + 10 +2.159277 + 20 +-1.250191 + 30 +0.0 + 10 +2.159277 + 20 +-0.030972 + 30 +0.0 + 10 +0.917537 + 20 +-0.030972 + 30 +0.0 + 10 +0.561186 + 20 +0.081854 + 30 +0.0 + 10 +0.268353 + 20 +0.397940 + 30 +0.0 + 10 +0.070799 + 20 +0.866474 + 30 +0.0 + 10 +0.000282 + 20 +1.436638 + 30 +0.0 + 10 +0.000282 + 20 +1.910684 + 30 +0.0 + 10 +0.762293 + 20 +1.910684 + 30 +0.0 + 10 +0.762293 + 20 +1.436638 + 30 +0.0 + 10 +0.808156 + 20 +1.261626 + 30 +0.0 + 10 +0.917537 + 20 +1.188247 + 30 +0.0 + 10 +2.159277 + 20 +1.188247 + 30 +0.0 + 10 +2.159277 + 20 +3.423424 + 30 +0.0 + 10 +0.917537 + 20 +3.423424 + 30 +0.0 + 10 +0.561186 + 20 +3.536250 + 30 +0.0 + 10 +0.268353 + 20 +3.852340 + 30 +0.0 + 10 +0.070799 + 20 +4.320873 + 30 +0.0 + 10 +0.000282 + 20 +4.891034 + 30 +0.0 + 10 +0.000282 + 20 +6.629429 + 30 +0.0 + 10 +0.070799 + 20 +7.199593 + 30 +0.0 + 10 +0.268353 + 20 +7.668127 + 30 +0.0 + 10 +0.561186 + 20 +7.984213 + 30 +0.0 + 10 +0.917537 + 20 +8.097042 + 30 +0.0 + 10 +2.159277 + 20 +8.097042 + 30 +0.0 + 10 +2.159277 + 20 +9.316261 + 30 +0.0 + 10 +2.921288 + 20 +9.316261 + 30 +0.0 + 10 +2.921288 + 20 +8.097042 + 30 +0.0 + 10 +4.163027 + 20 +8.097042 + 30 +0.0 + 10 +4.519379 + 20 +7.984213 + 30 +0.0 + 10 +4.812211 + 20 +7.668127 + 30 +0.0 + 10 +5.009766 + 20 +7.199593 + 30 +0.0 + 10 +5.080282 + 20 +6.629429 + 30 +0.0 + 10 +5.080282 + 20 +6.155387 + 30 +0.0 + 0 +LWPOLYLINE + 5 +160 +100 +AcDbEntity + 8 +$ + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +2.921288 + 20 +3.423424 + 30 +0.0 + 10 +2.921288 + 20 +1.188247 + 30 +0.0 + 10 +4.163027 + 20 +1.188247 + 30 +0.0 + 10 +4.272409 + 20 +1.261626 + 30 +0.0 + 10 +4.318271 + 20 +1.436638 + 30 +0.0 + 10 +4.318271 + 20 +3.175033 + 30 +0.0 + 10 +4.272409 + 20 +3.350046 + 30 +0.0 + 10 +4.163027 + 20 +3.423424 + 30 +0.0 + 10 +2.921288 + 20 +3.423424 + 30 +0.0 + 0 +LWPOLYLINE + 5 +161 +100 +AcDbEntity + 8 +$ + 62 +7 +100 +AcDbPolyline + 90 +10 + 70 +0 + 10 +2.159277 + 20 +4.642643 + 30 +0.0 + 10 +2.159277 + 20 +6.877820 + 30 +0.0 + 10 +0.917537 + 20 +6.877820 + 30 +0.0 + 10 +0.808156 + 20 +6.804441 + 30 +0.0 + 10 +0.762293 + 20 +6.629429 + 30 +0.0 + 10 +0.762293 + 20 +4.891034 + 30 +0.0 + 10 +0.808156 + 20 +4.716025 + 30 +0.0 + 10 +0.917537 + 20 +4.642643 + 30 +0.0 + 10 +1.601818 + 20 +4.642643 + 30 +0.0 + 10 +2.159277 + 20 +4.642643 + 30 +0.0 + 0 +LWPOLYLINE + 5 +162 +100 +AcDbEntity + 8 +% + 62 +7 +100 +AcDbPolyline + 90 +7 + 70 +0 + 10 +4.705739 + 20 +8.139669 + 30 +0.0 + 10 +4.705739 + 20 +6.694796 + 30 +0.0 + 10 +0.579690 + 20 +0.011658 + 30 +0.0 + 10 +0.491814 + 20 +0.011658 + 30 +0.0 + 10 +0.491814 + 20 +1.456530 + 30 +0.0 + 10 +4.618042 + 20 +8.139669 + 30 +0.0 + 10 +4.705739 + 20 +8.139669 + 30 +0.0 + 0 +LWPOLYLINE + 5 +163 +100 +AcDbEntity + 8 +% + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +1.287875 + 20 +8.139669 + 30 +0.0 + 10 +1.583473 + 20 +8.026844 + 30 +0.0 + 10 +1.826292 + 20 +7.710757 + 30 +0.0 + 10 +1.990166 + 20 +7.242221 + 30 +0.0 + 10 +2.048750 + 20 +6.672059 + 30 +0.0 + 10 +2.048750 + 20 +5.769100 + 30 +0.0 + 10 +1.990166 + 20 +5.198938 + 30 +0.0 + 10 +1.826292 + 20 +4.730402 + 30 +0.0 + 10 +1.583473 + 20 +4.414315 + 30 +0.0 + 10 +1.287875 + 20 +4.301490 + 30 +0.0 + 10 +0.761157 + 20 +4.301490 + 30 +0.0 + 10 +0.465559 + 20 +4.414315 + 30 +0.0 + 10 +0.222651 + 20 +4.730402 + 30 +0.0 + 10 +0.058777 + 20 +5.198938 + 30 +0.0 + 10 +0.000282 + 20 +5.769100 + 30 +0.0 + 10 +0.000282 + 20 +6.672059 + 30 +0.0 + 10 +0.058777 + 20 +7.242221 + 30 +0.0 + 10 +0.222651 + 20 +7.710757 + 30 +0.0 + 10 +0.465559 + 20 +8.026844 + 30 +0.0 + 10 +0.761157 + 20 +8.139669 + 30 +0.0 + 10 +1.287875 + 20 +8.139669 + 30 +0.0 + 0 +LWPOLYLINE + 5 +164 +100 +AcDbEntity + 8 +% + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +1.404864 + 20 +5.294709 + 30 +0.0 + 10 +1.495598 + 20 +5.368091 + 30 +0.0 + 10 +1.533641 + 20 +5.543101 + 30 +0.0 + 10 +1.533641 + 20 +6.897713 + 30 +0.0 + 10 +1.495598 + 20 +7.072723 + 30 +0.0 + 10 +1.404864 + 20 +7.146105 + 30 +0.0 + 10 +0.643989 + 20 +7.146105 + 30 +0.0 + 10 +0.553256 + 20 +7.072723 + 30 +0.0 + 10 +0.515212 + 20 +6.897713 + 30 +0.0 + 10 +0.515212 + 20 +5.543101 + 30 +0.0 + 10 +0.553256 + 20 +5.368091 + 30 +0.0 + 10 +0.643989 + 20 +5.294709 + 30 +0.0 + 10 +1.404864 + 20 +5.294709 + 30 +0.0 + 0 +LWPOLYLINE + 5 +165 +100 +AcDbEntity + 8 +% + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +4.319586 + 20 +3.838470 + 30 +0.0 + 10 +4.615005 + 20 +3.725640 + 30 +0.0 + 10 +4.857914 + 20 +3.409553 + 30 +0.0 + 10 +5.021788 + 20 +2.941022 + 30 +0.0 + 10 +5.080282 + 20 +2.371200 + 30 +0.0 + 10 +5.080282 + 20 +1.467897 + 30 +0.0 + 10 +5.021788 + 20 +0.897735 + 30 +0.0 + 10 +4.857914 + 20 +0.429375 + 30 +0.0 + 10 +4.615005 + 20 +0.113288 + 30 +0.0 + 10 +4.319586 + 20 +0.000287 + 30 +0.0 + 10 +3.792868 + 20 +0.000287 + 30 +0.0 + 10 +3.497270 + 20 +0.113288 + 30 +0.0 + 10 +3.254361 + 20 +0.429375 + 30 +0.0 + 10 +3.090488 + 20 +0.897735 + 30 +0.0 + 10 +3.031993 + 20 +1.467897 + 30 +0.0 + 10 +3.031993 + 20 +2.371200 + 30 +0.0 + 10 +3.090488 + 20 +2.941022 + 30 +0.0 + 10 +3.254361 + 20 +3.409553 + 30 +0.0 + 10 +3.497270 + 20 +3.725640 + 30 +0.0 + 10 +3.792868 + 20 +3.838470 + 30 +0.0 + 10 +4.319586 + 20 +3.838470 + 30 +0.0 + 0 +LWPOLYLINE + 5 +166 +100 +AcDbEntity + 8 +% + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +4.436575 + 20 +0.993854 + 30 +0.0 + 10 +4.527308 + 20 +1.067233 + 30 +0.0 + 10 +4.565352 + 20 +1.242242 + 30 +0.0 + 10 +4.565352 + 20 +2.596855 + 30 +0.0 + 10 +4.527308 + 20 +2.771868 + 30 +0.0 + 10 +4.436575 + 20 +2.845247 + 30 +0.0 + 10 +3.675700 + 20 +2.845247 + 30 +0.0 + 10 +3.584967 + 20 +2.771868 + 30 +0.0 + 10 +3.546923 + 20 +2.596855 + 30 +0.0 + 10 +3.546923 + 20 +1.242242 + 30 +0.0 + 10 +3.584967 + 20 +1.067233 + 30 +0.0 + 10 +3.675700 + 20 +0.993854 + 30 +0.0 + 10 +4.436575 + 20 +0.993854 + 30 +0.0 + 0 +LWPOLYLINE + 5 +167 +100 +AcDbEntity + 8 +^ + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +4.640930 + 20 +5.272251 + 30 +0.0 + 10 +2.829876 + 20 +8.094479 + 30 +0.0 + 10 +2.218650 + 20 +8.094479 + 30 +0.0 + 10 +0.407596 + 20 +5.272251 + 30 +0.0 + 10 +1.115023 + 20 +5.272251 + 30 +0.0 + 10 +2.524177 + 20 +7.500776 + 30 +0.0 + 10 +3.939030 + 20 +5.272251 + 30 +0.0 + 10 +4.640930 + 20 +5.272251 + 30 +0.0 + 0 +LWPOLYLINE + 5 +168 +100 +AcDbEntity + 8 +& + 62 +7 +100 +AcDbPolyline + 90 +41 + 70 +0 + 10 +5.080282 + 20 +1.208142 + 30 +0.0 + 10 +5.080282 + 20 +0.034054 + 30 +0.0 + 10 +4.258631 + 20 +0.914622 + 30 +0.0 + 10 +3.982703 + 20 +0.254369 + 30 +0.0 + 10 +3.538930 + 20 +0.000295 + 30 +0.0 + 10 +0.780018 + 20 +0.000295 + 30 +0.0 + 10 +0.477093 + 20 +0.113122 + 30 +0.0 + 10 +0.228163 + 20 +0.429208 + 30 +0.0 + 10 +0.060227 + 20 +0.897741 + 30 +0.0 + 10 +0.000282 + 20 +1.467904 + 30 +0.0 + 10 +0.000282 + 20 +3.770949 + 30 +0.0 + 10 +0.024260 + 20 +4.036049 + 30 +0.0 + 10 +0.099214 + 20 +4.318376 + 30 +0.0 + 10 +0.222123 + 20 +4.538520 + 30 +0.0 + 10 +0.390150 + 20 +4.628781 + 30 +0.0 + 10 +0.267058 + 20 +5.006879 + 30 +0.0 + 10 +0.240060 + 20 +5.486610 + 30 +0.0 + 10 +0.240060 + 20 +6.660698 + 30 +0.0 + 10 +0.300096 + 20 +7.230860 + 30 +0.0 + 10 +0.468032 + 20 +7.699394 + 30 +0.0 + 10 +0.716962 + 20 +8.015479 + 30 +0.0 + 10 +1.019797 + 20 +8.128306 + 30 +0.0 + 10 +3.359005 + 20 +8.128306 + 30 +0.0 + 10 +3.634842 + 20 +8.032360 + 30 +0.0 + 10 +3.868763 + 20 +7.772774 + 30 +0.0 + 10 +4.042739 + 20 +7.388988 + 30 +0.0 + 10 +4.138742 + 20 +6.909087 + 30 +0.0 + 10 +4.138742 + 20 +6.107413 + 30 +0.0 + 10 +3.490975 + 20 +6.107413 + 30 +0.0 + 10 +3.490975 + 20 +6.649330 + 30 +0.0 + 10 +3.451988 + 20 +6.824339 + 30 +0.0 + 10 +3.359005 + 20 +6.897719 + 30 +0.0 + 10 +1.019797 + 20 +6.897719 + 30 +0.0 + 10 +0.926814 + 20 +6.824339 + 30 +0.0 + 10 +0.887827 + 20 +6.649330 + 30 +0.0 + 10 +0.887827 + 20 +5.159323 + 30 +0.0 + 10 +3.670900 + 20 +2.517627 + 30 +0.0 + 10 +3.670900 + 20 +3.906341 + 30 +0.0 + 10 +4.318667 + 20 +3.906341 + 30 +0.0 + 10 +4.318667 + 20 +2.043580 + 30 +0.0 + 10 +5.080282 + 20 +1.208142 + 30 +0.0 + 0 +LWPOLYLINE + 5 +169 +100 +AcDbEntity + 8 +& + 62 +7 +100 +AcDbPolyline + 90 +10 + 70 +0 + 10 +3.538930 + 20 +1.219526 + 30 +0.0 + 10 +3.652779 + 20 +1.354918 + 30 +0.0 + 10 +0.845912 + 20 +4.019009 + 30 +0.0 + 10 +0.780018 + 20 +4.019009 + 30 +0.0 + 10 +0.687036 + 20 +3.945629 + 30 +0.0 + 10 +0.648049 + 20 +3.770961 + 30 +0.0 + 10 +0.648049 + 20 +1.467915 + 30 +0.0 + 10 +0.687036 + 20 +1.292906 + 30 +0.0 + 10 +0.780018 + 20 +1.219526 + 30 +0.0 + 10 +3.538930 + 20 +1.219526 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16a +100 +AcDbEntity + 8 +* + 62 +7 +100 +AcDbPolyline + 90 +16 + 70 +0 + 10 +4.329406 + 20 +6.120922 + 30 +0.0 + 10 +3.052756 + 20 +5.686471 + 30 +0.0 + 10 +3.839897 + 20 +4.534864 + 30 +0.0 + 10 +3.004714 + 20 +3.898171 + 30 +0.0 + 10 +2.207906 + 20 +5.039904 + 30 +0.0 + 10 +1.420765 + 20 +3.898171 + 30 +0.0 + 10 +0.585582 + 20 +4.534864 + 30 +0.0 + 10 +1.372723 + 20 +5.686471 + 30 +0.0 + 10 +0.096073 + 20 +6.120922 + 30 +0.0 + 10 +0.413038 + 20 +7.161520 + 30 +0.0 + 10 +1.689688 + 20 +6.717224 + 30 +0.0 + 10 +1.689688 + 20 +8.131511 + 30 +0.0 + 10 +2.726417 + 20 +8.131511 + 30 +0.0 + 10 +2.726417 + 20 +6.717224 + 30 +0.0 + 10 +4.003067 + 20 +7.161520 + 30 +0.0 + 10 +4.329406 + 20 +6.120922 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16b +100 +AcDbEntity + 8 +( + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +3.085272 + 20 +1.219515 + 30 +0.0 + 10 +3.085272 + 20 +0.000298 + 30 +0.0 + 10 +2.706305 + 20 +0.000298 + 30 +0.0 + 10 +2.250498 + 20 +0.113126 + 30 +0.0 + 10 +1.875938 + 20 +0.429210 + 30 +0.0 + 10 +1.623247 + 20 +0.897746 + 30 +0.0 + 10 +1.533050 + 20 +1.467907 + 30 +0.0 + 10 +1.533050 + 20 +6.660701 + 30 +0.0 + 10 +1.623247 + 20 +7.230862 + 30 +0.0 + 10 +1.875938 + 20 +7.699398 + 30 +0.0 + 10 +2.250498 + 20 +8.015482 + 30 +0.0 + 10 +2.706305 + 20 +8.128310 + 30 +0.0 + 10 +3.085272 + 20 +8.128310 + 30 +0.0 + 10 +3.085272 + 20 +6.909092 + 30 +0.0 + 10 +2.706305 + 20 +6.909092 + 30 +0.0 + 10 +2.566396 + 20 +6.835711 + 30 +0.0 + 10 +2.507733 + 20 +6.660701 + 30 +0.0 + 10 +2.507733 + 20 +1.467907 + 30 +0.0 + 10 +2.566396 + 20 +1.292897 + 30 +0.0 + 10 +2.706305 + 20 +1.219515 + 30 +0.0 + 10 +3.085272 + 20 +1.219515 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16c +100 +AcDbEntity + 8 +) + 62 +7 +100 +AcDbPolyline + 90 +21 + 70 +0 + 10 +1.950246 + 20 +1.219515 + 30 +0.0 + 10 +2.329213 + 20 +1.219515 + 30 +0.0 + 10 +2.469122 + 20 +1.292897 + 30 +0.0 + 10 +2.527785 + 20 +1.467907 + 30 +0.0 + 10 +2.527785 + 20 +6.660701 + 30 +0.0 + 10 +2.469122 + 20 +6.835711 + 30 +0.0 + 10 +2.329213 + 20 +6.909092 + 30 +0.0 + 10 +1.950246 + 20 +6.909092 + 30 +0.0 + 10 +1.950246 + 20 +8.128310 + 30 +0.0 + 10 +2.329213 + 20 +8.128310 + 30 +0.0 + 10 +2.785020 + 20 +8.015482 + 30 +0.0 + 10 +3.155036 + 20 +7.699398 + 30 +0.0 + 10 +3.407726 + 20 +7.230862 + 30 +0.0 + 10 +3.502468 + 20 +6.660701 + 30 +0.0 + 10 +3.502468 + 20 +1.467907 + 30 +0.0 + 10 +3.407726 + 20 +0.897746 + 30 +0.0 + 10 +3.155036 + 20 +0.429210 + 30 +0.0 + 10 +2.785020 + 20 +0.113126 + 30 +0.0 + 10 +2.329213 + 20 +0.000298 + 30 +0.0 + 10 +1.950246 + 20 +0.000298 + 30 +0.0 + 10 +1.950246 + 20 +1.219515 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16d +100 +AcDbEntity + 8 +_ + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +5.080282 + 20 +-0.834545 + 30 +0.0 + 10 +0.000282 + 20 +-0.834545 + 30 +0.0 + 10 +0.000282 + 20 +0.012122 + 30 +0.0 + 10 +5.080282 + 20 +0.012122 + 30 +0.0 + 10 +5.080282 + 20 +-0.834545 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16e +100 +AcDbEntity + 8 +- + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +4.456630 + 20 +3.484170 + 30 +0.0 + 10 +0.505519 + 20 +3.484170 + 30 +0.0 + 10 +0.505519 + 20 +4.703389 + 30 +0.0 + 10 +4.456630 + 20 +4.703389 + 30 +0.0 + 10 +4.456630 + 20 +3.484170 + 30 +0.0 + 0 +LWPOLYLINE + 5 +16f +100 +AcDbEntity + 8 ++ + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +2.991404 + 20 +6.332248 + 30 +0.0 + 10 +2.991404 + 20 +4.695484 + 30 +0.0 + 10 +4.453137 + 20 +4.695484 + 30 +0.0 + 10 +4.453137 + 20 +3.476263 + 30 +0.0 + 10 +2.991404 + 20 +3.476263 + 30 +0.0 + 10 +2.991404 + 20 +1.816763 + 30 +0.0 + 10 +1.924571 + 20 +1.816763 + 30 +0.0 + 10 +1.924571 + 20 +3.476263 + 30 +0.0 + 10 +0.502026 + 20 +3.476263 + 30 +0.0 + 10 +0.502026 + 20 +4.695484 + 30 +0.0 + 10 +1.924571 + 20 +4.695484 + 30 +0.0 + 10 +1.924571 + 20 +6.332248 + 30 +0.0 + 10 +2.991404 + 20 +6.332248 + 30 +0.0 + 0 +LWPOLYLINE + 5 +170 +100 +AcDbEntity + 8 += + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +5.080282 + 20 +2.343199 + 30 +0.0 + 10 +0.000282 + 20 +2.343199 + 30 +0.0 + 10 +0.000282 + 20 +3.562417 + 30 +0.0 + 10 +5.080282 + 20 +3.562417 + 30 +0.0 + 10 +5.080282 + 20 +2.343199 + 30 +0.0 + 0 +LWPOLYLINE + 5 +171 +100 +AcDbEntity + 8 += + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +5.080282 + 20 +4.488113 + 30 +0.0 + 10 +0.000282 + 20 +4.488113 + 30 +0.0 + 10 +0.000282 + 20 +5.707334 + 30 +0.0 + 10 +5.080282 + 20 +5.707334 + 30 +0.0 + 10 +5.080282 + 20 +4.488113 + 30 +0.0 + 0 +LWPOLYLINE + 5 +172 +100 +AcDbEntity + 8 +{ + 62 +7 +100 +AcDbPolyline + 90 +28 + 70 +0 + 10 +2.527378 + 20 +1.467907 + 30 +0.0 + 10 +2.582582 + 20 +1.292896 + 30 +0.0 + 10 +2.714243 + 20 +1.219516 + 30 +0.0 + 10 +3.071128 + 20 +1.219516 + 30 +0.0 + 10 +3.071128 + 20 +0.000296 + 30 +0.0 + 10 +2.714243 + 20 +0.000296 + 30 +0.0 + 10 +2.285437 + 20 +0.113123 + 30 +0.0 + 10 +1.932958 + 20 +0.429209 + 30 +0.0 + 10 +1.695165 + 20 +0.897741 + 30 +0.0 + 10 +1.610155 + 20 +1.467907 + 30 +0.0 + 10 +1.610155 + 20 +3.229039 + 30 +0.0 + 10 +1.236683 + 20 +3.522560 + 30 +0.0 + 10 +1.236683 + 20 +4.741780 + 30 +0.0 + 10 +1.610155 + 20 +5.023933 + 30 +0.0 + 10 +1.610155 + 20 +6.660697 + 30 +0.0 + 10 +1.695165 + 20 +7.230862 + 30 +0.0 + 10 +1.932958 + 20 +7.699394 + 30 +0.0 + 10 +2.285437 + 20 +8.015481 + 30 +0.0 + 10 +2.714243 + 20 +8.128307 + 30 +0.0 + 10 +3.071128 + 20 +8.128307 + 30 +0.0 + 10 +3.071128 + 20 +6.909091 + 30 +0.0 + 10 +2.714243 + 20 +6.909091 + 30 +0.0 + 10 +2.582582 + 20 +6.835711 + 30 +0.0 + 10 +2.527378 + 20 +6.660697 + 30 +0.0 + 10 +2.527378 + 20 +4.752804 + 30 +0.0 + 10 +1.933088 + 20 +4.131999 + 30 +0.0 + 10 +2.527378 + 20 +3.477430 + 30 +0.0 + 10 +2.527378 + 20 +1.467907 + 30 +0.0 + 0 +LWPOLYLINE + 5 +173 +100 +AcDbEntity + 8 +} + 62 +7 +100 +AcDbPolyline + 90 +28 + 70 +0 + 10 +2.499265 + 20 +3.477430 + 30 +0.0 + 10 +3.093813 + 20 +4.131999 + 30 +0.0 + 10 +2.499265 + 20 +4.752804 + 30 +0.0 + 10 +2.499265 + 20 +6.660697 + 30 +0.0 + 10 +2.444060 + 20 +6.835711 + 30 +0.0 + 10 +2.312399 + 20 +6.909091 + 30 +0.0 + 10 +1.955773 + 20 +6.909091 + 30 +0.0 + 10 +1.955773 + 20 +8.128307 + 30 +0.0 + 10 +2.312399 + 20 +8.128307 + 30 +0.0 + 10 +2.741334 + 20 +8.015481 + 30 +0.0 + 10 +3.093813 + 20 +7.699394 + 30 +0.0 + 10 +3.331607 + 20 +7.230862 + 30 +0.0 + 10 +3.416487 + 20 +6.660697 + 30 +0.0 + 10 +3.416487 + 20 +5.023933 + 30 +0.0 + 10 +3.790218 + 20 +4.741780 + 30 +0.0 + 10 +3.790218 + 20 +3.522560 + 30 +0.0 + 10 +3.416487 + 20 +3.229039 + 30 +0.0 + 10 +3.416487 + 20 +1.467907 + 30 +0.0 + 10 +3.331607 + 20 +0.897741 + 30 +0.0 + 10 +3.093813 + 20 +0.429209 + 30 +0.0 + 10 +2.741334 + 20 +0.113123 + 30 +0.0 + 10 +2.312399 + 20 +0.000296 + 30 +0.0 + 10 +1.955773 + 20 +0.000296 + 30 +0.0 + 10 +1.955773 + 20 +1.219516 + 30 +0.0 + 10 +2.312399 + 20 +1.219516 + 30 +0.0 + 10 +2.444060 + 20 +1.292896 + 30 +0.0 + 10 +2.499265 + 20 +1.467907 + 30 +0.0 + 10 +2.499265 + 20 +3.477430 + 30 +0.0 + 0 +LWPOLYLINE + 5 +174 +100 +AcDbEntity + 8 +[ + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +1.508827 + 20 +8.128298 + 30 +0.0 + 10 +3.061049 + 20 +8.128298 + 30 +0.0 + 10 +3.061049 + 20 +6.909080 + 30 +0.0 + 10 +2.483337 + 20 +6.909080 + 30 +0.0 + 10 +2.483337 + 20 +1.219506 + 30 +0.0 + 10 +3.061049 + 20 +1.219506 + 30 +0.0 + 10 +3.061049 + 20 +0.000284 + 30 +0.0 + 10 +1.508827 + 20 +0.000284 + 30 +0.0 + 10 +1.508827 + 20 +8.128298 + 30 +0.0 + 0 +LWPOLYLINE + 5 +175 +100 +AcDbEntity + 8 +] + 62 +7 +100 +AcDbPolyline + 90 +9 + 70 +0 + 10 +1.955773 + 20 +8.128310 + 30 +0.0 + 10 +3.507995 + 20 +8.128310 + 30 +0.0 + 10 +3.507995 + 20 +0.000298 + 30 +0.0 + 10 +1.955773 + 20 +0.000298 + 30 +0.0 + 10 +1.955773 + 20 +1.219515 + 30 +0.0 + 10 +2.533312 + 20 +1.219515 + 30 +0.0 + 10 +2.533312 + 20 +6.909092 + 30 +0.0 + 10 +1.955773 + 20 +6.909092 + 30 +0.0 + 10 +1.955773 + 20 +8.128310 + 30 +0.0 + 0 +LWPOLYLINE + 5 +176 +100 +AcDbEntity + 8 +| + 62 +7 +100 +AcDbPolyline + 90 +13 + 70 +0 + 10 +0.149533 + 20 +8.128306 + 30 +0.0 + 10 +5.080282 + 20 +1.445164 + 30 +0.0 + 10 +5.080282 + 20 +0.000291 + 30 +0.0 + 10 +4.930727 + 20 +0.000291 + 30 +0.0 + 10 +0.000282 + 20 +6.683432 + 30 +0.0 + 10 +0.000282 + 20 +8.128306 + 30 +0.0 + 10 +0.149533 + 20 +8.128306 + 30 +0.0 + 10 +5.080282 + 20 +1.445148 + 30 +0.0 + 10 +5.080282 + 20 +0.000284 + 30 +0.0 + 10 +4.930727 + 20 +0.000284 + 30 +0.0 + 10 +0.000282 + 20 +6.683419 + 30 +0.0 + 10 +0.000282 + 20 +8.128284 + 30 +0.0 + 10 +0.149533 + 20 +8.128284 + 30 +0.0 + 0 +LWPOLYLINE + 5 +177 +100 +AcDbEntity + 8 +: + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.867215 + 20 +1.219546 + 30 +0.0 + 10 +2.867215 + 20 +0.000300 + 30 +0.0 + 10 +2.020549 + 20 +0.000300 + 30 +0.0 + 10 +2.020549 + 20 +1.219546 + 30 +0.0 + 10 +2.867215 + 20 +1.219546 + 30 +0.0 + 0 +LWPOLYLINE + 5 +178 +100 +AcDbEntity + 8 +: + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.867215 + 20 +5.419205 + 30 +0.0 + 10 +2.020549 + 20 +5.419205 + 30 +0.0 + 10 +2.020549 + 20 +6.638451 + 30 +0.0 + 10 +2.867215 + 20 +6.638451 + 30 +0.0 + 10 +2.867215 + 20 +5.419205 + 30 +0.0 + 0 +LWPOLYLINE + 5 +179 +100 +AcDbEntity + 8 +; + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.848960 + 20 +5.403270 + 30 +0.0 + 10 +2.002293 + 20 +5.403270 + 30 +0.0 + 10 +2.002293 + 20 +6.622490 + 30 +0.0 + 10 +2.848960 + 20 +6.622490 + 30 +0.0 + 10 +2.848960 + 20 +5.403270 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17a +100 +AcDbEntity + 8 +; + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +2.848960 + 20 +1.203699 + 30 +0.0 + 10 +2.848960 + 20 +-0.015521 + 30 +0.0 + 10 +2.782332 + 20 +-0.534694 + 30 +0.0 + 10 +2.602065 + 20 +-0.974978 + 30 +0.0 + 10 +2.335553 + 20 +-1.291065 + 30 +0.0 + 10 +2.002293 + 20 +-1.460393 + 30 +0.0 + 10 +2.002293 + 20 +1.203699 + 30 +0.0 + 10 +2.848960 + 20 +1.203699 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17b +100 +AcDbEntity + 8 +' + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.413609 + 20 +6.311873 + 30 +0.0 + 10 +1.696435 + 20 +6.311873 + 30 +0.0 + 10 +1.696435 + 20 +8.140391 + 30 +0.0 + 10 +2.413609 + 20 +8.140391 + 30 +0.0 + 10 +2.413609 + 20 +6.311873 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17c +100 +AcDbEntity + 8 +' + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +3.389768 + 20 +6.311873 + 30 +0.0 + 10 +2.672594 + 20 +6.311873 + 30 +0.0 + 10 +2.672594 + 20 +8.140391 + 30 +0.0 + 10 +3.389768 + 20 +8.140391 + 30 +0.0 + 10 +3.389768 + 20 +6.311873 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17d +100 +AcDbEntity + 8 +" + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.429115 + 20 +6.296351 + 30 +0.0 + 10 +1.711941 + 20 +6.296351 + 30 +0.0 + 10 +1.711941 + 20 +8.124869 + 30 +0.0 + 10 +2.429115 + 20 +8.124869 + 30 +0.0 + 10 +2.429115 + 20 +6.296351 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17e +100 +AcDbEntity + 8 +" + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +3.405275 + 20 +6.296351 + 30 +0.0 + 10 +2.688101 + 20 +6.296351 + 30 +0.0 + 10 +2.688101 + 20 +8.124869 + 30 +0.0 + 10 +3.405275 + 20 +8.124869 + 30 +0.0 + 10 +3.405275 + 20 +6.296351 + 30 +0.0 + 0 +LWPOLYLINE + 5 +17f +100 +AcDbEntity + 8 +, + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +2.836202 + 20 +1.203719 + 30 +0.0 + 10 +2.836202 + 20 +-0.015497 + 30 +0.0 + 10 +2.769574 + 20 +-0.534674 + 30 +0.0 + 10 +2.589307 + 20 +-0.974957 + 30 +0.0 + 10 +2.322795 + 20 +-1.291044 + 30 +0.0 + 10 +1.989535 + 20 +-1.460372 + 30 +0.0 + 10 +1.989535 + 20 +1.203719 + 30 +0.0 + 10 +2.836202 + 20 +1.203719 + 30 +0.0 + 0 +LWPOLYLINE + 5 +180 +100 +AcDbEntity + 8 +. + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +2.836202 + 20 +-0.015436 + 30 +0.0 + 10 +1.989535 + 20 +-0.015436 + 30 +0.0 + 10 +1.989535 + 20 +1.203784 + 30 +0.0 + 10 +2.836202 + 20 +1.203784 + 30 +0.0 + 10 +2.836202 + 20 +-0.015436 + 30 +0.0 + 0 +LWPOLYLINE + 5 +181 +100 +AcDbEntity + 8 +/ + 62 +7 +100 +AcDbPolyline + 90 +7 + 70 +0 + 10 +4.931023 + 20 +8.128312 + 30 +0.0 + 10 +5.080282 + 20 +8.128312 + 30 +0.0 + 10 +5.080282 + 20 +6.683436 + 30 +0.0 + 10 +0.149542 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +0.000297 + 30 +0.0 + 10 +0.000282 + 20 +1.445169 + 30 +0.0 + 10 +4.931023 + 20 +8.128312 + 30 +0.0 + 0 +LWPOLYLINE + 5 +182 +100 +AcDbEntity + 8 +< + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +4.475914 + 20 +2.401323 + 30 +0.0 + 10 +4.475914 + 20 +1.130611 + 30 +0.0 + 10 +0.242580 + 20 +3.550131 + 30 +0.0 + 10 +0.242580 + 20 +4.648024 + 30 +0.0 + 10 +4.475914 + 20 +7.057283 + 30 +0.0 + 10 +4.475914 + 20 +5.786571 + 30 +0.0 + 10 +1.499346 + 20 +4.098924 + 30 +0.0 + 10 +4.475914 + 20 +2.401323 + 30 +0.0 + 0 +LWPOLYLINE + 5 +183 +100 +AcDbEntity + 8 +> + 62 +7 +100 +AcDbPolyline + 90 +8 + 70 +0 + 10 +0.224847 + 20 +2.416670 + 30 +0.0 + 10 +0.224847 + 20 +1.145965 + 30 +0.0 + 10 +4.458181 + 20 +3.565484 + 30 +0.0 + 10 +4.458181 + 20 +4.663385 + 30 +0.0 + 10 +0.224847 + 20 +7.072631 + 30 +0.0 + 10 +0.224847 + 20 +5.801926 + 30 +0.0 + 10 +3.201415 + 20 +4.114265 + 30 +0.0 + 10 +0.224847 + 20 +2.416670 + 30 +0.0 + 0 +LWPOLYLINE + 5 +184 +100 +AcDbEntity + 8 +? + 62 +7 +100 +AcDbPolyline + 90 +29 + 70 +0 + 10 +4.027193 + 20 +8.128312 + 30 +0.0 + 10 +4.436164 + 20 +8.015484 + 30 +0.0 + 10 +4.772441 + 20 +7.699398 + 30 +0.0 + 10 +4.999304 + 20 +7.230865 + 30 +0.0 + 10 +5.080282 + 20 +6.660700 + 30 +0.0 + 10 +5.080282 + 20 +4.583655 + 30 +0.0 + 10 +4.999304 + 20 +4.013490 + 30 +0.0 + 10 +4.772441 + 20 +3.544957 + 30 +0.0 + 10 +4.436164 + 20 +3.228870 + 30 +0.0 + 10 +4.027193 + 20 +3.116043 + 30 +0.0 + 10 +1.928679 + 20 +3.116043 + 30 +0.0 + 10 +1.803070 + 20 +3.042661 + 30 +0.0 + 10 +1.750403 + 20 +2.867651 + 30 +0.0 + 10 +1.750403 + 20 +2.246845 + 30 +0.0 + 10 +0.875343 + 20 +2.246845 + 30 +0.0 + 10 +0.875343 + 20 +2.867651 + 30 +0.0 + 10 +0.956321 + 20 +3.437816 + 30 +0.0 + 10 +1.183184 + 20 +3.906349 + 30 +0.0 + 10 +1.519461 + 20 +4.222436 + 30 +0.0 + 10 +1.928679 + 20 +4.335263 + 30 +0.0 + 10 +4.027193 + 20 +4.335263 + 30 +0.0 + 10 +4.152555 + 20 +4.408642 + 30 +0.0 + 10 +4.205222 + 20 +4.583655 + 30 +0.0 + 10 +4.205222 + 20 +6.660700 + 30 +0.0 + 10 +4.152555 + 20 +6.835713 + 30 +0.0 + 10 +4.027193 + 20 +6.909092 + 30 +0.0 + 10 +0.000282 + 20 +6.909092 + 30 +0.0 + 10 +0.000282 + 20 +8.128312 + 30 +0.0 + 10 +4.027193 + 20 +8.128312 + 30 +0.0 + 0 +LWPOLYLINE + 5 +185 +100 +AcDbEntity + 8 +? + 62 +7 +100 +AcDbPolyline + 90 +5 + 70 +0 + 10 +0.875343 + 20 +0.000300 + 30 +0.0 + 10 +0.875343 + 20 +1.219517 + 30 +0.0 + 10 +1.750403 + 20 +1.219517 + 30 +0.0 + 10 +1.750403 + 20 +0.000300 + 30 +0.0 + 10 +0.875343 + 20 +0.000300 + 30 +0.0 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +330 +0 +100 +AcDbDictionary + 3 +ACAD_GROUP +350 +D + 3 +ACAD_MLINESTYLE +350 +17 + 0 +DICTIONARY + 5 +D +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +1A +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +17 +330 +C +100 +AcDbDictionary + 3 +STANDARD +350 +18 + 0 +DICTIONARY + 5 +19 +330 +C +100 +AcDbDictionary + 0 +ENDSEC + 0 +EOF diff --git a/app/static/logo.svg b/app/static/logo.svg new file mode 100644 index 0000000..8dec9ee --- /dev/null +++ b/app/static/logo.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/static/pico.css b/app/static/pico.css new file mode 100644 index 0000000..8681aac --- /dev/null +++ b/app/static/pico.css @@ -0,0 +1,2675 @@ +@charset "UTF-8"; +/*! + * Pico CSS v1.5.10 (https://picocss.com) + * Copyright 2019-2023 - Licensed under MIT + */ +/** + * Theme: default + */ +:root { + --font-family: system-ui, -apple-system, "Segoe UI", "Roboto", "Ubuntu", + "Cantarell", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol", "Noto Color Emoji"; + --line-height: 1.5; + --font-weight: 400; + --font-size: 16px; + --border-radius: 0.25rem; + --border-width: 1px; + --outline-width: 3px; + --spacing: 1rem; + --typography-spacing-vertical: 1.5rem; + --block-spacing-vertical: calc(var(--spacing) * 2); + --block-spacing-horizontal: var(--spacing); + --grid-spacing-vertical: 0; + --grid-spacing-horizontal: var(--spacing); + --form-element-spacing-vertical: 0.75rem; + --form-element-spacing-horizontal: 1rem; + --nav-element-spacing-vertical: 1rem; + --nav-element-spacing-horizontal: 0.5rem; + --nav-link-spacing-vertical: 0.5rem; + --nav-link-spacing-horizontal: 0.5rem; + --form-label-font-weight: var(--font-weight); + --transition: 0.2s ease-in-out; + --modal-overlay-backdrop-filter: blur(0.25rem); +} +@media (min-width: 576px) { + :root { + --font-size: 17px; + } +} +@media (min-width: 768px) { + :root { + --font-size: 18px; + } +} +@media (min-width: 992px) { + :root { + --font-size: 19px; + } +} +@media (min-width: 1200px) { + :root { + --font-size: 20px; + } +} + +@media (min-width: 576px) { + body > header, + body > main, + body > footer, + section { + --block-spacing-vertical: calc(var(--spacing) * 2.5); + } +} +@media (min-width: 768px) { + body > header, + body > main, + body > footer, + section { + --block-spacing-vertical: calc(var(--spacing) * 3); + } +} +@media (min-width: 992px) { + body > header, + body > main, + body > footer, + section { + --block-spacing-vertical: calc(var(--spacing) * 3.5); + } +} +@media (min-width: 1200px) { + body > header, + body > main, + body > footer, + section { + --block-spacing-vertical: calc(var(--spacing) * 4); + } +} + +@media (min-width: 576px) { + article { + --block-spacing-horizontal: calc(var(--spacing) * 1.25); + } +} +@media (min-width: 768px) { + article { + --block-spacing-horizontal: calc(var(--spacing) * 1.5); + } +} +@media (min-width: 992px) { + article { + --block-spacing-horizontal: calc(var(--spacing) * 1.75); + } +} +@media (min-width: 1200px) { + article { + --block-spacing-horizontal: calc(var(--spacing) * 2); + } +} + +dialog > article { + --block-spacing-vertical: calc(var(--spacing) * 2); + --block-spacing-horizontal: var(--spacing); +} +@media (min-width: 576px) { + dialog > article { + --block-spacing-vertical: calc(var(--spacing) * 2.5); + --block-spacing-horizontal: calc(var(--spacing) * 1.25); + } +} +@media (min-width: 768px) { + dialog > article { + --block-spacing-vertical: calc(var(--spacing) * 3); + --block-spacing-horizontal: calc(var(--spacing) * 1.5); + } +} + +a { + --text-decoration: none; +} +a.secondary, a.contrast { + --text-decoration: underline; +} + +small { + --font-size: 0.875em; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + --font-weight: 700; +} + +h1 { + --font-size: 2rem; + --typography-spacing-vertical: 3rem; +} + +h2 { + --font-size: 1.75rem; + --typography-spacing-vertical: 2.625rem; +} + +h3 { + --font-size: 1.5rem; + --typography-spacing-vertical: 2.25rem; +} + +h4 { + --font-size: 1.25rem; + --typography-spacing-vertical: 1.874rem; +} + +h5 { + --font-size: 1.125rem; + --typography-spacing-vertical: 1.6875rem; +} + +[type=checkbox], +[type=radio] { + --border-width: 2px; +} + +[type=checkbox][role=switch] { + --border-width: 3px; +} + +thead th, +thead td, +tfoot th, +tfoot td { + --border-width: 3px; +} + +:not(thead, tfoot) > * > td { + --font-size: 0.875em; +} + +pre, +code, +kbd, +samp { + --font-family: "Menlo", "Consolas", "Roboto Mono", "Ubuntu Monospace", + "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + +kbd { + --font-weight: bolder; +} + +[data-theme=light], +:root:not([data-theme=dark]) { + --background-color: #fff; + --color: hsl(205, 20%, 32%); + --h1-color: hsl(205, 30%, 15%); + --h2-color: #24333e; + --h3-color: hsl(205, 25%, 23%); + --h4-color: #374956; + --h5-color: hsl(205, 20%, 32%); + --h6-color: #4d606d; + --muted-color: hsl(205, 10%, 50%); + --muted-border-color: hsl(205, 20%, 94%); + --primary: hsl(195, 85%, 41%); + --primary-hover: hsl(195, 90%, 32%); + --primary-focus: rgba(16, 149, 193, 0.125); + --primary-inverse: #fff; + --secondary: hsl(205, 15%, 41%); + --secondary-hover: hsl(205, 20%, 32%); + --secondary-focus: rgba(89, 107, 120, 0.125); + --secondary-inverse: #fff; + --contrast: hsl(205, 30%, 15%); + --contrast-hover: #000; + --contrast-focus: rgba(89, 107, 120, 0.125); + --contrast-inverse: #fff; + --mark-background-color: #fff2ca; + --mark-color: #543a26; + --ins-color: #388e3c; + --del-color: #c62828; + --blockquote-border-color: var(--muted-border-color); + --blockquote-footer-color: var(--muted-color); + --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --form-element-background-color: transparent; + --form-element-border-color: hsl(205, 14%, 68%); + --form-element-color: var(--color); + --form-element-placeholder-color: var(--muted-color); + --form-element-active-background-color: transparent; + --form-element-active-border-color: var(--primary); + --form-element-focus-color: var(--primary-focus); + --form-element-disabled-background-color: hsl(205, 18%, 86%); + --form-element-disabled-border-color: hsl(205, 14%, 68%); + --form-element-disabled-opacity: 0.5; + --form-element-invalid-border-color: #c62828; + --form-element-invalid-active-border-color: #d32f2f; + --form-element-invalid-focus-color: rgba(211, 47, 47, 0.125); + --form-element-valid-border-color: #388e3c; + --form-element-valid-active-border-color: #43a047; + --form-element-valid-focus-color: rgba(67, 160, 71, 0.125); + --switch-background-color: hsl(205, 16%, 77%); + --switch-color: var(--primary-inverse); + --switch-checked-background-color: var(--primary); + --range-border-color: hsl(205, 18%, 86%); + --range-active-border-color: hsl(205, 16%, 77%); + --range-thumb-border-color: var(--background-color); + --range-thumb-color: var(--secondary); + --range-thumb-hover-color: var(--secondary-hover); + --range-thumb-active-color: var(--primary); + --table-border-color: var(--muted-border-color); + --table-row-stripped-background-color: #f6f8f9; + --code-background-color: hsl(205, 20%, 94%); + --code-color: var(--muted-color); + --code-kbd-background-color: var(--contrast); + --code-kbd-color: var(--contrast-inverse); + --code-tag-color: hsl(330, 40%, 50%); + --code-property-color: hsl(185, 40%, 40%); + --code-value-color: hsl(40, 20%, 50%); + --code-comment-color: hsl(205, 14%, 68%); + --accordion-border-color: var(--muted-border-color); + --accordion-close-summary-color: var(--color); + --accordion-open-summary-color: var(--muted-color); + --card-background-color: var(--background-color); + --card-border-color: var(--muted-border-color); + --card-box-shadow: + 0.0145rem 0.029rem 0.174rem rgba(27, 40, 50, 0.01698), + 0.0335rem 0.067rem 0.402rem rgba(27, 40, 50, 0.024), + 0.0625rem 0.125rem 0.75rem rgba(27, 40, 50, 0.03), + 0.1125rem 0.225rem 1.35rem rgba(27, 40, 50, 0.036), + 0.2085rem 0.417rem 2.502rem rgba(27, 40, 50, 0.04302), + 0.5rem 1rem 6rem rgba(27, 40, 50, 0.06), + 0 0 0 0.0625rem rgba(27, 40, 50, 0.015); + --card-sectionning-background-color: #fbfbfc; + --dropdown-background-color: #fbfbfc; + --dropdown-border-color: #e1e6eb; + --dropdown-box-shadow: var(--card-box-shadow); + --dropdown-color: var(--color); + --dropdown-hover-background-color: hsl(205, 20%, 94%); + --modal-overlay-background-color: rgba(213, 220, 226, 0.7); + --progress-background-color: hsl(205, 18%, 86%); + --progress-color: var(--primary); + --loading-spinner-opacity: 0.5; + --tooltip-background-color: var(--contrast); + --tooltip-color: var(--contrast-inverse); + --icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); + --icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); + --icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(198, 40, 40)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + --icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E"); + --icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); + --icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(65, 84, 98)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(56, 142, 60)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + color-scheme: light; +} + +@media only screen and (prefers-color-scheme: dark) { + :root:not([data-theme]) { + --background-color: #11191f; + --color: hsl(205, 16%, 77%); + --h1-color: hsl(205, 20%, 94%); + --h2-color: #e1e6eb; + --h3-color: hsl(205, 18%, 86%); + --h4-color: #c8d1d8; + --h5-color: hsl(205, 16%, 77%); + --h6-color: #afbbc4; + --muted-color: hsl(205, 10%, 50%); + --muted-border-color: #1f2d38; + --primary: hsl(195, 85%, 41%); + --primary-hover: hsl(195, 80%, 50%); + --primary-focus: rgba(16, 149, 193, 0.25); + --primary-inverse: #fff; + --secondary: hsl(205, 15%, 41%); + --secondary-hover: hsl(205, 10%, 50%); + --secondary-focus: rgba(115, 130, 140, 0.25); + --secondary-inverse: #fff; + --contrast: hsl(205, 20%, 94%); + --contrast-hover: #fff; + --contrast-focus: rgba(115, 130, 140, 0.25); + --contrast-inverse: #000; + --mark-background-color: #d1c284; + --mark-color: #11191f; + --ins-color: #388e3c; + --del-color: #c62828; + --blockquote-border-color: var(--muted-border-color); + --blockquote-footer-color: var(--muted-color); + --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --form-element-background-color: #11191f; + --form-element-border-color: #374956; + --form-element-color: var(--color); + --form-element-placeholder-color: var(--muted-color); + --form-element-active-background-color: var(--form-element-background-color); + --form-element-active-border-color: var(--primary); + --form-element-focus-color: var(--primary-focus); + --form-element-disabled-background-color: hsl(205, 25%, 23%); + --form-element-disabled-border-color: hsl(205, 20%, 32%); + --form-element-disabled-opacity: 0.5; + --form-element-invalid-border-color: #b71c1c; + --form-element-invalid-active-border-color: #c62828; + --form-element-invalid-focus-color: rgba(198, 40, 40, 0.25); + --form-element-valid-border-color: #2e7d32; + --form-element-valid-active-border-color: #388e3c; + --form-element-valid-focus-color: rgba(56, 142, 60, 0.25); + --switch-background-color: #374956; + --switch-color: var(--primary-inverse); + --switch-checked-background-color: var(--primary); + --range-border-color: #24333e; + --range-active-border-color: hsl(205, 25%, 23%); + --range-thumb-border-color: var(--background-color); + --range-thumb-color: var(--secondary); + --range-thumb-hover-color: var(--secondary-hover); + --range-thumb-active-color: var(--primary); + --table-border-color: var(--muted-border-color); + --table-row-stripped-background-color: rgba(115, 130, 140, 0.05); + --code-background-color: #18232c; + --code-color: var(--muted-color); + --code-kbd-background-color: var(--contrast); + --code-kbd-color: var(--contrast-inverse); + --code-tag-color: hsl(330, 30%, 50%); + --code-property-color: hsl(185, 30%, 50%); + --code-value-color: hsl(40, 10%, 50%); + --code-comment-color: #4d606d; + --accordion-border-color: var(--muted-border-color); + --accordion-active-summary-color: var(--primary); + --accordion-close-summary-color: var(--color); + --accordion-open-summary-color: var(--muted-color); + --card-background-color: #141e26; + --card-border-color: var(--card-background-color); + --card-box-shadow: + 0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698), + 0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024), + 0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03), + 0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036), + 0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302), + 0.5rem 1rem 6rem rgba(0, 0, 0, 0.06), + 0 0 0 0.0625rem rgba(0, 0, 0, 0.015); + --card-sectionning-background-color: #18232c; + --dropdown-background-color: hsl(205, 30%, 15%); + --dropdown-border-color: #24333e; + --dropdown-box-shadow: var(--card-box-shadow); + --dropdown-color: var(--color); + --dropdown-hover-background-color: rgba(36, 51, 62, 0.75); + --modal-overlay-background-color: rgba(36, 51, 62, 0.8); + --progress-background-color: #24333e; + --progress-color: var(--primary); + --loading-spinner-opacity: 0.5; + --tooltip-background-color: var(--contrast); + --tooltip-color: var(--contrast-inverse); + --icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); + --icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); + --icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + --icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E"); + --icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); + --icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + color-scheme: dark; + } +} +[data-theme=dark] { + --background-color: #11191f; + --color: hsl(205, 16%, 77%); + --h1-color: hsl(205, 20%, 94%); + --h2-color: #e1e6eb; + --h3-color: hsl(205, 18%, 86%); + --h4-color: #c8d1d8; + --h5-color: hsl(205, 16%, 77%); + --h6-color: #afbbc4; + --muted-color: hsl(205, 10%, 50%); + --muted-border-color: #1f2d38; + --primary: hsl(195, 85%, 41%); + --primary-hover: hsl(195, 80%, 50%); + --primary-focus: rgba(16, 149, 193, 0.25); + --primary-inverse: #fff; + --secondary: hsl(205, 15%, 41%); + --secondary-hover: hsl(205, 10%, 50%); + --secondary-focus: rgba(115, 130, 140, 0.25); + --secondary-inverse: #fff; + --contrast: hsl(205, 20%, 94%); + --contrast-hover: #fff; + --contrast-focus: rgba(115, 130, 140, 0.25); + --contrast-inverse: #000; + --mark-background-color: #d1c284; + --mark-color: #11191f; + --ins-color: #388e3c; + --del-color: #c62828; + --blockquote-border-color: var(--muted-border-color); + --blockquote-footer-color: var(--muted-color); + --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --form-element-background-color: #11191f; + --form-element-border-color: #374956; + --form-element-color: var(--color); + --form-element-placeholder-color: var(--muted-color); + --form-element-active-background-color: var(--form-element-background-color); + --form-element-active-border-color: var(--primary); + --form-element-focus-color: var(--primary-focus); + --form-element-disabled-background-color: hsl(205, 25%, 23%); + --form-element-disabled-border-color: hsl(205, 20%, 32%); + --form-element-disabled-opacity: 0.5; + --form-element-invalid-border-color: #b71c1c; + --form-element-invalid-active-border-color: #c62828; + --form-element-invalid-focus-color: rgba(198, 40, 40, 0.25); + --form-element-valid-border-color: #2e7d32; + --form-element-valid-active-border-color: #388e3c; + --form-element-valid-focus-color: rgba(56, 142, 60, 0.25); + --switch-background-color: #374956; + --switch-color: var(--primary-inverse); + --switch-checked-background-color: var(--primary); + --range-border-color: #24333e; + --range-active-border-color: hsl(205, 25%, 23%); + --range-thumb-border-color: var(--background-color); + --range-thumb-color: var(--secondary); + --range-thumb-hover-color: var(--secondary-hover); + --range-thumb-active-color: var(--primary); + --table-border-color: var(--muted-border-color); + --table-row-stripped-background-color: rgba(115, 130, 140, 0.05); + --code-background-color: #18232c; + --code-color: var(--muted-color); + --code-kbd-background-color: var(--contrast); + --code-kbd-color: var(--contrast-inverse); + --code-tag-color: hsl(330, 30%, 50%); + --code-property-color: hsl(185, 30%, 50%); + --code-value-color: hsl(40, 10%, 50%); + --code-comment-color: #4d606d; + --accordion-border-color: var(--muted-border-color); + --accordion-active-summary-color: var(--primary); + --accordion-close-summary-color: var(--color); + --accordion-open-summary-color: var(--muted-color); + --card-background-color: #141e26; + --card-border-color: var(--card-background-color); + --card-box-shadow: + 0.0145rem 0.029rem 0.174rem rgba(0, 0, 0, 0.01698), + 0.0335rem 0.067rem 0.402rem rgba(0, 0, 0, 0.024), + 0.0625rem 0.125rem 0.75rem rgba(0, 0, 0, 0.03), + 0.1125rem 0.225rem 1.35rem rgba(0, 0, 0, 0.036), + 0.2085rem 0.417rem 2.502rem rgba(0, 0, 0, 0.04302), + 0.5rem 1rem 6rem rgba(0, 0, 0, 0.06), + 0 0 0 0.0625rem rgba(0, 0, 0, 0.015); + --card-sectionning-background-color: #18232c; + --dropdown-background-color: hsl(205, 30%, 15%); + --dropdown-border-color: #24333e; + --dropdown-box-shadow: var(--card-box-shadow); + --dropdown-color: var(--color); + --dropdown-hover-background-color: rgba(36, 51, 62, 0.75); + --modal-overlay-background-color: rgba(36, 51, 62, 0.8); + --progress-background-color: #24333e; + --progress-color: var(--primary); + --loading-spinner-opacity: 0.5; + --tooltip-background-color: var(--contrast); + --tooltip-color: var(--contrast-inverse); + --icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(0, 0, 0)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(115, 130, 140)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); + --icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); + --icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(183, 28, 28)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + --icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E"); + --icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); + --icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(162, 175, 185)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E"); + --icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(46, 125, 50)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + color-scheme: dark; +} + +progress, +[type=checkbox], +[type=radio], +[type=range] { + accent-color: var(--primary); +} + +/** + * Document + * Content-box & Responsive typography + */ +*, +*::before, +*::after { + box-sizing: border-box; + background-repeat: no-repeat; +} + +::before, +::after { + text-decoration: inherit; + vertical-align: inherit; +} + +:where(:root) { + -webkit-tap-highlight-color: transparent; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + text-size-adjust: 100%; + background-color: var(--background-color); + color: var(--color); + font-weight: var(--font-weight); + font-size: var(--font-size); + line-height: var(--line-height); + font-family: var(--font-family); + text-rendering: optimizeLegibility; + overflow-wrap: break-word; + cursor: default; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; +} + +/** + * Sectioning + * Container and responsive spacings for header, main, footer + */ +main { + display: block; +} + +body { + width: 100%; + margin: 0; +} +body > header, +body > main, +body > footer { + width: 100%; + margin-right: auto; + margin-left: auto; + padding: var(--block-spacing-vertical) 0; +} + +/** +* Container +*/ +.container, +.container-fluid { + width: 100%; + margin-right: auto; + margin-left: auto; + padding-right: var(--spacing); + padding-left: var(--spacing); +} + +@media (min-width: 576px) { + .container { + max-width: 510px; + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .container { + max-width: 700px; + } +} +@media (min-width: 992px) { + .container { + max-width: 920px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1130px; + } +} + +/** + * Section + * Responsive spacings for section + */ +section { + margin-bottom: var(--block-spacing-vertical); +} + +/** +* Grid +* Minimal grid system with auto-layout columns +*/ +.grid { + grid-column-gap: var(--grid-spacing-horizontal); + grid-row-gap: var(--grid-spacing-vertical); + display: grid; + grid-template-columns: 1fr; + margin: 0; +} +@media (min-width: 992px) { + .grid { + grid-template-columns: repeat(auto-fit, minmax(0%, 1fr)); + } +} +.grid > * { + min-width: 0; +} + +/** + * Horizontal scroller (
) + */ +figure { + display: block; + margin: 0; + padding: 0; + overflow-x: auto; +} +figure figcaption { + padding: calc(var(--spacing) * 0.5) 0; + color: var(--muted-color); +} + +/** + * Typography + */ +b, +strong { + font-weight: bolder; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +address, +blockquote, +dl, +figure, +form, +ol, +p, +pre, +table, +ul { + margin-top: 0; + margin-bottom: var(--typography-spacing-vertical); + color: var(--color); + font-style: normal; + font-weight: var(--font-weight); + font-size: var(--font-size); +} + +a, +[role=link] { + --color: var(--primary); + --background-color: transparent; + outline: none; + background-color: var(--background-color); + color: var(--color); + -webkit-text-decoration: var(--text-decoration); + text-decoration: var(--text-decoration); + transition: background-color var(--transition), color var(--transition), box-shadow var(--transition), -webkit-text-decoration var(--transition); + transition: background-color var(--transition), color var(--transition), text-decoration var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), color var(--transition), text-decoration var(--transition), box-shadow var(--transition), -webkit-text-decoration var(--transition); +} +a:is([aria-current], :hover, :active, :focus), +[role=link]:is([aria-current], :hover, :active, :focus) { + --color: var(--primary-hover); + --text-decoration: underline; +} +a:focus, +[role=link]:focus { + --background-color: var(--primary-focus); +} +a.secondary, +[role=link].secondary { + --color: var(--secondary); +} +a.secondary:is([aria-current], :hover, :active, :focus), +[role=link].secondary:is([aria-current], :hover, :active, :focus) { + --color: var(--secondary-hover); +} +a.secondary:focus, +[role=link].secondary:focus { + --background-color: var(--secondary-focus); +} +a.contrast, +[role=link].contrast { + --color: var(--contrast); +} +a.contrast:is([aria-current], :hover, :active, :focus), +[role=link].contrast:is([aria-current], :hover, :active, :focus) { + --color: var(--contrast-hover); +} +a.contrast:focus, +[role=link].contrast:focus { + --background-color: var(--contrast-focus); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: var(--typography-spacing-vertical); + color: var(--color); + font-weight: var(--font-weight); + font-size: var(--font-size); + font-family: var(--font-family); +} + +h1 { + --color: var(--h1-color); +} + +h2 { + --color: var(--h2-color); +} + +h3 { + --color: var(--h3-color); +} + +h4 { + --color: var(--h4-color); +} + +h5 { + --color: var(--h5-color); +} + +h6 { + --color: var(--h6-color); +} + +:where(address, blockquote, dl, figure, form, ol, p, pre, table, ul) ~ :is(h1, h2, h3, h4, h5, h6) { + margin-top: var(--typography-spacing-vertical); +} + +hgroup, +.headings { + margin-bottom: var(--typography-spacing-vertical); +} +hgroup > *, +.headings > * { + margin-bottom: 0; +} +hgroup > *:last-child, +.headings > *:last-child { + --color: var(--muted-color); + --font-weight: unset; + font-size: 1rem; + font-family: unset; +} + +p { + margin-bottom: var(--typography-spacing-vertical); +} + +small { + font-size: var(--font-size); +} + +:where(dl, ol, ul) { + padding-right: 0; + padding-left: var(--spacing); + -webkit-padding-start: var(--spacing); + padding-inline-start: var(--spacing); + -webkit-padding-end: 0; + padding-inline-end: 0; +} +:where(dl, ol, ul) li { + margin-bottom: calc(var(--typography-spacing-vertical) * 0.25); +} + +:where(dl, ol, ul) :is(dl, ol, ul) { + margin: 0; + margin-top: calc(var(--typography-spacing-vertical) * 0.25); +} + +ul li { + list-style: square; +} + +mark { + padding: 0.125rem 0.25rem; + background-color: var(--mark-background-color); + color: var(--mark-color); + vertical-align: baseline; +} + +blockquote { + display: block; + margin: var(--typography-spacing-vertical) 0; + padding: var(--spacing); + border-right: none; + border-left: 0.25rem solid var(--blockquote-border-color); + -webkit-border-start: 0.25rem solid var(--blockquote-border-color); + border-inline-start: 0.25rem solid var(--blockquote-border-color); + -webkit-border-end: none; + border-inline-end: none; +} +blockquote footer { + margin-top: calc(var(--typography-spacing-vertical) * 0.5); + color: var(--blockquote-footer-color); +} + +abbr[title] { + border-bottom: 1px dotted; + text-decoration: none; + cursor: help; +} + +ins { + color: var(--ins-color); + text-decoration: none; +} + +del { + color: var(--del-color); +} + +::-moz-selection { + background-color: var(--primary-focus); +} + +::selection { + background-color: var(--primary-focus); +} + +/** + * Embedded content + */ +:where(audio, canvas, iframe, img, svg, video) { + vertical-align: middle; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +:where(iframe) { + border-style: none; +} + +img { + max-width: 100%; + height: auto; + border-style: none; +} + +:where(svg:not([fill])) { + fill: currentColor; +} + +svg:not(:root) { + overflow: hidden; +} + +/** + * Button + */ +button { + margin: 0; + overflow: visible; + font-family: inherit; + text-transform: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +button { + display: block; + width: 100%; + margin-bottom: var(--spacing); +} + +[role=button] { + display: inline-block; + text-decoration: none; +} + +button, +input[type=submit], +input[type=button], +input[type=reset], +[role=button] { + --background-color: var(--primary); + --border-color: var(--primary); + --color: var(--primary-inverse); + --box-shadow: var(--button-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} +button:is([aria-current], :hover, :active, :focus), +input[type=submit]:is([aria-current], :hover, :active, :focus), +input[type=button]:is([aria-current], :hover, :active, :focus), +input[type=reset]:is([aria-current], :hover, :active, :focus), +[role=button]:is([aria-current], :hover, :active, :focus) { + --background-color: var(--primary-hover); + --border-color: var(--primary-hover); + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + --color: var(--primary-inverse); +} +button:focus, +input[type=submit]:focus, +input[type=button]:focus, +input[type=reset]:focus, +[role=button]:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--primary-focus); +} + +:is(button, input[type=submit], input[type=button], [role=button]).secondary, +input[type=reset] { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + cursor: pointer; +} +:is(button, input[type=submit], input[type=button], [role=button]).secondary:is([aria-current], :hover, :active, :focus), +input[type=reset]:is([aria-current], :hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); + --color: var(--secondary-inverse); +} +:is(button, input[type=submit], input[type=button], [role=button]).secondary:focus, +input[type=reset]:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--secondary-focus); +} + +:is(button, input[type=submit], input[type=button], [role=button]).contrast { + --background-color: var(--contrast); + --border-color: var(--contrast); + --color: var(--contrast-inverse); +} +:is(button, input[type=submit], input[type=button], [role=button]).contrast:is([aria-current], :hover, :active, :focus) { + --background-color: var(--contrast-hover); + --border-color: var(--contrast-hover); + --color: var(--contrast-inverse); +} +:is(button, input[type=submit], input[type=button], [role=button]).contrast:focus { + --box-shadow: var(--button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), + 0 0 0 var(--outline-width) var(--contrast-focus); +} + +:is(button, input[type=submit], input[type=button], [role=button]).outline, +input[type=reset].outline { + --background-color: transparent; + --color: var(--primary); +} +:is(button, input[type=submit], input[type=button], [role=button]).outline:is([aria-current], :hover, :active, :focus), +input[type=reset].outline:is([aria-current], :hover, :active, :focus) { + --background-color: transparent; + --color: var(--primary-hover); +} + +:is(button, input[type=submit], input[type=button], [role=button]).outline.secondary, +input[type=reset].outline { + --color: var(--secondary); +} +:is(button, input[type=submit], input[type=button], [role=button]).outline.secondary:is([aria-current], :hover, :active, :focus), +input[type=reset].outline:is([aria-current], :hover, :active, :focus) { + --color: var(--secondary-hover); +} + +:is(button, input[type=submit], input[type=button], [role=button]).outline.contrast { + --color: var(--contrast); +} +:is(button, input[type=submit], input[type=button], [role=button]).outline.contrast:is([aria-current], :hover, :active, :focus) { + --color: var(--contrast-hover); +} + +:where(button, [type=submit], [type=button], [type=reset], [role=button])[disabled], +:where(fieldset[disabled]) :is(button, [type=submit], [type=button], [type=reset], [role=button]), +a[role=button]:not([href]) { + opacity: 0.5; + pointer-events: none; +} + +/** + * Form elements + */ +input, +optgroup, +select, +textarea { + margin: 0; + font-size: 1rem; + line-height: var(--line-height); + font-family: inherit; + letter-spacing: inherit; +} + +input { + overflow: visible; +} + +select { + text-transform: none; +} + +legend { + max-width: 100%; + padding: 0; + color: inherit; + white-space: normal; +} + +textarea { + overflow: auto; +} + +[type=checkbox], +[type=radio] { + padding: 0; +} + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +:-moz-focusring { + outline: none; +} + +:-moz-ui-invalid { + box-shadow: none; +} + +::-ms-expand { + display: none; +} + +[type=file], +[type=range] { + padding: 0; + border-width: 0; +} + +input:not([type=checkbox], [type=radio], [type=range]) { + height: calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2); +} + +fieldset { + margin: 0; + margin-bottom: var(--spacing); + padding: 0; + border: 0; +} + +label, +fieldset legend { + display: block; + margin-bottom: calc(var(--spacing) * 0.25); + font-weight: var(--form-label-font-weight, var(--font-weight)); +} + +input:not([type=checkbox], [type=radio]), +select, +textarea { + width: 100%; +} + +input:not([type=checkbox], [type=radio], [type=range], [type=file]), +select, +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal); +} + +input, +select, +textarea { + --background-color: var(--form-element-background-color); + --border-color: var(--form-element-border-color); + --color: var(--form-element-color); + --box-shadow: none; + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} + +input:not([type=submit], [type=button], [type=reset], [type=checkbox], [type=radio], [readonly]):is(:active, :focus), +:where(select, textarea):is(:active, :focus) { + --background-color: var(--form-element-active-background-color); +} + +input:not([type=submit], [type=button], [type=reset], [role=switch], [readonly]):is(:active, :focus), +:where(select, textarea):is(:active, :focus) { + --border-color: var(--form-element-active-border-color); +} + +input:not([type=submit], [type=button], [type=reset], [type=range], [type=file], [readonly]):focus, +select:focus, +textarea:focus { + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color); +} + +input:not([type=submit], [type=button], [type=reset])[disabled], +select[disabled], +textarea[disabled], +:where(fieldset[disabled]) :is(input:not([type=submit], [type=button], [type=reset]), select, textarea) { + --background-color: var(--form-element-disabled-background-color); + --border-color: var(--form-element-disabled-border-color); + opacity: var(--form-element-disabled-opacity); + pointer-events: none; +} + +:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid] { + padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem) !important; + padding-left: var(--form-element-spacing-horizontal); + -webkit-padding-start: var(--form-element-spacing-horizontal) !important; + padding-inline-start: var(--form-element-spacing-horizontal) !important; + -webkit-padding-end: calc(var(--form-element-spacing-horizontal) + 1.5rem) !important; + padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem) !important; + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; +} +:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid=false] { + background-image: var(--icon-valid); +} +:where(input, select, textarea):not([type=checkbox], [type=radio], [type=date], [type=datetime-local], [type=month], [type=time], [type=week])[aria-invalid=true] { + background-image: var(--icon-invalid); +} +:where(input, select, textarea)[aria-invalid=false] { + --border-color: var(--form-element-valid-border-color); +} +:where(input, select, textarea)[aria-invalid=false]:is(:active, :focus) { + --border-color: var(--form-element-valid-active-border-color) !important; + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-valid-focus-color) !important; +} +:where(input, select, textarea)[aria-invalid=true] { + --border-color: var(--form-element-invalid-border-color); +} +:where(input, select, textarea)[aria-invalid=true]:is(:active, :focus) { + --border-color: var(--form-element-invalid-active-border-color) !important; + --box-shadow: 0 0 0 var(--outline-width) var(--form-element-invalid-focus-color) !important; +} + +[dir=rtl] :where(input, select, textarea):not([type=checkbox], [type=radio]):is([aria-invalid], [aria-invalid=true], [aria-invalid=false]) { + background-position: center left 0.75rem; +} + +input::placeholder, +input::-webkit-input-placeholder, +textarea::placeholder, +textarea::-webkit-input-placeholder, +select:invalid { + color: var(--form-element-placeholder-color); + opacity: 1; +} + +input:not([type=checkbox], [type=radio]), +select, +textarea { + margin-bottom: var(--spacing); +} + +select::-ms-expand { + border: 0; + background-color: transparent; +} +select:not([multiple], [size]) { + padding-right: calc(var(--form-element-spacing-horizontal) + 1.5rem); + padding-left: var(--form-element-spacing-horizontal); + -webkit-padding-start: var(--form-element-spacing-horizontal); + padding-inline-start: var(--form-element-spacing-horizontal); + -webkit-padding-end: calc(var(--form-element-spacing-horizontal) + 1.5rem); + padding-inline-end: calc(var(--form-element-spacing-horizontal) + 1.5rem); + background-image: var(--icon-chevron); + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; +} + +[dir=rtl] select:not([multiple], [size]) { + background-position: center left 0.75rem; +} + +:where(input, select, textarea, .grid) + small { + display: block; + width: 100%; + margin-top: calc(var(--spacing) * -0.75); + margin-bottom: var(--spacing); + color: var(--muted-color); +} + +label > :where(input, select, textarea) { + margin-top: calc(var(--spacing) * 0.25); +} + +/** + * Form elements + * Checkboxes & Radios + */ +[type=checkbox], +[type=radio] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 1.25em; + height: 1.25em; + margin-top: -0.125em; + margin-right: 0.375em; + margin-left: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-margin-end: 0.375em; + margin-inline-end: 0.375em; + border-width: var(--border-width); + font-size: inherit; + vertical-align: middle; + cursor: pointer; +} +[type=checkbox]::-ms-check, +[type=radio]::-ms-check { + display: none; +} +[type=checkbox]:checked, [type=checkbox]:checked:active, [type=checkbox]:checked:focus, +[type=radio]:checked, +[type=radio]:checked:active, +[type=radio]:checked:focus { + --background-color: var(--primary); + --border-color: var(--primary); + background-image: var(--icon-checkbox); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; +} +[type=checkbox] ~ label, +[type=radio] ~ label { + display: inline-block; + margin-right: 0.375em; + margin-bottom: 0; + cursor: pointer; +} + +[type=checkbox]:indeterminate { + --background-color: var(--primary); + --border-color: var(--primary); + background-image: var(--icon-minus); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; +} + +[type=radio] { + border-radius: 50%; +} +[type=radio]:checked, [type=radio]:checked:active, [type=radio]:checked:focus { + --background-color: var(--primary-inverse); + border-width: 0.35em; + background-image: none; +} + +[type=checkbox][role=switch] { + --background-color: var(--switch-background-color); + --border-color: var(--switch-background-color); + --color: var(--switch-color); + width: 2.25em; + height: 1.25em; + border: var(--border-width) solid var(--border-color); + border-radius: 1.25em; + background-color: var(--background-color); + line-height: 1.25em; +} +[type=checkbox][role=switch]:focus { + --background-color: var(--switch-background-color); + --border-color: var(--switch-background-color); +} +[type=checkbox][role=switch]:checked { + --background-color: var(--switch-checked-background-color); + --border-color: var(--switch-checked-background-color); +} +[type=checkbox][role=switch]:before { + display: block; + width: calc(1.25em - (var(--border-width) * 2)); + height: 100%; + border-radius: 50%; + background-color: var(--color); + content: ""; + transition: margin 0.1s ease-in-out; +} +[type=checkbox][role=switch]:checked { + background-image: none; +} +[type=checkbox][role=switch]:checked::before { + margin-left: calc(1.125em - var(--border-width)); + -webkit-margin-start: calc(1.125em - var(--border-width)); + margin-inline-start: calc(1.125em - var(--border-width)); +} + +[type=checkbox][aria-invalid=false], +[type=checkbox]:checked[aria-invalid=false], +[type=radio][aria-invalid=false], +[type=radio]:checked[aria-invalid=false], +[type=checkbox][role=switch][aria-invalid=false], +[type=checkbox][role=switch]:checked[aria-invalid=false] { + --border-color: var(--form-element-valid-border-color); +} +[type=checkbox][aria-invalid=true], +[type=checkbox]:checked[aria-invalid=true], +[type=radio][aria-invalid=true], +[type=radio]:checked[aria-invalid=true], +[type=checkbox][role=switch][aria-invalid=true], +[type=checkbox][role=switch]:checked[aria-invalid=true] { + --border-color: var(--form-element-invalid-border-color); +} + +/** + * Form elements + * Alternatives input types (Not Checkboxes & Radios) + */ +[type=color]::-webkit-color-swatch-wrapper { + padding: 0; +} +[type=color]::-moz-focus-inner { + padding: 0; +} +[type=color]::-webkit-color-swatch { + border: 0; + border-radius: calc(var(--border-radius) * 0.5); +} +[type=color]::-moz-color-swatch { + border: 0; + border-radius: calc(var(--border-radius) * 0.5); +} + +input:not([type=checkbox], [type=radio], [type=range], [type=file]):is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) { + --icon-position: 0.75rem; + --icon-width: 1rem; + padding-right: calc(var(--icon-width) + var(--icon-position)); + background-image: var(--icon-date); + background-position: center right var(--icon-position); + background-size: var(--icon-width) auto; + background-repeat: no-repeat; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=time] { + background-image: var(--icon-time); +} + +[type=date]::-webkit-calendar-picker-indicator, +[type=datetime-local]::-webkit-calendar-picker-indicator, +[type=month]::-webkit-calendar-picker-indicator, +[type=time]::-webkit-calendar-picker-indicator, +[type=week]::-webkit-calendar-picker-indicator { + width: var(--icon-width); + margin-right: calc(var(--icon-width) * -1); + margin-left: var(--icon-position); + opacity: 0; +} + +[dir=rtl] :is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) { + text-align: right; +} + +@-moz-document url-prefix() { + [type=date], + [type=datetime-local], + [type=month], + [type=time], + [type=week] { + padding-right: var(--form-element-spacing-horizontal) !important; + background-image: none !important; + } +} +[type=file] { + --color: var(--muted-color); + padding: calc(var(--form-element-spacing-vertical) * 0.5) 0; + border: 0; + border-radius: 0; + background: none; +} +[type=file]::file-selector-button { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + margin-right: calc(var(--spacing) / 2); + margin-left: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-margin-end: calc(var(--spacing) / 2); + margin-inline-end: calc(var(--spacing) / 2); + padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} +[type=file]::file-selector-button:is(:hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); +} +[type=file]::-webkit-file-upload-button { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + margin-right: calc(var(--spacing) / 2); + margin-left: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-margin-end: calc(var(--spacing) / 2); + margin-inline-end: calc(var(--spacing) / 2); + padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + -webkit-transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} +[type=file]::-webkit-file-upload-button:is(:hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); +} +[type=file]::-ms-browse { + --background-color: var(--secondary); + --border-color: var(--secondary); + --color: var(--secondary-inverse); + margin-right: calc(var(--spacing) / 2); + margin-left: 0; + margin-inline-start: 0; + margin-inline-end: calc(var(--spacing) / 2); + padding: calc(var(--form-element-spacing-vertical) * 0.5) calc(var(--form-element-spacing-horizontal) * 0.5); + border: var(--border-width) solid var(--border-color); + border-radius: var(--border-radius); + outline: none; + background-color: var(--background-color); + box-shadow: var(--box-shadow); + color: var(--color); + font-weight: var(--font-weight); + font-size: 1rem; + line-height: var(--line-height); + text-align: center; + cursor: pointer; + -ms-transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} +[type=file]::-ms-browse:is(:hover, :active, :focus) { + --background-color: var(--secondary-hover); + --border-color: var(--secondary-hover); +} + +[type=range] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 100%; + height: 1.25rem; + background: none; +} +[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 0.25rem; + border-radius: var(--border-radius); + background-color: var(--range-border-color); + -webkit-transition: background-color var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), box-shadow var(--transition); +} +[type=range]::-moz-range-track { + width: 100%; + height: 0.25rem; + border-radius: var(--border-radius); + background-color: var(--range-border-color); + -moz-transition: background-color var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), box-shadow var(--transition); +} +[type=range]::-ms-track { + width: 100%; + height: 0.25rem; + border-radius: var(--border-radius); + background-color: var(--range-border-color); + -ms-transition: background-color var(--transition), box-shadow var(--transition); + transition: background-color var(--transition), box-shadow var(--transition); +} +[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.5rem; + border: 2px solid var(--range-thumb-border-color); + border-radius: 50%; + background-color: var(--range-thumb-color); + cursor: pointer; + -webkit-transition: background-color var(--transition), transform var(--transition); + transition: background-color var(--transition), transform var(--transition); +} +[type=range]::-moz-range-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.5rem; + border: 2px solid var(--range-thumb-border-color); + border-radius: 50%; + background-color: var(--range-thumb-color); + cursor: pointer; + -moz-transition: background-color var(--transition), transform var(--transition); + transition: background-color var(--transition), transform var(--transition); +} +[type=range]::-ms-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.5rem; + border: 2px solid var(--range-thumb-border-color); + border-radius: 50%; + background-color: var(--range-thumb-color); + cursor: pointer; + -ms-transition: background-color var(--transition), transform var(--transition); + transition: background-color var(--transition), transform var(--transition); +} +[type=range]:hover, [type=range]:focus { + --range-border-color: var(--range-active-border-color); + --range-thumb-color: var(--range-thumb-hover-color); +} +[type=range]:active { + --range-thumb-color: var(--range-thumb-active-color); +} +[type=range]:active::-webkit-slider-thumb { + transform: scale(1.25); +} +[type=range]:active::-moz-range-thumb { + transform: scale(1.25); +} +[type=range]:active::-ms-thumb { + transform: scale(1.25); +} + +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] { + -webkit-padding-start: calc(var(--form-element-spacing-horizontal) + 1.75rem); + padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem); + border-radius: 5rem; + background-image: var(--icon-search); + background-position: center left 1.125rem; + background-size: 1rem auto; + background-repeat: no-repeat; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] { + -webkit-padding-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important; + padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important; + background-position: center left 1.125rem, center right 0.75rem; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=false] { + background-image: var(--icon-search), var(--icon-valid); +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=true] { + background-image: var(--icon-search), var(--icon-invalid); +} + +[type=search]::-webkit-search-cancel-button { + -webkit-appearance: none; + display: none; +} + +[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] { + background-position: center right 1.125rem; +} +[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] { + background-position: center right 1.125rem, center left 0.75rem; +} + +/** + * Table + */ +:where(table) { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + text-indent: 0; +} + +th, +td { + padding: calc(var(--spacing) / 2) var(--spacing); + border-bottom: var(--border-width) solid var(--table-border-color); + color: var(--color); + font-weight: var(--font-weight); + font-size: var(--font-size); + text-align: left; + text-align: start; +} + +tfoot th, +tfoot td { + border-top: var(--border-width) solid var(--table-border-color); + border-bottom: 0; +} + +table[role=grid] tbody tr:nth-child(odd) { + background-color: var(--table-row-stripped-background-color); +} + +/** + * Code + */ +pre, +code, +kbd, +samp { + font-size: 0.875em; + font-family: var(--font-family); +} + +pre { + -ms-overflow-style: scrollbar; + overflow: auto; +} + +pre, +code, +kbd { + border-radius: var(--border-radius); + background: var(--code-background-color); + color: var(--code-color); + font-weight: var(--font-weight); + line-height: initial; +} + +code, +kbd { + display: inline-block; + padding: 0.375rem 0.5rem; +} + +pre { + display: block; + margin-bottom: var(--spacing); + overflow-x: auto; +} +pre > code { + display: block; + padding: var(--spacing); + background: none; + font-size: 14px; + line-height: var(--line-height); +} + +code b { + color: var(--code-tag-color); + font-weight: var(--font-weight); +} +code i { + color: var(--code-property-color); + font-style: normal; +} +code u { + color: var(--code-value-color); + text-decoration: none; +} +code em { + color: var(--code-comment-color); + font-style: normal; +} + +kbd { + background-color: var(--code-kbd-background-color); + color: var(--code-kbd-color); + vertical-align: baseline; +} + +/** + * Miscs + */ +hr { + height: 0; + border: 0; + border-top: 1px solid var(--muted-border-color); + color: inherit; +} + +[hidden], +template { + display: none !important; +} + +canvas { + display: inline-block; +} + +/** + * Accordion (
) + */ +details { + display: block; + margin-bottom: var(--spacing); + padding-bottom: var(--spacing); + border-bottom: var(--border-width) solid var(--accordion-border-color); +} +details summary { + line-height: 1rem; + list-style-type: none; + cursor: pointer; + transition: color var(--transition); +} +details summary:not([role]) { + color: var(--accordion-close-summary-color); +} +details summary::-webkit-details-marker { + display: none; +} +details summary::marker { + display: none; +} +details summary::-moz-list-bullet { + list-style-type: none; +} +details summary::after { + display: block; + width: 1rem; + height: 1rem; + -webkit-margin-start: calc(var(--spacing, 1rem) * 0.5); + margin-inline-start: calc(var(--spacing, 1rem) * 0.5); + float: right; + transform: rotate(-90deg); + background-image: var(--icon-chevron); + background-position: right center; + background-size: 1rem auto; + background-repeat: no-repeat; + content: ""; + transition: transform var(--transition); +} +details summary:focus { + outline: none; +} +details summary:focus:not([role=button]) { + color: var(--accordion-active-summary-color); +} +details summary[role=button] { + width: 100%; + text-align: left; +} +details summary[role=button]::after { + height: calc(1rem * var(--line-height, 1.5)); + background-image: var(--icon-chevron-button); +} +details summary[role=button]:not(.outline).contrast::after { + background-image: var(--icon-chevron-button-inverse); +} +details[open] > summary { + margin-bottom: calc(var(--spacing)); +} +details[open] > summary:not([role]):not(:focus) { + color: var(--accordion-open-summary-color); +} +details[open] > summary::after { + transform: rotate(0); +} + +[dir=rtl] details summary { + text-align: right; +} +[dir=rtl] details summary::after { + float: left; + background-position: left center; +} + +/** + * Card (
) + */ +article { + margin: var(--block-spacing-vertical) 0; + padding: var(--block-spacing-vertical) var(--block-spacing-horizontal); + border-radius: var(--border-radius); + background: var(--card-background-color); + box-shadow: var(--card-box-shadow); +} +article > header, +article > footer { + margin-right: calc(var(--block-spacing-horizontal) * -1); + margin-left: calc(var(--block-spacing-horizontal) * -1); + padding: calc(var(--block-spacing-vertical) * 0.66) var(--block-spacing-horizontal); + background-color: var(--card-sectionning-background-color); +} +article > header { + margin-top: calc(var(--block-spacing-vertical) * -1); + margin-bottom: var(--block-spacing-vertical); + border-bottom: var(--border-width) solid var(--card-border-color); + border-top-right-radius: var(--border-radius); + border-top-left-radius: var(--border-radius); +} +article > footer { + margin-top: var(--block-spacing-vertical); + margin-bottom: calc(var(--block-spacing-vertical) * -1); + border-top: var(--border-width) solid var(--card-border-color); + border-bottom-right-radius: var(--border-radius); + border-bottom-left-radius: var(--border-radius); +} + +/** + * Modal () + */ +:root { + --scrollbar-width: 0px; +} + +dialog { + display: flex; + z-index: 999; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + align-items: center; + justify-content: center; + width: inherit; + min-width: 100%; + height: inherit; + min-height: 100%; + padding: var(--spacing); + border: 0; + -webkit-backdrop-filter: var(--modal-overlay-backdrop-filter); + backdrop-filter: var(--modal-overlay-backdrop-filter); + background-color: var(--modal-overlay-background-color); + color: var(--color); +} +dialog article { + max-height: calc(100vh - var(--spacing) * 2); + overflow: auto; +} +@media (min-width: 576px) { + dialog article { + max-width: 510px; + } +} +@media (min-width: 768px) { + dialog article { + max-width: 700px; + } +} +dialog article > header, +dialog article > footer { + padding: calc(var(--block-spacing-vertical) * 0.5) var(--block-spacing-horizontal); +} +dialog article > header .close { + margin: 0; + margin-left: var(--spacing); + float: right; +} +dialog article > footer { + text-align: right; +} +dialog article > footer [role=button] { + margin-bottom: 0; +} +dialog article > footer [role=button]:not(:first-of-type) { + margin-left: calc(var(--spacing) * 0.5); +} +dialog article p:last-of-type { + margin: 0; +} +dialog article .close { + display: block; + width: 1rem; + height: 1rem; + margin-top: calc(var(--block-spacing-vertical) * -0.5); + margin-bottom: var(--typography-spacing-vertical); + margin-left: auto; + background-image: var(--icon-close); + background-position: center; + background-size: auto 1rem; + background-repeat: no-repeat; + opacity: 0.5; + transition: opacity var(--transition); +} +dialog article .close:is([aria-current], :hover, :active, :focus) { + opacity: 1; +} +dialog:not([open]), dialog[open=false] { + display: none; +} + +.modal-is-open { + padding-right: var(--scrollbar-width, 0px); + overflow: hidden; + pointer-events: none; + touch-action: none; +} +.modal-is-open dialog { + pointer-events: auto; +} + +:where(.modal-is-opening, .modal-is-closing) dialog, +:where(.modal-is-opening, .modal-is-closing) dialog > article { + animation-duration: 0.2s; + animation-timing-function: ease-in-out; + animation-fill-mode: both; +} +:where(.modal-is-opening, .modal-is-closing) dialog { + animation-duration: 0.8s; + animation-name: modal-overlay; +} +:where(.modal-is-opening, .modal-is-closing) dialog > article { + animation-delay: 0.2s; + animation-name: modal; +} + +.modal-is-closing dialog, +.modal-is-closing dialog > article { + animation-delay: 0s; + animation-direction: reverse; +} + +@keyframes modal-overlay { + from { + -webkit-backdrop-filter: none; + backdrop-filter: none; + background-color: transparent; + } +} +@keyframes modal { + from { + transform: translateY(-100%); + opacity: 0; + } +} +/** + * Nav + */ +:where(nav li)::before { + float: left; + content: "​"; +} + +nav, +nav ul { + display: flex; +} + +nav { + justify-content: space-between; +} +nav ol, +nav ul { + align-items: center; + margin-bottom: 0; + padding: 0; + list-style: none; +} +nav ol:first-of-type, +nav ul:first-of-type { + margin-left: calc(var(--nav-element-spacing-horizontal) * -1); +} +nav ol:last-of-type, +nav ul:last-of-type { + margin-right: calc(var(--nav-element-spacing-horizontal) * -1); +} +nav li { + display: inline-block; + margin: 0; + padding: var(--nav-element-spacing-vertical) var(--nav-element-spacing-horizontal); +} +nav li > * { + --spacing: 0; +} +nav :where(a, [role=link]) { + display: inline-block; + margin: calc(var(--nav-link-spacing-vertical) * -1) calc(var(--nav-link-spacing-horizontal) * -1); + padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal); + border-radius: var(--border-radius); + text-decoration: none; +} +nav :where(a, [role=link]):is([aria-current], :hover, :active, :focus) { + text-decoration: none; +} +nav[aria-label=breadcrumb] { + align-items: center; + justify-content: start; +} +nav[aria-label=breadcrumb] ul li:not(:first-child) { + -webkit-margin-start: var(--nav-link-spacing-horizontal); + margin-inline-start: var(--nav-link-spacing-horizontal); +} +nav[aria-label=breadcrumb] ul li:not(:last-child) ::after { + position: absolute; + width: calc(var(--nav-link-spacing-horizontal) * 2); + -webkit-margin-start: calc(var(--nav-link-spacing-horizontal) / 2); + margin-inline-start: calc(var(--nav-link-spacing-horizontal) / 2); + content: "/"; + color: var(--muted-color); + text-align: center; +} +nav[aria-label=breadcrumb] a[aria-current] { + background-color: transparent; + color: inherit; + text-decoration: none; + pointer-events: none; +} +nav [role=button] { + margin-right: inherit; + margin-left: inherit; + padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal); +} + +aside nav, +aside ol, +aside ul, +aside li { + display: block; +} +aside li { + padding: calc(var(--nav-element-spacing-vertical) * 0.5) var(--nav-element-spacing-horizontal); +} +aside li a { + display: block; +} +aside li [role=button] { + margin: inherit; +} + +[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after { + content: "\\"; +} + +/** + * Progress + */ +progress { + display: inline-block; + vertical-align: baseline; +} + +progress { + -webkit-appearance: none; + -moz-appearance: none; + display: inline-block; + appearance: none; + width: 100%; + height: 0.5rem; + margin-bottom: calc(var(--spacing) * 0.5); + overflow: hidden; + border: 0; + border-radius: var(--border-radius); + background-color: var(--progress-background-color); + color: var(--progress-color); +} +progress::-webkit-progress-bar { + border-radius: var(--border-radius); + background: none; +} +progress[value]::-webkit-progress-value { + background-color: var(--progress-color); +} +progress::-moz-progress-bar { + background-color: var(--progress-color); +} +@media (prefers-reduced-motion: no-preference) { + progress:indeterminate { + background: var(--progress-background-color) linear-gradient(to right, var(--progress-color) 30%, var(--progress-background-color) 30%) top left/150% 150% no-repeat; + animation: progress-indeterminate 1s linear infinite; + } + progress:indeterminate[value]::-webkit-progress-value { + background-color: transparent; + } + progress:indeterminate::-moz-progress-bar { + background-color: transparent; + } +} + +@media (prefers-reduced-motion: no-preference) { + [dir=rtl] progress:indeterminate { + animation-direction: reverse; + } +} + +@keyframes progress-indeterminate { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} +/** + * Dropdown ([role="list"]) + */ +details[role=list], +li[role=list] { + position: relative; +} + +details[role=list] summary + ul, +li[role=list] > ul { + display: flex; + z-index: 99; + position: absolute; + top: auto; + right: 0; + left: 0; + flex-direction: column; + margin: 0; + padding: 0; + border: var(--border-width) solid var(--dropdown-border-color); + border-radius: var(--border-radius); + border-top-right-radius: 0; + border-top-left-radius: 0; + background-color: var(--dropdown-background-color); + box-shadow: var(--card-box-shadow); + color: var(--dropdown-color); + white-space: nowrap; +} +details[role=list] summary + ul li, +li[role=list] > ul li { + width: 100%; + margin-bottom: 0; + padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal); + list-style: none; +} +details[role=list] summary + ul li:first-of-type, +li[role=list] > ul li:first-of-type { + margin-top: calc(var(--form-element-spacing-vertical) * 0.5); +} +details[role=list] summary + ul li:last-of-type, +li[role=list] > ul li:last-of-type { + margin-bottom: calc(var(--form-element-spacing-vertical) * 0.5); +} +details[role=list] summary + ul li a, +li[role=list] > ul li a { + display: block; + margin: calc(var(--form-element-spacing-vertical) * -0.5) calc(var(--form-element-spacing-horizontal) * -1); + padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal); + overflow: hidden; + color: var(--dropdown-color); + text-decoration: none; + text-overflow: ellipsis; +} +details[role=list] summary + ul li a:hover, +li[role=list] > ul li a:hover { + background-color: var(--dropdown-hover-background-color); +} + +details[role=list] summary::after, +li[role=list] > a::after { + display: block; + width: 1rem; + height: calc(1rem * var(--line-height, 1.5)); + -webkit-margin-start: 0.5rem; + margin-inline-start: 0.5rem; + float: right; + transform: rotate(0deg); + background-position: right center; + background-size: 1rem auto; + background-repeat: no-repeat; + content: ""; +} + +details[role=list] { + padding: 0; + border-bottom: none; +} +details[role=list] summary { + margin-bottom: 0; +} +details[role=list] summary:not([role]) { + height: calc(1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 + var(--border-width) * 2); + padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal); + border: var(--border-width) solid var(--form-element-border-color); + border-radius: var(--border-radius); + background-color: var(--form-element-background-color); + color: var(--form-element-placeholder-color); + line-height: inherit; + cursor: pointer; + transition: background-color var(--transition), border-color var(--transition), color var(--transition), box-shadow var(--transition); +} +details[role=list] summary:not([role]):active, details[role=list] summary:not([role]):focus { + border-color: var(--form-element-active-border-color); + background-color: var(--form-element-active-background-color); +} +details[role=list] summary:not([role]):focus { + box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color); +} +details[role=list][open] summary { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +details[role=list][open] summary::before { + display: block; + z-index: 1; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: none; + content: ""; + cursor: default; +} + +nav details[role=list] summary, +nav li[role=list] a { + display: flex; + direction: ltr; +} + +nav details[role=list] summary + ul, +nav li[role=list] > ul { + min-width: -moz-fit-content; + min-width: fit-content; + border-radius: var(--border-radius); +} +nav details[role=list] summary + ul li a, +nav li[role=list] > ul li a { + border-radius: 0; +} + +nav details[role=list] summary, +nav details[role=list] summary:not([role]) { + height: auto; + padding: var(--nav-link-spacing-vertical) var(--nav-link-spacing-horizontal); +} +nav details[role=list][open] summary { + border-radius: var(--border-radius); +} +nav details[role=list] summary + ul { + margin-top: var(--outline-width); + -webkit-margin-start: 0; + margin-inline-start: 0; +} +nav details[role=list] summary[role=link] { + margin-bottom: calc(var(--nav-link-spacing-vertical) * -1); + line-height: var(--line-height); +} +nav details[role=list] summary[role=link] + ul { + margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width)); + -webkit-margin-start: calc(var(--nav-link-spacing-horizontal) * -1); + margin-inline-start: calc(var(--nav-link-spacing-horizontal) * -1); +} + +li[role=list]:hover > ul, +li[role=list] a:active ~ ul, +li[role=list] a:focus ~ ul { + display: flex; +} +li[role=list] > ul { + display: none; + margin-top: calc(var(--nav-link-spacing-vertical) + var(--outline-width)); + -webkit-margin-start: calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal)); + margin-inline-start: calc(var(--nav-element-spacing-horizontal) - var(--nav-link-spacing-horizontal)); +} +li[role=list] > a::after { + background-image: var(--icon-chevron); +} + +label > details[role=list] { + margin-top: calc(var(--spacing) * 0.25); + margin-bottom: var(--spacing); +} + +/** + * Loading ([aria-busy=true]) + */ +[aria-busy=true] { + cursor: progress; +} + +[aria-busy=true]:not(input, select, textarea, html)::before { + display: inline-block; + width: 1em; + height: 1em; + border: 0.1875em solid currentColor; + border-radius: 1em; + border-right-color: transparent; + content: ""; + vertical-align: text-bottom; + vertical-align: -0.125em; + animation: spinner 0.75s linear infinite; + opacity: var(--loading-spinner-opacity); +} +[aria-busy=true]:not(input, select, textarea, html):not(:empty)::before { + margin-right: calc(var(--spacing) * 0.5); + margin-left: 0; + -webkit-margin-start: 0; + margin-inline-start: 0; + -webkit-margin-end: calc(var(--spacing) * 0.5); + margin-inline-end: calc(var(--spacing) * 0.5); +} +[aria-busy=true]:not(input, select, textarea, html):empty { + text-align: center; +} + +button[aria-busy=true], +input[type=submit][aria-busy=true], +input[type=button][aria-busy=true], +input[type=reset][aria-busy=true], +a[aria-busy=true] { + pointer-events: none; +} + +@keyframes spinner { + to { + transform: rotate(360deg); + } +} +/** + * Tooltip ([data-tooltip]) + */ +[data-tooltip] { + position: relative; +} +[data-tooltip]:not(a, button, input) { + border-bottom: 1px dotted; + text-decoration: none; + cursor: help; +} +[data-tooltip][data-placement=top]::before, [data-tooltip][data-placement=top]::after, [data-tooltip]::before, [data-tooltip]::after { + display: block; + z-index: 99; + position: absolute; + bottom: 100%; + left: 50%; + padding: 0.25rem 0.5rem; + overflow: hidden; + transform: translate(-50%, -0.25rem); + border-radius: var(--border-radius); + background: var(--tooltip-background-color); + content: attr(data-tooltip); + color: var(--tooltip-color); + font-style: normal; + font-weight: var(--font-weight); + font-size: 0.875rem; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + opacity: 0; + pointer-events: none; +} +[data-tooltip][data-placement=top]::after, [data-tooltip]::after { + padding: 0; + transform: translate(-50%, 0rem); + border-top: 0.3rem solid; + border-right: 0.3rem solid transparent; + border-left: 0.3rem solid transparent; + border-radius: 0; + background-color: transparent; + content: ""; + color: var(--tooltip-background-color); +} +[data-tooltip][data-placement=bottom]::before, [data-tooltip][data-placement=bottom]::after { + top: 100%; + bottom: auto; + transform: translate(-50%, 0.25rem); +} +[data-tooltip][data-placement=bottom]:after { + transform: translate(-50%, -0.3rem); + border: 0.3rem solid transparent; + border-bottom: 0.3rem solid; +} +[data-tooltip][data-placement=left]::before, [data-tooltip][data-placement=left]::after { + top: 50%; + right: 100%; + bottom: auto; + left: auto; + transform: translate(-0.25rem, -50%); +} +[data-tooltip][data-placement=left]:after { + transform: translate(0.3rem, -50%); + border: 0.3rem solid transparent; + border-left: 0.3rem solid; +} +[data-tooltip][data-placement=right]::before, [data-tooltip][data-placement=right]::after { + top: 50%; + right: auto; + bottom: auto; + left: 100%; + transform: translate(0.25rem, -50%); +} +[data-tooltip][data-placement=right]:after { + transform: translate(-0.3rem, -50%); + border: 0.3rem solid transparent; + border-right: 0.3rem solid; +} +[data-tooltip]:focus::before, [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after { + opacity: 1; +} +@media (hover: hover) and (pointer: fine) { + [data-tooltip][data-placement=bottom]:focus::before, [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::before, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after { + animation-duration: 0.2s; + animation-name: tooltip-slide-top; + } + [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover [data-tooltip]:focus::after, [data-tooltip]:hover::after { + animation-name: tooltip-caret-slide-top; + } + [data-tooltip][data-placement=bottom]:focus::before, [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::before, [data-tooltip][data-placement=bottom]:hover::after { + animation-duration: 0.2s; + animation-name: tooltip-slide-bottom; + } + [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::after { + animation-name: tooltip-caret-slide-bottom; + } + [data-tooltip][data-placement=left]:focus::before, [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::before, [data-tooltip][data-placement=left]:hover::after { + animation-duration: 0.2s; + animation-name: tooltip-slide-left; + } + [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::after { + animation-name: tooltip-caret-slide-left; + } + [data-tooltip][data-placement=right]:focus::before, [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::before, [data-tooltip][data-placement=right]:hover::after { + animation-duration: 0.2s; + animation-name: tooltip-slide-right; + } + [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::after { + animation-name: tooltip-caret-slide-right; + } +} +@keyframes tooltip-slide-top { + from { + transform: translate(-50%, 0.75rem); + opacity: 0; + } + to { + transform: translate(-50%, -0.25rem); + opacity: 1; + } +} +@keyframes tooltip-caret-slide-top { + from { + opacity: 0; + } + 50% { + transform: translate(-50%, -0.25rem); + opacity: 0; + } + to { + transform: translate(-50%, 0rem); + opacity: 1; + } +} +@keyframes tooltip-slide-bottom { + from { + transform: translate(-50%, -0.75rem); + opacity: 0; + } + to { + transform: translate(-50%, 0.25rem); + opacity: 1; + } +} +@keyframes tooltip-caret-slide-bottom { + from { + opacity: 0; + } + 50% { + transform: translate(-50%, -0.5rem); + opacity: 0; + } + to { + transform: translate(-50%, -0.3rem); + opacity: 1; + } +} +@keyframes tooltip-slide-left { + from { + transform: translate(0.75rem, -50%); + opacity: 0; + } + to { + transform: translate(-0.25rem, -50%); + opacity: 1; + } +} +@keyframes tooltip-caret-slide-left { + from { + opacity: 0; + } + 50% { + transform: translate(0.05rem, -50%); + opacity: 0; + } + to { + transform: translate(0.3rem, -50%); + opacity: 1; + } +} +@keyframes tooltip-slide-right { + from { + transform: translate(-0.75rem, -50%); + opacity: 0; + } + to { + transform: translate(0.25rem, -50%); + opacity: 1; + } +} +@keyframes tooltip-caret-slide-right { + from { + opacity: 0; + } + 50% { + transform: translate(-0.05rem, -50%); + opacity: 0; + } + to { + transform: translate(-0.3rem, -50%); + opacity: 1; + } +} + +/** + * Accessibility & User interaction + */ +[aria-controls] { + cursor: pointer; +} + +[aria-disabled=true], +[disabled] { + cursor: not-allowed; +} + +[aria-hidden=false][hidden] { + display: initial; +} + +[aria-hidden=false][hidden]:not(:focus) { + clip: rect(0, 0, 0, 0); + position: absolute; +} + +a, +area, +button, +input, +label, +select, +summary, +textarea, +[tabindex] { + -ms-touch-action: manipulation; +} + +[dir=rtl] { + direction: rtl; +} + +/** +* Reduce Motion Features +*/ +@media (prefers-reduced-motion: reduce) { + *:not([aria-busy=true]), + :not([aria-busy=true])::before, + :not([aria-busy=true])::after { + background-attachment: initial !important; + animation-duration: 1ms !important; + animation-delay: -1ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-delay: 0s !important; + transition-duration: 0s !important; + } +} + +/*# sourceMappingURL=pico.css.map */ \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..b1edcd2 --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,22 @@ + + + + FabLab Bottle Clip Generator + + + + +
+
+ +

FabLab Bottle Clip Generator

+

Bitte gib deinen Namen in das Formular ein und drücke auf Generieren, um eine STL-Datei zu erhalten.

+
+ + + +
+
+
+ + diff --git a/docker-compose.yml.example b/docker-compose.yml.example new file mode 100644 index 0000000..964819a --- /dev/null +++ b/docker-compose.yml.example @@ -0,0 +1,7 @@ +version: '3' + +services: + web: + build: . + ports: + - 8000:8000 diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..f2cc672 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,308 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "aiofiles" +version = "23.1.0" +description = "File support for asyncio." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, + {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, +] + +[[package]] +name = "blinker" +version = "1.5" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "blinker-1.5-py2.py3-none-any.whl", hash = "sha256:1eb563df6fdbc39eeddc177d953203f99f097e9bf0e2b8f9f3cf18b6ca425e36"}, + {file = "blinker-1.5.tar.gz", hash = "sha256:923e5e2f69c155f2cc42dafbbd70e16e3fde24d2d4aa2ab72fbe386238892462"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "hypercorn" +version = "0.14.3" +description = "A ASGI Server based on Hyper libraries and inspired by Gunicorn" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Hypercorn-0.14.3-py3-none-any.whl", hash = "sha256:7c491d5184f28ee960dcdc14ab45d14633ca79d72ddd13cf4fcb4cb854d679ab"}, + {file = "Hypercorn-0.14.3.tar.gz", hash = "sha256:4a87a0b7bbe9dc75fab06dbe4b301b9b90416e9866c23a377df21a969d6ab8dd"}, +] + +[package.dependencies] +h11 = "*" +h2 = ">=3.1.0" +priority = "*" +toml = "*" +wsproto = ">=0.14.0" + +[package.extras] +docs = ["pydata_sphinx_theme"] +h3 = ["aioquic (>=0.9.0,<1.0)"] +trio = ["trio (>=0.11.0)"] +uvloop = ["uvloop"] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] + +[[package]] +name = "priority" +version = "2.0.0" +description = "A pure-Python implementation of the HTTP/2 priority tree" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa"}, + {file = "priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0"}, +] + +[[package]] +name = "quart" +version = "0.18.4" +description = "A Python ASGI web microframework with the same API as Flask" +optional = false +python-versions = ">=3.7" +files = [ + {file = "quart-0.18.4-py3-none-any.whl", hash = "sha256:578a466bcd8c58b947b384ca3517c2a2f3bfeec8f58f4ff5038d4506ffee6be7"}, + {file = "quart-0.18.4.tar.gz", hash = "sha256:c1766f269cdb85daf9da67ba54170abf7839aca97304dcb4cd0778eabfb442c6"}, +] + +[package.dependencies] +aiofiles = "*" +blinker = "<1.6" +click = ">=8.0.0" +hypercorn = ">=0.11.2" +itsdangerous = "*" +jinja2 = "*" +markupsafe = "*" +werkzeug = ">=2.2.0" + +[package.extras] +docs = ["pydata_sphinx_theme"] +dotenv = ["python-dotenv"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "werkzeug" +version = "2.3.4" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Werkzeug-2.3.4-py3-none-any.whl", hash = "sha256:48e5e61472fee0ddee27ebad085614ebedb7af41e88f687aaf881afb723a162f"}, + {file = "Werkzeug-2.3.4.tar.gz", hash = "sha256:1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "1b974e20fe2d5b7b2568181b9aa7dfecccd57ce5169f0caeb51723eada05a9e5" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8639ba0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "fablab-bottle-clip-generator" +version = "0.0.1" +description = "" +authors = ["Fabian Müller "] +license = "MIT" +readme = "README.md" +packages = [{include = "app"}] + +[tool.poetry.dependencies] +python = "^3.10" +quart = "^0.18.4" +uvicorn = "^0.22.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api"